e-virt-table 1.2.21 → 1.2.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.js +3 -3
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.es.js +885 -669
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +3 -3
- package/dist/index.umd.js.map +1 -1
- package/dist/lib/Cell.d.ts +20 -6
- package/dist/lib/Cell.js +250 -91
- package/dist/lib/Cell.js.map +1 -1
- package/dist/lib/CellHeader.d.ts +12 -6
- package/dist/lib/CellHeader.js +83 -24
- package/dist/lib/CellHeader.js.map +1 -1
- package/dist/lib/Config.d.ts +11 -1
- package/dist/lib/Config.js +35 -0
- package/dist/lib/Config.js.map +1 -1
- package/dist/lib/Database.d.ts +18 -1
- package/dist/lib/Database.js +309 -18
- package/dist/lib/Database.js.map +1 -1
- package/dist/lib/EVirtTable.d.ts +1 -1
- package/dist/lib/EVirtTable.js +3 -3
- package/dist/lib/EVirtTable.js.map +1 -1
- package/dist/lib/Editor.js +4 -0
- package/dist/lib/Editor.js.map +1 -1
- package/dist/lib/EventTable.d.ts +0 -1
- package/dist/lib/EventTable.js +96 -63
- package/dist/lib/EventTable.js.map +1 -1
- package/dist/lib/Paint.js +7 -0
- package/dist/lib/Paint.js.map +1 -1
- package/dist/lib/types.d.ts +7 -3
- package/package.json +59 -57
package/dist/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/Validator.ts","../src/util.ts","../src/BaseCell.ts","../src/Cell.ts","../src/Database.ts","../src/History.ts","../src/EventBrowser.ts","../src/EventBus.ts","../src/Paint.ts","../src/Config.ts","../src/Icons.ts","../src/CellHeader.ts","../src/EventTable.ts","../src/Context.ts","../src/Scroller.ts","../src/Header.ts","../src/Row.ts","../src/Body.ts","../src/Footer.ts","../src/Selector.ts","../src/Autofill.ts","../node_modules/.pnpm/@floating-ui+utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../node_modules/.pnpm/@floating-ui+core@1.7.3/node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../node_modules/.pnpm/@floating-ui+utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../node_modules/.pnpm/@floating-ui+dom@1.7.3/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../src/Tooltip.ts","../src/Editor.ts","../src/Empty.ts","../src/Overlayer.ts","../src/ContextMenu.ts","../src/EVirtTable.ts"],"sourcesContent":["import { Column } from './types';\r\n\r\nexport type Rule = {\r\n required?: boolean;\r\n pattern?: RegExp;\r\n validator?: RuleValidator;\r\n message?: string;\r\n};\r\nexport type RuleParam = {\r\n field: string; // 兼容旧版\r\n fieldValue: string; // 兼容旧版\r\n value: string;\r\n column: Column;\r\n colIndex: number;\r\n rowIndex: number;\r\n row: any;\r\n key: string;\r\n rowKey: string;\r\n} & Rule;\r\nexport type RuleValidator = (rule: Rule, value: any, callback: (message?: string) => void) => void;\r\nexport type Rules = Rule[];\r\n\r\nexport type ValidateResult = RuleParam[];\r\n\r\nexport default class Validator {\r\n private rules: Rules | Rule;\r\n\r\n constructor(rules: Rules | Rule) {\r\n this.rules = rules;\r\n }\r\n\r\n validate(params: RuleParam) {\r\n const errors: ValidateResult = [];\r\n const { column, row, key, rowKey, colIndex, rowIndex, value, field, fieldValue } = params;\r\n if (!Array.isArray(this.rules)) {\r\n this.rules = [this.rules];\r\n }\r\n for (const rule of this.rules) {\r\n if (rule.validator) {\r\n const ruleParam: RuleParam = {\r\n field,\r\n fieldValue,\r\n value,\r\n column,\r\n colIndex,\r\n rowIndex,\r\n row,\r\n key,\r\n rowKey,\r\n ...rule,\r\n };\r\n rule.validator(ruleParam, value, (message) => {\r\n if (message) {\r\n errors.push({\r\n ...ruleParam,\r\n message: message,\r\n });\r\n }\r\n });\r\n }\r\n if (!rule.required && (value === undefined || value === null || value === '')) {\r\n return errors;\r\n }\r\n if (rule.pattern && !rule.pattern.test(value)) {\r\n errors.push({\r\n value,\r\n column,\r\n row,\r\n key,\r\n rowKey,\r\n colIndex,\r\n rowIndex,\r\n field,\r\n fieldValue,\r\n message: rule.message || `${key} is pattern validation error`,\r\n });\r\n }\r\n if (rule.required && (value === undefined || value === null || value === '')) {\r\n errors.push({\r\n value,\r\n column,\r\n row,\r\n key,\r\n rowKey,\r\n colIndex,\r\n rowIndex,\r\n field,\r\n fieldValue,\r\n message: rule.message || `${key} is required`,\r\n });\r\n }\r\n }\r\n return errors;\r\n }\r\n}\r\n","import { Column, SpanParams } from './types';\r\n\r\nfunction generateShortUUID(): string {\r\n return 'xxxxxxxxxxxxxxxxxx'.replace(/[x]/g, function (c) {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n}\r\nfunction throttle<T extends (...args: any) => any>(func: T, delay: number): T {\r\n let lastCalledTime = 0;\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n\r\n return function (this: ThisParameterType<T>, ...args: Parameters<T>): ReturnType<T> | undefined {\r\n const now = new Date().getTime();\r\n const elapsedTime = now - lastCalledTime;\r\n\r\n if (!lastCalledTime || elapsedTime >= delay) {\r\n func.apply(this, args);\r\n lastCalledTime = now;\r\n } else if (!timeoutId) {\r\n timeoutId = setTimeout(() => {\r\n func.apply(this, args);\r\n lastCalledTime = new Date().getTime();\r\n timeoutId = undefined;\r\n }, delay - elapsedTime);\r\n }\r\n\r\n return undefined;\r\n } as T;\r\n}\r\n/**\r\n * 根据children获取最大深度\r\n * @param data\r\n * @returns\r\n */\r\nfunction getMaxRow(data: Column[] = []): number {\r\n if (data.length) {\r\n return data.map((item) => getMaxRow(item.children) + 1).sort((a, b) => b - a)[0];\r\n }\r\n return 0;\r\n}\r\nfunction sortFixed(arr: Column[] = []) {\r\n let lefts: Column[] = [];\r\n let centers: Column[] = [];\r\n let right: Column[] = [];\r\n arr.forEach((item) => {\r\n if (item.fixed === 'left') {\r\n lefts.push(item);\r\n } else if (item.fixed === 'right') {\r\n right.push(item);\r\n } else {\r\n centers.push(item);\r\n }\r\n });\r\n return [\r\n ...lefts.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0)),\r\n ...centers.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0)),\r\n ...right.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0)),\r\n ];\r\n}\r\nfunction calCrossSpan(arr: Column[] = [], maxRow: number = 1, level: number = 0): Column[] {\r\n return arr.map((config) => {\r\n if (config.children) {\r\n let colspan = 0;\r\n let fixed = config.fixed;\r\n config.children.forEach((item) => {\r\n item.fixed = fixed;\r\n });\r\n const children = calCrossSpan(config.children, maxRow - 1, level + 1);\r\n if (children) {\r\n children.forEach((item) => {\r\n colspan += item.colspan ?? 0;\r\n });\r\n }\r\n return {\r\n ...config,\r\n width: config.width,\r\n level,\r\n rowspan: 1,\r\n colspan,\r\n children,\r\n };\r\n }\r\n return {\r\n ...config,\r\n level,\r\n rowspan: maxRow,\r\n colspan: 1,\r\n };\r\n });\r\n}\r\nfunction toLeaf(arr: Column[] = []): Column[] {\r\n let tmp: Column[] = [];\r\n arr.forEach((item) => {\r\n if (item.children) {\r\n tmp = tmp.concat(toLeaf(item.children));\r\n } else {\r\n tmp.push(item);\r\n }\r\n });\r\n return tmp;\r\n}\r\n\r\ntype DebouncedFunction<F extends (...args: any[]) => any> = (...args: Parameters<F>) => void;\r\nfunction debounce<F extends (...args: any[]) => any>(func: F, delay: number): DebouncedFunction<F> {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n return function (...args: Parameters<F>): void {\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n }\r\n timeoutId = setTimeout(() => {\r\n func(...args);\r\n }, delay);\r\n };\r\n}\r\nconst regUniversalNewLine = /^(\\r\\n|\\n\\r|\\r|\\n)/;\r\nconst regNextCellNoQuotes = /^[^\\t\\r\\n]+/;\r\nconst regNextEmptyCell = /^\\t/;\r\n/**\r\n * @decodeSpreadsheetStr\r\n * @desc Decode spreadsheet string into array. refer from http://github.com/warpech/sheetclip/\r\n * @param {string} str The string to parse.\r\n * @returns {array}\r\n */\r\nfunction decodeSpreadsheetStr(str: string) {\r\n let arr = [['']];\r\n\r\n if (str.length === 0) {\r\n return arr;\r\n }\r\n\r\n let column = 0;\r\n let row = 0;\r\n let lastLength;\r\n\r\n while (str.length > 0) {\r\n if (lastLength === str.length) {\r\n // In the case If in last cycle we didn't match anything, we have to leave the infinite loop\r\n break;\r\n }\r\n\r\n lastLength = str.length;\r\n\r\n if (str.match(regNextEmptyCell)) {\r\n str = str.replace(regNextEmptyCell, '');\r\n\r\n column += 1;\r\n arr[row][column] = '';\r\n } else if (str.match(regUniversalNewLine)) {\r\n str = str.replace(regUniversalNewLine, '');\r\n column = 0;\r\n row += 1;\r\n\r\n arr[row] = [''];\r\n } else {\r\n let nextCell = '';\r\n\r\n if (str.startsWith('\"')) {\r\n let quoteNo = 0;\r\n let isStillCell = true;\r\n\r\n while (isStillCell) {\r\n const nextChar = str.slice(0, 1);\r\n\r\n if (nextChar === '\"') {\r\n quoteNo += 1;\r\n }\r\n\r\n nextCell += nextChar;\r\n\r\n str = str.slice(1);\r\n\r\n if (str.length === 0 || (str.match(/^[\\t\\r\\n]/) && quoteNo % 2 === 0)) {\r\n isStillCell = false;\r\n }\r\n }\r\n\r\n nextCell = nextCell\r\n .replace(/^\"/, '')\r\n .replace(/\"$/, '')\r\n .replace(/[\"]*/g, (match) => new Array(Math.floor(match.length / 2)).fill('\"').join(''));\r\n } else {\r\n const matchedText = str.match(regNextCellNoQuotes);\r\n\r\n nextCell = matchedText ? matchedText[0] : '';\r\n str = str.slice(nextCell.length);\r\n }\r\n\r\n arr[row][column] = nextCell;\r\n }\r\n }\r\n // 去除 excel 最后一个多余的换行数据\r\n if (Array.isArray(arr) && arr.length > 1) {\r\n if (arr[arr.length - 1].length === 1 && arr[arr.length - 1][0] === '') {\r\n arr = arr.slice(0, arr.length - 1);\r\n }\r\n }\r\n\r\n return arr;\r\n}\r\n\r\n/**\r\n * @decodeSpreadsheetStr\r\n * @desc encode array to spreadsheet string. refer from http://github.com/warpech/sheetclip/\r\n * @param {array} str The string to parse.\r\n * @returns {string}\r\n */\r\nfunction encodeToSpreadsheetStr(arr: string[][]) {\r\n let r;\r\n let rLen;\r\n let c;\r\n let cLen;\r\n let str = '';\r\n let val;\r\n\r\n for (r = 0, rLen = arr.length; r < rLen; r += 1) {\r\n cLen = arr[r].length;\r\n\r\n for (c = 0; c < cLen; c += 1) {\r\n if (c > 0) {\r\n str += '\\t';\r\n }\r\n val = arr[r][c];\r\n\r\n if (typeof val === 'string') {\r\n if (val.indexOf('\\n') > -1) {\r\n str += `\"${val.replace(/\"/g, '\"\"')}\"`;\r\n } else {\r\n str += val;\r\n }\r\n } else if (val === null || val === void 0) {\r\n // void 0 resolves to undefined\r\n str += '';\r\n } else {\r\n str += val;\r\n }\r\n }\r\n\r\n if (r !== rLen - 1) {\r\n str += '\\n';\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n// 获取合并单元格的spanArr,针对行数据相同key合并\r\nfunction getSpanArrByRow(list: any, key: string, relationRowKeys: string[] = []) {\r\n let contactDot = 0;\r\n const spanArr: number[] = [];\r\n list.forEach((item: any, index: number) => {\r\n if (index === 0) {\r\n spanArr.push(1);\r\n } else {\r\n const curValue = relationRowKeys.reduce((acc, key) => `${acc}${item[key] ?? ''}`, '') || item[key];\r\n const pValue =\r\n relationRowKeys.reduce((acc, key) => `${acc}${list[index - 1][key] ?? ''}`, '') || list[index - 1][key];\r\n if (curValue === pValue) {\r\n spanArr[contactDot] += 1;\r\n spanArr.push(0);\r\n } else {\r\n spanArr.push(1);\r\n contactDot = index;\r\n }\r\n }\r\n });\r\n return spanArr;\r\n}\r\nfunction getSpanObjByColumn(row: any, columns: any) {\r\n let keyPre = '';\r\n let keyDot = '';\r\n const spanObj: any = {};\r\n columns.forEach((item: any, index: number) => {\r\n if (index === 0) {\r\n keyPre = item.key;\r\n keyDot = item.key;\r\n spanObj[item.key] = 1;\r\n } else {\r\n // eslint-disable-next-line no-undef\r\n if (row[item.key] === row[keyPre]) {\r\n spanObj[item.key] = 0;\r\n spanObj[keyDot] += 1;\r\n } else {\r\n spanObj[item.key] = 1;\r\n keyPre = item.key;\r\n keyDot = item.key;\r\n }\r\n }\r\n });\r\n return spanObj;\r\n}\r\n// 合并行单元格\r\nfunction mergeRowCell(params: SpanParams, mergeRowkey: string, relationRowKeys: string[] = []) {\r\n // 合并单元格\r\n const { visibleRows, rowIndex, headIndex } = params;\r\n const spanArr = getSpanArrByRow(visibleRows, mergeRowkey, relationRowKeys);\r\n if (spanArr[rowIndex - headIndex] === 0) {\r\n return {\r\n rowspan: 0,\r\n colspan: 0,\r\n relationRowKeys,\r\n mergeRow: true,\r\n };\r\n }\r\n return {\r\n rowspan: spanArr[rowIndex - headIndex],\r\n colspan: 1,\r\n relationRowKeys,\r\n mergeRow: true,\r\n };\r\n}\r\nfunction mergeColCell(params: SpanParams, mergeColKeys: string[] = []) {\r\n const { column, row, visibleLeafColumns } = params;\r\n const columns = visibleLeafColumns.filter((item) => mergeColKeys.includes(item.key));\r\n // 合并动态列单元格\r\n if (mergeColKeys.includes(column.key)) {\r\n const spanObj = getSpanObjByColumn(row, columns);\r\n if (spanObj[column.key] === 0) {\r\n return {\r\n rowspan: 0,\r\n colspan: 0,\r\n relationColKeys: mergeColKeys,\r\n mergeCol: true,\r\n };\r\n }\r\n return {\r\n rowspan: 1,\r\n colspan: spanObj[column.key],\r\n relationColKeys: mergeColKeys,\r\n mergeCol: true,\r\n };\r\n }\r\n}\r\n/**\r\n * 获取某个 CSS 变量的实际值\r\n * @param name 变量名(可以带或不带前缀,例如 \"color-primary\" 或 \"--color-primary\")\r\n * @param el 可选元素,默认为 document.documentElement\r\n * @returns CSS 变量的计算值(如 \"#1e90ff\")\r\n */\r\nfunction getCssVar(name: string, el: HTMLElement = document.documentElement): string {\r\n const key = name.startsWith('--') ? name : `--${name}`;\r\n const styles = getComputedStyle(el);\r\n return styles.getPropertyValue(key).trim();\r\n}\r\nexport {\r\n debounce,\r\n throttle,\r\n generateShortUUID,\r\n toLeaf,\r\n sortFixed,\r\n calCrossSpan,\r\n getMaxRow,\r\n decodeSpreadsheetStr,\r\n encodeToSpreadsheetStr,\r\n mergeRowCell,\r\n mergeColCell,\r\n getSpanArrByRow,\r\n getSpanObjByColumn,\r\n getCssVar,\r\n};\r\n","import Context from './Context';\r\nimport { CellType, Fixed } from './types';\r\n\r\nexport default class BaseCell {\r\n ctx: Context;\r\n x = 0;\r\n y = 0;\r\n width = 0;\r\n height = 0;\r\n fixed?: Fixed;\r\n cellType: CellType;\r\n constructor(ctx: Context, x: number, y: number, width: number, height: number, cellType: CellType, fixed?: Fixed) {\r\n this.ctx = ctx;\r\n this.x = x;\r\n this.y = y;\r\n this.width = width;\r\n this.height = height;\r\n this.fixed = fixed;\r\n this.cellType = cellType;\r\n }\r\n isHorizontalVisible() {\r\n if (this.fixed) {\r\n return true;\r\n }\r\n const { stageWidth, fixedLeftWidth, scrollX, fixedRightWidth } = this.ctx;\r\n const offsetWidth = stageWidth;\r\n return !(\r\n this.x + this.width - fixedLeftWidth - scrollX <= 0 || this.x - scrollX >= offsetWidth - fixedRightWidth\r\n );\r\n }\r\n isVerticalVisible() {\r\n const { stageHeight, scrollY } = this.ctx;\r\n const offsetHeight = stageHeight;\r\n return !(this.y + this.height - scrollY <= 0 || this.y - scrollY >= offsetHeight);\r\n }\r\n getDrawX() {\r\n if (this.fixed === 'left') {\r\n return this.x;\r\n }\r\n if (this.fixed === 'right') {\r\n // 可见区域宽度 -到右边界的距离即(表头宽度 - x坐标)\r\n const {\r\n stageWidth,\r\n config: { SCROLLER_TRACK_SIZE },\r\n } = this.ctx;\r\n const x = stageWidth - (this.ctx.header.width - this.x) - SCROLLER_TRACK_SIZE;\r\n return x;\r\n }\r\n return this.x - this.ctx.scrollX;\r\n }\r\n getDrawY() {\r\n if (this.cellType === 'header') {\r\n return this.y;\r\n }\r\n // footer固定时\r\n if (this.cellType === 'footer' && this.ctx.config.FOOTER_FIXED) {\r\n return this.y;\r\n }\r\n return this.y - this.ctx.scrollY;\r\n }\r\n getLeftFixedX() {\r\n return this.x - this.ctx.scrollX;\r\n }\r\n /**\r\n * RightFixed时相对StageX\r\n * @returns\r\n */\r\n getRightFixedX() {\r\n // const { SCROLLER_TRACK_SIZE } = this.grid.config;\r\n // if (!this.grid.header) {\r\n // return 0;\r\n // }\r\n // return (\r\n // this.grid.header.width -\r\n // this.x -\r\n // this.grid.layer.x() -\r\n // (this.grid.header.width - this.x) +\r\n // this.grid.stage.width() -\r\n // SCROLLER_TRACK_SIZE -\r\n // (this.grid.header.width - this.x)\r\n // );\r\n }\r\n}\r\n","import type {\n Column,\n Fixed,\n Type,\n Align,\n VerticalAlign,\n CellType,\n Render,\n FormatterMethod,\n CellTypeMethod,\n CellRenderMethod,\n CellEditorMethod,\n SpanMethod,\n CellHoverIconMethod,\n CellStyleMethod,\n OverflowTooltipPlacement,\n SpanInfo,\n SelectorCellValueType,\n} from './types';\nimport Context from './Context';\nimport BaseCell from './BaseCell';\nimport { Rule, Rules } from './Validator';\nexport default class Cell extends BaseCell {\n formatter?: FormatterMethod;\n formatterFooter?: FormatterMethod;\n hoverIconName?: string = '';\n operation = false;\n align: Align;\n verticalAlign: VerticalAlign;\n fixed?: Fixed;\n type: Type | '';\n editorType: string;\n editorProps: any;\n cellType: CellType;\n level: number;\n colspan = 1;\n rowspan = 1;\n mergeRow = false;\n mergeCol = false;\n relationRowKeys: string[] = []; // 合并单元格关联key\n relationColKeys: string[] = []; // 合并单元格关联key\n key: string;\n column: Column;\n rowIndex: number;\n colIndex: number;\n rowKey: string;\n row: any;\n value: any;\n render: Render;\n renderFooter: Render;\n style: any = {};\n rules: Rules | Rule = [];\n message: string = '';\n text: string = '';\n displayText: string = '';\n visibleWidth = 0;\n visibleHeight = 0;\n isHasChanged = false;\n drawX = 0;\n drawY = 0;\n drawCellBgColor = '';\n drawCellSkyBgColor = '';\n drawTextColor = '';\n drawTextX = 0;\n drawTextY = 0;\n drawImageX = 0;\n drawImageY = 0;\n drawImageWidth = 0;\n drawImageHeight = 0;\n drawImageName = '';\n drawImageSource?: HTMLImageElement;\n ellipsis = false;\n rowExpand = false;\n rowHasChildren = false;\n overflowTooltipShow = true;\n selectorCellValueType: SelectorCellValueType = 'value';\n overflowTooltipMaxWidth = 500;\n overflowTooltipPlacement: OverflowTooltipPlacement = 'top';\n\n constructor(\n ctx: Context,\n rowIndex: number,\n colIndex: number,\n x: number,\n y: number,\n width: number,\n height: number,\n column: Column,\n row: any,\n cellType: CellType = 'body',\n ) {\n super(ctx, x, y, width, height, cellType, column.fixed);\n this.visibleWidth = this.width;\n this.visibleHeight = this.height;\n this.colIndex = colIndex;\n this.rowIndex = rowIndex;\n this.key = column.key;\n this.type = column.type || '';\n this.editorType = column.editorType || 'text';\n this.selectorCellValueType = column.selectorCellValueType || this.ctx.config.SELECTOR_CELL_VALUE_TYPE || 'value';\n this.editorProps = column.editorProps || {};\n this.cellType = cellType;\n this.align = column.align || 'center';\n this.verticalAlign = column.verticalAlign || 'middle';\n this.fixed = column.fixed;\n this.level = column.level || 0;\n this.operation = column.operation || false;\n this.column = column;\n this.rules = column.rules || [];\n this.row = row;\n this.rowKey =\n this.cellType === 'body'\n ? this.ctx.database.getRowKeyForRowIndex(rowIndex)\n : `${this.cellType}_${this.rowIndex}`;\n this.value = this.getValue();\n this.render = column.render;\n this.overflowTooltipShow = column.overflowTooltipShow === false ? false : true;\n this.overflowTooltipMaxWidth = column.overflowTooltipMaxWidth || 500;\n this.overflowTooltipPlacement = column.overflowTooltipPlacement || 'top';\n this.renderFooter = column.renderFooter;\n this.hoverIconName = column.hoverIconName;\n this.formatter = column.formatter;\n this.formatterFooter = column.formatterFooter;\n this.update();\n }\n setWidthHeight(width: number, height: number) {\n this.width = width;\n this.height = height;\n }\n getValidationMessage() {\n const errors = this.ctx.database.getValidationError(this.rowKey, this.key);\n if (Array.isArray(errors) && errors.length) {\n const [err] = errors;\n this.message = err.message || '';\n }\n return this.message;\n }\n update() {\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\n this.drawTextX = this.drawX;\n this.drawTextY = this.drawY;\n this.isHasChanged = this.ctx.database.isHasChangedData(this.rowKey, this.key);\n this.updateSpan();\n this.updateStyle();\n this.updateType();\n this.updateHoverIcon();\n this.updateSelection();\n this.updateTree();\n this.updateEditor();\n this.updateRender();\n this.getValidationMessage();\n this.updateContainer();\n this.text = this.getText();\n this.displayText = this.getDisplayText();\n }\n updateSpan() {\n // 合计不合并\n if (this.cellType === 'footer') {\n return;\n }\n const { SPAN_METHOD } = this.ctx.config;\n if (typeof SPAN_METHOD === 'function') {\n const spanMethod: SpanMethod = SPAN_METHOD;\n const {\n colspan = 1,\n rowspan = 1,\n relationRowKeys,\n relationColKeys,\n mergeRow = false,\n mergeCol = false,\n } = spanMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n headIndex: this.ctx.body.headIndex,\n headPosition: this.ctx.database.getPositionForRowIndex(this.ctx.body.headIndex),\n visibleRows: this.ctx.body.visibleRows,\n visibleLeafColumns: this.ctx.header.visibleLeafColumns,\n rows: this.ctx.body.data,\n }) || {};\n if (Array.isArray(relationRowKeys) && relationRowKeys.length > 0) {\n this.relationRowKeys = relationRowKeys;\n } else {\n this.relationRowKeys = [this.key];\n }\n if (Array.isArray(relationColKeys) && relationColKeys.length > 0) {\n this.relationColKeys = relationColKeys;\n } else {\n this.relationColKeys = [this.key];\n }\n this.mergeCol = mergeCol;\n this.mergeRow = mergeRow;\n this.colspan = colspan;\n this.rowspan = rowspan;\n this.visibleWidth = this.getWidthByColIndexColSpan(this.colIndex, this.colspan);\n this.visibleHeight = this.ctx.database.getHeightByRowIndexRowSpan(this.rowIndex, this.rowspan);\n }\n }\n updateSpanInfo() {\n // 列合并单元格\n if (this.mergeRow || this.mergeCol) {\n const spanInfo = this.getSpanInfo();\n this.height = spanInfo.height;\n this.width = spanInfo.width;\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\n this.drawY -= spanInfo.offsetTop;\n this.drawX -= spanInfo.offsetLeft;\n }\n }\n updateType() {\n // 更改类型\n const { BODY_CELL_TYPE_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_TYPE_METHOD === 'function') {\n const cellTypeMethod: CellTypeMethod = BODY_CELL_TYPE_METHOD;\n const type = cellTypeMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (type !== undefined) {\n this.type = type;\n }\n }\n }\n updateEditor() {\n // 更改类型\n const { BODY_CELL_EDITOR_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_EDITOR_METHOD === 'function') {\n const CellEditorMethod: CellEditorMethod = BODY_CELL_EDITOR_METHOD;\n const editorProps = CellEditorMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (editorProps !== undefined) {\n const { type, props = {} } = editorProps;\n this.editorType = type;\n this.editorProps = props;\n }\n }\n }\n updateRender() {\n const { BODY_CELL_RENDER_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_RENDER_METHOD === 'function') {\n const cellRenderMethod: CellRenderMethod = BODY_CELL_RENDER_METHOD;\n const render = cellRenderMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (render !== undefined) {\n this.render = render;\n }\n }\n }\n validate() {\n this.ctx.database\n .getValidator(this.rowKey, this.key)\n .then(() => {\n this.ctx.database.setValidationError(this.rowKey, this.key, []);\n this.message = '';\n })\n .catch((errors) => {\n if (Array.isArray(errors) && errors.length) {\n const [err] = errors;\n this.message = err.message;\n this.ctx.database.setValidationError(this.rowKey, this.key, errors);\n }\n })\n .finally(() => {\n this.ctx.emit('draw');\n });\n }\n\n /**\n * 更新样式\n */\n updateStyle() {\n this.style = this.getOverlayerViewsStyle();\n }\n private updateTree() {\n const { CELL_PADDING = 0 } = this.ctx.config;\n const { rowKey, cellType } = this;\n let icon = undefined;\n let iconOffsetX = 0;\n let iconName = '';\n if (this.type === 'tree' && cellType === 'body') {\n const row = this.ctx.database.getRowForRowKey(rowKey);\n const { expand = false, hasChildren = false, expandLoading = false, level = 0 } = row || {};\n this.rowExpand = expand;\n this.rowHasChildren = hasChildren;\n if (expandLoading) {\n const loadingIcon = this.ctx.icons.get('loading');\n iconName = 'loading';\n icon = loadingIcon;\n iconOffsetX = level * 8;\n } else if (hasChildren) {\n const expandIcon = this.ctx.icons.get('expand');\n const shrinkIcon = this.ctx.icons.get('shrink');\n icon = !expand ? expandIcon : shrinkIcon;\n iconName = !expand ? 'expand' : 'shrink';\n iconOffsetX = level * 8;\n } else {\n iconOffsetX = level * 8;\n }\n let iconWidth = 20;\n let iconHeight = 20;\n if (icon) {\n let iconX = this.drawX + iconOffsetX + CELL_PADDING;\n let iconY = this.drawY + (this.visibleHeight - iconHeight) / 2;\n this.ctx.paint.drawImage(icon, iconX, iconY, iconWidth, iconHeight);\n this.drawImageX = iconX;\n this.drawImageY = iconY;\n this.drawImageWidth = iconWidth;\n this.drawImageHeight = iconHeight;\n this.drawImageName = iconName;\n this.drawImageSource = icon;\n }\n // 更改文本距离\n this.align = 'left';\n this.drawTextX = iconOffsetX + this.drawX + iconWidth - 0.5;\n }\n }\n private updateContainer() {\n const {\n BODY_BG_COLOR,\n EDIT_BG_COLOR,\n BODY_CELL_STYLE_METHOD,\n FOOTER_CELL_STYLE_METHOD,\n READONLY_TEXT_COLOR,\n BODY_TEXT_COLOR,\n FOOTER_TEXT_COLOR,\n FOOTER_BG_COLOR,\n HIGHLIGHT_SELECTED_ROW,\n HIGHLIGHT_SELECTED_ROW_COLOR,\n HIGHLIGHT_HOVER_ROW,\n HIGHLIGHT_HOVER_ROW_COLOR,\n STRIPE,\n STRIPE_COLOR,\n } = this.ctx.config;\n if (this.cellType === 'footer') {\n let bgColor = FOOTER_BG_COLOR;\n let textColor = FOOTER_TEXT_COLOR;\n if (typeof FOOTER_CELL_STYLE_METHOD === 'function') {\n const footerCellStyleMethod: CellStyleMethod = FOOTER_CELL_STYLE_METHOD;\n const { backgroundColor, color } =\n footerCellStyleMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n }) || {};\n if (backgroundColor) {\n bgColor = backgroundColor;\n }\n // 文字颜色\n if (color) {\n textColor = color;\n }\n }\n // 合计底部背景色\n this.drawCellSkyBgColor = 'transparent';\n this.drawCellBgColor = bgColor;\n this.drawTextColor = textColor;\n return;\n }\n // 高亮行,在背景色上加一层颜色\n let drawCellSkyBgColor = 'transparent';\n // 高亮行\n const hoverCell = this.ctx.hoverCell;\n const currentCell = this.ctx.currentCell;\n // 合并单元格\n let minY = this.rowIndex;\n let maxY = this.rowIndex;\n if (this.rowspan !== 1 && (HIGHLIGHT_HOVER_ROW || HIGHLIGHT_SELECTED_ROW)) {\n const spanInfo = this.getSpanInfo();\n const { yArr } = spanInfo;\n minY = yArr[0];\n maxY = yArr[1];\n }\n if (HIGHLIGHT_HOVER_ROW && hoverCell) {\n if (hoverCell.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_HOVER_ROW_COLOR;\n }\n if (hoverCell.rowIndex >= minY && hoverCell.rowIndex <= maxY) {\n drawCellSkyBgColor = HIGHLIGHT_HOVER_ROW_COLOR;\n }\n }\n\n if (HIGHLIGHT_SELECTED_ROW && currentCell) {\n if (currentCell.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_SELECTED_ROW_COLOR;\n }\n if (currentCell.rowIndex >= minY && currentCell.rowIndex <= maxY) {\n drawCellSkyBgColor = HIGHLIGHT_SELECTED_ROW_COLOR;\n }\n }\n\n this.drawCellSkyBgColor = drawCellSkyBgColor;\n // 恢复默认背景色\n let bgColor = BODY_BG_COLOR;\n let textColor = BODY_TEXT_COLOR;\n // 只读\n if (!this.ctx.database.getReadonly(this.rowKey, this.key)) {\n bgColor = EDIT_BG_COLOR;\n textColor = READONLY_TEXT_COLOR;\n }\n // 斑马纹,编辑背景色下会失效\n if (STRIPE) {\n if (this.rowIndex % 2) {\n bgColor = STRIPE_COLOR;\n } else {\n bgColor = BODY_BG_COLOR;\n }\n }\n\n if (typeof BODY_CELL_STYLE_METHOD === 'function') {\n const cellStyleMethod: CellStyleMethod = BODY_CELL_STYLE_METHOD;\n const { backgroundColor, color } =\n cellStyleMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n isHasChanged: this.isHasChanged,\n value: this.getValue(),\n }) || {};\n if (backgroundColor) {\n bgColor = backgroundColor;\n }\n // 文字颜色\n if (color) {\n textColor = color;\n }\n }\n this.drawCellBgColor = bgColor;\n this.drawTextColor = textColor;\n }\n private updateSelection() {\n const { visibleWidth, visibleHeight, rowspan, colspan, cellType, type, rowIndex, rowKey } = this;\n //合并的选框不显示\n if (rowspan === 0 || colspan === 0) {\n return;\n }\n // 合计不显示\n if (cellType === 'footer') {\n return;\n }\n // 选中框类型\n if (['index-selection', 'selection'].includes(type)) {\n const check = this.ctx.database.getRowSelection(rowKey);\n const selectable = this.ctx.database.getRowSelectable(rowKey);\n const { CHECKBOX_SIZE = 0 } = this.ctx.config;\n const _x = this.drawX + (visibleWidth - CHECKBOX_SIZE) / 2;\n const _y = this.drawY + (visibleHeight - CHECKBOX_SIZE) / 2;\n let checkboxImage: HTMLImageElement | undefined = this.ctx.icons.get('checkbox-uncheck');\n let checkboxName = 'checkbox-uncheck';\n if (check && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-check');\n checkboxName = 'checkbox-check';\n } else if (check && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-check-disabled');\n checkboxName = 'checkbox-check-disabled';\n } else if (!check && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-uncheck');\n checkboxName = 'checkbox-uncheck';\n } else {\n checkboxImage = this.ctx.icons.get('checkbox-disabled');\n checkboxName = 'checkbox-disabled';\n }\n if (checkboxImage && type == 'index-selection') {\n if (\n (this.ctx.hoverCell && this.ctx.hoverCell.rowIndex === rowIndex) ||\n ['checkbox-disabled', 'checkbox-check'].includes(checkboxName)\n ) {\n this.drawImageX = _x;\n this.drawImageY = _y;\n this.drawImageWidth = CHECKBOX_SIZE;\n this.drawImageHeight = CHECKBOX_SIZE;\n this.drawImageName = checkboxName;\n this.drawImageSource = checkboxImage;\n }\n } else if (checkboxImage && 'selection' === type) {\n this.drawImageX = _x;\n this.drawImageY = _y;\n this.drawImageWidth = CHECKBOX_SIZE;\n this.drawImageHeight = CHECKBOX_SIZE;\n this.drawImageName = checkboxName;\n this.drawImageSource = checkboxImage;\n }\n }\n }\n private updateHoverIcon() {\n const readonly = this.ctx.database.getReadonly(this.rowKey, this.key);\n if (readonly) {\n return;\n }\n const { BODY_CELL_HOVER_ICON_METHOD, CELL_HOVER_ICON_SIZE, CELL_PADDING, ENABLE_MERGE_CELL_LINK } =\n this.ctx.config;\n if (typeof BODY_CELL_HOVER_ICON_METHOD === 'function') {\n const hoverIconMethod: CellHoverIconMethod = BODY_CELL_HOVER_ICON_METHOD;\n const hoverIconName = hoverIconMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变hoverIconName\n if (hoverIconName !== undefined) {\n this.hoverIconName = hoverIconName;\n }\n }\n // 永远放在右边\n const { hoverCell } = this.ctx;\n if (this.hoverIconName && !this.ctx.editing && hoverCell) {\n let _x = 0;\n let _y = 0;\n if (hoverCell.rowKey === this.rowKey) {\n _x = this.drawX + this.width - CELL_HOVER_ICON_SIZE - CELL_PADDING;\n _y = this.drawY + (this.height - CELL_HOVER_ICON_SIZE) / 2;\n }\n // 合并单元格\n if (this.rowspan !== 1 && ENABLE_MERGE_CELL_LINK) {\n const spanInfo = this.getSpanInfo();\n const { yArr } = spanInfo;\n const minY = yArr[0];\n const maxY = yArr[1];\n if (hoverCell.rowIndex >= minY && hoverCell.rowIndex <= maxY) {\n const { width, height, offsetTop, offsetLeft } = spanInfo;\n _x = this.drawX - offsetLeft + width - CELL_HOVER_ICON_SIZE - CELL_PADDING;\n _y = this.drawY - offsetTop + (height - CELL_HOVER_ICON_SIZE) / 2;\n }\n }\n const drawImageSource = this.ctx.icons.get(this.hoverIconName);\n this.drawImageX = _x;\n this.drawImageY = _y;\n this.drawImageWidth = CELL_HOVER_ICON_SIZE;\n this.drawImageHeight = CELL_HOVER_ICON_SIZE;\n this.drawImageName = this.hoverIconName;\n this.drawImageSource = drawImageSource;\n }\n }\n // 过去跨度配置\n getSpanInfo(): SpanInfo {\n return this.ctx.database.getSpanInfo(this);\n }\n /**\n * 获取显示文本\n * @returns\n */\n getDisplayText() {\n if (this.cellType === 'footer') {\n // 插槽不显示文本\n if (this.renderFooter) {\n return '';\n }\n if (this.text === null || this.text === undefined) {\n return '';\n }\n return this.text;\n } else {\n // cellType === \"body\"\n // 被跨度单元格\n if (this.rowspan === 0 || this.colspan === 0) {\n return '';\n }\n // 插槽不显示文本\n if (this.render) {\n return '';\n }\n //\n if (\n this.type === 'index-selection' &&\n ((this.ctx.hoverCell && this.ctx.hoverCell.rowIndex === this.rowIndex) ||\n ['checkbox-disabled', 'checkbox-check'].includes(this.drawImageName))\n ) {\n return '';\n }\n if (this.text === null || this.text === undefined) {\n return '';\n }\n return `${this.text}`;\n }\n }\n /**\n * 获取文本\n * @returns\n */\n getText() {\n if (this.cellType === 'footer') {\n if (typeof this.formatterFooter === 'function') {\n const _text = this.formatterFooter({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.row[this.key],\n });\n return _text;\n }\n return this.row[this.key];\n }\n // cellType === \"body\"\n\n // formatter优先等级比较高\n if (typeof this.formatter === 'function') {\n const _text = this.formatter({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n return _text;\n }\n const { BODY_CELL_FORMATTER_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_FORMATTER_METHOD === 'function') {\n const formatterMethod: FormatterMethod = BODY_CELL_FORMATTER_METHOD;\n const _text = formatterMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n return _text;\n }\n if (['index-selection', 'index'].includes(this.type)) {\n const str = `${this.rowIndex + 1}`; // 索引\n return str; // 索引\n }\n this.value = this.ctx.database.getItemValue(this.rowKey, this.key);\n return this.value;\n }\n getValue() {\n return this.ctx.database.getItemValue(this.rowKey, this.key);\n }\n // 拓展格子可设置数据\n setValue(value: any) {\n this.ctx.setItemValueByEditor(this.rowKey, this.key, value);\n }\n /**\n * 获取样式\n */\n getOverlayerViewsStyle() {\n let left = `${this.drawX - this.ctx.fixedLeftWidth}px`;\n let top = `${this.drawY - this.ctx.body.y}px`;\n // 固定列\n if (this.fixed === 'left') {\n left = `${this.drawX}px`;\n } else if (this.fixed === 'right') {\n left = `${this.drawX - (this.ctx.stageWidth - this.ctx.fixedRightWidth)}px`;\n }\n // 合计\n if (this.cellType === 'footer') {\n if (this.ctx.config.FOOTER_FIXED) {\n top = `${this.drawY - this.ctx.footer.y}px`;\n }\n }\n return {\n position: 'absolute',\n overflow: 'hidden',\n left,\n top,\n width: `${this.visibleWidth}px`,\n height: `${this.visibleHeight}px`,\n pointerEvents: 'initial',\n userSelect: 'none',\n };\n }\n drawContainer() {\n const {\n paint,\n config: { BORDER_COLOR, BORDER },\n } = this.ctx;\n const { drawX, drawY } = this;\n paint.drawRect(drawX, drawY, this.visibleWidth, this.visibleHeight, {\n borderColor: BORDER ? BORDER_COLOR : 'transparent',\n fillColor: this.drawCellBgColor,\n });\n // 列合并单元格\n paint.drawRect(drawX, drawY, this.width, this.height, {\n borderColor: 'transparent',\n fillColor: this.drawCellSkyBgColor,\n });\n\n if (!BORDER) {\n this.ctx.paint.drawLine(\n [drawX, drawY + this.visibleHeight, drawX + this.visibleWidth, drawY + this.visibleHeight],\n {\n borderColor: BORDER_COLOR,\n fillColor: BORDER_COLOR,\n borderWidth: 1,\n lineCap: 'round',\n lineJoin: 'round',\n },\n );\n }\n }\n private drawAutofillPiont() {\n if (this.cellType === 'footer') {\n return;\n }\n const { SELECT_BORDER_COLOR, ENABLE_AUTOFILL, ENABLE_SELECTOR, AUTOFILL_POINT_BORDER_COLOR } = this.ctx.config;\n if (!ENABLE_SELECTOR) {\n return;\n }\n if (!ENABLE_AUTOFILL) {\n return;\n }\n if (this.ctx.editing) {\n return;\n }\n const show = true;\n const { xArr, yArr } = this.ctx.selector;\n const maxX = xArr[1];\n const maxY = yArr[1];\n const { colIndex, rowIndex, drawX, drawY } = this;\n // 绘制自动填充点\n if (show && colIndex === maxX && rowIndex === maxY) {\n const isOffset =\n colIndex === this.ctx.maxColIndex ||\n rowIndex === this.ctx.maxRowIndex ||\n colIndex === this.ctx.lastCenterColIndex;\n const offset = isOffset ? 6 : 4;\n this.ctx.paint.drawRect(drawX + this.width - offset, drawY + this.height - offset, 6, 6, {\n borderColor: AUTOFILL_POINT_BORDER_COLOR,\n fillColor: SELECT_BORDER_COLOR,\n });\n }\n }\n draw() {\n // 画选中框\n this.drawText();\n this.drawImage();\n this.drawSelector();\n this.drawAutofillPiont();\n this.drawErrorTip();\n }\n /**\n * 根据列的索引获取列的宽度\n * @param {Number} colIndex\n */\n private getWidthByColIndexColSpan(colIndex: number, colSpan: number) {\n if (colSpan === 0) {\n return 0;\n }\n let width = 0;\n for (let i = colIndex; i < colIndex + colSpan; i++) {\n const cellHeader = this.ctx.header.leafCellHeaders[i];\n width += cellHeader.width;\n }\n return width;\n }\n private drawText() {\n const { CELL_PADDING, BODY_FONT, PLACEHOLDER_COLOR } = this.ctx.config;\n let visibleWidth = this.visibleWidth;\n if (this.type === 'tree') {\n const offsetIconX = this.drawTextX - this.drawX;\n visibleWidth = this.visibleWidth - offsetIconX; // 减去树形图标的宽度\n }\n const { ellipsis } = this.ctx.paint.handleEllipsis(this.displayText, visibleWidth, CELL_PADDING, BODY_FONT);\n this.ellipsis = ellipsis;\n const { placeholder } = this.column;\n let text = this.displayText;\n let color = this.drawTextColor;\n // 更改颜色\n const isReadonly = this.ctx.database.getReadonly(this.rowKey, this.key);\n if (\n !isReadonly &&\n placeholder &&\n ['', null, undefined].includes(this.text) &&\n this.cellType === 'body' &&\n !(this.rowspan === 0 || this.colspan === 0)\n ) {\n text = placeholder;\n color = PLACEHOLDER_COLOR;\n }\n return this.ctx.paint.drawText(text, this.drawTextX, this.drawTextY, visibleWidth, this.visibleHeight, {\n font: BODY_FONT,\n padding: CELL_PADDING,\n align: this.align,\n verticalAlign: this.verticalAlign,\n color,\n });\n }\n private drawImage() {\n if (!this.drawImageSource) {\n return;\n }\n if (this.hoverIconName) {\n const { CELL_HOVER_ICON_BG_COLOR, CELL_HOVER_ICON_BORDER_COLOR } = this.ctx.config;\n this.ctx.paint.drawRect(\n this.drawImageX - 2,\n this.drawImageY - 2,\n this.drawImageWidth + 4,\n this.drawImageHeight + 4,\n {\n borderColor: CELL_HOVER_ICON_BORDER_COLOR,\n radius: 4,\n borderWidth: 1,\n fillColor: CELL_HOVER_ICON_BG_COLOR,\n },\n );\n }\n this.ctx.paint.drawImage(\n this.drawImageSource,\n this.drawImageX,\n this.drawImageY,\n this.drawImageWidth,\n this.drawImageHeight,\n );\n }\n private drawSelector() {\n if (this.cellType === 'footer') {\n return;\n }\n const { ENABLE_SELECTOR } = this.ctx.config;\n if (!ENABLE_SELECTOR) {\n return;\n }\n const { xArr, yArr, xArrCopy, yArrCopy } = this.ctx.selector;\n // 复制线\n this.drawBorder({\n xArr: xArrCopy,\n yArr: yArrCopy,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n lineDash: [4, 4],\n });\n // 填充线\n this.drawBorder({\n xArr: this.ctx.autofill.xArr,\n yArr: this.ctx.autofill.yArr,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n lineDash: [4, 4],\n });\n // 选择线\n this.drawBorder({\n xArr,\n yArr,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n });\n // 选择区背景颜色\n const [minX, maxX] = xArr;\n const [minY, maxY] = yArr;\n const isOne = minX === maxX && minY === maxY;\n if (\n !isOne &&\n this.colIndex >= minX &&\n this.colIndex <= maxX &&\n this.rowIndex >= minY &&\n this.rowIndex <= maxY\n ) {\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.width, this.height, {\n borderColor: 'transparent',\n fillColor: this.ctx.config.SELECT_AREA_COLOR || 'rgba(82,146,247,0.1)',\n });\n }\n if (this.operation && this.rowIndex >= minY && this.rowIndex <= maxY) {\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.visibleWidth, this.visibleHeight, {\n borderColor: 'transparent',\n fillColor: this.ctx.config.SELECT_ROW_COL_BG_COLOR || 'transparent',\n });\n }\n }\n private drawErrorTip() {\n // 合计不显示\n if (this.cellType === 'footer') {\n return;\n }\n // 没有错误消息\n if (!this.message) {\n return;\n }\n if (this.rowspan === 0 || this.colspan === 0) {\n return;\n }\n const { ERROR_TIP_ICON_SIZE, ERROR_TIP_COLOR } = this.ctx.config;\n const { width } = this;\n const x = this.drawX;\n const y = this.drawY;\n const points = [\n x + width - ERROR_TIP_ICON_SIZE - 0.5,\n y,\n x + width - 0.5,\n y,\n x + width - 0.5,\n y + ERROR_TIP_ICON_SIZE,\n ];\n this.ctx.paint.drawLine(points, {\n borderColor: ERROR_TIP_COLOR,\n fillColor: ERROR_TIP_COLOR,\n borderWidth: 1,\n lineCap: 'round',\n lineJoin: 'round',\n });\n }\n private drawBorder(options: {\n xArr: number[];\n yArr: number[];\n borderColor: string;\n fillColor: string;\n borderWidth: number;\n lineDash?: number[];\n }) {\n const { drawX, drawY, rowIndex, colIndex, height, width } = this;\n let x = drawX;\n let y = drawY;\n const { xArr, yArr, lineDash = [], borderWidth = 1, borderColor, fillColor } = options;\n const minX = xArr[0];\n const maxX = xArr[1];\n const minY = yArr[0];\n const maxY = yArr[1];\n // top border\n if (colIndex >= minX && colIndex <= maxX && rowIndex === minY) {\n const offsetW = colIndex === maxX ? 1 : 0;\n const offsetX = colIndex === minX ? 1 : 0;\n this.ctx.paint.drawLine([x + offsetX, y + 1, x + width - offsetW, y + 1], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n // right border\n if (colIndex === maxX && rowIndex >= minY && rowIndex <= maxY) {\n const offsetY = rowIndex === minY ? 1 : 0;\n const offsetH = rowIndex === maxY ? 1 : 0;\n this.ctx.paint.drawLine([x + width - 1, y + offsetY, x + width - 1, y + height - offsetH], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n // bottom border\n if (colIndex >= minX && colIndex <= maxX && rowIndex === maxY) {\n const offsetW = colIndex === maxX ? 1 : 0;\n const offsetX = colIndex === minX ? 1 : 0;\n this.ctx.paint.drawLine([x + offsetX, y + height - 1, x + width - offsetW, y + height - 1], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n // left border\n if (colIndex === minX && rowIndex >= minY && rowIndex <= maxY) {\n const offsetH = rowIndex === maxY ? 1 : 0;\n const offsetY = rowIndex === minY ? 1 : 0;\n this.ctx.paint.drawLine([x + 1, y + offsetY, x + 1, y + height - offsetH], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n }\n}\n","import type CellHeader from './CellHeader';\nimport Validator, { RuleParam, ValidateResult } from './Validator';\nimport type Context from './Context';\nimport type {\n CellReadonlyMethod,\n CellRulesMethod,\n ChangeItem,\n Column,\n FilterMethod,\n Position,\n SelectableMethod,\n EVirtTableOptions,\n BeforeCellValueChangeMethod,\n SpanInfo,\n SelectionMap,\n ErrorType,\n BeforeChangeItem,\n HistoryAction,\n BeforeValueChangeItem,\n} from './types';\nimport { generateShortUUID, toLeaf } from './util';\nimport { HistoryItemData } from './History';\nimport Cell from './Cell';\nexport default class Database {\n private loading = false;\n private ctx: Context;\n private data: any[];\n private columns: Column[];\n private footerData: any[] = [];\n private rowKeyMap = new Map<string, any>();\n private colIndexKeyMap = new Map<number, string>();\n private headerMap = new Map<string, CellHeader>();\n private rowIndexRowKeyMap = new Map<number, string>();\n private rowKeyRowIndexMap = new Map<string, number>();\n private checkboxKeyMap = new Map<string, string[]>();\n private selectionMap = new Map<string, SelectionMap>();\n private expandMap = new Map<string, boolean>();\n private originalDataMap = new Map<string, any>();\n private changedDataMap = new Map<string, any>();\n private validationErrorMap = new Map<string, ValidateResult>();\n private itemRowKeyMap = new WeakMap();\n private bufferData: any[] = [];\n private bufferCheckState = {\n buffer: false,\n check: false,\n indeterminate: false,\n selectable: true,\n };\n private sumHeight = 0;\n private filterMethod: FilterMethod | undefined;\n private positions: Position[] = []; //虚拟滚动位置\n constructor(ctx: Context, options: EVirtTableOptions) {\n this.ctx = ctx;\n const { data = [], columns = [], footerData = [] } = options;\n this.data = data;\n this.footerData = footerData;\n this.columns = columns;\n this.setLoading(true);\n this.init();\n }\n // 初始化默认不忽略清空改变值和校验map\n init(isClear = true) {\n this.clearBufferData();\n this.rowKeyMap.clear();\n this.checkboxKeyMap.clear();\n this.colIndexKeyMap.clear();\n this.rowIndexRowKeyMap.clear();\n this.rowKeyRowIndexMap.clear();\n // 判断是否有选择和树形结构\n const _columns = this.getColumns();\n const leafColumns = toLeaf(_columns);\n this.ctx.hasSelection = leafColumns.some((item) => item.type === 'selection');\n this.ctx.hasTree = leafColumns.some((item) => item.type === 'tree');\n if (isClear) {\n this.originalDataMap.clear();\n this.changedDataMap.clear();\n this.validationErrorMap.clear();\n const { ROW_KEY } = this.ctx.config;\n // 清除选中和展开状态,如果没有ROW_KEY清除\n if (!ROW_KEY) {\n // 无行主键时直接清除所有状态\n this.selectionMap.clear();\n this.expandMap.clear();\n } else {\n // 有行主键,根据上下文条件清除部分状态\n if (!this.ctx.hasSelection) {\n this.selectionMap.clear();\n }\n if (!this.ctx.hasTree) {\n this.expandMap.clear();\n }\n }\n }\n this.itemRowKeyMap = new WeakMap();\n this.initData(this.data);\n this.getData();\n this.bufferCheckState.buffer = false;\n }\n /**\n * 清除缓存数据\n */\n clearBufferData() {\n this.bufferData = [];\n }\n /**\n * 初始化数据\n * @param dataList\n * @param level\n */\n private initData(dataList: any[], level: number = 0, parentRowKeys: string[] = []) {\n dataList.forEach((item, index) => {\n const { ROW_KEY = '', DEFAULT_EXPAND_ALL, CELL_HEIGHT, SELECTABLE_METHOD, CHECKBOX_KEY } = this.ctx.config;\n const _rowKey = item[ROW_KEY]; // 行唯一标识,否则就rowKey\n const rowKey = _rowKey !== undefined && _rowKey !== null ? `${_rowKey}` : generateShortUUID();\n this.itemRowKeyMap.set(item, rowKey);\n const height = item._height || CELL_HEIGHT;\n const readonly = item._readonly;\n let selectable: SelectableMethod | boolean = true;\n if (typeof SELECTABLE_METHOD === 'function') {\n const selectableMethod: SelectableMethod = SELECTABLE_METHOD;\n selectable = selectableMethod;\n }\n // 存储checkboxKey,处理合并单元格选中\n if (CHECKBOX_KEY) {\n const checkboxKey = item[CHECKBOX_KEY];\n if (this.checkboxKeyMap.has(checkboxKey)) {\n const checkboxKeys = this.checkboxKeyMap.get(checkboxKey) || [];\n checkboxKeys.push(rowKey);\n this.checkboxKeyMap.set(checkboxKey, checkboxKeys);\n } else {\n this.checkboxKeyMap.set(checkboxKey, [rowKey]);\n }\n }\n // 存key\n this.selectionMap.set(rowKey, {\n key: CHECKBOX_KEY ? item[CHECKBOX_KEY] : rowKey,\n row: item,\n check: this.selectionMap.get(rowKey)?.check || false,\n });\n const expand = DEFAULT_EXPAND_ALL || this.expandMap.get(rowKey) || item._expand || false;\n this.expandMap.set(rowKey, expand);\n this.rowKeyMap.set(rowKey, {\n readonly,\n index,\n rowIndex: index,\n level,\n height,\n check: false,\n selectable,\n expand,\n expandLazy: false,\n hasChildren: item._hasChildren || (Array.isArray(item.children) ? item.children.length > 0 : false),\n expandLoading: false,\n item,\n parentRowKeys,\n });\n if (Array.isArray(item.children)) {\n if (item.children.length) {\n this.initData(item.children, level + 1, [...parentRowKeys, rowKey]);\n }\n }\n });\n }\n /**\n *\n * @param rowKey 设置Row高度\n * @param height\n */\n setRowHeight(rowIndex: number, height: number) {\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n if (rowKey === undefined) {\n return;\n }\n const row = this.rowKeyMap.get(rowKey);\n row.height = height;\n row.item._height = height;\n this.clearBufferData(); // 清除缓存数据\n }\n /**\n *\n * @returns 获取转化平铺数据\n */\n getAllRowsData() {\n let list: any[] = [];\n const recursiveData = (data: any[]) => {\n data.forEach((item) => {\n list.push(item);\n if (Array.isArray(item.children)) {\n recursiveData(item.children);\n }\n });\n };\n recursiveData(this.data);\n return list;\n }\n private filterColumns(columns: Column[]) {\n return columns.reduce((acc: Column[], column) => {\n // 检查当前列的 hide 属性\n const shouldHide = typeof column.hide === 'function' ? column.hide() : column.hide;\n // 如果当前列不应该隐藏,则添加到结果中\n if (!shouldHide) {\n const newColumn = { ...column }; // 复制当前列\n // 递归处理子列\n if (newColumn.children && Array.isArray(newColumn.children)) {\n newColumn.children = this.filterColumns(newColumn.children);\n }\n acc.push(newColumn);\n }\n return acc;\n }, []);\n }\n getColumns() {\n return this.filterColumns(this.columns);\n }\n setColumns(columns: Column[]) {\n this.columns = columns;\n this.clearBufferData();\n }\n setData(data: any[]) {\n this.data = data;\n if (this.columns.length) {\n this.init();\n }\n }\n /**\n * 统一转化数据,给画body使用,包括过滤树状等,统一入口\n * @returns\n */\n getData() {\n if (this.bufferData.length > 0) {\n return {\n data: this.bufferData,\n sumHeight: this.sumHeight,\n positions: this.positions,\n };\n }\n let list: any[] = [];\n let rowIndex = 0;\n this.sumHeight = 0;\n this.positions = [];\n const recursiveData = (data: any[]) => {\n data.forEach((item) => {\n list.push(item);\n const rowKey = this.itemRowKeyMap.get(item);\n const { expand, hasChildren, height } = this.rowKeyMap.get(rowKey);\n const top = this.sumHeight;\n this.sumHeight += height;\n this.rowIndexRowKeyMap.set(rowIndex, rowKey);\n this.rowKeyRowIndexMap.set(rowKey, rowIndex);\n this.positions.push({\n top,\n height,\n bottom: this.sumHeight,\n });\n rowIndex += 1;\n if (expand && hasChildren) {\n recursiveData(item.children);\n }\n });\n };\n this.rowIndexRowKeyMap.clear();\n this.rowKeyRowIndexMap.clear();\n let _data = this.data;\n if (typeof this.filterMethod === 'function') {\n _data = this.filterMethod(_data);\n }\n recursiveData(_data);\n this.bufferData = list;\n return {\n data: list,\n sumHeight: this.sumHeight,\n positions: this.positions,\n };\n }\n setFooterData(data: any[]) {\n this.footerData = data;\n }\n getFooterData() {\n return this.footerData;\n }\n\n /**\n * 设置过滤方法\n */\n setFilterMethod(filterMethod: FilterMethod) {\n this.filterMethod = filterMethod;\n }\n /**\n * 清空过滤方法\n */\n clearFilterMethod() {\n this.filterMethod = undefined;\n }\n /**\n * 根据rowKey,控制指定展开行\n * @param rowKey\n * @param expand\n */\n expandItem(rowKey: string, expand = false) {\n const row = this.rowKeyMap.get(rowKey);\n row.expand = expand;\n this.expandMap.set(rowKey, expand);\n this.clearBufferData(); // 清除缓存数据\n this.ctx.emit('draw');\n }\n setExpandRowKeys(rowKeys: any[], expand = true) {\n this.expandMap.clear();\n rowKeys.forEach((rowkey) => {\n const row = this.rowKeyMap.get(rowkey);\n this.expandMap.set(rowkey, expand);\n row.expand = expand;\n });\n this.clearBufferData(); // 清除缓存数据\n this.ctx.emit('draw');\n }\n getExpandRowKeys() {\n let list: string[] = [];\n this.rowKeyMap.forEach((row: any, key: string) => {\n if (row.expand) {\n list.push(key);\n }\n });\n return list;\n }\n expandAll(expand: boolean) {\n this.expandMap.clear();\n this.rowKeyMap.forEach((row: any) => {\n row.expand = expand;\n this.expandMap.set(row.key, expand);\n });\n this.clearBufferData(); // 清除缓存数据\n this.ctx.emit('draw');\n }\n expandLoading(rowKey: string, loading = false) {\n const row = this.rowKeyMap.get(rowKey);\n row.expandLoading = loading;\n this.clearBufferData(); // 清除缓存数据\n this.ctx.emit('draw');\n }\n setExpandChildren(rowKey: string, children: any[]) {\n const row = this.rowKeyMap.get(rowKey);\n row.expand = true;\n this.expandMap.set(rowKey, true);\n row.expandLazy = true;\n row.item.children = children;\n this.initData(row.item.children, row.level + 1);\n this.clearBufferData(); // 清除缓存数据\n }\n getIsExpandLoading(rowKey: string) {\n const row = this.rowKeyMap.get(rowKey);\n return row.expandLoading;\n }\n getIsExpandLazy(rowKey: string) {\n const row = this.rowKeyMap.get(rowKey);\n return row.expandLazy;\n }\n /**\n * 根据rowKey获取是否展开\n * @param rowKey\n * @returns\n */\n getIsExpand(rowKey: string) {\n const row = this.rowKeyMap.get(rowKey);\n return row.expand;\n }\n /**\n * 根据rowKey获取行数据\n * @param rowKey\n * @returns\n */\n getRowForRowKey(rowKey: string) {\n return this.rowKeyMap.get(rowKey);\n }\n getRowForRowIndex(rowIndex: number) {\n const rowKey = this.getRowKeyForRowIndex(rowIndex);\n return this.rowKeyMap.get(rowKey);\n }\n /**\n * 根据rowIndex获取rowKey\n * @param rowKey\n * @returns\n */\n getRowKeyForRowIndex(rowIndex: number) {\n return this.rowIndexRowKeyMap.get(rowIndex) || '';\n }\n getRowKeyByItem(item: any) {\n return this.itemRowKeyMap.get(item);\n }\n getRowIndexForRowKey(rowKey: string) {\n return this.rowKeyRowIndexMap.get(rowKey);\n }\n /**\n * 根据rowIndex和colIndex获取单元格数据\n * @param rowIndex\n * @param colIndex\n * @returns\n */\n getItemValueForRowIndexAndColIndex(rowIndex: number, colIndex: number) {\n const has = this.rowIndexRowKeyMap.has(rowIndex) && this.colIndexKeyMap.get(colIndex);\n if (!has) {\n return null;\n }\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n const key = this.colIndexKeyMap.get(colIndex);\n if (rowKey === undefined || key === undefined) {\n return null;\n }\n return {\n rowKey,\n key,\n value: this.getItemValue(rowKey, key),\n };\n }\n /**\n * 根据rowKey和key获取单元格数据\n * @param rowKey\n * @param key\n * @returns\n */\n getItemValue(rowKey: string, key: string) {\n const row = this.rowKeyMap.get(rowKey);\n\n if (row && row.item) {\n if (row.item[key] === undefined) {\n return null;\n }\n return row.item[key];\n }\n return null;\n }\n /**\n * 批量设置数据\n * @param list\n * @param history\n * @returns\n */\n async batchSetItemValue(\n _list: ChangeItem[],\n history = false,\n checkReadonly = true,\n historyAcion: HistoryAction = 'none',\n ) {\n let historyList: HistoryItemData[] = [];\n let _checkReadonly = checkReadonly;\n const rowKeyList: Set<string> = new Set();\n let errList: ChangeItem[] = [];\n let changeList: BeforeValueChangeItem[] = _list.map((item) => {\n const { rowKey, key } = item;\n let _value = item.value;\n let value = _value;\n const row = this.getRowDataItemForRowKey(rowKey);\n const oldValue = this.getItemValue(rowKey, key);\n // 判断数字\n const cell = this.getVirtualBodyCellByKey(rowKey, key);\n if (cell?.type === 'number') {\n // 处理数字\n if (['', undefined, null].includes(_value)) {\n value = null;\n } else if (/^-?\\d+(\\.\\d+)?$/.test(`${_value}`)) {\n value = Number(_value);\n } else {\n value = oldValue;\n errList.push({\n ...item,\n value,\n oldValue,\n row,\n });\n }\n }\n return {\n ...item,\n value,\n oldValue,\n row,\n };\n });\n // 过滤错误的\n changeList = changeList.filter((item) => {\n return !errList.some((err) => item.rowKey === err.rowKey && item.key === err.key);\n });\n if (errList.length) {\n const err: ErrorType = {\n code: 'ERR_BATCH_SET_NUMBER_VALUE',\n message: 'Assignment failed, not a numeric type',\n data: errList,\n };\n this.ctx.emit('error', err);\n }\n if (!changeList.length) {\n return;\n }\n const { BEFORE_VALUE_CHANGE_METHOD } = this.ctx.config;\n if (historyAcion === 'none' && typeof BEFORE_VALUE_CHANGE_METHOD === 'function') {\n const beforeCellValueChange: BeforeCellValueChangeMethod = BEFORE_VALUE_CHANGE_METHOD;\n const values = await beforeCellValueChange(changeList);\n changeList = values;\n _checkReadonly = false; // 允许编辑只读\n }\n changeList.forEach((data) => {\n const { value, rowKey, key } = data;\n const oldValue = this.getItemValue(rowKey, key);\n rowKeyList.add(rowKey);\n // 不加历史,不重绘,不是编辑器,不检验只读\n this.setItemValue(rowKey, key, value, false, false, false, _checkReadonly);\n historyList.push({\n rowKey,\n key,\n oldValue,\n newValue: value,\n });\n });\n // 触发change事件\n let rows: any[] = [];\n rowKeyList.forEach((rowKey) => {\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\n });\n const promsieValidators = changeList.map(({ rowKey, key }) => this.getValidator(rowKey, key));\n Promise.all(promsieValidators).then(() => {\n if (this.validationErrorMap.size === 0 && this.changedDataMap.size > 0) {\n this.ctx.emit('validateChangedData', this.getChangedData());\n }\n });\n this.ctx.emit('change', changeList, rows);\n // 推历史记录\n if (history) {\n this.ctx.history.pushState({\n changeList: historyList,\n scrollX: this.ctx.scrollX,\n scrollY: this.ctx.scrollY,\n type: 'multiple',\n });\n }\n this.ctx.emit('draw');\n }\n /**\n *设置单一数据\n * @param rowKey\n * @param key\n * @param value\n * @param history 是否添加历史记录\n * @param reDraw 是否刷新重绘\n * @param isEditor 是否是编辑器\n * @param checkReadonly 是否检查只读\n * @returns\n */\n async setItemValue(\n rowKey: string,\n key: string,\n _value: any,\n history = false,\n reDraw = false,\n isEditor = false,\n checkReadonly = true,\n ) {\n // 异常情况\n if (!this.rowKeyMap.has(rowKey)) {\n return {};\n }\n\n const { item } = this.rowKeyMap.get(rowKey);\n let oldValue = item[key];\n let value = _value;\n\n // 只读返回旧值\n if (checkReadonly && this.ctx.database.getReadonly(rowKey, key)) {\n return {\n oldValue,\n newValue: oldValue,\n };\n }\n // 处理对象\n if (item[key] !== null && typeof item[key] === 'object') {\n oldValue = JSON.parse(JSON.stringify(item[key]));\n }\n const changeKey = `${rowKey}\\u200b_${key}`;\n // 设置原始值,只设置一次\n if (!this.originalDataMap.has(changeKey)) {\n this.originalDataMap.set(changeKey, oldValue);\n }\n const originalValue = this.originalDataMap.get(changeKey);\n const row = this.getRowDataItemForRowKey(rowKey);\n // 是否是否是编辑器进来的\n if (isEditor) {\n const cell = this.getVirtualBodyCellByKey(rowKey, key);\n if (cell?.type === 'number') {\n // 处理数字\n if (['', undefined, null].includes(_value)) {\n value = null;\n } else if (/^-?\\d+(\\.\\d+)?$/.test(`${_value}`)) {\n value = Number(_value);\n } else {\n value = oldValue;\n const err: ErrorType = {\n code: 'ERR_SET_NUMBER_VALUE',\n message: 'Assignment failed, not a numeric type',\n data: [\n {\n rowKey,\n key,\n value,\n oldValue,\n row,\n },\n ],\n };\n this.ctx.emit('error', err);\n }\n }\n if (value === oldValue) {\n return {\n oldValue,\n newValue: oldValue,\n };\n }\n let changeList: BeforeChangeItem[] = [\n {\n rowKey,\n key,\n value,\n oldValue,\n row,\n },\n ];\n this.batchSetItemValue(changeList, history, false);\n this.ctx.emit('editChange', {\n rowKey,\n key,\n oldValue,\n value,\n originalValue,\n row,\n });\n } else {\n this.changedDataMap.set(changeKey, value);\n item[key] = value;\n }\n // 迭代改变值事件,有改变一次值就触发,包括批量的\n if (this.ctx.hasEvent('iterationChange')) {\n this.ctx.emit('iterationChange', {\n rowKey,\n key,\n oldValue,\n value,\n originalValue: this.originalDataMap.get(changeKey),\n row,\n });\n }\n // 重绘\n if (reDraw) {\n this.ctx.emit('draw');\n }\n return {\n oldValue,\n newValue: value,\n };\n }\n /**\n * 根据rowKey 获取行数据\n * @param rowKey\n * @returns\n */\n getRowDataItemForRowKey(rowKey: string) {\n if (!this.rowKeyMap.has(rowKey)) {\n return {};\n }\n const { item } = this.rowKeyMap.get(rowKey);\n return item;\n }\n /**\n *\n * @param rowKey 设置选中状态ByCheckboxKey,用于合并Checkbox单元格时声明唯一key\n * @param check\n */\n private setRowSelectionByCheckboxKey(rowKey: string, check: boolean) {\n const { CHECKBOX_KEY } = this.ctx.config;\n if (CHECKBOX_KEY) {\n if (!this.rowKeyMap.has(rowKey)) {\n return false;\n }\n const { item } = this.rowKeyMap.get(rowKey);\n const checkboxKey = item[CHECKBOX_KEY];\n if (this.checkboxKeyMap.has(checkboxKey)) {\n const rowKeys = this.checkboxKeyMap.get(checkboxKey) || [];\n rowKeys.forEach((rowKey: string) => {\n const selection = this.selectionMap.get(rowKey);\n if (selection) {\n selection.check = check;\n }\n });\n }\n }\n }\n /**\n * 根据rowKey 取反选中\n * @param rowKey\n */\n toggleRowSelection(rowKey: string) {\n const row = this.rowKeyMap.get(rowKey);\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return;\n }\n selection.check = !selection.check;\n this.setRowSelectionByCheckboxKey(rowKey, selection.check);\n this.ctx.emit('toggleRowSelection', row);\n const rows = this.getSelectionRows();\n this.ctx.emit('selectionChange', rows);\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n /**\n * 根据rowKey 设置选中状态\n * @param rowKey\n */\n setRowSelection(rowKey: string, check: boolean, draw = true) {\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return;\n }\n selection.check = check;\n this.setRowSelectionByCheckboxKey(rowKey, selection.check);\n this.ctx.emit('setRowSelection', check, selection.row);\n if (draw) {\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n }\n getSelectionRows() {\n let rows: any[] = [];\n this.selectionMap.forEach((selection: any) => {\n if (selection.check) {\n rows.push(selection.row);\n }\n });\n return rows;\n }\n /**\n * 根据rowKey 获取选中状态\n * @param rowKey\n */\n getRowSelection(rowKey: string) {\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return false;\n }\n return selection.check;\n }\n /**\n * 根据rowKey 获取选中状态\n * @param rowKey\n */\n getRowSelectable(rowKey: string) {\n const { selectable, item, rowIndex } = this.rowKeyMap.get(rowKey);\n if (typeof selectable === 'function') {\n return selectable({\n row: item,\n rowIndex,\n });\n }\n return selectable;\n }\n /**\n * 全选\n * @param rowKey\n */\n toggleAllSelection() {\n this.rowKeyMap.forEach((row: any, rowKey: string) => {\n let _selectable = row.selectable;\n if (typeof _selectable === 'function') {\n _selectable = _selectable({\n row: row.item,\n rowIndex: row.rowIndex,\n });\n }\n if (_selectable) {\n this.setRowSelection(rowKey, true, false);\n }\n });\n const rows = this.getSelectionRows();\n this.ctx.emit('toggleAllSelection', rows);\n this.ctx.emit('selectionChange', rows);\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n /**\n * 清除选中\n * @param rowKey\n */\n clearSelection(ignoreReserve = false) {\n // 清除选中,点击表头清除时要忽略跨页选的\n if (ignoreReserve) {\n this.rowKeyMap.forEach((_, rowKey: string) => {\n this.setRowSelection(rowKey, false, false);\n });\n } else {\n this.selectionMap.clear();\n this.rowKeyMap.forEach((row, rowKey: string) => {\n this.selectionMap.set(rowKey, {\n check: false,\n row: row.item,\n key: rowKey,\n });\n });\n }\n const rows = this.getSelectionRows();\n this.ctx.emit('clearSelection');\n this.ctx.emit('selectionChange', rows);\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n /**\n * 获取选中状态,表头用\n * @param rowKey\n */\n getCheckedState() {\n // 缓存,解决性能问题\n const { buffer, ...bufferState } = this.bufferCheckState;\n if (buffer) {\n return bufferState;\n }\n const total = this.rowKeyMap.size;\n let totalChecked = 0;\n let totalSelectable = 0;\n const reserveTotal = this.selectionMap.size;\n const reserveHasChecked = Array.from(this.selectionMap.values()).some((item) => item.check);\n this.rowKeyMap.forEach((row: any, rowKey: string) => {\n if (this.selectionMap.get(rowKey)?.check) {\n totalChecked += 1;\n }\n let _selectable = row.selectable;\n if (typeof _selectable === 'function') {\n _selectable = _selectable({\n row: row.item,\n rowIndex: row.rowIndex,\n });\n }\n if (_selectable) {\n totalSelectable += 1;\n }\n });\n // 存在跨页时,变更半选中\n const reserveIndeterminate = reserveTotal > total && totalChecked === 0 && reserveHasChecked;\n const indeterminate =\n (totalSelectable && totalSelectable > totalChecked && totalChecked > 0) || reserveIndeterminate;\n const selectable = totalSelectable !== 0;\n const check = !!totalSelectable && totalSelectable === totalChecked;\n // 缓存\n this.bufferCheckState = {\n buffer: true,\n check,\n indeterminate,\n selectable,\n };\n\n return {\n check,\n indeterminate,\n selectable,\n };\n }\n /**\n * 更新列索引\n * @param list 表头末级列表\n */\n updateColIndexKeyMap(list: CellHeader[] = []) {\n this.colIndexKeyMap.clear();\n list.forEach((column) => {\n this.colIndexKeyMap.set(column.colIndex, column.key);\n });\n }\n getColumnByColIndex(colIndex: number) {\n const key = this.colIndexKeyMap.get(colIndex);\n if (key && this.headerMap.has(key)) {\n return this.headerMap.get(key)?.column;\n }\n }\n getColumnByKey(key: string) {\n const column = this.headerMap.get(key);\n if (column) {\n return column;\n }\n }\n getColIndexForKey(key: string) {\n if (key && this.headerMap.has(key)) {\n return this.headerMap.get(key)?.colIndex;\n }\n }\n getColHeaderByIndex(colIndex: number) {\n const key = this.colIndexKeyMap.get(colIndex);\n if (key && this.headerMap.has(key)) {\n return this.headerMap.get(key);\n }\n return undefined;\n }\n /**\n * 获取以改变数据\n */\n getChangedData() {\n let list: {\n rowKey: string;\n colKey: string;\n row: any;\n originalValue: any;\n value: any;\n }[] = [];\n this.changedDataMap.forEach((value, key) => {\n const originalValue = this.originalDataMap.get(key);\n const rowKey = key.split('\\u200b_')[0];\n const colKey = key.split('\\u200b_')[1];\n if (originalValue !== value) {\n list.push({\n rowKey,\n colKey,\n originalValue,\n row: this.ctx.database.getRowDataItemForRowKey(rowKey),\n value,\n });\n }\n });\n return list;\n }\n getChangedRows() {\n const rowKeyList: Set<string> = new Set();\n this.changedDataMap.forEach((value, key) => {\n const originalValue = this.originalDataMap.get(key);\n const rowKey = key.split('\\u200b_')[0];\n if (originalValue !== value) {\n rowKeyList.add(rowKey);\n }\n });\n let rows: any[] = [];\n rowKeyList.forEach((rowKey) => {\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\n });\n return rows;\n }\n /**\n * 获取改变值是否已经改变\n * @param rowKey\n * @param key\n * @returns\n */\n isHasChangedData(rowKey: string, key: string) {\n const changedKey = `${rowKey}\\u200b_${key}`;\n if (!this.changedDataMap.has(changedKey)) {\n return false;\n }\n const originalValue = this.originalDataMap.get(changedKey);\n const changedValue = this.changedDataMap.get(changedKey);\n return originalValue !== changedValue;\n }\n getPositionForRowIndex(rowIndex: number): Position {\n if (rowIndex < this.positions.length) {\n return this.positions[rowIndex];\n }\n return {\n height: 0,\n top: 0,\n bottom: 0,\n };\n }\n\n setHeader(key: string, cellHeader: CellHeader): boolean {\n if (!key) {\n return false;\n }\n this.headerMap.set(key, cellHeader);\n return true;\n }\n getReadonly(rowKey: string, key: string) {\n const { DISABLED } = this.ctx.config;\n // 禁用编辑\n if (DISABLED) {\n return true;\n }\n const row = this.rowKeyMap.get(rowKey);\n const colHeader = this.headerMap.get(key);\n if (!row || !colHeader) {\n return true;\n }\n const rowReadonly = row.readonly;\n const colReadonly = colHeader.readonly;\n const { BODY_CELL_READONLY_METHOD } = this.ctx.config;\n // 自定义只读\n if (typeof BODY_CELL_READONLY_METHOD === 'function' && colHeader) {\n const cellReadonlyMethod: CellReadonlyMethod = BODY_CELL_READONLY_METHOD;\n const readonly = cellReadonlyMethod({\n row: row.item,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n column: colHeader.column,\n value: this.getItemValue(rowKey, key),\n });\n if (readonly !== undefined) {\n return readonly;\n }\n }\n return colReadonly || rowReadonly;\n }\n clearValidate() {\n this.validationErrorMap.clear();\n }\n hasValidationError() {\n return this.validationErrorMap.size !== 0;\n }\n getValidator(rowKey: string, key: string) {\n return new Promise((resolve) => {\n const row = this.rowKeyMap.get(rowKey);\n const colHeader = this.headerMap.get(key);\n const { BODY_CELL_RULES_METHOD } = this.ctx.config;\n if (colHeader === undefined) {\n return resolve([]);\n }\n const column = colHeader.column;\n let rules = column.rules;\n // 自定义只读\n if (typeof BODY_CELL_RULES_METHOD === 'function') {\n const cellRulesMethod: CellRulesMethod = BODY_CELL_RULES_METHOD;\n const _rules = cellRulesMethod({\n row: row.item,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n column,\n value: this.getItemValue(rowKey, key),\n });\n if (_rules) {\n rules = _rules;\n }\n }\n if (rules) {\n const ruleParam: RuleParam = {\n row: row.item,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n column,\n key,\n rowKey,\n value: this.getItemValue(rowKey, key),\n field: key,\n fieldValue: this.getItemValue(rowKey, key),\n };\n const validator = new Validator(rules);\n const _errors = validator.validate(ruleParam);\n this.setValidationError(rowKey, key, _errors);\n resolve(_errors);\n } else {\n this.clearValidationError(rowKey, key);\n resolve([]);\n }\n });\n }\n getHeightByRowIndexRowSpan(rowIndex: number, rowSpan: number) {\n let sumHeight = 0;\n for (let i = 0; i < rowSpan; i++) {\n const position = this.positions[rowIndex + i];\n if (position) {\n sumHeight += position.height;\n }\n }\n return sumHeight;\n }\n getSpanInfo(cell: Cell): SpanInfo {\n const {\n rowIndex,\n key,\n rowKey,\n row,\n value,\n colIndex,\n relationRowKeys,\n relationColKeys,\n rowspan,\n height,\n width,\n colspan,\n mergeRow,\n mergeCol,\n } = cell;\n if (rowspan === 1 && colspan === 1) {\n return {\n xArr: [colIndex, colIndex],\n yArr: [rowIndex, rowIndex],\n rowspan,\n colspan,\n height,\n width,\n offsetTop: 0,\n offsetLeft: 0,\n dataList: [\n {\n rowKey,\n key,\n row,\n value,\n },\n ],\n };\n }\n let topIndex = rowIndex;\n let bottomIndex = rowIndex;\n let leftIndex = colIndex;\n let rightIndex = colIndex;\n let dataList: ChangeItem[] = [];\n let offsetTop = 0;\n let offsetLeft = 0;\n let mergeHeight = 0;\n let mergeWidth = 0;\n // 列合并的\n if (rowspan !== 1 && mergeRow) {\n mergeWidth = width;\n const curValue = relationRowKeys.reduce((acc, key) => {\n const value = this.getItemValue(rowKey, key) ?? '';\n return `${acc}${value}`;\n }, '');\n // 先查找向上的相同值,根据关联值查询\n for (let i = rowIndex - 1; i >= 0; i--) {\n const _rowKey = this.rowIndexRowKeyMap.get(i) || '';\n const pValue = relationRowKeys.reduce((acc, key) => {\n const value = this.getItemValue(_rowKey, key) ?? '';\n return `${acc}${value}`;\n }, '');\n if (curValue === pValue) {\n topIndex = i;\n } else {\n break;\n }\n }\n\n // 再查找向下的相同值,根据关联值查询\n for (let i = rowIndex; i <= this.ctx.maxRowIndex; i++) {\n const _rowKey = this.rowIndexRowKeyMap.get(i) || '';\n const pValue = relationRowKeys.reduce((acc, key) => {\n const value = this.getItemValue(_rowKey, key) ?? '';\n return `${acc}${value}`;\n }, '');\n if (curValue === pValue) {\n bottomIndex = i;\n } else {\n break;\n }\n }\n for (let i = topIndex; i < rowIndex; i++) {\n const { height } = this.positions[i];\n offsetTop += height;\n }\n for (let i = topIndex; i <= bottomIndex; i++) {\n const { height } = this.positions[i];\n // 合并高度\n mergeHeight += height;\n\n // 根据下标查找rowkey\n const _rowKey = this.rowIndexRowKeyMap.get(i) || '';\n const { item } = this.rowKeyMap.get(_rowKey);\n const value = this.getItemValue(_rowKey, key);\n // 需要改变值\n dataList.push({\n rowKey: _rowKey,\n key,\n value,\n row: item,\n });\n }\n }\n // 行合并的\n if (colspan !== 1 && mergeCol) {\n mergeHeight = height;\n // 向左\n for (let i = colIndex - 1; i >= 0; i--) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n const curValue = this.getItemValue(rowKey, key);\n const pValue = this.getItemValue(rowKey, column.key);\n if (curValue === pValue && relationColKeys.includes(column.key)) {\n leftIndex = i;\n } else {\n break;\n }\n }\n // 向右\n for (let i = colIndex; i <= this.ctx.maxColIndex; i++) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n const curValue = this.getItemValue(rowKey, key);\n const pValue = this.getItemValue(rowKey, column.key);\n if (curValue === pValue && relationColKeys.includes(column.key)) {\n rightIndex = i;\n } else {\n break;\n }\n }\n for (let i = leftIndex; i < colIndex; i++) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n // 合并宽度\n offsetLeft += column.width || 100;\n }\n for (let i = leftIndex; i <= rightIndex; i++) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n // 合并宽度\n mergeWidth += column.width || 100;\n // 需要改变值\n dataList.push({\n rowKey,\n key: column.key,\n value: this.getItemValue(rowKey, column.key),\n row,\n });\n }\n }\n return {\n xArr: [leftIndex, rightIndex],\n yArr: [topIndex, bottomIndex],\n rowspan,\n colspan,\n height: mergeHeight,\n width: mergeWidth,\n offsetTop,\n offsetLeft,\n dataList,\n };\n }\n setLoading(loading: boolean) {\n this.loading = loading;\n this.ctx.emit('loadingChange', loading);\n }\n getLoading() {\n return this.loading;\n }\n setValidationErrorByRowIndex(rowIndex: number, key: string, message: string) {\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n const _key = `${rowKey}\\u200b_${key}`;\n const row = this.getRowForRowIndex(rowIndex);\n const cellHeader = this.getColumnByKey(key);\n if (!rowKey || !cellHeader || !row) {\n return;\n }\n const value = this.getItemValue(rowKey, key);\n const errors: ValidateResult = [\n {\n key,\n rowKey,\n rowIndex,\n colIndex: cellHeader.colIndex,\n column: cellHeader.column,\n row,\n value,\n message,\n field: key,\n fieldValue: value,\n },\n ];\n this.validationErrorMap.set(_key, errors);\n }\n setValidationError(rowKey: string, key: string, errors: ValidateResult) {\n const _key = `${rowKey}\\u200b_${key}`;\n this.validationErrorMap.set(_key, errors);\n }\n clearValidationError(rowKey: string, key: string) {\n const _key = `${rowKey}\\u200b_${key}`;\n if (this.validationErrorMap.has(_key)) {\n this.validationErrorMap.delete(_key);\n }\n }\n getValidationError(rowKey: string, key: string) {\n const _key = `${rowKey}\\u200b_${key}`;\n return this.validationErrorMap.get(_key) || [];\n }\n // 获取虚拟单元格,只针对可见的\n getVirtualBodyCell(rowIndex: number, colIndex: number) {\n const column = this.getColumnByColIndex(colIndex);\n const row = this.getRowForRowIndex(rowIndex);\n if (!column || !row) {\n return;\n }\n const cell = new Cell(this.ctx, rowIndex, colIndex, 0, 0, 0, 0, column, row.item, 'body');\n return cell;\n }\n getVirtualBodyCellByKey(rowKey: string, key: string) {\n const rowIndex = this.getRowIndexForRowKey(rowKey);\n const colIndex = this.getColIndexForKey(key);\n if (rowIndex === undefined || colIndex === undefined) {\n return;\n }\n return this.getVirtualBodyCell(rowIndex, colIndex);\n }\n hasMergeCell(xArr: number[], yArr: number[]) {\n let hasMergeCell = false;\n for (let i = yArr[0]; i <= yArr[1]; i++) {\n for (let j = xArr[0]; j <= xArr[1]; j++) {\n const cell = this.getVirtualBodyCell(i, j);\n if (cell && (cell.rowspan !== 1 || cell.colspan !== 1)) {\n hasMergeCell = true;\n break;\n }\n }\n }\n return hasMergeCell;\n }\n}\n","import type Context from './Context';\nexport type HistoryItemData = {\n oldValue: any;\n newValue: any;\n key: string;\n rowKey: string;\n};\nexport type HistoryItem = {\n changeList: HistoryItemData[];\n scrollY: number;\n scrollX: number;\n type: 'single' | 'multiple';\n};\n/**\n * 数据历史堆栈\n */\nexport default class History {\n private ctx: Context;\n private history: HistoryItem[] = [];\n private historyIndex = -1;\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n }\n private init() {\n this.ctx.on('keydown', (e) => {\n if (this.ctx.editing) {\n return;\n }\n // 撤销\n if ((e.ctrlKey && !e.shiftKey && e.code === 'KeyZ') || (e.metaKey && !e.shiftKey && e.code === 'KeyZ')) {\n e.preventDefault();\n this.ctx.clearSelector();\n this.ctx.clearAutofill();\n this.backState();\n return;\n }\n // 恢复\n if (\n (e.ctrlKey && e.code === 'KeyY') ||\n (e.ctrlKey && e.shiftKey && e.code === 'KeyZ') ||\n (e.metaKey && e.shiftKey && e.code === 'KeyZ')\n ) {\n e.preventDefault();\n this.ctx.clearSelector();\n this.ctx.clearAutofill();\n this.forwardState();\n return;\n }\n });\n }\n pushState(changeList: HistoryItem) {\n const { HISTORY_NUM = 0, ENABLE_HISTORY } = this.ctx.config;\n // 是否启动历史\n if (!ENABLE_HISTORY) {\n return;\n }\n this.history.push(changeList);\n if (this.history.length > HISTORY_NUM) {\n this.history.splice(0, 1);\n }\n this.historyIndex = this.history.length - 1;\n }\n // 回退\n backState() {\n if (this.historyIndex >= 0) {\n const { changeList, scrollX, scrollY } = this.history[this.historyIndex];\n const data = changeList.map((item: { rowKey: string; key: string; oldValue: any }) => {\n return {\n rowKey: item.rowKey,\n key: item.key,\n value: item.oldValue,\n row: {},\n };\n });\n // 设置滚动条位置\n this.ctx.setScroll(scrollX, scrollY);\n // 不需要添加历史记录\n this.ctx.database.batchSetItemValue(data, false, false, 'back');\n this.historyIndex -= 1;\n }\n }\n // 前进\n forwardState() {\n if (this.historyIndex < this.history.length - 1) {\n this.historyIndex += 1;\n const { changeList } = this.history[this.historyIndex];\n const data = changeList.map((item: { rowKey: string; key: string; newValue: any }) => {\n return {\n rowKey: item.rowKey,\n key: item.key,\n value: item.newValue,\n row: {},\n };\n });\n // 不需要添加历史记录\n this.ctx.database.batchSetItemValue(data, false, false, 'forward');\n }\n }\n // 清空历史\n clear() {\n this.history = [];\n this.historyIndex = -1;\n }\n}\n","import Context from './Context';\r\n\r\ntype EventTask = Map<string, EventListenerOrEventListenerObject>;\r\n\r\nexport default class EventBrowser {\r\n private eventTasks: EventTask = new Map();\r\n private ctx: Context;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.bind(window, 'resize', this.handleResize.bind(this));\r\n this.bind(window, 'mouseup', this.handleMouseUp.bind(this));\r\n this.bind(window, 'mousemove', this.handleMousemove.bind(this));\r\n this.bind(window, 'blur', this.handleOutsideMousedown.bind(this));\r\n this.bind(window, 'mousedown', this.handleOutsideMousedown.bind(this));\r\n this.bind(this.ctx.stageElement, 'click', this.handleClick.bind(this));\r\n this.bind(window, 'keydown', this.handleKeydown.bind(this));\r\n this.bind(this.ctx.stageElement, 'wheel', this.handleWheel.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'touchstart', this.handleTouchstart.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'touchend', this.handleTouchend.bind(this));\r\n this.bind(this.ctx.stageElement, 'touchmove', this.handleTouchmove.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'contextmenu', this.handleContextMenu.bind(this));\r\n this.bind(this.ctx.stageElement, 'mousedown', this.handleMouseDown.bind(this));\r\n this.bind(this.ctx.stageElement, 'dblclick', this.handleDblclick.bind(this));\r\n this.bind(this.ctx.stageElement, 'mouseover', this.handleMouseover.bind(this));\r\n this.bind(this.ctx.stageElement, 'mouseout', this.handleMouseout.bind(this));\r\n document.addEventListener('selectionchange', this.selectionchange.bind(this));\r\n }\r\n private selectionchange() {\r\n this.ctx.domSelectionStr = '';\r\n const selection = window.getSelection();\r\n if (selection && selection.toString()) {\r\n this.ctx.domSelectionStr = selection.toString();\r\n }\r\n }\r\n private clearDomSelection() {\r\n const selection = window.getSelection();\r\n if (selection && !selection.isCollapsed) {\r\n selection.removeAllRanges();\r\n }\r\n }\r\n destroy() {\r\n this.eventTasks.forEach((fn, event) => {\r\n this.unbind(window, event, fn);\r\n });\r\n document.removeEventListener('selectionchange', this.selectionchange.bind(this));\r\n this.eventTasks.clear();\r\n }\r\n private handleResize(e: Event) {\r\n this.ctx.emit('resetHeader', e);\r\n this.ctx.emit('resize', e);\r\n }\r\n private handleMouseDown(e: Event) {\r\n this.clearDomSelection();\r\n const _e = e as MouseEvent;\r\n if (_e.button === 0) {\r\n this.ctx.mousedown = true;\r\n }\r\n this.ctx.containerElement.focus({ preventScroll: true });\r\n this.ctx.emit('mousedown', e);\r\n }\r\n private handleMousemove(e: Event) {\r\n this.ctx.emit('mousemove', e);\r\n }\r\n private handleMouseUp(e: Event) {\r\n const _e = e as MouseEvent;\r\n if (_e.button === 0) {\r\n this.ctx.mousedown = false;\r\n }\r\n this.ctx.emit('mouseup', e);\r\n }\r\n private handleClick(e: Event) {\r\n this.ctx.emit('click', e);\r\n }\r\n private handleKeydown(e: Event) {\r\n const { ENABLE_KEYBOARD } = this.ctx.config;\r\n if (!ENABLE_KEYBOARD) return;\r\n if (!this.ctx.isTarget(e)) {\r\n return;\r\n }\r\n this.ctx.emit('keydown', e);\r\n }\r\n private handleWheel(e: Event) {\r\n this.ctx.emit('wheel', e);\r\n }\r\n private handleTouchstart(e: Event) {\r\n this.ctx.emit('touchstart', e);\r\n }\r\n private handleTouchend(e: Event) {\r\n this.ctx.emit('touchend', e);\r\n }\r\n private handleTouchmove(e: Event) {\r\n this.ctx.emit('touchmove', e);\r\n }\r\n private handleContextMenu(e: Event) {\r\n e.preventDefault();\r\n this.ctx.emit('contextMenu', e);\r\n }\r\n private handleMouseover(e: Event) {\r\n this.ctx.isMouseoverTargetContainer = true;\r\n this.ctx.emit('mouseover', e);\r\n }\r\n private handleMouseout(e: Event) {\r\n this.ctx.isMouseoverTargetContainer = false;\r\n this.ctx.emit('mouseout', e);\r\n }\r\n private handleDblclick(e: Event) {\r\n this.ctx.emit('dblclick', e);\r\n }\r\n private handleOutsideMousedown(e: Event) {\r\n if (\r\n this.ctx.selector.enable &&\r\n (e.target instanceof Window || (e.target instanceof Node && !this.ctx.containerElement.contains(e.target)))\r\n ) {\r\n this.ctx.emit('outsideMousedown', e);\r\n }\r\n }\r\n private bind(\r\n target: EventTarget,\r\n name: string,\r\n fn: EventListenerOrEventListenerObject,\r\n options?: AddEventListenerOptions | boolean,\r\n ): void {\r\n target.addEventListener(name, fn, options);\r\n this.eventTasks.set(name, fn);\r\n }\r\n\r\n private unbind(target: EventTarget, name: string, fn: EventListenerOrEventListenerObject): void {\r\n target.removeEventListener(name, fn);\r\n this.eventTasks.delete(name);\r\n }\r\n}\r\n","export type EventCallback = (...args: any[]) => void;\r\n\r\ntype EventMap = Map<string, EventCallback[]>;\r\n\r\nclass EventBus {\r\n private events: EventMap = new Map();\r\n constructor() {}\r\n has(event: string): boolean {\r\n return this.events.has(event);\r\n }\r\n // 订阅事件\r\n on(event: string, callback: EventCallback): void {\r\n const callbacks = this.events.get(event) || [];\r\n callbacks.push(callback);\r\n this.events.set(event, callbacks);\r\n }\r\n // 一次性订阅事件\r\n once(event: string, callback: EventCallback) {\r\n const onceCallback: EventCallback = (...args) => {\r\n callback(...args);\r\n this.off(event, onceCallback);\r\n };\r\n this.on(event, onceCallback);\r\n return this;\r\n }\r\n // 取消订阅事件\r\n off(event: string, callback: EventCallback): void {\r\n const callbacks = this.events.get(event);\r\n if (callbacks) {\r\n const index = callbacks.indexOf(callback);\r\n if (index >= 0) {\r\n callbacks.splice(index, 1);\r\n if (callbacks.length === 0) {\r\n this.events.delete(event);\r\n } else {\r\n this.events.set(event, callbacks);\r\n }\r\n }\r\n }\r\n }\r\n // 发布事件\r\n emit(event: string, ...args: any[]): void {\r\n const callbacks = this.events.get(event);\r\n if (callbacks) {\r\n callbacks.forEach((callback) => {\r\n callback(...args);\r\n });\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.events.clear();\r\n }\r\n}\r\nexport default EventBus;\r\n","import { Align, VerticalAlign } from './types';\n\nexport type LineOptions = {\n lineCap?: CanvasLineCap;\n lineDash?: number[];\n lineJoin?: CanvasLineJoin;\n borderWidth?: number;\n borderColor?: string | CanvasGradient | CanvasPattern;\n fillColor?: string | CanvasGradient | CanvasPattern;\n};\nexport type ShodowOptions = {\n side: 'left' | 'right' | 'top' | 'bottom';\n shadowWidth: number;\n colorStart: string;\n colorEnd: string;\n fillColor?: string | CanvasGradient | CanvasPattern;\n};\nexport type RectOptions = {\n borderWidth?: number;\n borderColor?: string;\n fillColor?: string;\n radius?: number | [number, number, number, number];\n};\nexport type DrawTextOptions = {\n font?: string;\n color?: string;\n align?: Align;\n padding?: number;\n verticalAlign?: VerticalAlign;\n};\nexport class Paint {\n private ctx: CanvasRenderingContext2D;\n constructor(target: HTMLCanvasElement) {\n const ctx = target.getContext('2d');\n if (!ctx) throw new Error('canvas context not found');\n this.ctx = ctx;\n }\n scale(dpr: number) {\n this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n this.ctx.scale(dpr, dpr);\n }\n save() {\n this.ctx.save();\n }\n restore() {\n this.ctx.restore();\n }\n translate(x: number, y: number) {\n this.ctx.translate(x, y);\n }\n\n setCursor(cursor = 'default') {\n this.ctx.canvas.style.cursor = cursor;\n }\n clear(x = 0, y = 0, width?: number, height?: number) {\n this.ctx.clearRect(x, y, width || this.ctx.canvas.width, height || this.ctx.canvas.height);\n }\n /**\n * 在 Canvas 上绘制单侧阴影\n * @param {number} x - 矩形的 x 坐标\n * @param {number} y - 矩形的 y 坐标\n * @param {number} width - 矩形的宽度\n * @param {number} height - 矩形的高度\n * @param {string} side - 阴影的位置('left', 'right', 'top', 'bottom')\n * @param {number} shadowWidth - 阴影的宽度\n * @param {string} color - 阴影的颜色\n */\n drawShadow(x: number, y: number, width: number, height: number, options: ShodowOptions): void {\n const { fillColor, side, shadowWidth, colorStart, colorEnd } = options;\n this.ctx.save();\n if (fillColor) {\n this.ctx.fillStyle = fillColor;\n this.ctx.fillRect(x, y, width, height);\n }\n let gradient: CanvasGradient;\n switch (side) {\n case 'left':\n gradient = this.ctx.createLinearGradient(x - shadowWidth, y, x, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x - shadowWidth, y, shadowWidth, height);\n break;\n case 'right':\n gradient = this.ctx.createLinearGradient(x + width, y, x + width + shadowWidth, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x + width, y, shadowWidth, height);\n break;\n case 'top':\n gradient = this.ctx.createLinearGradient(x, y - shadowWidth, x, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x, y - shadowWidth, width, shadowWidth);\n break;\n case 'bottom':\n gradient = this.ctx.createLinearGradient(x, y + height, x, y + height + shadowWidth);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x, y + height, width, shadowWidth);\n break;\n default:\n console.error('Invalid side specified for shadow');\n break;\n }\n }\n // 绘制线条\n drawLine(points: number[], options: LineOptions) {\n if (points.length < 4 || points.length % 2 !== 0) {\n throw new Error('A valid array of points is required to draw a line');\n }\n this.ctx.save();\n const { borderColor = 'black', borderWidth = 1 } = options;\n\n this.ctx.beginPath();\n this.ctx.moveTo(points[0] - 0.5, points[1] - 0.5);\n for (let i = 2; i < points.length; i += 2) {\n this.ctx.lineTo(points[i] - 0.5, points[i + 1] - 0.5);\n }\n this.ctx.strokeStyle = borderColor;\n this.ctx.lineWidth = borderWidth;\n if (options.lineDash) {\n this.ctx.lineDashOffset = 4;\n this.ctx.setLineDash(options.lineDash);\n }\n\n if (options.fillColor) {\n this.ctx.fillStyle = options.fillColor;\n this.ctx.fill();\n }\n if (options.borderColor) {\n this.ctx.strokeStyle = options.borderColor;\n }\n this.ctx.stroke();\n this.ctx.closePath();\n this.ctx.restore();\n }\n drawImage(img: CanvasImageSource, x: number, y: number, width: number, height: number) {\n this.ctx.save();\n this.ctx.drawImage(img, x, y, width, height);\n this.ctx.restore();\n }\n\n drawRect(\n x: number,\n y: number,\n width: number,\n height: number,\n { borderWidth = 1, borderColor, fillColor, radius = 0 }: RectOptions = {},\n ) {\n this.ctx.save();\n this.ctx.beginPath();\n // 填充颜色\n if (fillColor !== undefined) {\n this.ctx.fillStyle = fillColor;\n }\n\n // 线条宽度及绘制颜色\n if (borderColor !== undefined) {\n this.ctx.lineWidth = borderWidth;\n this.ctx.strokeStyle = borderColor;\n }\n if (radius === 0) {\n // 绘制矩形路径,- 0.5解决1px模糊的问题\n this.ctx.rect(x - 0.5, y - 0.5, width, height);\n } else {\n // 确保 radius 是一个包含四个元素的数组\n const [tl, tr, br, bl] = typeof radius === 'number' ? [radius, radius, radius, radius] : radius;\n // 绘制圆角矩形路径\n this.ctx.moveTo(x + tl, y);\n this.ctx.arcTo(x + width, y, x + width, y + tr, tr); // draw right side and top-right corner\n this.ctx.arcTo(x + width, y + height, x + width - br, y + height, br); // draw bottom side and bottom-right corner\n this.ctx.arcTo(x, y + height, x, y + height - bl, bl); // draw left side and bottom-left corner\n this.ctx.arcTo(x, y, x + tl, y, tl); // draw top side and top-left corner\n }\n\n // 如果有填充色,则填充\n if (fillColor !== undefined) {\n this.ctx.fill();\n }\n\n // 如果有绘制色,则绘制\n if (borderColor !== undefined) {\n this.ctx.stroke();\n }\n this.ctx.restore();\n }\n /**\n * 画文本\n * @param text\n * @param x\n * @param y\n * @param width\n * @param height\n * @param options\n * @returns 是否溢出\n */\n drawText(\n text: string = '',\n x: number,\n y: number,\n width: number,\n height: number,\n options: DrawTextOptions = {},\n ): boolean {\n this.ctx.save();\n const {\n font = '12px Arial',\n align = 'center',\n color = '#495060',\n padding = 0,\n verticalAlign = 'middle',\n } = options;\n this.ctx.font = font;\n this.ctx.fillStyle = color;\n this.ctx.textBaseline = verticalAlign;\n this.ctx.textAlign = align;\n\n let yPos = 0;\n if (verticalAlign === 'top') {\n yPos = y + padding;\n } else if (verticalAlign === 'bottom') {\n yPos = y + height - padding;\n } else {\n yPos = y + (height + 1) / 2;\n }\n let xPos = 0;\n if (align === 'left') {\n xPos = x + padding;\n } else if (align === 'right') {\n xPos = x + width - padding;\n } else {\n xPos = x + width / 2;\n }\n const { _text, ellipsis } = this.handleEllipsis(text, width, padding, font);\n this.ctx.fillText(_text, xPos, yPos);\n this.ctx.restore();\n return ellipsis;\n }\n handleEllipsis(text: string, width: number, padding = 0, font = '12px Arial') {\n let ellipsis = false;\n let _text = text;\n this.ctx.font = font;\n if (text === null || text === undefined || text === '') {\n return {\n _text: '',\n ellipsis,\n };\n }\n const ellipsesWidth = this.ctx.measureText('...').width;\n const textWidth = this.ctx.measureText(text).width;\n\n if (textWidth && textWidth + ellipsesWidth >= width - padding * 2) {\n ellipsis = true;\n // text字符截取并添加省略号\n let textLength = 0;\n for (let i = 0; i < text.length; i++) {\n textLength += this.ctx.measureText(text[i]).width;\n if (textLength >= width - padding * 2 - ellipsesWidth) {\n _text = text.slice(0, i) + '...';\n break;\n }\n }\n }\n return {\n _text,\n ellipsis,\n };\n }\n}\n\nexport default Paint;\n","import { IconType } from './Icons';\r\nimport {\r\n BeforeAutofillDataMethod,\r\n BeforeCellValueChangeMethod,\r\n BeforeCopyMethod,\r\n BeforePasteDataMethod,\r\n BeforeSetAutofillMethod,\r\n BeforeSetSelectorMethod,\r\n CellEditorMethod,\r\n CellHeaderStyleMethod,\r\n CellHoverIconMethod,\r\n CellReadonlyMethod,\r\n CellRenderMethod,\r\n CellRulesMethod,\r\n CellStyleMethod,\r\n CellTypeMethod,\r\n ConfigType,\r\n ExpandLazyMethod,\r\n FooterPosition,\r\n FormatterMethod,\r\n MenuItem,\r\n SelectableMethod,\r\n SelectorCellValueType,\r\n SpanMethod,\r\n} from './types';\r\nimport { getCssVar } from './util';\r\n\r\nexport default class Config {\r\n private _config: ConfigType = {};\r\n /** CSS 类名前缀 */\r\n CSS_PREFIX = 'e-virt-table';\r\n /** 图标集合 */\r\n ICONS: IconType[] = [];\r\n /** 行的唯一标识键 */\r\n ROW_KEY = '';\r\n /** 禁用编辑,优先等级最高 */\r\n DISABLED = false; \r\n /** 表头字体 */\r\n HEADER_FONT = '12px normal Arial';\r\n /** 单元格字体 */\r\n BODY_FONT = '12px normal Arial';\r\n /** 边框 */\r\n BORDER = true;\r\n /** 斑马纹 */\r\n STRIPE = false; \r\n /** 斑马纹颜色 */\r\n STRIPE_COLOR = '#fafafa'; \r\n /** 区域边框颜色 */\r\n BORDER_COLOR = '#e1e6eb';\r\n /** 宽度为 0 表示自适应100% */\r\n WIDTH = 0;\r\n /** 最小可调整宽度 */\r\n RESIZE_MIN_WIDTH = 40;\r\n /** 高度,为 0 表示自适应 */\r\n HEIGHT = 0;\r\n /** 占位文本颜色 */\r\n PLACEHOLDER_COLOR = '#CDD0DC';\r\n /** 空数据 body 高度 */\r\n EMPTY_BODY_HEIGHT = 120;\r\n /** 自定义空样式 */\r\n EMPTY_CUSTOM_STYLE: Partial<CSSStyleDeclaration> = {};\r\n /** 空数据文本 */\r\n EMPTY_TEXT = '暂无数据';\r\n /** 最大高度,为 0 表示自适应高度根据 HEIGHT\t */\r\n MAX_HEIGHT = 1000;\r\n /** 区域边框圆角 */\r\n BORDER_RADIUS = 8;\r\n ENABLE_OFFSET_HEIGHT = false;\r\n OFFSET_HEIGHT = 0;\r\n HEADER_HEIGHT = 36;\r\n /** 启用头部固定,需要外面实现覆盖层,或者所有表头都要是元素 */\r\n ENABLE_HEADER_STICKY = false; \r\n /** 表头背景色 */\r\n HEADER_BG_COLOR = '#F8FAFF';\r\n /** body 背景色 */\r\n BODY_BG_COLOR = '#FFF';\r\n /** 表头文本颜色 */\r\n HEADER_TEXT_COLOR = '#1D2129';\r\n /** body文本颜色 */\r\n BODY_TEXT_COLOR = '#4E5969';\r\n /** footer文本颜色 */\r\n FOOTER_TEXT_COLOR = '#4E5969';\r\n /** 加载 svg 图标 */\r\n LOADING_ICON_SVG = '';\r\n /** 加载 svg 图标颜色 */\r\n LOADING_ICON_COLOR = '#4E5969';\r\n /** 树形展开svg 图标 */\r\n EXPAND_ICON_SVG = '';\r\n /** 树形收缩svg 图标 */\r\n SHRINK_ICON_SVG = '';\r\n /** 展开图标颜色 */\r\n EXPAND_ICON_COLOR = '#4E5969';\r\n SHRINK_ICON_COLOR = '#4E5969';\r\n /** 错误提示颜色 */\r\n ERROR_TIP_ICON_COLOR = 'red';\r\n /** 错误提示图标大小 */\r\n ERROR_TIP_ICON_SIZE = 6;\r\n /** 是否开启懒加载\t */\r\n EXPAND_LAZY = true;\r\n /** 默认展开全部\t */\r\n DEFAULT_EXPAND_ALL = false;\r\n /** 表格 body 部分的宽度 */\r\n CELL_WIDTH = 100;\r\n /** body 单元格默认行高 */\r\n CELL_HEIGHT = 36;\r\n /** 表格 body 部分的 padding */\r\n CELL_PADDING = 8;\r\n /** hover编辑图标大小 */\r\n CELL_HOVER_ICON_SIZE = 14;\r\n /** hover编辑图标背景色 */\r\n CELL_HOVER_ICON_BG_COLOR = '#fff';\r\n /** hover编辑图标边框颜色 */\r\n CELL_HOVER_ICON_BORDER_COLOR = '#DDE0EA';\r\n /** 滚动条轨道尺寸 */\r\n SCROLLER_TRACK_SIZE = 14;\r\n /** 滚动条滑块尺寸 */\r\n SCROLLER_SIZE = 8;\r\n /** 滚动条滑块颜色 */\r\n SCROLLER_COLOR = '#dee0e3';\r\n /** 轨道颜色 */\r\n SCROLLER_TRACK_COLOR = '#fff';\r\n /** 滚动条滑块聚焦时的颜色 */\r\n SCROLLER_FOCUS_COLOR = '#bbbec4';\r\n /** 选中区域边框颜色 */\r\n SELECT_BORDER_COLOR = 'rgb(82,146,247)';\r\n /** 选中区域背景颜色 */\r\n SELECT_AREA_COLOR = 'rgba(82,146,247,0.1)';\r\n /** 当前焦点单元格所在行、列的背景色 */\r\n SELECT_ROW_COL_BG_COLOR = 'transparent';\r\n /** 填充点的边框颜色 */\r\n AUTOFILL_POINT_BORDER_COLOR = '#fff';\r\n /** 可编辑背景色 */\r\n EDIT_BG_COLOR = '#fcf6ed';\r\n /** 选择 key,合并时用 */\r\n CHECKBOX_KEY = '';\r\n /** 选择框颜色 */\r\n CHECKBOX_COLOR = 'rgb(82,146,247)';\r\n /** 选择框大小 */\r\n CHECKBOX_SIZE = 20;\r\n /** 选择框禁用图标 */\r\n CHECKBOX_DISABLED_SVG = '';\r\n /** 选择框选中图标 */\r\n CHECKBOX_CHECK_SVG = '';\r\n /** 选择框未中图标 */\r\n CHECKBOX_UNCHECK_SVG = '';\r\n /** 选择框半选中图标 */\r\n CHECKBOX_INDETERMINATE_SVG = '';\r\n /** 单元格只读背景色 */\r\n READONLY_COLOR = '#fff';\r\n /** 单元格只读文本颜色 */\r\n READONLY_TEXT_COLOR = '#4E5969';\r\n /** 单元格错误提示文本颜色 */\r\n ERROR_TIP_COLOR = '#ED3F14';\r\n /** 合计底部背景色 */\r\n FOOTER_BG_COLOR = '#fafafa';\r\n /** 合计底部固定 */\r\n FOOTER_FIXED = true;\r\n /** 合计底部位置 */\r\n FOOTER_POSITION: FooterPosition = 'bottom';\r\n /** 单元格底部高度 */\r\n CELL_FOOTER_HEIGHT = 36;\r\n /** 启用选择器 */\r\n ENABLE_SELECTOR = true;\r\n /** 启用单点击立马编辑 */\r\n ENABLE_EDIT_SINGLE_CLICK = false; \r\n /** 启用点击选择器编辑 */\r\n ENABLE_EDIT_CLICK_SELECTOR = true; \r\n /** 选择器X最小范围 */\r\n SELECTOR_AREA_MIN_X = 0; \r\n /** 选择器X最大范围colMax - offset */\r\n SELECTOR_AREA_MAX_X_OFFSET = 0;\r\n /** 选择器X最大范围,0默认最大colMax */\r\n SELECTOR_AREA_MAX_X = 0;\r\n /** 选择器Y最小范围 */\r\n SELECTOR_AREA_MIN_Y = 0; \r\n /** 选择器Y最大范围,0默认rowMax */\r\n SELECTOR_AREA_MAX_Y = 0; \r\n /** 选择器Y最大范围,0默认rowMax */\r\n SELECTOR_AREA_MAX_Y_OFFSET = 0; \r\n /** 选择器值类型,value,displayText,区别displayText受format影响 */\r\n SELECTOR_CELL_VALUE_TYPE: SelectorCellValueType = 'value'; // displayText | value\r\n /** 启用自动主题 */\r\n ENABLE_AUTO_THEME = true;\r\n /** 启用选择器-选择器单选 */\r\n ENABLE_SELECTOR_SINGLE = false;\r\n /** 启用选择器-批量跨列选择 */\r\n ENABLE_SELECTOR_SPAN_COL = true;\r\n /** 启用选择器-批量跨行选择 */\r\n ENABLE_SELECTOR_SPAN_ROW = true;\r\n /** 启用选择器-批量选中列 */\r\n ENABLE_SELECTOR_ALL_ROWS = true;\r\n /** 启用选择器-批量选中行 */\r\n ENABLE_SELECTOR_ALL_COLS = true;\r\n /** 启用合并格子数据关联 */\r\n ENABLE_MERGE_CELL_LINK = false;\r\n /** 启用填充器 */\r\n ENABLE_AUTOFILL = false;\r\n /** 启用右键菜单 */\r\n ENABLE_CONTEXT_MENU = false;\r\n /** 启用复制 */\r\n ENABLE_COPY = true;\r\n /** 启用粘贴 */\r\n ENABLE_PASTER = true;\r\n /** 启用调整行高 */\r\n ENABLE_RESIZE_ROW = true;\r\n /** 启用列宽可调整 */\r\n ENABLE_RESIZE_COLUMN = true;\r\n /** 行调整线颜色 */\r\n RESIZE_ROW_LINE_COLOR = '#e1e6eb';\r\n /** 列调整线颜色 */\r\n RESIZE_COLUMN_LINE_COLOR = '#e1e6eb';\r\n /** 最小调整行高 */\r\n RESIZE_ROW_MIN_HEIGHT = 36;\r\n /** 列宽最小值 */\r\n RESIZE_COLUMN_MIN_WIDTH = 40;\r\n /** 启用键盘 */\r\n ENABLE_KEYBOARD = true;\r\n /** 启用历史 */\r\n ENABLE_HISTORY = false;\r\n ENABLE_VALIDATOR_IMMEDIATE = true;\r\n /** 历史栈数量 */\r\n HISTORY_NUM = 50;\r\n /** 启用悬浮高亮 */\r\n HIGHLIGHT_HOVER_ROW = false;\r\n /** 悬浮颜色 */\r\n HIGHLIGHT_HOVER_ROW_COLOR = 'rgba(186,203,231,0.1)';\r\n /** 高亮选中当前行 */\r\n HIGHLIGHT_SELECTED_ROW = false;\r\n /** 高亮当前行颜色 */\r\n HIGHLIGHT_SELECTED_ROW_COLOR = 'rgba(82,146,247,0.1)';\r\n /** 提示背景颜色 */\r\n TOOLTIP_BG_COLOR = '#303133';\r\n /** 提示文本颜色 */\r\n TOOLTIP_TEXT_COLOR = '#fff';\r\n /** 提示层级 */\r\n TOOLTIP_ZINDEX = 3000;\r\n /** 自定义提示样式 */\r\n TOOLTIP_CUSTOM_STYLE: Partial<CSSStyleDeclaration> = {};\r\n /** 自定义右键菜单 */\r\n CONTEXT_MENU: MenuItem[] = [\r\n { label: '复制', value: 'copy' },\r\n { label: '剪切', value: 'cut' },\r\n { label: '粘贴', value: 'paste' },\r\n { label: '清空选中内容', value: 'clearSelected' },\r\n ];\r\n /** header 格子样式 */\r\n HEADER_CELL_STYLE_METHOD?: CellHeaderStyleMethod;\r\n /** body 格子样式 */\r\n BODY_CELL_STYLE_METHOD?: CellStyleMethod;\r\n /** footer 格子样式 */\r\n FOOTER_CELL_STYLE_METHOD?: CellStyleMethod;\r\n /** 自定义只读 */\r\n BODY_CELL_READONLY_METHOD?: CellReadonlyMethod;\r\n /** 格式化方法更改(formatter优先等级比较高) */\r\n BODY_CELL_FORMATTER_METHOD?: FormatterMethod;\r\n /** 自定义校验规则 */\r\n BODY_CELL_RULES_METHOD?: CellRulesMethod;\r\n /** 自定义只读 */\r\n BODY_CELL_TYPE_METHOD?: CellTypeMethod;\r\n /** 自定义编辑器类型 */\r\n BODY_CELL_EDITOR_METHOD?: CellEditorMethod;\r\n /** 自定义只读 */\r\n BODY_CELL_RENDER_METHOD?: CellRenderMethod;\r\n /** 自定义只读 */\r\n BODY_CELL_HOVER_ICON_METHOD?: CellHoverIconMethod;\r\n /** 自定义跨列/行渲染 */\r\n SPAN_METHOD?: SpanMethod;\r\n /** 自定义选择禁用 */\r\n SELECTABLE_METHOD?: SelectableMethod;\r\n /** 自定义选择禁用 */\r\n EXPAND_LAZY_METHOD?: ExpandLazyMethod;\r\n /** 数值改变前回调 */\r\n BEFORE_VALUE_CHANGE_METHOD?: BeforeCellValueChangeMethod;\r\n /** 粘贴前回调 */\r\n BEFORE_PASTE_DATA_METHOD?: BeforePasteDataMethod;\r\n /** 数值填充前回调 */\r\n BEFORE_AUTOFILL_DATA_METHOD?: BeforeAutofillDataMethod;\r\n /** 设置选择器前回调 */\r\n BEFORE_SET_SELECTOR_METHOD?: BeforeSetSelectorMethod;\r\n /** 设置填充器前回调 */\r\n BEFORE_SET_AUTOFILL_METHOD?: BeforeSetAutofillMethod;\r\n /** 数据复制前回调 */\r\n BEFORE_COPY_METHOD?: BeforeCopyMethod;\r\n constructor(config: Partial<Config>) {\r\n this._config = config;\r\n this.updateCssVar();\r\n }\r\n /** 初始化 */\r\n init(config: ConfigType) {\r\n this._config = config;\r\n this.updateCssVar();\r\n }\r\n /** 同步css 样式变量 */\r\n updateCssVar() {\r\n let obj: any = {};\r\n Object.keys(this).forEach((key) => {\r\n if (key.endsWith('_COLOR') || key.endsWith('_FONT')) {\r\n const cssKey = `--evt-${key.toLocaleLowerCase().replace(/_/g, '-')}`;\r\n const val = getCssVar(cssKey);\r\n obj[key] = val;\r\n }\r\n });\r\n Object.assign(this, obj, this._config);\r\n }\r\n}\r\n","import Context from './Context';\r\ntype ConfigColorNameType = 'LOADING_ICON_COLOR' | 'EXPAND_ICON_COLOR' | 'SHRINK_ICON_COLOR' | 'CHECKBOX_COLOR';\r\ntype ConfigTypeName =\r\n | 'LOADING_ICON_SVG'\r\n | 'EXPAND_ICON_SVG'\r\n | 'SHRINK_ICON_SVG'\r\n | 'CHECKBOX_UNCHECK_SVG'\r\n | 'CHECKBOX_CHECK_SVG'\r\n | 'CHECKBOX_DISABLED_SVG'\r\n | 'CHECKBOX_INDETERMINATE_SVG';\r\n\r\ninterface SvgIcon extends IconType {\r\n configName?: ConfigTypeName;\r\n configColorName?: ConfigColorNameType;\r\n}\r\nexport interface IconType {\r\n name: string;\r\n svg: string;\r\n color: string;\r\n isBlob?: boolean;\r\n}\r\nconst svgSelect =\r\n '<svg t=\"1724122044148\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M707.648 401.28L489.28 560.704l22.656 30.976 22.656-30.976L316.16 401.216q-3.072-2.24-6.464-3.84-3.456-1.536-7.104-2.432-3.712-0.896-7.488-1.088-3.776-0.128-7.488 0.448-3.776 0.64-7.296 1.92-3.584 1.28-6.784 3.2-3.2 1.984-6.016 4.544-2.816 2.56-5.056 5.632-2.176 3.072-3.84 6.464-1.536 3.456-2.432 7.104-0.896 3.712-1.088 7.488-0.128 3.776 0.448 7.488 0.64 3.776 1.92 7.296 1.28 3.584 3.2 6.784 1.984 3.2 4.544 6.016 2.56 2.752 5.632 4.992l218.368 159.552q4.928 3.584 10.752 5.504 5.76 1.92 11.904 1.92 6.08 0 11.904-1.92 5.76-1.92 10.752-5.504l218.368-159.552q3.008-2.24 5.568-4.992 2.56-2.816 4.544-6.016 1.92-3.2 3.264-6.784 1.28-3.52 1.92-7.296 0.576-3.712 0.384-7.488-0.128-3.84-1.024-7.488-0.896-3.648-2.496-7.04-1.6-3.456-3.84-6.528-2.24-3.072-4.992-5.632-2.816-2.56-6.016-4.48-3.2-1.984-6.784-3.328-3.584-1.28-7.296-1.856-3.712-0.64-7.488-0.448-3.84 0.192-7.488 1.088-3.648 0.896-7.04 2.496-3.456 1.536-6.528 3.84z m61.056 30.976q0-3.84-0.768-7.488-0.704-3.712-2.176-7.232-1.472-3.456-3.52-6.656-2.112-3.136-4.8-5.76-2.688-2.688-5.76-4.8-3.2-2.112-6.72-3.584-3.456-1.408-7.168-2.176-3.712-0.704-7.488-0.704-3.84 0-7.488 0.704-3.712 0.768-7.232 2.176-3.456 1.472-6.656 3.584-3.136 2.112-5.76 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.584 6.656-1.408 3.52-2.176 7.232-0.704 3.712-0.704 7.488 0 3.776 0.704 7.488 0.768 3.712 2.176 7.168 1.472 3.52 3.584 6.656 2.112 3.2 4.8 5.824 2.624 2.688 5.76 4.8 3.2 2.112 6.656 3.52 3.52 1.472 7.232 2.176 3.712 0.768 7.488 0.768 3.776 0 7.488-0.768 3.712-0.704 7.168-2.176 3.52-1.408 6.656-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.048-3.2 3.52-6.72 1.472-3.456 2.176-7.168 0.768-3.712 0.768-7.488z m-436.736 0q0-3.84-0.768-7.488-0.704-3.712-2.176-7.232-1.408-3.456-3.52-6.656-2.112-3.136-4.8-5.76-2.688-2.688-5.76-4.8-3.2-2.112-6.656-3.584-3.52-1.408-7.232-2.176-3.712-0.704-7.488-0.704-3.84 0-7.488 0.704-3.712 0.768-7.232 2.176-3.456 1.472-6.592 3.584-3.2 2.112-5.824 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.52 6.656-1.472 3.52-2.24 7.232-0.704 3.712-0.704 7.488 0 3.776 0.704 7.488 0.768 3.712 2.24 7.168 1.408 3.52 3.52 6.656 2.112 3.2 4.8 5.824 2.624 2.688 5.76 4.8 3.2 2.112 6.656 3.52 3.52 1.472 7.232 2.176 3.712 0.768 7.488 0.768 3.776 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.408 6.592-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.112-3.2 3.52-6.72 1.472-3.456 2.176-7.168 0.768-3.712 0.768-7.488z\" p-id=\"4552\"></path></svg>';\r\n\r\nexport default class Icons {\r\n private ctx: Context;\r\n private list: SvgIcon[] = [\r\n {\r\n name: 'loading',\r\n configName: 'LOADING_ICON_SVG',\r\n configColorName: 'LOADING_ICON_COLOR',\r\n svg: '<svg t=\"1724133395728\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2893\" width=\"32\" height=\"32\"><path d=\"M512 226.8476541a19.82487759 19.82487759 0 0 1 14.66497778 5.70304692c3.80203107 3.82918865 5.70304692 8.71751457 5.70304693 14.66497779v122.20814825a19.82487759 19.82487759 0 0 1-5.70304693 14.66497778 19.82487759 19.82487759 0 0 1-14.66497778 5.70304691 19.82487759 19.82487759 0 0 1-14.66497778-5.70304691 19.82487759 19.82487759 0 0 1-5.70304693-14.66497778v-122.20814825a19.82487759 19.82487759 0 0 1 5.70304693-14.66497779 19.82487759 19.82487759 0 0 1 14.66497778-5.70304692z m0 407.36049415a19.82487759 19.82487759 0 0 1 14.66497778 5.70304691c3.80203107 3.82918865 5.70304692 8.71751457 5.70304693 14.66497778v122.20814827a19.82487759 19.82487759 0 0 1-5.70304693 14.66497776 19.82487759 19.82487759 0 0 1-14.66497778 5.70304693 19.82487759 19.82487759 0 0 1-14.66497778-5.70304693 19.82487759 19.82487759 0 0 1-5.70304693-14.66497776v-122.20814827a19.82487759 19.82487759 0 0 1 5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 14.66497778-5.70304691zM797.1523459 512a19.82487759 19.82487759 0 0 1-5.70304692 14.66497778 19.82487759 19.82487759 0 0 1-14.66497779 5.70304693h-122.20814825a19.82487759 19.82487759 0 0 1-14.66497778-5.70304693 19.82487759 19.82487759 0 0 1-5.70304691-14.66497778 19.82487759 19.82487759 0 0 1 5.70304691-14.66497778 19.82487759 19.82487759 0 0 1 14.66497778-5.70304693h122.20814825a19.82487759 19.82487759 0 0 1 14.66497779 5.70304693c3.80203107 3.82918865 5.70304692 8.71751457 5.70304692 14.66497778z m-407.36049415 0a19.82487759 19.82487759 0 0 1-5.70304691 14.66497778 19.82487759 19.82487759 0 0 1-14.66497778 5.70304693h-122.20814827a19.82487759 19.82487759 0 0 1-14.66497776-5.70304693 19.82487759 19.82487759 0 0 1-5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 14.66497776-5.70304693h122.20814827a19.82487759 19.82487759 0 0 1 14.66497778 5.70304693c3.80203107 3.82918865 5.70304692 8.71751457 5.70304691 14.66497778zM310.22076878 310.22076878a21.29137537 21.29137537 0 0 1 14.66497779-5.70304693c5.51294514 0 10.18401235 1.90101585 14.01320099 5.70304693l86.55052591 86.57768347a20.91117183 20.91117183 0 0 1 5.73020449 14.31193182 19.28172983 19.28172983 0 0 1-6.05609289 14.013201 19.11878565 19.11878565 0 0 1-14.013201 6.05609289 20.96548698 20.96548698 0 0 1-14.31193182-5.70304692L310.22076878 338.87178998a19.06447114 19.06447114 0 0 1-5.70304693-14.01320099c0-5.54010272 1.90101585-10.42842865 5.70304693-14.66497778z m288.32975775 288.32975775a19.79772001 19.79772001 0 0 1 14.3390894-6.35482371c5.29568642 0 10.04822572 2.11827457 14.31193182 6.38198066l86.57768347 86.55052651c3.80203107 3.80203107 5.70304692 8.47309828 5.70304691 14.01320102a19.55330372 19.55330372 0 0 1-6.05609225 14.31193182 19.66193339 19.66193339 0 0 1-14.31193245 6.05609288 19.01015661 19.01015661 0 0 1-14.01320099-5.70304692l-86.55052591-86.57768347a19.79772001 19.79772001 0 0 1-6.38198129-14.31193245c0-5.29568642 2.11827457-10.07538268 6.38198129-14.33908939zM713.77923122 310.22076878c3.80203107 4.26370672 5.70304692 9.15203265 5.70304693 14.66497779s-1.90101585 10.18401235-5.70304693 14.01320099l-86.57768347 86.55052591a20.91117183 20.91117183 0 0 1-14.31193182 5.73020449 19.28172983 19.28172983 0 0 1-14.013201-6.05609289 19.11878565 19.11878565 0 0 1-6.05609289-14.013201c0-5.29568642 1.90101585-10.07538268 5.70304692-14.31193182l86.57768348-86.57768347c3.80203107-3.80203107 8.50025585-5.70304692 14.01320099-5.70304693 5.54010272 0 10.40127108 1.90101585 14.66497779 5.70304693zM425.44947347 598.57768347a19.79772001 19.79772001 0 0 1 6.35482371 14.33908939c0 5.29568642-2.11827457 10.04822572-6.38198066 14.31193245L338.89894756 713.77923122a19.06447114 19.06447114 0 0 1-14.01320099 5.70304693 19.55330372 19.55330372 0 0 1-14.31193245-6.05609227 19.68909035 19.68909035 0 0 1-6.05609227-14.31193245 19.01015661 19.01015661 0 0 1 5.70304693-14.01320099l86.57768347-86.55052591a19.79772001 19.79772001 0 0 1 14.31193182-6.38198129c5.29568642 0 10.07538268 2.11827457 14.3390894 6.38198129z\" fill=\"#000000\" fill-opacity=\".65\" p-id=\"2894\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'expand',\r\n configName: 'EXPAND_ICON_SVG',\r\n configColorName: 'EXPAND_ICON_COLOR',\r\n svg: '<svg t=\"1724122015492\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4237\" width=\"32\" height=\"32\"><path d=\"M401.472 316.992l159.04 217.664L591.488 512l-30.976-22.656-159.04 217.728q-2.24 3.008-3.84 6.464-1.6 3.456-2.496 7.104-0.896 3.648-1.024 7.424-0.192 3.84 0.384 7.552 0.64 3.712 1.92 7.296 1.28 3.52 3.2 6.784 1.984 3.2 4.544 6.016 2.56 2.752 5.632 4.992 3.072 2.24 6.464 3.84 3.456 1.6 7.168 2.496 3.648 0.896 7.424 1.024 3.776 0.192 7.488-0.448 3.776-0.576 7.296-1.856 3.584-1.28 6.784-3.264 3.2-1.92 6.016-4.48 2.816-2.56 5.056-5.632l159.04-217.728q3.584-4.928 5.504-10.752 1.92-5.76 1.92-11.904 0-6.08-1.92-11.904-1.92-5.76-5.504-10.752L463.488 271.68q-2.24-3.072-5.056-5.632-2.752-2.56-6.016-4.48-3.2-1.984-6.784-3.328-3.52-1.28-7.296-1.856-3.712-0.576-7.488-0.448-3.84 0.192-7.424 1.088-3.712 0.896-7.168 2.496-3.392 1.6-6.4 3.84-3.136 2.176-5.696 4.992-2.56 2.752-4.48 6.016-1.984 3.2-3.264 6.784-1.28 3.52-1.92 7.296-0.576 3.712-0.384 7.488 0.128 3.84 1.024 7.488 0.896 3.648 2.496 7.04 1.6 3.456 3.84 6.528z m30.976-61.056q-3.776 0-7.488 0.704-3.712 0.768-7.168 2.24-3.52 1.408-6.656 3.52-3.2 2.112-5.824 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.52 6.656-1.472 3.52-2.176 7.232-0.768 3.712-0.768 7.488 0 3.776 0.768 7.488 0.704 3.712 2.176 7.232 1.408 3.456 3.52 6.592 2.112 3.2 4.8 5.824 2.688 2.688 5.76 4.8 3.2 2.112 6.72 3.52 3.456 1.472 7.168 2.176 3.712 0.768 7.488 0.768 3.84 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.408 6.592-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.112-3.2 3.52-6.656 1.472-3.52 2.24-7.232 0.704-3.712 0.704-7.488 0-3.84-0.704-7.488-0.768-3.712-2.24-7.232-1.408-3.456-3.52-6.592-2.112-3.2-4.8-5.824-2.624-2.688-5.76-4.8-3.2-2.112-6.656-3.52-3.52-1.472-7.232-2.24Q436.224 256 432.448 256z m0 435.392q-3.776 0-7.488 0.704-3.712 0.768-7.168 2.176-3.52 1.472-6.656 3.584-3.2 2.112-5.824 4.736-2.688 2.688-4.8 5.824-2.112 3.2-3.52 6.656-1.472 3.52-2.176 7.232-0.768 3.712-0.768 7.488 0 3.776 0.768 7.488 0.704 3.712 2.176 7.168 1.408 3.52 3.52 6.656 2.112 3.2 4.8 5.76 2.688 2.752 5.76 4.8 3.2 2.112 6.72 3.584 3.456 1.472 7.168 2.176 3.712 0.768 7.488 0.768 3.84 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.472 6.592-3.584 3.2-2.048 5.824-4.736 2.688-2.688 4.8-5.824 2.112-3.2 3.52-6.656 1.472-3.456 2.24-7.168 0.704-3.712 0.704-7.488 0-3.84-0.704-7.488-0.768-3.712-2.24-7.232-1.408-3.52-3.52-6.656-2.112-3.136-4.8-5.76-2.624-2.688-5.76-4.8-3.2-2.112-6.656-3.584-3.52-1.408-7.232-2.176-3.712-0.704-7.488-0.704z\" p-id=\"4238\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'shrink',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'SHRINK_ICON_COLOR',\r\n svg: svgSelect,\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'checkbox-uncheck',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n svg: '<svg t=\"1722595639920\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4708\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4709\"></path></svg>',\r\n color: '',\r\n },\r\n {\r\n name: 'checkbox-check',\r\n configName: 'CHECKBOX_CHECK_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595535853\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M640 128H384c-170.496 0-256 85.504-256 256v256c0 170.496 85.504 256 256 256h256c170.496 0 256-85.504 256-256V384c0-170.496-85.504-256-256-256z m67.584 302.592c-2.048 4.608-4.608 8.704-8.192 12.288L506.88 634.88c-3.584 3.584-7.68 6.144-12.288 8.192-4.608 2.048-9.728 3.072-14.848 3.072s-10.24-1.024-14.848-3.072c-4.608-2.048-8.704-4.608-12.288-8.192l-96.256-96.256c-3.584-3.584-6.144-7.68-8.192-12.288-2.048-4.608-3.072-9.728-3.072-14.848 0-2.56 0-5.12 1.024-7.68 0.512-2.56 1.024-5.12 2.048-7.168 1.024-2.56 2.048-4.608 3.584-6.656 1.536-2.048 3.072-4.096 4.608-5.632 1.536-2.048 3.584-3.584 5.632-4.608 2.048-1.536 4.096-2.56 6.656-3.584 2.56-1.024 4.608-1.536 7.168-2.048 2.56-0.512 5.12-0.512 7.68-0.512 5.12 0 10.24 1.024 14.848 3.072 4.608 2.048 8.704 4.608 12.288 8.192l69.12 68.608L645.12 389.12c3.584-3.584 7.68-6.144 12.288-8.192 4.608-2.048 9.728-3.072 14.848-3.072 2.56 0 5.12 0 7.68 0.512s5.12 1.024 7.168 2.048c2.56 1.024 4.608 2.048 6.656 3.584 2.048 1.536 4.096 3.072 5.632 4.608 1.536 1.536 3.584 3.584 4.608 5.632 1.536 2.048 2.56 4.096 3.584 6.656 1.024 2.56 1.536 4.608 2.048 7.168 0.512 2.56 1.024 5.12 1.024 7.68 0 5.12-1.024 10.24-3.072 14.848z\" p-id=\"4552\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-hover',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595639920\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4708\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4709\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-indeterminate',\r\n configName: 'CHECKBOX_INDETERMINATE_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595280953\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4394\" width=\"32\" height=\"32\"><path d=\"M128 384v256q0 12.608 1.28 25.088 1.216 12.544 3.648 24.832 2.432 12.352 6.08 24.384t8.448 23.68q4.864 11.584 10.752 22.72 5.952 11.072 12.928 21.504 7.04 10.496 14.976 20.224 8 9.728 16.896 18.56 8.896 8.96 18.56 16.896 9.728 8 20.224 14.976 10.432 7.04 21.504 12.928 11.136 5.888 22.72 10.688 11.648 4.864 23.68 8.512 12.032 3.648 24.32 6.08 12.352 2.432 24.896 3.712Q371.392 896 384 896h256q12.608 0 25.088-1.28 12.544-1.216 24.832-3.648 12.352-2.432 24.384-6.08t23.68-8.512q11.584-4.8 22.72-10.688 11.072-5.952 21.504-12.928 10.496-7.04 20.224-14.976 9.728-8 18.56-16.896 8.96-8.832 16.896-18.56 8-9.728 14.976-20.224 7.04-10.432 12.928-21.504 5.888-11.136 10.688-22.72 4.864-11.648 8.512-23.68 3.648-12.032 6.08-24.32 2.432-12.352 3.712-24.896Q896 652.608 896 640V384q0-12.608-1.28-25.088-1.216-12.544-3.648-24.832-2.432-12.352-6.08-24.384t-8.512-23.68q-4.8-11.584-10.688-22.72-5.952-11.072-12.928-21.504-7.04-10.496-14.976-20.224-8-9.664-16.896-18.56-8.832-8.96-18.56-16.896-9.728-8-20.224-14.976-10.432-7.04-21.504-12.928-11.136-5.888-22.72-10.752-11.648-4.8-23.68-8.448-12.032-3.648-24.32-6.08-12.352-2.432-24.896-3.712Q652.608 128 640 128H384q-12.608 0-25.088 1.28-12.544 1.216-24.832 3.648-12.352 2.432-24.384 6.08t-23.68 8.448q-11.584 4.864-22.72 10.752-11.072 5.952-21.504 12.928-10.496 7.04-20.224 14.976-9.664 8-18.56 16.896-8.96 8.896-16.896 18.56-8 9.728-14.976 20.224-7.04 10.432-12.928 21.504-5.888 11.136-10.752 22.72-4.8 11.648-8.448 23.68-3.648 12.032-6.08 24.32-2.432 12.352-3.712 24.896Q128 371.392 128 384z m566.016 166.336H330.112a38.4 38.4 0 0 1 0-76.8h363.904a38.4 38.4 0 0 1 0 76.8z\" p-id=\"4395\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-check-disabled',\r\n configName: 'CHECKBOX_CHECK_SVG',\r\n svg: '<svg t=\"1722595535853\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M640 128H384c-170.496 0-256 85.504-256 256v256c0 170.496 85.504 256 256 256h256c170.496 0 256-85.504 256-256V384c0-170.496-85.504-256-256-256z m67.584 302.592c-2.048 4.608-4.608 8.704-8.192 12.288L506.88 634.88c-3.584 3.584-7.68 6.144-12.288 8.192-4.608 2.048-9.728 3.072-14.848 3.072s-10.24-1.024-14.848-3.072c-4.608-2.048-8.704-4.608-12.288-8.192l-96.256-96.256c-3.584-3.584-6.144-7.68-8.192-12.288-2.048-4.608-3.072-9.728-3.072-14.848 0-2.56 0-5.12 1.024-7.68 0.512-2.56 1.024-5.12 2.048-7.168 1.024-2.56 2.048-4.608 3.584-6.656 1.536-2.048 3.072-4.096 4.608-5.632 1.536-2.048 3.584-3.584 5.632-4.608 2.048-1.536 4.096-2.56 6.656-3.584 2.56-1.024 4.608-1.536 7.168-2.048 2.56-0.512 5.12-0.512 7.68-0.512 5.12 0 10.24 1.024 14.848 3.072 4.608 2.048 8.704 4.608 12.288 8.192l69.12 68.608L645.12 389.12c3.584-3.584 7.68-6.144 12.288-8.192 4.608-2.048 9.728-3.072 14.848-3.072 2.56 0 5.12 0 7.68 0.512s5.12 1.024 7.168 2.048c2.56 1.024 4.608 2.048 6.656 3.584 2.048 1.536 4.096 3.072 5.632 4.608 1.536 1.536 3.584 3.584 4.608 5.632 1.536 2.048 2.56 4.096 3.584 6.656 1.024 2.56 1.536 4.608 2.048 7.168 0.512 2.56 1.024 5.12 1.024 7.68 0 5.12-1.024 10.24-3.072 14.848z\" p-id=\"4552\"></path></svg>',\r\n color: '#DDE0EA',\r\n },\r\n {\r\n name: 'checkbox-disabled',\r\n configName: 'CHECKBOX_DISABLED_SVG',\r\n svg: '<svg t=\"1722595946663\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4865\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z\" fill=\"#F1F2F4\" p-id=\"4866\"></path><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4867\"></path></svg>',\r\n color: '',\r\n },\r\n {\r\n name: 'icon-edit',\r\n configName: 'CHECKBOX_DISABLED_SVG',\r\n svg: '<svg t=\"1744798692576\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"6606\" width=\"200\" height=\"200\"><path d=\"M855.296 894.528H168.768v-76.8h686.528v76.8z m38.4-38.4q0 3.84-0.768 7.488-0.704 3.712-2.176 7.232-1.472 3.52-3.52 6.656-2.112 3.136-4.8 5.76-2.688 2.688-5.824 4.8-3.2 2.112-6.656 3.584-3.456 1.408-7.168 2.176-3.712 0.704-7.488 0.704-3.84 0-7.488-0.704-3.712-0.768-7.232-2.176-3.52-1.472-6.656-3.584-3.136-2.112-5.76-4.736-2.688-2.688-4.8-5.824-2.112-3.2-3.584-6.656-1.408-3.52-2.176-7.232-0.704-3.648-0.704-7.488 0-3.776 0.704-7.488 0.768-3.712 2.176-7.168 1.472-3.52 3.584-6.656 2.112-3.136 4.736-5.76 2.688-2.752 5.824-4.8 3.2-2.112 6.656-3.584 3.52-1.472 7.232-2.176 3.712-0.768 7.488-0.768 3.776 0 7.488 0.768 3.712 0.704 7.168 2.176 3.52 1.472 6.656 3.584 3.2 2.048 5.76 4.736 2.752 2.688 4.864 5.824 2.048 3.2 3.52 6.656 1.472 3.456 2.176 7.168 0.768 3.712 0.768 7.488z m-686.528 0q0 3.84-0.768 7.488-0.704 3.712-2.176 7.232-1.472 3.52-3.52 6.656-2.112 3.136-4.8 5.76-2.688 2.688-5.76 4.8-3.2 2.112-6.72 3.584-3.456 1.408-7.168 2.176-3.712 0.704-7.488 0.704-3.84 0-7.488-0.704-3.712-0.768-7.232-2.176-3.456-1.472-6.656-3.584-3.136-2.112-5.76-4.736-2.688-2.688-4.8-5.824-2.112-3.2-3.584-6.656-1.408-3.52-2.176-7.232-0.704-3.648-0.704-7.488 0-3.776 0.704-7.488 0.768-3.712 2.176-7.168 1.472-3.52 3.584-6.656 2.112-3.136 4.736-5.76 2.688-2.752 5.824-4.8 3.2-2.112 6.656-3.584 3.52-1.472 7.232-2.176 3.712-0.768 7.488-0.768 3.776 0 7.488 0.768 3.712 0.704 7.168 2.176 3.52 1.472 6.656 3.584 3.2 2.048 5.824 4.736 2.688 2.688 4.8 5.824 2.048 3.2 3.52 6.656 1.472 3.456 2.176 7.168 0.768 3.712 0.768 7.488zM652.032 211.2l-369.92 370.368v89.344h90.048l369.664-369.856L652.032 211.2z m-54.4-54.272q22.528-22.528 54.4-22.528 31.808 0 54.336 22.528l89.792 89.856q22.464 22.464 22.464 54.272t-22.464 54.272l-369.664 369.856q-22.464 22.528-54.336 22.528H282.24q-31.808 0-54.336-22.528-22.464-22.464-22.464-54.272V581.568q0-31.808 22.4-54.272l369.92-370.368z\" p-id=\"6607\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'icon-select',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'SHRINK_ICON_COLOR',\r\n svg: svgSelect,\r\n color: '#4E5969',\r\n },\r\n ];\r\n icons = new Map<string, HTMLImageElement>();\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n async init() {\r\n const promises = [];\r\n for (let i = 0; i < this.list.length; i++) {\r\n const item = this.list[i];\r\n let color = item.color;\r\n let svg = item.svg;\r\n if (item.configColorName) {\r\n // 从配置中获取颜色\r\n const configColor = this.ctx.config[item.configColorName];\r\n if (configColor) {\r\n color = configColor;\r\n }\r\n }\r\n // 替换svg\r\n if (item.configName) {\r\n const configSvg = this.ctx.config[item.configName];\r\n if (configSvg) {\r\n svg = configSvg;\r\n }\r\n }\r\n\r\n // 将异步操作推入 promises 数组\r\n const promise = this.createImageFromSVG(svg, color).then((icon) => {\r\n this.icons.set(item.name, icon);\r\n });\r\n promises.push(promise);\r\n }\r\n // 额外的图标\r\n for (let i = 0; i < this.ctx.config.ICONS.length; i++) {\r\n const item = this.ctx.config.ICONS[i];\r\n let color = item.color;\r\n // 将异步操作推入 promises 数组\r\n const promise = this.createImageFromSVG(item.svg, color, item.isBlob).then((icon) => {\r\n this.icons.set(item.name, icon);\r\n });\r\n promises.push(promise);\r\n }\r\n // 并行执行所有异步操作\r\n await Promise.all(promises);\r\n // 加载完成后触发绘制\r\n this.ctx.emit('draw');\r\n }\r\n private async createImageFromSVG(svgContent: string, fill?: string, isBlob = false) {\r\n const parser = new DOMParser();\r\n const svgDoc = parser.parseFromString(svgContent, 'image/svg+xml');\r\n const svg = svgDoc.documentElement;\r\n if (fill) {\r\n // 控制填充颜色\r\n svg.querySelectorAll('*').forEach((element) => {\r\n element.setAttribute('fill', fill);\r\n });\r\n }\r\n const img = new Image();\r\n let url = '';\r\n if (isBlob) {\r\n const svgBlob = new Blob([new XMLSerializer().serializeToString(svg)], {\r\n type: 'image/svg+xml',\r\n });\r\n url = URL.createObjectURL(svgBlob);\r\n } else {\r\n url = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(new XMLSerializer().serializeToString(svg));\r\n }\r\n img.src = url;\r\n return new Promise<HTMLImageElement>((resolve, reject) => {\r\n img.onerror = () => reject(new Error('Failed to load image'));\r\n img.onload = () => {\r\n resolve(img);\r\n };\r\n });\r\n }\r\n get(name: string) {\r\n return this.icons.get(name);\r\n }\r\n}\r\n","import type Context from './Context';\r\nimport { generateShortUUID } from './util';\r\nimport type { Align, CellHeaderStyleMethod, Column, Fixed, Render, Type, VerticalAlign } from './types';\r\nimport BaseCell from './BaseCell';\r\nimport { Rule, Rules } from './Validator';\r\nexport default class CellHeader extends BaseCell {\r\n align: Align;\r\n verticalAlign: VerticalAlign = 'middle';\r\n fixed?: Fixed;\r\n minWidth?: number;\r\n maxWidth?: number;\r\n widthFillDisable: boolean;\r\n type: Type | '';\r\n operation = false;\r\n editorType: string;\r\n level: number;\r\n text: string;\r\n displayText: string = '';\r\n colspan: number;\r\n rowspan: number;\r\n row: any;\r\n key: string;\r\n required = false;\r\n readonly = false;\r\n ellipsis = false;\r\n overflowTooltipShow = true;\r\n children: Column[] = [];\r\n column: Column;\r\n colIndex: number;\r\n rowKey: string;\r\n rules?: Rules | Rule;\r\n hasChildren: boolean;\r\n render: Render;\r\n style: Partial<CSSStyleDeclaration> = {};\r\n drawX = 0;\r\n drawY = 0;\r\n visibleWidth = 0;\r\n visibleHeight = 0;\r\n drawCellBgColor = '';\r\n drawTextColor = '';\r\n drawImageX = 0;\r\n drawImageY = 0;\r\n drawImageWidth = 0;\r\n drawImageHeight = 0;\r\n drawImageName = '';\r\n drawImageSource: HTMLImageElement | undefined;\r\n constructor(ctx: Context, colIndex: number, x: number, y: number, width: number, height: number, column: Column) {\r\n super(ctx, x, y, width, height, 'header', column.fixed);\r\n this.ctx = ctx;\r\n this.x = x;\r\n this.y = y;\r\n this.width = width;\r\n this.height = height;\r\n this.visibleWidth = width;\r\n this.visibleHeight = height;\r\n this.colIndex = colIndex;\r\n this.key = column.key;\r\n this.minWidth = column.minWidth;\r\n this.maxWidth = column.maxWidth;\r\n this.type = column.type || '';\r\n this.editorType = column.editorType || 'text';\r\n this.align = column.align || 'center';\r\n this.verticalAlign = column.verticalAlign || 'middle';\r\n this.fixed = column.fixed;\r\n this.level = column.level || 0;\r\n this.operation = column.operation || false;\r\n this.text = column.title;\r\n this.column = column;\r\n this.colspan = column.colspan || 1;\r\n this.widthFillDisable = column.widthFillDisable || false;\r\n this.rowspan = column.rowspan || 1;\r\n this.rules = column.rules;\r\n this.readonly = column.readonly || false;\r\n this.required = column.required || false;\r\n this.rowKey = generateShortUUID();\r\n this.overflowTooltipShow = column.overflowTooltipHeaderShow === false ? false : true;\r\n this.hasChildren = (column.children && column.children.length > 0) || false; // 是否有子\r\n this.render = column.renderHeader;\r\n }\r\n /**\r\n * 是否可见,覆盖基类方法,表头是跟y滚动条没有关系的所以不需要加滚动参数\r\n * @returns\r\n */\r\n isVerticalVisible() {\r\n const { stageHeight } = this.ctx;\r\n const offsetHeight = stageHeight;\r\n return !(this.y + this.height <= 0 || this.y >= offsetHeight);\r\n }\r\n\r\n /**\r\n * 更新样式\r\n */\r\n updateStyle() {\r\n this.style = this.getOverlayerViewsStyle();\r\n }\r\n updateContainer() {\r\n const { HEADER_CELL_STYLE_METHOD, HEADER_BG_COLOR, HEADER_TEXT_COLOR } = this.ctx.config;\r\n let bgColor = HEADER_BG_COLOR;\r\n let textColor = HEADER_TEXT_COLOR;\r\n if (typeof HEADER_CELL_STYLE_METHOD === 'function') {\r\n const headerCellStyleMethod: CellHeaderStyleMethod = HEADER_CELL_STYLE_METHOD;\r\n const { backgroundColor, color } =\r\n headerCellStyleMethod({\r\n colIndex: this.colIndex,\r\n column: this.column,\r\n }) || {};\r\n if (backgroundColor) {\r\n bgColor = backgroundColor;\r\n }\r\n // 文字颜色\r\n if (color) {\r\n textColor = color;\r\n }\r\n }\r\n this.drawCellBgColor = bgColor;\r\n this.drawTextColor = textColor;\r\n }\r\n update() {\r\n this.updateContainer();\r\n this.displayText = this.getText();\r\n this.drawX = this.getDrawX();\r\n this.drawY = this.getDrawY();\r\n this.updateStyle();\r\n }\r\n draw() {\r\n const {\r\n paint,\r\n config: { BORDER_COLOR, CELL_PADDING, HEADER_FONT, BORDER },\r\n } = this.ctx;\r\n const { drawX, drawY, displayText } = this;\r\n // 有边框的情况下,绘制边框\r\n paint.drawRect(drawX, drawY, this.width, this.height, {\r\n borderColor: BORDER ? BORDER_COLOR : 'transparent',\r\n fillColor: this.drawCellBgColor,\r\n });\r\n this.ellipsis = paint.drawText(displayText, drawX, drawY, this.width, this.height, {\r\n font: HEADER_FONT,\r\n padding: CELL_PADDING,\r\n color: this.drawTextColor,\r\n align: this.align,\r\n verticalAlign: this.verticalAlign,\r\n });\r\n this.drawSelection();\r\n this.drawSelector();\r\n }\r\n private drawSelector() {\r\n // 选择区背景颜色\r\n const { ENABLE_SELECTOR } = this.ctx.config;\r\n if (!ENABLE_SELECTOR) {\r\n return;\r\n }\r\n const { xArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n if (this.colIndex >= minX && this.colIndex <= maxX) {\r\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.width, this.height, {\r\n borderColor: 'transparent',\r\n fillColor: this.ctx.config.SELECT_ROW_COL_BG_COLOR || 'transparent',\r\n });\r\n }\r\n }\r\n private drawSelection() {\r\n const { width, height, type } = this;\r\n // 选中框类型\r\n if (['index-selection', 'selection'].includes(type)) {\r\n const { indeterminate, check, selectable } = this.ctx.database.getCheckedState();\r\n const { CHECKBOX_SIZE = 0 } = this.ctx.config;\r\n const _x = this.drawX + (width - CHECKBOX_SIZE) / 2;\r\n const _y = this.drawY + (height - CHECKBOX_SIZE) / 2;\r\n let checkboxImage: HTMLImageElement | undefined = this.ctx.icons.get('checkbox-uncheck');\r\n let checkboxName = 'checkbox-uncheck';\r\n if (indeterminate) {\r\n checkboxImage = this.ctx.icons.get('checkbox-indeterminate');\r\n checkboxName = 'checkbox-indeterminate';\r\n } else if (check && selectable) {\r\n checkboxImage = this.ctx.icons.get('checkbox-check');\r\n checkboxName = 'checkbox-check';\r\n } else if (check && selectable) {\r\n checkboxImage = this.ctx.icons.get('checkbox-check-disabled');\r\n checkboxName = 'checkbox-check-disabled';\r\n } else if (!check && selectable) {\r\n checkboxImage = this.ctx.icons.get('checkbox-uncheck');\r\n checkboxName = 'checkbox-uncheck';\r\n } else {\r\n checkboxImage = this.ctx.icons.get('checkbox-disabled');\r\n checkboxName = 'checkbox-disabled';\r\n }\r\n if (checkboxImage) {\r\n this.drawImageX = _x;\r\n this.drawImageY = _y;\r\n this.drawImageWidth = CHECKBOX_SIZE;\r\n this.drawImageHeight = CHECKBOX_SIZE;\r\n this.drawImageName = checkboxName;\r\n this.drawImageSource = checkboxImage;\r\n this.ctx.paint.drawImage(\r\n this.drawImageSource,\r\n this.drawImageX,\r\n this.drawImageY,\r\n this.drawImageWidth,\r\n this.drawImageHeight,\r\n );\r\n }\r\n }\r\n }\r\n getText() {\r\n if (this.render) {\r\n return '';\r\n }\r\n return this.text;\r\n }\r\n /**\r\n * 获取样式\r\n */\r\n getOverlayerViewsStyle() {\r\n let left = '';\r\n if (this.fixed === 'left') {\r\n left = `${this.drawX}px`;\r\n } else if (this.fixed === 'right') {\r\n left = `${this.drawX - (this.ctx.stageWidth - this.ctx.fixedRightWidth)}px`;\r\n } else {\r\n // 中间的,需要减去左边固定列的宽度\r\n left = `${this.drawX - this.ctx.fixedLeftWidth}px`;\r\n }\r\n return {\r\n position: 'absolute',\r\n overflow: 'hidden',\r\n left: left,\r\n top: `${this.drawY + 1}px`,\r\n width: `${this.width}px`,\r\n height: `${this.height - 2}px`,\r\n pointerEvents: 'initial',\r\n userSelect: 'none',\r\n };\r\n }\r\n}\r\n","import Cell from './Cell';\nimport CellHeader from './CellHeader';\nimport Context from './Context';\nimport Row from './Row';\nimport { ExpandLazyMethod } from './types';\n\nexport default class EventTable {\n ctx: Context;\n private visibleHoverCell?: Cell;\n private resizeObserver!: ResizeObserver;\n private mutationObserver!: MutationObserver;\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n }\n private init(): void {\n // 监听窗口大小变化\n this.resizeObserver = new ResizeObserver(() => {\n this.ctx.emit('resetHeader');\n this.ctx.emit('resizeObserver');\n });\n this.resizeObserver.observe(this.ctx.containerElement);\n this.mutationObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\n this.ctx.config.updateCssVar();\n this.ctx.emit('draw');\n }\n }\n });\n if (this.ctx.config.ENABLE_AUTO_THEME) {\n this.mutationObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'], // ✅ 只监听 class 更改\n });\n }\n\n // 按下事件\n this.ctx.on('mousedown', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.focusCellHeader = cell;\n this.ctx.emit('cellHeaderMousedown', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.setFocusCell(cell);\n this.ctx.emit('cellMousedown', cell, e);\n });\n });\n this.ctx.on('click', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.clickCellHeader = cell;\n this.ctx.emit('cellHeaderClick', cell, e);\n // selection事件\n this.selectionClick(cell);\n });\n\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.clickCell = cell;\n this.ctx.emit('cellClick', cell, e);\n // selection事件\n this.selectionClick(cell);\n // 树事件\n this.treeClick(cell);\n // hoverIcon事件\n this.hoverIconClick(cell);\n });\n });\n this.ctx.on('dblclick', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderDblclick', cell, e);\n });\n\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.clickCell = cell;\n this.ctx.emit('cellDblclick', cell, e);\n });\n });\n this.ctx.on('contextMenu', (e: MouseEvent) => {\n if (this.isBusy(e)) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderContextMenuClick', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.emit('cellContextMenuClick', cell, e);\n });\n });\n this.ctx.on('mouseout', (e: MouseEvent) => {\n if (!this.ctx.containerElement.contains(e.relatedTarget as Node) && this.ctx.hoverCell !== undefined) {\n this.ctx.hoverRow = undefined;\n this.ctx.hoverCell = undefined;\n this.ctx.emit('draw');\n }\n });\n this.ctx.on('mousemove', (e: MouseEvent) => {\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n this.ctx.isPointer = false;\n if (this.ctx.stageElement.style.cursor === 'pointer') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderMouseenter', cell, e);\n // 移出事件\n if (this.ctx.hoverCellHeader && this.ctx.hoverCellHeader !== cell) {\n this.ctx.emit('cellHeaderMouseleave', this.ctx.hoverCellHeader, e);\n }\n // selection头部事件\n this.imageEnterAndLeave(cell, e);\n if (this.ctx.hoverCellHeader === cell) {\n return;\n }\n this.ctx.hoverCellHeader = cell;\n this.visibleHoverCell = undefined; // 清除可视区hover\n this.ctx.emit('cellHeaderHoverChange', cell, e);\n });\n // 可视区\n this.handleBodyEvent(\n x,\n y,\n this.ctx.body.renderRows,\n (cell: Cell) => {\n // selection移入移除事件\n this.selectionEnterAndLeave(cell, e);\n // this.ctx.emit(\"visibleCellHoverChange\", cell, e);\n if (this.visibleHoverCell !== cell) {\n this.ctx.emit('visibleCellMouseleave', cell, e);\n this.visibleHoverCell = cell;\n this.ctx.hoverCellHeader = undefined; // 清除头部hover\n this.ctx.emit('visibleCellHoverChange', cell, e);\n }\n },\n true,\n );\n // 正常\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.imageEnterAndLeave(cell, e);\n this.ctx.emit('cellMouseenter', cell, e);\n // 移出事件\n if (this.ctx.hoverCell && this.ctx.hoverCell !== cell) {\n this.ctx.emit('cellMouseleave', cell, e);\n }\n if (this.ctx.hoverCell === cell) return;\n if (this.ctx.hoverCell?.rowKey !== cell.rowKey) {\n this.ctx.hoverCell = cell;\n this.ctx.hoverRow = this.ctx.body.renderRows.find((item) => item.rowKey === cell.rowKey);\n this.ctx.emit('rowHoverChange', this.ctx.hoverRow, cell, e);\n this.ctx.emit('drawView');\n }\n this.ctx.hoverCell = cell;\n this.ctx.emit('cellHoverChange', cell, e);\n });\n });\n }\n private hoverIconClick(cell: Cell) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n if (cell.hoverIconName && this.ctx.isPointer) {\n this.ctx.emit('hoverIconClick', cell);\n }\n }\n /**\n *选中点击\n * @param cell\n */\n private selectionClick(cell: CellHeader | Cell) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n const isSelection = ['selection', 'index-selection'].includes(cell.type) && this.ctx.isPointer;\n if (!isSelection) {\n return;\n }\n // 点击头部\n if (cell instanceof CellHeader) {\n if (cell.drawImageName === 'checkbox-uncheck' || cell.drawImageName === 'checkbox-indeterminate') {\n this.ctx.database.toggleAllSelection();\n } else if (cell.drawImageName === 'checkbox-check') {\n this.ctx.database.clearSelection(true);\n }\n } else {\n // 点击body\n // 是否可点击\n const selectable = this.ctx.database.getRowSelectable(cell.rowKey);\n if (!selectable) {\n return;\n }\n this.ctx.database.toggleRowSelection(cell.rowKey);\n }\n }\n /**\n * 树点击\n * @param cell\n */\n private treeClick(cell: Cell) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n if (cell.type === 'tree' && this.ctx.isPointer) {\n const row = this.ctx.database.getRowForRowKey(cell.rowKey);\n const { expand = false, expandLazy = false } = row || {};\n const { EXPAND_LAZY, EXPAND_LAZY_METHOD } = this.ctx.config;\n // 懒加载且有懒加载方法,不是展开的不是已经加载过的\n if (EXPAND_LAZY && EXPAND_LAZY_METHOD && !expand && !expandLazy) {\n if (typeof EXPAND_LAZY_METHOD === 'function') {\n this.ctx.database.expandLoading(cell.rowKey, true);\n const expandLazyMethod: ExpandLazyMethod = EXPAND_LAZY_METHOD;\n expandLazyMethod({\n row: cell.row,\n rowIndex: cell.rowIndex,\n colIndex: cell.colIndex,\n column: cell.column,\n value: cell.getValue(),\n })\n .then((res: any) => {\n this.ctx.database.setExpandChildren(cell.rowKey, res);\n this.ctx.database.expandLoading(cell.rowKey, false);\n this.ctx.emit('expandChange', this.ctx.database.getExpandRowKeys());\n })\n .catch((err: any) => {\n this.ctx.database.expandLoading(cell.rowKey, false);\n console.error(err);\n });\n }\n // 懒加载\n } else {\n const isExpand = this.ctx.database.getIsExpand(cell.rowKey);\n this.ctx.database.expandItem(cell.rowKey, !isExpand);\n this.ctx.emit('expandChange', this.ctx.database.getExpandRowKeys());\n }\n }\n }\n /**\n * 图标进入和离开事件,包括选中,展开,提示图标等\n * @param cell\n * @param e\n */\n private imageEnterAndLeave(cell: Cell | CellHeader, e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n if (\n x > cell.drawImageX &&\n x < cell.drawImageX + cell.drawImageWidth &&\n y > cell.drawImageY &&\n y < cell.drawImageY + cell.drawImageHeight\n ) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n }\n }\n private selectionEnterAndLeave(cell: Cell | CellHeader, e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n if (\n x > cell.drawImageX &&\n x < cell.drawImageX + cell.drawImageWidth &&\n y > cell.drawImageY &&\n y < cell.drawImageY + cell.drawImageHeight\n ) {\n // body cell 选中图标\n if (cell instanceof Cell && ['selection', 'index-selection'].includes(cell.type)) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n // body cell 需要处理是否可选\n const selectable = this.ctx.database.getRowSelectable(cell.rowKey);\n if (!selectable) {\n this.ctx.stageElement.style.cursor = 'not-allowed';\n }\n }\n }\n }\n\n private isBusy(e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n\n if (!this.ctx.isTarget(e)) {\n return true;\n }\n // 行调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.columnResizing) {\n return true;\n }\n // 行调整大小中不处理\n if (this.ctx.rowResizing) {\n return true;\n }\n const { SCROLLER_TRACK_SIZE } = this.ctx.config;\n // 滚动条移动不处理\n if (this.ctx.scrollerMove) {\n return true;\n }\n // 滚动条悬浮不处理\n if (this.ctx.scrollerFocus) {\n return true;\n }\n // 点击滚动条不处理\n if (y > this.ctx.stageHeight - SCROLLER_TRACK_SIZE) {\n return true;\n }\n // 点击滚动条不处理\n if (x > this.ctx.stageWidth - SCROLLER_TRACK_SIZE) {\n return true;\n }\n return false;\n }\n private handleBodyEvent(x: number, y: number, renderRows: Row[], callback: Function, visible = false) {\n if (!this.isInsideBody(y)) {\n return;\n }\n for (const row of renderRows) {\n // 优先处理固定列\n const cells = row.fixedCells.concat(row.noFixedCells);\n for (const cell of cells) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (visible) {\n if (x > drawX && x < drawX + cell.visibleWidth && y > drawY && y < drawY + cell.visibleHeight) {\n callback(cell);\n return; // 找到后直接返回\n }\n } else if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n }\n private handleHeaderEvent(x: number, y: number, renderCellHeaders: CellHeader[], callback: Function) {\n for (const cell of renderCellHeaders) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n private isInsideBody(y: number) {\n return y > this.ctx.body.y && y < this.ctx.body.y + this.ctx.body.visibleHeight;\n }\n destroy() {\n this.resizeObserver.unobserve(this.ctx.stageElement);\n this.mutationObserver.disconnect();\n }\n}\n","import Database from './Database';\r\nimport History from './History';\r\nimport EventBrowser from './EventBrowser';\r\nimport EventBus, { EventCallback } from './EventBus';\r\nimport Paint from './Paint';\r\nimport Config from './Config';\r\nimport { ChangeItem, Column, EVirtTableOptions, RowParams } from './types';\r\nimport Icons from './Icons';\r\nimport CellHeader from './CellHeader';\r\nimport Row from './Row';\r\nimport Cell from './Cell';\r\nimport EventTable from './EventTable';\r\nexport type ConfigType = Partial<typeof Config>;\r\nexport type containerElementOptions = {\r\n containerElement: HTMLDivElement;\r\n stageElement: HTMLDivElement;\r\n canvasElement: HTMLCanvasElement;\r\n overlayerElement: HTMLDivElement;\r\n editorElement: HTMLDivElement;\r\n emptyElement?: HTMLDivElement;\r\n contextMenuElement?: HTMLDivElement;\r\n};\r\nexport type HeaderOptions = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n visibleHeight: number;\r\n visibleWidth: number;\r\n visibleLeafColumns: Column[];\r\n leafCellHeaders: CellHeader[];\r\n renderLeafCellHeaders: CellHeader[];\r\n renderCellHeaders: CellHeader[];\r\n fixedLeftCellHeaders: [];\r\n fixedRightCellHeaders: [];\r\n renderCenterCellHeaders: [];\r\n};\r\nexport type BodyOptions = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n visibleHeight: number;\r\n visibleWidth: number;\r\n headIndex: number;\r\n tailIndex: number;\r\n visibleRows: any[];\r\n renderRows: Row[];\r\n data: any[];\r\n};\r\nexport type FooterOptions = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n visibleHeight: number;\r\n visibleWidth: number;\r\n renderRows: Row[];\r\n};\r\nexport type SelectorOptions = {\r\n enable: boolean;\r\n xArr: number[];\r\n yArr: number[];\r\n xArrCopy: number[];\r\n yArrCopy: number[];\r\n};\r\nexport type AutofillOptions = {\r\n enable: boolean;\r\n xArr: number[];\r\n yArr: number[];\r\n};\r\nexport default class Context {\r\n private eventBus: EventBus;\r\n private eventBrowser: EventBrowser;\r\n private eventTable: EventTable;\r\n containerElement: HTMLDivElement;\r\n stageElement: HTMLDivElement;\r\n canvasElement: HTMLCanvasElement;\r\n overlayerElement: HTMLDivElement;\r\n editorElement: HTMLDivElement;\r\n emptyElement?: HTMLDivElement;\r\n contextMenuElement?: HTMLDivElement;\r\n stageWidth = 0;\r\n stageHeight = 0;\r\n paint: Paint;\r\n icons: Icons;\r\n domSelectionStr = '';\r\n isMouseoverTargetContainer = false;\r\n mousedown = false;\r\n isPointer = false;\r\n rowResizing = false; // 行调整大小中\r\n columnResizing = false; // 列调整大小中\r\n scrollerMove = false; // 滚动条移动中\r\n scrollerFocus = false; // 滚动条focus中\r\n autofillMove = false; // 自动填充移动中\r\n selectorMove = false; // 选择器移动中\r\n adjustPositioning = false; // 调整位置中\r\n editing = false; // 编辑中\r\n onlyMergeCell = false; // 只有合并单元格\r\n selectOnlyOne = false; // 只选择一个\r\n hasSelection = false; // 是否有选中\r\n hasTree = false; // 是否有树形结构\r\n scrollY = 0;\r\n scrollX = 0;\r\n fixedLeftWidth = 0;\r\n fixedRightWidth = 0;\r\n lastCenterColIndex = 0;\r\n maxColIndex = 0;\r\n maxRowIndex = 0;\r\n hoverRow?: Row;\r\n clickCell?: Cell;\r\n focusCell?: Cell;\r\n currentCell?: Cell;\r\n hoverCell?: Cell;\r\n clickCellHeader?: CellHeader;\r\n focusCellHeader?: CellHeader;\r\n hoverCellHeader?: CellHeader;\r\n body: BodyOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n headIndex: 0,\r\n tailIndex: 0,\r\n visibleRows: [],\r\n renderRows: [],\r\n data: [],\r\n };\r\n footer: FooterOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n renderRows: [],\r\n };\r\n header: HeaderOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n visibleLeafColumns: [],\r\n leafCellHeaders: [],\r\n renderLeafCellHeaders: [],\r\n renderCellHeaders: [],\r\n fixedLeftCellHeaders: [],\r\n fixedRightCellHeaders: [],\r\n renderCenterCellHeaders: [],\r\n };\r\n selector: SelectorOptions = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n xArrCopy: [-1, -1],\r\n yArrCopy: [-1, -1],\r\n };\r\n autofill: AutofillOptions = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n };\r\n database: Database;\r\n history: History;\r\n config: Config;\r\n\r\n constructor(containerOptions: containerElementOptions, options: EVirtTableOptions) {\r\n const {\r\n containerElement,\r\n stageElement,\r\n canvasElement,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n } = containerOptions;\r\n this.containerElement = containerElement;\r\n stageElement.tabIndex = 0; // 设置为可获取焦点\r\n this.stageElement = stageElement;\r\n this.canvasElement = canvasElement;\r\n this.overlayerElement = overlayerElement;\r\n this.editorElement = editorElement;\r\n this.emptyElement = emptyElement;\r\n this.contextMenuElement = contextMenuElement;\r\n this.config = new Config(options.config || {});\r\n this.eventBus = new EventBus();\r\n this.eventBrowser = new EventBrowser(this);\r\n this.eventTable = new EventTable(this);\r\n this.paint = new Paint(this.canvasElement);\r\n this.database = new Database(this, options);\r\n this.history = new History(this);\r\n this.icons = new Icons(this);\r\n }\r\n setConfig(config: Config) {\r\n this.config = new Config(config);\r\n }\r\n setItemValueByEditor(rowKey: string, key: string, value: any, history = true, reDraw = true, checkReadonly = true) {\r\n // 启用合并单元格关联\r\n if (this.config.ENABLE_MERGE_CELL_LINK) {\r\n const cell = this.database.getVirtualBodyCellByKey(rowKey, key);\r\n if (cell && (cell.mergeRow || cell.mergeCol)) {\r\n const { dataList } = cell.getSpanInfo();\r\n const data = dataList.map((item: any) => ({ ...item, value }));\r\n this.database.batchSetItemValue(data, history, checkReadonly);\r\n return;\r\n }\r\n }\r\n this.database.setItemValue(rowKey, key, value, history, reDraw, true, checkReadonly);\r\n }\r\n\r\n batchSetItemValueByEditor(_list: ChangeItem[], history = true, checkReadonly = true) {\r\n // 启用合并单元格关联\r\n if (this.config.ENABLE_MERGE_CELL_LINK) {\r\n const list: ChangeItem[] = [];\r\n _list.forEach((item) => {\r\n const rowIndex = this.database.getRowIndexForRowKey(item.rowKey);\r\n const colIndex = this.database.getColIndexForKey(item.key);\r\n if (rowIndex === undefined || colIndex === undefined) return;\r\n const cell = this.database.getVirtualBodyCell(rowIndex, colIndex);\r\n if (cell) {\r\n const { dataList } = cell.getSpanInfo();\r\n const data = dataList.map((list: any) => ({ ...list, value: item.value }));\r\n list.push(...data);\r\n }\r\n });\r\n this.database.batchSetItemValue(list, history, checkReadonly);\r\n } else {\r\n this.database.batchSetItemValue(_list, history, checkReadonly);\r\n }\r\n }\r\n setFocusCell(cell: Cell) {\r\n if (this.focusCell === cell) return;\r\n if (this.focusCell?.rowKey !== cell.rowKey) {\r\n // 提前设置一下,保证rowFocusChange事件,能用focusCell\r\n this.currentCell = cell;\r\n this.emit('rowFocusChange', cell);\r\n const data: RowParams = {\r\n rowIndex: cell.rowIndex,\r\n rowKey: cell.rowKey,\r\n row: cell.row,\r\n };\r\n this.emit('currentRowChange', data);\r\n }\r\n this.focusCell = cell;\r\n this.emit('cellFocusChange', cell);\r\n }\r\n clearSelector() {\r\n this.selector.enable = false;\r\n this.selector.xArr = [-1, -1];\r\n this.selector.yArr = [-1, -1];\r\n this.emit('clearSelector');\r\n }\r\n clearSelectorCopy() {\r\n this.selector.xArrCopy = [-1, -1];\r\n this.selector.yArrCopy = [-1, -1];\r\n }\r\n clearAutofill() {\r\n this.autofill = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n };\r\n }\r\n /**\r\n * 获取选中的数据\r\n * @returns\r\n */\r\n getSelectedData() {\r\n const rowsData = [];\r\n const yArr = this.selector.yArr;\r\n const xArr = this.selector.xArr;\r\n let text = '';\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n const cellsData = [];\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const rowIndex = ri + yArr[0];\r\n const colIndex = ci + xArr[0];\r\n const cell = this.database.getVirtualBodyCell(rowIndex, colIndex);\r\n if (cell) {\r\n // 选择器值类型\r\n if (cell.selectorCellValueType === 'displayText') {\r\n cellsData.push(cell.displayText);\r\n } else {\r\n // 默认value\r\n cellsData.push(cell.getValue());\r\n }\r\n }\r\n }\r\n text += `${cellsData.join('\\t')}\\r`;\r\n rowsData.push(cellsData);\r\n }\r\n text = text ? text.replace(/\\r$/, '') : ' '; // 去掉最后一个\\n,否则会导致复制到excel里多一行空白\r\n return {\r\n xArr,\r\n yArr,\r\n text,\r\n value: rowsData,\r\n };\r\n }\r\n setScroll(x: number, y: number): void {\r\n let scrollX = Math.floor(x);\r\n const scrollMaxX = this.body.width - this.body.visibleWidth;\r\n // x边界处理\r\n if (scrollX < 0) {\r\n scrollX = 0;\r\n } else if (scrollX > scrollMaxX) {\r\n scrollX = scrollMaxX;\r\n }\r\n // y边界处理\r\n let scrollY = Math.floor(y);\r\n let scrollMaxY = this.body.height - this.body.visibleHeight;\r\n if (!this.config.FOOTER_FIXED) {\r\n scrollMaxY = this.body.height + this.footer.height - this.body.visibleHeight;\r\n }\r\n if (scrollY < 0) {\r\n scrollY = 0;\r\n } else if (scrollY > scrollMaxY) {\r\n scrollY = scrollMaxY;\r\n }\r\n this.emit('setScroll', scrollX, scrollY);\r\n }\r\n setScrollX(x: number): void {\r\n let scrollX = Math.floor(x);\r\n const scrollMaxX = this.body.width - this.body.visibleWidth;\r\n // 边界处理\r\n if (scrollX < 0) {\r\n scrollX = 0;\r\n } else if (scrollX > scrollMaxX) {\r\n scrollX = scrollMaxX;\r\n }\r\n this.emit('setScrollX', scrollX);\r\n }\r\n setScrollY(y: number): void {\r\n // 边界处理\r\n let scrollY = Math.floor(y);\r\n let footerHeight = 0;\r\n if (!this.config.FOOTER_FIXED) {\r\n footerHeight = this.footer.height;\r\n }\r\n const scrollMaxY = this.body.height - this.body.visibleHeight + footerHeight;\r\n if (scrollY < 0) {\r\n scrollY = 0;\r\n } else if (scrollY > scrollMaxY) {\r\n scrollY = scrollMaxY;\r\n }\r\n this.emit('setScrollY', scrollY);\r\n }\r\n isTarget(e: Event): boolean {\r\n if (!this.containerElement.contains(e.target as Node)) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n getOffset(e: MouseEvent) {\r\n const { left, top } = this.containerElement.getBoundingClientRect();\r\n return {\r\n offsetX: e.clientX - left,\r\n offsetY: e.clientY - top,\r\n };\r\n }\r\n hasEvent(event: string): boolean {\r\n return this.eventBus.has(event);\r\n }\r\n on(event: string, callback: EventCallback): void {\r\n this.eventBus.on(event, callback);\r\n }\r\n once(event: string, callback: EventCallback): void {\r\n this.eventBus.once(event, callback);\r\n }\r\n off(event: string, callback: EventCallback): void {\r\n this.eventBus.off(event, callback);\r\n }\r\n emit(event: string, ...args: any[]): void {\r\n this.eventBus.emit(event, ...args);\r\n }\r\n destroy(): void {\r\n this.eventTable.destroy();\r\n this.eventBrowser.destroy();\r\n this.eventBus.destroy();\r\n }\r\n}\r\n","import Context from './Context';\nexport type ScrollbarType = 'horizontal' | 'vertical';\n\nclass Scrollbar {\n private ctx: Context;\n private type: ScrollbarType;\n private isFocus = false;\n private trackX = 0;\n private trackY = 0;\n private trackWidth = 0;\n private trackHeight = 0;\n private splitPoints: number[] = []; //分割线\n private barX = 0;\n private barY = 0;\n private barWidth = 0;\n private barHeight = 0;\n private distance = 0; // 滚动条的长度\n private visibleDistance = 0; //可见区域的长度\n private clientX = 0;\n private clientY = 0;\n private dragStart = 0; // 拖拽开始的位置\n isDragging = false;\n scroll = 0;\n\n constructor(ctx: Context, type: ScrollbarType) {\n this.ctx = ctx;\n this.type = type;\n if (this.type === 'vertical') {\n this.scroll = this.ctx.scrollY;\n } else {\n this.scroll = this.ctx.scrollX;\n }\n }\n\n onWheel(e: WheelEvent) {\n this.updateScroll(e);\n }\n onTouchmove(e: TouchEvent) {\n const { clientY, clientX } = e.touches[0];\n const deltaY = clientY - this.clientY; // 计算滑动距离\n const deltaX = clientX - this.clientX; // 计算滑动距离\n let scroll = 0;\n if (this.type === 'vertical') {\n scroll = Math.max(0, Math.min(this.dragStart - deltaY, this.distance));\n // 只有在滚动条需要滚动时才阻止默认事件\n const hasScrollbar = this.hasScrollbar();\n if (hasScrollbar && !((scroll === 0 && deltaY > 0) || (scroll === this.distance && deltaY < 0))) {\n e.preventDefault();\n }\n } else if (this.type === 'horizontal') {\n scroll = Math.max(0, Math.min(this.dragStart - deltaX, this.distance));\n }\n this.scroll = scroll;\n }\n onTouchstart(e: TouchEvent) {\n const { clientY, clientX } = e.touches[0];\n this.clientX = clientX;\n this.clientY = clientY;\n this.dragStart = this.scroll;\n }\n\n onMouseDown(e: MouseEvent) {\n if (!(e.target instanceof Element)) {\n return;\n }\n if (!this.ctx.isTarget(e)) {\n return;\n }\n // 行调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n return true;\n }\n\n const { offsetX, offsetY, clientX, clientY } = e;\n if (clientX == this.clientX && clientY == this.clientY) return;\n if (this.isOnScrollbar(offsetX, offsetY)) {\n this.clientX = clientX;\n this.clientY = clientY;\n this.isDragging = true;\n this.ctx.scrollerMove = true; // 滚动条移动\n this.isFocus = true;\n this.dragStart = this.scroll;\n e.preventDefault();\n } else if (this.isOnTrack(offsetX, offsetY)) {\n // 点击轨道滚动\n let scroll = 0;\n if (this.type === 'vertical') {\n // 滚动条位置=(鼠标位置-滚动条的高度/2-头部的高度)/(可见区域的长度-滚动条的高度)*滚动条的长度\n // 滚动到中间所以减去滚动条的高度/2\n const offset = offsetY - this.ctx.header.height - this.barHeight / 2;\n scroll = (offset / (this.visibleDistance - this.barHeight)) * this.distance;\n } else {\n const offset = offsetX - this.barWidth / 2;\n scroll = (offset / (this.visibleDistance - this.barWidth)) * this.distance;\n }\n this.scroll = Math.max(0, Math.min(scroll, this.distance));\n }\n }\n\n onMouseUp() {\n this.isDragging = false;\n this.isFocus = false;\n this.clientX = 0;\n this.clientY = 0;\n }\n\n onMouseMove(e: MouseEvent) {\n const { offsetX, offsetY, clientX, clientY, buttons } = e;\n // 没有鼠标按下时不处理,要重置抬起事件\n // 悬浮提示\n if (this.isOnScrollbar(offsetX, offsetY) && e.target === this.ctx.canvasElement) {\n this.isFocus = true;\n } else {\n this.isFocus = false;\n }\n if (buttons === 0) {\n return;\n }\n // 拖拽移动滚动条\n if (clientX == this.clientX && clientY == this.clientY) return;\n let offset = 0;\n if (this.type === 'horizontal') {\n offset = clientX - this.clientX;\n } else {\n offset = clientY - this.clientY;\n }\n if (this.isDragging && offset !== 0) {\n // scroll= 开始滚动条位置+(鼠标移动的距离/可见区域的长度)*滚动条的长度\n let scroll = 0;\n if (this.type === 'vertical') {\n scroll = this.dragStart + (offset / (this.visibleDistance - this.barHeight)) * this.distance;\n } else {\n scroll = this.dragStart + (offset / (this.visibleDistance - this.barWidth)) * this.distance;\n }\n this.scroll = Math.max(0, Math.min(scroll, this.distance));\n }\n }\n\n private isPointInElement(\n pointX: number,\n pointY: number,\n elementX: number,\n elementY: number,\n elementWidth: number,\n elementHeight: number,\n ): boolean {\n return (\n pointX >= elementX &&\n pointX <= elementX + elementWidth &&\n pointY >= elementY &&\n pointY <= elementY + elementHeight\n );\n }\n private hasScrollbar(): boolean {\n if (this.type === 'vertical') {\n return this.barHeight > 0;\n } else if (this.type === 'horizontal') {\n return this.barWidth > 0;\n }\n return false;\n }\n\n private isOnScrollbar(x: number, y: number): boolean {\n return this.isPointInElement(x, y, this.barX, this.barY, this.barWidth, this.barHeight);\n }\n private isOnTrack(x: number, y: number): boolean {\n return this.isPointInElement(x, y, this.trackX, this.trackY, this.trackWidth, this.trackHeight);\n }\n\n private updateScroll(e: WheelEvent) {\n const deltaX = e.deltaX;\n const deltaY = e.deltaY;\n if (this.type === 'vertical' && e.shiftKey === false) {\n // 只有在滚动条需要滚动时才阻止默认事件\n const hasScrollbar = this.hasScrollbar();\n if (hasScrollbar && !((this.scroll === 0 && deltaY < 0) || (this.scroll === this.distance && deltaY > 0))) {\n e.preventDefault();\n }\n this.scroll = Math.max(0, Math.min(this.scroll + deltaY, this.distance));\n } else if (this.type === 'horizontal') {\n if (e.shiftKey) {\n this.scroll = Math.max(0, Math.min(this.scroll + deltaY, this.distance));\n } else {\n this.scroll = Math.max(0, Math.min(this.scroll + deltaX, this.distance));\n }\n }\n }\n private updatedSize() {\n const {\n body,\n header,\n stageHeight,\n stageWidth,\n config: { SCROLLER_TRACK_SIZE = 0, SCROLLER_SIZE = 0, BORDER },\n } = this.ctx;\n const visibleWidth = stageWidth;\n const visibleHeight = stageHeight;\n const headerHeight = header.height;\n const headerWidth = header.width;\n const bodyHeight = body.height;\n const footerHeight = this.ctx.footer.height;\n if (this.type === 'vertical') {\n this.visibleDistance = visibleHeight - SCROLLER_TRACK_SIZE - headerHeight;\n this.distance = bodyHeight - this.visibleDistance + footerHeight;\n this.trackX = visibleWidth - SCROLLER_TRACK_SIZE;\n this.trackY = 0;\n // 分割线\n this.splitPoints = [this.trackX, headerHeight, this.trackX + SCROLLER_TRACK_SIZE, headerHeight];\n this.trackWidth = SCROLLER_TRACK_SIZE;\n this.trackHeight = visibleHeight;\n // 滚动条的X位置=轨道的X位置+(轨道的宽度-滚动条的宽度)/2\n this.barX = this.trackX - 1 + (SCROLLER_TRACK_SIZE - SCROLLER_SIZE) / 2;\n this.barWidth = SCROLLER_SIZE;\n const ratio = this.distance ? this.visibleDistance / (bodyHeight + footerHeight) : 0;\n let _barHeight = Math.floor(ratio * this.visibleDistance);\n // 最小30,超出可见区域则隐藏\n if (_barHeight < 30) {\n _barHeight = 30;\n } else if (_barHeight > this.visibleDistance) {\n _barHeight = 0;\n }\n this.barHeight = _barHeight;\n\n this.barY = headerHeight + (this.scroll / this.distance) * (this.visibleDistance - this.barHeight);\n // 范围限制\n this.scroll = Math.max(0, Math.min(this.scroll, this.distance));\n } else {\n this.visibleDistance = visibleWidth - SCROLLER_TRACK_SIZE;\n this.distance = headerWidth - this.visibleDistance;\n // 分割线\n this.splitPoints = [\n visibleWidth - SCROLLER_TRACK_SIZE,\n visibleHeight - SCROLLER_TRACK_SIZE,\n visibleWidth - SCROLLER_TRACK_SIZE,\n visibleHeight,\n ];\n const offset = BORDER ? 0 : 0.5; // 解决边框问题,补偿0.5px\n this.trackX = 0;\n this.trackY = visibleHeight - SCROLLER_TRACK_SIZE + offset;\n this.trackWidth = visibleWidth;\n this.trackHeight = SCROLLER_TRACK_SIZE;\n\n const ratio = this.distance ? this.visibleDistance / headerWidth : 0;\n\n let _barWidth = Math.floor(ratio * this.visibleDistance);\n this.barY = this.trackY - 1 + (SCROLLER_TRACK_SIZE - SCROLLER_SIZE) / 2;\n // 最小30,超出可见区域则隐藏\n if (_barWidth < 30) {\n _barWidth = 30;\n } else if (_barWidth >= this.visibleDistance) {\n _barWidth = 0;\n }\n this.barWidth = _barWidth;\n this.barHeight = SCROLLER_SIZE;\n this.barX = (this.scroll / this.distance) * (this.visibleDistance - this.barWidth);\n // 范围限制\n this.scroll = Math.max(0, Math.min(this.scroll, this.distance));\n }\n }\n draw() {\n const {\n config: { SCROLLER_FOCUS_COLOR, SCROLLER_COLOR, BORDER_COLOR, BORDER, SCROLLER_TRACK_COLOR },\n } = this.ctx;\n this.updatedSize();\n let borderColor = BORDER_COLOR;\n if (!BORDER) {\n borderColor = 'transparent';\n }\n // 轨道\n this.ctx.paint.drawRect(this.trackX, this.trackY, this.trackWidth, this.trackHeight, {\n borderColor,\n fillColor: SCROLLER_TRACK_COLOR,\n });\n // 滚动条\n this.ctx.paint.drawRect(this.barX, this.barY, this.barWidth, this.barHeight, {\n fillColor: this.isFocus || this.isDragging ? SCROLLER_FOCUS_COLOR : SCROLLER_COLOR,\n radius: 4,\n });\n // 分割线范围外\n if (this.splitPoints.length > 0) {\n this.ctx.paint.drawLine(this.splitPoints, {\n borderColor,\n borderWidth: 1,\n });\n }\n // 悬浮状态\n this.ctx.scrollerFocus = this.isFocus;\n }\n}\n\nexport default class Scroller {\n private ctx: Context;\n private verticalScrollbar: Scrollbar;\n private horizontalScrollbar: Scrollbar;\n\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.verticalScrollbar = new Scrollbar(ctx, 'vertical');\n this.horizontalScrollbar = new Scrollbar(ctx, 'horizontal');\n this.ctx.on('wheel', (e) => this.onWheel(e));\n this.ctx.on('mousedown', (e) => this.onMouseDown(e));\n this.ctx.on('mousemove', (e) => this.onMouseMove(e));\n this.ctx.on('mouseup', () => this.onMouseUp());\n this.ctx.on('touchmove', (e) => this.onTouchmove(e));\n this.ctx.on('touchstart', (e) => {\n this.onTouchstart(e);\n });\n this.ctx.on('setScroll', (scrollX: number, scrollY: number) => {\n this.setScroll(scrollX, scrollY);\n });\n this.ctx.on('setScrollX', (scrollX: number) => {\n this.setScrollX(scrollX);\n });\n this.ctx.on('setScrollY', (scrollY: number) => {\n this.setScrollY(scrollY);\n });\n }\n\n onWheel(e: WheelEvent) {\n this.verticalScrollbar.onWheel(e);\n this.horizontalScrollbar.onWheel(e);\n this.draw();\n }\n\n onTouchmove(e: TouchEvent) {\n this.verticalScrollbar.onTouchmove(e);\n this.horizontalScrollbar.onTouchmove(e);\n this.draw();\n }\n\n onTouchstart(e: TouchEvent) {\n this.verticalScrollbar.onTouchstart(e);\n this.horizontalScrollbar.onTouchstart(e);\n this.draw();\n }\n onMouseDown(e: MouseEvent) {\n this.verticalScrollbar.onMouseDown(e);\n this.horizontalScrollbar.onMouseDown(e);\n this.draw();\n }\n\n onMouseMove(e: MouseEvent) {\n this.verticalScrollbar.onMouseMove(e);\n this.horizontalScrollbar.onMouseMove(e);\n this.draw();\n }\n\n onMouseUp() {\n this.verticalScrollbar.onMouseUp();\n this.horizontalScrollbar.onMouseUp();\n this.ctx.scrollerMove = false;\n }\n\n draw() {\n this.verticalScrollbar.draw();\n this.horizontalScrollbar.draw();\n const scrollX = Math.floor(this.horizontalScrollbar.scroll);\n const scrollY = Math.floor(this.verticalScrollbar.scroll);\n // 只有滚动条发生变化才触发绘制\n if (scrollX !== this.ctx.scrollX || scrollY !== this.ctx.scrollY) {\n this.ctx.emit('onScroll', scrollX, scrollY);\n if (scrollX !== this.ctx.scrollX) {\n this.ctx.emit('onScrollX', scrollX);\n }\n if (scrollY !== this.ctx.scrollY) {\n this.ctx.emit('onScrollY', scrollY);\n }\n this.ctx.scrollX = scrollX;\n this.ctx.scrollY = scrollY;\n this.ctx.emit('draw');\n }\n }\n setScroll(x: number, y: number) {\n this.horizontalScrollbar.scroll = x;\n this.verticalScrollbar.scroll = y;\n this.ctx.emit('draw');\n this.ctx.emit('onScroll', x, y);\n }\n setScrollX(scrollX: number) {\n this.horizontalScrollbar.scroll = scrollX;\n this.ctx.emit('draw');\n }\n setScrollY(scrollY: number) {\n this.verticalScrollbar.scroll = scrollY;\n this.ctx.emit('draw');\n }\n scrollToColkey(key: string) {\n const { header } = this.ctx;\n const cell = header.leafCellHeaders.find((cell) => cell.key === key);\n if (cell) {\n // 移动到窗口中间/2\n this.setScrollX(cell.x - header.visibleWidth / 2);\n }\n }\n scrollToColIndex(colIndex: number) {\n const { header } = this.ctx;\n const cell = header.leafCellHeaders.find((cell) => cell.colIndex === colIndex);\n if (cell) {\n // 移动到窗口中间/2\n if (cell.x > header.visibleWidth / 2) {\n this.setScrollX(cell.x - header.visibleWidth / 2);\n }\n }\n }\n scrollToRowIndex(rowIndex: number) {\n const { body, database } = this.ctx;\n const { top } = database.getPositionForRowIndex(rowIndex);\n if (top > body.visibleHeight) {\n this.setScrollY(top - body.visibleHeight / 2);\n }\n }\n scrollToRowKey(rowKey: string) {\n const { body, database } = this.ctx;\n const rowIndex = database.getRowIndexForRowKey(rowKey);\n if (rowIndex === undefined) {\n return; \n }\n const { top } = database.getPositionForRowIndex(rowIndex);\n this.setScrollY(top - body.visibleHeight / 2);\n }\n}\n","import Context from './Context';\nimport { getMaxRow, calCrossSpan, toLeaf, sortFixed, throttle } from './util';\nimport CellHeader from './CellHeader';\nimport type { Column } from './types';\nexport default class Header {\n private ctx: Context; // 上下文\n private x = 0; // x坐标\n private y = 0; // y坐标\n private width = 0; // 宽度\n private height = 0; // 高度\n private resizeTarget: CellHeader | null = null; //调整表头\n private resizeNum = 0; // 调整列的数量\n private isResizing = false; // 是否移动中\n private clientX = 0; // 鼠标按下时的x轴位置\n private resizeDiff = 0; // 是否移动中\n private columnIndex = 0;\n private isMouseDown = false; // 是否按下\n private columns: any;\n private visibleLeafColumns: any[] = [];\n private visibleHeight = 0;\n private visibleWidth = 0;\n private allCellHeaders: CellHeader[] = [];\n private leafCellHeaders: CellHeader[] = [];\n private renderLeafCellHeaders: CellHeader[] = [];\n private fixedLeftCellHeaders: CellHeader[] = [];\n private centerCellHeaders: CellHeader[] = [];\n private fixedRightCellHeaders: CellHeader[] = [];\n private renderCenterCellHeaders: CellHeader[] = [];\n private renderFixedCellHeaders: CellHeader[] = [];\n constructor(ctx: Context) {\n this.ctx = ctx;\n // 监听表头重置,窗口变化\n this.ctx.on(\n 'resetHeader',\n throttle(() => {\n this.init();\n this.ctx.emit('draw');\n }, 100),\n );\n this.init();\n // 初始化调整列大小ENABLE_RESIZE_COLUMN\n this.initResizeColumn();\n }\n init() {\n const {\n config: { HEADER_HEIGHT, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n const columns = this.ctx.database.getColumns();\n this.columns = columns;\n this.allCellHeaders = [];\n this.leafCellHeaders = [];\n this.fixedLeftCellHeaders = [];\n this.fixedRightCellHeaders = [];\n this.centerCellHeaders = [];\n const maxHeaderRow = getMaxRow(columns);\n const leafColumns = toLeaf(columns);\n this.height = HEADER_HEIGHT * maxHeaderRow;\n this.width = leafColumns.reduce((sum, _item) => {\n const width = _item.width || 100;\n const { maxWidth, minWidth } = _item;\n if (maxWidth && width > maxWidth) {\n return sum + maxWidth;\n }\n if (minWidth && width < minWidth) {\n return sum + minWidth;\n }\n return sum + width;\n }, 0);\n this.visibleHeight = this.height;\n const spanColumns = sortFixed(calCrossSpan(columns, maxHeaderRow));\n this.columnIndex = 0;\n this.resizeNum = 0; // 可调整调整列数量\n this.render(spanColumns, 0);\n this.ctx.database.updateColIndexKeyMap(this.leafCellHeaders);\n const containerElement = this.ctx.containerElement.getBoundingClientRect();\n // 如果有可调整列,宽度等于容器宽度\n if (this.resizeNum > 0) {\n // this.ctx.canvasElement.width = containerElement.width;\n this.ctx.stageWidth = Math.floor(containerElement.width);\n } else {\n // this.ctx.canvasElement.width = this.width + SCROLLER_TRACK_SIZE - 1;\n this.ctx.stageWidth = Math.floor(this.width + SCROLLER_TRACK_SIZE);\n }\n this.ctx.stageElement.style.width = this.ctx.stageWidth + 'px';\n this.visibleWidth = this.ctx.stageWidth - SCROLLER_TRACK_SIZE;\n\n // 如果表头宽度小于可视宽度,平均分配\n const overWidth = this.visibleWidth - this.width;\n if (this.resizeNum && overWidth > 0) {\n const diff = Math.floor((overWidth / this.resizeNum) * 100) / 100;\n this.resizeAllColumn(diff);\n }\n const leafLeftCellHeaders = this.fixedLeftCellHeaders.filter((item) => !item.hasChildren);\n this.ctx.fixedLeftWidth = leafLeftCellHeaders.reduce((sum, _item) => sum + _item.width, 0);\n const leafRightCellHeaders = this.fixedRightCellHeaders.filter((item) => !item.hasChildren);\n this.ctx.fixedRightWidth = leafRightCellHeaders.reduce((sum, _item) => sum + _item.width, SCROLLER_TRACK_SIZE);\n // 更新最大列索引\n this.ctx.maxColIndex = this.leafCellHeaders.length - 1;\n this.ctx.header.x = this.x;\n this.ctx.header.y = this.y;\n this.ctx.header.width = this.width;\n this.ctx.header.height = this.height;\n this.ctx.header.visibleWidth = this.visibleWidth;\n this.ctx.header.visibleHeight = this.visibleHeight;\n }\n // 调整表头的宽度\n private initResizeColumn() {\n const {\n config: { ENABLE_RESIZE_COLUMN },\n } = this.ctx;\n if (!ENABLE_RESIZE_COLUMN) {\n return;\n }\n this.ctx.on('mousedown', (e) => {\n if (!this.ctx.isTarget(e)) {\n return;\n }\n this.clientX = e.clientX;\n if (this.resizeTarget) {\n this.isResizing = true;\n this.ctx.columnResizing = true;\n } else {\n this.isResizing = false;\n }\n this.isMouseDown = true;\n });\n this.ctx.on('mouseup', () => {\n this.isMouseDown = false;\n // 清空\n if (this.resizeDiff !== 0 && this.resizeTarget) {\n // 调整宽度\n this.resizeColumn(this.resizeTarget, this.resizeDiff);\n }\n this.resizeTarget = null;\n this.isResizing = false;\n this.isMouseDown = false;\n this.ctx.columnResizing = false;\n this.clientX = 0;\n this.resizeDiff = 0;\n });\n this.ctx.on('mousemove', (e) => {\n // 编辑中不触发mousemove\n if (this.ctx.editing) return;\n const {\n stageWidth,\n config: { RESIZE_COLUMN_MIN_WIDTH },\n } = this.ctx;\n // 鼠标移动\n if (this.isResizing && this.resizeTarget) {\n const resizeTargetWidth = this.resizeTarget.width;\n const resizeTargetMinWidth = this.resizeTarget.minWidth;\n const resizeTargetMaxWidth = this.resizeTarget.maxWidth;\n let diff = e.clientX - this.clientX;\n if (diff + resizeTargetWidth < RESIZE_COLUMN_MIN_WIDTH) {\n diff = -(resizeTargetWidth - RESIZE_COLUMN_MIN_WIDTH);\n }\n if (resizeTargetMinWidth && diff + resizeTargetWidth < resizeTargetMinWidth) {\n diff = -(resizeTargetWidth - resizeTargetMinWidth);\n }\n if (resizeTargetMaxWidth && diff + resizeTargetWidth > resizeTargetMaxWidth) {\n diff = resizeTargetMaxWidth - resizeTargetWidth;\n }\n this.resizeDiff = diff;\n this.ctx.emit('draw');\n } else {\n this.resizeTarget = null;\n // 按下时不改变样式,有可能是多选表头\n if (this.isMouseDown) {\n return;\n }\n // 鼠标在表头上,边界处理\n if (e.offsetX < 0 || e.offsetX > this.visibleWidth) {\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n return;\n }\n // 恢复默认样式\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n // 渲染的表头\n const renderAllCellHeaders = [...this.renderFixedCellHeaders, ...this.renderCenterCellHeaders];\n for (const col of renderAllCellHeaders) {\n const { offsetX, offsetY } = this.ctx.getOffset(e);\n const x = offsetX;\n const drawX = col.getDrawX();\n if (\n x > drawX + col.width - 5 &&\n x < drawX + col.width + 4 &&\n x < stageWidth - 4 && // 视窗中最后一列不允许调整宽\n col.colspan <= 1 // 父级表头不触发\n ) {\n // 在表头内\n if (this.ctx.isTarget(e) && offsetY <= this.height) {\n this.ctx.stageElement.style.cursor = 'col-resize';\n this.resizeTarget = col;\n }\n }\n }\n }\n });\n }\n private resizeColumn(cell: CellHeader, diff: number) {\n const setWidth = (columns: any[]) => {\n columns.forEach((column: any) => {\n if (column.children && column.children.length > 0) {\n setWidth(column.children);\n }\n if (column.key === cell.key) {\n const width = column.width || 100;\n column.width = width + diff;\n }\n });\n };\n setWidth(this.columns);\n this.ctx.database.setColumns(this.columns);\n this.init();\n this.ctx.emit('draw');\n let overDiff = 0;\n // 如果表头宽度小于可视宽度,平均分配\n if (this.width < this.visibleWidth) {\n const overWidth = this.visibleWidth - this.width;\n overDiff = Math.floor((overWidth / this.resizeNum) * 100) / 100;\n this.resizeAllColumn(overDiff);\n this.ctx.emit('draw');\n }\n this.ctx.emit('resizeColumnChange', {\n colIndex: cell.colIndex,\n key: cell.key,\n oldWidth: cell.width,\n width: cell.width + diff + overDiff,\n column: cell.column,\n columns: this.columns,\n });\n }\n resizeAllColumn(fellWidth: number) {\n if (fellWidth === 0) return;\n const widthMap = new Map();\n // 存需要更改的宽度\n let isResize = true;\n for (const col of this.allCellHeaders) {\n if (col.widthFillDisable) {\n // 不允许调整宽度\n widthMap.set(col.key, col.width);\n } else {\n const width = col.width + fellWidth * col.colspan;\n widthMap.set(col.key, width);\n if (width < this.ctx.config.RESIZE_COLUMN_MIN_WIDTH) {\n isResize = false;\n }\n }\n }\n // 如果有小于RESIZE_COLUMN_MIN_WIDTH的列,不允许调整\n if (!isResize) {\n return;\n }\n // 递归更改宽度\n const uptateWidth = (columns: Column[]) => {\n columns.forEach((column: Column) => {\n if (widthMap.has(column.key)) {\n column.width = widthMap.get(column.key);\n }\n if (column.children && column.children.length > 0) {\n uptateWidth(column.children);\n }\n });\n };\n uptateWidth(this.columns);\n this.ctx.database.setColumns(this.columns);\n this.init();\n // this.ctx.emit(\"draw\");\n }\n\n private render(arr: Column[], originX: number) {\n const len = arr.length;\n let everyOffsetX = originX;\n const { HEADER_HEIGHT = 0 } = this.ctx.config;\n for (let i = 0; i < len; i++) {\n const item = arr[i];\n const height = HEADER_HEIGHT * (item.rowspan || 0);\n const y = HEADER_HEIGHT * (item.level || 0);\n let { minWidth, maxWidth } = item;\n let width = item.width || 100; // 读取映射宽度\n if (minWidth && width < minWidth) {\n width = minWidth;\n }\n if (maxWidth && width > maxWidth) {\n width = maxWidth;\n }\n if (item.children) {\n // 父级表头的宽度是叶子节点表头的宽度总和\n const _arr = toLeaf(item.children);\n width = _arr.reduce((sum, _item) => sum + (_item?.width || 100), 0);\n }\n const cellHeader = new CellHeader(this.ctx, this.columnIndex, everyOffsetX, y, width, height, item);\n // 设置表头\n this.ctx.database.setHeader(item.key, cellHeader);\n this.allCellHeaders.push(cellHeader);\n if (!item.children) {\n this.leafCellHeaders.push(cellHeader);\n if (!cellHeader.column.widthFillDisable) {\n this.resizeNum++;\n }\n }\n if (item.fixed === 'left') {\n this.fixedLeftCellHeaders.push(cellHeader);\n } else if (item.fixed === 'right') {\n this.fixedRightCellHeaders.push(cellHeader);\n } else {\n this.centerCellHeaders.push(cellHeader);\n }\n !item.children && this.columnIndex++;\n item.children && this.render(item.children, everyOffsetX);\n everyOffsetX += width;\n }\n }\n\n private drawTipLine() {\n if (this.isResizing && this.resizeTarget) {\n const {\n stageHeight,\n config: { RESIZE_COLUMN_LINE_COLOR },\n } = this.ctx;\n const resizeTargetDrawX = this.resizeTarget.getDrawX();\n const resizeTargetWidth = this.resizeTarget.width;\n const x = resizeTargetDrawX + resizeTargetWidth + this.resizeDiff - 0.5;\n const poins = [x - 0.5, 0, x - 0.5, stageHeight];\n this.ctx.paint.drawLine(poins, {\n borderColor: RESIZE_COLUMN_LINE_COLOR,\n borderWidth: 1,\n });\n }\n }\n private drawFixedShadow() {\n const {\n fixedLeftWidth,\n fixedRightWidth,\n scrollX,\n header,\n stageWidth,\n config: { HEADER_BG_COLOR, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n\n if (scrollX > 0 && fixedLeftWidth !== 0) {\n this.ctx.paint.drawShadow(this.x, this.y, fixedLeftWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'right',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0.1)',\n colorEnd: 'rgba(0,0,0,0)',\n });\n }\n // 右边阴影\n if (scrollX < Math.floor(header.width - stageWidth - 1) && fixedRightWidth !== SCROLLER_TRACK_SIZE) {\n const x = header.width - (this.x + this.width) + stageWidth - fixedRightWidth;\n this.ctx.paint.drawShadow(x, this.y, fixedRightWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'left',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0)',\n colorEnd: 'rgba(0,0,0,0.1)',\n });\n }\n }\n update() {\n const renderLeafCellHeaders: CellHeader[] = [];\n const renderCenterCellHeaders: CellHeader[] = [];\n const renderFixedCellHeaders: CellHeader[] = [];\n // 中心的最后一个ColIndex\n if (this.centerCellHeaders.length) {\n const lastCenterCell = this.centerCellHeaders[this.centerCellHeaders.length - 1];\n this.ctx.lastCenterColIndex = lastCenterCell.colIndex;\n }\n this.centerCellHeaders.forEach((item) => {\n if (item.isHorizontalVisible() && item.isVerticalVisible()) {\n renderCenterCellHeaders.push(item);\n if (!item.hasChildren) {\n renderLeafCellHeaders.push(item);\n }\n }\n });\n this.fixedLeftCellHeaders.forEach((item) => {\n renderFixedCellHeaders.push(item);\n if (!item.hasChildren) {\n renderLeafCellHeaders.push(item);\n }\n });\n this.fixedRightCellHeaders.forEach((item) => {\n renderFixedCellHeaders.push(item);\n if (!item.hasChildren) {\n renderLeafCellHeaders.push(item);\n }\n });\n this.renderCenterCellHeaders = renderCenterCellHeaders;\n this.renderFixedCellHeaders = renderFixedCellHeaders;\n this.renderLeafCellHeaders = renderLeafCellHeaders.sort((a, b) => a.x - b.x);\n this.visibleLeafColumns = this.renderLeafCellHeaders.map((item) => item.column);\n\n this.ctx.header.visibleLeafColumns = this.visibleLeafColumns;\n this.ctx.header.leafCellHeaders = this.leafCellHeaders;\n this.ctx.header.renderLeafCellHeaders = this.renderLeafCellHeaders;\n this.ctx.header.renderCellHeaders = this.renderFixedCellHeaders.concat(this.renderCenterCellHeaders);\n }\n drawBottomLine() {\n const {\n stageWidth,\n config: { BORDER_COLOR },\n } = this.ctx;\n const poins = [0, this.height, stageWidth, this.height];\n this.ctx.paint.drawLine(poins, {\n borderColor: BORDER_COLOR,\n borderWidth: 1,\n });\n }\n draw() {\n this.renderCenterCellHeaders.forEach((item) => {\n item.update();\n item.draw();\n });\n this.drawFixedShadow();\n this.renderFixedCellHeaders.forEach((item) => {\n item.update();\n item.draw();\n });\n this.drawTipLine();\n this.drawBottomLine();\n }\n}\n","import Cell from './Cell';\nimport Context from './Context';\nimport type { RowType } from './types';\nexport default class Row {\n private ctx: Context;\n x = 0;\n y: number = 0;\n width = 0;\n height: number;\n cells: Cell[] = [];\n fixedCells: Cell[] = [];\n noFixedCells: Cell[] = [];\n rowIndex = 0;\n rowKey = '';\n rowType: RowType = 'body';\n data: any;\n constructor(\n ctx: Context,\n rowIndex: number,\n x = 0,\n y = 0,\n width = 0,\n height = 0,\n data: any,\n rowType: RowType = 'body',\n ) {\n this.ctx = ctx;\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n this.rowIndex = rowIndex;\n this.rowKey = ctx.database.getRowKeyForRowIndex(rowIndex) || '';\n this.rowType = rowType;\n this.data = data;\n this.update();\n }\n update() {\n const { header } = this.ctx;\n const cells: Cell[] = [];\n const fixedCells: Cell[] = [];\n const noFixedCells: Cell[] = [];\n header.renderLeafCellHeaders.forEach((header) => {\n const cell = new Cell(\n this.ctx,\n this.rowIndex,\n header.colIndex,\n header.x,\n this.y,\n header.width,\n this.height,\n header.column,\n this.data,\n this.rowType,\n );\n if (cell.fixed) {\n fixedCells.push(cell);\n } else {\n noFixedCells.push(cell);\n }\n cells.push(cell);\n });\n this.cells = cells;\n this.fixedCells = fixedCells;\n this.noFixedCells = noFixedCells;\n }\n drawCenter() {\n this.noFixedCells.forEach((cell) => {\n cell.draw();\n });\n }\n drawFixed() {\n this.fixedCells.forEach((cell) => {\n cell.draw();\n });\n }\n drawContainer() {\n this.noFixedCells.forEach((cell) => {\n cell.drawContainer();\n });\n }\n drawFixedContainer() {\n this.fixedCells.forEach((cell) => {\n cell.drawContainer();\n });\n }\n}\n","import type Context from './Context';\nimport Row from './Row';\nimport { Position } from './types';\nexport default class Body {\n private resizeTarget: Row | null = null; //调整行大小的目标\n private isMouseDown = false; // 是否按下\n private resizeDiff = 0; // 是否移动中\n private clientY = 0; // 鼠标按下时的y轴位置\n private ctx: Context;\n private x = 0;\n private y = 0;\n private width = 0;\n private height = 0;\n private headIndex = 0;\n private tailIndex = 0;\n private isResizing = false; //是否正在调整大小\n private renderRows: Row[] = [];\n private visibleRows: any[] = [];\n private visibleHeight = 0;\n private visibleWidth = 0;\n private containerRect: DOMRect | undefined;\n private data: any[] = [];\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n this.initResizeRow();\n }\n private init() {\n const {\n canvasElement,\n header,\n footer,\n database,\n config: {\n FOOTER_FIXED,\n SCROLLER_TRACK_SIZE = 0,\n HEIGHT,\n EMPTY_BODY_HEIGHT = 0,\n MAX_HEIGHT = 0,\n ENABLE_OFFSET_HEIGHT = 0,\n OFFSET_HEIGHT = 0,\n FOOTER_POSITION,\n },\n } = this.ctx;\n if (!header.width) {\n return;\n }\n this.x = 0;\n if (FOOTER_POSITION === 'top' && FOOTER_FIXED) {\n this.y = header.height + footer.height; //更新body的y轴位置\n } else {\n this.y = header.height;\n }\n const { data, sumHeight } = database.getData();\n // 更新高度\n this.height = sumHeight;\n // 更新数据\n this.data = data;\n // 更新宽度\n this.width = header.width;\n this.visibleWidth = this.ctx.stageWidth - SCROLLER_TRACK_SIZE;\n // 底部高度\n const footerHeight = this.ctx.footer.height;\n if (!this.data.length && !HEIGHT) {\n this.height = EMPTY_BODY_HEIGHT;\n } else if (!this.data.length && HEIGHT) {\n // 如果有设置高度的情况,空数据时,高度也要保持为设置的高度\n this.height = HEIGHT - header.height - footerHeight - SCROLLER_TRACK_SIZE;\n }\n\n let containerHeight = this.height + header.height + SCROLLER_TRACK_SIZE;\n // 如果有底部,加上底部高度\n containerHeight += footerHeight;\n let stageHeight = containerHeight;\n const windowInnerHeight = window.innerHeight;\n const { top } = this.containerRect || this.ctx.containerElement.getBoundingClientRect();\n if (windowInnerHeight > top && ENABLE_OFFSET_HEIGHT && !HEIGHT) {\n const visibleHeight = windowInnerHeight - top;\n const _stageHeight = visibleHeight - OFFSET_HEIGHT;\n if (_stageHeight > header.height + SCROLLER_TRACK_SIZE) {\n stageHeight = _stageHeight;\n } else if (containerHeight > MAX_HEIGHT) {\n stageHeight = MAX_HEIGHT;\n }\n } else if (this.data.length && HEIGHT) {\n stageHeight = HEIGHT;\n } else if (this.data.length && MAX_HEIGHT && containerHeight > MAX_HEIGHT) {\n stageHeight = MAX_HEIGHT;\n }\n // 更新窗口高度\n if (stageHeight > 0) {\n // this.ctx.canvasElement.height = stageHeight;\n this.ctx.stageHeight = Math.floor(stageHeight);\n this.ctx.stageElement.style.height = `${this.ctx.stageHeight}px`;\n }\n // 可视区高度\n let _visibleHeight = this.ctx.stageHeight - header.height - SCROLLER_TRACK_SIZE;\n // 底部高度,如果是固定底部,可视区减上底部高度\n if (FOOTER_FIXED) {\n this.visibleHeight = _visibleHeight - footerHeight;\n } else {\n this.visibleHeight = _visibleHeight;\n }\n if (!this.data.length) {\n this.height = this.visibleHeight;\n }\n this.ctx.body.x = this.x;\n this.ctx.body.y = this.y;\n this.ctx.body.width = this.width;\n this.ctx.body.height = this.height;\n this.ctx.body.visibleWidth = this.visibleWidth;\n this.ctx.body.visibleHeight = this.visibleHeight;\n this.ctx.body.data = data;\n const dpr = window.devicePixelRatio || 1; // 获取设备像素比\n const canvasWidth = this.ctx.stageWidth * dpr;\n const canvasHeight = this.ctx.stageHeight * dpr;\n canvasElement.width = Math.round(canvasWidth);\n canvasElement.height = Math.round(canvasHeight);\n const isEmpty = !this.data.length ? 'empty' : 'not-empty';\n this.ctx.emit('emptyChange', {\n isEmpty,\n type: isEmpty,\n headerHeight: header.height,\n bodyHeight: this.height,\n footerHeight,\n width: this.width,\n height: !this.data.length ? EMPTY_BODY_HEIGHT + footerHeight : 0,\n });\n // 外层容器样式\n const _cssWidth = Math.round((canvasElement.width / dpr) * 10000) / 10000;\n const _cssHeight = Math.round((canvasElement.height / dpr) * 10000) / 10000;\n this.ctx.canvasElement.setAttribute('style', `height:${_cssHeight}px;width:${_cssWidth}px;`);\n this.ctx.paint.scale(dpr);\n }\n // 调整行的高度\n private initResizeRow() {\n const {\n config: { ENABLE_RESIZE_ROW },\n } = this.ctx;\n if (!ENABLE_RESIZE_ROW) {\n return;\n }\n this.ctx.on('resize', () => {\n this.containerRect = this.ctx.containerElement.getBoundingClientRect();\n });\n this.ctx.on('resizeObserver', () => {\n this.containerRect = this.ctx.containerElement.getBoundingClientRect();\n });\n // 鼠标移动\n this.ctx.on('mouseup', () => {\n this.isMouseDown = false;\n if (this.resizeDiff !== 0 && this.resizeTarget) {\n // 调整宽度\n this.resizeRow(this.resizeTarget, this.resizeDiff);\n }\n this.resizeTarget = null;\n this.resizeDiff = 0;\n this.isResizing = false;\n //加个延时,修复拖动时,开始编辑的问题\n setTimeout(() => {\n this.ctx.rowResizing = false;\n }, 0);\n this.clientY = 0;\n });\n this.ctx.on('mousedown', (e) => {\n if (!this.ctx.isTarget(e)) {\n return;\n }\n this.clientY = e.clientY;\n if (this.resizeTarget) {\n this.isResizing = true;\n // 传递给上下文,防止其他事件触发,行调整大小时,不触发选择器\n this.ctx.rowResizing = true;\n } else {\n this.isResizing = false;\n this.ctx.rowResizing = false;\n }\n this.isMouseDown = true;\n });\n this.ctx.on('mousemove', (e) => {\n // 编辑中不触发mousemove\n if (this.ctx.editing) return;\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n const clientY = e.clientY;\n const {\n stageHeight,\n scrollY,\n config: { RESIZE_ROW_MIN_HEIGHT = 0 },\n } = this.ctx;\n if (this.isResizing && this.resizeTarget) {\n const resizeTargetHeight = this.resizeTarget.height;\n let diff = clientY - this.clientY;\n if (diff + resizeTargetHeight < RESIZE_ROW_MIN_HEIGHT) {\n diff = -(resizeTargetHeight - RESIZE_ROW_MIN_HEIGHT);\n }\n this.resizeDiff = diff;\n this.ctx.emit('draw');\n } else {\n this.resizeTarget = null;\n // 按下时不改变样式,有可能是多选表头\n if (this.isMouseDown) {\n return;\n }\n // 鼠标移动时,判断是否在行的范围内\n if (\n x < 0 ||\n x > this.ctx.body.visibleWidth ||\n y < 0 ||\n y > this.ctx.header.visibleHeight + this.ctx.body.visibleHeight\n ) {\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n // 恢复默认样式\n this.ctx.stageElement.style.cursor = 'default';\n }\n return;\n }\n // 如果是拖动选择\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\n return;\n }\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n // 恢复默认样式\n this.ctx.stageElement.style.cursor = 'default';\n }\n for (let i = 0; i < this.renderRows.length; i++) {\n const row = this.renderRows[i];\n const isYRange =\n y > row.y - scrollY + row.height - 1.5 &&\n y < row.y - scrollY + row.height + 1.5 &&\n y < stageHeight - 4;\n if (isYRange) {\n for (let j = 0; j < row.cells.length; j++) {\n const cell = row.cells[j];\n if (\n x > cell.drawX + 10 &&\n x < cell.drawX + cell.width - 10 &&\n cell.rowspan === 1 //没有被合并的单元格\n ) {\n this.ctx.stageElement.style.cursor = 'row-resize';\n this.resizeTarget = row;\n }\n }\n }\n }\n }\n });\n }\n private resizeRow(row: Row, diff: number) {\n const { rowIndex, height, rowKey, data } = row;\n this.ctx.database.setRowHeight(rowIndex, height + diff);\n this.init();\n this.ctx.emit('draw');\n this.ctx.emit('resizeRowChange', {\n rowIndex,\n oldHeight: height,\n height: height + diff,\n rowKey,\n row: data,\n data: this.data,\n });\n }\n private drawTipLine() {\n if (this.isResizing && this.resizeTarget) {\n const {\n stageWidth,\n scrollY,\n config: { RESIZE_ROW_LINE_COLOR },\n } = this.ctx;\n const resizeTargetDrawY = this.resizeTarget.y - scrollY;\n const resizeTargetHeight = this.resizeTarget.height;\n const y = resizeTargetDrawY + resizeTargetHeight + this.resizeDiff - 0.5;\n const poins = [0, y - 0.5, stageWidth, y - 0.5];\n this.ctx.paint.drawLine(poins, {\n borderColor: RESIZE_ROW_LINE_COLOR,\n borderWidth: 1,\n });\n }\n }\n private drawFixedShadow() {\n const {\n fixedLeftWidth,\n fixedRightWidth,\n scrollX,\n header,\n stageWidth,\n config: { HEADER_BG_COLOR, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n\n if (scrollX > 0 && fixedLeftWidth !== 0) {\n this.ctx.paint.drawShadow(this.x, this.y, fixedLeftWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'right',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0.1)',\n colorEnd: 'rgba(0,0,0,0)',\n });\n }\n // 右边阴影\n if (scrollX < Math.floor(header.width - stageWidth - 1) && fixedRightWidth !== SCROLLER_TRACK_SIZE) {\n const x = header.width - (this.x + this.width) + stageWidth - fixedRightWidth;\n this.ctx.paint.drawShadow(x, this.y, fixedRightWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'left',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0)',\n colorEnd: 'rgba(0,0,0,0.1)',\n });\n }\n }\n private binarySearch(list: Position[], value: number) {\n let start = 0;\n let end = list.length - 1;\n let tempIndex = -1;\n while (start <= end) {\n let midIndex = Math.floor((start + end) / 2);\n let midValue = list[midIndex].bottom;\n if (midValue === value) {\n return midIndex;\n } else if (midValue < value) {\n start = midIndex + 1;\n } else {\n tempIndex = midIndex; // 记录当前的 midIndex\n end = midIndex - 1;\n }\n }\n return tempIndex;\n }\n update() {\n this.init();\n const {\n header,\n database,\n scrollY,\n config: { CELL_HEIGHT },\n } = this.ctx;\n const offset = scrollY;\n const { data, positions } = database.getData();\n // 更新最大行数\n this.ctx.maxRowIndex = data.length - 1;\n let _headIndex = this.binarySearch(positions, offset);\n let _tailIndex = this.binarySearch(positions, offset + this.visibleHeight);\n if (_tailIndex === -1) {\n _tailIndex = this.ctx.maxRowIndex;\n }\n // 解决性能问题,设置数据时又设置滚动条可能导致虚拟滚动计算错误\n if (_headIndex === -1 && _tailIndex === this.ctx.maxRowIndex) {\n const buffer = Math.floor(this.visibleHeight / CELL_HEIGHT);\n _headIndex = this.ctx.maxRowIndex - buffer;\n }\n this.headIndex = Math.max(0, _headIndex);\n this.tailIndex = Math.min(this.ctx.maxRowIndex, _tailIndex + 1);\n this.visibleRows = data.slice(this.headIndex, this.tailIndex + 1);\n this.ctx.body.headIndex = this.headIndex;\n this.ctx.body.tailIndex = this.tailIndex;\n this.ctx.body.visibleRows = this.visibleRows;\n\n const rows: Row[] = [];\n for (let i = 0; i < this.visibleRows.length; i++) {\n const index = this.headIndex + i;\n const data = this.visibleRows[i];\n const { height, top } = this.ctx.database.getPositionForRowIndex(index);\n const row = new Row(this.ctx, index, 0, top + this.y, header.width, height, data);\n rows.push(row);\n }\n this.renderRows = rows;\n this.ctx.body.renderRows = rows;\n }\n draw() {\n // 容器背景\n this.renderRows.forEach((row) => {\n row.drawContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawCenter();\n });\n this.drawFixedShadow();\n this.renderRows.forEach((row) => {\n row.drawFixedContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawFixed();\n });\n this.drawTipLine();\n }\n}\n","import Context from './Context';\nimport Row from './Row';\n\nexport default class Footer {\n private ctx: Context;\n private renderRows: Row[] = [];\n private data: any[] = [];\n private x = 0;\n private y = 0;\n private width = 0;\n private height = 0;\n private visibleWidth = 0;\n private visibleHeight = 0;\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n }\n private init() {\n this.data = this.ctx.database.getFooterData();\n const {\n header,\n body,\n config: { CELL_FOOTER_HEIGHT, FOOTER_FIXED, SCROLLER_TRACK_SIZE, FOOTER_POSITION },\n } = this.ctx;\n // 更新宽度\n this.width = header.width;\n this.visibleWidth = header.visibleWidth;\n // 更新高度\n this.height = this.data.reduce((sum) => {\n return sum + CELL_FOOTER_HEIGHT;\n }, 0);\n // 可视区高度\n this.visibleHeight = this.height;\n if (FOOTER_FIXED) {\n if (FOOTER_POSITION === 'top') {\n this.y = this.ctx.header.height;\n } else {\n this.y = this.ctx.stageHeight - this.height - SCROLLER_TRACK_SIZE;\n }\n } else {\n this.y = body.y + body.height;\n }\n this.ctx.footer.x = this.x;\n this.ctx.footer.y = this.y;\n this.ctx.footer.height = this.height;\n this.ctx.footer.width = this.width;\n this.ctx.footer.visibleWidth = this.visibleWidth;\n this.ctx.footer.visibleHeight = this.visibleHeight;\n }\n private drawFixedShadow() {\n const {\n fixedLeftWidth,\n fixedRightWidth,\n scrollX,\n header,\n stageWidth,\n config: { HEADER_BG_COLOR, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n let y = this.y;\n // 不是footer固定时\n if (!this.ctx.config.FOOTER_FIXED) {\n y = this.y - this.ctx.scrollY;\n }\n if (scrollX > 0 && fixedLeftWidth !== 0) {\n this.ctx.paint.drawShadow(this.x, y, fixedLeftWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'right',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0.1)',\n colorEnd: 'rgba(0,0,0,0)',\n });\n }\n // 右边阴影\n if (scrollX < Math.floor(header.width - stageWidth - 1) && fixedRightWidth !== SCROLLER_TRACK_SIZE) {\n const x = header.width - (this.x + this.width) + stageWidth - fixedRightWidth;\n this.ctx.paint.drawShadow(x, y, fixedRightWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'left',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0)',\n colorEnd: 'rgba(0,0,0,0.1)',\n });\n }\n }\n update() {\n this.init();\n const { CELL_FOOTER_HEIGHT } = this.ctx.config;\n let everyOffsetY = this.y;\n const rows: Row[] = [];\n this.data.forEach((data, index) => {\n const row = new Row(this.ctx, index, 0, everyOffsetY, this.width, CELL_FOOTER_HEIGHT, data, 'footer');\n everyOffsetY += CELL_FOOTER_HEIGHT;\n rows.push(row);\n });\n this.renderRows = rows;\n this.ctx.footer.renderRows = this.renderRows;\n }\n drawTopLine() {\n const {\n stageWidth,\n config: { BORDER_COLOR },\n } = this.ctx;\n const poins = [0, this.y, stageWidth, this.y];\n this.ctx.paint.drawLine(poins, {\n borderColor: BORDER_COLOR,\n borderWidth: 1,\n });\n }\n draw() {\n this.renderRows.forEach((row) => {\n row.drawContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawCenter();\n });\n this.drawFixedShadow();\n this.renderRows.forEach((row) => {\n row.drawFixedContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawFixed();\n });\n this.drawTopLine();\n }\n}\n","import type Context from './Context';\r\nimport type Cell from './Cell';\r\nimport type CellHeader from './CellHeader';\r\nimport { BeforePasteDataMethod, BeforeSetSelectorMethod, ChangeItem, ErrorType, BeforeCopyMethod } from './types';\r\nimport { throttle, decodeSpreadsheetStr, encodeToSpreadsheetStr } from './util';\r\nexport default class Selector {\r\n private isCut = false;\r\n private isMultipleRow = false;\r\n private mousedownHeader = false;\r\n private ctx: Context;\r\n private adjustPositionX = '';\r\n private adjustPositionY = '';\r\n private timerX = 0; // 水平滚动定时器\r\n private timerY = 0; // 垂直滚动定时器\r\n\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('setMoveFocus', (dir: 'LEFT' | 'TOP' | 'RIGHT' | 'BOTTOM') => {\r\n this.moveFocus(dir);\r\n });\r\n // 鼠标移动fixed边界时,调整滚动条位置\r\n this.ctx.on(\r\n 'mousemove',\r\n throttle((e) => {\r\n const { offsetY, offsetX } = this.ctx.getOffset(e);\r\n const isInsideBody =\r\n this.ctx.isTarget(e) &&\r\n offsetX > 0 &&\r\n offsetX < this.ctx.body.visibleWidth &&\r\n offsetY > this.ctx.header.visibleHeight &&\r\n offsetY < this.ctx.header.visibleHeight + this.ctx.body.visibleHeight;\r\n if (this.ctx.selectorMove || this.ctx.autofillMove) {\r\n // 如果是body外部就调整位置\r\n if (!isInsideBody && !this.mousedownHeader) {\r\n this.startAdjustPosition(e);\r\n } else {\r\n this.stopAdjustPosition();\r\n }\r\n }\r\n }, 100),\r\n );\r\n this.ctx.on('cellHoverChange', (cell) => {\r\n // 如果是自动填充移动就不处理\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n if (cell.operation) {\r\n this.selectRows(cell, false);\r\n // 如果是自动填充就不处理\r\n return;\r\n }\r\n // 多选行\r\n if (this.isMultipleRow) {\r\n return;\r\n }\r\n this.mouseenter();\r\n });\r\n this.ctx.on('cellMousedown', (cell, e) => {\r\n if (!this.ctx.isTarget(e)) {\r\n return;\r\n }\r\n // 如果是选中就不处理,比如chexkbox\r\n if (this.ctx.stageElement.style.cursor === 'pointer') {\r\n return;\r\n }\r\n if (this.ctx.isPointer) {\r\n return;\r\n }\r\n // 如果是填充返回\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n return;\r\n }\r\n if (cell.operation) {\r\n this.isMultipleRow = true;\r\n this.selectRows(cell);\r\n return;\r\n }\r\n // 解决dom文档选中问题\r\n const style = window.getComputedStyle(e.target);\r\n if (style.userSelect !== 'text') {\r\n e.preventDefault();\r\n }\r\n this.isMultipleRow = false;\r\n this.click(e.shiftKey);\r\n this.ctx.emit('selectorClick', cell);\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.mousedownHeader = false;\r\n // mousedown销毁dom会导致click事件清除\r\n // 加个setTimeout小延迟一下,使得editor cellClick 判断adjustPositioning正常\r\n const timer = setTimeout(() => {\r\n this.ctx.adjustPositioning = false;\r\n clearTimeout(timer);\r\n }, 0);\r\n });\r\n this.ctx.on('cellHeaderHoverChange', (cell) => {\r\n if (this.ctx.mousedown) {\r\n this.selectCols(cell);\r\n }\r\n });\r\n this.ctx.on('cellHeaderMousedown', (cell, e) => {\r\n // 如果是选中就不处理,比如chexkbox\r\n if (this.ctx.stageElement.style.cursor === 'pointer') {\r\n return;\r\n }\r\n if (this.ctx.isPointer) {\r\n return;\r\n }\r\n // 解决dom文档选中问题\r\n const style = window.getComputedStyle(e.target);\r\n if (style.userSelect !== 'text') {\r\n e.preventDefault();\r\n }\r\n this.mousedownHeader = true;\r\n this.selectCols(cell);\r\n });\r\n this.ctx.on('keydown', (e) => {\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n // CTRL+C/Command+C\r\n if ((e.ctrlKey && e.code === 'KeyV') || (e.metaKey && e.code === 'KeyV')) {\r\n this.paste();\r\n return;\r\n }\r\n if ((e.ctrlKey && e.code === 'KeyC') || (e.metaKey && e.code === 'KeyC')) {\r\n this.copy();\r\n this.isCut = false;\r\n return;\r\n }\r\n // CTRL+X/Command+X\r\n if ((e.ctrlKey && e.code === 'KeyX') || (e.metaKey && e.code === 'KeyX')) {\r\n this.isCut = true;\r\n this.copy();\r\n return;\r\n }\r\n // CTRL+A/Command+A\r\n if ((e.ctrlKey && e.code === 'KeyA') || (e.metaKey && e.code === 'KeyA')) {\r\n e.preventDefault();\r\n this.selectAll();\r\n }\r\n if (e.code === 'ArrowLeft' || (e.shiftKey && e.code === 'Tab')) {\r\n e.preventDefault();\r\n this.moveFocus('LEFT');\r\n return;\r\n }\r\n if (e.code === 'ArrowUp') {\r\n e.preventDefault();\r\n this.moveFocus('TOP');\r\n return;\r\n }\r\n if (e.code === 'ArrowRight' || e.code === 'Tab') {\r\n e.preventDefault();\r\n this.moveFocus('RIGHT');\r\n return;\r\n }\r\n if (e.code === 'ArrowDown') {\r\n e.preventDefault();\r\n this.moveFocus('BOTTOM');\r\n return;\r\n }\r\n if (e.code === 'Delete' || e.code === 'Backspace') {\r\n e.preventDefault();\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.clearSelectedData(xArr, yArr);\r\n return;\r\n }\r\n });\r\n this.ctx.on('contextMenuClearSelected', () => {\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.clearSelectedData(xArr, yArr);\r\n });\r\n this.ctx.on('contextMenuCopy', () => {\r\n this.copy();\r\n });\r\n this.ctx.on('contextMenuPaste', () => {\r\n this.paste();\r\n });\r\n this.ctx.on('contextMenuCut', () => {\r\n this.isCut = true;\r\n this.copy();\r\n });\r\n //解耦:外部调用选择单元格\r\n this.ctx.on('setSelectorCell', (cell: Cell) => {\r\n this.ctx.setFocusCell(cell);\r\n this.click();\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.ctx.selectorMove = false;\r\n this.stopAdjustPosition();\r\n });\r\n }\r\n private setSelector(xArr: number[], yArr: number[]) {\r\n const { ENABLE_SELECTOR_SPAN_COL, ENABLE_SELECTOR_SPAN_ROW } = this.ctx.config;\r\n let _xArr = xArr;\r\n let _yArr = yArr;\r\n if (!ENABLE_SELECTOR_SPAN_ROW) {\r\n const [rowstart] = _yArr;\r\n _yArr = [rowstart, rowstart];\r\n }\r\n if (!ENABLE_SELECTOR_SPAN_COL) {\r\n const [colstart] = _xArr;\r\n _xArr = [colstart, colstart];\r\n }\r\n // 减少渲染\r\n if (\r\n JSON.stringify(this.ctx.selector.xArr) !== JSON.stringify(_xArr) ||\r\n JSON.stringify(this.ctx.selector.yArr) !== JSON.stringify(_yArr)\r\n ) {\r\n if (this.ctx.mousedown) {\r\n this.ctx.selectorMove = true;\r\n }\r\n this.ctx.selector.enable = true;\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n let [minX, maxX] = _xArr;\r\n let [minY, maxY] = _yArr;\r\n if (minX < areaMinX) {\r\n return;\r\n }\r\n if (maxX > areaMaxX) {\r\n return;\r\n }\r\n if (minY < areaMinY) {\r\n return;\r\n }\r\n if (maxY > areaMaxY) {\r\n return;\r\n }\r\n // 聚焦,解决iframe键盘事件不触发\r\n this.ctx.stageElement.focus({ preventScroll: true });\r\n // 启用合并单元格关联\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK) {\r\n const adjustMerge = this.adjustMergeCells(_xArr, _yArr);\r\n // 合并单元格时,调整选择器的位置\r\n minY = adjustMerge.yArr[0];\r\n maxY = adjustMerge.yArr[1];\r\n minX = adjustMerge.xArr[0];\r\n maxX = adjustMerge.xArr[1];\r\n // 只有一个合并单元格时\r\n this.ctx.onlyMergeCell = adjustMerge.onlyMergeCell;\r\n }\r\n if (minX === maxX && minY === maxY) {\r\n this.ctx.selectOnlyOne = true;\r\n } else {\r\n this.ctx.selectOnlyOne = false;\r\n }\r\n _xArr = [Math.max(areaMinX, minX), Math.min(areaMaxX, maxX)];\r\n _yArr = [Math.max(areaMinY, minY), Math.min(areaMaxY, maxY)];\r\n // 调整选择器的位置前回调\r\n const { BEFORE_SET_SELECTOR_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_SET_SELECTOR_METHOD === 'function') {\r\n const beforeSetSelectorMethod: BeforeSetSelectorMethod = BEFORE_SET_SELECTOR_METHOD;\r\n const res = beforeSetSelectorMethod({\r\n focusCell: this.ctx.focusCell,\r\n xArr: _xArr,\r\n yArr: _yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n _xArr = res.xArr;\r\n _yArr = res.yArr;\r\n }\r\n this.ctx.selector.xArr = _xArr;\r\n this.ctx.selector.yArr = _yArr;\r\n this.ctx.emit('setSelector', this.ctx.selector);\r\n this.ctx.emit('drawView');\r\n }\r\n }\r\n private adjustMergeCells(xArr: number[], yArr: number[]) {\r\n const [minY, maxY] = yArr;\r\n const [minX, maxX] = xArr;\r\n let topBottomCells: Cell[] = [];\r\n let leftRightCells: Cell[] = [];\r\n // 遍历选择中的单元格\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const rowIndex = ri + yArr[0];\r\n const colIndex = ci + xArr[0];\r\n const cell = this.ctx.database.getVirtualBodyCell(rowIndex, colIndex);\r\n if (cell) {\r\n // 顶部和底部的单元格\r\n if (rowIndex === minY || rowIndex === maxY) {\r\n topBottomCells.push(cell);\r\n }\r\n // 左右的单元格\r\n if (colIndex === minX || colIndex === maxX) {\r\n leftRightCells.push(cell);\r\n }\r\n }\r\n }\r\n }\r\n const topBottomBoundary = topBottomCells.reduce(\r\n (prev, cell) => {\r\n const { yArr } = cell.getSpanInfo();\r\n const [topIndex, bottomIndex] = yArr;\r\n prev.minY = Math.min(prev.minY, topIndex);\r\n prev.maxY = Math.max(prev.maxY, bottomIndex);\r\n return prev;\r\n },\r\n {\r\n minY,\r\n maxY,\r\n },\r\n );\r\n const leftRightBoundary = leftRightCells.reduce(\r\n (prev, cell) => {\r\n const { xArr } = cell.getSpanInfo();\r\n const [leftIndex, rightIndex] = xArr;\r\n prev.minX = Math.min(prev.minX, leftIndex);\r\n prev.maxX = Math.max(prev.maxX, rightIndex);\r\n return prev;\r\n },\r\n {\r\n minX,\r\n maxX,\r\n },\r\n );\r\n const _xArr = [leftRightBoundary.minX, leftRightBoundary.maxX];\r\n const _yArr = [topBottomBoundary.minY, topBottomBoundary.maxY];\r\n let onlyMergeCell = false;\r\n // Check if the selected area is a single merged cell\r\n if (leftRightBoundary.minX !== leftRightBoundary.maxX || topBottomBoundary.minY !== topBottomBoundary.maxY) {\r\n const selectorStr = JSON.stringify(_xArr) + JSON.stringify(_yArr);\r\n const spanInfo = this.ctx.focusCell?.getSpanInfo();\r\n const spanStr = spanInfo && JSON.stringify(spanInfo.xArr) + JSON.stringify(spanInfo.yArr);\r\n onlyMergeCell = spanStr === selectorStr;\r\n }\r\n return {\r\n xArr: _xArr,\r\n yArr: _yArr,\r\n onlyMergeCell,\r\n };\r\n }\r\n private selectCols(cell: CellHeader) {\r\n // 启用单选就不能批量选中\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n if (!this.ctx.config.ENABLE_SELECTOR_ALL_ROWS) {\r\n return;\r\n }\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n // 如果是拖拽改变列宽就不处理\r\n if (this.ctx.columnResizing) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n // 是可操作列就全选\r\n if (cell.operation) {\r\n this.selectAll();\r\n return;\r\n }\r\n const { SELECTOR_AREA_MIN_Y, SELECTOR_AREA_MAX_Y, SELECTOR_AREA_MAX_Y_OFFSET } = this.ctx.config;\r\n const minY = SELECTOR_AREA_MIN_Y;\r\n const maxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n if (this.ctx.mousedown && this.ctx.focusCellHeader) {\r\n const { colIndex } = this.ctx.focusCellHeader;\r\n //\r\n this.ctx.clearSelector();\r\n if (cell.colIndex >= colIndex) {\r\n const xArr = [colIndex, cell.colIndex + cell.colspan - 1];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n } else {\r\n const xArr = [cell.colIndex, colIndex];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n } else {\r\n // this.setFocusCellHeader(cell);\r\n const xArr = [cell.colIndex, cell.colIndex + cell.colspan - 1];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n private selectAll() {\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n // 只有两个全选启用了才能全选\r\n const { ENABLE_SELECTOR_ALL_ROWS, ENABLE_SELECTOR_ALL_COLS } = this.ctx.config;\r\n if (ENABLE_SELECTOR_ALL_ROWS && ENABLE_SELECTOR_ALL_COLS) {\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const minX = SELECTOR_AREA_MIN_X;\r\n const maxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const minY = SELECTOR_AREA_MIN_Y;\r\n const maxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n const xArr = [minX, maxX];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n private selectRows(cell: Cell, isSetFocus = true) {\r\n // 启用单选就不能批量选中\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n if (!this.ctx.config.ENABLE_SELECTOR_ALL_COLS) {\r\n return;\r\n }\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n const { SELECTOR_AREA_MIN_X, SELECTOR_AREA_MAX_X, SELECTOR_AREA_MAX_X_OFFSET } = this.ctx.config;\r\n const maxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const minX = SELECTOR_AREA_MIN_X;\r\n if (isSetFocus) {\r\n this.ctx.setFocusCell(cell);\r\n const xArr = [minX, maxX];\r\n const yArr = [cell.rowIndex, cell.rowIndex];\r\n this.setSelector(xArr, yArr);\r\n }\r\n if (this.ctx.focusCell && this.ctx.mousedown) {\r\n const { rowIndex } = this.ctx.focusCell;\r\n if (cell.rowIndex >= rowIndex) {\r\n const xArr = [minX, maxX];\r\n const yArr = [rowIndex, cell.rowIndex];\r\n this.setSelector(xArr, yArr);\r\n } else {\r\n const xArr = [minX, maxX];\r\n const yArr = [cell.rowIndex, rowIndex];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n }\r\n\r\n private mouseenter() {\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n const { mousedown, focusCell, hoverCell } = this.ctx;\r\n if (mousedown && focusCell && hoverCell) {\r\n const { rowIndex, colIndex } = focusCell;\r\n const minX = Math.min(hoverCell.colIndex, colIndex);\r\n const maxX = Math.max(hoverCell.colIndex, colIndex);\r\n const minY = Math.min(hoverCell.rowIndex, rowIndex);\r\n const maxY = Math.max(hoverCell.rowIndex, rowIndex);\r\n const xArr = [minX, maxX];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n private click(shiftKey = false) {\r\n const { focusCell, clickCell } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 超过范围值就不处理\r\n if (!this.isInSettingRange(focusCell.rowIndex, focusCell.colIndex)) {\r\n return;\r\n }\r\n this.ctx.selector.enable = true;\r\n if (clickCell && shiftKey) {\r\n // 启用单选就不能批量选中\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n // shiftKey快捷选中\r\n const { colIndex, rowIndex } = clickCell;\r\n const { colIndex: oldX, rowIndex: oldY } = focusCell;\r\n const minX = Math.min(oldX, colIndex);\r\n const maxX = Math.max(oldX, colIndex);\r\n const minY = Math.min(oldY, rowIndex);\r\n const maxY = Math.max(oldY, rowIndex);\r\n const xArr = [minX, maxX];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n } else {\r\n this.ctx.emit('cellSelectedClick', focusCell);\r\n const xArr = [focusCell.colIndex, focusCell.colIndex];\r\n const yArr = [focusCell.rowIndex, focusCell.rowIndex];\r\n this.setSelector(xArr, yArr);\r\n this.adjustBoundaryPosition();\r\n }\r\n }\r\n\r\n private clearCopyLine() {\r\n this.ctx.selector.xArrCopy = [-1, -1];\r\n this.ctx.selector.yArrCopy = [-1, -1];\r\n }\r\n /**\r\n * 获取选中单元格\r\n * @param rowIndex\r\n * @param colIndex\r\n * @returns\r\n */\r\n private getCell(rowIndex: number, colIndex: number) {\r\n // 设置选中FocusCell\r\n const row = this.ctx.body.renderRows.find((row) => row.rowIndex === rowIndex);\r\n const cell = row?.cells.find((cell: { colIndex: number }) => cell.colIndex === colIndex);\r\n return cell;\r\n }\r\n /**\r\n * 复制\r\n * @returns\r\n */\r\n private copy() {\r\n if (!this.ctx.config.ENABLE_COPY) {\r\n return;\r\n }\r\n // dom选中时会阻止复制\r\n if (this.ctx.domSelectionStr) {\r\n return;\r\n }\r\n let { value, xArr, yArr } = this.ctx.getSelectedData();\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.database.hasMergeCell(xArr, yArr)) {\r\n if (this.ctx.onlyMergeCell && this.ctx.focusCell) {\r\n const cell = this.ctx.focusCell;\r\n value = [[cell.getValue()]];\r\n xArr = [cell.colIndex, cell.colIndex];\r\n yArr = [cell.rowIndex, cell.rowIndex];\r\n } else {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_COPY',\r\n message: 'Merged cells cannot span copy data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n }\r\n // 复制前回调\r\n const { BEFORE_COPY_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_COPY_METHOD === 'function') {\r\n const beforeCopyMethod: BeforeCopyMethod = BEFORE_COPY_METHOD;\r\n const res = beforeCopyMethod({\r\n focusCell: this.ctx.focusCell,\r\n data: value,\r\n xArr,\r\n yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n value = res.data;\r\n }\r\n const text = encodeToSpreadsheetStr(value);\r\n if (navigator.clipboard) {\r\n navigator.clipboard\r\n .writeText(text)\r\n .then(() => {\r\n // 处理复制线\r\n this.ctx.selector.xArrCopy = this.ctx.selector.xArr.slice();\r\n this.ctx.selector.yArrCopy = this.ctx.selector.yArr.slice();\r\n this.ctx.emit('copyChange', {\r\n xArr: this.ctx.selector.xArrCopy,\r\n yArr: this.ctx.selector.yArrCopy,\r\n data: value,\r\n });\r\n this.ctx.emit('draw');\r\n })\r\n .catch((error) => console.error('Copy Failure:', error));\r\n } else {\r\n console.error('current browser does not support the Clipboard API');\r\n }\r\n }\r\n clearSelectedData(xArr: number[], yArr: number[], ignoreSet = false, value = null) {\r\n let changeList: ChangeItem[] = [];\r\n const rowKeyList: Set<string> = new Set();\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const _rowIndex = ri + yArr[0];\r\n const _colIndex = ci + xArr[0];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(_rowIndex, _colIndex);\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return [];\r\n }\r\n // 忽略设置,只返回数据,用于cut\r\n if (ignoreSet) {\r\n return changeList;\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.database.batchSetItemValue(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('clearSelectedDataChange', changeList, rows);\r\n return changeList;\r\n }\r\n private paste() {\r\n if (!navigator.clipboard) {\r\n console.error('current browser does not support the Clipboard API');\r\n return;\r\n }\r\n const { ENABLE_PASTER } = this.ctx.config;\r\n if (this.ctx.selector.enable && ENABLE_PASTER) {\r\n const rowIndex = this.ctx.selector.yArr[0];\r\n const colIndex = this.ctx.selector.xArr[0];\r\n const rowKeyList: Set<string> = new Set();\r\n navigator.clipboard\r\n .readText()\r\n .then(async (val) => {\r\n let textArr = decodeSpreadsheetStr(val);\r\n const _xArr = [colIndex, colIndex + textArr[0].length - 1];\r\n const _yArr = [rowIndex, rowIndex + textArr.length - 1];\r\n const [minY, maxY] = _yArr;\r\n const [minX, maxX] = _xArr;\r\n const overflowRowCount = maxY - this.ctx.maxRowIndex;\r\n const overflowColCount = maxX - this.ctx.maxColIndex;\r\n // 粘贴溢出回调处理\r\n if (overflowRowCount > 0 || overflowColCount > 0) {\r\n this.ctx.emit('onPastedDataOverflow', {\r\n maxY,\r\n maxX,\r\n minY,\r\n minX,\r\n overflowRowCount,\r\n overflowColCount,\r\n textArr,\r\n });\r\n }\r\n // textArr只有一个\r\n const isOneData = textArr.length === 1 && textArr[0].length === 1;\r\n // 启用合并时禁用粘贴填充\r\n if (\r\n this.ctx.config.ENABLE_MERGE_CELL_LINK &&\r\n this.ctx.database.hasMergeCell(_xArr, _yArr) &&\r\n !isOneData\r\n ) {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_PASTE',\r\n message: 'Merged cells cannot span paste data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n let changeList: ChangeItem[] = [];\r\n for (let ri = 0; ri <= textArr.length - 1; ri++) {\r\n const len = textArr[ri].length;\r\n for (let ci = 0; ci <= len - 1; ci++) {\r\n const _rowIndex = ri + rowIndex;\r\n const _colIndex = ci + colIndex;\r\n const value = textArr[ri][ci];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(\r\n _rowIndex,\r\n _colIndex,\r\n );\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 剪切时清除选中数据\r\n if (this.isCut) {\r\n const cutList = this.clearSelectedData(\r\n this.ctx.selector.xArrCopy,\r\n this.ctx.selector.yArrCopy,\r\n true, // 忽略设置,只返回数据,用于cut,实现历史回退需要返回两次问题\r\n );\r\n const changeListRowkeys = changeList.map((item) => `${item.rowKey}-${item.key}`);\r\n // 剔除剪切的数据\r\n cutList.forEach((item) => {\r\n if (!changeListRowkeys.includes(`${item.rowKey}-${item.key}`)) {\r\n // 剪切的数据放在最前面\r\n changeList.unshift(item);\r\n }\r\n });\r\n this.isCut = false;\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return;\r\n }\r\n // 剪贴板内容改变前回调\r\n const { BEFORE_PASTE_DATA_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_PASTE_DATA_METHOD === 'function') {\r\n const beforePasteDataMethod: BeforePasteDataMethod = BEFORE_PASTE_DATA_METHOD;\r\n const _changeList = changeList.map((item) => ({\r\n rowKey: item.rowKey,\r\n key: item.key,\r\n value: item.value,\r\n oldValue: this.ctx.database.getItemValue(item.rowKey, item.key),\r\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\r\n }));\r\n changeList = await beforePasteDataMethod(_changeList, _xArr, _yArr, textArr);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 清除复制线\r\n this.clearCopyLine();\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('pasteChange', changeList, rows);\r\n })\r\n .catch((error) => {\r\n console.error('Failed to get the clipboard content:', error);\r\n });\r\n }\r\n }\r\n /**键盘上下左右切换\r\n * @param dir\r\n */\r\n private moveFocus(dir: 'LEFT' | 'TOP' | 'RIGHT' | 'BOTTOM') {\r\n // 编辑状态不处理\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n const { focusCell } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n let { colIndex = 0, rowIndex = 0 } = focusCell;\r\n const minX = 0;\r\n const minY = 0;\r\n const maxX = this.ctx.maxColIndex;\r\n const maxY = this.ctx.maxRowIndex;\r\n switch (dir) {\r\n case 'LEFT':\r\n if (colIndex > minX) {\r\n colIndex--;\r\n }\r\n break;\r\n case 'TOP':\r\n if (rowIndex > minY) {\r\n rowIndex--;\r\n }\r\n break;\r\n case 'RIGHT':\r\n if (colIndex < maxX) {\r\n colIndex++;\r\n }\r\n break;\r\n case 'BOTTOM':\r\n if (rowIndex < maxY) {\r\n rowIndex++;\r\n }\r\n break;\r\n default:\r\n }\r\n const xArr = [colIndex, colIndex];\r\n const yArr = [rowIndex, rowIndex];\r\n const cell = this.getCell(rowIndex, colIndex);\r\n if (!cell) {\r\n return;\r\n }\r\n // 操作列不处理\r\n if (cell.operation) {\r\n return;\r\n }\r\n // 超过范围值就不处理,防止跳动\r\n if (!this.isInSettingRange(cell.rowIndex, cell.colIndex)) {\r\n return;\r\n }\r\n this.ctx.setFocusCell(cell);\r\n this.setSelector(xArr, yArr);\r\n this.adjustBoundaryPosition();\r\n this.ctx.emit('moveFocus', cell);\r\n this.ctx.emit('draw');\r\n }\r\n private stopAdjustPosition() {\r\n this.adjustPositionX = '';\r\n this.adjustPositionY = '';\r\n if (this.timerX) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n if (this.timerY) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n }\r\n // 判断是否在设置范围内\r\n private isInSettingRange(rowIndex: number, colIndex: number) {\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n if (colIndex < areaMinX) {\r\n return false;\r\n }\r\n if (colIndex > areaMaxX) {\r\n return false;\r\n }\r\n if (rowIndex < areaMinY) {\r\n return false;\r\n }\r\n if (rowIndex > areaMaxY) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n /**\r\n * 调整滚动条位置,让到达边界时自动滚动\r\n */\r\n private startAdjustPosition(e: MouseEvent) {\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n let positionX = '';\r\n let positionY = '';\r\n if (offsetX < 0) {\r\n positionX = 'left';\r\n } else if (offsetX > this.ctx.body.visibleWidth) {\r\n positionX = 'right';\r\n }\r\n if (offsetY < this.ctx.header.visibleHeight) {\r\n positionY = 'top';\r\n } else if (offsetY > this.ctx.header.visibleHeight + this.ctx.body.visibleHeight) {\r\n positionY = 'bottom';\r\n }\r\n if (positionX && this.adjustPositionX !== positionX) {\r\n this.adjustPositionX = positionX;\r\n const position = positionX === 'left' ? -1 : 1;\r\n let scrollSpeedX = 10 * position; // 滚动速度\r\n if (this.timerX) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n this.timerX = setInterval(() => {\r\n // 增加滚动速度\r\n scrollSpeedX *= 1.5; // 加速因子\r\n const { scrollX } = this.ctx;\r\n const num = scrollX + scrollSpeedX;\r\n if (num < 0 || num > this.ctx.body.width) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n this.ctx.setScrollX(num);\r\n }, 100); // 每100毫秒执行一次\r\n }\r\n\r\n if (positionY && this.adjustPositionY !== positionY) {\r\n this.adjustPositionY = positionY;\r\n const position = positionY === 'top' ? -1 : 1;\r\n let scrollSpeedY = 10 * position; // 滚动速度\r\n if (this.timerY) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n this.timerY = setInterval(() => {\r\n // 增加滚动速度\r\n scrollSpeedY *= 1.5; // 加速因子\r\n const { scrollY } = this.ctx;\r\n const num = scrollY + scrollSpeedY;\r\n if (num < 0 || num > this.ctx.body.height) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n this.ctx.setScrollY(num);\r\n }, 100); // 每100毫秒执行一次\r\n }\r\n }\r\n /**\r\n * 调整滚动条位置,让焦点单元格始终出现在可视区域内\r\n */\r\n private adjustBoundaryPosition() {\r\n const {\r\n stageHeight,\r\n stageWidth,\r\n focusCell,\r\n fixedRightWidth,\r\n fixedLeftWidth,\r\n header,\r\n footer,\r\n body,\r\n scrollX,\r\n scrollY,\r\n config: { SCROLLER_TRACK_SIZE, FOOTER_FIXED, FOOTER_POSITION, ENABLE_MERGE_CELL_LINK },\r\n } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 处理合并的单元格的移动\r\n if (ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n focusCell.updateSpanInfo();\r\n }\r\n const { drawX, drawY, width, height, fixed } = focusCell;\r\n // 加1补选中框的边框,且可以移动滚动,以为getCell是获取渲染的cell\r\n const diffLeft = fixedLeftWidth - drawX + 1;\r\n const diffRight = focusCell.drawX + width - (stageWidth - fixedRightWidth) + 1;\r\n let diffTop = header.height - drawY;\r\n // 格子大于可视高度就取可视高度,防止上下跳动\r\n let cellheight = height;\r\n if (cellheight > body.visibleHeight) {\r\n cellheight = body.visibleHeight;\r\n }\r\n let footerHeight = 0;\r\n if (FOOTER_FIXED) {\r\n if (FOOTER_POSITION === 'top') {\r\n diffTop = header.height + footer.height - drawY;\r\n } else {\r\n footerHeight = footer.visibleHeight;\r\n }\r\n }\r\n const diffBottom = drawY + cellheight - (stageHeight - footerHeight - SCROLLER_TRACK_SIZE);\r\n let _scrollX = scrollX;\r\n let _scrollY = scrollY;\r\n // fixed禁用左右横向移动\r\n if (diffRight > 0 && !fixed) {\r\n _scrollX = Math.floor(scrollX + diffRight);\r\n } else if (diffLeft > 0 && !fixed) {\r\n _scrollX = Math.floor(scrollX - diffLeft);\r\n }\r\n if (diffTop > 0) {\r\n _scrollY = Math.floor(scrollY - diffTop);\r\n } else if (diffBottom > 0) {\r\n _scrollY = Math.floor(scrollY + diffBottom);\r\n }\r\n // >1是因为上面为了可移动加1,所以这里要大于2(保险一点)\r\n if (Math.abs(scrollX - _scrollX) > 2 || Math.abs(scrollY - _scrollY) > 2) {\r\n this.ctx.adjustPositioning = true;\r\n this.ctx.setScroll(_scrollX, _scrollY);\r\n // fix:处理移动后编辑器,需要再点击一次,编辑器那边有监听\r\n this.ctx.emit('adjustBoundaryPosition', focusCell);\r\n }\r\n }\r\n destroy() {\r\n if (this.timerX) {\r\n clearTimeout(this.timerX);\r\n this.timerX = 0;\r\n }\r\n if (this.timerY) {\r\n clearTimeout(this.timerY);\r\n this.timerY = 0;\r\n }\r\n }\r\n}\r\n","import type Context from './Context';\r\nimport Cell from './Cell';\r\nimport { BeforeSetAutofillMethod, ErrorType } from './types';\r\nexport default class Autofill {\r\n private ctx: Context;\r\n private maxColRowCell: Cell | undefined;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('mousemove', (e) => {\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n this.ctx.stageElement.style.cursor = 'default';\r\n }\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n if (!this.ctx.focusCell) {\r\n return;\r\n }\r\n if (!this.maxColRowCell) {\r\n return;\r\n }\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n const { colIndex, rowIndex, drawX, drawY, width, height } = this.maxColRowCell;\r\n const pointWh = 6;\r\n const offset = colIndex === this.ctx.maxColIndex || rowIndex === this.ctx.maxRowIndex ? 0 : 2;\r\n const pointX = drawX + width - pointWh + offset;\r\n const pointY = drawY + height - pointWh + offset;\r\n if (offsetX > pointX && offsetY > pointY && offsetX < pointX + pointWh && offsetY < pointY + pointWh) {\r\n // 引进到点\r\n this.ctx.stageElement.style.cursor = 'crosshair';\r\n }\r\n });\r\n this.ctx.on('cellMouseenter', (cell) => {\r\n const { xArr, yArr } = this.ctx.selector;\r\n const maxX = xArr[1];\r\n const maxY = yArr[1];\r\n const { colIndex, rowIndex } = cell;\r\n if (this.ctx.config.ENABLE_AUTOFILL && colIndex === maxX && rowIndex === maxY) {\r\n this.maxColRowCell = cell;\r\n }\r\n this.mouseenter(cell);\r\n });\r\n this.ctx.on('mousedown', () => {\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n this.setMousedown();\r\n }\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.setMouseUp();\r\n });\r\n }\r\n /**\r\n * 是否在填充\r\n * @returns\r\n */\r\n private isAutofillIng() {\r\n const { xArr, yArr } = this.ctx.selector;\r\n // 两个相等\r\n if (\r\n JSON.stringify(this.ctx.autofill.xArr) === JSON.stringify(xArr) &&\r\n JSON.stringify(this.ctx.autofill.yArr) === JSON.stringify(yArr)\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n private setMousedown() {\r\n this.ctx.autofill.enable = true;\r\n this.ctx.autofillMove = true;\r\n }\r\n private setMouseUp() {\r\n if (!this.ctx.autofill.enable) {\r\n return;\r\n }\r\n const isAutofillIng = this.isAutofillIng();\r\n if (isAutofillIng) {\r\n this.autofillData();\r\n }\r\n this.ctx.autofill.enable = false;\r\n this.ctx.autofillMove = false;\r\n this.ctx.autofill.xArr = [-1, -1];\r\n this.ctx.autofill.yArr = [-1, -1];\r\n }\r\n private setAutofill(xArr: number[], yArr: number[]) {\r\n const { ENABLE_AUTOFILL, ENABLE_SELECTOR_SPAN_COL, ENABLE_SELECTOR_SPAN_ROW } = this.ctx.config;\r\n if (!ENABLE_AUTOFILL) {\r\n return;\r\n }\r\n let _xArr = xArr;\r\n let _yArr = yArr;\r\n if (!ENABLE_SELECTOR_SPAN_ROW) {\r\n const [rowstart] = _yArr;\r\n _yArr = [rowstart, rowstart];\r\n }\r\n if (!ENABLE_SELECTOR_SPAN_COL) {\r\n const [colstart] = _xArr;\r\n _xArr = [colstart, colstart];\r\n }\r\n // 减少渲染\r\n if (\r\n JSON.stringify(this.ctx.autofill.xArr) !== JSON.stringify(_xArr) ||\r\n JSON.stringify(this.ctx.autofill.yArr) !== JSON.stringify(_yArr)\r\n ) {\r\n // 范围值和选择器的一致\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n let [minX, maxX] = _xArr;\r\n let [minY, maxY] = _yArr;\r\n if (minX < areaMinX) {\r\n return;\r\n }\r\n if (minY < areaMinY) {\r\n return;\r\n }\r\n _xArr = [Math.max(areaMinX, minX), Math.min(areaMaxX, maxX)];\r\n _yArr = [Math.max(areaMinY, minY), Math.min(areaMaxY, maxY)];\r\n // 调整选择器的位置前回调\r\n const { BEFORE_SET_AUTOFILL_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_SET_AUTOFILL_METHOD === 'function') {\r\n const beforeSetAutofillMethod: BeforeSetAutofillMethod = BEFORE_SET_AUTOFILL_METHOD;\r\n const res = beforeSetAutofillMethod({\r\n focusCell: this.ctx.focusCell,\r\n xArr: _xArr,\r\n yArr: _yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n _xArr = res.xArr;\r\n _yArr = res.yArr;\r\n }\r\n this.ctx.autofill.xArr = _xArr;\r\n this.ctx.autofill.yArr = _yArr;\r\n this.ctx.emit('setAutofill', this.ctx.autofill);\r\n this.ctx.emit('draw');\r\n }\r\n }\r\n /**\r\n * 填充数据\r\n */\r\n private async autofillData() {\r\n const rowKeyList: Set<string> = new Set();\r\n const selector = this.ctx.getSelectedData();\r\n // 存复制赋值的位置,用于剔除填充\r\n const selectorIndexMap = new Map();\r\n for (let ri = 0; ri <= selector.yArr[1] - selector.yArr[0]; ri++) {\r\n for (let ci = 0; ci <= selector.xArr[1] - selector.xArr[0]; ci++) {\r\n const rowIndex = ri + selector.yArr[0];\r\n const colIndex = ci + selector.xArr[0];\r\n selectorIndexMap.set(`${rowIndex}-${colIndex}`, true);\r\n }\r\n }\r\n const { value } = selector;\r\n const xStep = value[0].length;\r\n const yStep = value.length;\r\n const xArr = this.ctx.autofill.xArr;\r\n const yArr = this.ctx.autofill.yArr;\r\n const isOneValue = xStep === 1 && yStep === 1;\r\n // 禁用跨越填充\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.database.hasMergeCell(xArr, yArr) && !isOneValue) {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_AUTOFILL',\r\n message: 'Merged cells cannot span autofill data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n let changeList = [];\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const colIndex = ci + xArr[0];\r\n const rowIndex = ri + yArr[0];\r\n const val = value[ri % yStep][ci % xStep];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n const selectorIndexKey = `${rowIndex}-${colIndex}`;\r\n if (itemValue && !selectorIndexMap.has(selectorIndexKey)) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value: val,\r\n row: {},\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return;\r\n }\r\n // 设置选择器为填充位置\r\n this.ctx.selector.xArr = this.ctx.autofill.xArr;\r\n this.ctx.selector.yArr = this.ctx.autofill.yArr;\r\n // 填充内容改变前回调\r\n const { BEFORE_AUTOFILL_DATA_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_AUTOFILL_DATA_METHOD === 'function') {\r\n const beforeAutofillDataMethod = BEFORE_AUTOFILL_DATA_METHOD;\r\n const _changeList = changeList.map((item) => ({\r\n rowKey: item.rowKey,\r\n key: item.key,\r\n value: item.value,\r\n oldValue: this.ctx.database.getItemValue(item.rowKey, item.key),\r\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\r\n }));\r\n changeList = await beforeAutofillDataMethod(_changeList, xArr, yArr);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('autofillChange', changeList, rows);\r\n }\r\n private mouseenter(cell: Cell) {\r\n if (['index', 'selection', 'index-selection'].includes(cell.type)) {\r\n return;\r\n }\r\n const { selector, autofill } = this.ctx;\r\n if (this.ctx.mousedown && selector.enable && autofill.enable) {\r\n const { rowIndex, colIndex } = cell;\r\n const xArr = selector.xArr.slice();\r\n const yArr = selector.yArr.slice();\r\n if (rowIndex >= selector.yArr[0] && rowIndex <= selector.yArr[1]) {\r\n if (colIndex > selector.xArr[1]) {\r\n xArr.splice(1, 1, colIndex);\r\n } else if (colIndex < selector.xArr[0]) {\r\n xArr.splice(0, 1, colIndex);\r\n }\r\n } else if (rowIndex > selector.yArr[1]) {\r\n yArr.splice(1, 1, rowIndex);\r\n } else if (rowIndex < selector.yArr[0]) {\r\n yArr.splice(0, 1, rowIndex);\r\n }\r\n this.setAutofill(xArr, yArr);\r\n }\r\n }\r\n destroy() {}\r\n}\r\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n x: v,\n y: v\n});\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n start: 'end',\n end: 'start'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\nconst yAxisSides = /*#__PURE__*/new Set(['top', 'bottom']);\nfunction getSideAxis(placement) {\n return yAxisSides.has(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const length = getAxisLength(alignmentAxis);\n let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\nconst lrPlacement = ['left', 'right'];\nconst rlPlacement = ['right', 'left'];\nconst tbPlacement = ['top', 'bottom'];\nconst btPlacement = ['bottom', 'top'];\nfunction getSideList(side, isStart, rtl) {\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rlPlacement : lrPlacement;\n return isStart ? lrPlacement : rlPlacement;\n case 'left':\n case 'right':\n return isStart ? tbPlacement : btPlacement;\n default:\n return [];\n }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n const alignment = getAlignment(placement);\n let list = getSideList(getSide(placement), direction === 'start', rtl);\n if (alignment) {\n list = list.map(side => side + \"-\" + alignment);\n if (flipAlignment) {\n list = list.concat(list.map(getOppositeAlignmentPlacement));\n }\n }\n return list;\n}\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\nfunction getPaddingObject(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\nfunction rectToClientRect(rect) {\n const {\n x,\n y,\n width,\n height\n } = rect;\n return {\n width,\n height,\n top: y,\n left: x,\n right: x + width,\n bottom: y + height,\n x,\n y\n };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const sideAxis = getSideAxis(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const alignLength = getAxisLength(alignmentAxis);\n const side = getSide(placement);\n const isVertical = sideAxis === 'y';\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const validMiddleware = middleware.filter(Boolean);\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let resetCount = 0;\n for (let i = 0; i < validMiddleware.length; i++) {\n const {\n name,\n fn\n } = validMiddleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = {\n ...middlewareData,\n [name]: {\n ...middlewareData[name],\n ...data\n }\n };\n if (reset && resetCount <= 50) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n x,\n y,\n width: rects.floating.width,\n height: rects.floating.height\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const initialSideAxis = getSideAxis(initialPlacement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n const ignoreCrossAxisOverflow = checkCrossAxis === 'alignment' ? initialSideAxis !== getSideAxis(nextPlacement) : false;\n if (!ignoreCrossAxisOverflow ||\n // We leave the current main axis only if every placement on that axis\n // overflows the main axis.\n overflowsData.every(d => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) {\n // Try next placement and re-run the lifecycle.\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n }\n\n // First, find the candidates that fit on the mainAxis side of overflow,\n // then find the placement that fits the best on the main crossAxis side.\n let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n // Otherwise fallback.\n if (!resetPlacement) {\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$filter2;\n const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n if (hasFallbackAxisSideDirection) {\n const currentSideAxis = getSideAxis(d.placement);\n return currentSideAxis === initialSideAxis ||\n // Create a bias to the `y` side axis due to horizontal\n // reading directions favoring greater width.\n currentSideAxis === 'y';\n }\n return true;\n }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n if (placement) {\n resetPlacement = placement;\n }\n break;\n }\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n }\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n return {};\n }\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'hide',\n options,\n async fn(state) {\n const {\n rects\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\nconst originSides = /*#__PURE__*/new Set(['left', 'top']);\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n const {\n placement,\n platform,\n elements\n } = state;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getSideAxis(placement) === 'y';\n const mainAxisMulti = originSides.has(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = evaluate(options, state);\n\n // eslint-disable-next-line prefer-const\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: rawValue.mainAxis || 0,\n crossAxis: rawValue.crossAxis || 0,\n alignmentAxis: rawValue.alignmentAxis\n };\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n if (options === void 0) {\n options = 0;\n }\n return {\n name: 'offset',\n options,\n async fn(state) {\n var _middlewareData$offse, _middlewareData$arrow;\n const {\n x,\n y,\n placement,\n middlewareData\n } = state;\n const diffCoords = await convertValueToCoords(state, options);\n\n // If the placement is the same and the arrow caused an alignment offset\n // then we don't need to change the positioning coordinates.\n if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: {\n ...diffCoords,\n placement\n }\n };\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'shift',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y,\n enabled: {\n [mainAxis]: checkMainAxis,\n [crossAxis]: checkCrossAxis\n }\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = originSides.has(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'size',\n options,\n async fn(state) {\n var _state$middlewareData, _state$middlewareData2;\n const {\n placement,\n rects,\n platform,\n elements\n } = state;\n const {\n apply = () => {},\n ...detectOverflowOptions\n } = evaluate(options, state);\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isYAxis = getSideAxis(placement) === 'y';\n const {\n width,\n height\n } = rects.floating;\n let heightSide;\n let widthSide;\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n const maximumClippingHeight = height - overflow.top - overflow.bottom;\n const maximumClippingWidth = width - overflow.left - overflow.right;\n const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n const noShift = !state.middlewareData.shift;\n let availableHeight = overflowAvailableHeight;\n let availableWidth = overflowAvailableWidth;\n if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n availableWidth = maximumClippingWidth;\n }\n if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n availableHeight = maximumClippingHeight;\n }\n if (noShift && !alignment) {\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n if (isYAxis) {\n availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n } else {\n availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n }\n }\n await apply({\n ...state,\n availableWidth,\n availableHeight\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n if (width !== nextDimensions.width || height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n return {};\n }\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","function hasWindow() {\n return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n if (isNode(node)) {\n return (node.nodeName || '').toLowerCase();\n }\n // Mocked nodes in testing environments may not be instances of Node. By\n // returning `#document` an infinite loop won't occur.\n // https://github.com/floating-ui/floating-ui/issues/2317\n return '#document';\n}\nfunction getWindow(node) {\n var _node$ownerDocument;\n return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n var _ref;\n return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n return false;\n }\n return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nconst invalidOverflowDisplayValues = /*#__PURE__*/new Set(['inline', 'contents']);\nfunction isOverflowElement(element) {\n const {\n overflow,\n overflowX,\n overflowY,\n display\n } = getComputedStyle(element);\n return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !invalidOverflowDisplayValues.has(display);\n}\nconst tableElements = /*#__PURE__*/new Set(['table', 'td', 'th']);\nfunction isTableElement(element) {\n return tableElements.has(getNodeName(element));\n}\nconst topLayerSelectors = [':popover-open', ':modal'];\nfunction isTopLayer(element) {\n return topLayerSelectors.some(selector => {\n try {\n return element.matches(selector);\n } catch (_e) {\n return false;\n }\n });\n}\nconst transformProperties = ['transform', 'translate', 'scale', 'rotate', 'perspective'];\nconst willChangeValues = ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter'];\nconst containValues = ['paint', 'layout', 'strict', 'content'];\nfunction isContainingBlock(elementOrCss) {\n const webkit = isWebKit();\n const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n return transformProperties.some(value => css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || willChangeValues.some(value => (css.willChange || '').includes(value)) || containValues.some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else if (isTopLayer(currentNode)) {\n return null;\n }\n currentNode = getParentNode(currentNode);\n }\n return null;\n}\nfunction isWebKit() {\n if (typeof CSS === 'undefined' || !CSS.supports) return false;\n return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nconst lastTraversableNodeNames = /*#__PURE__*/new Set(['html', 'body', '#document']);\nfunction isLastTraversableNode(node) {\n return lastTraversableNodeNames.has(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.scrollX,\n scrollTop: element.scrollY\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n const frameElement = getFrameElement(win);\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n }\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\nfunction getFrameElement(win) {\n return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","import { rectToClientRect, arrow as arrow$1, autoPlacement as autoPlacement$1, detectOverflow as detectOverflow$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\n// If <html> has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n const leftScroll = getNodeScroll(element).scrollLeft;\n if (!rect) {\n return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n }\n return rect.left + leftScroll;\n}\n\nfunction getHTMLOffset(documentElement, scroll, ignoreScrollbarX) {\n if (ignoreScrollbarX === void 0) {\n ignoreScrollbarX = false;\n }\n const htmlRect = documentElement.getBoundingClientRect();\n const x = htmlRect.left + scroll.scrollLeft - (ignoreScrollbarX ? 0 :\n // RTL <body> scrollbar.\n getWindowScrollBarX(documentElement, htmlRect));\n const y = htmlRect.top + scroll.scrollTop;\n return {\n x,\n y\n };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n elements,\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isFixed = strategy === 'fixed';\n const documentElement = getDocumentElement(offsetParent);\n const topLayer = elements ? isTopLayer(elements.floating) : false;\n if (offsetParent === documentElement || topLayer && isFixed) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = createCoords(1);\n const offsets = createCoords(0);\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll, true) : createCoords(0);\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nconst absoluteOrFixed = /*#__PURE__*/new Set(['absolute', 'fixed']);\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const visualOffsets = getVisualOffsets(element);\n rect = {\n x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y,\n width: clippingAncestor.width,\n height: clippingAncestor.height\n };\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && absoluteOrFixed.has(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n\n // If the <body> scrollbar appears on the left (e.g. RTL systems). Use\n // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n function setLeftRTLScrollbarOffset() {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n setLeftRTLScrollbarOffset();\n }\n }\n if (isFixed && !isOffsetParentAnElement && documentElement) {\n setLeftRTLScrollbarOffset();\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n let rawOffsetParent = element.offsetParent;\n\n // Firefox returns the <html> element as the offsetParent if it's non-static,\n // while Chrome and Safari return the <body> element. The <body> element must\n // be used to perform the correct calculations even if the <html> element is\n // non-static.\n if (getDocumentElement(element) === rawOffsetParent) {\n rawOffsetParent = rawOffsetParent.ownerDocument.body;\n }\n return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\nfunction rectsAreEqual(a, b) {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n let io = null;\n let timeoutId;\n const root = getDocumentElement(element);\n function cleanup() {\n var _io;\n clearTimeout(timeoutId);\n (_io = io) == null || _io.disconnect();\n io = null;\n }\n function refresh(skip, threshold) {\n if (skip === void 0) {\n skip = false;\n }\n if (threshold === void 0) {\n threshold = 1;\n }\n cleanup();\n const elementRectForRootMargin = element.getBoundingClientRect();\n const {\n left,\n top,\n width,\n height\n } = elementRectForRootMargin;\n if (!skip) {\n onMove();\n }\n if (!width || !height) {\n return;\n }\n const insetTop = floor(top);\n const insetRight = floor(root.clientWidth - (left + width));\n const insetBottom = floor(root.clientHeight - (top + height));\n const insetLeft = floor(left);\n const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n const options = {\n rootMargin,\n threshold: max(0, min(1, threshold)) || 1\n };\n let isFirstUpdate = true;\n function handleObserve(entries) {\n const ratio = entries[0].intersectionRatio;\n if (ratio !== threshold) {\n if (!isFirstUpdate) {\n return refresh();\n }\n if (!ratio) {\n // If the reference is clipped, the ratio is 0. Throttle the refresh\n // to prevent an infinite loop of updates.\n timeoutId = setTimeout(() => {\n refresh(false, 1e-7);\n }, 1000);\n } else {\n refresh(false, ratio);\n }\n }\n if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n // It's possible that even though the ratio is reported as 1, the\n // element is not actually fully within the IntersectionObserver's root\n // area anymore. This can happen under performance constraints. This may\n // be a bug in the browser's IntersectionObserver implementation. To\n // work around this, we compare the element's bounding rect now with\n // what it was at the time we created the IntersectionObserver. If they\n // are not equal then the element moved, so we refresh.\n refresh();\n }\n isFirstUpdate = false;\n }\n\n // Older browsers don't support a `document` as the root and will throw an\n // error.\n try {\n io = new IntersectionObserver(handleObserve, {\n ...options,\n // Handle <iframe>s\n root: root.ownerDocument\n });\n } catch (_e) {\n io = new IntersectionObserver(handleObserve, options);\n }\n io.observe(element);\n }\n refresh(true);\n return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n ancestorScroll = true,\n ancestorResize = true,\n elementResize = typeof ResizeObserver === 'function',\n layoutShift = typeof IntersectionObserver === 'function',\n animationFrame = false\n } = options;\n const referenceEl = unwrapElement(reference);\n const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n let reobserveFrame = -1;\n let resizeObserver = null;\n if (elementResize) {\n resizeObserver = new ResizeObserver(_ref => {\n let [firstEntry] = _ref;\n if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {\n // Prevent update loops when using the `size` middleware.\n // https://github.com/floating-ui/floating-ui/issues/1740\n resizeObserver.unobserve(floating);\n cancelAnimationFrame(reobserveFrame);\n reobserveFrame = requestAnimationFrame(() => {\n var _resizeObserver;\n (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n });\n }\n update();\n });\n if (referenceEl && !animationFrame) {\n resizeObserver.observe(referenceEl);\n }\n resizeObserver.observe(floating);\n }\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n if (animationFrame) {\n frameLoop();\n }\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) {\n update();\n }\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n update();\n return () => {\n var _resizeObserver2;\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n cleanupIo == null || cleanupIo();\n (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n resizeObserver = null;\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n // This caches the expensive `getClippingElementAncestors` function so that\n // multiple lifecycle resets re-use the same result. It only lives for a\n // single call. If other functions become expensive, we can add them as well.\n const cache = new Map();\n const mergedOptions = {\n platform,\n ...options\n };\n const platformWithCache = {\n ...mergedOptions.platform,\n _c: cache\n };\n return computePosition$1(reference, floating, {\n ...mergedOptions,\n platform: platformWithCache\n });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n","import Cell from './Cell';\nimport Context from './Context';\nimport { computePosition, offset, arrow, flip, shift } from '@floating-ui/dom';\nexport default class Tooltip {\n private ctx: Context;\n private enable = false;\n private contentEl: HTMLDivElement;\n private floatingEl: HTMLDivElement;\n private arrowEl: HTMLDivElement;\n constructor(ctx: Context) {\n this.ctx = ctx;\n const { TOOLTIP_BG_COLOR, TOOLTIP_TEXT_COLOR, TOOLTIP_ZINDEX, TOOLTIP_CUSTOM_STYLE, CSS_PREFIX } =\n this.ctx.config;\n this.contentEl = document.createElement('div');\n this.arrowEl = document.createElement('div');\n this.floatingEl = document.createElement('div');\n this.floatingEl.className = `${CSS_PREFIX}-tooltip`;\n this.contentEl.className = `${CSS_PREFIX}-tooltip-content`;\n this.arrowEl.className = `${CSS_PREFIX}-tooltip-arrow`;\n const floatingStyle = {\n display: 'none',\n position: 'absolute',\n background: TOOLTIP_BG_COLOR,\n color: TOOLTIP_TEXT_COLOR,\n boxSizing: 'border-box',\n zIndex: TOOLTIP_ZINDEX,\n padding: '8px',\n borderRadius: `4px`,\n fontSize: `12px`,\n ...TOOLTIP_CUSTOM_STYLE,\n };\n const arrowStyle = {\n position: 'absolute',\n width: '10px',\n height: '10px',\n background: floatingStyle.background,\n backgroundColor: floatingStyle.backgroundColor,\n transform: 'rotate(45deg)',\n zIndex: floatingStyle.zIndex,\n };\n Object.assign(this.arrowEl.style, arrowStyle);\n Object.assign(this.floatingEl.style, floatingStyle);\n this.floatingEl.appendChild(this.contentEl);\n this.floatingEl.appendChild(this.arrowEl);\n this.ctx.containerElement.appendChild(this.floatingEl);\n this.init();\n }\n private init() {\n this.floatingEl.addEventListener('mouseleave', () => {\n this.hide();\n });\n this.ctx.on('mouseout', (e) => {\n if (this.floatingEl.contains(e.relatedTarget as Node)) {\n return;\n }\n this.hide();\n });\n this.ctx.on('onScroll', () => {\n this.hide();\n });\n this.ctx.on('startEdit', () => {\n this.hide();\n });\n this.ctx.on('visibleCellHoverChange', (cell, e) => {\n const contains = this.floatingEl.contains(e.target);\n if (contains) {\n return;\n }\n // 有移除或者有错误message时显示\n if (cell.ellipsis || cell.message) {\n this.show(cell);\n }\n });\n this.ctx.on('visibleCellMouseleave', (_, e) => {\n const contains = this.floatingEl.contains(e.target);\n if (contains) {\n return;\n }\n this.hide();\n });\n this.ctx.on('cellHeaderMouseleave', (_, e) => {\n const contains = this.floatingEl.contains(e.target);\n if (contains) {\n return;\n }\n this.hide();\n });\n this.ctx.on('cellHeaderHoverChange', (cell, e) => {\n const contains = this.floatingEl.contains(e.target);\n if (contains) {\n return;\n }\n if (cell.ellipsis) {\n this.show(cell);\n }\n });\n }\n private show(cell: Cell) {\n // 如果没有设置overflowTooltipShow=true,则不显示\n if (!cell.overflowTooltipShow) {\n return;\n }\n // 如果是鼠标按下状态,则不显示\n if (this.ctx.mousedown) {\n return;\n }\n this.floatingEl.style.display = 'block';\n let text = cell.getText();\n // 如果有message,则显示message\n if (cell.message) {\n text = cell.message;\n }\n const targetRect = this.ctx.containerElement.getBoundingClientRect();\n if (!targetRect) {\n return;\n }\n this.enable = true;\n // 设置最大宽度\n this.contentEl.style.maxWidth = `${cell.overflowTooltipMaxWidth || 500}px`;\n this.contentEl.style.minWidth = '100px';\n this.contentEl.style.width = '100%';\n this.contentEl.style.display = 'inline-block';\n this.contentEl.style.wordBreak = 'break-all';\n this.contentEl.style.lineHeight = '1.5';\n this.contentEl.innerText = text;\n const cellX = cell.drawX + targetRect.x;\n const cellY = cell.drawY + targetRect.y;\n // 这个是相对于视口的位置\n const virtualEl = {\n getBoundingClientRect() {\n return {\n width: cell.visibleWidth,\n height: cell.visibleHeight,\n x: cellX,\n y: cellY,\n left: cellX,\n right: cellX + cell.visibleWidth,\n top: cellY,\n bottom: cellY + cell.visibleHeight,\n };\n },\n };\n\n computePosition(virtualEl, this.floatingEl, {\n placement: cell.overflowTooltipPlacement,\n middleware: [shift(), flip(), offset(6), arrow({ element: this.arrowEl })],\n }).then((val) => {\n const { x, y, placement, middlewareData } = val;\n Object.assign(this.floatingEl.style, {\n top: `${y}px`,\n left: `${x}px`,\n });\n if (middlewareData.arrow) {\n const arrow = middlewareData.arrow;\n if (['left', 'left-start', 'left-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `${arrow.y}px`,\n bottom: '',\n left: '',\n right: `-5px`,\n });\n } else if (['right', 'right-start', 'right-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `${arrow.y}px`,\n bottom: '',\n left: `-5px`,\n right: '',\n });\n } else if (['bottom', 'bottom-start', 'bottom-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `-5px`,\n bottom: '',\n left: `${arrow.x}px`,\n right: '',\n });\n } else if (['top', 'top-start', 'top-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: '',\n bottom: `-5px`,\n left: `${arrow.x}px`,\n right: '',\n });\n }\n }\n });\n }\n hide() {\n if (!this.enable) {\n return;\n }\n this.enable = false;\n this.floatingEl.style.display = 'none';\n }\n destroy() {\n this.contentEl.remove();\n this.arrowEl.remove();\n this.floatingEl.remove();\n }\n}\n","import type Cell from './Cell';\r\nimport type Context from './Context';\r\n\r\nexport default class Editor {\r\n private editorEl!: HTMLDivElement;\r\n private inputEl!: HTMLTextAreaElement;\r\n private enable = false;\r\n private cellTarget: Cell | null = null;\r\n private selectorArrStr = '';\r\n ctx: Context;\r\n private drawY = 0;\r\n private drawX = 0;\r\n private cancel = false;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.initTextEditor();\r\n this.init();\r\n }\r\n private init() {\r\n // 容器不聚焦,清除选择器\r\n this.ctx.on('outsideMousedown', () => {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n if (this.cellTarget.editorType === 'text') {\r\n this.clearEditor();\r\n }\r\n });\r\n this.ctx.on('moveFocus', (cell) => {\r\n this.cellTarget = cell;\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n });\r\n // 滚动时,结束编辑\r\n this.ctx.on('onScroll', () => {\r\n if (this.enable) {\r\n this.doneEdit();\r\n }\r\n });\r\n this.ctx.on('cellHeaderMousedown', () => {\r\n if (this.enable) {\r\n this.doneEdit();\r\n }\r\n this.cellTarget = null;\r\n });\r\n this.ctx.on('hoverIconClick', (cell) => {\r\n // 没有编辑器就不进入编辑模式\r\n if (cell.editorType === 'none') {\r\n return;\r\n }\r\n this.editCell(cell.rowIndex, cell.colIndex);\r\n });\r\n this.ctx.on('keydown', (e) => {\r\n if (!this.ctx.isTarget(e)) {\r\n return;\r\n }\r\n if (!this.ctx.focusCell) {\r\n return;\r\n }\r\n if (e.code === 'Escape' && this.ctx.editing) {\r\n this.cancel = true;\r\n const { focusCell } = this.ctx;\r\n if (focusCell) {\r\n this.ctx.emit('setSelectorCell', focusCell);\r\n this.cellTarget = focusCell;\r\n }\r\n this.doneEdit();\r\n return;\r\n }\r\n if ((e.altKey || e.metaKey) && e.code === 'Enter' && this.ctx.editing && this.inputEl) {\r\n e.preventDefault();\r\n const cursorPos = this.inputEl.selectionStart; // 获取光标位置\r\n const textBefore = this.inputEl.value.substring(0, cursorPos); // 光标前的文本\r\n const textAfter = this.inputEl.value.substring(cursorPos); // 光标后的文本\r\n // 更新 textarea 的内容,在光标位置插入换行符\r\n this.inputEl.value = textBefore + '\\n' + textAfter;\r\n // 设置光标位置到新行\r\n this.inputEl.selectionStart = this.inputEl.selectionEnd = cursorPos + 1;\r\n this.autoSize();\r\n return;\r\n }\r\n if (e.code === 'Tab' && this.ctx.editing) {\r\n e.preventDefault();\r\n this.doneEdit();\r\n if (e.shiftKey) {\r\n this.ctx.emit('setMoveFocus', 'LEFT');\r\n return;\r\n }\r\n this.ctx.emit('setMoveFocus', 'RIGHT');\r\n return;\r\n }\r\n if (e.code === 'Enter' && this.ctx.editing) {\r\n e.preventDefault();\r\n this.doneEdit();\r\n if (e.shiftKey) {\r\n this.ctx.emit('setMoveFocus', 'TOP');\r\n return;\r\n }\r\n this.ctx.emit('setMoveFocus', 'BOTTOM');\r\n return;\r\n }\r\n if (e.code === 'Enter' && !this.ctx.editing) {\r\n e.preventDefault();\r\n this.startEdit();\r\n return;\r\n }\r\n const key = e.key;\r\n const isCtrl = e.ctrlKey;\r\n const isAlt = e.altKey;\r\n const isShift = e.shiftKey;\r\n const isMeta = e.metaKey;\r\n // 检测是否按下了组合键(Ctrl、Alt、Shift、Meta)\r\n if (isCtrl || isAlt || isShift || isMeta) {\r\n return;\r\n }\r\n // 检测功能键(比如 F1, Escape,Tab 等)\r\n const functionKeys = [\r\n 'Enter',\r\n 'Escape',\r\n 'Tab',\r\n 'Backspace',\r\n 'Delete',\r\n 'ArrowUp',\r\n 'ArrowDown',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'Home',\r\n 'End',\r\n 'PageUp',\r\n 'PageDown',\r\n 'Insert',\r\n 'F1',\r\n 'F2',\r\n 'F3',\r\n 'F4',\r\n 'F5',\r\n 'F6',\r\n 'F7',\r\n 'F8',\r\n 'F9',\r\n 'F10',\r\n 'F11',\r\n 'F12',\r\n ];\r\n if (functionKeys.includes(key)) {\r\n return;\r\n }\r\n // 除了上面的建其他都开始编辑\r\n this.startEdit(true);\r\n });\r\n this.ctx.on('adjustBoundaryPosition', (cell) => {\r\n // 调整位置会触发重绘可能会导致cellClick事件不能触发,调整位置时需要赋值cellTarget\r\n this.cellTarget = cell;\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n });\r\n this.ctx.on('cellClick', (cell: Cell) => {\r\n // 如果是调整边界位置,不进入编辑模式\r\n if (this.ctx.adjustPositioning) {\r\n return;\r\n }\r\n // 不在区域内\r\n if (!this.isInSelectorRange(cell.rowIndex, cell.colIndex)) {\r\n return;\r\n }\r\n const { xArr, yArr } = this.ctx.selector;\r\n const selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n if (this.selectorArrStr === selectorArrStr && this.cellTarget) {\r\n // 启用合并单元格关联&&只有合并单元格时才进入编辑模式\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n this.startEdit();\r\n return;\r\n }\r\n // 只有一个的情况下才进入编辑模式\r\n if (\r\n this.ctx.selectOnlyOne &&\r\n cell.rowKey === this.cellTarget.rowKey &&\r\n cell.key === this.cellTarget.key\r\n ) {\r\n this.startEdit();\r\n return;\r\n }\r\n }\r\n this.selectorArrStr = selectorArrStr;\r\n this.doneEdit();\r\n this.cellTarget = cell;\r\n // 单击单元格进入编辑模式\r\n if (this.ctx.config.ENABLE_EDIT_SINGLE_CLICK) {\r\n // 启用合并单元格关联&&只有合并单元格时才进入编辑模式\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n this.startEdit();\r\n return;\r\n }\r\n // 只有一个的情况下才进入编辑模式\r\n if (this.ctx.selectOnlyOne) {\r\n this.startEdit();\r\n }\r\n }\r\n });\r\n }\r\n private isInSelectorRange(rowIndex: number, colIndex: number) {\r\n const { xArr, yArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n const [minY, maxY] = yArr;\r\n if (colIndex < minX) {\r\n return false;\r\n }\r\n if (colIndex > maxX) {\r\n return false;\r\n }\r\n if (rowIndex < minY) {\r\n return false;\r\n }\r\n if (rowIndex > maxY) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n private initTextEditor() {\r\n // 初始化文本编辑器\r\n this.inputEl = document.createElement('textarea');\r\n this.inputEl.setAttribute('rows', '1');\r\n // 监听输入事件,自动调整高度\r\n this.inputEl.addEventListener('input', this.autoSize.bind(this));\r\n this.inputEl.addEventListener('blur', () => {\r\n this.doneEdit();\r\n });\r\n this.editorEl = this.ctx.editorElement;\r\n this.inputEl.className = 'e-virt-table-editor-textarea';\r\n this.editorEl.appendChild(this.inputEl);\r\n this.ctx.containerElement.appendChild(this.editorEl);\r\n }\r\n private autoSize() {\r\n this.inputEl.style.height = 'auto'; // 重置高度\r\n let scrollHeight = this.inputEl.scrollHeight;\r\n let maxHeight = this.ctx.body.visibleHeight;\r\n if (scrollHeight > maxHeight) {\r\n scrollHeight = maxHeight;\r\n }\r\n const {\r\n stageHeight,\r\n footer,\r\n header,\r\n config: { SCROLLER_TRACK_SIZE },\r\n } = this.ctx;\r\n const bottomY = stageHeight - footer.height - SCROLLER_TRACK_SIZE;\r\n this.editorEl.style.bottom = `auto`;\r\n if (this.drawY < header.height) {\r\n this.editorEl.style.top = `${header.height - 1}px`;\r\n }\r\n if (this.drawY + scrollHeight > bottomY) {\r\n this.editorEl.style.left = `${this.drawX - 1}px`;\r\n this.editorEl.style.top = `auto`;\r\n this.editorEl.style.bottom = `${stageHeight - bottomY}px`;\r\n }\r\n this.inputEl.style.height = `${scrollHeight}px`; // 设置为内容的高度\r\n }\r\n private startEditByInput(cell: Cell, ignoreValue = false) {\r\n const value = ignoreValue ? null : cell.getValue();\r\n const { editorType } = cell;\r\n cell.update(); // 更新单元格信息\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK) {\r\n cell.updateSpanInfo(); // 更新合并单元格信息\r\n }\r\n let { height, width, drawY, drawX } = cell;\r\n this.drawX = drawX;\r\n this.drawY = drawY;\r\n const {\r\n config: { CELL_PADDING },\r\n header,\r\n } = this.ctx;\r\n let maxHeight = this.ctx.body.visibleHeight;\r\n if (height > maxHeight) {\r\n height = maxHeight;\r\n }\r\n // 显示编辑器\r\n this.editorEl.style.display = 'inline-block';\r\n this.editorEl.style.left = `${this.drawX - 1}px`;\r\n this.editorEl.style.top = `${this.drawY - 1}px`;\r\n this.editorEl.style.bottom = `auto`;\r\n this.editorEl.style.maxHeight = `${maxHeight}px`;\r\n if (editorType === 'text') {\r\n this.inputEl.style.display = 'block';\r\n this.inputEl.style.minWidth = `${width - 1}px`;\r\n this.inputEl.style.minHeight = `${height - 1}px`;\r\n this.inputEl.style.maxHeight = `${maxHeight}px`;\r\n this.inputEl.style.width = `${width - 1}px`;\r\n this.inputEl.style.height = `auto`;\r\n this.inputEl.style.padding = `${CELL_PADDING}px`;\r\n if (value !== null) {\r\n this.inputEl.value = value;\r\n }\r\n this.inputEl.focus({ preventScroll: true });\r\n const length = this.inputEl.value.length;\r\n this.inputEl.setSelectionRange(length, length);\r\n } else {\r\n this.inputEl.style.display = 'none';\r\n }\r\n\r\n if (this.inputEl.scrollHeight > height || this.drawY < header.height) {\r\n this.autoSize();\r\n }\r\n }\r\n private doneEditByInput() {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n // 如果是文本编辑器\r\n if (this.cellTarget.editorType === 'text') {\r\n const { rowKey, key } = this.cellTarget;\r\n const value = this.cellTarget.getValue();\r\n const textContent = this.inputEl.value;\r\n // !(text.textContent === '' && value === null)剔除点击编辑后未修改会把null变为''的情况\r\n if (textContent !== value && !(textContent === '' && value === null) && !this.cancel) {\r\n this.ctx.setItemValueByEditor(rowKey, key, textContent, true);\r\n // this.cellTarget.setValue(textContent);\r\n }\r\n this.inputEl.value = '';\r\n }\r\n }\r\n startEdit(ignoreValue = false) {\r\n this.cancel = false;\r\n // 如果不启用点击选择器编辑\r\n const { ENABLE_EDIT_CLICK_SELECTOR } = this.ctx.config;\r\n if (!ENABLE_EDIT_CLICK_SELECTOR) {\r\n return;\r\n }\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n // 触发绘制,刷新\r\n this.ctx.emit('drawView');\r\n // 可视区可见\r\n const isVisible = focusCell.isVerticalVisible() && focusCell.isHorizontalVisible();\r\n if (!isVisible) {\r\n return;\r\n }\r\n const { rowKey, key, editorType } = focusCell;\r\n // 没有编辑器的情况下不进入编辑模式\r\n if (editorType === 'none') {\r\n return;\r\n }\r\n const readonly = this.ctx.database.getReadonly(rowKey, key);\r\n if (focusCell && !readonly) {\r\n this.enable = true;\r\n this.ctx.editing = true;\r\n this.cellTarget = focusCell;\r\n this.startEditByInput(this.cellTarget, ignoreValue);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n }\r\n }\r\n editCell(rowIndex: number, colIndex: number) {\r\n const row = this.ctx.body.renderRows.find((row) => row.rowIndex === rowIndex);\r\n if (!row) {\r\n return;\r\n }\r\n const cell = row.cells.find((cell: Cell) => cell.colIndex === colIndex);\r\n if (!cell) {\r\n return;\r\n }\r\n this.ctx.emit('setSelectorCell', cell);\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n const { rowKey, key } = focusCell;\r\n const readonly = this.ctx.database.getReadonly(rowKey, key);\r\n if (focusCell && !readonly) {\r\n this.enable = true;\r\n this.ctx.editing = true;\r\n this.cellTarget = focusCell;\r\n this.startEditByInput(this.cellTarget);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n }\r\n }\r\n doneEdit() {\r\n if (!this.enable) {\r\n return;\r\n }\r\n this.doneEditByInput();\r\n this.ctx.emit('doneEdit', this.cellTarget);\r\n this.enable = false;\r\n this.ctx.editing = false;\r\n this.ctx.containerElement.focus({ preventScroll: true });\r\n // 隐藏编辑器\r\n this.editorEl.style.display = 'none';\r\n this.ctx.emit('drawView');\r\n }\r\n clearEditor() {\r\n this.doneEdit();\r\n this.cellTarget = null;\r\n this.selectorArrStr = '';\r\n this.ctx.clearSelector();\r\n this.ctx.focusCell = undefined;\r\n this.ctx.emit('drawView');\r\n }\r\n destroy() {\r\n this.editorEl?.remove();\r\n }\r\n}\r\n","import Context from './Context';\r\nexport default class Tooltip {\r\n private ctx: Context;\r\n private emptyEl: HTMLDivElement;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n const { EMPTY_TEXT, EMPTY_CUSTOM_STYLE } = this.ctx.config;\r\n if (this.ctx.emptyElement) {\r\n this.emptyEl = this.ctx.emptyElement;\r\n } else {\r\n this.emptyEl = document.createElement('div');\r\n this.emptyEl.innerText = EMPTY_TEXT;\r\n }\r\n this.emptyEl.className = 'e-virt-table-empty';\r\n this.emptyEl.style.display = 'none';\r\n this.ctx.containerElement.appendChild(this.emptyEl);\r\n this.ctx.on('emptyChange', ({ type, headerHeight, bodyHeight, footerHeight }) => {\r\n const top = headerHeight + (bodyHeight + footerHeight) / 2;\r\n const contentStyle = {\r\n display: type === 'empty' ? 'block' : 'none',\r\n position: 'absolute',\r\n fontSize: '14px',\r\n color: '#666',\r\n left: '50%',\r\n top: `${top}px`,\r\n transform: 'translate(-50%, -50%)',\r\n ...EMPTY_CUSTOM_STYLE,\r\n };\r\n Object.assign(this.emptyEl.style, contentStyle);\r\n });\r\n }\r\n destroy() {\r\n this.emptyEl.remove();\r\n }\r\n}\r\n","import type Cell from './Cell';\nimport type CellHeader from './CellHeader';\nimport type Context from './Context';\nimport type { OverlayerContainer, OverlayerView, OverlayerWrapper } from './types';\nexport default class Overlayer {\n ctx: Context;\n constructor(ctx: Context) {\n this.ctx = ctx;\n }\n draw() {\n const overlayer = this.getContainer();\n this.ctx.emit('overlayerChange', overlayer);\n }\n destroy() {\n this.ctx.emit('overlayerChange', {\n style: {},\n views: [],\n });\n }\n private getContainer(): OverlayerContainer {\n const header = this.getHeader();\n const body = this.getBody();\n const footer = this.getFooter();\n let views: OverlayerWrapper[] = [];\n // 不是固定底部的时候,不用加入footer,因为footer是在body的下面的\n const { FOOTER_FIXED, FOOTER_POSITION } = this.ctx.config;\n if (!FOOTER_FIXED) {\n views = [header, body];\n } else {\n if (FOOTER_POSITION === 'top') {\n views = [header, footer, body];\n } else {\n views = [header, body, footer];\n }\n }\n return {\n views,\n };\n }\n private getHeader() {\n const {\n fixedLeftWidth,\n fixedRightWidth: _fixedRightWidth,\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\n } = this.ctx;\n const { visibleWidth, visibleHeight, renderCellHeaders } = this.ctx.header;\n let centerCells: CellHeader[] = [];\n let leftCells: CellHeader[] = [];\n let rightCells: CellHeader[] = [];\n renderCellHeaders.forEach((cellHeader) => {\n if (cellHeader.render) {\n if (cellHeader.fixed === 'left') {\n leftCells.push(cellHeader);\n } else if (cellHeader.fixed === 'right') {\n rightCells.push(cellHeader);\n } else {\n centerCells.push(cellHeader);\n }\n }\n });\n // 减去滚动条的宽度\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\n const left: OverlayerView = {\n key: 'left',\n style: {\n position: 'absolute',\n top: `${0}px`,\n left: `${0}px`,\n overflow: 'hidden',\n width: `${fixedLeftWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: leftCells,\n };\n const center: OverlayerView = {\n key: 'center',\n style: {\n position: 'absolute',\n top: `${0}px`,\n left: `${fixedLeftWidth}px`,\n overflow: 'hidden',\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth + 1}px`,\n height: `${visibleHeight}px`,\n },\n cells: centerCells,\n };\n const right: OverlayerView = {\n key: 'right',\n style: {\n position: 'absolute',\n top: `${0}px`,\n right: `${0}px`,\n overflow: 'hidden',\n width: `${fixedRightWidth + 1}px`,\n height: `${visibleHeight}px`,\n },\n cells: rightCells,\n };\n const header: OverlayerWrapper = {\n type: 'header',\n class: `${CSS_PREFIX}-overlayer-header`,\n style: {\n position: 'relative',\n overflow: 'hidden',\n width: `${visibleWidth}px`,\n height: `${visibleHeight}px`,\n },\n views: [left, center, right],\n };\n return header;\n }\n private getBody() {\n const centerCells: Cell[] = [];\n const leftCells: Cell[] = [];\n const rightCells: Cell[] = [];\n let renderRows = this.ctx.body.renderRows;\n // 合计如果不是固定在底部,就加入到渲染行中\n if (!this.ctx.config.FOOTER_FIXED) {\n renderRows = renderRows.concat(this.ctx.footer.renderRows);\n }\n renderRows.forEach((row: { cells: Cell[] }) => {\n row.cells.forEach((cell: Cell) => {\n if (cell.cellType === 'footer') {\n cell.render = cell.renderFooter;\n }\n if (cell.render) {\n if (cell.fixed === 'left') {\n leftCells.push(cell);\n } else if (cell.fixed === 'right') {\n rightCells.push(cell);\n } else {\n centerCells.push(cell);\n }\n }\n });\n });\n const {\n fixedLeftWidth,\n fixedRightWidth: _fixedRightWidth,\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\n } = this.ctx;\n const { visibleWidth, visibleHeight } = this.ctx.body;\n // 减去滚动条的宽度\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\n const left: OverlayerView = {\n key: 'left',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n left: `${0.5}px`,\n overflow: 'hidden',\n width: `${fixedLeftWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: leftCells,\n };\n const center: OverlayerView = {\n key: 'center',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n left: `${fixedLeftWidth - 0.5}px`,\n overflow: 'hidden',\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: centerCells,\n };\n const right: OverlayerView = {\n key: 'right',\n style: {\n position: 'absolute',\n top: `${0}px`,\n right: `${0}px`,\n overflow: 'hidden',\n width: `${fixedRightWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: rightCells,\n };\n const body: OverlayerWrapper = {\n type: 'body',\n class: `${CSS_PREFIX}-overlayer-body`,\n style: {\n position: 'relative',\n overflow: 'hidden',\n width: `${visibleWidth}px`,\n height: `${visibleHeight}px`,\n },\n views: [left, center, right],\n };\n return body;\n }\n private getFooter() {\n const centerCells: Cell[] = [];\n const leftCells: Cell[] = [];\n const rightCells: Cell[] = [];\n this.ctx.footer.renderRows.forEach((row: { cells: Cell[] }) => {\n row.cells.forEach((cell: Cell) => {\n if (cell.cellType === 'footer' && cell.renderFooter) {\n // 把转renderFooter成render统一出口\n cell.render = cell.renderFooter;\n if (cell.fixed === 'left') {\n leftCells.push(cell);\n } else if (cell.fixed === 'right') {\n rightCells.push(cell);\n } else {\n centerCells.push(cell);\n }\n }\n });\n });\n const {\n fixedLeftWidth,\n fixedRightWidth: _fixedRightWidth,\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\n } = this.ctx;\n const { visibleWidth, visibleHeight } = this.ctx.footer;\n // 减去滚动条的宽度\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\n const left: OverlayerView = {\n key: 'left',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n left: `${0.5}px`,\n overflow: 'hidden',\n width: `${fixedLeftWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: leftCells,\n };\n const center: OverlayerView = {\n key: 'center',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n left: `${fixedLeftWidth - 0.5}px`,\n overflow: 'hidden',\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: centerCells,\n };\n const right: OverlayerView = {\n key: 'right',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n right: `${0.5}px`,\n overflow: 'hidden',\n width: `${fixedRightWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: rightCells,\n };\n const footer: OverlayerWrapper = {\n type: 'footer',\n class: `${CSS_PREFIX}-overlayer-footer`,\n style: {\n position: 'relative',\n overflow: 'hidden',\n width: `${visibleWidth}px`,\n height: `${visibleHeight}px`,\n },\n views: [left, center, right],\n };\n return footer;\n }\n}\n","import { MenuItem } from './types';\r\nimport Context from './Context';\r\nimport { computePosition, offset, flip, shift } from '@floating-ui/dom';\r\nimport Cell from './Cell';\r\nexport default class ContextMenu {\r\n private ctx: Context;\r\n private contextMenuEl: HTMLDivElement;\r\n private custom = false;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n if (this.ctx.contextMenuElement) {\r\n this.custom = true;\r\n this.contextMenuEl = this.ctx.contextMenuElement;\r\n } else {\r\n this.custom = false;\r\n this.contextMenuEl = document.createElement('div');\r\n }\r\n this.createContextMenu();\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('cellContextMenuClick', (cell: Cell, e: MouseEvent) => {\r\n if (!this.ctx.config.ENABLE_CONTEXT_MENU) return;\r\n e.preventDefault();\r\n const { xArr, yArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n const [minY, maxY] = yArr;\r\n const { rowIndex, colIndex } = cell;\r\n //判断是否在范围内\r\n const isInRange = rowIndex >= minY && rowIndex <= maxY && colIndex >= minX && colIndex <= maxX;\r\n if (!isInRange) {\r\n this.ctx.emit('setSelectorCell', cell, e);\r\n }\r\n\r\n const virtualReference = {\r\n getBoundingClientRect: () => ({\r\n width: 0,\r\n height: 0,\r\n top: e.clientY,\r\n left: e.clientX,\r\n right: e.clientX,\r\n bottom: e.clientY,\r\n x: e.clientX,\r\n y: e.clientY,\r\n }),\r\n contextElement: document.body,\r\n };\r\n computePosition(virtualReference, this.contextMenuEl, {\r\n placement: 'right-start',\r\n middleware: [offset(), shift(), flip()],\r\n }).then(({ x, y }) => {\r\n this.show(x, y);\r\n });\r\n });\r\n this.ctx.on('click', this.hide.bind(this));\r\n this.ctx.on('onScroll', this.hide.bind(this));\r\n this.ctx.on('resize', this.hide.bind(this));\r\n }\r\n //创建右键菜单,绑定子项点击事件\r\n private createContextMenu() {\r\n this.contextMenuEl.className = 'e-virt-table-context-menu';\r\n this.contextMenuEl.addEventListener('contextmenu', function (e) {\r\n e.preventDefault();\r\n });\r\n this.ctx.containerElement.appendChild(this.contextMenuEl);\r\n // 如果是自定义右键菜单,则不创建默认子菜单\r\n if (this.custom) return;\r\n const { CONTEXT_MENU } = this.ctx.config;\r\n this.createContextMenuItems(CONTEXT_MENU, (item: MenuItem) => {\r\n switch (item.value) {\r\n case 'copy':\r\n this.ctx.emit('contextMenuCopy');\r\n break;\r\n case 'paste':\r\n this.ctx.emit('contextMenuPaste');\r\n break;\r\n case 'cut':\r\n this.ctx.emit('contextMenuCut');\r\n break;\r\n case 'clearSelected':\r\n this.ctx.emit('contextMenuClearSelected');\r\n break;\r\n default:\r\n }\r\n this.hide();\r\n });\r\n }\r\n //创建右键菜单子项元素\r\n private createContextMenuItems(items: MenuItem[], callback: (e: MenuItem) => void) {\r\n this.contextMenuEl.replaceChildren();\r\n items.forEach((item: MenuItem) => {\r\n const menuItemEl: HTMLDivElement = document.createElement('div');\r\n menuItemEl.className = 'e-virt-table-context-menu-item';\r\n menuItemEl.innerText = item.label;\r\n if (item.event) {\r\n menuItemEl.onclick = () => {\r\n item.event && item.event();\r\n callback(item);\r\n };\r\n } else {\r\n menuItemEl.onclick = () => callback(item);\r\n }\r\n this.contextMenuEl.appendChild(menuItemEl);\r\n });\r\n }\r\n private show(x: Number, y: Number) {\r\n Object.assign(this.contextMenuEl.style, {\r\n left: `${x}px`,\r\n top: `${y}px`,\r\n });\r\n }\r\n hide() {\r\n Object.assign(this.contextMenuEl.style, {\r\n left: '-99999px',\r\n top: '-99999px',\r\n });\r\n }\r\n updated() {\r\n this.createContextMenu();\r\n }\r\n destroy() {\r\n this.contextMenuEl.remove();\r\n }\r\n}\r\n","import {\r\n ChangeItem,\r\n Column,\r\n ConfigType,\r\n EventCallback,\r\n EVirtTableOptions,\r\n FilterMethod,\r\n Position,\r\n RowParams,\r\n ValidateField,\r\n ValidateItemError,\r\n} from './types';\r\nimport Context from './Context';\r\nimport Scroller from './Scroller';\r\nimport Header from './Header';\r\nimport Body from './Body';\r\nimport Footer from './Footer';\r\nimport Selector from './Selector';\r\nimport Autofill from './Autofill';\r\nimport Tooltip from './Tooltip';\r\nimport Editor from './Editor';\r\nimport Empty from './Empty';\r\nimport Overlayer from './Overlayer';\r\nimport ContextMenu from './ContextMenu';\r\nimport { mergeColCell, mergeRowCell, getSpanArrByRow, getSpanObjByColumn } from './util';\r\nimport './style.css';\r\nexport default class EVirtTable {\r\n private options: EVirtTableOptions;\r\n private scroller: Scroller;\r\n private header: Header;\r\n private body: Body;\r\n private footer: Footer;\r\n private selector: Selector;\r\n private autofill: Autofill;\r\n private tooltip: Tooltip;\r\n private editor: Editor;\r\n private empty: Empty;\r\n private overlayer: Overlayer;\r\n private contextMenu: ContextMenu;\r\n ctx: Context;\r\n constructor(target: HTMLDivElement, options: EVirtTableOptions) {\r\n this.options = options;\r\n const { overlayerElement, editorElement, emptyElement, contextMenuElement } = options;\r\n const containerElement = this.createContainer(\r\n target,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n );\r\n this.ctx = new Context(containerElement, this.options);\r\n this.header = new Header(this.ctx);\r\n this.footer = new Footer(this.ctx);\r\n this.body = new Body(this.ctx);\r\n this.scroller = new Scroller(this.ctx);\r\n this.selector = new Selector(this.ctx);\r\n this.autofill = new Autofill(this.ctx);\r\n this.tooltip = new Tooltip(this.ctx);\r\n this.empty = new Empty(this.ctx);\r\n this.editor = new Editor(this.ctx);\r\n this.overlayer = new Overlayer(this.ctx);\r\n this.contextMenu = new ContextMenu(this.ctx);\r\n this.ctx.on('draw', () => {\r\n this.draw();\r\n });\r\n this.ctx.on('drawView', () => {\r\n this.draw(true);\r\n });\r\n this.draw();\r\n }\r\n private createContainer(\r\n containerElement: HTMLDivElement,\r\n _overlayerElement?: HTMLDivElement,\r\n _editorElement?: HTMLDivElement,\r\n _emptyElement?: HTMLDivElement,\r\n _contextMenuElement?: HTMLDivElement,\r\n ) {\r\n containerElement.className = 'e-virt-table-container';\r\n const stageElement = document.createElement('div');\r\n const canvasElement = document.createElement('canvas');\r\n const overlayerElement = _overlayerElement || document.createElement('div');\r\n stageElement.className = 'e-virt-table-stage';\r\n containerElement.tabIndex = 0;\r\n canvasElement.className = 'e-virt-table-canvas';\r\n overlayerElement.className = 'e-virt-table-overlayer';\r\n const editorElement = _editorElement || document.createElement('div');\r\n editorElement.className = 'e-virt-table-editor';\r\n const emptyElement = _emptyElement;\r\n const contextMenuElement = _contextMenuElement;\r\n stageElement.appendChild(canvasElement);\r\n stageElement.appendChild(overlayerElement);\r\n containerElement.appendChild(stageElement);\r\n return {\r\n containerElement,\r\n stageElement,\r\n canvasElement,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n };\r\n }\r\n draw(ignoreOverlayer = false) {\r\n requestAnimationFrame(() => {\r\n this.header.update();\r\n this.footer.update();\r\n this.body.update();\r\n this.ctx.paint.clear();\r\n this.body.draw();\r\n this.footer.draw();\r\n this.header.draw();\r\n this.scroller.draw();\r\n // 忽略重绘覆盖层,解决按下事件时,重绘覆盖层导致事件无法触发,目前只在Selector中按下事件使用\r\n if (!ignoreOverlayer) {\r\n this.overlayer.draw();\r\n }\r\n });\r\n }\r\n loadConfig(_config: ConfigType) {\r\n this.ctx.config.init(_config);\r\n //重新加载config,初始化表格,但是默认不清除用户操作\r\n this.ctx.database.init(false);\r\n this.header.init();\r\n // 更新右键菜单,有可能配置项变化\r\n this.contextMenu.updated();\r\n this.ctx.emit('draw');\r\n }\r\n loadColumns(columns: Column[]) {\r\n // 先关闭编辑\r\n this.editor.doneEdit();\r\n this.ctx.database.setColumns(columns);\r\n this.header.init();\r\n this.ctx.emit('draw');\r\n }\r\n loadData(data: any[]) {\r\n // 先关闭编辑\r\n this.editor.doneEdit();\r\n this.ctx.database.setData(data);\r\n this.header.init();\r\n this.tooltip.hide();\r\n this.ctx.emit('draw');\r\n }\r\n loadFooterData(data: any[]) {\r\n this.ctx.database.setFooterData(data);\r\n this.ctx.emit('draw');\r\n }\r\n\r\n setLoading(ladong: boolean) {\r\n this.ctx.database.setLoading(ladong);\r\n }\r\n on(event: string, callback: EventCallback) {\r\n this.ctx.on(event, callback);\r\n }\r\n emit(event: string, ...args: any[]): void {\r\n this.ctx.emit(event, ...args);\r\n }\r\n off(event: string, callback: EventCallback) {\r\n this.ctx.off(event, callback);\r\n }\r\n filterMethod(func: FilterMethod) {\r\n this.ctx.database.setFilterMethod(func);\r\n //重新初始化表格,但是默认不清除用户操作\r\n this.ctx.database.init(false);\r\n this.header.init();\r\n this.ctx.emit('draw');\r\n }\r\n editCell(rowIndex: number, colIndex: number) {\r\n this.editor.editCell(rowIndex, colIndex);\r\n }\r\n setItemValue(\r\n rowKey: string,\r\n key: string,\r\n value: any,\r\n history = true,\r\n reDraw = true,\r\n isEditor = false\r\n ) {\r\n this.ctx.database.setItemValue(rowKey, key, value, history, reDraw, isEditor);\r\n }\r\n batchSetItemValue(list: ChangeItem[], history = true) {\r\n this.ctx.database.batchSetItemValue(list, history);\r\n }\r\n setItemValueByEditor(rowKey: string, key: string, value: any, history = true, reDraw = true) {\r\n this.ctx.setItemValueByEditor(rowKey, key, value, history, reDraw);\r\n this.editor.doneEdit();\r\n }\r\n\r\n clearEditableData(value = null) {\r\n const xArr = [0, this.ctx.maxColIndex];\r\n const yArr = [0, this.ctx.maxRowIndex];\r\n return this.selector.clearSelectedData(xArr, yArr, false, value);\r\n }\r\n clearEditor() {\r\n this.editor.clearEditor();\r\n }\r\n doLayout() {\r\n this.ctx.emit('draw');\r\n }\r\n getChangedData() {\r\n return this.ctx.database.getChangedData();\r\n }\r\n getChangedRows() {\r\n return this.ctx.database.getChangedRows();\r\n }\r\n setCurrentRowByRowIndex(rowIndex: number) {\r\n this.ctx.currentCell = this.ctx.database.getVirtualBodyCell(rowIndex, 0);\r\n this.ctx.emit('draw');\r\n }\r\n setCurrentRow(rowKey: string) {\r\n const column = this.ctx.database.getColumnByColIndex(0);\r\n if (!column) {\r\n return;\r\n }\r\n this.ctx.currentCell = this.ctx.database.getVirtualBodyCellByKey(rowKey, column.key);\r\n this.ctx.emit('draw');\r\n }\r\n getCurrentRow() {\r\n const cell = this.ctx.currentCell;\r\n if (!cell) {\r\n return;\r\n }\r\n const rowData: RowParams = {\r\n row: cell.row,\r\n rowIndex: cell.rowIndex,\r\n rowKey: cell.rowKey,\r\n };\r\n return rowData;\r\n }\r\n clearValidate() {\r\n this.ctx.database.clearValidate();\r\n this.ctx.emit('draw');\r\n }\r\n validateFields(ValidateFields: ValidateField[], scrollError = true) {\r\n return new Promise(async (resolve, reject) => {\r\n let errors: any[] = [];\r\n for (let i = 0; i < ValidateFields.length; i++) {\r\n const { rowKey, key } = ValidateFields[i];\r\n const _errors = await this.ctx.database.getValidator(rowKey, key);\r\n if (Array.isArray(_errors) && _errors.length) {\r\n errors.push(_errors);\r\n }\r\n }\r\n if (errors.length) {\r\n reject(errors);\r\n if (scrollError) {\r\n const [err] = errors;\r\n if (Array.isArray(err) && err.length) {\r\n const [_err] = err;\r\n const { rowKey, key } = _err;\r\n this.scrollToRowkey(rowKey);\r\n this.scrollToColkey(key);\r\n }\r\n }\r\n this.ctx.emit('draw');\r\n } else {\r\n resolve([]);\r\n this.ctx.emit('draw');\r\n }\r\n });\r\n }\r\n async validate(scrollError = true) {\r\n // 先关闭编辑\r\n return new Promise(async (resolve, reject) => {\r\n try {\r\n const res = await this.getValidations();\r\n resolve(res);\r\n } catch (errors) {\r\n // 滚动到错误位置,取第一个错误\r\n if (scrollError && Array.isArray(errors) && errors.length) {\r\n const [err] = errors;\r\n if (Array.isArray(err) && err.length) {\r\n const [_err] = err;\r\n const { rowKey, key } = _err;\r\n const targetRow = this.ctx.database.getRowForRowKey(rowKey);\r\n if (targetRow) {\r\n const { parentRowKeys = [] } = targetRow;\r\n if (parentRowKeys && parentRowKeys.length) {\r\n this.setExpandRowKeys(parentRowKeys, true);\r\n }\r\n }\r\n this.scrollToRowkey(rowKey);\r\n this.scrollToColkey(key);\r\n }\r\n }\r\n reject(errors);\r\n }\r\n });\r\n }\r\n setValidations(errors: ValidateItemError[]) {\r\n errors.forEach((item) => {\r\n const { rowIndex, key, message } = item;\r\n this.ctx.database.setValidationErrorByRowIndex(rowIndex, key, message);\r\n });\r\n // 滚动到错误位置,取第一个错误\r\n if (errors && Array.isArray(errors) && errors.length) {\r\n const [err] = errors;\r\n if (err && err.rowIndex >= 0 && err.key) {\r\n const { rowIndex, key } = err;\r\n this.scrollToRowIndex(rowIndex);\r\n this.scrollToColkey(key);\r\n }\r\n }\r\n }\r\n getValidations() {\r\n return new Promise(async (resolve, reject) => {\r\n const data = this.ctx.database.getAllRowsData();\r\n const leafCellHeaders = this.ctx.header.leafCellHeaders;\r\n let errors: any[] = [];\r\n for (let i = 0; i < data.length; i++) {\r\n for (let y = 0; y < leafCellHeaders.length; y++) {\r\n const rowKey = this.ctx.database.getRowKeyByItem(data[i]);\r\n const leafCellHeader = leafCellHeaders[y];\r\n const key = leafCellHeader.key;\r\n const _errors = await this.ctx.database.getValidator(rowKey, key);\r\n if (Array.isArray(_errors) && _errors.length) {\r\n errors.push(_errors);\r\n }\r\n }\r\n }\r\n if (errors.length) {\r\n reject(errors);\r\n this.ctx.emit('draw');\r\n } else {\r\n resolve([]);\r\n this.ctx.emit('draw');\r\n }\r\n });\r\n }\r\n hasValidationError() {\r\n return this.ctx.database.hasValidationError();\r\n }\r\n scrollTo(x: number, y: number) {\r\n this.scroller.setScroll(x, y);\r\n }\r\n\r\n scrollXTo(x: number) {\r\n this.scroller.setScrollX(x);\r\n }\r\n\r\n scrollToColkey(key: string) {\r\n this.scroller.scrollToColkey(key);\r\n }\r\n scrollToRowkey(key: string) {\r\n this.scroller.scrollToRowKey(key);\r\n }\r\n scrollToColIndex(colIndex: number) {\r\n this.scroller.scrollToColIndex(colIndex);\r\n }\r\n scrollToRowIndex(rowIndex: number) {\r\n this.scroller.scrollToRowIndex(rowIndex);\r\n }\r\n scrollYTo(y: number) {\r\n this.scroller.setScrollY(y);\r\n }\r\n setExpandRowKeys(keys: any[], expand = true) {\r\n this.ctx.database.setExpandRowKeys(keys, expand);\r\n }\r\n getExpandRowKeys() {\r\n return this.ctx.database.getExpandRowKeys();\r\n }\r\n clearSelection() {\r\n this.ctx.database.clearSelection();\r\n this.ctx.emit('draw');\r\n }\r\n toggleRowSelection(row: any) {\r\n const rowKey = this.ctx.database.getRowKeyByItem(row);\r\n this.ctx.database.toggleRowSelection(rowKey);\r\n this.ctx.emit('draw');\r\n }\r\n setSelectionByRows(rows: any[], selected = true) {\r\n rows.forEach((row) => {\r\n const rowKey = this.ctx.database.getRowKeyByItem(row);\r\n this.ctx.database.setRowSelection(rowKey, selected, false);\r\n });\r\n this.ctx.emit('selectionChange', this.getSelectionRows());\r\n this.ctx.emit('draw');\r\n }\r\n setSelectionByRowKeys(keys: string[], selected = true) {\r\n keys.forEach((key) => {\r\n this.ctx.database.setRowSelection(key, selected, false);\r\n });\r\n this.ctx.emit('selectionChange', this.getSelectionRows());\r\n this.ctx.emit('draw');\r\n }\r\n toggleAllSelection() {\r\n this.ctx.database.toggleAllSelection();\r\n this.ctx.emit('draw');\r\n }\r\n toggleRowExpand(rowKey: string, expand: boolean) {\r\n this.ctx.database.expandItem(rowKey, expand);\r\n this.ctx.emit('draw');\r\n }\r\n toggleExpandAll(expand: boolean) {\r\n this.ctx.database.expandAll(expand);\r\n this.ctx.emit('draw');\r\n }\r\n getSelectionRows() {\r\n return this.ctx.database.getSelectionRows();\r\n }\r\n getPositionForRowIndex(rowIndex: number): Position {\r\n return this.ctx.database.getPositionForRowIndex(rowIndex);\r\n }\r\n getCellValue(rowKey: string, key: string) {\r\n return this.ctx.database.getItemValue(rowKey, key);\r\n }\r\n getCellValueByIndex(rowIndex: number, colIndex: number) {\r\n return this.ctx.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n }\r\n contextMenuHide() {\r\n this.contextMenu.hide();\r\n }\r\n getUtils() {\r\n return {\r\n mergeColCell,\r\n mergeRowCell,\r\n getSpanArrByRow,\r\n getSpanObjByColumn,\r\n };\r\n }\r\n getColumnByKey(key: string) {\r\n return this.ctx.database.getColumnByKey(key)?.column;\r\n }\r\n /**\r\n * 销毁\r\n */\r\n destroy() {\r\n this.overlayer.destroy();\r\n this.empty.destroy();\r\n this.editor.destroy();\r\n this.tooltip.destroy();\r\n this.selector.destroy();\r\n this.autofill.destroy();\r\n this.contextMenu.destroy();\r\n this.ctx.destroy();\r\n this.ctx.containerElement.remove();\r\n }\r\n}\r\n"],"names":["Validator","rules","__publicField","params","errors","column","row","key","rowKey","colIndex","rowIndex","value","field","fieldValue","rule","ruleParam","message","generateShortUUID","r","throttle","func","delay","lastCalledTime","timeoutId","args","now","elapsedTime","getMaxRow","data","item","a","b","sortFixed","arr","lefts","centers","right","calCrossSpan","maxRow","level","config","colspan","fixed","children","toLeaf","tmp","regUniversalNewLine","regNextCellNoQuotes","regNextEmptyCell","decodeSpreadsheetStr","str","lastLength","nextCell","quoteNo","isStillCell","nextChar","match","matchedText","encodeToSpreadsheetStr","rLen","c","cLen","val","getSpanArrByRow","list","relationRowKeys","contactDot","spanArr","index","curValue","acc","pValue","getSpanObjByColumn","columns","keyPre","keyDot","spanObj","mergeRowCell","mergeRowkey","visibleRows","headIndex","mergeColCell","mergeColKeys","visibleLeafColumns","getCssVar","name","el","BaseCell","ctx","x","y","width","height","cellType","stageWidth","fixedLeftWidth","scrollX","fixedRightWidth","offsetWidth","stageHeight","scrollY","offsetHeight","SCROLLER_TRACK_SIZE","Cell","err","SPAN_METHOD","spanMethod","rowspan","relationColKeys","mergeRow","mergeCol","spanInfo","BODY_CELL_TYPE_METHOD","type","BODY_CELL_EDITOR_METHOD","editorProps","props","BODY_CELL_RENDER_METHOD","render","CELL_PADDING","icon","iconOffsetX","iconName","expand","hasChildren","expandLoading","loadingIcon","expandIcon","shrinkIcon","iconWidth","iconHeight","iconX","iconY","BODY_BG_COLOR","EDIT_BG_COLOR","BODY_CELL_STYLE_METHOD","FOOTER_CELL_STYLE_METHOD","READONLY_TEXT_COLOR","BODY_TEXT_COLOR","FOOTER_TEXT_COLOR","FOOTER_BG_COLOR","HIGHLIGHT_SELECTED_ROW","HIGHLIGHT_SELECTED_ROW_COLOR","HIGHLIGHT_HOVER_ROW","HIGHLIGHT_HOVER_ROW_COLOR","STRIPE","STRIPE_COLOR","bgColor","textColor","footerCellStyleMethod","backgroundColor","color","drawCellSkyBgColor","hoverCell","currentCell","minY","maxY","yArr","cellStyleMethod","visibleWidth","visibleHeight","check","selectable","CHECKBOX_SIZE","_x","_y","checkboxImage","checkboxName","BODY_CELL_HOVER_ICON_METHOD","CELL_HOVER_ICON_SIZE","ENABLE_MERGE_CELL_LINK","hoverIconName","offsetTop","offsetLeft","drawImageSource","BODY_CELL_FORMATTER_METHOD","left","top","paint","BORDER_COLOR","BORDER","drawX","drawY","SELECT_BORDER_COLOR","ENABLE_AUTOFILL","ENABLE_SELECTOR","AUTOFILL_POINT_BORDER_COLOR","xArr","maxX","offset","colSpan","i","cellHeader","BODY_FONT","PLACEHOLDER_COLOR","offsetIconX","ellipsis","placeholder","text","CELL_HOVER_ICON_BG_COLOR","CELL_HOVER_ICON_BORDER_COLOR","xArrCopy","yArrCopy","minX","ERROR_TIP_ICON_SIZE","ERROR_TIP_COLOR","points","options","lineDash","borderWidth","borderColor","fillColor","offsetW","offsetX","offsetY","offsetH","Database","footerData","isClear","_columns","leafColumns","ROW_KEY","dataList","parentRowKeys","_a","DEFAULT_EXPAND_ALL","CELL_HEIGHT","SELECTABLE_METHOD","CHECKBOX_KEY","_rowKey","readonly","checkboxKey","checkboxKeys","recursiveData","newColumn","_data","filterMethod","rowKeys","rowkey","loading","_list","history","checkReadonly","historyAcion","historyList","_checkReadonly","rowKeyList","errList","changeList","_value","oldValue","cell","BEFORE_VALUE_CHANGE_METHOD","rows","promsieValidators","reDraw","isEditor","changeKey","originalValue","selection","draw","_selectable","ignoreReserve","_","buffer","bufferState","total","totalChecked","totalSelectable","reserveTotal","reserveHasChecked","reserveIndeterminate","indeterminate","colKey","changedKey","changedValue","DISABLED","colHeader","rowReadonly","colReadonly","BODY_CELL_READONLY_METHOD","resolve","BODY_CELL_RULES_METHOD","_rules","_errors","rowSpan","sumHeight","position","topIndex","bottomIndex","leftIndex","rightIndex","mergeHeight","mergeWidth","_key","hasMergeCell","j","History","e","HISTORY_NUM","ENABLE_HISTORY","EventBrowser","fn","event","ENABLE_KEYBOARD","target","EventBus","callback","callbacks","onceCallback","Paint","dpr","cursor","side","shadowWidth","colorStart","colorEnd","gradient","img","radius","tl","tr","br","bl","font","align","padding","verticalAlign","yPos","xPos","_text","ellipsesWidth","textWidth","textLength","Config","obj","cssKey","svgSelect","Icons","promises","svg","configColor","configSvg","promise","svgContent","fill","isBlob","element","url","svgBlob","reject","CellHeader","HEADER_CELL_STYLE_METHOD","HEADER_BG_COLOR","HEADER_TEXT_COLOR","headerCellStyleMethod","HEADER_FONT","displayText","EventTable","mutations","mutation","expandLazy","EXPAND_LAZY","EXPAND_LAZY_METHOD","res","isExpand","renderRows","visible","cells","renderCellHeaders","Context","containerOptions","containerElement","stageElement","canvasElement","overlayerElement","editorElement","emptyElement","contextMenuElement","rowsData","ri","cellsData","ci","scrollMaxX","scrollMaxY","footerHeight","Scrollbar","clientY","clientX","deltaY","deltaX","scroll","buttons","pointX","pointY","elementX","elementY","elementWidth","elementHeight","body","header","SCROLLER_SIZE","headerHeight","headerWidth","bodyHeight","ratio","_barHeight","_barWidth","SCROLLER_FOCUS_COLOR","SCROLLER_COLOR","SCROLLER_TRACK_COLOR","Scroller","database","Header","HEADER_HEIGHT","maxHeaderRow","sum","_item","maxWidth","minWidth","spanColumns","overWidth","diff","leafLeftCellHeaders","leafRightCellHeaders","ENABLE_RESIZE_COLUMN","RESIZE_COLUMN_MIN_WIDTH","resizeTargetWidth","resizeTargetMinWidth","resizeTargetMaxWidth","renderAllCellHeaders","col","setWidth","overDiff","fellWidth","widthMap","isResize","uptateWidth","originX","len","everyOffsetX","RESIZE_COLUMN_LINE_COLOR","resizeTargetDrawX","poins","renderLeafCellHeaders","renderCenterCellHeaders","renderFixedCellHeaders","lastCenterCell","Row","rowType","fixedCells","noFixedCells","Body","footer","FOOTER_FIXED","HEIGHT","EMPTY_BODY_HEIGHT","MAX_HEIGHT","ENABLE_OFFSET_HEIGHT","OFFSET_HEIGHT","FOOTER_POSITION","containerHeight","windowInnerHeight","_stageHeight","_visibleHeight","canvasWidth","canvasHeight","isEmpty","_cssWidth","_cssHeight","ENABLE_RESIZE_ROW","RESIZE_ROW_MIN_HEIGHT","resizeTargetHeight","RESIZE_ROW_LINE_COLOR","resizeTargetDrawY","start","end","tempIndex","midIndex","midValue","positions","_headIndex","_tailIndex","Footer","CELL_FOOTER_HEIGHT","everyOffsetY","Selector","dir","isInsideBody","timer","ENABLE_SELECTOR_SPAN_COL","ENABLE_SELECTOR_SPAN_ROW","_xArr","_yArr","rowstart","colstart","SELECTOR_AREA_MIN_X","SELECTOR_AREA_MAX_X","SELECTOR_AREA_MIN_Y","SELECTOR_AREA_MAX_Y","SELECTOR_AREA_MAX_X_OFFSET","SELECTOR_AREA_MAX_Y_OFFSET","areaMinX","areaMaxX","areaMinY","areaMaxY","adjustMerge","BEFORE_SET_SELECTOR_METHOD","topBottomCells","leftRightCells","topBottomBoundary","prev","leftRightBoundary","onlyMergeCell","selectorStr","ENABLE_SELECTOR_ALL_ROWS","ENABLE_SELECTOR_ALL_COLS","isSetFocus","mousedown","focusCell","shiftKey","clickCell","oldX","oldY","BEFORE_COPY_METHOD","error","ignoreSet","_rowIndex","_colIndex","itemValue","ENABLE_PASTER","textArr","overflowRowCount","overflowColCount","isOneData","cutList","changeListRowkeys","BEFORE_PASTE_DATA_METHOD","beforePasteDataMethod","_changeList","positionX","positionY","scrollSpeedX","num","scrollSpeedY","diffLeft","diffRight","diffTop","cellheight","diffBottom","_scrollX","_scrollY","Autofill","pointWh","BEFORE_SET_AUTOFILL_METHOD","selector","selectorIndexMap","xStep","yStep","isOneValue","selectorIndexKey","BEFORE_AUTOFILL_DATA_METHOD","beforeAutofillDataMethod","autofill","min","max","round","createCoords","v","oppositeSideMap","oppositeAlignmentMap","clamp","evaluate","param","getSide","placement","getAlignment","getOppositeAxis","axis","getAxisLength","yAxisSides","getSideAxis","getAlignmentAxis","getAlignmentSides","rects","rtl","alignment","alignmentAxis","length","mainAlignmentSide","getOppositePlacement","getExpandedPlacements","oppositePlacement","getOppositeAlignmentPlacement","lrPlacement","rlPlacement","tbPlacement","btPlacement","getSideList","isStart","getOppositeAxisPlacements","flipAlignment","direction","expandPaddingObject","getPaddingObject","rectToClientRect","rect","computeCoordsFromPlacement","_ref","reference","floating","sideAxis","alignLength","isVertical","commonX","commonY","commonAlign","coords","computePosition","strategy","middleware","platform","validMiddleware","statefulPlacement","middlewareData","resetCount","nextX","nextY","reset","detectOverflow","state","_await$platform$isEle","elements","boundary","rootBoundary","elementContext","altBoundary","paddingObject","clippingClientRect","offsetParent","offsetScale","elementClientRect","arrow","arrowDimensions","isYAxis","minProp","maxProp","clientProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","largestPossiblePadding","minPadding","maxPadding","min$1","center","shouldAddOffset","alignmentOffset","flip","_middlewareData$arrow","_middlewareData$flip","initialPlacement","checkMainAxis","checkCrossAxis","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","detectOverflowOptions","initialSideAxis","isBasePlacement","fallbackPlacements","hasFallbackAxisSideDirection","placements","overflow","overflows","overflowsData","sides","_middlewareData$flip2","_overflowsData$filter","nextIndex","nextPlacement","d","resetPlacement","_overflowsData$filter2","currentSideAxis","originSides","convertValueToCoords","mainAxisMulti","crossAxisMulti","rawValue","mainAxis","crossAxis","_middlewareData$offse","diffCoords","shift","limiter","mainAxisCoord","crossAxisCoord","minSide","maxSide","limitedCoords","hasWindow","getNodeName","node","isNode","getWindow","_node$ownerDocument","getDocumentElement","isElement","isHTMLElement","isShadowRoot","invalidOverflowDisplayValues","isOverflowElement","overflowX","overflowY","display","getComputedStyle","tableElements","isTableElement","topLayerSelectors","isTopLayer","transformProperties","willChangeValues","containValues","isContainingBlock","elementOrCss","webkit","isWebKit","css","getContainingBlock","currentNode","getParentNode","isLastTraversableNode","lastTraversableNodeNames","getNodeScroll","result","getNearestOverflowAncestor","parentNode","getOverflowAncestors","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","win","getFrameElement","getCssDimensions","hasOffset","shouldFallback","unwrapElement","getScale","domElement","$","noOffsets","getVisualOffsets","shouldAddVisualOffsets","isFixed","floatingOffsetParent","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scale","visualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","getWindowScrollBarX","leftScroll","getHTMLOffset","documentElement","ignoreScrollbarX","htmlRect","convertOffsetParentRelativeRectToViewportRelativeRect","topLayer","offsets","isOffsetParentAnElement","offsetRect","htmlOffset","getClientRects","getDocumentRect","html","getViewportRect","visualViewport","visualViewportBased","absoluteOrFixed","getInnerBoundingClientRect","getClientRectFromClippingAncestor","clippingAncestor","hasFixedPositionAncestor","stopNode","getClippingElementAncestors","cache","cachedResult","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","ancestor","getClippingRect","clippingAncestors","firstClippingAncestor","clippingRect","accRect","getDimensions","getRectRelativeToOffsetParent","setLeftRTLScrollbarOffset","isStaticPositioned","getTrueOffsetParent","polyfill","rawOffsetParent","getOffsetParent","svgOffsetParent","getElementRects","getOffsetParentFn","getDimensionsFn","floatingDimensions","isRTL","offset$1","shift$1","flip$1","arrow$1","mergedOptions","platformWithCache","computePosition$1","Tooltip$1","TOOLTIP_BG_COLOR","TOOLTIP_TEXT_COLOR","TOOLTIP_ZINDEX","TOOLTIP_CUSTOM_STYLE","CSS_PREFIX","floatingStyle","arrowStyle","targetRect","cellX","cellY","Editor","cursorPos","textBefore","textAfter","isCtrl","isAlt","isShift","isMeta","selectorArrStr","scrollHeight","maxHeight","bottomY","ignoreValue","editorType","textContent","ENABLE_EDIT_CLICK_SELECTOR","Tooltip","EMPTY_TEXT","EMPTY_CUSTOM_STYLE","contentStyle","Overlayer","overlayer","views","_fixedRightWidth","centerCells","leftCells","rightCells","ContextMenu","virtualReference","CONTEXT_MENU","items","menuItemEl","EVirtTable","Empty","_overlayerElement","_editorElement","_emptyElement","_contextMenuElement","ignoreOverlayer","_config","ladong","ValidateFields","scrollError","_err","targetRow","leafCellHeaders","keys","selected"],"mappings":";;;AAwBA,MAAqBA,GAAU;AAAA,EAG3B,YAAYC,GAAqB;AAFzB,IAAAC,EAAA;AAGJ,SAAK,QAAQD;AAAA,EACjB;AAAA,EAEA,SAASE,GAAmB;AACxB,UAAMC,IAAyB,CAAA,GACzB,EAAE,QAAAC,GAAQ,KAAAC,GAAK,KAAAC,GAAK,QAAAC,GAAQ,UAAAC,GAAU,UAAAC,GAAU,OAAAC,GAAO,OAAAC,GAAO,YAAAC,EAAA,IAAeV;AACnF,IAAK,MAAM,QAAQ,KAAK,KAAK,MACzB,KAAK,QAAQ,CAAC,KAAK,KAAK;AAE5B,eAAWW,KAAQ,KAAK,OAAO;AAC3B,UAAIA,EAAK,WAAW;AAChB,cAAMC,IAAuB;AAAA,UACzB,OAAAH;AAAA,UACA,YAAAC;AAAA,UACA,OAAAF;AAAA,UACA,QAAAN;AAAA,UACA,UAAAI;AAAA,UACA,UAAAC;AAAA,UACA,KAAAJ;AAAA,UACA,KAAAC;AAAA,UACA,QAAAC;AAAA,UACA,GAAGM;AAAA,QAAA;AAEP,QAAAA,EAAK,UAAUC,GAAWJ,GAAO,CAACK,MAAY;AAC1C,UAAIA,KACAZ,EAAO,KAAK;AAAA,YACR,GAAGW;AAAA,YACH,SAAAC;AAAA,UAAA,CACH;AAAA,QAET,CAAC;AAAA,MACL;AACA,UAAI,CAACF,EAAK,aAAoCH,KAAU,QAAQA,MAAU;AACtE,eAAOP;AAEX,MAAIU,EAAK,WAAW,CAACA,EAAK,QAAQ,KAAKH,CAAK,KACxCP,EAAO,KAAK;AAAA,QACR,OAAAO;AAAA,QACA,QAAAN;AAAA,QACA,KAAAC;AAAA,QACA,KAAAC;AAAA,QACA,QAAAC;AAAA,QACA,UAAAC;AAAA,QACA,UAAAC;AAAA,QACA,OAAAE;AAAA,QACA,YAAAC;AAAA,QACA,SAASC,EAAK,WAAW,GAAGP,CAAG;AAAA,MAAA,CAClC,GAEDO,EAAK,aAAoCH,KAAU,QAAQA,MAAU,OACrEP,EAAO,KAAK;AAAA,QACR,OAAAO;AAAA,QACA,QAAAN;AAAA,QACA,KAAAC;AAAA,QACA,KAAAC;AAAA,QACA,QAAAC;AAAA,QACA,UAAAC;AAAA,QACA,UAAAC;AAAA,QACA,OAAAE;AAAA,QACA,YAAAC;AAAA,QACA,SAASC,EAAK,WAAW,GAAGP,CAAG;AAAA,MAAA,CAClC;AAAA,IAET;AACA,WAAOH;AAAA,EACX;AACJ;AC5FA,SAASa,KAA4B;AACjC,SAAO,qBAAqB,QAAQ,QAAQ,SAAU,GAAG;AACrD,UAAMC,IAAK,KAAK,OAAA,IAAW,KAAM;AAEjC,YADU,MAAM,MAAMA,IAAKA,IAAI,IAAO,GAC7B,SAAS,EAAE;AAAA,EACxB,CAAC;AACL;AACA,SAASC,GAA0CC,GAASC,GAAkB;AAC1E,MAAIC,IAAiB,GACjBC;AAEJ,SAAO,YAAyCC,GAAgD;AAC5F,UAAMC,KAAM,oBAAI,KAAA,GAAO,QAAA,GACjBC,IAAcD,IAAMH;AAE1B,IAAI,CAACA,KAAkBI,KAAeL,KAClCD,EAAK,MAAM,MAAMI,CAAI,GACrBF,IAAiBG,KACTF,MACRA,IAAY,WAAW,MAAM;AACzB,MAAAH,EAAK,MAAM,MAAMI,CAAI,GACrBF,KAAiB,oBAAI,KAAA,GAAO,QAAA,GAC5BC,IAAY;AAAA,IAChB,GAAGF,IAAQK,CAAW;AAAA,EAI9B;AACJ;AAMA,SAASC,GAAUC,IAAiB,IAAY;AAC5C,SAAIA,EAAK,SACEA,EAAK,IAAI,CAACC,MAASF,GAAUE,EAAK,QAAQ,IAAI,CAAC,EAAE,KAAK,CAACC,GAAGC,MAAMA,IAAID,CAAC,EAAE,CAAC,IAE5E;AACX;AACA,SAASE,GAAUC,IAAgB,IAAI;AACnC,MAAIC,IAAkB,CAAA,GAClBC,IAAoB,CAAA,GACpBC,IAAkB,CAAA;AACtB,SAAAH,EAAI,QAAQ,CAACJ,MAAS;AAClB,IAAIA,EAAK,UAAU,SACfK,EAAM,KAAKL,CAAI,IACRA,EAAK,UAAU,UACtBO,EAAM,KAAKP,CAAI,IAEfM,EAAQ,KAAKN,CAAI;AAAA,EAEzB,CAAC,GACM;AAAA,IACH,GAAGK,EAAM,KAAK,CAACJ,GAAGC,OAAOD,EAAE,QAAQ,MAAMC,EAAE,QAAQ,EAAE;AAAA,IACrD,GAAGI,EAAQ,KAAK,CAACL,GAAGC,OAAOD,EAAE,QAAQ,MAAMC,EAAE,QAAQ,EAAE;AAAA,IACvD,GAAGK,EAAM,KAAK,CAACN,GAAGC,OAAOD,EAAE,QAAQ,MAAMC,EAAE,QAAQ,EAAE;AAAA,EAAA;AAE7D;AACA,SAASM,GAAaJ,IAAgB,CAAA,GAAIK,IAAiB,GAAGC,IAAgB,GAAa;AACvF,SAAON,EAAI,IAAI,CAACO,MAAW;AACvB,QAAIA,EAAO,UAAU;AACjB,UAAIC,IAAU,GACVC,IAAQF,EAAO;AACnB,MAAAA,EAAO,SAAS,QAAQ,CAACX,MAAS;AAC9B,QAAAA,EAAK,QAAQa;AAAA,MACjB,CAAC;AACD,YAAMC,IAAWN,GAAaG,EAAO,UAAUF,IAAS,GAAGC,IAAQ,CAAC;AACpE,aAAII,KACAA,EAAS,QAAQ,CAACd,MAAS;AACvB,QAAAY,KAAWZ,EAAK,WAAW;AAAA,MAC/B,CAAC,GAEE;AAAA,QACH,GAAGW;AAAA,QACH,OAAOA,EAAO;AAAA,QACd,OAAAD;AAAA,QACA,SAAS;AAAA,QACT,SAAAE;AAAA,QACA,UAAAE;AAAA,MAAA;AAAA,IAER;AACA,WAAO;AAAA,MACH,GAAGH;AAAA,MACH,OAAAD;AAAA,MACA,SAASD;AAAA,MACT,SAAS;AAAA,IAAA;AAAA,EAEjB,CAAC;AACL;AACA,SAASM,GAAOX,IAAgB,IAAc;AAC1C,MAAIY,IAAgB,CAAA;AACpB,SAAAZ,EAAI,QAAQ,CAACJ,MAAS;AAClB,IAAIA,EAAK,WACLgB,IAAMA,EAAI,OAAOD,GAAOf,EAAK,QAAQ,CAAC,IAEtCgB,EAAI,KAAKhB,CAAI;AAAA,EAErB,CAAC,GACMgB;AACX;AAcA,MAAMC,KAAsB,sBACtBC,KAAsB,eACtBC,KAAmB;AAOzB,SAASC,GAAqBC,GAAa;AACvC,MAAIjB,IAAM,CAAC,CAAC,EAAE,CAAC;AAEf,MAAIiB,EAAI,WAAW;AACf,WAAOjB;AAGX,MAAI5B,IAAS,GACTC,IAAM,GACN6C;AAEJ,SAAOD,EAAI,SAAS,KACZC,MAAeD,EAAI;AAOvB,QAFAC,IAAaD,EAAI,QAEbA,EAAI,MAAMF,EAAgB;AAC1B,MAAAE,IAAMA,EAAI,QAAQF,IAAkB,EAAE,GAEtC3C,KAAU,GACV4B,EAAI3B,CAAG,EAAED,CAAM,IAAI;AAAA,aACZ6C,EAAI,MAAMJ,EAAmB;AACpC,MAAAI,IAAMA,EAAI,QAAQJ,IAAqB,EAAE,GACzCzC,IAAS,GACTC,KAAO,GAEP2B,EAAI3B,CAAG,IAAI,CAAC,EAAE;AAAA,SACX;AACH,UAAI8C,IAAW;AAEf,UAAIF,EAAI,WAAW,GAAG,GAAG;AACrB,YAAIG,IAAU,GACVC,IAAc;AAElB,eAAOA,KAAa;AAChB,gBAAMC,IAAWL,EAAI,MAAM,GAAG,CAAC;AAE/B,UAAIK,MAAa,QACbF,KAAW,IAGfD,KAAYG,GAEZL,IAAMA,EAAI,MAAM,CAAC,IAEbA,EAAI,WAAW,KAAMA,EAAI,MAAM,WAAW,KAAKG,IAAU,MAAM,OAC/DC,IAAc;AAAA,QAEtB;AAEA,QAAAF,IAAWA,EACN,QAAQ,MAAM,EAAE,EAChB,QAAQ,MAAM,EAAE,EAChB,QAAQ,SAAS,CAACI,MAAU,IAAI,MAAM,KAAK,MAAMA,EAAM,SAAS,CAAC,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK,EAAE,CAAC;AAAA,MAC/F,OAAO;AACH,cAAMC,IAAcP,EAAI,MAAMH,EAAmB;AAEjD,QAAAK,IAAWK,IAAcA,EAAY,CAAC,IAAI,IAC1CP,IAAMA,EAAI,MAAME,EAAS,MAAM;AAAA,MACnC;AAEA,MAAAnB,EAAI3B,CAAG,EAAED,CAAM,IAAI+C;AAAA,IACvB;AAGJ,SAAI,MAAM,QAAQnB,CAAG,KAAKA,EAAI,SAAS,KAC/BA,EAAIA,EAAI,SAAS,CAAC,EAAE,WAAW,KAAKA,EAAIA,EAAI,SAAS,CAAC,EAAE,CAAC,MAAM,OAC/DA,IAAMA,EAAI,MAAM,GAAGA,EAAI,SAAS,CAAC,IAIlCA;AACX;AAQA,SAASyB,GAAuBzB,GAAiB;AAC7C,MAAIf,GACAyC,GACAC,GACAC,GACAX,IAAM,IACNY;AAEJ,OAAK5C,IAAI,GAAGyC,IAAO1B,EAAI,QAAQf,IAAIyC,GAAMzC,KAAK,GAAG;AAG7C,SAFA2C,IAAO5B,EAAIf,CAAC,EAAE,QAET0C,IAAI,GAAGA,IAAIC,GAAMD,KAAK;AACvB,MAAIA,IAAI,MACJV,KAAO,MAEXY,IAAM7B,EAAIf,CAAC,EAAE0C,CAAC,GAEV,OAAOE,KAAQ,WACXA,EAAI,QAAQ;AAAA,CAAI,IAAI,KACpBZ,KAAO,IAAIY,EAAI,QAAQ,MAAM,IAAI,CAAC,MAElCZ,KAAOY,IAEJA,KAAQ,OAEfZ,KAAO,KAEPA,KAAOY;AAIf,IAAI5C,MAAMyC,IAAO,MACbT,KAAO;AAAA;AAAA,EAEf;AAEA,SAAOA;AACX;AAEA,SAASa,GAAgBC,GAAWzD,GAAa0D,IAA4B,CAAA,GAAI;AAC7E,MAAIC,IAAa;AACjB,QAAMC,IAAoB,CAAA;AAC1B,SAAAH,EAAK,QAAQ,CAACnC,GAAWuC,MAAkB;AACvC,QAAIA,MAAU;AACV,MAAAD,EAAQ,KAAK,CAAC;AAAA,SACX;AACH,YAAME,IAAWJ,EAAgB,OAAO,CAACK,GAAK/D,MAAQ,GAAG+D,CAAG,GAAGzC,EAAKtB,CAAG,KAAK,EAAE,IAAI,EAAE,KAAKsB,EAAKtB,CAAG,GAC3FgE,IACFN,EAAgB,OAAO,CAACK,GAAK/D,MAAQ,GAAG+D,CAAG,GAAGN,EAAKI,IAAQ,CAAC,EAAE7D,CAAG,KAAK,EAAE,IAAI,EAAE,KAAKyD,EAAKI,IAAQ,CAAC,EAAE7D,CAAG;AAC1G,MAAI8D,MAAaE,KACbJ,EAAQD,CAAU,KAAK,GACvBC,EAAQ,KAAK,CAAC,MAEdA,EAAQ,KAAK,CAAC,GACdD,IAAaE;AAAA,IAErB;AAAA,EACJ,CAAC,GACMD;AACX;AACA,SAASK,GAAmBlE,GAAUmE,GAAc;AAChD,MAAIC,IAAS,IACTC,IAAS;AACb,QAAMC,IAAe,CAAA;AACrB,SAAAH,EAAQ,QAAQ,CAAC5C,GAAWuC,MAAkB;AAC1C,IAAIA,MAAU,KACVM,IAAS7C,EAAK,KACd8C,IAAS9C,EAAK,KACd+C,EAAQ/C,EAAK,GAAG,IAAI,KAGhBvB,EAAIuB,EAAK,GAAG,MAAMvB,EAAIoE,CAAM,KAC5BE,EAAQ/C,EAAK,GAAG,IAAI,GACpB+C,EAAQD,CAAM,KAAK,MAEnBC,EAAQ/C,EAAK,GAAG,IAAI,GACpB6C,IAAS7C,EAAK,KACd8C,IAAS9C,EAAK;AAAA,EAG1B,CAAC,GACM+C;AACX;AAEA,SAASC,GAAa1E,GAAoB2E,GAAqBb,IAA4B,CAAA,GAAI;AAE3F,QAAM,EAAE,aAAAc,GAAa,UAAArE,GAAU,WAAAsE,EAAA,IAAc7E,GACvCgE,IAAUJ,GAAgBgB,GAAaD,GAAab,CAAe;AACzE,SAAIE,EAAQzD,IAAWsE,CAAS,MAAM,IAC3B;AAAA,IACH,SAAS;AAAA,IACT,SAAS;AAAA,IACT,iBAAAf;AAAA,IACA,UAAU;AAAA,EAAA,IAGX;AAAA,IACH,SAASE,EAAQzD,IAAWsE,CAAS;AAAA,IACrC,SAAS;AAAA,IACT,iBAAAf;AAAA,IACA,UAAU;AAAA,EAAA;AAElB;AACA,SAASgB,GAAa9E,GAAoB+E,IAAyB,IAAI;AACnE,QAAM,EAAE,QAAA7E,GAAQ,KAAAC,GAAK,oBAAA6E,EAAA,IAAuBhF,GACtCsE,IAAUU,EAAmB,OAAO,CAACtD,MAASqD,EAAa,SAASrD,EAAK,GAAG,CAAC;AAEnF,MAAIqD,EAAa,SAAS7E,EAAO,GAAG,GAAG;AACnC,UAAMuE,IAAUJ,GAAmBlE,GAAKmE,CAAO;AAC/C,WAAIG,EAAQvE,EAAO,GAAG,MAAM,IACjB;AAAA,MACH,SAAS;AAAA,MACT,SAAS;AAAA,MACT,iBAAiB6E;AAAA,MACjB,UAAU;AAAA,IAAA,IAGX;AAAA,MACH,SAAS;AAAA,MACT,SAASN,EAAQvE,EAAO,GAAG;AAAA,MAC3B,iBAAiB6E;AAAA,MACjB,UAAU;AAAA,IAAA;AAAA,EAElB;AACJ;AAOA,SAASE,GAAUC,GAAcC,IAAkB,SAAS,iBAAyB;AACjF,QAAM/E,IAAM8E,EAAK,WAAW,IAAI,IAAIA,IAAO,KAAKA,CAAI;AAEpD,SADe,iBAAiBC,CAAE,EACpB,iBAAiB/E,CAAG,EAAE,KAAA;AACxC;ACpVA,MAAqBgF,GAAS;AAAA,EAQ1B,YAAYC,GAAcC,GAAWC,GAAWC,GAAeC,GAAgBC,GAAoBnD,GAAe;AAPlH,IAAAxC,EAAA;AACA,IAAAA,EAAA,WAAI;AACJ,IAAAA,EAAA,WAAI;AACJ,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA,gBAAS;AACT,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEI,SAAK,MAAMsF,GACX,KAAK,IAAIC,GACT,KAAK,IAAIC,GACT,KAAK,QAAQC,GACb,KAAK,SAASC,GACd,KAAK,QAAQlD,GACb,KAAK,WAAWmD;AAAA,EACpB;AAAA,EACA,sBAAsB;AAClB,QAAI,KAAK;AACL,aAAO;AAEX,UAAM,EAAE,YAAAC,GAAY,gBAAAC,GAAgB,SAAAC,GAAS,iBAAAC,EAAA,IAAoB,KAAK,KAChEC,IAAcJ;AACpB,WAAO,EACH,KAAK,IAAI,KAAK,QAAQC,IAAiBC,KAAW,KAAK,KAAK,IAAIA,KAAWE,IAAcD;AAAA,EAEjG;AAAA,EACA,oBAAoB;AAChB,UAAM,EAAE,aAAAE,GAAa,SAAAC,EAAA,IAAY,KAAK,KAChCC,IAAeF;AACrB,WAAO,EAAE,KAAK,IAAI,KAAK,SAASC,KAAW,KAAK,KAAK,IAAIA,KAAWC;AAAA,EACxE;AAAA,EACA,WAAW;AACP,QAAI,KAAK,UAAU;AACf,aAAO,KAAK;AAEhB,QAAI,KAAK,UAAU,SAAS;AAExB,YAAM;AAAA,QACF,YAAAP;AAAA,QACA,QAAQ,EAAE,qBAAAQ,EAAA;AAAA,MAAoB,IAC9B,KAAK;AAET,aADUR,KAAc,KAAK,IAAI,OAAO,QAAQ,KAAK,KAAKQ;AAAA,IAE9D;AACA,WAAO,KAAK,IAAI,KAAK,IAAI;AAAA,EAC7B;AAAA,EACA,WAAW;AACP,WAAI,KAAK,aAAa,WACX,KAAK,IAGZ,KAAK,aAAa,YAAY,KAAK,IAAI,OAAO,eACvC,KAAK,IAET,KAAK,IAAI,KAAK,IAAI;AAAA,EAC7B;AAAA,EACA,gBAAgB;AACZ,WAAO,KAAK,IAAI,KAAK,IAAI;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB;AAAA,EAcjB;AACJ;AC5DA,MAAqBC,WAAahB,GAAS;AAAA,EAyDvC,YACIC,GACA9E,GACAD,GACAgF,GACAC,GACAC,GACAC,GACAvF,GACAC,GACAuF,IAAqB,QACvB;AACE,UAAML,GAAKC,GAAGC,GAAGC,GAAOC,GAAQC,GAAUxF,EAAO,KAAK;AApE1D,IAAAH,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,uBAAyB;AACzB,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,iBAAU;AACV,IAAAA,EAAA,iBAAU;AACV,IAAAA,EAAA,kBAAW;AACX,IAAAA,EAAA,kBAAW;AACX,IAAAA,EAAA,yBAA4B,CAAA;AAC5B;AAAA,IAAAA,EAAA,yBAA4B,CAAA;AAC5B;AAAA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,eAAa,CAAA;AACb,IAAAA,EAAA,eAAsB,CAAA;AACtB,IAAAA,EAAA,iBAAkB;AAClB,IAAAA,EAAA,cAAe;AACf,IAAAA,EAAA,qBAAsB;AACtB,IAAAA,EAAA,sBAAe;AACf,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,sBAAe;AACf,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA,yBAAkB;AAClB,IAAAA,EAAA,4BAAqB;AACrB,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,wBAAiB;AACjB,IAAAA,EAAA,yBAAkB;AAClB,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA;AACA,IAAAA,EAAA,kBAAW;AACX,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,wBAAiB;AACjB,IAAAA,EAAA,6BAAsB;AACtB,IAAAA,EAAA,+BAA+C;AAC/C,IAAAA,EAAA,iCAA0B;AAC1B,IAAAA,EAAA,kCAAqD;AAejD,SAAK,eAAe,KAAK,OACzB,KAAK,gBAAgB,KAAK,QAC1B,KAAK,WAAWO,GAChB,KAAK,WAAWC,GAChB,KAAK,MAAML,EAAO,KAClB,KAAK,OAAOA,EAAO,QAAQ,IAC3B,KAAK,aAAaA,EAAO,cAAc,QACvC,KAAK,wBAAwBA,EAAO,yBAAyB,KAAK,IAAI,OAAO,4BAA4B,SACzG,KAAK,cAAcA,EAAO,eAAe,CAAA,GACzC,KAAK,WAAWwF,GAChB,KAAK,QAAQxF,EAAO,SAAS,UAC7B,KAAK,gBAAgBA,EAAO,iBAAiB,UAC7C,KAAK,QAAQA,EAAO,OACpB,KAAK,QAAQA,EAAO,SAAS,GAC7B,KAAK,YAAYA,EAAO,aAAa,IACrC,KAAK,SAASA,GACd,KAAK,QAAQA,EAAO,SAAS,CAAA,GAC7B,KAAK,MAAMC,GACX,KAAK,SACD,KAAK,aAAa,SACZ,KAAK,IAAI,SAAS,qBAAqBI,CAAQ,IAC/C,GAAG,KAAK,QAAQ,IAAI,KAAK,QAAQ,IAC3C,KAAK,QAAQ,KAAK,SAAA,GAClB,KAAK,SAASL,EAAO,QACrB,KAAK,sBAAsBA,EAAO,wBAAwB,IAC1D,KAAK,0BAA0BA,EAAO,2BAA2B,KACjE,KAAK,2BAA2BA,EAAO,4BAA4B,OACnE,KAAK,eAAeA,EAAO,cAC3B,KAAK,gBAAgBA,EAAO,eAC5B,KAAK,YAAYA,EAAO,WACxB,KAAK,kBAAkBA,EAAO,iBAC9B,KAAK,OAAA;AAAA,EACT;AAAA,EACA,eAAesF,GAAeC,GAAgB;AAC1C,SAAK,QAAQD,GACb,KAAK,SAASC;AAAA,EAClB;AAAA,EACA,uBAAuB;AACnB,UAAMxF,IAAS,KAAK,IAAI,SAAS,mBAAmB,KAAK,QAAQ,KAAK,GAAG;AACzE,QAAI,MAAM,QAAQA,CAAM,KAAKA,EAAO,QAAQ;AACxC,YAAM,CAACoG,CAAG,IAAIpG;AACd,WAAK,UAAUoG,EAAI,WAAW;AAAA,IAClC;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,SAAS;AACL,SAAK,QAAQ,KAAK,SAAA,GAClB,KAAK,QAAQ,KAAK,SAAA,GAClB,KAAK,YAAY,KAAK,OACtB,KAAK,YAAY,KAAK,OACtB,KAAK,eAAe,KAAK,IAAI,SAAS,iBAAiB,KAAK,QAAQ,KAAK,GAAG,GAC5E,KAAK,WAAA,GACL,KAAK,YAAA,GACL,KAAK,WAAA,GACL,KAAK,gBAAA,GACL,KAAK,gBAAA,GACL,KAAK,WAAA,GACL,KAAK,aAAA,GACL,KAAK,aAAA,GACL,KAAK,qBAAA,GACL,KAAK,gBAAA,GACL,KAAK,OAAO,KAAK,QAAA,GACjB,KAAK,cAAc,KAAK,eAAA;AAAA,EAC5B;AAAA,EACA,aAAa;AAET,QAAI,KAAK,aAAa;AAClB;AAEJ,UAAM,EAAE,aAAAC,EAAA,IAAgB,KAAK,IAAI;AACjC,QAAI,OAAOA,KAAgB,YAAY;AACnC,YAAMC,IAAyBD,GACzB;AAAA,QACF,SAAAhE,IAAU;AAAA,QACV,SAAAkE,IAAU;AAAA,QACV,iBAAA1C;AAAA,QACA,iBAAA2C;AAAA,QACA,UAAAC,IAAW;AAAA,QACX,UAAAC,IAAW;AAAA,MAAA,IACXJ,EAAW;AAAA,QACX,KAAK,KAAK;AAAA,QACV,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK,SAAA;AAAA,QACZ,WAAW,KAAK,IAAI,KAAK;AAAA,QACzB,cAAc,KAAK,IAAI,SAAS,uBAAuB,KAAK,IAAI,KAAK,SAAS;AAAA,QAC9E,aAAa,KAAK,IAAI,KAAK;AAAA,QAC3B,oBAAoB,KAAK,IAAI,OAAO;AAAA,QACpC,MAAM,KAAK,IAAI,KAAK;AAAA,MAAA,CACvB,KAAK,CAAA;AACN,MAAI,MAAM,QAAQzC,CAAe,KAAKA,EAAgB,SAAS,IAC3D,KAAK,kBAAkBA,IAEvB,KAAK,kBAAkB,CAAC,KAAK,GAAG,GAEhC,MAAM,QAAQ2C,CAAe,KAAKA,EAAgB,SAAS,IAC3D,KAAK,kBAAkBA,IAEvB,KAAK,kBAAkB,CAAC,KAAK,GAAG,GAEpC,KAAK,WAAWE,GAChB,KAAK,WAAWD,GAChB,KAAK,UAAUpE,GACf,KAAK,UAAUkE,GACf,KAAK,eAAe,KAAK,0BAA0B,KAAK,UAAU,KAAK,OAAO,GAC9E,KAAK,gBAAgB,KAAK,IAAI,SAAS,2BAA2B,KAAK,UAAU,KAAK,OAAO;AAAA,IACjG;AAAA,EACJ;AAAA,EACA,iBAAiB;AAEb,QAAI,KAAK,YAAY,KAAK,UAAU;AAChC,YAAMI,IAAW,KAAK,YAAA;AACtB,WAAK,SAASA,EAAS,QACvB,KAAK,QAAQA,EAAS,OACtB,KAAK,QAAQ,KAAK,SAAA,GAClB,KAAK,QAAQ,KAAK,SAAA,GAClB,KAAK,SAASA,EAAS,WACvB,KAAK,SAASA,EAAS;AAAA,IAC3B;AAAA,EACJ;AAAA,EACA,aAAa;AAET,UAAM,EAAE,uBAAAC,EAAA,IAA0B,KAAK,IAAI;AAC3C,QAAI,OAAOA,KAA0B,YAAY;AAE7C,YAAMC,IADiCD,EACX;AAAA,QACxB,KAAK,KAAK;AAAA,QACV,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK,SAAA;AAAA,MAAS,CACxB;AAED,MAAIC,MAAS,WACT,KAAK,OAAOA;AAAA,IAEpB;AAAA,EACJ;AAAA,EACA,eAAe;AAEX,UAAM,EAAE,yBAAAC,EAAA,IAA4B,KAAK,IAAI;AAC7C,QAAI,OAAOA,KAA4B,YAAY;AAE/C,YAAMC,IADqCD,EACN;AAAA,QACjC,KAAK,KAAK;AAAA,QACV,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK,SAAA;AAAA,MAAS,CACxB;AAED,UAAIC,MAAgB,QAAW;AAC3B,cAAM,EAAE,MAAAF,GAAM,OAAAG,IAAQ,CAAA,MAAOD;AAC7B,aAAK,aAAaF,GAClB,KAAK,cAAcG;AAAA,MACvB;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,eAAe;AACX,UAAM,EAAE,yBAAAC,EAAA,IAA4B,KAAK,IAAI;AAC7C,QAAI,OAAOA,KAA4B,YAAY;AAE/C,YAAMC,IADqCD,EACX;AAAA,QAC5B,KAAK,KAAK;AAAA,QACV,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK,SAAA;AAAA,MAAS,CACxB;AAED,MAAIC,MAAW,WACX,KAAK,SAASA;AAAA,IAEtB;AAAA,EACJ;AAAA,EACA,WAAW;AACP,SAAK,IAAI,SACJ,aAAa,KAAK,QAAQ,KAAK,GAAG,EAClC,KAAK,MAAM;AACR,WAAK,IAAI,SAAS,mBAAmB,KAAK,QAAQ,KAAK,KAAK,EAAE,GAC9D,KAAK,UAAU;AAAA,IACnB,CAAC,EACA,MAAM,CAAClH,MAAW;AACf,UAAI,MAAM,QAAQA,CAAM,KAAKA,EAAO,QAAQ;AACxC,cAAM,CAACoG,CAAG,IAAIpG;AACd,aAAK,UAAUoG,EAAI,SACnB,KAAK,IAAI,SAAS,mBAAmB,KAAK,QAAQ,KAAK,KAAKpG,CAAM;AAAA,MACtE;AAAA,IACJ,CAAC,EACA,QAAQ,MAAM;AACX,WAAK,IAAI,KAAK,MAAM;AAAA,IACxB,CAAC;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc;AACV,SAAK,QAAQ,KAAK,uBAAA;AAAA,EACtB;AAAA,EACQ,aAAa;AACjB,UAAM,EAAE,cAAAmH,IAAe,EAAA,IAAM,KAAK,IAAI,QAChC,EAAE,QAAA/G,GAAQ,UAAAqF,EAAA,IAAa;AAC7B,QAAI2B,GACAC,IAAc,GACdC,IAAW;AACf,QAAI,KAAK,SAAS,UAAU7B,MAAa,QAAQ;AAC7C,YAAMvF,IAAM,KAAK,IAAI,SAAS,gBAAgBE,CAAM,GAC9C,EAAE,QAAAmH,IAAS,IAAO,aAAAC,IAAc,IAAO,eAAAC,IAAgB,IAAO,OAAAtF,IAAQ,EAAA,IAAMjC,KAAO,CAAA;AAGzF,UAFA,KAAK,YAAYqH,GACjB,KAAK,iBAAiBC,GAClBC,GAAe;AACf,cAAMC,IAAc,KAAK,IAAI,MAAM,IAAI,SAAS;AAChD,QAAAJ,IAAW,WACXF,IAAOM,GACPL,IAAclF,IAAQ;AAAA,MAC1B,WAAWqF,GAAa;AACpB,cAAMG,IAAa,KAAK,IAAI,MAAM,IAAI,QAAQ,GACxCC,IAAa,KAAK,IAAI,MAAM,IAAI,QAAQ;AAC9C,QAAAR,IAAQG,IAAsBK,IAAbD,GACjBL,IAAYC,IAAoB,WAAX,UACrBF,IAAclF,IAAQ;AAAA,MAC1B;AACI,QAAAkF,IAAclF,IAAQ;AAE1B,UAAI0F,IAAY,IACZC,IAAa;AACjB,UAAIV,GAAM;AACN,YAAIW,IAAQ,KAAK,QAAQV,IAAcF,GACnCa,IAAQ,KAAK,SAAS,KAAK,gBAAgBF,KAAc;AAC7D,aAAK,IAAI,MAAM,UAAUV,GAAMW,GAAOC,GAAOH,GAAWC,CAAU,GAClE,KAAK,aAAaC,GAClB,KAAK,aAAaC,GAClB,KAAK,iBAAiBH,GACtB,KAAK,kBAAkBC,GACvB,KAAK,gBAAgBR,GACrB,KAAK,kBAAkBF;AAAA,MAC3B;AAEA,WAAK,QAAQ,QACb,KAAK,YAAYC,IAAc,KAAK,QAAQQ,IAAY;AAAA,IAC5D;AAAA,EACJ;AAAA,EACQ,kBAAkB;AACtB,UAAM;AAAA,MACF,eAAAI;AAAA,MACA,eAAAC;AAAA,MACA,wBAAAC;AAAA,MACA,0BAAAC;AAAA,MACA,qBAAAC;AAAA,MACA,iBAAAC;AAAA,MACA,mBAAAC;AAAA,MACA,iBAAAC;AAAA,MACA,wBAAAC;AAAA,MACA,8BAAAC;AAAA,MACA,qBAAAC;AAAA,MACA,2BAAAC;AAAA,MACA,QAAAC;AAAA,MACA,cAAAC;AAAA,IAAA,IACA,KAAK,IAAI;AACb,QAAI,KAAK,aAAa,UAAU;AAC5B,UAAIC,IAAUP,GACVQ,IAAYT;AAChB,UAAI,OAAOH,KAA6B,YAAY;AAChD,cAAMa,IAAyCb,GACzC,EAAE,iBAAAc,GAAiB,OAAAC,EAAA,IACrBF,EAAsB;AAAA,UAClB,KAAK,KAAK;AAAA,UACV,UAAU,KAAK;AAAA,UACf,UAAU,KAAK;AAAA,UACf,QAAQ,KAAK;AAAA,UACb,OAAO,KAAK,SAAA;AAAA,QAAS,CACxB,KAAK,CAAA;AACV,QAAIC,MACAH,IAAUG,IAGVC,MACAH,IAAYG;AAAA,MAEpB;AAEA,WAAK,qBAAqB,eAC1B,KAAK,kBAAkBJ,GACvB,KAAK,gBAAgBC;AACrB;AAAA,IACJ;AAEA,QAAII,IAAqB;AAEzB,UAAMC,IAAY,KAAK,IAAI,WACrBC,IAAc,KAAK,IAAI;AAE7B,QAAIC,IAAO,KAAK,UACZC,IAAO,KAAK;AAChB,QAAI,KAAK,YAAY,MAAMb,KAAuBF,IAAyB;AACvE,YAAM9B,IAAW,KAAK,YAAA,GAChB,EAAE,MAAA8C,MAAS9C;AACjB,MAAA4C,IAAOE,EAAK,CAAC,GACbD,IAAOC,EAAK,CAAC;AAAA,IACjB;AACA,IAAId,KAAuBU,MACnBA,EAAU,WAAW,KAAK,WAC1BD,IAAqBR,IAErBS,EAAU,YAAYE,KAAQF,EAAU,YAAYG,MACpDJ,IAAqBR,KAIzBH,KAA0Ba,MACtBA,EAAY,WAAW,KAAK,WAC5BF,IAAqBV,IAErBY,EAAY,YAAYC,KAAQD,EAAY,YAAYE,MACxDJ,IAAqBV,KAI7B,KAAK,qBAAqBU;AAE1B,QAAIL,IAAUd,GACVe,IAAYV;AAehB,QAbK,KAAK,IAAI,SAAS,YAAY,KAAK,QAAQ,KAAK,GAAG,MACpDS,IAAUb,GACVc,IAAYX,IAGZQ,MACI,KAAK,WAAW,IAChBE,IAAUD,IAEVC,IAAUd,IAId,OAAOE,KAA2B,YAAY;AAC9C,YAAMuB,IAAmCvB,GACnC,EAAE,iBAAAe,GAAiB,OAAAC,EAAA,IACrBO,EAAgB;AAAA,QACZ,KAAK,KAAK;AAAA,QACV,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,cAAc,KAAK;AAAA,QACnB,OAAO,KAAK,SAAA;AAAA,MAAS,CACxB,KAAK,CAAA;AACV,MAAIR,MACAH,IAAUG,IAGVC,MACAH,IAAYG;AAAA,IAEpB;AACA,SAAK,kBAAkBJ,GACvB,KAAK,gBAAgBC;AAAA,EACzB;AAAA,EACQ,kBAAkB;AACtB,UAAM,EAAE,cAAAW,GAAc,eAAAC,GAAe,SAAArD,GAAS,SAAAlE,GAAS,UAAAoD,GAAU,MAAAoB,GAAM,UAAAvG,GAAU,QAAAF,EAAA,IAAW;AAE5F,QAAI,EAAAmG,MAAY,KAAKlE,MAAY,MAI7BoD,MAAa,YAIb,CAAC,mBAAmB,WAAW,EAAE,SAASoB,CAAI,GAAG;AACjD,YAAMgD,IAAQ,KAAK,IAAI,SAAS,gBAAgBzJ,CAAM,GAChD0J,IAAa,KAAK,IAAI,SAAS,iBAAiB1J,CAAM,GACtD,EAAE,eAAA2J,IAAgB,EAAA,IAAM,KAAK,IAAI,QACjCC,IAAK,KAAK,SAASL,IAAeI,KAAiB,GACnDE,IAAK,KAAK,SAASL,IAAgBG,KAAiB;AAC1D,UAAIG,IAA8C,KAAK,IAAI,MAAM,IAAI,kBAAkB,GACnFC,IAAe;AACnB,MAAIN,KAASC,KACTI,IAAgB,KAAK,IAAI,MAAM,IAAI,gBAAgB,GACnDC,IAAe,oBACRN,KAASC,KAChBI,IAAgB,KAAK,IAAI,MAAM,IAAI,yBAAyB,GAC5DC,IAAe,6BACR,CAACN,KAASC,KACjBI,IAAgB,KAAK,IAAI,MAAM,IAAI,kBAAkB,GACrDC,IAAe,uBAEfD,IAAgB,KAAK,IAAI,MAAM,IAAI,mBAAmB,GACtDC,IAAe,sBAEfD,KAAiBrD,KAAQ,qBAEpB,KAAK,IAAI,aAAa,KAAK,IAAI,UAAU,aAAavG,KACvD,CAAC,qBAAqB,gBAAgB,EAAE,SAAS6J,CAAY,OAE7D,KAAK,aAAaH,GAClB,KAAK,aAAaC,GAClB,KAAK,iBAAiBF,GACtB,KAAK,kBAAkBA,GACvB,KAAK,gBAAgBI,GACrB,KAAK,kBAAkBD,KAEpBA,KAAiCrD,MAAhB,gBACxB,KAAK,aAAamD,GAClB,KAAK,aAAaC,GAClB,KAAK,iBAAiBF,GACtB,KAAK,kBAAkBA,GACvB,KAAK,gBAAgBI,GACrB,KAAK,kBAAkBD;AAAA,IAE/B;AAAA,EACJ;AAAA,EACQ,kBAAkB;AAEtB,QADiB,KAAK,IAAI,SAAS,YAAY,KAAK,QAAQ,KAAK,GAAG;AAEhE;AAEJ,UAAM,EAAE,6BAAAE,GAA6B,sBAAAC,GAAsB,cAAAlD,GAAc,wBAAAmD,MACrE,KAAK,IAAI;AACb,QAAI,OAAOF,KAAgC,YAAY;AAEnD,YAAMG,IADuCH,EACP;AAAA,QAClC,KAAK,KAAK;AAAA,QACV,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK,SAAA;AAAA,MAAS,CACxB;AAED,MAAIG,MAAkB,WAClB,KAAK,gBAAgBA;AAAA,IAE7B;AAEA,UAAM,EAAE,WAAAlB,MAAc,KAAK;AAC3B,QAAI,KAAK,iBAAiB,CAAC,KAAK,IAAI,WAAWA,GAAW;AACtD,UAAIW,IAAK,GACLC,IAAK;AAMT,UALIZ,EAAU,WAAW,KAAK,WAC1BW,IAAK,KAAK,QAAQ,KAAK,QAAQK,IAAuBlD,GACtD8C,IAAK,KAAK,SAAS,KAAK,SAASI,KAAwB,IAGzD,KAAK,YAAY,KAAKC,GAAwB;AAC9C,cAAM3D,IAAW,KAAK,YAAA,GAChB,EAAE,MAAA8C,MAAS9C,GACX4C,IAAOE,EAAK,CAAC,GACbD,IAAOC,EAAK,CAAC;AACnB,YAAIJ,EAAU,YAAYE,KAAQF,EAAU,YAAYG,GAAM;AAC1D,gBAAM,EAAE,OAAAjE,GAAO,QAAAC,GAAQ,WAAAgF,GAAW,YAAAC,MAAe9D;AACjD,UAAAqD,IAAK,KAAK,QAAQS,IAAalF,IAAQ8E,IAAuBlD,GAC9D8C,IAAK,KAAK,QAAQO,KAAahF,IAAS6E,KAAwB;AAAA,QACpE;AAAA,MACJ;AACA,YAAMK,IAAkB,KAAK,IAAI,MAAM,IAAI,KAAK,aAAa;AAC7D,WAAK,aAAaV,GAClB,KAAK,aAAaC,GAClB,KAAK,iBAAiBI,GACtB,KAAK,kBAAkBA,GACvB,KAAK,gBAAgB,KAAK,eAC1B,KAAK,kBAAkBK;AAAA,IAC3B;AAAA,EACJ;AAAA;AAAA,EAEA,cAAwB;AACpB,WAAO,KAAK,IAAI,SAAS,YAAY,IAAI;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB;AACb,WAAI,KAAK,aAAa,WAEd,KAAK,gBAGL,KAAK,SAAS,QAAQ,KAAK,SAAS,SAC7B,KAEJ,KAAK,OAIR,KAAK,YAAY,KAAK,KAAK,YAAY,KAIvC,KAAK,UAKL,KAAK,SAAS,sBACZ,KAAK,IAAI,aAAa,KAAK,IAAI,UAAU,aAAa,KAAK,YACzD,CAAC,qBAAqB,gBAAgB,EAAE,SAAS,KAAK,aAAa,MAIvE,KAAK,SAAS,QAAQ,KAAK,SAAS,SAC7B,KAEJ,GAAG,KAAK,IAAI;AAAA,EAE3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACN,QAAI,KAAK,aAAa;AAClB,aAAI,OAAO,KAAK,mBAAoB,aAClB,KAAK,gBAAgB;AAAA,QAC/B,KAAK,KAAK;AAAA,QACV,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK,IAAI,KAAK,GAAG;AAAA,MAAA,CAC3B,IAGE,KAAK,IAAI,KAAK,GAAG;AAK5B,QAAI,OAAO,KAAK,aAAc;AAQ1B,aAPc,KAAK,UAAU;AAAA,QACzB,KAAK,KAAK;AAAA,QACV,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK,SAAA;AAAA,MAAS,CACxB;AAGL,UAAM,EAAE,4BAAAC,EAAA,IAA+B,KAAK,IAAI;AAChD,WAAI,OAAOA,KAA+B,aACGA,EACX;AAAA,MAC1B,KAAK,KAAK;AAAA,MACV,UAAU,KAAK;AAAA,MACf,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,MACb,OAAO,KAAK,SAAA;AAAA,IAAS,CACxB,IAGD,CAAC,mBAAmB,OAAO,EAAE,SAAS,KAAK,IAAI,IACnC,GAAG,KAAK,WAAW,CAAC,MAGpC,KAAK,QAAQ,KAAK,IAAI,SAAS,aAAa,KAAK,QAAQ,KAAK,GAAG,GAC1D,KAAK;AAAA,EAChB;AAAA,EACA,WAAW;AACP,WAAO,KAAK,IAAI,SAAS,aAAa,KAAK,QAAQ,KAAK,GAAG;AAAA,EAC/D;AAAA;AAAA,EAEA,SAASpK,GAAY;AACjB,SAAK,IAAI,qBAAqB,KAAK,QAAQ,KAAK,KAAKA,CAAK;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAIA,yBAAyB;AACrB,QAAIqK,IAAO,GAAG,KAAK,QAAQ,KAAK,IAAI,cAAc,MAC9CC,IAAM,GAAG,KAAK,QAAQ,KAAK,IAAI,KAAK,CAAC;AAEzC,WAAI,KAAK,UAAU,SACfD,IAAO,GAAG,KAAK,KAAK,OACb,KAAK,UAAU,YACtBA,IAAO,GAAG,KAAK,SAAS,KAAK,IAAI,aAAa,KAAK,IAAI,gBAAgB,OAGvE,KAAK,aAAa,YACd,KAAK,IAAI,OAAO,iBAChBC,IAAM,GAAG,KAAK,QAAQ,KAAK,IAAI,OAAO,CAAC,OAGxC;AAAA,MACH,UAAU;AAAA,MACV,UAAU;AAAA,MACV,MAAAD;AAAA,MACA,KAAAC;AAAA,MACA,OAAO,GAAG,KAAK,YAAY;AAAA,MAC3B,QAAQ,GAAG,KAAK,aAAa;AAAA,MAC7B,eAAe;AAAA,MACf,YAAY;AAAA,IAAA;AAAA,EAEpB;AAAA,EACA,gBAAgB;AACZ,UAAM;AAAA,MACF,OAAAC;AAAA,MACA,QAAQ,EAAE,cAAAC,GAAc,QAAAC,EAAA;AAAA,IAAO,IAC/B,KAAK,KACH,EAAE,OAAAC,GAAO,OAAAC,EAAA,IAAU;AACzB,IAAAJ,EAAM,SAASG,GAAOC,GAAO,KAAK,cAAc,KAAK,eAAe;AAAA,MAChE,aAAaF,IAASD,IAAe;AAAA,MACrC,WAAW,KAAK;AAAA,IAAA,CACnB,GAEDD,EAAM,SAASG,GAAOC,GAAO,KAAK,OAAO,KAAK,QAAQ;AAAA,MAClD,aAAa;AAAA,MACb,WAAW,KAAK;AAAA,IAAA,CACnB,GAEIF,KACD,KAAK,IAAI,MAAM;AAAA,MACX,CAACC,GAAOC,IAAQ,KAAK,eAAeD,IAAQ,KAAK,cAAcC,IAAQ,KAAK,aAAa;AAAA,MACzF;AAAA,QACI,aAAaH;AAAA,QACb,WAAWA;AAAA,QACX,aAAa;AAAA,QACb,SAAS;AAAA,QACT,UAAU;AAAA,MAAA;AAAA,IACd;AAAA,EAGZ;AAAA,EACQ,oBAAoB;AACxB,QAAI,KAAK,aAAa;AAClB;AAEJ,UAAM,EAAE,qBAAAI,GAAqB,iBAAAC,GAAiB,iBAAAC,GAAiB,6BAAAC,MAAgC,KAAK,IAAI;AAOxG,QANI,CAACD,KAGD,CAACD,KAGD,KAAK,IAAI;AACT;AAGJ,UAAM,EAAE,MAAAG,GAAM,MAAA9B,EAAA,IAAS,KAAK,IAAI,UAC1B+B,IAAOD,EAAK,CAAC,GACb/B,IAAOC,EAAK,CAAC,GACb,EAAE,UAAApJ,GAAU,UAAAC,GAAU,OAAA2K,GAAO,OAAAC,MAAU;AAE7C,QAAY7K,MAAamL,KAAQlL,MAAakJ,GAAM;AAKhD,YAAMiC,IAHFpL,MAAa,KAAK,IAAI,eACtBC,MAAa,KAAK,IAAI,eACtBD,MAAa,KAAK,IAAI,qBACA,IAAI;AAC9B,WAAK,IAAI,MAAM,SAAS4K,IAAQ,KAAK,QAAQQ,GAAQP,IAAQ,KAAK,SAASO,GAAQ,GAAG,GAAG;AAAA,QACrF,aAAaH;AAAA,QACb,WAAWH;AAAA,MAAA,CACd;AAAA,IACL;AAAA,EACJ;AAAA,EACA,OAAO;AAEH,SAAK,SAAA,GACL,KAAK,UAAA,GACL,KAAK,aAAA,GACL,KAAK,kBAAA,GACL,KAAK,aAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKQ,0BAA0B9K,GAAkBqL,GAAiB;AACjE,QAAIA,MAAY;AACZ,aAAO;AAEX,QAAInG,IAAQ;AACZ,aAASoG,IAAItL,GAAUsL,IAAItL,IAAWqL,GAASC,KAAK;AAChD,YAAMC,IAAa,KAAK,IAAI,OAAO,gBAAgBD,CAAC;AACpD,MAAApG,KAASqG,EAAW;AAAA,IACxB;AACA,WAAOrG;AAAA,EACX;AAAA,EACQ,WAAW;AACf,UAAM,EAAE,cAAA4B,GAAc,WAAA0E,GAAW,mBAAAC,EAAA,IAAsB,KAAK,IAAI;AAChE,QAAInC,IAAe,KAAK;AACxB,QAAI,KAAK,SAAS,QAAQ;AACtB,YAAMoC,IAAc,KAAK,YAAY,KAAK;AAC1C,MAAApC,IAAe,KAAK,eAAeoC;AAAA,IACvC;AACA,UAAM,EAAE,UAAAC,EAAA,IAAa,KAAK,IAAI,MAAM,eAAe,KAAK,aAAarC,GAAcxC,GAAc0E,CAAS;AAC1G,SAAK,WAAWG;AAChB,UAAM,EAAE,aAAAC,MAAgB,KAAK;AAC7B,QAAIC,IAAO,KAAK,aACZ/C,IAAQ,KAAK;AAGjB,WACI,CAFe,KAAK,IAAI,SAAS,YAAY,KAAK,QAAQ,KAAK,GAAG,KAGlE8C,KACA,CAAC,IAAI,MAAM,MAAS,EAAE,SAAS,KAAK,IAAI,KACxC,KAAK,aAAa,UAClB,EAAE,KAAK,YAAY,KAAK,KAAK,YAAY,OAEzCC,IAAOD,GACP9C,IAAQ2C,IAEL,KAAK,IAAI,MAAM,SAASI,GAAM,KAAK,WAAW,KAAK,WAAWvC,GAAc,KAAK,eAAe;AAAA,MACnG,MAAMkC;AAAA,MACN,SAAS1E;AAAA,MACT,OAAO,KAAK;AAAA,MACZ,eAAe,KAAK;AAAA,MACpB,OAAAgC;AAAA,IAAA,CACH;AAAA,EACL;AAAA,EACQ,YAAY;AAChB,QAAK,KAAK,iBAGV;AAAA,UAAI,KAAK,eAAe;AACpB,cAAM,EAAE,0BAAAgD,GAA0B,8BAAAC,EAAA,IAAiC,KAAK,IAAI;AAC5E,aAAK,IAAI,MAAM;AAAA,UACX,KAAK,aAAa;AAAA,UAClB,KAAK,aAAa;AAAA,UAClB,KAAK,iBAAiB;AAAA,UACtB,KAAK,kBAAkB;AAAA,UACvB;AAAA,YACI,aAAaA;AAAA,YACb,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,WAAWD;AAAA,UAAA;AAAA,QACf;AAAA,MAER;AACA,WAAK,IAAI,MAAM;AAAA,QACX,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,MAAA;AAAA;AAAA,EAEb;AAAA,EACQ,eAAe;AACnB,QAAI,KAAK,aAAa;AAClB;AAEJ,UAAM,EAAE,iBAAAd,EAAA,IAAoB,KAAK,IAAI;AACrC,QAAI,CAACA;AACD;AAEJ,UAAM,EAAE,MAAAE,GAAM,MAAA9B,GAAM,UAAA4C,GAAU,UAAAC,MAAa,KAAK,IAAI;AAEpD,SAAK,WAAW;AAAA,MACZ,MAAMD;AAAA,MACN,MAAMC;AAAA,MACN,aAAa,KAAK,IAAI,OAAO,uBAAuB;AAAA,MACpD,WAAW;AAAA,MACX,aAAa;AAAA,MACb,UAAU,CAAC,GAAG,CAAC;AAAA,IAAA,CAClB,GAED,KAAK,WAAW;AAAA,MACZ,MAAM,KAAK,IAAI,SAAS;AAAA,MACxB,MAAM,KAAK,IAAI,SAAS;AAAA,MACxB,aAAa,KAAK,IAAI,OAAO,uBAAuB;AAAA,MACpD,WAAW;AAAA,MACX,aAAa;AAAA,MACb,UAAU,CAAC,GAAG,CAAC;AAAA,IAAA,CAClB,GAED,KAAK,WAAW;AAAA,MACZ,MAAAf;AAAA,MACA,MAAA9B;AAAA,MACA,aAAa,KAAK,IAAI,OAAO,uBAAuB;AAAA,MACpD,WAAW;AAAA,MACX,aAAa;AAAA,IAAA,CAChB;AAED,UAAM,CAAC8C,GAAMf,CAAI,IAAID,GACf,CAAChC,GAAMC,CAAI,IAAIC;AAErB,IACI,EAFU8C,MAASf,KAAQjC,MAASC,MAGpC,KAAK,YAAY+C,KACjB,KAAK,YAAYf,KACjB,KAAK,YAAYjC,KACjB,KAAK,YAAYC,KAEjB,KAAK,IAAI,MAAM,SAAS,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,QAAQ;AAAA,MACrE,aAAa;AAAA,MACb,WAAW,KAAK,IAAI,OAAO,qBAAqB;AAAA,IAAA,CACnD,GAED,KAAK,aAAa,KAAK,YAAYD,KAAQ,KAAK,YAAYC,KAC5D,KAAK,IAAI,MAAM,SAAS,KAAK,OAAO,KAAK,OAAO,KAAK,cAAc,KAAK,eAAe;AAAA,MACnF,aAAa;AAAA,MACb,WAAW,KAAK,IAAI,OAAO,2BAA2B;AAAA,IAAA,CACzD;AAAA,EAET;AAAA,EACQ,eAAe;AASnB,QAPI,KAAK,aAAa,YAIlB,CAAC,KAAK,WAGN,KAAK,YAAY,KAAK,KAAK,YAAY;AACvC;AAEJ,UAAM,EAAE,qBAAAgD,GAAqB,iBAAAC,EAAA,IAAoB,KAAK,IAAI,QACpD,EAAE,OAAAlH,MAAU,MACZF,IAAI,KAAK,OACTC,IAAI,KAAK,OACToH,IAAS;AAAA,MACXrH,IAAIE,IAAQiH,IAAsB;AAAA,MAClClH;AAAA,MACAD,IAAIE,IAAQ;AAAA,MACZD;AAAA,MACAD,IAAIE,IAAQ;AAAA,MACZD,IAAIkH;AAAA,IAAA;AAER,SAAK,IAAI,MAAM,SAASE,GAAQ;AAAA,MAC5B,aAAaD;AAAA,MACb,WAAWA;AAAA,MACX,aAAa;AAAA,MACb,SAAS;AAAA,MACT,UAAU;AAAA,IAAA,CACb;AAAA,EACL;AAAA,EACQ,WAAWE,GAOhB;AACC,UAAM,EAAE,OAAA1B,GAAO,OAAAC,GAAO,UAAA5K,GAAU,UAAAD,GAAU,QAAAmF,GAAQ,OAAAD,MAAU;AAC5D,QAAIF,IAAI4F,GACJ3F,IAAI4F;AACR,UAAM,EAAE,MAAAK,GAAM,MAAA9B,GAAM,UAAAmD,IAAW,CAAA,GAAI,aAAAC,IAAc,GAAG,aAAAC,GAAa,WAAAC,EAAA,IAAcJ,GACzEJ,IAAOhB,EAAK,CAAC,GACbC,IAAOD,EAAK,CAAC,GACbhC,IAAOE,EAAK,CAAC,GACbD,IAAOC,EAAK,CAAC;AAEnB,QAAIpJ,KAAYkM,KAAQlM,KAAYmL,KAAQlL,MAAaiJ,GAAM;AAC3D,YAAMyD,IAAU3M,MAAamL,IAAO,IAAI,GAClCyB,IAAU5M,MAAakM,IAAO,IAAI;AACxC,WAAK,IAAI,MAAM,SAAS,CAAClH,IAAI4H,GAAS3H,IAAI,GAAGD,IAAIE,IAAQyH,GAAS1H,IAAI,CAAC,GAAG;AAAA,QACtE,aAAAwH;AAAA,QACA,WAAAC;AAAA,QACA,aAAAF;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,QACV,UAAAD;AAAA,MAAA,CACH;AAAA,IACL;AAEA,QAAIvM,MAAamL,KAAQlL,KAAYiJ,KAAQjJ,KAAYkJ,GAAM;AAC3D,YAAM0D,IAAU5M,MAAaiJ,IAAO,IAAI,GAClC4D,IAAU7M,MAAakJ,IAAO,IAAI;AACxC,WAAK,IAAI,MAAM,SAAS,CAACnE,IAAIE,IAAQ,GAAGD,IAAI4H,GAAS7H,IAAIE,IAAQ,GAAGD,IAAIE,IAAS2H,CAAO,GAAG;AAAA,QACvF,aAAAL;AAAA,QACA,WAAAC;AAAA,QACA,aAAAF;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,QACV,UAAAD;AAAA,MAAA,CACH;AAAA,IACL;AAEA,QAAIvM,KAAYkM,KAAQlM,KAAYmL,KAAQlL,MAAakJ,GAAM;AAC3D,YAAMwD,IAAU3M,MAAamL,IAAO,IAAI,GAClCyB,IAAU5M,MAAakM,IAAO,IAAI;AACxC,WAAK,IAAI,MAAM,SAAS,CAAClH,IAAI4H,GAAS3H,IAAIE,IAAS,GAAGH,IAAIE,IAAQyH,GAAS1H,IAAIE,IAAS,CAAC,GAAG;AAAA,QACxF,aAAAsH;AAAA,QACA,WAAAC;AAAA,QACA,aAAAF;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,QACV,UAAAD;AAAA,MAAA,CACH;AAAA,IACL;AAEA,QAAIvM,MAAakM,KAAQjM,KAAYiJ,KAAQjJ,KAAYkJ,GAAM;AAC3D,YAAM2D,IAAU7M,MAAakJ,IAAO,IAAI,GAClC0D,IAAU5M,MAAaiJ,IAAO,IAAI;AACxC,WAAK,IAAI,MAAM,SAAS,CAAClE,IAAI,GAAGC,IAAI4H,GAAS7H,IAAI,GAAGC,IAAIE,IAAS2H,CAAO,GAAG;AAAA,QACvE,aAAAL;AAAA,QACA,WAAAC;AAAA,QACA,aAAAF;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,QACV,UAAAD;AAAA,MAAA,CACH;AAAA,IACL;AAAA,EACJ;AACJ;ACp8BA,MAAqBQ,GAAS;AAAA;AAAA,EA4B1B,YAAYhI,GAAcuH,GAA4B;AA3B9C,IAAA7M,EAAA,iBAAU;AACV,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,oBAAoB,CAAA;AACpB,IAAAA,EAAA,uCAAgB,IAAA;AAChB,IAAAA,EAAA,4CAAqB,IAAA;AACrB,IAAAA,EAAA,uCAAgB,IAAA;AAChB,IAAAA,EAAA,+CAAwB,IAAA;AACxB,IAAAA,EAAA,+CAAwB,IAAA;AACxB,IAAAA,EAAA,4CAAqB,IAAA;AACrB,IAAAA,EAAA,0CAAmB,IAAA;AACnB,IAAAA,EAAA,uCAAgB,IAAA;AAChB,IAAAA,EAAA,6CAAsB,IAAA;AACtB,IAAAA,EAAA,4CAAqB,IAAA;AACrB,IAAAA,EAAA,gDAAyB,IAAA;AACzB,IAAAA,EAAA,2CAAoB,QAAA;AACpB,IAAAA,EAAA,oBAAoB,CAAA;AACpB,IAAAA,EAAA,0BAAmB;AAAA,MACvB,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,eAAe;AAAA,MACf,YAAY;AAAA,IAAA;AAER,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA;AACA,IAAAA,EAAA,mBAAwB,CAAA;AAE5B,SAAK,MAAMsF;AACX,UAAM,EAAE,MAAA5D,IAAO,IAAI,SAAA6C,IAAU,CAAA,GAAI,YAAAgJ,IAAa,CAAA,EAAC,IAAMV;AACrD,SAAK,OAAOnL,GACZ,KAAK,aAAa6L,GAClB,KAAK,UAAUhJ,GACf,KAAK,WAAW,EAAI,GACpB,KAAK,KAAA;AAAA,EACT;AAAA;AAAA,EAEA,KAAKiJ,IAAU,IAAM;AACjB,SAAK,gBAAA,GACL,KAAK,UAAU,MAAA,GACf,KAAK,eAAe,MAAA,GACpB,KAAK,eAAe,MAAA,GACpB,KAAK,kBAAkB,MAAA,GACvB,KAAK,kBAAkB,MAAA;AAEvB,UAAMC,IAAW,KAAK,WAAA,GAChBC,IAAchL,GAAO+K,CAAQ;AAGnC,QAFA,KAAK,IAAI,eAAeC,EAAY,KAAK,CAAC/L,MAASA,EAAK,SAAS,WAAW,GAC5E,KAAK,IAAI,UAAU+L,EAAY,KAAK,CAAC/L,MAASA,EAAK,SAAS,MAAM,GAC9D6L,GAAS;AACT,WAAK,gBAAgB,MAAA,GACrB,KAAK,eAAe,MAAA,GACpB,KAAK,mBAAmB,MAAA;AACxB,YAAM,EAAE,SAAAG,EAAA,IAAY,KAAK,IAAI;AAE7B,MAAKA,KAMI,KAAK,IAAI,gBACV,KAAK,aAAa,MAAA,GAEjB,KAAK,IAAI,WACV,KAAK,UAAU,MAAA,MARnB,KAAK,aAAa,MAAA,GAClB,KAAK,UAAU,MAAA;AAAA,IAUvB;AACA,SAAK,oCAAoB,QAAA,GACzB,KAAK,SAAS,KAAK,IAAI,GACvB,KAAK,QAAA,GACL,KAAK,iBAAiB,SAAS;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAIA,kBAAkB;AACd,SAAK,aAAa,CAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,SAASC,GAAiBvL,IAAgB,GAAGwL,IAA0B,CAAA,GAAI;AAC/E,IAAAD,EAAS,QAAQ,CAACjM,GAAMuC,MAAU;AJtF1C,UAAA4J;AIuFY,YAAM,EAAE,SAAAH,IAAU,IAAI,oBAAAI,GAAoB,aAAAC,GAAa,mBAAAC,GAAmB,cAAAC,EAAA,IAAiB,KAAK,IAAI,QAC9FC,IAAUxM,EAAKgM,CAAO,GACtBrN,IAAkC6N,KAAY,OAAO,GAAGA,CAAO,KAAKpN,GAAA;AAC1E,WAAK,cAAc,IAAIY,GAAMrB,CAAM;AACnC,YAAMoF,IAAS/D,EAAK,WAAWqM,GACzBI,IAAWzM,EAAK;AACtB,UAAIqI,IAAyC;AAM7C,UALI,OAAOiE,KAAsB,eAE7BjE,IAD2CiE,IAI3CC,GAAc;AACd,cAAMG,IAAc1M,EAAKuM,CAAY;AACrC,YAAI,KAAK,eAAe,IAAIG,CAAW,GAAG;AACtC,gBAAMC,IAAe,KAAK,eAAe,IAAID,CAAW,KAAK,CAAA;AAC7D,UAAAC,EAAa,KAAKhO,CAAM,GACxB,KAAK,eAAe,IAAI+N,GAAaC,CAAY;AAAA,QACrD;AACI,eAAK,eAAe,IAAID,GAAa,CAAC/N,CAAM,CAAC;AAAA,MAErD;AAEA,WAAK,aAAa,IAAIA,GAAQ;AAAA,QAC1B,KAAK4N,IAAevM,EAAKuM,CAAY,IAAI5N;AAAA,QACzC,KAAKqB;AAAA,QACL,SAAOmM,IAAA,KAAK,aAAa,IAAIxN,CAAM,MAA5B,gBAAAwN,EAA+B,UAAS;AAAA,MAAA,CAClD;AACD,YAAMrG,IAASsG,KAAsB,KAAK,UAAU,IAAIzN,CAAM,KAAKqB,EAAK,WAAW;AACnF,WAAK,UAAU,IAAIrB,GAAQmH,CAAM,GACjC,KAAK,UAAU,IAAInH,GAAQ;AAAA,QACvB,UAAA8N;AAAA,QACA,OAAAlK;AAAA,QACA,UAAUA;AAAA,QACV,OAAA7B;AAAA,QACA,QAAAqD;AAAA,QACA,OAAO;AAAA,QACP,YAAAsE;AAAA,QACA,QAAAvC;AAAA,QACA,YAAY;AAAA,QACZ,aAAa9F,EAAK,iBAAiB,MAAM,QAAQA,EAAK,QAAQ,IAAIA,EAAK,SAAS,SAAS,IAAI;AAAA,QAC7F,eAAe;AAAA,QACf,MAAAA;AAAA,QACA,eAAAkM;AAAA,MAAA,CACH,GACG,MAAM,QAAQlM,EAAK,QAAQ,KACvBA,EAAK,SAAS,UACd,KAAK,SAASA,EAAK,UAAUU,IAAQ,GAAG,CAAC,GAAGwL,GAAevN,CAAM,CAAC;AAAA,IAG9E,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAaE,GAAkBkF,GAAgB;AAC3C,UAAMpF,IAAS,KAAK,kBAAkB,IAAIE,CAAQ;AAClD,QAAIF,MAAW;AACX;AAEJ,UAAMF,IAAM,KAAK,UAAU,IAAIE,CAAM;AACrC,IAAAF,EAAI,SAASsF,GACbtF,EAAI,KAAK,UAAUsF,GACnB,KAAK,gBAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB;AACb,QAAI5B,IAAc,CAAA;AAClB,UAAMyK,IAAgB,CAAC7M,MAAgB;AACnC,MAAAA,EAAK,QAAQ,CAACC,MAAS;AACnB,QAAAmC,EAAK,KAAKnC,CAAI,GACV,MAAM,QAAQA,EAAK,QAAQ,KAC3B4M,EAAc5M,EAAK,QAAQ;AAAA,MAEnC,CAAC;AAAA,IACL;AACA,WAAA4M,EAAc,KAAK,IAAI,GAChBzK;AAAA,EACX;AAAA,EACQ,cAAcS,GAAmB;AACrC,WAAOA,EAAQ,OAAO,CAACH,GAAejE,MAAW;AAI7C,UAAI,EAFe,OAAOA,EAAO,QAAS,aAAaA,EAAO,SAASA,EAAO,OAE7D;AACb,cAAMqO,IAAY,EAAE,GAAGrO,EAAA;AAEvB,QAAIqO,EAAU,YAAY,MAAM,QAAQA,EAAU,QAAQ,MACtDA,EAAU,WAAW,KAAK,cAAcA,EAAU,QAAQ,IAE9DpK,EAAI,KAAKoK,CAAS;AAAA,MACtB;AACA,aAAOpK;AAAA,IACX,GAAG,CAAA,CAAE;AAAA,EACT;AAAA,EACA,aAAa;AACT,WAAO,KAAK,cAAc,KAAK,OAAO;AAAA,EAC1C;AAAA,EACA,WAAWG,GAAmB;AAC1B,SAAK,UAAUA,GACf,KAAK,gBAAA;AAAA,EACT;AAAA,EACA,QAAQ7C,GAAa;AACjB,SAAK,OAAOA,GACR,KAAK,QAAQ,UACb,KAAK,KAAA;AAAA,EAEb;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACN,QAAI,KAAK,WAAW,SAAS;AACzB,aAAO;AAAA,QACH,MAAM,KAAK;AAAA,QACX,WAAW,KAAK;AAAA,QAChB,WAAW,KAAK;AAAA,MAAA;AAGxB,QAAIoC,IAAc,CAAA,GACdtD,IAAW;AACf,SAAK,YAAY,GACjB,KAAK,YAAY,CAAA;AACjB,UAAM+N,IAAgB,CAAC7M,MAAgB;AACnC,MAAAA,EAAK,QAAQ,CAACC,MAAS;AACnB,QAAAmC,EAAK,KAAKnC,CAAI;AACd,cAAMrB,IAAS,KAAK,cAAc,IAAIqB,CAAI,GACpC,EAAE,QAAA8F,GAAQ,aAAAC,GAAa,QAAAhC,EAAA,IAAW,KAAK,UAAU,IAAIpF,CAAM,GAC3DyK,IAAM,KAAK;AACjB,aAAK,aAAarF,GAClB,KAAK,kBAAkB,IAAIlF,GAAUF,CAAM,GAC3C,KAAK,kBAAkB,IAAIA,GAAQE,CAAQ,GAC3C,KAAK,UAAU,KAAK;AAAA,UAChB,KAAAuK;AAAA,UACA,QAAArF;AAAA,UACA,QAAQ,KAAK;AAAA,QAAA,CAChB,GACDlF,KAAY,GACRiH,KAAUC,KACV6G,EAAc5M,EAAK,QAAQ;AAAA,MAEnC,CAAC;AAAA,IACL;AACA,SAAK,kBAAkB,MAAA,GACvB,KAAK,kBAAkB,MAAA;AACvB,QAAI8M,IAAQ,KAAK;AACjB,WAAI,OAAO,KAAK,gBAAiB,eAC7BA,IAAQ,KAAK,aAAaA,CAAK,IAEnCF,EAAcE,CAAK,GACnB,KAAK,aAAa3K,GACX;AAAA,MACH,MAAMA;AAAA,MACN,WAAW,KAAK;AAAA,MAChB,WAAW,KAAK;AAAA,IAAA;AAAA,EAExB;AAAA,EACA,cAAcpC,GAAa;AACvB,SAAK,aAAaA;AAAA,EACtB;AAAA,EACA,gBAAgB;AACZ,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgBgN,GAA4B;AACxC,SAAK,eAAeA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAIA,oBAAoB;AAChB,SAAK,eAAe;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAWpO,GAAgBmH,IAAS,IAAO;AACvC,UAAMrH,IAAM,KAAK,UAAU,IAAIE,CAAM;AACrC,IAAAF,EAAI,SAASqH,GACb,KAAK,UAAU,IAAInH,GAAQmH,CAAM,GACjC,KAAK,gBAAA,GACL,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,iBAAiBkH,GAAgBlH,IAAS,IAAM;AAC5C,SAAK,UAAU,MAAA,GACfkH,EAAQ,QAAQ,CAACC,MAAW;AACxB,YAAMxO,IAAM,KAAK,UAAU,IAAIwO,CAAM;AACrC,WAAK,UAAU,IAAIA,GAAQnH,CAAM,GACjCrH,EAAI,SAASqH;AAAA,IACjB,CAAC,GACD,KAAK,gBAAA,GACL,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,mBAAmB;AACf,QAAI3D,IAAiB,CAAA;AACrB,gBAAK,UAAU,QAAQ,CAAC1D,GAAUC,MAAgB;AAC9C,MAAID,EAAI,UACJ0D,EAAK,KAAKzD,CAAG;AAAA,IAErB,CAAC,GACMyD;AAAA,EACX;AAAA,EACA,UAAU2D,GAAiB;AACvB,SAAK,UAAU,MAAA,GACf,KAAK,UAAU,QAAQ,CAACrH,MAAa;AACjC,MAAAA,EAAI,SAASqH,GACb,KAAK,UAAU,IAAIrH,EAAI,KAAKqH,CAAM;AAAA,IACtC,CAAC,GACD,KAAK,gBAAA,GACL,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,cAAcnH,GAAgBuO,IAAU,IAAO;AAC3C,UAAMzO,IAAM,KAAK,UAAU,IAAIE,CAAM;AACrC,IAAAF,EAAI,gBAAgByO,GACpB,KAAK,gBAAA,GACL,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,kBAAkBvO,GAAgBmC,GAAiB;AAC/C,UAAMrC,IAAM,KAAK,UAAU,IAAIE,CAAM;AACrC,IAAAF,EAAI,SAAS,IACb,KAAK,UAAU,IAAIE,GAAQ,EAAI,GAC/BF,EAAI,aAAa,IACjBA,EAAI,KAAK,WAAWqC,GACpB,KAAK,SAASrC,EAAI,KAAK,UAAUA,EAAI,QAAQ,CAAC,GAC9C,KAAK,gBAAA;AAAA,EACT;AAAA,EACA,mBAAmBE,GAAgB;AAE/B,WADY,KAAK,UAAU,IAAIA,CAAM,EAC1B;AAAA,EACf;AAAA,EACA,gBAAgBA,GAAgB;AAE5B,WADY,KAAK,UAAU,IAAIA,CAAM,EAC1B;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAYA,GAAgB;AAExB,WADY,KAAK,UAAU,IAAIA,CAAM,EAC1B;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgBA,GAAgB;AAC5B,WAAO,KAAK,UAAU,IAAIA,CAAM;AAAA,EACpC;AAAA,EACA,kBAAkBE,GAAkB;AAChC,UAAMF,IAAS,KAAK,qBAAqBE,CAAQ;AACjD,WAAO,KAAK,UAAU,IAAIF,CAAM;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAqBE,GAAkB;AACnC,WAAO,KAAK,kBAAkB,IAAIA,CAAQ,KAAK;AAAA,EACnD;AAAA,EACA,gBAAgBmB,GAAW;AACvB,WAAO,KAAK,cAAc,IAAIA,CAAI;AAAA,EACtC;AAAA,EACA,qBAAqBrB,GAAgB;AACjC,WAAO,KAAK,kBAAkB,IAAIA,CAAM;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mCAAmCE,GAAkBD,GAAkB;AAEnE,QAAI,EADQ,KAAK,kBAAkB,IAAIC,CAAQ,KAAK,KAAK,eAAe,IAAID,CAAQ;AAEhF,aAAO;AAEX,UAAMD,IAAS,KAAK,kBAAkB,IAAIE,CAAQ,GAC5CH,IAAM,KAAK,eAAe,IAAIE,CAAQ;AAC5C,WAAID,MAAW,UAAaD,MAAQ,SACzB,OAEJ;AAAA,MACH,QAAAC;AAAA,MACA,KAAAD;AAAA,MACA,OAAO,KAAK,aAAaC,GAAQD,CAAG;AAAA,IAAA;AAAA,EAE5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAaC,GAAgBD,GAAa;AACtC,UAAMD,IAAM,KAAK,UAAU,IAAIE,CAAM;AAErC,WAAIF,KAAOA,EAAI,OACPA,EAAI,KAAKC,CAAG,MAAM,SACX,OAEJD,EAAI,KAAKC,CAAG,IAEhB;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBACFyO,GACAC,IAAU,IACVC,IAAgB,IAChBC,IAA8B,QAChC;AACE,QAAIC,IAAiC,CAAA,GACjCC,IAAiBH;AACrB,UAAMI,wBAA8B,IAAA;AACpC,QAAIC,IAAwB,CAAA,GACxBC,IAAsCR,EAAM,IAAI,CAACnN,MAAS;AAC1D,YAAM,EAAE,QAAArB,GAAQ,KAAAD,EAAA,IAAQsB;AACxB,UAAI4N,IAAS5N,EAAK,OACdlB,IAAQ8O;AACZ,YAAMnP,IAAM,KAAK,wBAAwBE,CAAM,GACzCkP,IAAW,KAAK,aAAalP,GAAQD,CAAG,GAExCoP,IAAO,KAAK,wBAAwBnP,GAAQD,CAAG;AACrD,cAAIoP,KAAA,gBAAAA,EAAM,UAAS,aAEX,CAAC,IAAI,QAAW,IAAI,EAAE,SAASF,CAAM,IACrC9O,IAAQ,OACD,kBAAkB,KAAK,GAAG8O,CAAM,EAAE,IACzC9O,IAAQ,OAAO8O,CAAM,KAErB9O,IAAQ+O,GACRH,EAAQ,KAAK;AAAA,QACT,GAAG1N;AAAA,QACH,OAAAlB;AAAA,QACA,UAAA+O;AAAA,QACA,KAAApP;AAAA,MAAA,CACH,KAGF;AAAA,QACH,GAAGuB;AAAA,QACH,OAAAlB;AAAA,QACA,UAAA+O;AAAA,QACA,KAAApP;AAAA,MAAA;AAAA,IAER,CAAC;AAKD,QAHAkP,IAAaA,EAAW,OAAO,CAAC3N,MACrB,CAAC0N,EAAQ,KAAK,CAAC/I,MAAQ3E,EAAK,WAAW2E,EAAI,UAAU3E,EAAK,QAAQ2E,EAAI,GAAG,CACnF,GACG+I,EAAQ,QAAQ;AAChB,YAAM/I,IAAiB;AAAA,QACnB,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM+I;AAAA,MAAA;AAEV,WAAK,IAAI,KAAK,SAAS/I,CAAG;AAAA,IAC9B;AACA,QAAI,CAACgJ,EAAW;AACZ;AAEJ,UAAM,EAAE,4BAAAI,EAAA,IAA+B,KAAK,IAAI;AAChD,IAAIT,MAAiB,UAAU,OAAOS,KAA+B,eAGjEJ,IADe,MAD4CI,EAChBJ,CAAU,GAErDH,IAAiB,KAErBG,EAAW,QAAQ,CAAC5N,MAAS;AACzB,YAAM,EAAE,OAAAjB,GAAO,QAAAH,GAAQ,KAAAD,EAAA,IAAQqB,GACzB8N,IAAW,KAAK,aAAalP,GAAQD,CAAG;AAC9C,MAAA+O,EAAW,IAAI9O,CAAM,GAErB,KAAK,aAAaA,GAAQD,GAAKI,GAAO,IAAO,IAAO,IAAO0O,CAAc,GACzED,EAAY,KAAK;AAAA,QACb,QAAA5O;AAAA,QACA,KAAAD;AAAA,QACA,UAAAmP;AAAA,QACA,UAAU/O;AAAA,MAAA,CACb;AAAA,IACL,CAAC;AAED,QAAIkP,IAAc,CAAA;AAClB,IAAAP,EAAW,QAAQ,CAAC9O,MAAW;AAC3B,MAAAqP,EAAK,KAAK,KAAK,IAAI,SAAS,wBAAwBrP,CAAM,CAAC;AAAA,IAC/D,CAAC;AACD,UAAMsP,IAAoBN,EAAW,IAAI,CAAC,EAAE,QAAAhP,GAAQ,KAAAD,EAAA,MAAU,KAAK,aAAaC,GAAQD,CAAG,CAAC;AAC5F,YAAQ,IAAIuP,CAAiB,EAAE,KAAK,MAAM;AACtC,MAAI,KAAK,mBAAmB,SAAS,KAAK,KAAK,eAAe,OAAO,KACjE,KAAK,IAAI,KAAK,uBAAuB,KAAK,gBAAgB;AAAA,IAElE,CAAC,GACD,KAAK,IAAI,KAAK,UAAUN,GAAYK,CAAI,GAEpCZ,KACA,KAAK,IAAI,QAAQ,UAAU;AAAA,MACvB,YAAYG;AAAA,MACZ,SAAS,KAAK,IAAI;AAAA,MAClB,SAAS,KAAK,IAAI;AAAA,MAClB,MAAM;AAAA,IAAA,CACT,GAEL,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,MAAM,aACF5O,GACAD,GACAkP,GACAR,IAAU,IACVc,IAAS,IACTC,IAAW,IACXd,IAAgB,IAClB;AAEE,QAAI,CAAC,KAAK,UAAU,IAAI1O,CAAM;AAC1B,aAAO,CAAA;AAGX,UAAM,EAAE,MAAAqB,EAAA,IAAS,KAAK,UAAU,IAAIrB,CAAM;AAC1C,QAAIkP,IAAW7N,EAAKtB,CAAG,GACnBI,IAAQ8O;AAGZ,QAAIP,KAAiB,KAAK,IAAI,SAAS,YAAY1O,GAAQD,CAAG;AAC1D,aAAO;AAAA,QACH,UAAAmP;AAAA,QACA,UAAUA;AAAA,MAAA;AAIlB,IAAI7N,EAAKtB,CAAG,MAAM,QAAQ,OAAOsB,EAAKtB,CAAG,KAAM,aAC3CmP,IAAW,KAAK,MAAM,KAAK,UAAU7N,EAAKtB,CAAG,CAAC,CAAC;AAEnD,UAAM0P,IAAY,GAAGzP,CAAM,KAAUD,CAAG;AAExC,IAAK,KAAK,gBAAgB,IAAI0P,CAAS,KACnC,KAAK,gBAAgB,IAAIA,GAAWP,CAAQ;AAEhD,UAAMQ,IAAgB,KAAK,gBAAgB,IAAID,CAAS,GAClD3P,IAAM,KAAK,wBAAwBE,CAAM;AAE/C,QAAIwP,GAAU;AACV,YAAML,IAAO,KAAK,wBAAwBnP,GAAQD,CAAG;AACrD,WAAIoP,KAAA,gBAAAA,EAAM,UAAS;AAEf,YAAI,CAAC,IAAI,QAAW,IAAI,EAAE,SAASF,CAAM;AACrC,UAAA9O,IAAQ;AAAA,iBACD,kBAAkB,KAAK,GAAG8O,CAAM,EAAE;AACzC,UAAA9O,IAAQ,OAAO8O,CAAM;AAAA,aAClB;AACH,UAAA9O,IAAQ+O;AACR,gBAAMlJ,IAAiB;AAAA,YACnB,MAAM;AAAA,YACN,SAAS;AAAA,YACT,MAAM;AAAA,cACF;AAAA,gBACI,QAAAhG;AAAA,gBACA,KAAAD;AAAA,gBACA,OAAAI;AAAA,gBACA,UAAA+O;AAAA,gBACA,KAAApP;AAAA,cAAA;AAAA,YACJ;AAAA,UACJ;AAEJ,eAAK,IAAI,KAAK,SAASkG,CAAG;AAAA,QAC9B;AAEJ,UAAI7F,MAAU+O;AACV,eAAO;AAAA,UACH,UAAAA;AAAA,UACA,UAAUA;AAAA,QAAA;AAGlB,UAAIF,IAAiC;AAAA,QACjC;AAAA,UACI,QAAAhP;AAAA,UACA,KAAAD;AAAA,UACA,OAAAI;AAAA,UACA,UAAA+O;AAAA,UACA,KAAApP;AAAA,QAAA;AAAA,MACJ;AAEJ,WAAK,kBAAkBkP,GAAYP,GAAS,EAAK,GACjD,KAAK,IAAI,KAAK,cAAc;AAAA,QACxB,QAAAzO;AAAA,QACA,KAAAD;AAAA,QACA,UAAAmP;AAAA,QACA,OAAA/O;AAAA,QACA,eAAAuP;AAAA,QACA,KAAA5P;AAAA,MAAA,CACH;AAAA,IACL;AACI,WAAK,eAAe,IAAI2P,GAAWtP,CAAK,GACxCkB,EAAKtB,CAAG,IAAII;AAGhB,WAAI,KAAK,IAAI,SAAS,iBAAiB,KACnC,KAAK,IAAI,KAAK,mBAAmB;AAAA,MAC7B,QAAAH;AAAA,MACA,KAAAD;AAAA,MACA,UAAAmP;AAAA,MACA,OAAA/O;AAAA,MACA,eAAe,KAAK,gBAAgB,IAAIsP,CAAS;AAAA,MACjD,KAAA3P;AAAA,IAAA,CACH,GAGDyP,KACA,KAAK,IAAI,KAAK,MAAM,GAEjB;AAAA,MACH,UAAAL;AAAA,MACA,UAAU/O;AAAA,IAAA;AAAA,EAElB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,wBAAwBH,GAAgB;AACpC,QAAI,CAAC,KAAK,UAAU,IAAIA,CAAM;AAC1B,aAAO,CAAA;AAEX,UAAM,EAAE,MAAAqB,EAAA,IAAS,KAAK,UAAU,IAAIrB,CAAM;AAC1C,WAAOqB;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,6BAA6BrB,GAAgByJ,GAAgB;AACjE,UAAM,EAAE,cAAAmE,EAAA,IAAiB,KAAK,IAAI;AAClC,QAAIA,GAAc;AACd,UAAI,CAAC,KAAK,UAAU,IAAI5N,CAAM;AAC1B,eAAO;AAEX,YAAM,EAAE,MAAAqB,EAAA,IAAS,KAAK,UAAU,IAAIrB,CAAM,GACpC+N,IAAc1M,EAAKuM,CAAY;AACrC,MAAI,KAAK,eAAe,IAAIG,CAAW,MACnB,KAAK,eAAe,IAAIA,CAAW,KAAK,CAAA,GAChD,QAAQ,CAAC/N,MAAmB;AAChC,cAAM2P,IAAY,KAAK,aAAa,IAAI3P,CAAM;AAC9C,QAAI2P,MACAA,EAAU,QAAQlG;AAAA,MAE1B,CAAC;AAAA,IAET;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmBzJ,GAAgB;AAC/B,UAAMF,IAAM,KAAK,UAAU,IAAIE,CAAM,GAC/B2P,IAAY,KAAK,aAAa,IAAI3P,CAAM;AAC9C,QAAI,CAAC2P;AACD;AAEJ,IAAAA,EAAU,QAAQ,CAACA,EAAU,OAC7B,KAAK,6BAA6B3P,GAAQ2P,EAAU,KAAK,GACzD,KAAK,IAAI,KAAK,sBAAsB7P,CAAG;AACvC,UAAMuP,IAAO,KAAK,iBAAA;AAClB,SAAK,IAAI,KAAK,mBAAmBA,CAAI,GAErC,KAAK,iBAAiB,SAAS,IAC/B,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgBrP,GAAgByJ,GAAgBmG,IAAO,IAAM;AACzD,UAAMD,IAAY,KAAK,aAAa,IAAI3P,CAAM;AAC9C,IAAK2P,MAGLA,EAAU,QAAQlG,GAClB,KAAK,6BAA6BzJ,GAAQ2P,EAAU,KAAK,GACzD,KAAK,IAAI,KAAK,mBAAmBlG,GAAOkG,EAAU,GAAG,GACjDC,MAEA,KAAK,iBAAiB,SAAS,IAC/B,KAAK,IAAI,KAAK,MAAM;AAAA,EAE5B;AAAA,EACA,mBAAmB;AACf,QAAIP,IAAc,CAAA;AAClB,gBAAK,aAAa,QAAQ,CAACM,MAAmB;AAC1C,MAAIA,EAAU,SACVN,EAAK,KAAKM,EAAU,GAAG;AAAA,IAE/B,CAAC,GACMN;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgBrP,GAAgB;AAC5B,UAAM2P,IAAY,KAAK,aAAa,IAAI3P,CAAM;AAC9C,WAAK2P,IAGEA,EAAU,QAFN;AAAA,EAGf;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB3P,GAAgB;AAC7B,UAAM,EAAE,YAAA0J,GAAY,MAAArI,GAAM,UAAAnB,EAAA,IAAa,KAAK,UAAU,IAAIF,CAAM;AAChE,WAAI,OAAO0J,KAAe,aACfA,EAAW;AAAA,MACd,KAAKrI;AAAA,MACL,UAAAnB;AAAA,IAAA,CACH,IAEEwJ;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqB;AACjB,SAAK,UAAU,QAAQ,CAAC5J,GAAUE,MAAmB;AACjD,UAAI6P,IAAc/P,EAAI;AACtB,MAAI,OAAO+P,KAAgB,eACvBA,IAAcA,EAAY;AAAA,QACtB,KAAK/P,EAAI;AAAA,QACT,UAAUA,EAAI;AAAA,MAAA,CACjB,IAED+P,KACA,KAAK,gBAAgB7P,GAAQ,IAAM,EAAK;AAAA,IAEhD,CAAC;AACD,UAAMqP,IAAO,KAAK,iBAAA;AAClB,SAAK,IAAI,KAAK,sBAAsBA,CAAI,GACxC,KAAK,IAAI,KAAK,mBAAmBA,CAAI,GAErC,KAAK,iBAAiB,SAAS,IAC/B,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,eAAeS,IAAgB,IAAO;AAElC,IAAIA,IACA,KAAK,UAAU,QAAQ,CAACC,GAAG/P,MAAmB;AAC1C,WAAK,gBAAgBA,GAAQ,IAAO,EAAK;AAAA,IAC7C,CAAC,KAED,KAAK,aAAa,MAAA,GAClB,KAAK,UAAU,QAAQ,CAACF,GAAKE,MAAmB;AAC5C,WAAK,aAAa,IAAIA,GAAQ;AAAA,QAC1B,OAAO;AAAA,QACP,KAAKF,EAAI;AAAA,QACT,KAAKE;AAAA,MAAA,CACR;AAAA,IACL,CAAC;AAEL,UAAMqP,IAAO,KAAK,iBAAA;AAClB,SAAK,IAAI,KAAK,gBAAgB,GAC9B,KAAK,IAAI,KAAK,mBAAmBA,CAAI,GAErC,KAAK,iBAAiB,SAAS,IAC/B,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB;AAEd,UAAM,EAAE,QAAAW,GAAQ,GAAGC,EAAA,IAAgB,KAAK;AACxC,QAAID;AACA,aAAOC;AAEX,UAAMC,IAAQ,KAAK,UAAU;AAC7B,QAAIC,IAAe,GACfC,IAAkB;AACtB,UAAMC,IAAe,KAAK,aAAa,MACjCC,IAAoB,MAAM,KAAK,KAAK,aAAa,OAAA,CAAQ,EAAE,KAAK,CAACjP,MAASA,EAAK,KAAK;AAC1F,SAAK,UAAU,QAAQ,CAACvB,GAAUE,MAAmB;AJtyB7D,UAAAwN;AIuyBY,OAAIA,IAAA,KAAK,aAAa,IAAIxN,CAAM,MAA5B,QAAAwN,EAA+B,UAC/B2C,KAAgB;AAEpB,UAAIN,IAAc/P,EAAI;AACtB,MAAI,OAAO+P,KAAgB,eACvBA,IAAcA,EAAY;AAAA,QACtB,KAAK/P,EAAI;AAAA,QACT,UAAUA,EAAI;AAAA,MAAA,CACjB,IAED+P,MACAO,KAAmB;AAAA,IAE3B,CAAC;AAED,UAAMG,IAAuBF,IAAeH,KAASC,MAAiB,KAAKG,GACrEE,IACDJ,KAAmBA,IAAkBD,KAAgBA,IAAe,KAAMI,GACzE7G,IAAa0G,MAAoB,GACjC3G,IAAQ,CAAC,CAAC2G,KAAmBA,MAAoBD;AAEvD,gBAAK,mBAAmB;AAAA,MACpB,QAAQ;AAAA,MACR,OAAA1G;AAAA,MACA,eAAA+G;AAAA,MACA,YAAA9G;AAAA,IAAA,GAGG;AAAA,MACH,OAAAD;AAAA,MACA,eAAA+G;AAAA,MACA,YAAA9G;AAAA,IAAA;AAAA,EAER;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAqBlG,IAAqB,IAAI;AAC1C,SAAK,eAAe,MAAA,GACpBA,EAAK,QAAQ,CAAC3D,MAAW;AACrB,WAAK,eAAe,IAAIA,EAAO,UAAUA,EAAO,GAAG;AAAA,IACvD,CAAC;AAAA,EACL;AAAA,EACA,oBAAoBI,GAAkB;AJn1B1C,QAAAuN;AIo1BQ,UAAMzN,IAAM,KAAK,eAAe,IAAIE,CAAQ;AAC5C,QAAIF,KAAO,KAAK,UAAU,IAAIA,CAAG;AAC7B,cAAOyN,IAAA,KAAK,UAAU,IAAIzN,CAAG,MAAtB,gBAAAyN,EAAyB;AAAA,EAExC;AAAA,EACA,eAAezN,GAAa;AACxB,UAAMF,IAAS,KAAK,UAAU,IAAIE,CAAG;AACrC,QAAIF;AACA,aAAOA;AAAA,EAEf;AAAA,EACA,kBAAkBE,GAAa;AJ/1BnC,QAAAyN;AIg2BQ,QAAIzN,KAAO,KAAK,UAAU,IAAIA,CAAG;AAC7B,cAAOyN,IAAA,KAAK,UAAU,IAAIzN,CAAG,MAAtB,gBAAAyN,EAAyB;AAAA,EAExC;AAAA,EACA,oBAAoBvN,GAAkB;AAClC,UAAMF,IAAM,KAAK,eAAe,IAAIE,CAAQ;AAC5C,QAAIF,KAAO,KAAK,UAAU,IAAIA,CAAG;AAC7B,aAAO,KAAK,UAAU,IAAIA,CAAG;AAAA,EAGrC;AAAA;AAAA;AAAA;AAAA,EAIA,iBAAiB;AACb,QAAIyD,IAME,CAAA;AACN,gBAAK,eAAe,QAAQ,CAACrD,GAAOJ,MAAQ;AACxC,YAAM2P,IAAgB,KAAK,gBAAgB,IAAI3P,CAAG,GAC5CC,IAASD,EAAI,MAAM,IAAS,EAAE,CAAC,GAC/B0Q,IAAS1Q,EAAI,MAAM,IAAS,EAAE,CAAC;AACrC,MAAI2P,MAAkBvP,KAClBqD,EAAK,KAAK;AAAA,QACN,QAAAxD;AAAA,QACA,QAAAyQ;AAAA,QACA,eAAAf;AAAA,QACA,KAAK,KAAK,IAAI,SAAS,wBAAwB1P,CAAM;AAAA,QACrD,OAAAG;AAAA,MAAA,CACH;AAAA,IAET,CAAC,GACMqD;AAAA,EACX;AAAA,EACA,iBAAiB;AACb,UAAMsL,wBAA8B,IAAA;AACpC,SAAK,eAAe,QAAQ,CAAC3O,GAAOJ,MAAQ;AACxC,YAAM2P,IAAgB,KAAK,gBAAgB,IAAI3P,CAAG,GAC5CC,IAASD,EAAI,MAAM,IAAS,EAAE,CAAC;AACrC,MAAI2P,MAAkBvP,KAClB2O,EAAW,IAAI9O,CAAM;AAAA,IAE7B,CAAC;AACD,QAAIqP,IAAc,CAAA;AAClB,WAAAP,EAAW,QAAQ,CAAC9O,MAAW;AAC3B,MAAAqP,EAAK,KAAK,KAAK,IAAI,SAAS,wBAAwBrP,CAAM,CAAC;AAAA,IAC/D,CAAC,GACMqP;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiBrP,GAAgBD,GAAa;AAC1C,UAAM2Q,IAAa,GAAG1Q,CAAM,KAAUD,CAAG;AACzC,QAAI,CAAC,KAAK,eAAe,IAAI2Q,CAAU;AACnC,aAAO;AAEX,UAAMhB,IAAgB,KAAK,gBAAgB,IAAIgB,CAAU,GACnDC,IAAe,KAAK,eAAe,IAAID,CAAU;AACvD,WAAOhB,MAAkBiB;AAAA,EAC7B;AAAA,EACA,uBAAuBzQ,GAA4B;AAC/C,WAAIA,IAAW,KAAK,UAAU,SACnB,KAAK,UAAUA,CAAQ,IAE3B;AAAA,MACH,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,QAAQ;AAAA,IAAA;AAAA,EAEhB;AAAA,EAEA,UAAUH,GAAayL,GAAiC;AACpD,WAAKzL,KAGL,KAAK,UAAU,IAAIA,GAAKyL,CAAU,GAC3B,MAHI;AAAA,EAIf;AAAA,EACA,YAAYxL,GAAgBD,GAAa;AACrC,UAAM,EAAE,UAAA6Q,EAAA,IAAa,KAAK,IAAI;AAE9B,QAAIA;AACA,aAAO;AAEX,UAAM9Q,IAAM,KAAK,UAAU,IAAIE,CAAM,GAC/B6Q,IAAY,KAAK,UAAU,IAAI9Q,CAAG;AACxC,QAAI,CAACD,KAAO,CAAC+Q;AACT,aAAO;AAEX,UAAMC,IAAchR,EAAI,UAClBiR,IAAcF,EAAU,UACxB,EAAE,2BAAAG,EAAA,IAA8B,KAAK,IAAI;AAE/C,QAAI,OAAOA,KAA8B,cAAcH,GAAW;AAE9D,YAAM/C,IADyCkD,EACX;AAAA,QAChC,KAAKlR,EAAI;AAAA,QACT,UAAUA,EAAI;AAAA,QACd,UAAU+Q,EAAU;AAAA,QACpB,QAAQA,EAAU;AAAA,QAClB,OAAO,KAAK,aAAa7Q,GAAQD,CAAG;AAAA,MAAA,CACvC;AACD,UAAI+N,MAAa;AACb,eAAOA;AAAA,IAEf;AACA,WAAOiD,KAAeD;AAAA,EAC1B;AAAA,EACA,gBAAgB;AACZ,SAAK,mBAAmB,MAAA;AAAA,EAC5B;AAAA,EACA,qBAAqB;AACjB,WAAO,KAAK,mBAAmB,SAAS;AAAA,EAC5C;AAAA,EACA,aAAa9Q,GAAgBD,GAAa;AACtC,WAAO,IAAI,QAAQ,CAACkR,MAAY;AAC5B,YAAMnR,IAAM,KAAK,UAAU,IAAIE,CAAM,GAC/B6Q,IAAY,KAAK,UAAU,IAAI9Q,CAAG,GAClC,EAAE,wBAAAmR,EAAA,IAA2B,KAAK,IAAI;AAC5C,UAAIL,MAAc;AACd,eAAOI,EAAQ,CAAA,CAAE;AAErB,YAAMpR,IAASgR,EAAU;AACzB,UAAIpR,IAAQI,EAAO;AAEnB,UAAI,OAAOqR,KAA2B,YAAY;AAE9C,cAAMC,IADmCD,EACV;AAAA,UAC3B,KAAKpR,EAAI;AAAA,UACT,UAAUA,EAAI;AAAA,UACd,UAAU+Q,EAAU;AAAA,UACpB,QAAAhR;AAAA,UACA,OAAO,KAAK,aAAaG,GAAQD,CAAG;AAAA,QAAA,CACvC;AACD,QAAIoR,MACA1R,IAAQ0R;AAAA,MAEhB;AACA,UAAI1R,GAAO;AACP,cAAMc,IAAuB;AAAA,UACzB,KAAKT,EAAI;AAAA,UACT,UAAUA,EAAI;AAAA,UACd,UAAU+Q,EAAU;AAAA,UACpB,QAAAhR;AAAA,UACA,KAAAE;AAAA,UACA,QAAAC;AAAA,UACA,OAAO,KAAK,aAAaA,GAAQD,CAAG;AAAA,UACpC,OAAOA;AAAA,UACP,YAAY,KAAK,aAAaC,GAAQD,CAAG;AAAA,QAAA,GAGvCqR,IADY,IAAI5R,GAAUC,CAAK,EACX,SAASc,CAAS;AAC5C,aAAK,mBAAmBP,GAAQD,GAAKqR,CAAO,GAC5CH,EAAQG,CAAO;AAAA,MACnB;AACI,aAAK,qBAAqBpR,GAAQD,CAAG,GACrCkR,EAAQ,CAAA,CAAE;AAAA,IAElB,CAAC;AAAA,EACL;AAAA,EACA,2BAA2B/Q,GAAkBmR,GAAiB;AAC1D,QAAIC,IAAY;AAChB,aAAS/F,IAAI,GAAGA,IAAI8F,GAAS9F,KAAK;AAC9B,YAAMgG,IAAW,KAAK,UAAUrR,IAAWqL,CAAC;AAC5C,MAAIgG,MACAD,KAAaC,EAAS;AAAA,IAE9B;AACA,WAAOD;AAAA,EACX;AAAA,EACA,YAAYnC,GAAsB;AAC9B,UAAM;AAAA,MACF,UAAAjP;AAAA,MACA,KAAAH;AAAA,MACA,QAAAC;AAAA,MACA,KAAAF;AAAA,MACA,OAAAK;AAAA,MACA,UAAAF;AAAA,MACA,iBAAAwD;AAAA,MACA,iBAAA2C;AAAA,MACA,SAAAD;AAAA,MACA,QAAAf;AAAA,MACA,OAAAD;AAAA,MACA,SAAAlD;AAAA,MACA,UAAAoE;AAAA,MACA,UAAAC;AAAA,IAAA,IACA6I;AACJ,QAAIhJ,MAAY,KAAKlE,MAAY;AAC7B,aAAO;AAAA,QACH,MAAM,CAAChC,GAAUA,CAAQ;AAAA,QACzB,MAAM,CAACC,GAAUA,CAAQ;AAAA,QACzB,SAAAiG;AAAA,QACA,SAAAlE;AAAA,QACA,QAAAmD;AAAA,QACA,OAAAD;AAAA,QACA,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,UAAU;AAAA,UACN;AAAA,YACI,QAAAnF;AAAA,YACA,KAAAD;AAAA,YACA,KAAAD;AAAA,YACA,OAAAK;AAAA,UAAA;AAAA,QACJ;AAAA,MACJ;AAGR,QAAIqR,IAAWtR,GACXuR,IAAcvR,GACdwR,IAAYzR,GACZ0R,IAAa1R,GACbqN,IAAyB,CAAA,GACzBlD,IAAY,GACZC,IAAa,GACbuH,IAAc,GACdC,IAAa;AAEjB,QAAI1L,MAAY,KAAKE,GAAU;AAC3B,MAAAwL,IAAa1M;AACb,YAAMtB,IAAWJ,EAAgB,OAAO,CAACK,GAAK/D,MAAQ;AAClD,cAAMI,IAAQ,KAAK,aAAaH,GAAQD,CAAG,KAAK;AAChD,eAAO,GAAG+D,CAAG,GAAG3D,CAAK;AAAA,MACzB,GAAG,EAAE;AAEL,eAASoL,IAAIrL,IAAW,GAAGqL,KAAK,GAAGA,KAAK;AACpC,cAAMsC,IAAU,KAAK,kBAAkB,IAAItC,CAAC,KAAK,IAC3CxH,IAASN,EAAgB,OAAO,CAACK,GAAK/D,MAAQ;AAChD,gBAAMI,IAAQ,KAAK,aAAa0N,GAAS9N,CAAG,KAAK;AACjD,iBAAO,GAAG+D,CAAG,GAAG3D,CAAK;AAAA,QACzB,GAAG,EAAE;AACL,YAAI0D,MAAaE;AACb,UAAAyN,IAAWjG;AAAA;AAEX;AAAA,MAER;AAGA,eAASA,IAAIrL,GAAUqL,KAAK,KAAK,IAAI,aAAaA,KAAK;AACnD,cAAMsC,IAAU,KAAK,kBAAkB,IAAItC,CAAC,KAAK,IAC3CxH,IAASN,EAAgB,OAAO,CAACK,GAAK/D,MAAQ;AAChD,gBAAMI,IAAQ,KAAK,aAAa0N,GAAS9N,CAAG,KAAK;AACjD,iBAAO,GAAG+D,CAAG,GAAG3D,CAAK;AAAA,QACzB,GAAG,EAAE;AACL,YAAI0D,MAAaE;AACb,UAAA0N,IAAclG;AAAA;AAEd;AAAA,MAER;AACA,eAASA,IAAIiG,GAAUjG,IAAIrL,GAAUqL,KAAK;AACtC,cAAM,EAAE,QAAAnG,EAAAA,IAAW,KAAK,UAAUmG,CAAC;AACnC,QAAAnB,KAAahF;AAAAA,MACjB;AACA,eAASmG,IAAIiG,GAAUjG,KAAKkG,GAAalG,KAAK;AAC1C,cAAM,EAAE,QAAAnG,EAAAA,IAAW,KAAK,UAAUmG,CAAC;AAEnC,QAAAqG,KAAexM;AAGf,cAAMyI,IAAU,KAAK,kBAAkB,IAAItC,CAAC,KAAK,IAC3C,EAAE,MAAAlK,EAAA,IAAS,KAAK,UAAU,IAAIwM,CAAO,GACrC1N,IAAQ,KAAK,aAAa0N,GAAS9N,CAAG;AAE5C,QAAAuN,EAAS,KAAK;AAAA,UACV,QAAQO;AAAA,UACR,KAAA9N;AAAA,UACA,OAAAI;AAAAA,UACA,KAAKkB;AAAA,QAAA,CACR;AAAA,MACL;AAAA,IACJ;AAEA,QAAIY,MAAY,KAAKqE,GAAU;AAC3B,MAAAsL,IAAcxM;AAEd,eAASmG,IAAItL,IAAW,GAAGsL,KAAK,GAAGA,KAAK;AACpC,cAAM1L,IAAS,KAAK,oBAAoB0L,CAAC;AACzC,YAAI,CAAC1L;AACD;AAEJ,cAAMgE,IAAW,KAAK,aAAa7D,GAAQD,CAAG,GACxCgE,IAAS,KAAK,aAAa/D,GAAQH,EAAO,GAAG;AACnD,YAAIgE,MAAaE,KAAUqC,EAAgB,SAASvG,EAAO,GAAG;AAC1D,UAAA6R,IAAYnG;AAAA;AAEZ;AAAA,MAER;AAEA,eAASA,IAAItL,GAAUsL,KAAK,KAAK,IAAI,aAAaA,KAAK;AACnD,cAAM1L,IAAS,KAAK,oBAAoB0L,CAAC;AACzC,YAAI,CAAC1L;AACD;AAEJ,cAAMgE,IAAW,KAAK,aAAa7D,GAAQD,CAAG,GACxCgE,IAAS,KAAK,aAAa/D,GAAQH,EAAO,GAAG;AACnD,YAAIgE,MAAaE,KAAUqC,EAAgB,SAASvG,EAAO,GAAG;AAC1D,UAAA8R,IAAapG;AAAA;AAEb;AAAA,MAER;AACA,eAASA,IAAImG,GAAWnG,IAAItL,GAAUsL,KAAK;AACvC,cAAM1L,IAAS,KAAK,oBAAoB0L,CAAC;AACzC,YAAI,CAAC1L;AACD;AAGJ,QAAAwK,KAAcxK,EAAO,SAAS;AAAA,MAClC;AACA,eAAS0L,IAAImG,GAAWnG,KAAKoG,GAAYpG,KAAK;AAC1C,cAAM1L,IAAS,KAAK,oBAAoB0L,CAAC;AACzC,YAAI,CAAC1L;AACD;AAGJ,QAAAgS,KAAchS,EAAO,SAAS,KAE9ByN,EAAS,KAAK;AAAA,UACV,QAAAtN;AAAA,UACA,KAAKH,EAAO;AAAA,UACZ,OAAO,KAAK,aAAaG,GAAQH,EAAO,GAAG;AAAA,UAC3C,KAAAC;AAAA,QAAA,CACH;AAAA,MACL;AAAA,IACJ;AACA,WAAO;AAAA,MACH,MAAM,CAAC4R,GAAWC,CAAU;AAAA,MAC5B,MAAM,CAACH,GAAUC,CAAW;AAAA,MAC5B,SAAAtL;AAAA,MACA,SAAAlE;AAAA,MACA,QAAQ2P;AAAA,MACR,OAAOC;AAAA,MACP,WAAAzH;AAAA,MACA,YAAAC;AAAA,MACA,UAAAiD;AAAA,IAAA;AAAA,EAER;AAAA,EACA,WAAWiB,GAAkB;AACzB,SAAK,UAAUA,GACf,KAAK,IAAI,KAAK,iBAAiBA,CAAO;AAAA,EAC1C;AAAA,EACA,aAAa;AACT,WAAO,KAAK;AAAA,EAChB;AAAA,EACA,6BAA6BrO,GAAkBH,GAAaS,GAAiB;AACzE,UAAMR,IAAS,KAAK,kBAAkB,IAAIE,CAAQ,GAC5C4R,IAAO,GAAG9R,CAAM,KAAUD,CAAG,IAC7BD,IAAM,KAAK,kBAAkBI,CAAQ,GACrCsL,IAAa,KAAK,eAAezL,CAAG;AAC1C,QAAI,CAACC,KAAU,CAACwL,KAAc,CAAC1L;AAC3B;AAEJ,UAAMK,IAAQ,KAAK,aAAaH,GAAQD,CAAG,GACrCH,IAAyB;AAAA,MAC3B;AAAA,QACI,KAAAG;AAAA,QACA,QAAAC;AAAA,QACA,UAAAE;AAAA,QACA,UAAUsL,EAAW;AAAA,QACrB,QAAQA,EAAW;AAAA,QACnB,KAAA1L;AAAA,QACA,OAAAK;AAAA,QACA,SAAAK;AAAA,QACA,OAAOT;AAAA,QACP,YAAYI;AAAA,MAAA;AAAA,IAChB;AAEJ,SAAK,mBAAmB,IAAI2R,GAAMlS,CAAM;AAAA,EAC5C;AAAA,EACA,mBAAmBI,GAAgBD,GAAaH,GAAwB;AACpE,UAAMkS,IAAO,GAAG9R,CAAM,KAAUD,CAAG;AACnC,SAAK,mBAAmB,IAAI+R,GAAMlS,CAAM;AAAA,EAC5C;AAAA,EACA,qBAAqBI,GAAgBD,GAAa;AAC9C,UAAM+R,IAAO,GAAG9R,CAAM,KAAUD,CAAG;AACnC,IAAI,KAAK,mBAAmB,IAAI+R,CAAI,KAChC,KAAK,mBAAmB,OAAOA,CAAI;AAAA,EAE3C;AAAA,EACA,mBAAmB9R,GAAgBD,GAAa;AAC5C,UAAM+R,IAAO,GAAG9R,CAAM,KAAUD,CAAG;AACnC,WAAO,KAAK,mBAAmB,IAAI+R,CAAI,KAAK,CAAA;AAAA,EAChD;AAAA;AAAA,EAEA,mBAAmB5R,GAAkBD,GAAkB;AACnD,UAAMJ,IAAS,KAAK,oBAAoBI,CAAQ,GAC1CH,IAAM,KAAK,kBAAkBI,CAAQ;AAC3C,WAAI,CAACL,KAAU,CAACC,IACZ,SAES,IAAIiG,GAAK,KAAK,KAAK7F,GAAUD,GAAU,GAAG,GAAG,GAAG,GAAGJ,GAAQC,EAAI,MAAM,MAAM;AAAA,EAE5F;AAAA,EACA,wBAAwBE,GAAgBD,GAAa;AACjD,UAAMG,IAAW,KAAK,qBAAqBF,CAAM,GAC3CC,IAAW,KAAK,kBAAkBF,CAAG;AAC3C,QAAI,EAAAG,MAAa,UAAaD,MAAa;AAG3C,aAAO,KAAK,mBAAmBC,GAAUD,CAAQ;AAAA,EACrD;AAAA,EACA,aAAakL,GAAgB9B,GAAgB;AACzC,QAAI0I,IAAe;AACnB,aAASxG,IAAIlC,EAAK,CAAC,GAAGkC,KAAKlC,EAAK,CAAC,GAAGkC;AAChC,eAASyG,IAAI7G,EAAK,CAAC,GAAG6G,KAAK7G,EAAK,CAAC,GAAG6G,KAAK;AACrC,cAAM7C,IAAO,KAAK,mBAAmB5D,GAAGyG,CAAC;AACzC,YAAI7C,MAASA,EAAK,YAAY,KAAKA,EAAK,YAAY,IAAI;AACpD,UAAA4C,IAAe;AACf;AAAA,QACJ;AAAA,MACJ;AAEJ,WAAOA;AAAA,EACX;AACJ;AChxCA,MAAqBE,GAAQ;AAAA,EAIzB,YAAYjN,GAAc;AAHlB,IAAAtF,EAAA;AACA,IAAAA,EAAA,iBAAyB,CAAA;AACzB,IAAAA,EAAA,sBAAe;AAEnB,SAAK,MAAMsF,GACX,KAAK,KAAA;AAAA,EACT;AAAA,EACQ,OAAO;AACX,SAAK,IAAI,GAAG,WAAW,CAACkN,MAAM;AAC1B,UAAI,MAAK,IAAI,SAIb;AAAA,YAAKA,EAAE,WAAW,CAACA,EAAE,YAAYA,EAAE,SAAS,UAAYA,EAAE,WAAW,CAACA,EAAE,YAAYA,EAAE,SAAS,QAAS;AACpG,UAAAA,EAAE,eAAA,GACF,KAAK,IAAI,cAAA,GACT,KAAK,IAAI,cAAA,GACT,KAAK,UAAA;AACL;AAAA,QACJ;AAEA,YACKA,EAAE,WAAWA,EAAE,SAAS,UACxBA,EAAE,WAAWA,EAAE,YAAYA,EAAE,SAAS,UACtCA,EAAE,WAAWA,EAAE,YAAYA,EAAE,SAAS,QACzC;AACE,UAAAA,EAAE,eAAA,GACF,KAAK,IAAI,cAAA,GACT,KAAK,IAAI,cAAA,GACT,KAAK,aAAA;AACL;AAAA,QACJ;AAAA;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EACA,UAAUlD,GAAyB;AAC/B,UAAM,EAAE,aAAAmD,IAAc,GAAG,gBAAAC,EAAA,IAAmB,KAAK,IAAI;AAErD,IAAKA,MAGL,KAAK,QAAQ,KAAKpD,CAAU,GACxB,KAAK,QAAQ,SAASmD,KACtB,KAAK,QAAQ,OAAO,GAAG,CAAC,GAE5B,KAAK,eAAe,KAAK,QAAQ,SAAS;AAAA,EAC9C;AAAA;AAAA,EAEA,YAAY;AACR,QAAI,KAAK,gBAAgB,GAAG;AACxB,YAAM,EAAE,YAAAnD,GAAY,SAAAxJ,GAAS,SAAAI,EAAA,IAAY,KAAK,QAAQ,KAAK,YAAY,GACjExE,IAAO4N,EAAW,IAAI,CAAC3N,OAClB;AAAA,QACH,QAAQA,EAAK;AAAA,QACb,KAAKA,EAAK;AAAA,QACV,OAAOA,EAAK;AAAA,QACZ,KAAK,CAAA;AAAA,MAAC,EAEb;AAED,WAAK,IAAI,UAAUmE,GAASI,CAAO,GAEnC,KAAK,IAAI,SAAS,kBAAkBxE,GAAM,IAAO,IAAO,MAAM,GAC9D,KAAK,gBAAgB;AAAA,IACzB;AAAA,EACJ;AAAA;AAAA,EAEA,eAAe;AACX,QAAI,KAAK,eAAe,KAAK,QAAQ,SAAS,GAAG;AAC7C,WAAK,gBAAgB;AACrB,YAAM,EAAE,YAAA4N,EAAA,IAAe,KAAK,QAAQ,KAAK,YAAY,GAC/C5N,IAAO4N,EAAW,IAAI,CAAC3N,OAClB;AAAA,QACH,QAAQA,EAAK;AAAA,QACb,KAAKA,EAAK;AAAA,QACV,OAAOA,EAAK;AAAA,QACZ,KAAK,CAAA;AAAA,MAAC,EAEb;AAED,WAAK,IAAI,SAAS,kBAAkBD,GAAM,IAAO,IAAO,SAAS;AAAA,IACrE;AAAA,EACJ;AAAA;AAAA,EAEA,QAAQ;AACJ,SAAK,UAAU,CAAA,GACf,KAAK,eAAe;AAAA,EACxB;AACJ;ACpGA,MAAqBiR,GAAa;AAAA,EAG9B,YAAYrN,GAAc;AAFlB,IAAAtF,EAAA,wCAA4B,IAAA;AAC5B,IAAAA,EAAA;AAEJ,SAAK,MAAMsF,GACX,KAAK,KAAA;AAAA,EACT;AAAA,EAEA,OAAO;AACH,SAAK,KAAK,QAAQ,UAAU,KAAK,aAAa,KAAK,IAAI,CAAC,GACxD,KAAK,KAAK,QAAQ,WAAW,KAAK,cAAc,KAAK,IAAI,CAAC,GAC1D,KAAK,KAAK,QAAQ,aAAa,KAAK,gBAAgB,KAAK,IAAI,CAAC,GAC9D,KAAK,KAAK,QAAQ,QAAQ,KAAK,uBAAuB,KAAK,IAAI,CAAC,GAChE,KAAK,KAAK,QAAQ,aAAa,KAAK,uBAAuB,KAAK,IAAI,CAAC,GACrE,KAAK,KAAK,KAAK,IAAI,cAAc,SAAS,KAAK,YAAY,KAAK,IAAI,CAAC,GACrE,KAAK,KAAK,QAAQ,WAAW,KAAK,cAAc,KAAK,IAAI,CAAC,GAC1D,KAAK,KAAK,KAAK,IAAI,cAAc,SAAS,KAAK,YAAY,KAAK,IAAI,GAAG,EAAE,SAAS,IAAO,GACzF,KAAK,KAAK,KAAK,IAAI,cAAc,cAAc,KAAK,iBAAiB,KAAK,IAAI,GAAG,EAAE,SAAS,IAAO,GACnG,KAAK,KAAK,KAAK,IAAI,cAAc,YAAY,KAAK,eAAe,KAAK,IAAI,CAAC,GAC3E,KAAK,KAAK,KAAK,IAAI,cAAc,aAAa,KAAK,gBAAgB,KAAK,IAAI,GAAG,EAAE,SAAS,IAAO,GACjG,KAAK,KAAK,KAAK,IAAI,cAAc,eAAe,KAAK,kBAAkB,KAAK,IAAI,CAAC,GACjF,KAAK,KAAK,KAAK,IAAI,cAAc,aAAa,KAAK,gBAAgB,KAAK,IAAI,CAAC,GAC7E,KAAK,KAAK,KAAK,IAAI,cAAc,YAAY,KAAK,eAAe,KAAK,IAAI,CAAC,GAC3E,KAAK,KAAK,KAAK,IAAI,cAAc,aAAa,KAAK,gBAAgB,KAAK,IAAI,CAAC,GAC7E,KAAK,KAAK,KAAK,IAAI,cAAc,YAAY,KAAK,eAAe,KAAK,IAAI,CAAC,GAC3E,SAAS,iBAAiB,mBAAmB,KAAK,gBAAgB,KAAK,IAAI,CAAC;AAAA,EAChF;AAAA,EACQ,kBAAkB;AACtB,SAAK,IAAI,kBAAkB;AAC3B,UAAM2K,IAAY,OAAO,aAAA;AACzB,IAAIA,KAAaA,EAAU,eACvB,KAAK,IAAI,kBAAkBA,EAAU,SAAA;AAAA,EAE7C;AAAA,EACQ,oBAAoB;AACxB,UAAMA,IAAY,OAAO,aAAA;AACzB,IAAIA,KAAa,CAACA,EAAU,eACxBA,EAAU,gBAAA;AAAA,EAElB;AAAA,EACA,UAAU;AACN,SAAK,WAAW,QAAQ,CAAC2C,GAAIC,MAAU;AACnC,WAAK,OAAO,QAAQA,GAAOD,CAAE;AAAA,IACjC,CAAC,GACD,SAAS,oBAAoB,mBAAmB,KAAK,gBAAgB,KAAK,IAAI,CAAC,GAC/E,KAAK,WAAW,MAAA;AAAA,EACpB;AAAA,EACQ,aAAaJ,GAAU;AAC3B,SAAK,IAAI,KAAK,eAAeA,CAAC,GAC9B,KAAK,IAAI,KAAK,UAAUA,CAAC;AAAA,EAC7B;AAAA,EACQ,gBAAgBA,GAAU;AAC9B,SAAK,kBAAA,GACMA,EACJ,WAAW,MACd,KAAK,IAAI,YAAY,KAEzB,KAAK,IAAI,iBAAiB,MAAM,EAAE,eAAe,IAAM,GACvD,KAAK,IAAI,KAAK,aAAaA,CAAC;AAAA,EAChC;AAAA,EACQ,gBAAgBA,GAAU;AAC9B,SAAK,IAAI,KAAK,aAAaA,CAAC;AAAA,EAChC;AAAA,EACQ,cAAcA,GAAU;AAE5B,IADWA,EACJ,WAAW,MACd,KAAK,IAAI,YAAY,KAEzB,KAAK,IAAI,KAAK,WAAWA,CAAC;AAAA,EAC9B;AAAA,EACQ,YAAYA,GAAU;AAC1B,SAAK,IAAI,KAAK,SAASA,CAAC;AAAA,EAC5B;AAAA,EACQ,cAAcA,GAAU;AAC5B,UAAM,EAAE,iBAAAM,EAAA,IAAoB,KAAK,IAAI;AACrC,IAAKA,KACA,KAAK,IAAI,SAASN,CAAC,KAGxB,KAAK,IAAI,KAAK,WAAWA,CAAC;AAAA,EAC9B;AAAA,EACQ,YAAYA,GAAU;AAC1B,SAAK,IAAI,KAAK,SAASA,CAAC;AAAA,EAC5B;AAAA,EACQ,iBAAiBA,GAAU;AAC/B,SAAK,IAAI,KAAK,cAAcA,CAAC;AAAA,EACjC;AAAA,EACQ,eAAeA,GAAU;AAC7B,SAAK,IAAI,KAAK,YAAYA,CAAC;AAAA,EAC/B;AAAA,EACQ,gBAAgBA,GAAU;AAC9B,SAAK,IAAI,KAAK,aAAaA,CAAC;AAAA,EAChC;AAAA,EACQ,kBAAkBA,GAAU;AAChC,IAAAA,EAAE,eAAA,GACF,KAAK,IAAI,KAAK,eAAeA,CAAC;AAAA,EAClC;AAAA,EACQ,gBAAgBA,GAAU;AAC9B,SAAK,IAAI,6BAA6B,IACtC,KAAK,IAAI,KAAK,aAAaA,CAAC;AAAA,EAChC;AAAA,EACQ,eAAeA,GAAU;AAC7B,SAAK,IAAI,6BAA6B,IACtC,KAAK,IAAI,KAAK,YAAYA,CAAC;AAAA,EAC/B;AAAA,EACQ,eAAeA,GAAU;AAC7B,SAAK,IAAI,KAAK,YAAYA,CAAC;AAAA,EAC/B;AAAA,EACQ,uBAAuBA,GAAU;AACrC,IACI,KAAK,IAAI,SAAS,WACjBA,EAAE,kBAAkB,UAAWA,EAAE,kBAAkB,QAAQ,CAAC,KAAK,IAAI,iBAAiB,SAASA,EAAE,MAAM,MAExG,KAAK,IAAI,KAAK,oBAAoBA,CAAC;AAAA,EAE3C;AAAA,EACQ,KACJO,GACA5N,GACAyN,GACA/F,GACI;AACJ,IAAAkG,EAAO,iBAAiB5N,GAAMyN,GAAI/F,CAAO,GACzC,KAAK,WAAW,IAAI1H,GAAMyN,CAAE;AAAA,EAChC;AAAA,EAEQ,OAAOG,GAAqB5N,GAAcyN,GAA8C;AAC5F,IAAAG,EAAO,oBAAoB5N,GAAMyN,CAAE,GACnC,KAAK,WAAW,OAAOzN,CAAI;AAAA,EAC/B;AACJ;AClIA,MAAM6N,GAAS;AAAA,EAEb,cAAc;AADN,IAAAhT,EAAA,oCAAuB,IAAA;AAAA,EAChB;AAAA,EACf,IAAI6S,GAAwB;AAC1B,WAAO,KAAK,OAAO,IAAIA,CAAK;AAAA,EAC9B;AAAA;AAAA,EAEA,GAAGA,GAAeI,GAA+B;AAC/C,UAAMC,IAAY,KAAK,OAAO,IAAIL,CAAK,KAAK,CAAA;AAC5C,IAAAK,EAAU,KAAKD,CAAQ,GACvB,KAAK,OAAO,IAAIJ,GAAOK,CAAS;AAAA,EAClC;AAAA;AAAA,EAEA,KAAKL,GAAeI,GAAyB;AAC3C,UAAME,IAA8B,IAAI7R,MAAS;AAC/C,MAAA2R,EAAS,GAAG3R,CAAI,GAChB,KAAK,IAAIuR,GAAOM,CAAY;AAAA,IAC9B;AACA,gBAAK,GAAGN,GAAOM,CAAY,GACpB;AAAA,EACT;AAAA;AAAA,EAEA,IAAIN,GAAeI,GAA+B;AAChD,UAAMC,IAAY,KAAK,OAAO,IAAIL,CAAK;AACvC,QAAIK,GAAW;AACb,YAAMhP,IAAQgP,EAAU,QAAQD,CAAQ;AACxC,MAAI/O,KAAS,MACXgP,EAAU,OAAOhP,GAAO,CAAC,GACrBgP,EAAU,WAAW,IACvB,KAAK,OAAO,OAAOL,CAAK,IAExB,KAAK,OAAO,IAAIA,GAAOK,CAAS;AAAA,IAGtC;AAAA,EACF;AAAA;AAAA,EAEA,KAAKL,MAAkBvR,GAAmB;AACxC,UAAM4R,IAAY,KAAK,OAAO,IAAIL,CAAK;AACvC,IAAIK,KACFA,EAAU,QAAQ,CAACD,MAAa;AAC9B,MAAAA,EAAS,GAAG3R,CAAI;AAAA,IAClB,CAAC;AAAA,EAEL;AAAA,EAEA,UAAgB;AACd,SAAK,OAAO,MAAA;AAAA,EACd;AACF;ACvBO,MAAM8R,GAAM;AAAA,EAEf,YAAYL,GAA2B;AAD/B,IAAA/S,EAAA;AAEJ,UAAMsF,IAAMyN,EAAO,WAAW,IAAI;AAClC,QAAI,CAACzN,EAAK,OAAM,IAAI,MAAM,0BAA0B;AACpD,SAAK,MAAMA;AAAA,EACf;AAAA,EACA,MAAM+N,GAAa;AACf,SAAK,IAAI,aAAa,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,GACtC,KAAK,IAAI,MAAMA,GAAKA,CAAG;AAAA,EAC3B;AAAA,EACA,OAAO;AACH,SAAK,IAAI,KAAA;AAAA,EACb;AAAA,EACA,UAAU;AACN,SAAK,IAAI,QAAA;AAAA,EACb;AAAA,EACA,UAAU9N,GAAWC,GAAW;AAC5B,SAAK,IAAI,UAAUD,GAAGC,CAAC;AAAA,EAC3B;AAAA,EAEA,UAAU8N,IAAS,WAAW;AAC1B,SAAK,IAAI,OAAO,MAAM,SAASA;AAAA,EACnC;AAAA,EACA,MAAM/N,IAAI,GAAGC,IAAI,GAAGC,GAAgBC,GAAiB;AACjD,SAAK,IAAI,UAAUH,GAAGC,GAAGC,KAAS,KAAK,IAAI,OAAO,OAAOC,KAAU,KAAK,IAAI,OAAO,MAAM;AAAA,EAC7F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,WAAWH,GAAWC,GAAWC,GAAeC,GAAgBmH,GAA8B;AAC1F,UAAM,EAAE,WAAAI,GAAW,MAAAsG,GAAM,aAAAC,GAAa,YAAAC,GAAY,UAAAC,MAAa7G;AAC/D,SAAK,IAAI,KAAA,GACLI,MACA,KAAK,IAAI,YAAYA,GACrB,KAAK,IAAI,SAAS1H,GAAGC,GAAGC,GAAOC,CAAM;AAEzC,QAAIiO;AACJ,YAAQJ,GAAA;AAAA,MACJ,KAAK;AACD,QAAAI,IAAW,KAAK,IAAI,qBAAqBpO,IAAIiO,GAAahO,GAAGD,GAAGC,CAAC,GACjEmO,EAAS,aAAa,GAAGF,CAAU,GACnCE,EAAS,aAAa,GAAGD,CAAQ,GACjC,KAAK,IAAI,YAAYC,GACrB,KAAK,IAAI,SAASpO,IAAIiO,GAAahO,GAAGgO,GAAa9N,CAAM;AACzD;AAAA,MACJ,KAAK;AACD,QAAAiO,IAAW,KAAK,IAAI,qBAAqBpO,IAAIE,GAAOD,GAAGD,IAAIE,IAAQ+N,GAAahO,CAAC,GACjFmO,EAAS,aAAa,GAAGF,CAAU,GACnCE,EAAS,aAAa,GAAGD,CAAQ,GACjC,KAAK,IAAI,YAAYC,GACrB,KAAK,IAAI,SAASpO,IAAIE,GAAOD,GAAGgO,GAAa9N,CAAM;AACnD;AAAA,MACJ,KAAK;AACD,QAAAiO,IAAW,KAAK,IAAI,qBAAqBpO,GAAGC,IAAIgO,GAAajO,GAAGC,CAAC,GACjEmO,EAAS,aAAa,GAAGF,CAAU,GACnCE,EAAS,aAAa,GAAGD,CAAQ,GACjC,KAAK,IAAI,YAAYC,GACrB,KAAK,IAAI,SAASpO,GAAGC,IAAIgO,GAAa/N,GAAO+N,CAAW;AACxD;AAAA,MACJ,KAAK;AACD,QAAAG,IAAW,KAAK,IAAI,qBAAqBpO,GAAGC,IAAIE,GAAQH,GAAGC,IAAIE,IAAS8N,CAAW,GACnFG,EAAS,aAAa,GAAGF,CAAU,GACnCE,EAAS,aAAa,GAAGD,CAAQ,GACjC,KAAK,IAAI,YAAYC,GACrB,KAAK,IAAI,SAASpO,GAAGC,IAAIE,GAAQD,GAAO+N,CAAW;AACnD;AAAA,MACJ;AACI,gBAAQ,MAAM,mCAAmC;AACjD;AAAA,IAAA;AAAA,EAEZ;AAAA;AAAA,EAEA,SAAS5G,GAAkBC,GAAsB;AAC7C,QAAID,EAAO,SAAS,KAAKA,EAAO,SAAS,MAAM;AAC3C,YAAM,IAAI,MAAM,oDAAoD;AAExE,SAAK,IAAI,KAAA;AACT,UAAM,EAAE,aAAAI,IAAc,SAAS,aAAAD,IAAc,MAAMF;AAEnD,SAAK,IAAI,UAAA,GACT,KAAK,IAAI,OAAOD,EAAO,CAAC,IAAI,KAAKA,EAAO,CAAC,IAAI,GAAG;AAChD,aAASf,IAAI,GAAGA,IAAIe,EAAO,QAAQf,KAAK;AACpC,WAAK,IAAI,OAAOe,EAAOf,CAAC,IAAI,KAAKe,EAAOf,IAAI,CAAC,IAAI,GAAG;AAExD,SAAK,IAAI,cAAcmB,GACvB,KAAK,IAAI,YAAYD,GACjBF,EAAQ,aACR,KAAK,IAAI,iBAAiB,GAC1B,KAAK,IAAI,YAAYA,EAAQ,QAAQ,IAGrCA,EAAQ,cACR,KAAK,IAAI,YAAYA,EAAQ,WAC7B,KAAK,IAAI,KAAA,IAETA,EAAQ,gBACR,KAAK,IAAI,cAAcA,EAAQ,cAEnC,KAAK,IAAI,OAAA,GACT,KAAK,IAAI,UAAA,GACT,KAAK,IAAI,QAAA;AAAA,EACb;AAAA,EACA,UAAU+G,GAAwBrO,GAAWC,GAAWC,GAAeC,GAAgB;AACnF,SAAK,IAAI,KAAA,GACT,KAAK,IAAI,UAAUkO,GAAKrO,GAAGC,GAAGC,GAAOC,CAAM,GAC3C,KAAK,IAAI,QAAA;AAAA,EACb;AAAA,EAEA,SACIH,GACAC,GACAC,GACAC,GACA,EAAE,aAAAqH,IAAc,GAAG,aAAAC,GAAa,WAAAC,GAAW,QAAA4G,IAAS,EAAA,IAAmB,CAAA,GACzE;AAaE,QAZA,KAAK,IAAI,KAAA,GACT,KAAK,IAAI,UAAA,GAEL5G,MAAc,WACd,KAAK,IAAI,YAAYA,IAIrBD,MAAgB,WAChB,KAAK,IAAI,YAAYD,GACrB,KAAK,IAAI,cAAcC,IAEvB6G,MAAW;AAEX,WAAK,IAAI,KAAKtO,IAAI,KAAKC,IAAI,KAAKC,GAAOC,CAAM;AAAA,SAC1C;AAEH,YAAM,CAACoO,GAAIC,GAAIC,GAAIC,CAAE,IAAI,OAAOJ,KAAW,WAAW,CAACA,GAAQA,GAAQA,GAAQA,CAAM,IAAIA;AAEzF,WAAK,IAAI,OAAOtO,IAAIuO,GAAItO,CAAC,GACzB,KAAK,IAAI,MAAMD,IAAIE,GAAOD,GAAGD,IAAIE,GAAOD,IAAIuO,GAAIA,CAAE,GAClD,KAAK,IAAI,MAAMxO,IAAIE,GAAOD,IAAIE,GAAQH,IAAIE,IAAQuO,GAAIxO,IAAIE,GAAQsO,CAAE,GACpE,KAAK,IAAI,MAAMzO,GAAGC,IAAIE,GAAQH,GAAGC,IAAIE,IAASuO,GAAIA,CAAE,GACpD,KAAK,IAAI,MAAM1O,GAAGC,GAAGD,IAAIuO,GAAItO,GAAGsO,CAAE;AAAA,IACtC;AAGA,IAAI7G,MAAc,UACd,KAAK,IAAI,KAAA,GAITD,MAAgB,UAChB,KAAK,IAAI,OAAA,GAEb,KAAK,IAAI,QAAA;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,SACIZ,IAAe,IACf7G,GACAC,GACAC,GACAC,GACAmH,IAA2B,IACpB;AACP,SAAK,IAAI,KAAA;AACT,UAAM;AAAA,MACF,MAAAqH,IAAO;AAAA,MACP,OAAAC,IAAQ;AAAA,MACR,OAAA9K,IAAQ;AAAA,MACR,SAAA+K,IAAU;AAAA,MACV,eAAAC,IAAgB;AAAA,IAAA,IAChBxH;AACJ,SAAK,IAAI,OAAOqH,GAChB,KAAK,IAAI,YAAY7K,GACrB,KAAK,IAAI,eAAegL,GACxB,KAAK,IAAI,YAAYF;AAErB,QAAIG,IAAO;AACX,IAAID,MAAkB,QAClBC,IAAO9O,IAAI4O,IACJC,MAAkB,WACzBC,IAAO9O,IAAIE,IAAS0O,IAEpBE,IAAO9O,KAAKE,IAAS,KAAK;AAE9B,QAAI6O,IAAO;AACX,IAAIJ,MAAU,SACVI,IAAOhP,IAAI6O,IACJD,MAAU,UACjBI,IAAOhP,IAAIE,IAAQ2O,IAEnBG,IAAOhP,IAAIE,IAAQ;AAEvB,UAAM,EAAE,OAAA+O,GAAO,UAAAtI,EAAA,IAAa,KAAK,eAAeE,GAAM3G,GAAO2O,GAASF,CAAI;AAC1E,gBAAK,IAAI,SAASM,GAAOD,GAAMD,CAAI,GACnC,KAAK,IAAI,QAAA,GACFpI;AAAA,EACX;AAAA,EACA,eAAeE,GAAc3G,GAAe2O,IAAU,GAAGF,IAAO,cAAc;AAC1E,QAAIhI,IAAW,IACXsI,IAAQpI;AAEZ,QADA,KAAK,IAAI,OAAO8H,GACZ9H,KAAS,QAA8BA,MAAS;AAChD,aAAO;AAAA,QACH,OAAO;AAAA,QACP,UAAAF;AAAA,MAAA;AAGR,UAAMuI,IAAgB,KAAK,IAAI,YAAY,KAAK,EAAE,OAC5CC,IAAY,KAAK,IAAI,YAAYtI,CAAI,EAAE;AAE7C,QAAIsI,KAAaA,IAAYD,KAAiBhP,IAAQ2O,IAAU,GAAG;AAC/D,MAAAlI,IAAW;AAEX,UAAIyI,IAAa;AACjB,eAAS9I,IAAI,GAAGA,IAAIO,EAAK,QAAQP;AAE7B,YADA8I,KAAc,KAAK,IAAI,YAAYvI,EAAKP,CAAC,CAAC,EAAE,OACxC8I,KAAclP,IAAQ2O,IAAU,IAAIK,GAAe;AACnD,UAAAD,IAAQpI,EAAK,MAAM,GAAGP,CAAC,IAAI;AAC3B;AAAA,QACJ;AAAA,IAER;AACA,WAAO;AAAA,MACH,OAAA2I;AAAA,MACA,UAAAtI;AAAA,IAAA;AAAA,EAER;AACJ;ACrPA,MAAqB0I,GAAO;AAAA,EAgQxB,YAAYtS,GAAyB;AA/P7B,IAAAtC,EAAA,iBAAsB,CAAA;AAE9B;AAAA,IAAAA,EAAA,oBAAa;AAEb;AAAA,IAAAA,EAAA,eAAoB,CAAA;AAEpB;AAAA,IAAAA,EAAA,iBAAU;AAEV;AAAA,IAAAA,EAAA,kBAAW;AAEX;AAAA,IAAAA,EAAA,qBAAc;AAEd;AAAA,IAAAA,EAAA,mBAAY;AAEZ;AAAA,IAAAA,EAAA,gBAAS;AAET;AAAA,IAAAA,EAAA,gBAAS;AAET;AAAA,IAAAA,EAAA,sBAAe;AAEf;AAAA,IAAAA,EAAA,sBAAe;AAEf;AAAA,IAAAA,EAAA,eAAQ;AAER;AAAA,IAAAA,EAAA,0BAAmB;AAEnB;AAAA,IAAAA,EAAA,gBAAS;AAET;AAAA,IAAAA,EAAA,2BAAoB;AAEpB;AAAA,IAAAA,EAAA,2BAAoB;AAEpB;AAAA,IAAAA,EAAA,4BAAmD,CAAA;AAEnD;AAAA,IAAAA,EAAA,oBAAa;AAEb;AAAA,IAAAA,EAAA,oBAAa;AAEb;AAAA,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,8BAAuB;AACvB,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,uBAAgB;AAEhB;AAAA,IAAAA,EAAA,8BAAuB;AAEvB;AAAA,IAAAA,EAAA,yBAAkB;AAElB;AAAA,IAAAA,EAAA,uBAAgB;AAEhB;AAAA,IAAAA,EAAA,2BAAoB;AAEpB;AAAA,IAAAA,EAAA,yBAAkB;AAElB;AAAA,IAAAA,EAAA,2BAAoB;AAEpB;AAAA,IAAAA,EAAA,0BAAmB;AAEnB;AAAA,IAAAA,EAAA,4BAAqB;AAErB;AAAA,IAAAA,EAAA,yBAAkB;AAElB;AAAA,IAAAA,EAAA,yBAAkB;AAElB;AAAA,IAAAA,EAAA,2BAAoB;AACpB,IAAAA,EAAA,2BAAoB;AAEpB;AAAA,IAAAA,EAAA,8BAAuB;AAEvB;AAAA,IAAAA,EAAA,6BAAsB;AAEtB;AAAA,IAAAA,EAAA,qBAAc;AAEd;AAAA,IAAAA,EAAA,4BAAqB;AAErB;AAAA,IAAAA,EAAA,oBAAa;AAEb;AAAA,IAAAA,EAAA,qBAAc;AAEd;AAAA,IAAAA,EAAA,sBAAe;AAEf;AAAA,IAAAA,EAAA,8BAAuB;AAEvB;AAAA,IAAAA,EAAA,kCAA2B;AAE3B;AAAA,IAAAA,EAAA,sCAA+B;AAE/B;AAAA,IAAAA,EAAA,6BAAsB;AAEtB;AAAA,IAAAA,EAAA,uBAAgB;AAEhB;AAAA,IAAAA,EAAA,wBAAiB;AAEjB;AAAA,IAAAA,EAAA,8BAAuB;AAEvB;AAAA,IAAAA,EAAA,8BAAuB;AAEvB;AAAA,IAAAA,EAAA,6BAAsB;AAEtB;AAAA,IAAAA,EAAA,2BAAoB;AAEpB;AAAA,IAAAA,EAAA,iCAA0B;AAE1B;AAAA,IAAAA,EAAA,qCAA8B;AAE9B;AAAA,IAAAA,EAAA,uBAAgB;AAEhB;AAAA,IAAAA,EAAA,sBAAe;AAEf;AAAA,IAAAA,EAAA,wBAAiB;AAEjB;AAAA,IAAAA,EAAA,uBAAgB;AAEhB;AAAA,IAAAA,EAAA,+BAAwB;AAExB;AAAA,IAAAA,EAAA,4BAAqB;AAErB;AAAA,IAAAA,EAAA,8BAAuB;AAEvB;AAAA,IAAAA,EAAA,oCAA6B;AAE7B;AAAA,IAAAA,EAAA,wBAAiB;AAEjB;AAAA,IAAAA,EAAA,6BAAsB;AAEtB;AAAA,IAAAA,EAAA,yBAAkB;AAElB;AAAA,IAAAA,EAAA,yBAAkB;AAElB;AAAA,IAAAA,EAAA,sBAAe;AAEf;AAAA,IAAAA,EAAA,yBAAkC;AAElC;AAAA,IAAAA,EAAA,4BAAqB;AAErB;AAAA,IAAAA,EAAA,yBAAkB;AAElB;AAAA,IAAAA,EAAA,kCAA2B;AAE3B;AAAA,IAAAA,EAAA,oCAA6B;AAE7B;AAAA,IAAAA,EAAA,6BAAsB;AAEtB;AAAA,IAAAA,EAAA,oCAA6B;AAE7B;AAAA,IAAAA,EAAA,6BAAsB;AAEtB;AAAA,IAAAA,EAAA,6BAAsB;AAEtB;AAAA,IAAAA,EAAA,6BAAsB;AAEtB;AAAA,IAAAA,EAAA,oCAA6B;AAE7B;AAAA,IAAAA,EAAA,kCAAkD;AAElD;AAAA;AAAA,IAAAA,EAAA,2BAAoB;AAEpB;AAAA,IAAAA,EAAA,gCAAyB;AAEzB;AAAA,IAAAA,EAAA,kCAA2B;AAE3B;AAAA,IAAAA,EAAA,kCAA2B;AAE3B;AAAA,IAAAA,EAAA,kCAA2B;AAE3B;AAAA,IAAAA,EAAA,kCAA2B;AAE3B;AAAA,IAAAA,EAAA,gCAAyB;AAEzB;AAAA,IAAAA,EAAA,yBAAkB;AAElB;AAAA,IAAAA,EAAA,6BAAsB;AAEtB;AAAA,IAAAA,EAAA,qBAAc;AAEd;AAAA,IAAAA,EAAA,uBAAgB;AAEhB;AAAA,IAAAA,EAAA,2BAAoB;AAEpB;AAAA,IAAAA,EAAA,8BAAuB;AAEvB;AAAA,IAAAA,EAAA,+BAAwB;AAExB;AAAA,IAAAA,EAAA,kCAA2B;AAE3B;AAAA,IAAAA,EAAA,+BAAwB;AAExB;AAAA,IAAAA,EAAA,iCAA0B;AAE1B;AAAA,IAAAA,EAAA,yBAAkB;AAElB;AAAA,IAAAA,EAAA,wBAAiB;AACjB,IAAAA,EAAA,oCAA6B;AAE7B;AAAA,IAAAA,EAAA,qBAAc;AAEd;AAAA,IAAAA,EAAA,6BAAsB;AAEtB;AAAA,IAAAA,EAAA,mCAA4B;AAE5B;AAAA,IAAAA,EAAA,gCAAyB;AAEzB;AAAA,IAAAA,EAAA,sCAA+B;AAE/B;AAAA,IAAAA,EAAA,0BAAmB;AAEnB;AAAA,IAAAA,EAAA,4BAAqB;AAErB;AAAA,IAAAA,EAAA,wBAAiB;AAEjB;AAAA,IAAAA,EAAA,8BAAqD,CAAA;AAErD;AAAA,IAAAA,EAAA,sBAA2B;AAAA,MACvB,EAAE,OAAO,MAAM,OAAO,OAAA;AAAA,MACtB,EAAE,OAAO,MAAM,OAAO,MAAA;AAAA,MACtB,EAAE,OAAO,MAAM,OAAO,QAAA;AAAA,MACtB,EAAE,OAAO,UAAU,OAAO,gBAAA;AAAA,IAAgB;AAG9C;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEI,SAAK,UAAUsC,GACf,KAAK,aAAA;AAAA,EACT;AAAA;AAAA,EAEA,KAAKA,GAAoB;AACrB,SAAK,UAAUA,GACf,KAAK,aAAA;AAAA,EACT;AAAA;AAAA,EAEA,eAAe;AACX,QAAIuS,IAAW,CAAA;AACf,WAAO,KAAK,IAAI,EAAE,QAAQ,CAACxU,MAAQ;AAC/B,UAAIA,EAAI,SAAS,QAAQ,KAAKA,EAAI,SAAS,OAAO,GAAG;AACjD,cAAMyU,IAAS,SAASzU,EAAI,kBAAA,EAAoB,QAAQ,MAAM,GAAG,CAAC,IAC5DuD,IAAMsB,GAAU4P,CAAM;AAC5B,QAAAD,EAAIxU,CAAG,IAAIuD;AAAA,MACf;AAAA,IACJ,CAAC,GACD,OAAO,OAAO,MAAMiR,GAAK,KAAK,OAAO;AAAA,EACzC;AACJ;AC3RA,MAAME,KACF;AAEJ,MAAqBC,GAAM;AAAA,EA8EvB,YAAY1P,GAAc;AA7ElB,IAAAtF,EAAA;AACA,IAAAA,EAAA,cAAkB;AAAA,MACtB;AAAA,QACI,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB,KAAK;AAAA,QACL,OAAO;AAAA,MAAA;AAAA,MAEX;AAAA,QACI,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB,KAAK;AAAA,QACL,OAAO;AAAA,MAAA;AAAA,MAEX;AAAA,QACI,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB,KAAK+U;AAAA,QACL,OAAO;AAAA,MAAA;AAAA,MAEX;AAAA,QACI,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,OAAO;AAAA,MAAA;AAAA,MAEX;AAAA,QACI,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB,KAAK;AAAA,QACL,OAAO;AAAA,MAAA;AAAA,MAEX;AAAA,QACI,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB,KAAK;AAAA,QACL,OAAO;AAAA,MAAA;AAAA,MAEX;AAAA,QACI,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB,KAAK;AAAA,QACL,OAAO;AAAA,MAAA;AAAA,MAEX;AAAA,QACI,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,OAAO;AAAA,MAAA;AAAA,MAEX;AAAA,QACI,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,OAAO;AAAA,MAAA;AAAA,MAEX;AAAA,QACI,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,OAAO;AAAA,MAAA;AAAA,MAEX;AAAA,QACI,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,iBAAiB;AAAA,QACjB,KAAKA;AAAA,QACL,OAAO;AAAA,MAAA;AAAA,IACX;AAEJ,IAAA/U,EAAA,mCAAY,IAAA;AAER,SAAK,MAAMsF,GACX,KAAK,KAAA;AAAA,EACT;AAAA,EACA,MAAM,OAAO;AACT,UAAM2P,IAAW,CAAA;AACjB,aAASpJ,IAAI,GAAGA,IAAI,KAAK,KAAK,QAAQA,KAAK;AACvC,YAAMlK,IAAO,KAAK,KAAKkK,CAAC;AACxB,UAAIxC,IAAQ1H,EAAK,OACbuT,IAAMvT,EAAK;AACf,UAAIA,EAAK,iBAAiB;AAEtB,cAAMwT,IAAc,KAAK,IAAI,OAAOxT,EAAK,eAAe;AACxD,QAAIwT,MACA9L,IAAQ8L;AAAA,MAEhB;AAEA,UAAIxT,EAAK,YAAY;AACjB,cAAMyT,IAAY,KAAK,IAAI,OAAOzT,EAAK,UAAU;AACjD,QAAIyT,MACAF,IAAME;AAAA,MAEd;AAGA,YAAMC,IAAU,KAAK,mBAAmBH,GAAK7L,CAAK,EAAE,KAAK,CAAC/B,MAAS;AAC/D,aAAK,MAAM,IAAI3F,EAAK,MAAM2F,CAAI;AAAA,MAClC,CAAC;AACD,MAAA2N,EAAS,KAAKI,CAAO;AAAA,IACzB;AAEA,aAASxJ,IAAI,GAAGA,IAAI,KAAK,IAAI,OAAO,MAAM,QAAQA,KAAK;AACnD,YAAMlK,IAAO,KAAK,IAAI,OAAO,MAAMkK,CAAC;AACpC,UAAIxC,IAAQ1H,EAAK;AAEjB,YAAM0T,IAAU,KAAK,mBAAmB1T,EAAK,KAAK0H,GAAO1H,EAAK,MAAM,EAAE,KAAK,CAAC2F,MAAS;AACjF,aAAK,MAAM,IAAI3F,EAAK,MAAM2F,CAAI;AAAA,MAClC,CAAC;AACD,MAAA2N,EAAS,KAAKI,CAAO;AAAA,IACzB;AAEA,UAAM,QAAQ,IAAIJ,CAAQ,GAE1B,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,MAAc,mBAAmBK,GAAoBC,GAAeC,IAAS,IAAO;AAGhF,UAAMN,IAFS,IAAI,UAAA,EACG,gBAAgBI,GAAY,eAAe,EAC9C;AACnB,IAAIC,KAEAL,EAAI,iBAAiB,GAAG,EAAE,QAAQ,CAACO,MAAY;AAC3C,MAAAA,EAAQ,aAAa,QAAQF,CAAI;AAAA,IACrC,CAAC;AAEL,UAAM3B,IAAM,IAAI,MAAA;AAChB,QAAI8B,IAAM;AACV,QAAIF,GAAQ;AACR,YAAMG,IAAU,IAAI,KAAK,CAAC,IAAI,gBAAgB,kBAAkBT,CAAG,CAAC,GAAG;AAAA,QACnE,MAAM;AAAA,MAAA,CACT;AACD,MAAAQ,IAAM,IAAI,gBAAgBC,CAAO;AAAA,IACrC;AACI,MAAAD,IAAM,sCAAsC,mBAAmB,IAAI,gBAAgB,kBAAkBR,CAAG,CAAC;AAE7G,WAAAtB,EAAI,MAAM8B,GACH,IAAI,QAA0B,CAACnE,GAASqE,MAAW;AACtD,MAAAhC,EAAI,UAAU,MAAMgC,EAAO,IAAI,MAAM,sBAAsB,CAAC,GAC5DhC,EAAI,SAAS,MAAM;AACf,QAAArC,EAAQqC,CAAG;AAAA,MACf;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EACA,IAAIzO,GAAc;AACd,WAAO,KAAK,MAAM,IAAIA,CAAI;AAAA,EAC9B;AACJ;AC9KA,MAAqB0Q,WAAmBxQ,GAAS;AAAA,EAyC7C,YAAYC,GAAc/E,GAAkBgF,GAAWC,GAAWC,GAAeC,GAAgBvF,GAAgB;AAC7G,UAAMmF,GAAKC,GAAGC,GAAGC,GAAOC,GAAQ,UAAUvF,EAAO,KAAK;AAzC1D,IAAAH,EAAA;AACA,IAAAA,EAAA,uBAA+B;AAC/B,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,qBAAsB;AACtB,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,kBAAW;AACX,IAAAA,EAAA,kBAAW;AACX,IAAAA,EAAA,kBAAW;AACX,IAAAA,EAAA,6BAAsB;AACtB,IAAAA,EAAA,kBAAqB,CAAA;AACrB,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,eAAsC,CAAA;AACtC,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA,sBAAe;AACf,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,yBAAkB;AAClB,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,wBAAiB;AACjB,IAAAA,EAAA,yBAAkB;AAClB,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA;AAGI,SAAK,MAAMsF,GACX,KAAK,IAAIC,GACT,KAAK,IAAIC,GACT,KAAK,QAAQC,GACb,KAAK,SAASC,GACd,KAAK,eAAeD,GACpB,KAAK,gBAAgBC,GACrB,KAAK,WAAWnF,GAChB,KAAK,MAAMJ,EAAO,KAClB,KAAK,WAAWA,EAAO,UACvB,KAAK,WAAWA,EAAO,UACvB,KAAK,OAAOA,EAAO,QAAQ,IAC3B,KAAK,aAAaA,EAAO,cAAc,QACvC,KAAK,QAAQA,EAAO,SAAS,UAC7B,KAAK,gBAAgBA,EAAO,iBAAiB,UAC7C,KAAK,QAAQA,EAAO,OACpB,KAAK,QAAQA,EAAO,SAAS,GAC7B,KAAK,YAAYA,EAAO,aAAa,IACrC,KAAK,OAAOA,EAAO,OACnB,KAAK,SAASA,GACd,KAAK,UAAUA,EAAO,WAAW,GACjC,KAAK,mBAAmBA,EAAO,oBAAoB,IACnD,KAAK,UAAUA,EAAO,WAAW,GACjC,KAAK,QAAQA,EAAO,OACpB,KAAK,WAAWA,EAAO,YAAY,IACnC,KAAK,WAAWA,EAAO,YAAY,IACnC,KAAK,SAASY,GAAA,GACd,KAAK,sBAAsBZ,EAAO,8BAA8B,IAChE,KAAK,cAAeA,EAAO,YAAYA,EAAO,SAAS,SAAS,KAAM,IACtE,KAAK,SAASA,EAAO;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB;AAChB,UAAM,EAAE,aAAA8F,MAAgB,KAAK,KACvBE,IAAeF;AACrB,WAAO,EAAE,KAAK,IAAI,KAAK,UAAU,KAAK,KAAK,KAAKE;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc;AACV,SAAK,QAAQ,KAAK,uBAAA;AAAA,EACtB;AAAA,EACA,kBAAkB;AACd,UAAM,EAAE,0BAAA2P,GAA0B,iBAAAC,GAAiB,mBAAAC,EAAA,IAAsB,KAAK,IAAI;AAClF,QAAI/M,IAAU8M,GACV7M,IAAY8M;AAChB,QAAI,OAAOF,KAA6B,YAAY;AAChD,YAAMG,IAA+CH,GAC/C,EAAE,iBAAA1M,GAAiB,OAAAC,EAAA,IACrB4M,EAAsB;AAAA,QAClB,UAAU,KAAK;AAAA,QACf,QAAQ,KAAK;AAAA,MAAA,CAChB,KAAK,CAAA;AACV,MAAI7M,MACAH,IAAUG,IAGVC,MACAH,IAAYG;AAAA,IAEpB;AACA,SAAK,kBAAkBJ,GACvB,KAAK,gBAAgBC;AAAA,EACzB;AAAA,EACA,SAAS;AACL,SAAK,gBAAA,GACL,KAAK,cAAc,KAAK,QAAA,GACxB,KAAK,QAAQ,KAAK,SAAA,GAClB,KAAK,QAAQ,KAAK,SAAA,GAClB,KAAK,YAAA;AAAA,EACT;AAAA,EACA,OAAO;AACH,UAAM;AAAA,MACF,OAAA8B;AAAA,MACA,QAAQ,EAAE,cAAAC,GAAc,cAAA5D,GAAc,aAAA6O,GAAa,QAAAhL,EAAA;AAAA,IAAO,IAC1D,KAAK,KACH,EAAE,OAAAC,GAAO,OAAAC,GAAO,aAAA+K,EAAA,IAAgB;AAEtC,IAAAnL,EAAM,SAASG,GAAOC,GAAO,KAAK,OAAO,KAAK,QAAQ;AAAA,MAClD,aAAaF,IAASD,IAAe;AAAA,MACrC,WAAW,KAAK;AAAA,IAAA,CACnB,GACD,KAAK,WAAWD,EAAM,SAASmL,GAAahL,GAAOC,GAAO,KAAK,OAAO,KAAK,QAAQ;AAAA,MAC/E,MAAM8K;AAAA,MACN,SAAS7O;AAAA,MACT,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,MACZ,eAAe,KAAK;AAAA,IAAA,CACvB,GACD,KAAK,cAAA,GACL,KAAK,aAAA;AAAA,EACT;AAAA,EACQ,eAAe;AAEnB,UAAM,EAAE,iBAAAkE,EAAA,IAAoB,KAAK,IAAI;AACrC,QAAI,CAACA;AACD;AAEJ,UAAM,EAAE,MAAAE,EAAA,IAAS,KAAK,IAAI,UACpB,CAACgB,GAAMf,CAAI,IAAID;AACrB,IAAI,KAAK,YAAYgB,KAAQ,KAAK,YAAYf,KAC1C,KAAK,IAAI,MAAM,SAAS,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,QAAQ;AAAA,MACrE,aAAa;AAAA,MACb,WAAW,KAAK,IAAI,OAAO,2BAA2B;AAAA,IAAA,CACzD;AAAA,EAET;AAAA,EACQ,gBAAgB;AACpB,UAAM,EAAE,OAAAjG,GAAO,QAAAC,GAAQ,MAAAqB,EAAA,IAAS;AAEhC,QAAI,CAAC,mBAAmB,WAAW,EAAE,SAASA,CAAI,GAAG;AACjD,YAAM,EAAE,eAAA+J,GAAe,OAAA/G,GAAO,YAAAC,EAAA,IAAe,KAAK,IAAI,SAAS,gBAAA,GACzD,EAAE,eAAAC,IAAgB,EAAA,IAAM,KAAK,IAAI,QACjCC,IAAK,KAAK,SAASzE,IAAQwE,KAAiB,GAC5CE,IAAK,KAAK,SAASzE,IAASuE,KAAiB;AACnD,UAAIG,IAA8C,KAAK,IAAI,MAAM,IAAI,kBAAkB,GACnFC,IAAe;AACnB,MAAIyG,KACA1G,IAAgB,KAAK,IAAI,MAAM,IAAI,wBAAwB,GAC3DC,IAAe,4BACRN,KAASC,KAChBI,IAAgB,KAAK,IAAI,MAAM,IAAI,gBAAgB,GACnDC,IAAe,oBACRN,KAASC,KAChBI,IAAgB,KAAK,IAAI,MAAM,IAAI,yBAAyB,GAC5DC,IAAe,6BACR,CAACN,KAASC,KACjBI,IAAgB,KAAK,IAAI,MAAM,IAAI,kBAAkB,GACrDC,IAAe,uBAEfD,IAAgB,KAAK,IAAI,MAAM,IAAI,mBAAmB,GACtDC,IAAe,sBAEfD,MACA,KAAK,aAAaF,GAClB,KAAK,aAAaC,GAClB,KAAK,iBAAiBF,GACtB,KAAK,kBAAkBA,GACvB,KAAK,gBAAgBI,GACrB,KAAK,kBAAkBD,GACvB,KAAK,IAAI,MAAM;AAAA,QACX,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,MAAA;AAAA,IAGjB;AAAA,EACJ;AAAA,EACA,UAAU;AACN,WAAI,KAAK,SACE,KAEJ,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAIA,yBAAyB;AACrB,QAAIU,IAAO;AACX,WAAI,KAAK,UAAU,SACfA,IAAO,GAAG,KAAK,KAAK,OACb,KAAK,UAAU,UACtBA,IAAO,GAAG,KAAK,SAAS,KAAK,IAAI,aAAa,KAAK,IAAI,gBAAgB,OAGvEA,IAAO,GAAG,KAAK,QAAQ,KAAK,IAAI,cAAc,MAE3C;AAAA,MACH,UAAU;AAAA,MACV,UAAU;AAAA,MACV,MAAAA;AAAA,MACA,KAAK,GAAG,KAAK,QAAQ,CAAC;AAAA,MACtB,OAAO,GAAG,KAAK,KAAK;AAAA,MACpB,QAAQ,GAAG,KAAK,SAAS,CAAC;AAAA,MAC1B,eAAe;AAAA,MACf,YAAY;AAAA,IAAA;AAAA,EAEpB;AACJ;ACnOA,MAAqBsL,GAAW;AAAA,EAK5B,YAAY9Q,GAAc;AAJ1B,IAAAtF,EAAA;AACQ,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEJ,SAAK,MAAMsF,GACX,KAAK,KAAA;AAAA,EACT;AAAA,EACQ,OAAa;AAEjB,SAAK,iBAAiB,IAAI,eAAe,MAAM;AAC3C,WAAK,IAAI,KAAK,aAAa,GAC3B,KAAK,IAAI,KAAK,gBAAgB;AAAA,IAClC,CAAC,GACD,KAAK,eAAe,QAAQ,KAAK,IAAI,gBAAgB,GACrD,KAAK,mBAAmB,IAAI,iBAAiB,CAAC+Q,MAAc;AACxD,iBAAWC,KAAYD;AACnB,QAAIC,EAAS,SAAS,gBAAgBA,EAAS,kBAAkB,YAC7D,KAAK,IAAI,OAAO,aAAA,GAChB,KAAK,IAAI,KAAK,MAAM;AAAA,IAGhC,CAAC,GACG,KAAK,IAAI,OAAO,qBAChB,KAAK,iBAAiB,QAAQ,SAAS,iBAAiB;AAAA,MACpD,YAAY;AAAA,MACZ,iBAAiB,CAAC,OAAO;AAAA;AAAA,IAAA,CAC5B,GAIL,KAAK,IAAI,GAAG,aAAa,CAAC9D,MAAM;AAM5B,UAJIA,EAAE,WAAW,KAIb,KAAK,OAAOA,CAAC;AACb;AAEJ,YAAM,EAAE,SAAApF,GAAS,SAAAD,EAAA,IAAY,KAAK,IAAI,UAAUqF,CAAC,GAC3ChN,IAAI4H,GACJ7H,IAAI4H;AACV,WAAK,kBAAkB5H,GAAGC,GAAG,KAAK,IAAI,OAAO,mBAAmB,CAACiK,MAAqB;AAClF,aAAK,IAAI,kBAAkBA,GAC3B,KAAK,IAAI,KAAK,uBAAuBA,GAAM+C,CAAC;AAAA,MAChD,CAAC,GACD,KAAK,gBAAgBjN,GAAGC,GAAG,KAAK,IAAI,KAAK,YAAY,CAACiK,MAAe;AACjE,aAAK,IAAI,aAAaA,CAAI,GAC1B,KAAK,IAAI,KAAK,iBAAiBA,GAAM+C,CAAC;AAAA,MAC1C,CAAC;AAAA,IACL,CAAC,GACD,KAAK,IAAI,GAAG,SAAS,CAACA,MAAM;AAMxB,UAJIA,EAAE,WAAW,KAIb,KAAK,OAAOA,CAAC;AACb;AAGJ,YAAMhN,IAAI,KAAK,IAAI,UAAUgN,CAAC,EAAE,SAC1BjN,IAAI,KAAK,IAAI,UAAUiN,CAAC,EAAE;AAChC,WAAK,kBAAkBjN,GAAGC,GAAG,KAAK,IAAI,OAAO,mBAAmB,CAACiK,MAAqB;AAClF,aAAK,IAAI,kBAAkBA,GAC3B,KAAK,IAAI,KAAK,mBAAmBA,GAAM+C,CAAC,GAExC,KAAK,eAAe/C,CAAI;AAAA,MAC5B,CAAC,GAED,KAAK,gBAAgBlK,GAAGC,GAAG,KAAK,IAAI,KAAK,YAAY,CAACiK,MAAe;AACjE,aAAK,IAAI,YAAYA,GACrB,KAAK,IAAI,KAAK,aAAaA,GAAM+C,CAAC,GAElC,KAAK,eAAe/C,CAAI,GAExB,KAAK,UAAUA,CAAI,GAEnB,KAAK,eAAeA,CAAI;AAAA,MAC5B,CAAC;AAAA,IACL,CAAC,GACD,KAAK,IAAI,GAAG,YAAY,CAAC+C,MAAM;AAM3B,UAJIA,EAAE,WAAW,KAIb,KAAK,OAAOA,CAAC;AACb;AAEJ,YAAMhN,IAAI,KAAK,IAAI,UAAUgN,CAAC,EAAE,SAC1BjN,IAAI,KAAK,IAAI,UAAUiN,CAAC,EAAE;AAChC,WAAK,kBAAkBjN,GAAGC,GAAG,KAAK,IAAI,OAAO,mBAAmB,CAACiK,MAAqB;AAClF,aAAK,IAAI,KAAK,sBAAsBA,GAAM+C,CAAC;AAAA,MAC/C,CAAC,GAED,KAAK,gBAAgBjN,GAAGC,GAAG,KAAK,IAAI,KAAK,YAAY,CAACiK,MAAe;AACjE,aAAK,IAAI,YAAYA,GACrB,KAAK,IAAI,KAAK,gBAAgBA,GAAM+C,CAAC;AAAA,MACzC,CAAC;AAAA,IACL,CAAC,GACD,KAAK,IAAI,GAAG,eAAe,CAACA,MAAkB;AAC1C,UAAI,KAAK,OAAOA,CAAC;AACb;AAEJ,YAAM,EAAE,SAAApF,GAAS,SAAAD,EAAA,IAAY,KAAK,IAAI,UAAUqF,CAAC,GAC3ChN,IAAI4H,GACJ7H,IAAI4H;AAEV,WAAK,kBAAkB5H,GAAGC,GAAG,KAAK,IAAI,OAAO,mBAAmB,CAACiK,MAAqB;AAClF,aAAK,IAAI,KAAK,8BAA8BA,GAAM+C,CAAC;AAAA,MACvD,CAAC,GACD,KAAK,gBAAgBjN,GAAGC,GAAG,KAAK,IAAI,KAAK,YAAY,CAACiK,MAAe;AACjE,aAAK,IAAI,KAAK,wBAAwBA,GAAM+C,CAAC;AAAA,MACjD,CAAC;AAAA,IACL,CAAC,GACD,KAAK,IAAI,GAAG,YAAY,CAACA,MAAkB;AACvC,MAAI,CAAC,KAAK,IAAI,iBAAiB,SAASA,EAAE,aAAqB,KAAK,KAAK,IAAI,cAAc,WACvF,KAAK,IAAI,WAAW,QACpB,KAAK,IAAI,YAAY,QACrB,KAAK,IAAI,KAAK,MAAM;AAAA,IAE5B,CAAC,GACD,KAAK,IAAI,GAAG,aAAa,CAACA,MAAkB;AAExC,UAAI,KAAK,OAAOA,CAAC;AACb;AAEJ,WAAK,IAAI,YAAY,IACjB,KAAK,IAAI,aAAa,MAAM,WAAW,cACvC,KAAK,IAAI,aAAa,MAAM,SAAS;AAEzC,YAAMhN,IAAI,KAAK,IAAI,UAAUgN,CAAC,EAAE,SAC1BjN,IAAI,KAAK,IAAI,UAAUiN,CAAC,EAAE;AAChC,WAAK,kBAAkBjN,GAAGC,GAAG,KAAK,IAAI,OAAO,mBAAmB,CAACiK,MAAqB;AAQlF,QAPA,KAAK,IAAI,KAAK,wBAAwBA,GAAM+C,CAAC,GAEzC,KAAK,IAAI,mBAAmB,KAAK,IAAI,oBAAoB/C,KACzD,KAAK,IAAI,KAAK,wBAAwB,KAAK,IAAI,iBAAiB+C,CAAC,GAGrE,KAAK,mBAAmB/C,GAAM+C,CAAC,GAC3B,KAAK,IAAI,oBAAoB/C,MAGjC,KAAK,IAAI,kBAAkBA,GAC3B,KAAK,mBAAmB,QACxB,KAAK,IAAI,KAAK,yBAAyBA,GAAM+C,CAAC;AAAA,MAClD,CAAC,GAED,KAAK;AAAA,QACDjN;AAAA,QACAC;AAAA,QACA,KAAK,IAAI,KAAK;AAAA,QACd,CAACiK,MAAe;AAEZ,eAAK,uBAAuBA,GAAM+C,CAAC,GAE/B,KAAK,qBAAqB/C,MAC1B,KAAK,IAAI,KAAK,yBAAyBA,GAAM+C,CAAC,GAC9C,KAAK,mBAAmB/C,GACxB,KAAK,IAAI,kBAAkB,QAC3B,KAAK,IAAI,KAAK,0BAA0BA,GAAM+C,CAAC;AAAA,QAEvD;AAAA,QACA;AAAA,MAAA,GAGJ,KAAK,gBAAgBjN,GAAGC,GAAG,KAAK,IAAI,KAAK,YAAY,CAACiK,MAAe;AZxJjF,YAAA3B;AY+JgB,QANA,KAAK,mBAAmB2B,GAAM+C,CAAC,GAC/B,KAAK,IAAI,KAAK,kBAAkB/C,GAAM+C,CAAC,GAEnC,KAAK,IAAI,aAAa,KAAK,IAAI,cAAc/C,KAC7C,KAAK,IAAI,KAAK,kBAAkBA,GAAM+C,CAAC,GAEvC,KAAK,IAAI,cAAc/C,QACvB3B,IAAA,KAAK,IAAI,cAAT,gBAAAA,EAAoB,YAAW2B,EAAK,WACpC,KAAK,IAAI,YAAYA,GACrB,KAAK,IAAI,WAAW,KAAK,IAAI,KAAK,WAAW,KAAK,CAAC9N,MAASA,EAAK,WAAW8N,EAAK,MAAM,GACvF,KAAK,IAAI,KAAK,kBAAkB,KAAK,IAAI,UAAUA,GAAM+C,CAAC,GAC1D,KAAK,IAAI,KAAK,UAAU,IAE5B,KAAK,IAAI,YAAY/C,GACrB,KAAK,IAAI,KAAK,mBAAmBA,GAAM+C,CAAC;AAAA,MAC5C,CAAC;AAAA,IACL,CAAC;AAAA,EACL;AAAA,EACQ,eAAe/C,GAAY;AAE/B,IAAIA,EAAK,iBAAiB,KAAK,IAAI,aAC/B,KAAK,IAAI,KAAK,kBAAkBA,CAAI;AAAA,EAE5C;AAAA;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAeA,GAAyB;AAG5C,QADoB,CAAC,aAAa,iBAAiB,EAAE,SAASA,EAAK,IAAI,KAAK,KAAK,IAAI;AAKrF,UAAIA,aAAgBoG;AAChB,QAAIpG,EAAK,kBAAkB,sBAAsBA,EAAK,kBAAkB,2BACpE,KAAK,IAAI,SAAS,mBAAA,IACXA,EAAK,kBAAkB,oBAC9B,KAAK,IAAI,SAAS,eAAe,EAAI;AAAA,WAEtC;AAIH,YAAI,CADe,KAAK,IAAI,SAAS,iBAAiBA,EAAK,MAAM;AAE7D;AAEJ,aAAK,IAAI,SAAS,mBAAmBA,EAAK,MAAM;AAAA,MACpD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAUA,GAAY;AAE1B,QAAIA,EAAK,SAAS,UAAU,KAAK,IAAI,WAAW;AAC5C,YAAMrP,IAAM,KAAK,IAAI,SAAS,gBAAgBqP,EAAK,MAAM,GACnD,EAAE,QAAAhI,IAAS,IAAO,YAAA8O,IAAa,GAAA,IAAUnW,KAAO,CAAA,GAChD,EAAE,aAAAoW,GAAa,oBAAAC,EAAA,IAAuB,KAAK,IAAI;AAErD,UAAID,KAAeC,KAAsB,CAAChP,KAAU,CAAC8O;AACjD,QAAI,OAAOE,KAAuB,eAC9B,KAAK,IAAI,SAAS,cAAchH,EAAK,QAAQ,EAAI,GACNgH,EAC1B;AAAA,UACb,KAAKhH,EAAK;AAAA,UACV,UAAUA,EAAK;AAAA,UACf,UAAUA,EAAK;AAAA,UACf,QAAQA,EAAK;AAAA,UACb,OAAOA,EAAK,SAAA;AAAA,QAAS,CACxB,EACI,KAAK,CAACiH,MAAa;AAChB,eAAK,IAAI,SAAS,kBAAkBjH,EAAK,QAAQiH,CAAG,GACpD,KAAK,IAAI,SAAS,cAAcjH,EAAK,QAAQ,EAAK,GAClD,KAAK,IAAI,KAAK,gBAAgB,KAAK,IAAI,SAAS,kBAAkB;AAAA,QACtE,CAAC,EACA,MAAM,CAACnJ,MAAa;AACjB,eAAK,IAAI,SAAS,cAAcmJ,EAAK,QAAQ,EAAK,GAClD,QAAQ,MAAMnJ,CAAG;AAAA,QACrB,CAAC;AAAA,WAGN;AACH,cAAMqQ,IAAW,KAAK,IAAI,SAAS,YAAYlH,EAAK,MAAM;AAC1D,aAAK,IAAI,SAAS,WAAWA,EAAK,QAAQ,CAACkH,CAAQ,GACnD,KAAK,IAAI,KAAK,gBAAgB,KAAK,IAAI,SAAS,kBAAkB;AAAA,MACtE;AAAA,IACJ;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAmBlH,GAAyB,GAAe;AAC/D,UAAM,EAAE,SAAArC,GAAS,SAAAD,EAAA,IAAY,KAAK,IAAI,UAAU,CAAC,GAC3C3H,IAAI4H,GACJ7H,IAAI4H;AACV,IACI5H,IAAIkK,EAAK,cACTlK,IAAIkK,EAAK,aAAaA,EAAK,kBAC3BjK,IAAIiK,EAAK,cACTjK,IAAIiK,EAAK,aAAaA,EAAK,oBAE3B,KAAK,IAAI,aAAa,MAAM,SAAS,WACrC,KAAK,IAAI,YAAY;AAAA,EAE7B;AAAA,EACQ,uBAAuBA,GAAyB,GAAe;AACnE,UAAM,EAAE,SAAArC,GAAS,SAAAD,EAAA,IAAY,KAAK,IAAI,UAAU,CAAC,GAC3C3H,IAAI4H,GACJ7H,IAAI4H;AACV,IACI5H,IAAIkK,EAAK,cACTlK,IAAIkK,EAAK,aAAaA,EAAK,kBAC3BjK,IAAIiK,EAAK,cACTjK,IAAIiK,EAAK,aAAaA,EAAK,mBAGvBA,aAAgBpJ,MAAQ,CAAC,aAAa,iBAAiB,EAAE,SAASoJ,EAAK,IAAI,MAC3E,KAAK,IAAI,aAAa,MAAM,SAAS,WACrC,KAAK,IAAI,YAAY,IAEF,KAAK,IAAI,SAAS,iBAAiBA,EAAK,MAAM,MAE7D,KAAK,IAAI,aAAa,MAAM,SAAS;AAAA,EAIrD;AAAA,EAEQ,OAAO+C,GAAe;AAC1B,UAAM,EAAE,SAAApF,GAAS,SAAAD,EAAA,IAAY,KAAK,IAAI,UAAUqF,CAAC,GAC3ChN,IAAI4H,GACJ7H,IAAI4H;AAkBV,QAhBI,CAAC,KAAK,IAAI,SAASqF,CAAC,KAIpB,KAAK,IAAI,aAAa,MAAM,WAAW,gBAIvC,KAAK,IAAI,aAAa,MAAM,WAAW,gBAIvC,KAAK,IAAI,kBAIT,KAAK,IAAI;AACT,aAAO;AAEX,UAAM,EAAE,qBAAApM,EAAA,IAAwB,KAAK,IAAI;AAczC,WAZI,QAAK,IAAI,gBAIT,KAAK,IAAI,iBAITZ,IAAI,KAAK,IAAI,cAAcY,KAI3Bb,IAAI,KAAK,IAAI,aAAaa;AAAA,EAIlC;AAAA,EACQ,gBAAgBb,GAAWC,GAAWoR,GAAmB3D,GAAoB4D,IAAU,IAAO;AAClG,QAAK,KAAK,aAAarR,CAAC;AAGxB,iBAAWpF,KAAOwW,GAAY;AAE1B,cAAME,IAAQ1W,EAAI,WAAW,OAAOA,EAAI,YAAY;AACpD,mBAAWqP,KAAQqH,GAAO;AACtB,gBAAM3L,IAAQsE,EAAK,SAAA,GACbrE,IAAQqE,EAAK,SAAA;AACnB,cAAIoH;AACA,gBAAItR,IAAI4F,KAAS5F,IAAI4F,IAAQsE,EAAK,gBAAgBjK,IAAI4F,KAAS5F,IAAI4F,IAAQqE,EAAK,eAAe;AAC3F,cAAAwD,EAASxD,CAAI;AACb;AAAA,YACJ;AAAA,qBACOlK,IAAI4F,KAAS5F,IAAI4F,IAAQsE,EAAK,SAASjK,IAAI4F,KAAS5F,IAAI4F,IAAQqE,EAAK,QAAQ;AACpF,YAAAwD,EAASxD,CAAI;AACb;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,EACJ;AAAA,EACQ,kBAAkBlK,GAAWC,GAAWuR,GAAiC9D,GAAoB;AACjG,eAAWxD,KAAQsH,GAAmB;AAClC,YAAM5L,IAAQsE,EAAK,SAAA,GACbrE,IAAQqE,EAAK,SAAA;AACnB,UAAIlK,IAAI4F,KAAS5F,IAAI4F,IAAQsE,EAAK,SAASjK,IAAI4F,KAAS5F,IAAI4F,IAAQqE,EAAK,QAAQ;AAC7E,QAAAwD,EAASxD,CAAI;AACb;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EACQ,aAAajK,GAAW;AAC5B,WAAOA,IAAI,KAAK,IAAI,KAAK,KAAKA,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK,IAAI,KAAK;AAAA,EACtE;AAAA,EACA,UAAU;AACN,SAAK,eAAe,UAAU,KAAK,IAAI,YAAY,GACnD,KAAK,iBAAiB,WAAA;AAAA,EAC1B;AACJ;ACjUA,MAAqBwR,GAAQ;AAAA,EAmGzB,YAAYC,GAA2CpK,GAA4B;AAlG3E,IAAA7M,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACR,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,yBAAkB;AAClB,IAAAA,EAAA,oCAA6B;AAC7B,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,qBAAc;AACd;AAAA,IAAAA,EAAA,wBAAiB;AACjB;AAAA,IAAAA,EAAA,sBAAe;AACf;AAAA,IAAAA,EAAA,uBAAgB;AAChB;AAAA,IAAAA,EAAA,sBAAe;AACf;AAAA,IAAAA,EAAA,sBAAe;AACf;AAAA,IAAAA,EAAA,2BAAoB;AACpB;AAAA,IAAAA,EAAA,iBAAU;AACV;AAAA,IAAAA,EAAA,uBAAgB;AAChB;AAAA,IAAAA,EAAA,uBAAgB;AAChB;AAAA,IAAAA,EAAA,sBAAe;AACf;AAAA,IAAAA,EAAA,iBAAU;AACV;AAAA,IAAAA,EAAA,iBAAU;AACV,IAAAA,EAAA,iBAAU;AACV,IAAAA,EAAA,wBAAiB;AACjB,IAAAA,EAAA,yBAAkB;AAClB,IAAAA,EAAA,4BAAqB;AACrB,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,cAAoB;AAAA,MAChB,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,cAAc;AAAA,MACd,WAAW;AAAA,MACX,WAAW;AAAA,MACX,aAAa,CAAA;AAAA,MACb,YAAY,CAAA;AAAA,MACZ,MAAM,CAAA;AAAA,IAAC;AAEX,IAAAA,EAAA,gBAAwB;AAAA,MACpB,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,cAAc;AAAA,MACd,YAAY,CAAA;AAAA,IAAC;AAEjB,IAAAA,EAAA,gBAAwB;AAAA,MACpB,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,cAAc;AAAA,MACd,oBAAoB,CAAA;AAAA,MACpB,iBAAiB,CAAA;AAAA,MACjB,uBAAuB,CAAA;AAAA,MACvB,mBAAmB,CAAA;AAAA,MACnB,sBAAsB,CAAA;AAAA,MACtB,uBAAuB,CAAA;AAAA,MACvB,yBAAyB,CAAA;AAAA,IAAC;AAE9B,IAAAA,EAAA,kBAA4B;AAAA,MACxB,QAAQ;AAAA,MACR,MAAM,CAAC,IAAI,EAAE;AAAA,MACb,MAAM,CAAC,IAAI,EAAE;AAAA,MACb,UAAU,CAAC,IAAI,EAAE;AAAA,MACjB,UAAU,CAAC,IAAI,EAAE;AAAA,IAAA;AAErB,IAAAA,EAAA,kBAA4B;AAAA,MACxB,QAAQ;AAAA,MACR,MAAM,CAAC,IAAI,EAAE;AAAA,MACb,MAAM,CAAC,IAAI,EAAE;AAAA,IAAA;AAEjB,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGI,UAAM;AAAA,MACF,kBAAAkX;AAAA,MACA,cAAAC;AAAA,MACA,eAAAC;AAAA,MACA,kBAAAC;AAAA,MACA,eAAAC;AAAA,MACA,cAAAC;AAAA,MACA,oBAAAC;AAAA,IAAA,IACAP;AACJ,SAAK,mBAAmBC,GACxBC,EAAa,WAAW,GACxB,KAAK,eAAeA,GACpB,KAAK,gBAAgBC,GACrB,KAAK,mBAAmBC,GACxB,KAAK,gBAAgBC,GACrB,KAAK,eAAeC,GACpB,KAAK,qBAAqBC,GAC1B,KAAK,SAAS,IAAI5C,GAAO/H,EAAQ,UAAU,CAAA,CAAE,GAC7C,KAAK,WAAW,IAAImG,GAAA,GACpB,KAAK,eAAe,IAAIL,GAAa,IAAI,GACzC,KAAK,aAAa,IAAIyD,GAAW,IAAI,GACrC,KAAK,QAAQ,IAAIhD,GAAM,KAAK,aAAa,GACzC,KAAK,WAAW,IAAI9F,GAAS,MAAMT,CAAO,GAC1C,KAAK,UAAU,IAAI0F,GAAQ,IAAI,GAC/B,KAAK,QAAQ,IAAIyC,GAAM,IAAI;AAAA,EAC/B;AAAA,EACA,UAAU1S,GAAgB;AACtB,SAAK,SAAS,IAAIsS,GAAOtS,CAAM;AAAA,EACnC;AAAA,EACA,qBAAqBhC,GAAgBD,GAAaI,GAAYsO,IAAU,IAAMc,IAAS,IAAMb,IAAgB,IAAM;AAE/G,QAAI,KAAK,OAAO,wBAAwB;AACpC,YAAMS,IAAO,KAAK,SAAS,wBAAwBnP,GAAQD,CAAG;AAC9D,UAAIoP,MAASA,EAAK,YAAYA,EAAK,WAAW;AAC1C,cAAM,EAAE,UAAA7B,EAAA,IAAa6B,EAAK,YAAA,GACpB/N,IAAOkM,EAAS,IAAI,CAACjM,OAAe,EAAE,GAAGA,GAAM,OAAAlB,EAAA,EAAQ;AAC7D,aAAK,SAAS,kBAAkBiB,GAAMqN,GAASC,CAAa;AAC5D;AAAA,MACJ;AAAA,IACJ;AACA,SAAK,SAAS,aAAa1O,GAAQD,GAAKI,GAAOsO,GAASc,GAAQ,IAAMb,CAAa;AAAA,EACvF;AAAA,EAEA,0BAA0BF,GAAqBC,IAAU,IAAMC,IAAgB,IAAM;AAEjF,QAAI,KAAK,OAAO,wBAAwB;AACpC,YAAMlL,IAAqB,CAAA;AAC3B,MAAAgL,EAAM,QAAQ,CAACnN,MAAS;AACpB,cAAMnB,IAAW,KAAK,SAAS,qBAAqBmB,EAAK,MAAM,GACzDpB,IAAW,KAAK,SAAS,kBAAkBoB,EAAK,GAAG;AACzD,YAAInB,MAAa,UAAaD,MAAa,OAAW;AACtD,cAAMkP,IAAO,KAAK,SAAS,mBAAmBjP,GAAUD,CAAQ;AAChE,YAAIkP,GAAM;AACN,gBAAM,EAAE,UAAA7B,EAAA,IAAa6B,EAAK,YAAA,GACpB/N,IAAOkM,EAAS,IAAI,CAAC9J,OAAe,EAAE,GAAGA,GAAM,OAAOnC,EAAK,MAAA,EAAQ;AACzE,UAAAmC,EAAK,KAAK,GAAGpC,CAAI;AAAA,QACrB;AAAA,MACJ,CAAC,GACD,KAAK,SAAS,kBAAkBoC,GAAMiL,GAASC,CAAa;AAAA,IAChE;AACI,WAAK,SAAS,kBAAkBF,GAAOC,GAASC,CAAa;AAAA,EAErE;AAAA,EACA,aAAaS,GAAY;AblN7B,QAAA3B;AamNQ,QAAI,KAAK,cAAc2B,GACvB;AAAA,YAAI3B,IAAA,KAAK,cAAL,gBAAAA,EAAgB,YAAW2B,EAAK,QAAQ;AAExC,aAAK,cAAcA,GACnB,KAAK,KAAK,kBAAkBA,CAAI;AAChC,cAAM/N,IAAkB;AAAA,UACpB,UAAU+N,EAAK;AAAA,UACf,QAAQA,EAAK;AAAA,UACb,KAAKA,EAAK;AAAA,QAAA;AAEd,aAAK,KAAK,oBAAoB/N,CAAI;AAAA,MACtC;AACA,WAAK,YAAY+N,GACjB,KAAK,KAAK,mBAAmBA,CAAI;AAAA;AAAA,EACrC;AAAA,EACA,gBAAgB;AACZ,SAAK,SAAS,SAAS,IACvB,KAAK,SAAS,OAAO,CAAC,IAAI,EAAE,GAC5B,KAAK,SAAS,OAAO,CAAC,IAAI,EAAE,GAC5B,KAAK,KAAK,eAAe;AAAA,EAC7B;AAAA,EACA,oBAAoB;AAChB,SAAK,SAAS,WAAW,CAAC,IAAI,EAAE,GAChC,KAAK,SAAS,WAAW,CAAC,IAAI,EAAE;AAAA,EACpC;AAAA,EACA,gBAAgB;AACZ,SAAK,WAAW;AAAA,MACZ,QAAQ;AAAA,MACR,MAAM,CAAC,IAAI,EAAE;AAAA,MACb,MAAM,CAAC,IAAI,EAAE;AAAA,IAAA;AAAA,EAErB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB;AACd,UAAMgI,IAAW,CAAA,GACX9N,IAAO,KAAK,SAAS,MACrB8B,IAAO,KAAK,SAAS;AAC3B,QAAIW,IAAO;AACX,aAASsL,IAAK,GAAGA,KAAM/N,EAAK,CAAC,IAAIA,EAAK,CAAC,GAAG+N,KAAM;AAC5C,YAAMC,IAAY,CAAA;AAClB,eAASC,IAAK,GAAGA,KAAMnM,EAAK,CAAC,IAAIA,EAAK,CAAC,GAAGmM,KAAM;AAC5C,cAAMpX,IAAWkX,IAAK/N,EAAK,CAAC,GACtBpJ,IAAWqX,IAAKnM,EAAK,CAAC,GACtBgE,IAAO,KAAK,SAAS,mBAAmBjP,GAAUD,CAAQ;AAChE,QAAIkP,MAEIA,EAAK,0BAA0B,gBAC/BkI,EAAU,KAAKlI,EAAK,WAAW,IAG/BkI,EAAU,KAAKlI,EAAK,UAAU;AAAA,MAG1C;AACA,MAAArD,KAAQ,GAAGuL,EAAU,KAAK,GAAI,CAAC,MAC/BF,EAAS,KAAKE,CAAS;AAAA,IAC3B;AACA,WAAAvL,IAAOA,IAAOA,EAAK,QAAQ,OAAO,EAAE,IAAI,KACjC;AAAA,MACH,MAAAX;AAAA,MACA,MAAA9B;AAAA,MACA,MAAAyC;AAAA,MACA,OAAOqL;AAAA,IAAA;AAAA,EAEf;AAAA,EACA,UAAUlS,GAAWC,GAAiB;AAClC,QAAIM,IAAU,KAAK,MAAMP,CAAC;AAC1B,UAAMsS,IAAa,KAAK,KAAK,QAAQ,KAAK,KAAK;AAE/C,IAAI/R,IAAU,IACVA,IAAU,IACHA,IAAU+R,MACjB/R,IAAU+R;AAGd,QAAI3R,IAAU,KAAK,MAAMV,CAAC,GACtBsS,IAAa,KAAK,KAAK,SAAS,KAAK,KAAK;AAC9C,IAAK,KAAK,OAAO,iBACbA,IAAa,KAAK,KAAK,SAAS,KAAK,OAAO,SAAS,KAAK,KAAK,gBAE/D5R,IAAU,IACVA,IAAU,IACHA,IAAU4R,MACjB5R,IAAU4R,IAEd,KAAK,KAAK,aAAahS,GAASI,CAAO;AAAA,EAC3C;AAAA,EACA,WAAWX,GAAiB;AACxB,QAAIO,IAAU,KAAK,MAAMP,CAAC;AAC1B,UAAMsS,IAAa,KAAK,KAAK,QAAQ,KAAK,KAAK;AAE/C,IAAI/R,IAAU,IACVA,IAAU,IACHA,IAAU+R,MACjB/R,IAAU+R,IAEd,KAAK,KAAK,cAAc/R,CAAO;AAAA,EACnC;AAAA,EACA,WAAWN,GAAiB;AAExB,QAAIU,IAAU,KAAK,MAAMV,CAAC,GACtBuS,IAAe;AACnB,IAAK,KAAK,OAAO,iBACbA,IAAe,KAAK,OAAO;AAE/B,UAAMD,IAAa,KAAK,KAAK,SAAS,KAAK,KAAK,gBAAgBC;AAChE,IAAI7R,IAAU,IACVA,IAAU,IACHA,IAAU4R,MACjB5R,IAAU4R,IAEd,KAAK,KAAK,cAAc5R,CAAO;AAAA,EACnC;AAAA,EACA,SAASsM,GAAmB;AACxB,WAAK,OAAK,iBAAiB,SAASA,EAAE,MAAc;AAAA,EAIxD;AAAA,EACA,UAAUA,GAAe;AACrB,UAAM,EAAE,MAAA1H,GAAM,KAAAC,EAAA,IAAQ,KAAK,iBAAiB,sBAAA;AAC5C,WAAO;AAAA,MACH,SAASyH,EAAE,UAAU1H;AAAA,MACrB,SAAS0H,EAAE,UAAUzH;AAAA,IAAA;AAAA,EAE7B;AAAA,EACA,SAAS8H,GAAwB;AAC7B,WAAO,KAAK,SAAS,IAAIA,CAAK;AAAA,EAClC;AAAA,EACA,GAAGA,GAAeI,GAA+B;AAC7C,SAAK,SAAS,GAAGJ,GAAOI,CAAQ;AAAA,EACpC;AAAA,EACA,KAAKJ,GAAeI,GAA+B;AAC/C,SAAK,SAAS,KAAKJ,GAAOI,CAAQ;AAAA,EACtC;AAAA,EACA,IAAIJ,GAAeI,GAA+B;AAC9C,SAAK,SAAS,IAAIJ,GAAOI,CAAQ;AAAA,EACrC;AAAA,EACA,KAAKJ,MAAkBvR,GAAmB;AACtC,SAAK,SAAS,KAAKuR,GAAO,GAAGvR,CAAI;AAAA,EACrC;AAAA,EACA,UAAgB;AACZ,SAAK,WAAW,QAAA,GAChB,KAAK,aAAa,QAAA,GAClB,KAAK,SAAS,QAAA;AAAA,EAClB;AACJ;AC7XA,MAAM0W,GAAU;AAAA,EAqBZ,YAAY1S,GAAcyB,GAAqB;AApBvC,IAAA/G,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,iBAAU;AACV,IAAAA,EAAA,gBAAS;AACT,IAAAA,EAAA,gBAAS;AACT,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,qBAAwB,CAAA;AACxB;AAAA,IAAAA,EAAA,cAAO;AACP,IAAAA,EAAA,cAAO;AACP,IAAAA,EAAA,kBAAW;AACX,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,kBAAW;AACX;AAAA,IAAAA,EAAA,yBAAkB;AAClB;AAAA,IAAAA,EAAA,iBAAU;AACV,IAAAA,EAAA,iBAAU;AACV,IAAAA,EAAA,mBAAY;AACpB;AAAA,IAAAA,EAAA,oBAAa;AACb,IAAAA,EAAA,gBAAS;AAGL,SAAK,MAAMsF,GACX,KAAK,OAAOyB,GACR,KAAK,SAAS,aACd,KAAK,SAAS,KAAK,IAAI,UAEvB,KAAK,SAAS,KAAK,IAAI;AAAA,EAE/B;AAAA,EAEA,QAAQyL,GAAe;AACnB,SAAK,aAAaA,CAAC;AAAA,EACvB;AAAA,EACA,YAAYA,GAAe;AACvB,UAAM,EAAE,SAAAyF,GAAS,SAAAC,EAAA,IAAY1F,EAAE,QAAQ,CAAC,GAClC2F,IAASF,IAAU,KAAK,SACxBG,IAASF,IAAU,KAAK;AAC9B,QAAIG,IAAS;AACb,IAAI,KAAK,SAAS,cACdA,IAAS,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,YAAYF,GAAQ,KAAK,QAAQ,CAAC,GAEhD,KAAK,aAAA,KACN,EAAGE,MAAW,KAAKF,IAAS,KAAOE,MAAW,KAAK,YAAYF,IAAS,MACxF3F,EAAE,eAAA,KAEC,KAAK,SAAS,iBACrB6F,IAAS,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,YAAYD,GAAQ,KAAK,QAAQ,CAAC,IAEzE,KAAK,SAASC;AAAA,EAClB;AAAA,EACA,aAAa7F,GAAe;AACxB,UAAM,EAAE,SAAAyF,GAAS,SAAAC,EAAA,IAAY1F,EAAE,QAAQ,CAAC;AACxC,SAAK,UAAU0F,GACf,KAAK,UAAUD,GACf,KAAK,YAAY,KAAK;AAAA,EAC1B;AAAA,EAEA,YAAYzF,GAAe;AAIvB,QAHI,EAAEA,EAAE,kBAAkB,YAGtB,CAAC,KAAK,IAAI,SAASA,CAAC;AACpB;AAOJ,QAJI,KAAK,IAAI,aAAa,MAAM,WAAW,gBAIvC,KAAK,IAAI,aAAa,MAAM,WAAW;AACvC,aAAO;AAGX,UAAM,EAAE,SAAArF,GAAS,SAAAC,GAAS,SAAA8K,GAAS,SAAAD,MAAYzF;AAC/C,QAAI,EAAA0F,KAAW,KAAK,WAAWD,KAAW,KAAK;AAC/C,UAAI,KAAK,cAAc9K,GAASC,CAAO;AACnC,aAAK,UAAU8K,GACf,KAAK,UAAUD,GACf,KAAK,aAAa,IAClB,KAAK,IAAI,eAAe,IACxB,KAAK,UAAU,IACf,KAAK,YAAY,KAAK,QACtBzF,EAAE,eAAA;AAAA,eACK,KAAK,UAAUrF,GAASC,CAAO,GAAG;AAEzC,YAAIiL,IAAS;AACb,QAAI,KAAK,SAAS,aAIdA,KADejL,IAAU,KAAK,IAAI,OAAO,SAAS,KAAK,YAAY,MAC/C,KAAK,kBAAkB,KAAK,aAAc,KAAK,WAGnEiL,KADelL,IAAU,KAAK,WAAW,MACrB,KAAK,kBAAkB,KAAK,YAAa,KAAK,UAEtE,KAAK,SAAS,KAAK,IAAI,GAAG,KAAK,IAAIkL,GAAQ,KAAK,QAAQ,CAAC;AAAA,MAC7D;AAAA;AAAA,EACJ;AAAA,EAEA,YAAY;AACR,SAAK,aAAa,IAClB,KAAK,UAAU,IACf,KAAK,UAAU,GACf,KAAK,UAAU;AAAA,EACnB;AAAA,EAEA,YAAY7F,GAAe;AACvB,UAAM,EAAE,SAAArF,GAAS,SAAAC,GAAS,SAAA8K,GAAS,SAAAD,GAAS,SAAAK,MAAY9F;AAYxD,QATI,KAAK,cAAcrF,GAASC,CAAO,KAAKoF,EAAE,WAAW,KAAK,IAAI,gBAC9D,KAAK,UAAU,KAEf,KAAK,UAAU,IAEf8F,MAAY,KAIZJ,KAAW,KAAK,WAAWD,KAAW,KAAK,QAAS;AACxD,QAAItM,IAAS;AAMb,QALI,KAAK,SAAS,eACdA,IAASuM,IAAU,KAAK,UAExBvM,IAASsM,IAAU,KAAK,SAExB,KAAK,cAActM,MAAW,GAAG;AAEjC,UAAI0M,IAAS;AACb,MAAI,KAAK,SAAS,aACdA,IAAS,KAAK,YAAa1M,KAAU,KAAK,kBAAkB,KAAK,aAAc,KAAK,WAEpF0M,IAAS,KAAK,YAAa1M,KAAU,KAAK,kBAAkB,KAAK,YAAa,KAAK,UAEvF,KAAK,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI0M,GAAQ,KAAK,QAAQ,CAAC;AAAA,IAC7D;AAAA,EACJ;AAAA,EAEQ,iBACJE,GACAC,GACAC,GACAC,GACAC,GACAC,GACO;AACP,WACIL,KAAUE,KACVF,KAAUE,IAAWE,KACrBH,KAAUE,KACVF,KAAUE,IAAWE;AAAA,EAE7B;AAAA,EACQ,eAAwB;AAC5B,WAAI,KAAK,SAAS,aACP,KAAK,YAAY,IACjB,KAAK,SAAS,eACd,KAAK,WAAW,IAEpB;AAAA,EACX;AAAA,EAEQ,cAAcrT,GAAWC,GAAoB;AACjD,WAAO,KAAK,iBAAiBD,GAAGC,GAAG,KAAK,MAAM,KAAK,MAAM,KAAK,UAAU,KAAK,SAAS;AAAA,EAC1F;AAAA,EACQ,UAAUD,GAAWC,GAAoB;AAC7C,WAAO,KAAK,iBAAiBD,GAAGC,GAAG,KAAK,QAAQ,KAAK,QAAQ,KAAK,YAAY,KAAK,WAAW;AAAA,EAClG;AAAA,EAEQ,aAAagN,GAAe;AAChC,UAAM4F,IAAS5F,EAAE,QACX2F,IAAS3F,EAAE;AACjB,IAAI,KAAK,SAAS,cAAcA,EAAE,aAAa,MAEtB,KAAK,aAAA,KACN,EAAG,KAAK,WAAW,KAAK2F,IAAS,KAAO,KAAK,WAAW,KAAK,YAAYA,IAAS,MAClG3F,EAAE,eAAA,GAEN,KAAK,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,SAAS2F,GAAQ,KAAK,QAAQ,CAAC,KAChE,KAAK,SAAS,iBACjB3F,EAAE,WACF,KAAK,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,SAAS2F,GAAQ,KAAK,QAAQ,CAAC,IAEvE,KAAK,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,SAASC,GAAQ,KAAK,QAAQ,CAAC;AAAA,EAGnF;AAAA,EACQ,cAAc;AAClB,UAAM;AAAA,MACF,MAAAS;AAAA,MACA,QAAAC;AAAA,MACA,aAAA7S;AAAA,MACA,YAAAL;AAAA,MACA,QAAQ,EAAE,qBAAAQ,IAAsB,GAAG,eAAA2S,IAAgB,GAAG,QAAA7N,EAAA;AAAA,IAAO,IAC7D,KAAK,KACHrB,IAAejE,GACfkE,IAAgB7D,GAChB+S,IAAeF,EAAO,QACtBG,IAAcH,EAAO,OACrBI,IAAaL,EAAK,QAClBd,IAAe,KAAK,IAAI,OAAO;AACrC,QAAI,KAAK,SAAS,YAAY;AAC1B,WAAK,kBAAkBjO,IAAgB1D,IAAsB4S,GAC7D,KAAK,WAAWE,IAAa,KAAK,kBAAkBnB,GACpD,KAAK,SAASlO,IAAezD,GAC7B,KAAK,SAAS,GAEd,KAAK,cAAc,CAAC,KAAK,QAAQ4S,GAAc,KAAK,SAAS5S,GAAqB4S,CAAY,GAC9F,KAAK,aAAa5S,GAClB,KAAK,cAAc0D,GAEnB,KAAK,OAAO,KAAK,SAAS,KAAK1D,IAAsB2S,KAAiB,GACtE,KAAK,WAAWA;AAChB,YAAMI,IAAQ,KAAK,WAAW,KAAK,mBAAmBD,IAAanB,KAAgB;AACnF,UAAIqB,IAAa,KAAK,MAAMD,IAAQ,KAAK,eAAe;AAExD,MAAIC,IAAa,KACbA,IAAa,KACNA,IAAa,KAAK,oBACzBA,IAAa,IAEjB,KAAK,YAAYA,GAEjB,KAAK,OAAOJ,IAAgB,KAAK,SAAS,KAAK,YAAa,KAAK,kBAAkB,KAAK,YAExF,KAAK,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,QAAQ,KAAK,QAAQ,CAAC;AAAA,IAClE,OAAO;AACH,WAAK,kBAAkBnP,IAAezD,GACtC,KAAK,WAAW6S,IAAc,KAAK,iBAEnC,KAAK,cAAc;AAAA,QACfpP,IAAezD;AAAA,QACf0D,IAAgB1D;AAAA,QAChByD,IAAezD;AAAA,QACf0D;AAAA,MAAA;AAEJ,YAAM6B,IAAST,IAAS,IAAI;AAC5B,WAAK,SAAS,GACd,KAAK,SAASpB,IAAgB1D,IAAsBuF,GACpD,KAAK,aAAa9B,GAClB,KAAK,cAAczD;AAEnB,YAAM+S,IAAQ,KAAK,WAAW,KAAK,kBAAkBF,IAAc;AAEnE,UAAII,IAAY,KAAK,MAAMF,IAAQ,KAAK,eAAe;AACvD,WAAK,OAAO,KAAK,SAAS,KAAK/S,IAAsB2S,KAAiB,GAElEM,IAAY,KACZA,IAAY,KACLA,KAAa,KAAK,oBACzBA,IAAY,IAEhB,KAAK,WAAWA,GAChB,KAAK,YAAYN,GACjB,KAAK,OAAQ,KAAK,SAAS,KAAK,YAAa,KAAK,kBAAkB,KAAK,WAEzE,KAAK,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,QAAQ,KAAK,QAAQ,CAAC;AAAA,IAClE;AAAA,EACJ;AAAA,EACA,OAAO;AACH,UAAM;AAAA,MACF,QAAQ,EAAE,sBAAAO,GAAsB,gBAAAC,GAAgB,cAAAtO,GAAc,QAAAC,GAAQ,sBAAAsO,EAAA;AAAA,IAAqB,IAC3F,KAAK;AACT,SAAK,YAAA;AACL,QAAIxM,IAAc/B;AAClB,IAAKC,MACD8B,IAAc,gBAGlB,KAAK,IAAI,MAAM,SAAS,KAAK,QAAQ,KAAK,QAAQ,KAAK,YAAY,KAAK,aAAa;AAAA,MACjF,aAAAA;AAAA,MACA,WAAWwM;AAAA,IAAA,CACd,GAED,KAAK,IAAI,MAAM,SAAS,KAAK,MAAM,KAAK,MAAM,KAAK,UAAU,KAAK,WAAW;AAAA,MACzE,WAAW,KAAK,WAAW,KAAK,aAAaF,IAAuBC;AAAA,MACpE,QAAQ;AAAA,IAAA,CACX,GAEG,KAAK,YAAY,SAAS,KAC1B,KAAK,IAAI,MAAM,SAAS,KAAK,aAAa;AAAA,MACtC,aAAAvM;AAAA,MACA,aAAa;AAAA,IAAA,CAChB,GAGL,KAAK,IAAI,gBAAgB,KAAK;AAAA,EAClC;AACJ;AAEA,MAAqByM,GAAS;AAAA,EAK1B,YAAYnU,GAAc;AAJlB,IAAAtF,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGJ,SAAK,MAAMsF,GACX,KAAK,oBAAoB,IAAI0S,GAAU1S,GAAK,UAAU,GACtD,KAAK,sBAAsB,IAAI0S,GAAU1S,GAAK,YAAY,GAC1D,KAAK,IAAI,GAAG,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,GAC3C,KAAK,IAAI,GAAG,aAAa,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,GACnD,KAAK,IAAI,GAAG,aAAa,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,GACnD,KAAK,IAAI,GAAG,WAAW,MAAM,KAAK,WAAW,GAC7C,KAAK,IAAI,GAAG,aAAa,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,GACnD,KAAK,IAAI,GAAG,cAAc,CAAC,MAAM;AAC7B,WAAK,aAAa,CAAC;AAAA,IACvB,CAAC,GACD,KAAK,IAAI,GAAG,aAAa,CAACQ,GAAiBI,MAAoB;AAC3D,WAAK,UAAUJ,GAASI,CAAO;AAAA,IACnC,CAAC,GACD,KAAK,IAAI,GAAG,cAAc,CAACJ,MAAoB;AAC3C,WAAK,WAAWA,CAAO;AAAA,IAC3B,CAAC,GACD,KAAK,IAAI,GAAG,cAAc,CAACI,MAAoB;AAC3C,WAAK,WAAWA,CAAO;AAAA,IAC3B,CAAC;AAAA,EACL;AAAA,EAEA,QAAQsM,GAAe;AACnB,SAAK,kBAAkB,QAAQA,CAAC,GAChC,KAAK,oBAAoB,QAAQA,CAAC,GAClC,KAAK,KAAA;AAAA,EACT;AAAA,EAEA,YAAYA,GAAe;AACvB,SAAK,kBAAkB,YAAYA,CAAC,GACpC,KAAK,oBAAoB,YAAYA,CAAC,GACtC,KAAK,KAAA;AAAA,EACT;AAAA,EAEA,aAAaA,GAAe;AACxB,SAAK,kBAAkB,aAAaA,CAAC,GACrC,KAAK,oBAAoB,aAAaA,CAAC,GACvC,KAAK,KAAA;AAAA,EACT;AAAA,EACA,YAAYA,GAAe;AACvB,SAAK,kBAAkB,YAAYA,CAAC,GACpC,KAAK,oBAAoB,YAAYA,CAAC,GACtC,KAAK,KAAA;AAAA,EACT;AAAA,EAEA,YAAYA,GAAe;AACvB,SAAK,kBAAkB,YAAYA,CAAC,GACpC,KAAK,oBAAoB,YAAYA,CAAC,GACtC,KAAK,KAAA;AAAA,EACT;AAAA,EAEA,YAAY;AACR,SAAK,kBAAkB,UAAA,GACvB,KAAK,oBAAoB,UAAA,GACzB,KAAK,IAAI,eAAe;AAAA,EAC5B;AAAA,EAEA,OAAO;AACH,SAAK,kBAAkB,KAAA,GACvB,KAAK,oBAAoB,KAAA;AACzB,UAAM1M,IAAU,KAAK,MAAM,KAAK,oBAAoB,MAAM,GACpDI,IAAU,KAAK,MAAM,KAAK,kBAAkB,MAAM;AAExD,KAAIJ,MAAY,KAAK,IAAI,WAAWI,MAAY,KAAK,IAAI,aACrD,KAAK,IAAI,KAAK,YAAYJ,GAASI,CAAO,GACtCJ,MAAY,KAAK,IAAI,WACrB,KAAK,IAAI,KAAK,aAAaA,CAAO,GAElCI,MAAY,KAAK,IAAI,WACrB,KAAK,IAAI,KAAK,aAAaA,CAAO,GAEtC,KAAK,IAAI,UAAUJ,GACnB,KAAK,IAAI,UAAUI,GACnB,KAAK,IAAI,KAAK,MAAM;AAAA,EAE5B;AAAA,EACA,UAAUX,GAAWC,GAAW;AAC5B,SAAK,oBAAoB,SAASD,GAClC,KAAK,kBAAkB,SAASC,GAChC,KAAK,IAAI,KAAK,MAAM,GACpB,KAAK,IAAI,KAAK,YAAYD,GAAGC,CAAC;AAAA,EAClC;AAAA,EACA,WAAWM,GAAiB;AACxB,SAAK,oBAAoB,SAASA,GAClC,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,WAAWI,GAAiB;AACxB,SAAK,kBAAkB,SAASA,GAChC,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,eAAe7F,GAAa;AACxB,UAAM,EAAE,QAAAyY,MAAW,KAAK,KAClBrJ,IAAOqJ,EAAO,gBAAgB,KAAK,CAACrJ,MAASA,EAAK,QAAQpP,CAAG;AACnE,IAAIoP,KAEA,KAAK,WAAWA,EAAK,IAAIqJ,EAAO,eAAe,CAAC;AAAA,EAExD;AAAA,EACA,iBAAiBvY,GAAkB;AAC/B,UAAM,EAAE,QAAAuY,MAAW,KAAK,KAClBrJ,IAAOqJ,EAAO,gBAAgB,KAAK,CAACrJ,MAASA,EAAK,aAAalP,CAAQ;AAC7E,IAAIkP,KAEIA,EAAK,IAAIqJ,EAAO,eAAe,KAC/B,KAAK,WAAWrJ,EAAK,IAAIqJ,EAAO,eAAe,CAAC;AAAA,EAG5D;AAAA,EACA,iBAAiBtY,GAAkB;AAC/B,UAAM,EAAE,MAAAqY,GAAM,UAAAa,EAAA,IAAa,KAAK,KAC1B,EAAE,KAAA3O,EAAA,IAAQ2O,EAAS,uBAAuBlZ,CAAQ;AACxD,IAAIuK,IAAM8N,EAAK,iBACX,KAAK,WAAW9N,IAAM8N,EAAK,gBAAgB,CAAC;AAAA,EAEpD;AAAA,EACA,eAAevY,GAAgB;AAC3B,UAAM,EAAE,MAAAuY,GAAM,UAAAa,EAAA,IAAa,KAAK,KAC1BlZ,IAAWkZ,EAAS,qBAAqBpZ,CAAM;AACrD,QAAIE,MAAa;AACb;AAEJ,UAAM,EAAE,KAAAuK,EAAA,IAAQ2O,EAAS,uBAAuBlZ,CAAQ;AACxD,SAAK,WAAWuK,IAAM8N,EAAK,gBAAgB,CAAC;AAAA,EAChD;AACJ;ACpaA,MAAqBc,GAAO;AAAA,EAyBxB,YAAYrU,GAAc;AAxBlB,IAAAtF,EAAA;AACA;AAAA,IAAAA,EAAA,WAAI;AACJ;AAAA,IAAAA,EAAA,WAAI;AACJ;AAAA,IAAAA,EAAA,eAAQ;AACR;AAAA,IAAAA,EAAA,gBAAS;AACT;AAAA,IAAAA,EAAA,sBAAkC;AAClC;AAAA,IAAAA,EAAA,mBAAY;AACZ;AAAA,IAAAA,EAAA,oBAAa;AACb;AAAA,IAAAA,EAAA,iBAAU;AACV;AAAA,IAAAA,EAAA,oBAAa;AACb;AAAA,IAAAA,EAAA,qBAAc;AACd,IAAAA,EAAA,qBAAc;AACd;AAAA,IAAAA,EAAA;AACA,IAAAA,EAAA,4BAA4B,CAAA;AAC5B,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,sBAAe;AACf,IAAAA,EAAA,wBAA+B,CAAA;AAC/B,IAAAA,EAAA,yBAAgC,CAAA;AAChC,IAAAA,EAAA,+BAAsC,CAAA;AACtC,IAAAA,EAAA,8BAAqC,CAAA;AACrC,IAAAA,EAAA,2BAAkC,CAAA;AAClC,IAAAA,EAAA,+BAAsC,CAAA;AACtC,IAAAA,EAAA,iCAAwC,CAAA;AACxC,IAAAA,EAAA,gCAAuC,CAAA;AAE3C,SAAK,MAAMsF,GAEX,KAAK,IAAI;AAAA,MACL;AAAA,MACArE,GAAS,MAAM;AACX,aAAK,KAAA,GACL,KAAK,IAAI,KAAK,MAAM;AAAA,MACxB,GAAG,GAAG;AAAA,IAAA,GAEV,KAAK,KAAA,GAEL,KAAK,iBAAA;AAAA,EACT;AAAA,EACA,OAAO;AACH,UAAM;AAAA,MACF,QAAQ,EAAE,eAAA2Y,GAAe,qBAAAxT,EAAA;AAAA,IAAoB,IAC7C,KAAK,KACH7B,IAAU,KAAK,IAAI,SAAS,WAAA;AAClC,SAAK,UAAUA,GACf,KAAK,iBAAiB,CAAA,GACtB,KAAK,kBAAkB,CAAA,GACvB,KAAK,uBAAuB,CAAA,GAC5B,KAAK,wBAAwB,CAAA,GAC7B,KAAK,oBAAoB,CAAA;AACzB,UAAMsV,IAAepY,GAAU8C,CAAO,GAChCmJ,IAAchL,GAAO6B,CAAO;AAClC,SAAK,SAASqV,IAAgBC,GAC9B,KAAK,QAAQnM,EAAY,OAAO,CAACoM,GAAKC,MAAU;AAC5C,YAAMtU,IAAQsU,EAAM,SAAS,KACvB,EAAE,UAAAC,GAAU,UAAAC,EAAA,IAAaF;AAC/B,aAAIC,KAAYvU,IAAQuU,IACbF,IAAME,IAEbC,KAAYxU,IAAQwU,IACbH,IAAMG,IAEVH,IAAMrU;AAAA,IACjB,GAAG,CAAC,GACJ,KAAK,gBAAgB,KAAK;AAC1B,UAAMyU,IAAcpY,GAAUK,GAAaoC,GAASsV,CAAY,CAAC;AACjE,SAAK,cAAc,GACnB,KAAK,YAAY,GACjB,KAAK,OAAOK,GAAa,CAAC,GAC1B,KAAK,IAAI,SAAS,qBAAqB,KAAK,eAAe;AAC3D,UAAMhD,IAAmB,KAAK,IAAI,iBAAiB,sBAAA;AAEnD,IAAI,KAAK,YAAY,IAEjB,KAAK,IAAI,aAAa,KAAK,MAAMA,EAAiB,KAAK,IAGvD,KAAK,IAAI,aAAa,KAAK,MAAM,KAAK,QAAQ9Q,CAAmB,GAErE,KAAK,IAAI,aAAa,MAAM,QAAQ,KAAK,IAAI,aAAa,MAC1D,KAAK,eAAe,KAAK,IAAI,aAAaA;AAG1C,UAAM+T,IAAY,KAAK,eAAe,KAAK;AAC3C,QAAI,KAAK,aAAaA,IAAY,GAAG;AACjC,YAAMC,IAAO,KAAK,MAAOD,IAAY,KAAK,YAAa,GAAG,IAAI;AAC9D,WAAK,gBAAgBC,CAAI;AAAA,IAC7B;AACA,UAAMC,IAAsB,KAAK,qBAAqB,OAAO,CAAC1Y,MAAS,CAACA,EAAK,WAAW;AACxF,SAAK,IAAI,iBAAiB0Y,EAAoB,OAAO,CAACP,GAAKC,MAAUD,IAAMC,EAAM,OAAO,CAAC;AACzF,UAAMO,IAAuB,KAAK,sBAAsB,OAAO,CAAC3Y,MAAS,CAACA,EAAK,WAAW;AAC1F,SAAK,IAAI,kBAAkB2Y,EAAqB,OAAO,CAACR,GAAKC,MAAUD,IAAMC,EAAM,OAAO3T,CAAmB,GAE7G,KAAK,IAAI,cAAc,KAAK,gBAAgB,SAAS,GACrD,KAAK,IAAI,OAAO,IAAI,KAAK,GACzB,KAAK,IAAI,OAAO,IAAI,KAAK,GACzB,KAAK,IAAI,OAAO,QAAQ,KAAK,OAC7B,KAAK,IAAI,OAAO,SAAS,KAAK,QAC9B,KAAK,IAAI,OAAO,eAAe,KAAK,cACpC,KAAK,IAAI,OAAO,gBAAgB,KAAK;AAAA,EACzC;AAAA;AAAA,EAEQ,mBAAmB;AACvB,UAAM;AAAA,MACF,QAAQ,EAAE,sBAAAmU,EAAA;AAAA,IAAqB,IAC/B,KAAK;AACT,IAAKA,MAGL,KAAK,IAAI,GAAG,aAAa,CAAC,MAAM;AAC5B,MAAK,KAAK,IAAI,SAAS,CAAC,MAGxB,KAAK,UAAU,EAAE,SACb,KAAK,gBACL,KAAK,aAAa,IAClB,KAAK,IAAI,iBAAiB,MAE1B,KAAK,aAAa,IAEtB,KAAK,cAAc;AAAA,IACvB,CAAC,GACD,KAAK,IAAI,GAAG,WAAW,MAAM;AACzB,WAAK,cAAc,IAEf,KAAK,eAAe,KAAK,KAAK,gBAE9B,KAAK,aAAa,KAAK,cAAc,KAAK,UAAU,GAExD,KAAK,eAAe,MACpB,KAAK,aAAa,IAClB,KAAK,cAAc,IACnB,KAAK,IAAI,iBAAiB,IAC1B,KAAK,UAAU,GACf,KAAK,aAAa;AAAA,IACtB,CAAC,GACD,KAAK,IAAI,GAAG,aAAa,CAAC,MAAM;AAE5B,UAAI,KAAK,IAAI,QAAS;AACtB,YAAM;AAAA,QACF,YAAA3U;AAAA,QACA,QAAQ,EAAE,yBAAA4U,EAAA;AAAA,MAAwB,IAClC,KAAK;AAET,UAAI,KAAK,cAAc,KAAK,cAAc;AACtC,cAAMC,IAAoB,KAAK,aAAa,OACtCC,IAAuB,KAAK,aAAa,UACzCC,IAAuB,KAAK,aAAa;AAC/C,YAAIP,IAAO,EAAE,UAAU,KAAK;AAC5B,QAAIA,IAAOK,IAAoBD,MAC3BJ,IAAO,EAAEK,IAAoBD,KAE7BE,KAAwBN,IAAOK,IAAoBC,MACnDN,IAAO,EAAEK,IAAoBC,KAE7BC,KAAwBP,IAAOK,IAAoBE,MACnDP,IAAOO,IAAuBF,IAElC,KAAK,aAAaL,GAClB,KAAK,IAAI,KAAK,MAAM;AAAA,MACxB,OAAO;AAGH,YAFA,KAAK,eAAe,MAEhB,KAAK;AACL;AAGJ,YAAI,EAAE,UAAU,KAAK,EAAE,UAAU,KAAK,cAAc;AAChD,UAAI,KAAK,IAAI,aAAa,MAAM,WAAW,iBACvC,KAAK,IAAI,aAAa,MAAM,SAAS;AAEzC;AAAA,QACJ;AAEA,QAAI,KAAK,IAAI,aAAa,MAAM,WAAW,iBACvC,KAAK,IAAI,aAAa,MAAM,SAAS;AAGzC,cAAMQ,IAAuB,CAAC,GAAG,KAAK,wBAAwB,GAAG,KAAK,uBAAuB;AAC7F,mBAAWC,KAAOD,GAAsB;AACpC,gBAAM,EAAE,SAAAzN,GAAS,SAAAC,EAAA,IAAY,KAAK,IAAI,UAAU,CAAC,GAC3C7H,IAAI4H,GACJhC,IAAQ0P,EAAI,SAAA;AAClB,UACItV,IAAI4F,IAAQ0P,EAAI,QAAQ,KACxBtV,IAAI4F,IAAQ0P,EAAI,QAAQ,KACxBtV,IAAIK,IAAa;AAAA,UACjBiV,EAAI,WAAW,KAGX,KAAK,IAAI,SAAS,CAAC,KAAKzN,KAAW,KAAK,WACxC,KAAK,IAAI,aAAa,MAAM,SAAS,cACrC,KAAK,eAAeyN;AAAA,QAGhC;AAAA,MACJ;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EACQ,aAAapL,GAAkB2K,GAAc;AACjD,UAAMU,IAAW,CAACvW,MAAmB;AACjC,MAAAA,EAAQ,QAAQ,CAACpE,MAAgB;AAI7B,YAHIA,EAAO,YAAYA,EAAO,SAAS,SAAS,KAC5C2a,EAAS3a,EAAO,QAAQ,GAExBA,EAAO,QAAQsP,EAAK,KAAK;AACzB,gBAAMhK,IAAQtF,EAAO,SAAS;AAC9B,UAAAA,EAAO,QAAQsF,IAAQ2U;AAAA,QAC3B;AAAA,MACJ,CAAC;AAAA,IACL;AACA,IAAAU,EAAS,KAAK,OAAO,GACrB,KAAK,IAAI,SAAS,WAAW,KAAK,OAAO,GACzC,KAAK,KAAA,GACL,KAAK,IAAI,KAAK,MAAM;AACpB,QAAIC,IAAW;AAEf,QAAI,KAAK,QAAQ,KAAK,cAAc;AAChC,YAAMZ,IAAY,KAAK,eAAe,KAAK;AAC3C,MAAAY,IAAW,KAAK,MAAOZ,IAAY,KAAK,YAAa,GAAG,IAAI,KAC5D,KAAK,gBAAgBY,CAAQ,GAC7B,KAAK,IAAI,KAAK,MAAM;AAAA,IACxB;AACA,SAAK,IAAI,KAAK,sBAAsB;AAAA,MAChC,UAAUtL,EAAK;AAAA,MACf,KAAKA,EAAK;AAAA,MACV,UAAUA,EAAK;AAAA,MACf,OAAOA,EAAK,QAAQ2K,IAAOW;AAAA,MAC3B,QAAQtL,EAAK;AAAA,MACb,SAAS,KAAK;AAAA,IAAA,CACjB;AAAA,EACL;AAAA,EACA,gBAAgBuL,GAAmB;AAC/B,QAAIA,MAAc,EAAG;AACrB,UAAMC,wBAAe,IAAA;AAErB,QAAIC,IAAW;AACf,eAAWL,KAAO,KAAK;AACnB,UAAIA,EAAI;AAEJ,QAAAI,EAAS,IAAIJ,EAAI,KAAKA,EAAI,KAAK;AAAA,WAC5B;AACH,cAAMpV,IAAQoV,EAAI,QAAQG,IAAYH,EAAI;AAC1C,QAAAI,EAAS,IAAIJ,EAAI,KAAKpV,CAAK,GACvBA,IAAQ,KAAK,IAAI,OAAO,4BACxByV,IAAW;AAAA,MAEnB;AAGJ,QAAI,CAACA;AACD;AAGJ,UAAMC,IAAc,CAAC5W,MAAsB;AACvC,MAAAA,EAAQ,QAAQ,CAACpE,MAAmB;AAChC,QAAI8a,EAAS,IAAI9a,EAAO,GAAG,MACvBA,EAAO,QAAQ8a,EAAS,IAAI9a,EAAO,GAAG,IAEtCA,EAAO,YAAYA,EAAO,SAAS,SAAS,KAC5Cgb,EAAYhb,EAAO,QAAQ;AAAA,MAEnC,CAAC;AAAA,IACL;AACA,IAAAgb,EAAY,KAAK,OAAO,GACxB,KAAK,IAAI,SAAS,WAAW,KAAK,OAAO,GACzC,KAAK,KAAA;AAAA,EAET;AAAA,EAEQ,OAAOpZ,GAAeqZ,GAAiB;AAC3C,UAAMC,IAAMtZ,EAAI;AAChB,QAAIuZ,IAAeF;AACnB,UAAM,EAAE,eAAAxB,IAAgB,EAAA,IAAM,KAAK,IAAI;AACvC,aAAS/N,IAAI,GAAGA,IAAIwP,GAAKxP,KAAK;AAC1B,YAAMlK,IAAOI,EAAI8J,CAAC,GACZnG,IAASkU,KAAiBjY,EAAK,WAAW,IAC1C6D,IAAIoU,KAAiBjY,EAAK,SAAS;AACzC,UAAI,EAAE,UAAAsY,GAAU,UAAAD,EAAA,IAAarY,GACzB8D,IAAQ9D,EAAK,SAAS;AAC1B,MAAIsY,KAAYxU,IAAQwU,MACpBxU,IAAQwU,IAERD,KAAYvU,IAAQuU,MACpBvU,IAAQuU,IAERrY,EAAK,aAGL8D,IADa/C,GAAOf,EAAK,QAAQ,EACpB,OAAO,CAACmY,GAAKC,MAAUD,MAAOC,KAAA,gBAAAA,EAAO,UAAS,MAAM,CAAC;AAEtE,YAAMjO,IAAa,IAAI+J,GAAW,KAAK,KAAK,KAAK,aAAayF,GAAc9V,GAAGC,GAAOC,GAAQ/D,CAAI;AAElG,WAAK,IAAI,SAAS,UAAUA,EAAK,KAAKmK,CAAU,GAChD,KAAK,eAAe,KAAKA,CAAU,GAC9BnK,EAAK,aACN,KAAK,gBAAgB,KAAKmK,CAAU,GAC/BA,EAAW,OAAO,oBACnB,KAAK,cAGTnK,EAAK,UAAU,SACf,KAAK,qBAAqB,KAAKmK,CAAU,IAClCnK,EAAK,UAAU,UACtB,KAAK,sBAAsB,KAAKmK,CAAU,IAE1C,KAAK,kBAAkB,KAAKA,CAAU,GAE1C,CAACnK,EAAK,YAAY,KAAK,eACvBA,EAAK,YAAY,KAAK,OAAOA,EAAK,UAAU2Z,CAAY,GACxDA,KAAgB7V;AAAA,IACpB;AAAA,EACJ;AAAA,EAEQ,cAAc;AAClB,QAAI,KAAK,cAAc,KAAK,cAAc;AACtC,YAAM;AAAA,QACF,aAAAQ;AAAA,QACA,QAAQ,EAAE,0BAAAsV,EAAA;AAAA,MAAyB,IACnC,KAAK,KACHC,IAAoB,KAAK,aAAa,SAAA,GACtCf,IAAoB,KAAK,aAAa,OACtClV,IAAIiW,IAAoBf,IAAoB,KAAK,aAAa,KAC9DgB,IAAQ,CAAClW,IAAI,KAAK,GAAGA,IAAI,KAAKU,CAAW;AAC/C,WAAK,IAAI,MAAM,SAASwV,GAAO;AAAA,QAC3B,aAAaF;AAAA,QACb,aAAa;AAAA,MAAA,CAChB;AAAA,IACL;AAAA,EACJ;AAAA,EACQ,kBAAkB;AACtB,UAAM;AAAA,MACF,gBAAA1V;AAAA,MACA,iBAAAE;AAAA,MACA,SAAAD;AAAA,MACA,QAAAgT;AAAA,MACA,YAAAlT;AAAA,MACA,QAAQ,EAAE,iBAAAmQ,GAAiB,qBAAA3P,EAAA;AAAA,IAAoB,IAC/C,KAAK;AAYT,QAVIN,IAAU,KAAKD,MAAmB,KAClC,KAAK,IAAI,MAAM,WAAW,KAAK,GAAG,KAAK,GAAGA,GAAgB,KAAK,QAAQ;AAAA,MACnE,WAAWkQ;AAAA,MACX,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,UAAU;AAAA,IAAA,CACb,GAGDjQ,IAAU,KAAK,MAAMgT,EAAO,QAAQlT,IAAa,CAAC,KAAKG,MAAoBK,GAAqB;AAChG,YAAMb,IAAIuT,EAAO,SAAS,KAAK,IAAI,KAAK,SAASlT,IAAaG;AAC9D,WAAK,IAAI,MAAM,WAAWR,GAAG,KAAK,GAAGQ,GAAiB,KAAK,QAAQ;AAAA,QAC/D,WAAWgQ;AAAA,QACX,MAAM;AAAA,QACN,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,UAAU;AAAA,MAAA,CACb;AAAA,IACL;AAAA,EACJ;AAAA,EACA,SAAS;AACL,UAAM2F,IAAsC,CAAA,GACtCC,IAAwC,CAAA,GACxCC,IAAuC,CAAA;AAE7C,QAAI,KAAK,kBAAkB,QAAQ;AAC/B,YAAMC,IAAiB,KAAK,kBAAkB,KAAK,kBAAkB,SAAS,CAAC;AAC/E,WAAK,IAAI,qBAAqBA,EAAe;AAAA,IACjD;AACA,SAAK,kBAAkB,QAAQ,CAACla,MAAS;AACrC,MAAIA,EAAK,oBAAA,KAAyBA,EAAK,wBACnCga,EAAwB,KAAKha,CAAI,GAC5BA,EAAK,eACN+Z,EAAsB,KAAK/Z,CAAI;AAAA,IAG3C,CAAC,GACD,KAAK,qBAAqB,QAAQ,CAACA,MAAS;AACxC,MAAAia,EAAuB,KAAKja,CAAI,GAC3BA,EAAK,eACN+Z,EAAsB,KAAK/Z,CAAI;AAAA,IAEvC,CAAC,GACD,KAAK,sBAAsB,QAAQ,CAACA,MAAS;AACzC,MAAAia,EAAuB,KAAKja,CAAI,GAC3BA,EAAK,eACN+Z,EAAsB,KAAK/Z,CAAI;AAAA,IAEvC,CAAC,GACD,KAAK,0BAA0Bga,GAC/B,KAAK,yBAAyBC,GAC9B,KAAK,wBAAwBF,EAAsB,KAAK,CAAC9Z,GAAGC,MAAMD,EAAE,IAAIC,EAAE,CAAC,GAC3E,KAAK,qBAAqB,KAAK,sBAAsB,IAAI,CAACF,MAASA,EAAK,MAAM,GAE9E,KAAK,IAAI,OAAO,qBAAqB,KAAK,oBAC1C,KAAK,IAAI,OAAO,kBAAkB,KAAK,iBACvC,KAAK,IAAI,OAAO,wBAAwB,KAAK,uBAC7C,KAAK,IAAI,OAAO,oBAAoB,KAAK,uBAAuB,OAAO,KAAK,uBAAuB;AAAA,EACvG;AAAA,EACA,iBAAiB;AACb,UAAM;AAAA,MACF,YAAAiE;AAAA,MACA,QAAQ,EAAE,cAAAqF,EAAA;AAAA,IAAa,IACvB,KAAK,KACHwQ,IAAQ,CAAC,GAAG,KAAK,QAAQ7V,GAAY,KAAK,MAAM;AACtD,SAAK,IAAI,MAAM,SAAS6V,GAAO;AAAA,MAC3B,aAAaxQ;AAAA,MACb,aAAa;AAAA,IAAA,CAChB;AAAA,EACL;AAAA,EACA,OAAO;AACH,SAAK,wBAAwB,QAAQ,CAACtJ,MAAS;AAC3C,MAAAA,EAAK,OAAA,GACLA,EAAK,KAAA;AAAA,IACT,CAAC,GACD,KAAK,gBAAA,GACL,KAAK,uBAAuB,QAAQ,CAACA,MAAS;AAC1C,MAAAA,EAAK,OAAA,GACLA,EAAK,KAAA;AAAA,IACT,CAAC,GACD,KAAK,YAAA,GACL,KAAK,eAAA;AAAA,EACT;AACJ;ACzaA,MAAqBma,GAAI;AAAA,EAarB,YACIxW,GACA9E,GACA+E,IAAI,GACJC,IAAI,GACJC,IAAQ,GACRC,IAAS,GACThE,GACAqa,IAAmB,QACrB;AArBM,IAAA/b,EAAA;AACR,IAAAA,EAAA,WAAI;AACJ,IAAAA,EAAA,WAAY;AACZ,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA;AACA,IAAAA,EAAA,eAAgB,CAAA;AAChB,IAAAA,EAAA,oBAAqB,CAAA;AACrB,IAAAA,EAAA,sBAAuB,CAAA;AACvB,IAAAA,EAAA,kBAAW;AACX,IAAAA,EAAA,gBAAS;AACT,IAAAA,EAAA,iBAAmB;AACnB,IAAAA,EAAA;AAWI,SAAK,MAAMsF,GACX,KAAK,IAAIC,GACT,KAAK,IAAIC,GACT,KAAK,QAAQC,GACb,KAAK,SAASC,GACd,KAAK,WAAWlF,GAChB,KAAK,SAAS8E,EAAI,SAAS,qBAAqB9E,CAAQ,KAAK,IAC7D,KAAK,UAAUub,GACf,KAAK,OAAOra,GACZ,KAAK,OAAA;AAAA,EACT;AAAA,EACA,SAAS;AACL,UAAM,EAAE,QAAAoX,MAAW,KAAK,KAClBhC,IAAgB,CAAA,GAChBkF,IAAqB,CAAA,GACrBC,IAAuB,CAAA;AAC7B,IAAAnD,EAAO,sBAAsB,QAAQ,CAACA,MAAW;AAC7C,YAAMrJ,IAAO,IAAIpJ;AAAA,QACb,KAAK;AAAA,QACL,KAAK;AAAA,QACLyS,EAAO;AAAA,QACPA,EAAO;AAAA,QACP,KAAK;AAAA,QACLA,EAAO;AAAA,QACP,KAAK;AAAA,QACLA,EAAO;AAAA,QACP,KAAK;AAAA,QACL,KAAK;AAAA,MAAA;AAET,MAAIrJ,EAAK,QACLuM,EAAW,KAAKvM,CAAI,IAEpBwM,EAAa,KAAKxM,CAAI,GAE1BqH,EAAM,KAAKrH,CAAI;AAAA,IACnB,CAAC,GACD,KAAK,QAAQqH,GACb,KAAK,aAAakF,GAClB,KAAK,eAAeC;AAAA,EACxB;AAAA,EACA,aAAa;AACT,SAAK,aAAa,QAAQ,CAACxM,MAAS;AAChC,MAAAA,EAAK,KAAA;AAAA,IACT,CAAC;AAAA,EACL;AAAA,EACA,YAAY;AACR,SAAK,WAAW,QAAQ,CAACA,MAAS;AAC9B,MAAAA,EAAK,KAAA;AAAA,IACT,CAAC;AAAA,EACL;AAAA,EACA,gBAAgB;AACZ,SAAK,aAAa,QAAQ,CAACA,MAAS;AAChC,MAAAA,EAAK,cAAA;AAAA,IACT,CAAC;AAAA,EACL;AAAA,EACA,qBAAqB;AACjB,SAAK,WAAW,QAAQ,CAACA,MAAS;AAC9B,MAAAA,EAAK,cAAA;AAAA,IACT,CAAC;AAAA,EACL;AACJ;ACnFA,MAAqByM,GAAK;AAAA,EAmBtB,YAAY5W,GAAc;AAlBlB,IAAAtF,EAAA,sBAA2B;AAC3B;AAAA,IAAAA,EAAA,qBAAc;AACd;AAAA,IAAAA,EAAA,oBAAa;AACb;AAAA,IAAAA,EAAA,iBAAU;AACV;AAAA,IAAAA,EAAA;AACA,IAAAA,EAAA,WAAI;AACJ,IAAAA,EAAA,WAAI;AACJ,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA,gBAAS;AACT,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,mBAAY;AACZ,IAAAA,EAAA,oBAAa;AACb;AAAA,IAAAA,EAAA,oBAAoB,CAAA;AACpB,IAAAA,EAAA,qBAAqB,CAAA;AACrB,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,sBAAe;AACf,IAAAA,EAAA;AACA,IAAAA,EAAA,cAAc,CAAA;AAElB,SAAK,MAAMsF,GACX,KAAK,KAAA,GACL,KAAK,cAAA;AAAA,EACT;AAAA,EACQ,OAAO;AACX,UAAM;AAAA,MACF,eAAA8R;AAAA,MACA,QAAA0B;AAAA,MACA,QAAAqD;AAAA,MACA,UAAAzC;AAAA,MACA,QAAQ;AAAA,QACJ,cAAA0C;AAAA,QACA,qBAAAhW,IAAsB;AAAA,QACtB,QAAAiW;AAAA,QACA,mBAAAC,IAAoB;AAAA,QACpB,YAAAC,IAAa;AAAA,QACb,sBAAAC,IAAuB;AAAA,QACvB,eAAAC,IAAgB;AAAA,QAChB,iBAAAC;AAAA,MAAA;AAAA,IACJ,IACA,KAAK;AACT,QAAI,CAAC5D,EAAO;AACR;AAEJ,SAAK,IAAI,GACL4D,MAAoB,SAASN,IAC7B,KAAK,IAAItD,EAAO,SAASqD,EAAO,SAEhC,KAAK,IAAIrD,EAAO;AAEpB,UAAM,EAAE,MAAApX,GAAM,WAAAkQ,MAAc8H,EAAS,QAAA;AAErC,SAAK,SAAS9H,GAEd,KAAK,OAAOlQ,GAEZ,KAAK,QAAQoX,EAAO,OACpB,KAAK,eAAe,KAAK,IAAI,aAAa1S;AAE1C,UAAM2R,IAAe,KAAK,IAAI,OAAO;AACrC,IAAI,CAAC,KAAK,KAAK,UAAU,CAACsE,IACtB,KAAK,SAASC,IACP,CAAC,KAAK,KAAK,UAAUD,MAE5B,KAAK,SAASA,IAASvD,EAAO,SAASf,IAAe3R;AAG1D,QAAIuW,IAAkB,KAAK,SAAS7D,EAAO,SAAS1S;AAEpD,IAAAuW,KAAmB5E;AACnB,QAAI9R,IAAc0W;AAClB,UAAMC,IAAoB,OAAO,aAC3B,EAAE,KAAA7R,MAAQ,KAAK,iBAAiB,KAAK,IAAI,iBAAiB,sBAAA;AAChE,QAAI6R,IAAoB7R,KAAOyR,KAAwB,CAACH,GAAQ;AAE5D,YAAMQ,IADgBD,IAAoB7R,IACL0R;AACrC,MAAII,IAAe/D,EAAO,SAAS1S,IAC/BH,IAAc4W,IACPF,IAAkBJ,MACzBtW,IAAcsW;AAAA,IAEtB,MAAA,CAAW,KAAK,KAAK,UAAUF,IAC3BpW,IAAcoW,IACP,KAAK,KAAK,UAAUE,KAAcI,IAAkBJ,MAC3DtW,IAAcsW;AAGlB,IAAItW,IAAc,MAEd,KAAK,IAAI,cAAc,KAAK,MAAMA,CAAW,GAC7C,KAAK,IAAI,aAAa,MAAM,SAAS,GAAG,KAAK,IAAI,WAAW;AAGhE,QAAI6W,IAAiB,KAAK,IAAI,cAAchE,EAAO,SAAS1S;AAE5D,IAAIgW,IACA,KAAK,gBAAgBU,IAAiB/E,IAEtC,KAAK,gBAAgB+E,GAEpB,KAAK,KAAK,WACX,KAAK,SAAS,KAAK,gBAEvB,KAAK,IAAI,KAAK,IAAI,KAAK,GACvB,KAAK,IAAI,KAAK,IAAI,KAAK,GACvB,KAAK,IAAI,KAAK,QAAQ,KAAK,OAC3B,KAAK,IAAI,KAAK,SAAS,KAAK,QAC5B,KAAK,IAAI,KAAK,eAAe,KAAK,cAClC,KAAK,IAAI,KAAK,gBAAgB,KAAK,eACnC,KAAK,IAAI,KAAK,OAAOpb;AACrB,UAAM2R,IAAM,OAAO,oBAAoB,GACjC0J,IAAc,KAAK,IAAI,aAAa1J,GACpC2J,IAAe,KAAK,IAAI,cAAc3J;AAC5C,IAAA+D,EAAc,QAAQ,KAAK,MAAM2F,CAAW,GAC5C3F,EAAc,SAAS,KAAK,MAAM4F,CAAY;AAC9C,UAAMC,IAAW,KAAK,KAAK,SAAmB,cAAV;AACpC,SAAK,IAAI,KAAK,eAAe;AAAA,MACzB,SAAAA;AAAA,MACA,MAAMA;AAAA,MACN,cAAcnE,EAAO;AAAA,MACrB,YAAY,KAAK;AAAA,MACjB,cAAAf;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,QAAS,KAAK,KAAK,SAA4C,IAAnCuE,IAAoBvE;AAAA,IAAe,CAClE;AAED,UAAMmF,IAAY,KAAK,MAAO9F,EAAc,QAAQ/D,IAAO,GAAK,IAAI,KAC9D8J,IAAa,KAAK,MAAO/F,EAAc,SAAS/D,IAAO,GAAK,IAAI;AACtE,SAAK,IAAI,cAAc,aAAa,SAAS,UAAU8J,CAAU,YAAYD,CAAS,KAAK,GAC3F,KAAK,IAAI,MAAM,MAAM7J,CAAG;AAAA,EAC5B;AAAA;AAAA,EAEQ,gBAAgB;AACpB,UAAM;AAAA,MACF,QAAQ,EAAE,mBAAA+J,EAAA;AAAA,IAAkB,IAC5B,KAAK;AACT,IAAKA,MAGL,KAAK,IAAI,GAAG,UAAU,MAAM;AACxB,WAAK,gBAAgB,KAAK,IAAI,iBAAiB,sBAAA;AAAA,IACnD,CAAC,GACD,KAAK,IAAI,GAAG,kBAAkB,MAAM;AAChC,WAAK,gBAAgB,KAAK,IAAI,iBAAiB,sBAAA;AAAA,IACnD,CAAC,GAED,KAAK,IAAI,GAAG,WAAW,MAAM;AACzB,WAAK,cAAc,IACf,KAAK,eAAe,KAAK,KAAK,gBAE9B,KAAK,UAAU,KAAK,cAAc,KAAK,UAAU,GAErD,KAAK,eAAe,MACpB,KAAK,aAAa,GAClB,KAAK,aAAa,IAElB,WAAW,MAAM;AACb,aAAK,IAAI,cAAc;AAAA,MAC3B,GAAG,CAAC,GACJ,KAAK,UAAU;AAAA,IACnB,CAAC,GACD,KAAK,IAAI,GAAG,aAAa,CAAC,MAAM;AAC5B,MAAK,KAAK,IAAI,SAAS,CAAC,MAGxB,KAAK,UAAU,EAAE,SACb,KAAK,gBACL,KAAK,aAAa,IAElB,KAAK,IAAI,cAAc,OAEvB,KAAK,aAAa,IAClB,KAAK,IAAI,cAAc,KAE3B,KAAK,cAAc;AAAA,IACvB,CAAC,GACD,KAAK,IAAI,GAAG,aAAa,CAAC,MAAM;AAE5B,UAAI,KAAK,IAAI,QAAS;AACtB,YAAM,EAAE,SAAAhQ,GAAS,SAAAD,EAAA,IAAY,KAAK,IAAI,UAAU,CAAC,GAC3C3H,IAAI4H,GACJ7H,IAAI4H,GACJ8K,IAAU,EAAE,SACZ;AAAA,QACF,aAAAhS;AAAA,QACA,SAAAC;AAAA,QACA,QAAQ,EAAE,uBAAAmX,IAAwB,EAAA;AAAA,MAAE,IACpC,KAAK;AACT,UAAI,KAAK,cAAc,KAAK,cAAc;AACtC,cAAMC,IAAqB,KAAK,aAAa;AAC7C,YAAIlD,IAAOnC,IAAU,KAAK;AAC1B,QAAImC,IAAOkD,IAAqBD,MAC5BjD,IAAO,EAAEkD,IAAqBD,KAElC,KAAK,aAAajD,GAClB,KAAK,IAAI,KAAK,MAAM;AAAA,MACxB,OAAO;AAGH,YAFA,KAAK,eAAe,MAEhB,KAAK;AACL;AAGJ,YACI7U,IAAI,KACJA,IAAI,KAAK,IAAI,KAAK,gBAClBC,IAAI,KACJA,IAAI,KAAK,IAAI,OAAO,gBAAgB,KAAK,IAAI,KAAK,eACpD;AACE,UAAI,KAAK,IAAI,aAAa,MAAM,WAAW,iBAEvC,KAAK,IAAI,aAAa,MAAM,SAAS;AAEzC;AAAA,QACJ;AAEA,YAAI,KAAK,IAAI,aAAa,MAAM,WAAW;AACvC;AAEJ,QAAI,KAAK,IAAI,aAAa,MAAM,WAAW,iBAEvC,KAAK,IAAI,aAAa,MAAM,SAAS;AAEzC,iBAASqG,IAAI,GAAGA,IAAI,KAAK,WAAW,QAAQA,KAAK;AAC7C,gBAAMzL,IAAM,KAAK,WAAWyL,CAAC;AAK7B,cAHIrG,IAAIpF,EAAI,IAAI8F,IAAU9F,EAAI,SAAS,OACnCoF,IAAIpF,EAAI,IAAI8F,IAAU9F,EAAI,SAAS,OACnCoF,IAAIS,IAAc;AAElB,qBAASqM,IAAI,GAAGA,IAAIlS,EAAI,MAAM,QAAQkS,KAAK;AACvC,oBAAM7C,IAAOrP,EAAI,MAAMkS,CAAC;AACxB,cACI/M,IAAIkK,EAAK,QAAQ,MACjBlK,IAAIkK,EAAK,QAAQA,EAAK,QAAQ,MAC9BA,EAAK,YAAY,MAEjB,KAAK,IAAI,aAAa,MAAM,SAAS,cACrC,KAAK,eAAerP;AAAA,YAE5B;AAAA,QAER;AAAA,MACJ;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EACQ,UAAUA,GAAUga,GAAc;AACtC,UAAM,EAAE,UAAA5Z,GAAU,QAAAkF,GAAQ,QAAApF,GAAQ,MAAAoB,MAAStB;AAC3C,SAAK,IAAI,SAAS,aAAaI,GAAUkF,IAAS0U,CAAI,GACtD,KAAK,KAAA,GACL,KAAK,IAAI,KAAK,MAAM,GACpB,KAAK,IAAI,KAAK,mBAAmB;AAAA,MAC7B,UAAA5Z;AAAA,MACA,WAAWkF;AAAA,MACX,QAAQA,IAAS0U;AAAA,MACjB,QAAA9Z;AAAA,MACA,KAAKoB;AAAA,MACL,MAAM,KAAK;AAAA,IAAA,CACd;AAAA,EACL;AAAA,EACQ,cAAc;AAClB,QAAI,KAAK,cAAc,KAAK,cAAc;AACtC,YAAM;AAAA,QACF,YAAAkE;AAAA,QACA,SAAAM;AAAA,QACA,QAAQ,EAAE,uBAAAqX,EAAA;AAAA,MAAsB,IAChC,KAAK,KACHC,IAAoB,KAAK,aAAa,IAAItX,GAC1CoX,IAAqB,KAAK,aAAa,QACvC9X,IAAIgY,IAAoBF,IAAqB,KAAK,aAAa,KAC/D7B,IAAQ,CAAC,GAAGjW,IAAI,KAAKI,GAAYJ,IAAI,GAAG;AAC9C,WAAK,IAAI,MAAM,SAASiW,GAAO;AAAA,QAC3B,aAAa8B;AAAA,QACb,aAAa;AAAA,MAAA,CAChB;AAAA,IACL;AAAA,EACJ;AAAA,EACQ,kBAAkB;AACtB,UAAM;AAAA,MACF,gBAAA1X;AAAA,MACA,iBAAAE;AAAA,MACA,SAAAD;AAAA,MACA,QAAAgT;AAAA,MACA,YAAAlT;AAAA,MACA,QAAQ,EAAE,iBAAAmQ,GAAiB,qBAAA3P,EAAA;AAAA,IAAoB,IAC/C,KAAK;AAYT,QAVIN,IAAU,KAAKD,MAAmB,KAClC,KAAK,IAAI,MAAM,WAAW,KAAK,GAAG,KAAK,GAAGA,GAAgB,KAAK,QAAQ;AAAA,MACnE,WAAWkQ;AAAA,MACX,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,UAAU;AAAA,IAAA,CACb,GAGDjQ,IAAU,KAAK,MAAMgT,EAAO,QAAQlT,IAAa,CAAC,KAAKG,MAAoBK,GAAqB;AAChG,YAAMb,IAAIuT,EAAO,SAAS,KAAK,IAAI,KAAK,SAASlT,IAAaG;AAC9D,WAAK,IAAI,MAAM,WAAWR,GAAG,KAAK,GAAGQ,GAAiB,KAAK,QAAQ;AAAA,QAC/D,WAAWgQ;AAAA,QACX,MAAM;AAAA,QACN,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,UAAU;AAAA,MAAA,CACb;AAAA,IACL;AAAA,EACJ;AAAA,EACQ,aAAajS,GAAkBrD,GAAe;AAClD,QAAIgd,IAAQ,GACRC,IAAM5Z,EAAK,SAAS,GACpB6Z,IAAY;AAChB,WAAOF,KAASC,KAAK;AACjB,UAAIE,IAAW,KAAK,OAAOH,IAAQC,KAAO,CAAC,GACvCG,IAAW/Z,EAAK8Z,CAAQ,EAAE;AAC9B,UAAIC,MAAapd;AACb,eAAOmd;AACX,MAAWC,IAAWpd,IAClBgd,IAAQG,IAAW,KAEnBD,IAAYC,GACZF,IAAME,IAAW;AAAA,IAEzB;AACA,WAAOD;AAAA,EACX;AAAA,EACA,SAAS;AACL,SAAK,KAAA;AACL,UAAM;AAAA,MACF,QAAA7E;AAAA,MACA,UAAAY;AAAA,MACA,SAAAxT;AAAA,MACA,QAAQ,EAAE,aAAA8H,EAAA;AAAA,IAAY,IACtB,KAAK,KACHrC,IAASzF,GACT,EAAE,MAAAxE,GAAM,WAAAoc,MAAcpE,EAAS,QAAA;AAErC,SAAK,IAAI,cAAchY,EAAK,SAAS;AACrC,QAAIqc,IAAa,KAAK,aAAaD,GAAWnS,CAAM,GAChDqS,IAAa,KAAK,aAAaF,GAAWnS,IAAS,KAAK,aAAa;AAKzE,QAJIqS,MAAe,OACfA,IAAa,KAAK,IAAI,cAGtBD,MAAe,MAAMC,MAAe,KAAK,IAAI,aAAa;AAC1D,YAAM1N,IAAS,KAAK,MAAM,KAAK,gBAAgBtC,CAAW;AAC1D,MAAA+P,IAAa,KAAK,IAAI,cAAczN;AAAA,IACxC;AACA,SAAK,YAAY,KAAK,IAAI,GAAGyN,CAAU,GACvC,KAAK,YAAY,KAAK,IAAI,KAAK,IAAI,aAAaC,IAAa,CAAC,GAC9D,KAAK,cAActc,EAAK,MAAM,KAAK,WAAW,KAAK,YAAY,CAAC,GAChE,KAAK,IAAI,KAAK,YAAY,KAAK,WAC/B,KAAK,IAAI,KAAK,YAAY,KAAK,WAC/B,KAAK,IAAI,KAAK,cAAc,KAAK;AAEjC,UAAMiO,IAAc,CAAA;AACpB,aAAS9D,IAAI,GAAGA,IAAI,KAAK,YAAY,QAAQA,KAAK;AAC9C,YAAM3H,IAAQ,KAAK,YAAY2H,GACzBnK,IAAO,KAAK,YAAYmK,CAAC,GACzB,EAAE,QAAAnG,GAAQ,KAAAqF,MAAQ,KAAK,IAAI,SAAS,uBAAuB7G,CAAK,GAChE9D,IAAM,IAAI0b,GAAI,KAAK,KAAK5X,GAAO,GAAG6G,IAAM,KAAK,GAAG+N,EAAO,OAAOpT,GAAQhE,CAAI;AAChF,MAAAiO,EAAK,KAAKvP,CAAG;AAAA,IACjB;AACA,SAAK,aAAauP,GAClB,KAAK,IAAI,KAAK,aAAaA;AAAA,EAC/B;AAAA,EACA,OAAO;AAEH,SAAK,WAAW,QAAQ,CAACvP,MAAQ;AAC7B,MAAAA,EAAI,cAAA;AAAA,IACR,CAAC,GACD,KAAK,WAAW,QAAQ,CAACA,MAAQ;AAC7B,MAAAA,EAAI,WAAA;AAAA,IACR,CAAC,GACD,KAAK,gBAAA,GACL,KAAK,WAAW,QAAQ,CAACA,MAAQ;AAC7B,MAAAA,EAAI,mBAAA;AAAA,IACR,CAAC,GACD,KAAK,WAAW,QAAQ,CAACA,MAAQ;AAC7B,MAAAA,EAAI,UAAA;AAAA,IACR,CAAC,GACD,KAAK,YAAA;AAAA,EACT;AACJ;AC/XA,MAAqB6d,GAAO;AAAA,EAUxB,YAAY3Y,GAAc;AATlB,IAAAtF,EAAA;AACA,IAAAA,EAAA,oBAAoB,CAAA;AACpB,IAAAA,EAAA,cAAc,CAAA;AACd,IAAAA,EAAA,WAAI;AACJ,IAAAA,EAAA,WAAI;AACJ,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA,gBAAS;AACT,IAAAA,EAAA,sBAAe;AACf,IAAAA,EAAA,uBAAgB;AAEpB,SAAK,MAAMsF,GACX,KAAK,KAAA;AAAA,EACT;AAAA,EACQ,OAAO;AACX,SAAK,OAAO,KAAK,IAAI,SAAS,cAAA;AAC9B,UAAM;AAAA,MACF,QAAAwT;AAAA,MACA,MAAAD;AAAA,MACA,QAAQ,EAAE,oBAAAqF,GAAoB,cAAA9B,GAAc,qBAAAhW,GAAqB,iBAAAsW,EAAA;AAAA,IAAgB,IACjF,KAAK;AAET,SAAK,QAAQ5D,EAAO,OACpB,KAAK,eAAeA,EAAO,cAE3B,KAAK,SAAS,KAAK,KAAK,OAAO,CAACgB,MACrBA,IAAMoE,GACd,CAAC,GAEJ,KAAK,gBAAgB,KAAK,QACtB9B,IACIM,MAAoB,QACpB,KAAK,IAAI,KAAK,IAAI,OAAO,SAEzB,KAAK,IAAI,KAAK,IAAI,cAAc,KAAK,SAAStW,IAGlD,KAAK,IAAIyS,EAAK,IAAIA,EAAK,QAE3B,KAAK,IAAI,OAAO,IAAI,KAAK,GACzB,KAAK,IAAI,OAAO,IAAI,KAAK,GACzB,KAAK,IAAI,OAAO,SAAS,KAAK,QAC9B,KAAK,IAAI,OAAO,QAAQ,KAAK,OAC7B,KAAK,IAAI,OAAO,eAAe,KAAK,cACpC,KAAK,IAAI,OAAO,gBAAgB,KAAK;AAAA,EACzC;AAAA,EACQ,kBAAkB;AACtB,UAAM;AAAA,MACF,gBAAAhT;AAAA,MACA,iBAAAE;AAAA,MACA,SAAAD;AAAA,MACA,QAAAgT;AAAA,MACA,YAAAlT;AAAA,MACA,QAAQ,EAAE,iBAAAmQ,GAAiB,qBAAA3P,EAAA;AAAA,IAAoB,IAC/C,KAAK;AACT,QAAIZ,IAAI,KAAK;AAeb,QAbK,KAAK,IAAI,OAAO,iBACjBA,IAAI,KAAK,IAAI,KAAK,IAAI,UAEtBM,IAAU,KAAKD,MAAmB,KAClC,KAAK,IAAI,MAAM,WAAW,KAAK,GAAGL,GAAGK,GAAgB,KAAK,QAAQ;AAAA,MAC9D,WAAWkQ;AAAA,MACX,MAAM;AAAA,MACN,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,UAAU;AAAA,IAAA,CACb,GAGDjQ,IAAU,KAAK,MAAMgT,EAAO,QAAQlT,IAAa,CAAC,KAAKG,MAAoBK,GAAqB;AAChG,YAAMb,IAAIuT,EAAO,SAAS,KAAK,IAAI,KAAK,SAASlT,IAAaG;AAC9D,WAAK,IAAI,MAAM,WAAWR,GAAGC,GAAGO,GAAiB,KAAK,QAAQ;AAAA,QAC1D,WAAWgQ;AAAA,QACX,MAAM;AAAA,QACN,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,UAAU;AAAA,MAAA,CACb;AAAA,IACL;AAAA,EACJ;AAAA,EACA,SAAS;AACL,SAAK,KAAA;AACL,UAAM,EAAE,oBAAAmI,EAAA,IAAuB,KAAK,IAAI;AACxC,QAAIC,IAAe,KAAK;AACxB,UAAMxO,IAAc,CAAA;AACpB,SAAK,KAAK,QAAQ,CAACjO,GAAMwC,MAAU;AAC/B,YAAM9D,IAAM,IAAI0b,GAAI,KAAK,KAAK5X,GAAO,GAAGia,GAAc,KAAK,OAAOD,GAAoBxc,GAAM,QAAQ;AACpG,MAAAyc,KAAgBD,GAChBvO,EAAK,KAAKvP,CAAG;AAAA,IACjB,CAAC,GACD,KAAK,aAAauP,GAClB,KAAK,IAAI,OAAO,aAAa,KAAK;AAAA,EACtC;AAAA,EACA,cAAc;AACV,UAAM;AAAA,MACF,YAAA/J;AAAA,MACA,QAAQ,EAAE,cAAAqF,EAAA;AAAA,IAAa,IACvB,KAAK,KACHwQ,IAAQ,CAAC,GAAG,KAAK,GAAG7V,GAAY,KAAK,CAAC;AAC5C,SAAK,IAAI,MAAM,SAAS6V,GAAO;AAAA,MAC3B,aAAaxQ;AAAA,MACb,aAAa;AAAA,IAAA,CAChB;AAAA,EACL;AAAA,EACA,OAAO;AACH,SAAK,WAAW,QAAQ,CAAC7K,MAAQ;AAC7B,MAAAA,EAAI,cAAA;AAAA,IACR,CAAC,GACD,KAAK,WAAW,QAAQ,CAACA,MAAQ;AAC7B,MAAAA,EAAI,WAAA;AAAA,IACR,CAAC,GACD,KAAK,gBAAA,GACL,KAAK,WAAW,QAAQ,CAACA,MAAQ;AAC7B,MAAAA,EAAI,mBAAA;AAAA,IACR,CAAC,GACD,KAAK,WAAW,QAAQ,CAACA,MAAQ;AAC7B,MAAAA,EAAI,UAAA;AAAA,IACR,CAAC,GACD,KAAK,YAAA;AAAA,EACT;AACJ;ACvHA,MAAqBge,GAAS;AAAA;AAAA,EAU1B,YAAY9Y,GAAc;AATlB,IAAAtF,EAAA,eAAQ;AACR,IAAAA,EAAA,uBAAgB;AAChB,IAAAA,EAAA,yBAAkB;AAClB,IAAAA,EAAA;AACA,IAAAA,EAAA,yBAAkB;AAClB,IAAAA,EAAA,yBAAkB;AAClB,IAAAA,EAAA,gBAAS;AACT;AAAA,IAAAA,EAAA,gBAAS;AAGb,SAAK,MAAMsF,GACX,KAAK,KAAA;AAAA,EACT;AAAA,EACQ,OAAO;AACX,SAAK,IAAI,GAAG,gBAAgB,CAAC+Y,MAA6C;AACtE,WAAK,UAAUA,CAAG;AAAA,IACtB,CAAC,GAED,KAAK,IAAI;AAAA,MACL;AAAA,MACApd,GAAS,CAACuR,MAAM;AACZ,cAAM,EAAE,SAAApF,GAAS,SAAAD,EAAA,IAAY,KAAK,IAAI,UAAUqF,CAAC,GAC3C8L,IACF,KAAK,IAAI,SAAS9L,CAAC,KACnBrF,IAAU,KACVA,IAAU,KAAK,IAAI,KAAK,gBACxBC,IAAU,KAAK,IAAI,OAAO,iBAC1BA,IAAU,KAAK,IAAI,OAAO,gBAAgB,KAAK,IAAI,KAAK;AAC5D,SAAI,KAAK,IAAI,gBAAgB,KAAK,IAAI,kBAE9B,CAACkR,KAAgB,CAAC,KAAK,kBACvB,KAAK,oBAAoB9L,CAAC,IAE1B,KAAK,mBAAA;AAAA,MAGjB,GAAG,GAAG;AAAA,IAAA,GAEV,KAAK,IAAI,GAAG,mBAAmB,CAAC/C,MAAS;AAErC,UAAI,MAAK,IAAI,cAGb;AAAA,YAAIA,EAAK,WAAW;AAChB,eAAK,WAAWA,GAAM,EAAK;AAE3B;AAAA,QACJ;AAEA,QAAI,KAAK,iBAGT,KAAK,WAAA;AAAA;AAAA,IACT,CAAC,GACD,KAAK,IAAI,GAAG,iBAAiB,CAACA,GAAM,MAAM;AAYtC,UAXI,CAAC,KAAK,IAAI,SAAS,CAAC,KAIpB,KAAK,IAAI,aAAa,MAAM,WAAW,aAGvC,KAAK,IAAI,aAIT,KAAK,IAAI,aAAa,MAAM,WAAW;AACvC;AAEJ,UAAIA,EAAK,WAAW;AAChB,aAAK,gBAAgB,IACrB,KAAK,WAAWA,CAAI;AACpB;AAAA,MACJ;AAGA,MADc,OAAO,iBAAiB,EAAE,MAAM,EACpC,eAAe,UACrB,EAAE,eAAA,GAEN,KAAK,gBAAgB,IACrB,KAAK,MAAM,EAAE,QAAQ,GACrB,KAAK,IAAI,KAAK,iBAAiBA,CAAI;AAAA,IACvC,CAAC,GACD,KAAK,IAAI,GAAG,WAAW,MAAM;AACzB,WAAK,kBAAkB;AAGvB,YAAM8O,IAAQ,WAAW,MAAM;AAC3B,aAAK,IAAI,oBAAoB,IAC7B,aAAaA,CAAK;AAAA,MACtB,GAAG,CAAC;AAAA,IACR,CAAC,GACD,KAAK,IAAI,GAAG,yBAAyB,CAAC9O,MAAS;AAC3C,MAAI,KAAK,IAAI,aACT,KAAK,WAAWA,CAAI;AAAA,IAE5B,CAAC,GACD,KAAK,IAAI,GAAG,uBAAuB,CAACA,GAAM,MAAM;AAK5C,UAHI,KAAK,IAAI,aAAa,MAAM,WAAW,aAGvC,KAAK,IAAI;AACT;AAIJ,MADc,OAAO,iBAAiB,EAAE,MAAM,EACpC,eAAe,UACrB,EAAE,eAAA,GAEN,KAAK,kBAAkB,IACvB,KAAK,WAAWA,CAAI;AAAA,IACxB,CAAC,GACD,KAAK,IAAI,GAAG,WAAW,CAAC+C,MAAM;AAC1B,UAAI,MAAK,IAAI,SAIb;AAAA,YAAKA,EAAE,WAAWA,EAAE,SAAS,UAAYA,EAAE,WAAWA,EAAE,SAAS,QAAS;AACtE,eAAK,MAAA;AACL;AAAA,QACJ;AACA,YAAKA,EAAE,WAAWA,EAAE,SAAS,UAAYA,EAAE,WAAWA,EAAE,SAAS,QAAS;AACtE,eAAK,KAAA,GACL,KAAK,QAAQ;AACb;AAAA,QACJ;AAEA,YAAKA,EAAE,WAAWA,EAAE,SAAS,UAAYA,EAAE,WAAWA,EAAE,SAAS,QAAS;AACtE,eAAK,QAAQ,IACb,KAAK,KAAA;AACL;AAAA,QACJ;AAMA,aAJKA,EAAE,WAAWA,EAAE,SAAS,UAAYA,EAAE,WAAWA,EAAE,SAAS,YAC7DA,EAAE,eAAA,GACF,KAAK,UAAA,IAELA,EAAE,SAAS,eAAgBA,EAAE,YAAYA,EAAE,SAAS,OAAQ;AAC5D,UAAAA,EAAE,eAAA,GACF,KAAK,UAAU,MAAM;AACrB;AAAA,QACJ;AACA,YAAIA,EAAE,SAAS,WAAW;AACtB,UAAAA,EAAE,eAAA,GACF,KAAK,UAAU,KAAK;AACpB;AAAA,QACJ;AACA,YAAIA,EAAE,SAAS,gBAAgBA,EAAE,SAAS,OAAO;AAC7C,UAAAA,EAAE,eAAA,GACF,KAAK,UAAU,OAAO;AACtB;AAAA,QACJ;AACA,YAAIA,EAAE,SAAS,aAAa;AACxB,UAAAA,EAAE,eAAA,GACF,KAAK,UAAU,QAAQ;AACvB;AAAA,QACJ;AACA,YAAIA,EAAE,SAAS,YAAYA,EAAE,SAAS,aAAa;AAC/C,UAAAA,EAAE,eAAA;AACF,gBAAM,EAAE,MAAA/G,GAAM,MAAA9B,EAAA,IAAS,KAAK,IAAI;AAChC,eAAK,kBAAkB8B,GAAM9B,CAAI;AACjC;AAAA,QACJ;AAAA;AAAA,IACJ,CAAC,GACD,KAAK,IAAI,GAAG,4BAA4B,MAAM;AAC1C,YAAM,EAAE,MAAA8B,GAAM,MAAA9B,EAAA,IAAS,KAAK,IAAI;AAChC,WAAK,kBAAkB8B,GAAM9B,CAAI;AAAA,IACrC,CAAC,GACD,KAAK,IAAI,GAAG,mBAAmB,MAAM;AACjC,WAAK,KAAA;AAAA,IACT,CAAC,GACD,KAAK,IAAI,GAAG,oBAAoB,MAAM;AAClC,WAAK,MAAA;AAAA,IACT,CAAC,GACD,KAAK,IAAI,GAAG,kBAAkB,MAAM;AAChC,WAAK,QAAQ,IACb,KAAK,KAAA;AAAA,IACT,CAAC,GAED,KAAK,IAAI,GAAG,mBAAmB,CAAC8F,MAAe;AAC3C,WAAK,IAAI,aAAaA,CAAI,GAC1B,KAAK,MAAA;AAAA,IACT,CAAC,GACD,KAAK,IAAI,GAAG,WAAW,MAAM;AACzB,WAAK,IAAI,eAAe,IACxB,KAAK,mBAAA;AAAA,IACT,CAAC;AAAA,EACL;AAAA,EACQ,YAAYhE,GAAgB9B,GAAgB;AAChD,UAAM,EAAE,0BAAA6U,GAA0B,0BAAAC,EAAA,IAA6B,KAAK,IAAI;AACxE,QAAIC,IAAQjT,GACRkT,IAAQhV;AACZ,QAAI,CAAC8U,GAA0B;AAC3B,YAAM,CAACG,CAAQ,IAAID;AACnB,MAAAA,IAAQ,CAACC,GAAUA,CAAQ;AAAA,IAC/B;AACA,QAAI,CAACJ,GAA0B;AAC3B,YAAM,CAACK,CAAQ,IAAIH;AACnB,MAAAA,IAAQ,CAACG,GAAUA,CAAQ;AAAA,IAC/B;AAEA,QACI,KAAK,UAAU,KAAK,IAAI,SAAS,IAAI,MAAM,KAAK,UAAUH,CAAK,KAC/D,KAAK,UAAU,KAAK,IAAI,SAAS,IAAI,MAAM,KAAK,UAAUC,CAAK,GACjE;AACE,MAAI,KAAK,IAAI,cACT,KAAK,IAAI,eAAe,KAE5B,KAAK,IAAI,SAAS,SAAS;AAC3B,YAAM;AAAA,QACF,qBAAAG;AAAA,QACA,qBAAAC;AAAA,QACA,qBAAAC;AAAA,QACA,qBAAAC;AAAA,QACA,4BAAAC;AAAA,QACA,4BAAAC;AAAA,MAAA,IACA,KAAK,IAAI,QACPC,IAAWN,GACXO,IAAWN,KAAuB,KAAK,IAAI,cAAcG,GACzDI,IAAWN,GACXO,IAAWN,KAAuB,KAAK,IAAI,cAAcE;AAC/D,UAAI,CAAC1S,GAAMf,CAAI,IAAIgT,GACf,CAACjV,GAAMC,CAAI,IAAIiV;AAUnB,UATIlS,IAAO2S,KAGP1T,IAAO2T,KAGP5V,IAAO6V,KAGP5V,IAAO6V;AACP;AAKJ,UAFA,KAAK,IAAI,aAAa,MAAM,EAAE,eAAe,IAAM,GAE/C,KAAK,IAAI,OAAO,wBAAwB;AACxC,cAAMC,IAAc,KAAK,iBAAiBd,GAAOC,CAAK;AAEtD,QAAAlV,IAAO+V,EAAY,KAAK,CAAC,GACzB9V,IAAO8V,EAAY,KAAK,CAAC,GACzB/S,IAAO+S,EAAY,KAAK,CAAC,GACzB9T,IAAO8T,EAAY,KAAK,CAAC,GAEzB,KAAK,IAAI,gBAAgBA,EAAY;AAAA,MACzC;AACA,MAAI/S,MAASf,KAAQjC,MAASC,IAC1B,KAAK,IAAI,gBAAgB,KAEzB,KAAK,IAAI,gBAAgB,IAE7BgV,IAAQ,CAAC,KAAK,IAAIU,GAAU3S,CAAI,GAAG,KAAK,IAAI4S,GAAU3T,CAAI,CAAC,GAC3DiT,IAAQ,CAAC,KAAK,IAAIW,GAAU7V,CAAI,GAAG,KAAK,IAAI8V,GAAU7V,CAAI,CAAC;AAE3D,YAAM,EAAE,4BAAA+V,EAAA,IAA+B,KAAK,IAAI;AAChD,UAAI,OAAOA,KAA+B,YAAY;AAElD,cAAM/I,IADmD+I,EACrB;AAAA,UAChC,WAAW,KAAK,IAAI;AAAA,UACpB,MAAMf;AAAA,UACN,MAAMC;AAAA,QAAA,CACT;AACD,YAAI,CAACjI;AACD;AAEJ,QAAAgI,IAAQhI,EAAI,MACZiI,IAAQjI,EAAI;AAAA,MAChB;AACA,WAAK,IAAI,SAAS,OAAOgI,GACzB,KAAK,IAAI,SAAS,OAAOC,GACzB,KAAK,IAAI,KAAK,eAAe,KAAK,IAAI,QAAQ,GAC9C,KAAK,IAAI,KAAK,UAAU;AAAA,IAC5B;AAAA,EACJ;AAAA,EACQ,iBAAiBlT,GAAgB9B,GAAgB;AnBnQ7D,QAAAmE;AmBoQQ,UAAM,CAACrE,GAAMC,CAAI,IAAIC,GACf,CAAC8C,GAAMf,CAAI,IAAID;AACrB,QAAIiU,IAAyB,CAAA,GACzBC,IAAyB,CAAA;AAE7B,aAASjI,IAAK,GAAGA,KAAM/N,EAAK,CAAC,IAAIA,EAAK,CAAC,GAAG+N;AACtC,eAASE,IAAK,GAAGA,KAAMnM,EAAK,CAAC,IAAIA,EAAK,CAAC,GAAGmM,KAAM;AAC5C,cAAMpX,IAAWkX,IAAK/N,EAAK,CAAC,GACtBpJ,IAAWqX,IAAKnM,EAAK,CAAC,GACtBgE,IAAO,KAAK,IAAI,SAAS,mBAAmBjP,GAAUD,CAAQ;AACpE,QAAIkP,OAEIjP,MAAaiJ,KAAQjJ,MAAakJ,MAClCgW,EAAe,KAAKjQ,CAAI,IAGxBlP,MAAakM,KAAQlM,MAAamL,MAClCiU,EAAe,KAAKlQ,CAAI;AAAA,MAGpC;AAEJ,UAAMmQ,IAAoBF,EAAe;AAAA,MACrC,CAACG,GAAMpQ,MAAS;AACZ,cAAM,EAAE,MAAA9F,MAAS8F,EAAK,YAAA,GAChB,CAACqC,GAAUC,CAAW,IAAIpI;AAChC,eAAAkW,EAAK,OAAO,KAAK,IAAIA,EAAK,MAAM/N,CAAQ,GACxC+N,EAAK,OAAO,KAAK,IAAIA,EAAK,MAAM9N,CAAW,GACpC8N;AAAA,MACX;AAAA,MACA;AAAA,QACI,MAAApW;AAAA,QACA,MAAAC;AAAA,MAAA;AAAA,IACJ,GAEEoW,IAAoBH,EAAe;AAAA,MACrC,CAACE,GAAMpQ,MAAS;AACZ,cAAM,EAAE,MAAAhE,MAASgE,EAAK,YAAA,GAChB,CAACuC,GAAWC,CAAU,IAAIxG;AAChC,eAAAoU,EAAK,OAAO,KAAK,IAAIA,EAAK,MAAM7N,CAAS,GACzC6N,EAAK,OAAO,KAAK,IAAIA,EAAK,MAAM5N,CAAU,GACnC4N;AAAA,MACX;AAAA,MACA;AAAA,QACI,MAAApT;AAAA,QACA,MAAAf;AAAA,MAAA;AAAA,IACJ,GAEEgT,IAAQ,CAACoB,EAAkB,MAAMA,EAAkB,IAAI,GACvDnB,IAAQ,CAACiB,EAAkB,MAAMA,EAAkB,IAAI;AAC7D,QAAIG,IAAgB;AAEpB,QAAID,EAAkB,SAASA,EAAkB,QAAQF,EAAkB,SAASA,EAAkB,MAAM;AACxG,YAAMI,IAAc,KAAK,UAAUtB,CAAK,IAAI,KAAK,UAAUC,CAAK,GAC1D9X,KAAWiH,IAAA,KAAK,IAAI,cAAT,gBAAAA,EAAoB;AAErC,MAAAiS,KADgBlZ,KAAY,KAAK,UAAUA,EAAS,IAAI,IAAI,KAAK,UAAUA,EAAS,IAAI,OAC5DmZ;AAAA,IAChC;AACA,WAAO;AAAA,MACH,MAAMtB;AAAA,MACN,MAAMC;AAAA,MACN,eAAAoB;AAAA,IAAA;AAAA,EAER;AAAA,EACQ,WAAWtQ,GAAkB;AAgBjC,QAdI,KAAK,IAAI,OAAO,0BAGhB,CAAC,KAAK,IAAI,OAAO,4BAGjB,KAAK,IAAI,gBAIT,KAAK,IAAI,kBAIT,KAAK,IAAI;AACT;AAGJ,QAAIA,EAAK,WAAW;AAChB,WAAK,UAAA;AACL;AAAA,IACJ;AACA,UAAM,EAAE,qBAAAuP,GAAqB,qBAAAC,GAAqB,4BAAAE,EAAA,IAA+B,KAAK,IAAI,QACpF1V,IAAOuV,GACPtV,IAAOuV,KAAuB,KAAK,IAAI,cAAcE;AAC3D,QAAI,KAAK,IAAI,aAAa,KAAK,IAAI,iBAAiB;AAChD,YAAM,EAAE,UAAA5e,EAAA,IAAa,KAAK,IAAI;AAG9B,UADA,KAAK,IAAI,cAAA,GACLkP,EAAK,YAAYlP,GAAU;AAC3B,cAAMkL,IAAO,CAAClL,GAAUkP,EAAK,WAAWA,EAAK,UAAU,CAAC,GAClD9F,IAAO,CAACF,GAAMC,CAAI;AACxB,aAAK,YAAY+B,GAAM9B,CAAI;AAAA,MAC/B,OAAO;AACH,cAAM8B,IAAO,CAACgE,EAAK,UAAUlP,CAAQ,GAC/BoJ,IAAO,CAACF,GAAMC,CAAI;AACxB,aAAK,YAAY+B,GAAM9B,CAAI;AAAA,MAC/B;AAAA,IACJ,OAAO;AAEH,YAAM8B,IAAO,CAACgE,EAAK,UAAUA,EAAK,WAAWA,EAAK,UAAU,CAAC,GACvD9F,IAAO,CAACF,GAAMC,CAAI;AACxB,WAAK,YAAY+B,GAAM9B,CAAI;AAAA,IAC/B;AAAA,EACJ;AAAA,EACQ,YAAY;AAKhB,QAJI,KAAK,IAAI,gBAIT,KAAK,IAAI;AACT;AAGJ,UAAM,EAAE,0BAAAsW,GAA0B,0BAAAC,EAAA,IAA6B,KAAK,IAAI;AACxE,QAAID,KAA4BC,GAA0B;AACtD,YAAM;AAAA,QACF,qBAAApB;AAAA,QACA,qBAAAC;AAAA,QACA,qBAAAC;AAAA,QACA,qBAAAC;AAAA,QACA,4BAAAC;AAAA,QACA,4BAAAC;AAAA,MAAA,IACA,KAAK,IAAI,QACP1S,IAAOqS,GACPpT,IAAOqT,KAAuB,KAAK,IAAI,cAAcG,GACrDzV,IAAOuV,GACPtV,IAAOuV,KAAuB,KAAK,IAAI,cAAcE,GACrD1T,IAAO,CAACgB,GAAMf,CAAI,GAClB/B,IAAO,CAACF,GAAMC,CAAI;AACxB,WAAK,YAAY+B,GAAM9B,CAAI;AAAA,IAC/B;AAAA,EACJ;AAAA,EACQ,WAAW8F,GAAY0Q,IAAa,IAAM;AAY9C,QAVI,KAAK,IAAI,OAAO,0BAGhB,CAAC,KAAK,IAAI,OAAO,4BAGjB,KAAK,IAAI,gBAIT,KAAK,IAAI;AACT;AAEJ,UAAM,EAAE,qBAAArB,GAAqB,qBAAAC,GAAqB,4BAAAG,EAAA,IAA+B,KAAK,IAAI,QACpFxT,IAAOqT,KAAuB,KAAK,IAAI,cAAcG,GACrDzS,IAAOqS;AACb,QAAIqB,GAAY;AACZ,WAAK,IAAI,aAAa1Q,CAAI;AAC1B,YAAMhE,IAAO,CAACgB,GAAMf,CAAI,GAClB/B,IAAO,CAAC8F,EAAK,UAAUA,EAAK,QAAQ;AAC1C,WAAK,YAAYhE,GAAM9B,CAAI;AAAA,IAC/B;AACA,QAAI,KAAK,IAAI,aAAa,KAAK,IAAI,WAAW;AAC1C,YAAM,EAAE,UAAAnJ,EAAA,IAAa,KAAK,IAAI;AAC9B,UAAIiP,EAAK,YAAYjP,GAAU;AAC3B,cAAMiL,IAAO,CAACgB,GAAMf,CAAI,GAClB/B,IAAO,CAACnJ,GAAUiP,EAAK,QAAQ;AACrC,aAAK,YAAYhE,GAAM9B,CAAI;AAAA,MAC/B,OAAO;AACH,cAAM8B,IAAO,CAACgB,GAAMf,CAAI,GAClB/B,IAAO,CAAC8F,EAAK,UAAUjP,CAAQ;AACrC,aAAK,YAAYiL,GAAM9B,CAAI;AAAA,MAC/B;AAAA,IACJ;AAAA,EACJ;AAAA,EAEQ,aAAa;AAKjB,QAJI,KAAK,IAAI,OAAO,0BAIhB,KAAK,IAAI;AACT;AAEJ,UAAM,EAAE,WAAAyW,GAAW,WAAAC,GAAW,WAAA9W,EAAA,IAAc,KAAK;AACjD,QAAI6W,KAAaC,KAAa9W,GAAW;AACrC,YAAM,EAAE,UAAA/I,GAAU,UAAAD,EAAA,IAAa8f,GACzB5T,IAAO,KAAK,IAAIlD,EAAU,UAAUhJ,CAAQ,GAC5CmL,IAAO,KAAK,IAAInC,EAAU,UAAUhJ,CAAQ,GAC5CkJ,IAAO,KAAK,IAAIF,EAAU,UAAU/I,CAAQ,GAC5CkJ,IAAO,KAAK,IAAIH,EAAU,UAAU/I,CAAQ,GAC5CiL,IAAO,CAACgB,GAAMf,CAAI,GAClB/B,IAAO,CAACF,GAAMC,CAAI;AACxB,WAAK,YAAY+B,GAAM9B,CAAI;AAAA,IAC/B;AAAA,EACJ;AAAA,EACQ,MAAM2W,IAAW,IAAO;AAC5B,UAAM,EAAE,WAAAD,GAAW,WAAAE,EAAA,IAAc,KAAK;AACtC,QAAKF,KAIA,KAAK,iBAAiBA,EAAU,UAAUA,EAAU,QAAQ;AAIjE,UADA,KAAK,IAAI,SAAS,SAAS,IACvBE,KAAaD,GAAU;AAEvB,YAAI,KAAK,IAAI,OAAO;AAChB;AAGJ,cAAM,EAAE,UAAA/f,GAAU,UAAAC,EAAA,IAAa+f,GACzB,EAAE,UAAUC,GAAM,UAAUC,MAASJ,GACrC5T,IAAO,KAAK,IAAI+T,GAAMjgB,CAAQ,GAC9BmL,IAAO,KAAK,IAAI8U,GAAMjgB,CAAQ,GAC9BkJ,IAAO,KAAK,IAAIgX,GAAMjgB,CAAQ,GAC9BkJ,IAAO,KAAK,IAAI+W,GAAMjgB,CAAQ,GAC9BiL,IAAO,CAACgB,GAAMf,CAAI,GAClB/B,IAAO,CAACF,GAAMC,CAAI;AACxB,aAAK,YAAY+B,GAAM9B,CAAI;AAAA,MAC/B,OAAO;AACH,aAAK,IAAI,KAAK,qBAAqB0W,CAAS;AAC5C,cAAM5U,IAAO,CAAC4U,EAAU,UAAUA,EAAU,QAAQ,GAC9C1W,IAAO,CAAC0W,EAAU,UAAUA,EAAU,QAAQ;AACpD,aAAK,YAAY5U,GAAM9B,CAAI,GAC3B,KAAK,uBAAA;AAAA,MACT;AAAA,EACJ;AAAA,EAEQ,gBAAgB;AACpB,SAAK,IAAI,SAAS,WAAW,CAAC,IAAI,EAAE,GACpC,KAAK,IAAI,SAAS,WAAW,CAAC,IAAI,EAAE;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,QAAQnJ,GAAkBD,GAAkB;AAEhD,UAAMH,IAAM,KAAK,IAAI,KAAK,WAAW,KAAK,CAACA,MAAQA,EAAI,aAAaI,CAAQ;AAE5E,WADaJ,KAAA,gBAAAA,EAAK,MAAM,KAAK,CAACqP,MAA+BA,EAAK,aAAalP;AAAA,EAEnF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKQ,OAAO;AAKX,QAJI,CAAC,KAAK,IAAI,OAAO,eAIjB,KAAK,IAAI;AACT;AAEJ,QAAI,EAAE,OAAAE,GAAO,MAAAgL,GAAM,MAAA9B,MAAS,KAAK,IAAI,gBAAA;AACrC,QAAI,KAAK,IAAI,OAAO,0BAA0B,KAAK,IAAI,SAAS,aAAa8B,GAAM9B,CAAI;AACnF,UAAI,KAAK,IAAI,iBAAiB,KAAK,IAAI,WAAW;AAC9C,cAAM8F,IAAO,KAAK,IAAI;AACtB,QAAAhP,IAAQ,CAAC,CAACgP,EAAK,SAAA,CAAU,CAAC,GAC1BhE,IAAO,CAACgE,EAAK,UAAUA,EAAK,QAAQ,GACpC9F,IAAO,CAAC8F,EAAK,UAAUA,EAAK,QAAQ;AAAA,MACxC,OAAO;AACH,cAAMnJ,IAAiB;AAAA,UACnB,MAAM;AAAA,UACN,SAAS;AAAA,QAAA;AAEb,QAAI,KAAK,IAAI,SAAS,OAAO,IACzB,KAAK,IAAI,KAAK,SAASA,CAAG,IAE1B,MAAMA,EAAI,OAAO;AAErB;AAAA,MACJ;AAGJ,UAAM,EAAE,oBAAAoa,EAAA,IAAuB,KAAK,IAAI;AACxC,QAAI,OAAOA,KAAuB,YAAY;AAE1C,YAAMhK,IADqCgK,EACd;AAAA,QACzB,WAAW,KAAK,IAAI;AAAA,QACpB,MAAMjgB;AAAA,QACN,MAAAgL;AAAA,QACA,MAAA9B;AAAA,MAAA,CACH;AACD,UAAI,CAAC+M;AACD;AAEJ,MAAAjW,IAAQiW,EAAI;AAAA,IAChB;AACA,UAAMtK,IAAO5I,GAAuB/C,CAAK;AACzC,IAAI,UAAU,YACV,UAAU,UACL,UAAU2L,CAAI,EACd,KAAK,MAAM;AAER,WAAK,IAAI,SAAS,WAAW,KAAK,IAAI,SAAS,KAAK,MAAA,GACpD,KAAK,IAAI,SAAS,WAAW,KAAK,IAAI,SAAS,KAAK,MAAA,GACpD,KAAK,IAAI,KAAK,cAAc;AAAA,QACxB,MAAM,KAAK,IAAI,SAAS;AAAA,QACxB,MAAM,KAAK,IAAI,SAAS;AAAA,QACxB,MAAM3L;AAAA,MAAA,CACT,GACD,KAAK,IAAI,KAAK,MAAM;AAAA,IACxB,CAAC,EACA,MAAM,CAACkgB,MAAU,QAAQ,MAAM,iBAAiBA,CAAK,CAAC,IAE3D,QAAQ,MAAM,oDAAoD;AAAA,EAE1E;AAAA,EACA,kBAAkBlV,GAAgB9B,GAAgBiX,IAAY,IAAOngB,IAAQ,MAAM;AAC/E,QAAI6O,IAA2B,CAAA;AAC/B,UAAMF,wBAA8B,IAAA;AACpC,aAASsI,IAAK,GAAGA,KAAM/N,EAAK,CAAC,IAAIA,EAAK,CAAC,GAAG+N;AACtC,eAASE,IAAK,GAAGA,KAAMnM,EAAK,CAAC,IAAIA,EAAK,CAAC,GAAGmM,KAAM;AAC5C,cAAMiJ,IAAYnJ,IAAK/N,EAAK,CAAC,GACvBmX,IAAYlJ,IAAKnM,EAAK,CAAC,GACvBsV,IAAY,KAAK,IAAI,SAAS,mCAAmCF,GAAWC,CAAS;AAC3F,YAAIC,GAAW;AACX,gBAAM,EAAE,QAAAzgB,GAAQ,KAAAD,EAAA,IAAQ0gB;AAExB,UAAK,KAAK,IAAI,SAAS,YAAYzgB,GAAQD,CAAG,MAC1C+O,EAAW,IAAI9O,CAAM,GACrBgP,EAAW,KAAK;AAAA,YACZ,QAAAhP;AAAA,YACA,KAAAD;AAAA,YACA,OAAAI;AAAA,YACA,KAAK,CAAA;AAAA;AAAA,UAAC,CACT;AAAA,QAET;AAAA,MACJ;AAGJ,QAAI,CAAC6O,EAAW;AACZ,aAAO,CAAA;AAGX,QAAIsR;AACA,aAAOtR;AAGX,SAAK,IAAI,SAAS,kBAAkBA,GAAY,EAAI;AACpD,QAAIK,IAAc,CAAA;AAClB,WAAAP,EAAW,QAAQ,CAAC9O,MAAW;AAC3B,MAAAqP,EAAK,KAAK,KAAK,IAAI,SAAS,wBAAwBrP,CAAM,CAAC;AAAA,IAC/D,CAAC,GACD,KAAK,IAAI,KAAK,2BAA2BgP,GAAYK,CAAI,GAClDL;AAAA,EACX;AAAA,EACQ,QAAQ;AACZ,QAAI,CAAC,UAAU,WAAW;AACtB,cAAQ,MAAM,oDAAoD;AAClE;AAAA,IACJ;AACA,UAAM,EAAE,eAAA0R,EAAA,IAAkB,KAAK,IAAI;AACnC,QAAI,KAAK,IAAI,SAAS,UAAUA,GAAe;AAC3C,YAAMxgB,IAAW,KAAK,IAAI,SAAS,KAAK,CAAC,GACnCD,IAAW,KAAK,IAAI,SAAS,KAAK,CAAC,GACnC6O,wBAA8B,IAAA;AACpC,gBAAU,UACL,SAAA,EACA,KAAK,OAAOxL,MAAQ;AACjB,YAAIqd,IAAUle,GAAqBa,CAAG;AACtC,cAAM8a,IAAQ,CAACne,GAAUA,IAAW0gB,EAAQ,CAAC,EAAE,SAAS,CAAC,GACnDtC,IAAQ,CAACne,GAAUA,IAAWygB,EAAQ,SAAS,CAAC,GAChD,CAACxX,GAAMC,CAAI,IAAIiV,GACf,CAAClS,GAAMf,CAAI,IAAIgT,GACfwC,IAAmBxX,IAAO,KAAK,IAAI,aACnCyX,IAAmBzV,IAAO,KAAK,IAAI;AAEzC,SAAIwV,IAAmB,KAAKC,IAAmB,MAC3C,KAAK,IAAI,KAAK,wBAAwB;AAAA,UAClC,MAAAzX;AAAA,UACA,MAAAgC;AAAA,UACA,MAAAjC;AAAA,UACA,MAAAgD;AAAA,UACA,kBAAAyU;AAAA,UACA,kBAAAC;AAAA,UACA,SAAAF;AAAA,QAAA,CACH;AAGL,cAAMG,IAAYH,EAAQ,WAAW,KAAKA,EAAQ,CAAC,EAAE,WAAW;AAEhE,YACI,KAAK,IAAI,OAAO,0BAChB,KAAK,IAAI,SAAS,aAAavC,GAAOC,CAAK,KAC3C,CAACyC,GACH;AACE,gBAAM9a,IAAiB;AAAA,YACnB,MAAM;AAAA,YACN,SAAS;AAAA,UAAA;AAEb,UAAI,KAAK,IAAI,SAAS,OAAO,IACzB,KAAK,IAAI,KAAK,SAASA,CAAG,IAE1B,MAAMA,EAAI,OAAO;AAErB;AAAA,QACJ;AACA,YAAIgJ,IAA2B,CAAA;AAC/B,iBAASoI,IAAK,GAAGA,KAAMuJ,EAAQ,SAAS,GAAGvJ,KAAM;AAC7C,gBAAM2D,IAAM4F,EAAQvJ,CAAE,EAAE;AACxB,mBAASE,IAAK,GAAGA,KAAMyD,IAAM,GAAGzD,KAAM;AAClC,kBAAMiJ,IAAYnJ,IAAKlX,GACjBsgB,IAAYlJ,IAAKrX,GACjBE,IAAQwgB,EAAQvJ,CAAE,EAAEE,CAAE,GACtBmJ,IAAY,KAAK,IAAI,SAAS;AAAA,cAChCF;AAAA,cACAC;AAAA,YAAA;AAEJ,gBAAIC,GAAW;AACX,oBAAM,EAAE,QAAAzgB,GAAQ,KAAAD,EAAA,IAAQ0gB;AAExB,cAAK,KAAK,IAAI,SAAS,YAAYzgB,GAAQD,CAAG,MAC1C+O,EAAW,IAAI9O,CAAM,GACrBgP,EAAW,KAAK;AAAA,gBACZ,QAAAhP;AAAA,gBACA,KAAAD;AAAA,gBACA,OAAAI;AAAA,gBACA,KAAK,CAAA;AAAA;AAAA,cAAC,CACT;AAAA,YAET;AAAA,UACJ;AAAA,QACJ;AAEA,YAAI,KAAK,OAAO;AACZ,gBAAM4gB,IAAU,KAAK;AAAA,YACjB,KAAK,IAAI,SAAS;AAAA,YAClB,KAAK,IAAI,SAAS;AAAA,YAClB;AAAA;AAAA,UAAA,GAEEC,IAAoBhS,EAAW,IAAI,CAAC3N,MAAS,GAAGA,EAAK,MAAM,IAAIA,EAAK,GAAG,EAAE;AAE/E,UAAA0f,EAAQ,QAAQ,CAAC1f,MAAS;AACtB,YAAK2f,EAAkB,SAAS,GAAG3f,EAAK,MAAM,IAAIA,EAAK,GAAG,EAAE,KAExD2N,EAAW,QAAQ3N,CAAI;AAAA,UAE/B,CAAC,GACD,KAAK,QAAQ;AAAA,QACjB;AAEA,YAAI,CAAC2N,EAAW;AACZ;AAGJ,cAAM,EAAE,0BAAAiS,EAAA,IAA6B,KAAK,IAAI;AAC9C,YAAI,OAAOA,KAA6B,YAAY;AAChD,gBAAMC,IAA+CD,GAC/CE,IAAcnS,EAAW,IAAI,CAAC3N,OAAU;AAAA,YAC1C,QAAQA,EAAK;AAAA,YACb,KAAKA,EAAK;AAAA,YACV,OAAOA,EAAK;AAAA,YACZ,UAAU,KAAK,IAAI,SAAS,aAAaA,EAAK,QAAQA,EAAK,GAAG;AAAA,YAC9D,KAAK,KAAK,IAAI,SAAS,wBAAwBA,EAAK,MAAM;AAAA,UAAA,EAC5D;AAEF,cADA2N,IAAa,MAAMkS,EAAsBC,GAAa/C,GAAOC,GAAOsC,CAAO,GACvE3R,KAAc,CAACA,EAAW;AAC1B;AAAA,QAER;AAEA,aAAK,cAAA,GAEL,KAAK,IAAI,0BAA0BA,GAAY,EAAI;AACnD,YAAIK,IAAc,CAAA;AAClB,QAAAP,EAAW,QAAQ,CAAC9O,MAAW;AAC3B,UAAAqP,EAAK,KAAK,KAAK,IAAI,SAAS,wBAAwBrP,CAAM,CAAC;AAAA,QAC/D,CAAC,GACD,KAAK,IAAI,KAAK,eAAegP,GAAYK,CAAI;AAAA,MACjD,CAAC,EACA,MAAM,CAACgR,MAAU;AACd,gBAAQ,MAAM,wCAAwCA,CAAK;AAAA,MAC/D,CAAC;AAAA,IACT;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAIQ,UAAUtC,GAA0C;AAExD,QAAI,KAAK,IAAI;AACT;AAEJ,UAAM,EAAE,WAAAgC,MAAc,KAAK;AAC3B,QAAI,CAACA;AACD;AAEJ,QAAI,EAAE,UAAA9f,IAAW,GAAG,UAAAC,IAAW,MAAM6f;AACrC,UAAM5T,IAAO,GACPhD,IAAO,GACPiC,IAAO,KAAK,IAAI,aAChBhC,IAAO,KAAK,IAAI;AACtB,YAAQ2U,GAAA;AAAA,MACJ,KAAK;AACD,QAAI9d,IAAWkM,KACXlM;AAEJ;AAAA,MACJ,KAAK;AACD,QAAIC,IAAWiJ,KACXjJ;AAEJ;AAAA,MACJ,KAAK;AACD,QAAID,IAAWmL,KACXnL;AAEJ;AAAA,MACJ,KAAK;AACD,QAAIC,IAAWkJ,KACXlJ;AAEJ;AAAA,IACJ;AAEJ,UAAMiL,IAAO,CAAClL,GAAUA,CAAQ,GAC1BoJ,IAAO,CAACnJ,GAAUA,CAAQ,GAC1BiP,IAAO,KAAK,QAAQjP,GAAUD,CAAQ;AAC5C,IAAKkP,MAIDA,EAAK,aAIJ,KAAK,iBAAiBA,EAAK,UAAUA,EAAK,QAAQ,MAGvD,KAAK,IAAI,aAAaA,CAAI,GAC1B,KAAK,YAAYhE,GAAM9B,CAAI,GAC3B,KAAK,uBAAA,GACL,KAAK,IAAI,KAAK,aAAa8F,CAAI,GAC/B,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACQ,qBAAqB;AACzB,SAAK,kBAAkB,IACvB,KAAK,kBAAkB,IACnB,KAAK,WACL,cAAc,KAAK,MAAM,GACzB,KAAK,SAAS,IAEd,KAAK,WACL,cAAc,KAAK,MAAM,GACzB,KAAK,SAAS;AAAA,EAEtB;AAAA;AAAA,EAEQ,iBAAiBjP,GAAkBD,GAAkB;AACzD,UAAM;AAAA,MACF,qBAAAue;AAAA,MACA,qBAAAC;AAAA,MACA,qBAAAC;AAAA,MACA,qBAAAC;AAAA,MACA,4BAAAC;AAAA,MACA,4BAAAC;AAAA,IAAA,IACA,KAAK,IAAI,QACPC,IAAWN,GACXO,IAAWN,KAAuB,KAAK,IAAI,cAAcG,GACzDI,IAAWN,GACXO,IAAWN,KAAuB,KAAK,IAAI,cAAcE;AAU/D,WATI,EAAA5e,IAAW6e,KAGX7e,IAAW8e,KAGX7e,IAAW8e,KAGX9e,IAAW+e;AAAA,EAInB;AAAA;AAAA;AAAA;AAAA,EAIQ,oBAAoB/M,GAAe;AACvC,UAAM,EAAE,SAAArF,GAAS,SAAAC,EAAA,IAAY,KAAK,IAAI,UAAUoF,CAAC;AACjD,QAAIkP,IAAY,IACZC,IAAY;AAWhB,QAVIxU,IAAU,IACVuU,IAAY,SACLvU,IAAU,KAAK,IAAI,KAAK,iBAC/BuU,IAAY,UAEZtU,IAAU,KAAK,IAAI,OAAO,gBAC1BuU,IAAY,QACLvU,IAAU,KAAK,IAAI,OAAO,gBAAgB,KAAK,IAAI,KAAK,kBAC/DuU,IAAY,WAEZD,KAAa,KAAK,oBAAoBA,GAAW;AACjD,WAAK,kBAAkBA;AAEvB,UAAIE,IAAe,MADFF,MAAc,SAAS,KAAK;AAE7C,MAAI,KAAK,WACL,cAAc,KAAK,MAAM,GACzB,KAAK,SAAS,IAElB,KAAK,SAAS,YAAY,MAAM;AAE5B,QAAAE,KAAgB;AAChB,cAAM,EAAE,SAAA9b,MAAY,KAAK,KACnB+b,IAAM/b,IAAU8b;AACtB,SAAIC,IAAM,KAAKA,IAAM,KAAK,IAAI,KAAK,WAC/B,cAAc,KAAK,MAAM,GACzB,KAAK,SAAS,IAElB,KAAK,IAAI,WAAWA,CAAG;AAAA,MAC3B,GAAG,GAAG;AAAA,IACV;AAEA,QAAIF,KAAa,KAAK,oBAAoBA,GAAW;AACjD,WAAK,kBAAkBA;AAEvB,UAAIG,IAAe,MADFH,MAAc,QAAQ,KAAK;AAE5C,MAAI,KAAK,WACL,cAAc,KAAK,MAAM,GACzB,KAAK,SAAS,IAElB,KAAK,SAAS,YAAY,MAAM;AAE5B,QAAAG,KAAgB;AAChB,cAAM,EAAE,SAAA5b,MAAY,KAAK,KACnB2b,IAAM3b,IAAU4b;AACtB,SAAID,IAAM,KAAKA,IAAM,KAAK,IAAI,KAAK,YAC/B,cAAc,KAAK,MAAM,GACzB,KAAK,SAAS,IAElB,KAAK,IAAI,WAAWA,CAAG;AAAA,MAC3B,GAAG,GAAG;AAAA,IACV;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAIQ,yBAAyB;AAC7B,UAAM;AAAA,MACF,aAAA5b;AAAA,MACA,YAAAL;AAAA,MACA,WAAAya;AAAA,MACA,iBAAAta;AAAA,MACA,gBAAAF;AAAA,MACA,QAAAiT;AAAA,MACA,QAAAqD;AAAA,MACA,MAAAtD;AAAA,MACA,SAAA/S;AAAA,MACA,SAAAI;AAAA,MACA,QAAQ,EAAE,qBAAAE,GAAqB,cAAAgW,GAAc,iBAAAM,GAAiB,wBAAAlS,EAAA;AAAA,IAAuB,IACrF,KAAK;AACT,QAAI,CAAC6V;AACD;AAGJ,IAAI7V,KAA0B,KAAK,IAAI,iBACnC6V,EAAU,eAAA;AAEd,UAAM,EAAE,OAAAlV,GAAO,OAAAC,GAAO,OAAA3F,GAAO,QAAAC,GAAQ,OAAAlD,MAAU6d,GAEzC0B,IAAWlc,IAAiBsF,IAAQ,GACpC6W,IAAY3B,EAAU,QAAQ5a,KAASG,IAAaG,KAAmB;AAC7E,QAAIkc,IAAUnJ,EAAO,SAAS1N,GAE1B8W,IAAaxc;AACjB,IAAIwc,IAAarJ,EAAK,kBAClBqJ,IAAarJ,EAAK;AAEtB,QAAId,IAAe;AACnB,IAAIqE,MACIM,MAAoB,QACpBuF,IAAUnJ,EAAO,SAASqD,EAAO,SAAS/Q,IAE1C2M,IAAeoE,EAAO;AAG9B,UAAMgG,IAAa/W,IAAQ8W,KAAcjc,IAAc8R,IAAe3R;AACtE,QAAIgc,IAAWtc,GACXuc,IAAWnc;AAEf,IAAI8b,IAAY,KAAK,CAACxf,IAClB4f,IAAW,KAAK,MAAMtc,IAAUkc,CAAS,IAClCD,IAAW,KAAK,CAACvf,MACxB4f,IAAW,KAAK,MAAMtc,IAAUic,CAAQ,IAExCE,IAAU,IACVI,IAAW,KAAK,MAAMnc,IAAU+b,CAAO,IAChCE,IAAa,MACpBE,IAAW,KAAK,MAAMnc,IAAUic,CAAU,KAG1C,KAAK,IAAIrc,IAAUsc,CAAQ,IAAI,KAAK,KAAK,IAAIlc,IAAUmc,CAAQ,IAAI,OACnE,KAAK,IAAI,oBAAoB,IAC7B,KAAK,IAAI,UAAUD,GAAUC,CAAQ,GAErC,KAAK,IAAI,KAAK,0BAA0BhC,CAAS;AAAA,EAEzD;AAAA,EACA,UAAU;AACN,IAAI,KAAK,WACL,aAAa,KAAK,MAAM,GACxB,KAAK,SAAS,IAEd,KAAK,WACL,aAAa,KAAK,MAAM,GACxB,KAAK,SAAS;AAAA,EAEtB;AACJ;ACr+BA,MAAqBiC,GAAS;AAAA,EAG1B,YAAYhd,GAAc;AAFlB,IAAAtF,EAAA;AACA,IAAAA,EAAA;AAEJ,SAAK,MAAMsF,GACX,KAAK,KAAA;AAAA,EACT;AAAA,EACQ,OAAO;AACX,SAAK,IAAI,GAAG,aAAa,CAACkN,MAAM;AAU5B,UATI,KAAK,IAAI,aAAa,MAAM,WAAW,gBACvC,KAAK,IAAI,aAAa,MAAM,SAAS,YAErC,KAAK,IAAI,WAGT,CAAC,KAAK,IAAI,aAGV,CAAC,KAAK;AACN;AAEJ,YAAM,EAAE,SAAArF,GAAS,SAAAC,EAAA,IAAY,KAAK,IAAI,UAAUoF,CAAC,GAC3C,EAAE,UAAAjS,GAAU,UAAAC,GAAU,OAAA2K,GAAO,OAAAC,GAAO,OAAA3F,GAAO,QAAAC,MAAW,KAAK,eAC3D6c,IAAU,GACV5W,IAASpL,MAAa,KAAK,IAAI,eAAeC,MAAa,KAAK,IAAI,cAAc,IAAI,GACtF+X,IAASpN,IAAQ1F,IAAQ8c,IAAU5W,GACnC6M,IAASpN,IAAQ1F,IAAS6c,IAAU5W;AAC1C,MAAIwB,IAAUoL,KAAUnL,IAAUoL,KAAUrL,IAAUoL,IAASgK,KAAWnV,IAAUoL,IAAS+J,MAEzF,KAAK,IAAI,aAAa,MAAM,SAAS;AAAA,IAE7C,CAAC,GACD,KAAK,IAAI,GAAG,kBAAkB,CAAC9S,MAAS;AACpC,YAAM,EAAE,MAAAhE,GAAM,MAAA9B,EAAA,IAAS,KAAK,IAAI,UAC1B+B,IAAOD,EAAK,CAAC,GACb/B,IAAOC,EAAK,CAAC,GACb,EAAE,UAAApJ,GAAU,UAAAC,EAAA,IAAaiP;AAC/B,MAAI,KAAK,IAAI,OAAO,mBAAmBlP,MAAamL,KAAQlL,MAAakJ,MACrE,KAAK,gBAAgB+F,IAEzB,KAAK,WAAWA,CAAI;AAAA,IACxB,CAAC,GACD,KAAK,IAAI,GAAG,aAAa,MAAM;AAC3B,MAAI,KAAK,IAAI,aAAa,MAAM,WAAW,eACvC,KAAK,aAAA;AAAA,IAEb,CAAC,GACD,KAAK,IAAI,GAAG,WAAW,MAAM;AACzB,WAAK,WAAA;AAAA,IACT,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB;AACpB,UAAM,EAAE,MAAAhE,GAAM,MAAA9B,EAAA,IAAS,KAAK,IAAI;AAEhC,WACI,OAAK,UAAU,KAAK,IAAI,SAAS,IAAI,MAAM,KAAK,UAAU8B,CAAI,KAC9D,KAAK,UAAU,KAAK,IAAI,SAAS,IAAI,MAAM,KAAK,UAAU9B,CAAI;AAAA,EAKtE;AAAA,EACQ,eAAe;AACnB,SAAK,IAAI,SAAS,SAAS,IAC3B,KAAK,IAAI,eAAe;AAAA,EAC5B;AAAA,EACQ,aAAa;AACjB,QAAI,CAAC,KAAK,IAAI,SAAS;AACnB;AAGJ,IADsB,KAAK,cAAA,KAEvB,KAAK,aAAA,GAET,KAAK,IAAI,SAAS,SAAS,IAC3B,KAAK,IAAI,eAAe,IACxB,KAAK,IAAI,SAAS,OAAO,CAAC,IAAI,EAAE,GAChC,KAAK,IAAI,SAAS,OAAO,CAAC,IAAI,EAAE;AAAA,EACpC;AAAA,EACQ,YAAY8B,GAAgB9B,GAAgB;AAChD,UAAM,EAAE,iBAAA2B,GAAiB,0BAAAkT,GAA0B,0BAAAC,EAAA,IAA6B,KAAK,IAAI;AACzF,QAAI,CAACnT;AACD;AAEJ,QAAIoT,IAAQjT,GACRkT,IAAQhV;AACZ,QAAI,CAAC8U,GAA0B;AAC3B,YAAM,CAACG,CAAQ,IAAID;AACnB,MAAAA,IAAQ,CAACC,GAAUA,CAAQ;AAAA,IAC/B;AACA,QAAI,CAACJ,GAA0B;AAC3B,YAAM,CAACK,CAAQ,IAAIH;AACnB,MAAAA,IAAQ,CAACG,GAAUA,CAAQ;AAAA,IAC/B;AAEA,QACI,KAAK,UAAU,KAAK,IAAI,SAAS,IAAI,MAAM,KAAK,UAAUH,CAAK,KAC/D,KAAK,UAAU,KAAK,IAAI,SAAS,IAAI,MAAM,KAAK,UAAUC,CAAK,GACjE;AAEE,YAAM;AAAA,QACF,qBAAAG;AAAA,QACA,qBAAAC;AAAA,QACA,qBAAAC;AAAA,QACA,qBAAAC;AAAA,QACA,4BAAAC;AAAA,QACA,4BAAAC;AAAA,MAAA,IACA,KAAK,IAAI,QACPC,IAAWN,GACXO,IAAWN,KAAuB,KAAK,IAAI,cAAcG,GACzDI,IAAWN,GACXO,IAAWN,KAAuB,KAAK,IAAI,cAAcE;AAC/D,UAAI,CAAC1S,GAAMf,CAAI,IAAIgT,GACf,CAACjV,GAAMC,CAAI,IAAIiV;AAInB,UAHIlS,IAAO2S,KAGP3V,IAAO6V;AACP;AAEJ,MAAAZ,IAAQ,CAAC,KAAK,IAAIU,GAAU3S,CAAI,GAAG,KAAK,IAAI4S,GAAU3T,CAAI,CAAC,GAC3DiT,IAAQ,CAAC,KAAK,IAAIW,GAAU7V,CAAI,GAAG,KAAK,IAAI8V,GAAU7V,CAAI,CAAC;AAE3D,YAAM,EAAE,4BAAA8Y,EAAA,IAA+B,KAAK,IAAI;AAChD,UAAI,OAAOA,KAA+B,YAAY;AAElD,cAAM9L,IADmD8L,EACrB;AAAA,UAChC,WAAW,KAAK,IAAI;AAAA,UACpB,MAAM9D;AAAA,UACN,MAAMC;AAAA,QAAA,CACT;AACD,YAAI,CAACjI;AACD;AAEJ,QAAAgI,IAAQhI,EAAI,MACZiI,IAAQjI,EAAI;AAAA,MAChB;AACA,WAAK,IAAI,SAAS,OAAOgI,GACzB,KAAK,IAAI,SAAS,OAAOC,GACzB,KAAK,IAAI,KAAK,eAAe,KAAK,IAAI,QAAQ,GAC9C,KAAK,IAAI,KAAK,MAAM;AAAA,IACxB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAIA,MAAc,eAAe;AACzB,UAAMvP,wBAA8B,IAAA,GAC9BqT,IAAW,KAAK,IAAI,gBAAA,GAEpBC,wBAAuB,IAAA;AAC7B,aAAShL,IAAK,GAAGA,KAAM+K,EAAS,KAAK,CAAC,IAAIA,EAAS,KAAK,CAAC,GAAG/K;AACxD,eAASE,IAAK,GAAGA,KAAM6K,EAAS,KAAK,CAAC,IAAIA,EAAS,KAAK,CAAC,GAAG7K,KAAM;AAC9D,cAAMpX,IAAWkX,IAAK+K,EAAS,KAAK,CAAC,GAC/BliB,IAAWqX,IAAK6K,EAAS,KAAK,CAAC;AACrC,QAAAC,EAAiB,IAAI,GAAGliB,CAAQ,IAAID,CAAQ,IAAI,EAAI;AAAA,MACxD;AAEJ,UAAM,EAAE,OAAAE,MAAUgiB,GACZE,IAAQliB,EAAM,CAAC,EAAE,QACjBmiB,IAAQniB,EAAM,QACdgL,IAAO,KAAK,IAAI,SAAS,MACzB9B,IAAO,KAAK,IAAI,SAAS,MACzBkZ,IAAaF,MAAU,KAAKC,MAAU;AAE5C,QAAI,KAAK,IAAI,OAAO,0BAA0B,KAAK,IAAI,SAAS,aAAanX,GAAM9B,CAAI,KAAK,CAACkZ,GAAY;AACrG,YAAMvc,IAAiB;AAAA,QACnB,MAAM;AAAA,QACN,SAAS;AAAA,MAAA;AAEb,MAAI,KAAK,IAAI,SAAS,OAAO,IACzB,KAAK,IAAI,KAAK,SAASA,CAAG,IAE1B,MAAMA,EAAI,OAAO;AAErB;AAAA,IACJ;AACA,QAAIgJ,IAAa,CAAA;AACjB,aAASoI,IAAK,GAAGA,KAAM/N,EAAK,CAAC,IAAIA,EAAK,CAAC,GAAG+N;AACtC,eAASE,IAAK,GAAGA,KAAMnM,EAAK,CAAC,IAAIA,EAAK,CAAC,GAAGmM,KAAM;AAC5C,cAAMrX,IAAWqX,IAAKnM,EAAK,CAAC,GACtBjL,IAAWkX,IAAK/N,EAAK,CAAC,GACtB/F,IAAMnD,EAAMiX,IAAKkL,CAAK,EAAEhL,IAAK+K,CAAK,GAClC5B,IAAY,KAAK,IAAI,SAAS,mCAAmCvgB,GAAUD,CAAQ,GACnFuiB,IAAmB,GAAGtiB,CAAQ,IAAID,CAAQ;AAChD,YAAIwgB,KAAa,CAAC2B,EAAiB,IAAII,CAAgB,GAAG;AACtD,gBAAM,EAAE,QAAAxiB,GAAQ,KAAAD,EAAA,IAAQ0gB;AAExB,UAAK,KAAK,IAAI,SAAS,YAAYzgB,GAAQD,CAAG,MAC1C+O,EAAW,IAAI9O,CAAM,GACrBgP,EAAW,KAAK;AAAA,YACZ,QAAAhP;AAAA,YACA,KAAAD;AAAA,YACA,OAAOuD;AAAA,YACP,KAAK,CAAA;AAAA,UAAC,CACT;AAAA,QAET;AAAA,MACJ;AAGJ,QAAI,CAAC0L,EAAW;AACZ;AAGJ,SAAK,IAAI,SAAS,OAAO,KAAK,IAAI,SAAS,MAC3C,KAAK,IAAI,SAAS,OAAO,KAAK,IAAI,SAAS;AAE3C,UAAM,EAAE,6BAAAyT,EAAA,IAAgC,KAAK,IAAI;AACjD,QAAI,OAAOA,KAAgC,YAAY;AACnD,YAAMC,IAA2BD,GAC3BtB,IAAcnS,EAAW,IAAI,CAAC3N,OAAU;AAAA,QAC1C,QAAQA,EAAK;AAAA,QACb,KAAKA,EAAK;AAAA,QACV,OAAOA,EAAK;AAAA,QACZ,UAAU,KAAK,IAAI,SAAS,aAAaA,EAAK,QAAQA,EAAK,GAAG;AAAA,QAC9D,KAAK,KAAK,IAAI,SAAS,wBAAwBA,EAAK,MAAM;AAAA,MAAA,EAC5D;AAEF,UADA2N,IAAa,MAAM0T,EAAyBvB,GAAahW,GAAM9B,CAAI,GAC/D2F,KAAc,CAACA,EAAW;AAC1B;AAAA,IAER;AAEA,SAAK,IAAI,0BAA0BA,GAAY,EAAI;AACnD,QAAIK,IAAc,CAAA;AAClB,IAAAP,EAAW,QAAQ,CAAC9O,MAAW;AAC3B,MAAAqP,EAAK,KAAK,KAAK,IAAI,SAAS,wBAAwBrP,CAAM,CAAC;AAAA,IAC/D,CAAC,GACD,KAAK,IAAI,KAAK,kBAAkBgP,GAAYK,CAAI;AAAA,EACpD;AAAA,EACQ,WAAWF,GAAY;AAC3B,QAAI,CAAC,SAAS,aAAa,iBAAiB,EAAE,SAASA,EAAK,IAAI;AAC5D;AAEJ,UAAM,EAAE,UAAAgT,GAAU,UAAAQ,EAAA,IAAa,KAAK;AACpC,QAAI,KAAK,IAAI,aAAaR,EAAS,UAAUQ,EAAS,QAAQ;AAC1D,YAAM,EAAE,UAAAziB,GAAU,UAAAD,EAAA,IAAakP,GACzBhE,IAAOgX,EAAS,KAAK,MAAA,GACrB9Y,IAAO8Y,EAAS,KAAK,MAAA;AAC3B,MAAIjiB,KAAYiiB,EAAS,KAAK,CAAC,KAAKjiB,KAAYiiB,EAAS,KAAK,CAAC,IACvDliB,IAAWkiB,EAAS,KAAK,CAAC,IAC1BhX,EAAK,OAAO,GAAG,GAAGlL,CAAQ,IACnBA,IAAWkiB,EAAS,KAAK,CAAC,KACjChX,EAAK,OAAO,GAAG,GAAGlL,CAAQ,IAEvBC,IAAWiiB,EAAS,KAAK,CAAC,IACjC9Y,EAAK,OAAO,GAAG,GAAGnJ,CAAQ,IACnBA,IAAWiiB,EAAS,KAAK,CAAC,KACjC9Y,EAAK,OAAO,GAAG,GAAGnJ,CAAQ,GAE9B,KAAK,YAAYiL,GAAM9B,CAAI;AAAA,IAC/B;AAAA,EACJ;AAAA,EACA,UAAU;AAAA,EAAC;AACf;AC9PA,MAAMuZ,IAAM,KAAK,KACXC,IAAM,KAAK,KACXC,KAAQ,KAAK,OAEbC,IAAe,CAAAC,OAAM;AAAA,EACzB,GAAGA;AAAA,EACH,GAAGA;AACL,IACMC,KAAkB;AAAA,EACtB,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AACP,GACMC,KAAuB;AAAA,EAC3B,OAAO;AAAA,EACP,KAAK;AACP;AACA,SAASC,GAAMhG,GAAOhd,GAAOid,GAAK;AAChC,SAAOyF,EAAI1F,GAAOyF,EAAIziB,GAAOid,CAAG,CAAC;AACnC;AACA,SAASgG,EAASjjB,GAAOkjB,GAAO;AAC9B,SAAO,OAAOljB,KAAU,aAAaA,EAAMkjB,CAAK,IAAIljB;AACtD;AACA,SAASmjB,EAAQC,GAAW;AAC1B,SAAOA,EAAU,MAAM,GAAG,EAAE,CAAC;AAC/B;AACA,SAASC,EAAaD,GAAW;AAC/B,SAAOA,EAAU,MAAM,GAAG,EAAE,CAAC;AAC/B;AACA,SAASE,GAAgBC,GAAM;AAC7B,SAAOA,MAAS,MAAM,MAAM;AAC9B;AACA,SAASC,GAAcD,GAAM;AAC3B,SAAOA,MAAS,MAAM,WAAW;AACnC;AACA,MAAME,KAA0B,oBAAI,IAAI,CAAC,OAAO,QAAQ,CAAC;AACzD,SAASC,EAAYN,GAAW;AAC9B,SAAOK,GAAW,IAAIN,EAAQC,CAAS,CAAC,IAAI,MAAM;AACpD;AACA,SAASO,GAAiBP,GAAW;AACnC,SAAOE,GAAgBI,EAAYN,CAAS,CAAC;AAC/C;AACA,SAASQ,GAAkBR,GAAWS,GAAOC,GAAK;AAChD,EAAIA,MAAQ,WACVA,IAAM;AAER,QAAMC,IAAYV,EAAaD,CAAS,GAClCY,IAAgBL,GAAiBP,CAAS,GAC1Ca,IAAST,GAAcQ,CAAa;AAC1C,MAAIE,IAAoBF,MAAkB,MAAMD,OAAeD,IAAM,QAAQ,WAAW,UAAU,SAASC,MAAc,UAAU,WAAW;AAC9I,SAAIF,EAAM,UAAUI,CAAM,IAAIJ,EAAM,SAASI,CAAM,MACjDC,IAAoBC,GAAqBD,CAAiB,IAErD,CAACA,GAAmBC,GAAqBD,CAAiB,CAAC;AACpE;AACA,SAASE,GAAsBhB,GAAW;AACxC,QAAMiB,IAAoBF,GAAqBf,CAAS;AACxD,SAAO,CAACkB,GAA8BlB,CAAS,GAAGiB,GAAmBC,GAA8BD,CAAiB,CAAC;AACvH;AACA,SAASC,GAA8BlB,GAAW;AAChD,SAAOA,EAAU,QAAQ,cAAc,CAAAW,MAAahB,GAAqBgB,CAAS,CAAC;AACrF;AACA,MAAMQ,KAAc,CAAC,QAAQ,OAAO,GAC9BC,KAAc,CAAC,SAAS,MAAM,GAC9BC,KAAc,CAAC,OAAO,QAAQ,GAC9BC,KAAc,CAAC,UAAU,KAAK;AACpC,SAASC,GAAY7R,GAAM8R,GAASd,GAAK;AACvC,UAAQhR,GAAI;AAAA,IACV,KAAK;AAAA,IACL,KAAK;AACH,aAAIgR,IAAYc,IAAUJ,KAAcD,KACjCK,IAAUL,KAAcC;AAAA,IACjC,KAAK;AAAA,IACL,KAAK;AACH,aAAOI,IAAUH,KAAcC;AAAA,IACjC;AACE,aAAO,CAAA;AAAA,EACb;AACA;AACA,SAASG,GAA0BzB,GAAW0B,GAAeC,GAAWjB,GAAK;AAC3E,QAAMC,IAAYV,EAAaD,CAAS;AACxC,MAAI/f,IAAOshB,GAAYxB,EAAQC,CAAS,GAAG2B,MAAc,SAASjB,CAAG;AACrE,SAAIC,MACF1gB,IAAOA,EAAK,IAAI,CAAAyP,MAAQA,IAAO,MAAMiR,CAAS,GAC1Ce,MACFzhB,IAAOA,EAAK,OAAOA,EAAK,IAAIihB,EAA6B,CAAC,KAGvDjhB;AACT;AACA,SAAS8gB,GAAqBf,GAAW;AACvC,SAAOA,EAAU,QAAQ,0BAA0B,CAAAtQ,MAAQgQ,GAAgBhQ,CAAI,CAAC;AAClF;AACA,SAASkS,GAAoBrR,GAAS;AACpC,SAAO;AAAA,IACL,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,GAAGA;AAAA,EACP;AACA;AACA,SAASsR,GAAiBtR,GAAS;AACjC,SAAO,OAAOA,KAAY,WAAWqR,GAAoBrR,CAAO,IAAI;AAAA,IAClE,KAAKA;AAAA,IACL,OAAOA;AAAA,IACP,QAAQA;AAAA,IACR,MAAMA;AAAA,EACV;AACA;AACA,SAASuR,GAAiBC,GAAM;AAC9B,QAAM;AAAA,IACJ,GAAArgB;AAAA,IACA,GAAAC;AAAA,IACA,OAAAC;AAAA,IACA,QAAAC;AAAA,EACJ,IAAMkgB;AACJ,SAAO;AAAA,IACL,OAAAngB;AAAA,IACA,QAAAC;AAAA,IACA,KAAKF;AAAA,IACL,MAAMD;AAAA,IACN,OAAOA,IAAIE;AAAA,IACX,QAAQD,IAAIE;AAAA,IACZ,GAAAH;AAAA,IACA,GAAAC;AAAA,EACJ;AACA;ACrIA,SAASqgB,GAA2BC,GAAMjC,GAAWU,GAAK;AACxD,MAAI;AAAA,IACF,WAAAwB;AAAA,IACA,UAAAC;AAAA,EACJ,IAAMF;AACJ,QAAMG,IAAW9B,EAAYN,CAAS,GAChCY,IAAgBL,GAAiBP,CAAS,GAC1CqC,IAAcjC,GAAcQ,CAAa,GACzClR,IAAOqQ,EAAQC,CAAS,GACxBsC,IAAaF,MAAa,KAC1BG,IAAUL,EAAU,IAAIA,EAAU,QAAQ,IAAIC,EAAS,QAAQ,GAC/DK,IAAUN,EAAU,IAAIA,EAAU,SAAS,IAAIC,EAAS,SAAS,GACjEM,IAAcP,EAAUG,CAAW,IAAI,IAAIF,EAASE,CAAW,IAAI;AACzE,MAAIK;AACJ,UAAQhT,GAAI;AAAA,IACV,KAAK;AACH,MAAAgT,IAAS;AAAA,QACP,GAAGH;AAAA,QACH,GAAGL,EAAU,IAAIC,EAAS;AAAA,MAClC;AACM;AAAA,IACF,KAAK;AACH,MAAAO,IAAS;AAAA,QACP,GAAGH;AAAA,QACH,GAAGL,EAAU,IAAIA,EAAU;AAAA,MACnC;AACM;AAAA,IACF,KAAK;AACH,MAAAQ,IAAS;AAAA,QACP,GAAGR,EAAU,IAAIA,EAAU;AAAA,QAC3B,GAAGM;AAAA,MACX;AACM;AAAA,IACF,KAAK;AACH,MAAAE,IAAS;AAAA,QACP,GAAGR,EAAU,IAAIC,EAAS;AAAA,QAC1B,GAAGK;AAAA,MACX;AACM;AAAA,IACF;AACE,MAAAE,IAAS;AAAA,QACP,GAAGR,EAAU;AAAA,QACb,GAAGA,EAAU;AAAA,MACrB;AAAA,EACA;AACE,UAAQjC,EAAaD,CAAS,GAAC;AAAA,IAC7B,KAAK;AACH,MAAA0C,EAAO9B,CAAa,KAAK6B,KAAe/B,KAAO4B,IAAa,KAAK;AACjE;AAAA,IACF,KAAK;AACH,MAAAI,EAAO9B,CAAa,KAAK6B,KAAe/B,KAAO4B,IAAa,KAAK;AACjE;AAAA,EACN;AACE,SAAOI;AACT;AASA,MAAMC,KAAkB,OAAOT,GAAWC,GAAU1jB,MAAW;AAC7D,QAAM;AAAA,IACJ,WAAAuhB,IAAY;AAAA,IACZ,UAAA4C,IAAW;AAAA,IACX,YAAAC,IAAa,CAAA;AAAA,IACb,UAAAC;AAAA,EACJ,IAAMrkB,GACEskB,IAAkBF,EAAW,OAAO,OAAO,GAC3CnC,IAAM,OAAOoC,EAAS,SAAS,OAAO,SAASA,EAAS,MAAMX,CAAQ;AAC5E,MAAI1B,IAAQ,MAAMqC,EAAS,gBAAgB;AAAA,IACzC,WAAAZ;AAAA,IACA,UAAAC;AAAA,IACA,UAAAS;AAAA,EACJ,CAAG,GACG;AAAA,IACF,GAAAlhB;AAAA,IACA,GAAAC;AAAA,EACJ,IAAMqgB,GAA2BvB,GAAOT,GAAWU,CAAG,GAChDsC,IAAoBhD,GACpBiD,IAAiB,CAAA,GACjBC,IAAa;AACjB,WAASlb,IAAI,GAAGA,IAAI+a,EAAgB,QAAQ/a,KAAK;AAC/C,UAAM;AAAA,MACJ,MAAA1G;AAAA,MACA,IAAAyN;AAAA,IACN,IAAQgU,EAAgB/a,CAAC,GACf;AAAA,MACJ,GAAGmb;AAAA,MACH,GAAGC;AAAA,MACH,MAAAvlB;AAAA,MACA,OAAAwlB;AAAA,IACN,IAAQ,MAAMtU,EAAG;AAAA,MACX,GAAArN;AAAA,MACA,GAAAC;AAAA,MACA,kBAAkBqe;AAAA,MAClB,WAAWgD;AAAA,MACX,UAAAJ;AAAA,MACA,gBAAAK;AAAA,MACA,OAAAxC;AAAA,MACA,UAAAqC;AAAA,MACA,UAAU;AAAA,QACR,WAAAZ;AAAA,QACA,UAAAC;AAAA,MACR;AAAA,IACA,CAAK;AACD,IAAAzgB,IAAIyhB,KAAwBzhB,GAC5BC,IAAIyhB,KAAwBzhB,GAC5BshB,IAAiB;AAAA,MACf,GAAGA;AAAA,MACH,CAAC3hB,CAAI,GAAG;AAAA,QACN,GAAG2hB,EAAe3hB,CAAI;AAAA,QACtB,GAAGzD;AAAA,MACX;AAAA,IACA,GACQwlB,KAASH,KAAc,OACzBA,KACI,OAAOG,KAAU,aACfA,EAAM,cACRL,IAAoBK,EAAM,YAExBA,EAAM,UACR5C,IAAQ4C,EAAM,UAAU,KAAO,MAAMP,EAAS,gBAAgB;AAAA,MAC5D,WAAAZ;AAAA,MACA,UAAAC;AAAA,MACA,UAAAS;AAAA,IACZ,CAAW,IAAIS,EAAM,QAEZ;AAAA,MACC,GAAA3hB;AAAA,MACA,GAAAC;AAAA,IACV,IAAYqgB,GAA2BvB,GAAOuC,GAAmBtC,CAAG,IAE9D1Y,IAAI;AAAA,EAER;AACA,SAAO;AAAA,IACL,GAAAtG;AAAA,IACA,GAAAC;AAAA,IACA,WAAWqhB;AAAA,IACX,UAAAJ;AAAA,IACA,gBAAAK;AAAA,EACJ;AACA;AAUA,eAAeK,GAAeC,GAAOva,GAAS;AAC5C,MAAIwa;AACJ,EAAIxa,MAAY,WACdA,IAAU,CAAA;AAEZ,QAAM;AAAA,IACJ,GAAAtH;AAAA,IACA,GAAAC;AAAA,IACA,UAAAmhB;AAAA,IACA,OAAArC;AAAA,IACA,UAAAgD;AAAA,IACA,UAAAb;AAAA,EACJ,IAAMW,GACE;AAAA,IACJ,UAAAG,IAAW;AAAA,IACX,cAAAC,IAAe;AAAA,IACf,gBAAAC,IAAiB;AAAA,IACjB,aAAAC,IAAc;AAAA,IACd,SAAAtT,IAAU;AAAA,EACd,IAAMsP,EAAS7W,GAASua,CAAK,GACrBO,IAAgBjC,GAAiBtR,CAAO,GAExCqB,IAAU6R,EAASI,IADND,MAAmB,aAAa,cAAc,aACbA,CAAc,GAC5DG,IAAqBjC,GAAiB,MAAMgB,EAAS,gBAAgB;AAAA,IACzE,UAAWU,IAAwB,OAAOV,EAAS,aAAa,OAAO,SAASA,EAAS,UAAUlR,CAAO,OAAO,QAAO4R,IAAgC5R,IAAUA,EAAQ,kBAAmB,OAAOkR,EAAS,sBAAsB,OAAO,SAASA,EAAS,mBAAmBW,EAAS,QAAQ;AAAA,IAChS,UAAAC;AAAA,IACA,cAAAC;AAAA,IACA,UAAAf;AAAA,EACJ,CAAG,CAAC,GACIb,IAAO6B,MAAmB,aAAa;AAAA,IAC3C,GAAAliB;AAAA,IACA,GAAAC;AAAA,IACA,OAAO8e,EAAM,SAAS;AAAA,IACtB,QAAQA,EAAM,SAAS;AAAA,EAC3B,IAAMA,EAAM,WACJuD,IAAe,OAAOlB,EAAS,mBAAmB,OAAO,SAASA,EAAS,gBAAgBW,EAAS,QAAQ,IAC5GQ,IAAe,OAAOnB,EAAS,aAAa,OAAO,SAASA,EAAS,UAAUkB,CAAY,KAAO,OAAOlB,EAAS,YAAY,OAAO,SAASA,EAAS,SAASkB,CAAY,MAAO;AAAA,IACvL,GAAG;AAAA,IACH,GAAG;AAAA,EACP,IAAM;AAAA,IACF,GAAG;AAAA,IACH,GAAG;AAAA,EACP,GACQE,IAAoBpC,GAAiBgB,EAAS,wDAAwD,MAAMA,EAAS,sDAAsD;AAAA,IAC/K,UAAAW;AAAA,IACA,MAAA1B;AAAA,IACA,cAAAiC;AAAA,IACA,UAAApB;AAAA,EACJ,CAAG,IAAIb,CAAI;AACT,SAAO;AAAA,IACL,MAAMgC,EAAmB,MAAMG,EAAkB,MAAMJ,EAAc,OAAOG,EAAY;AAAA,IACxF,SAASC,EAAkB,SAASH,EAAmB,SAASD,EAAc,UAAUG,EAAY;AAAA,IACpG,OAAOF,EAAmB,OAAOG,EAAkB,OAAOJ,EAAc,QAAQG,EAAY;AAAA,IAC5F,QAAQC,EAAkB,QAAQH,EAAmB,QAAQD,EAAc,SAASG,EAAY;AAAA,EACpG;AACA;AAOA,MAAME,KAAQ,CAAAnb,OAAY;AAAA,EACxB,MAAM;AAAA,EACN,SAAAA;AAAA,EACA,MAAM,GAAGua,GAAO;AACd,UAAM;AAAA,MACJ,GAAA7hB;AAAA,MACA,GAAAC;AAAA,MACA,WAAAqe;AAAA,MACA,OAAAS;AAAA,MACA,UAAAqC;AAAA,MACA,UAAAW;AAAA,MACA,gBAAAR;AAAA,IACN,IAAQM,GAEE;AAAA,MACJ,SAAA3R;AAAA,MACA,SAAArB,IAAU;AAAA,IAChB,IAAQsP,EAAS7W,GAASua,CAAK,KAAK,CAAA;AAChC,QAAI3R,KAAW;AACb,aAAO,CAAA;AAET,UAAMkS,IAAgBjC,GAAiBtR,CAAO,GACxCmS,IAAS;AAAA,MACb,GAAAhhB;AAAA,MACA,GAAAC;AAAA,IACN,GACUwe,IAAOI,GAAiBP,CAAS,GACjCa,IAAST,GAAcD,CAAI,GAC3BiE,IAAkB,MAAMtB,EAAS,cAAclR,CAAO,GACtDyS,IAAUlE,MAAS,KACnBmE,IAAUD,IAAU,QAAQ,QAC5BE,IAAUF,IAAU,WAAW,SAC/BG,IAAaH,IAAU,iBAAiB,eACxCI,IAAUhE,EAAM,UAAUI,CAAM,IAAIJ,EAAM,UAAUN,CAAI,IAAIuC,EAAOvC,CAAI,IAAIM,EAAM,SAASI,CAAM,GAChG6D,IAAYhC,EAAOvC,CAAI,IAAIM,EAAM,UAAUN,CAAI,GAC/CwE,IAAoB,OAAO7B,EAAS,mBAAmB,OAAO,SAASA,EAAS,gBAAgBlR,CAAO;AAC7G,QAAIgT,IAAaD,IAAoBA,EAAkBH,CAAU,IAAI;AAGrE,KAAI,CAACI,KAAc,CAAE,OAAO9B,EAAS,aAAa,OAAO,SAASA,EAAS,UAAU6B,CAAiB,QACpGC,IAAanB,EAAS,SAASe,CAAU,KAAK/D,EAAM,SAASI,CAAM;AAErE,UAAMgE,IAAoBJ,IAAU,IAAIC,IAAY,GAI9CI,IAAyBF,IAAa,IAAIR,EAAgBvD,CAAM,IAAI,IAAI,GACxEkE,IAAa1F,EAAIyE,EAAcQ,CAAO,GAAGQ,CAAsB,GAC/DE,IAAa3F,EAAIyE,EAAcS,CAAO,GAAGO,CAAsB,GAI/DG,IAAQF,GACRzF,IAAMsF,IAAaR,EAAgBvD,CAAM,IAAImE,GAC7CE,IAASN,IAAa,IAAIR,EAAgBvD,CAAM,IAAI,IAAIgE,GACxD/c,IAAS8X,GAAMqF,GAAOC,GAAQ5F,CAAG,GAMjC6F,IAAkB,CAAClC,EAAe,SAAShD,EAAaD,CAAS,KAAK,QAAQkF,MAAWpd,KAAU2Y,EAAM,UAAUI,CAAM,IAAI,KAAKqE,IAASD,IAAQF,IAAaC,KAAcZ,EAAgBvD,CAAM,IAAI,IAAI,GAC5MuE,IAAkBD,IAAkBD,IAASD,IAAQC,IAASD,IAAQC,IAAS5F,IAAM;AAC3F,WAAO;AAAA,MACL,CAACa,CAAI,GAAGuC,EAAOvC,CAAI,IAAIiF;AAAA,MACvB,MAAM;AAAA,QACJ,CAACjF,CAAI,GAAGrY;AAAA,QACR,cAAcod,IAASpd,IAASsd;AAAA,QAChC,GAAID,KAAmB;AAAA,UACrB,iBAAAC;AAAA,QACV;AAAA,MACA;AAAA,MACM,OAAOD;AAAA,IACb;AAAA,EACE;AACF,IA+GME,KAAO,SAAUrc,GAAS;AAC9B,SAAIA,MAAY,WACdA,IAAU,CAAA,IAEL;AAAA,IACL,MAAM;AAAA,IACN,SAAAA;AAAA,IACA,MAAM,GAAGua,GAAO;AACd,UAAI+B,GAAuBC;AAC3B,YAAM;AAAA,QACJ,WAAAvF;AAAA,QACA,gBAAAiD;AAAA,QACA,OAAAxC;AAAA,QACA,kBAAA+E;AAAA,QACA,UAAA1C;AAAA,QACA,UAAAW;AAAA,MACR,IAAUF,GACE;AAAA,QACJ,UAAUkC,IAAgB;AAAA,QAC1B,WAAWC,IAAiB;AAAA,QAC5B,oBAAoBC;AAAA,QACpB,kBAAAC,IAAmB;AAAA,QACnB,2BAAAC,IAA4B;AAAA,QAC5B,eAAAnE,IAAgB;AAAA,QAChB,GAAGoE;AAAA,MACX,IAAUjG,EAAS7W,GAASua,CAAK;AAM3B,WAAK+B,IAAwBrC,EAAe,UAAU,QAAQqC,EAAsB;AAClF,eAAO,CAAA;AAET,YAAM5V,IAAOqQ,EAAQC,CAAS,GACxB+F,IAAkBzF,EAAYkF,CAAgB,GAC9CQ,IAAkBjG,EAAQyF,CAAgB,MAAMA,GAChD9E,IAAM,OAAOoC,EAAS,SAAS,OAAO,SAASA,EAAS,MAAMW,EAAS,QAAQ,IAC/EwC,IAAqBN,MAAgCK,KAAmB,CAACtE,IAAgB,CAACX,GAAqByE,CAAgB,CAAC,IAAIxE,GAAsBwE,CAAgB,IAC1KU,IAA+BL,MAA8B;AACnE,MAAI,CAACF,KAA+BO,KAClCD,EAAmB,KAAK,GAAGxE,GAA0B+D,GAAkB9D,GAAemE,GAA2BnF,CAAG,CAAC;AAEvH,YAAMyF,IAAa,CAACX,GAAkB,GAAGS,CAAkB,GACrDG,IAAW,MAAM9C,GAAeC,GAAOuC,CAAqB,GAC5DO,IAAY,CAAA;AAClB,UAAIC,MAAkBf,IAAuBtC,EAAe,SAAS,OAAO,SAASsC,EAAqB,cAAc,CAAA;AAIxH,UAHIE,KACFY,EAAU,KAAKD,EAAS1W,CAAI,CAAC,GAE3BgW,GAAgB;AAClB,cAAMa,IAAQ/F,GAAkBR,GAAWS,GAAOC,CAAG;AACrD,QAAA2F,EAAU,KAAKD,EAASG,EAAM,CAAC,CAAC,GAAGH,EAASG,EAAM,CAAC,CAAC,CAAC;AAAA,MACvD;AAOA,UANAD,IAAgB,CAAC,GAAGA,GAAe;AAAA,QACjC,WAAAtG;AAAA,QACA,WAAAqG;AAAA,MACR,CAAO,GAGG,CAACA,EAAU,MAAM,CAAA3W,MAAQA,KAAQ,CAAC,GAAG;AACvC,YAAI8W,GAAuBC;AAC3B,cAAMC,OAAeF,IAAwBvD,EAAe,SAAS,OAAO,SAASuD,EAAsB,UAAU,KAAK,GACpHG,IAAgBR,EAAWO,CAAS;AAC1C,YAAIC,MAEE,EAD4BjB,MAAmB,cAAcK,MAAoBzF,EAAYqG,CAAa,IAAI;AAAA;AAAA,QAIlHL,EAAc,MAAM,CAAAM,MAAKtG,EAAYsG,EAAE,SAAS,MAAMb,IAAkBa,EAAE,UAAU,CAAC,IAAI,IAAI,EAAI;AAE/F,iBAAO;AAAA,YACL,MAAM;AAAA,cACJ,OAAOF;AAAA,cACP,WAAWJ;AAAA,YAC3B;AAAA,YACc,OAAO;AAAA,cACL,WAAWK;AAAA,YAC3B;AAAA,UACA;AAMQ,YAAIE,KAAkBJ,IAAwBH,EAAc,OAAO,CAAAM,MAAKA,EAAE,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC7oB,GAAGC,MAAMD,EAAE,UAAU,CAAC,IAAIC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,MAAM,OAAO,SAASyoB,EAAsB;AAG1L,YAAI,CAACI;AACH,kBAAQjB,GAAgB;AAAA,YACtB,KAAK,WACH;AACE,kBAAIkB;AACJ,oBAAM9G,KAAa8G,IAAyBR,EAAc,OAAO,CAAAM,MAAK;AACpE,oBAAIV,GAA8B;AAChC,wBAAMa,IAAkBzG,EAAYsG,EAAE,SAAS;AAC/C,yBAAOG,MAAoBhB;AAAA;AAAA,kBAG3BgB,MAAoB;AAAA,gBACtB;AACA,uBAAO;AAAA,cACT,CAAC,EAAE,IAAI,CAAAH,MAAK,CAACA,EAAE,WAAWA,EAAE,UAAU,OAAO,CAAAR,MAAYA,IAAW,CAAC,EAAE,OAAO,CAAC7lB,GAAK6lB,OAAa7lB,IAAM6lB,IAAU,CAAC,CAAC,CAAC,EAAE,KAAK,CAACroB,GAAGC,MAAMD,EAAE,CAAC,IAAIC,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,OAAO,SAAS8oB,EAAuB,CAAC;AACjM,cAAI9G,MACF6G,IAAiB7G;AAEnB;AAAA,YACF;AAAA,YACF,KAAK;AACH,cAAA6G,IAAiBrB;AACjB;AAAA,UACd;AAEQ,YAAIxF,MAAc6G;AAChB,iBAAO;AAAA,YACL,OAAO;AAAA,cACL,WAAWA;AAAA,YACzB;AAAA,UACA;AAAA,MAEM;AACA,aAAO,CAAA;AAAA,IACT;AAAA,EACJ;AACA,GA0MMG,KAA2B,oBAAI,IAAI,CAAC,QAAQ,KAAK,CAAC;AAKxD,eAAeC,GAAqB1D,GAAOva,GAAS;AAClD,QAAM;AAAA,IACJ,WAAAgX;AAAA,IACA,UAAA8C;AAAA,IACA,UAAAW;AAAA,EACJ,IAAMF,GACE7C,IAAM,OAAOoC,EAAS,SAAS,OAAO,SAASA,EAAS,MAAMW,EAAS,QAAQ,IAC/E/T,IAAOqQ,EAAQC,CAAS,GACxBW,IAAYV,EAAaD,CAAS,GAClCsC,IAAahC,EAAYN,CAAS,MAAM,KACxCkH,IAAgBF,GAAY,IAAItX,CAAI,IAAI,KAAK,GAC7CyX,IAAiBzG,KAAO4B,IAAa,KAAK,GAC1C8E,IAAWvH,EAAS7W,GAASua,CAAK;AAGxC,MAAI;AAAA,IACF,UAAA8D;AAAA,IACA,WAAAC;AAAA,IACA,eAAA1G;AAAA,EACJ,IAAM,OAAOwG,KAAa,WAAW;AAAA,IACjC,UAAUA;AAAA,IACV,WAAW;AAAA,IACX,eAAe;AAAA,EACnB,IAAM;AAAA,IACF,UAAUA,EAAS,YAAY;AAAA,IAC/B,WAAWA,EAAS,aAAa;AAAA,IACjC,eAAeA,EAAS;AAAA,EAC5B;AACE,SAAIzG,KAAa,OAAOC,KAAkB,aACxC0G,IAAY3G,MAAc,QAAQC,IAAgB,KAAKA,IAElD0B,IAAa;AAAA,IAClB,GAAGgF,IAAYH;AAAA,IACf,GAAGE,IAAWH;AAAA,EAClB,IAAM;AAAA,IACF,GAAGG,IAAWH;AAAA,IACd,GAAGI,IAAYH;AAAA,EACnB;AACA;AASA,MAAMrf,KAAS,SAAUkB,GAAS;AAChC,SAAIA,MAAY,WACdA,IAAU,IAEL;AAAA,IACL,MAAM;AAAA,IACN,SAAAA;AAAA,IACA,MAAM,GAAGua,GAAO;AACd,UAAIgE,GAAuBjC;AAC3B,YAAM;AAAA,QACJ,GAAA5jB;AAAA,QACA,GAAAC;AAAA,QACA,WAAAqe;AAAA,QACA,gBAAAiD;AAAA,MACR,IAAUM,GACEiE,IAAa,MAAMP,GAAqB1D,GAAOva,CAAO;AAI5D,aAAIgX,QAAgBuH,IAAwBtE,EAAe,WAAW,OAAO,SAASsE,EAAsB,eAAejC,IAAwBrC,EAAe,UAAU,QAAQqC,EAAsB,kBACjM,CAAA,IAEF;AAAA,QACL,GAAG5jB,IAAI8lB,EAAW;AAAA,QAClB,GAAG7lB,IAAI6lB,EAAW;AAAA,QAClB,MAAM;AAAA,UACJ,GAAGA;AAAA,UACH,WAAAxH;AAAA,QACV;AAAA,MACA;AAAA,IACI;AAAA,EACJ;AACA,GAOMyH,KAAQ,SAAUze,GAAS;AAC/B,SAAIA,MAAY,WACdA,IAAU,CAAA,IAEL;AAAA,IACL,MAAM;AAAA,IACN,SAAAA;AAAA,IACA,MAAM,GAAGua,GAAO;AACd,YAAM;AAAA,QACJ,GAAA7hB;AAAA,QACA,GAAAC;AAAA,QACA,WAAAqe;AAAA,MACR,IAAUuD,GACE;AAAA,QACJ,UAAUkC,IAAgB;AAAA,QAC1B,WAAWC,IAAiB;AAAA,QAC5B,SAAAgC,IAAU;AAAA,UACR,IAAI,CAAAzF,MAAQ;AACV,gBAAI;AAAA,cACF,GAAAvgB;AAAA,cACA;AAAA,YACd,IAAgBugB;AACJ,mBAAO;AAAA,cACL,GAAAvgB;AAAA,cACA;AAAA,YACd;AAAA,UACU;AAAA,QACV;AAAA,QACQ,GAAGokB;AAAA,MACX,IAAUjG,EAAS7W,GAASua,CAAK,GACrBb,IAAS;AAAA,QACb,GAAAhhB;AAAA,QACA,GAAAC;AAAA,MACR,GACYykB,IAAW,MAAM9C,GAAeC,GAAOuC,CAAqB,GAC5DwB,IAAYhH,EAAYP,EAAQC,CAAS,CAAC,GAC1CqH,IAAWnH,GAAgBoH,CAAS;AAC1C,UAAIK,IAAgBjF,EAAO2E,CAAQ,GAC/BO,IAAiBlF,EAAO4E,CAAS;AACrC,UAAI7B,GAAe;AACjB,cAAMoC,IAAUR,MAAa,MAAM,QAAQ,QACrCS,IAAUT,MAAa,MAAM,WAAW,SACxChI,IAAMsI,IAAgBvB,EAASyB,CAAO,GACtCvI,IAAMqI,IAAgBvB,EAAS0B,CAAO;AAC5C,QAAAH,IAAgB/H,GAAMP,GAAKsI,GAAerI,CAAG;AAAA,MAC/C;AACA,UAAIoG,GAAgB;AAClB,cAAMmC,IAAUP,MAAc,MAAM,QAAQ,QACtCQ,IAAUR,MAAc,MAAM,WAAW,SACzCjI,IAAMuI,IAAiBxB,EAASyB,CAAO,GACvCvI,IAAMsI,IAAiBxB,EAAS0B,CAAO;AAC7C,QAAAF,IAAiBhI,GAAMP,GAAKuI,GAAgBtI,CAAG;AAAA,MACjD;AACA,YAAMyI,IAAgBL,EAAQ,GAAG;AAAA,QAC/B,GAAGnE;AAAA,QACH,CAAC8D,CAAQ,GAAGM;AAAA,QACZ,CAACL,CAAS,GAAGM;AAAA,MACrB,CAAO;AACD,aAAO;AAAA,QACL,GAAGG;AAAA,QACH,MAAM;AAAA,UACJ,GAAGA,EAAc,IAAIrmB;AAAA,UACrB,GAAGqmB,EAAc,IAAIpmB;AAAA,UACrB,SAAS;AAAA,YACP,CAAC0lB,CAAQ,GAAG5B;AAAA,YACZ,CAAC6B,CAAS,GAAG5B;AAAA,UACzB;AAAA,QACA;AAAA,MACA;AAAA,IACI;AAAA,EACJ;AACA;AC93BA,SAASsC,KAAY;AACnB,SAAO,OAAO,SAAW;AAC3B;AACA,SAASC,EAAYC,GAAM;AACzB,SAAIC,GAAOD,CAAI,KACLA,EAAK,YAAY,IAAI,YAAW,IAKnC;AACT;AACA,SAASE,EAAUF,GAAM;AACvB,MAAIG;AACJ,UAAQH,KAAQ,SAASG,IAAsBH,EAAK,kBAAkB,OAAO,SAASG,EAAoB,gBAAgB;AAC5H;AACA,SAASC,EAAmBJ,GAAM;AAChC,MAAIjG;AACJ,UAAQA,KAAQkG,GAAOD,CAAI,IAAIA,EAAK,gBAAgBA,EAAK,aAAa,OAAO,aAAa,OAAO,SAASjG,EAAK;AACjH;AACA,SAASkG,GAAOvrB,GAAO;AACrB,SAAKorB,GAAS,IAGPprB,aAAiB,QAAQA,aAAiBwrB,EAAUxrB,CAAK,EAAE,OAFzD;AAGX;AACA,SAAS2rB,EAAU3rB,GAAO;AACxB,SAAKorB,GAAS,IAGPprB,aAAiB,WAAWA,aAAiBwrB,EAAUxrB,CAAK,EAAE,UAF5D;AAGX;AACA,SAAS4rB,EAAc5rB,GAAO;AAC5B,SAAKorB,GAAS,IAGPprB,aAAiB,eAAeA,aAAiBwrB,EAAUxrB,CAAK,EAAE,cAFhE;AAGX;AACA,SAAS6rB,GAAa7rB,GAAO;AAC3B,SAAI,CAACorB,GAAS,KAAM,OAAO,aAAe,MACjC,KAEFprB,aAAiB,cAAcA,aAAiBwrB,EAAUxrB,CAAK,EAAE;AAC1E;AACA,MAAM8rB,KAA4C,oBAAI,IAAI,CAAC,UAAU,UAAU,CAAC;AAChF,SAASC,GAAkB/W,GAAS;AAClC,QAAM;AAAA,IACJ,UAAAwU;AAAA,IACA,WAAAwC;AAAA,IACA,WAAAC;AAAA,IACA,SAAAC;AAAA,EACJ,IAAMC,EAAiBnX,CAAO;AAC5B,SAAO,kCAAkC,KAAKwU,IAAWyC,IAAYD,CAAS,KAAK,CAACF,GAA6B,IAAII,CAAO;AAC9H;AACA,MAAME,KAA6B,oBAAI,IAAI,CAAC,SAAS,MAAM,IAAI,CAAC;AAChE,SAASC,GAAerX,GAAS;AAC/B,SAAOoX,GAAc,IAAIf,EAAYrW,CAAO,CAAC;AAC/C;AACA,MAAMsX,KAAoB,CAAC,iBAAiB,QAAQ;AACpD,SAASC,GAAWvX,GAAS;AAC3B,SAAOsX,GAAkB,KAAK,CAAAtK,MAAY;AACxC,QAAI;AACF,aAAOhN,EAAQ,QAAQgN,CAAQ;AAAA,IACjC,QAAa;AACX,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;AACA,MAAMwK,KAAsB,CAAC,aAAa,aAAa,SAAS,UAAU,aAAa,GACjFC,KAAmB,CAAC,aAAa,aAAa,SAAS,UAAU,eAAe,QAAQ,GACxFC,KAAgB,CAAC,SAAS,UAAU,UAAU,SAAS;AAC7D,SAASC,GAAkBC,GAAc;AACvC,QAAMC,IAASC,GAAQ,GACjBC,IAAMpB,EAAUiB,CAAY,IAAIT,EAAiBS,CAAY,IAAIA;AAIvE,SAAOJ,GAAoB,KAAK,CAAAxsB,MAAS+sB,EAAI/sB,CAAK,IAAI+sB,EAAI/sB,CAAK,MAAM,SAAS,EAAK,MAAM+sB,EAAI,gBAAgBA,EAAI,kBAAkB,WAAW,OAAU,CAACF,MAAWE,EAAI,iBAAiBA,EAAI,mBAAmB,SAAS,OAAU,CAACF,MAAWE,EAAI,SAASA,EAAI,WAAW,SAAS,OAAUN,GAAiB,KAAK,CAAAzsB,OAAU+sB,EAAI,cAAc,IAAI,SAAS/sB,CAAK,CAAC,KAAK0sB,GAAc,KAAK,CAAA1sB,OAAU+sB,EAAI,WAAW,IAAI,SAAS/sB,CAAK,CAAC;AACza;AACA,SAASgtB,GAAmBhY,GAAS;AACnC,MAAIiY,IAAcC,EAAclY,CAAO;AACvC,SAAO4W,EAAcqB,CAAW,KAAK,CAACE,EAAsBF,CAAW,KAAG;AACxE,QAAIN,GAAkBM,CAAW;AAC/B,aAAOA;AACF,QAAIV,GAAWU,CAAW;AAC/B,aAAO;AAET,IAAAA,IAAcC,EAAcD,CAAW;AAAA,EACzC;AACA,SAAO;AACT;AACA,SAASH,KAAW;AAClB,SAAI,OAAO,MAAQ,OAAe,CAAC,IAAI,WAAiB,KACjD,IAAI,SAAS,2BAA2B,MAAM;AACvD;AACA,MAAMM,KAAwC,oBAAI,IAAI,CAAC,QAAQ,QAAQ,WAAW,CAAC;AACnF,SAASD,EAAsB7B,GAAM;AACnC,SAAO8B,GAAyB,IAAI/B,EAAYC,CAAI,CAAC;AACvD;AACA,SAASa,EAAiBnX,GAAS;AACjC,SAAOwW,EAAUxW,CAAO,EAAE,iBAAiBA,CAAO;AACpD;AACA,SAASqY,GAAcrY,GAAS;AAC9B,SAAI2W,EAAU3W,CAAO,IACZ;AAAA,IACL,YAAYA,EAAQ;AAAA,IACpB,WAAWA,EAAQ;AAAA,EACzB,IAES;AAAA,IACL,YAAYA,EAAQ;AAAA,IACpB,WAAWA,EAAQ;AAAA,EACvB;AACA;AACA,SAASkY,EAAc5B,GAAM;AAC3B,MAAID,EAAYC,CAAI,MAAM;AACxB,WAAOA;AAET,QAAMgC;AAAA;AAAA,IAENhC,EAAK;AAAA,IAELA,EAAK;AAAA,IAELO,GAAaP,CAAI,KAAKA,EAAK;AAAA,IAE3BI,EAAmBJ,CAAI;AAAA;AACvB,SAAOO,GAAayB,CAAM,IAAIA,EAAO,OAAOA;AAC9C;AACA,SAASC,GAA2BjC,GAAM;AACxC,QAAMkC,IAAaN,EAAc5B,CAAI;AACrC,SAAI6B,EAAsBK,CAAU,IAC3BlC,EAAK,gBAAgBA,EAAK,cAAc,OAAOA,EAAK,OAEzDM,EAAc4B,CAAU,KAAKzB,GAAkByB,CAAU,IACpDA,IAEFD,GAA2BC,CAAU;AAC9C;AACA,SAASC,GAAqBnC,GAAMjoB,GAAMqqB,GAAiB;AACzD,MAAIC;AACJ,EAAItqB,MAAS,WACXA,IAAO,CAAA;AAKT,QAAMuqB,IAAqBL,GAA2BjC,CAAI,GACpDuC,IAASD,QAAyBD,IAAuBrC,EAAK,kBAAkB,OAAO,SAASqC,EAAqB,OACrHG,IAAMtC,EAAUoC,CAAkB;AACxC,SAAIC,KACmBE,GAAgBD,CAAG,GACjCzqB,EAAK,OAAOyqB,GAAKA,EAAI,kBAAkB,IAAI/B,GAAkB6B,CAAkB,IAAIA,IAAqB,CAAA,GAA2E,CAAA,CAAE,KAEvLvqB,EAAK,OAAOuqB,GAAoBH,GAAqBG,GAAoB,CAAA,CAAmB,CAAC;AACtG;AACA,SAASG,GAAgBD,GAAK;AAC5B,SAAOA,EAAI,UAAU,OAAO,eAAeA,EAAI,MAAM,IAAIA,EAAI,eAAe;AAC9E;ACzJA,SAASE,GAAiBhZ,GAAS;AACjC,QAAM+X,IAAMZ,EAAiBnX,CAAO;AAGpC,MAAIhQ,IAAQ,WAAW+nB,EAAI,KAAK,KAAK,GACjC9nB,IAAS,WAAW8nB,EAAI,MAAM,KAAK;AACvC,QAAMkB,IAAYrC,EAAc5W,CAAO,GACjCzP,IAAc0oB,IAAYjZ,EAAQ,cAAchQ,GAChDU,IAAeuoB,IAAYjZ,EAAQ,eAAe/P,GAClDipB,IAAiBvL,GAAM3d,CAAK,MAAMO,KAAeod,GAAM1d,CAAM,MAAMS;AACzE,SAAIwoB,MACFlpB,IAAQO,GACRN,IAASS,IAEJ;AAAA,IACL,OAAAV;AAAA,IACA,QAAAC;AAAA,IACA,GAAGipB;AAAA,EACP;AACA;AAEA,SAASC,GAAcnZ,GAAS;AAC9B,SAAQ2W,EAAU3W,CAAO,IAA6BA,IAAzBA,EAAQ;AACvC;AAEA,SAASoZ,EAASpZ,GAAS;AACzB,QAAMqZ,IAAaF,GAAcnZ,CAAO;AACxC,MAAI,CAAC4W,EAAcyC,CAAU;AAC3B,WAAOzL,EAAa,CAAC;AAEvB,QAAMuC,IAAOkJ,EAAW,sBAAqB,GACvC;AAAA,IACJ,OAAArpB;AAAA,IACA,QAAAC;AAAA,IACA,GAAAqpB;AAAA,EACJ,IAAMN,GAAiBK,CAAU;AAC/B,MAAIvpB,KAAKwpB,IAAI3L,GAAMwC,EAAK,KAAK,IAAIA,EAAK,SAASngB,GAC3CD,KAAKupB,IAAI3L,GAAMwC,EAAK,MAAM,IAAIA,EAAK,UAAUlgB;AAIjD,UAAI,CAACH,KAAK,CAAC,OAAO,SAASA,CAAC,OAC1BA,IAAI,KAEF,CAACC,KAAK,CAAC,OAAO,SAASA,CAAC,OAC1BA,IAAI,IAEC;AAAA,IACL,GAAAD;AAAA,IACA,GAAAC;AAAA,EACJ;AACA;AAEA,MAAMwpB,KAAyB,gBAAA3L,EAAa,CAAC;AAC7C,SAAS4L,GAAiBxZ,GAAS;AACjC,QAAM8Y,IAAMtC,EAAUxW,CAAO;AAC7B,SAAI,CAAC8X,GAAQ,KAAM,CAACgB,EAAI,iBACfS,KAEF;AAAA,IACL,GAAGT,EAAI,eAAe;AAAA,IACtB,GAAGA,EAAI,eAAe;AAAA,EAC1B;AACA;AACA,SAASW,GAAuBzZ,GAAS0Z,GAASC,GAAsB;AAItE,SAHID,MAAY,WACdA,IAAU,KAER,CAACC,KAAwBD,KAAWC,MAAyBnD,EAAUxW,CAAO,IACzE,KAEF0Z;AACT;AAEA,SAASE,EAAsB5Z,GAAS6Z,GAAcC,GAAiB1H,GAAc;AACnF,EAAIyH,MAAiB,WACnBA,IAAe,KAEbC,MAAoB,WACtBA,IAAkB;AAEpB,QAAMC,IAAa/Z,EAAQ,sBAAqB,GAC1CqZ,IAAaF,GAAcnZ,CAAO;AACxC,MAAIga,IAAQpM,EAAa,CAAC;AAC1B,EAAIiM,MACEzH,IACEuE,EAAUvE,CAAY,MACxB4H,IAAQZ,EAAShH,CAAY,KAG/B4H,IAAQZ,EAASpZ,CAAO;AAG5B,QAAMia,IAAgBR,GAAuBJ,GAAYS,GAAiB1H,CAAY,IAAIoH,GAAiBH,CAAU,IAAIzL,EAAa,CAAC;AACvI,MAAI9d,KAAKiqB,EAAW,OAAOE,EAAc,KAAKD,EAAM,GAChDjqB,KAAKgqB,EAAW,MAAME,EAAc,KAAKD,EAAM,GAC/ChqB,IAAQ+pB,EAAW,QAAQC,EAAM,GACjC/pB,IAAS8pB,EAAW,SAASC,EAAM;AACvC,MAAIX,GAAY;AACd,UAAMP,IAAMtC,EAAU6C,CAAU,GAC1Ba,IAAY9H,KAAgBuE,EAAUvE,CAAY,IAAIoE,EAAUpE,CAAY,IAAIA;AACtF,QAAI+H,IAAarB,GACbsB,IAAgBrB,GAAgBoB,CAAU;AAC9C,WAAOC,KAAiBhI,KAAgB8H,MAAcC,KAAY;AAChE,YAAME,IAAcjB,EAASgB,CAAa,GACpCE,IAAaF,EAAc,sBAAqB,GAChDrC,IAAMZ,EAAiBiD,CAAa,GACpC/kB,IAAOilB,EAAW,QAAQF,EAAc,aAAa,WAAWrC,EAAI,WAAW,KAAKsC,EAAY,GAChG/kB,IAAMglB,EAAW,OAAOF,EAAc,YAAY,WAAWrC,EAAI,UAAU,KAAKsC,EAAY;AAClG,MAAAvqB,KAAKuqB,EAAY,GACjBtqB,KAAKsqB,EAAY,GACjBrqB,KAASqqB,EAAY,GACrBpqB,KAAUoqB,EAAY,GACtBvqB,KAAKuF,GACLtF,KAAKuF,GACL6kB,IAAa3D,EAAU4D,CAAa,GACpCA,IAAgBrB,GAAgBoB,CAAU;AAAA,IAC5C;AAAA,EACF;AACA,SAAOjK,GAAiB;AAAA,IACtB,OAAAlgB;AAAA,IACA,QAAAC;AAAA,IACA,GAAAH;AAAA,IACA,GAAAC;AAAA,EACJ,CAAG;AACH;AAIA,SAASwqB,GAAoBva,GAASmQ,GAAM;AAC1C,QAAMqK,IAAanC,GAAcrY,CAAO,EAAE;AAC1C,SAAKmQ,IAGEA,EAAK,OAAOqK,IAFVZ,EAAsBlD,EAAmB1W,CAAO,CAAC,EAAE,OAAOwa;AAGrE;AAEA,SAASC,GAAcC,GAAiB9X,GAAQ+X,GAAkB;AAChE,EAAIA,MAAqB,WACvBA,IAAmB;AAErB,QAAMC,IAAWF,EAAgB,sBAAqB,GAChD5qB,IAAI8qB,EAAS,OAAOhY,EAAO,cAAc+X,IAAmB;AAAA;AAAA,IAElEJ,GAAoBG,GAAiBE,CAAQ;AAAA,MACvC7qB,IAAI6qB,EAAS,MAAMhY,EAAO;AAChC,SAAO;AAAA,IACL,GAAA9S;AAAA,IACA,GAAAC;AAAA,EACJ;AACA;AAEA,SAAS8qB,GAAsDxK,GAAM;AACnE,MAAI;AAAA,IACF,UAAAwB;AAAA,IACA,MAAA1B;AAAA,IACA,cAAAiC;AAAA,IACA,UAAApB;AAAA,EACJ,IAAMX;AACJ,QAAMqJ,IAAU1I,MAAa,SACvB0J,IAAkBhE,EAAmBtE,CAAY,GACjD0I,IAAWjJ,IAAW0F,GAAW1F,EAAS,QAAQ,IAAI;AAC5D,MAAIO,MAAiBsI,KAAmBI,KAAYpB;AAClD,WAAOvJ;AAET,MAAIvN,IAAS;AAAA,IACX,YAAY;AAAA,IACZ,WAAW;AAAA,EACf,GACMoX,IAAQpM,EAAa,CAAC;AAC1B,QAAMmN,IAAUnN,EAAa,CAAC,GACxBoN,IAA0BpE,EAAcxE,CAAY;AAC1D,OAAI4I,KAA2B,CAACA,KAA2B,CAACtB,QACtDrD,EAAYjE,CAAY,MAAM,UAAU2E,GAAkB2D,CAAe,OAC3E9X,IAASyV,GAAcjG,CAAY,IAEjCwE,EAAcxE,CAAY,IAAG;AAC/B,UAAM6I,IAAarB,EAAsBxH,CAAY;AACrD,IAAA4H,IAAQZ,EAAShH,CAAY,GAC7B2I,EAAQ,IAAIE,EAAW,IAAI7I,EAAa,YACxC2I,EAAQ,IAAIE,EAAW,IAAI7I,EAAa;AAAA,EAC1C;AAEF,QAAM8I,IAAaR,KAAmB,CAACM,KAA2B,CAACtB,IAAUe,GAAcC,GAAiB9X,GAAQ,EAAI,IAAIgL,EAAa,CAAC;AAC1I,SAAO;AAAA,IACL,OAAOuC,EAAK,QAAQ6J,EAAM;AAAA,IAC1B,QAAQ7J,EAAK,SAAS6J,EAAM;AAAA,IAC5B,GAAG7J,EAAK,IAAI6J,EAAM,IAAIpX,EAAO,aAAaoX,EAAM,IAAIe,EAAQ,IAAIG,EAAW;AAAA,IAC3E,GAAG/K,EAAK,IAAI6J,EAAM,IAAIpX,EAAO,YAAYoX,EAAM,IAAIe,EAAQ,IAAIG,EAAW;AAAA,EAC9E;AACA;AAEA,SAASC,GAAenb,GAAS;AAC/B,SAAO,MAAM,KAAKA,EAAQ,eAAc,CAAE;AAC5C;AAIA,SAASob,GAAgBpb,GAAS;AAChC,QAAMqb,IAAO3E,EAAmB1W,CAAO,GACjC4C,IAASyV,GAAcrY,CAAO,GAC9BoD,IAAOpD,EAAQ,cAAc,MAC7BhQ,IAAQ0d,EAAI2N,EAAK,aAAaA,EAAK,aAAajY,EAAK,aAAaA,EAAK,WAAW,GAClFnT,IAASyd,EAAI2N,EAAK,cAAcA,EAAK,cAAcjY,EAAK,cAAcA,EAAK,YAAY;AAC7F,MAAItT,IAAI,CAAC8S,EAAO,aAAa2X,GAAoBva,CAAO;AACxD,QAAMjQ,IAAI,CAAC6S,EAAO;AAClB,SAAIuU,EAAiB/T,CAAI,EAAE,cAAc,UACvCtT,KAAK4d,EAAI2N,EAAK,aAAajY,EAAK,WAAW,IAAIpT,IAE1C;AAAA,IACL,OAAAA;AAAA,IACA,QAAAC;AAAA,IACA,GAAAH;AAAA,IACA,GAAAC;AAAA,EACJ;AACA;AAEA,SAASurB,GAAgBtb,GAASgR,GAAU;AAC1C,QAAM8H,IAAMtC,EAAUxW,CAAO,GACvBqb,IAAO3E,EAAmB1W,CAAO,GACjCub,IAAiBzC,EAAI;AAC3B,MAAI9oB,IAAQqrB,EAAK,aACbprB,IAASorB,EAAK,cACdvrB,IAAI,GACJC,IAAI;AACR,MAAIwrB,GAAgB;AAClB,IAAAvrB,IAAQurB,EAAe,OACvBtrB,IAASsrB,EAAe;AACxB,UAAMC,IAAsB1D,GAAQ;AACpC,KAAI,CAAC0D,KAAuBA,KAAuBxK,MAAa,aAC9DlhB,IAAIyrB,EAAe,YACnBxrB,IAAIwrB,EAAe;AAAA,EAEvB;AACA,SAAO;AAAA,IACL,OAAAvrB;AAAA,IACA,QAAAC;AAAA,IACA,GAAAH;AAAA,IACA,GAAAC;AAAA,EACJ;AACA;AAEA,MAAM0rB,KAA+B,oBAAI,IAAI,CAAC,YAAY,OAAO,CAAC;AAElE,SAASC,GAA2B1b,GAASgR,GAAU;AACrD,QAAM+I,IAAaH,EAAsB5Z,GAAS,IAAMgR,MAAa,OAAO,GACtE1b,IAAMykB,EAAW,MAAM/Z,EAAQ,WAC/B3K,IAAO0kB,EAAW,OAAO/Z,EAAQ,YACjCga,IAAQpD,EAAc5W,CAAO,IAAIoZ,EAASpZ,CAAO,IAAI4N,EAAa,CAAC,GACnE5d,IAAQgQ,EAAQ,cAAcga,EAAM,GACpC/pB,IAAS+P,EAAQ,eAAega,EAAM,GACtClqB,IAAIuF,IAAO2kB,EAAM,GACjBjqB,IAAIuF,IAAM0kB,EAAM;AACtB,SAAO;AAAA,IACL,OAAAhqB;AAAA,IACA,QAAAC;AAAA,IACA,GAAAH;AAAA,IACA,GAAAC;AAAA,EACJ;AACA;AACA,SAAS4rB,GAAkC3b,GAAS4b,GAAkB5K,GAAU;AAC9E,MAAIb;AACJ,MAAIyL,MAAqB;AACvB,IAAAzL,IAAOmL,GAAgBtb,GAASgR,CAAQ;AAAA,WAC/B4K,MAAqB;AAC9B,IAAAzL,IAAOiL,GAAgB1E,EAAmB1W,CAAO,CAAC;AAAA,WACzC2W,EAAUiF,CAAgB;AACnC,IAAAzL,IAAOuL,GAA2BE,GAAkB5K,CAAQ;AAAA,OACvD;AACL,UAAMiJ,IAAgBT,GAAiBxZ,CAAO;AAC9C,IAAAmQ,IAAO;AAAA,MACL,GAAGyL,EAAiB,IAAI3B,EAAc;AAAA,MACtC,GAAG2B,EAAiB,IAAI3B,EAAc;AAAA,MACtC,OAAO2B,EAAiB;AAAA,MACxB,QAAQA,EAAiB;AAAA,IAC/B;AAAA,EACE;AACA,SAAO1L,GAAiBC,CAAI;AAC9B;AACA,SAAS0L,GAAyB7b,GAAS8b,GAAU;AACnD,QAAMtD,IAAaN,EAAclY,CAAO;AACxC,SAAIwY,MAAesD,KAAY,CAACnF,EAAU6B,CAAU,KAAKL,EAAsBK,CAAU,IAChF,KAEFrB,EAAiBqB,CAAU,EAAE,aAAa,WAAWqD,GAAyBrD,GAAYsD,CAAQ;AAC3G;AAKA,SAASC,GAA4B/b,GAASgc,GAAO;AACnD,QAAMC,IAAeD,EAAM,IAAIhc,CAAO;AACtC,MAAIic;AACF,WAAOA;AAET,MAAI3D,IAASG,GAAqBzY,GAAS,CAAA,CAAS,EAAE,OAAO,CAAArQ,MAAMgnB,EAAUhnB,CAAE,KAAK0mB,EAAY1mB,CAAE,MAAM,MAAM,GAC1GusB,IAAsC;AAC1C,QAAMC,IAAiBhF,EAAiBnX,CAAO,EAAE,aAAa;AAC9D,MAAIiY,IAAckE,IAAiBjE,EAAclY,CAAO,IAAIA;AAG5D,SAAO2W,EAAUsB,CAAW,KAAK,CAACE,EAAsBF,CAAW,KAAG;AACpE,UAAMmE,IAAgBjF,EAAiBc,CAAW,GAC5CoE,IAA0B1E,GAAkBM,CAAW;AAC7D,IAAI,CAACoE,KAA2BD,EAAc,aAAa,YACzDF,IAAsC,QAEVC,IAAiB,CAACE,KAA2B,CAACH,IAAsC,CAACG,KAA2BD,EAAc,aAAa,YAAY,CAAC,CAACF,KAAuCT,GAAgB,IAAIS,EAAoC,QAAQ,KAAKnF,GAAkBkB,CAAW,KAAK,CAACoE,KAA2BR,GAAyB7b,GAASiY,CAAW,KAG5YK,IAASA,EAAO,OAAO,CAAAgE,MAAYA,MAAarE,CAAW,IAG3DiE,IAAsCE,GAExCnE,IAAcC,EAAcD,CAAW;AAAA,EACzC;AACA,SAAA+D,EAAM,IAAIhc,GAASsY,CAAM,GAClBA;AACT;AAIA,SAASiE,GAAgBlM,GAAM;AAC7B,MAAI;AAAA,IACF,SAAArQ;AAAA,IACA,UAAA8R;AAAA,IACA,cAAAC;AAAA,IACA,UAAAf;AAAA,EACJ,IAAMX;AAEJ,QAAMmM,IAAoB,CAAC,GADM1K,MAAa,sBAAsByF,GAAWvX,CAAO,IAAI,CAAA,IAAK+b,GAA4B/b,GAAS,KAAK,EAAE,IAAI,CAAA,EAAG,OAAO8R,CAAQ,GACzGC,CAAY,GAC9D0K,IAAwBD,EAAkB,CAAC,GAC3CE,IAAeF,EAAkB,OAAO,CAACG,GAASf,MAAqB;AAC3E,UAAMzL,IAAOwL,GAAkC3b,GAAS4b,GAAkB5K,CAAQ;AAClF,WAAA2L,EAAQ,MAAMjP,EAAIyC,EAAK,KAAKwM,EAAQ,GAAG,GACvCA,EAAQ,QAAQlP,EAAI0C,EAAK,OAAOwM,EAAQ,KAAK,GAC7CA,EAAQ,SAASlP,EAAI0C,EAAK,QAAQwM,EAAQ,MAAM,GAChDA,EAAQ,OAAOjP,EAAIyC,EAAK,MAAMwM,EAAQ,IAAI,GACnCA;AAAA,EACT,GAAGhB,GAAkC3b,GAASyc,GAAuBzL,CAAQ,CAAC;AAC9E,SAAO;AAAA,IACL,OAAO0L,EAAa,QAAQA,EAAa;AAAA,IACzC,QAAQA,EAAa,SAASA,EAAa;AAAA,IAC3C,GAAGA,EAAa;AAAA,IAChB,GAAGA,EAAa;AAAA,EACpB;AACA;AAEA,SAASE,GAAc5c,GAAS;AAC9B,QAAM;AAAA,IACJ,OAAAhQ;AAAA,IACA,QAAAC;AAAA,EACJ,IAAM+oB,GAAiBhZ,CAAO;AAC5B,SAAO;AAAA,IACL,OAAAhQ;AAAA,IACA,QAAAC;AAAA,EACJ;AACA;AAEA,SAAS4sB,GAA8B7c,GAASoS,GAAcpB,GAAU;AACtE,QAAMgK,IAA0BpE,EAAcxE,CAAY,GACpDsI,IAAkBhE,EAAmBtE,CAAY,GACjDsH,IAAU1I,MAAa,SACvBb,IAAOyJ,EAAsB5Z,GAAS,IAAM0Z,GAAStH,CAAY;AACvE,MAAIxP,IAAS;AAAA,IACX,YAAY;AAAA,IACZ,WAAW;AAAA,EACf;AACE,QAAMmY,IAAUnN,EAAa,CAAC;AAI9B,WAASkP,IAA4B;AACnC,IAAA/B,EAAQ,IAAIR,GAAoBG,CAAe;AAAA,EACjD;AACA,MAAIM,KAA2B,CAACA,KAA2B,CAACtB;AAI1D,SAHIrD,EAAYjE,CAAY,MAAM,UAAU2E,GAAkB2D,CAAe,OAC3E9X,IAASyV,GAAcjG,CAAY,IAEjC4I,GAAyB;AAC3B,YAAMC,IAAarB,EAAsBxH,GAAc,IAAMsH,GAAStH,CAAY;AAClF,MAAA2I,EAAQ,IAAIE,EAAW,IAAI7I,EAAa,YACxC2I,EAAQ,IAAIE,EAAW,IAAI7I,EAAa;AAAA,IAC1C,MAAO,CAAIsI,KACToC,EAAyB;AAG7B,EAAIpD,KAAW,CAACsB,KAA2BN,KACzCoC,EAAyB;AAE3B,QAAM5B,IAAaR,KAAmB,CAACM,KAA2B,CAACtB,IAAUe,GAAcC,GAAiB9X,CAAM,IAAIgL,EAAa,CAAC,GAC9H9d,IAAIqgB,EAAK,OAAOvN,EAAO,aAAamY,EAAQ,IAAIG,EAAW,GAC3DnrB,IAAIogB,EAAK,MAAMvN,EAAO,YAAYmY,EAAQ,IAAIG,EAAW;AAC/D,SAAO;AAAA,IACL,GAAAprB;AAAA,IACA,GAAAC;AAAA,IACA,OAAOogB,EAAK;AAAA,IACZ,QAAQA,EAAK;AAAA,EACjB;AACA;AAEA,SAAS4M,GAAmB/c,GAAS;AACnC,SAAOmX,EAAiBnX,CAAO,EAAE,aAAa;AAChD;AAEA,SAASgd,GAAoBhd,GAASid,GAAU;AAC9C,MAAI,CAACrG,EAAc5W,CAAO,KAAKmX,EAAiBnX,CAAO,EAAE,aAAa;AACpE,WAAO;AAET,MAAIid;AACF,WAAOA,EAASjd,CAAO;AAEzB,MAAIkd,IAAkBld,EAAQ;AAM9B,SAAI0W,EAAmB1W,CAAO,MAAMkd,MAClCA,IAAkBA,EAAgB,cAAc,OAE3CA;AACT;AAIA,SAASC,GAAgBnd,GAASid,GAAU;AAC1C,QAAMnE,IAAMtC,EAAUxW,CAAO;AAC7B,MAAIuX,GAAWvX,CAAO;AACpB,WAAO8Y;AAET,MAAI,CAAClC,EAAc5W,CAAO,GAAG;AAC3B,QAAIod,IAAkBlF,EAAclY,CAAO;AAC3C,WAAOod,KAAmB,CAACjF,EAAsBiF,CAAe,KAAG;AACjE,UAAIzG,EAAUyG,CAAe,KAAK,CAACL,GAAmBK,CAAe;AACnE,eAAOA;AAET,MAAAA,IAAkBlF,EAAckF,CAAe;AAAA,IACjD;AACA,WAAOtE;AAAA,EACT;AACA,MAAI1G,IAAe4K,GAAoBhd,GAASid,CAAQ;AACxD,SAAO7K,KAAgBiF,GAAejF,CAAY,KAAK2K,GAAmB3K,CAAY;AACpF,IAAAA,IAAe4K,GAAoB5K,GAAc6K,CAAQ;AAE3D,SAAI7K,KAAgB+F,EAAsB/F,CAAY,KAAK2K,GAAmB3K,CAAY,KAAK,CAACuF,GAAkBvF,CAAY,IACrH0G,IAEF1G,KAAgB4F,GAAmBhY,CAAO,KAAK8Y;AACxD;AAEA,MAAMuE,KAAkB,eAAgBpxB,GAAM;AAC5C,QAAMqxB,IAAoB,KAAK,mBAAmBH,IAC5CI,IAAkB,KAAK,eACvBC,IAAqB,MAAMD,EAAgBtxB,EAAK,QAAQ;AAC9D,SAAO;AAAA,IACL,WAAW4wB,GAA8B5wB,EAAK,WAAW,MAAMqxB,EAAkBrxB,EAAK,QAAQ,GAAGA,EAAK,QAAQ;AAAA,IAC9G,UAAU;AAAA,MACR,GAAG;AAAA,MACH,GAAG;AAAA,MACH,OAAOuxB,EAAmB;AAAA,MAC1B,QAAQA,EAAmB;AAAA,IACjC;AAAA,EACA;AACA;AAEA,SAASC,GAAMzd,GAAS;AACtB,SAAOmX,EAAiBnX,CAAO,EAAE,cAAc;AACjD;AAEA,MAAMkR,KAAW;AAAA,EACf,uDAAA2J;AAAA,EACA,oBAAAnE;AAAA,EACA,iBAAA6F;AAAA,EACA,iBAAAY;AAAA,EACA,iBAAAE;AAAA,EACA,gBAAAlC;AAAA,EACA,eAAAyB;AAAA,EACA,UAAAxD;AAAA,EACA,WAAAzC;AAAA,EACA,OAAA8G;AACF,GA8LMvnB,KAASwnB,IAeT7H,KAAQ8H,IAQRlK,KAAOmK,IAsBPrL,KAAQsL,IAkBR9M,KAAkB,CAACT,GAAWC,GAAUnZ,MAAY;AAIxD,QAAM4kB,IAAQ,oBAAI,IAAG,GACf8B,IAAgB;AAAA,IACpB,UAAA5M;AAAA,IACA,GAAG9Z;AAAA,EACP,GACQ2mB,IAAoB;AAAA,IACxB,GAAGD,EAAc;AAAA,IACjB,IAAI9B;AAAA,EACR;AACE,SAAOgC,GAAkB1N,GAAWC,GAAU;AAAA,IAC5C,GAAGuN;AAAA,IACH,UAAUC;AAAA,EACd,CAAG;AACH;AClvBA,IAAAE,KAAA,MAA6B;AAAA,EAMzB,YAAYpuB,GAAc;AALlB,IAAAtF,EAAA;AACA,IAAAA,EAAA,gBAAS;AACT,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAEJ,SAAK,MAAMsF;AACX,UAAM,EAAE,kBAAAquB,GAAkB,oBAAAC,GAAoB,gBAAAC,GAAgB,sBAAAC,GAAsB,YAAAC,EAAA,IAChF,KAAK,IAAI;AACb,SAAK,YAAY,SAAS,cAAc,KAAK,GAC7C,KAAK,UAAU,SAAS,cAAc,KAAK,GAC3C,KAAK,aAAa,SAAS,cAAc,KAAK,GAC9C,KAAK,WAAW,YAAY,GAAGA,CAAU,YACzC,KAAK,UAAU,YAAY,GAAGA,CAAU,oBACxC,KAAK,QAAQ,YAAY,GAAGA,CAAU;AACtC,UAAMC,IAAgB;AAAA,MAClB,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAYL;AAAA,MACZ,OAAOC;AAAA,MACP,WAAW;AAAA,MACX,QAAQC;AAAA,MACR,SAAS;AAAA,MACT,cAAc;AAAA,MACd,UAAU;AAAA,MACV,GAAGC;AAAA,IAAA,GAEDG,IAAa;AAAA,MACf,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,YAAYD,EAAc;AAAA,MAC1B,iBAAiBA,EAAc;AAAA,MAC/B,WAAW;AAAA,MACX,QAAQA,EAAc;AAAA,IAAA;AAE1B,WAAO,OAAO,KAAK,QAAQ,OAAOC,CAAU,GAC5C,OAAO,OAAO,KAAK,WAAW,OAAOD,CAAa,GAClD,KAAK,WAAW,YAAY,KAAK,SAAS,GAC1C,KAAK,WAAW,YAAY,KAAK,OAAO,GACxC,KAAK,IAAI,iBAAiB,YAAY,KAAK,UAAU,GACrD,KAAK,KAAA;AAAA,EACT;AAAA,EACQ,OAAO;AACX,SAAK,WAAW,iBAAiB,cAAc,MAAM;AACjD,WAAK,KAAA;AAAA,IACT,CAAC,GACD,KAAK,IAAI,GAAG,YAAY,CAACxhB,MAAM;AAC3B,MAAI,KAAK,WAAW,SAASA,EAAE,aAAqB,KAGpD,KAAK,KAAA;AAAA,IACT,CAAC,GACD,KAAK,IAAI,GAAG,YAAY,MAAM;AAC1B,WAAK,KAAA;AAAA,IACT,CAAC,GACD,KAAK,IAAI,GAAG,aAAa,MAAM;AAC3B,WAAK,KAAA;AAAA,IACT,CAAC,GACD,KAAK,IAAI,GAAG,0BAA0B,CAAC/C,GAAM,MAAM;AAE/C,MADiB,KAAK,WAAW,SAAS,EAAE,MAAM,MAK9CA,EAAK,YAAYA,EAAK,YACtB,KAAK,KAAKA,CAAI;AAAA,IAEtB,CAAC,GACD,KAAK,IAAI,GAAG,yBAAyB,CAACY,GAAG,MAAM;AAE3C,MADiB,KAAK,WAAW,SAAS,EAAE,MAAM,KAIlD,KAAK,KAAA;AAAA,IACT,CAAC,GACD,KAAK,IAAI,GAAG,wBAAwB,CAACA,GAAG,MAAM;AAE1C,MADiB,KAAK,WAAW,SAAS,EAAE,MAAM,KAIlD,KAAK,KAAA;AAAA,IACT,CAAC,GACD,KAAK,IAAI,GAAG,yBAAyB,CAACZ,GAAM,MAAM;AAE9C,MADiB,KAAK,WAAW,SAAS,EAAE,MAAM,KAI9CA,EAAK,YACL,KAAK,KAAKA,CAAI;AAAA,IAEtB,CAAC;AAAA,EACL;AAAA,EACQ,KAAKA,GAAY;AAMrB,QAJI,CAACA,EAAK,uBAIN,KAAK,IAAI;AACT;AAEJ,SAAK,WAAW,MAAM,UAAU;AAChC,QAAIrD,IAAOqD,EAAK,QAAA;AAEhB,IAAIA,EAAK,YACLrD,IAAOqD,EAAK;AAEhB,UAAMykB,IAAa,KAAK,IAAI,iBAAiB,sBAAA;AAC7C,QAAI,CAACA;AACD;AAEJ,SAAK,SAAS,IAEd,KAAK,UAAU,MAAM,WAAW,GAAGzkB,EAAK,2BAA2B,GAAG,MACtE,KAAK,UAAU,MAAM,WAAW,SAChC,KAAK,UAAU,MAAM,QAAQ,QAC7B,KAAK,UAAU,MAAM,UAAU,gBAC/B,KAAK,UAAU,MAAM,YAAY,aACjC,KAAK,UAAU,MAAM,aAAa,OAClC,KAAK,UAAU,YAAYrD;AAC3B,UAAM+nB,IAAQ1kB,EAAK,QAAQykB,EAAW,GAChCE,IAAQ3kB,EAAK,QAAQykB,EAAW;AAiBtC,IAAA1N,GAfkB;AAAA,MACd,wBAAwB;AACpB,eAAO;AAAA,UACH,OAAO/W,EAAK;AAAA,UACZ,QAAQA,EAAK;AAAA,UACb,GAAG0kB;AAAA,UACH,GAAGC;AAAA,UACH,MAAMD;AAAA,UACN,OAAOA,IAAQ1kB,EAAK;AAAA,UACpB,KAAK2kB;AAAA,UACL,QAAQA,IAAQ3kB,EAAK;AAAA,QAAA;AAAA,MAE7B;AAAA,IAAA,GAGuB,KAAK,YAAY;AAAA,MACxC,WAAWA,EAAK;AAAA,MAChB,YAAY,CAAC6b,MAASpC,MAAQvd,GAAO,CAAC,GAAGqc,GAAM,EAAE,SAAS,KAAK,QAAA,CAAS,CAAC;AAAA,IAAA,CAC5E,EAAE,KAAK,CAACpkB,MAAQ;AACb,YAAM,EAAE,GAAA2B,GAAG,GAAAC,GAAG,WAAAqe,GAAW,gBAAAiD,MAAmBljB;AAK5C,UAJA,OAAO,OAAO,KAAK,WAAW,OAAO;AAAA,QACjC,KAAK,GAAG4B,CAAC;AAAA,QACT,MAAM,GAAGD,CAAC;AAAA,MAAA,CACb,GACGuhB,EAAe,OAAO;AACtB,cAAMkB,IAAQlB,EAAe;AAC7B,QAAI,CAAC,QAAQ,cAAc,UAAU,EAAE,SAASjD,CAAS,IACrD,OAAO,OAAO,KAAK,QAAQ,OAAO;AAAA,UAC9B,KAAK,GAAGmE,EAAM,CAAC;AAAA,UACf,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,OAAO;AAAA,QAAA,CACV,IACM,CAAC,SAAS,eAAe,WAAW,EAAE,SAASnE,CAAS,IAC/D,OAAO,OAAO,KAAK,QAAQ,OAAO;AAAA,UAC9B,KAAK,GAAGmE,EAAM,CAAC;AAAA,UACf,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,OAAO;AAAA,QAAA,CACV,IACM,CAAC,UAAU,gBAAgB,YAAY,EAAE,SAASnE,CAAS,IAClE,OAAO,OAAO,KAAK,QAAQ,OAAO;AAAA,UAC9B,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,MAAM,GAAGmE,EAAM,CAAC;AAAA,UAChB,OAAO;AAAA,QAAA,CACV,IACM,CAAC,OAAO,aAAa,SAAS,EAAE,SAASnE,CAAS,KACzD,OAAO,OAAO,KAAK,QAAQ,OAAO;AAAA,UAC9B,KAAK;AAAA,UACL,QAAQ;AAAA,UACR,MAAM,GAAGmE,EAAM,CAAC;AAAA,UAChB,OAAO;AAAA,QAAA,CACV;AAAA,MAET;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EACA,OAAO;AACH,IAAK,KAAK,WAGV,KAAK,SAAS,IACd,KAAK,WAAW,MAAM,UAAU;AAAA,EACpC;AAAA,EACA,UAAU;AACN,SAAK,UAAU,OAAA,GACf,KAAK,QAAQ,OAAA,GACb,KAAK,WAAW,OAAA;AAAA,EACpB;AACJ;ACnMA,MAAqBqM,GAAO;AAAA,EAUxB,YAAY/uB,GAAc;AATlB,IAAAtF,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,gBAAS;AACT,IAAAA,EAAA,oBAA0B;AAC1B,IAAAA,EAAA,wBAAiB;AACzB,IAAAA,EAAA;AACQ,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA,eAAQ;AACR,IAAAA,EAAA,gBAAS;AAEb,SAAK,MAAMsF,GACX,KAAK,eAAA,GACL,KAAK,KAAA;AAAA,EACT;AAAA,EACQ,OAAO;AAEX,SAAK,IAAI,GAAG,oBAAoB,MAAM;AAClC,MAAK,KAAK,cAGN,KAAK,WAAW,eAAe,UAC/B,KAAK,YAAA;AAAA,IAEb,CAAC,GACD,KAAK,IAAI,GAAG,aAAa,CAACmK,MAAS;AAC/B,WAAK,aAAaA;AAClB,YAAM,EAAE,MAAAhE,GAAM,MAAA9B,EAAA,IAAS,KAAK,IAAI;AAChC,WAAK,iBAAiB,KAAK,UAAU8B,CAAI,IAAI,KAAK,UAAU9B,CAAI;AAAA,IACpE,CAAC,GAED,KAAK,IAAI,GAAG,YAAY,MAAM;AAC1B,MAAI,KAAK,UACL,KAAK,SAAA;AAAA,IAEb,CAAC,GACD,KAAK,IAAI,GAAG,uBAAuB,MAAM;AACrC,MAAI,KAAK,UACL,KAAK,SAAA,GAET,KAAK,aAAa;AAAA,IACtB,CAAC,GACD,KAAK,IAAI,GAAG,kBAAkB,CAAC8F,MAAS;AAEpC,MAAIA,EAAK,eAAe,UAGxB,KAAK,SAASA,EAAK,UAAUA,EAAK,QAAQ;AAAA,IAC9C,CAAC,GACD,KAAK,IAAI,GAAG,WAAW,CAAC+C,MAAM;AAI1B,UAHI,CAAC,KAAK,IAAI,SAASA,CAAC,KAGpB,CAAC,KAAK,IAAI;AACV;AAEJ,UAAIA,EAAE,SAAS,YAAY,KAAK,IAAI,SAAS;AACzC,aAAK,SAAS;AACd,cAAM,EAAE,WAAA6N,MAAc,KAAK;AAC3B,QAAIA,MACA,KAAK,IAAI,KAAK,mBAAmBA,CAAS,GAC1C,KAAK,aAAaA,IAEtB,KAAK,SAAA;AACL;AAAA,MACJ;AACA,WAAK7N,EAAE,UAAUA,EAAE,YAAYA,EAAE,SAAS,WAAW,KAAK,IAAI,WAAW,KAAK,SAAS;AACnF,QAAAA,EAAE,eAAA;AACF,cAAM8hB,IAAY,KAAK,QAAQ,gBACzBC,IAAa,KAAK,QAAQ,MAAM,UAAU,GAAGD,CAAS,GACtDE,IAAY,KAAK,QAAQ,MAAM,UAAUF,CAAS;AAExD,aAAK,QAAQ,QAAQC,IAAa;AAAA,IAAOC,GAEzC,KAAK,QAAQ,iBAAiB,KAAK,QAAQ,eAAeF,IAAY,GACtE,KAAK,SAAA;AACL;AAAA,MACJ;AACA,UAAI9hB,EAAE,SAAS,SAAS,KAAK,IAAI,SAAS;AAGtC,YAFAA,EAAE,eAAA,GACF,KAAK,SAAA,GACDA,EAAE,UAAU;AACZ,eAAK,IAAI,KAAK,gBAAgB,MAAM;AACpC;AAAA,QACJ;AACA,aAAK,IAAI,KAAK,gBAAgB,OAAO;AACrC;AAAA,MACJ;AACA,UAAIA,EAAE,SAAS,WAAW,KAAK,IAAI,SAAS;AAGxC,YAFAA,EAAE,eAAA,GACF,KAAK,SAAA,GACDA,EAAE,UAAU;AACZ,eAAK,IAAI,KAAK,gBAAgB,KAAK;AACnC;AAAA,QACJ;AACA,aAAK,IAAI,KAAK,gBAAgB,QAAQ;AACtC;AAAA,MACJ;AACA,UAAIA,EAAE,SAAS,WAAW,CAAC,KAAK,IAAI,SAAS;AACzC,QAAAA,EAAE,eAAA,GACF,KAAK,UAAA;AACL;AAAA,MACJ;AACA,YAAMnS,IAAMmS,EAAE,KACRiiB,IAASjiB,EAAE,SACXkiB,IAAQliB,EAAE,QACVmiB,IAAUniB,EAAE,UACZoiB,IAASpiB,EAAE;AAkCjB,MAhCIiiB,KAAUC,KAASC,KAAWC,KAIb;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,EAEa,SAASv0B,CAAG,KAI7B,KAAK,UAAU,EAAI;AAAA,IACvB,CAAC,GACD,KAAK,IAAI,GAAG,0BAA0B,CAACoP,MAAS;AAE5C,WAAK,aAAaA;AAClB,YAAM,EAAE,MAAAhE,GAAM,MAAA9B,EAAA,IAAS,KAAK,IAAI;AAChC,WAAK,iBAAiB,KAAK,UAAU8B,CAAI,IAAI,KAAK,UAAU9B,CAAI;AAAA,IACpE,CAAC,GACD,KAAK,IAAI,GAAG,aAAa,CAAC8F,MAAe;AAMrC,UAJI,KAAK,IAAI,qBAIT,CAAC,KAAK,kBAAkBA,EAAK,UAAUA,EAAK,QAAQ;AACpD;AAEJ,YAAM,EAAE,MAAAhE,GAAM,MAAA9B,EAAA,IAAS,KAAK,IAAI,UAC1BkrB,IAAiB,KAAK,UAAUppB,CAAI,IAAI,KAAK,UAAU9B,CAAI;AACjE,UAAI,KAAK,mBAAmBkrB,KAAkB,KAAK,YAAY;AAE3D,YAAI,KAAK,IAAI,OAAO,0BAA0B,KAAK,IAAI,eAAe;AAClE,eAAK,UAAA;AACL;AAAA,QACJ;AAEA,YACI,KAAK,IAAI,iBACTplB,EAAK,WAAW,KAAK,WAAW,UAChCA,EAAK,QAAQ,KAAK,WAAW,KAC/B;AACE,eAAK,UAAA;AACL;AAAA,QACJ;AAAA,MACJ;AAKA,UAJA,KAAK,iBAAiBolB,GACtB,KAAK,SAAA,GACL,KAAK,aAAaplB,GAEd,KAAK,IAAI,OAAO,0BAA0B;AAE1C,YAAI,KAAK,IAAI,OAAO,0BAA0B,KAAK,IAAI,eAAe;AAClE,eAAK,UAAA;AACL;AAAA,QACJ;AAEA,QAAI,KAAK,IAAI,iBACT,KAAK,UAAA;AAAA,MAEb;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EACQ,kBAAkBjP,GAAkBD,GAAkB;AAC1D,UAAM,EAAE,MAAAkL,GAAM,MAAA9B,EAAA,IAAS,KAAK,IAAI,UAC1B,CAAC8C,GAAMf,CAAI,IAAID,GACf,CAAChC,GAAMC,CAAI,IAAIC;AAUrB,WATI,EAAApJ,IAAWkM,KAGXlM,IAAWmL,KAGXlL,IAAWiJ,KAGXjJ,IAAWkJ;AAAA,EAInB;AAAA,EACQ,iBAAiB;AAErB,SAAK,UAAU,SAAS,cAAc,UAAU,GAChD,KAAK,QAAQ,aAAa,QAAQ,GAAG,GAErC,KAAK,QAAQ,iBAAiB,SAAS,KAAK,SAAS,KAAK,IAAI,CAAC,GAC/D,KAAK,QAAQ,iBAAiB,QAAQ,MAAM;AACxC,WAAK,SAAA;AAAA,IACT,CAAC,GACD,KAAK,WAAW,KAAK,IAAI,eACzB,KAAK,QAAQ,YAAY,gCACzB,KAAK,SAAS,YAAY,KAAK,OAAO,GACtC,KAAK,IAAI,iBAAiB,YAAY,KAAK,QAAQ;AAAA,EACvD;AAAA,EACQ,WAAW;AACf,SAAK,QAAQ,MAAM,SAAS;AAC5B,QAAIorB,IAAe,KAAK,QAAQ,cAC5BC,IAAY,KAAK,IAAI,KAAK;AAC9B,IAAID,IAAeC,MACfD,IAAeC;AAEnB,UAAM;AAAA,MACF,aAAA9uB;AAAA,MACA,QAAAkW;AAAA,MACA,QAAArD;AAAA,MACA,QAAQ,EAAE,qBAAA1S,EAAA;AAAA,IAAoB,IAC9B,KAAK,KACH4uB,IAAU/uB,IAAckW,EAAO,SAAS/V;AAC9C,SAAK,SAAS,MAAM,SAAS,QACzB,KAAK,QAAQ0S,EAAO,WACpB,KAAK,SAAS,MAAM,MAAM,GAAGA,EAAO,SAAS,CAAC,OAE9C,KAAK,QAAQgc,IAAeE,MAC5B,KAAK,SAAS,MAAM,OAAO,GAAG,KAAK,QAAQ,CAAC,MAC5C,KAAK,SAAS,MAAM,MAAM,QAC1B,KAAK,SAAS,MAAM,SAAS,GAAG/uB,IAAc+uB,CAAO,OAEzD,KAAK,QAAQ,MAAM,SAAS,GAAGF,CAAY;AAAA,EAC/C;AAAA,EACQ,iBAAiBrlB,GAAYwlB,IAAc,IAAO;AACtD,UAAMx0B,IAAQw0B,IAAc,OAAOxlB,EAAK,SAAA,GAClC,EAAE,YAAAylB,MAAezlB;AACvB,IAAAA,EAAK,OAAA,GACD,KAAK,IAAI,OAAO,0BAChBA,EAAK,eAAA;AAET,QAAI,EAAE,QAAA/J,GAAQ,OAAAD,GAAO,OAAA2F,GAAO,OAAAD,MAAUsE;AACtC,SAAK,QAAQtE,GACb,KAAK,QAAQC;AACb,UAAM;AAAA,MACF,QAAQ,EAAE,cAAA/D,EAAA;AAAA,MACV,QAAAyR;AAAA,IAAA,IACA,KAAK;AACT,QAAIic,IAAY,KAAK,IAAI,KAAK;AAU9B,QATIrvB,IAASqvB,MACTrvB,IAASqvB,IAGb,KAAK,SAAS,MAAM,UAAU,gBAC9B,KAAK,SAAS,MAAM,OAAO,GAAG,KAAK,QAAQ,CAAC,MAC5C,KAAK,SAAS,MAAM,MAAM,GAAG,KAAK,QAAQ,CAAC,MAC3C,KAAK,SAAS,MAAM,SAAS,QAC7B,KAAK,SAAS,MAAM,YAAY,GAAGA,CAAS,MACxCG,MAAe,QAAQ;AACvB,WAAK,QAAQ,MAAM,UAAU,SAC7B,KAAK,QAAQ,MAAM,WAAW,GAAGzvB,IAAQ,CAAC,MAC1C,KAAK,QAAQ,MAAM,YAAY,GAAGC,IAAS,CAAC,MAC5C,KAAK,QAAQ,MAAM,YAAY,GAAGqvB,CAAS,MAC3C,KAAK,QAAQ,MAAM,QAAQ,GAAGtvB,IAAQ,CAAC,MACvC,KAAK,QAAQ,MAAM,SAAS,QAC5B,KAAK,QAAQ,MAAM,UAAU,GAAG4B,CAAY,MACxC5G,MAAU,SACV,KAAK,QAAQ,QAAQA,IAEzB,KAAK,QAAQ,MAAM,EAAE,eAAe,IAAM;AAC1C,YAAMikB,IAAS,KAAK,QAAQ,MAAM;AAClC,WAAK,QAAQ,kBAAkBA,GAAQA,CAAM;AAAA,IACjD;AACI,WAAK,QAAQ,MAAM,UAAU;AAGjC,KAAI,KAAK,QAAQ,eAAehf,KAAU,KAAK,QAAQoT,EAAO,WAC1D,KAAK,SAAA;AAAA,EAEb;AAAA,EACQ,kBAAkB;AACtB,QAAK,KAAK,cAIN,KAAK,WAAW,eAAe,QAAQ;AACvC,YAAM,EAAE,QAAAxY,GAAQ,KAAAD,EAAA,IAAQ,KAAK,YACvBI,IAAQ,KAAK,WAAW,SAAA,GACxB00B,IAAc,KAAK,QAAQ;AAEjC,MAAIA,MAAgB10B,KAAS,EAAE00B,MAAgB,MAAM10B,MAAU,SAAS,CAAC,KAAK,UAC1E,KAAK,IAAI,qBAAqBH,GAAQD,GAAK80B,GAAa,EAAI,GAGhE,KAAK,QAAQ,QAAQ;AAAA,IACzB;AAAA,EACJ;AAAA,EACA,UAAUF,IAAc,IAAO;AAC3B,SAAK,SAAS;AAEd,UAAM,EAAE,4BAAAG,EAAA,IAA+B,KAAK,IAAI;AAChD,QAAI,CAACA;AACD;AAEJ,UAAM/U,IAAY,KAAK,IAAI;AAgB3B,QAfI,CAACA,KAKD,CAAC,SAAS,mBAAmB,WAAW,EAAE,SAASA,EAAU,IAAI,KAGjE,KAAK,WAIT,KAAK,IAAI,KAAK,UAAU,GAGpB,EADcA,EAAU,kBAAA,KAAuBA,EAAU,oBAAA;AAEzD;AAEJ,UAAM,EAAE,QAAA/f,GAAQ,KAAAD,GAAK,YAAA60B,EAAA,IAAe7U;AAEpC,QAAI6U,MAAe;AACf;AAEJ,UAAM9mB,IAAW,KAAK,IAAI,SAAS,YAAY9N,GAAQD,CAAG;AAC1D,IAAIggB,KAAa,CAACjS,MACd,KAAK,SAAS,IACd,KAAK,IAAI,UAAU,IACnB,KAAK,aAAaiS,GAClB,KAAK,iBAAiB,KAAK,YAAY4U,CAAW,GAClD,KAAK,IAAI,KAAK,aAAa,KAAK,UAAU;AAAA,EAElD;AAAA,EACA,SAASz0B,GAAkBD,GAAkB;AACzC,UAAMH,IAAM,KAAK,IAAI,KAAK,WAAW,KAAK,CAACA,MAAQA,EAAI,aAAaI,CAAQ;AAC5E,QAAI,CAACJ;AACD;AAEJ,UAAMqP,IAAOrP,EAAI,MAAM,KAAK,CAACqP,MAAeA,EAAK,aAAalP,CAAQ;AACtE,QAAI,CAACkP;AACD;AAEJ,SAAK,IAAI,KAAK,mBAAmBA,CAAI;AACrC,UAAM4Q,IAAY,KAAK,IAAI;AAQ3B,QAPI,CAACA,KAID,CAAC,SAAS,mBAAmB,WAAW,EAAE,SAASA,EAAU,IAAI,KAGjE,KAAK;AACL;AAEJ,UAAM,EAAE,QAAA/f,GAAQ,KAAAD,EAAA,IAAQggB,GAClBjS,IAAW,KAAK,IAAI,SAAS,YAAY9N,GAAQD,CAAG;AAC1D,IAAIggB,KAAa,CAACjS,MACd,KAAK,SAAS,IACd,KAAK,IAAI,UAAU,IACnB,KAAK,aAAaiS,GAClB,KAAK,iBAAiB,KAAK,UAAU,GACrC,KAAK,IAAI,KAAK,aAAa,KAAK,UAAU;AAAA,EAElD;AAAA,EACA,WAAW;AACP,IAAK,KAAK,WAGV,KAAK,gBAAA,GACL,KAAK,IAAI,KAAK,YAAY,KAAK,UAAU,GACzC,KAAK,SAAS,IACd,KAAK,IAAI,UAAU,IACnB,KAAK,IAAI,iBAAiB,MAAM,EAAE,eAAe,IAAM,GAEvD,KAAK,SAAS,MAAM,UAAU,QAC9B,KAAK,IAAI,KAAK,UAAU;AAAA,EAC5B;AAAA,EACA,cAAc;AACV,SAAK,SAAA,GACL,KAAK,aAAa,MAClB,KAAK,iBAAiB,IACtB,KAAK,IAAI,cAAA,GACT,KAAK,IAAI,YAAY,QACrB,KAAK,IAAI,KAAK,UAAU;AAAA,EAC5B;AAAA,EACA,UAAU;A1BpYd,QAAAvS;A0BqYQ,KAAAA,IAAA,KAAK,aAAL,QAAAA,EAAe;AAAA,EACnB;AACJ;AC9ZA,MAAqBunB,GAAQ;AAAA,EAGzB,YAAY/vB,GAAc;AAFlB,IAAAtF,EAAA;AACA,IAAAA,EAAA;AAEJ,SAAK,MAAMsF;AACX,UAAM,EAAE,YAAAgwB,GAAY,oBAAAC,EAAA,IAAuB,KAAK,IAAI;AACpD,IAAI,KAAK,IAAI,eACT,KAAK,UAAU,KAAK,IAAI,gBAExB,KAAK,UAAU,SAAS,cAAc,KAAK,GAC3C,KAAK,QAAQ,YAAYD,IAE7B,KAAK,QAAQ,YAAY,sBACzB,KAAK,QAAQ,MAAM,UAAU,QAC7B,KAAK,IAAI,iBAAiB,YAAY,KAAK,OAAO,GAClD,KAAK,IAAI,GAAG,eAAe,CAAC,EAAE,MAAAvuB,GAAM,cAAAiS,GAAc,YAAAE,GAAY,cAAAnB,QAAmB;AAC7E,YAAMhN,IAAMiO,KAAgBE,IAAanB,KAAgB,GACnDyd,IAAe;AAAA,QACjB,SAASzuB,MAAS,UAAU,UAAU;AAAA,QACtC,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO;AAAA,QACP,MAAM;AAAA,QACN,KAAK,GAAGgE,CAAG;AAAA,QACX,WAAW;AAAA,QACX,GAAGwqB;AAAA,MAAA;AAEP,aAAO,OAAO,KAAK,QAAQ,OAAOC,CAAY;AAAA,IAClD,CAAC;AAAA,EACL;AAAA,EACA,UAAU;AACN,SAAK,QAAQ,OAAA;AAAA,EACjB;AACJ;AC9BA,MAAqBC,GAAU;AAAA,EAE3B,YAAYnwB,GAAc;AAD1B,IAAAtF,EAAA;AAEI,SAAK,MAAMsF;AAAA,EACf;AAAA,EACA,OAAO;AACH,UAAMowB,IAAY,KAAK,aAAA;AACvB,SAAK,IAAI,KAAK,mBAAmBA,CAAS;AAAA,EAC9C;AAAA,EACA,UAAU;AACN,SAAK,IAAI,KAAK,mBAAmB;AAAA,MAC7B,OAAO,CAAA;AAAA,MACP,OAAO,CAAA;AAAA,IAAC,CACX;AAAA,EACL;AAAA,EACQ,eAAmC;AACvC,UAAM5c,IAAS,KAAK,UAAA,GACdD,IAAO,KAAK,QAAA,GACZsD,IAAS,KAAK,UAAA;AACpB,QAAIwZ,IAA4B,CAAA;AAEhC,UAAM,EAAE,cAAAvZ,GAAc,iBAAAM,EAAA,IAAoB,KAAK,IAAI;AACnD,WAAKN,IAGGM,MAAoB,QACpBiZ,IAAQ,CAAC7c,GAAQqD,GAAQtD,CAAI,IAE7B8c,IAAQ,CAAC7c,GAAQD,GAAMsD,CAAM,IALjCwZ,IAAQ,CAAC7c,GAAQD,CAAI,GAQlB;AAAA,MACH,OAAA8c;AAAA,IAAA;AAAA,EAER;AAAA,EACQ,YAAY;AAChB,UAAM;AAAA,MACF,gBAAA9vB;AAAA,MACA,iBAAiB+vB;AAAA,MACjB,QAAQ,EAAE,qBAAAxvB,GAAqB,YAAA2tB,EAAA;AAAA,IAAW,IAC1C,KAAK,KACH,EAAE,cAAAlqB,GAAc,eAAAC,GAAe,mBAAAiN,EAAA,IAAsB,KAAK,IAAI;AACpE,QAAI8e,IAA4B,CAAA,GAC5BC,IAA0B,CAAA,GAC1BC,IAA2B,CAAA;AAC/B,IAAAhf,EAAkB,QAAQ,CAACjL,MAAe;AACtC,MAAIA,EAAW,WACPA,EAAW,UAAU,SACrBgqB,EAAU,KAAKhqB,CAAU,IAClBA,EAAW,UAAU,UAC5BiqB,EAAW,KAAKjqB,CAAU,IAE1B+pB,EAAY,KAAK/pB,CAAU;AAAA,IAGvC,CAAC;AAED,UAAM/F,IAAkB6vB,IAAmBxvB,GACrC0E,IAAsB;AAAA,MACxB,KAAK;AAAA,MACL,OAAO;AAAA,QACH,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,QACV,OAAO,GAAGjF,CAAc;AAAA,QACxB,QAAQ,GAAGiE,CAAa;AAAA,MAAA;AAAA,MAE5B,OAAOgsB;AAAA,IAAA,GAEL/M,IAAwB;AAAA,MAC1B,KAAK;AAAA,MACL,OAAO;AAAA,QACH,UAAU;AAAA,QACV,KAAK;AAAA,QACL,MAAM,GAAGljB,CAAc;AAAA,QACvB,UAAU;AAAA,QACV,OAAO,GAAGgE,IAAehE,IAAiBE,IAAkB,CAAC;AAAA,QAC7D,QAAQ,GAAG+D,CAAa;AAAA,MAAA;AAAA,MAE5B,OAAO+rB;AAAA,IAAA,GAEL3zB,IAAuB;AAAA,MACzB,KAAK;AAAA,MACL,OAAO;AAAA,QACH,UAAU;AAAA,QACV,KAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO,GAAG6D,IAAkB,CAAC;AAAA,QAC7B,QAAQ,GAAG+D,CAAa;AAAA,MAAA;AAAA,MAE5B,OAAOisB;AAAA,IAAA;AAaX,WAXiC;AAAA,MAC7B,MAAM;AAAA,MACN,OAAO,GAAGhC,CAAU;AAAA,MACpB,OAAO;AAAA,QACH,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO,GAAGlqB,CAAY;AAAA,QACtB,QAAQ,GAAGC,CAAa;AAAA,MAAA;AAAA,MAE5B,OAAO,CAACgB,GAAMie,GAAQ7mB,CAAK;AAAA,IAAA;AAAA,EAGnC;AAAA,EACQ,UAAU;AACd,UAAM2zB,IAAsB,CAAA,GACtBC,IAAoB,CAAA,GACpBC,IAAqB,CAAA;AAC3B,QAAInf,IAAa,KAAK,IAAI,KAAK;AAE/B,IAAK,KAAK,IAAI,OAAO,iBACjBA,IAAaA,EAAW,OAAO,KAAK,IAAI,OAAO,UAAU,IAE7DA,EAAW,QAAQ,CAACxW,MAA2B;AAC3C,MAAAA,EAAI,MAAM,QAAQ,CAACqP,MAAe;AAC9B,QAAIA,EAAK,aAAa,aAClBA,EAAK,SAASA,EAAK,eAEnBA,EAAK,WACDA,EAAK,UAAU,SACfqmB,EAAU,KAAKrmB,CAAI,IACZA,EAAK,UAAU,UACtBsmB,EAAW,KAAKtmB,CAAI,IAEpBomB,EAAY,KAAKpmB,CAAI;AAAA,MAGjC,CAAC;AAAA,IACL,CAAC;AACD,UAAM;AAAA,MACF,gBAAA5J;AAAA,MACA,iBAAiB+vB;AAAA,MACjB,QAAQ,EAAE,qBAAAxvB,GAAqB,YAAA2tB,EAAA;AAAA,IAAW,IAC1C,KAAK,KACH,EAAE,cAAAlqB,GAAc,eAAAC,EAAA,IAAkB,KAAK,IAAI,MAE3C/D,IAAkB6vB,IAAmBxvB,GACrC0E,IAAsB;AAAA,MACxB,KAAK;AAAA,MACL,OAAO;AAAA,QACH,UAAU;AAAA,QACV,KAAK,GAAG,GAAG;AAAA,QACX,MAAM,GAAG,GAAG;AAAA,QACZ,UAAU;AAAA,QACV,OAAO,GAAGjF,CAAc;AAAA,QACxB,QAAQ,GAAGiE,CAAa;AAAA,MAAA;AAAA,MAE5B,OAAOgsB;AAAA,IAAA,GAEL/M,IAAwB;AAAA,MAC1B,KAAK;AAAA,MACL,OAAO;AAAA,QACH,UAAU;AAAA,QACV,KAAK,GAAG,GAAG;AAAA,QACX,MAAM,GAAGljB,IAAiB,GAAG;AAAA,QAC7B,UAAU;AAAA,QACV,OAAO,GAAGgE,IAAehE,IAAiBE,CAAe;AAAA,QACzD,QAAQ,GAAG+D,CAAa;AAAA,MAAA;AAAA,MAE5B,OAAO+rB;AAAA,IAAA,GAEL3zB,IAAuB;AAAA,MACzB,KAAK;AAAA,MACL,OAAO;AAAA,QACH,UAAU;AAAA,QACV,KAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO,GAAG6D,CAAe;AAAA,QACzB,QAAQ,GAAG+D,CAAa;AAAA,MAAA;AAAA,MAE5B,OAAOisB;AAAA,IAAA;AAaX,WAX+B;AAAA,MAC3B,MAAM;AAAA,MACN,OAAO,GAAGhC,CAAU;AAAA,MACpB,OAAO;AAAA,QACH,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO,GAAGlqB,CAAY;AAAA,QACtB,QAAQ,GAAGC,CAAa;AAAA,MAAA;AAAA,MAE5B,OAAO,CAACgB,GAAMie,GAAQ7mB,CAAK;AAAA,IAAA;AAAA,EAGnC;AAAA,EACQ,YAAY;AAChB,UAAM2zB,IAAsB,CAAA,GACtBC,IAAoB,CAAA,GACpBC,IAAqB,CAAA;AAC3B,SAAK,IAAI,OAAO,WAAW,QAAQ,CAAC31B,MAA2B;AAC3D,MAAAA,EAAI,MAAM,QAAQ,CAACqP,MAAe;AAC9B,QAAIA,EAAK,aAAa,YAAYA,EAAK,iBAEnCA,EAAK,SAASA,EAAK,cACfA,EAAK,UAAU,SACfqmB,EAAU,KAAKrmB,CAAI,IACZA,EAAK,UAAU,UACtBsmB,EAAW,KAAKtmB,CAAI,IAEpBomB,EAAY,KAAKpmB,CAAI;AAAA,MAGjC,CAAC;AAAA,IACL,CAAC;AACD,UAAM;AAAA,MACF,gBAAA5J;AAAA,MACA,iBAAiB+vB;AAAA,MACjB,QAAQ,EAAE,qBAAAxvB,GAAqB,YAAA2tB,EAAA;AAAA,IAAW,IAC1C,KAAK,KACH,EAAE,cAAAlqB,GAAc,eAAAC,EAAA,IAAkB,KAAK,IAAI,QAE3C/D,IAAkB6vB,IAAmBxvB,GACrC0E,IAAsB;AAAA,MACxB,KAAK;AAAA,MACL,OAAO;AAAA,QACH,UAAU;AAAA,QACV,KAAK,GAAG,GAAG;AAAA,QACX,MAAM,GAAG,GAAG;AAAA,QACZ,UAAU;AAAA,QACV,OAAO,GAAGjF,CAAc;AAAA,QACxB,QAAQ,GAAGiE,CAAa;AAAA,MAAA;AAAA,MAE5B,OAAOgsB;AAAA,IAAA,GAEL/M,IAAwB;AAAA,MAC1B,KAAK;AAAA,MACL,OAAO;AAAA,QACH,UAAU;AAAA,QACV,KAAK,GAAG,GAAG;AAAA,QACX,MAAM,GAAGljB,IAAiB,GAAG;AAAA,QAC7B,UAAU;AAAA,QACV,OAAO,GAAGgE,IAAehE,IAAiBE,CAAe;AAAA,QACzD,QAAQ,GAAG+D,CAAa;AAAA,MAAA;AAAA,MAE5B,OAAO+rB;AAAA,IAAA,GAEL3zB,IAAuB;AAAA,MACzB,KAAK;AAAA,MACL,OAAO;AAAA,QACH,UAAU;AAAA,QACV,KAAK,GAAG,GAAG;AAAA,QACX,OAAO,GAAG,GAAG;AAAA,QACb,UAAU;AAAA,QACV,OAAO,GAAG6D,CAAe;AAAA,QACzB,QAAQ,GAAG+D,CAAa;AAAA,MAAA;AAAA,MAE5B,OAAOisB;AAAA,IAAA;AAaX,WAXiC;AAAA,MAC7B,MAAM;AAAA,MACN,OAAO,GAAGhC,CAAU;AAAA,MACpB,OAAO;AAAA,QACH,UAAU;AAAA,QACV,UAAU;AAAA,QACV,OAAO,GAAGlqB,CAAY;AAAA,QACtB,QAAQ,GAAGC,CAAa;AAAA,MAAA;AAAA,MAE5B,OAAO,CAACgB,GAAMie,GAAQ7mB,CAAK;AAAA,IAAA;AAAA,EAGnC;AACJ;ACzQA,MAAqB8zB,GAAY;AAAA,EAI7B,YAAY1wB,GAAc;AAHlB,IAAAtF,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,gBAAS;AAEb,SAAK,MAAMsF,GACP,KAAK,IAAI,sBACT,KAAK,SAAS,IACd,KAAK,gBAAgB,KAAK,IAAI,uBAE9B,KAAK,SAAS,IACd,KAAK,gBAAgB,SAAS,cAAc,KAAK,IAErD,KAAK,kBAAA,GACL,KAAK,KAAA;AAAA,EACT;AAAA,EACQ,OAAO;AACX,SAAK,IAAI,GAAG,wBAAwB,CAACmK,GAAY,MAAkB;AAC/D,UAAI,CAAC,KAAK,IAAI,OAAO,oBAAqB;AAC1C,QAAE,eAAA;AACF,YAAM,EAAE,MAAAhE,GAAM,MAAA9B,EAAA,IAAS,KAAK,IAAI,UAC1B,CAAC8C,GAAMf,CAAI,IAAID,GACf,CAAChC,GAAMC,CAAI,IAAIC,GACf,EAAE,UAAAnJ,GAAU,UAAAD,EAAA,IAAakP;AAG/B,MADkBjP,KAAYiJ,KAAQjJ,KAAYkJ,KAAQnJ,KAAYkM,KAAQlM,KAAYmL,KAEtF,KAAK,IAAI,KAAK,mBAAmB+D,GAAM,CAAC;AAG5C,YAAMwmB,IAAmB;AAAA,QACrB,uBAAuB,OAAO;AAAA,UAC1B,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,KAAK,EAAE;AAAA,UACP,MAAM,EAAE;AAAA,UACR,OAAO,EAAE;AAAA,UACT,QAAQ,EAAE;AAAA,UACV,GAAG,EAAE;AAAA,UACL,GAAG,EAAE;AAAA,QAAA;AAAA,QAET,gBAAgB,SAAS;AAAA,MAAA;AAE7B,MAAAzP,GAAgByP,GAAkB,KAAK,eAAe;AAAA,QAClD,WAAW;AAAA,QACX,YAAY,CAACtqB,GAAA,GAAU2f,GAAA,GAASpC,IAAM;AAAA,MAAA,CACzC,EAAE,KAAK,CAAC,EAAE,GAAA3jB,GAAG,GAAAC,QAAQ;AAClB,aAAK,KAAKD,GAAGC,CAAC;AAAA,MAClB,CAAC;AAAA,IACL,CAAC,GACD,KAAK,IAAI,GAAG,SAAS,KAAK,KAAK,KAAK,IAAI,CAAC,GACzC,KAAK,IAAI,GAAG,YAAY,KAAK,KAAK,KAAK,IAAI,CAAC,GAC5C,KAAK,IAAI,GAAG,UAAU,KAAK,KAAK,KAAK,IAAI,CAAC;AAAA,EAC9C;AAAA;AAAA,EAEQ,oBAAoB;AAOxB,QANA,KAAK,cAAc,YAAY,6BAC/B,KAAK,cAAc,iBAAiB,eAAe,SAAU,GAAG;AAC5D,QAAE,eAAA;AAAA,IACN,CAAC,GACD,KAAK,IAAI,iBAAiB,YAAY,KAAK,aAAa,GAEpD,KAAK,OAAQ;AACjB,UAAM,EAAE,cAAA0wB,EAAA,IAAiB,KAAK,IAAI;AAClC,SAAK,uBAAuBA,GAAc,CAACv0B,MAAmB;AAC1D,cAAQA,EAAK,OAAA;AAAA,QACT,KAAK;AACD,eAAK,IAAI,KAAK,iBAAiB;AAC/B;AAAA,QACJ,KAAK;AACD,eAAK,IAAI,KAAK,kBAAkB;AAChC;AAAA,QACJ,KAAK;AACD,eAAK,IAAI,KAAK,gBAAgB;AAC9B;AAAA,QACJ,KAAK;AACD,eAAK,IAAI,KAAK,0BAA0B;AACxC;AAAA,MACJ;AAEJ,WAAK,KAAA;AAAA,IACT,CAAC;AAAA,EACL;AAAA;AAAA,EAEQ,uBAAuBw0B,GAAmBljB,GAAiC;AAC/E,SAAK,cAAc,gBAAA,GACnBkjB,EAAM,QAAQ,CAACx0B,MAAmB;AAC9B,YAAMy0B,IAA6B,SAAS,cAAc,KAAK;AAC/D,MAAAA,EAAW,YAAY,kCACvBA,EAAW,YAAYz0B,EAAK,OACxBA,EAAK,QACLy0B,EAAW,UAAU,MAAM;AACvB,QAAAz0B,EAAK,SAASA,EAAK,MAAA,GACnBsR,EAAStR,CAAI;AAAA,MACjB,IAEAy0B,EAAW,UAAU,MAAMnjB,EAAStR,CAAI,GAE5C,KAAK,cAAc,YAAYy0B,CAAU;AAAA,IAC7C,CAAC;AAAA,EACL;AAAA,EACQ,KAAK7wB,GAAWC,GAAW;AAC/B,WAAO,OAAO,KAAK,cAAc,OAAO;AAAA,MACpC,MAAM,GAAGD,CAAC;AAAA,MACV,KAAK,GAAGC,CAAC;AAAA,IAAA,CACZ;AAAA,EACL;AAAA,EACA,OAAO;AACH,WAAO,OAAO,KAAK,cAAc,OAAO;AAAA,MACpC,MAAM;AAAA,MACN,KAAK;AAAA,IAAA,CACR;AAAA,EACL;AAAA,EACA,UAAU;AACN,SAAK,kBAAA;AAAA,EACT;AAAA,EACA,UAAU;AACN,SAAK,cAAc,OAAA;AAAA,EACvB;AACJ;ACjGA,MAAqB6wB,GAAW;AAAA,EAc5B,YAAYtjB,GAAwBlG,GAA4B;AAbxD,IAAA7M,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACR,IAAAA,EAAA;AAEI,SAAK,UAAU6M;AACf,UAAM,EAAE,kBAAAwK,GAAkB,eAAAC,GAAe,cAAAC,GAAc,oBAAAC,MAAuB3K,GACxEqK,IAAmB,KAAK;AAAA,MAC1BnE;AAAA,MACAsE;AAAA,MACAC;AAAA,MACAC;AAAA,MACAC;AAAA,IAAA;AAEJ,SAAK,MAAM,IAAIR,GAAQE,GAAkB,KAAK,OAAO,GACrD,KAAK,SAAS,IAAIyC,GAAO,KAAK,GAAG,GACjC,KAAK,SAAS,IAAIsE,GAAO,KAAK,GAAG,GACjC,KAAK,OAAO,IAAI/B,GAAK,KAAK,GAAG,GAC7B,KAAK,WAAW,IAAIzC,GAAS,KAAK,GAAG,GACrC,KAAK,WAAW,IAAI2E,GAAS,KAAK,GAAG,GACrC,KAAK,WAAW,IAAIkE,GAAS,KAAK,GAAG,GACrC,KAAK,UAAU,IAAI+S,GAAQ,KAAK,GAAG,GACnC,KAAK,QAAQ,IAAIiB,GAAM,KAAK,GAAG,GAC/B,KAAK,SAAS,IAAIjC,GAAO,KAAK,GAAG,GACjC,KAAK,YAAY,IAAIoB,GAAU,KAAK,GAAG,GACvC,KAAK,cAAc,IAAIO,GAAY,KAAK,GAAG,GAC3C,KAAK,IAAI,GAAG,QAAQ,MAAM;AACtB,WAAK,KAAA;AAAA,IACT,CAAC,GACD,KAAK,IAAI,GAAG,YAAY,MAAM;AAC1B,WAAK,KAAK,EAAI;AAAA,IAClB,CAAC,GACD,KAAK,KAAA;AAAA,EACT;AAAA,EACQ,gBACJ9e,GACAqf,GACAC,GACAC,GACAC,GACF;AACE,IAAAxf,EAAiB,YAAY;AAC7B,UAAMC,IAAe,SAAS,cAAc,KAAK,GAC3CC,IAAgB,SAAS,cAAc,QAAQ,GAC/CC,IAAmBkf,KAAqB,SAAS,cAAc,KAAK;AAC1E,IAAApf,EAAa,YAAY,sBACzBD,EAAiB,WAAW,GAC5BE,EAAc,YAAY,uBAC1BC,EAAiB,YAAY;AAC7B,UAAMC,IAAgBkf,KAAkB,SAAS,cAAc,KAAK;AACpE,IAAAlf,EAAc,YAAY;AAC1B,UAAMC,IAAekf,GACfjf,IAAqBkf;AAC3B,WAAAvf,EAAa,YAAYC,CAAa,GACtCD,EAAa,YAAYE,CAAgB,GACzCH,EAAiB,YAAYC,CAAY,GAClC;AAAA,MACH,kBAAAD;AAAA,MACA,cAAAC;AAAA,MACA,eAAAC;AAAA,MACA,kBAAAC;AAAA,MACA,eAAAC;AAAA,MACA,cAAAC;AAAA,MACA,oBAAAC;AAAA,IAAA;AAAA,EAER;AAAA,EACA,KAAKmf,IAAkB,IAAO;AAC1B,0BAAsB,MAAM;AACxB,WAAK,OAAO,OAAA,GACZ,KAAK,OAAO,OAAA,GACZ,KAAK,KAAK,OAAA,GACV,KAAK,IAAI,MAAM,MAAA,GACf,KAAK,KAAK,KAAA,GACV,KAAK,OAAO,KAAA,GACZ,KAAK,OAAO,KAAA,GACZ,KAAK,SAAS,KAAA,GAETA,KACD,KAAK,UAAU,KAAA;AAAA,IAEvB,CAAC;AAAA,EACL;AAAA,EACA,WAAWC,GAAqB;AAC5B,SAAK,IAAI,OAAO,KAAKA,CAAO,GAE5B,KAAK,IAAI,SAAS,KAAK,EAAK,GAC5B,KAAK,OAAO,KAAA,GAEZ,KAAK,YAAY,QAAA,GACjB,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,YAAYryB,GAAmB;AAE3B,SAAK,OAAO,SAAA,GACZ,KAAK,IAAI,SAAS,WAAWA,CAAO,GACpC,KAAK,OAAO,KAAA,GACZ,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,SAAS7C,GAAa;AAElB,SAAK,OAAO,SAAA,GACZ,KAAK,IAAI,SAAS,QAAQA,CAAI,GAC9B,KAAK,OAAO,KAAA,GACZ,KAAK,QAAQ,KAAA,GACb,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,eAAeA,GAAa;AACxB,SAAK,IAAI,SAAS,cAAcA,CAAI,GACpC,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EAEA,WAAWm1B,GAAiB;AACxB,SAAK,IAAI,SAAS,WAAWA,CAAM;AAAA,EACvC;AAAA,EACA,GAAGhkB,GAAeI,GAAyB;AACvC,SAAK,IAAI,GAAGJ,GAAOI,CAAQ;AAAA,EAC/B;AAAA,EACA,KAAKJ,MAAkBvR,GAAmB;AACtC,SAAK,IAAI,KAAKuR,GAAO,GAAGvR,CAAI;AAAA,EAChC;AAAA,EACA,IAAIuR,GAAeI,GAAyB;AACxC,SAAK,IAAI,IAAIJ,GAAOI,CAAQ;AAAA,EAChC;AAAA,EACA,aAAa/R,GAAoB;AAC7B,SAAK,IAAI,SAAS,gBAAgBA,CAAI,GAEtC,KAAK,IAAI,SAAS,KAAK,EAAK,GAC5B,KAAK,OAAO,KAAA,GACZ,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,SAASV,GAAkBD,GAAkB;AACzC,SAAK,OAAO,SAASC,GAAUD,CAAQ;AAAA,EAC3C;AAAA,EACA,aACID,GACAD,GACAI,GACAsO,IAAU,IACVc,IAAS,IACTC,IAAW,IACb;AACE,SAAK,IAAI,SAAS,aAAaxP,GAAQD,GAAKI,GAAOsO,GAASc,GAAQC,CAAQ;AAAA,EAChF;AAAA,EACA,kBAAkBhM,GAAoBiL,IAAU,IAAM;AAClD,SAAK,IAAI,SAAS,kBAAkBjL,GAAMiL,CAAO;AAAA,EACrD;AAAA,EACA,qBAAqBzO,GAAgBD,GAAaI,GAAYsO,IAAU,IAAMc,IAAS,IAAM;AACzF,SAAK,IAAI,qBAAqBvP,GAAQD,GAAKI,GAAOsO,GAASc,CAAM,GACjE,KAAK,OAAO,SAAA;AAAA,EAChB;AAAA,EAEA,kBAAkBpP,IAAQ,MAAM;AAC5B,UAAMgL,IAAO,CAAC,GAAG,KAAK,IAAI,WAAW,GAC/B9B,IAAO,CAAC,GAAG,KAAK,IAAI,WAAW;AACrC,WAAO,KAAK,SAAS,kBAAkB8B,GAAM9B,GAAM,IAAOlJ,CAAK;AAAA,EACnE;AAAA,EACA,cAAc;AACV,SAAK,OAAO,YAAA;AAAA,EAChB;AAAA,EACA,WAAW;AACP,SAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,iBAAiB;AACb,WAAO,KAAK,IAAI,SAAS,eAAA;AAAA,EAC7B;AAAA,EACA,iBAAiB;AACb,WAAO,KAAK,IAAI,SAAS,eAAA;AAAA,EAC7B;AAAA,EACA,wBAAwBD,GAAkB;AACtC,SAAK,IAAI,cAAc,KAAK,IAAI,SAAS,mBAAmBA,GAAU,CAAC,GACvE,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,cAAcF,GAAgB;AAC1B,UAAMH,IAAS,KAAK,IAAI,SAAS,oBAAoB,CAAC;AACtD,IAAKA,MAGL,KAAK,IAAI,cAAc,KAAK,IAAI,SAAS,wBAAwBG,GAAQH,EAAO,GAAG,GACnF,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,gBAAgB;AACZ,UAAMsP,IAAO,KAAK,IAAI;AACtB,WAAKA,IAGsB;AAAA,MACvB,KAAKA,EAAK;AAAA,MACV,UAAUA,EAAK;AAAA,MACf,QAAQA,EAAK;AAAA,IAAA,IALb;AAAA,EAQR;AAAA,EACA,gBAAgB;AACZ,SAAK,IAAI,SAAS,cAAA,GAClB,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,eAAeqnB,GAAiCC,IAAc,IAAM;AAChE,WAAO,IAAI,QAAQ,OAAOxlB,GAASqE,MAAW;AAC1C,UAAI1V,IAAgB,CAAA;AACpB,eAAS2L,IAAI,GAAGA,IAAIirB,EAAe,QAAQjrB,KAAK;AAC5C,cAAM,EAAE,QAAAvL,GAAQ,KAAAD,MAAQy2B,EAAejrB,CAAC,GAClC6F,IAAU,MAAM,KAAK,IAAI,SAAS,aAAapR,GAAQD,CAAG;AAChE,QAAI,MAAM,QAAQqR,CAAO,KAAKA,EAAQ,UAClCxR,EAAO,KAAKwR,CAAO;AAAA,MAE3B;AACA,UAAIxR,EAAO,QAAQ;AAEf,YADA0V,EAAO1V,CAAM,GACT62B,GAAa;AACb,gBAAM,CAACzwB,CAAG,IAAIpG;AACd,cAAI,MAAM,QAAQoG,CAAG,KAAKA,EAAI,QAAQ;AAClC,kBAAM,CAAC0wB,CAAI,IAAI1wB,GACT,EAAE,QAAAhG,GAAQ,KAAAD,EAAA,IAAQ22B;AACxB,iBAAK,eAAe12B,CAAM,GAC1B,KAAK,eAAeD,CAAG;AAAA,UAC3B;AAAA,QACJ;AACA,aAAK,IAAI,KAAK,MAAM;AAAA,MACxB;AACI,QAAAkR,EAAQ,CAAA,CAAE,GACV,KAAK,IAAI,KAAK,MAAM;AAAA,IAE5B,CAAC;AAAA,EACL;AAAA,EACA,MAAM,SAASwlB,IAAc,IAAM;AAE/B,WAAO,IAAI,QAAQ,OAAOxlB,GAASqE,MAAW;AAC1C,UAAI;AACA,cAAMc,IAAM,MAAM,KAAK,eAAA;AACvB,QAAAnF,EAAQmF,CAAG;AAAA,MACf,SAASxW,GAAQ;AAEb,YAAI62B,KAAe,MAAM,QAAQ72B,CAAM,KAAKA,EAAO,QAAQ;AACvD,gBAAM,CAACoG,CAAG,IAAIpG;AACd,cAAI,MAAM,QAAQoG,CAAG,KAAKA,EAAI,QAAQ;AAClC,kBAAM,CAAC0wB,CAAI,IAAI1wB,GACT,EAAE,QAAAhG,GAAQ,KAAAD,EAAA,IAAQ22B,GAClBC,IAAY,KAAK,IAAI,SAAS,gBAAgB32B,CAAM;AAC1D,gBAAI22B,GAAW;AACX,oBAAM,EAAE,eAAAppB,IAAgB,CAAA,EAAC,IAAMopB;AAC/B,cAAIppB,KAAiBA,EAAc,UAC/B,KAAK,iBAAiBA,GAAe,EAAI;AAAA,YAEjD;AACA,iBAAK,eAAevN,CAAM,GAC1B,KAAK,eAAeD,CAAG;AAAA,UAC3B;AAAA,QACJ;AACA,QAAAuV,EAAO1V,CAAM;AAAA,MACjB;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EACA,eAAeA,GAA6B;AAMxC,QALAA,EAAO,QAAQ,CAACyB,MAAS;AACrB,YAAM,EAAE,UAAAnB,GAAU,KAAAH,GAAK,SAAAS,EAAA,IAAYa;AACnC,WAAK,IAAI,SAAS,6BAA6BnB,GAAUH,GAAKS,CAAO;AAAA,IACzE,CAAC,GAEGZ,KAAU,MAAM,QAAQA,CAAM,KAAKA,EAAO,QAAQ;AAClD,YAAM,CAACoG,CAAG,IAAIpG;AACd,UAAIoG,KAAOA,EAAI,YAAY,KAAKA,EAAI,KAAK;AACrC,cAAM,EAAE,UAAA9F,GAAU,KAAAH,EAAA,IAAQiG;AAC1B,aAAK,iBAAiB9F,CAAQ,GAC9B,KAAK,eAAeH,CAAG;AAAA,MAC3B;AAAA,IACJ;AAAA,EACJ;AAAA,EACA,iBAAiB;AACb,WAAO,IAAI,QAAQ,OAAOkR,GAASqE,MAAW;AAC1C,YAAMlU,IAAO,KAAK,IAAI,SAAS,eAAA,GACzBw1B,IAAkB,KAAK,IAAI,OAAO;AACxC,UAAIh3B,IAAgB,CAAA;AACpB,eAAS2L,IAAI,GAAGA,IAAInK,EAAK,QAAQmK;AAC7B,iBAASrG,IAAI,GAAGA,IAAI0xB,EAAgB,QAAQ1xB,KAAK;AAC7C,gBAAMlF,IAAS,KAAK,IAAI,SAAS,gBAAgBoB,EAAKmK,CAAC,CAAC,GAElDxL,IADiB62B,EAAgB1xB,CAAC,EACb,KACrBkM,IAAU,MAAM,KAAK,IAAI,SAAS,aAAapR,GAAQD,CAAG;AAChE,UAAI,MAAM,QAAQqR,CAAO,KAAKA,EAAQ,UAClCxR,EAAO,KAAKwR,CAAO;AAAA,QAE3B;AAEJ,MAAIxR,EAAO,UACP0V,EAAO1V,CAAM,GACb,KAAK,IAAI,KAAK,MAAM,MAEpBqR,EAAQ,CAAA,CAAE,GACV,KAAK,IAAI,KAAK,MAAM;AAAA,IAE5B,CAAC;AAAA,EACL;AAAA,EACA,qBAAqB;AACjB,WAAO,KAAK,IAAI,SAAS,mBAAA;AAAA,EAC7B;AAAA,EACA,SAAShM,GAAWC,GAAW;AAC3B,SAAK,SAAS,UAAUD,GAAGC,CAAC;AAAA,EAChC;AAAA,EAEA,UAAUD,GAAW;AACjB,SAAK,SAAS,WAAWA,CAAC;AAAA,EAC9B;AAAA,EAEA,eAAelF,GAAa;AACxB,SAAK,SAAS,eAAeA,CAAG;AAAA,EACpC;AAAA,EACA,eAAeA,GAAa;AACxB,SAAK,SAAS,eAAeA,CAAG;AAAA,EACpC;AAAA,EACA,iBAAiBE,GAAkB;AAC/B,SAAK,SAAS,iBAAiBA,CAAQ;AAAA,EAC3C;AAAA,EACA,iBAAiBC,GAAkB;AAC/B,SAAK,SAAS,iBAAiBA,CAAQ;AAAA,EAC3C;AAAA,EACA,UAAUgF,GAAW;AACjB,SAAK,SAAS,WAAWA,CAAC;AAAA,EAC9B;AAAA,EACA,iBAAiB2xB,GAAa1vB,IAAS,IAAM;AACzC,SAAK,IAAI,SAAS,iBAAiB0vB,GAAM1vB,CAAM;AAAA,EACnD;AAAA,EACA,mBAAmB;AACf,WAAO,KAAK,IAAI,SAAS,iBAAA;AAAA,EAC7B;AAAA,EACA,iBAAiB;AACb,SAAK,IAAI,SAAS,eAAA,GAClB,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,mBAAmBrH,GAAU;AACzB,UAAME,IAAS,KAAK,IAAI,SAAS,gBAAgBF,CAAG;AACpD,SAAK,IAAI,SAAS,mBAAmBE,CAAM,GAC3C,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,mBAAmBqP,GAAaynB,IAAW,IAAM;AAC7C,IAAAznB,EAAK,QAAQ,CAACvP,MAAQ;AAClB,YAAME,IAAS,KAAK,IAAI,SAAS,gBAAgBF,CAAG;AACpD,WAAK,IAAI,SAAS,gBAAgBE,GAAQ82B,GAAU,EAAK;AAAA,IAC7D,CAAC,GACD,KAAK,IAAI,KAAK,mBAAmB,KAAK,kBAAkB,GACxD,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,sBAAsBD,GAAgBC,IAAW,IAAM;AACnD,IAAAD,EAAK,QAAQ,CAAC92B,MAAQ;AAClB,WAAK,IAAI,SAAS,gBAAgBA,GAAK+2B,GAAU,EAAK;AAAA,IAC1D,CAAC,GACD,KAAK,IAAI,KAAK,mBAAmB,KAAK,kBAAkB,GACxD,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,qBAAqB;AACjB,SAAK,IAAI,SAAS,mBAAA,GAClB,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,gBAAgB92B,GAAgBmH,GAAiB;AAC7C,SAAK,IAAI,SAAS,WAAWnH,GAAQmH,CAAM,GAC3C,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,gBAAgBA,GAAiB;AAC7B,SAAK,IAAI,SAAS,UAAUA,CAAM,GAClC,KAAK,IAAI,KAAK,MAAM;AAAA,EACxB;AAAA,EACA,mBAAmB;AACf,WAAO,KAAK,IAAI,SAAS,iBAAA;AAAA,EAC7B;AAAA,EACA,uBAAuBjH,GAA4B;AAC/C,WAAO,KAAK,IAAI,SAAS,uBAAuBA,CAAQ;AAAA,EAC5D;AAAA,EACA,aAAaF,GAAgBD,GAAa;AACtC,WAAO,KAAK,IAAI,SAAS,aAAaC,GAAQD,CAAG;AAAA,EACrD;AAAA,EACA,oBAAoBG,GAAkBD,GAAkB;AACpD,WAAO,KAAK,IAAI,SAAS,mCAAmCC,GAAUD,CAAQ;AAAA,EAClF;AAAA,EACA,kBAAkB;AACd,SAAK,YAAY,KAAA;AAAA,EACrB;AAAA,EACA,WAAW;AACP,WAAO;AAAA,MACH,cAAAwE;AAAA,MACA,cAAAJ;AAAA,MACA,iBAAAd;AAAA,MACA,oBAAAS;AAAA,IAAA;AAAA,EAER;AAAA,EACA,eAAejE,GAAa;A9B3YhC,QAAAyN;A8B4YQ,YAAOA,IAAA,KAAK,IAAI,SAAS,eAAezN,CAAG,MAApC,gBAAAyN,EAAuC;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAIA,UAAU;AACN,SAAK,UAAU,QAAA,GACf,KAAK,MAAM,QAAA,GACX,KAAK,OAAO,QAAA,GACZ,KAAK,QAAQ,QAAA,GACb,KAAK,SAAS,QAAA,GACd,KAAK,SAAS,QAAA,GACd,KAAK,YAAY,QAAA,GACjB,KAAK,IAAI,QAAA,GACT,KAAK,IAAI,iBAAiB,OAAA;AAAA,EAC9B;AACJ;","x_google_ignoreList":[21,22,23,24]}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/Validator.ts","../src/util.ts","../src/BaseCell.ts","../src/Cell.ts","../src/Database.ts","../src/History.ts","../src/EventBrowser.ts","../src/EventBus.ts","../src/Paint.ts","../src/Config.ts","../src/Icons.ts","../src/CellHeader.ts","../src/EventTable.ts","../src/Context.ts","../src/Scroller.ts","../src/Header.ts","../src/Row.ts","../src/Body.ts","../src/Footer.ts","../src/Selector.ts","../src/Autofill.ts","../node_modules/.pnpm/@floating-ui+utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.mjs","../node_modules/.pnpm/@floating-ui+core@1.7.3/node_modules/@floating-ui/core/dist/floating-ui.core.mjs","../node_modules/.pnpm/@floating-ui+utils@0.2.10/node_modules/@floating-ui/utils/dist/floating-ui.utils.dom.mjs","../node_modules/.pnpm/@floating-ui+dom@1.7.3/node_modules/@floating-ui/dom/dist/floating-ui.dom.mjs","../src/Tooltip.ts","../src/Editor.ts","../src/Empty.ts","../src/Overlayer.ts","../src/ContextMenu.ts","../src/EVirtTable.ts"],"sourcesContent":["import { Column } from './types';\r\n\r\nexport type Rule = {\r\n required?: boolean;\r\n pattern?: RegExp;\r\n validator?: RuleValidator;\r\n message?: string;\r\n};\r\nexport type RuleParam = {\r\n field: string; // 兼容旧版\r\n fieldValue: string; // 兼容旧版\r\n value: string;\r\n column: Column;\r\n colIndex: number;\r\n rowIndex: number;\r\n row: any;\r\n key: string;\r\n rowKey: string;\r\n} & Rule;\r\nexport type RuleValidator = (rule: Rule, value: any, callback: (message?: string) => void) => void;\r\nexport type Rules = Rule[];\r\n\r\nexport type ValidateResult = RuleParam[];\r\n\r\nexport default class Validator {\r\n private rules: Rules | Rule;\r\n\r\n constructor(rules: Rules | Rule) {\r\n this.rules = rules;\r\n }\r\n\r\n validate(params: RuleParam) {\r\n const errors: ValidateResult = [];\r\n const { column, row, key, rowKey, colIndex, rowIndex, value, field, fieldValue } = params;\r\n if (!Array.isArray(this.rules)) {\r\n this.rules = [this.rules];\r\n }\r\n for (const rule of this.rules) {\r\n if (rule.validator) {\r\n const ruleParam: RuleParam = {\r\n field,\r\n fieldValue,\r\n value,\r\n column,\r\n colIndex,\r\n rowIndex,\r\n row,\r\n key,\r\n rowKey,\r\n ...rule,\r\n };\r\n rule.validator(ruleParam, value, (message) => {\r\n if (message) {\r\n errors.push({\r\n ...ruleParam,\r\n message: message,\r\n });\r\n }\r\n });\r\n }\r\n if (!rule.required && (value === undefined || value === null || value === '')) {\r\n return errors;\r\n }\r\n if (rule.pattern && !rule.pattern.test(value)) {\r\n errors.push({\r\n value,\r\n column,\r\n row,\r\n key,\r\n rowKey,\r\n colIndex,\r\n rowIndex,\r\n field,\r\n fieldValue,\r\n message: rule.message || `${key} is pattern validation error`,\r\n });\r\n }\r\n if (rule.required && (value === undefined || value === null || value === '')) {\r\n errors.push({\r\n value,\r\n column,\r\n row,\r\n key,\r\n rowKey,\r\n colIndex,\r\n rowIndex,\r\n field,\r\n fieldValue,\r\n message: rule.message || `${key} is required`,\r\n });\r\n }\r\n }\r\n return errors;\r\n }\r\n}\r\n","import { Column, SpanParams } from './types';\r\n\r\nfunction generateShortUUID(): string {\r\n return 'xxxxxxxxxxxxxxxxxx'.replace(/[x]/g, function (c) {\r\n const r = (Math.random() * 16) | 0;\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\r\n return v.toString(16);\r\n });\r\n}\r\nfunction throttle<T extends (...args: any) => any>(func: T, delay: number): T {\r\n let lastCalledTime = 0;\r\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\r\n\r\n return function (this: ThisParameterType<T>, ...args: Parameters<T>): ReturnType<T> | undefined {\r\n const now = new Date().getTime();\r\n const elapsedTime = now - lastCalledTime;\r\n\r\n if (!lastCalledTime || elapsedTime >= delay) {\r\n func.apply(this, args);\r\n lastCalledTime = now;\r\n } else if (!timeoutId) {\r\n timeoutId = setTimeout(() => {\r\n func.apply(this, args);\r\n lastCalledTime = new Date().getTime();\r\n timeoutId = undefined;\r\n }, delay - elapsedTime);\r\n }\r\n\r\n return undefined;\r\n } as T;\r\n}\r\n/**\r\n * 根据children获取最大深度\r\n * @param data\r\n * @returns\r\n */\r\nfunction getMaxRow(data: Column[] = []): number {\r\n if (data.length) {\r\n return data.map((item) => getMaxRow(item.children) + 1).sort((a, b) => b - a)[0];\r\n }\r\n return 0;\r\n}\r\nfunction sortFixed(arr: Column[] = []) {\r\n let lefts: Column[] = [];\r\n let centers: Column[] = [];\r\n let right: Column[] = [];\r\n arr.forEach((item) => {\r\n if (item.fixed === 'left') {\r\n lefts.push(item);\r\n } else if (item.fixed === 'right') {\r\n right.push(item);\r\n } else {\r\n centers.push(item);\r\n }\r\n });\r\n return [\r\n ...lefts.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0)),\r\n ...centers.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0)),\r\n ...right.sort((a, b) => (a.sort ?? 0) - (b.sort ?? 0)),\r\n ];\r\n}\r\nfunction calCrossSpan(arr: Column[] = [], maxRow: number = 1, level: number = 0): Column[] {\r\n return arr.map((config) => {\r\n if (config.children) {\r\n let colspan = 0;\r\n let fixed = config.fixed;\r\n config.children.forEach((item) => {\r\n item.fixed = fixed;\r\n });\r\n const children = calCrossSpan(config.children, maxRow - 1, level + 1);\r\n if (children) {\r\n children.forEach((item) => {\r\n colspan += item.colspan ?? 0;\r\n });\r\n }\r\n return {\r\n ...config,\r\n width: config.width,\r\n level,\r\n rowspan: 1,\r\n colspan,\r\n children,\r\n };\r\n }\r\n return {\r\n ...config,\r\n level,\r\n rowspan: maxRow,\r\n colspan: 1,\r\n };\r\n });\r\n}\r\nfunction toLeaf(arr: Column[] = []): Column[] {\r\n let tmp: Column[] = [];\r\n arr.forEach((item) => {\r\n if (item.children) {\r\n tmp = tmp.concat(toLeaf(item.children));\r\n } else {\r\n tmp.push(item);\r\n }\r\n });\r\n return tmp;\r\n}\r\n\r\ntype DebouncedFunction<F extends (...args: any[]) => any> = (...args: Parameters<F>) => void;\r\nfunction debounce<F extends (...args: any[]) => any>(func: F, delay: number): DebouncedFunction<F> {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n return function (...args: Parameters<F>): void {\r\n if (timeoutId !== null) {\r\n clearTimeout(timeoutId);\r\n }\r\n timeoutId = setTimeout(() => {\r\n func(...args);\r\n }, delay);\r\n };\r\n}\r\nconst regUniversalNewLine = /^(\\r\\n|\\n\\r|\\r|\\n)/;\r\nconst regNextCellNoQuotes = /^[^\\t\\r\\n]+/;\r\nconst regNextEmptyCell = /^\\t/;\r\n/**\r\n * @decodeSpreadsheetStr\r\n * @desc Decode spreadsheet string into array. refer from http://github.com/warpech/sheetclip/\r\n * @param {string} str The string to parse.\r\n * @returns {array}\r\n */\r\nfunction decodeSpreadsheetStr(str: string) {\r\n let arr = [['']];\r\n\r\n if (str.length === 0) {\r\n return arr;\r\n }\r\n\r\n let column = 0;\r\n let row = 0;\r\n let lastLength;\r\n\r\n while (str.length > 0) {\r\n if (lastLength === str.length) {\r\n // In the case If in last cycle we didn't match anything, we have to leave the infinite loop\r\n break;\r\n }\r\n\r\n lastLength = str.length;\r\n\r\n if (str.match(regNextEmptyCell)) {\r\n str = str.replace(regNextEmptyCell, '');\r\n\r\n column += 1;\r\n arr[row][column] = '';\r\n } else if (str.match(regUniversalNewLine)) {\r\n str = str.replace(regUniversalNewLine, '');\r\n column = 0;\r\n row += 1;\r\n\r\n arr[row] = [''];\r\n } else {\r\n let nextCell = '';\r\n\r\n if (str.startsWith('\"')) {\r\n let quoteNo = 0;\r\n let isStillCell = true;\r\n\r\n while (isStillCell) {\r\n const nextChar = str.slice(0, 1);\r\n\r\n if (nextChar === '\"') {\r\n quoteNo += 1;\r\n }\r\n\r\n nextCell += nextChar;\r\n\r\n str = str.slice(1);\r\n\r\n if (str.length === 0 || (str.match(/^[\\t\\r\\n]/) && quoteNo % 2 === 0)) {\r\n isStillCell = false;\r\n }\r\n }\r\n\r\n nextCell = nextCell\r\n .replace(/^\"/, '')\r\n .replace(/\"$/, '')\r\n .replace(/[\"]*/g, (match) => new Array(Math.floor(match.length / 2)).fill('\"').join(''));\r\n } else {\r\n const matchedText = str.match(regNextCellNoQuotes);\r\n\r\n nextCell = matchedText ? matchedText[0] : '';\r\n str = str.slice(nextCell.length);\r\n }\r\n\r\n arr[row][column] = nextCell;\r\n }\r\n }\r\n // 去除 excel 最后一个多余的换行数据\r\n if (Array.isArray(arr) && arr.length > 1) {\r\n if (arr[arr.length - 1].length === 1 && arr[arr.length - 1][0] === '') {\r\n arr = arr.slice(0, arr.length - 1);\r\n }\r\n }\r\n\r\n return arr;\r\n}\r\n\r\n/**\r\n * @decodeSpreadsheetStr\r\n * @desc encode array to spreadsheet string. refer from http://github.com/warpech/sheetclip/\r\n * @param {array} str The string to parse.\r\n * @returns {string}\r\n */\r\nfunction encodeToSpreadsheetStr(arr: string[][]) {\r\n let r;\r\n let rLen;\r\n let c;\r\n let cLen;\r\n let str = '';\r\n let val;\r\n\r\n for (r = 0, rLen = arr.length; r < rLen; r += 1) {\r\n cLen = arr[r].length;\r\n\r\n for (c = 0; c < cLen; c += 1) {\r\n if (c > 0) {\r\n str += '\\t';\r\n }\r\n val = arr[r][c];\r\n\r\n if (typeof val === 'string') {\r\n if (val.indexOf('\\n') > -1) {\r\n str += `\"${val.replace(/\"/g, '\"\"')}\"`;\r\n } else {\r\n str += val;\r\n }\r\n } else if (val === null || val === void 0) {\r\n // void 0 resolves to undefined\r\n str += '';\r\n } else {\r\n str += val;\r\n }\r\n }\r\n\r\n if (r !== rLen - 1) {\r\n str += '\\n';\r\n }\r\n }\r\n\r\n return str;\r\n}\r\n// 获取合并单元格的spanArr,针对行数据相同key合并\r\nfunction getSpanArrByRow(list: any, key: string, relationRowKeys: string[] = []) {\r\n let contactDot = 0;\r\n const spanArr: number[] = [];\r\n list.forEach((item: any, index: number) => {\r\n if (index === 0) {\r\n spanArr.push(1);\r\n } else {\r\n const curValue = relationRowKeys.reduce((acc, key) => `${acc}${item[key] ?? ''}`, '') || item[key];\r\n const pValue =\r\n relationRowKeys.reduce((acc, key) => `${acc}${list[index - 1][key] ?? ''}`, '') || list[index - 1][key];\r\n if (curValue === pValue) {\r\n spanArr[contactDot] += 1;\r\n spanArr.push(0);\r\n } else {\r\n spanArr.push(1);\r\n contactDot = index;\r\n }\r\n }\r\n });\r\n return spanArr;\r\n}\r\nfunction getSpanObjByColumn(row: any, columns: any) {\r\n let keyPre = '';\r\n let keyDot = '';\r\n const spanObj: any = {};\r\n columns.forEach((item: any, index: number) => {\r\n if (index === 0) {\r\n keyPre = item.key;\r\n keyDot = item.key;\r\n spanObj[item.key] = 1;\r\n } else {\r\n // eslint-disable-next-line no-undef\r\n if (row[item.key] === row[keyPre]) {\r\n spanObj[item.key] = 0;\r\n spanObj[keyDot] += 1;\r\n } else {\r\n spanObj[item.key] = 1;\r\n keyPre = item.key;\r\n keyDot = item.key;\r\n }\r\n }\r\n });\r\n return spanObj;\r\n}\r\n// 合并行单元格\r\nfunction mergeRowCell(params: SpanParams, mergeRowkey: string, relationRowKeys: string[] = []) {\r\n // 合并单元格\r\n const { visibleRows, rowIndex, headIndex } = params;\r\n const spanArr = getSpanArrByRow(visibleRows, mergeRowkey, relationRowKeys);\r\n if (spanArr[rowIndex - headIndex] === 0) {\r\n return {\r\n rowspan: 0,\r\n colspan: 0,\r\n relationRowKeys,\r\n mergeRow: true,\r\n };\r\n }\r\n return {\r\n rowspan: spanArr[rowIndex - headIndex],\r\n colspan: 1,\r\n relationRowKeys,\r\n mergeRow: true,\r\n };\r\n}\r\nfunction mergeColCell(params: SpanParams, mergeColKeys: string[] = []) {\r\n const { column, row, visibleLeafColumns } = params;\r\n const columns = visibleLeafColumns.filter((item) => mergeColKeys.includes(item.key));\r\n // 合并动态列单元格\r\n if (mergeColKeys.includes(column.key)) {\r\n const spanObj = getSpanObjByColumn(row, columns);\r\n if (spanObj[column.key] === 0) {\r\n return {\r\n rowspan: 0,\r\n colspan: 0,\r\n relationColKeys: mergeColKeys,\r\n mergeCol: true,\r\n };\r\n }\r\n return {\r\n rowspan: 1,\r\n colspan: spanObj[column.key],\r\n relationColKeys: mergeColKeys,\r\n mergeCol: true,\r\n };\r\n }\r\n}\r\n/**\r\n * 获取某个 CSS 变量的实际值\r\n * @param name 变量名(可以带或不带前缀,例如 \"color-primary\" 或 \"--color-primary\")\r\n * @param el 可选元素,默认为 document.documentElement\r\n * @returns CSS 变量的计算值(如 \"#1e90ff\")\r\n */\r\nfunction getCssVar(name: string, el: HTMLElement = document.documentElement): string {\r\n const key = name.startsWith('--') ? name : `--${name}`;\r\n const styles = getComputedStyle(el);\r\n return styles.getPropertyValue(key).trim();\r\n}\r\nexport {\r\n debounce,\r\n throttle,\r\n generateShortUUID,\r\n toLeaf,\r\n sortFixed,\r\n calCrossSpan,\r\n getMaxRow,\r\n decodeSpreadsheetStr,\r\n encodeToSpreadsheetStr,\r\n mergeRowCell,\r\n mergeColCell,\r\n getSpanArrByRow,\r\n getSpanObjByColumn,\r\n getCssVar,\r\n};\r\n","import Context from './Context';\r\nimport { CellType, Fixed } from './types';\r\n\r\nexport default class BaseCell {\r\n ctx: Context;\r\n x = 0;\r\n y = 0;\r\n width = 0;\r\n height = 0;\r\n fixed?: Fixed;\r\n cellType: CellType;\r\n constructor(ctx: Context, x: number, y: number, width: number, height: number, cellType: CellType, fixed?: Fixed) {\r\n this.ctx = ctx;\r\n this.x = x;\r\n this.y = y;\r\n this.width = width;\r\n this.height = height;\r\n this.fixed = fixed;\r\n this.cellType = cellType;\r\n }\r\n isHorizontalVisible() {\r\n if (this.fixed) {\r\n return true;\r\n }\r\n const { stageWidth, fixedLeftWidth, scrollX, fixedRightWidth } = this.ctx;\r\n const offsetWidth = stageWidth;\r\n return !(\r\n this.x + this.width - fixedLeftWidth - scrollX <= 0 || this.x - scrollX >= offsetWidth - fixedRightWidth\r\n );\r\n }\r\n isVerticalVisible() {\r\n const { stageHeight, scrollY } = this.ctx;\r\n const offsetHeight = stageHeight;\r\n return !(this.y + this.height - scrollY <= 0 || this.y - scrollY >= offsetHeight);\r\n }\r\n getDrawX() {\r\n if (this.fixed === 'left') {\r\n return this.x;\r\n }\r\n if (this.fixed === 'right') {\r\n // 可见区域宽度 -到右边界的距离即(表头宽度 - x坐标)\r\n const {\r\n stageWidth,\r\n config: { SCROLLER_TRACK_SIZE },\r\n } = this.ctx;\r\n const x = stageWidth - (this.ctx.header.width - this.x) - SCROLLER_TRACK_SIZE;\r\n return x;\r\n }\r\n return this.x - this.ctx.scrollX;\r\n }\r\n getDrawY() {\r\n if (this.cellType === 'header') {\r\n return this.y;\r\n }\r\n // footer固定时\r\n if (this.cellType === 'footer' && this.ctx.config.FOOTER_FIXED) {\r\n return this.y;\r\n }\r\n return this.y - this.ctx.scrollY;\r\n }\r\n getLeftFixedX() {\r\n return this.x - this.ctx.scrollX;\r\n }\r\n /**\r\n * RightFixed时相对StageX\r\n * @returns\r\n */\r\n getRightFixedX() {\r\n // const { SCROLLER_TRACK_SIZE } = this.grid.config;\r\n // if (!this.grid.header) {\r\n // return 0;\r\n // }\r\n // return (\r\n // this.grid.header.width -\r\n // this.x -\r\n // this.grid.layer.x() -\r\n // (this.grid.header.width - this.x) +\r\n // this.grid.stage.width() -\r\n // SCROLLER_TRACK_SIZE -\r\n // (this.grid.header.width - this.x)\r\n // );\r\n }\r\n}\r\n","import type {\n Column,\n Fixed,\n Type,\n Align,\n VerticalAlign,\n CellType,\n Render,\n FormatterMethod,\n CellTypeMethod,\n CellRenderMethod,\n CellEditorMethod,\n SpanMethod,\n CellHoverIconMethod,\n CellStyleMethod,\n OverflowTooltipPlacement,\n SpanInfo,\n SelectorCellValueType,\n} from './types';\nimport Context from './Context';\nimport BaseCell from './BaseCell';\nimport { Rule, Rules } from './Validator';\nexport default class Cell extends BaseCell {\n formatter?: FormatterMethod;\n formatterFooter?: FormatterMethod;\n hoverIconName?: string = '';\n operation = false;\n align: Align;\n verticalAlign: VerticalAlign;\n fixed?: Fixed;\n type: Type | '';\n editorType: string;\n editorProps: any;\n cellType: CellType;\n level: number;\n colspan = 1;\n rowspan = 1;\n mergeRow = false;\n mergeCol = false;\n relationRowKeys: string[] = []; // 合并单元格关联key\n relationColKeys: string[] = []; // 合并单元格关联key\n key: string;\n column: Column;\n rowIndex: number;\n colIndex: number;\n rowKey: string;\n row: any;\n value: any;\n render: Render;\n renderFooter: Render;\n style: any = {};\n rules: Rules | Rule = [];\n message: string = '';\n text: string = '';\n displayText: string = '';\n visibleWidth = 0;\n visibleHeight = 0;\n isHasChanged = false;\n drawX = 0;\n drawY = 0;\n drawCellBgColor = '';\n drawCellSkyBgColor = '';\n drawTextColor = '';\n drawTextX = 0;\n drawTextY = 0;\n drawTextWidth = 0;\n drawTextHeight = 0;\n // 画tree图标\n drawTreeImageX = 0;\n drawTreeImageY = 0;\n drawTreeImageWidth = 0;\n drawTreeImageHeight = 0;\n drawTreeImageName = '';\n drawTreeImageSource?: HTMLImageElement;\n // 画selection图标\n drawSelectionImageX = 0;\n drawSelectionImageY = 0;\n drawSelectionImageWidth = 0;\n drawSelectionImageHeight = 0;\n drawSelectionImageName = '';\n drawSelectionImageSource?: HTMLImageElement;\n // 画hover图标\n drawHoverImageX = 0;\n drawHoverImageY = 0;\n drawHoverImageWidth = 0;\n drawHoverImageHeight = 0;\n drawHoverImageName = '';\n drawHoverImageSource?: HTMLImageElement;\n ellipsis = false;\n rowExpand = false;\n rowHasChildren = false;\n overflowTooltipShow = true;\n selectorCellValueType: SelectorCellValueType = 'value';\n overflowTooltipMaxWidth = 500;\n overflowTooltipPlacement: OverflowTooltipPlacement = 'top';\n\n constructor(\n ctx: Context,\n rowIndex: number,\n colIndex: number,\n x: number,\n y: number,\n width: number,\n height: number,\n column: Column,\n row: any,\n cellType: CellType = 'body',\n ) {\n super(ctx, x, y, width, height, cellType, column.fixed);\n this.visibleWidth = this.width;\n this.visibleHeight = this.height;\n this.colIndex = colIndex;\n this.rowIndex = rowIndex;\n this.key = column.key;\n this.type = column.type || '';\n this.editorType = column.editorType || 'text';\n this.selectorCellValueType =\n column.selectorCellValueType || this.ctx.config.SELECTOR_CELL_VALUE_TYPE || 'value';\n this.editorProps = column.editorProps || {};\n this.cellType = cellType;\n this.align = column.align || this.ctx.config.COLUMNS_ALIGN;\n this.verticalAlign = column.verticalAlign || this.ctx.config.COLUMNS_VERTICAL_ALIGN;\n this.fixed = column.fixed;\n this.level = column.level || 0;\n this.operation = column.operation || false;\n this.column = column;\n this.rules = column.rules || [];\n this.row = row;\n this.rowKey =\n this.cellType === 'body'\n ? this.ctx.database.getRowKeyForRowIndex(rowIndex)\n : `${this.cellType}_${this.rowIndex}`;\n this.value = this.getValue();\n this.render = column.render;\n this.overflowTooltipShow = column.overflowTooltipShow === false ? false : true;\n this.overflowTooltipMaxWidth = column.overflowTooltipMaxWidth || 500;\n this.overflowTooltipPlacement = column.overflowTooltipPlacement || 'top';\n this.renderFooter = column.renderFooter;\n this.hoverIconName = column.hoverIconName;\n this.formatter = column.formatter;\n this.formatterFooter = column.formatterFooter;\n this.update();\n }\n setWidthHeight(width: number, height: number) {\n this.width = width;\n this.height = height;\n }\n getValidationMessage() {\n const errors = this.ctx.database.getValidationError(this.rowKey, this.key);\n if (Array.isArray(errors) && errors.length) {\n const [err] = errors;\n this.message = err.message || '';\n }\n return this.message;\n }\n update() {\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\n this.drawTextX = this.drawX;\n this.drawTextY = this.drawY;\n this.isHasChanged = this.ctx.database.isHasChangedData(this.rowKey, this.key);\n this.updateSpan();\n this.drawTextWidth = this.visibleWidth;\n this.drawTextHeight = this.visibleHeight;\n this.updateStyle();\n this.updateType();\n this.updateHoverIcon();\n this.updateSelection();\n this.updateTree();\n this.updateEditor();\n this.updateRender();\n this.getValidationMessage();\n this.updateContainer();\n this.text = this.getText();\n this.displayText = this.getDisplayText();\n }\n updateSpan() {\n // 合计不合并\n if (this.cellType === 'footer') {\n return;\n }\n const { SPAN_METHOD } = this.ctx.config;\n if (typeof SPAN_METHOD === 'function') {\n const spanMethod: SpanMethod = SPAN_METHOD;\n const {\n colspan = 1,\n rowspan = 1,\n relationRowKeys,\n relationColKeys,\n mergeRow = false,\n mergeCol = false,\n } = spanMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n headIndex: this.ctx.body.headIndex,\n headPosition: this.ctx.database.getPositionForRowIndex(this.ctx.body.headIndex),\n visibleRows: this.ctx.body.visibleRows,\n visibleLeafColumns: this.ctx.header.visibleLeafColumns,\n rows: this.ctx.body.data,\n }) || {};\n if (Array.isArray(relationRowKeys) && relationRowKeys.length > 0) {\n this.relationRowKeys = relationRowKeys;\n } else {\n this.relationRowKeys = [this.key];\n }\n if (Array.isArray(relationColKeys) && relationColKeys.length > 0) {\n this.relationColKeys = relationColKeys;\n } else {\n this.relationColKeys = [this.key];\n }\n this.mergeCol = mergeCol;\n this.mergeRow = mergeRow;\n this.colspan = colspan;\n this.rowspan = rowspan;\n this.visibleWidth = this.getWidthByColIndexColSpan(this.colIndex, this.colspan);\n this.visibleHeight = this.ctx.database.getHeightByRowIndexRowSpan(this.rowIndex, this.rowspan);\n }\n }\n updateSpanInfo() {\n // 列合并单元格\n if (this.mergeRow || this.mergeCol) {\n const spanInfo = this.getSpanInfo();\n this.height = spanInfo.height;\n this.width = spanInfo.width;\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\n this.drawY -= spanInfo.offsetTop;\n this.drawX -= spanInfo.offsetLeft;\n }\n }\n updateType() {\n // 更改类型\n const { BODY_CELL_TYPE_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_TYPE_METHOD === 'function') {\n const cellTypeMethod: CellTypeMethod = BODY_CELL_TYPE_METHOD;\n const type = cellTypeMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (type !== undefined) {\n this.type = type;\n }\n }\n }\n updateEditor() {\n // 更改类型\n const { BODY_CELL_EDITOR_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_EDITOR_METHOD === 'function') {\n const CellEditorMethod: CellEditorMethod = BODY_CELL_EDITOR_METHOD;\n const editorProps = CellEditorMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (editorProps !== undefined) {\n const { type, props = {} } = editorProps;\n this.editorType = type;\n this.editorProps = props;\n }\n }\n }\n updateRender() {\n const { BODY_CELL_RENDER_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_RENDER_METHOD === 'function') {\n const cellRenderMethod: CellRenderMethod = BODY_CELL_RENDER_METHOD;\n const render = cellRenderMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变类型\n if (render !== undefined) {\n this.render = render;\n }\n }\n }\n validate() {\n this.ctx.database\n .getValidator(this.rowKey, this.key)\n .then(() => {\n this.ctx.database.setValidationError(this.rowKey, this.key, []);\n this.message = '';\n })\n .catch((errors) => {\n if (Array.isArray(errors) && errors.length) {\n const [err] = errors;\n this.message = err.message;\n this.ctx.database.setValidationError(this.rowKey, this.key, errors);\n }\n })\n .finally(() => {\n this.ctx.emit('draw');\n });\n }\n\n /**\n * 更新样式\n */\n updateStyle() {\n this.style = this.getOverlayerViewsStyle();\n }\n private updateTree() {\n const { CELL_PADDING = 0 } = this.ctx.config;\n const { rowKey, cellType } = this;\n let icon = undefined;\n let iconOffsetX = 0;\n let iconName = '';\n if (!(['tree', 'selection-tree', 'tree-selection'].includes(this.type) && cellType === 'body')) {\n return;\n }\n\n const row = this.ctx.database.getRowForRowKey(rowKey);\n const { expand = false, hasChildren = false, expandLoading = false, level = 0 } = row || {};\n this.rowExpand = expand;\n this.rowHasChildren = hasChildren;\n\n // 计算树形图标的偏移量\n const { TREE_INDENT = 16, CHECKBOX_SIZE, TREE_ICON_SIZE } = this.ctx.config;\n iconOffsetX = level * TREE_INDENT;\n\n if (expandLoading) {\n const loadingIcon = this.ctx.icons.get('loading');\n iconName = 'loading';\n icon = loadingIcon;\n } else if (hasChildren) {\n const expandIcon = this.ctx.icons.get('expand');\n const shrinkIcon = this.ctx.icons.get('shrink');\n icon = !expand ? expandIcon : shrinkIcon;\n iconName = !expand ? 'expand' : 'shrink';\n }\n\n let iconWidth = TREE_ICON_SIZE;\n let iconHeight = TREE_ICON_SIZE;\n let drawX = this.drawX;\n if (this.align === 'center' || this.align === 'right') {\n drawX = this.drawX + (this.visibleWidth - iconWidth - 2 * CELL_PADDING) / 2;\n // 居中对齐,改成左对齐\n this.align = 'left';\n }\n let iconX = drawX + iconOffsetX + CELL_PADDING;\n let iconY = this.drawY + (this.visibleHeight - iconHeight) / 2;\n let drawTextX = iconOffsetX + this.drawX + iconWidth - 0.5;\n if (this.type === 'selection-tree') {\n // 树形图标在左侧,checkbox 在树形图标右侧\n iconX = iconOffsetX + this.drawSelectionImageX + this.drawSelectionImageWidth;\n drawTextX = iconX + iconWidth - CELL_PADDING / 2;\n } else if (this.type === 'tree-selection') {\n // 树形选择,两个图标宽度,文本已经有CELL_PADDING间距,/2看起来好看些\n drawTextX = iconX + CHECKBOX_SIZE + iconWidth - CELL_PADDING / 2;\n } else {\n // 普通tree,文本已经有CELL_PADDING间距,/2看起来好看些\n drawTextX = iconX + iconWidth - CELL_PADDING / 2;\n }\n // 更改文本距离\n this.drawTextX = drawTextX;\n this.drawTextWidth = this.drawX + this.visibleWidth - drawTextX; // 减去树形图标的宽度\n // 判断是否溢出格子\n if (iconX + iconWidth + CELL_PADDING > this.drawX + this.visibleWidth) {\n return;\n }\n if (iconY + iconHeight + CELL_PADDING > this.drawY + this.visibleHeight) {\n return;\n }\n\n if (icon) {\n this.drawTreeImageX = iconX;\n this.drawTreeImageY = iconY;\n this.drawTreeImageWidth = iconWidth;\n this.drawTreeImageHeight = iconHeight;\n this.drawTreeImageName = iconName;\n this.drawTreeImageSource = icon;\n }\n }\n\n private updateContainer() {\n const {\n BODY_BG_COLOR,\n EDIT_BG_COLOR,\n BODY_CELL_STYLE_METHOD,\n FOOTER_CELL_STYLE_METHOD,\n READONLY_TEXT_COLOR,\n BODY_TEXT_COLOR,\n FOOTER_TEXT_COLOR,\n FOOTER_BG_COLOR,\n HIGHLIGHT_SELECTED_ROW,\n HIGHLIGHT_SELECTED_ROW_COLOR,\n HIGHLIGHT_HOVER_ROW,\n HIGHLIGHT_HOVER_ROW_COLOR,\n STRIPE,\n STRIPE_COLOR,\n } = this.ctx.config;\n if (this.cellType === 'footer') {\n let bgColor = FOOTER_BG_COLOR;\n let textColor = FOOTER_TEXT_COLOR;\n if (typeof FOOTER_CELL_STYLE_METHOD === 'function') {\n const footerCellStyleMethod: CellStyleMethod = FOOTER_CELL_STYLE_METHOD;\n const { backgroundColor, color } =\n footerCellStyleMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n }) || {};\n if (backgroundColor) {\n bgColor = backgroundColor;\n }\n // 文字颜色\n if (color) {\n textColor = color;\n }\n }\n // 合计底部背景色\n this.drawCellSkyBgColor = 'transparent';\n this.drawCellBgColor = bgColor;\n this.drawTextColor = textColor;\n return;\n }\n // 高亮行,在背景色上加一层颜色\n let drawCellSkyBgColor = 'transparent';\n // 高亮行\n const hoverCell = this.ctx.hoverCell;\n const currentCell = this.ctx.currentCell;\n // 合并单元格\n let minY = this.rowIndex;\n let maxY = this.rowIndex;\n if (this.rowspan !== 1 && (HIGHLIGHT_HOVER_ROW || HIGHLIGHT_SELECTED_ROW)) {\n const spanInfo = this.getSpanInfo();\n const { yArr } = spanInfo;\n minY = yArr[0];\n maxY = yArr[1];\n }\n if (HIGHLIGHT_HOVER_ROW && hoverCell) {\n if (hoverCell.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_HOVER_ROW_COLOR;\n }\n if (hoverCell.rowIndex >= minY && hoverCell.rowIndex <= maxY) {\n drawCellSkyBgColor = HIGHLIGHT_HOVER_ROW_COLOR;\n }\n }\n\n if (HIGHLIGHT_SELECTED_ROW && currentCell) {\n if (currentCell.rowKey === this.rowKey) {\n drawCellSkyBgColor = HIGHLIGHT_SELECTED_ROW_COLOR;\n }\n if (currentCell.rowIndex >= minY && currentCell.rowIndex <= maxY) {\n drawCellSkyBgColor = HIGHLIGHT_SELECTED_ROW_COLOR;\n }\n }\n\n this.drawCellSkyBgColor = drawCellSkyBgColor;\n // 恢复默认背景色\n let bgColor = BODY_BG_COLOR;\n let textColor = BODY_TEXT_COLOR;\n // 只读\n if (!this.ctx.database.getReadonly(this.rowKey, this.key)) {\n bgColor = EDIT_BG_COLOR;\n textColor = READONLY_TEXT_COLOR;\n }\n // 斑马纹,编辑背景色下会失效\n if (STRIPE) {\n if (this.rowIndex % 2) {\n bgColor = STRIPE_COLOR;\n } else {\n bgColor = BODY_BG_COLOR;\n }\n }\n\n if (typeof BODY_CELL_STYLE_METHOD === 'function') {\n const cellStyleMethod: CellStyleMethod = BODY_CELL_STYLE_METHOD;\n const { backgroundColor, color } =\n cellStyleMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n isHasChanged: this.isHasChanged,\n value: this.getValue(),\n }) || {};\n if (backgroundColor) {\n bgColor = backgroundColor;\n }\n // 文字颜色\n if (color) {\n textColor = color;\n }\n }\n this.drawCellBgColor = bgColor;\n this.drawTextColor = textColor;\n }\n private updateSelection() {\n const { visibleWidth, visibleHeight, rowspan, colspan, cellType, type, rowIndex, rowKey } = this;\n //合并的选框不显示\n if (rowspan === 0 || colspan === 0) {\n return;\n }\n // 合计不显示\n if (cellType === 'footer') {\n return;\n }\n if (!['index-selection', 'selection', 'selection-tree', 'tree-selection'].includes(type)) {\n return;\n }\n const selectable = this.ctx.database.getRowSelectable(rowKey);\n const { CHECKBOX_SIZE = 0, CELL_PADDING } = this.ctx.config;\n let drawX = this.drawX + CELL_PADDING;\n if (this.align === 'center' || this.align === 'right') {\n drawX = this.drawX + (visibleWidth - CHECKBOX_SIZE) / 2;\n }\n let iconX = drawX;\n let iconY = this.drawY + (visibleHeight - CHECKBOX_SIZE) / 2;\n\n // 对于 selection-tree 类型,checkbox 应该居中显示\n if (type === 'selection-tree') {\n } else if (type === 'tree-selection') {\n // 更新选择器的位置\n const { TREE_INDENT = 16, TREE_ICON_SIZE } = this.ctx.config;\n const row = this.ctx.database.getRowForRowKey(rowKey);\n const { level = 0 } = row || {};\n const iconOffsetX = level * TREE_INDENT;\n iconX = drawX + TREE_ICON_SIZE + iconOffsetX; // 树形图标右侧 + 间距\n }\n\n let checkboxImage: HTMLImageElement | undefined = this.ctx.icons.get('checkbox-uncheck');\n let checkboxName = 'checkbox-uncheck';\n\n if (type === 'selection-tree' || type === 'tree-selection') {\n // 树形选择逻辑\n const treeState = this.ctx.database.getTreeSelectionState(rowKey);\n if (treeState.indeterminate && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-indeterminate');\n checkboxName = 'checkbox-indeterminate';\n } else if (treeState.checked && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-check');\n checkboxName = 'checkbox-check';\n } else if (!treeState.checked && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-uncheck');\n checkboxName = 'checkbox-uncheck';\n } else {\n checkboxImage = this.ctx.icons.get('checkbox-disabled');\n checkboxName = 'checkbox-disabled';\n }\n } else {\n // 普通选择逻辑\n const check = this.ctx.database.getRowSelection(rowKey);\n if (check && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-check');\n checkboxName = 'checkbox-check';\n } else if (check && !selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-check-disabled');\n checkboxName = 'checkbox-check-disabled';\n } else if (!check && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-uncheck');\n checkboxName = 'checkbox-uncheck';\n } else {\n checkboxImage = this.ctx.icons.get('checkbox-disabled');\n checkboxName = 'checkbox-disabled';\n }\n }\n // 判断是否溢出格子\n if (iconX + CHECKBOX_SIZE + CELL_PADDING > this.drawX + this.visibleWidth) {\n return;\n }\n if (iconY + CHECKBOX_SIZE + CELL_PADDING > this.drawY + this.visibleHeight) {\n return;\n }\n if (type === 'index-selection') {\n if (\n (this.ctx.hoverCell && this.ctx.hoverCell.rowIndex === rowIndex) ||\n ['checkbox-disabled', 'checkbox-check'].includes(checkboxName)\n ) {\n this.drawSelectionImageX = iconX;\n this.drawSelectionImageY = iconY;\n this.drawSelectionImageWidth = CHECKBOX_SIZE;\n this.drawSelectionImageHeight = CHECKBOX_SIZE;\n this.drawSelectionImageName = checkboxName;\n this.drawSelectionImageSource = checkboxImage;\n }\n } else {\n this.drawSelectionImageX = iconX;\n this.drawSelectionImageY = iconY;\n this.drawSelectionImageWidth = CHECKBOX_SIZE;\n this.drawSelectionImageHeight = CHECKBOX_SIZE;\n this.drawSelectionImageName = checkboxName;\n this.drawSelectionImageSource = checkboxImage;\n }\n }\n private updateHoverIcon() {\n const readonly = this.ctx.database.getReadonly(this.rowKey, this.key);\n if (readonly) {\n return;\n }\n const { BODY_CELL_HOVER_ICON_METHOD, CELL_HOVER_ICON_SIZE, CELL_PADDING, ENABLE_MERGE_CELL_LINK } =\n this.ctx.config;\n if (typeof BODY_CELL_HOVER_ICON_METHOD === 'function') {\n const hoverIconMethod: CellHoverIconMethod = BODY_CELL_HOVER_ICON_METHOD;\n const hoverIconName = hoverIconMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n // 可以动态改变hoverIconName\n if (hoverIconName !== undefined) {\n this.hoverIconName = hoverIconName;\n }\n }\n // 永远放在右边\n const { hoverCell } = this.ctx;\n if (this.hoverIconName && !this.ctx.editing && hoverCell) {\n let _x = 0;\n let _y = 0;\n if (hoverCell.rowKey === this.rowKey) {\n _x = this.drawX + this.width - CELL_HOVER_ICON_SIZE - CELL_PADDING;\n _y = this.drawY + (this.height - CELL_HOVER_ICON_SIZE) / 2;\n }\n // 合并单元格\n if (this.rowspan !== 1 && ENABLE_MERGE_CELL_LINK) {\n const spanInfo = this.getSpanInfo();\n const { yArr } = spanInfo;\n const minY = yArr[0];\n const maxY = yArr[1];\n if (hoverCell.rowIndex >= minY && hoverCell.rowIndex <= maxY) {\n const { width, height, offsetTop, offsetLeft } = spanInfo;\n _x = this.drawX - offsetLeft + width - CELL_HOVER_ICON_SIZE - CELL_PADDING;\n _y = this.drawY - offsetTop + (height - CELL_HOVER_ICON_SIZE) / 2;\n }\n }\n const drawImageSource = this.ctx.icons.get(this.hoverIconName);\n this.drawHoverImageX = _x;\n this.drawHoverImageY = _y;\n this.drawHoverImageWidth = CELL_HOVER_ICON_SIZE;\n this.drawHoverImageHeight = CELL_HOVER_ICON_SIZE;\n this.drawHoverImageName = this.hoverIconName;\n this.drawHoverImageSource = drawImageSource;\n }\n }\n // 过去跨度配置\n getSpanInfo(): SpanInfo {\n return this.ctx.database.getSpanInfo(this);\n }\n /**\n * 获取显示文本\n * @returns\n */\n getDisplayText() {\n if (this.cellType === 'footer') {\n // 插槽不显示文本\n if (this.renderFooter) {\n return '';\n }\n if (this.text === null || this.text === undefined) {\n return '';\n }\n return this.text;\n } else {\n // cellType === \"body\"\n // 被跨度单元格\n if (this.rowspan === 0 || this.colspan === 0) {\n return '';\n }\n // 插槽不显示文本\n if (this.render) {\n return '';\n }\n //\n if (\n this.type === 'index-selection' &&\n ((this.ctx.hoverCell && this.ctx.hoverCell.rowIndex === this.rowIndex) ||\n ['checkbox-disabled', 'checkbox-check'].includes(this.drawSelectionImageName))\n ) {\n return '';\n }\n if (this.text === null || this.text === undefined) {\n return '';\n }\n return `${this.text}`;\n }\n }\n /**\n * 获取文本\n * @returns\n */\n getText() {\n if (this.cellType === 'footer') {\n if (typeof this.formatterFooter === 'function') {\n const _text = this.formatterFooter({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.row[this.key],\n });\n return _text;\n }\n return this.row[this.key];\n }\n // cellType === \"body\"\n\n // formatter优先等级比较高\n if (typeof this.formatter === 'function') {\n const _text = this.formatter({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n return _text;\n }\n const { BODY_CELL_FORMATTER_METHOD } = this.ctx.config;\n if (typeof BODY_CELL_FORMATTER_METHOD === 'function') {\n const formatterMethod: FormatterMethod = BODY_CELL_FORMATTER_METHOD;\n const _text = formatterMethod({\n row: this.row,\n rowIndex: this.rowIndex,\n colIndex: this.colIndex,\n column: this.column,\n value: this.getValue(),\n });\n return _text;\n }\n if (['index-selection', 'index'].includes(this.type)) {\n const str = `${this.rowIndex + 1}`; // 索引\n return str; // 索引\n }\n this.value = this.ctx.database.getItemValue(this.rowKey, this.key);\n return this.value;\n }\n getValue() {\n return this.ctx.database.getItemValue(this.rowKey, this.key);\n }\n // 拓展格子可设置数据\n setValue(value: any) {\n this.ctx.setItemValueByEditor(this.rowKey, this.key, value);\n }\n /**\n * 获取样式\n */\n getOverlayerViewsStyle() {\n let left = `${this.drawX - this.ctx.fixedLeftWidth}px`;\n let top = `${this.drawY - this.ctx.body.y}px`;\n // 固定列\n if (this.fixed === 'left') {\n left = `${this.drawX}px`;\n } else if (this.fixed === 'right') {\n left = `${this.drawX - (this.ctx.stageWidth - this.ctx.fixedRightWidth)}px`;\n }\n // 合计\n if (this.cellType === 'footer') {\n if (this.ctx.config.FOOTER_FIXED) {\n top = `${this.drawY - this.ctx.footer.y}px`;\n }\n }\n return {\n position: 'absolute',\n overflow: 'hidden',\n left,\n top,\n width: `${this.visibleWidth}px`,\n height: `${this.visibleHeight}px`,\n pointerEvents: 'initial',\n userSelect: 'none',\n };\n }\n drawContainer() {\n const {\n paint,\n config: { BORDER_COLOR, BORDER },\n } = this.ctx;\n const { drawX, drawY } = this;\n paint.drawRect(drawX, drawY, this.visibleWidth, this.visibleHeight, {\n borderColor: BORDER ? BORDER_COLOR : 'transparent',\n fillColor: this.drawCellBgColor,\n });\n // 列合并单元格\n paint.drawRect(drawX, drawY, this.width, this.height, {\n borderColor: 'transparent',\n fillColor: this.drawCellSkyBgColor,\n });\n\n if (!BORDER) {\n this.ctx.paint.drawLine(\n [drawX, drawY + this.visibleHeight, drawX + this.visibleWidth, drawY + this.visibleHeight],\n {\n borderColor: BORDER_COLOR,\n fillColor: BORDER_COLOR,\n borderWidth: 1,\n lineCap: 'round',\n lineJoin: 'round',\n },\n );\n }\n }\n private drawAutofillPiont() {\n if (this.cellType === 'footer') {\n return;\n }\n const { SELECT_BORDER_COLOR, ENABLE_AUTOFILL, ENABLE_SELECTOR, AUTOFILL_POINT_BORDER_COLOR } = this.ctx.config;\n if (!ENABLE_SELECTOR) {\n return;\n }\n if (!ENABLE_AUTOFILL) {\n return;\n }\n if (this.ctx.editing) {\n return;\n }\n const show = true;\n const { xArr, yArr } = this.ctx.selector;\n const maxX = xArr[1];\n const maxY = yArr[1];\n const { colIndex, rowIndex, drawX, drawY } = this;\n // 绘制自动填充点\n if (show && colIndex === maxX && rowIndex === maxY) {\n const isOffset =\n colIndex === this.ctx.maxColIndex ||\n rowIndex === this.ctx.maxRowIndex ||\n colIndex === this.ctx.lastCenterColIndex;\n const offset = isOffset ? 6 : 4;\n this.ctx.paint.drawRect(drawX + this.width - offset, drawY + this.height - offset, 6, 6, {\n borderColor: AUTOFILL_POINT_BORDER_COLOR,\n fillColor: SELECT_BORDER_COLOR,\n });\n }\n }\n draw() {\n // 画选中框\n this.drawText();\n this.drawImage();\n this.drawSelector();\n this.drawAutofillPiont();\n this.drawErrorTip();\n }\n /**\n * 根据列的索引获取列的宽度\n * @param {Number} colIndex\n */\n private getWidthByColIndexColSpan(colIndex: number, colSpan: number) {\n if (colSpan === 0) {\n return 0;\n }\n let width = 0;\n for (let i = colIndex; i < colIndex + colSpan; i++) {\n const cellHeader = this.ctx.header.leafCellHeaders[i];\n width += cellHeader.width;\n }\n return width;\n }\n private drawText() {\n const { CELL_PADDING, BODY_FONT, PLACEHOLDER_COLOR } = this.ctx.config;\n const { ellipsis } = this.ctx.paint.handleEllipsis(\n this.displayText,\n this.drawTextWidth,\n CELL_PADDING,\n BODY_FONT,\n );\n this.ellipsis = ellipsis;\n const { placeholder } = this.column;\n let text = this.displayText;\n let color = this.drawTextColor;\n // 更改颜色\n const isReadonly = this.ctx.database.getReadonly(this.rowKey, this.key);\n if (\n !isReadonly &&\n placeholder &&\n ['', null, undefined].includes(this.text) &&\n this.cellType === 'body' &&\n !(this.rowspan === 0 || this.colspan === 0)\n ) {\n text = placeholder;\n color = PLACEHOLDER_COLOR;\n }\n return this.ctx.paint.drawText(text, this.drawTextX, this.drawTextY, this.drawTextWidth, this.drawTextHeight, {\n font: BODY_FONT,\n padding: CELL_PADDING,\n align: this.align,\n verticalAlign: this.verticalAlign,\n color,\n });\n }\n private drawImage() {\n if (this.drawSelectionImageSource) {\n this.ctx.paint.drawImage(\n this.drawSelectionImageSource,\n this.drawSelectionImageX,\n this.drawSelectionImageY,\n this.drawSelectionImageWidth,\n this.drawSelectionImageHeight,\n );\n }\n if (this.drawTreeImageSource) {\n this.ctx.paint.drawImage(\n this.drawTreeImageSource,\n this.drawTreeImageX,\n this.drawTreeImageY,\n this.drawTreeImageWidth,\n this.drawTreeImageHeight,\n );\n }\n if (this.drawHoverImageSource) {\n // 绘制hover图标背景\n const { CELL_HOVER_ICON_BG_COLOR, CELL_HOVER_ICON_BORDER_COLOR } = this.ctx.config;\n this.ctx.paint.drawRect(\n this.drawHoverImageX - 2,\n this.drawHoverImageY - 2,\n this.drawHoverImageWidth + 4,\n this.drawHoverImageHeight + 4,\n {\n borderColor: CELL_HOVER_ICON_BORDER_COLOR,\n radius: 4,\n borderWidth: 1,\n fillColor: CELL_HOVER_ICON_BG_COLOR,\n },\n );\n this.ctx.paint.drawImage(\n this.drawHoverImageSource,\n this.drawHoverImageX,\n this.drawHoverImageY,\n this.drawHoverImageWidth,\n this.drawHoverImageHeight,\n );\n }\n }\n private drawSelector() {\n if (this.cellType === 'footer') {\n return;\n }\n const { ENABLE_SELECTOR } = this.ctx.config;\n if (!ENABLE_SELECTOR) {\n return;\n }\n const { xArr, yArr, xArrCopy, yArrCopy } = this.ctx.selector;\n // 复制线\n this.drawBorder({\n xArr: xArrCopy,\n yArr: yArrCopy,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n lineDash: [4, 4],\n });\n // 填充线\n this.drawBorder({\n xArr: this.ctx.autofill.xArr,\n yArr: this.ctx.autofill.yArr,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n lineDash: [4, 4],\n });\n // 选择线\n this.drawBorder({\n xArr,\n yArr,\n borderColor: this.ctx.config.SELECT_BORDER_COLOR || 'rgb(82,146,247)',\n fillColor: 'transparent',\n borderWidth: 1,\n });\n // 选择区背景颜色\n const [minX, maxX] = xArr;\n const [minY, maxY] = yArr;\n const isOne = minX === maxX && minY === maxY;\n if (\n !isOne &&\n this.colIndex >= minX &&\n this.colIndex <= maxX &&\n this.rowIndex >= minY &&\n this.rowIndex <= maxY\n ) {\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.width, this.height, {\n borderColor: 'transparent',\n fillColor: this.ctx.config.SELECT_AREA_COLOR || 'rgba(82,146,247,0.1)',\n });\n }\n if (this.operation && this.rowIndex >= minY && this.rowIndex <= maxY) {\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.visibleWidth, this.visibleHeight, {\n borderColor: 'transparent',\n fillColor: this.ctx.config.SELECT_ROW_COL_BG_COLOR || 'transparent',\n });\n }\n }\n private drawErrorTip() {\n // 合计不显示\n if (this.cellType === 'footer') {\n return;\n }\n // 没有错误消息\n if (!this.message) {\n return;\n }\n if (this.rowspan === 0 || this.colspan === 0) {\n return;\n }\n const { ERROR_TIP_ICON_SIZE, ERROR_TIP_COLOR } = this.ctx.config;\n const { width } = this;\n const x = this.drawX;\n const y = this.drawY;\n const points = [\n x + width - ERROR_TIP_ICON_SIZE - 0.5,\n y,\n x + width - 0.5,\n y,\n x + width - 0.5,\n y + ERROR_TIP_ICON_SIZE,\n ];\n this.ctx.paint.drawLine(points, {\n borderColor: ERROR_TIP_COLOR,\n fillColor: ERROR_TIP_COLOR,\n borderWidth: 1,\n lineCap: 'round',\n lineJoin: 'round',\n });\n }\n private drawBorder(options: {\n xArr: number[];\n yArr: number[];\n borderColor: string;\n fillColor: string;\n borderWidth: number;\n lineDash?: number[];\n }) {\n const { drawX, drawY, rowIndex, colIndex, height, width } = this;\n let x = drawX;\n let y = drawY;\n const { xArr, yArr, lineDash = [], borderWidth = 1, borderColor, fillColor } = options;\n const minX = xArr[0];\n const maxX = xArr[1];\n const minY = yArr[0];\n const maxY = yArr[1];\n // top border\n if (colIndex >= minX && colIndex <= maxX && rowIndex === minY) {\n const offsetW = colIndex === maxX ? 1 : 0;\n const offsetX = colIndex === minX ? 1 : 0;\n this.ctx.paint.drawLine([x + offsetX, y + 1, x + width - offsetW, y + 1], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n // right border\n if (colIndex === maxX && rowIndex >= minY && rowIndex <= maxY) {\n const offsetY = rowIndex === minY ? 1 : 0;\n const offsetH = rowIndex === maxY ? 1 : 0;\n this.ctx.paint.drawLine([x + width - 1, y + offsetY, x + width - 1, y + height - offsetH], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n // bottom border\n if (colIndex >= minX && colIndex <= maxX && rowIndex === maxY) {\n const offsetW = colIndex === maxX ? 1 : 0;\n const offsetX = colIndex === minX ? 1 : 0;\n this.ctx.paint.drawLine([x + offsetX, y + height - 1, x + width - offsetW, y + height - 1], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n // left border\n if (colIndex === minX && rowIndex >= minY && rowIndex <= maxY) {\n const offsetH = rowIndex === maxY ? 1 : 0;\n const offsetY = rowIndex === minY ? 1 : 0;\n this.ctx.paint.drawLine([x + 1, y + offsetY, x + 1, y + height - offsetH], {\n borderColor,\n fillColor,\n borderWidth,\n lineCap: 'round',\n lineJoin: 'round',\n lineDash,\n });\n }\n }\n}\n","import type CellHeader from './CellHeader';\nimport Validator, { RuleParam, ValidateResult } from './Validator';\nimport type Context from './Context';\nimport type {\n CellReadonlyMethod,\n CellRulesMethod,\n ChangeItem,\n Column,\n FilterMethod,\n Position,\n SelectableMethod,\n EVirtTableOptions,\n BeforeCellValueChangeMethod,\n SpanInfo,\n SelectionMap,\n ErrorType,\n BeforeChangeItem,\n HistoryAction,\n BeforeValueChangeItem,\n} from './types';\nimport { generateShortUUID, toLeaf } from './util';\nimport { HistoryItemData } from './History';\nimport Cell from './Cell';\nexport default class Database {\n private loading = false;\n private ctx: Context;\n private data: any[];\n private columns: Column[];\n private footerData: any[] = [];\n private rowKeyMap = new Map<string, any>();\n private colIndexKeyMap = new Map<number, string>();\n private headerMap = new Map<string, CellHeader>();\n private rowIndexRowKeyMap = new Map<number, string>();\n private rowKeyRowIndexMap = new Map<string, number>();\n private checkboxKeyMap = new Map<string, string[]>();\n private selectionMap = new Map<string, SelectionMap>();\n private expandMap = new Map<string, boolean>();\n private originalDataMap = new Map<string, any>();\n private changedDataMap = new Map<string, any>();\n private validationErrorMap = new Map<string, ValidateResult>();\n private itemRowKeyMap = new WeakMap();\n private bufferData: any[] = [];\n private bufferCheckState = {\n buffer: false,\n check: false,\n indeterminate: false,\n selectable: true,\n };\n private sumHeight = 0;\n private filterMethod: FilterMethod | undefined;\n private positions: Position[] = []; //虚拟滚动位置\n constructor(ctx: Context, options: EVirtTableOptions) {\n this.ctx = ctx;\n const { data = [], columns = [], footerData = [] } = options;\n this.data = data;\n this.footerData = footerData;\n this.columns = columns;\n this.setLoading(true);\n this.init();\n }\n // 初始化默认不忽略清空改变值和校验map\n init(isClear = true) {\n this.clearBufferData();\n this.rowKeyMap.clear();\n this.checkboxKeyMap.clear();\n this.colIndexKeyMap.clear();\n this.rowIndexRowKeyMap.clear();\n this.rowKeyRowIndexMap.clear();\n // 判断是否有选择和树形结构\n const _columns = this.getColumns();\n const leafColumns = toLeaf(_columns);\n this.ctx.hasSelection = leafColumns.some((item) => item.type === 'selection');\n this.ctx.hasTree = leafColumns.some((item) => item.type === 'tree');\n if (isClear) {\n this.originalDataMap.clear();\n this.changedDataMap.clear();\n this.validationErrorMap.clear();\n const { ROW_KEY } = this.ctx.config;\n // 清除选中和展开状态,如果没有ROW_KEY清除\n if (!ROW_KEY) {\n // 无行主键时直接清除所有状态\n this.selectionMap.clear();\n this.expandMap.clear();\n } else {\n // 有行主键,根据上下文条件清除部分状态\n if (!this.ctx.hasSelection) {\n this.selectionMap.clear();\n }\n if (!this.ctx.hasTree) {\n this.expandMap.clear();\n }\n }\n }\n this.itemRowKeyMap = new WeakMap();\n this.initData(this.data);\n this.getData();\n this.bufferCheckState.buffer = false;\n }\n /**\n * 清除缓存数据\n */\n clearBufferData() {\n this.bufferData = [];\n }\n /**\n * 初始化数据\n * @param dataList\n * @param level\n */\n private initData(dataList: any[], level: number = 0, parentRowKeys: string[] = []) {\n dataList.forEach((item, index) => {\n const { ROW_KEY = '', DEFAULT_EXPAND_ALL, CELL_HEIGHT, SELECTABLE_METHOD, CHECKBOX_KEY } = this.ctx.config;\n const _rowKey = item[ROW_KEY]; // 行唯一标识,否则就rowKey\n const rowKey = _rowKey !== undefined && _rowKey !== null ? `${_rowKey}` : generateShortUUID();\n this.itemRowKeyMap.set(item, rowKey);\n const height = item._height || CELL_HEIGHT;\n const readonly = item._readonly;\n let selectable: SelectableMethod | boolean = true;\n if (typeof SELECTABLE_METHOD === 'function') {\n const selectableMethod: SelectableMethod = SELECTABLE_METHOD;\n selectable = selectableMethod;\n }\n // 存储checkboxKey,处理合并单元格选中\n if (CHECKBOX_KEY) {\n const checkboxKey = item[CHECKBOX_KEY];\n if (this.checkboxKeyMap.has(checkboxKey)) {\n const checkboxKeys = this.checkboxKeyMap.get(checkboxKey) || [];\n checkboxKeys.push(rowKey);\n this.checkboxKeyMap.set(checkboxKey, checkboxKeys);\n } else {\n this.checkboxKeyMap.set(checkboxKey, [rowKey]);\n }\n }\n // 存key\n this.selectionMap.set(rowKey, {\n key: CHECKBOX_KEY ? item[CHECKBOX_KEY] : rowKey,\n row: item,\n check: this.selectionMap.get(rowKey)?.check || false,\n });\n const expand = DEFAULT_EXPAND_ALL || this.expandMap.get(rowKey) || item._expand || false;\n this.expandMap.set(rowKey, expand);\n this.rowKeyMap.set(rowKey, {\n readonly,\n index,\n rowIndex: index,\n level,\n height,\n check: false,\n selectable,\n expand,\n expandLazy: false,\n hasChildren: item._hasChildren || (Array.isArray(item.children) ? item.children.length > 0 : false),\n expandLoading: false,\n item,\n parentRowKeys,\n });\n if (Array.isArray(item.children)) {\n if (item.children.length) {\n this.initData(item.children, level + 1, [...parentRowKeys, rowKey]);\n }\n }\n });\n }\n /**\n *\n * @param rowKey 设置Row高度\n * @param height\n */\n setRowHeight(rowIndex: number, height: number) {\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n if (rowKey === undefined) {\n return;\n }\n const row = this.rowKeyMap.get(rowKey);\n row.height = height;\n row.item._height = height;\n this.clearBufferData(); // 清除缓存数据\n }\n /**\n *\n * @returns 获取转化平铺数据\n */\n getAllRowsData() {\n let list: any[] = [];\n const recursiveData = (data: any[]) => {\n data.forEach((item) => {\n list.push(item);\n if (Array.isArray(item.children)) {\n recursiveData(item.children);\n }\n });\n };\n recursiveData(this.data);\n return list;\n }\n private filterColumns(columns: Column[]) {\n return columns.reduce((acc: Column[], column) => {\n // 检查当前列的 hide 属性\n const shouldHide = typeof column.hide === 'function' ? column.hide() : column.hide;\n // 如果当前列不应该隐藏,则添加到结果中\n if (!shouldHide) {\n const newColumn = { ...column }; // 复制当前列\n // 递归处理子列\n if (newColumn.children && Array.isArray(newColumn.children)) {\n newColumn.children = this.filterColumns(newColumn.children);\n }\n acc.push(newColumn);\n }\n return acc;\n }, []);\n }\n getColumns() {\n return this.filterColumns(this.columns);\n }\n setColumns(columns: Column[]) {\n this.columns = columns;\n this.clearBufferData();\n }\n setData(data: any[]) {\n this.data = data;\n if (this.columns.length) {\n this.init();\n }\n }\n /**\n * 统一转化数据,给画body使用,包括过滤树状等,统一入口\n * @returns\n */\n getData() {\n if (this.bufferData.length > 0) {\n return {\n data: this.bufferData,\n sumHeight: this.sumHeight,\n positions: this.positions,\n };\n }\n let list: any[] = [];\n let rowIndex = 0;\n this.sumHeight = 0;\n this.positions = [];\n const recursiveData = (data: any[]) => {\n data.forEach((item) => {\n list.push(item);\n const rowKey = this.itemRowKeyMap.get(item);\n const { expand, hasChildren, height } = this.rowKeyMap.get(rowKey);\n const top = this.sumHeight;\n this.sumHeight += height;\n this.rowIndexRowKeyMap.set(rowIndex, rowKey);\n this.rowKeyRowIndexMap.set(rowKey, rowIndex);\n this.positions.push({\n top,\n height,\n bottom: this.sumHeight,\n });\n rowIndex += 1;\n if (expand && hasChildren) {\n recursiveData(item.children);\n }\n });\n };\n this.rowIndexRowKeyMap.clear();\n this.rowKeyRowIndexMap.clear();\n let _data = this.data;\n if (typeof this.filterMethod === 'function') {\n _data = this.filterMethod(_data);\n }\n recursiveData(_data);\n this.bufferData = list;\n return {\n data: list,\n sumHeight: this.sumHeight,\n positions: this.positions,\n };\n }\n setFooterData(data: any[]) {\n this.footerData = data;\n }\n getFooterData() {\n return this.footerData;\n }\n\n /**\n * 设置过滤方法\n */\n setFilterMethod(filterMethod: FilterMethod) {\n this.filterMethod = filterMethod;\n }\n /**\n * 清空过滤方法\n */\n clearFilterMethod() {\n this.filterMethod = undefined;\n }\n /**\n * 根据rowKey,控制指定展开行\n * @param rowKey\n * @param expand\n */\n expandItem(rowKey: string, expand = false) {\n const row = this.rowKeyMap.get(rowKey);\n row.expand = expand;\n this.expandMap.set(rowKey, expand);\n this.clearBufferData(); // 清除缓存数据\n this.ctx.emit('draw');\n }\n setExpandRowKeys(rowKeys: any[], expand = true) {\n this.expandMap.clear();\n rowKeys.forEach((rowkey) => {\n const row = this.rowKeyMap.get(rowkey);\n this.expandMap.set(rowkey, expand);\n row.expand = expand;\n });\n this.clearBufferData(); // 清除缓存数据\n this.ctx.emit('draw');\n }\n getExpandRowKeys() {\n let list: string[] = [];\n this.rowKeyMap.forEach((row: any, key: string) => {\n if (row.expand) {\n list.push(key);\n }\n });\n return list;\n }\n expandAll(expand: boolean) {\n this.expandMap.clear();\n this.rowKeyMap.forEach((row: any) => {\n row.expand = expand;\n this.expandMap.set(row.key, expand);\n });\n this.clearBufferData(); // 清除缓存数据\n this.ctx.emit('draw');\n }\n expandLoading(rowKey: string, loading = false) {\n const row = this.rowKeyMap.get(rowKey);\n row.expandLoading = loading;\n this.clearBufferData(); // 清除缓存数据\n this.ctx.emit('draw');\n }\n setExpandChildren(rowKey: string, children: any[]) {\n const row = this.rowKeyMap.get(rowKey);\n row.expand = true;\n this.expandMap.set(rowKey, true);\n row.expandLazy = true;\n row.item.children = children;\n this.initData(row.item.children, row.level + 1);\n this.clearBufferData(); // 清除缓存数据\n }\n getIsExpandLoading(rowKey: string) {\n const row = this.rowKeyMap.get(rowKey);\n return row.expandLoading;\n }\n getIsExpandLazy(rowKey: string) {\n const row = this.rowKeyMap.get(rowKey);\n return row.expandLazy;\n }\n /**\n * 根据rowKey获取是否展开\n * @param rowKey\n * @returns\n */\n getIsExpand(rowKey: string) {\n const row = this.rowKeyMap.get(rowKey);\n return row.expand;\n }\n /**\n * 根据rowKey获取行数据\n * @param rowKey\n * @returns\n */\n getRowForRowKey(rowKey: string) {\n return this.rowKeyMap.get(rowKey);\n }\n getRowForRowIndex(rowIndex: number) {\n const rowKey = this.getRowKeyForRowIndex(rowIndex);\n return this.rowKeyMap.get(rowKey);\n }\n /**\n * 根据rowIndex获取rowKey\n * @param rowKey\n * @returns\n */\n getRowKeyForRowIndex(rowIndex: number) {\n return this.rowIndexRowKeyMap.get(rowIndex) || '';\n }\n getRowKeyByItem(item: any) {\n return this.itemRowKeyMap.get(item);\n }\n getRowIndexForRowKey(rowKey: string) {\n return this.rowKeyRowIndexMap.get(rowKey);\n }\n /**\n * 根据rowIndex和colIndex获取单元格数据\n * @param rowIndex\n * @param colIndex\n * @returns\n */\n getItemValueForRowIndexAndColIndex(rowIndex: number, colIndex: number) {\n const has = this.rowIndexRowKeyMap.has(rowIndex) && this.colIndexKeyMap.get(colIndex);\n if (!has) {\n return null;\n }\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n const key = this.colIndexKeyMap.get(colIndex);\n if (rowKey === undefined || key === undefined) {\n return null;\n }\n return {\n rowKey,\n key,\n value: this.getItemValue(rowKey, key),\n };\n }\n /**\n * 根据rowKey和key获取单元格数据\n * @param rowKey\n * @param key\n * @returns\n */\n getItemValue(rowKey: string, key: string) {\n const row = this.rowKeyMap.get(rowKey);\n\n if (row && row.item) {\n if (row.item[key] === undefined) {\n return null;\n }\n return row.item[key];\n }\n return null;\n }\n /**\n * 批量设置数据\n * @param list\n * @param history\n * @returns\n */\n async batchSetItemValue(\n _list: ChangeItem[],\n history = false,\n checkReadonly = true,\n historyAcion: HistoryAction = 'none',\n ) {\n let historyList: HistoryItemData[] = [];\n let _checkReadonly = checkReadonly;\n const rowKeyList: Set<string> = new Set();\n let errList: ChangeItem[] = [];\n let changeList: BeforeValueChangeItem[] = _list.map((item) => {\n const { rowKey, key } = item;\n let _value = item.value;\n let value = _value;\n const row = this.getRowDataItemForRowKey(rowKey);\n const oldValue = this.getItemValue(rowKey, key);\n // 判断数字\n const cell = this.getVirtualBodyCellByKey(rowKey, key);\n if (cell?.type === 'number') {\n // 处理数字\n if (['', undefined, null].includes(_value)) {\n value = null;\n } else if (/^-?\\d+(\\.\\d+)?$/.test(`${_value}`)) {\n value = Number(_value);\n } else {\n value = oldValue;\n errList.push({\n ...item,\n value,\n oldValue,\n row,\n });\n }\n }\n return {\n ...item,\n value,\n oldValue,\n row,\n };\n });\n // 过滤错误的\n changeList = changeList.filter((item) => {\n return !errList.some((err) => item.rowKey === err.rowKey && item.key === err.key);\n });\n if (errList.length) {\n const err: ErrorType = {\n code: 'ERR_BATCH_SET_NUMBER_VALUE',\n message: 'Assignment failed, not a numeric type',\n data: errList,\n };\n this.ctx.emit('error', err);\n }\n if (!changeList.length) {\n return;\n }\n const { BEFORE_VALUE_CHANGE_METHOD } = this.ctx.config;\n if (historyAcion === 'none' && typeof BEFORE_VALUE_CHANGE_METHOD === 'function') {\n const beforeCellValueChange: BeforeCellValueChangeMethod = BEFORE_VALUE_CHANGE_METHOD;\n const values = await beforeCellValueChange(changeList);\n changeList = values;\n _checkReadonly = false; // 允许编辑只读\n }\n changeList.forEach((data) => {\n const { value, rowKey, key } = data;\n const oldValue = this.getItemValue(rowKey, key);\n rowKeyList.add(rowKey);\n // 不加历史,不重绘,不是编辑器,不检验只读\n this.setItemValue(rowKey, key, value, false, false, false, _checkReadonly);\n historyList.push({\n rowKey,\n key,\n oldValue,\n newValue: value,\n });\n });\n // 触发change事件\n let rows: any[] = [];\n rowKeyList.forEach((rowKey) => {\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\n });\n const promsieValidators = changeList.map(({ rowKey, key }) => this.getValidator(rowKey, key));\n Promise.all(promsieValidators).then(() => {\n if (this.validationErrorMap.size === 0 && this.changedDataMap.size > 0) {\n this.ctx.emit('validateChangedData', this.getChangedData());\n }\n });\n this.ctx.emit('change', changeList, rows);\n // 推历史记录\n if (history) {\n this.ctx.history.pushState({\n changeList: historyList,\n scrollX: this.ctx.scrollX,\n scrollY: this.ctx.scrollY,\n type: 'multiple',\n });\n }\n this.ctx.emit('draw');\n }\n /**\n *设置单一数据\n * @param rowKey\n * @param key\n * @param value\n * @param history 是否添加历史记录\n * @param reDraw 是否刷新重绘\n * @param isEditor 是否是编辑器\n * @param checkReadonly 是否检查只读\n * @returns\n */\n async setItemValue(\n rowKey: string,\n key: string,\n _value: any,\n history = false,\n reDraw = false,\n isEditor = false,\n checkReadonly = true,\n ) {\n // 异常情况\n if (!this.rowKeyMap.has(rowKey)) {\n return {};\n }\n\n const { item } = this.rowKeyMap.get(rowKey);\n let oldValue = item[key];\n let value = _value;\n\n // 只读返回旧值\n if (checkReadonly && this.ctx.database.getReadonly(rowKey, key)) {\n return {\n oldValue,\n newValue: oldValue,\n };\n }\n // 处理对象\n if (item[key] !== null && typeof item[key] === 'object') {\n oldValue = JSON.parse(JSON.stringify(item[key]));\n }\n const changeKey = `${rowKey}\\u200b_${key}`;\n // 设置原始值,只设置一次\n if (!this.originalDataMap.has(changeKey)) {\n this.originalDataMap.set(changeKey, oldValue);\n }\n const originalValue = this.originalDataMap.get(changeKey);\n const row = this.getRowDataItemForRowKey(rowKey);\n // 是否是否是编辑器进来的\n if (isEditor) {\n const cell = this.getVirtualBodyCellByKey(rowKey, key);\n if (cell?.type === 'number') {\n // 处理数字\n if (['', undefined, null].includes(_value)) {\n value = null;\n } else if (/^-?\\d+(\\.\\d+)?$/.test(`${_value}`)) {\n value = Number(_value);\n } else {\n value = oldValue;\n const err: ErrorType = {\n code: 'ERR_SET_NUMBER_VALUE',\n message: 'Assignment failed, not a numeric type',\n data: [\n {\n rowKey,\n key,\n value,\n oldValue,\n row,\n },\n ],\n };\n this.ctx.emit('error', err);\n }\n }\n if (value === oldValue) {\n return {\n oldValue,\n newValue: oldValue,\n };\n }\n let changeList: BeforeChangeItem[] = [\n {\n rowKey,\n key,\n value,\n oldValue,\n row,\n },\n ];\n this.batchSetItemValue(changeList, history, false);\n this.ctx.emit('editChange', {\n rowKey,\n key,\n oldValue,\n value,\n originalValue,\n row,\n });\n } else {\n this.changedDataMap.set(changeKey, value);\n item[key] = value;\n }\n // 迭代改变值事件,有改变一次值就触发,包括批量的\n if (this.ctx.hasEvent('iterationChange')) {\n this.ctx.emit('iterationChange', {\n rowKey,\n key,\n oldValue,\n value,\n originalValue: this.originalDataMap.get(changeKey),\n row,\n });\n }\n // 重绘\n if (reDraw) {\n this.ctx.emit('draw');\n }\n return {\n oldValue,\n newValue: value,\n };\n }\n /**\n * 根据rowKey 获取行数据\n * @param rowKey\n * @returns\n */\n getRowDataItemForRowKey(rowKey: string) {\n if (!this.rowKeyMap.has(rowKey)) {\n return {};\n }\n const { item } = this.rowKeyMap.get(rowKey);\n return item;\n }\n /**\n *\n * @param rowKey 设置选中状态ByCheckboxKey,用于合并Checkbox单元格时声明唯一key\n * @param check\n */\n private setRowSelectionByCheckboxKey(rowKey: string, check: boolean) {\n const { CHECKBOX_KEY } = this.ctx.config;\n if (CHECKBOX_KEY) {\n if (!this.rowKeyMap.has(rowKey)) {\n return false;\n }\n const { item } = this.rowKeyMap.get(rowKey);\n const checkboxKey = item[CHECKBOX_KEY];\n if (this.checkboxKeyMap.has(checkboxKey)) {\n const rowKeys = this.checkboxKeyMap.get(checkboxKey) || [];\n rowKeys.forEach((rowKey: string) => {\n const selection = this.selectionMap.get(rowKey);\n if (selection) {\n selection.check = check;\n }\n });\n }\n }\n }\n /**\n * 根据rowKey 取反选中\n * @param rowKey\n */\n toggleRowSelection(rowKey: string, cellType?: string) {\n const row = this.rowKeyMap.get(rowKey);\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return;\n }\n\n // 检查是否是树形选择列\n if (cellType === 'selection-tree' || cellType === 'tree-selection') {\n this.toggleTreeSelection(rowKey);\n } else {\n selection.check = !selection.check;\n this.setRowSelectionByCheckboxKey(rowKey, selection.check);\n }\n\n this.ctx.emit('toggleRowSelection', row);\n const rows = this.getSelectionRows();\n this.ctx.emit('selectionChange', rows);\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n\n // 切换树形选择状态\n toggleTreeSelection(rowKey: string) {\n const treeState = this.getTreeSelectionState(rowKey);\n const mode = this.ctx.config.TREE_SELECT_MODE;\n if (mode === 'auto') {\n // auto模式:子项全不选->父项不勾选,子项全选->父项勾选,子项都有->父项半选\n // 父项选中的情况点击清空父项选择和所有子项选择,其他情况点击父项,勾选父项和所有子项选择(递归)\n if (treeState.checked && !treeState.indeterminate) {\n // 如果已全选,则取消选中\n this.setRowSelection(rowKey, false, false);\n // 递归取消所有子项\n this.clearTreeSelectionRecursive(rowKey);\n } else {\n // 如果未选中或半选,则选中\n this.setRowSelection(rowKey, true, false);\n // 递归选中所有子项\n this.selectTreeSelectionRecursive(rowKey);\n }\n } else if (mode === 'cautious') {\n // cautious模式:交互上相同,但是半选是不算在数据里面的\n if (treeState.checked && !treeState.indeterminate) {\n // 如果已全选,则取消选中\n this.setRowSelection(rowKey, false, false);\n // 递归取消所有子项\n this.clearTreeSelectionRecursive(rowKey);\n } else {\n // 如果未选中或半选,则选中\n this.setRowSelection(rowKey, true, false);\n // 递归选中所有子项\n this.selectTreeSelectionRecursive(rowKey);\n }\n } else if (mode === 'strictly') {\n // strictly模式:父子各选各的互相不干扰,没有半选模式\n const selection = this.selectionMap.get(rowKey);\n if (selection) {\n selection.check = !selection.check;\n this.setRowSelectionByCheckboxKey(rowKey, selection.check);\n }\n }\n \n // 触发选择变化事件\n this.ctx.emit('selectionChange', this.getSelectionRows());\n this.ctx.emit('draw');\n }\n\n // 递归选中树形选择\n private selectTreeSelectionRecursive(rowKey: string) {\n const children = this.getTreeChildren(rowKey);\n children.forEach(childKey => {\n this.setRowSelection(childKey, true, false);\n this.selectTreeSelectionRecursive(childKey);\n });\n }\n\n // 递归取消树形选择\n private clearTreeSelectionRecursive(rowKey: string) {\n const children = this.getTreeChildren(rowKey);\n children.forEach(childKey => {\n this.setRowSelection(childKey, false, false);\n this.clearTreeSelectionRecursive(childKey);\n });\n }\n \n // 向上递归更新父项状态\n private updateParentTreeSelection(rowKey: string) {\n const parentKey = this.getTreeParent(rowKey);\n if (!parentKey) {\n return;\n }\n \n // 获取父项的所有直接子项\n const children = this.getTreeChildren(parentKey);\n const childSelections = children.map(childKey => this.selectionMap.get(childKey));\n const checkedChildren = childSelections.filter(s => s?.check).length;\n const totalChildren = childSelections.length;\n \n // 计算父项应该的状态\n let parentShouldBeChecked = false;\n if (totalChildren > 0) {\n if (checkedChildren === 0) {\n // 所有子项都未选中,父项应该未选中\n parentShouldBeChecked = false;\n } else if (checkedChildren === totalChildren) {\n // 所有子项都选中,父项应该选中\n parentShouldBeChecked = true;\n } else {\n // 部分子项选中,父项应该半选\n if (this.ctx.config.TREE_SELECT_MODE === 'auto') {\n // auto模式下半选算作选中\n parentShouldBeChecked = true;\n } else if (this.ctx.config.TREE_SELECT_MODE === 'cautious') {\n // cautious模式下半选不算作选中\n parentShouldBeChecked = false;\n }\n }\n }\n \n // 更新父项状态\n const parentSelection = this.selectionMap.get(parentKey);\n if (parentSelection && parentSelection.check !== parentShouldBeChecked) {\n parentSelection.check = parentShouldBeChecked;\n this.setRowSelectionByCheckboxKey(parentKey, parentShouldBeChecked);\n \n // 递归更新更上层的父项\n this.updateParentTreeSelection(parentKey);\n }\n }\n /**\n * 根据rowKey 设置选中状态\n * @param rowKey\n */\n setRowSelection(rowKey: string, check: boolean, draw = true) {\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return;\n }\n selection.check = check;\n this.setRowSelectionByCheckboxKey(rowKey, selection.check);\n this.ctx.emit('setRowSelection', check, selection.row);\n \n // 如果是树形选择模式,需要向上递归更新父项状态\n if (this.ctx.config.TREE_SELECT_MODE === 'auto' || this.ctx.config.TREE_SELECT_MODE === 'cautious') {\n this.updateParentTreeSelection(rowKey);\n }\n \n if (draw) {\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n }\n getSelectionRows() {\n let rows: any[] = [];\n this.selectionMap.forEach((selection: any) => {\n if (selection.check) {\n rows.push(selection.row);\n }\n });\n return rows;\n }\n /**\n * 根据rowKey 获取选中状态\n * @param rowKey\n */\n getRowSelection(rowKey: string) {\n const selection = this.selectionMap.get(rowKey);\n if (!selection) {\n return false;\n }\n return selection.check;\n }\n\n // 获取树形选择状态\n getTreeSelectionState(rowKey: string) {\n const row = this.getRowForRowKey(rowKey);\n if (!row) {\n return { checked: false, indeterminate: false };\n }\n\n const selectionMap = this.selectionMap.get(rowKey);\n const checked = selectionMap?.check || false;\n \n // 计算半选状态\n const children = this.getTreeChildren(rowKey);\n if (children.length === 0) {\n return { checked, indeterminate: false };\n }\n\n let indeterminate = false;\n let finalChecked = checked;\n \n if (this.ctx.config.TREE_SELECT_MODE === 'auto') {\n // auto模式:子项全不选->父项不勾选,子项全选->父项勾选,子项都有->父项半选\n // 其中半选是算在最终选择的数据里面的\n \n // 递归计算所有后代的状态\n const getAllDescendantsRecursive = (parentKey: string): string[] => {\n const children = this.getTreeChildren(parentKey);\n let allDescendants: string[] = [];\n for (const childKey of children) {\n allDescendants.push(childKey);\n allDescendants.push(...getAllDescendantsRecursive(childKey));\n }\n return allDescendants;\n };\n \n const allDescendants = getAllDescendantsRecursive(rowKey);\n const descendantSelections = allDescendants.map(descKey => this.selectionMap.get(descKey));\n const checkedDescendants = descendantSelections.filter(s => s?.check).length;\n const totalDescendants = descendantSelections.length;\n \n const someChecked = checkedDescendants > 0;\n const allChecked = checkedDescendants === totalDescendants;\n indeterminate = someChecked && !allChecked;\n finalChecked = checked || someChecked; // 自身选中或有后代选中就算选中(包括半选)\n \n // 特殊处理:如果父项被选中但所有后代都被取消选中,则父项也取消选中\n if (checked && totalDescendants > 0 && checkedDescendants === 0) {\n finalChecked = false;\n indeterminate = false;\n }\n \n\n } else if (this.ctx.config.TREE_SELECT_MODE === 'cautious') {\n // cautious模式:交互上相同,但是半选是不算在数据里面的\n // 递归计算所有后代的状态\n const getAllDescendantsRecursive = (parentKey: string): string[] => {\n const children = this.getTreeChildren(parentKey);\n let allDescendants: string[] = [];\n for (const childKey of children) {\n allDescendants.push(childKey);\n allDescendants.push(...getAllDescendantsRecursive(childKey));\n }\n return allDescendants;\n };\n \n const allDescendants = getAllDescendantsRecursive(rowKey);\n const descendantSelections = allDescendants.map(descKey => this.selectionMap.get(descKey));\n const checkedDescendants = descendantSelections.filter(s => s?.check).length;\n const totalDescendants = descendantSelections.length;\n \n const someChecked = checkedDescendants > 0;\n const allChecked = checkedDescendants === totalDescendants;\n indeterminate = someChecked && !allChecked;\n finalChecked = checked || allChecked; // 只有全选才算选中,半选不算选中\n \n // 特殊处理:如果父项被选中但所有后代都被取消选中,则父项也取消选中\n if (checked && totalDescendants > 0 && checkedDescendants === 0) {\n finalChecked = false;\n indeterminate = false;\n }\n } else if (this.ctx.config.TREE_SELECT_MODE === 'strictly') {\n // strictly模式:父子各选各的互相不干扰,没有半选模式\n indeterminate = false;\n finalChecked = checked;\n }\n\n const result = { checked: finalChecked, indeterminate };\n return result;\n }\n\n // 获取树形子节点\n getTreeChildren(rowKey: string): string[] {\n const row = this.getRowForRowKey(rowKey);\n if (!row || !row.item || !row.item.children) {\n return [];\n }\n\n const children: string[] = [];\n const collectChildren = (items: any[]) => {\n for (const item of items) {\n const itemKey = this.getRowKeyByItem(item);\n if (itemKey) {\n children.push(itemKey);\n }\n if (item.children && item.children.length > 0) {\n collectChildren(item.children);\n }\n }\n };\n\n collectChildren(row.item.children);\n return children;\n }\n\n // 获取树形父节点\n getTreeParent(rowKey: string): string | null {\n const findParent = (data: any[], targetKey: string): string | null => {\n for (const item of data) {\n const itemKey = this.getRowKeyByItem(item);\n if (item.children) {\n for (const child of item.children) {\n const childKey = this.getRowKeyByItem(child);\n if (childKey === targetKey) {\n return itemKey;\n }\n const result = findParent(item.children, targetKey);\n if (result) {\n return result;\n }\n }\n }\n }\n return null;\n };\n\n return findParent(this.data, rowKey);\n }\n /**\n * 根据rowKey 获取选中状态\n * @param rowKey\n */\n getRowSelectable(rowKey: string) {\n const { selectable, item, rowIndex } = this.rowKeyMap.get(rowKey);\n if (typeof selectable === 'function') {\n return selectable({\n row: item,\n rowIndex,\n });\n }\n return selectable;\n }\n /**\n * 全选\n * @param rowKey\n */\n toggleAllSelection() {\n // 检查是否是树形选择模式\n const isTreeSelectionMode = this.ctx.config.TREE_SELECT_MODE === 'auto' || this.ctx.config.TREE_SELECT_MODE === 'cautious';\n \n if (isTreeSelectionMode) {\n // 树形选择模式:只从上到下设置,跳过递归计算\n this.rowKeyMap.forEach((row: any, rowKey: string) => {\n let _selectable = row.selectable;\n if (typeof _selectable === 'function') {\n _selectable = _selectable({\n row: row.item,\n rowIndex: row.rowIndex,\n });\n }\n if (_selectable) {\n // 直接设置选中状态,跳过递归计算\n const selection = this.selectionMap.get(rowKey);\n if (selection) {\n selection.check = true;\n this.setRowSelectionByCheckboxKey(rowKey, true);\n }\n }\n });\n } else {\n // 普通选择模式:使用原有逻辑\n this.rowKeyMap.forEach((row: any, rowKey: string) => {\n let _selectable = row.selectable;\n if (typeof _selectable === 'function') {\n _selectable = _selectable({\n row: row.item,\n rowIndex: row.rowIndex,\n });\n }\n if (_selectable) {\n this.setRowSelection(rowKey, true, false);\n }\n });\n }\n \n const rows = this.getSelectionRows();\n this.ctx.emit('toggleAllSelection', rows);\n this.ctx.emit('selectionChange', rows);\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n /**\n * 清除选中\n * @param rowKey\n */\n clearSelection(ignoreReserve = false) {\n // 检查是否是树形选择模式\n const isTreeSelectionMode = this.ctx.config.TREE_SELECT_MODE === 'auto' || this.ctx.config.TREE_SELECT_MODE === 'cautious';\n \n // 清除选中,点击表头清除时要忽略跨页选的\n if (ignoreReserve) {\n if (isTreeSelectionMode) {\n // 树形选择模式:只从上到下设置,跳过递归计算\n this.rowKeyMap.forEach((_, rowKey: string) => {\n const selection = this.selectionMap.get(rowKey);\n if (selection) {\n selection.check = false;\n this.setRowSelectionByCheckboxKey(rowKey, false);\n }\n });\n } else {\n // 普通选择模式:使用原有逻辑\n this.rowKeyMap.forEach((_, rowKey: string) => {\n this.setRowSelection(rowKey, false, false);\n });\n }\n } else {\n this.selectionMap.clear();\n this.rowKeyMap.forEach((row, rowKey: string) => {\n this.selectionMap.set(rowKey, {\n check: false,\n row: row.item,\n key: rowKey,\n });\n });\n }\n const rows = this.getSelectionRows();\n this.ctx.emit('clearSelection');\n this.ctx.emit('selectionChange', rows);\n // 清除缓存\n this.bufferCheckState.buffer = false;\n this.ctx.emit('draw');\n }\n /**\n * 获取选中状态,表头用\n * @param rowKey\n */\n getCheckedState() {\n // 缓存,解决性能问题\n const { buffer, ...bufferState } = this.bufferCheckState;\n if (buffer) {\n return bufferState;\n }\n const total = this.rowKeyMap.size;\n let totalChecked = 0;\n let totalSelectable = 0;\n const reserveTotal = this.selectionMap.size;\n const reserveHasChecked = Array.from(this.selectionMap.values()).some((item) => item.check);\n this.rowKeyMap.forEach((row: any, rowKey: string) => {\n if (this.selectionMap.get(rowKey)?.check) {\n totalChecked += 1;\n }\n let _selectable = row.selectable;\n if (typeof _selectable === 'function') {\n _selectable = _selectable({\n row: row.item,\n rowIndex: row.rowIndex,\n });\n }\n if (_selectable) {\n totalSelectable += 1;\n }\n });\n // 存在跨页时,变更半选中\n const reserveIndeterminate = reserveTotal > total && totalChecked === 0 && reserveHasChecked;\n const indeterminate =\n (totalSelectable && totalSelectable > totalChecked && totalChecked > 0) || reserveIndeterminate;\n const selectable = totalSelectable !== 0;\n const check = !!totalSelectable && totalSelectable === totalChecked;\n // 缓存\n this.bufferCheckState = {\n buffer: true,\n check,\n indeterminate,\n selectable,\n };\n\n return {\n check,\n indeterminate,\n selectable,\n };\n }\n /**\n * 更新列索引\n * @param list 表头末级列表\n */\n updateColIndexKeyMap(list: CellHeader[] = []) {\n this.colIndexKeyMap.clear();\n list.forEach((column) => {\n this.colIndexKeyMap.set(column.colIndex, column.key);\n });\n }\n getColumnByColIndex(colIndex: number) {\n const key = this.colIndexKeyMap.get(colIndex);\n if (key && this.headerMap.has(key)) {\n return this.headerMap.get(key)?.column;\n }\n }\n getColumnByKey(key: string) {\n const column = this.headerMap.get(key);\n if (column) {\n return column;\n }\n }\n getColIndexForKey(key: string) {\n if (key && this.headerMap.has(key)) {\n return this.headerMap.get(key)?.colIndex;\n }\n }\n getColHeaderByIndex(colIndex: number) {\n const key = this.colIndexKeyMap.get(colIndex);\n if (key && this.headerMap.has(key)) {\n return this.headerMap.get(key);\n }\n return undefined;\n }\n /**\n * 获取以改变数据\n */\n getChangedData() {\n let list: {\n rowKey: string;\n colKey: string;\n row: any;\n originalValue: any;\n value: any;\n }[] = [];\n this.changedDataMap.forEach((value, key) => {\n const originalValue = this.originalDataMap.get(key);\n const rowKey = key.split('\\u200b_')[0];\n const colKey = key.split('\\u200b_')[1];\n if (originalValue !== value) {\n list.push({\n rowKey,\n colKey,\n originalValue,\n row: this.ctx.database.getRowDataItemForRowKey(rowKey),\n value,\n });\n }\n });\n return list;\n }\n getChangedRows() {\n const rowKeyList: Set<string> = new Set();\n this.changedDataMap.forEach((value, key) => {\n const originalValue = this.originalDataMap.get(key);\n const rowKey = key.split('\\u200b_')[0];\n if (originalValue !== value) {\n rowKeyList.add(rowKey);\n }\n });\n let rows: any[] = [];\n rowKeyList.forEach((rowKey) => {\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\n });\n return rows;\n }\n /**\n * 获取改变值是否已经改变\n * @param rowKey\n * @param key\n * @returns\n */\n isHasChangedData(rowKey: string, key: string) {\n const changedKey = `${rowKey}\\u200b_${key}`;\n if (!this.changedDataMap.has(changedKey)) {\n return false;\n }\n const originalValue = this.originalDataMap.get(changedKey);\n const changedValue = this.changedDataMap.get(changedKey);\n return originalValue !== changedValue;\n }\n getPositionForRowIndex(rowIndex: number): Position {\n if (rowIndex < this.positions.length) {\n return this.positions[rowIndex];\n }\n return {\n height: 0,\n top: 0,\n bottom: 0,\n };\n }\n\n setHeader(key: string, cellHeader: CellHeader): boolean {\n if (!key) {\n return false;\n }\n this.headerMap.set(key, cellHeader);\n return true;\n }\n getReadonly(rowKey: string, key: string) {\n const { DISABLED } = this.ctx.config;\n // 禁用编辑\n if (DISABLED) {\n return true;\n }\n const row = this.rowKeyMap.get(rowKey);\n const colHeader = this.headerMap.get(key);\n if (!row || !colHeader) {\n return true;\n }\n const rowReadonly = row.readonly;\n const colReadonly = colHeader.readonly;\n const { BODY_CELL_READONLY_METHOD } = this.ctx.config;\n // 自定义只读\n if (typeof BODY_CELL_READONLY_METHOD === 'function' && colHeader) {\n const cellReadonlyMethod: CellReadonlyMethod = BODY_CELL_READONLY_METHOD;\n const readonly = cellReadonlyMethod({\n row: row.item,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n column: colHeader.column,\n value: this.getItemValue(rowKey, key),\n });\n if (readonly !== undefined) {\n return readonly;\n }\n }\n return colReadonly || rowReadonly;\n }\n clearValidate() {\n this.validationErrorMap.clear();\n }\n hasValidationError() {\n return this.validationErrorMap.size !== 0;\n }\n getValidator(rowKey: string, key: string) {\n return new Promise((resolve) => {\n const row = this.rowKeyMap.get(rowKey);\n const colHeader = this.headerMap.get(key);\n const { BODY_CELL_RULES_METHOD } = this.ctx.config;\n if (colHeader === undefined) {\n return resolve([]);\n }\n const column = colHeader.column;\n let rules = column.rules;\n // 自定义只读\n if (typeof BODY_CELL_RULES_METHOD === 'function') {\n const cellRulesMethod: CellRulesMethod = BODY_CELL_RULES_METHOD;\n const _rules = cellRulesMethod({\n row: row.item,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n column,\n value: this.getItemValue(rowKey, key),\n });\n if (_rules) {\n rules = _rules;\n }\n }\n if (rules) {\n const ruleParam: RuleParam = {\n row: row.item,\n rowIndex: row.rowIndex,\n colIndex: colHeader.colIndex,\n column,\n key,\n rowKey,\n value: this.getItemValue(rowKey, key),\n field: key,\n fieldValue: this.getItemValue(rowKey, key),\n };\n const validator = new Validator(rules);\n const _errors = validator.validate(ruleParam);\n this.setValidationError(rowKey, key, _errors);\n resolve(_errors);\n } else {\n this.clearValidationError(rowKey, key);\n resolve([]);\n }\n });\n }\n getHeightByRowIndexRowSpan(rowIndex: number, rowSpan: number) {\n let sumHeight = 0;\n for (let i = 0; i < rowSpan; i++) {\n const position = this.positions[rowIndex + i];\n if (position) {\n sumHeight += position.height;\n }\n }\n return sumHeight;\n }\n getSpanInfo(cell: Cell): SpanInfo {\n const {\n rowIndex,\n key,\n rowKey,\n row,\n value,\n colIndex,\n relationRowKeys,\n relationColKeys,\n rowspan,\n height,\n width,\n colspan,\n mergeRow,\n mergeCol,\n } = cell;\n if (rowspan === 1 && colspan === 1) {\n return {\n xArr: [colIndex, colIndex],\n yArr: [rowIndex, rowIndex],\n rowspan,\n colspan,\n height,\n width,\n offsetTop: 0,\n offsetLeft: 0,\n dataList: [\n {\n rowKey,\n key,\n row,\n value,\n },\n ],\n };\n }\n let topIndex = rowIndex;\n let bottomIndex = rowIndex;\n let leftIndex = colIndex;\n let rightIndex = colIndex;\n let dataList: ChangeItem[] = [];\n let offsetTop = 0;\n let offsetLeft = 0;\n let mergeHeight = 0;\n let mergeWidth = 0;\n // 列合并的\n if (rowspan !== 1 && mergeRow) {\n mergeWidth = width;\n const curValue = relationRowKeys.reduce((acc, key) => {\n const value = this.getItemValue(rowKey, key) ?? '';\n return `${acc}${value}`;\n }, '');\n // 先查找向上的相同值,根据关联值查询\n for (let i = rowIndex - 1; i >= 0; i--) {\n const _rowKey = this.rowIndexRowKeyMap.get(i) || '';\n const pValue = relationRowKeys.reduce((acc, key) => {\n const value = this.getItemValue(_rowKey, key) ?? '';\n return `${acc}${value}`;\n }, '');\n if (curValue === pValue) {\n topIndex = i;\n } else {\n break;\n }\n }\n\n // 再查找向下的相同值,根据关联值查询\n for (let i = rowIndex; i <= this.ctx.maxRowIndex; i++) {\n const _rowKey = this.rowIndexRowKeyMap.get(i) || '';\n const pValue = relationRowKeys.reduce((acc, key) => {\n const value = this.getItemValue(_rowKey, key) ?? '';\n return `${acc}${value}`;\n }, '');\n if (curValue === pValue) {\n bottomIndex = i;\n } else {\n break;\n }\n }\n for (let i = topIndex; i < rowIndex; i++) {\n const { height } = this.positions[i];\n offsetTop += height;\n }\n for (let i = topIndex; i <= bottomIndex; i++) {\n const { height } = this.positions[i];\n // 合并高度\n mergeHeight += height;\n\n // 根据下标查找rowkey\n const _rowKey = this.rowIndexRowKeyMap.get(i) || '';\n const { item } = this.rowKeyMap.get(_rowKey);\n const value = this.getItemValue(_rowKey, key);\n // 需要改变值\n dataList.push({\n rowKey: _rowKey,\n key,\n value,\n row: item,\n });\n }\n }\n // 行合并的\n if (colspan !== 1 && mergeCol) {\n mergeHeight = height;\n // 向左\n for (let i = colIndex - 1; i >= 0; i--) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n const curValue = this.getItemValue(rowKey, key);\n const pValue = this.getItemValue(rowKey, column.key);\n if (curValue === pValue && relationColKeys.includes(column.key)) {\n leftIndex = i;\n } else {\n break;\n }\n }\n // 向右\n for (let i = colIndex; i <= this.ctx.maxColIndex; i++) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n const curValue = this.getItemValue(rowKey, key);\n const pValue = this.getItemValue(rowKey, column.key);\n if (curValue === pValue && relationColKeys.includes(column.key)) {\n rightIndex = i;\n } else {\n break;\n }\n }\n for (let i = leftIndex; i < colIndex; i++) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n // 合并宽度\n offsetLeft += column.width || 100;\n }\n for (let i = leftIndex; i <= rightIndex; i++) {\n const column = this.getColumnByColIndex(i);\n if (!column) {\n break;\n }\n // 合并宽度\n mergeWidth += column.width || 100;\n // 需要改变值\n dataList.push({\n rowKey,\n key: column.key,\n value: this.getItemValue(rowKey, column.key),\n row,\n });\n }\n }\n return {\n xArr: [leftIndex, rightIndex],\n yArr: [topIndex, bottomIndex],\n rowspan,\n colspan,\n height: mergeHeight,\n width: mergeWidth,\n offsetTop,\n offsetLeft,\n dataList,\n };\n }\n setLoading(loading: boolean) {\n this.loading = loading;\n this.ctx.emit('loadingChange', loading);\n }\n getLoading() {\n return this.loading;\n }\n setValidationErrorByRowIndex(rowIndex: number, key: string, message: string) {\n const rowKey = this.rowIndexRowKeyMap.get(rowIndex);\n const _key = `${rowKey}\\u200b_${key}`;\n const row = this.getRowForRowIndex(rowIndex);\n const cellHeader = this.getColumnByKey(key);\n if (!rowKey || !cellHeader || !row) {\n return;\n }\n const value = this.getItemValue(rowKey, key);\n const errors: ValidateResult = [\n {\n key,\n rowKey,\n rowIndex,\n colIndex: cellHeader.colIndex,\n column: cellHeader.column,\n row,\n value,\n message,\n field: key,\n fieldValue: value,\n },\n ];\n this.validationErrorMap.set(_key, errors);\n }\n setValidationError(rowKey: string, key: string, errors: ValidateResult) {\n const _key = `${rowKey}\\u200b_${key}`;\n this.validationErrorMap.set(_key, errors);\n }\n clearValidationError(rowKey: string, key: string) {\n const _key = `${rowKey}\\u200b_${key}`;\n if (this.validationErrorMap.has(_key)) {\n this.validationErrorMap.delete(_key);\n }\n }\n getValidationError(rowKey: string, key: string) {\n const _key = `${rowKey}\\u200b_${key}`;\n return this.validationErrorMap.get(_key) || [];\n }\n // 获取虚拟单元格,只针对可见的\n getVirtualBodyCell(rowIndex: number, colIndex: number) {\n const column = this.getColumnByColIndex(colIndex);\n const row = this.getRowForRowIndex(rowIndex);\n if (!column || !row) {\n return;\n }\n const cell = new Cell(this.ctx, rowIndex, colIndex, 0, 0, 0, 0, column, row.item, 'body');\n return cell;\n }\n getVirtualBodyCellByKey(rowKey: string, key: string) {\n const rowIndex = this.getRowIndexForRowKey(rowKey);\n const colIndex = this.getColIndexForKey(key);\n if (rowIndex === undefined || colIndex === undefined) {\n return;\n }\n return this.getVirtualBodyCell(rowIndex, colIndex);\n }\n hasMergeCell(xArr: number[], yArr: number[]) {\n let hasMergeCell = false;\n for (let i = yArr[0]; i <= yArr[1]; i++) {\n for (let j = xArr[0]; j <= xArr[1]; j++) {\n const cell = this.getVirtualBodyCell(i, j);\n if (cell && (cell.rowspan !== 1 || cell.colspan !== 1)) {\n hasMergeCell = true;\n break;\n }\n }\n }\n return hasMergeCell;\n }\n \n /**\n * 计算树形数据的最大深度\n * @param data 树形数据\n * @param currentDepth 当前深度\n * @returns 最大深度\n */\n private calculateMaxTreeDepth(data: any[], currentDepth: number = 0): number {\n let maxDepth = currentDepth;\n \n data.forEach(item => {\n if (Array.isArray(item.children) && item.children.length > 0) {\n const childMaxDepth = this.calculateMaxTreeDepth(item.children, currentDepth + 1);\n maxDepth = Math.max(maxDepth, childMaxDepth);\n }\n });\n \n return maxDepth;\n }\n}\n","import type Context from './Context';\nexport type HistoryItemData = {\n oldValue: any;\n newValue: any;\n key: string;\n rowKey: string;\n};\nexport type HistoryItem = {\n changeList: HistoryItemData[];\n scrollY: number;\n scrollX: number;\n type: 'single' | 'multiple';\n};\n/**\n * 数据历史堆栈\n */\nexport default class History {\n private ctx: Context;\n private history: HistoryItem[] = [];\n private historyIndex = -1;\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n }\n private init() {\n this.ctx.on('keydown', (e) => {\n if (this.ctx.editing) {\n return;\n }\n // 撤销\n if ((e.ctrlKey && !e.shiftKey && e.code === 'KeyZ') || (e.metaKey && !e.shiftKey && e.code === 'KeyZ')) {\n e.preventDefault();\n this.ctx.clearSelector();\n this.ctx.clearAutofill();\n this.backState();\n return;\n }\n // 恢复\n if (\n (e.ctrlKey && e.code === 'KeyY') ||\n (e.ctrlKey && e.shiftKey && e.code === 'KeyZ') ||\n (e.metaKey && e.shiftKey && e.code === 'KeyZ')\n ) {\n e.preventDefault();\n this.ctx.clearSelector();\n this.ctx.clearAutofill();\n this.forwardState();\n return;\n }\n });\n }\n pushState(changeList: HistoryItem) {\n const { HISTORY_NUM = 0, ENABLE_HISTORY } = this.ctx.config;\n // 是否启动历史\n if (!ENABLE_HISTORY) {\n return;\n }\n this.history.push(changeList);\n if (this.history.length > HISTORY_NUM) {\n this.history.splice(0, 1);\n }\n this.historyIndex = this.history.length - 1;\n }\n // 回退\n backState() {\n if (this.historyIndex >= 0) {\n const { changeList, scrollX, scrollY } = this.history[this.historyIndex];\n const data = changeList.map((item: { rowKey: string; key: string; oldValue: any }) => {\n return {\n rowKey: item.rowKey,\n key: item.key,\n value: item.oldValue,\n row: {},\n };\n });\n // 设置滚动条位置\n this.ctx.setScroll(scrollX, scrollY);\n // 不需要添加历史记录\n this.ctx.database.batchSetItemValue(data, false, false, 'back');\n this.historyIndex -= 1;\n }\n }\n // 前进\n forwardState() {\n if (this.historyIndex < this.history.length - 1) {\n this.historyIndex += 1;\n const { changeList } = this.history[this.historyIndex];\n const data = changeList.map((item: { rowKey: string; key: string; newValue: any }) => {\n return {\n rowKey: item.rowKey,\n key: item.key,\n value: item.newValue,\n row: {},\n };\n });\n // 不需要添加历史记录\n this.ctx.database.batchSetItemValue(data, false, false, 'forward');\n }\n }\n // 清空历史\n clear() {\n this.history = [];\n this.historyIndex = -1;\n }\n}\n","import Context from './Context';\r\n\r\ntype EventTask = Map<string, EventListenerOrEventListenerObject>;\r\n\r\nexport default class EventBrowser {\r\n private eventTasks: EventTask = new Map();\r\n private ctx: Context;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n\r\n init() {\r\n this.bind(window, 'resize', this.handleResize.bind(this));\r\n this.bind(window, 'mouseup', this.handleMouseUp.bind(this));\r\n this.bind(window, 'mousemove', this.handleMousemove.bind(this));\r\n this.bind(window, 'blur', this.handleOutsideMousedown.bind(this));\r\n this.bind(window, 'mousedown', this.handleOutsideMousedown.bind(this));\r\n this.bind(this.ctx.stageElement, 'click', this.handleClick.bind(this));\r\n this.bind(window, 'keydown', this.handleKeydown.bind(this));\r\n this.bind(this.ctx.stageElement, 'wheel', this.handleWheel.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'touchstart', this.handleTouchstart.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'touchend', this.handleTouchend.bind(this));\r\n this.bind(this.ctx.stageElement, 'touchmove', this.handleTouchmove.bind(this), { passive: false });\r\n this.bind(this.ctx.stageElement, 'contextmenu', this.handleContextMenu.bind(this));\r\n this.bind(this.ctx.stageElement, 'mousedown', this.handleMouseDown.bind(this));\r\n this.bind(this.ctx.stageElement, 'dblclick', this.handleDblclick.bind(this));\r\n this.bind(this.ctx.stageElement, 'mouseover', this.handleMouseover.bind(this));\r\n this.bind(this.ctx.stageElement, 'mouseout', this.handleMouseout.bind(this));\r\n document.addEventListener('selectionchange', this.selectionchange.bind(this));\r\n }\r\n private selectionchange() {\r\n this.ctx.domSelectionStr = '';\r\n const selection = window.getSelection();\r\n if (selection && selection.toString()) {\r\n this.ctx.domSelectionStr = selection.toString();\r\n }\r\n }\r\n private clearDomSelection() {\r\n const selection = window.getSelection();\r\n if (selection && !selection.isCollapsed) {\r\n selection.removeAllRanges();\r\n }\r\n }\r\n destroy() {\r\n this.eventTasks.forEach((fn, event) => {\r\n this.unbind(window, event, fn);\r\n });\r\n document.removeEventListener('selectionchange', this.selectionchange.bind(this));\r\n this.eventTasks.clear();\r\n }\r\n private handleResize(e: Event) {\r\n this.ctx.emit('resetHeader', e);\r\n this.ctx.emit('resize', e);\r\n }\r\n private handleMouseDown(e: Event) {\r\n this.clearDomSelection();\r\n const _e = e as MouseEvent;\r\n if (_e.button === 0) {\r\n this.ctx.mousedown = true;\r\n }\r\n this.ctx.containerElement.focus({ preventScroll: true });\r\n this.ctx.emit('mousedown', e);\r\n }\r\n private handleMousemove(e: Event) {\r\n this.ctx.emit('mousemove', e);\r\n }\r\n private handleMouseUp(e: Event) {\r\n const _e = e as MouseEvent;\r\n if (_e.button === 0) {\r\n this.ctx.mousedown = false;\r\n }\r\n this.ctx.emit('mouseup', e);\r\n }\r\n private handleClick(e: Event) {\r\n this.ctx.emit('click', e);\r\n }\r\n private handleKeydown(e: Event) {\r\n const { ENABLE_KEYBOARD } = this.ctx.config;\r\n if (!ENABLE_KEYBOARD) return;\r\n if (!this.ctx.isTarget(e)) {\r\n return;\r\n }\r\n this.ctx.emit('keydown', e);\r\n }\r\n private handleWheel(e: Event) {\r\n this.ctx.emit('wheel', e);\r\n }\r\n private handleTouchstart(e: Event) {\r\n this.ctx.emit('touchstart', e);\r\n }\r\n private handleTouchend(e: Event) {\r\n this.ctx.emit('touchend', e);\r\n }\r\n private handleTouchmove(e: Event) {\r\n this.ctx.emit('touchmove', e);\r\n }\r\n private handleContextMenu(e: Event) {\r\n e.preventDefault();\r\n this.ctx.emit('contextMenu', e);\r\n }\r\n private handleMouseover(e: Event) {\r\n this.ctx.isMouseoverTargetContainer = true;\r\n this.ctx.emit('mouseover', e);\r\n }\r\n private handleMouseout(e: Event) {\r\n this.ctx.isMouseoverTargetContainer = false;\r\n this.ctx.emit('mouseout', e);\r\n }\r\n private handleDblclick(e: Event) {\r\n this.ctx.emit('dblclick', e);\r\n }\r\n private handleOutsideMousedown(e: Event) {\r\n if (\r\n this.ctx.selector.enable &&\r\n (e.target instanceof Window || (e.target instanceof Node && !this.ctx.containerElement.contains(e.target)))\r\n ) {\r\n this.ctx.emit('outsideMousedown', e);\r\n }\r\n }\r\n private bind(\r\n target: EventTarget,\r\n name: string,\r\n fn: EventListenerOrEventListenerObject,\r\n options?: AddEventListenerOptions | boolean,\r\n ): void {\r\n target.addEventListener(name, fn, options);\r\n this.eventTasks.set(name, fn);\r\n }\r\n\r\n private unbind(target: EventTarget, name: string, fn: EventListenerOrEventListenerObject): void {\r\n target.removeEventListener(name, fn);\r\n this.eventTasks.delete(name);\r\n }\r\n}\r\n","export type EventCallback = (...args: any[]) => void;\r\n\r\ntype EventMap = Map<string, EventCallback[]>;\r\n\r\nclass EventBus {\r\n private events: EventMap = new Map();\r\n constructor() {}\r\n has(event: string): boolean {\r\n return this.events.has(event);\r\n }\r\n // 订阅事件\r\n on(event: string, callback: EventCallback): void {\r\n const callbacks = this.events.get(event) || [];\r\n callbacks.push(callback);\r\n this.events.set(event, callbacks);\r\n }\r\n // 一次性订阅事件\r\n once(event: string, callback: EventCallback) {\r\n const onceCallback: EventCallback = (...args) => {\r\n callback(...args);\r\n this.off(event, onceCallback);\r\n };\r\n this.on(event, onceCallback);\r\n return this;\r\n }\r\n // 取消订阅事件\r\n off(event: string, callback: EventCallback): void {\r\n const callbacks = this.events.get(event);\r\n if (callbacks) {\r\n const index = callbacks.indexOf(callback);\r\n if (index >= 0) {\r\n callbacks.splice(index, 1);\r\n if (callbacks.length === 0) {\r\n this.events.delete(event);\r\n } else {\r\n this.events.set(event, callbacks);\r\n }\r\n }\r\n }\r\n }\r\n // 发布事件\r\n emit(event: string, ...args: any[]): void {\r\n const callbacks = this.events.get(event);\r\n if (callbacks) {\r\n callbacks.forEach((callback) => {\r\n callback(...args);\r\n });\r\n }\r\n }\r\n\r\n destroy(): void {\r\n this.events.clear();\r\n }\r\n}\r\nexport default EventBus;\r\n","import { Align, VerticalAlign } from './types';\n\nexport type LineOptions = {\n lineCap?: CanvasLineCap;\n lineDash?: number[];\n lineJoin?: CanvasLineJoin;\n borderWidth?: number;\n borderColor?: string | CanvasGradient | CanvasPattern;\n fillColor?: string | CanvasGradient | CanvasPattern;\n};\nexport type ShodowOptions = {\n side: 'left' | 'right' | 'top' | 'bottom';\n shadowWidth: number;\n colorStart: string;\n colorEnd: string;\n fillColor?: string | CanvasGradient | CanvasPattern;\n};\nexport type RectOptions = {\n borderWidth?: number;\n borderColor?: string;\n fillColor?: string;\n radius?: number | [number, number, number, number];\n};\nexport type DrawTextOptions = {\n font?: string;\n color?: string;\n align?: Align;\n padding?: number;\n verticalAlign?: VerticalAlign;\n};\nexport class Paint {\n private ctx: CanvasRenderingContext2D;\n constructor(target: HTMLCanvasElement) {\n const ctx = target.getContext('2d');\n if (!ctx) throw new Error('canvas context not found');\n this.ctx = ctx;\n }\n scale(dpr: number) {\n this.ctx.setTransform(1, 0, 0, 1, 0, 0);\n this.ctx.scale(dpr, dpr);\n }\n save() {\n this.ctx.save();\n }\n restore() {\n this.ctx.restore();\n }\n translate(x: number, y: number) {\n this.ctx.translate(x, y);\n }\n\n setCursor(cursor = 'default') {\n this.ctx.canvas.style.cursor = cursor;\n }\n clear(x = 0, y = 0, width?: number, height?: number) {\n this.ctx.clearRect(x, y, width || this.ctx.canvas.width, height || this.ctx.canvas.height);\n }\n /**\n * 在 Canvas 上绘制单侧阴影\n * @param {number} x - 矩形的 x 坐标\n * @param {number} y - 矩形的 y 坐标\n * @param {number} width - 矩形的宽度\n * @param {number} height - 矩形的高度\n * @param {string} side - 阴影的位置('left', 'right', 'top', 'bottom')\n * @param {number} shadowWidth - 阴影的宽度\n * @param {string} color - 阴影的颜色\n */\n drawShadow(x: number, y: number, width: number, height: number, options: ShodowOptions): void {\n const { fillColor, side, shadowWidth, colorStart, colorEnd } = options;\n this.ctx.save();\n if (fillColor) {\n this.ctx.fillStyle = fillColor;\n this.ctx.fillRect(x, y, width, height);\n }\n let gradient: CanvasGradient;\n switch (side) {\n case 'left':\n gradient = this.ctx.createLinearGradient(x - shadowWidth, y, x, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x - shadowWidth, y, shadowWidth, height);\n break;\n case 'right':\n gradient = this.ctx.createLinearGradient(x + width, y, x + width + shadowWidth, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x + width, y, shadowWidth, height);\n break;\n case 'top':\n gradient = this.ctx.createLinearGradient(x, y - shadowWidth, x, y);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x, y - shadowWidth, width, shadowWidth);\n break;\n case 'bottom':\n gradient = this.ctx.createLinearGradient(x, y + height, x, y + height + shadowWidth);\n gradient.addColorStop(0, colorStart);\n gradient.addColorStop(1, colorEnd);\n this.ctx.fillStyle = gradient;\n this.ctx.fillRect(x, y + height, width, shadowWidth);\n break;\n default:\n console.error('Invalid side specified for shadow');\n break;\n }\n }\n // 绘制线条\n drawLine(points: number[], options: LineOptions) {\n if (points.length < 4 || points.length % 2 !== 0) {\n throw new Error('A valid array of points is required to draw a line');\n }\n this.ctx.save();\n const { borderColor = 'black', borderWidth = 1 } = options;\n\n this.ctx.beginPath();\n this.ctx.moveTo(points[0] - 0.5, points[1] - 0.5);\n for (let i = 2; i < points.length; i += 2) {\n this.ctx.lineTo(points[i] - 0.5, points[i + 1] - 0.5);\n }\n this.ctx.strokeStyle = borderColor;\n this.ctx.lineWidth = borderWidth;\n if (options.lineDash) {\n this.ctx.lineDashOffset = 4;\n this.ctx.setLineDash(options.lineDash);\n }\n\n if (options.fillColor) {\n this.ctx.fillStyle = options.fillColor;\n this.ctx.fill();\n }\n if (options.borderColor) {\n this.ctx.strokeStyle = options.borderColor;\n }\n this.ctx.stroke();\n this.ctx.closePath();\n this.ctx.restore();\n }\n drawImage(img: CanvasImageSource, x: number, y: number, width: number, height: number) {\n this.ctx.save();\n this.ctx.drawImage(img, x, y, width, height);\n this.ctx.restore();\n }\n\n drawRect(\n x: number,\n y: number,\n width: number,\n height: number,\n { borderWidth = 1, borderColor, fillColor, radius = 0 }: RectOptions = {},\n ) {\n this.ctx.save();\n this.ctx.beginPath();\n // 填充颜色\n if (fillColor !== undefined) {\n this.ctx.fillStyle = fillColor;\n }\n\n // 线条宽度及绘制颜色\n if (borderColor !== undefined) {\n this.ctx.lineWidth = borderWidth;\n this.ctx.strokeStyle = borderColor;\n }\n if (radius === 0) {\n // 绘制矩形路径,- 0.5解决1px模糊的问题\n this.ctx.rect(x - 0.5, y - 0.5, width, height);\n } else {\n // 确保 radius 是一个包含四个元素的数组\n const [tl, tr, br, bl] = typeof radius === 'number' ? [radius, radius, radius, radius] : radius;\n // 绘制圆角矩形路径\n this.ctx.moveTo(x + tl, y);\n this.ctx.arcTo(x + width, y, x + width, y + tr, tr); // draw right side and top-right corner\n this.ctx.arcTo(x + width, y + height, x + width - br, y + height, br); // draw bottom side and bottom-right corner\n this.ctx.arcTo(x, y + height, x, y + height - bl, bl); // draw left side and bottom-left corner\n this.ctx.arcTo(x, y, x + tl, y, tl); // draw top side and top-left corner\n }\n\n // 如果有填充色,则填充\n if (fillColor !== undefined) {\n this.ctx.fill();\n }\n\n // 如果有绘制色,则绘制\n if (borderColor !== undefined) {\n this.ctx.stroke();\n }\n this.ctx.restore();\n }\n /**\n * 画文本\n * @param text\n * @param x\n * @param y\n * @param width\n * @param height\n * @param options\n * @returns 是否溢出\n */\n drawText(\n text: string = '',\n x: number,\n y: number,\n width: number,\n height: number,\n options: DrawTextOptions = {},\n ): boolean {\n this.ctx.save();\n const {\n font = '12px Arial',\n align = 'center',\n color = '#495060',\n padding = 0,\n verticalAlign = 'middle',\n } = options;\n this.ctx.font = font;\n this.ctx.fillStyle = color;\n this.ctx.textBaseline = verticalAlign;\n this.ctx.textAlign = align;\n\n let yPos = 0;\n if (verticalAlign === 'top') {\n yPos = y + padding;\n } else if (verticalAlign === 'bottom') {\n yPos = y + height - padding;\n } else {\n yPos = y + (height + 1) / 2;\n }\n let xPos = 0;\n if (align === 'left') {\n xPos = x + padding;\n } else if (align === 'right') {\n xPos = x + width - padding;\n } else {\n xPos = x + width / 2;\n }\n const { _text, ellipsis } = this.handleEllipsis(text, width, padding, font);\n this.ctx.fillText(_text, xPos, yPos);\n this.ctx.restore();\n return ellipsis;\n }\n handleEllipsis(text: string, width: number, padding = 0, font = '12px Arial') {\n let ellipsis = false;\n let _text = text;\n this.ctx.font = font;\n if (text === null || text === undefined || text === '') {\n return {\n _text: '',\n ellipsis,\n };\n }\n const ellipsesWidth = this.ctx.measureText('...').width;\n // 如果宽度小于省略号宽度,则不进行省略,直接返回空字符串\n if (width <= ellipsesWidth + padding * 2) {\n return {\n _text: '',\n ellipsis: true,\n };\n }\n const textWidth = this.ctx.measureText(text).width;\n\n if (textWidth && textWidth + ellipsesWidth >= width - padding * 2) {\n ellipsis = true;\n // text字符截取并添加省略号\n let textLength = 0;\n for (let i = 0; i < text.length; i++) {\n textLength += this.ctx.measureText(text[i]).width;\n if (textLength >= width - padding * 2 - ellipsesWidth) {\n _text = text.slice(0, i) + '...';\n break;\n }\n }\n }\n return {\n _text,\n ellipsis,\n };\n }\n}\n\nexport default Paint;\n","import { IconType } from './Icons';\nimport {\n Align,\n BeforeAutofillDataMethod,\n BeforeCellValueChangeMethod,\n BeforeCopyMethod,\n BeforePasteDataMethod,\n BeforeSetAutofillMethod,\n BeforeSetSelectorMethod,\n CellEditorMethod,\n CellHeaderStyleMethod,\n CellHoverIconMethod,\n CellReadonlyMethod,\n CellRenderMethod,\n CellRulesMethod,\n CellStyleMethod,\n CellTypeMethod,\n ConfigType,\n ExpandLazyMethod,\n FooterPosition,\n FormatterMethod,\n MenuItem,\n SelectableMethod,\n SelectorCellValueType,\n SpanMethod,\n TreeSelectMode,\n VerticalAlign,\n} from './types';\nimport { getCssVar } from './util';\n\nexport default class Config {\n private _config: ConfigType = {};\n /** CSS 类名前缀 */\n CSS_PREFIX = 'e-virt-table';\n /** 图标集合 */\n ICONS: IconType[] = [];\n /** 行的唯一标识键 */\n ROW_KEY = '';\n /** 禁用编辑,优先等级最高 */\n DISABLED = false;\n /** 表头字体 */\n HEADER_FONT = '12px normal Arial';\n /** 单元格字体 */\n BODY_FONT = '12px normal Arial';\n /** 边框 */\n BORDER = true;\n /** 斑马纹 */\n STRIPE = false;\n /** 斑马纹颜色 */\n STRIPE_COLOR = '#fafafa';\n /** 区域边框颜色 */\n BORDER_COLOR = '#e1e6eb';\n /** 宽度为 0 表示自适应100% */\n WIDTH = 0;\n /** 最小可调整宽度 */\n RESIZE_MIN_WIDTH = 40;\n /** 高度,为 0 表示自适应 */\n HEIGHT = 0;\n /** 占位文本颜色 */\n PLACEHOLDER_COLOR = '#CDD0DC';\n /** 空数据 body 高度 */\n EMPTY_BODY_HEIGHT = 120;\n /** 自定义空样式 */\n EMPTY_CUSTOM_STYLE: Partial<CSSStyleDeclaration> = {};\n /** 空数据文本 */\n EMPTY_TEXT = '暂无数据';\n /** 最大高度,为 0 表示自适应高度根据 HEIGHT\t */\n MAX_HEIGHT = 1000;\n /** 区域边框圆角 */\n BORDER_RADIUS = 8;\n ENABLE_OFFSET_HEIGHT = false;\n OFFSET_HEIGHT = 0;\n HEADER_HEIGHT = 36;\n /** 启用头部固定,需要外面实现覆盖层,或者所有表头都要是元素 */\n ENABLE_HEADER_STICKY = false;\n /** 表头背景色 */\n HEADER_BG_COLOR = '#F8FAFF';\n /** body 背景色 */\n BODY_BG_COLOR = '#FFF';\n /** 表头文本颜色 */\n HEADER_TEXT_COLOR = '#1D2129';\n /** body文本颜色 */\n BODY_TEXT_COLOR = '#4E5969';\n /** footer文本颜色 */\n FOOTER_TEXT_COLOR = '#4E5969';\n /** 加载 svg 图标 */\n LOADING_ICON_SVG = '';\n /** 加载 svg 图标颜色 */\n LOADING_ICON_COLOR = '#4E5969';\n /** 树形展开svg 图标 */\n EXPAND_ICON_SVG = '';\n /** 树形收缩svg 图标 */\n SHRINK_ICON_SVG = '';\n /** 展开图标颜色 */\n EXPAND_ICON_COLOR = '#4E5969';\n SHRINK_ICON_COLOR = '#4E5969';\n /** 错误提示颜色 */\n ERROR_TIP_ICON_COLOR = 'red';\n /** 错误提示图标大小 */\n ERROR_TIP_ICON_SIZE = 6;\n /** 所有列对齐方式 */\n COLUMNS_ALIGN: Align = 'left';\n /** 所有列垂直对齐方式 */\n COLUMNS_VERTICAL_ALIGN: VerticalAlign = 'middle';\n /** 是否开启懒加载\t */\n EXPAND_LAZY = true;\n /** 默认展开全部\t */\n DEFAULT_EXPAND_ALL = false;\n /** 表格 body 部分的宽度 */\n CELL_WIDTH = 100;\n /** body 单元格默认行高 */\n CELL_HEIGHT = 36;\n /** 表格 body 部分的 padding */\n CELL_PADDING = 8;\n /** hover编辑图标大小 */\n CELL_HOVER_ICON_SIZE = 14;\n /** hover编辑图标背景色 */\n CELL_HOVER_ICON_BG_COLOR = '#fff';\n /** hover编辑图标边框颜色 */\n CELL_HOVER_ICON_BORDER_COLOR = '#DDE0EA';\n /** 滚动条轨道尺寸 */\n SCROLLER_TRACK_SIZE = 14;\n /** 滚动条滑块尺寸 */\n SCROLLER_SIZE = 8;\n /** 滚动条滑块颜色 */\n SCROLLER_COLOR = '#dee0e3';\n /** 轨道颜色 */\n SCROLLER_TRACK_COLOR = '#fff';\n /** 滚动条滑块聚焦时的颜色 */\n SCROLLER_FOCUS_COLOR = '#bbbec4';\n /** 选中区域边框颜色 */\n SELECT_BORDER_COLOR = 'rgb(82,146,247)';\n /** 选中区域背景颜色 */\n SELECT_AREA_COLOR = 'rgba(82,146,247,0.1)';\n /** 当前焦点单元格所在行、列的背景色 */\n SELECT_ROW_COL_BG_COLOR = 'transparent';\n /** 填充点的边框颜色 */\n AUTOFILL_POINT_BORDER_COLOR = '#fff';\n /** 可编辑背景色 */\n EDIT_BG_COLOR = '#fcf6ed';\n /** 选择 key,合并时用 */\n CHECKBOX_KEY = '';\n /** 选择框颜色 */\n CHECKBOX_COLOR = 'rgb(82,146,247)';\n /** 选择框大小 */\n CHECKBOX_SIZE = 20;\n /** 选择框禁用图标 */\n CHECKBOX_DISABLED_SVG = '';\n /** 选择框选中图标 */\n CHECKBOX_CHECK_SVG = '';\n /** 选择框未中图标 */\n CHECKBOX_UNCHECK_SVG = '';\n /** 选择框半选中图标 */\n CHECKBOX_INDETERMINATE_SVG = '';\n /** 单元格只读背景色 */\n READONLY_COLOR = '#fff';\n /** 单元格只读文本颜色 */\n READONLY_TEXT_COLOR = '#4E5969';\n /** 单元格错误提示文本颜色 */\n ERROR_TIP_COLOR = '#ED3F14';\n /** 合计底部背景色 */\n FOOTER_BG_COLOR = '#fafafa';\n /** 合计底部固定 */\n FOOTER_FIXED = true;\n /** 合计底部位置 */\n FOOTER_POSITION: FooterPosition = 'bottom';\n /** 单元格底部高度 */\n CELL_FOOTER_HEIGHT = 36;\n /** 启用选择器 */\n ENABLE_SELECTOR = true;\n /** 树形选择模式 */\n TREE_SELECT_MODE: TreeSelectMode = 'auto';\n /** 树形缩进宽度 */\n TREE_INDENT = 20;\n /** 树形图标大小 */\n TREE_ICON_SIZE = 20;\n /** 启用单点击立马编辑 */\n ENABLE_EDIT_SINGLE_CLICK = false;\n /** 启用点击选择器编辑 */\n ENABLE_EDIT_CLICK_SELECTOR = true;\n /** 选择器X最小范围 */\n SELECTOR_AREA_MIN_X = 0;\n /** 选择器X最大范围colMax - offset */\n SELECTOR_AREA_MAX_X_OFFSET = 0;\n /** 选择器X最大范围,0默认最大colMax */\n SELECTOR_AREA_MAX_X = 0;\n /** 选择器Y最小范围 */\n SELECTOR_AREA_MIN_Y = 0;\n /** 选择器Y最大范围,0默认rowMax */\n SELECTOR_AREA_MAX_Y = 0;\n /** 选择器Y最大范围,0默认rowMax */\n SELECTOR_AREA_MAX_Y_OFFSET = 0;\n /** 选择器值类型,value,displayText,区别displayText受format影响 */\n SELECTOR_CELL_VALUE_TYPE: SelectorCellValueType = 'value'; // displayText | value\n /** 启用自动主题 */\n ENABLE_AUTO_THEME = true;\n /** 启用选择器-选择器单选 */\n ENABLE_SELECTOR_SINGLE = false;\n /** 启用选择器-批量跨列选择 */\n ENABLE_SELECTOR_SPAN_COL = true;\n /** 启用选择器-批量跨行选择 */\n ENABLE_SELECTOR_SPAN_ROW = true;\n /** 启用选择器-批量选中列 */\n ENABLE_SELECTOR_ALL_ROWS = true;\n /** 启用选择器-批量选中行 */\n ENABLE_SELECTOR_ALL_COLS = true;\n /** 启用合并格子数据关联 */\n ENABLE_MERGE_CELL_LINK = false;\n /** 启用填充器 */\n ENABLE_AUTOFILL = false;\n /** 启用右键菜单 */\n ENABLE_CONTEXT_MENU = false;\n /** 启用复制 */\n ENABLE_COPY = true;\n /** 启用粘贴 */\n ENABLE_PASTER = true;\n /** 启用调整行高 */\n ENABLE_RESIZE_ROW = true;\n /** 启用列宽可调整 */\n ENABLE_RESIZE_COLUMN = true;\n /** 行调整线颜色 */\n RESIZE_ROW_LINE_COLOR = '#e1e6eb';\n /** 列调整线颜色 */\n RESIZE_COLUMN_LINE_COLOR = '#e1e6eb';\n /** 最小调整行高 */\n RESIZE_ROW_MIN_HEIGHT = 36;\n /** 列宽最小值 */\n RESIZE_COLUMN_MIN_WIDTH = 40;\n /** 启用键盘 */\n ENABLE_KEYBOARD = true;\n /** 启用历史 */\n ENABLE_HISTORY = false;\n ENABLE_VALIDATOR_IMMEDIATE = true;\n /** 历史栈数量 */\n HISTORY_NUM = 50;\n /** 启用悬浮高亮 */\n HIGHLIGHT_HOVER_ROW = false;\n /** 悬浮颜色 */\n HIGHLIGHT_HOVER_ROW_COLOR = 'rgba(186,203,231,0.1)';\n /** 高亮选中当前行 */\n HIGHLIGHT_SELECTED_ROW = false;\n /** 高亮当前行颜色 */\n HIGHLIGHT_SELECTED_ROW_COLOR = 'rgba(82,146,247,0.1)';\n /** 提示背景颜色 */\n TOOLTIP_BG_COLOR = '#303133';\n /** 提示文本颜色 */\n TOOLTIP_TEXT_COLOR = '#fff';\n /** 提示层级 */\n TOOLTIP_ZINDEX = 3000;\n /** 自定义提示样式 */\n TOOLTIP_CUSTOM_STYLE: Partial<CSSStyleDeclaration> = {};\n /** 自定义右键菜单 */\n CONTEXT_MENU: MenuItem[] = [\n { label: '复制', value: 'copy' },\n { label: '剪切', value: 'cut' },\n { label: '粘贴', value: 'paste' },\n { label: '清空选中内容', value: 'clearSelected' },\n ];\n /** header 格子样式 */\n HEADER_CELL_STYLE_METHOD?: CellHeaderStyleMethod;\n /** body 格子样式 */\n BODY_CELL_STYLE_METHOD?: CellStyleMethod;\n /** footer 格子样式 */\n FOOTER_CELL_STYLE_METHOD?: CellStyleMethod;\n /** 自定义只读 */\n BODY_CELL_READONLY_METHOD?: CellReadonlyMethod;\n /** 格式化方法更改(formatter优先等级比较高) */\n BODY_CELL_FORMATTER_METHOD?: FormatterMethod;\n /** 自定义校验规则 */\n BODY_CELL_RULES_METHOD?: CellRulesMethod;\n /** 自定义只读 */\n BODY_CELL_TYPE_METHOD?: CellTypeMethod;\n /** 自定义编辑器类型 */\n BODY_CELL_EDITOR_METHOD?: CellEditorMethod;\n /** 自定义只读 */\n BODY_CELL_RENDER_METHOD?: CellRenderMethod;\n /** 自定义只读 */\n BODY_CELL_HOVER_ICON_METHOD?: CellHoverIconMethod;\n /** 自定义跨列/行渲染 */\n SPAN_METHOD?: SpanMethod;\n /** 自定义选择禁用 */\n SELECTABLE_METHOD?: SelectableMethod;\n /** 自定义选择禁用 */\n EXPAND_LAZY_METHOD?: ExpandLazyMethod;\n /** 数值改变前回调 */\n BEFORE_VALUE_CHANGE_METHOD?: BeforeCellValueChangeMethod;\n /** 粘贴前回调 */\n BEFORE_PASTE_DATA_METHOD?: BeforePasteDataMethod;\n /** 数值填充前回调 */\n BEFORE_AUTOFILL_DATA_METHOD?: BeforeAutofillDataMethod;\n /** 设置选择器前回调 */\n BEFORE_SET_SELECTOR_METHOD?: BeforeSetSelectorMethod;\n /** 设置填充器前回调 */\n BEFORE_SET_AUTOFILL_METHOD?: BeforeSetAutofillMethod;\n /** 数据复制前回调 */\n BEFORE_COPY_METHOD?: BeforeCopyMethod;\n constructor(config: Partial<Config>) {\n this._config = config;\n this.updateCssVar();\n }\n /** 初始化 */\n init(config: ConfigType) {\n this._config = config;\n this.updateCssVar();\n }\n /** 同步css 样式变量 */\n updateCssVar() {\n let obj: any = {};\n Object.keys(this).forEach((key) => {\n if (key.endsWith('_COLOR') || key.endsWith('_FONT')) {\n const cssKey = `--evt-${key.toLocaleLowerCase().replace(/_/g, '-')}`;\n const val = getCssVar(cssKey);\n obj[key] = val;\n }\n });\n Object.assign(this, obj, this._config);\n }\n}\n","import Context from './Context';\r\ntype ConfigColorNameType = 'LOADING_ICON_COLOR' | 'EXPAND_ICON_COLOR' | 'SHRINK_ICON_COLOR' | 'CHECKBOX_COLOR';\r\ntype ConfigTypeName =\r\n | 'LOADING_ICON_SVG'\r\n | 'EXPAND_ICON_SVG'\r\n | 'SHRINK_ICON_SVG'\r\n | 'CHECKBOX_UNCHECK_SVG'\r\n | 'CHECKBOX_CHECK_SVG'\r\n | 'CHECKBOX_DISABLED_SVG'\r\n | 'CHECKBOX_INDETERMINATE_SVG';\r\n\r\ninterface SvgIcon extends IconType {\r\n configName?: ConfigTypeName;\r\n configColorName?: ConfigColorNameType;\r\n}\r\nexport interface IconType {\r\n name: string;\r\n svg: string;\r\n color: string;\r\n isBlob?: boolean;\r\n}\r\nconst svgSelect =\r\n '<svg t=\"1724122044148\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M707.648 401.28L489.28 560.704l22.656 30.976 22.656-30.976L316.16 401.216q-3.072-2.24-6.464-3.84-3.456-1.536-7.104-2.432-3.712-0.896-7.488-1.088-3.776-0.128-7.488 0.448-3.776 0.64-7.296 1.92-3.584 1.28-6.784 3.2-3.2 1.984-6.016 4.544-2.816 2.56-5.056 5.632-2.176 3.072-3.84 6.464-1.536 3.456-2.432 7.104-0.896 3.712-1.088 7.488-0.128 3.776 0.448 7.488 0.64 3.776 1.92 7.296 1.28 3.584 3.2 6.784 1.984 3.2 4.544 6.016 2.56 2.752 5.632 4.992l218.368 159.552q4.928 3.584 10.752 5.504 5.76 1.92 11.904 1.92 6.08 0 11.904-1.92 5.76-1.92 10.752-5.504l218.368-159.552q3.008-2.24 5.568-4.992 2.56-2.816 4.544-6.016 1.92-3.2 3.264-6.784 1.28-3.52 1.92-7.296 0.576-3.712 0.384-7.488-0.128-3.84-1.024-7.488-0.896-3.648-2.496-7.04-1.6-3.456-3.84-6.528-2.24-3.072-4.992-5.632-2.816-2.56-6.016-4.48-3.2-1.984-6.784-3.328-3.584-1.28-7.296-1.856-3.712-0.64-7.488-0.448-3.84 0.192-7.488 1.088-3.648 0.896-7.04 2.496-3.456 1.536-6.528 3.84z m61.056 30.976q0-3.84-0.768-7.488-0.704-3.712-2.176-7.232-1.472-3.456-3.52-6.656-2.112-3.136-4.8-5.76-2.688-2.688-5.76-4.8-3.2-2.112-6.72-3.584-3.456-1.408-7.168-2.176-3.712-0.704-7.488-0.704-3.84 0-7.488 0.704-3.712 0.768-7.232 2.176-3.456 1.472-6.656 3.584-3.136 2.112-5.76 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.584 6.656-1.408 3.52-2.176 7.232-0.704 3.712-0.704 7.488 0 3.776 0.704 7.488 0.768 3.712 2.176 7.168 1.472 3.52 3.584 6.656 2.112 3.2 4.8 5.824 2.624 2.688 5.76 4.8 3.2 2.112 6.656 3.52 3.52 1.472 7.232 2.176 3.712 0.768 7.488 0.768 3.776 0 7.488-0.768 3.712-0.704 7.168-2.176 3.52-1.408 6.656-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.048-3.2 3.52-6.72 1.472-3.456 2.176-7.168 0.768-3.712 0.768-7.488z m-436.736 0q0-3.84-0.768-7.488-0.704-3.712-2.176-7.232-1.408-3.456-3.52-6.656-2.112-3.136-4.8-5.76-2.688-2.688-5.76-4.8-3.2-2.112-6.656-3.584-3.52-1.408-7.232-2.176-3.712-0.704-7.488-0.704-3.84 0-7.488 0.704-3.712 0.768-7.232 2.176-3.456 1.472-6.592 3.584-3.2 2.112-5.824 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.52 6.656-1.472 3.52-2.24 7.232-0.704 3.712-0.704 7.488 0 3.776 0.704 7.488 0.768 3.712 2.24 7.168 1.408 3.52 3.52 6.656 2.112 3.2 4.8 5.824 2.624 2.688 5.76 4.8 3.2 2.112 6.656 3.52 3.52 1.472 7.232 2.176 3.712 0.768 7.488 0.768 3.776 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.408 6.592-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.112-3.2 3.52-6.72 1.472-3.456 2.176-7.168 0.768-3.712 0.768-7.488z\" p-id=\"4552\"></path></svg>';\r\n\r\nexport default class Icons {\r\n private ctx: Context;\r\n private list: SvgIcon[] = [\r\n {\r\n name: 'loading',\r\n configName: 'LOADING_ICON_SVG',\r\n configColorName: 'LOADING_ICON_COLOR',\r\n svg: '<svg t=\"1724133395728\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2893\" width=\"32\" height=\"32\"><path d=\"M512 226.8476541a19.82487759 19.82487759 0 0 1 14.66497778 5.70304692c3.80203107 3.82918865 5.70304692 8.71751457 5.70304693 14.66497779v122.20814825a19.82487759 19.82487759 0 0 1-5.70304693 14.66497778 19.82487759 19.82487759 0 0 1-14.66497778 5.70304691 19.82487759 19.82487759 0 0 1-14.66497778-5.70304691 19.82487759 19.82487759 0 0 1-5.70304693-14.66497778v-122.20814825a19.82487759 19.82487759 0 0 1 5.70304693-14.66497779 19.82487759 19.82487759 0 0 1 14.66497778-5.70304692z m0 407.36049415a19.82487759 19.82487759 0 0 1 14.66497778 5.70304691c3.80203107 3.82918865 5.70304692 8.71751457 5.70304693 14.66497778v122.20814827a19.82487759 19.82487759 0 0 1-5.70304693 14.66497776 19.82487759 19.82487759 0 0 1-14.66497778 5.70304693 19.82487759 19.82487759 0 0 1-14.66497778-5.70304693 19.82487759 19.82487759 0 0 1-5.70304693-14.66497776v-122.20814827a19.82487759 19.82487759 0 0 1 5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 14.66497778-5.70304691zM797.1523459 512a19.82487759 19.82487759 0 0 1-5.70304692 14.66497778 19.82487759 19.82487759 0 0 1-14.66497779 5.70304693h-122.20814825a19.82487759 19.82487759 0 0 1-14.66497778-5.70304693 19.82487759 19.82487759 0 0 1-5.70304691-14.66497778 19.82487759 19.82487759 0 0 1 5.70304691-14.66497778 19.82487759 19.82487759 0 0 1 14.66497778-5.70304693h122.20814825a19.82487759 19.82487759 0 0 1 14.66497779 5.70304693c3.80203107 3.82918865 5.70304692 8.71751457 5.70304692 14.66497778z m-407.36049415 0a19.82487759 19.82487759 0 0 1-5.70304691 14.66497778 19.82487759 19.82487759 0 0 1-14.66497778 5.70304693h-122.20814827a19.82487759 19.82487759 0 0 1-14.66497776-5.70304693 19.82487759 19.82487759 0 0 1-5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 5.70304693-14.66497778 19.82487759 19.82487759 0 0 1 14.66497776-5.70304693h122.20814827a19.82487759 19.82487759 0 0 1 14.66497778 5.70304693c3.80203107 3.82918865 5.70304692 8.71751457 5.70304691 14.66497778zM310.22076878 310.22076878a21.29137537 21.29137537 0 0 1 14.66497779-5.70304693c5.51294514 0 10.18401235 1.90101585 14.01320099 5.70304693l86.55052591 86.57768347a20.91117183 20.91117183 0 0 1 5.73020449 14.31193182 19.28172983 19.28172983 0 0 1-6.05609289 14.013201 19.11878565 19.11878565 0 0 1-14.013201 6.05609289 20.96548698 20.96548698 0 0 1-14.31193182-5.70304692L310.22076878 338.87178998a19.06447114 19.06447114 0 0 1-5.70304693-14.01320099c0-5.54010272 1.90101585-10.42842865 5.70304693-14.66497778z m288.32975775 288.32975775a19.79772001 19.79772001 0 0 1 14.3390894-6.35482371c5.29568642 0 10.04822572 2.11827457 14.31193182 6.38198066l86.57768347 86.55052651c3.80203107 3.80203107 5.70304692 8.47309828 5.70304691 14.01320102a19.55330372 19.55330372 0 0 1-6.05609225 14.31193182 19.66193339 19.66193339 0 0 1-14.31193245 6.05609288 19.01015661 19.01015661 0 0 1-14.01320099-5.70304692l-86.55052591-86.57768347a19.79772001 19.79772001 0 0 1-6.38198129-14.31193245c0-5.29568642 2.11827457-10.07538268 6.38198129-14.33908939zM713.77923122 310.22076878c3.80203107 4.26370672 5.70304692 9.15203265 5.70304693 14.66497779s-1.90101585 10.18401235-5.70304693 14.01320099l-86.57768347 86.55052591a20.91117183 20.91117183 0 0 1-14.31193182 5.73020449 19.28172983 19.28172983 0 0 1-14.013201-6.05609289 19.11878565 19.11878565 0 0 1-6.05609289-14.013201c0-5.29568642 1.90101585-10.07538268 5.70304692-14.31193182l86.57768348-86.57768347c3.80203107-3.80203107 8.50025585-5.70304692 14.01320099-5.70304693 5.54010272 0 10.40127108 1.90101585 14.66497779 5.70304693zM425.44947347 598.57768347a19.79772001 19.79772001 0 0 1 6.35482371 14.33908939c0 5.29568642-2.11827457 10.04822572-6.38198066 14.31193245L338.89894756 713.77923122a19.06447114 19.06447114 0 0 1-14.01320099 5.70304693 19.55330372 19.55330372 0 0 1-14.31193245-6.05609227 19.68909035 19.68909035 0 0 1-6.05609227-14.31193245 19.01015661 19.01015661 0 0 1 5.70304693-14.01320099l86.57768347-86.55052591a19.79772001 19.79772001 0 0 1 14.31193182-6.38198129c5.29568642 0 10.07538268 2.11827457 14.3390894 6.38198129z\" fill=\"#000000\" fill-opacity=\".65\" p-id=\"2894\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'expand',\r\n configName: 'EXPAND_ICON_SVG',\r\n configColorName: 'EXPAND_ICON_COLOR',\r\n svg: '<svg t=\"1724122015492\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4237\" width=\"32\" height=\"32\"><path d=\"M401.472 316.992l159.04 217.664L591.488 512l-30.976-22.656-159.04 217.728q-2.24 3.008-3.84 6.464-1.6 3.456-2.496 7.104-0.896 3.648-1.024 7.424-0.192 3.84 0.384 7.552 0.64 3.712 1.92 7.296 1.28 3.52 3.2 6.784 1.984 3.2 4.544 6.016 2.56 2.752 5.632 4.992 3.072 2.24 6.464 3.84 3.456 1.6 7.168 2.496 3.648 0.896 7.424 1.024 3.776 0.192 7.488-0.448 3.776-0.576 7.296-1.856 3.584-1.28 6.784-3.264 3.2-1.92 6.016-4.48 2.816-2.56 5.056-5.632l159.04-217.728q3.584-4.928 5.504-10.752 1.92-5.76 1.92-11.904 0-6.08-1.92-11.904-1.92-5.76-5.504-10.752L463.488 271.68q-2.24-3.072-5.056-5.632-2.752-2.56-6.016-4.48-3.2-1.984-6.784-3.328-3.52-1.28-7.296-1.856-3.712-0.576-7.488-0.448-3.84 0.192-7.424 1.088-3.712 0.896-7.168 2.496-3.392 1.6-6.4 3.84-3.136 2.176-5.696 4.992-2.56 2.752-4.48 6.016-1.984 3.2-3.264 6.784-1.28 3.52-1.92 7.296-0.576 3.712-0.384 7.488 0.128 3.84 1.024 7.488 0.896 3.648 2.496 7.04 1.6 3.456 3.84 6.528z m30.976-61.056q-3.776 0-7.488 0.704-3.712 0.768-7.168 2.24-3.52 1.408-6.656 3.52-3.2 2.112-5.824 4.8-2.688 2.624-4.8 5.76-2.112 3.2-3.52 6.656-1.472 3.52-2.176 7.232-0.768 3.712-0.768 7.488 0 3.776 0.768 7.488 0.704 3.712 2.176 7.232 1.408 3.456 3.52 6.592 2.112 3.2 4.8 5.824 2.688 2.688 5.76 4.8 3.2 2.112 6.72 3.52 3.456 1.472 7.168 2.176 3.712 0.768 7.488 0.768 3.84 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.408 6.592-3.52 3.2-2.112 5.824-4.8 2.688-2.688 4.8-5.76 2.112-3.2 3.52-6.656 1.472-3.52 2.24-7.232 0.704-3.712 0.704-7.488 0-3.84-0.704-7.488-0.768-3.712-2.24-7.232-1.408-3.456-3.52-6.592-2.112-3.2-4.8-5.824-2.624-2.688-5.76-4.8-3.2-2.112-6.656-3.52-3.52-1.472-7.232-2.24Q436.224 256 432.448 256z m0 435.392q-3.776 0-7.488 0.704-3.712 0.768-7.168 2.176-3.52 1.472-6.656 3.584-3.2 2.112-5.824 4.736-2.688 2.688-4.8 5.824-2.112 3.2-3.52 6.656-1.472 3.52-2.176 7.232-0.768 3.712-0.768 7.488 0 3.776 0.768 7.488 0.704 3.712 2.176 7.168 1.408 3.52 3.52 6.656 2.112 3.2 4.8 5.76 2.688 2.752 5.76 4.8 3.2 2.112 6.72 3.584 3.456 1.472 7.168 2.176 3.712 0.768 7.488 0.768 3.84 0 7.488-0.768 3.712-0.704 7.232-2.176 3.456-1.472 6.592-3.584 3.2-2.048 5.824-4.736 2.688-2.688 4.8-5.824 2.112-3.2 3.52-6.656 1.472-3.456 2.24-7.168 0.704-3.712 0.704-7.488 0-3.84-0.704-7.488-0.768-3.712-2.24-7.232-1.408-3.52-3.52-6.656-2.112-3.136-4.8-5.76-2.624-2.688-5.76-4.8-3.2-2.112-6.656-3.584-3.52-1.408-7.232-2.176-3.712-0.704-7.488-0.704z\" p-id=\"4238\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'shrink',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'SHRINK_ICON_COLOR',\r\n svg: svgSelect,\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'checkbox-uncheck',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n svg: '<svg t=\"1722595639920\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4708\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4709\"></path></svg>',\r\n color: '',\r\n },\r\n {\r\n name: 'checkbox-check',\r\n configName: 'CHECKBOX_CHECK_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595535853\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M640 128H384c-170.496 0-256 85.504-256 256v256c0 170.496 85.504 256 256 256h256c170.496 0 256-85.504 256-256V384c0-170.496-85.504-256-256-256z m67.584 302.592c-2.048 4.608-4.608 8.704-8.192 12.288L506.88 634.88c-3.584 3.584-7.68 6.144-12.288 8.192-4.608 2.048-9.728 3.072-14.848 3.072s-10.24-1.024-14.848-3.072c-4.608-2.048-8.704-4.608-12.288-8.192l-96.256-96.256c-3.584-3.584-6.144-7.68-8.192-12.288-2.048-4.608-3.072-9.728-3.072-14.848 0-2.56 0-5.12 1.024-7.68 0.512-2.56 1.024-5.12 2.048-7.168 1.024-2.56 2.048-4.608 3.584-6.656 1.536-2.048 3.072-4.096 4.608-5.632 1.536-2.048 3.584-3.584 5.632-4.608 2.048-1.536 4.096-2.56 6.656-3.584 2.56-1.024 4.608-1.536 7.168-2.048 2.56-0.512 5.12-0.512 7.68-0.512 5.12 0 10.24 1.024 14.848 3.072 4.608 2.048 8.704 4.608 12.288 8.192l69.12 68.608L645.12 389.12c3.584-3.584 7.68-6.144 12.288-8.192 4.608-2.048 9.728-3.072 14.848-3.072 2.56 0 5.12 0 7.68 0.512s5.12 1.024 7.168 2.048c2.56 1.024 4.608 2.048 6.656 3.584 2.048 1.536 4.096 3.072 5.632 4.608 1.536 1.536 3.584 3.584 4.608 5.632 1.536 2.048 2.56 4.096 3.584 6.656 1.024 2.56 1.536 4.608 2.048 7.168 0.512 2.56 1.024 5.12 1.024 7.68 0 5.12-1.024 10.24-3.072 14.848z\" p-id=\"4552\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-hover',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595639920\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4708\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4709\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-indeterminate',\r\n configName: 'CHECKBOX_INDETERMINATE_SVG',\r\n configColorName: 'CHECKBOX_COLOR',\r\n svg: '<svg t=\"1722595280953\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4394\" width=\"32\" height=\"32\"><path d=\"M128 384v256q0 12.608 1.28 25.088 1.216 12.544 3.648 24.832 2.432 12.352 6.08 24.384t8.448 23.68q4.864 11.584 10.752 22.72 5.952 11.072 12.928 21.504 7.04 10.496 14.976 20.224 8 9.728 16.896 18.56 8.896 8.96 18.56 16.896 9.728 8 20.224 14.976 10.432 7.04 21.504 12.928 11.136 5.888 22.72 10.688 11.648 4.864 23.68 8.512 12.032 3.648 24.32 6.08 12.352 2.432 24.896 3.712Q371.392 896 384 896h256q12.608 0 25.088-1.28 12.544-1.216 24.832-3.648 12.352-2.432 24.384-6.08t23.68-8.512q11.584-4.8 22.72-10.688 11.072-5.952 21.504-12.928 10.496-7.04 20.224-14.976 9.728-8 18.56-16.896 8.96-8.832 16.896-18.56 8-9.728 14.976-20.224 7.04-10.432 12.928-21.504 5.888-11.136 10.688-22.72 4.864-11.648 8.512-23.68 3.648-12.032 6.08-24.32 2.432-12.352 3.712-24.896Q896 652.608 896 640V384q0-12.608-1.28-25.088-1.216-12.544-3.648-24.832-2.432-12.352-6.08-24.384t-8.512-23.68q-4.8-11.584-10.688-22.72-5.952-11.072-12.928-21.504-7.04-10.496-14.976-20.224-8-9.664-16.896-18.56-8.832-8.96-18.56-16.896-9.728-8-20.224-14.976-10.432-7.04-21.504-12.928-11.136-5.888-22.72-10.752-11.648-4.8-23.68-8.448-12.032-3.648-24.32-6.08-12.352-2.432-24.896-3.712Q652.608 128 640 128H384q-12.608 0-25.088 1.28-12.544 1.216-24.832 3.648-12.352 2.432-24.384 6.08t-23.68 8.448q-11.584 4.864-22.72 10.752-11.072 5.952-21.504 12.928-10.496 7.04-20.224 14.976-9.664 8-18.56 16.896-8.96 8.896-16.896 18.56-8 9.728-14.976 20.224-7.04 10.432-12.928 21.504-5.888 11.136-10.752 22.72-4.8 11.648-8.448 23.68-3.648 12.032-6.08 24.32-2.432 12.352-3.712 24.896Q128 371.392 128 384z m566.016 166.336H330.112a38.4 38.4 0 0 1 0-76.8h363.904a38.4 38.4 0 0 1 0 76.8z\" p-id=\"4395\"></path></svg>',\r\n color: 'rgb(82,146,247)',\r\n },\r\n {\r\n name: 'checkbox-check-disabled',\r\n configName: 'CHECKBOX_CHECK_SVG',\r\n svg: '<svg t=\"1722595535853\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4551\" width=\"32\" height=\"32\"><path d=\"M640 128H384c-170.496 0-256 85.504-256 256v256c0 170.496 85.504 256 256 256h256c170.496 0 256-85.504 256-256V384c0-170.496-85.504-256-256-256z m67.584 302.592c-2.048 4.608-4.608 8.704-8.192 12.288L506.88 634.88c-3.584 3.584-7.68 6.144-12.288 8.192-4.608 2.048-9.728 3.072-14.848 3.072s-10.24-1.024-14.848-3.072c-4.608-2.048-8.704-4.608-12.288-8.192l-96.256-96.256c-3.584-3.584-6.144-7.68-8.192-12.288-2.048-4.608-3.072-9.728-3.072-14.848 0-2.56 0-5.12 1.024-7.68 0.512-2.56 1.024-5.12 2.048-7.168 1.024-2.56 2.048-4.608 3.584-6.656 1.536-2.048 3.072-4.096 4.608-5.632 1.536-2.048 3.584-3.584 5.632-4.608 2.048-1.536 4.096-2.56 6.656-3.584 2.56-1.024 4.608-1.536 7.168-2.048 2.56-0.512 5.12-0.512 7.68-0.512 5.12 0 10.24 1.024 14.848 3.072 4.608 2.048 8.704 4.608 12.288 8.192l69.12 68.608L645.12 389.12c3.584-3.584 7.68-6.144 12.288-8.192 4.608-2.048 9.728-3.072 14.848-3.072 2.56 0 5.12 0 7.68 0.512s5.12 1.024 7.168 2.048c2.56 1.024 4.608 2.048 6.656 3.584 2.048 1.536 4.096 3.072 5.632 4.608 1.536 1.536 3.584 3.584 4.608 5.632 1.536 2.048 2.56 4.096 3.584 6.656 1.024 2.56 1.536 4.608 2.048 7.168 0.512 2.56 1.024 5.12 1.024 7.68 0 5.12-1.024 10.24-3.072 14.848z\" p-id=\"4552\"></path></svg>',\r\n color: '#DDE0EA',\r\n },\r\n {\r\n name: 'checkbox-disabled',\r\n configName: 'CHECKBOX_DISABLED_SVG',\r\n svg: '<svg t=\"1722595946663\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4865\" width=\"32\" height=\"32\"><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z\" fill=\"#F1F2F4\" p-id=\"4866\"></path><path d=\"M128 640V384a256 256 0 0 1 256-256h256a256 256 0 0 1 256 256v256a256 256 0 0 1-256 256H384a256 256 0 0 1-256-256z m64 0q0 79.552 56.256 135.744Q304.448 832 384 832h256q79.552 0 135.744-56.256Q832 719.552 832 640V384q0-79.552-56.256-135.744Q719.552 192 640 192H384q-79.552 0-135.744 56.256Q192 304.448 192 384v256z\" fill=\"#DDE0EA\" p-id=\"4867\"></path></svg>',\r\n color: '',\r\n },\r\n {\r\n name: 'icon-edit',\r\n configName: 'CHECKBOX_DISABLED_SVG',\r\n svg: '<svg t=\"1744798692576\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"6606\" width=\"200\" height=\"200\"><path d=\"M855.296 894.528H168.768v-76.8h686.528v76.8z m38.4-38.4q0 3.84-0.768 7.488-0.704 3.712-2.176 7.232-1.472 3.52-3.52 6.656-2.112 3.136-4.8 5.76-2.688 2.688-5.824 4.8-3.2 2.112-6.656 3.584-3.456 1.408-7.168 2.176-3.712 0.704-7.488 0.704-3.84 0-7.488-0.704-3.712-0.768-7.232-2.176-3.52-1.472-6.656-3.584-3.136-2.112-5.76-4.736-2.688-2.688-4.8-5.824-2.112-3.2-3.584-6.656-1.408-3.52-2.176-7.232-0.704-3.648-0.704-7.488 0-3.776 0.704-7.488 0.768-3.712 2.176-7.168 1.472-3.52 3.584-6.656 2.112-3.136 4.736-5.76 2.688-2.752 5.824-4.8 3.2-2.112 6.656-3.584 3.52-1.472 7.232-2.176 3.712-0.768 7.488-0.768 3.776 0 7.488 0.768 3.712 0.704 7.168 2.176 3.52 1.472 6.656 3.584 3.2 2.048 5.76 4.736 2.752 2.688 4.864 5.824 2.048 3.2 3.52 6.656 1.472 3.456 2.176 7.168 0.768 3.712 0.768 7.488z m-686.528 0q0 3.84-0.768 7.488-0.704 3.712-2.176 7.232-1.472 3.52-3.52 6.656-2.112 3.136-4.8 5.76-2.688 2.688-5.76 4.8-3.2 2.112-6.72 3.584-3.456 1.408-7.168 2.176-3.712 0.704-7.488 0.704-3.84 0-7.488-0.704-3.712-0.768-7.232-2.176-3.456-1.472-6.656-3.584-3.136-2.112-5.76-4.736-2.688-2.688-4.8-5.824-2.112-3.2-3.584-6.656-1.408-3.52-2.176-7.232-0.704-3.648-0.704-7.488 0-3.776 0.704-7.488 0.768-3.712 2.176-7.168 1.472-3.52 3.584-6.656 2.112-3.136 4.736-5.76 2.688-2.752 5.824-4.8 3.2-2.112 6.656-3.584 3.52-1.472 7.232-2.176 3.712-0.768 7.488-0.768 3.776 0 7.488 0.768 3.712 0.704 7.168 2.176 3.52 1.472 6.656 3.584 3.2 2.048 5.824 4.736 2.688 2.688 4.8 5.824 2.048 3.2 3.52 6.656 1.472 3.456 2.176 7.168 0.768 3.712 0.768 7.488zM652.032 211.2l-369.92 370.368v89.344h90.048l369.664-369.856L652.032 211.2z m-54.4-54.272q22.528-22.528 54.4-22.528 31.808 0 54.336 22.528l89.792 89.856q22.464 22.464 22.464 54.272t-22.464 54.272l-369.664 369.856q-22.464 22.528-54.336 22.528H282.24q-31.808 0-54.336-22.528-22.464-22.464-22.464-54.272V581.568q0-31.808 22.4-54.272l369.92-370.368z\" p-id=\"6607\"></path></svg>',\r\n color: '#4E5969',\r\n },\r\n {\r\n name: 'icon-select',\r\n configName: 'CHECKBOX_UNCHECK_SVG',\r\n configColorName: 'SHRINK_ICON_COLOR',\r\n svg: svgSelect,\r\n color: '#4E5969',\r\n },\r\n ];\r\n icons = new Map<string, HTMLImageElement>();\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n async init() {\r\n const promises = [];\r\n for (let i = 0; i < this.list.length; i++) {\r\n const item = this.list[i];\r\n let color = item.color;\r\n let svg = item.svg;\r\n if (item.configColorName) {\r\n // 从配置中获取颜色\r\n const configColor = this.ctx.config[item.configColorName];\r\n if (configColor) {\r\n color = configColor;\r\n }\r\n }\r\n // 替换svg\r\n if (item.configName) {\r\n const configSvg = this.ctx.config[item.configName];\r\n if (configSvg) {\r\n svg = configSvg;\r\n }\r\n }\r\n\r\n // 将异步操作推入 promises 数组\r\n const promise = this.createImageFromSVG(svg, color).then((icon) => {\r\n this.icons.set(item.name, icon);\r\n });\r\n promises.push(promise);\r\n }\r\n // 额外的图标\r\n for (let i = 0; i < this.ctx.config.ICONS.length; i++) {\r\n const item = this.ctx.config.ICONS[i];\r\n let color = item.color;\r\n // 将异步操作推入 promises 数组\r\n const promise = this.createImageFromSVG(item.svg, color, item.isBlob).then((icon) => {\r\n this.icons.set(item.name, icon);\r\n });\r\n promises.push(promise);\r\n }\r\n // 并行执行所有异步操作\r\n await Promise.all(promises);\r\n // 加载完成后触发绘制\r\n this.ctx.emit('draw');\r\n }\r\n private async createImageFromSVG(svgContent: string, fill?: string, isBlob = false) {\r\n const parser = new DOMParser();\r\n const svgDoc = parser.parseFromString(svgContent, 'image/svg+xml');\r\n const svg = svgDoc.documentElement;\r\n if (fill) {\r\n // 控制填充颜色\r\n svg.querySelectorAll('*').forEach((element) => {\r\n element.setAttribute('fill', fill);\r\n });\r\n }\r\n const img = new Image();\r\n let url = '';\r\n if (isBlob) {\r\n const svgBlob = new Blob([new XMLSerializer().serializeToString(svg)], {\r\n type: 'image/svg+xml',\r\n });\r\n url = URL.createObjectURL(svgBlob);\r\n } else {\r\n url = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(new XMLSerializer().serializeToString(svg));\r\n }\r\n img.src = url;\r\n return new Promise<HTMLImageElement>((resolve, reject) => {\r\n img.onerror = () => reject(new Error('Failed to load image'));\r\n img.onload = () => {\r\n resolve(img);\r\n };\r\n });\r\n }\r\n get(name: string) {\r\n return this.icons.get(name);\r\n }\r\n}\r\n","import type Context from './Context';\nimport { generateShortUUID } from './util';\nimport type { Align, CellHeaderStyleMethod, Column, Fixed, Render, Type, VerticalAlign } from './types';\nimport BaseCell from './BaseCell';\nimport { Rule, Rules } from './Validator';\nexport default class CellHeader extends BaseCell {\n align: Align;\n hideHeaderSelection = false;\n verticalAlign: VerticalAlign = 'middle';\n fixed?: Fixed;\n minWidth?: number;\n maxWidth?: number;\n widthFillDisable: boolean;\n type: Type | '';\n operation = false;\n editorType: string;\n level: number;\n text: string;\n displayText: string = '';\n colspan: number;\n rowspan: number;\n row: any;\n key: string;\n required = false;\n readonly = false;\n ellipsis = false;\n overflowTooltipShow = true;\n children: Column[] = [];\n column: Column;\n colIndex: number;\n rowKey: string;\n rules?: Rules | Rule;\n hasChildren: boolean;\n render: Render;\n style: Partial<CSSStyleDeclaration> = {};\n drawX = 0;\n drawY = 0;\n visibleWidth = 0;\n visibleHeight = 0;\n drawTextX = 0;\n drawTextY = 0;\n drawTextWidth = 0;\n drawTextHeight = 0;\n drawCellBgColor = '';\n drawTextColor = '';\n drawSelectionImageX = 0;\n drawSelectionImageY = 0;\n drawSelectionImageWidth = 0;\n drawSelectionImageHeight = 0;\n drawSelectionImageName = '';\n drawSelectionImageSource: HTMLImageElement | undefined;\n constructor(ctx: Context, colIndex: number, x: number, y: number, width: number, height: number, column: Column) {\n super(ctx, x, y, width, height, 'header', column.fixed);\n this.ctx = ctx;\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n this.visibleWidth = width;\n this.visibleHeight = height;\n this.colIndex = colIndex;\n this.key = column.key;\n this.minWidth = column.minWidth;\n this.maxWidth = column.maxWidth;\n this.type = column.type || '';\n this.editorType = column.editorType || 'text';\n this.hideHeaderSelection = column.hideHeaderSelection || false;\n this.align = column.headerAlign || column.align || this.ctx.config.COLUMNS_ALIGN;\n this.verticalAlign =\n column.headerVerticalAlign || column.verticalAlign || this.ctx.config.COLUMNS_VERTICAL_ALIGN;\n this.fixed = column.fixed;\n this.level = column.level || 0;\n this.operation = column.operation || false;\n this.text = column.title;\n this.column = column;\n this.colspan = column.colspan || 1;\n this.widthFillDisable = column.widthFillDisable || false;\n this.rowspan = column.rowspan || 1;\n this.rules = column.rules;\n this.readonly = column.readonly || false;\n this.required = column.required || false;\n this.rowKey = generateShortUUID();\n this.overflowTooltipShow = column.overflowTooltipHeaderShow === false ? false : true;\n this.hasChildren = (column.children && column.children.length > 0) || false; // 是否有子\n this.render = column.renderHeader;\n }\n /**\n * 是否可见,覆盖基类方法,表头是跟y滚动条没有关系的所以不需要加滚动参数\n * @returns\n */\n isVerticalVisible() {\n const { stageHeight } = this.ctx;\n const offsetHeight = stageHeight;\n return !(this.y + this.height <= 0 || this.y >= offsetHeight);\n }\n\n /**\n * 更新样式\n */\n updateStyle() {\n this.style = this.getOverlayerViewsStyle();\n }\n updateContainer() {\n const { HEADER_CELL_STYLE_METHOD, HEADER_BG_COLOR, HEADER_TEXT_COLOR } = this.ctx.config;\n let bgColor = HEADER_BG_COLOR;\n let textColor = HEADER_TEXT_COLOR;\n if (typeof HEADER_CELL_STYLE_METHOD === 'function') {\n const headerCellStyleMethod: CellHeaderStyleMethod = HEADER_CELL_STYLE_METHOD;\n const { backgroundColor, color } =\n headerCellStyleMethod({\n colIndex: this.colIndex,\n column: this.column,\n }) || {};\n if (backgroundColor) {\n bgColor = backgroundColor;\n }\n // 文字颜色\n if (color) {\n textColor = color;\n }\n }\n this.drawCellBgColor = bgColor;\n this.drawTextColor = textColor;\n }\n update() {\n this.updateContainer();\n this.displayText = this.getText();\n this.drawX = this.getDrawX();\n this.drawY = this.getDrawY();\n this.drawTextX = this.drawX;\n this.drawTextY = this.drawY;\n this.drawTextWidth = this.width;\n this.drawTextHeight = this.height;\n this.updateStyle();\n }\n draw() {\n const {\n paint,\n config: { BORDER_COLOR, BORDER },\n } = this.ctx;\n const { drawX, drawY } = this;\n // 有边框的情况下,绘制边框\n paint.drawRect(drawX, drawY, this.width, this.height, {\n borderColor: BORDER ? BORDER_COLOR : 'transparent',\n fillColor: this.drawCellBgColor,\n });\n\n // 先绘制复选框,再绘制文本\n this.drawSelection();\n this.drawText();\n this.drawSelector();\n }\n private drawText() {\n const {\n paint,\n config: { HEADER_FONT, CELL_PADDING },\n } = this.ctx;\n this.ellipsis = paint.drawText(\n this.displayText,\n this.drawTextX,\n this.drawTextY,\n this.drawTextWidth,\n this.drawTextHeight,\n {\n font: HEADER_FONT,\n padding: CELL_PADDING,\n color: this.drawTextColor,\n align: this.align,\n verticalAlign: this.verticalAlign,\n },\n );\n }\n private drawSelector() {\n // 选择区背景颜色\n const { ENABLE_SELECTOR } = this.ctx.config;\n if (!ENABLE_SELECTOR) {\n return;\n }\n const { xArr } = this.ctx.selector;\n const [minX, maxX] = xArr;\n if (this.colIndex >= minX && this.colIndex <= maxX) {\n this.ctx.paint.drawRect(this.drawX, this.drawY, this.width, this.height, {\n borderColor: 'transparent',\n fillColor: this.ctx.config.SELECT_ROW_COL_BG_COLOR || 'transparent',\n });\n }\n }\n private drawSelection() {\n if (this.hideHeaderSelection) {\n return;\n }\n const { width, height, type } = this;\n // 选中框类型\n if (['index-selection', 'selection', 'selection-tree', 'tree-selection'].includes(type)) {\n const { indeterminate, check, selectable } = this.ctx.database.getCheckedState();\n const { CHECKBOX_SIZE = 0, CELL_PADDING } = this.ctx.config;\n // 默认居中\n let iconX = this.drawX + (width - CHECKBOX_SIZE) / 2;\n let iconY = this.drawY + (height - CHECKBOX_SIZE) / 2;\n this.drawTextX = iconX + CHECKBOX_SIZE - CELL_PADDING / 2;\n this.drawTextWidth = this.drawX + this.visibleWidth - this.drawTextX;\n if (this.align === 'left' || this.align === 'right') {\n iconX = this.drawX + CELL_PADDING;\n this.drawTextX = iconX + CHECKBOX_SIZE - CELL_PADDING / 2;\n this.drawTextWidth = this.drawX + this.visibleWidth - this.drawTextX;\n }\n if (this.verticalAlign === 'top') {\n iconY = this.drawY + CELL_PADDING / 2;\n } else if (this.verticalAlign === 'bottom') {\n iconY = this.drawY + height - CHECKBOX_SIZE - CELL_PADDING / 2;\n }\n\n let checkboxImage: HTMLImageElement | undefined = this.ctx.icons.get('checkbox-uncheck');\n let checkboxName = 'checkbox-uncheck';\n if (indeterminate) {\n checkboxImage = this.ctx.icons.get('checkbox-indeterminate');\n checkboxName = 'checkbox-indeterminate';\n } else if (check && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-check');\n checkboxName = 'checkbox-check';\n } else if (check && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-check-disabled');\n checkboxName = 'checkbox-check-disabled';\n } else if (!check && selectable) {\n checkboxImage = this.ctx.icons.get('checkbox-uncheck');\n checkboxName = 'checkbox-uncheck';\n } else {\n checkboxImage = this.ctx.icons.get('checkbox-disabled');\n checkboxName = 'checkbox-disabled';\n }\n if (checkboxImage) {\n this.drawSelectionImageX = iconX;\n this.drawSelectionImageY = iconY;\n this.drawSelectionImageWidth = CHECKBOX_SIZE;\n this.drawSelectionImageHeight = CHECKBOX_SIZE;\n this.drawSelectionImageName = checkboxName;\n this.drawSelectionImageSource = checkboxImage;\n this.ctx.paint.drawImage(\n this.drawSelectionImageSource,\n this.drawSelectionImageX,\n this.drawSelectionImageY,\n this.drawSelectionImageWidth,\n this.drawSelectionImageHeight,\n );\n }\n\n // 不再需要保存文本位置信息,直接在 draw 方法中计算\n }\n }\n getText() {\n if (this.render) {\n return '';\n }\n return this.text;\n }\n /**\n * 获取样式\n */\n getOverlayerViewsStyle() {\n let left = '';\n if (this.fixed === 'left') {\n left = `${this.drawX}px`;\n } else if (this.fixed === 'right') {\n left = `${this.drawX - (this.ctx.stageWidth - this.ctx.fixedRightWidth)}px`;\n } else {\n // 中间的,需要减去左边固定列的宽度\n left = `${this.drawX - this.ctx.fixedLeftWidth}px`;\n }\n return {\n position: 'absolute',\n overflow: 'hidden',\n left: left,\n top: `${this.drawY + 1}px`,\n width: `${this.width}px`,\n height: `${this.height - 2}px`,\n pointerEvents: 'initial',\n userSelect: 'none',\n };\n }\n}\n","import Cell from './Cell';\nimport CellHeader from './CellHeader';\nimport Context from './Context';\nimport Row from './Row';\nimport { ExpandLazyMethod } from './types';\n\nexport default class EventTable {\n ctx: Context;\n private visibleHoverCell?: Cell;\n private resizeObserver!: ResizeObserver;\n private mutationObserver!: MutationObserver;\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n }\n private init(): void {\n // 监听窗口大小变化\n this.resizeObserver = new ResizeObserver(() => {\n this.ctx.emit('resetHeader');\n this.ctx.emit('resizeObserver');\n });\n this.resizeObserver.observe(this.ctx.containerElement);\n this.mutationObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\n this.ctx.config.updateCssVar();\n this.ctx.emit('draw');\n }\n }\n });\n if (this.ctx.config.ENABLE_AUTO_THEME) {\n this.mutationObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'], // ✅ 只监听 class 更改\n });\n }\n\n // 按下事件\n this.ctx.on('mousedown', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.focusCellHeader = cell;\n this.ctx.emit('cellHeaderMousedown', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.setFocusCell(cell);\n this.ctx.emit('cellMousedown', cell, e);\n });\n });\n this.ctx.on('click', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.clickCellHeader = cell;\n this.ctx.emit('cellHeaderClick', cell, e);\n // selection事件\n this.selectionClick(cell, e);\n });\n\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.clickCell = cell;\n this.ctx.emit('cellClick', cell, e);\n this.selectionClick(cell, e);\n this.treeClick(cell, e);\n // hoverIcon事件\n this.hoverIconClick(cell);\n });\n });\n this.ctx.on('dblclick', (e) => {\n // 左边点击\n if (e.button !== 0) {\n return;\n }\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderDblclick', cell, e);\n });\n\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.clickCell = cell;\n this.ctx.emit('cellDblclick', cell, e);\n });\n });\n this.ctx.on('contextMenu', (e: MouseEvent) => {\n if (this.isBusy(e)) {\n return;\n }\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderContextMenuClick', cell, e);\n });\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.ctx.emit('cellContextMenuClick', cell, e);\n });\n });\n this.ctx.on('mouseout', (e: MouseEvent) => {\n if (!this.ctx.containerElement.contains(e.relatedTarget as Node) && this.ctx.hoverCell !== undefined) {\n this.ctx.hoverRow = undefined;\n this.ctx.hoverCell = undefined;\n this.ctx.emit('draw');\n }\n });\n this.ctx.on('mousemove', (e: MouseEvent) => {\n // 是否忙碌,进行其他操作\n if (this.isBusy(e)) {\n return;\n }\n this.ctx.isPointer = false;\n if (this.ctx.stageElement.style.cursor === 'pointer') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n const y = this.ctx.getOffset(e).offsetY;\n const x = this.ctx.getOffset(e).offsetX;\n this.handleHeaderEvent(x, y, this.ctx.header.renderCellHeaders, (cell: CellHeader) => {\n this.ctx.emit('cellHeaderMouseenter', cell, e);\n // 移出事件\n if (this.ctx.hoverCellHeader && this.ctx.hoverCellHeader !== cell) {\n this.ctx.emit('cellHeaderMouseleave', this.ctx.hoverCellHeader, e);\n }\n // selection头部事件\n this.imageEnterAndLeave(cell, e);\n if (this.ctx.hoverCellHeader === cell) {\n return;\n }\n this.ctx.hoverCellHeader = cell;\n this.visibleHoverCell = undefined; // 清除可视区hover\n this.ctx.emit('cellHeaderHoverChange', cell, e);\n });\n // 可视区\n this.handleBodyEvent(\n x,\n y,\n this.ctx.body.renderRows,\n (cell: Cell) => {\n // selection移入移除事件\n // this.ctx.emit(\"visibleCellHoverChange\", cell, e);\n if (this.visibleHoverCell !== cell) {\n this.ctx.emit('visibleCellMouseleave', cell, e);\n this.visibleHoverCell = cell;\n this.ctx.hoverCellHeader = undefined; // 清除头部hover\n this.ctx.emit('visibleCellHoverChange', cell, e);\n }\n },\n true,\n );\n // 正常\n this.handleBodyEvent(x, y, this.ctx.body.renderRows, (cell: Cell) => {\n this.imageEnterAndLeave(cell, e);\n this.ctx.emit('cellMouseenter', cell, e);\n // 移出事件\n if (this.ctx.hoverCell && this.ctx.hoverCell !== cell) {\n this.ctx.emit('cellMouseleave', cell, e);\n }\n if (this.ctx.hoverCell === cell) return;\n if (this.ctx.hoverCell?.rowKey !== cell.rowKey) {\n this.ctx.hoverCell = cell;\n this.ctx.hoverRow = this.ctx.body.renderRows.find((item) => item.rowKey === cell.rowKey);\n this.ctx.emit('rowHoverChange', this.ctx.hoverRow, cell, e);\n this.ctx.emit('drawView');\n }\n this.ctx.hoverCell = cell;\n this.ctx.emit('cellHoverChange', cell, e);\n });\n });\n }\n private hoverIconClick(cell: Cell) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n if (cell.hoverIconName && this.ctx.isPointer) {\n this.ctx.emit('hoverIconClick', cell);\n }\n }\n /**\n *选中点击\n * @param cell\n */\n private selectionClick(cell: CellHeader | Cell, e: MouseEvent) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n const isSelection =\n ['selection', 'index-selection', 'selection-tree', 'tree-selection'].includes(cell.type) &&\n this.ctx.isPointer;\n if (!isSelection) {\n return;\n }\n // 判断是否点击checkbox图标\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const clickY = offsetY;\n const clickX = offsetX;\n if (\n !(\n clickX > cell.drawSelectionImageX &&\n clickX < cell.drawSelectionImageX + cell.drawSelectionImageWidth &&\n clickY > cell.drawSelectionImageY &&\n clickY < cell.drawSelectionImageY + cell.drawSelectionImageHeight\n )\n ) {\n return;\n }\n // 点击头部\n if (cell instanceof CellHeader) {\n if (\n cell.drawSelectionImageName === 'checkbox-uncheck' ||\n cell.drawSelectionImageName === 'checkbox-indeterminate'\n ) {\n this.ctx.database.toggleAllSelection();\n } else if (cell.drawSelectionImageName === 'checkbox-check') {\n this.ctx.database.clearSelection(true);\n }\n } else {\n // 点击body\n // 是否可点击\n const selectable = this.ctx.database.getRowSelectable(cell.rowKey);\n if (!selectable) {\n return;\n }\n this.ctx.database.toggleRowSelection(cell.rowKey, cell.type);\n }\n }\n /**\n * 树点击\n * @param cell\n */\n private treeClick(cell: Cell, e: MouseEvent) {\n // 鼠标移动到图标上会变成pointer,所以这里判断是否是pointer就能判断出是图标点击的\n const isTree = ['tree', 'selection-tree', 'tree-selection'].includes(cell.type) && this.ctx.isPointer;\n if (!isTree) {\n return;\n }\n // 判断是否点击tree图标\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const clickY = offsetY;\n const clickX = offsetX;\n if (\n !(\n clickX > cell.drawTreeImageX &&\n clickX < cell.drawTreeImageX + cell.drawTreeImageWidth &&\n clickY > cell.drawTreeImageY &&\n clickY < cell.drawTreeImageY + cell.drawTreeImageHeight\n )\n ) {\n return;\n }\n\n const row = this.ctx.database.getRowForRowKey(cell.rowKey);\n const { expand = false, expandLazy = false } = row || {};\n const { EXPAND_LAZY, EXPAND_LAZY_METHOD } = this.ctx.config;\n // 懒加载且有懒加载方法,不是展开的不是已经加载过的\n if (EXPAND_LAZY && EXPAND_LAZY_METHOD && !expand && !expandLazy) {\n if (typeof EXPAND_LAZY_METHOD === 'function') {\n this.ctx.database.expandLoading(cell.rowKey, true);\n const expandLazyMethod: ExpandLazyMethod = EXPAND_LAZY_METHOD;\n expandLazyMethod({\n row: cell.row,\n rowIndex: cell.rowIndex,\n colIndex: cell.colIndex,\n column: cell.column,\n value: cell.getValue(),\n })\n .then((res: any) => {\n this.ctx.database.setExpandChildren(cell.rowKey, res);\n this.ctx.database.expandLoading(cell.rowKey, false);\n this.ctx.emit('expandChange', this.ctx.database.getExpandRowKeys());\n })\n .catch((err: any) => {\n this.ctx.database.expandLoading(cell.rowKey, false);\n console.error(err);\n });\n }\n // 懒加载\n } else {\n const isExpand = this.ctx.database.getIsExpand(cell.rowKey);\n this.ctx.database.expandItem(cell.rowKey, !isExpand);\n this.ctx.emit('expandChange', this.ctx.database.getExpandRowKeys());\n }\n }\n /**\n * 图标进入和离开事件,包括选中,展开,提示图标等\n * @param cell\n * @param e\n */\n private imageEnterAndLeave(cell: Cell | CellHeader, e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n\n // 检查checkbox图标\n if (\n (cell instanceof Cell || cell instanceof CellHeader) &&\n x > cell.drawSelectionImageX &&\n x < cell.drawSelectionImageX + cell.drawSelectionImageWidth &&\n y > cell.drawSelectionImageY &&\n y < cell.drawSelectionImageY + cell.drawSelectionImageHeight\n ) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n if (cell instanceof Cell) {\n // body cell 需要处理是否禁用\n const selectable = this.ctx.database.getRowSelectable(cell.rowKey);\n if (!selectable) {\n this.ctx.stageElement.style.cursor = 'not-allowed';\n }\n }\n return;\n }\n // 检查hover图标\n if (cell instanceof Cell && cell.drawHoverImageSource) {\n if (\n x > cell.drawHoverImageX &&\n x < cell.drawHoverImageX + cell.drawHoverImageWidth &&\n y > cell.drawHoverImageY &&\n y < cell.drawHoverImageY + cell.drawHoverImageHeight\n ) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n return;\n }\n }\n // 检查tree图标\n if (cell instanceof Cell && cell.drawTreeImageSource) {\n if (\n x > cell.drawTreeImageX &&\n x < cell.drawTreeImageX + cell.drawTreeImageWidth &&\n y > cell.drawTreeImageY &&\n y < cell.drawTreeImageY + cell.drawTreeImageHeight\n ) {\n this.ctx.stageElement.style.cursor = 'pointer';\n this.ctx.isPointer = true;\n return;\n }\n }\n }\n\n private isBusy(e: MouseEvent) {\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n\n if (!this.ctx.isTarget(e)) {\n return true;\n }\n // 行调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.columnResizing) {\n return true;\n }\n // 行调整大小中不处理\n if (this.ctx.rowResizing) {\n return true;\n }\n const { SCROLLER_TRACK_SIZE } = this.ctx.config;\n // 滚动条移动不处理\n if (this.ctx.scrollerMove) {\n return true;\n }\n // 滚动条悬浮不处理\n if (this.ctx.scrollerFocus) {\n return true;\n }\n // 点击滚动条不处理\n if (y > this.ctx.stageHeight - SCROLLER_TRACK_SIZE) {\n return true;\n }\n // 点击滚动条不处理\n if (x > this.ctx.stageWidth - SCROLLER_TRACK_SIZE) {\n return true;\n }\n return false;\n }\n private handleBodyEvent(x: number, y: number, renderRows: Row[], callback: Function, visible = false) {\n if (!this.isInsideBody(y)) {\n return;\n }\n for (const row of renderRows) {\n // 优先处理固定列\n const cells = row.fixedCells.concat(row.noFixedCells);\n for (const cell of cells) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (visible) {\n if (x > drawX && x < drawX + cell.visibleWidth && y > drawY && y < drawY + cell.visibleHeight) {\n callback(cell);\n return; // 找到后直接返回\n }\n } else if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n }\n private handleHeaderEvent(x: number, y: number, renderCellHeaders: CellHeader[], callback: Function) {\n for (const cell of renderCellHeaders) {\n const drawX = cell.getDrawX();\n const drawY = cell.getDrawY();\n if (x > drawX && x < drawX + cell.width && y > drawY && y < drawY + cell.height) {\n callback(cell);\n return; // 找到后直接返回\n }\n }\n }\n private isInsideBody(y: number) {\n return y > this.ctx.body.y && y < this.ctx.body.y + this.ctx.body.visibleHeight;\n }\n destroy() {\n this.resizeObserver.unobserve(this.ctx.stageElement);\n this.mutationObserver.disconnect();\n }\n}\n","import Database from './Database';\r\nimport History from './History';\r\nimport EventBrowser from './EventBrowser';\r\nimport EventBus, { EventCallback } from './EventBus';\r\nimport Paint from './Paint';\r\nimport Config from './Config';\r\nimport { ChangeItem, Column, EVirtTableOptions, RowParams } from './types';\r\nimport Icons from './Icons';\r\nimport CellHeader from './CellHeader';\r\nimport Row from './Row';\r\nimport Cell from './Cell';\r\nimport EventTable from './EventTable';\r\nexport type ConfigType = Partial<typeof Config>;\r\nexport type containerElementOptions = {\r\n containerElement: HTMLDivElement;\r\n stageElement: HTMLDivElement;\r\n canvasElement: HTMLCanvasElement;\r\n overlayerElement: HTMLDivElement;\r\n editorElement: HTMLDivElement;\r\n emptyElement?: HTMLDivElement;\r\n contextMenuElement?: HTMLDivElement;\r\n};\r\nexport type HeaderOptions = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n visibleHeight: number;\r\n visibleWidth: number;\r\n visibleLeafColumns: Column[];\r\n leafCellHeaders: CellHeader[];\r\n renderLeafCellHeaders: CellHeader[];\r\n renderCellHeaders: CellHeader[];\r\n fixedLeftCellHeaders: [];\r\n fixedRightCellHeaders: [];\r\n renderCenterCellHeaders: [];\r\n};\r\nexport type BodyOptions = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n visibleHeight: number;\r\n visibleWidth: number;\r\n headIndex: number;\r\n tailIndex: number;\r\n visibleRows: any[];\r\n renderRows: Row[];\r\n data: any[];\r\n};\r\nexport type FooterOptions = {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n visibleHeight: number;\r\n visibleWidth: number;\r\n renderRows: Row[];\r\n};\r\nexport type SelectorOptions = {\r\n enable: boolean;\r\n xArr: number[];\r\n yArr: number[];\r\n xArrCopy: number[];\r\n yArrCopy: number[];\r\n};\r\nexport type AutofillOptions = {\r\n enable: boolean;\r\n xArr: number[];\r\n yArr: number[];\r\n};\r\nexport default class Context {\r\n private eventBus: EventBus;\r\n private eventBrowser: EventBrowser;\r\n private eventTable: EventTable;\r\n containerElement: HTMLDivElement;\r\n stageElement: HTMLDivElement;\r\n canvasElement: HTMLCanvasElement;\r\n overlayerElement: HTMLDivElement;\r\n editorElement: HTMLDivElement;\r\n emptyElement?: HTMLDivElement;\r\n contextMenuElement?: HTMLDivElement;\r\n stageWidth = 0;\r\n stageHeight = 0;\r\n paint: Paint;\r\n icons: Icons;\r\n domSelectionStr = '';\r\n isMouseoverTargetContainer = false;\r\n mousedown = false;\r\n isPointer = false;\r\n rowResizing = false; // 行调整大小中\r\n columnResizing = false; // 列调整大小中\r\n scrollerMove = false; // 滚动条移动中\r\n scrollerFocus = false; // 滚动条focus中\r\n autofillMove = false; // 自动填充移动中\r\n selectorMove = false; // 选择器移动中\r\n adjustPositioning = false; // 调整位置中\r\n editing = false; // 编辑中\r\n onlyMergeCell = false; // 只有合并单元格\r\n selectOnlyOne = false; // 只选择一个\r\n hasSelection = false; // 是否有选中\r\n hasTree = false; // 是否有树形结构\r\n scrollY = 0;\r\n scrollX = 0;\r\n fixedLeftWidth = 0;\r\n fixedRightWidth = 0;\r\n lastCenterColIndex = 0;\r\n maxColIndex = 0;\r\n maxRowIndex = 0;\r\n hoverRow?: Row;\r\n clickCell?: Cell;\r\n focusCell?: Cell;\r\n currentCell?: Cell;\r\n hoverCell?: Cell;\r\n clickCellHeader?: CellHeader;\r\n focusCellHeader?: CellHeader;\r\n hoverCellHeader?: CellHeader;\r\n body: BodyOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n headIndex: 0,\r\n tailIndex: 0,\r\n visibleRows: [],\r\n renderRows: [],\r\n data: [],\r\n };\r\n footer: FooterOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n renderRows: [],\r\n };\r\n header: HeaderOptions = {\r\n x: 0,\r\n y: 0,\r\n width: 0,\r\n height: 0,\r\n visibleHeight: 0,\r\n visibleWidth: 0,\r\n visibleLeafColumns: [],\r\n leafCellHeaders: [],\r\n renderLeafCellHeaders: [],\r\n renderCellHeaders: [],\r\n fixedLeftCellHeaders: [],\r\n fixedRightCellHeaders: [],\r\n renderCenterCellHeaders: [],\r\n };\r\n selector: SelectorOptions = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n xArrCopy: [-1, -1],\r\n yArrCopy: [-1, -1],\r\n };\r\n autofill: AutofillOptions = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n };\r\n database: Database;\r\n history: History;\r\n config: Config;\r\n\r\n constructor(containerOptions: containerElementOptions, options: EVirtTableOptions) {\r\n const {\r\n containerElement,\r\n stageElement,\r\n canvasElement,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n } = containerOptions;\r\n this.containerElement = containerElement;\r\n stageElement.tabIndex = 0; // 设置为可获取焦点\r\n this.stageElement = stageElement;\r\n this.canvasElement = canvasElement;\r\n this.overlayerElement = overlayerElement;\r\n this.editorElement = editorElement;\r\n this.emptyElement = emptyElement;\r\n this.contextMenuElement = contextMenuElement;\r\n this.config = new Config(options.config || {});\r\n this.eventBus = new EventBus();\r\n this.eventBrowser = new EventBrowser(this);\r\n this.eventTable = new EventTable(this);\r\n this.paint = new Paint(this.canvasElement);\r\n this.database = new Database(this, options);\r\n this.history = new History(this);\r\n this.icons = new Icons(this);\r\n }\r\n setConfig(config: Config) {\r\n this.config = new Config(config);\r\n }\r\n setItemValueByEditor(rowKey: string, key: string, value: any, history = true, reDraw = true, checkReadonly = true) {\r\n // 启用合并单元格关联\r\n if (this.config.ENABLE_MERGE_CELL_LINK) {\r\n const cell = this.database.getVirtualBodyCellByKey(rowKey, key);\r\n if (cell && (cell.mergeRow || cell.mergeCol)) {\r\n const { dataList } = cell.getSpanInfo();\r\n const data = dataList.map((item: any) => ({ ...item, value }));\r\n this.database.batchSetItemValue(data, history, checkReadonly);\r\n return;\r\n }\r\n }\r\n this.database.setItemValue(rowKey, key, value, history, reDraw, true, checkReadonly);\r\n }\r\n\r\n batchSetItemValueByEditor(_list: ChangeItem[], history = true, checkReadonly = true) {\r\n // 启用合并单元格关联\r\n if (this.config.ENABLE_MERGE_CELL_LINK) {\r\n const list: ChangeItem[] = [];\r\n _list.forEach((item) => {\r\n const rowIndex = this.database.getRowIndexForRowKey(item.rowKey);\r\n const colIndex = this.database.getColIndexForKey(item.key);\r\n if (rowIndex === undefined || colIndex === undefined) return;\r\n const cell = this.database.getVirtualBodyCell(rowIndex, colIndex);\r\n if (cell) {\r\n const { dataList } = cell.getSpanInfo();\r\n const data = dataList.map((list: any) => ({ ...list, value: item.value }));\r\n list.push(...data);\r\n }\r\n });\r\n this.database.batchSetItemValue(list, history, checkReadonly);\r\n } else {\r\n this.database.batchSetItemValue(_list, history, checkReadonly);\r\n }\r\n }\r\n setFocusCell(cell: Cell) {\r\n if (this.focusCell === cell) return;\r\n if (this.focusCell?.rowKey !== cell.rowKey) {\r\n // 提前设置一下,保证rowFocusChange事件,能用focusCell\r\n this.currentCell = cell;\r\n this.emit('rowFocusChange', cell);\r\n const data: RowParams = {\r\n rowIndex: cell.rowIndex,\r\n rowKey: cell.rowKey,\r\n row: cell.row,\r\n };\r\n this.emit('currentRowChange', data);\r\n }\r\n this.focusCell = cell;\r\n this.emit('cellFocusChange', cell);\r\n }\r\n clearSelector() {\r\n this.selector.enable = false;\r\n this.selector.xArr = [-1, -1];\r\n this.selector.yArr = [-1, -1];\r\n this.emit('clearSelector');\r\n }\r\n clearSelectorCopy() {\r\n this.selector.xArrCopy = [-1, -1];\r\n this.selector.yArrCopy = [-1, -1];\r\n }\r\n clearAutofill() {\r\n this.autofill = {\r\n enable: false,\r\n xArr: [-1, -1],\r\n yArr: [-1, -1],\r\n };\r\n }\r\n /**\r\n * 获取选中的数据\r\n * @returns\r\n */\r\n getSelectedData() {\r\n const rowsData = [];\r\n const yArr = this.selector.yArr;\r\n const xArr = this.selector.xArr;\r\n let text = '';\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n const cellsData = [];\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const rowIndex = ri + yArr[0];\r\n const colIndex = ci + xArr[0];\r\n const cell = this.database.getVirtualBodyCell(rowIndex, colIndex);\r\n if (cell) {\r\n // 选择器值类型\r\n if (cell.selectorCellValueType === 'displayText') {\r\n cellsData.push(cell.displayText);\r\n } else {\r\n // 默认value\r\n cellsData.push(cell.getValue());\r\n }\r\n }\r\n }\r\n text += `${cellsData.join('\\t')}\\r`;\r\n rowsData.push(cellsData);\r\n }\r\n text = text ? text.replace(/\\r$/, '') : ' '; // 去掉最后一个\\n,否则会导致复制到excel里多一行空白\r\n return {\r\n xArr,\r\n yArr,\r\n text,\r\n value: rowsData,\r\n };\r\n }\r\n setScroll(x: number, y: number): void {\r\n let scrollX = Math.floor(x);\r\n const scrollMaxX = this.body.width - this.body.visibleWidth;\r\n // x边界处理\r\n if (scrollX < 0) {\r\n scrollX = 0;\r\n } else if (scrollX > scrollMaxX) {\r\n scrollX = scrollMaxX;\r\n }\r\n // y边界处理\r\n let scrollY = Math.floor(y);\r\n let scrollMaxY = this.body.height - this.body.visibleHeight;\r\n if (!this.config.FOOTER_FIXED) {\r\n scrollMaxY = this.body.height + this.footer.height - this.body.visibleHeight;\r\n }\r\n if (scrollY < 0) {\r\n scrollY = 0;\r\n } else if (scrollY > scrollMaxY) {\r\n scrollY = scrollMaxY;\r\n }\r\n this.emit('setScroll', scrollX, scrollY);\r\n }\r\n setScrollX(x: number): void {\r\n let scrollX = Math.floor(x);\r\n const scrollMaxX = this.body.width - this.body.visibleWidth;\r\n // 边界处理\r\n if (scrollX < 0) {\r\n scrollX = 0;\r\n } else if (scrollX > scrollMaxX) {\r\n scrollX = scrollMaxX;\r\n }\r\n this.emit('setScrollX', scrollX);\r\n }\r\n setScrollY(y: number): void {\r\n // 边界处理\r\n let scrollY = Math.floor(y);\r\n let footerHeight = 0;\r\n if (!this.config.FOOTER_FIXED) {\r\n footerHeight = this.footer.height;\r\n }\r\n const scrollMaxY = this.body.height - this.body.visibleHeight + footerHeight;\r\n if (scrollY < 0) {\r\n scrollY = 0;\r\n } else if (scrollY > scrollMaxY) {\r\n scrollY = scrollMaxY;\r\n }\r\n this.emit('setScrollY', scrollY);\r\n }\r\n isTarget(e: Event): boolean {\r\n if (!this.containerElement.contains(e.target as Node)) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n getOffset(e: MouseEvent) {\r\n const { left, top } = this.containerElement.getBoundingClientRect();\r\n return {\r\n offsetX: e.clientX - left,\r\n offsetY: e.clientY - top,\r\n };\r\n }\r\n hasEvent(event: string): boolean {\r\n return this.eventBus.has(event);\r\n }\r\n on(event: string, callback: EventCallback): void {\r\n this.eventBus.on(event, callback);\r\n }\r\n once(event: string, callback: EventCallback): void {\r\n this.eventBus.once(event, callback);\r\n }\r\n off(event: string, callback: EventCallback): void {\r\n this.eventBus.off(event, callback);\r\n }\r\n emit(event: string, ...args: any[]): void {\r\n this.eventBus.emit(event, ...args);\r\n }\r\n destroy(): void {\r\n this.eventTable.destroy();\r\n this.eventBrowser.destroy();\r\n this.eventBus.destroy();\r\n }\r\n}\r\n","import Context from './Context';\nexport type ScrollbarType = 'horizontal' | 'vertical';\n\nclass Scrollbar {\n private ctx: Context;\n private type: ScrollbarType;\n private isFocus = false;\n private trackX = 0;\n private trackY = 0;\n private trackWidth = 0;\n private trackHeight = 0;\n private splitPoints: number[] = []; //分割线\n private barX = 0;\n private barY = 0;\n private barWidth = 0;\n private barHeight = 0;\n private distance = 0; // 滚动条的长度\n private visibleDistance = 0; //可见区域的长度\n private clientX = 0;\n private clientY = 0;\n private dragStart = 0; // 拖拽开始的位置\n isDragging = false;\n scroll = 0;\n\n constructor(ctx: Context, type: ScrollbarType) {\n this.ctx = ctx;\n this.type = type;\n if (this.type === 'vertical') {\n this.scroll = this.ctx.scrollY;\n } else {\n this.scroll = this.ctx.scrollX;\n }\n }\n\n onWheel(e: WheelEvent) {\n this.updateScroll(e);\n }\n onTouchmove(e: TouchEvent) {\n const { clientY, clientX } = e.touches[0];\n const deltaY = clientY - this.clientY; // 计算滑动距离\n const deltaX = clientX - this.clientX; // 计算滑动距离\n let scroll = 0;\n if (this.type === 'vertical') {\n scroll = Math.max(0, Math.min(this.dragStart - deltaY, this.distance));\n // 只有在滚动条需要滚动时才阻止默认事件\n const hasScrollbar = this.hasScrollbar();\n if (hasScrollbar && !((scroll === 0 && deltaY > 0) || (scroll === this.distance && deltaY < 0))) {\n e.preventDefault();\n }\n } else if (this.type === 'horizontal') {\n scroll = Math.max(0, Math.min(this.dragStart - deltaX, this.distance));\n }\n this.scroll = scroll;\n }\n onTouchstart(e: TouchEvent) {\n const { clientY, clientX } = e.touches[0];\n this.clientX = clientX;\n this.clientY = clientY;\n this.dragStart = this.scroll;\n }\n\n onMouseDown(e: MouseEvent) {\n if (!(e.target instanceof Element)) {\n return;\n }\n if (!this.ctx.isTarget(e)) {\n return;\n }\n // 行调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n return true;\n }\n // 列调整大小中不处理\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n return true;\n }\n\n const { offsetX, offsetY, clientX, clientY } = e;\n if (clientX == this.clientX && clientY == this.clientY) return;\n if (this.isOnScrollbar(offsetX, offsetY)) {\n this.clientX = clientX;\n this.clientY = clientY;\n this.isDragging = true;\n this.ctx.scrollerMove = true; // 滚动条移动\n this.isFocus = true;\n this.dragStart = this.scroll;\n e.preventDefault();\n } else if (this.isOnTrack(offsetX, offsetY)) {\n // 点击轨道滚动\n let scroll = 0;\n if (this.type === 'vertical') {\n // 滚动条位置=(鼠标位置-滚动条的高度/2-头部的高度)/(可见区域的长度-滚动条的高度)*滚动条的长度\n // 滚动到中间所以减去滚动条的高度/2\n const offset = offsetY - this.ctx.header.height - this.barHeight / 2;\n scroll = (offset / (this.visibleDistance - this.barHeight)) * this.distance;\n } else {\n const offset = offsetX - this.barWidth / 2;\n scroll = (offset / (this.visibleDistance - this.barWidth)) * this.distance;\n }\n this.scroll = Math.max(0, Math.min(scroll, this.distance));\n }\n }\n\n onMouseUp() {\n this.isDragging = false;\n this.isFocus = false;\n this.clientX = 0;\n this.clientY = 0;\n }\n\n onMouseMove(e: MouseEvent) {\n const { offsetX, offsetY, clientX, clientY, buttons } = e;\n // 没有鼠标按下时不处理,要重置抬起事件\n // 悬浮提示\n if (this.isOnScrollbar(offsetX, offsetY) && e.target === this.ctx.canvasElement) {\n this.isFocus = true;\n } else {\n this.isFocus = false;\n }\n if (buttons === 0) {\n return;\n }\n // 拖拽移动滚动条\n if (clientX == this.clientX && clientY == this.clientY) return;\n let offset = 0;\n if (this.type === 'horizontal') {\n offset = clientX - this.clientX;\n } else {\n offset = clientY - this.clientY;\n }\n if (this.isDragging && offset !== 0) {\n // scroll= 开始滚动条位置+(鼠标移动的距离/可见区域的长度)*滚动条的长度\n let scroll = 0;\n if (this.type === 'vertical') {\n scroll = this.dragStart + (offset / (this.visibleDistance - this.barHeight)) * this.distance;\n } else {\n scroll = this.dragStart + (offset / (this.visibleDistance - this.barWidth)) * this.distance;\n }\n this.scroll = Math.max(0, Math.min(scroll, this.distance));\n }\n }\n\n private isPointInElement(\n pointX: number,\n pointY: number,\n elementX: number,\n elementY: number,\n elementWidth: number,\n elementHeight: number,\n ): boolean {\n return (\n pointX >= elementX &&\n pointX <= elementX + elementWidth &&\n pointY >= elementY &&\n pointY <= elementY + elementHeight\n );\n }\n private hasScrollbar(): boolean {\n if (this.type === 'vertical') {\n return this.barHeight > 0;\n } else if (this.type === 'horizontal') {\n return this.barWidth > 0;\n }\n return false;\n }\n\n private isOnScrollbar(x: number, y: number): boolean {\n return this.isPointInElement(x, y, this.barX, this.barY, this.barWidth, this.barHeight);\n }\n private isOnTrack(x: number, y: number): boolean {\n return this.isPointInElement(x, y, this.trackX, this.trackY, this.trackWidth, this.trackHeight);\n }\n\n private updateScroll(e: WheelEvent) {\n const deltaX = e.deltaX;\n const deltaY = e.deltaY;\n if (this.type === 'vertical' && e.shiftKey === false) {\n // 只有在滚动条需要滚动时才阻止默认事件\n const hasScrollbar = this.hasScrollbar();\n if (hasScrollbar && !((this.scroll === 0 && deltaY < 0) || (this.scroll === this.distance && deltaY > 0))) {\n e.preventDefault();\n }\n this.scroll = Math.max(0, Math.min(this.scroll + deltaY, this.distance));\n } else if (this.type === 'horizontal') {\n if (e.shiftKey) {\n this.scroll = Math.max(0, Math.min(this.scroll + deltaY, this.distance));\n } else {\n this.scroll = Math.max(0, Math.min(this.scroll + deltaX, this.distance));\n }\n }\n }\n private updatedSize() {\n const {\n body,\n header,\n stageHeight,\n stageWidth,\n config: { SCROLLER_TRACK_SIZE = 0, SCROLLER_SIZE = 0, BORDER },\n } = this.ctx;\n const visibleWidth = stageWidth;\n const visibleHeight = stageHeight;\n const headerHeight = header.height;\n const headerWidth = header.width;\n const bodyHeight = body.height;\n const footerHeight = this.ctx.footer.height;\n if (this.type === 'vertical') {\n this.visibleDistance = visibleHeight - SCROLLER_TRACK_SIZE - headerHeight;\n this.distance = bodyHeight - this.visibleDistance + footerHeight;\n this.trackX = visibleWidth - SCROLLER_TRACK_SIZE;\n this.trackY = 0;\n // 分割线\n this.splitPoints = [this.trackX, headerHeight, this.trackX + SCROLLER_TRACK_SIZE, headerHeight];\n this.trackWidth = SCROLLER_TRACK_SIZE;\n this.trackHeight = visibleHeight;\n // 滚动条的X位置=轨道的X位置+(轨道的宽度-滚动条的宽度)/2\n this.barX = this.trackX - 1 + (SCROLLER_TRACK_SIZE - SCROLLER_SIZE) / 2;\n this.barWidth = SCROLLER_SIZE;\n const ratio = this.distance ? this.visibleDistance / (bodyHeight + footerHeight) : 0;\n let _barHeight = Math.floor(ratio * this.visibleDistance);\n // 最小30,超出可见区域则隐藏\n if (_barHeight < 30) {\n _barHeight = 30;\n } else if (_barHeight > this.visibleDistance) {\n _barHeight = 0;\n }\n this.barHeight = _barHeight;\n\n this.barY = headerHeight + (this.scroll / this.distance) * (this.visibleDistance - this.barHeight);\n // 范围限制\n this.scroll = Math.max(0, Math.min(this.scroll, this.distance));\n } else {\n this.visibleDistance = visibleWidth - SCROLLER_TRACK_SIZE;\n this.distance = headerWidth - this.visibleDistance;\n // 分割线\n this.splitPoints = [\n visibleWidth - SCROLLER_TRACK_SIZE,\n visibleHeight - SCROLLER_TRACK_SIZE,\n visibleWidth - SCROLLER_TRACK_SIZE,\n visibleHeight,\n ];\n const offset = BORDER ? 0 : 0.5; // 解决边框问题,补偿0.5px\n this.trackX = 0;\n this.trackY = visibleHeight - SCROLLER_TRACK_SIZE + offset;\n this.trackWidth = visibleWidth;\n this.trackHeight = SCROLLER_TRACK_SIZE;\n\n const ratio = this.distance ? this.visibleDistance / headerWidth : 0;\n\n let _barWidth = Math.floor(ratio * this.visibleDistance);\n this.barY = this.trackY - 1 + (SCROLLER_TRACK_SIZE - SCROLLER_SIZE) / 2;\n // 最小30,超出可见区域则隐藏\n if (_barWidth < 30) {\n _barWidth = 30;\n } else if (_barWidth >= this.visibleDistance) {\n _barWidth = 0;\n }\n this.barWidth = _barWidth;\n this.barHeight = SCROLLER_SIZE;\n this.barX = (this.scroll / this.distance) * (this.visibleDistance - this.barWidth);\n // 范围限制\n this.scroll = Math.max(0, Math.min(this.scroll, this.distance));\n }\n }\n draw() {\n const {\n config: { SCROLLER_FOCUS_COLOR, SCROLLER_COLOR, BORDER_COLOR, BORDER, SCROLLER_TRACK_COLOR },\n } = this.ctx;\n this.updatedSize();\n let borderColor = BORDER_COLOR;\n if (!BORDER) {\n borderColor = 'transparent';\n }\n // 轨道\n this.ctx.paint.drawRect(this.trackX, this.trackY, this.trackWidth, this.trackHeight, {\n borderColor,\n fillColor: SCROLLER_TRACK_COLOR,\n });\n // 滚动条\n this.ctx.paint.drawRect(this.barX, this.barY, this.barWidth, this.barHeight, {\n fillColor: this.isFocus || this.isDragging ? SCROLLER_FOCUS_COLOR : SCROLLER_COLOR,\n radius: 4,\n });\n // 分割线范围外\n if (this.splitPoints.length > 0) {\n this.ctx.paint.drawLine(this.splitPoints, {\n borderColor,\n borderWidth: 1,\n });\n }\n // 悬浮状态\n this.ctx.scrollerFocus = this.isFocus;\n }\n}\n\nexport default class Scroller {\n private ctx: Context;\n private verticalScrollbar: Scrollbar;\n private horizontalScrollbar: Scrollbar;\n\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.verticalScrollbar = new Scrollbar(ctx, 'vertical');\n this.horizontalScrollbar = new Scrollbar(ctx, 'horizontal');\n this.ctx.on('wheel', (e) => this.onWheel(e));\n this.ctx.on('mousedown', (e) => this.onMouseDown(e));\n this.ctx.on('mousemove', (e) => this.onMouseMove(e));\n this.ctx.on('mouseup', () => this.onMouseUp());\n this.ctx.on('touchmove', (e) => this.onTouchmove(e));\n this.ctx.on('touchstart', (e) => {\n this.onTouchstart(e);\n });\n this.ctx.on('setScroll', (scrollX: number, scrollY: number) => {\n this.setScroll(scrollX, scrollY);\n });\n this.ctx.on('setScrollX', (scrollX: number) => {\n this.setScrollX(scrollX);\n });\n this.ctx.on('setScrollY', (scrollY: number) => {\n this.setScrollY(scrollY);\n });\n }\n\n onWheel(e: WheelEvent) {\n this.verticalScrollbar.onWheel(e);\n this.horizontalScrollbar.onWheel(e);\n this.draw();\n }\n\n onTouchmove(e: TouchEvent) {\n this.verticalScrollbar.onTouchmove(e);\n this.horizontalScrollbar.onTouchmove(e);\n this.draw();\n }\n\n onTouchstart(e: TouchEvent) {\n this.verticalScrollbar.onTouchstart(e);\n this.horizontalScrollbar.onTouchstart(e);\n this.draw();\n }\n onMouseDown(e: MouseEvent) {\n this.verticalScrollbar.onMouseDown(e);\n this.horizontalScrollbar.onMouseDown(e);\n this.draw();\n }\n\n onMouseMove(e: MouseEvent) {\n this.verticalScrollbar.onMouseMove(e);\n this.horizontalScrollbar.onMouseMove(e);\n this.draw();\n }\n\n onMouseUp() {\n this.verticalScrollbar.onMouseUp();\n this.horizontalScrollbar.onMouseUp();\n this.ctx.scrollerMove = false;\n }\n\n draw() {\n this.verticalScrollbar.draw();\n this.horizontalScrollbar.draw();\n const scrollX = Math.floor(this.horizontalScrollbar.scroll);\n const scrollY = Math.floor(this.verticalScrollbar.scroll);\n // 只有滚动条发生变化才触发绘制\n if (scrollX !== this.ctx.scrollX || scrollY !== this.ctx.scrollY) {\n this.ctx.emit('onScroll', scrollX, scrollY);\n if (scrollX !== this.ctx.scrollX) {\n this.ctx.emit('onScrollX', scrollX);\n }\n if (scrollY !== this.ctx.scrollY) {\n this.ctx.emit('onScrollY', scrollY);\n }\n this.ctx.scrollX = scrollX;\n this.ctx.scrollY = scrollY;\n this.ctx.emit('draw');\n }\n }\n setScroll(x: number, y: number) {\n this.horizontalScrollbar.scroll = x;\n this.verticalScrollbar.scroll = y;\n this.ctx.emit('draw');\n this.ctx.emit('onScroll', x, y);\n }\n setScrollX(scrollX: number) {\n this.horizontalScrollbar.scroll = scrollX;\n this.ctx.emit('draw');\n }\n setScrollY(scrollY: number) {\n this.verticalScrollbar.scroll = scrollY;\n this.ctx.emit('draw');\n }\n scrollToColkey(key: string) {\n const { header } = this.ctx;\n const cell = header.leafCellHeaders.find((cell) => cell.key === key);\n if (cell) {\n // 移动到窗口中间/2\n this.setScrollX(cell.x - header.visibleWidth / 2);\n }\n }\n scrollToColIndex(colIndex: number) {\n const { header } = this.ctx;\n const cell = header.leafCellHeaders.find((cell) => cell.colIndex === colIndex);\n if (cell) {\n // 移动到窗口中间/2\n if (cell.x > header.visibleWidth / 2) {\n this.setScrollX(cell.x - header.visibleWidth / 2);\n }\n }\n }\n scrollToRowIndex(rowIndex: number) {\n const { body, database } = this.ctx;\n const { top } = database.getPositionForRowIndex(rowIndex);\n if (top > body.visibleHeight) {\n this.setScrollY(top - body.visibleHeight / 2);\n }\n }\n scrollToRowKey(rowKey: string) {\n const { body, database } = this.ctx;\n const rowIndex = database.getRowIndexForRowKey(rowKey);\n if (rowIndex === undefined) {\n return; \n }\n const { top } = database.getPositionForRowIndex(rowIndex);\n this.setScrollY(top - body.visibleHeight / 2);\n }\n}\n","import Context from './Context';\nimport { getMaxRow, calCrossSpan, toLeaf, sortFixed, throttle } from './util';\nimport CellHeader from './CellHeader';\nimport type { Column } from './types';\nexport default class Header {\n private ctx: Context; // 上下文\n private x = 0; // x坐标\n private y = 0; // y坐标\n private width = 0; // 宽度\n private height = 0; // 高度\n private resizeTarget: CellHeader | null = null; //调整表头\n private resizeNum = 0; // 调整列的数量\n private isResizing = false; // 是否移动中\n private clientX = 0; // 鼠标按下时的x轴位置\n private resizeDiff = 0; // 是否移动中\n private columnIndex = 0;\n private isMouseDown = false; // 是否按下\n private columns: any;\n private visibleLeafColumns: any[] = [];\n private visibleHeight = 0;\n private visibleWidth = 0;\n private allCellHeaders: CellHeader[] = [];\n private leafCellHeaders: CellHeader[] = [];\n private renderLeafCellHeaders: CellHeader[] = [];\n private fixedLeftCellHeaders: CellHeader[] = [];\n private centerCellHeaders: CellHeader[] = [];\n private fixedRightCellHeaders: CellHeader[] = [];\n private renderCenterCellHeaders: CellHeader[] = [];\n private renderFixedCellHeaders: CellHeader[] = [];\n constructor(ctx: Context) {\n this.ctx = ctx;\n // 监听表头重置,窗口变化\n this.ctx.on(\n 'resetHeader',\n throttle(() => {\n this.init();\n this.ctx.emit('draw');\n }, 100),\n );\n this.init();\n // 初始化调整列大小ENABLE_RESIZE_COLUMN\n this.initResizeColumn();\n }\n init() {\n const {\n config: { HEADER_HEIGHT, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n const columns = this.ctx.database.getColumns();\n this.columns = columns;\n this.allCellHeaders = [];\n this.leafCellHeaders = [];\n this.fixedLeftCellHeaders = [];\n this.fixedRightCellHeaders = [];\n this.centerCellHeaders = [];\n const maxHeaderRow = getMaxRow(columns);\n const leafColumns = toLeaf(columns);\n this.height = HEADER_HEIGHT * maxHeaderRow;\n this.width = leafColumns.reduce((sum, _item) => {\n const width = _item.width || 100;\n const { maxWidth, minWidth } = _item;\n if (maxWidth && width > maxWidth) {\n return sum + maxWidth;\n }\n if (minWidth && width < minWidth) {\n return sum + minWidth;\n }\n return sum + width;\n }, 0);\n this.visibleHeight = this.height;\n const spanColumns = sortFixed(calCrossSpan(columns, maxHeaderRow));\n this.columnIndex = 0;\n this.resizeNum = 0; // 可调整调整列数量\n this.render(spanColumns, 0);\n this.ctx.database.updateColIndexKeyMap(this.leafCellHeaders);\n const containerElement = this.ctx.containerElement.getBoundingClientRect();\n // 如果有可调整列,宽度等于容器宽度\n if (this.resizeNum > 0) {\n // this.ctx.canvasElement.width = containerElement.width;\n this.ctx.stageWidth = Math.floor(containerElement.width);\n } else {\n // this.ctx.canvasElement.width = this.width + SCROLLER_TRACK_SIZE - 1;\n this.ctx.stageWidth = Math.floor(this.width + SCROLLER_TRACK_SIZE);\n }\n this.ctx.stageElement.style.width = this.ctx.stageWidth + 'px';\n this.visibleWidth = this.ctx.stageWidth - SCROLLER_TRACK_SIZE;\n\n // 如果表头宽度小于可视宽度,平均分配\n const overWidth = this.visibleWidth - this.width;\n if (this.resizeNum && overWidth > 0) {\n const diff = Math.floor((overWidth / this.resizeNum) * 100) / 100;\n this.resizeAllColumn(diff);\n }\n const leafLeftCellHeaders = this.fixedLeftCellHeaders.filter((item) => !item.hasChildren);\n this.ctx.fixedLeftWidth = leafLeftCellHeaders.reduce((sum, _item) => sum + _item.width, 0);\n const leafRightCellHeaders = this.fixedRightCellHeaders.filter((item) => !item.hasChildren);\n this.ctx.fixedRightWidth = leafRightCellHeaders.reduce((sum, _item) => sum + _item.width, SCROLLER_TRACK_SIZE);\n // 更新最大列索引\n this.ctx.maxColIndex = this.leafCellHeaders.length - 1;\n this.ctx.header.x = this.x;\n this.ctx.header.y = this.y;\n this.ctx.header.width = this.width;\n this.ctx.header.height = this.height;\n this.ctx.header.visibleWidth = this.visibleWidth;\n this.ctx.header.visibleHeight = this.visibleHeight;\n }\n // 调整表头的宽度\n private initResizeColumn() {\n const {\n config: { ENABLE_RESIZE_COLUMN },\n } = this.ctx;\n if (!ENABLE_RESIZE_COLUMN) {\n return;\n }\n this.ctx.on('mousedown', (e) => {\n if (!this.ctx.isTarget(e)) {\n return;\n }\n this.clientX = e.clientX;\n if (this.resizeTarget) {\n this.isResizing = true;\n this.ctx.columnResizing = true;\n } else {\n this.isResizing = false;\n }\n this.isMouseDown = true;\n });\n this.ctx.on('mouseup', () => {\n this.isMouseDown = false;\n // 清空\n if (this.resizeDiff !== 0 && this.resizeTarget) {\n // 调整宽度\n this.resizeColumn(this.resizeTarget, this.resizeDiff);\n }\n this.resizeTarget = null;\n this.isResizing = false;\n this.isMouseDown = false;\n this.ctx.columnResizing = false;\n this.clientX = 0;\n this.resizeDiff = 0;\n });\n this.ctx.on('mousemove', (e) => {\n // 编辑中不触发mousemove\n if (this.ctx.editing) return;\n const {\n stageWidth,\n config: { RESIZE_COLUMN_MIN_WIDTH },\n } = this.ctx;\n // 鼠标移动\n if (this.isResizing && this.resizeTarget) {\n const resizeTargetWidth = this.resizeTarget.width;\n const resizeTargetMinWidth = this.resizeTarget.minWidth;\n const resizeTargetMaxWidth = this.resizeTarget.maxWidth;\n let diff = e.clientX - this.clientX;\n if (diff + resizeTargetWidth < RESIZE_COLUMN_MIN_WIDTH) {\n diff = -(resizeTargetWidth - RESIZE_COLUMN_MIN_WIDTH);\n }\n if (resizeTargetMinWidth && diff + resizeTargetWidth < resizeTargetMinWidth) {\n diff = -(resizeTargetWidth - resizeTargetMinWidth);\n }\n if (resizeTargetMaxWidth && diff + resizeTargetWidth > resizeTargetMaxWidth) {\n diff = resizeTargetMaxWidth - resizeTargetWidth;\n }\n this.resizeDiff = diff;\n this.ctx.emit('draw');\n } else {\n this.resizeTarget = null;\n // 按下时不改变样式,有可能是多选表头\n if (this.isMouseDown) {\n return;\n }\n // 鼠标在表头上,边界处理\n if (e.offsetX < 0 || e.offsetX > this.visibleWidth) {\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n return;\n }\n // 恢复默认样式\n if (this.ctx.stageElement.style.cursor === 'col-resize') {\n this.ctx.stageElement.style.cursor = 'default';\n }\n // 渲染的表头\n const renderAllCellHeaders = [...this.renderFixedCellHeaders, ...this.renderCenterCellHeaders];\n for (const col of renderAllCellHeaders) {\n const { offsetX, offsetY } = this.ctx.getOffset(e);\n const x = offsetX;\n const drawX = col.getDrawX();\n if (\n x > drawX + col.width - 5 &&\n x < drawX + col.width + 4 &&\n x < stageWidth - 4 && // 视窗中最后一列不允许调整宽\n col.colspan <= 1 // 父级表头不触发\n ) {\n // 在表头内\n if (this.ctx.isTarget(e) && offsetY <= this.height) {\n this.ctx.stageElement.style.cursor = 'col-resize';\n this.resizeTarget = col;\n }\n }\n }\n }\n });\n }\n private resizeColumn(cell: CellHeader, diff: number) {\n const setWidth = (columns: any[]) => {\n columns.forEach((column: any) => {\n if (column.children && column.children.length > 0) {\n setWidth(column.children);\n }\n if (column.key === cell.key) {\n const width = column.width || 100;\n column.width = width + diff;\n }\n });\n };\n setWidth(this.columns);\n this.ctx.database.setColumns(this.columns);\n this.init();\n this.ctx.emit('draw');\n let overDiff = 0;\n // 如果表头宽度小于可视宽度,平均分配\n if (this.width < this.visibleWidth) {\n const overWidth = this.visibleWidth - this.width;\n overDiff = Math.floor((overWidth / this.resizeNum) * 100) / 100;\n this.resizeAllColumn(overDiff);\n this.ctx.emit('draw');\n }\n this.ctx.emit('resizeColumnChange', {\n colIndex: cell.colIndex,\n key: cell.key,\n oldWidth: cell.width,\n width: cell.width + diff + overDiff,\n column: cell.column,\n columns: this.columns,\n });\n }\n resizeAllColumn(fellWidth: number) {\n if (fellWidth === 0) return;\n const widthMap = new Map();\n // 存需要更改的宽度\n let isResize = true;\n for (const col of this.allCellHeaders) {\n if (col.widthFillDisable) {\n // 不允许调整宽度\n widthMap.set(col.key, col.width);\n } else {\n const width = col.width + fellWidth * col.colspan;\n widthMap.set(col.key, width);\n if (width < this.ctx.config.RESIZE_COLUMN_MIN_WIDTH) {\n isResize = false;\n }\n }\n }\n // 如果有小于RESIZE_COLUMN_MIN_WIDTH的列,不允许调整\n if (!isResize) {\n return;\n }\n // 递归更改宽度\n const uptateWidth = (columns: Column[]) => {\n columns.forEach((column: Column) => {\n if (widthMap.has(column.key)) {\n column.width = widthMap.get(column.key);\n }\n if (column.children && column.children.length > 0) {\n uptateWidth(column.children);\n }\n });\n };\n uptateWidth(this.columns);\n this.ctx.database.setColumns(this.columns);\n this.init();\n // this.ctx.emit(\"draw\");\n }\n\n private render(arr: Column[], originX: number) {\n const len = arr.length;\n let everyOffsetX = originX;\n const { HEADER_HEIGHT = 0 } = this.ctx.config;\n for (let i = 0; i < len; i++) {\n const item = arr[i];\n const height = HEADER_HEIGHT * (item.rowspan || 0);\n const y = HEADER_HEIGHT * (item.level || 0);\n let { minWidth, maxWidth } = item;\n let width = item.width || 100; // 读取映射宽度\n if (minWidth && width < minWidth) {\n width = minWidth;\n }\n if (maxWidth && width > maxWidth) {\n width = maxWidth;\n }\n if (item.children) {\n // 父级表头的宽度是叶子节点表头的宽度总和\n const _arr = toLeaf(item.children);\n width = _arr.reduce((sum, _item) => sum + (_item?.width || 100), 0);\n }\n const cellHeader = new CellHeader(this.ctx, this.columnIndex, everyOffsetX, y, width, height, item);\n // 设置表头\n this.ctx.database.setHeader(item.key, cellHeader);\n this.allCellHeaders.push(cellHeader);\n if (!item.children) {\n this.leafCellHeaders.push(cellHeader);\n if (!cellHeader.column.widthFillDisable) {\n this.resizeNum++;\n }\n }\n if (item.fixed === 'left') {\n this.fixedLeftCellHeaders.push(cellHeader);\n } else if (item.fixed === 'right') {\n this.fixedRightCellHeaders.push(cellHeader);\n } else {\n this.centerCellHeaders.push(cellHeader);\n }\n !item.children && this.columnIndex++;\n item.children && this.render(item.children, everyOffsetX);\n everyOffsetX += width;\n }\n }\n\n private drawTipLine() {\n if (this.isResizing && this.resizeTarget) {\n const {\n stageHeight,\n config: { RESIZE_COLUMN_LINE_COLOR },\n } = this.ctx;\n const resizeTargetDrawX = this.resizeTarget.getDrawX();\n const resizeTargetWidth = this.resizeTarget.width;\n const x = resizeTargetDrawX + resizeTargetWidth + this.resizeDiff - 0.5;\n const poins = [x - 0.5, 0, x - 0.5, stageHeight];\n this.ctx.paint.drawLine(poins, {\n borderColor: RESIZE_COLUMN_LINE_COLOR,\n borderWidth: 1,\n });\n }\n }\n private drawFixedShadow() {\n const {\n fixedLeftWidth,\n fixedRightWidth,\n scrollX,\n header,\n stageWidth,\n config: { HEADER_BG_COLOR, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n\n if (scrollX > 0 && fixedLeftWidth !== 0) {\n this.ctx.paint.drawShadow(this.x, this.y, fixedLeftWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'right',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0.1)',\n colorEnd: 'rgba(0,0,0,0)',\n });\n }\n // 右边阴影\n if (scrollX < Math.floor(header.width - stageWidth - 1) && fixedRightWidth !== SCROLLER_TRACK_SIZE) {\n const x = header.width - (this.x + this.width) + stageWidth - fixedRightWidth;\n this.ctx.paint.drawShadow(x, this.y, fixedRightWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'left',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0)',\n colorEnd: 'rgba(0,0,0,0.1)',\n });\n }\n }\n update() {\n const renderLeafCellHeaders: CellHeader[] = [];\n const renderCenterCellHeaders: CellHeader[] = [];\n const renderFixedCellHeaders: CellHeader[] = [];\n // 中心的最后一个ColIndex\n if (this.centerCellHeaders.length) {\n const lastCenterCell = this.centerCellHeaders[this.centerCellHeaders.length - 1];\n this.ctx.lastCenterColIndex = lastCenterCell.colIndex;\n }\n this.centerCellHeaders.forEach((item) => {\n if (item.isHorizontalVisible() && item.isVerticalVisible()) {\n renderCenterCellHeaders.push(item);\n if (!item.hasChildren) {\n renderLeafCellHeaders.push(item);\n }\n }\n });\n this.fixedLeftCellHeaders.forEach((item) => {\n renderFixedCellHeaders.push(item);\n if (!item.hasChildren) {\n renderLeafCellHeaders.push(item);\n }\n });\n this.fixedRightCellHeaders.forEach((item) => {\n renderFixedCellHeaders.push(item);\n if (!item.hasChildren) {\n renderLeafCellHeaders.push(item);\n }\n });\n this.renderCenterCellHeaders = renderCenterCellHeaders;\n this.renderFixedCellHeaders = renderFixedCellHeaders;\n this.renderLeafCellHeaders = renderLeafCellHeaders.sort((a, b) => a.x - b.x);\n this.visibleLeafColumns = this.renderLeafCellHeaders.map((item) => item.column);\n\n this.ctx.header.visibleLeafColumns = this.visibleLeafColumns;\n this.ctx.header.leafCellHeaders = this.leafCellHeaders;\n this.ctx.header.renderLeafCellHeaders = this.renderLeafCellHeaders;\n this.ctx.header.renderCellHeaders = this.renderFixedCellHeaders.concat(this.renderCenterCellHeaders);\n }\n drawBottomLine() {\n const {\n stageWidth,\n config: { BORDER_COLOR },\n } = this.ctx;\n const poins = [0, this.height, stageWidth, this.height];\n this.ctx.paint.drawLine(poins, {\n borderColor: BORDER_COLOR,\n borderWidth: 1,\n });\n }\n draw() {\n this.renderCenterCellHeaders.forEach((item) => {\n item.update();\n item.draw();\n });\n this.drawFixedShadow();\n this.renderFixedCellHeaders.forEach((item) => {\n item.update();\n item.draw();\n });\n this.drawTipLine();\n this.drawBottomLine();\n }\n}\n","import Cell from './Cell';\nimport Context from './Context';\nimport type { RowType } from './types';\nexport default class Row {\n private ctx: Context;\n x = 0;\n y: number = 0;\n width = 0;\n height: number;\n cells: Cell[] = [];\n fixedCells: Cell[] = [];\n noFixedCells: Cell[] = [];\n rowIndex = 0;\n rowKey = '';\n rowType: RowType = 'body';\n data: any;\n constructor(\n ctx: Context,\n rowIndex: number,\n x = 0,\n y = 0,\n width = 0,\n height = 0,\n data: any,\n rowType: RowType = 'body',\n ) {\n this.ctx = ctx;\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n this.rowIndex = rowIndex;\n this.rowKey = ctx.database.getRowKeyForRowIndex(rowIndex) || '';\n this.rowType = rowType;\n this.data = data;\n this.update();\n }\n update() {\n const { header } = this.ctx;\n const cells: Cell[] = [];\n const fixedCells: Cell[] = [];\n const noFixedCells: Cell[] = [];\n header.renderLeafCellHeaders.forEach((header) => {\n const cell = new Cell(\n this.ctx,\n this.rowIndex,\n header.colIndex,\n header.x,\n this.y,\n header.width,\n this.height,\n header.column,\n this.data,\n this.rowType,\n );\n if (cell.fixed) {\n fixedCells.push(cell);\n } else {\n noFixedCells.push(cell);\n }\n cells.push(cell);\n });\n this.cells = cells;\n this.fixedCells = fixedCells;\n this.noFixedCells = noFixedCells;\n }\n drawCenter() {\n this.noFixedCells.forEach((cell) => {\n cell.draw();\n });\n }\n drawFixed() {\n this.fixedCells.forEach((cell) => {\n cell.draw();\n });\n }\n drawContainer() {\n this.noFixedCells.forEach((cell) => {\n cell.drawContainer();\n });\n }\n drawFixedContainer() {\n this.fixedCells.forEach((cell) => {\n cell.drawContainer();\n });\n }\n}\n","import type Context from './Context';\nimport Row from './Row';\nimport { Position } from './types';\nexport default class Body {\n private resizeTarget: Row | null = null; //调整行大小的目标\n private isMouseDown = false; // 是否按下\n private resizeDiff = 0; // 是否移动中\n private clientY = 0; // 鼠标按下时的y轴位置\n private ctx: Context;\n private x = 0;\n private y = 0;\n private width = 0;\n private height = 0;\n private headIndex = 0;\n private tailIndex = 0;\n private isResizing = false; //是否正在调整大小\n private renderRows: Row[] = [];\n private visibleRows: any[] = [];\n private visibleHeight = 0;\n private visibleWidth = 0;\n private containerRect: DOMRect | undefined;\n private data: any[] = [];\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n this.initResizeRow();\n }\n private init() {\n const {\n canvasElement,\n header,\n footer,\n database,\n config: {\n FOOTER_FIXED,\n SCROLLER_TRACK_SIZE = 0,\n HEIGHT,\n EMPTY_BODY_HEIGHT = 0,\n MAX_HEIGHT = 0,\n ENABLE_OFFSET_HEIGHT = 0,\n OFFSET_HEIGHT = 0,\n FOOTER_POSITION,\n },\n } = this.ctx;\n if (!header.width) {\n return;\n }\n this.x = 0;\n if (FOOTER_POSITION === 'top' && FOOTER_FIXED) {\n this.y = header.height + footer.height; //更新body的y轴位置\n } else {\n this.y = header.height;\n }\n const { data, sumHeight } = database.getData();\n // 更新高度\n this.height = sumHeight;\n // 更新数据\n this.data = data;\n // 更新宽度\n this.width = header.width;\n this.visibleWidth = this.ctx.stageWidth - SCROLLER_TRACK_SIZE;\n // 底部高度\n const footerHeight = this.ctx.footer.height;\n if (!this.data.length && !HEIGHT) {\n this.height = EMPTY_BODY_HEIGHT;\n } else if (!this.data.length && HEIGHT) {\n // 如果有设置高度的情况,空数据时,高度也要保持为设置的高度\n this.height = HEIGHT - header.height - footerHeight - SCROLLER_TRACK_SIZE;\n }\n\n let containerHeight = this.height + header.height + SCROLLER_TRACK_SIZE;\n // 如果有底部,加上底部高度\n containerHeight += footerHeight;\n let stageHeight = containerHeight;\n const windowInnerHeight = window.innerHeight;\n const { top } = this.containerRect || this.ctx.containerElement.getBoundingClientRect();\n if (windowInnerHeight > top && ENABLE_OFFSET_HEIGHT && !HEIGHT) {\n const visibleHeight = windowInnerHeight - top;\n const _stageHeight = visibleHeight - OFFSET_HEIGHT;\n if (_stageHeight > header.height + SCROLLER_TRACK_SIZE) {\n stageHeight = _stageHeight;\n } else if (containerHeight > MAX_HEIGHT) {\n stageHeight = MAX_HEIGHT;\n }\n } else if (this.data.length && HEIGHT) {\n stageHeight = HEIGHT;\n } else if (this.data.length && MAX_HEIGHT && containerHeight > MAX_HEIGHT) {\n stageHeight = MAX_HEIGHT;\n }\n // 更新窗口高度\n if (stageHeight > 0) {\n // this.ctx.canvasElement.height = stageHeight;\n this.ctx.stageHeight = Math.floor(stageHeight);\n this.ctx.stageElement.style.height = `${this.ctx.stageHeight}px`;\n }\n // 可视区高度\n let _visibleHeight = this.ctx.stageHeight - header.height - SCROLLER_TRACK_SIZE;\n // 底部高度,如果是固定底部,可视区减上底部高度\n if (FOOTER_FIXED) {\n this.visibleHeight = _visibleHeight - footerHeight;\n } else {\n this.visibleHeight = _visibleHeight;\n }\n if (!this.data.length) {\n this.height = this.visibleHeight;\n }\n this.ctx.body.x = this.x;\n this.ctx.body.y = this.y;\n this.ctx.body.width = this.width;\n this.ctx.body.height = this.height;\n this.ctx.body.visibleWidth = this.visibleWidth;\n this.ctx.body.visibleHeight = this.visibleHeight;\n this.ctx.body.data = data;\n const dpr = window.devicePixelRatio || 1; // 获取设备像素比\n const canvasWidth = this.ctx.stageWidth * dpr;\n const canvasHeight = this.ctx.stageHeight * dpr;\n canvasElement.width = Math.round(canvasWidth);\n canvasElement.height = Math.round(canvasHeight);\n const isEmpty = !this.data.length ? 'empty' : 'not-empty';\n this.ctx.emit('emptyChange', {\n isEmpty,\n type: isEmpty,\n headerHeight: header.height,\n bodyHeight: this.height,\n footerHeight,\n width: this.width,\n height: !this.data.length ? EMPTY_BODY_HEIGHT + footerHeight : 0,\n });\n // 外层容器样式\n const _cssWidth = Math.round((canvasElement.width / dpr) * 10000) / 10000;\n const _cssHeight = Math.round((canvasElement.height / dpr) * 10000) / 10000;\n this.ctx.canvasElement.setAttribute('style', `height:${_cssHeight}px;width:${_cssWidth}px;`);\n this.ctx.paint.scale(dpr);\n }\n // 调整行的高度\n private initResizeRow() {\n const {\n config: { ENABLE_RESIZE_ROW },\n } = this.ctx;\n if (!ENABLE_RESIZE_ROW) {\n return;\n }\n this.ctx.on('resize', () => {\n this.containerRect = this.ctx.containerElement.getBoundingClientRect();\n });\n this.ctx.on('resizeObserver', () => {\n this.containerRect = this.ctx.containerElement.getBoundingClientRect();\n });\n // 鼠标移动\n this.ctx.on('mouseup', () => {\n this.isMouseDown = false;\n if (this.resizeDiff !== 0 && this.resizeTarget) {\n // 调整宽度\n this.resizeRow(this.resizeTarget, this.resizeDiff);\n }\n this.resizeTarget = null;\n this.resizeDiff = 0;\n this.isResizing = false;\n //加个延时,修复拖动时,开始编辑的问题\n setTimeout(() => {\n this.ctx.rowResizing = false;\n }, 0);\n this.clientY = 0;\n });\n this.ctx.on('mousedown', (e) => {\n if (!this.ctx.isTarget(e)) {\n return;\n }\n this.clientY = e.clientY;\n if (this.resizeTarget) {\n this.isResizing = true;\n // 传递给上下文,防止其他事件触发,行调整大小时,不触发选择器\n this.ctx.rowResizing = true;\n } else {\n this.isResizing = false;\n this.ctx.rowResizing = false;\n }\n this.isMouseDown = true;\n });\n this.ctx.on('mousemove', (e) => {\n // 编辑中不触发mousemove\n if (this.ctx.editing) return;\n const { offsetY, offsetX } = this.ctx.getOffset(e);\n const y = offsetY;\n const x = offsetX;\n const clientY = e.clientY;\n const {\n stageHeight,\n scrollY,\n config: { RESIZE_ROW_MIN_HEIGHT = 0 },\n } = this.ctx;\n if (this.isResizing && this.resizeTarget) {\n const resizeTargetHeight = this.resizeTarget.height;\n let diff = clientY - this.clientY;\n if (diff + resizeTargetHeight < RESIZE_ROW_MIN_HEIGHT) {\n diff = -(resizeTargetHeight - RESIZE_ROW_MIN_HEIGHT);\n }\n this.resizeDiff = diff;\n this.ctx.emit('draw');\n } else {\n this.resizeTarget = null;\n // 按下时不改变样式,有可能是多选表头\n if (this.isMouseDown) {\n return;\n }\n // 鼠标移动时,判断是否在行的范围内\n if (\n x < 0 ||\n x > this.ctx.body.visibleWidth ||\n y < 0 ||\n y > this.ctx.header.visibleHeight + this.ctx.body.visibleHeight\n ) {\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n // 恢复默认样式\n this.ctx.stageElement.style.cursor = 'default';\n }\n return;\n }\n // 如果是拖动选择\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\n return;\n }\n if (this.ctx.stageElement.style.cursor === 'row-resize') {\n // 恢复默认样式\n this.ctx.stageElement.style.cursor = 'default';\n }\n for (let i = 0; i < this.renderRows.length; i++) {\n const row = this.renderRows[i];\n const isYRange =\n y > row.y - scrollY + row.height - 1.5 &&\n y < row.y - scrollY + row.height + 1.5 &&\n y < stageHeight - 4;\n if (isYRange) {\n for (let j = 0; j < row.cells.length; j++) {\n const cell = row.cells[j];\n if (\n x > cell.drawX + 10 &&\n x < cell.drawX + cell.width - 10 &&\n cell.rowspan === 1 //没有被合并的单元格\n ) {\n this.ctx.stageElement.style.cursor = 'row-resize';\n this.resizeTarget = row;\n }\n }\n }\n }\n }\n });\n }\n private resizeRow(row: Row, diff: number) {\n const { rowIndex, height, rowKey, data } = row;\n this.ctx.database.setRowHeight(rowIndex, height + diff);\n this.init();\n this.ctx.emit('draw');\n this.ctx.emit('resizeRowChange', {\n rowIndex,\n oldHeight: height,\n height: height + diff,\n rowKey,\n row: data,\n data: this.data,\n });\n }\n private drawTipLine() {\n if (this.isResizing && this.resizeTarget) {\n const {\n stageWidth,\n scrollY,\n config: { RESIZE_ROW_LINE_COLOR },\n } = this.ctx;\n const resizeTargetDrawY = this.resizeTarget.y - scrollY;\n const resizeTargetHeight = this.resizeTarget.height;\n const y = resizeTargetDrawY + resizeTargetHeight + this.resizeDiff - 0.5;\n const poins = [0, y - 0.5, stageWidth, y - 0.5];\n this.ctx.paint.drawLine(poins, {\n borderColor: RESIZE_ROW_LINE_COLOR,\n borderWidth: 1,\n });\n }\n }\n private drawFixedShadow() {\n const {\n fixedLeftWidth,\n fixedRightWidth,\n scrollX,\n header,\n stageWidth,\n config: { HEADER_BG_COLOR, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n\n if (scrollX > 0 && fixedLeftWidth !== 0) {\n this.ctx.paint.drawShadow(this.x, this.y, fixedLeftWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'right',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0.1)',\n colorEnd: 'rgba(0,0,0,0)',\n });\n }\n // 右边阴影\n if (scrollX < Math.floor(header.width - stageWidth - 1) && fixedRightWidth !== SCROLLER_TRACK_SIZE) {\n const x = header.width - (this.x + this.width) + stageWidth - fixedRightWidth;\n this.ctx.paint.drawShadow(x, this.y, fixedRightWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'left',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0)',\n colorEnd: 'rgba(0,0,0,0.1)',\n });\n }\n }\n private binarySearch(list: Position[], value: number) {\n let start = 0;\n let end = list.length - 1;\n let tempIndex = -1;\n while (start <= end) {\n let midIndex = Math.floor((start + end) / 2);\n let midValue = list[midIndex].bottom;\n if (midValue === value) {\n return midIndex;\n } else if (midValue < value) {\n start = midIndex + 1;\n } else {\n tempIndex = midIndex; // 记录当前的 midIndex\n end = midIndex - 1;\n }\n }\n return tempIndex;\n }\n update() {\n this.init();\n const {\n header,\n database,\n scrollY,\n config: { CELL_HEIGHT },\n } = this.ctx;\n const offset = scrollY;\n const { data, positions } = database.getData();\n // 更新最大行数\n this.ctx.maxRowIndex = data.length - 1;\n let _headIndex = this.binarySearch(positions, offset);\n let _tailIndex = this.binarySearch(positions, offset + this.visibleHeight);\n if (_tailIndex === -1) {\n _tailIndex = this.ctx.maxRowIndex;\n }\n // 解决性能问题,设置数据时又设置滚动条可能导致虚拟滚动计算错误\n if (_headIndex === -1 && _tailIndex === this.ctx.maxRowIndex) {\n const buffer = Math.floor(this.visibleHeight / CELL_HEIGHT);\n _headIndex = this.ctx.maxRowIndex - buffer;\n }\n this.headIndex = Math.max(0, _headIndex);\n this.tailIndex = Math.min(this.ctx.maxRowIndex, _tailIndex + 1);\n this.visibleRows = data.slice(this.headIndex, this.tailIndex + 1);\n this.ctx.body.headIndex = this.headIndex;\n this.ctx.body.tailIndex = this.tailIndex;\n this.ctx.body.visibleRows = this.visibleRows;\n\n const rows: Row[] = [];\n for (let i = 0; i < this.visibleRows.length; i++) {\n const index = this.headIndex + i;\n const data = this.visibleRows[i];\n const { height, top } = this.ctx.database.getPositionForRowIndex(index);\n const row = new Row(this.ctx, index, 0, top + this.y, header.width, height, data);\n rows.push(row);\n }\n this.renderRows = rows;\n this.ctx.body.renderRows = rows;\n }\n draw() {\n // 容器背景\n this.renderRows.forEach((row) => {\n row.drawContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawCenter();\n });\n this.drawFixedShadow();\n this.renderRows.forEach((row) => {\n row.drawFixedContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawFixed();\n });\n this.drawTipLine();\n }\n}\n","import Context from './Context';\nimport Row from './Row';\n\nexport default class Footer {\n private ctx: Context;\n private renderRows: Row[] = [];\n private data: any[] = [];\n private x = 0;\n private y = 0;\n private width = 0;\n private height = 0;\n private visibleWidth = 0;\n private visibleHeight = 0;\n constructor(ctx: Context) {\n this.ctx = ctx;\n this.init();\n }\n private init() {\n this.data = this.ctx.database.getFooterData();\n const {\n header,\n body,\n config: { CELL_FOOTER_HEIGHT, FOOTER_FIXED, SCROLLER_TRACK_SIZE, FOOTER_POSITION },\n } = this.ctx;\n // 更新宽度\n this.width = header.width;\n this.visibleWidth = header.visibleWidth;\n // 更新高度\n this.height = this.data.reduce((sum) => {\n return sum + CELL_FOOTER_HEIGHT;\n }, 0);\n // 可视区高度\n this.visibleHeight = this.height;\n if (FOOTER_FIXED) {\n if (FOOTER_POSITION === 'top') {\n this.y = this.ctx.header.height;\n } else {\n this.y = this.ctx.stageHeight - this.height - SCROLLER_TRACK_SIZE;\n }\n } else {\n this.y = body.y + body.height;\n }\n this.ctx.footer.x = this.x;\n this.ctx.footer.y = this.y;\n this.ctx.footer.height = this.height;\n this.ctx.footer.width = this.width;\n this.ctx.footer.visibleWidth = this.visibleWidth;\n this.ctx.footer.visibleHeight = this.visibleHeight;\n }\n private drawFixedShadow() {\n const {\n fixedLeftWidth,\n fixedRightWidth,\n scrollX,\n header,\n stageWidth,\n config: { HEADER_BG_COLOR, SCROLLER_TRACK_SIZE },\n } = this.ctx;\n let y = this.y;\n // 不是footer固定时\n if (!this.ctx.config.FOOTER_FIXED) {\n y = this.y - this.ctx.scrollY;\n }\n if (scrollX > 0 && fixedLeftWidth !== 0) {\n this.ctx.paint.drawShadow(this.x, y, fixedLeftWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'right',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0.1)',\n colorEnd: 'rgba(0,0,0,0)',\n });\n }\n // 右边阴影\n if (scrollX < Math.floor(header.width - stageWidth - 1) && fixedRightWidth !== SCROLLER_TRACK_SIZE) {\n const x = header.width - (this.x + this.width) + stageWidth - fixedRightWidth;\n this.ctx.paint.drawShadow(x, y, fixedRightWidth, this.height, {\n fillColor: HEADER_BG_COLOR,\n side: 'left',\n shadowWidth: 4,\n colorStart: 'rgba(0,0,0,0)',\n colorEnd: 'rgba(0,0,0,0.1)',\n });\n }\n }\n update() {\n this.init();\n const { CELL_FOOTER_HEIGHT } = this.ctx.config;\n let everyOffsetY = this.y;\n const rows: Row[] = [];\n this.data.forEach((data, index) => {\n const row = new Row(this.ctx, index, 0, everyOffsetY, this.width, CELL_FOOTER_HEIGHT, data, 'footer');\n everyOffsetY += CELL_FOOTER_HEIGHT;\n rows.push(row);\n });\n this.renderRows = rows;\n this.ctx.footer.renderRows = this.renderRows;\n }\n drawTopLine() {\n const {\n stageWidth,\n config: { BORDER_COLOR },\n } = this.ctx;\n const poins = [0, this.y, stageWidth, this.y];\n this.ctx.paint.drawLine(poins, {\n borderColor: BORDER_COLOR,\n borderWidth: 1,\n });\n }\n draw() {\n this.renderRows.forEach((row) => {\n row.drawContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawCenter();\n });\n this.drawFixedShadow();\n this.renderRows.forEach((row) => {\n row.drawFixedContainer();\n });\n this.renderRows.forEach((row) => {\n row.drawFixed();\n });\n this.drawTopLine();\n }\n}\n","import type Context from './Context';\r\nimport type Cell from './Cell';\r\nimport type CellHeader from './CellHeader';\r\nimport { BeforePasteDataMethod, BeforeSetSelectorMethod, ChangeItem, ErrorType, BeforeCopyMethod } from './types';\r\nimport { throttle, decodeSpreadsheetStr, encodeToSpreadsheetStr } from './util';\r\nexport default class Selector {\r\n private isCut = false;\r\n private isMultipleRow = false;\r\n private mousedownHeader = false;\r\n private ctx: Context;\r\n private adjustPositionX = '';\r\n private adjustPositionY = '';\r\n private timerX = 0; // 水平滚动定时器\r\n private timerY = 0; // 垂直滚动定时器\r\n\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('setMoveFocus', (dir: 'LEFT' | 'TOP' | 'RIGHT' | 'BOTTOM') => {\r\n this.moveFocus(dir);\r\n });\r\n // 鼠标移动fixed边界时,调整滚动条位置\r\n this.ctx.on(\r\n 'mousemove',\r\n throttle((e) => {\r\n const { offsetY, offsetX } = this.ctx.getOffset(e);\r\n const isInsideBody =\r\n this.ctx.isTarget(e) &&\r\n offsetX > 0 &&\r\n offsetX < this.ctx.body.visibleWidth &&\r\n offsetY > this.ctx.header.visibleHeight &&\r\n offsetY < this.ctx.header.visibleHeight + this.ctx.body.visibleHeight;\r\n if (this.ctx.selectorMove || this.ctx.autofillMove) {\r\n // 如果是body外部就调整位置\r\n if (!isInsideBody && !this.mousedownHeader) {\r\n this.startAdjustPosition(e);\r\n } else {\r\n this.stopAdjustPosition();\r\n }\r\n }\r\n }, 100),\r\n );\r\n this.ctx.on('cellHoverChange', (cell) => {\r\n // 如果是自动填充移动就不处理\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n if (cell.operation) {\r\n this.selectRows(cell, false);\r\n // 如果是自动填充就不处理\r\n return;\r\n }\r\n // 多选行\r\n if (this.isMultipleRow) {\r\n return;\r\n }\r\n this.mouseenter();\r\n });\r\n this.ctx.on('cellMousedown', (cell, e) => {\r\n if (!this.ctx.isTarget(e)) {\r\n return;\r\n }\r\n // 如果是选中就不处理,比如chexkbox\r\n if (this.ctx.stageElement.style.cursor === 'pointer') {\r\n return;\r\n }\r\n if (this.ctx.isPointer) {\r\n return;\r\n }\r\n // 如果是填充返回\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n return;\r\n }\r\n if (cell.operation) {\r\n this.isMultipleRow = true;\r\n this.selectRows(cell);\r\n return;\r\n }\r\n // 解决dom文档选中问题\r\n const style = window.getComputedStyle(e.target);\r\n if (style.userSelect !== 'text') {\r\n e.preventDefault();\r\n }\r\n this.isMultipleRow = false;\r\n this.click(e.shiftKey);\r\n this.ctx.emit('selectorClick', cell);\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.mousedownHeader = false;\r\n // mousedown销毁dom会导致click事件清除\r\n // 加个setTimeout小延迟一下,使得editor cellClick 判断adjustPositioning正常\r\n const timer = setTimeout(() => {\r\n this.ctx.adjustPositioning = false;\r\n clearTimeout(timer);\r\n }, 0);\r\n });\r\n this.ctx.on('cellHeaderHoverChange', (cell) => {\r\n if (this.ctx.mousedown) {\r\n this.selectCols(cell);\r\n }\r\n });\r\n this.ctx.on('cellHeaderMousedown', (cell, e) => {\r\n // 如果是选中就不处理,比如chexkbox\r\n if (this.ctx.stageElement.style.cursor === 'pointer') {\r\n return;\r\n }\r\n if (this.ctx.isPointer) {\r\n return;\r\n }\r\n // 解决dom文档选中问题\r\n const style = window.getComputedStyle(e.target);\r\n if (style.userSelect !== 'text') {\r\n e.preventDefault();\r\n }\r\n this.mousedownHeader = true;\r\n this.selectCols(cell);\r\n });\r\n this.ctx.on('keydown', (e) => {\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n // CTRL+C/Command+C\r\n if ((e.ctrlKey && e.code === 'KeyV') || (e.metaKey && e.code === 'KeyV')) {\r\n this.paste();\r\n return;\r\n }\r\n if ((e.ctrlKey && e.code === 'KeyC') || (e.metaKey && e.code === 'KeyC')) {\r\n this.copy();\r\n this.isCut = false;\r\n return;\r\n }\r\n // CTRL+X/Command+X\r\n if ((e.ctrlKey && e.code === 'KeyX') || (e.metaKey && e.code === 'KeyX')) {\r\n this.isCut = true;\r\n this.copy();\r\n return;\r\n }\r\n // CTRL+A/Command+A\r\n if ((e.ctrlKey && e.code === 'KeyA') || (e.metaKey && e.code === 'KeyA')) {\r\n e.preventDefault();\r\n this.selectAll();\r\n }\r\n if (e.code === 'ArrowLeft' || (e.shiftKey && e.code === 'Tab')) {\r\n e.preventDefault();\r\n this.moveFocus('LEFT');\r\n return;\r\n }\r\n if (e.code === 'ArrowUp') {\r\n e.preventDefault();\r\n this.moveFocus('TOP');\r\n return;\r\n }\r\n if (e.code === 'ArrowRight' || e.code === 'Tab') {\r\n e.preventDefault();\r\n this.moveFocus('RIGHT');\r\n return;\r\n }\r\n if (e.code === 'ArrowDown') {\r\n e.preventDefault();\r\n this.moveFocus('BOTTOM');\r\n return;\r\n }\r\n if (e.code === 'Delete' || e.code === 'Backspace') {\r\n e.preventDefault();\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.clearSelectedData(xArr, yArr);\r\n return;\r\n }\r\n });\r\n this.ctx.on('contextMenuClearSelected', () => {\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.clearSelectedData(xArr, yArr);\r\n });\r\n this.ctx.on('contextMenuCopy', () => {\r\n this.copy();\r\n });\r\n this.ctx.on('contextMenuPaste', () => {\r\n this.paste();\r\n });\r\n this.ctx.on('contextMenuCut', () => {\r\n this.isCut = true;\r\n this.copy();\r\n });\r\n //解耦:外部调用选择单元格\r\n this.ctx.on('setSelectorCell', (cell: Cell) => {\r\n this.ctx.setFocusCell(cell);\r\n this.click();\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.ctx.selectorMove = false;\r\n this.stopAdjustPosition();\r\n });\r\n }\r\n private setSelector(xArr: number[], yArr: number[]) {\r\n const { ENABLE_SELECTOR_SPAN_COL, ENABLE_SELECTOR_SPAN_ROW } = this.ctx.config;\r\n let _xArr = xArr;\r\n let _yArr = yArr;\r\n if (!ENABLE_SELECTOR_SPAN_ROW) {\r\n const [rowstart] = _yArr;\r\n _yArr = [rowstart, rowstart];\r\n }\r\n if (!ENABLE_SELECTOR_SPAN_COL) {\r\n const [colstart] = _xArr;\r\n _xArr = [colstart, colstart];\r\n }\r\n // 减少渲染\r\n if (\r\n JSON.stringify(this.ctx.selector.xArr) !== JSON.stringify(_xArr) ||\r\n JSON.stringify(this.ctx.selector.yArr) !== JSON.stringify(_yArr)\r\n ) {\r\n if (this.ctx.mousedown) {\r\n this.ctx.selectorMove = true;\r\n }\r\n this.ctx.selector.enable = true;\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n let [minX, maxX] = _xArr;\r\n let [minY, maxY] = _yArr;\r\n if (minX < areaMinX) {\r\n return;\r\n }\r\n if (maxX > areaMaxX) {\r\n return;\r\n }\r\n if (minY < areaMinY) {\r\n return;\r\n }\r\n if (maxY > areaMaxY) {\r\n return;\r\n }\r\n // 聚焦,解决iframe键盘事件不触发\r\n this.ctx.stageElement.focus({ preventScroll: true });\r\n // 启用合并单元格关联\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK) {\r\n const adjustMerge = this.adjustMergeCells(_xArr, _yArr);\r\n // 合并单元格时,调整选择器的位置\r\n minY = adjustMerge.yArr[0];\r\n maxY = adjustMerge.yArr[1];\r\n minX = adjustMerge.xArr[0];\r\n maxX = adjustMerge.xArr[1];\r\n // 只有一个合并单元格时\r\n this.ctx.onlyMergeCell = adjustMerge.onlyMergeCell;\r\n }\r\n if (minX === maxX && minY === maxY) {\r\n this.ctx.selectOnlyOne = true;\r\n } else {\r\n this.ctx.selectOnlyOne = false;\r\n }\r\n _xArr = [Math.max(areaMinX, minX), Math.min(areaMaxX, maxX)];\r\n _yArr = [Math.max(areaMinY, minY), Math.min(areaMaxY, maxY)];\r\n // 调整选择器的位置前回调\r\n const { BEFORE_SET_SELECTOR_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_SET_SELECTOR_METHOD === 'function') {\r\n const beforeSetSelectorMethod: BeforeSetSelectorMethod = BEFORE_SET_SELECTOR_METHOD;\r\n const res = beforeSetSelectorMethod({\r\n focusCell: this.ctx.focusCell,\r\n xArr: _xArr,\r\n yArr: _yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n _xArr = res.xArr;\r\n _yArr = res.yArr;\r\n }\r\n this.ctx.selector.xArr = _xArr;\r\n this.ctx.selector.yArr = _yArr;\r\n this.ctx.emit('setSelector', this.ctx.selector);\r\n this.ctx.emit('drawView');\r\n }\r\n }\r\n private adjustMergeCells(xArr: number[], yArr: number[]) {\r\n const [minY, maxY] = yArr;\r\n const [minX, maxX] = xArr;\r\n let topBottomCells: Cell[] = [];\r\n let leftRightCells: Cell[] = [];\r\n // 遍历选择中的单元格\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const rowIndex = ri + yArr[0];\r\n const colIndex = ci + xArr[0];\r\n const cell = this.ctx.database.getVirtualBodyCell(rowIndex, colIndex);\r\n if (cell) {\r\n // 顶部和底部的单元格\r\n if (rowIndex === minY || rowIndex === maxY) {\r\n topBottomCells.push(cell);\r\n }\r\n // 左右的单元格\r\n if (colIndex === minX || colIndex === maxX) {\r\n leftRightCells.push(cell);\r\n }\r\n }\r\n }\r\n }\r\n const topBottomBoundary = topBottomCells.reduce(\r\n (prev, cell) => {\r\n const { yArr } = cell.getSpanInfo();\r\n const [topIndex, bottomIndex] = yArr;\r\n prev.minY = Math.min(prev.minY, topIndex);\r\n prev.maxY = Math.max(prev.maxY, bottomIndex);\r\n return prev;\r\n },\r\n {\r\n minY,\r\n maxY,\r\n },\r\n );\r\n const leftRightBoundary = leftRightCells.reduce(\r\n (prev, cell) => {\r\n const { xArr } = cell.getSpanInfo();\r\n const [leftIndex, rightIndex] = xArr;\r\n prev.minX = Math.min(prev.minX, leftIndex);\r\n prev.maxX = Math.max(prev.maxX, rightIndex);\r\n return prev;\r\n },\r\n {\r\n minX,\r\n maxX,\r\n },\r\n );\r\n const _xArr = [leftRightBoundary.minX, leftRightBoundary.maxX];\r\n const _yArr = [topBottomBoundary.minY, topBottomBoundary.maxY];\r\n let onlyMergeCell = false;\r\n // Check if the selected area is a single merged cell\r\n if (leftRightBoundary.minX !== leftRightBoundary.maxX || topBottomBoundary.minY !== topBottomBoundary.maxY) {\r\n const selectorStr = JSON.stringify(_xArr) + JSON.stringify(_yArr);\r\n const spanInfo = this.ctx.focusCell?.getSpanInfo();\r\n const spanStr = spanInfo && JSON.stringify(spanInfo.xArr) + JSON.stringify(spanInfo.yArr);\r\n onlyMergeCell = spanStr === selectorStr;\r\n }\r\n return {\r\n xArr: _xArr,\r\n yArr: _yArr,\r\n onlyMergeCell,\r\n };\r\n }\r\n private selectCols(cell: CellHeader) {\r\n // 启用单选就不能批量选中\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n if (!this.ctx.config.ENABLE_SELECTOR_ALL_ROWS) {\r\n return;\r\n }\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n // 如果是拖拽改变列宽就不处理\r\n if (this.ctx.columnResizing) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n // 是可操作列就全选\r\n if (cell.operation) {\r\n this.selectAll();\r\n return;\r\n }\r\n const { SELECTOR_AREA_MIN_Y, SELECTOR_AREA_MAX_Y, SELECTOR_AREA_MAX_Y_OFFSET } = this.ctx.config;\r\n const minY = SELECTOR_AREA_MIN_Y;\r\n const maxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n if (this.ctx.mousedown && this.ctx.focusCellHeader) {\r\n const { colIndex } = this.ctx.focusCellHeader;\r\n //\r\n this.ctx.clearSelector();\r\n if (cell.colIndex >= colIndex) {\r\n const xArr = [colIndex, cell.colIndex + cell.colspan - 1];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n } else {\r\n const xArr = [cell.colIndex, colIndex];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n } else {\r\n // this.setFocusCellHeader(cell);\r\n const xArr = [cell.colIndex, cell.colIndex + cell.colspan - 1];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n private selectAll() {\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n // 只有两个全选启用了才能全选\r\n const { ENABLE_SELECTOR_ALL_ROWS, ENABLE_SELECTOR_ALL_COLS } = this.ctx.config;\r\n if (ENABLE_SELECTOR_ALL_ROWS && ENABLE_SELECTOR_ALL_COLS) {\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const minX = SELECTOR_AREA_MIN_X;\r\n const maxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const minY = SELECTOR_AREA_MIN_Y;\r\n const maxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n const xArr = [minX, maxX];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n private selectRows(cell: Cell, isSetFocus = true) {\r\n // 启用单选就不能批量选中\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n if (!this.ctx.config.ENABLE_SELECTOR_ALL_COLS) {\r\n return;\r\n }\r\n if (this.ctx.autofillMove) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n const { SELECTOR_AREA_MIN_X, SELECTOR_AREA_MAX_X, SELECTOR_AREA_MAX_X_OFFSET } = this.ctx.config;\r\n const maxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const minX = SELECTOR_AREA_MIN_X;\r\n if (isSetFocus) {\r\n this.ctx.setFocusCell(cell);\r\n const xArr = [minX, maxX];\r\n const yArr = [cell.rowIndex, cell.rowIndex];\r\n this.setSelector(xArr, yArr);\r\n }\r\n if (this.ctx.focusCell && this.ctx.mousedown) {\r\n const { rowIndex } = this.ctx.focusCell;\r\n if (cell.rowIndex >= rowIndex) {\r\n const xArr = [minX, maxX];\r\n const yArr = [rowIndex, cell.rowIndex];\r\n this.setSelector(xArr, yArr);\r\n } else {\r\n const xArr = [minX, maxX];\r\n const yArr = [cell.rowIndex, rowIndex];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n }\r\n\r\n private mouseenter() {\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n // 编辑中\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n const { mousedown, focusCell, hoverCell } = this.ctx;\r\n if (mousedown && focusCell && hoverCell) {\r\n const { rowIndex, colIndex } = focusCell;\r\n const minX = Math.min(hoverCell.colIndex, colIndex);\r\n const maxX = Math.max(hoverCell.colIndex, colIndex);\r\n const minY = Math.min(hoverCell.rowIndex, rowIndex);\r\n const maxY = Math.max(hoverCell.rowIndex, rowIndex);\r\n const xArr = [minX, maxX];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n }\r\n }\r\n private click(shiftKey = false) {\r\n const { focusCell, clickCell } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 超过范围值就不处理\r\n if (!this.isInSettingRange(focusCell.rowIndex, focusCell.colIndex)) {\r\n return;\r\n }\r\n this.ctx.selector.enable = true;\r\n if (clickCell && shiftKey) {\r\n // 启用单选就不能批量选中\r\n if (this.ctx.config.ENABLE_SELECTOR_SINGLE) {\r\n return;\r\n }\r\n // shiftKey快捷选中\r\n const { colIndex, rowIndex } = clickCell;\r\n const { colIndex: oldX, rowIndex: oldY } = focusCell;\r\n const minX = Math.min(oldX, colIndex);\r\n const maxX = Math.max(oldX, colIndex);\r\n const minY = Math.min(oldY, rowIndex);\r\n const maxY = Math.max(oldY, rowIndex);\r\n const xArr = [minX, maxX];\r\n const yArr = [minY, maxY];\r\n this.setSelector(xArr, yArr);\r\n } else {\r\n this.ctx.emit('cellSelectedClick', focusCell);\r\n const xArr = [focusCell.colIndex, focusCell.colIndex];\r\n const yArr = [focusCell.rowIndex, focusCell.rowIndex];\r\n this.setSelector(xArr, yArr);\r\n this.adjustBoundaryPosition();\r\n }\r\n }\r\n\r\n private clearCopyLine() {\r\n this.ctx.selector.xArrCopy = [-1, -1];\r\n this.ctx.selector.yArrCopy = [-1, -1];\r\n }\r\n /**\r\n * 获取选中单元格\r\n * @param rowIndex\r\n * @param colIndex\r\n * @returns\r\n */\r\n private getCell(rowIndex: number, colIndex: number) {\r\n // 设置选中FocusCell\r\n const row = this.ctx.body.renderRows.find((row) => row.rowIndex === rowIndex);\r\n const cell = row?.cells.find((cell: { colIndex: number }) => cell.colIndex === colIndex);\r\n return cell;\r\n }\r\n /**\r\n * 复制\r\n * @returns\r\n */\r\n private copy() {\r\n if (!this.ctx.config.ENABLE_COPY) {\r\n return;\r\n }\r\n // dom选中时会阻止复制\r\n if (this.ctx.domSelectionStr) {\r\n return;\r\n }\r\n let { value, xArr, yArr } = this.ctx.getSelectedData();\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.database.hasMergeCell(xArr, yArr)) {\r\n if (this.ctx.onlyMergeCell && this.ctx.focusCell) {\r\n const cell = this.ctx.focusCell;\r\n value = [[cell.getValue()]];\r\n xArr = [cell.colIndex, cell.colIndex];\r\n yArr = [cell.rowIndex, cell.rowIndex];\r\n } else {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_COPY',\r\n message: 'Merged cells cannot span copy data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n }\r\n // 复制前回调\r\n const { BEFORE_COPY_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_COPY_METHOD === 'function') {\r\n const beforeCopyMethod: BeforeCopyMethod = BEFORE_COPY_METHOD;\r\n const res = beforeCopyMethod({\r\n focusCell: this.ctx.focusCell,\r\n data: value,\r\n xArr,\r\n yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n value = res.data;\r\n }\r\n const text = encodeToSpreadsheetStr(value);\r\n if (navigator.clipboard) {\r\n navigator.clipboard\r\n .writeText(text)\r\n .then(() => {\r\n // 处理复制线\r\n this.ctx.selector.xArrCopy = this.ctx.selector.xArr.slice();\r\n this.ctx.selector.yArrCopy = this.ctx.selector.yArr.slice();\r\n this.ctx.emit('copyChange', {\r\n xArr: this.ctx.selector.xArrCopy,\r\n yArr: this.ctx.selector.yArrCopy,\r\n data: value,\r\n });\r\n this.ctx.emit('draw');\r\n })\r\n .catch((error) => console.error('Copy Failure:', error));\r\n } else {\r\n console.error('current browser does not support the Clipboard API');\r\n }\r\n }\r\n clearSelectedData(xArr: number[], yArr: number[], ignoreSet = false, value = null) {\r\n let changeList: ChangeItem[] = [];\r\n const rowKeyList: Set<string> = new Set();\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const _rowIndex = ri + yArr[0];\r\n const _colIndex = ci + xArr[0];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(_rowIndex, _colIndex);\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return [];\r\n }\r\n // 忽略设置,只返回数据,用于cut\r\n if (ignoreSet) {\r\n return changeList;\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.database.batchSetItemValue(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('clearSelectedDataChange', changeList, rows);\r\n return changeList;\r\n }\r\n private paste() {\r\n if (!navigator.clipboard) {\r\n console.error('current browser does not support the Clipboard API');\r\n return;\r\n }\r\n const { ENABLE_PASTER } = this.ctx.config;\r\n if (this.ctx.selector.enable && ENABLE_PASTER) {\r\n const rowIndex = this.ctx.selector.yArr[0];\r\n const colIndex = this.ctx.selector.xArr[0];\r\n const rowKeyList: Set<string> = new Set();\r\n navigator.clipboard\r\n .readText()\r\n .then(async (val) => {\r\n let textArr = decodeSpreadsheetStr(val);\r\n const _xArr = [colIndex, colIndex + textArr[0].length - 1];\r\n const _yArr = [rowIndex, rowIndex + textArr.length - 1];\r\n const [minY, maxY] = _yArr;\r\n const [minX, maxX] = _xArr;\r\n const overflowRowCount = maxY - this.ctx.maxRowIndex;\r\n const overflowColCount = maxX - this.ctx.maxColIndex;\r\n // 粘贴溢出回调处理\r\n if (overflowRowCount > 0 || overflowColCount > 0) {\r\n this.ctx.emit('onPastedDataOverflow', {\r\n maxY,\r\n maxX,\r\n minY,\r\n minX,\r\n overflowRowCount,\r\n overflowColCount,\r\n textArr,\r\n });\r\n }\r\n // textArr只有一个\r\n const isOneData = textArr.length === 1 && textArr[0].length === 1;\r\n // 启用合并时禁用粘贴填充\r\n if (\r\n this.ctx.config.ENABLE_MERGE_CELL_LINK &&\r\n this.ctx.database.hasMergeCell(_xArr, _yArr) &&\r\n !isOneData\r\n ) {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_PASTE',\r\n message: 'Merged cells cannot span paste data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n let changeList: ChangeItem[] = [];\r\n for (let ri = 0; ri <= textArr.length - 1; ri++) {\r\n const len = textArr[ri].length;\r\n for (let ci = 0; ci <= len - 1; ci++) {\r\n const _rowIndex = ri + rowIndex;\r\n const _colIndex = ci + colIndex;\r\n const value = textArr[ri][ci];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(\r\n _rowIndex,\r\n _colIndex,\r\n );\r\n if (itemValue) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value,\r\n row: {}, //内部有设置\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 剪切时清除选中数据\r\n if (this.isCut) {\r\n const cutList = this.clearSelectedData(\r\n this.ctx.selector.xArrCopy,\r\n this.ctx.selector.yArrCopy,\r\n true, // 忽略设置,只返回数据,用于cut,实现历史回退需要返回两次问题\r\n );\r\n const changeListRowkeys = changeList.map((item) => `${item.rowKey}-${item.key}`);\r\n // 剔除剪切的数据\r\n cutList.forEach((item) => {\r\n if (!changeListRowkeys.includes(`${item.rowKey}-${item.key}`)) {\r\n // 剪切的数据放在最前面\r\n changeList.unshift(item);\r\n }\r\n });\r\n this.isCut = false;\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return;\r\n }\r\n // 剪贴板内容改变前回调\r\n const { BEFORE_PASTE_DATA_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_PASTE_DATA_METHOD === 'function') {\r\n const beforePasteDataMethod: BeforePasteDataMethod = BEFORE_PASTE_DATA_METHOD;\r\n const _changeList = changeList.map((item) => ({\r\n rowKey: item.rowKey,\r\n key: item.key,\r\n value: item.value,\r\n oldValue: this.ctx.database.getItemValue(item.rowKey, item.key),\r\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\r\n }));\r\n changeList = await beforePasteDataMethod(_changeList, _xArr, _yArr, textArr);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 清除复制线\r\n this.clearCopyLine();\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('pasteChange', changeList, rows);\r\n })\r\n .catch((error) => {\r\n console.error('Failed to get the clipboard content:', error);\r\n });\r\n }\r\n }\r\n /**键盘上下左右切换\r\n * @param dir\r\n */\r\n private moveFocus(dir: 'LEFT' | 'TOP' | 'RIGHT' | 'BOTTOM') {\r\n // 编辑状态不处理\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n const { focusCell } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n let { colIndex = 0, rowIndex = 0 } = focusCell;\r\n const minX = 0;\r\n const minY = 0;\r\n const maxX = this.ctx.maxColIndex;\r\n const maxY = this.ctx.maxRowIndex;\r\n switch (dir) {\r\n case 'LEFT':\r\n if (colIndex > minX) {\r\n colIndex--;\r\n }\r\n break;\r\n case 'TOP':\r\n if (rowIndex > minY) {\r\n rowIndex--;\r\n }\r\n break;\r\n case 'RIGHT':\r\n if (colIndex < maxX) {\r\n colIndex++;\r\n }\r\n break;\r\n case 'BOTTOM':\r\n if (rowIndex < maxY) {\r\n rowIndex++;\r\n }\r\n break;\r\n default:\r\n }\r\n const xArr = [colIndex, colIndex];\r\n const yArr = [rowIndex, rowIndex];\r\n const cell = this.getCell(rowIndex, colIndex);\r\n if (!cell) {\r\n return;\r\n }\r\n // 操作列不处理\r\n if (cell.operation) {\r\n return;\r\n }\r\n // 超过范围值就不处理,防止跳动\r\n if (!this.isInSettingRange(cell.rowIndex, cell.colIndex)) {\r\n return;\r\n }\r\n this.ctx.setFocusCell(cell);\r\n this.setSelector(xArr, yArr);\r\n this.adjustBoundaryPosition();\r\n this.ctx.emit('moveFocus', cell);\r\n this.ctx.emit('draw');\r\n }\r\n private stopAdjustPosition() {\r\n this.adjustPositionX = '';\r\n this.adjustPositionY = '';\r\n if (this.timerX) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n if (this.timerY) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n }\r\n // 判断是否在设置范围内\r\n private isInSettingRange(rowIndex: number, colIndex: number) {\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n if (colIndex < areaMinX) {\r\n return false;\r\n }\r\n if (colIndex > areaMaxX) {\r\n return false;\r\n }\r\n if (rowIndex < areaMinY) {\r\n return false;\r\n }\r\n if (rowIndex > areaMaxY) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n /**\r\n * 调整滚动条位置,让到达边界时自动滚动\r\n */\r\n private startAdjustPosition(e: MouseEvent) {\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n let positionX = '';\r\n let positionY = '';\r\n if (offsetX < 0) {\r\n positionX = 'left';\r\n } else if (offsetX > this.ctx.body.visibleWidth) {\r\n positionX = 'right';\r\n }\r\n if (offsetY < this.ctx.header.visibleHeight) {\r\n positionY = 'top';\r\n } else if (offsetY > this.ctx.header.visibleHeight + this.ctx.body.visibleHeight) {\r\n positionY = 'bottom';\r\n }\r\n if (positionX && this.adjustPositionX !== positionX) {\r\n this.adjustPositionX = positionX;\r\n const position = positionX === 'left' ? -1 : 1;\r\n let scrollSpeedX = 10 * position; // 滚动速度\r\n if (this.timerX) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n this.timerX = setInterval(() => {\r\n // 增加滚动速度\r\n scrollSpeedX *= 1.5; // 加速因子\r\n const { scrollX } = this.ctx;\r\n const num = scrollX + scrollSpeedX;\r\n if (num < 0 || num > this.ctx.body.width) {\r\n clearInterval(this.timerX);\r\n this.timerX = 0;\r\n }\r\n this.ctx.setScrollX(num);\r\n }, 100); // 每100毫秒执行一次\r\n }\r\n\r\n if (positionY && this.adjustPositionY !== positionY) {\r\n this.adjustPositionY = positionY;\r\n const position = positionY === 'top' ? -1 : 1;\r\n let scrollSpeedY = 10 * position; // 滚动速度\r\n if (this.timerY) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n this.timerY = setInterval(() => {\r\n // 增加滚动速度\r\n scrollSpeedY *= 1.5; // 加速因子\r\n const { scrollY } = this.ctx;\r\n const num = scrollY + scrollSpeedY;\r\n if (num < 0 || num > this.ctx.body.height) {\r\n clearInterval(this.timerY);\r\n this.timerY = 0;\r\n }\r\n this.ctx.setScrollY(num);\r\n }, 100); // 每100毫秒执行一次\r\n }\r\n }\r\n /**\r\n * 调整滚动条位置,让焦点单元格始终出现在可视区域内\r\n */\r\n private adjustBoundaryPosition() {\r\n const {\r\n stageHeight,\r\n stageWidth,\r\n focusCell,\r\n fixedRightWidth,\r\n fixedLeftWidth,\r\n header,\r\n footer,\r\n body,\r\n scrollX,\r\n scrollY,\r\n config: { SCROLLER_TRACK_SIZE, FOOTER_FIXED, FOOTER_POSITION, ENABLE_MERGE_CELL_LINK },\r\n } = this.ctx;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 处理合并的单元格的移动\r\n if (ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n focusCell.updateSpanInfo();\r\n }\r\n const { drawX, drawY, width, height, fixed } = focusCell;\r\n // 加1补选中框的边框,且可以移动滚动,以为getCell是获取渲染的cell\r\n const diffLeft = fixedLeftWidth - drawX + 1;\r\n const diffRight = focusCell.drawX + width - (stageWidth - fixedRightWidth) + 1;\r\n let diffTop = header.height - drawY;\r\n // 格子大于可视高度就取可视高度,防止上下跳动\r\n let cellheight = height;\r\n if (cellheight > body.visibleHeight) {\r\n cellheight = body.visibleHeight;\r\n }\r\n let footerHeight = 0;\r\n if (FOOTER_FIXED) {\r\n if (FOOTER_POSITION === 'top') {\r\n diffTop = header.height + footer.height - drawY;\r\n } else {\r\n footerHeight = footer.visibleHeight;\r\n }\r\n }\r\n const diffBottom = drawY + cellheight - (stageHeight - footerHeight - SCROLLER_TRACK_SIZE);\r\n let _scrollX = scrollX;\r\n let _scrollY = scrollY;\r\n // fixed禁用左右横向移动\r\n if (diffRight > 0 && !fixed) {\r\n _scrollX = Math.floor(scrollX + diffRight);\r\n } else if (diffLeft > 0 && !fixed) {\r\n _scrollX = Math.floor(scrollX - diffLeft);\r\n }\r\n if (diffTop > 0) {\r\n _scrollY = Math.floor(scrollY - diffTop);\r\n } else if (diffBottom > 0) {\r\n _scrollY = Math.floor(scrollY + diffBottom);\r\n }\r\n // >1是因为上面为了可移动加1,所以这里要大于2(保险一点)\r\n if (Math.abs(scrollX - _scrollX) > 2 || Math.abs(scrollY - _scrollY) > 2) {\r\n this.ctx.adjustPositioning = true;\r\n this.ctx.setScroll(_scrollX, _scrollY);\r\n // fix:处理移动后编辑器,需要再点击一次,编辑器那边有监听\r\n this.ctx.emit('adjustBoundaryPosition', focusCell);\r\n }\r\n }\r\n destroy() {\r\n if (this.timerX) {\r\n clearTimeout(this.timerX);\r\n this.timerX = 0;\r\n }\r\n if (this.timerY) {\r\n clearTimeout(this.timerY);\r\n this.timerY = 0;\r\n }\r\n }\r\n}\r\n","import type Context from './Context';\r\nimport Cell from './Cell';\r\nimport { BeforeSetAutofillMethod, ErrorType } from './types';\r\nexport default class Autofill {\r\n private ctx: Context;\r\n private maxColRowCell: Cell | undefined;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('mousemove', (e) => {\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n this.ctx.stageElement.style.cursor = 'default';\r\n }\r\n if (this.ctx.editing) {\r\n return;\r\n }\r\n if (!this.ctx.focusCell) {\r\n return;\r\n }\r\n if (!this.maxColRowCell) {\r\n return;\r\n }\r\n const { offsetX, offsetY } = this.ctx.getOffset(e);\r\n const { colIndex, rowIndex, drawX, drawY, width, height } = this.maxColRowCell;\r\n const pointWh = 6;\r\n const offset = colIndex === this.ctx.maxColIndex || rowIndex === this.ctx.maxRowIndex ? 0 : 2;\r\n const pointX = drawX + width - pointWh + offset;\r\n const pointY = drawY + height - pointWh + offset;\r\n if (offsetX > pointX && offsetY > pointY && offsetX < pointX + pointWh && offsetY < pointY + pointWh) {\r\n // 引进到点\r\n this.ctx.stageElement.style.cursor = 'crosshair';\r\n }\r\n });\r\n this.ctx.on('cellMouseenter', (cell) => {\r\n const { xArr, yArr } = this.ctx.selector;\r\n const maxX = xArr[1];\r\n const maxY = yArr[1];\r\n const { colIndex, rowIndex } = cell;\r\n if (this.ctx.config.ENABLE_AUTOFILL && colIndex === maxX && rowIndex === maxY) {\r\n this.maxColRowCell = cell;\r\n }\r\n this.mouseenter(cell);\r\n });\r\n this.ctx.on('mousedown', () => {\r\n if (this.ctx.stageElement.style.cursor === 'crosshair') {\r\n this.setMousedown();\r\n }\r\n });\r\n this.ctx.on('mouseup', () => {\r\n this.setMouseUp();\r\n });\r\n }\r\n /**\r\n * 是否在填充\r\n * @returns\r\n */\r\n private isAutofillIng() {\r\n const { xArr, yArr } = this.ctx.selector;\r\n // 两个相等\r\n if (\r\n JSON.stringify(this.ctx.autofill.xArr) === JSON.stringify(xArr) &&\r\n JSON.stringify(this.ctx.autofill.yArr) === JSON.stringify(yArr)\r\n ) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n private setMousedown() {\r\n this.ctx.autofill.enable = true;\r\n this.ctx.autofillMove = true;\r\n }\r\n private setMouseUp() {\r\n if (!this.ctx.autofill.enable) {\r\n return;\r\n }\r\n const isAutofillIng = this.isAutofillIng();\r\n if (isAutofillIng) {\r\n this.autofillData();\r\n }\r\n this.ctx.autofill.enable = false;\r\n this.ctx.autofillMove = false;\r\n this.ctx.autofill.xArr = [-1, -1];\r\n this.ctx.autofill.yArr = [-1, -1];\r\n }\r\n private setAutofill(xArr: number[], yArr: number[]) {\r\n const { ENABLE_AUTOFILL, ENABLE_SELECTOR_SPAN_COL, ENABLE_SELECTOR_SPAN_ROW } = this.ctx.config;\r\n if (!ENABLE_AUTOFILL) {\r\n return;\r\n }\r\n let _xArr = xArr;\r\n let _yArr = yArr;\r\n if (!ENABLE_SELECTOR_SPAN_ROW) {\r\n const [rowstart] = _yArr;\r\n _yArr = [rowstart, rowstart];\r\n }\r\n if (!ENABLE_SELECTOR_SPAN_COL) {\r\n const [colstart] = _xArr;\r\n _xArr = [colstart, colstart];\r\n }\r\n // 减少渲染\r\n if (\r\n JSON.stringify(this.ctx.autofill.xArr) !== JSON.stringify(_xArr) ||\r\n JSON.stringify(this.ctx.autofill.yArr) !== JSON.stringify(_yArr)\r\n ) {\r\n // 范围值和选择器的一致\r\n const {\r\n SELECTOR_AREA_MIN_X,\r\n SELECTOR_AREA_MAX_X,\r\n SELECTOR_AREA_MIN_Y,\r\n SELECTOR_AREA_MAX_Y,\r\n SELECTOR_AREA_MAX_X_OFFSET,\r\n SELECTOR_AREA_MAX_Y_OFFSET,\r\n } = this.ctx.config;\r\n const areaMinX = SELECTOR_AREA_MIN_X;\r\n const areaMaxX = SELECTOR_AREA_MAX_X || this.ctx.maxColIndex - SELECTOR_AREA_MAX_X_OFFSET;\r\n const areaMinY = SELECTOR_AREA_MIN_Y;\r\n const areaMaxY = SELECTOR_AREA_MAX_Y || this.ctx.maxRowIndex - SELECTOR_AREA_MAX_Y_OFFSET;\r\n let [minX, maxX] = _xArr;\r\n let [minY, maxY] = _yArr;\r\n if (minX < areaMinX) {\r\n return;\r\n }\r\n if (minY < areaMinY) {\r\n return;\r\n }\r\n _xArr = [Math.max(areaMinX, minX), Math.min(areaMaxX, maxX)];\r\n _yArr = [Math.max(areaMinY, minY), Math.min(areaMaxY, maxY)];\r\n // 调整选择器的位置前回调\r\n const { BEFORE_SET_AUTOFILL_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_SET_AUTOFILL_METHOD === 'function') {\r\n const beforeSetAutofillMethod: BeforeSetAutofillMethod = BEFORE_SET_AUTOFILL_METHOD;\r\n const res = beforeSetAutofillMethod({\r\n focusCell: this.ctx.focusCell,\r\n xArr: _xArr,\r\n yArr: _yArr,\r\n });\r\n if (!res) {\r\n return;\r\n }\r\n _xArr = res.xArr;\r\n _yArr = res.yArr;\r\n }\r\n this.ctx.autofill.xArr = _xArr;\r\n this.ctx.autofill.yArr = _yArr;\r\n this.ctx.emit('setAutofill', this.ctx.autofill);\r\n this.ctx.emit('draw');\r\n }\r\n }\r\n /**\r\n * 填充数据\r\n */\r\n private async autofillData() {\r\n const rowKeyList: Set<string> = new Set();\r\n const selector = this.ctx.getSelectedData();\r\n // 存复制赋值的位置,用于剔除填充\r\n const selectorIndexMap = new Map();\r\n for (let ri = 0; ri <= selector.yArr[1] - selector.yArr[0]; ri++) {\r\n for (let ci = 0; ci <= selector.xArr[1] - selector.xArr[0]; ci++) {\r\n const rowIndex = ri + selector.yArr[0];\r\n const colIndex = ci + selector.xArr[0];\r\n selectorIndexMap.set(`${rowIndex}-${colIndex}`, true);\r\n }\r\n }\r\n const { value } = selector;\r\n const xStep = value[0].length;\r\n const yStep = value.length;\r\n const xArr = this.ctx.autofill.xArr;\r\n const yArr = this.ctx.autofill.yArr;\r\n const isOneValue = xStep === 1 && yStep === 1;\r\n // 禁用跨越填充\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.database.hasMergeCell(xArr, yArr) && !isOneValue) {\r\n const err: ErrorType = {\r\n code: 'ERR_MERGED_CELLS_AUTOFILL',\r\n message: 'Merged cells cannot span autofill data',\r\n };\r\n if (this.ctx.hasEvent('error')) {\r\n this.ctx.emit('error', err);\r\n } else {\r\n alert(err.message);\r\n }\r\n return;\r\n }\r\n let changeList = [];\r\n for (let ri = 0; ri <= yArr[1] - yArr[0]; ri++) {\r\n for (let ci = 0; ci <= xArr[1] - xArr[0]; ci++) {\r\n const colIndex = ci + xArr[0];\r\n const rowIndex = ri + yArr[0];\r\n const val = value[ri % yStep][ci % xStep];\r\n const itemValue = this.ctx.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n const selectorIndexKey = `${rowIndex}-${colIndex}`;\r\n if (itemValue && !selectorIndexMap.has(selectorIndexKey)) {\r\n const { rowKey, key } = itemValue;\r\n // 只读就跳过\r\n if (!this.ctx.database.getReadonly(rowKey, key)) {\r\n rowKeyList.add(rowKey);\r\n changeList.push({\r\n rowKey,\r\n key,\r\n value: val,\r\n row: {},\r\n });\r\n }\r\n }\r\n }\r\n }\r\n // 没有变化就返回\r\n if (!changeList.length) {\r\n return;\r\n }\r\n // 设置选择器为填充位置\r\n this.ctx.selector.xArr = this.ctx.autofill.xArr;\r\n this.ctx.selector.yArr = this.ctx.autofill.yArr;\r\n // 填充内容改变前回调\r\n const { BEFORE_AUTOFILL_DATA_METHOD } = this.ctx.config;\r\n if (typeof BEFORE_AUTOFILL_DATA_METHOD === 'function') {\r\n const beforeAutofillDataMethod = BEFORE_AUTOFILL_DATA_METHOD;\r\n const _changeList = changeList.map((item) => ({\r\n rowKey: item.rowKey,\r\n key: item.key,\r\n value: item.value,\r\n oldValue: this.ctx.database.getItemValue(item.rowKey, item.key),\r\n row: this.ctx.database.getRowDataItemForRowKey(item.rowKey),\r\n }));\r\n changeList = await beforeAutofillDataMethod(_changeList, xArr, yArr);\r\n if (changeList && !changeList.length) {\r\n return;\r\n }\r\n }\r\n // 批量设置数据,并记录历史\r\n this.ctx.batchSetItemValueByEditor(changeList, true);\r\n let rows: any[] = [];\r\n rowKeyList.forEach((rowKey) => {\r\n rows.push(this.ctx.database.getRowDataItemForRowKey(rowKey));\r\n });\r\n this.ctx.emit('autofillChange', changeList, rows);\r\n }\r\n private mouseenter(cell: Cell) {\r\n if (['index', 'selection', 'index-selection'].includes(cell.type)) {\r\n return;\r\n }\r\n const { selector, autofill } = this.ctx;\r\n if (this.ctx.mousedown && selector.enable && autofill.enable) {\r\n const { rowIndex, colIndex } = cell;\r\n const xArr = selector.xArr.slice();\r\n const yArr = selector.yArr.slice();\r\n if (rowIndex >= selector.yArr[0] && rowIndex <= selector.yArr[1]) {\r\n if (colIndex > selector.xArr[1]) {\r\n xArr.splice(1, 1, colIndex);\r\n } else if (colIndex < selector.xArr[0]) {\r\n xArr.splice(0, 1, colIndex);\r\n }\r\n } else if (rowIndex > selector.yArr[1]) {\r\n yArr.splice(1, 1, rowIndex);\r\n } else if (rowIndex < selector.yArr[0]) {\r\n yArr.splice(0, 1, rowIndex);\r\n }\r\n this.setAutofill(xArr, yArr);\r\n }\r\n }\r\n destroy() {}\r\n}\r\n","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n x: v,\n y: v\n});\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n start: 'end',\n end: 'start'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\nconst yAxisSides = /*#__PURE__*/new Set(['top', 'bottom']);\nfunction getSideAxis(placement) {\n return yAxisSides.has(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const length = getAxisLength(alignmentAxis);\n let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\nconst lrPlacement = ['left', 'right'];\nconst rlPlacement = ['right', 'left'];\nconst tbPlacement = ['top', 'bottom'];\nconst btPlacement = ['bottom', 'top'];\nfunction getSideList(side, isStart, rtl) {\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rlPlacement : lrPlacement;\n return isStart ? lrPlacement : rlPlacement;\n case 'left':\n case 'right':\n return isStart ? tbPlacement : btPlacement;\n default:\n return [];\n }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n const alignment = getAlignment(placement);\n let list = getSideList(getSide(placement), direction === 'start', rtl);\n if (alignment) {\n list = list.map(side => side + \"-\" + alignment);\n if (flipAlignment) {\n list = list.concat(list.map(getOppositeAlignmentPlacement));\n }\n }\n return list;\n}\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\nfunction getPaddingObject(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\nfunction rectToClientRect(rect) {\n const {\n x,\n y,\n width,\n height\n } = rect;\n return {\n width,\n height,\n top: y,\n left: x,\n right: x + width,\n bottom: y + height,\n x,\n y\n };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","import { getSideAxis, getAlignmentAxis, getAxisLength, getSide, getAlignment, evaluate, getPaddingObject, rectToClientRect, min, clamp, placements, getAlignmentSides, getOppositeAlignmentPlacement, getOppositePlacement, getExpandedPlacements, getOppositeAxisPlacements, sides, max, getOppositeAxis } from '@floating-ui/utils';\nexport { rectToClientRect } from '@floating-ui/utils';\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const sideAxis = getSideAxis(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const alignLength = getAxisLength(alignmentAxis);\n const side = getSide(placement);\n const isVertical = sideAxis === 'y';\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const commonAlign = reference[alignLength] / 2 - floating[alignLength] / 2;\n let coords;\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n switch (getAlignment(placement)) {\n case 'start':\n coords[alignmentAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n case 'end':\n coords[alignmentAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const validMiddleware = middleware.filter(Boolean);\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let resetCount = 0;\n for (let i = 0; i < validMiddleware.length; i++) {\n const {\n name,\n fn\n } = validMiddleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = {\n ...middlewareData,\n [name]: {\n ...middlewareData[name],\n ...data\n }\n };\n if (reset && resetCount <= 50) {\n resetCount++;\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n i = -1;\n }\n }\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(state, options) {\n var _await$platform$isEle;\n if (options === void 0) {\n options = {};\n }\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = state;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = evaluate(options, state);\n const paddingObject = getPaddingObject(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const rect = elementContext === 'floating' ? {\n x,\n y,\n width: rects.floating.width,\n height: rects.floating.height\n } : rects.reference;\n const offsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating));\n const offsetScale = (await (platform.isElement == null ? void 0 : platform.isElement(offsetParent))) ? (await (platform.getScale == null ? void 0 : platform.getScale(offsetParent))) || {\n x: 1,\n y: 1\n } : {\n x: 1,\n y: 1\n };\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n elements,\n rect,\n offsetParent,\n strategy\n }) : rect);\n return {\n top: (clippingClientRect.top - elementClientRect.top + paddingObject.top) / offsetScale.y,\n bottom: (elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom) / offsetScale.y,\n left: (clippingClientRect.left - elementClientRect.left + paddingObject.left) / offsetScale.x,\n right: (elementClientRect.right - clippingClientRect.right + paddingObject.right) / offsetScale.x\n };\n}\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n platform,\n elements,\n middlewareData\n } = state;\n // Since `element` is required, we don't Partial<> the type.\n const {\n element,\n padding = 0\n } = evaluate(options, state) || {};\n if (element == null) {\n return {};\n }\n const paddingObject = getPaddingObject(padding);\n const coords = {\n x,\n y\n };\n const axis = getAlignmentAxis(placement);\n const length = getAxisLength(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const isYAxis = axis === 'y';\n const minProp = isYAxis ? 'top' : 'left';\n const maxProp = isYAxis ? 'bottom' : 'right';\n const clientProp = isYAxis ? 'clientHeight' : 'clientWidth';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? arrowOffsetParent[clientProp] : 0;\n\n // DOM platform can return `window` as the `offsetParent`.\n if (!clientSize || !(await (platform.isElement == null ? void 0 : platform.isElement(arrowOffsetParent)))) {\n clientSize = elements.floating[clientProp] || rects.floating[length];\n }\n const centerToReference = endDiff / 2 - startDiff / 2;\n\n // If the padding is large enough that it causes the arrow to no longer be\n // centered, modify the padding so that it is centered.\n const largestPossiblePadding = clientSize / 2 - arrowDimensions[length] / 2 - 1;\n const minPadding = min(paddingObject[minProp], largestPossiblePadding);\n const maxPadding = min(paddingObject[maxProp], largestPossiblePadding);\n\n // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds.\n const min$1 = minPadding;\n const max = clientSize - arrowDimensions[length] - maxPadding;\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = clamp(min$1, center, max);\n\n // If the reference is small enough that the arrow's padding causes it to\n // to point to nothing for an aligned placement, adjust the offset of the\n // floating element itself. To ensure `shift()` continues to take action,\n // a single reset is performed when this is true.\n const shouldAddOffset = !middlewareData.arrow && getAlignment(placement) != null && center !== offset && rects.reference[length] / 2 - (center < min$1 ? minPadding : maxPadding) - arrowDimensions[length] / 2 < 0;\n const alignmentOffset = shouldAddOffset ? center < min$1 ? center - min$1 : center - max : 0;\n return {\n [axis]: coords[axis] + alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset - alignmentOffset,\n ...(shouldAddOffset && {\n alignmentOffset\n })\n },\n reset: shouldAddOffset\n };\n }\n});\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n return true;\n });\n}\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'autoPlacement',\n options,\n async fn(state) {\n var _middlewareData$autoP, _middlewareData$autoP2, _placementsThatFitOnE;\n const {\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = state;\n const {\n crossAxis = false,\n alignment,\n allowedPlacements = placements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n const placements$1 = alignment !== undefined || allowedPlacements === placements ? getPlacementList(alignment || null, autoAlignment, allowedPlacements) : allowedPlacements;\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const currentIndex = ((_middlewareData$autoP = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP.index) || 0;\n const currentPlacement = placements$1[currentIndex];\n if (currentPlacement == null) {\n return {};\n }\n const alignmentSides = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n\n // Make `computeCoords` start from the right place.\n if (placement !== currentPlacement) {\n return {\n reset: {\n placement: placements$1[0]\n }\n };\n }\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[alignmentSides[0]], overflow[alignmentSides[1]]];\n const allOverflows = [...(((_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.overflows) || []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements$1[currentIndex + 1];\n\n // There are more placements to check.\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n const placementsSortedByMostSpace = allOverflows.map(d => {\n const alignment = getAlignment(d.placement);\n return [d.placement, alignment && crossAxis ?\n // Check along the mainAxis and main crossAxis side.\n d.overflows.slice(0, 2).reduce((acc, v) => acc + v, 0) :\n // Check only the mainAxis.\n d.overflows[0], d.overflows];\n }).sort((a, b) => a[1] - b[1]);\n const placementsThatFitOnEachSide = placementsSortedByMostSpace.filter(d => d[2].slice(0,\n // Aligned placements should not check their opposite crossAxis\n // side.\n getAlignment(d[0]) ? 2 : 3).every(v => v <= 0));\n const resetPlacement = ((_placementsThatFitOnE = placementsThatFitOnEachSide[0]) == null ? void 0 : _placementsThatFitOnE[0]) || placementsSortedByMostSpace[0][0];\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n return {};\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'flip',\n options,\n async fn(state) {\n var _middlewareData$arrow, _middlewareData$flip;\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n fallbackAxisSideDirection = 'none',\n flipAlignment = true,\n ...detectOverflowOptions\n } = evaluate(options, state);\n\n // If a reset by the arrow was caused due to an alignment offset being\n // added, we should skip any logic now since `flip()` has already done its\n // work.\n // https://github.com/floating-ui/floating-ui/issues/2549#issuecomment-1719601643\n if ((_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n const side = getSide(placement);\n const initialSideAxis = getSideAxis(initialPlacement);\n const isBasePlacement = getSide(initialPlacement) === initialPlacement;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const hasFallbackAxisSideDirection = fallbackAxisSideDirection !== 'none';\n if (!specifiedFallbackPlacements && hasFallbackAxisSideDirection) {\n fallbackPlacements.push(...getOppositeAxisPlacements(initialPlacement, flipAlignment, fallbackAxisSideDirection, rtl));\n }\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n if (checkCrossAxis) {\n const sides = getAlignmentSides(placement, rects, rtl);\n overflows.push(overflow[sides[0]], overflow[sides[1]]);\n }\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }];\n\n // One or more sides is overflowing.\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip2, _overflowsData$filter;\n const nextIndex = (((_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) || 0) + 1;\n const nextPlacement = placements[nextIndex];\n if (nextPlacement) {\n const ignoreCrossAxisOverflow = checkCrossAxis === 'alignment' ? initialSideAxis !== getSideAxis(nextPlacement) : false;\n if (!ignoreCrossAxisOverflow ||\n // We leave the current main axis only if every placement on that axis\n // overflows the main axis.\n overflowsData.every(d => getSideAxis(d.placement) === initialSideAxis ? d.overflows[0] > 0 : true)) {\n // Try next placement and re-run the lifecycle.\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n }\n\n // First, find the candidates that fit on the mainAxis side of overflow,\n // then find the placement that fits the best on the main crossAxis side.\n let resetPlacement = (_overflowsData$filter = overflowsData.filter(d => d.overflows[0] <= 0).sort((a, b) => a.overflows[1] - b.overflows[1])[0]) == null ? void 0 : _overflowsData$filter.placement;\n\n // Otherwise fallback.\n if (!resetPlacement) {\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$filter2;\n const placement = (_overflowsData$filter2 = overflowsData.filter(d => {\n if (hasFallbackAxisSideDirection) {\n const currentSideAxis = getSideAxis(d.placement);\n return currentSideAxis === initialSideAxis ||\n // Create a bias to the `y` side axis due to horizontal\n // reading directions favoring greater width.\n currentSideAxis === 'y';\n }\n return true;\n }).map(d => [d.placement, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$filter2[0];\n if (placement) {\n resetPlacement = placement;\n }\n break;\n }\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n }\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n return {};\n }\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'hide',\n options,\n async fn(state) {\n const {\n rects\n } = state;\n const {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = evaluate(options, state);\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n case 'escaped':\n {\n const overflow = await detectOverflow(state, {\n ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n default:\n {\n return {};\n }\n }\n }\n };\n};\n\nfunction getBoundingRect(rects) {\n const minX = min(...rects.map(rect => rect.left));\n const minY = min(...rects.map(rect => rect.top));\n const maxX = max(...rects.map(rect => rect.right));\n const maxY = max(...rects.map(rect => rect.bottom));\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n}\nfunction getRectsByLine(rects) {\n const sortedRects = rects.slice().sort((a, b) => a.y - b.y);\n const groups = [];\n let prevRect = null;\n for (let i = 0; i < sortedRects.length; i++) {\n const rect = sortedRects[i];\n if (!prevRect || rect.y - prevRect.y > prevRect.height / 2) {\n groups.push([rect]);\n } else {\n groups[groups.length - 1].push(rect);\n }\n prevRect = rect;\n }\n return groups.map(rect => rectToClientRect(getBoundingRect(rect)));\n}\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'inline',\n options,\n async fn(state) {\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = state;\n // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n const {\n padding = 2,\n x,\n y\n } = evaluate(options, state);\n const nativeClientRects = Array.from((await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) || []);\n const clientRects = getRectsByLine(nativeClientRects);\n const fallback = rectToClientRect(getBoundingRect(nativeClientRects));\n const paddingObject = getPaddingObject(padding);\n function getBoundingClientRect() {\n // There are two rects and they are disjoined.\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n // Find the first rect in which the point is fully inside.\n return clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom) || fallback;\n }\n\n // There are 2 or more connected rects.\n if (clientRects.length >= 2) {\n if (getSideAxis(placement) === 'y') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n return fallback;\n }\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n return {};\n }\n };\n};\n\nconst originSides = /*#__PURE__*/new Set(['left', 'top']);\n\n// For type backwards-compatibility, the `OffsetOptions` type was also\n// Derivable.\n\nasync function convertValueToCoords(state, options) {\n const {\n placement,\n platform,\n elements\n } = state;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getSideAxis(placement) === 'y';\n const mainAxisMulti = originSides.has(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = evaluate(options, state);\n\n // eslint-disable-next-line prefer-const\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: rawValue.mainAxis || 0,\n crossAxis: rawValue.crossAxis || 0,\n alignmentAxis: rawValue.alignmentAxis\n };\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = function (options) {\n if (options === void 0) {\n options = 0;\n }\n return {\n name: 'offset',\n options,\n async fn(state) {\n var _middlewareData$offse, _middlewareData$arrow;\n const {\n x,\n y,\n placement,\n middlewareData\n } = state;\n const diffCoords = await convertValueToCoords(state, options);\n\n // If the placement is the same and the arrow caused an alignment offset\n // then we don't need to change the positioning coordinates.\n if (placement === ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse.placement) && (_middlewareData$arrow = middlewareData.arrow) != null && _middlewareData$arrow.alignmentOffset) {\n return {};\n }\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: {\n ...diffCoords,\n placement\n }\n };\n }\n };\n};\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'shift',\n options,\n async fn(state) {\n const {\n x,\n y,\n placement\n } = state;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const crossAxis = getSideAxis(getSide(placement));\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = clamp(min, mainAxisCoord, max);\n }\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = clamp(min, crossAxisCoord, max);\n }\n const limitedCoords = limiter.fn({\n ...state,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return {\n ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y,\n enabled: {\n [mainAxis]: checkMainAxis,\n [crossAxis]: checkCrossAxis\n }\n }\n };\n }\n };\n};\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n options,\n fn(state) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = state;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = evaluate(options, state);\n const coords = {\n x,\n y\n };\n const crossAxis = getSideAxis(placement);\n const mainAxis = getOppositeAxis(crossAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = evaluate(offset, state);\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2;\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = originSides.has(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? ((_middlewareData$offse = middlewareData.offset) == null ? void 0 : _middlewareData$offse[crossAxis]) || 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : ((_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) || 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n };\n};\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n return {\n name: 'size',\n options,\n async fn(state) {\n var _state$middlewareData, _state$middlewareData2;\n const {\n placement,\n rects,\n platform,\n elements\n } = state;\n const {\n apply = () => {},\n ...detectOverflowOptions\n } = evaluate(options, state);\n const overflow = await detectOverflow(state, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isYAxis = getSideAxis(placement) === 'y';\n const {\n width,\n height\n } = rects.floating;\n let heightSide;\n let widthSide;\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n const maximumClippingHeight = height - overflow.top - overflow.bottom;\n const maximumClippingWidth = width - overflow.left - overflow.right;\n const overflowAvailableHeight = min(height - overflow[heightSide], maximumClippingHeight);\n const overflowAvailableWidth = min(width - overflow[widthSide], maximumClippingWidth);\n const noShift = !state.middlewareData.shift;\n let availableHeight = overflowAvailableHeight;\n let availableWidth = overflowAvailableWidth;\n if ((_state$middlewareData = state.middlewareData.shift) != null && _state$middlewareData.enabled.x) {\n availableWidth = maximumClippingWidth;\n }\n if ((_state$middlewareData2 = state.middlewareData.shift) != null && _state$middlewareData2.enabled.y) {\n availableHeight = maximumClippingHeight;\n }\n if (noShift && !alignment) {\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n if (isYAxis) {\n availableWidth = width - 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right));\n } else {\n availableHeight = height - 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom));\n }\n }\n await apply({\n ...state,\n availableWidth,\n availableHeight\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n if (width !== nextDimensions.width || height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n return {};\n }\n };\n};\n\nexport { arrow, autoPlacement, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, shift, size };\n","function hasWindow() {\n return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n if (isNode(node)) {\n return (node.nodeName || '').toLowerCase();\n }\n // Mocked nodes in testing environments may not be instances of Node. By\n // returning `#document` an infinite loop won't occur.\n // https://github.com/floating-ui/floating-ui/issues/2317\n return '#document';\n}\nfunction getWindow(node) {\n var _node$ownerDocument;\n return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n var _ref;\n return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n return false;\n }\n return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nconst invalidOverflowDisplayValues = /*#__PURE__*/new Set(['inline', 'contents']);\nfunction isOverflowElement(element) {\n const {\n overflow,\n overflowX,\n overflowY,\n display\n } = getComputedStyle(element);\n return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !invalidOverflowDisplayValues.has(display);\n}\nconst tableElements = /*#__PURE__*/new Set(['table', 'td', 'th']);\nfunction isTableElement(element) {\n return tableElements.has(getNodeName(element));\n}\nconst topLayerSelectors = [':popover-open', ':modal'];\nfunction isTopLayer(element) {\n return topLayerSelectors.some(selector => {\n try {\n return element.matches(selector);\n } catch (_e) {\n return false;\n }\n });\n}\nconst transformProperties = ['transform', 'translate', 'scale', 'rotate', 'perspective'];\nconst willChangeValues = ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter'];\nconst containValues = ['paint', 'layout', 'strict', 'content'];\nfunction isContainingBlock(elementOrCss) {\n const webkit = isWebKit();\n const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n return transformProperties.some(value => css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || willChangeValues.some(value => (css.willChange || '').includes(value)) || containValues.some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else if (isTopLayer(currentNode)) {\n return null;\n }\n currentNode = getParentNode(currentNode);\n }\n return null;\n}\nfunction isWebKit() {\n if (typeof CSS === 'undefined' || !CSS.supports) return false;\n return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nconst lastTraversableNodeNames = /*#__PURE__*/new Set(['html', 'body', '#document']);\nfunction isLastTraversableNode(node) {\n return lastTraversableNodeNames.has(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.scrollX,\n scrollTop: element.scrollY\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n const frameElement = getFrameElement(win);\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n }\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\nfunction getFrameElement(win) {\n return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","import { rectToClientRect, arrow as arrow$1, autoPlacement as autoPlacement$1, detectOverflow as detectOverflow$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\n// If <html> has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n const leftScroll = getNodeScroll(element).scrollLeft;\n if (!rect) {\n return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n }\n return rect.left + leftScroll;\n}\n\nfunction getHTMLOffset(documentElement, scroll, ignoreScrollbarX) {\n if (ignoreScrollbarX === void 0) {\n ignoreScrollbarX = false;\n }\n const htmlRect = documentElement.getBoundingClientRect();\n const x = htmlRect.left + scroll.scrollLeft - (ignoreScrollbarX ? 0 :\n // RTL <body> scrollbar.\n getWindowScrollBarX(documentElement, htmlRect));\n const y = htmlRect.top + scroll.scrollTop;\n return {\n x,\n y\n };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n elements,\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isFixed = strategy === 'fixed';\n const documentElement = getDocumentElement(offsetParent);\n const topLayer = elements ? isTopLayer(elements.floating) : false;\n if (offsetParent === documentElement || topLayer && isFixed) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = createCoords(1);\n const offsets = createCoords(0);\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll, true) : createCoords(0);\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nconst absoluteOrFixed = /*#__PURE__*/new Set(['absolute', 'fixed']);\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const visualOffsets = getVisualOffsets(element);\n rect = {\n x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y,\n width: clippingAncestor.width,\n height: clippingAncestor.height\n };\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && absoluteOrFixed.has(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n\n // If the <body> scrollbar appears on the left (e.g. RTL systems). Use\n // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n function setLeftRTLScrollbarOffset() {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n setLeftRTLScrollbarOffset();\n }\n }\n if (isFixed && !isOffsetParentAnElement && documentElement) {\n setLeftRTLScrollbarOffset();\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n let rawOffsetParent = element.offsetParent;\n\n // Firefox returns the <html> element as the offsetParent if it's non-static,\n // while Chrome and Safari return the <body> element. The <body> element must\n // be used to perform the correct calculations even if the <html> element is\n // non-static.\n if (getDocumentElement(element) === rawOffsetParent) {\n rawOffsetParent = rawOffsetParent.ownerDocument.body;\n }\n return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\nfunction rectsAreEqual(a, b) {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n let io = null;\n let timeoutId;\n const root = getDocumentElement(element);\n function cleanup() {\n var _io;\n clearTimeout(timeoutId);\n (_io = io) == null || _io.disconnect();\n io = null;\n }\n function refresh(skip, threshold) {\n if (skip === void 0) {\n skip = false;\n }\n if (threshold === void 0) {\n threshold = 1;\n }\n cleanup();\n const elementRectForRootMargin = element.getBoundingClientRect();\n const {\n left,\n top,\n width,\n height\n } = elementRectForRootMargin;\n if (!skip) {\n onMove();\n }\n if (!width || !height) {\n return;\n }\n const insetTop = floor(top);\n const insetRight = floor(root.clientWidth - (left + width));\n const insetBottom = floor(root.clientHeight - (top + height));\n const insetLeft = floor(left);\n const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n const options = {\n rootMargin,\n threshold: max(0, min(1, threshold)) || 1\n };\n let isFirstUpdate = true;\n function handleObserve(entries) {\n const ratio = entries[0].intersectionRatio;\n if (ratio !== threshold) {\n if (!isFirstUpdate) {\n return refresh();\n }\n if (!ratio) {\n // If the reference is clipped, the ratio is 0. Throttle the refresh\n // to prevent an infinite loop of updates.\n timeoutId = setTimeout(() => {\n refresh(false, 1e-7);\n }, 1000);\n } else {\n refresh(false, ratio);\n }\n }\n if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n // It's possible that even though the ratio is reported as 1, the\n // element is not actually fully within the IntersectionObserver's root\n // area anymore. This can happen under performance constraints. This may\n // be a bug in the browser's IntersectionObserver implementation. To\n // work around this, we compare the element's bounding rect now with\n // what it was at the time we created the IntersectionObserver. If they\n // are not equal then the element moved, so we refresh.\n refresh();\n }\n isFirstUpdate = false;\n }\n\n // Older browsers don't support a `document` as the root and will throw an\n // error.\n try {\n io = new IntersectionObserver(handleObserve, {\n ...options,\n // Handle <iframe>s\n root: root.ownerDocument\n });\n } catch (_e) {\n io = new IntersectionObserver(handleObserve, options);\n }\n io.observe(element);\n }\n refresh(true);\n return cleanup;\n}\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * Should only be called when the floating element is mounted on the DOM or\n * visible on the screen.\n * @returns cleanup function that should be invoked when the floating element is\n * removed from the DOM or hidden from the screen.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n const {\n ancestorScroll = true,\n ancestorResize = true,\n elementResize = typeof ResizeObserver === 'function',\n layoutShift = typeof IntersectionObserver === 'function',\n animationFrame = false\n } = options;\n const referenceEl = unwrapElement(reference);\n const ancestors = ancestorScroll || ancestorResize ? [...(referenceEl ? getOverflowAncestors(referenceEl) : []), ...getOverflowAncestors(floating)] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n const cleanupIo = referenceEl && layoutShift ? observeMove(referenceEl, update) : null;\n let reobserveFrame = -1;\n let resizeObserver = null;\n if (elementResize) {\n resizeObserver = new ResizeObserver(_ref => {\n let [firstEntry] = _ref;\n if (firstEntry && firstEntry.target === referenceEl && resizeObserver) {\n // Prevent update loops when using the `size` middleware.\n // https://github.com/floating-ui/floating-ui/issues/1740\n resizeObserver.unobserve(floating);\n cancelAnimationFrame(reobserveFrame);\n reobserveFrame = requestAnimationFrame(() => {\n var _resizeObserver;\n (_resizeObserver = resizeObserver) == null || _resizeObserver.observe(floating);\n });\n }\n update();\n });\n if (referenceEl && !animationFrame) {\n resizeObserver.observe(referenceEl);\n }\n resizeObserver.observe(floating);\n }\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n if (animationFrame) {\n frameLoop();\n }\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n if (prevRefRect && !rectsAreEqual(prevRefRect, nextRefRect)) {\n update();\n }\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n update();\n return () => {\n var _resizeObserver2;\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n cleanupIo == null || cleanupIo();\n (_resizeObserver2 = resizeObserver) == null || _resizeObserver2.disconnect();\n resizeObserver = null;\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary on each side.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nconst detectOverflow = detectOverflow$1;\n\n/**\n * Modifies the placement by translating the floating element along the\n * specified axes.\n * A number (shorthand for `mainAxis` or distance), or an axes configuration\n * object may be passed.\n * @see https://floating-ui.com/docs/offset\n */\nconst offset = offset$1;\n\n/**\n * Optimizes the visibility of the floating element by choosing the placement\n * that has the most space available automatically, without needing to specify a\n * preferred placement. Alternative to `flip`.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = autoPlacement$1;\n\n/**\n * Optimizes the visibility of the floating element by shifting it in order to\n * keep it in view when it will overflow the clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = shift$1;\n\n/**\n * Optimizes the visibility of the floating element by flipping the `placement`\n * in order to keep it in view when the preferred placement(s) will overflow the\n * clipping boundary. Alternative to `autoPlacement`.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = flip$1;\n\n/**\n * Provides data that allows you to change the size of the floating element —\n * for instance, prevent it from overflowing the clipping boundary or match the\n * width of the reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = size$1;\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = hide$1;\n\n/**\n * Provides data to position an inner element of the floating element so that it\n * appears centered to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = arrow$1;\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = inline$1;\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = limitShift$1;\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a given reference element.\n */\nconst computePosition = (reference, floating, options) => {\n // This caches the expensive `getClippingElementAncestors` function so that\n // multiple lifecycle resets re-use the same result. It only lives for a\n // single call. If other functions become expensive, we can add them as well.\n const cache = new Map();\n const mergedOptions = {\n platform,\n ...options\n };\n const platformWithCache = {\n ...mergedOptions.platform,\n _c: cache\n };\n return computePosition$1(reference, floating, {\n ...mergedOptions,\n platform: platformWithCache\n });\n};\n\nexport { arrow, autoPlacement, autoUpdate, computePosition, detectOverflow, flip, hide, inline, limitShift, offset, platform, shift, size };\n","import Cell from './Cell';\nimport Context from './Context';\nimport { computePosition, offset, arrow, flip, shift } from '@floating-ui/dom';\nexport default class Tooltip {\n private ctx: Context;\n private enable = false;\n private contentEl: HTMLDivElement;\n private floatingEl: HTMLDivElement;\n private arrowEl: HTMLDivElement;\n constructor(ctx: Context) {\n this.ctx = ctx;\n const { TOOLTIP_BG_COLOR, TOOLTIP_TEXT_COLOR, TOOLTIP_ZINDEX, TOOLTIP_CUSTOM_STYLE, CSS_PREFIX } =\n this.ctx.config;\n this.contentEl = document.createElement('div');\n this.arrowEl = document.createElement('div');\n this.floatingEl = document.createElement('div');\n this.floatingEl.className = `${CSS_PREFIX}-tooltip`;\n this.contentEl.className = `${CSS_PREFIX}-tooltip-content`;\n this.arrowEl.className = `${CSS_PREFIX}-tooltip-arrow`;\n const floatingStyle = {\n display: 'none',\n position: 'absolute',\n background: TOOLTIP_BG_COLOR,\n color: TOOLTIP_TEXT_COLOR,\n boxSizing: 'border-box',\n zIndex: TOOLTIP_ZINDEX,\n padding: '8px',\n borderRadius: `4px`,\n fontSize: `12px`,\n ...TOOLTIP_CUSTOM_STYLE,\n };\n const arrowStyle = {\n position: 'absolute',\n width: '10px',\n height: '10px',\n background: floatingStyle.background,\n backgroundColor: floatingStyle.backgroundColor,\n transform: 'rotate(45deg)',\n zIndex: floatingStyle.zIndex,\n };\n Object.assign(this.arrowEl.style, arrowStyle);\n Object.assign(this.floatingEl.style, floatingStyle);\n this.floatingEl.appendChild(this.contentEl);\n this.floatingEl.appendChild(this.arrowEl);\n this.ctx.containerElement.appendChild(this.floatingEl);\n this.init();\n }\n private init() {\n this.floatingEl.addEventListener('mouseleave', () => {\n this.hide();\n });\n this.ctx.on('mouseout', (e) => {\n if (this.floatingEl.contains(e.relatedTarget as Node)) {\n return;\n }\n this.hide();\n });\n this.ctx.on('onScroll', () => {\n this.hide();\n });\n this.ctx.on('startEdit', () => {\n this.hide();\n });\n this.ctx.on('visibleCellHoverChange', (cell, e) => {\n const contains = this.floatingEl.contains(e.target);\n if (contains) {\n return;\n }\n // 有移除或者有错误message时显示\n if (cell.ellipsis || cell.message) {\n this.show(cell);\n }\n });\n this.ctx.on('visibleCellMouseleave', (_, e) => {\n const contains = this.floatingEl.contains(e.target);\n if (contains) {\n return;\n }\n this.hide();\n });\n this.ctx.on('cellHeaderMouseleave', (_, e) => {\n const contains = this.floatingEl.contains(e.target);\n if (contains) {\n return;\n }\n this.hide();\n });\n this.ctx.on('cellHeaderHoverChange', (cell, e) => {\n const contains = this.floatingEl.contains(e.target);\n if (contains) {\n return;\n }\n if (cell.ellipsis) {\n this.show(cell);\n }\n });\n }\n private show(cell: Cell) {\n // 如果没有设置overflowTooltipShow=true,则不显示\n if (!cell.overflowTooltipShow) {\n return;\n }\n // 如果是鼠标按下状态,则不显示\n if (this.ctx.mousedown) {\n return;\n }\n this.floatingEl.style.display = 'block';\n let text = cell.getText();\n // 如果有message,则显示message\n if (cell.message) {\n text = cell.message;\n }\n const targetRect = this.ctx.containerElement.getBoundingClientRect();\n if (!targetRect) {\n return;\n }\n this.enable = true;\n // 设置最大宽度\n this.contentEl.style.maxWidth = `${cell.overflowTooltipMaxWidth || 500}px`;\n this.contentEl.style.minWidth = '100px';\n this.contentEl.style.width = '100%';\n this.contentEl.style.display = 'inline-block';\n this.contentEl.style.wordBreak = 'break-all';\n this.contentEl.style.lineHeight = '1.5';\n this.contentEl.innerText = text;\n const cellX = cell.drawX + targetRect.x;\n const cellY = cell.drawY + targetRect.y;\n // 这个是相对于视口的位置\n const virtualEl = {\n getBoundingClientRect() {\n return {\n width: cell.visibleWidth,\n height: cell.visibleHeight,\n x: cellX,\n y: cellY,\n left: cellX,\n right: cellX + cell.visibleWidth,\n top: cellY,\n bottom: cellY + cell.visibleHeight,\n };\n },\n };\n\n computePosition(virtualEl, this.floatingEl, {\n placement: cell.overflowTooltipPlacement,\n middleware: [shift(), flip(), offset(6), arrow({ element: this.arrowEl })],\n }).then((val) => {\n const { x, y, placement, middlewareData } = val;\n Object.assign(this.floatingEl.style, {\n top: `${y}px`,\n left: `${x}px`,\n });\n if (middlewareData.arrow) {\n const arrow = middlewareData.arrow;\n if (['left', 'left-start', 'left-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `${arrow.y}px`,\n bottom: '',\n left: '',\n right: `-5px`,\n });\n } else if (['right', 'right-start', 'right-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `${arrow.y}px`,\n bottom: '',\n left: `-5px`,\n right: '',\n });\n } else if (['bottom', 'bottom-start', 'bottom-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: `-5px`,\n bottom: '',\n left: `${arrow.x}px`,\n right: '',\n });\n } else if (['top', 'top-start', 'top-end'].includes(placement)) {\n Object.assign(this.arrowEl.style, {\n top: '',\n bottom: `-5px`,\n left: `${arrow.x}px`,\n right: '',\n });\n }\n }\n });\n }\n hide() {\n if (!this.enable) {\n return;\n }\n this.enable = false;\n this.floatingEl.style.display = 'none';\n }\n destroy() {\n this.contentEl.remove();\n this.arrowEl.remove();\n this.floatingEl.remove();\n }\n}\n","import type Cell from './Cell';\r\nimport type Context from './Context';\r\n\r\nexport default class Editor {\r\n private editorEl!: HTMLDivElement;\r\n private inputEl!: HTMLTextAreaElement;\r\n private enable = false;\r\n private cellTarget: Cell | null = null;\r\n private selectorArrStr = '';\r\n ctx: Context;\r\n private drawY = 0;\r\n private drawX = 0;\r\n private cancel = false;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n this.initTextEditor();\r\n this.init();\r\n }\r\n private init() {\r\n // 容器不聚焦,清除选择器\r\n this.ctx.on('outsideMousedown', () => {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n if (this.cellTarget.editorType === 'text') {\r\n this.clearEditor();\r\n }\r\n });\r\n this.ctx.on('moveFocus', (cell) => {\r\n this.cellTarget = cell;\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n });\r\n // 滚动时,结束编辑\r\n this.ctx.on('onScroll', () => {\r\n if (this.enable) {\r\n this.doneEdit();\r\n }\r\n });\r\n this.ctx.on('cellHeaderMousedown', () => {\r\n if (this.enable) {\r\n this.doneEdit();\r\n }\r\n this.cellTarget = null;\r\n });\r\n this.ctx.on('hoverIconClick', (cell) => {\r\n // 没有编辑器就不进入编辑模式\r\n if (cell.editorType === 'none') {\r\n return;\r\n }\r\n this.editCell(cell.rowIndex, cell.colIndex);\r\n });\r\n this.ctx.on('keydown', (e) => {\r\n if (!this.ctx.isTarget(e)) {\r\n return;\r\n }\r\n if (!this.ctx.focusCell) {\r\n return;\r\n }\r\n if (e.code === 'Escape' && this.ctx.editing) {\r\n this.cancel = true;\r\n const { focusCell } = this.ctx;\r\n if (focusCell) {\r\n this.ctx.emit('setSelectorCell', focusCell);\r\n this.cellTarget = focusCell;\r\n }\r\n this.doneEdit();\r\n return;\r\n }\r\n if ((e.altKey || e.metaKey) && e.code === 'Enter' && this.ctx.editing && this.inputEl) {\r\n e.preventDefault();\r\n const cursorPos = this.inputEl.selectionStart; // 获取光标位置\r\n const textBefore = this.inputEl.value.substring(0, cursorPos); // 光标前的文本\r\n const textAfter = this.inputEl.value.substring(cursorPos); // 光标后的文本\r\n // 更新 textarea 的内容,在光标位置插入换行符\r\n this.inputEl.value = textBefore + '\\n' + textAfter;\r\n // 设置光标位置到新行\r\n this.inputEl.selectionStart = this.inputEl.selectionEnd = cursorPos + 1;\r\n this.autoSize();\r\n return;\r\n }\r\n if (e.code === 'Tab' && this.ctx.editing) {\r\n e.preventDefault();\r\n this.doneEdit();\r\n if (e.shiftKey) {\r\n this.ctx.emit('setMoveFocus', 'LEFT');\r\n return;\r\n }\r\n this.ctx.emit('setMoveFocus', 'RIGHT');\r\n return;\r\n }\r\n if (e.code === 'Enter' && this.ctx.editing) {\r\n e.preventDefault();\r\n this.doneEdit();\r\n if (e.shiftKey) {\r\n this.ctx.emit('setMoveFocus', 'TOP');\r\n return;\r\n }\r\n this.ctx.emit('setMoveFocus', 'BOTTOM');\r\n return;\r\n }\r\n if (e.code === 'Enter' && !this.ctx.editing) {\r\n e.preventDefault();\r\n this.startEdit();\r\n return;\r\n }\r\n const key = e.key;\r\n const isCtrl = e.ctrlKey;\r\n const isAlt = e.altKey;\r\n const isShift = e.shiftKey;\r\n const isMeta = e.metaKey;\r\n // 检测是否按下了组合键(Ctrl、Alt、Shift、Meta)\r\n if (isCtrl || isAlt || isShift || isMeta) {\r\n return;\r\n }\r\n // 检测功能键(比如 F1, Escape,Tab 等)\r\n const functionKeys = [\r\n 'Enter',\r\n 'Escape',\r\n 'Tab',\r\n 'Backspace',\r\n 'Delete',\r\n 'ArrowUp',\r\n 'ArrowDown',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'Home',\r\n 'End',\r\n 'PageUp',\r\n 'PageDown',\r\n 'Insert',\r\n 'F1',\r\n 'F2',\r\n 'F3',\r\n 'F4',\r\n 'F5',\r\n 'F6',\r\n 'F7',\r\n 'F8',\r\n 'F9',\r\n 'F10',\r\n 'F11',\r\n 'F12',\r\n ];\r\n if (functionKeys.includes(key)) {\r\n return;\r\n }\r\n // 除了上面的建其他都开始编辑\r\n this.startEdit(true);\r\n });\r\n this.ctx.on('adjustBoundaryPosition', (cell) => {\r\n // 调整位置会触发重绘可能会导致cellClick事件不能触发,调整位置时需要赋值cellTarget\r\n this.cellTarget = cell;\r\n const { xArr, yArr } = this.ctx.selector;\r\n this.selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n });\r\n this.ctx.on('cellClick', (cell: Cell) => {\r\n // 如果是调整边界位置,不进入编辑模式\r\n if (this.ctx.adjustPositioning) {\r\n return;\r\n }\r\n // 如果是选择器,不进入编辑模式\r\n if (this.ctx.isPointer) {\r\n return;\r\n }\r\n // 不在区域内\r\n if (!this.isInSelectorRange(cell.rowIndex, cell.colIndex)) {\r\n return;\r\n }\r\n const { xArr, yArr } = this.ctx.selector;\r\n const selectorArrStr = JSON.stringify(xArr) + JSON.stringify(yArr);\r\n if (this.selectorArrStr === selectorArrStr && this.cellTarget) {\r\n // 启用合并单元格关联&&只有合并单元格时才进入编辑模式\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n this.startEdit();\r\n return;\r\n }\r\n // 只有一个的情况下才进入编辑模式\r\n if (\r\n this.ctx.selectOnlyOne &&\r\n cell.rowKey === this.cellTarget.rowKey &&\r\n cell.key === this.cellTarget.key\r\n ) {\r\n this.startEdit();\r\n return;\r\n }\r\n }\r\n this.selectorArrStr = selectorArrStr;\r\n this.doneEdit();\r\n this.cellTarget = cell;\r\n // 单击单元格进入编辑模式\r\n if (this.ctx.config.ENABLE_EDIT_SINGLE_CLICK) {\r\n // 启用合并单元格关联&&只有合并单元格时才进入编辑模式\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK && this.ctx.onlyMergeCell) {\r\n this.startEdit();\r\n return;\r\n }\r\n // 只有一个的情况下才进入编辑模式\r\n if (this.ctx.selectOnlyOne) {\r\n this.startEdit();\r\n }\r\n }\r\n });\r\n }\r\n private isInSelectorRange(rowIndex: number, colIndex: number) {\r\n const { xArr, yArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n const [minY, maxY] = yArr;\r\n if (colIndex < minX) {\r\n return false;\r\n }\r\n if (colIndex > maxX) {\r\n return false;\r\n }\r\n if (rowIndex < minY) {\r\n return false;\r\n }\r\n if (rowIndex > maxY) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n private initTextEditor() {\r\n // 初始化文本编辑器\r\n this.inputEl = document.createElement('textarea');\r\n this.inputEl.setAttribute('rows', '1');\r\n // 监听输入事件,自动调整高度\r\n this.inputEl.addEventListener('input', this.autoSize.bind(this));\r\n this.inputEl.addEventListener('blur', () => {\r\n this.doneEdit();\r\n });\r\n this.editorEl = this.ctx.editorElement;\r\n this.inputEl.className = 'e-virt-table-editor-textarea';\r\n this.editorEl.appendChild(this.inputEl);\r\n this.ctx.containerElement.appendChild(this.editorEl);\r\n }\r\n private autoSize() {\r\n this.inputEl.style.height = 'auto'; // 重置高度\r\n let scrollHeight = this.inputEl.scrollHeight;\r\n let maxHeight = this.ctx.body.visibleHeight;\r\n if (scrollHeight > maxHeight) {\r\n scrollHeight = maxHeight;\r\n }\r\n const {\r\n stageHeight,\r\n footer,\r\n header,\r\n config: { SCROLLER_TRACK_SIZE },\r\n } = this.ctx;\r\n const bottomY = stageHeight - footer.height - SCROLLER_TRACK_SIZE;\r\n this.editorEl.style.bottom = `auto`;\r\n if (this.drawY < header.height) {\r\n this.editorEl.style.top = `${header.height - 1}px`;\r\n }\r\n if (this.drawY + scrollHeight > bottomY) {\r\n this.editorEl.style.left = `${this.drawX - 1}px`;\r\n this.editorEl.style.top = `auto`;\r\n this.editorEl.style.bottom = `${stageHeight - bottomY}px`;\r\n }\r\n this.inputEl.style.height = `${scrollHeight}px`; // 设置为内容的高度\r\n }\r\n private startEditByInput(cell: Cell, ignoreValue = false) {\r\n const value = ignoreValue ? null : cell.getValue();\r\n const { editorType } = cell;\r\n cell.update(); // 更新单元格信息\r\n if (this.ctx.config.ENABLE_MERGE_CELL_LINK) {\r\n cell.updateSpanInfo(); // 更新合并单元格信息\r\n }\r\n let { height, width, drawY, drawX } = cell;\r\n this.drawX = drawX;\r\n this.drawY = drawY;\r\n const {\r\n config: { CELL_PADDING },\r\n header,\r\n } = this.ctx;\r\n let maxHeight = this.ctx.body.visibleHeight;\r\n if (height > maxHeight) {\r\n height = maxHeight;\r\n }\r\n // 显示编辑器\r\n this.editorEl.style.display = 'inline-block';\r\n this.editorEl.style.left = `${this.drawX - 1}px`;\r\n this.editorEl.style.top = `${this.drawY - 1}px`;\r\n this.editorEl.style.bottom = `auto`;\r\n this.editorEl.style.maxHeight = `${maxHeight}px`;\r\n if (editorType === 'text') {\r\n this.inputEl.style.display = 'block';\r\n this.inputEl.style.minWidth = `${width - 1}px`;\r\n this.inputEl.style.minHeight = `${height - 1}px`;\r\n this.inputEl.style.maxHeight = `${maxHeight}px`;\r\n this.inputEl.style.width = `${width - 1}px`;\r\n this.inputEl.style.height = `auto`;\r\n this.inputEl.style.padding = `${CELL_PADDING}px`;\r\n if (value !== null) {\r\n this.inputEl.value = value;\r\n }\r\n this.inputEl.focus({ preventScroll: true });\r\n const length = this.inputEl.value.length;\r\n this.inputEl.setSelectionRange(length, length);\r\n } else {\r\n this.inputEl.style.display = 'none';\r\n }\r\n\r\n if (this.inputEl.scrollHeight > height || this.drawY < header.height) {\r\n this.autoSize();\r\n }\r\n }\r\n private doneEditByInput() {\r\n if (!this.cellTarget) {\r\n return;\r\n }\r\n // 如果是文本编辑器\r\n if (this.cellTarget.editorType === 'text') {\r\n const { rowKey, key } = this.cellTarget;\r\n const value = this.cellTarget.getValue();\r\n const textContent = this.inputEl.value;\r\n // !(text.textContent === '' && value === null)剔除点击编辑后未修改会把null变为''的情况\r\n if (textContent !== value && !(textContent === '' && value === null) && !this.cancel) {\r\n this.ctx.setItemValueByEditor(rowKey, key, textContent, true);\r\n // this.cellTarget.setValue(textContent);\r\n }\r\n this.inputEl.value = '';\r\n }\r\n }\r\n startEdit(ignoreValue = false) {\r\n this.cancel = false;\r\n // 如果不启用点击选择器编辑\r\n const { ENABLE_EDIT_CLICK_SELECTOR } = this.ctx.config;\r\n if (!ENABLE_EDIT_CLICK_SELECTOR) {\r\n return;\r\n }\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n // 触发绘制,刷新\r\n this.ctx.emit('drawView');\r\n // 可视区可见\r\n const isVisible = focusCell.isVerticalVisible() && focusCell.isHorizontalVisible();\r\n if (!isVisible) {\r\n return;\r\n }\r\n const { rowKey, key, editorType } = focusCell;\r\n // 没有编辑器的情况下不进入编辑模式\r\n if (editorType === 'none') {\r\n return;\r\n }\r\n const readonly = this.ctx.database.getReadonly(rowKey, key);\r\n if (focusCell && !readonly) {\r\n this.enable = true;\r\n this.ctx.editing = true;\r\n this.cellTarget = focusCell;\r\n this.startEditByInput(this.cellTarget, ignoreValue);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n }\r\n }\r\n editCell(rowIndex: number, colIndex: number) {\r\n const row = this.ctx.body.renderRows.find((row) => row.rowIndex === rowIndex);\r\n if (!row) {\r\n return;\r\n }\r\n const cell = row.cells.find((cell: Cell) => cell.colIndex === colIndex);\r\n if (!cell) {\r\n return;\r\n }\r\n this.ctx.emit('setSelectorCell', cell);\r\n const focusCell = this.ctx.focusCell;\r\n if (!focusCell) {\r\n return;\r\n }\r\n // 如果是index或者index-selection,selection类型的单元格,不允许编辑\r\n if (['index', 'index-selection', 'selection'].includes(focusCell.type)) {\r\n return;\r\n }\r\n if (this.enable) {\r\n return;\r\n }\r\n const { rowKey, key } = focusCell;\r\n const readonly = this.ctx.database.getReadonly(rowKey, key);\r\n if (focusCell && !readonly) {\r\n this.enable = true;\r\n this.ctx.editing = true;\r\n this.cellTarget = focusCell;\r\n this.startEditByInput(this.cellTarget);\r\n this.ctx.emit('startEdit', this.cellTarget);\r\n }\r\n }\r\n doneEdit() {\r\n if (!this.enable) {\r\n return;\r\n }\r\n this.doneEditByInput();\r\n this.ctx.emit('doneEdit', this.cellTarget);\r\n this.enable = false;\r\n this.ctx.editing = false;\r\n this.ctx.containerElement.focus({ preventScroll: true });\r\n // 隐藏编辑器\r\n this.editorEl.style.display = 'none';\r\n this.ctx.emit('drawView');\r\n }\r\n clearEditor() {\r\n this.doneEdit();\r\n this.cellTarget = null;\r\n this.selectorArrStr = '';\r\n this.ctx.clearSelector();\r\n this.ctx.focusCell = undefined;\r\n this.ctx.emit('drawView');\r\n }\r\n destroy() {\r\n this.editorEl?.remove();\r\n }\r\n}\r\n","import Context from './Context';\r\nexport default class Tooltip {\r\n private ctx: Context;\r\n private emptyEl: HTMLDivElement;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n const { EMPTY_TEXT, EMPTY_CUSTOM_STYLE } = this.ctx.config;\r\n if (this.ctx.emptyElement) {\r\n this.emptyEl = this.ctx.emptyElement;\r\n } else {\r\n this.emptyEl = document.createElement('div');\r\n this.emptyEl.innerText = EMPTY_TEXT;\r\n }\r\n this.emptyEl.className = 'e-virt-table-empty';\r\n this.emptyEl.style.display = 'none';\r\n this.ctx.containerElement.appendChild(this.emptyEl);\r\n this.ctx.on('emptyChange', ({ type, headerHeight, bodyHeight, footerHeight }) => {\r\n const top = headerHeight + (bodyHeight + footerHeight) / 2;\r\n const contentStyle = {\r\n display: type === 'empty' ? 'block' : 'none',\r\n position: 'absolute',\r\n fontSize: '14px',\r\n color: '#666',\r\n left: '50%',\r\n top: `${top}px`,\r\n transform: 'translate(-50%, -50%)',\r\n ...EMPTY_CUSTOM_STYLE,\r\n };\r\n Object.assign(this.emptyEl.style, contentStyle);\r\n });\r\n }\r\n destroy() {\r\n this.emptyEl.remove();\r\n }\r\n}\r\n","import type Cell from './Cell';\nimport type CellHeader from './CellHeader';\nimport type Context from './Context';\nimport type { OverlayerContainer, OverlayerView, OverlayerWrapper } from './types';\nexport default class Overlayer {\n ctx: Context;\n constructor(ctx: Context) {\n this.ctx = ctx;\n }\n draw() {\n const overlayer = this.getContainer();\n this.ctx.emit('overlayerChange', overlayer);\n }\n destroy() {\n this.ctx.emit('overlayerChange', {\n style: {},\n views: [],\n });\n }\n private getContainer(): OverlayerContainer {\n const header = this.getHeader();\n const body = this.getBody();\n const footer = this.getFooter();\n let views: OverlayerWrapper[] = [];\n // 不是固定底部的时候,不用加入footer,因为footer是在body的下面的\n const { FOOTER_FIXED, FOOTER_POSITION } = this.ctx.config;\n if (!FOOTER_FIXED) {\n views = [header, body];\n } else {\n if (FOOTER_POSITION === 'top') {\n views = [header, footer, body];\n } else {\n views = [header, body, footer];\n }\n }\n return {\n views,\n };\n }\n private getHeader() {\n const {\n fixedLeftWidth,\n fixedRightWidth: _fixedRightWidth,\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\n } = this.ctx;\n const { visibleWidth, visibleHeight, renderCellHeaders } = this.ctx.header;\n let centerCells: CellHeader[] = [];\n let leftCells: CellHeader[] = [];\n let rightCells: CellHeader[] = [];\n renderCellHeaders.forEach((cellHeader) => {\n if (cellHeader.render) {\n if (cellHeader.fixed === 'left') {\n leftCells.push(cellHeader);\n } else if (cellHeader.fixed === 'right') {\n rightCells.push(cellHeader);\n } else {\n centerCells.push(cellHeader);\n }\n }\n });\n // 减去滚动条的宽度\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\n const left: OverlayerView = {\n key: 'left',\n style: {\n position: 'absolute',\n top: `${0}px`,\n left: `${0}px`,\n overflow: 'hidden',\n width: `${fixedLeftWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: leftCells,\n };\n const center: OverlayerView = {\n key: 'center',\n style: {\n position: 'absolute',\n top: `${0}px`,\n left: `${fixedLeftWidth}px`,\n overflow: 'hidden',\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth + 1}px`,\n height: `${visibleHeight}px`,\n },\n cells: centerCells,\n };\n const right: OverlayerView = {\n key: 'right',\n style: {\n position: 'absolute',\n top: `${0}px`,\n right: `${0}px`,\n overflow: 'hidden',\n width: `${fixedRightWidth + 1}px`,\n height: `${visibleHeight}px`,\n },\n cells: rightCells,\n };\n const header: OverlayerWrapper = {\n type: 'header',\n class: `${CSS_PREFIX}-overlayer-header`,\n style: {\n position: 'relative',\n overflow: 'hidden',\n width: `${visibleWidth}px`,\n height: `${visibleHeight}px`,\n },\n views: [left, center, right],\n };\n return header;\n }\n private getBody() {\n const centerCells: Cell[] = [];\n const leftCells: Cell[] = [];\n const rightCells: Cell[] = [];\n let renderRows = this.ctx.body.renderRows;\n // 合计如果不是固定在底部,就加入到渲染行中\n if (!this.ctx.config.FOOTER_FIXED) {\n renderRows = renderRows.concat(this.ctx.footer.renderRows);\n }\n renderRows.forEach((row: { cells: Cell[] }) => {\n row.cells.forEach((cell: Cell) => {\n if (cell.cellType === 'footer') {\n cell.render = cell.renderFooter;\n }\n if (cell.render) {\n if (cell.fixed === 'left') {\n leftCells.push(cell);\n } else if (cell.fixed === 'right') {\n rightCells.push(cell);\n } else {\n centerCells.push(cell);\n }\n }\n });\n });\n const {\n fixedLeftWidth,\n fixedRightWidth: _fixedRightWidth,\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\n } = this.ctx;\n const { visibleWidth, visibleHeight } = this.ctx.body;\n // 减去滚动条的宽度\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\n const left: OverlayerView = {\n key: 'left',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n left: `${0.5}px`,\n overflow: 'hidden',\n width: `${fixedLeftWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: leftCells,\n };\n const center: OverlayerView = {\n key: 'center',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n left: `${fixedLeftWidth - 0.5}px`,\n overflow: 'hidden',\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: centerCells,\n };\n const right: OverlayerView = {\n key: 'right',\n style: {\n position: 'absolute',\n top: `${0}px`,\n right: `${0}px`,\n overflow: 'hidden',\n width: `${fixedRightWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: rightCells,\n };\n const body: OverlayerWrapper = {\n type: 'body',\n class: `${CSS_PREFIX}-overlayer-body`,\n style: {\n position: 'relative',\n overflow: 'hidden',\n width: `${visibleWidth}px`,\n height: `${visibleHeight}px`,\n },\n views: [left, center, right],\n };\n return body;\n }\n private getFooter() {\n const centerCells: Cell[] = [];\n const leftCells: Cell[] = [];\n const rightCells: Cell[] = [];\n this.ctx.footer.renderRows.forEach((row: { cells: Cell[] }) => {\n row.cells.forEach((cell: Cell) => {\n if (cell.cellType === 'footer' && cell.renderFooter) {\n // 把转renderFooter成render统一出口\n cell.render = cell.renderFooter;\n if (cell.fixed === 'left') {\n leftCells.push(cell);\n } else if (cell.fixed === 'right') {\n rightCells.push(cell);\n } else {\n centerCells.push(cell);\n }\n }\n });\n });\n const {\n fixedLeftWidth,\n fixedRightWidth: _fixedRightWidth,\n config: { SCROLLER_TRACK_SIZE, CSS_PREFIX },\n } = this.ctx;\n const { visibleWidth, visibleHeight } = this.ctx.footer;\n // 减去滚动条的宽度\n const fixedRightWidth = _fixedRightWidth - SCROLLER_TRACK_SIZE;\n const left: OverlayerView = {\n key: 'left',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n left: `${0.5}px`,\n overflow: 'hidden',\n width: `${fixedLeftWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: leftCells,\n };\n const center: OverlayerView = {\n key: 'center',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n left: `${fixedLeftWidth - 0.5}px`,\n overflow: 'hidden',\n width: `${visibleWidth - fixedLeftWidth - fixedRightWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: centerCells,\n };\n const right: OverlayerView = {\n key: 'right',\n style: {\n position: 'absolute',\n top: `${0.5}px`,\n right: `${0.5}px`,\n overflow: 'hidden',\n width: `${fixedRightWidth}px`,\n height: `${visibleHeight}px`,\n },\n cells: rightCells,\n };\n const footer: OverlayerWrapper = {\n type: 'footer',\n class: `${CSS_PREFIX}-overlayer-footer`,\n style: {\n position: 'relative',\n overflow: 'hidden',\n width: `${visibleWidth}px`,\n height: `${visibleHeight}px`,\n },\n views: [left, center, right],\n };\n return footer;\n }\n}\n","import { MenuItem } from './types';\r\nimport Context from './Context';\r\nimport { computePosition, offset, flip, shift } from '@floating-ui/dom';\r\nimport Cell from './Cell';\r\nexport default class ContextMenu {\r\n private ctx: Context;\r\n private contextMenuEl: HTMLDivElement;\r\n private custom = false;\r\n constructor(ctx: Context) {\r\n this.ctx = ctx;\r\n if (this.ctx.contextMenuElement) {\r\n this.custom = true;\r\n this.contextMenuEl = this.ctx.contextMenuElement;\r\n } else {\r\n this.custom = false;\r\n this.contextMenuEl = document.createElement('div');\r\n }\r\n this.createContextMenu();\r\n this.init();\r\n }\r\n private init() {\r\n this.ctx.on('cellContextMenuClick', (cell: Cell, e: MouseEvent) => {\r\n if (!this.ctx.config.ENABLE_CONTEXT_MENU) return;\r\n e.preventDefault();\r\n const { xArr, yArr } = this.ctx.selector;\r\n const [minX, maxX] = xArr;\r\n const [minY, maxY] = yArr;\r\n const { rowIndex, colIndex } = cell;\r\n //判断是否在范围内\r\n const isInRange = rowIndex >= minY && rowIndex <= maxY && colIndex >= minX && colIndex <= maxX;\r\n if (!isInRange) {\r\n this.ctx.emit('setSelectorCell', cell, e);\r\n }\r\n\r\n const virtualReference = {\r\n getBoundingClientRect: () => ({\r\n width: 0,\r\n height: 0,\r\n top: e.clientY,\r\n left: e.clientX,\r\n right: e.clientX,\r\n bottom: e.clientY,\r\n x: e.clientX,\r\n y: e.clientY,\r\n }),\r\n contextElement: document.body,\r\n };\r\n computePosition(virtualReference, this.contextMenuEl, {\r\n placement: 'right-start',\r\n middleware: [offset(), shift(), flip()],\r\n }).then(({ x, y }) => {\r\n this.show(x, y);\r\n });\r\n });\r\n this.ctx.on('click', this.hide.bind(this));\r\n this.ctx.on('onScroll', this.hide.bind(this));\r\n this.ctx.on('resize', this.hide.bind(this));\r\n }\r\n //创建右键菜单,绑定子项点击事件\r\n private createContextMenu() {\r\n this.contextMenuEl.className = 'e-virt-table-context-menu';\r\n this.contextMenuEl.addEventListener('contextmenu', function (e) {\r\n e.preventDefault();\r\n });\r\n this.ctx.containerElement.appendChild(this.contextMenuEl);\r\n // 如果是自定义右键菜单,则不创建默认子菜单\r\n if (this.custom) return;\r\n const { CONTEXT_MENU } = this.ctx.config;\r\n this.createContextMenuItems(CONTEXT_MENU, (item: MenuItem) => {\r\n switch (item.value) {\r\n case 'copy':\r\n this.ctx.emit('contextMenuCopy');\r\n break;\r\n case 'paste':\r\n this.ctx.emit('contextMenuPaste');\r\n break;\r\n case 'cut':\r\n this.ctx.emit('contextMenuCut');\r\n break;\r\n case 'clearSelected':\r\n this.ctx.emit('contextMenuClearSelected');\r\n break;\r\n default:\r\n }\r\n this.hide();\r\n });\r\n }\r\n //创建右键菜单子项元素\r\n private createContextMenuItems(items: MenuItem[], callback: (e: MenuItem) => void) {\r\n this.contextMenuEl.replaceChildren();\r\n items.forEach((item: MenuItem) => {\r\n const menuItemEl: HTMLDivElement = document.createElement('div');\r\n menuItemEl.className = 'e-virt-table-context-menu-item';\r\n menuItemEl.innerText = item.label;\r\n if (item.event) {\r\n menuItemEl.onclick = () => {\r\n item.event && item.event();\r\n callback(item);\r\n };\r\n } else {\r\n menuItemEl.onclick = () => callback(item);\r\n }\r\n this.contextMenuEl.appendChild(menuItemEl);\r\n });\r\n }\r\n private show(x: Number, y: Number) {\r\n Object.assign(this.contextMenuEl.style, {\r\n left: `${x}px`,\r\n top: `${y}px`,\r\n });\r\n }\r\n hide() {\r\n Object.assign(this.contextMenuEl.style, {\r\n left: '-99999px',\r\n top: '-99999px',\r\n });\r\n }\r\n updated() {\r\n this.createContextMenu();\r\n }\r\n destroy() {\r\n this.contextMenuEl.remove();\r\n }\r\n}\r\n","import {\r\n ChangeItem,\r\n Column,\r\n ConfigType,\r\n EventCallback,\r\n EVirtTableOptions,\r\n FilterMethod,\r\n Position,\r\n RowParams,\r\n ValidateField,\r\n ValidateItemError,\r\n} from './types';\r\nimport Context from './Context';\r\nimport Scroller from './Scroller';\r\nimport Header from './Header';\r\nimport Body from './Body';\r\nimport Footer from './Footer';\r\nimport Selector from './Selector';\r\nimport Autofill from './Autofill';\r\nimport Tooltip from './Tooltip';\r\nimport Editor from './Editor';\r\nimport Empty from './Empty';\r\nimport Overlayer from './Overlayer';\r\nimport ContextMenu from './ContextMenu';\r\nimport { mergeColCell, mergeRowCell, getSpanArrByRow, getSpanObjByColumn } from './util';\r\nimport './style.css';\r\n\r\nexport default class EVirtTable {\r\n private options: EVirtTableOptions;\r\n private scroller: Scroller;\r\n private header: Header;\r\n private body: Body;\r\n private footer: Footer;\r\n private selector: Selector;\r\n private autofill: Autofill;\r\n private tooltip: Tooltip;\r\n private editor: Editor;\r\n private empty: Empty;\r\n private overlayer: Overlayer;\r\n private contextMenu: ContextMenu;\r\n ctx: Context;\r\n \r\n constructor(target: HTMLDivElement, options: EVirtTableOptions) {\r\n this.options = options;\r\n const { overlayerElement, editorElement, emptyElement, contextMenuElement } = this.options;\r\n const containerElement = this.createContainer(\r\n target,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n );\r\n this.ctx = new Context(containerElement, this.options);\r\n this.header = new Header(this.ctx);\r\n this.footer = new Footer(this.ctx);\r\n this.body = new Body(this.ctx);\r\n this.scroller = new Scroller(this.ctx);\r\n this.selector = new Selector(this.ctx);\r\n this.autofill = new Autofill(this.ctx);\r\n this.tooltip = new Tooltip(this.ctx);\r\n this.empty = new Empty(this.ctx);\r\n this.editor = new Editor(this.ctx);\r\n this.overlayer = new Overlayer(this.ctx);\r\n this.contextMenu = new ContextMenu(this.ctx);\r\n this.ctx.on('draw', () => {\r\n this.draw();\r\n });\r\n this.ctx.on('drawView', () => {\r\n this.draw(true);\r\n });\r\n this.draw();\r\n }\r\n private createContainer(\r\n containerElement: HTMLDivElement,\r\n _overlayerElement?: HTMLDivElement,\r\n _editorElement?: HTMLDivElement,\r\n _emptyElement?: HTMLDivElement,\r\n _contextMenuElement?: HTMLDivElement,\r\n ) {\r\n containerElement.className = 'e-virt-table-container';\r\n const stageElement = document.createElement('div');\r\n const canvasElement = document.createElement('canvas');\r\n const overlayerElement = _overlayerElement || document.createElement('div');\r\n stageElement.className = 'e-virt-table-stage';\r\n containerElement.tabIndex = 0;\r\n canvasElement.className = 'e-virt-table-canvas';\r\n overlayerElement.className = 'e-virt-table-overlayer';\r\n const editorElement = _editorElement || document.createElement('div');\r\n editorElement.className = 'e-virt-table-editor';\r\n const emptyElement = _emptyElement;\r\n const contextMenuElement = _contextMenuElement;\r\n stageElement.appendChild(canvasElement);\r\n stageElement.appendChild(overlayerElement);\r\n containerElement.appendChild(stageElement);\r\n return {\r\n containerElement,\r\n stageElement,\r\n canvasElement,\r\n overlayerElement,\r\n editorElement,\r\n emptyElement,\r\n contextMenuElement,\r\n };\r\n }\r\n draw(ignoreOverlayer = false) {\r\n requestAnimationFrame(() => {\r\n this.header.update();\r\n this.footer.update();\r\n this.body.update();\r\n this.ctx.paint.clear();\r\n this.body.draw();\r\n this.footer.draw();\r\n this.header.draw();\r\n this.scroller.draw();\r\n // 忽略重绘覆盖层,解决按下事件时,重绘覆盖层导致事件无法触发,目前只在Selector中按下事件使用\r\n if (!ignoreOverlayer) {\r\n this.overlayer.draw();\r\n }\r\n });\r\n }\r\n loadConfig(_config: ConfigType) {\r\n this.ctx.config.init(_config);\r\n //重新加载config,初始化表格,但是默认不清除用户操作\r\n this.ctx.database.init(false);\r\n this.header.init();\r\n // 更新右键菜单,有可能配置项变化\r\n this.contextMenu.updated();\r\n this.ctx.emit('draw');\r\n }\r\n loadColumns(columns: Column[]) {\r\n // 先关闭编辑\r\n this.editor.doneEdit();\r\n this.ctx.database.setColumns(columns);\r\n this.header.init();\r\n this.ctx.emit('draw');\r\n }\r\n loadData(data: any[]) {\r\n // 先关闭编辑\r\n this.editor.doneEdit();\r\n this.ctx.database.setData(data);\r\n this.header.init();\r\n this.tooltip.hide();\r\n this.ctx.emit('draw');\r\n }\r\n loadFooterData(data: any[]) {\r\n this.ctx.database.setFooterData(data);\r\n this.ctx.emit('draw');\r\n }\r\n\r\n setLoading(loading: boolean) {\r\n this.ctx.database.setLoading(loading);\r\n }\r\n on(event: string, callback: EventCallback) {\r\n this.ctx.on(event, callback);\r\n }\r\n emit(event: string, ...args: any[]): void {\r\n this.ctx.emit(event, ...args);\r\n }\r\n off(event: string, callback: EventCallback) {\r\n this.ctx.off(event, callback);\r\n }\r\n filterMethod(func: FilterMethod) {\r\n this.ctx.database.setFilterMethod(func);\r\n //重新初始化表格,但是默认不清除用户操作\r\n this.ctx.database.init(false);\r\n this.header.init();\r\n this.ctx.emit('draw');\r\n }\r\n editCell(rowIndex: number, colIndex: number) {\r\n this.editor.editCell(rowIndex, colIndex);\r\n }\r\n setItemValue(\r\n rowKey: string,\r\n key: string,\r\n value: any,\r\n history = true,\r\n reDraw = true,\r\n isEditor = false\r\n ) {\r\n this.ctx.database.setItemValue(rowKey, key, value, history, reDraw, isEditor);\r\n }\r\n batchSetItemValue(list: ChangeItem[], history = true) {\r\n this.ctx.database.batchSetItemValue(list, history);\r\n }\r\n setItemValueByEditor(rowKey: string, key: string, value: any, history = true, reDraw = true) {\r\n this.ctx.setItemValueByEditor(rowKey, key, value, history, reDraw);\r\n this.editor.doneEdit();\r\n }\r\n\r\n clearEditableData(value = null) {\r\n const xArr = [0, this.ctx.maxColIndex];\r\n const yArr = [0, this.ctx.maxRowIndex];\r\n return this.selector.clearSelectedData(xArr, yArr, false, value);\r\n }\r\n clearEditor() {\r\n this.editor.clearEditor();\r\n }\r\n doLayout() {\r\n this.ctx.emit('draw');\r\n }\r\n getChangedData() {\r\n return this.ctx.database.getChangedData();\r\n }\r\n getChangedRows() {\r\n return this.ctx.database.getChangedRows();\r\n }\r\n setCurrentRowByRowIndex(rowIndex: number) {\r\n this.ctx.currentCell = this.ctx.database.getVirtualBodyCell(rowIndex, 0);\r\n this.ctx.emit('draw');\r\n }\r\n setCurrentRow(rowKey: string) {\r\n const column = this.ctx.database.getColumnByColIndex(0);\r\n if (!column) {\r\n return;\r\n }\r\n this.ctx.currentCell = this.ctx.database.getVirtualBodyCellByKey(rowKey, column.key);\r\n this.ctx.emit('draw');\r\n }\r\n getCurrentRow() {\r\n const cell = this.ctx.currentCell;\r\n if (!cell) {\r\n return;\r\n }\r\n const rowData: RowParams = {\r\n row: cell.row,\r\n rowIndex: cell.rowIndex,\r\n rowKey: cell.rowKey,\r\n };\r\n return rowData;\r\n }\r\n clearValidate() {\r\n this.ctx.database.clearValidate();\r\n this.ctx.emit('draw');\r\n }\r\n validateFields(ValidateFields: ValidateField[], scrollError = true) {\r\n return new Promise(async (resolve, reject) => {\r\n let errors: any[] = [];\r\n for (let i = 0; i < ValidateFields.length; i++) {\r\n const { rowKey, key } = ValidateFields[i];\r\n const _errors = await this.ctx.database.getValidator(rowKey, key);\r\n if (Array.isArray(_errors) && _errors.length) {\r\n errors.push(_errors);\r\n }\r\n }\r\n if (errors.length) {\r\n reject(errors);\r\n if (scrollError) {\r\n const [err] = errors;\r\n if (Array.isArray(err) && err.length) {\r\n const [_err] = err;\r\n const { rowKey, key } = _err;\r\n this.scrollToRowkey(rowKey);\r\n this.scrollToColkey(key);\r\n }\r\n }\r\n this.ctx.emit('draw');\r\n } else {\r\n resolve([]);\r\n this.ctx.emit('draw');\r\n }\r\n });\r\n }\r\n async validate(scrollError = true) {\r\n // 先关闭编辑\r\n return new Promise(async (resolve, reject) => {\r\n try {\r\n const res = await this.getValidations();\r\n resolve(res);\r\n } catch (errors) {\r\n // 滚动到错误位置,取第一个错误\r\n if (scrollError && Array.isArray(errors) && errors.length) {\r\n const [err] = errors;\r\n if (Array.isArray(err) && err.length) {\r\n const [_err] = err;\r\n const { rowKey, key } = _err;\r\n const targetRow = this.ctx.database.getRowForRowKey(rowKey);\r\n if (targetRow) {\r\n const { parentRowKeys = [] } = targetRow;\r\n if (parentRowKeys && parentRowKeys.length) {\r\n this.setExpandRowKeys(parentRowKeys, true);\r\n }\r\n }\r\n this.scrollToRowkey(rowKey);\r\n this.scrollToColkey(key);\r\n }\r\n }\r\n reject(errors);\r\n }\r\n });\r\n }\r\n setValidations(errors: ValidateItemError[]) {\r\n errors.forEach((item) => {\r\n const { rowIndex, key, message } = item;\r\n this.ctx.database.setValidationErrorByRowIndex(rowIndex, key, message);\r\n });\r\n // 滚动到错误位置,取第一个错误\r\n if (errors && Array.isArray(errors) && errors.length) {\r\n const [err] = errors;\r\n if (err && err.rowIndex >= 0 && err.key) {\r\n const { rowIndex, key } = err;\r\n this.scrollToRowIndex(rowIndex);\r\n this.scrollToColkey(key);\r\n }\r\n }\r\n }\r\n getValidations() {\r\n return new Promise(async (resolve, reject) => {\r\n const data = this.ctx.database.getAllRowsData();\r\n const leafCellHeaders = this.ctx.header.leafCellHeaders;\r\n let errors: any[] = [];\r\n for (let i = 0; i < data.length; i++) {\r\n for (let y = 0; y < leafCellHeaders.length; y++) {\r\n const rowKey = this.ctx.database.getRowKeyByItem(data[i]);\r\n const leafCellHeader = leafCellHeaders[y];\r\n const key = leafCellHeader.key;\r\n const _errors = await this.ctx.database.getValidator(rowKey, key);\r\n if (Array.isArray(_errors) && _errors.length) {\r\n errors.push(_errors);\r\n }\r\n }\r\n }\r\n if (errors.length) {\r\n reject(errors);\r\n this.ctx.emit('draw');\r\n } else {\r\n resolve([]);\r\n this.ctx.emit('draw');\r\n }\r\n });\r\n }\r\n hasValidationError() {\r\n return this.ctx.database.hasValidationError();\r\n }\r\n scrollTo(x: number, y: number) {\r\n this.scroller.setScroll(x, y);\r\n }\r\n\r\n scrollXTo(x: number) {\r\n this.scroller.setScrollX(x);\r\n }\r\n\r\n scrollToColkey(key: string) {\r\n this.scroller.scrollToColkey(key);\r\n }\r\n scrollToRowkey(key: string) {\r\n this.scroller.scrollToRowKey(key);\r\n }\r\n scrollToColIndex(colIndex: number) {\r\n this.scroller.scrollToColIndex(colIndex);\r\n }\r\n scrollToRowIndex(rowIndex: number) {\r\n this.scroller.scrollToRowIndex(rowIndex);\r\n }\r\n scrollYTo(y: number) {\r\n this.scroller.setScrollY(y);\r\n }\r\n setExpandRowKeys(keys: any[], expand = true) {\r\n this.ctx.database.setExpandRowKeys(keys, expand);\r\n }\r\n getExpandRowKeys() {\r\n return this.ctx.database.getExpandRowKeys();\r\n }\r\n clearSelection() {\r\n this.ctx.database.clearSelection();\r\n this.ctx.emit('draw');\r\n }\r\n toggleRowSelection(row: any) {\r\n const rowKey = this.ctx.database.getRowKeyByItem(row);\r\n this.ctx.database.toggleRowSelection(rowKey);\r\n this.ctx.emit('draw');\r\n }\r\n setSelectionByRows(rows: any[], selected = true) {\r\n rows.forEach((row) => {\r\n const rowKey = this.ctx.database.getRowKeyByItem(row);\r\n this.ctx.database.setRowSelection(rowKey, selected, false);\r\n });\r\n this.ctx.emit('selectionChange', this.getSelectionRows());\r\n this.ctx.emit('draw');\r\n }\r\n setSelectionByRowKeys(keys: string[], selected = true) {\r\n keys.forEach((key) => {\r\n this.ctx.database.setRowSelection(key, selected, false);\r\n });\r\n this.ctx.emit('selectionChange', this.getSelectionRows());\r\n this.ctx.emit('draw');\r\n }\r\n toggleAllSelection() {\r\n this.ctx.database.toggleAllSelection();\r\n this.ctx.emit('draw');\r\n }\r\n toggleRowExpand(rowKey: string, expand: boolean) {\r\n this.ctx.database.expandItem(rowKey, expand);\r\n this.ctx.emit('draw');\r\n }\r\n toggleExpandAll(expand: boolean) {\r\n this.ctx.database.expandAll(expand);\r\n this.ctx.emit('draw');\r\n }\r\n getSelectionRows() {\r\n return this.ctx.database.getSelectionRows();\r\n }\r\n getPositionForRowIndex(rowIndex: number): Position {\r\n return this.ctx.database.getPositionForRowIndex(rowIndex);\r\n }\r\n getCellValue(rowKey: string, key: string) {\r\n return this.ctx.database.getItemValue(rowKey, key);\r\n }\r\n getCellValueByIndex(rowIndex: number, colIndex: number) {\r\n return this.ctx.database.getItemValueForRowIndexAndColIndex(rowIndex, colIndex);\r\n }\r\n contextMenuHide() {\r\n this.contextMenu.hide();\r\n }\r\n getUtils() {\r\n return {\r\n mergeColCell,\r\n mergeRowCell,\r\n getSpanArrByRow,\r\n getSpanObjByColumn,\r\n };\r\n }\r\n getColumnByKey(key: string) {\r\n return this.ctx.database.getColumnByKey(key)?.column;\r\n }\r\n /**\r\n * 销毁\r\n */\r\n destroy() {\r\n this.overlayer.destroy();\r\n this.empty.destroy();\r\n this.editor.destroy();\r\n this.tooltip.destroy();\r\n this.selector.destroy();\r\n this.autofill.destroy();\r\n this.contextMenu.destroy();\r\n this.ctx.destroy();\r\n this.ctx.containerElement.remove();\r\n }\r\n}\r\n"],"names":["Validator","rules","__publicField","params","errors","column","row","key","rowKey","colIndex","rowIndex","value","field","fieldValue","rule","ruleParam","message","generateShortUUID","r","throttle","func","delay","lastCalledTime","timeoutId","args","now","elapsedTime","getMaxRow","data","item","a","b","sortFixed","arr","lefts","centers","right","calCrossSpan","maxRow","level","config","colspan","fixed","children","toLeaf","tmp","regUniversalNewLine","regNextCellNoQuotes","regNextEmptyCell","decodeSpreadsheetStr","str","lastLength","nextCell","quoteNo","isStillCell","nextChar","match","matchedText","encodeToSpreadsheetStr","rLen","c","cLen","val","getSpanArrByRow","list","relationRowKeys","contactDot","spanArr","index","curValue","acc","pValue","getSpanObjByColumn","columns","keyPre","keyDot","spanObj","mergeRowCell","mergeRowkey","visibleRows","headIndex","mergeColCell","mergeColKeys","visibleLeafColumns","getCssVar","name","el","BaseCell","ctx","x","y","width","height","cellType","stageWidth","fixedLeftWidth","scrollX","fixedRightWidth","offsetWidth","stageHeight","scrollY","offsetHeight","SCROLLER_TRACK_SIZE","Cell","err","SPAN_METHOD","spanMethod","rowspan","relationColKeys","mergeRow","mergeCol","spanInfo","BODY_CELL_TYPE_METHOD","type","BODY_CELL_EDITOR_METHOD","editorProps","props","BODY_CELL_RENDER_METHOD","render","CELL_PADDING","icon","iconOffsetX","iconName","expand","hasChildren","expandLoading","TREE_INDENT","CHECKBOX_SIZE","TREE_ICON_SIZE","loadingIcon","expandIcon","shrinkIcon","iconWidth","iconHeight","drawX","iconX","iconY","drawTextX","BODY_BG_COLOR","EDIT_BG_COLOR","BODY_CELL_STYLE_METHOD","FOOTER_CELL_STYLE_METHOD","READONLY_TEXT_COLOR","BODY_TEXT_COLOR","FOOTER_TEXT_COLOR","FOOTER_BG_COLOR","HIGHLIGHT_SELECTED_ROW","HIGHLIGHT_SELECTED_ROW_COLOR","HIGHLIGHT_HOVER_ROW","HIGHLIGHT_HOVER_ROW_COLOR","STRIPE","STRIPE_COLOR","bgColor","textColor","footerCellStyleMethod","backgroundColor","color","drawCellSkyBgColor","hoverCell","currentCell","minY","maxY","yArr","cellStyleMethod","visibleWidth","visibleHeight","selectable","checkboxImage","checkboxName","treeState","check","BODY_CELL_HOVER_ICON_METHOD","CELL_HOVER_ICON_SIZE","ENABLE_MERGE_CELL_LINK","hoverIconName","_x","_y","offsetTop","offsetLeft","drawImageSource","BODY_CELL_FORMATTER_METHOD","left","top","paint","BORDER_COLOR","BORDER","drawY","SELECT_BORDER_COLOR","ENABLE_AUTOFILL","ENABLE_SELECTOR","AUTOFILL_POINT_BORDER_COLOR","xArr","maxX","offset","colSpan","i","cellHeader","BODY_FONT","PLACEHOLDER_COLOR","ellipsis","placeholder","text","CELL_HOVER_ICON_BG_COLOR","CELL_HOVER_ICON_BORDER_COLOR","xArrCopy","yArrCopy","minX","ERROR_TIP_ICON_SIZE","ERROR_TIP_COLOR","points","options","lineDash","borderWidth","borderColor","fillColor","offsetW","offsetX","offsetY","offsetH","Database","footerData","isClear","_columns","leafColumns","ROW_KEY","dataList","parentRowKeys","_a","DEFAULT_EXPAND_ALL","CELL_HEIGHT","SELECTABLE_METHOD","CHECKBOX_KEY","_rowKey","readonly","checkboxKey","checkboxKeys","recursiveData","newColumn","_data","filterMethod","rowKeys","rowkey","loading","_list","history","checkReadonly","historyAcion","historyList","_checkReadonly","rowKeyList","errList","changeList","_value","oldValue","cell","BEFORE_VALUE_CHANGE_METHOD","rows","promsieValidators","reDraw","isEditor","changeKey","originalValue","selection","mode","childKey","parentKey","childSelections","checkedChildren","s","totalChildren","parentShouldBeChecked","parentSelection","draw","selectionMap","checked","indeterminate","finalChecked","getAllDescendantsRecursive","allDescendants","descendantSelections","descKey","checkedDescendants","totalDescendants","someChecked","allChecked","collectChildren","items","itemKey","findParent","targetKey","child","result","_selectable","ignoreReserve","isTreeSelectionMode","_","buffer","bufferState","total","totalChecked","totalSelectable","reserveTotal","reserveHasChecked","reserveIndeterminate","colKey","changedKey","changedValue","DISABLED","colHeader","rowReadonly","colReadonly","BODY_CELL_READONLY_METHOD","resolve","BODY_CELL_RULES_METHOD","_rules","_errors","rowSpan","sumHeight","position","topIndex","bottomIndex","leftIndex","rightIndex","mergeHeight","mergeWidth","_key","hasMergeCell","j","currentDepth","maxDepth","childMaxDepth","History","e","HISTORY_NUM","ENABLE_HISTORY","EventBrowser","fn","event","ENABLE_KEYBOARD","target","EventBus","callback","callbacks","onceCallback","Paint","dpr","cursor","side","shadowWidth","colorStart","colorEnd","gradient","img","radius","tl","tr","br","bl","font","align","padding","verticalAlign","yPos","xPos","_text","ellipsesWidth","textWidth","textLength","Config","obj","cssKey","svgSelect","Icons","promises","svg","configColor","configSvg","promise","svgContent","fill","isBlob","element","url","svgBlob","reject","CellHeader","HEADER_CELL_STYLE_METHOD","HEADER_BG_COLOR","HEADER_TEXT_COLOR","headerCellStyleMethod","HEADER_FONT","EventTable","mutations","mutation","clickY","clickX","expandLazy","EXPAND_LAZY","EXPAND_LAZY_METHOD","res","isExpand","renderRows","visible","cells","renderCellHeaders","Context","containerOptions","containerElement","stageElement","canvasElement","overlayerElement","editorElement","emptyElement","contextMenuElement","rowsData","ri","cellsData","ci","scrollMaxX","scrollMaxY","footerHeight","Scrollbar","clientY","clientX","deltaY","deltaX","scroll","buttons","pointX","pointY","elementX","elementY","elementWidth","elementHeight","body","header","SCROLLER_SIZE","headerHeight","headerWidth","bodyHeight","ratio","_barHeight","_barWidth","SCROLLER_FOCUS_COLOR","SCROLLER_COLOR","SCROLLER_TRACK_COLOR","Scroller","database","Header","HEADER_HEIGHT","maxHeaderRow","sum","_item","maxWidth","minWidth","spanColumns","overWidth","diff","leafLeftCellHeaders","leafRightCellHeaders","ENABLE_RESIZE_COLUMN","RESIZE_COLUMN_MIN_WIDTH","resizeTargetWidth","resizeTargetMinWidth","resizeTargetMaxWidth","renderAllCellHeaders","col","setWidth","overDiff","fellWidth","widthMap","isResize","uptateWidth","originX","len","everyOffsetX","RESIZE_COLUMN_LINE_COLOR","resizeTargetDrawX","poins","renderLeafCellHeaders","renderCenterCellHeaders","renderFixedCellHeaders","lastCenterCell","Row","rowType","fixedCells","noFixedCells","Body","footer","FOOTER_FIXED","HEIGHT","EMPTY_BODY_HEIGHT","MAX_HEIGHT","ENABLE_OFFSET_HEIGHT","OFFSET_HEIGHT","FOOTER_POSITION","containerHeight","windowInnerHeight","_stageHeight","_visibleHeight","canvasWidth","canvasHeight","isEmpty","_cssWidth","_cssHeight","ENABLE_RESIZE_ROW","RESIZE_ROW_MIN_HEIGHT","resizeTargetHeight","RESIZE_ROW_LINE_COLOR","resizeTargetDrawY","start","end","tempIndex","midIndex","midValue","positions","_headIndex","_tailIndex","Footer","CELL_FOOTER_HEIGHT","everyOffsetY","Selector","dir","isInsideBody","timer","ENABLE_SELECTOR_SPAN_COL","ENABLE_SELECTOR_SPAN_ROW","_xArr","_yArr","rowstart","colstart","SELECTOR_AREA_MIN_X","SELECTOR_AREA_MAX_X","SELECTOR_AREA_MIN_Y","SELECTOR_AREA_MAX_Y","SELECTOR_AREA_MAX_X_OFFSET","SELECTOR_AREA_MAX_Y_OFFSET","areaMinX","areaMaxX","areaMinY","areaMaxY","adjustMerge","BEFORE_SET_SELECTOR_METHOD","topBottomCells","leftRightCells","topBottomBoundary","prev","leftRightBoundary","onlyMergeCell","selectorStr","ENABLE_SELECTOR_ALL_ROWS","ENABLE_SELECTOR_ALL_COLS","isSetFocus","mousedown","focusCell","shiftKey","clickCell","oldX","oldY","BEFORE_COPY_METHOD","error","ignoreSet","_rowIndex","_colIndex","itemValue","ENABLE_PASTER","textArr","overflowRowCount","overflowColCount","isOneData","cutList","changeListRowkeys","BEFORE_PASTE_DATA_METHOD","beforePasteDataMethod","_changeList","positionX","positionY","scrollSpeedX","num","scrollSpeedY","diffLeft","diffRight","diffTop","cellheight","diffBottom","_scrollX","_scrollY","Autofill","pointWh","BEFORE_SET_AUTOFILL_METHOD","selector","selectorIndexMap","xStep","yStep","isOneValue","selectorIndexKey","BEFORE_AUTOFILL_DATA_METHOD","beforeAutofillDataMethod","autofill","min","max","round","createCoords","v","oppositeSideMap","oppositeAlignmentMap","clamp","evaluate","param","getSide","placement","getAlignment","getOppositeAxis","axis","getAxisLength","yAxisSides","getSideAxis","getAlignmentAxis","getAlignmentSides","rects","rtl","alignment","alignmentAxis","length","mainAlignmentSide","getOppositePlacement","getExpandedPlacements","oppositePlacement","getOppositeAlignmentPlacement","lrPlacement","rlPlacement","tbPlacement","btPlacement","getSideList","isStart","getOppositeAxisPlacements","flipAlignment","direction","expandPaddingObject","getPaddingObject","rectToClientRect","rect","computeCoordsFromPlacement","_ref","reference","floating","sideAxis","alignLength","isVertical","commonX","commonY","commonAlign","coords","computePosition","strategy","middleware","platform","validMiddleware","statefulPlacement","middlewareData","resetCount","nextX","nextY","reset","detectOverflow","state","_await$platform$isEle","elements","boundary","rootBoundary","elementContext","altBoundary","paddingObject","clippingClientRect","offsetParent","offsetScale","elementClientRect","arrow","arrowDimensions","isYAxis","minProp","maxProp","clientProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","largestPossiblePadding","minPadding","maxPadding","min$1","center","shouldAddOffset","alignmentOffset","flip","_middlewareData$arrow","_middlewareData$flip","initialPlacement","checkMainAxis","checkCrossAxis","specifiedFallbackPlacements","fallbackStrategy","fallbackAxisSideDirection","detectOverflowOptions","initialSideAxis","isBasePlacement","fallbackPlacements","hasFallbackAxisSideDirection","placements","overflow","overflows","overflowsData","sides","_middlewareData$flip2","_overflowsData$filter","nextIndex","nextPlacement","d","resetPlacement","_overflowsData$filter2","currentSideAxis","originSides","convertValueToCoords","mainAxisMulti","crossAxisMulti","rawValue","mainAxis","crossAxis","_middlewareData$offse","diffCoords","shift","limiter","mainAxisCoord","crossAxisCoord","minSide","maxSide","limitedCoords","hasWindow","getNodeName","node","isNode","getWindow","_node$ownerDocument","getDocumentElement","isElement","isHTMLElement","isShadowRoot","invalidOverflowDisplayValues","isOverflowElement","overflowX","overflowY","display","getComputedStyle","tableElements","isTableElement","topLayerSelectors","isTopLayer","transformProperties","willChangeValues","containValues","isContainingBlock","elementOrCss","webkit","isWebKit","css","getContainingBlock","currentNode","getParentNode","isLastTraversableNode","lastTraversableNodeNames","getNodeScroll","getNearestOverflowAncestor","parentNode","getOverflowAncestors","traverseIframes","_node$ownerDocument2","scrollableAncestor","isBody","win","getFrameElement","getCssDimensions","hasOffset","shouldFallback","unwrapElement","getScale","domElement","$","noOffsets","getVisualOffsets","shouldAddVisualOffsets","isFixed","floatingOffsetParent","getBoundingClientRect","includeScale","isFixedStrategy","clientRect","scale","visualOffsets","offsetWin","currentWin","currentIFrame","iframeScale","iframeRect","getWindowScrollBarX","leftScroll","getHTMLOffset","documentElement","ignoreScrollbarX","htmlRect","convertOffsetParentRelativeRectToViewportRelativeRect","topLayer","offsets","isOffsetParentAnElement","offsetRect","htmlOffset","getClientRects","getDocumentRect","html","getViewportRect","visualViewport","visualViewportBased","absoluteOrFixed","getInnerBoundingClientRect","getClientRectFromClippingAncestor","clippingAncestor","hasFixedPositionAncestor","stopNode","getClippingElementAncestors","cache","cachedResult","currentContainingBlockComputedStyle","elementIsFixed","computedStyle","currentNodeIsContaining","ancestor","getClippingRect","clippingAncestors","firstClippingAncestor","clippingRect","accRect","getDimensions","getRectRelativeToOffsetParent","setLeftRTLScrollbarOffset","isStaticPositioned","getTrueOffsetParent","polyfill","rawOffsetParent","getOffsetParent","svgOffsetParent","getElementRects","getOffsetParentFn","getDimensionsFn","floatingDimensions","isRTL","offset$1","shift$1","flip$1","arrow$1","mergedOptions","platformWithCache","computePosition$1","Tooltip$1","TOOLTIP_BG_COLOR","TOOLTIP_TEXT_COLOR","TOOLTIP_ZINDEX","TOOLTIP_CUSTOM_STYLE","CSS_PREFIX","floatingStyle","arrowStyle","targetRect","cellX","cellY","Editor","cursorPos","textBefore","textAfter","isCtrl","isAlt","isShift","isMeta","selectorArrStr","scrollHeight","maxHeight","bottomY","ignoreValue","editorType","textContent","ENABLE_EDIT_CLICK_SELECTOR","Tooltip","EMPTY_TEXT","EMPTY_CUSTOM_STYLE","contentStyle","Overlayer","overlayer","views","_fixedRightWidth","centerCells","leftCells","rightCells","ContextMenu","virtualReference","CONTEXT_MENU","menuItemEl","EVirtTable","Empty","_overlayerElement","_editorElement","_emptyElement","_contextMenuElement","ignoreOverlayer","_config","ValidateFields","scrollError","_err","targetRow","leafCellHeaders","keys","selected"],"mappings":"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","x_google_ignoreList":[21,22,23,24]}
|