@ninebone/datagrid 0.0.24 โ†’ 0.1.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"nine-table.umd.js","names":["traceOrigin","GROUP_IDX","GROUP_IDX","factory","global","exports","start","end","mid","target","elementDebounceState","el","state","pointerEvent","pointerFn","debounceTime","dblClickEvent","dblClickFn","_text","stripHtml","tmp","html","canvas","context","_font","w","h","v","cleanText","metrics","ascent","descent","trace","_ninebone_util","NINE_TABLE","ngRow","#parent","parent","#newrow","ngData","#host","host","#initialize","item","validRecords","#getValidRecords","at","targetRecord","colnm","idx","rowData","rowIndex","colIndex","value","#conv","fields","#defaultHeight","templateElements","#getDefaultMeta","$el","loadData","dataSource","#invalidate","#nextId","rowid","jsonArray","arr","o","json","record","#json2Array","processedArr","#defaultInsert","row","updateState","targetIndex","#getIndexFromRow","arrIndex","records","b","a","targetId","index","COL_IDX","rowState","isSingle","targetArr","result","i","ngDataManager","ds","rowIdx","nRow","rowidx","#init","#fields","f","found","fieldName","fName","#adjust","map","name","type","rawTables","tbl","fieldType","attr","expr","lastIndex","targetField","NineTableSheets","NineTableSheetsFooter","#render","isMultiSelect","tabItem","#switchSheet","updateSplitters","sheets","s","activeSheets","sheet","currentIdx","targetSplitter","tabBar","body","tabItems","sheetElements","tab","isActive","clickedTab","activeTabs","targetSheet","tabsHtml","table","SheetTabItem","Toolbar","#bindEvents","#customContainer","#syncStateFromHost","isSimple","showToolbar","showMenu","caption","titleEl","link","currentCaption","menuBtn","element","text","NineTableHScrollBar","#owner","initWhenReady","#elements","#observeResize","#resizeObserver","#dragging","track","thumb","bodyWidth","tableWidth","needsHScroll","trackWidth","thumbWidth","currentLeft","maxScrollLeft","l","maxThumbLeft","trackBound","targetX","x","delayScroll","#interval1","#interval2","thumbLeft","#thumbMoveTo","pos","currentThumbLeft","clearTimer","evt","e","trackRect","onMouseMove","moveEvent","onMouseUp","NineTableVScrollBar","#sheet","viewRecords","totalCount","scrollHolder","rawContentHeight","MAX_BROWSER_HEIGHT","useScaling","scaleFactor","contentHeight","#getScaleInfo","fixedHeight","bodyHeight","viewHeight","needsVScroll","trackHeight","thumbHeight","currentScrollTop","maxScrollTop","thumbTop","maxThumbTop","#startY","#startThumbTop","deltaY","targetThumbTop","ratio","rowHeight","visibleRowCount","targetRow","clickY","scrollInterval","startContinuousScroll","scrollStep","$firstTr","direction","currentRow","stopContinuousScroll","GROUP_IDX$1","GroupingManager","#groupColumns","#groupMap","groupColumns","sourceTable","$cell","$tr","#isApplying","groupId","rowIds","dataManager","Grouping","validRaw","rawRecords","groupMap","nestedTree","#buildNestedMap","flatResult","renderItems","#flattenTree","counter","isLastLevel","depth","groupKey","subMapOrRecords","mapOrArray","parentId","#collectLeafRowIds","groupRecord","resultArr","#collectLeafRecords","remainingCols","key","subRecords","subVal","r","RowManager","#initResizeObserver","bodyViewport","#measureAndCacheHeight","#renderAllContainers","#handleScroll","force","#isGrouped","#handleGroupedScroll","scrollTop","rawTotalVirtualHeight","totalVirtualHeight","actualScrollTop","maxStartIndex","clampedScrollTop","startIndex","firstTr","#element","currentStartIndex","$tbody","dataIndex","#bindRowData","allRenderItems","totalVirtualCount","bodyContent","templateLength","getItemHeight","dataRowsHeight","groupHeightsTotal","itemHeights","viewportClientHeight","accumulatedHeight","offsetY","visibleRowsCount","dynamicBuffer","targetStart","targetEnd","renderedItems","container","selector","trs","itemIndex","chunkTrs","virtualIndex","isTrGroup","tr","subIdx","#bindGroupRowData","subRowIndex","matrixRow","indices","allRecords","childrenRecords","customComp","#containerTemplates","tableEl","tbody","templateTrs","#sheetHeight","#isProgrammaticScroll","dataRow","targetScrollTop","rawTargetScrollTop","onRendered","visibleRows","#BUFFER_ROW_COUNT","groupDepth","#cachedRowCount","#renderRows","#syncRowHeights","targetFixedType","clonedTr","targetTbody","fragment","tmpl","leftTable","bodyTable","rightTable","leftRows","bodyRows","rightRows","maxRows","heights","maxHeight","entry","entries","height","#updateRowCount","TableCompiler","$table","$srcTable","#syncColAttributes","$col","fixed","cols","grid","rowSpan","colSpan","c","CellSelection","#initEvents","sameGroupTrs","t","$td","col","r1","startRow","endRow","r2","c1","startCol","endCol","c2","containers","expanded","loopCount","#getMatrixRow","cell","cellEndRow","cellEndCol","nsR","neR","nsC","neC","#range","mainZone","lastMatrixRow","lastCol","targetCell","allCells","rect","targetTr","CellNavigation","#currentCell","#currentTr","#isCellLeftVisible","#isCellRightVisible","isVisible","#isCellBelowVisible","#isCellAboveVisible","scrollTopIndex","#getVisibleRowCount","currentCell","#findCell","nextCell","#getPreviousCell","#getNextCell","#getUpCell","#getDownCell","#moveCellH","#moveCellV","nextCol","cellCol","cellRect","viewportRect","theadHeight","bodyViewport2","viewportHeight","RESIZE_OFFSET","ColResizer","#panel","#tooltip","#onPointerMove","#onPointerDown","#onDblClick","containerType","firstColgroup","totalWidth","colWidths","colIdx","tables","targetCols","globalColIndex","firstContainer","resolvedContainerType","width","sourceCol","headerPart","offsetX","isLeftEdge","isRightEdge","prevCell","#targetCell","#targetContainerType","#getContainerType","baseColIndex","#targetColIndex","#checkIsAutoFit","#nextColIndex","nextColEl","#nextColStartWidth","targetRect","sheetRect","#startCellWidth","#startLeft","attrW","#startColWidth","#startX","#updatePositions","#onDragMove","#onDragEnd","diff","clientX","isAutoFit","maxDiff","minDiff","currentColWidth","realCellWidth","maxCellWidth","currentCellWidth","sizeBadge","finalWidth","newColWidth","newNextWidth","tbodyCell","extraPadding","fieldIdx","font","headerText","maxTextWidth","val","size","calculatedWidth","ColResizerPanel","#renderer","ColMover","#grip","#indi","root","y","nested","headerCells","hasStrictChildren","isValidGroup","parentGroupRange","subCell","subStart","subSpan","subEnd","isRealGroup","groupRange","#getColGroupRange","origTable","minLeft","maxRight","minTop","maxBottom","targetCells","cCol","cEnd","isGroup","computedStyle","groupWidth","groupHeight","headerContent","clonedCell","style","#checkIsMovable","startX","startY","cancelTimer","#timer","onPointerMovePending","#startDrag","#isDragging","preview","#createGroupHeaderPreview","#sourceCell","#sourceColIndex","#shiftX","bounds","relativeTop","fullHeight","#updateGripPosition","#onPointerUp","#getDeepElementFromPoint","targetColIndex","colMinLeft","colMaxRight","cRect","midX","calculatedTargetCol","indicatorLeft","sourceGroup","movingSpan","sourceRowStart","sourceRowEnd","targetRowStart","targetRowEnd","isRowSpanCompatible","isOutOfBoundsOfParent","pStart","pEnd","isDroppingInsideOtherGroup","spannedCells","sCell","sRowStart","sRowEnd","sStart","sEnd","moveEndCol","isSelfGroup","left","colgroup","targetCol","toColIndex","spanCount","isInRange","fromColIndex","targetViewportCol","fixedType","group","cells","targetRowCell","ColFixManager","baseCol","fixedAttr","targetBoundaryCol","theadTrs","cellBoundaryFound","cEndCol","action","fixType","cIdx","minBaseCol","maxEndCol","rSpan","rIdx","isBroken","isColFixed","NineTableFilterPanel","#closeHandler","#nineTable","#view","#onInput","#onSelectAll","#onOk","#button","filterBtn","panelWidth","top","searchBox","#loadVirtualFilterItems","path","filteredRecords","activeFilters","exprEngine","bindKey","colInfo","exprKey","filterKey","activeSelectedVals","uniqueMap","rawVal","displayVal","uniqueList","valA","valB","numA","numB","selectAllChk","filterRecords","checkedRecords","chk","filterParams","selectedVals","btn","query","data2Idx","matchedValues","isChecked","chkIdx","NineTableFilterButton","#onClick","#columns","seen","uniqueKey","isFiltered","panel","Filtering","#filters","#initFilterPanel","#filterPanel","#isFiltering","#applyFiltering","jsonFilter","oFilter","k","sheetIndex","filterRules","targetKey","allowedValues","isExpr","isPass","recordIdx","allowedSet","Sorting","#handleSort","colName","exprVal","isAsc","isDesc","existingColIndex","m","ruleData","#applySorting","#syncHeaderUI","colRule","asc","SheetView","#cachedVisibleRecords","#viewIndexes","visibleRecords","#convSingle","filterSlot","#sortingColumns","groupResult","columns","rulesWithIdx","rule","idxA","idxB","isEmptyA","isEmptyB","strA","strB","PreCompiler","#ensureColgroup","#ensureThead","#ensureSectionTbodys","#ensureRowIndicator","#normalizeColAttributes","#createColIndicator","#normalizeCollapsibleAttributes","#generateCell","#initColExpanders","#initFilterButtons","#applyInitialCellWidths","thead","firstRow","cnt","td","#numToExcelCol","background","num","headTbody","footTbody","colCount","sum","containerWidth","defaultWidth","widthVal","targetAttributes","autoIdCounter","$tbl","tagName","$datalist","$option","uniqueFuncName","cellType","originalContent","hostFilter","tableFilter","finalFiltering","currentWidth","expandBtn","targetWidth","rows","section","indicatorCell","startColIdx","targetIdx","SheetAPI","$trs","matrixRows","n","$sheetBody","tfootHeight","viewportTop","viewportBottom","trRect","isAbove","isBelow","callback","toRowid","NineTableSheet","#rowManager","#api","#bindApiMethods","#template","#index","#colResizer","#filtering","#grouping","#colMover","#colFix","#cellSelection","#cellNavigation","#source","attrTrue","sourceTableTrue","#isSimple","#renderSplitContainers","#updateContainerWidths","#adjustOverlay","$thead","$overlay","#autoFit","enable","totalOriginalWidth","colList","collapsedTotalWidth","availableWidth","allocatedTotal","calculatedCols","exactWidth","baseWidth","remainderPixels","uncollapsedCols","minRows","#syncHeaderAndFooterHeights","#initRowHoverEvent","prefix","firstTable","#createSplitTable","offsetHeight","sheetBottom","tbodyBottom","bodyContainer","scrollLeft","#sorting","leftHeaderRows","bodyHeaderRows","rightHeaderRows","#applyMaxHeights","leftFooterRows","bodyFooterRows","rightFooterRows","activeRowIndex","relatedTarget","api","args","LayoutManager","owner","#initEvent","sheetCount","sheetsHtml","className","sheetId","cssImports","$sheet","#isAutoHeight","#applyAutoHeight","lastHeight","currentHeight","basicHeight","ExprEngine","match","trimmedExpr","compiledExpr","evalFn","#exprCache","rowItem","DataAPI","providerObj","methods","fn","NineTableAPI","ns","#getActiveSheet","targetMethod","prop","NineTable","#shadowRoot","#dataManager","#dataApi","#sheetApi","#templateCnt","#bindDynamicSetters","#layoutManager","#dispatchLoad","checkCount","checkTimer","loadSheetCnt","idOrIndex","extractedMethodNames","matches","internalValue","methodName","newValue","BasicCellElement","exprCache","CellElement","#cell","#tr","#attr","button","curRow","renderer","rawRecord","defaultValue","\"display\"","data","cleanExpr","childRecords","funcName","field","acc","EditableCellElement","CellInputText","#target","#maxbyte","maxByteNum","event","CellInputNumber","#onKeyDown","#validate","#max","#min","#scale","str","selectionStart","scale","validKey","isNumKey","CellInputColor","#btn","#dataSource","datalistId","datalist","option","#rendererColor","#isValidColor","g","CellInputDate","#type","formattedVal","d","isValid","#isValidDate","year","month","day","isleap","hour","min","week","CellCheckbox","#label","#trueText","#falseText","#isRadio","trueValue","childHtml","displayText","#enable","#readonly","#visible","CellRadio","#rendererRadio","matchIndex","#radioList","codeVal","#keyName","nameVal","#valueName","label","input","span","CellComboPanel","grd","itemsAttr","fieldKeys","valueName","activeColumnCount","multi","formattedData","keyName","selectedKeys","separator","#isOpen","btnEl","btnRect","panelHeight","upwardTop","#initData","viewContainer","#onClickRow","keyword","CellCombo","#multi","#multiSeparator","#togglePanel","#targetBtn","#getDisplayText","#validateInput","keys","list","CellRenderer","CellButton","#cellButtonClick","customEvent","rawValue","CellRowIndicator","#mainTarget","#subTarget","#statusTarget","displayNum","formattedNum","splitIndex","prefixPart","suffixPart","isSorted","isFitered","ColExpand","singleWidth","currentW","splitWidth","ContextMenu","#tableHost","targetTable","#getTargetSheet","items","activeTableId","activeTable","containerElement","targetTableAttr","rootUl","parsedList","#traverseUl","ulEl","child","spanEl","subUl","useDefault","rawItems","customItems","#parseCustomMenuItems","fixManager","#getFixManager","currentFixState","isFixable","isHeaderCell","fixMenuItem","cleanedItems","targetParent","menuItems","#buildMenuItems","#handleMenuClick","#syncMenuStates","isFiltering","autoFit","showTitle","menuId","#onContextMenu","MenuPanel","#onCallback","#appendItems","#bindClickEvents","cellRightX","wrapper","calculatedLeft","calculatedTop","li","condition","sep","parentUl"],"sources":["../src/core/protype.js","../src/external/NoPeer.js","../src/core/constants.js","../src/data/ngData.js","../src/data/ngDataManager.js","../src/data/Fields.js","../src/layout/nine-table-sheets.js","../src/layout/nine-table-sheets-footer.js","../src/layout/nine-table-toolbar.js","../src/layout/nine-table-hscrollbar.js","../src/layout/nine-table-vscrollbar.js","../src/data/Grouping.js","../src/layout/core/RowManager.js","../src/layout/core/TableCompiler.js","../src/cell-manager/CellSelection.js","../src/cell-manager/CellNavigation.js","../src/col/ColResizer.js","../src/col/ColMover.js","../src/col/ColFixManager.js","../src/data/Filtering.js","../src/data/Sorting.js","../src/data/SheetView.js","../src/layout/core/PreCompiler.js","../src/api/SheetAPI.js","../src/layout/nine-table-sheet.js","../src/layout/core/LayoutManager.js","../src/core/ExprEngine.js","../src/api/DataAPI.js","../src/api/NineTableAPI.js","../src/core/nine-table.js","../src/cell/core/BasicCellElement.js","../src/cell/core/CellElement.js","../src/cell/cell-input-text.js","../src/cell/cell-input-number.js","../src/cell/cell-input-color.js","../src/cell/cell-input-date.js","../src/cell/cell-checkbox.js","../src/cell/cell-radio.js","../src/cell/cell-combo-panel.js","../src/cell/cell-combo.js","../src/cell/cell-renderer.js","../src/cell/cell-button.js","../src/cell/cell-row-indicator.js","../src/col/col-expand.js","../src/menu/nine-table-menu.js","../src/menu/nine-table-menu-panel.js"],"sourcesContent":["Array.prototype.nineBinarySearch = function(target) {\n //this.sort((a, b) => { return a > b ? 1 : -1; });\n\n let start = 0;\n let end = this.length - 1;\n let mid;\n\n while (start <= end) {\n mid = parseInt((start + end) / 2);\n\n if (target === this[mid]) {\n return mid;\n } else {\n if (target < this[mid]) {\n end = mid - 1;\n } else {\n start = mid + 1;\n }\n }\n }\n\n return -1;\n};\n\nconst elementDebounceState = new WeakMap();\n\nHTMLElement.prototype.addDebounseEventListener = function(\n dblClickEvent,\n dblClickFn,\n pointerEvent,\n pointerFn,\n debounceTime = 500\n) {\n const el = this;\n\n if (!elementDebounceState.has(el)) {\n elementDebounceState.set(el, { timer: null, cancelFn: null });\n }\n const state = elementDebounceState.get(el);\n\n el.addEventListener(pointerEvent, (e) => {\n e.actualTarget = e.target;\n\n if (state.timer) {\n clearTimeout(state.timer);\n state.timer = null;\n }\n\n // ๐Ÿ’ก 500ms ๋™์•ˆ ๋Œ€๊ธฐํ•œ ๋’ค์—์•ผ ์‹ค์ œ pointerFn์ด ์‹คํ–‰๋จ\n state.timer = setTimeout(() => {\n state.timer = null;\n state.cancelFn = pointerFn.call(el, e);\n }, debounceTime);\n });\n\n el.addEventListener(dblClickEvent, (e) => {\n if (state.timer) {\n clearTimeout(state.timer);\n state.timer = null;\n }\n\n if (state.cancelFn) {\n state.cancelFn();\n state.cancelFn = null;\n }\n\n dblClickFn.call(el, e);\n });\n};\n\n\nnine.measureTextSize = (_text, _font = '12px sans-serif') => {\n if (typeof _text === 'number') _text = _text + \"\";\n if (!_text) return { width: null, height: null };\n\n const stripHtml = (html) => {\n const tmp = document.createElement(\"DIV\");\n tmp.innerHTML = html;\n return tmp.textContent || tmp.innerText || \"\";\n };\n\n _text = _text.replaceAll(\"\\n\", \"<br>\");\n\n let canvas = document.body.querySelector('canvas#_nine_measure_canvas_');\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.id = '_nine_measure_canvas_';\n canvas.style.cssText = 'position: absolute; visibility: hidden; pointer-events: none; left: -9999px;';\n document.body.appendChild(canvas);\n }\n\n const context = canvas.getContext('2d');\n context.font = _font;\n\n let w = 0;\n let h = 0;\n\n for (let v of _text.split(\"<br>\")) {\n const cleanText = stripHtml(v);\n const metrics = context.measureText(cleanText);\n\n w = Math.max(w, metrics.width);\n\n const ascent = metrics.fontBoundingBoxAscent || 10;\n const descent = metrics.fontBoundingBoxDescent || 3;\n h += ascent + descent;\n }\n\n return {\n width: w,\n height: h\n };\n};","import { trace as traceOrigin } from '@ninebone/util';\n\nexport class Trace extends traceOrigin.constructor {\n constructor() {\n super();\n this.init(\"nine-table\", \"green\");\n }\n}\n\nexport const trace = new Trace();\n","export const NINE_TABLE = {\n META: {\n INDEX: {\n ROWID: 0,\n ROW_STATE: 1,\n FILTER: 2,\n GROUP: 3,\n // SELECT: 2,\n // EXPAND: 3\n }\n },\n ROW_STATE: {\n EMPTY: 0,\n NORMAL: 1,\n INSERT: 2,\n UPDATE: 3,\n DELETE: 9\n },\n EVENT: {\n LOAD: \"load\",\n ROW_ADDED: \"row-added\",\n ROW_REMOVED: \"row-removed\",\n CELL_BUTTON_CLICK: \"cell-button-click\",\n },\n};","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class ngRow {\n\t#parent;\n\t#newrow = -1;\n\n\tconstructor(parent) {\n\t\tthis.#parent = parent;\n\t}\n\n\tget at() {\n\t\treturn this.#newrow;\n\t}\n\tset at(v) {\n\t\tthis.#newrow = parseInt(v, 10);\n\t}\n\n\tcount = () => this.#parent.rawRecords.length;\n}\n\nexport class ngData {\n\t#host;\n\t#parent;\n\t#nextId = 0;\n\t#defaultHeight = [];\n\n\tstatic META_INDEX = {\n\t\tFILTER: 0,\n\t\t// GROUP: 1,\n\t\t// SELECT: 2,\n\t\t// EXPAND: 3\n\t};\n\n\tstatic ROW_STATE = {\n\t\tEMPTY: 'EMPTY',\n\t\tNORMAL: 'NORMAL',\n\t\tINSERT: 'INSERT',\n\t\tUPDATE: 'UPDATE',\n\t\tDELETE: 'DELETE'\n\t};\n\n\tconstructor(host, parent) {\n\t\tthis.#host = host;\n\t\tthis.#parent = parent;\n\t\tthis.#initialize();\n\t}\n\n\n\t#getValidRecords = () => {\n\t\tconst rawRecords = this.#parent.rawRecords || [];\n\t\treturn rawRecords.filter(item => item.m._[NINE_TABLE.META.INDEX.ROW_STATE] !== NINE_TABLE.ROW_STATE.DELETE);\n\t};\n\n\tget count() {\n\t\treturn this.length;\n\t}\n\n\tcount = () => {\n\t\treturn this.length;\n\t};\n\n\tgetArray = (at, colnm) => {\n\t\tconst validRecords = this.#getValidRecords();\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn validRecords; // ๋ณ€ํ™˜ ์—†์ด ๋ฐฐ์—ด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ (๋ Œ๋”๋ง ์ตœ์ ํ™”)\n\t\t}\n\n\t\tif (at < 0 || at >= validRecords.length) return null;\n\n\t\tconst targetRecord = validRecords[at];\n\n\t\tif (colnm != null) {\n\t\t\tconst fields = this.getHostFields();\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn targetRecord;\n\t};\n\n\tsetArray = (rowIndex, colIndex, value) => {\n\t\tconst validRecords = this.#getValidRecords();\n\t\tconst rowData = validRecords[rowIndex];\n\n\t\tconst oldValue = rowData.v[colIndex];\n\t\tif (oldValue !== value && rowData.__ng.rowState !== ngData.ROW_STATE.INSERT) {\n\t\t\trowData.__ng.rowState = ngData.ROW_STATE.UPDATE;\n\t\t}\n\n\t\trowData.v[colIndex] = value;\n\t};\n\n\n\tget = (at, colnm) => {\n\t\tconst validRecords = this.#getValidRecords();\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn this.#conv(validRecords);\n\t\t}\n\n\t\tif (at < 0 || at >= validRecords.length) return null;\n\n\t\tconst targetRecord = validRecords[at];\n\t\tconst fields = this.getHostFields();\n\n\t\tif (colnm != null) {\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn this.#conv(targetRecord);\n\t};\n\n\tgetAll = () => {\n\t\treturn this.#parent.rawRecords || [];\n\t};\n\n\tgetHostFields = () => {\n\t\treturn typeof this.#host.fields?.get === 'function' ? this.#host.fields.get() : [];\n\t};\n\n\t#initialize = () => {\n\t\tthis.#defaultHeight = [];\n\t\tconst templateElements = this.#host.template || [];\n\t\tArray.from(templateElements).forEach(el => {\n\t\t\tthis.#defaultHeight.push(el.getBoundingClientRect?.().height || 24);\n\t\t});\n\n\t\t(this.#parent.rawRecords || []).forEach(v => {\n\t\t\tif (!v.__ng) v.__ng = this.#getDefaultMeta();\n\t\t\tv.__ng.height = this.#defaultHeight.slice();\n\t\t});\n\t};\n\n\tget source() {\n\t\treturn this.#conv(this.#parent.rawRecords);\n\t}\n\tset source(v) {\n\t\tthis.set(v);\n\t}\n\n\t#invalidate = () => {\n\t\tthis.#host.shadowRoot.querySelectorAll(\"nine-table-sheet\").forEach($el => {\n\t\t\t$el.invalidate();\n\t\t});\n\n\t\tthis.#host.shadowRoot.querySelector(\"nine-table-sheets-footer\")?.refresh();\n\t};\n\n\tset = (dataSource) => {\n\n\t\tconst loadData = () => {\n\t\t\tthis.#host.loading = true;\n\t\t\tsetTimeout(() => {\n\t\t\t\ttry {\n\t\t\t\t\tthis.clear();\n\t\t\t\t\tthis.add(dataSource, false);\n\t\t\t\t\tthis.#invalidate();\n\t\t\t\t} finally {\n\t\t\t\t\tthis.#host.loading = false;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (this.#host.loaded) {\n\t\t\tloadData();\n\t\t}\n\t\telse {\n\t\t\tthis.#host.addEventListener(NINE_TABLE.EVENT.LOAD, e => {\n\t\t\t\tloadData();\n\t\t\t}, { once: true });\n\t\t}\n\n\n\t};\n\n\tget nextId() {\n\t\treturn this.#nextId++;\n\t}\n\n\tget length() {\n\t\treturn this.#getValidRecords().length;\n\t}\n\n\tget count() {\n\t\treturn this.length;\n\t}\n\n\tgetRowCount() {\n\t\treturn this.length;\n\t}\n\n\t#getDefaultMeta = (rowid = 0) => {\n\t\treturn {\n\t\t\trowState: ngData.ROW_STATE.EMPTY,\n\t\t\tdeleted: false,\n\t\t\tfiltered: false,\n\t\t\theight: this.#defaultHeight.slice(),\n\t\t\to: {},\n\t\t\tc: {},\n\t\t\t__: [0, 0, 0, 0, ngData.ROW_STATE.EMPTY, false, false, true, false, true, true, false, this.#defaultHeight.slice(), -1, {}, {}],\n\t\t\t_: [rowid, NINE_TABLE.ROW_STATE.EMPTY, [], []],\n\t\t};\n\t};\n\n\treset = () => {\n\t\tthis.#parent.rawRecords = [];\n\t\tthis.#invalidate();\n\t};\n\n\tclear = () => {\n\t\tthis.#parent.rawRecords = [];\n\t\tif (this.#parent.viewRecords?.reset) {\n\t\t\tthis.#parent.viewRecords.reset();\n\t\t}\n\n\t\tthis.#nextId = 0;\n\n\t\tthis.#invalidate();\n\t};\n\n\t#json2Array = (jsonArray) => {\n\t\tif (!Array.isArray(jsonArray)) jsonArray = [jsonArray];\n\n\t\tconst fields = this.getHostFields().length > 0 ? this.getHostFields() : Object.keys(jsonArray[0] || {});\n\t\tconst arr = [];\n\n\t\tjsonArray.forEach(json => {\n\t\t\tconst o = { v: [] };\n\t\t\tfields.forEach(colnm => {\n\t\t\t\to.v.push(json[colnm] !== undefined && json[colnm] !== null ? json[colnm] : \"\");\n\t\t\t});\n\t\t\tarr.push(o);\n\t\t});\n\n\t\treturn arr;\n\t};\n\n\t#defaultInsert = (arr) => {\n\t\tif (!Array.isArray(arr)) arr = [arr];\n\t\tarr.forEach(o => {\n\t\t\tconst rowid = this.nextId;\n\n\t\t\to.m = this.#getDefaultMeta(rowid);\n\t\t\to.__ng = o.m;\n\t\t\to.__ng.rowid = rowid;\n\t\t\t//o.__ng.rowState = ngData.ROW_STATE.INSERT;\n\n\t\t\to.m._[NINE_TABLE.META.INDEX.ROWID] = rowid;\n\t\t\to.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.EMPTY;\n\t\t});\n\t\treturn arr;\n\t};\n\n\t#getIndexFromRow = (rowid) => {\n\t\tconst index = this.#parent.rawRecords.findIndex(record => {\n\t\t\tif (!record || !record.m || !record.m._) return false;\n\t\t\treturn record.m._[NINE_TABLE.META.INDEX.ROWID] === rowid;\n\t\t});\n\n\t\treturn index;\n\t}\n\n\tadd = (dataSource, updateState = true) => {\n\t\tif (dataSource === undefined) dataSource = {};\n\t\tconst arr = this.#json2Array(dataSource);\n\n\t\tconst processedArr = this.#defaultInsert(arr);\n\n\t\tthis.#parent.rawRecords = this.#parent.rawRecords.concat(processedArr);\n\n\t\tconst row = this.count() - 1;\n\t\tif (updateState) {\n\t\t\tarr.forEach((_, idx) => {\n\t\t\t\tconst target = this.#parent.rawRecords[this.#parent.rawRecords.length - 1 - idx];\n\t\t\t\tif (target) target.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.INSERT;\n\t\t\t});\n\t\t}\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_ADDED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: processedArr.length > 0 ? processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID] : null }\n\t\t}));\n\n\t\treturn row;\n\t};\n\n\n\tinsert = (rowid, dataSource, updateState = true) => {\n\t\t//trace.log(\"์ฐพ์„ rowid:\", rowid);\n\n\t\tif (dataSource === undefined) dataSource = {};\n\t\tconst arr = this.#json2Array(dataSource);\n\t\tif (arr.length === 0) return -1;\n\n\t\tlet targetIndex = this.#getIndexFromRow(rowid);\n\t\t/**\n\t\tif (rowid !== undefined && rowid !== null) {\n\t\t\ttargetIndex = this.#parent.rawRecords.findIndex(record => {\n\t\t\t\tif (!record || !record.m || !record.m._) return false;\n\t\t\t\treturn record.m._[NINE_TABLE.META.INDEX.ROWID] === rowid;\n\t\t\t});\n\t\t} */\n\n\t\tconst processedArr = this.#defaultInsert(arr);\n\n\t\t//if (targetIndex === -1) {\n\t\t//\ttargetIndex = this.#parent.rawRecords.length;\n\t\t//}\n\n\t\tthis.#parent.rawRecords.splice(targetIndex, 0, ...processedArr);\n\n\t\tif (updateState) {\n\t\t\tprocessedArr.forEach((_, idx) => {\n\t\t\t\tconst target = this.#parent.rawRecords[targetIndex + idx];\n\n\t\t\t\tif (target && target.m && target.m._) {\n\t\t\t\t\ttarget.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.INSERT;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_ADDED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: processedArr.length > 0 ? processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID] : null }\n\t\t}));\n\n\t\treturn processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID]; // ์‚ฝ์ž…๋œ ์‹ค์ œ ๋ฐฐ์—ด ์ธ๋ฑ์Šค ๋ฐ˜ํ™˜\n\t};\n\n\tremove = (v) => {\n\t\tlet arr = [];\n\t\tif (Array.isArray(v)) {\n\t\t\tarr = at;\n\t\t//} else if (typeof at === \"undefined\") {\n\t\t//\tarr = [this.#parent.host.row.at];\n\t\t} else {\n\t\t\tarr = [parseInt(v, 10)];\n\t\t}\n\n\t\tlet arrIndex = [];\n\t\tarr.forEach(rowid => {\n\t\t\tarrIndex.push(this.#getIndexFromRow(rowid));\n\t\t});\n\n\t\tconst records = this.#parent.rawRecords;//this.#getValidRecords();\n\n\t\tarrIndex.sort((a, b) => b - a).forEach(index => {\n\t\t\t//if (validRecords[index]) {\n\t\t\t\tconst targetId = records[index].m._[NINE_TABLE.META.INDEX.ROWID];\n\n\t\t\t\tif (records[index].m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.INSERT) {\n\t\t\t\t\tthis.#parent.rawRecords = this.#parent.rawRecords.filter(item => item.m._[NINE_TABLE.META.INDEX.ROWID] !== targetId);\n\t\t\t\t} else {\n\t\t\t\t\tthis.#parent.rawRecords.forEach(item => {\n\t\t\t\t\t\tif (item.m._[NINE_TABLE.META.INDEX.ROWID] === targetId) {\n\t\t\t\t\t\t\titem.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.DELETE;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t//}\n\t\t});\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_REMOVED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: arr.length > 0 ? arr[0] : null }\n\t\t}));\n\t};\n\n\tsetValue = (rowid, colnm, value) => {\n\n\t\trowid = parseInt(rowid, 10);\n\t\tconst fields = this.getHostFields();\n\t\tconst COL_IDX = fields.indexOf(colnm);\n\t\tif (COL_IDX < 0) return;\n\n\t\tconst index = this.#getIndexFromRow(rowid);\n\n\t\tconst records = this.#parent.rawRecords;\n\t\tconst rowData = records[index];\n\t\tif (!rowData) return;\n\n\t\tconst oldValue = rowData.v[COL_IDX];\n\t\tif (oldValue !== value && rowData.m._[NINE_TABLE.META.INDEX.ROW_STATE] !== NINE_TABLE.ROW_STATE.INSERT) {\n\t\t\trowData.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.UPDATE;\n\t\t}\n\n\t\trowData.v[COL_IDX] = value;\n\t};\n\n\tgetChangedData = (rowState) => {\n\n\t\tconst records = this.#parent.rawRecords;\n\n\t\tif (rowState) {\n\t\t\treturn this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === rowState; } ) );\n\t\t}\n\t\telse {\n\t\t\treturn {\n\t\t\t\tC: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.INSERT; } ) ),\n\t\t\t\tU: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.UPDATE; } ) ),\n\t\t\t\tD: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.DELETE; } ) ),\n\t\t\t};\n\t\t}\n\t};\n\n\t#conv = (arr) => {\n\t\tif (!arr) return arr;\n\n\t\tconst isSingle = !Array.isArray(arr);\n\t\tconst targetArr = isSingle ? [arr] : arr;\n\t\tconst fields = this.getHostFields();\n\n\t\tconst result = targetArr.filter(o => !o.__ng?.deleted).map(o => {\n\t\t\tconst t = {};\n\t\t\tfields.forEach((colnm, i) => {\n\t\t\t\tt[colnm] = o.v ? o.v[i] : o[colnm];\n\t\t\t});\n\t\t\tt.__ng = o.__ng;\n\t\t\treturn t;\n\t\t});\n\n\t\treturn isSingle ? result[0] : result;\n\t};\n}\n","import { ngRow, ngData } from \"./ngData.js\";\n\nexport class ngDataManager {\n\t#host;\n\n\tconstructor(host) {\n\t\tthis.#host = host;\n\n\t\tthis.row = new ngRow(this);\n\t\tthis.data = new ngData(this.#host, this);\n\n\t\tthis.rawRecords = [];\n\t\tthis.viewRecords = [];\n\t\tthis.delRecords = [];\n\t\tthis.pageCnt = 25;\n\n\t\tthis.viewRecords.reset = () => {\n\t\t\tif (this.#host.view?.redraw) this.#host.view.redraw();\n\t\t};\n\n\t\tthis.setDataSource = (ds) => {\n\t\t\tif (this.data) this.data.reset();\n\n\t\t\tthis.rawRecords = [];\n\t\t\tthis.viewRecords = [];\n\t\t\tthis.delRecords = [];\n\n\t\t\tthis.data.set(ds || []);\n\t\t};\n\n\t\tthis.getRowState = (nRow) => {\n\t\t\tconst rowIdx = parseInt(nRow, 10);\n\t\t\tif (rowIdx >= this.data.count()) return;\n\t\t\treturn this.data.getValidData()[rowIdx]?.__ng?.rowState;\n\t\t};\n\n\t\tthis.getRowPosition = () => this.row.at;\n\t\tthis.setRowPosition = (nRow) => { this.row.at = nRow; };\n\n\t\tthis.getColumn = (rowidx, colnm) => this.data.get(rowidx, colnm);\n\n\t\tthis.setColumn = (rowidx, colnm, v) => {\n\t\t\trowidx = parseInt(rowidx, 10);\n\t\t\tthis.data.setValue(rowidx, colnm, v);\n\t\t};\n\n\t\t// ์ดˆ๊ธฐ ๋นˆ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ\n\t\tthis.setDataSource([]);\n\t}\n}","import { trace } from \"@nopeer\";\n\nexport class fields {\n\t#host;\n\t#fields = [];\n\n\tconstructor(host) {\n\t\tthis.#host = host;\n\t\tthis.#init();\n\t};\n\n\tget() {\n\t\treturn this.#fields.map(f => f.name);\n\t};\n\n\tgetFields() {\n\t\treturn this.#fields;\n\t}\n\n\tgetType(fieldName) {\n\t\tconst found = this.#fields.find(f => f.name === fieldName);\n\t\treturn found ? found.type : 'string';\n\t}\n\n\tadd = (arr, type = 'string') => {\n\t\tarr.forEach(fName => {\n\t\t\tif (!this.#fields.some(f => f.name === fName)) {\n\t\t\t\tthis.#fields.push({ name: fName, type: type });\n\t\t\t}\n\t\t});\n\t\tthis.#adjust();\n\t};\n\n\tindexOf(v) {\n\t\treturn this.#fields.findIndex(f => f.name === v);\n\t};\n\n\tincludes(v) {\n\t\treturn this.#fields.some(f => f.name === v);\n\t};\n\n\t#adjust = () => {\n\t\tconst map = new Map();\n\t\tthis.#fields.forEach(f => {\n\t\t\tmap.set(f.name, f.type);\n\t\t});\n\n\t\tthis.#fields = Array.from(map, ([name, type]) => ({ name, type }));\n\n\t\tthis.#fields = this.#fields.filter(f => f.name !== \"\" && f.name !== \"__ng\");\n\n\t\tthis.#fields.sort((a, b) => { return (a.name.length < b.name.length) ? 1 : -1; });\n\t};\n\n\t#init = () => {\n\t\tthis.#fields = [];\n\n\t\tconst rawTables = Array.from(this.#host.querySelectorAll(\"table\"));\n\n\t\tif (!rawTables || rawTables.length === 0) return;\n\n\t\tfor (const tbl of rawTables) {\n\n\t\t\ttbl.querySelectorAll('[data-bind]').forEach((el) => {\n\t\t\t\tconst fieldName = el.dataset.bind;\n\t\t\t\tconst fieldType = el.getAttribute(\"data-type\") || 'string';\n\n\t\t\t\tif (fieldName) {\n\t\t\t\t\tthis.#fields.push({ name: fieldName, type: fieldType });\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst exprAttrs = [\n\t\t\t\t\"data-expr\", \"background-color\", \"color\", \"tooltip\",\n\t\t\t\t\"visible\", \"readonly\", \"enable-button\", \"enable-check\",\n\t\t\t\t\"class-expr\", \"icon-color\", \"icon-src\"\n\t\t\t];\n\n\t\t\texprAttrs.forEach(attr => {\n\t\t\t\ttbl.querySelectorAll(`[${attr}]`).forEach((el) => {\n\t\t\t\t\tlet expr = el.getAttribute(attr);\n\t\t\t\t\tif (!expr) return;\n\n\t\t\t\t\tif (expr.indexOf(\"data.\") < 0) {\n\t\t\t\t\t\tconst lastIndex = expr.search(/[(]/g);\n\n\t\t\t\t\t\tif (lastIndex > 0) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\texpr = String(window[expr.substring(0, lastIndex).trim()]);\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\texpr = \"\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\texpr.split(\"data.\").forEach(v => {\n\t\t\t\t\t\tif (v.trim() != \"\") {\n\t\t\t\t\t\t\tconst lastIndex = v.search(/[^_A-Za-z0-9]/g);\n\t\t\t\t\t\t\tlet targetField = '';\n\n\t\t\t\t\t\t\tif (lastIndex >= 0) {\n\t\t\t\t\t\t\t\ttargetField = v.substring(0, lastIndex);\n\t\t\t\t\t\t\t} else if (expr.startsWith(\"data.\")) {\n\t\t\t\t\t\t\t\ttargetField = v.replace(\"data.\", \"\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (targetField) {\n\t\t\t\t\t\t\t\tthis.#fields.push({ name: targetField, type: 'string' });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tthis.#adjust();\n\t};\n};","export class NineTableSheets extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n #init = () => {\n\n };\n\n}\n\nif (!customElements.get('nine-table-sheets')) {\n customElements.define('nine-table-sheets', NineTableSheets);\n}","export class NineTableSheetsFooter extends HTMLElement {\n #host;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n refresh = () => {\n this.querySelector(\"#row-count\").innerHTML = this.#host.data.count().toLocaleString();\n };\n\n #init = () => {\n this.#host = this.getRootNode().host;\n\n this.#render();\n\n this.querySelector('.nine-tab-bar')?.addEventListener('click', (e) => {\n const isMultiSelect = e.ctrlKey || e.metaKey || e.shiftKey;\n const tabItem = e.target.closest('nt-sheets-tab-item');\n\n if (!tabItem) return;\n\n const index = parseInt(tabItem.dataset.index, 10);\n this.#switchSheet(index, isMultiSelect);\n });\n\n setTimeout(() => {\n this.#switchSheet(0, false);\n })\n };\n\n #switchSheet = (index, isMultiSelect = false) => {\n\n const updateSplitters = () => {\n const sheets = Array.from(this.#host.shadowRoot.querySelectorAll('nine-table-sheet'));\n const splitters = Array.from(this.#host.shadowRoot.querySelectorAll('nine-splitter'));\n\n splitters.forEach(s => s.style.setProperty('display', 'none'));\n\n const activeSheets = sheets\n .map((sheet, idx) => ({ sheet, idx }))\n .filter(({ sheet }) => sheet.classList.contains('active'));\n\n if (activeSheets.length < 2) return;\n\n for (let i = 0; i < activeSheets.length - 1; i++) {\n const currentIdx = activeSheets[i].idx;\n\n const targetSplitter = this.#host.shadowRoot.querySelector(`nine-splitter[data-split-index=\"${currentIdx}\"]`);\n if (targetSplitter) {\n targetSplitter.style.setProperty('display', '');\n }\n }\n };\n\n const tabBar = this.querySelector('.nine-tab-bar');\n const body = this.#host.shadowRoot.querySelector('nine-table-sheets-body');\n const tabItems = tabBar.querySelectorAll('nt-sheets-tab-item');\n const sheetElements = body.querySelectorAll('nine-table-sheet');\n\n if (!tabItems[index]) return;\n\n if (!isMultiSelect) {\n tabItems.forEach((tab, idx) => {\n tab.setActive(idx === index);\n });\n\n sheetElements.forEach((sheet, idx) => {\n const isActive = idx === index;\n sheet.classList.toggle('active', isActive);\n sheet.style.flex = isActive ? '1 1 100%' : '';\n });\n } else {\n const clickedTab = tabItems[index];\n const activeTabs = tabBar.querySelectorAll('nt-sheets-tab-item.active');\n\n if (clickedTab.classList.contains('active') && activeTabs.length <= 1) {\n return;\n }\n\n clickedTab.classList.toggle('active');\n const targetSheet = body.querySelector(`nine-table-sheet[data-index=\"${index}\"]`);\n if (targetSheet) {\n targetSheet.classList.toggle('active');\n if (!targetSheet.classList.contains('active')) {\n targetSheet.style.flex = '';\n }\n }\n }\n\n const activeSheets = body.querySelectorAll('nine-table-sheet.active');\n\n activeSheets?.forEach(sheet => {\n sheet.style.flex = (activeSheets.length > 1) ? '1 1 0%' : '1 1 100%';\n\n if (typeof sheet.refreshLayout === 'function') {\n sheet.refreshLayout();\n } else {\n sheet.invalidate?.();\n }\n });\n\n updateSplitters();\n };\n\n #render() {\n const rawElements = Array.from(this.#host.children);\n const rawTables = rawElements.filter(el => (el.tagName.toUpperCase() === 'TABLE'));\n\n const tabsHtml = rawTables.map((table, idx) => {\n const className = idx === 0 ? 'active' : '';\n const tabName = table.getAttribute('caption') || `Sheet ${idx + 1}`;\n\n return `<nt-sheets-tab-item class=\"${className}\" data-index=\"${idx}\">${tabName}</nt-sheets-tab-item>`;\n }).join('');\n\n this.innerHTML = `\n <div class=\"nine-tab-bar\">${tabsHtml}</div>\n <div class=\"sheets-counter\">Total : <span id=\"row-count\">0</span></div>\n `;\n };\n}\n\nexport class SheetTabItem extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n }\n\n setActive(isActive) {\n this.classList.toggle('active', isActive);\n }\n}\n\nif (!customElements.get('nt-sheets-tab-item')) {\n customElements.define('nt-sheets-tab-item', SheetTabItem);\n}\n\nif (!customElements.get('nine-table-sheets-footer')) {\n customElements.define('nine-table-sheets-footer', NineTableSheetsFooter);\n}","import { trace } from \"@nopeer\";\n\nexport class Toolbar extends HTMLElement {\n #host;\n #customContainer;\n\n connectedCallback() {\n this.#host = this.getRootNode().host;\n this.#render();\n this.#bindEvents();\n }\n\n #render() {\n this.innerHTML = `\n <div class=\"ng-toolbar-left\">\n <button type=\"button\" class=\"ng-toolbar-menu-btn\" title=\"Menu\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#374151\" stroke-width=\"2\">\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"></line>\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"></line>\n </svg>\n </button>\n <span class=\"ng-toolbar-title\"></span>\n </div>\n\n <div class=\"ng-toolbar-custom\" id=\"custom-container\"></div>\n `;\n\n this.#customContainer = this.querySelector('#custom-container');\n this.#syncStateFromHost();\n }\n\n #syncStateFromHost() {\n const isSimple = this.#host.getAttribute('theme') === 'simple' || this.#host.classList.contains('simple');\n const showToolbar = this.#host.getAttribute('show-toolbar') !== 'false';\n const showMenu = this.#host.getAttribute('show-menu') !== 'false';\n const caption = this.#host.getAttribute('caption') || '';\n\n if (isSimple || !showToolbar) {\n this.setAttribute('hidden', '');\n } else {\n this.removeAttribute('hidden');\n }\n\n this.setAttribute('show-menu', showMenu ? 'true' : 'false');\n this.updateCaption(caption);\n }\n\n #bindEvents() {\n const titleEl = this.querySelector('.ng-toolbar-title');\n if (titleEl) {\n titleEl.addEventListener('dblclick', () => {\n const link = '<font color=\"green\">https://www.ninegrid.net</font>';\n const currentCaption = this.#host.getAttribute('caption') || '';\n titleEl.innerHTML = titleEl.innerHTML === link ? currentCaption : link;\n });\n }\n\n const menuBtn = this.querySelector('.ng-toolbar-menu-btn');\n if (menuBtn) {\n menuBtn.addEventListener('click', () => {\n this.#host.dispatchEvent(new CustomEvent('toolbar-menu-click', {\n bubbles: true,\n composed: true,\n detail: { targetTable: this.#host }\n }));\n });\n }\n }\n\n addCustomElement(element) {\n if (this.#customContainer) {\n this.#customContainer.append(element);\n }\n }\n\n updateCaption(text) {\n const titleEl = this.querySelector('.ng-toolbar-title');\n if (titleEl) titleEl.textContent = text;\n }\n}\n\nif (!customElements.get('nine-table-toolbar')) {\n customElements.define('nine-table-toolbar', Toolbar);\n}","// ui/nine-table-hscrollbar.js\nimport { trace } from \"@nopeer\";\n\nexport class NineTableHScrollBar extends HTMLElement {\n #owner;\n #dragging = false;\n #elements;\n #interval1;\n #interval2;\n #resizeObserver;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#owner = this.closest(\"nine-table-sheet\") || this.getRootNode().host;\n if (!this.#owner) return;\n\n this.innerHTML = `\n <button class='scroll-left' disabled><div class='scroll-icon'></div></button>\n <div class='scroll-track'><div class='scroll-thumb'></div></div>\n <button class='scroll-right' disabled><div class='scroll-icon'></div></button>\n `;\n\n const initWhenReady = () => {\n const body = this.#owner.querySelector(\".ng-sheet-body .ng-container-body\");\n if (!body) {\n setTimeout(initWhenReady, 10);\n return;\n }\n\n this.#elements = {\n container : body,\n track : this.querySelector(\".scroll-track\"),\n thumb : this.querySelector(\".scroll-thumb\"),\n left : this.querySelector(\".scroll-left\"),\n right : this.querySelector(\".scroll-right\"),\n };\n\n this.#init();\n this.#observeResize();\n this.refresh();\n };\n\n initWhenReady();\n }\n\n disconnectedCallback() {\n if (this.#resizeObserver) {\n this.#resizeObserver.disconnect();\n }\n }\n\n #observeResize = () => {\n if (!this.#owner) return;\n const body = this.#owner.querySelector(\".ng-sheet-body .ng-container-body\");\n if (!body) return;\n\n this.#resizeObserver = new ResizeObserver(() => {\n this.refresh();\n });\n this.#resizeObserver.observe(body);\n };\n\n refresh = () => {\n\n if (!this.#owner || !this.#elements || this.#dragging) return;\n\n const body = this.#elements.container;\n const table = body.querySelector(\"table\");\n if (!table) return;\n\n const track = this.#elements.track;\n const thumb = this.#elements.thumb;\n\n const bodyWidth = body.clientWidth;\n const tableWidth = table.scrollWidth;\n\n const needsHScroll = (bodyWidth !== 0 && tableWidth > bodyWidth);\n this.#owner.classList.toggle('hscroll-visible', needsHScroll);\n\n if (!needsHScroll) {\n return;\n }\n\n const trackWidth = track.clientWidth;\n if (trackWidth <= 0) return;\n\n const thumbWidth = Math.max(Math.min(trackWidth * (bodyWidth / tableWidth), trackWidth), 20);\n thumb.style.width = `${thumbWidth}px`;\n\n const currentLeft = body.scrollLeft;\n const maxScrollLeft = tableWidth - bodyWidth;\n\n let l = 0;\n if (maxScrollLeft > 0) {\n l = parseInt((currentLeft / maxScrollLeft) * (trackWidth - thumbWidth), 10);\n }\n if (l < 0) l = 0;\n\n const maxThumbLeft = trackWidth - thumbWidth;\n if (l > maxThumbLeft) l = maxThumbLeft;\n\n thumb.style.left = `${l}px`;\n\n this.#elements.left.disabled = (l === 0);\n this.#elements.right.disabled = (l >= maxThumbLeft - 1);\n };\n\n #thumbMoveTo = (x) => {\n if (!this.#elements) return false;\n\n const body = this.#elements.container;\n const table = body.querySelector(\"table\");\n if (!table) return false;\n\n const trackBound = this.#elements.track.getBoundingClientRect();\n const thumbWidth = this.#elements.thumb.clientWidth;\n\n let targetX = x;\n if (targetX < 0) targetX = 0;\n const maxThumbLeft = trackBound.width - thumbWidth;\n if (targetX > maxThumbLeft) targetX = maxThumbLeft;\n targetX = parseInt(targetX, 10);\n\n this.#elements.thumb.style.left = `${targetX}px`;\n\n this.#elements.left.disabled = (targetX === 0);\n this.#elements.right.disabled = (targetX >= maxThumbLeft - 1);\n\n const bodyWidth = body.clientWidth;\n const tableWidth = table.scrollWidth;\n const maxScrollLeft = tableWidth - bodyWidth;\n\n if (maxThumbLeft > 0 && maxScrollLeft > 0) {\n const newScrollLeft = (targetX / maxThumbLeft) * maxScrollLeft;\n body.scrollLeft = newScrollLeft;\n }\n\n return (targetX > 0 && targetX < maxThumbLeft - 1);\n };\n\n #init = () => {\n const delayScroll = (pos) => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n const thumbLeft = parseInt(this.#elements.thumb.style.left || 0, 10);\n this.#thumbMoveTo(thumbLeft + pos);\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n const currentThumbLeft = parseInt(this.#elements.thumb.style.left || 0, 10);\n if (!this.#thumbMoveTo(currentThumbLeft + pos)) {\n clearInterval(this.#interval2);\n }\n }, 50);\n }, 500);\n };\n\n const clearTimer = () => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n };\n\n //['mouseup', 'mouseleave', 'touchend'].forEach(evt => {\n ['mouseup', 'mouseleave'].forEach(evt => {\n this.#elements.left.addEventListener(evt, clearTimer);\n this.#elements.right.addEventListener(evt, clearTimer);\n this.#elements.track.addEventListener(evt, clearTimer);\n });\n\n this.#elements.left.addEventListener(\"mousedown\", e => { if (e.button !== 0) return; delayScroll(-20); });\n this.#elements.right.addEventListener(\"mousedown\", e => { if (e.button !== 0) return; delayScroll(20); });\n //this.#elements.left.addEventListener(\"touchstart\", () => delayScroll(-20));\n //this.#elements.right.addEventListener(\"touchstart\", () => delayScroll(20));\n\n this.#elements.track.addEventListener(\"mousedown\", e => {\n if (e.button !== 0) return;\n e.preventDefault();\n const trackRect = this.#elements.track.getBoundingClientRect();\n const thumbWidth = this.#elements.thumb.clientWidth;\n this.#thumbMoveTo(e.clientX - trackRect.left - (thumbWidth / 2));\n });\n\n this.#elements.thumb.addEventListener(\"mousedown\", e => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n this.#dragging = true;\n this.shiftX = e.clientX - this.#elements.thumb.getBoundingClientRect().left;\n\n const onMouseMove = (moveEvent) => {\n if (!this.#dragging) return;\n const trackRect = this.#elements.track.getBoundingClientRect();\n this.#thumbMoveTo(moveEvent.clientX - trackRect.left - this.shiftX);\n };\n\n const onMouseUp = () => {\n this.#dragging = false;\n clearTimer();\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n this.refresh();\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n };\n}\n\nif (!customElements.get('nine-table-hscrollbar')) {\n customElements.define(\"nine-table-hscrollbar\", NineTableHScrollBar);\n}","// ui/nine-table-vscrollbar.js\nimport { trace } from \"@nopeer\";\n\nexport class NineTableVScrollBar extends HTMLElement {\n #host;\n #sheet;\n #dragging = false;\n #elements;\n #startY = 0;\n #startScrollTop = 0;\n #startThumbTop = 0;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#host = this.getRootNode().host;\n this.#sheet = this.closest(\"nine-table-sheet\");\n\n this.innerHTML = `\n <button class='scroll-top' disabled><div class='scroll-icon'></div></button>\n <div class='scroll-track'><div class='scroll-thumb'></div></div>\n <button class='scroll-bottom' disabled><div class='scroll-icon'></div></button>\n `;\n\n const initWhenReady = () => {\n const body = this.#sheet.querySelector(\".ng-sheet-body\");\n if (!body) {\n setTimeout(initWhenReady, 10);\n return;\n }\n\n this.#elements = {\n container: body,\n track: this.querySelector(\".scroll-track\"),\n thumb: this.querySelector(\".scroll-thumb\"),\n top: this.querySelector(\".scroll-top\"),\n bottom: this.querySelector(\".scroll-bottom\"),\n };\n\n this.#init();\n this.refresh();\n };\n\n initWhenReady();\n }\n\n #getScaleInfo = () => {\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords ? viewRecords.length : 0;\n\n const scrollHolder = this.#sheet.elements?.scrollHolder;\n let rawContentHeight = scrollHolder ? parseFloat(scrollHolder.style.height) || 0 : 0;\n\n if (!rawContentHeight || rawContentHeight <= 0) {\n const isGrouped = this.#sheet.sourceTable?.querySelector(\"tbody tr[grouping='true']\") ? true : false;\n if (isGrouped && this.#sheet.rowManager) {\n rawContentHeight = (body.scrollHeight > body.clientHeight) ? body.scrollHeight : (totalCount * 30);\n } else {\n const rowHeight = this.#sheet.getRowHeight() || 1;\n rawContentHeight = totalCount * rowHeight;\n }\n }\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawContentHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n let contentHeight = rawContentHeight;\n\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawContentHeight;\n contentHeight = MAX_BROWSER_HEIGHT;\n }\n\n return { rawContentHeight, contentHeight, scaleFactor, useScaling, totalCount };\n };\n\n\n refresh = () => {\n if (this.#dragging) return;\n\n if (!this.#sheet || !this.#sheet.elements || !this.#elements) return;\n\n const body = this.#elements.container;\n const track = this.#elements.track;\n const thumb = this.#elements.thumb;\n const { contentHeight } = this.#getScaleInfo();\n\n const fixedHeight = (this.#sheet.querySelector('thead')?.offsetHeight || 0) +\n (this.#sheet.querySelector('tfoot')?.offsetHeight || 0) +\n (this.#sheet.querySelector('tbody.head')?.offsetHeight || 0);\n\n const bodyHeight = (this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0);\n const viewHeight = bodyHeight - fixedHeight;\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords.length;\n\n const rawContentHeight = this.#sheet.getRowHeight() * totalCount;\n\n const needsVScroll = (rawContentHeight > viewHeight);\n\n this.#sheet.classList.toggle('vscroll-visible', needsVScroll);\n\n if (!needsVScroll) {\n return;\n }\n\n const trackHeight = track.clientHeight;\n if (trackHeight <= 0) return;\n\n const thumbHeight = Math.max(Math.min(trackHeight * (bodyHeight / rawContentHeight), trackHeight), 20);\n thumb.style.height = `${thumbHeight}px`;\n\n const currentScrollTop = body.scrollTop;\n const maxScrollTop = Math.max(contentHeight - this.#sheet.rowManager.getRowHeight(), 1);\n\n let thumbTop = 0;\n if (maxScrollTop > 0) {\n thumbTop = (currentScrollTop / maxScrollTop) * (trackHeight - thumbHeight);\n }\n\n const maxThumbTop = trackHeight - thumbHeight;\n if (thumbTop < 0) thumbTop = 0;\n if (thumbTop > maxThumbTop) thumbTop = maxThumbTop;\n\n thumb.style.top = `${thumbTop}px`;\n\n this.#elements.top.disabled = (currentScrollTop <= 0);\n this.#elements.bottom.disabled = (currentScrollTop >= maxScrollTop - 1);\n };\n\n #init = () => {\n\n this.#elements.thumb.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n this.#dragging = true;\n\n this.#startY = e.clientY;\n this.#startThumbTop = parseFloat(this.#elements.thumb.style.top) || 0;\n const trackRect = this.#elements.track.getBoundingClientRect();\n const trackHeight = trackRect.height;\n const thumbHeight = this.#elements.thumb.clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n\n const onMouseMove = (moveEvent) => {\n if (!this.#dragging) return;\n if (maxThumbTop <= 0) return;\n\n\n const deltaY = moveEvent.clientY - this.#startY;\n let targetThumbTop = this.#startThumbTop + deltaY;\n\n if (targetThumbTop < 0) targetThumbTop = 0;\n if (targetThumbTop > maxThumbTop) targetThumbTop = maxThumbTop;\n\n this.#elements.thumb.style.top = `${targetThumbTop}px`;\n\n const ratio = targetThumbTop / maxThumbTop;\n\n const rowHeight =this.#sheet.getRowHeight();\n const viewHeight = (this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0) -\n (this.#sheet.elements.body.thead?.offsetHeight || 0) -\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) -\n (this.#sheet.elements.body.tbody.head.offsetHeight || 0);\n\n const visibleRowCount = Math.floor(viewHeight / rowHeight);\n\n const { totalCount } = this.#getScaleInfo();\n const targetRow = Math.floor(ratio * (totalCount - visibleRowCount + 1));\n\n this.#sheet.rowManager.scrollToDataRow(targetRow);\n\n const { rawContentHeight, contentHeight } = this.#getScaleInfo();\n const currentScrollTop = this.#elements.container.scrollTop;\n const maxScrollTop = Math.max(contentHeight - this.#sheet.rowManager.getRowHeight(), 0);\n\n this.#elements.top.disabled = (currentScrollTop <= 0);\n this.#elements.bottom.disabled = (currentScrollTop >= maxScrollTop - 1);\n };\n\n const onMouseUp = () => {\n this.#dragging = false;\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n\n this.#elements.track.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0 || e.target === this.#elements.thumb) return;\n const trackRect = this.#elements.track.getBoundingClientRect();\n const thumbHeight = this.#elements.thumb.clientHeight;\n const trackHeight = this.#elements.track.clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n\n if (maxThumbTop > 0) {\n const clickY = e.clientY - trackRect.top - (thumbHeight / 2);\n const ratio = Math.max(0, Math.min(1, clickY / maxThumbTop));\n\n const { totalCount } = this.#getScaleInfo();\n const targetRow = Math.max(0, Math.min(Math.floor(ratio * (totalCount - 1)), totalCount - 1));\n\n\n if (targetRow >= 0 && this.#sheet.rowManager && typeof this.#sheet.rowManager.scrollToDataRow === 'function') {\n this.#sheet.rowManager.scrollToDataRow(targetRow, 'top');\n }\n }\n this.refresh();\n });\n\n let scrollInterval = null;\n\n const startContinuousScroll = (direction) => {\n if (scrollInterval) return;\n\n const scrollStep = () => {\n const $firstTr = this.#sheet.querySelector(\"tbody.body tr\");\n\n if (!$firstTr || $firstTr.dataset.row === undefined) {\n return;\n }\n\n if (direction === 'down' && this.#sheet.isLastRow()) {\n return;\n }\n\n const currentRow = parseInt($firstTr.dataset.row, 10);\n const targetRow = direction === 'down' ? currentRow+1 : Math.max(0, currentRow-1);\n\n this.#sheet.rowManager.scrollToDataRow(targetRow, null, () => {\n this.refresh();\n });\n };\n\n scrollStep();\n scrollInterval = setInterval(scrollStep, 200); // 100ms ๊ฐ„๊ฒฉ ๋ฐ˜๋ณต\n };\n\n const stopContinuousScroll = () => {\n if (scrollInterval) {\n clearInterval(scrollInterval);\n scrollInterval = null;\n }\n };\n\n this.#elements.top.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n startContinuousScroll('up');\n });\n\n this.#elements.bottom.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n startContinuousScroll('down');\n });\n\n document.addEventListener(\"mouseup\", stopContinuousScroll);\n this.#elements.top.addEventListener(\"mouseleave\", stopContinuousScroll);\n this.#elements.bottom.addEventListener(\"mouseleave\", stopContinuousScroll);\n };\n}\n\nif (!customElements.get('nine-table-vscrollbar')) {\n customElements.define(\"nine-table-vscrollbar\", NineTableVScrollBar);\n}\n\n","import { trace } from \"@nopeer\";\n\nexport const GROUP_IDX = {\n\tID: 0,\n\tDEPTH: 1,\n\tNAME: 2,\n\tCHILDREN: 3,\n};\n\nexport class GroupingManager {\n\t#sheet;\n\t#host;\n\t#groupColumns = [];\n\t#groupMap = new Map(); // ๊ทธ๋ฃน๋ณ„ ์ž์‹ ID ๋งคํ•‘ ๊ด€๋ฆฌ์šฉ\n\t#isApplying = false;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = this.#sheet.getRootNode().host;\n\t}\n\n\tget columns() {\n\t\treturn this.#groupColumns;\n\t}\n\n\tget groupMap() {\n\t\treturn this.#groupMap;\n\t}\n\n\tinitialize = () => {\n\t\tlet groupColumns = [];\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (sourceTable) {\n\t\t\tsourceTable.querySelectorAll('tbody tr[grouping=\"true\"]').forEach(($tr) => {\n\t\t\t\tconst $cell =$tr.querySelector(`[cell-type=\"tree\"]`);\n\t\t\t\tif ($cell &&$cell.dataset.bind) {\n\t\t\t\t\tgroupColumns.push($cell.dataset.bind);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#groupColumns = groupColumns;\n\t};\n\n\tapply() {\n\n\t\tif (this.#isApplying) return;\n\t\tthis.#isApplying = true;\n\n\t\tlet groupColumns = [];\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (sourceTable) {\n\t\t\tsourceTable.querySelectorAll('tbody tr[grouping=\"true\"]').forEach(($tr) => {\n\t\t\t\tconst $cell =$tr.querySelector(`[cell-type=\"tree\"]`);\n\t\t\t\tif ($cell &&$cell.dataset.bind) {\n\t\t\t\t\tgroupColumns.push($cell.dataset.bind);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#groupColumns = groupColumns;\n\n\t\tthis.#isApplying = false;\n\t\tthis.#sheet.scrollToY(0);\n\t\tthis.#sheet.view.refresh();\n\t}\n\n\tclear() {\n\t\tthis.#groupColumns = [];\n\t\tthis.#groupMap.clear();\n\t\tthis.#isApplying = false;\n\t\tthis.#sheet.scrollToY(0);\n\t\tthis.#sheet.view.refresh();\n\t}\n\n\tsetGroupMap(map) {\n\t\tthis.#groupMap = map;\n\t}\n\n\tgetChildrenRowIds(groupId) {\n\t\treturn this.#groupMap.get(groupId) || [];\n\t}\n\n\tgetChildrenRecords(groupId) {\n\t\tconst rowIds = this.getChildrenRowIds(groupId);\n\t\tconst dataManager = this.#host.data;\n\t\treturn rowIds.map(rowid => dataManager.getArray(rowid)).filter(Boolean);\n\t}\n}\n\nexport class Grouping {\n\n\tstatic apply(rawRecords, groupColumns = [], fields = []) {\n\t\tif (!groupColumns || groupColumns.length === 0) {\n\t\t\treturn { headers: [], renderItems: [], groupMap: new Map() };\n\t\t}\n\n\t\tconst validRaw = rawRecords.filter(o => !o.__ng?.deleted);\n\t\tconst groupMap = new Map();\n\n\t\tconst nestedTree = Grouping.#buildNestedMap(validRaw, groupColumns, fields);\n\t\tconst flatResult = [];\n\t\tconst renderItems = [];\n\n\t\tGrouping.#flattenTree(nestedTree, 0, groupColumns, flatResult, renderItems, groupMap, \"\");\n\n\t\treturn { headers: flatResult, renderItems, groupMap };\n\t}\n\n\tstatic #flattenTree(mapOrArray, depth, groupColumns, resultArr, renderItems, groupMap, parentId) {\n\t\tlet counter = 0;\n\t\tconst isLastLevel = (depth === groupColumns.length - 1); // ๐Ÿ’ก ์—ฐ์‚ฐ์ž ์ˆ˜์ • ๋ฐ˜์˜\n\n\t\tfor (let [groupKey, subMapOrRecords] of mapOrArray.entries()) {\n\t\t\tconst groupId = parentId ? `${parentId}_${counter++}` : `g_${counter++}`;\n\n\t\t\tconst rowIds = Grouping.#collectLeafRowIds(subMapOrRecords);\n\t\t\tgroupMap.set(groupId, rowIds);\n\n\t\t\tconst groupRecord = [];\n\t\t\tgroupRecord[GROUP_IDX.ID] = groupId;\n\t\t\tgroupRecord[GROUP_IDX.DEPTH] = depth;\n\t\t\tgroupRecord[GROUP_IDX.NAME] = groupKey;\n\t\t\tgroupRecord[GROUP_IDX.CHILDREN] = rowIds;\n\n\t\t\tgroupRecord.__isGroupHeader = true;\n\t\t\tgroupRecord.__groupId = groupId;\n\n\t\t\tresultArr.push(groupRecord);\n\n\t\t\trenderItems.push({\n\t\t\t\ttype: 'group',\n\t\t\t\trecord: groupRecord,\n\t\t\t\tgroupId: groupId\n\t\t\t});\n\n\t\t\tif (!isLastLevel && subMapOrRecords instanceof Map) {\n\t\t\t\tGrouping.#flattenTree(subMapOrRecords, depth + 1, groupColumns, resultArr, renderItems, groupMap, groupId);\n\t\t\t} else {\n\t\t\t\tconst leafRecords = Grouping.#collectLeafRecords(subMapOrRecords);\n\t\t\t\tleafRecords.forEach(record => {\n\t\t\t\t\trecord.__isGroupHeader = false;\n\t\t\t\t\trecord.__groupId = groupId;\n\t\t\t\t\tresultArr.push(record);\n\n\t\t\t\t\trenderItems.push({\n\t\t\t\t\t\ttype: 'data',\n\t\t\t\t\t\trecord: record,\n\t\t\t\t\t\tgroupId: groupId\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic #buildNestedMap(records, groupColumns, fields) {\n\t\tconst colIndex = fields.indexOf(groupColumns[0]);\n\t\tconst remainingCols = groupColumns.slice(1);\n\t\tconst map = new Map();\n\n\t\trecords.forEach(record => {\n\t\t\tconst key = colIndex >= 0 ? record.v[colIndex] : '(Unknown)';\n\t\t\tif (!map.has(key)) map.set(key, []);\n\t\t\tmap.get(key).push(record);\n\t\t});\n\n\t\tif (remainingCols.length > 0) {\n\t\t\tconst result = new Map();\n\t\t\tfor (let [key, subRecords] of map.entries()) {\n\t\t\t\tresult.set(key, Grouping.#buildNestedMap(subRecords, remainingCols, fields));\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\treturn map;\n\t}\n\n\tstatic #collectLeafRowIds(subMapOrRecords) {\n\t\tlet rowIds = [];\n\t\tif (subMapOrRecords instanceof Map) {\n\t\t\tfor (let subVal of subMapOrRecords.values()) {\n\t\t\t\trowIds = rowIds.concat(Grouping.#collectLeafRowIds(subVal));\n\t\t\t}\n\t\t} else if (Array.isArray(subMapOrRecords)) {\n\t\t\trowIds = rowIds.concat(subMapOrRecords.map(r => r.__ng?.rowid ?? r.m?._?.[0]));\n\t\t}\n\t\treturn rowIds;\n\t}\n\n\tstatic #collectLeafRecords(subMapOrRecords) {\n\t\tlet records = [];\n\t\tif (subMapOrRecords instanceof Map) {\n\t\t\tfor (let subVal of subMapOrRecords.values()) {\n\t\t\t\trecords = records.concat(Grouping.#collectLeafRecords(subVal));\n\t\t\t}\n\t\t} else if (Array.isArray(subMapOrRecords)) {\n\t\t\trecords = records.concat(subMapOrRecords);\n\t\t}\n\t\treturn records;\n\t}\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { GROUP_IDX } from \"@/data/Grouping.js\";\n\nexport class RowManager {\n #BUFFER_ROW_COUNT = 3;\n\n #host;\n #sheet;\n #element;\n\n #containerTemplates = new Map();\n\n #resizeObserver = null;\n #sheetHeight = 0;\n #cachedRowCount;\n\n #isProgrammaticScroll = false;\n #isGrouped = false;\n\n constructor(sheet) {\n this.#host = sheet.getRootNode().host;\n this.#sheet = sheet;\n\n this.#initResizeObserver();\n }\n\n getRowHeight() {\n return this.#sheet.template.height;\n }\n\n refresh = (force = false) => {\n\n if (!this.#sheet.classList.contains('active')) return;\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n if (!bodyViewport) return;\n\n const wasInvalidHeight = !this.#sheet.template.height || this.#sheet.template.height <= 0;\n\n if (wasInvalidHeight) {\n this.#measureAndCacheHeight();\n if (this.#sheet.template.height && this.#sheet.template.height > 0) {\n this.#renderAllContainers();\n }\n }\n\n\n this.#handleScroll(bodyViewport.scrollTop, force);\n\n this.#sheet.querySelector('nine-table-vscrollbar')?.refresh();\n };\n\n #handleScroll = (scrollTop, force = false) => {\n\n if (this.#isGrouped) {\n this.#handleGroupedScroll(scrollTop, force);\n return;\n }\n\n const rowHeight = this.#sheet.template.height;\n if (!rowHeight || rowHeight <= 0) return;\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords.length;\n\n if (totalCount === 0) {\n this.#sheet.elements.scrollHolder.style.height = '0px';\n return;\n }\n\n const fixedHeight = (this.#sheet.elements.body.thead?.offsetHeight || 0) +\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) +\n this.#sheet.elements.body.tbody.head.offsetHeight;\n\n const viewHeight = this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0;\n const rawTotalVirtualHeight = Math.max(totalCount * rowHeight - (viewHeight - fixedHeight - rowHeight) - rowHeight, 0);\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawTotalVirtualHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n let totalVirtualHeight = rawTotalVirtualHeight;\n\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawTotalVirtualHeight;\n totalVirtualHeight = MAX_BROWSER_HEIGHT;\n }\n\n\n this.#sheet.elements.scrollHolder.style.height = `${totalVirtualHeight}px`;\n\n const actualScrollTop = useScaling ? (scrollTop / scaleFactor) : scrollTop;\n\n const maxStartIndex = Math.max(0, totalCount - 1);\n const clampedScrollTop = Math.min(actualScrollTop, rawTotalVirtualHeight);\n const startIndex = Math.max(0, Math.min(Math.floor(clampedScrollTop / rowHeight), maxStartIndex));\n\n //trace.log(clampedScrollTop % rowHeight, rowHeight);\n\n /*\n * FIX: Use GPU-accelerated transform3d instead of 'top' positioning.\n * On mobile devices (iOS Safari), direct 'top' updates trigger expensive\n * layout reflows and cause severe scrolling lag during inertia touch scrolls.\n * translate3d forces hardware compositing for buttery-smooth performance.\n */\n this.#sheet.elements.left.tbody.body.style.transform =\n this.#sheet.elements.body.tbody.body.style.transform =\n this.#sheet.elements.right.tbody.body.style.transform = `translate3d(0px, -${clampedScrollTop % rowHeight}px, 0px)`;\n\n\n const firstTr = this.#element.firstTr;\n const currentStartIndex = firstTr && firstTr.dataset.row !== undefined ? parseInt(firstTr.dataset.row, 10) : -1;\n\n if (!force && currentStartIndex === startIndex) {\n return;\n }\n\n [\n this.#sheet.elements.left.tbody.body,\n this.#sheet.elements.body.tbody.body,\n this.#sheet.elements.right.tbody.body\n ].forEach(($tbody, tbodyIdx) => {\n if (!$tbody) return;\n\n const rows = $tbody.querySelectorAll('tbody.body tr');\n\n rows.forEach(($tr, index) => {\n const dataIndex = startIndex + Math.floor(index / this.#sheet.template.length);\n\n if (dataIndex >= totalCount) {\n $tr.style.display = 'none';\n $tr.dataset.matrixRow = null;\n $tr.dataset.row = null;\n $tr.dataset.index = null;\n return;\n }\n\n const record = viewRecords[dataIndex];//this.#sheet.view.getArray(dataIndex);\n\n if (!record) {\n $tr.style.display = 'none';\n return;\n }\n\n const rowid = record.m._[NINE_TABLE.META.INDEX.ROWID];\n\n $tr.style.display = '';\n\n this.#bindRowData($tr, record, rowid, dataIndex);\n });\n });\n\n this.#sheet.selection.refresh();\n };\n\n\n #handleGroupedScroll = (scrollTop, force = false) => {\n\n const allRenderItems = this.#sheet.view.getArray() || [];\n const totalVirtualCount = allRenderItems.length;\n\n if (totalVirtualCount === 0) {\n this.#sheet.elements.scrollHolder.style.height = '0px';\n return;\n }\n\n\n const bodyContent = this.#sheet.querySelector('.ng-sheet-body .ng-sheet-body-content');\n const templateLength = this.#sheet.templateLength || 1;\n\n const getItemHeight = (item) => {\n if (item.type === 'group') {\n const depth = item.record[GROUP_IDX.DEPTH] || 0;\n const groupHeight = this.#sheet.template.height[depth] || this.#sheet.template.height / templateLength;\n return groupHeight;\n } else {\n let dataRowsHeight = 0;\n const templateLength = this.#sheet.templateLength || 1;\n\n let groupHeightsTotal = 0;\n for(let i = 0; i < templateLength - 1; i++) {\n groupHeightsTotal += this.#sheet.template.heights[i] || 0;\n }\n dataRowsHeight = this.#sheet.template.height - groupHeightsTotal;\n\n return dataRowsHeight > 0 ? dataRowsHeight : this.#sheet.template.height;\n }\n };\n\n\n let totalVirtualHeight = 0;\n const itemHeights = new Array(totalVirtualCount);\n for (let i = 0; i < totalVirtualCount; i++) {\n const h = getItemHeight(allRenderItems[i]);\n itemHeights[i] = h;\n totalVirtualHeight += h;\n }\n\n this.#sheet.elements.scrollHolder.style.height = `${totalVirtualHeight}px`;\n\n const viewportClientHeight = this.#sheet.clientHeight;\n\n let accumulatedHeight = 0;\n let startIndex = 0;\n\n for (let i = 0; i < totalVirtualCount; i++) {\n const h = itemHeights[i];\n if (accumulatedHeight + h > scrollTop) {\n startIndex = i;\n break;\n }\n accumulatedHeight += h;\n startIndex = i;\n }\n\n const offsetY = scrollTop - accumulatedHeight;\n if (bodyContent) {\n bodyContent.querySelectorAll(\"tbody\").forEach(($tbody) => {\n $tbody.style.top = `-${Math.max(0, offsetY)}px`;\n });\n }\n\n const firstTr = this.#element.firstTr;\n const currentStartIndex = firstTr && firstTr.dataset.virtualIndex !== undefined\n ? parseInt(firstTr.dataset.virtualIndex, 10)\n : -1;\n\n if (!force && currentStartIndex === startIndex) {\n return;\n }\n\n const visibleRowsCount = Math.ceil(viewportClientHeight / (this.#sheet.template.height / templateLength));\n const dynamicBuffer = (this.#sheet.grouping.columns?.length || 1) * 15;\n const targetStart = startIndex;\n const targetEnd = Math.min(totalVirtualCount, startIndex + visibleRowsCount + dynamicBuffer);\n const renderedItems = allRenderItems.slice(targetStart, targetEnd);\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (!container) return;\n\n const trs = Array.from(container.querySelectorAll('tbody.body tr'));\n\n for (let i = 0; i < trs.length; i += templateLength) {\n const itemIndex = Math.floor(i / templateLength);\n const item = renderedItems[itemIndex];\n const chunkTrs = trs.slice(i, i + templateLength);\n\n if (!item || itemIndex >= renderedItems.length) {\n chunkTrs.forEach(tr => {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n });\n continue;\n }\n\n const dataIndex = startIndex + itemIndex;\n\n chunkTrs.forEach((tr, subIdx) => {\n const virtualIndex = startIndex + itemIndex;\n tr.dataset.virtualIndex = virtualIndex;\n tr.dataset.row = (item.type === 'data') ? dataIndex : '';\n\n const isTrGroup = tr.getAttribute('grouping') === 'true';\n\n if (item.type === 'group') {\n if (isTrGroup) {\n const depth = item.record[GROUP_IDX.DEPTH];\n if (subIdx === depth) {\n tr.style.display = '';\n this.#bindGroupRowData(tr, allRenderItems, item.record, virtualIndex);\n } else {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n }\n } else {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n }\n } else {\n if (isTrGroup) {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n } else {\n tr.style.display = '';\n\n const rowid = item.record.m?.rowid ?? 0;\n this.#bindRowData(tr, item.record, rowid, virtualIndex);\n }\n }\n });\n }\n });\n\n this.#sheet.selection.refresh();\n };\n\n #bindGroupRowData = ($tr, allRenderItems, groupRecord, virtualIndex) => {\n const templateLength = this.#sheet.templateLength || 1;\n const subRowIndex = parseInt($tr.dataset.subrow, 10) || 0;\n const matrixRow = (virtualIndex * templateLength) + subRowIndex;\n\n const indices = groupRecord[GROUP_IDX.CHILDREN];\n const allRecords = this.#host.data.getArray();\n const childrenRecords = indices ? indices.map(idx => allRecords[idx]).filter(Boolean) : [];\n\n\n $tr.dataset.virtualIndex = virtualIndex;\n $tr.dataset.row = '';\n $tr.dataset.matrixRow = matrixRow;\n $tr.data = childrenRecords;//groupRecord;\n $tr.dataset.groupId = groupRecord[GROUP_IDX.ID];\n\n\n Array.from($tr.cells).forEach(($cell) => {\n\n $cell.dataset.row = virtualIndex;\n\n const customComp = Array.from($cell.children).find($el =>\n $el.tagName.toLowerCase().startsWith('cell-') || typeof $el.refresh === 'function'\n );\n\n\n if (customComp !== undefined && typeof customComp.refresh === 'function') {\n customComp?.refresh();\n }\n });\n };\n\n #bindRowData = ($tr, record, rowid, dataIndex) => {\n const templateLength = this.#sheet.templateLength || 1;\n const subRowIndex = parseInt($tr.dataset.subrow, 10) || 0;\n const matrixRow = (dataIndex * templateLength) + subRowIndex;\n\n $tr.dataset.index = dataIndex;\n $tr.dataset.row = rowid;\n $tr.dataset.matrixRow = matrixRow;\n $tr.data = record;\n\n Array.from($tr.cells).forEach(($cell) => {\n $cell.dataset.index = dataIndex;\n $cell.dataset.row = rowid;\n\n const customComp = Array.from($cell.children).find($el =>\n $el.tagName.toLowerCase().startsWith('cell-') && typeof $el.refresh === 'function'\n );\n\n customComp?.refresh();\n });\n };\n\n initialize = () => {\n\n this.#isGrouped = this.#sheet.sourceTable.querySelector(\"tbody tr[grouping='true']\") ? true : false;\n\n //this.#cachedTemplateHeight = null;\n this.#containerTemplates.clear();\n\n this.#element = {\n scrollTables: this.#sheet.querySelectorAll('.ng-sheet-body table'),\n firstTr: this.#sheet.querySelector('.ng-sheet-body .ng-container-body tbody.body tr'),\n };\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (!container) return;\n\n const tableEl = container.querySelector('table');\n if (!tableEl) return;\n\n const tbody = tableEl.querySelector('tbody.body');\n if (!tbody) return;\n\n const trs = Array.from(tbody.querySelectorAll('tr'));\n const templateTrs = trs.map(tr => tr.cloneNode(true));\n this.#containerTemplates.set(selector, templateTrs);\n });\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\n if (bodyViewport) {\n this.#sheetHeight = bodyViewport.clientHeight;\n //trace.log(\"this.#sheetHeight\", this.#sheetHeight, this.#sheet);\n\n this.#measureAndCacheHeight();\n this.#renderAllContainers();\n this.#handleScroll(bodyViewport.scrollTop, true);\n\n bodyViewport.addEventListener('scroll', (e) => {\n\n if (this.#isProgrammaticScroll) return;\n\n const rowHeight = this.#sheet.template.height || 0;\n const totalCount = this.#sheet.view.getArray()?.length || 0;\n const rawTotalVirtualHeight = totalCount * rowHeight;\n\n if (rawTotalVirtualHeight <= bodyViewport.clientHeight) {\n return;\n }\n\n this.#handleScroll(bodyViewport.scrollTop);\n\n this.#sheet.querySelector('nine-table-vscrollbar').refresh();\n\n }, { passive: true });\n }\n };\n\n scrollToDataRow(dataRow, align = 'top', onRendered) {\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords?.length || 0;\n\n const targetRow = Math.max(0, Math.min(dataRow, totalCount - 1));\n let targetScrollTop = 0;\n\n if (this.#isGrouped) {\n const maxScrollTop = Math.max(bodyViewport.scrollHeight - bodyViewport.clientHeight, 1);\n // targetRow๊ฐ€ ์ „์ฒด totalCount์—์„œ ์ฐจ์ง€ํ•˜๋Š” ๋น„์œจ(ratio)๋งŒํผ ์‹ค์ œ ์Šคํฌ๋กค ์ตœ๋Œ€ ๋†’์ด์— ๊ณฑํ•ด์คŒ\n const ratio = targetRow / Math.max(totalCount - 1, 1);\n targetScrollTop = ratio * maxScrollTop;\n } else {\n\n const rowHeight = this.#sheet.template.height;\n const rawTargetScrollTop = targetRow * rowHeight;\n\n const fixedHeight = (this.#sheet.elements.body.thead?.offsetHeight || 0) +\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) +\n this.#sheet.elements.body.tbody.head.offsetHeight;\n\n const viewHeight = bodyViewport.offsetHeight || 0;\n const rawTotalVirtualHeight = Math.max(totalCount * rowHeight + fixedHeight - viewHeight, 0);\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawTotalVirtualHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawTotalVirtualHeight;\n }\n\n targetScrollTop = rawTargetScrollTop * scaleFactor;\n }\n\n this.#isProgrammaticScroll = true;\n bodyViewport.scrollTop = targetScrollTop;\n this.#handleScroll(targetScrollTop);\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.#isProgrammaticScroll = false;\n if (typeof onRendered === 'function') onRendered();\n });\n });\n }\n\n\n\n destroy = () => {\n if (this.#resizeObserver) {\n this.#resizeObserver.disconnect();\n this.#resizeObserver = null;\n }\n };\n\n #measureAndCacheHeight = () => {\n return;\n if (!this.#sheet.classList.contains('active')) return;\n\n if (!this.#sheet.sourceTable) return;\n\n const trTemplates = this.#sheet.sourceTable?.querySelectorAll('tbody.body tr');\n\n const $tbody = this.#sheet.querySelector('.ng-container-body tbody.body');\n if (!$tbody) return;\n\n $tbody?.querySelectorAll('tr')?.forEach(tr => tr.remove());\n\n const fragment = document.createDocumentFragment();\n trTemplates.forEach($tr => fragment.appendChild($tr.cloneNode(true)));\n $tbody?.appendChild(fragment);\n\n const renderedTrs = $tbody.querySelectorAll('tr');\n\n\n renderedTrs.forEach(tr => tr.remove());\n\n\n this.#updateRowCount();\n };\n\n #updateRowCount = () => {\n\n if (this.#sheetHeight > 0 && this.#sheet.template.height > 0) {\n const visibleRows = Math.ceil(this.#sheetHeight / this.#sheet.template.height);\n\n let dynamicBuffer = this.#BUFFER_ROW_COUNT;\n if (this.#isGrouped && this.#sheet.grouping) {\n const groupDepth = this.#sheet.grouping.columns?.length || 1;\n dynamicBuffer += (groupDepth * 15);\n }\n\n this.#cachedRowCount = visibleRows + dynamicBuffer;\n }\n };\n\n #renderAllContainers = () => {\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (container && container.querySelector('tbody')) {\n this.#renderRows(container);\n }\n });\n\n this.#syncRowHeights();\n };\n\n #renderRows = (container) => {\n let targetFixedType = null;\n if (container.classList.contains('ng-container-left')) targetFixedType = 'left';\n else if (container.classList.contains('ng-container-right')) targetFixedType = 'right';\n\n const templateTrs = Array.from(this.#sheet.sourceTable.querySelectorAll('tbody.body tr')).map(tr => {\n const clonedTr = tr.cloneNode(true);\n\n if (targetFixedType === 'left') {\n clonedTr.querySelectorAll('th,td').forEach($cell => {\n if ($cell.getAttribute('fixed') !== 'left') $cell.remove();\n });\n } else if (targetFixedType === 'right') {\n clonedTr.querySelectorAll('th,td').forEach($cell => {\n if ($cell.getAttribute('fixed') !== 'right') $cell.remove();\n });\n } else {\n clonedTr.querySelectorAll('[fixed=left], [fixed=right]').forEach($cell => {\n $cell.remove();\n });\n }\n\n return clonedTr;\n });\n\n if (templateTrs.length === 0) return;\n\n const targetTbody = container.querySelector('tbody.body');\n if (!targetTbody) return;\n\n targetTbody.querySelectorAll(\"tr\").forEach(tr => tr.remove());\n\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < this.#cachedRowCount; i++) {\n templateTrs.forEach(tmpl => fragment.appendChild(tmpl.cloneNode(true)));\n }\n\n\n targetTbody.appendChild(fragment);\n\n if (container.classList.contains('ng-container-body')) {\n this.#element.firstTr = targetTbody.querySelector('tr');\n }\n };\n\n\n\n #syncRowHeights = () => {\n const leftTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-left table');\n const bodyTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-body table');\n const rightTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-right table');\n\n if (bodyTable) {\n const leftRows = leftTable ? Array.from(leftTable.querySelectorAll('tbody tr')) : [];\n const bodyRows = Array.from(bodyTable.querySelectorAll('tbody tr'));\n const rightRows = rightTable ? Array.from(rightTable.querySelectorAll('tbody tr')) : [];\n\n const maxRows = Math.max(leftRows.length, bodyRows.length, rightRows.length);\n\n for (let i = 0; i < maxRows; i++) {\n const heights = [\n leftRows[i]?.getBoundingClientRect().height || 0,\n bodyRows[i]?.getBoundingClientRect().height || 0,\n rightRows[i]?.getBoundingClientRect().height || 0\n ];\n const maxHeight = Math.max(...heights);\n\n if (maxHeight > 0) {\n if (leftRows[i]) leftRows[i].style.height = `${maxHeight}px`;\n if (bodyRows[i]) bodyRows[i].style.height = `${maxHeight}px`;\n if (rightRows[i]) rightRows[i].style.height = `${maxHeight}px`;\n }\n }\n }\n };\n\n #initResizeObserver = () => {\n\n if (!this.#sheet || !(this.#sheet instanceof HTMLElement)) return;\n\n this.#resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n\n const sheetEl = entry.target;\n if (!sheetEl.classList.contains('active')) continue;\n\n const height = entry.contentRect.height;\n const width = entry.contentRect.width;\n\n if (width > 0 && this.#sheet.isAutoFitCol) {\n this.#sheet.autoFit(true);\n }\n\n if (height > 0 && this.#sheetHeight !== height) {\n this.#sheetHeight = height;\n //trace.log(\"this.#sheetHeight\", this.#sheetHeight);\n this.#updateRowCount();\n\n if (this.#sheet.template.height !== null) {\n this.#renderAllContainers();\n this.refresh();\n }\n }\n }\n });\n\n this.#resizeObserver.observe(this.#sheet);\n };\n}","import { trace } from \"@nopeer\";\n\nexport const COLLAPSED_WIDTH = 16;\n\nexport class TableCompiler {\n\n static compile($srcTable) {\n\n const $table = $srcTable.cloneNode(true);\n\n TableCompiler.resetColIndex($table, $table.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tfoot tr'));\n\n TableCompiler.#syncColAttributes($table);\n\n return $table;\n }\n\n static recompile($table) {\n\n\n TableCompiler.resetColIndex($table, $table.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tfoot tr'));\n\n TableCompiler.#syncColAttributes($table);\n\n return $table;\n }\n\n static #syncColAttributes($table) {\n\n $table.querySelectorAll('colgroup col').forEach(($col, i) => {\n $col.setAttribute('data-col', i);\n const fixed = $col.getAttribute('fixed');\n\n $table.querySelectorAll(`[data-col=\"${i}\"]`).forEach($el => {\n fixed ? $el.setAttribute('fixed', fixed) : $el.removeAttribute('fixed');\n });\n });\n }\n\n static resetColIndex($table, trs) {\n\n const cols = $table.querySelectorAll('colgroup col');\n const grid = Array.from({ length: trs.length }, () => Array(cols.length).fill(null));\n\n trs.forEach(($tr, index) => {\n\n $tr.dataset.subrow = index;\n\n let colIndex = 0;\n\n $tr.querySelectorAll('th, td').forEach($cell => {\n\n while (colIndex < cols.length && grid[index][colIndex] !== null) {\n colIndex++;\n }\n\n $cell.dataset.col = colIndex;\n\n const rowSpan = $cell.rowSpan || 1;\n const colSpan = $cell.colSpan || 1;\n\n for (let r = 0; r < rowSpan; r++) {\n for (let c = 0; c < colSpan; c++) {\n if (index + r < trs.length && colIndex + c < cols.length) {\n grid[index + r][colIndex + c] = $cell;\n }\n }\n }\n\n colIndex += colSpan;\n });\n });\n }\n\n}","import { trace } from \"@nopeer\";\n\nexport class CellSelection {\n\t#sheet;\n\t#range = { startRow: -1, startCol: -1, endRow: -1, endCol: -1 };\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#initEvents();\n\t}\n\n\t#getMatrixRow(tr) {\n\t\tif (!tr) return { dataRow: -1, subRowIndex: -1, matrixRow: -1 };\n\n\t\tconst dataRow = parseInt(tr.dataset.index, 10);\n\t\tif (isNaN(dataRow)) return { dataRow: -1, subRowIndex: -1, matrixRow: -1 };\n\n\t\tconst tbody = tr.closest('tbody');\n\t\tconst trs = Array.from(tbody.querySelectorAll('tr'));\n\n\t\tconst sameGroupTrs = trs.filter(t => parseInt(t.dataset.index, 10) === dataRow);\n\t\tconst subRowIndex = sameGroupTrs.indexOf(tr);\n\t\tconst templateLength = sameGroupTrs.length > 0 ? sameGroupTrs.length : 1;\n\n\t\tconst matrixRow = (dataRow * templateLength) + (subRowIndex >= 0 ? subRowIndex : (tr.sectionRowIndex % templateLength));\n\n\t\treturn { dataRow, subRowIndex, matrixRow };\n\t}\n\n\tsetFocus(matrixRow, col) {\n\t\tthis.#sheet.querySelectorAll(`tr.selected-start`).forEach($tr => {\n\t\t\t$tr.classList.remove(\"selected-start\");\n\t\t\t$tr.querySelectorAll(`td.selected-start`).forEach($td => {\n\t\t\t\t$td.classList.remove(\"selected-start\");\n\t\t\t});\n\t\t});\n\n\t\tconst $td = this.#sheet.querySelector(`.ng-sheet-body-content tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${col}\"]`);\n\t\tif (!$td) return;\n\n\t\t$td.classList.add(\"selected-start\");\n\t\t$td.closest('tr')?.classList.add(\"selected-start\");\n\t}\n\n\tsetRange(startRow, startCol, endRow, endCol) {\n\t\tlet r1 = Math.min(startRow, endRow);\n\t\tlet r2 = Math.max(startRow, endRow);\n\t\tlet c1 = Math.min(startCol, endCol);\n\t\tlet c2 = Math.max(startCol, endCol);\n\n\t\tconst containers = this.#sheet.querySelectorAll('.ng-container-left, .ng-container-body, .ng-container-right');\n\n\t\tlet expanded = true;\n\t\tlet loopCount = 0;\n\n\t\twhile (expanded && loopCount < 5) {\n\t\t\texpanded = false;\n\t\t\tloopCount++;\n\n\t\t\tcontainers.forEach(container => {\n\n\t\t\t\tconst visibleTrs = Array.from(container.querySelectorAll('tbody tr')).filter(tr => {\n\t\t\t\t\treturn tr.style.display !== 'none'; // ํ˜น์€ tr.offsetHeight > 0 ์ฒดํฌ\n\t\t\t\t});\n\n\t\t\t\tvisibleTrs.forEach(tr => {\n\t\t\t\t\tconst { matrixRow } = this.#getMatrixRow(tr);\n\t\t\t\t\tif (matrixRow < 0) return;\n\n\t\t\t\t\ttr.querySelectorAll('td, th').forEach(cell => {\n\t\t\t\t\t\tconst col = parseInt(cell.dataset.col, 10);\n\t\t\t\t\t\tif (isNaN(col)) return;\n\n\t\t\t\t\t\tconst rowSpan = parseInt(cell.rowSpan || 1, 10);\n\t\t\t\t\t\tconst colSpan = parseInt(cell.colSpan || 1, 10);\n\n\t\t\t\t\t\tconst cellEndRow = matrixRow + rowSpan - 1;\n\t\t\t\t\t\tconst cellEndCol = col + colSpan - 1;\n\n\t\t\t\t\t\tconst isIntersecting = cellEndRow >= r1 && matrixRow <= r2 && cellEndCol >= c1 && col <= c2;\n\n\t\t\t\t\t\tif (isIntersecting) {\n\t\t\t\t\t\t\tconst nsR = Math.min(r1, matrixRow);\n\t\t\t\t\t\t\tconst neR = Math.max(r2, cellEndRow);\n\t\t\t\t\t\t\tconst nsC = Math.min(c1, col);\n\t\t\t\t\t\t\tconst neC = Math.max(c2, cellEndCol);\n\n\t\t\t\t\t\t\tif (nsR !== r1 || neR !== r2 || nsC !== c1 || neC !== c2) {\n\t\t\t\t\t\t\t\tr1 = nsR; r2 = neR; c1 = nsC; c2 = neC;\n\t\t\t\t\t\t\t\texpanded = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tthis.#range = { startRow: r1, startCol: c1, endRow: r2, endCol: c2 };\n\n\t\t//this.#sheet.view.clearSelectedRange();\n\t\t//this.#sheet.view.setSelectedRange(r1, r2, c1, c2);\n\n\t\tthis.render();\n\t}\n\n\tget minRow() {\n\t\treturn this.#range.startRow;\n\t};\n\tget maxRow() {\n\t\treturn this.#range.endRow;\n\t};\n\tget minCol() {\n\t\treturn this.#range.startCol;\n\t};\n\tget maxCol() {\n\t\treturn this.#range.endCol;\n\t};\n\n\trefresh = () => {\n\t\tthis.render();\n\t}\n\n\trender = () => {\n\t\tconst { startRow, startCol, endRow, endCol } = this.#range;\n\n\t\tconst containers = this.#sheet.querySelectorAll(\n\t\t\t'.ng-container-left, .ng-container-body, .ng-container-right'\n\t\t);\n\n\t\tcontainers.forEach(container => {\n\t\t\tcontainer.querySelectorAll('.selected, .selected-top, .selected-bottom, .selected-left, .selected-right, .selected-start').forEach(el => {\n\t\t\t\tel.classList.remove('selected', 'selected-top', 'selected-bottom', 'selected-left', 'selected-right', 'selected-start');\n\t\t\t});\n\n\t\t\tcontainer.querySelectorAll('tr.selected-start').forEach(tr => {\n\t\t\t\ttr.classList.remove('selected-start');\n\t\t\t});\n\t\t});\n\n\t\tif (startRow < 0 || startCol < 0) return;\n\n\t\tcontainers.forEach((container) => {\n\t\t\tconst visibleTrs = Array.from(container.querySelectorAll('tbody tr')).filter(tr => {\n\t\t\t\treturn tr.style.display !== 'none';\n\t\t\t});\n\n\t\t\tvisibleTrs.forEach(tr => {\n\t\t\t\tconst { matrixRow } = this.#getMatrixRow(tr);\n\t\t\t\tif (matrixRow < 0) return;\n\n\n\t\t\t\tif (matrixRow >= startRow && matrixRow <= endRow) {\n\t\t\t\t\tcontainer.querySelectorAll(`tbody tr[data-index=\"${tr.dataset.index}\"]`).forEach(tr => {\n\t\t\t\t\t\ttr.classList.add('selected');\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t//trace.log(this.#sheet.view);\n\n\n\t\t\t\ttr.querySelectorAll('td, th').forEach(cell => {\n\t\t\t\t\tconst col = parseInt(cell.dataset.col, 10);\n\t\t\t\t\tif (isNaN(col)) return;\n\n\t\t\t\t\tconst rowSpan = parseInt(cell.rowSpan || 1, 10);\n\t\t\t\t\tconst colSpan = parseInt(cell.colSpan || 1, 10);\n\n\t\t\t\t\tconst cellEndRow = matrixRow + rowSpan - 1;\n\t\t\t\t\tconst cellEndCol = col + colSpan - 1;\n\n\t\t\t\t\tconst isSelected = cellEndRow >= startRow && matrixRow <= endRow && cellEndCol >= startCol && col <= endCol;\n\t\t\t\t\tif (!isSelected) return;\n\n\t\t\t\t\tcell.classList.add('selected');\n\n\t\t\t\t\tif (matrixRow <= startRow) cell.classList.add('selected-top');\n\t\t\t\t\tif (cellEndRow >= endRow) cell.classList.add('selected-bottom');\n\t\t\t\t\tif (col <= startCol) cell.classList.add('selected-left');\n\t\t\t\t\tif (cellEndCol >= endCol) cell.classList.add('selected-right');\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t#initEvents() {\n\t\tconst mainZone = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!mainZone) {\n\t\t\treturn;\n\t\t}\n\n\t\tmainZone.addEventListener('mousedown', (e) => {\n\t\t\tif (e.button !== 0) return;\n\n\t\t\tconst cell = e.target.closest('td, th');\n\t\t\tif (!cell) return;\n\t\t\tif (cell.dataset.row === undefined || cell.dataset.col === undefined) return;\n\n\t\t\tthis.#sheet.style.userSelect = 'none';\n\t\t\tthis.#sheet.style.webkitUserSelect = 'none';\n\n\t\t\tconst tr = cell.closest('tr');\n\t\t\tconst { matrixRow: startRow } = this.#getMatrixRow(tr);\n\t\t\tconst startCol = parseInt(cell.dataset.col, 10);\n\n\t\t\tif (startRow < 0) {\n\t\t\t\tthis.#sheet.style.userSelect = '';\n\t\t\t\tthis.#sheet.style.webkitUserSelect = '';\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.setFocus(startRow, startCol);\n\t\t\tthis.setRange(startRow, startCol, startRow, startCol);\n\n\t\t\tlet lastMatrixRow = startRow;\n\t\t\tlet lastCol = startCol;\n\n\t\t\tconst onMouseMove = (moveEvent) => {\n\t\t\t\tconst targetEl = document.elementFromPoint(moveEvent.clientX, moveEvent.clientY);\n\t\t\t\tlet targetCell = targetEl?.closest('td, th');\n\n\t\t\t\tif (!targetCell || !this.#sheet.contains(targetCell)) {\n\t\t\t\t\tconst allCells = this.#sheet.querySelectorAll('.ng-sheet-body-content tbody tr td, .ng-sheet-body-content tbody tr:not(.nodata) th');\n\t\t\t\t\tfor (const c of allCells) {\n\t\t\t\t\t\tconst rect = c.getBoundingClientRect();\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tmoveEvent.clientX >= rect.left &&\n\t\t\t\t\t\t\tmoveEvent.clientX <= rect.right &&\n\t\t\t\t\t\t\tmoveEvent.clientY >= rect.top &&\n\t\t\t\t\t\t\tmoveEvent.clientY <= rect.bottom\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttargetCell = c;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!targetCell) return;\n\t\t\t\tif (targetCell.dataset.row === undefined || targetCell.dataset.col === undefined) return;\n\n\t\t\t\tconst targetTr = targetCell.closest('tr');\n\t\t\t\tconst { matrixRow: endRow } = this.#getMatrixRow(targetTr);\n\t\t\t\tconst endCol = parseInt(targetCell.dataset.col, 10);\n\n\t\t\t\tif (endRow < 0) return;\n\t\t\t\tif (lastMatrixRow === endRow && lastCol === endCol) return;\n\n\t\t\t\tlastMatrixRow = endRow;\n\t\t\t\tlastCol = endCol;\n\n\t\t\t\tthis.setRange(startRow, startCol, endRow, endCol);\n\t\t\t};\n\n\t\t\tconst onMouseUp = () => {\n\t\t\t\tthis.#sheet.style.userSelect = '';\n\t\t\t\tthis.#sheet.style.webkitUserSelect = '';\n\n\t\t\t\tdocument.removeEventListener('mousemove', onMouseMove);\n\t\t\t\tdocument.removeEventListener('mouseup', onMouseUp);\n\t\t\t};\n\n\t\t\tdocument.addEventListener('mousemove', onMouseMove);\n\t\t\tdocument.addEventListener('mouseup', onMouseUp);\n\t\t});\n\t}\n}","import { trace } from \"@nopeer\";\n\nexport class CellNavigation {\n\t#sheet;\n\t#host;\n\n\t#currentCell = null;\n\t#currentTr = null;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.#initEvents();\n\t}\n\n\tget currentCell() {\n\t\treturn this.#currentCell;\n\t}\n\n\tset currentCell(cell) {\n\t\tif (!cell) return;\n\n\t\tthis.#currentCell = cell;\n\t\tcell.focus({ preventScroll: true });\n\n\t\tthis.#currentTr = cell.closest(\"tr\");\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tthis.#sheet.selection.setFocus(matrixRow, this.#currentCell.dataset.col);\n\t}\n\n\n\t#moveCellH = (e, cell) => {\n\n\t\tif (!cell) return;\n\n\t\tswitch (e.code) {\n\t\t\tcase \"Tab\":\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\tif (!this.#isCellLeftVisible(cell)) {\n\t\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (!this.#isCellRightVisible(cell)) {\n\t\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tif (!this.#isCellRightVisible(cell)) {\n\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tif (!this.#isCellLeftVisible(cell)) {\n\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.currentCell = cell;\n\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, cell.dataset.col, this.#currentTr.dataset.matrixRow, cell.dataset.col);\n\t};\n\n\t#moveCellV = (e, cell) => {\n\t\tif (cell) {\n\t\t\tlet isVisible = false;\n\t\t\tswitch (e.code) {\n\t\t\t\tcase \"Enter\":\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowDown\":\n\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\t\tif (this.#isCellAboveVisible(cell)) {\n\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (isVisible) {\n\t\t\t\tthis.currentCell = cell;\n\t\t\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, cell.dataset.col, this.#currentTr.dataset.matrixRow, cell.dataset.col);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tlet scrollTopIndex = -1;\n\t\tswitch (e.code) {\n\t\t\tcase \"Enter\":\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\tconst visibleRowCount = this.#getVisibleRowCount();\n\t\t\t\t\tscrollTopIndex = Math.max(dataIndex - visibleRowCount + 0, 0);\n\t\t\t\t} else {\n\t\t\t\t\tscrollTopIndex = Math.min(dataIndex, this.#sheet.view.count());\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tscrollTopIndex = Math.min(dataIndex, this.#sheet.view.count());\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tconst visibleRowCount = this.#getVisibleRowCount();\n\t\t\t\tscrollTopIndex = Math.max(dataIndex - visibleRowCount + 0, 0);\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (scrollTopIndex < 0) return;\n\n\t\tlet matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst rowSpan = parseInt(this.#currentCell.rowSpan, 10) || 1;\n\n\t\tswitch (e.code) {\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tmatrixRow += rowSpan;\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tmatrixRow --;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.#sheet.rowManager.scrollToDataRow(scrollTopIndex, null, () => {\n\t\t\tconst currentCell = this.#findCell(matrixRow, col);\n\n\t\t\tif (currentCell) {\n\t\t\t\tthis.currentCell = currentCell;\n\t\t\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, currentCell.dataset.col, this.#currentTr.dataset.matrixRow, currentCell.dataset.col);\n\t\t\t}\n\t\t});\n\t}\n\n\tmoveCell = (e) => {\n\n\t\tif (e.target.tagName === \"INPUT\") {\n\t\t\tif ([\"text\"].includes(e.target.type)) {\n\t\t\t\tif ([\"ArrowLeft\",\"ArrowRight\",\"Home\",\"End\"].includes(e.code)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ([\"date\",\"datetime-local\",\"time\",\"week\",\"month\"].includes(e.target.type)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.#currentCell || !this.#currentTr) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet nextCell;\n\t\tswitch (e.code) {\n\t\t\tcase \"Tab\":\n\t\t\t\tnextCell = e.shiftKey ? this.#getPreviousCell() : this.#getNextCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tnextCell = this.#getNextCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tnextCell = this.#getPreviousCell();\n\t\t\t\tbreak;\n\t\t\tcase \"Enter\":\n\t\t\t\tnextCell = e.shiftKey ? this.#getUpCell() : this.#getDownCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tnextCell = this.#getDownCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tnextCell = this.#getUpCell();\n\t\t\t\tbreak;\n\t\t}\n\n\t\te.preventDefault();\n\n\t\tif ([\"ArrowLeft\",\"ArrowRight\",\"Tab\"].includes(e.code)) {\n\t\t\tthis.#moveCellH(e, nextCell);\n\t\t}\n\t\telse if ([\"Enter\",\"ArrowUp\",\"ArrowDown\"].includes(e.code)) {\n\t\t\tthis.#moveCellV(e, nextCell);\n\t\t}\n\t}\n\n\t#getNextCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst colSpan = parseInt(this.#currentCell.colSpan, 10) || 1;\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tconst nextCol = col + colSpan;\n\n\t\tlet nextCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${nextCol}\"]`);\n\t\tif (!nextCell) {\n\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${nextCol}\"]`);\n\t\t}\n\n\t\treturn nextCell;\n\t}\n\n\t#getPreviousCell = () => {\n\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tlet nextCell;\n\t\tfor (let i = col - 1; i >= 0; i--) {\n\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${i}\"]`);\n\t\t\tif (!nextCell) {\n\t\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${i}\"]`);\n\t\t\t}\n\n\t\t\tif (nextCell) break;\n\t\t}\n\n\t\treturn nextCell;\n\t}\n\n\n\n\t#findCell = (matrixRow, col) => {\n\n\t\tconst $tr = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"]`);\n\t\tif (!$tr) return;\n\n\t\tconst dataIndex = parseInt($tr.dataset.index, 10);\n\n\t\tlet targetCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${col}\"]`);\n\t\tif (!targetCell) {\n\t\t\tthis.#sheet.querySelectorAll(`tbody tr[data-matrix-row=\"${matrixRow}\"] td`).forEach($cell => {\n\t\t\t\tconst cellCol = parseInt($cell.dataset.col, 10);\n\t\t\t\tconst colSpan = parseInt($cell.colSpan, 10) || 1;\n\n\t\t\t\tif (col >= cellCol && col < cellCol + colSpan) {\n\t\t\t\t\ttargetCell = $cell;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (!targetCell) {\n\t\t\t\ttargetCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${col}\"]`);\n\n\t\t\t\tif (!targetCell) {\n\t\t\t\t\tthis.#sheet.querySelectorAll(`tbody tr[data-index=\"${dataIndex}\"] td`).forEach($cell => {\n\t\t\t\t\t\tconst cellCol = parseInt($cell.dataset.col, 10);\n\t\t\t\t\t\tconst colSpan = parseInt($cell.colSpan, 10) || 1;\n\n\t\t\t\t\t\tif (col >= cellCol && col < cellCol + colSpan) {\n\t\t\t\t\t\t\ttargetCell = $cell;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn targetCell;\n\t}\n\n\t#getUpCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\treturn this.#findCell(matrixRow - 1, col);\n\t}\n\n\t#getDownCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\t\tconst rowSpan = parseInt(this.#currentCell.rowSpan, 10) || 1;\n\n\t\treturn this.#findCell(matrixRow + rowSpan, col);\n\t}\n\n\t// 1. ์œ„์ชฝ ์ž˜๋ฆผ ์ฒดํฌ (๊ธฐ์ค€: bodyViewport)\n\t#isCellAboveVisible = (cell) => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!bodyViewport || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport.getBoundingClientRect();\n\t\tconst theadHeight = bodyViewport.querySelector('thead')?.offsetHeight || 0;\n\n\t\t// ์…€์˜ ์ƒ๋‹จ์ด ํ—ค๋” ์•„๋ž˜์ชฝ๋ณด๋‹ค ์œ„์— ์žˆ์œผ๋ฉด ์ž˜๋ฆฐ(์•ˆ ๋ณด์ด๋Š”) ์ƒํƒœ\n\t\treturn cellRect.top >= (viewportRect.top + theadHeight);\n\t}\n\n\t// 2. ์•„๋ž˜์ชฝ ์ž˜๋ฆผ ์ฒดํฌ (๊ธฐ์ค€: bodyViewport)\n\t#isCellBelowVisible = (cell) => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!bodyViewport || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport.getBoundingClientRect();\n\n\t\t// ์…€์˜ ํ•˜๋‹จ์ด ๋ทฐํฌํŠธ ํ•˜๋‹จ๋ณด๋‹ค ์•„๋ž˜์— ์žˆ์œผ๋ฉด ์ž˜๋ฆฐ ์ƒํƒœ\n\t\treturn cellRect.bottom <= viewportRect.bottom;\n\t}\n\n\t// 3. ์™ผ์ชฝ ์ž˜๋ฆผ ์ฒดํฌ (๊ธฐ์ค€: bodyViewport2)\n\t#isCellLeftVisible = (cell) => {\n\t\tconst bodyViewport2 = this.#sheet.querySelector('.ng-container-body'); // ๋˜๋Š” ์ขŒ์šฐ ์Šคํฌ๋กค์„ ๋‹ด๋‹นํ•˜๋Š” ๋ทฐํฌํŠธ\n\t\tif (!bodyViewport2 || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport2.getBoundingClientRect();\n\n\t\t// ์…€์˜ ์ขŒ์ธก์ด ๋ทฐํฌํŠธ ์ขŒ์ธก๋ณด๋‹ค ์™ผ์ชฝ์— ์žˆ์œผ๋ฉด ์ž˜๋ฆฐ ์ƒํƒœ\n\t\treturn cellRect.left >= viewportRect.left;\n\t}\n\n\t// 4. ์˜ค๋ฅธ์ชฝ ์ž˜๋ฆผ ์ฒดํฌ (๊ธฐ์ค€: bodyViewport2)\n\t#isCellRightVisible = (cell) => {\n\t\tconst bodyViewport2 = this.#sheet.querySelector('.ng-container-body');\n\t\tif (!bodyViewport2 || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport2.getBoundingClientRect();\n\n\t\t// ์…€์˜ ์šฐ์ธก์ด ๋ทฐํฌํŠธ ์šฐ์ธก๋ณด๋‹ค ์˜ค๋ฅธ์ชฝ์— ์žˆ์œผ๋ฉด ์ž˜๋ฆฐ ์ƒํƒœ\n\t\treturn cellRect.right <= viewportRect.right;\n\t}\n\n\t// ๐Ÿ’ก ํ•„์š”ํ•˜๋‹ค๋ฉด ์ด 4๊ฐœ๋ฅผ ์กฐํ•ฉํ•ด์„œ ์ „์ฒด ๊ฐ€์‹œ์„ฑ์„ ํŒ๋‹จํ•˜๋Š” ํ†ตํ•ฉ ํ•จ์ˆ˜๋„ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\n\t#isCellVisible = (cell) => {\n\t\treturn this.#isCellAboveVisible(cell) &&\n\t\t\tthis.#isCellBelowVisible(cell) &&\n\t\t\tthis.#isCellLeftVisible(cell) &&\n\t\t\tthis.#isCellRightVisible(cell);\n\t}\n\n\t#getVisibleRowCount = () => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tconst viewportHeight = bodyViewport.clientHeight - (bodyViewport.querySelector('thead')?.offsetHeight || 0);\n\t\tconst rowHeight = this.#sheet.rowManager.getRowHeight();\n\n\t\t// ๋ทฐํฌํŠธ ๋†’์ด์— ๋“ค์–ด์˜ค๋Š” ํ–‰ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ (์†Œ์ˆ˜์  ๋ฒ„๋ฆผ)\n\t\treturn Math.max(1, Math.floor(viewportHeight / rowHeight));\n\t}\n\n\t#initEvents() {\n\t\tthis.#sheet.addEventListener('mousedown', (e) => {\n\t\t\tif (e.button !== 0) return;\n\t\t\tconst cell = e.target.closest('td, th');\n\t\t\tif (!cell) return;\n\t\t\tif (cell.dataset.index === undefined || cell.dataset.col === undefined) return;\n\n\t\t\tif (cell.querySelector(\"cell-row-indicator\")) {\n\t\t\t\tthis.#sheet.row.focus(cell.dataset.index);\n\t\t\t} else {\n\t\t\t\tthis.currentCell = cell;\n\t\t\t}\n\t\t});\n\n\t\tthis.#sheet.addEventListener('keydown', (e) => {\n\t\t\tif ([\"Enter\", \"Tab\", \"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(e.code)) {\n\t\t\t\tthis.moveCell(e);\n\t\t\t}\n\t\t});\n\t}\n}","// ui/col/ColResizer.js\nimport { trace } from \"@nopeer\";\nimport { COLLAPSED_WIDTH } from \"@/layout/core/TableCompiler.js\";\n\nconst RESIZE_OFFSET = 2; // ๐ŸŽฏ ๋ฆฌ์‚ฌ์ด์ฆˆ ๊ฐ์ง€ ์˜์—ญ ์˜คํ”„์…‹์„ ์ƒ๋‹จ์œผ๋กœ ์ถ”์ถœ\n\nexport class ColResizer {\n #sheet;\n #host;\n #panel;\n #tooltip;\n\n #targetColIndex = null;\n #nextColIndex = null;\n #targetContainerType = null;\n #targetCell = null;\n #startX = 0;\n #startColWidth = 0;\n #nextColStartWidth = 0;\n #startCellWidth = 0;\n #startLeft = 0;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#host = sheet.getRootNode().host;\n this.#panel = this.#sheet.querySelector('nine-table-col-resizer-panel');\n\n this.#tooltip = this.#panel.querySelector('.resizer-overlay');\n this.bindEvents();\n }\n\n destroy() {\n this.#sheet.removeEventListener('pointermove', this.#onPointerMove);\n this.#sheet.removeEventListener('pointerdown', this.#onPointerDown);\n this.#sheet.removeEventListener('dblclick', this.#onDblClick);\n }\n\n refreshLayout(containerType = 'body') {\n const containers = Array.from(this.#sheet.querySelectorAll(`.ng-container-${containerType}`));\n if (containers.length === 0) return;\n\n const isFixedContainer = containerType === 'left' || containerType === 'right';\n const isAutoFit = !isFixedContainer && (\n this.#sheet.isAutoFitCol ||\n containers[0].querySelector('table')?.getAttribute('auto-fit-col') === 'true'\n );\n\n if (!isAutoFit) {\n\n const firstColgroup = containers[0].querySelector('table colgroup');\n if (!firstColgroup) return;\n\n let totalWidth = 0;\n const colWidths = {};\n\n Array.from(firstColgroup.querySelectorAll('col')).forEach(col => {\n const colIdx = col.getAttribute('data-col');\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) {\n colWidths[colIdx] = w;\n totalWidth += w;\n }\n });\n\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n\n if (containerType === 'body') {\n tables.forEach(tbl => {\n tbl.style.width = `${totalWidth}px`;\n //tbl.style.minWidth = `${totalWidth}px`;\n });\n } else {\n container.style.flex = `0 0 ${totalWidth}px`;\n container.style.width = `${totalWidth}px`;\n container.style.minWidth = `${totalWidth}px`;\n container.style.maxWidth = `${totalWidth}px`;\n\n tables.forEach(tbl => {\n tbl.style.width = `${totalWidth}px`;\n tbl.style.minWidth = `${totalWidth}px`;\n tbl.style.maxWidth = `${totalWidth}px`;\n\n Object.entries(colWidths).forEach(([colIdx, w]) => {\n tbl.querySelectorAll(`th[data-col=\"${colIdx}\"], td[data-col=\"${colIdx}\"]`).forEach(cell => {\n cell.style.width = `${w}px`;\n cell.style.minWidth = `${w}px`;\n cell.style.maxWidth = `${w}px`;\n });\n });\n });\n }\n });\n } else {\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n tables.forEach(tbl => {\n //tbl.style.width = '100%';\n //tbl.style.minWidth = '100%';\n //tbl.style.maxWidth = '';\n });\n });\n }\n\n this.#sheet.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n setColumnWidth(globalColIndex, width, containerType = null) {\n\n let targetCols = [];\n\n targetCols = Array.from(this.#sheet.querySelectorAll(`table colgroup col[data-col=\"${globalColIndex}\"]`));\n\n if (targetCols.length === 0) return;\n\n const firstContainer = targetCols[0].closest('.ng-container-left, .ng-container-body, .ng-container-right');\n const resolvedContainerType = containerType || (\n firstContainer?.classList.contains('ng-container-left') ? 'left' :\n firstContainer?.classList.contains('ng-container-right') ? 'right' : 'body'\n );\n\n targetCols.forEach(col => {\n col.setAttribute('width', width);\n col.style.width = `${width}px`;\n });\n\n const sourceCol = this.#sheet.sourceTable?.querySelector(`colgroup col[data-col=\"${globalColIndex}\"]`);\n if (sourceCol) {\n sourceCol.setAttribute('width', width);\n sourceCol.style.width = `${width}px`;\n }\n\n this.refreshLayout(resolvedContainerType);\n\n if (resolvedContainerType === 'left' || resolvedContainerType === 'right') {\n this.refreshLayout('body');\n }\n\n this.#sheet.rowManager?.refresh();\n }\n\n #checkIsAutoFit(targetCell) {\n if (this.#sheet.isAutoFitCol) return true;\n const table = targetCell?.closest('table');\n if (table && table.getAttribute('auto-fit-col') === 'true') return true;\n return false;\n }\n\n bindEvents() {\n this.#sheet.addEventListener('pointermove', this.#onPointerMove);\n //this.#sheet.addEventListener('pointerdown', this.#onPointerDown);\n //this.#sheet.addEventListener('dblclick', this.#onDblClick);\n\n this.#sheet.addDebounseEventListener('dblclick', this.#onDblClick, 'pointerdown', this.#onPointerDown);\n }\n\n #getContainerType(cell) {\n const container = cell.closest('.ng-container-left, .ng-container-body, .ng-container-right');\n if (!container) return null;\n if (container.classList.contains('ng-container-left')) return 'left';\n if (container.classList.contains('ng-container-right')) return 'right';\n return 'body';\n }\n\n #onPointerMove = (e) => {\n\n\n const headerPart = e.target.closest('thead');\n if (!headerPart) return;\n\n const cell = e.target.closest('th, td');\n\n headerPart.querySelectorAll('.resizable-edge').forEach(el => {\n if (el !== cell) el.classList.remove('resizable-edge');\n });\n\n if (!cell || cell.dataset.col === undefined) return;\n if (cell.getAttribute('collapsed') === 'true') return;\n\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n const isLeftEdge = offsetX <= RESIZE_OFFSET;\n const isRightEdge = (rect.width - offsetX) <= RESIZE_OFFSET;\n\n if (isLeftEdge) {\n const prevCell = cell.previousElementSibling;\n if (!prevCell || prevCell.getAttribute('collapsed') === 'true') {\n cell.classList.remove('resizable-edge');\n return;\n }\n }\n\n if (isLeftEdge || isRightEdge) {\n cell.classList.add('resizable-edge');\n } else {\n cell.classList.remove('resizable-edge');\n }\n };\n\n #onPointerDown = (e) => {\n\n const headerPart = e.actualTarget.closest('thead');\n if (!headerPart) return;\n\n const cell = e.actualTarget.closest('th, td');\n\n if (!cell || !cell.classList.contains('resizable-edge')) return;\n\n\n\n e.preventDefault();\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n\n let targetCell = cell;\n\n if (offsetX <= RESIZE_OFFSET) {\n const prevCell = cell.previousElementSibling;\n if (prevCell && prevCell.dataset.col !== undefined && prevCell.getAttribute('collapsed') !== 'true') {\n targetCell = prevCell;\n } else if (!cell.previousElementSibling) {\n return;\n }\n }\n\n this.#targetCell = targetCell;\n this.#targetContainerType = this.#getContainerType(targetCell);\n\n const container = this.#sheet.querySelector(`.ng-container-${this.#targetContainerType}`);\n if (!container) return;\n\n const baseColIndex = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n this.#targetColIndex = baseColIndex + colSpan - 1;\n\n const isAutoFit = this.#checkIsAutoFit(targetCell);\n if (isAutoFit) {\n this.#nextColIndex = this.#targetColIndex + 1;\n const nextColEl = container.querySelector(`col[data-col=\"${this.#nextColIndex}\"]`);\n if (nextColEl) {\n this.#nextColStartWidth = parseInt(nextColEl.getAttribute('width'), 10) || 100;\n } else {\n this.#nextColIndex = null;\n }\n } else {\n this.#nextColIndex = null;\n }\n\n const targetRect = targetCell.getBoundingClientRect();\n const sheetRect = this.#sheet.getBoundingClientRect();\n\n this.#startCellWidth = targetRect.width;\n this.#startLeft = targetRect.left - sheetRect.left;\n\n const targetColEl = container.querySelector(`col[data-col=\"${this.#targetColIndex}\"]`);\n const attrW = targetColEl?.getAttribute('width');\n this.#startColWidth = (attrW && !isNaN(parseInt(attrW, 10))) ? parseInt(attrW, 10) : targetRect.width / colSpan;\n\n this.#startX = e.clientX;\n\n if (this.#panel) {\n this.#panel.classList.add('active');\n this.#updatePositions(e.clientX);\n }\n\n window.addEventListener('pointermove', this.#onDragMove);\n window.addEventListener('pointerup', this.#onDragEnd, { once: true });\n };\n\n #updatePositions(clientX) {\n let diff = clientX - this.#startX;\n const isAutoFit = this.#checkIsAutoFit(this.#targetCell);\n\n if (isAutoFit && this.#nextColIndex !== null) {\n const maxDiff = this.#nextColStartWidth - COLLAPSED_WIDTH;\n const minDiff = -(this.#startColWidth - COLLAPSED_WIDTH);\n diff = Math.max(minDiff, Math.min(diff, maxDiff));\n }\n\n const currentColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n\n const targetRect = this.#targetCell.getBoundingClientRect();\n let realCellWidth = clientX - targetRect.left;\n\n if (isAutoFit && this.#nextColIndex !== null) {\n const maxCellWidth = this.#startCellWidth + (this.#nextColStartWidth - COLLAPSED_WIDTH);\n realCellWidth = Math.min(realCellWidth, maxCellWidth);\n }\n\n const currentCellWidth = Math.max(COLLAPSED_WIDTH, realCellWidth);\n\n if (this.#panel) {\n this.#panel.style.setProperty('--col-resizer-tooltip-left', `${this.#startLeft}px`);\n this.#panel.style.setProperty('--col-resizer-tooltip-width', `${currentCellWidth}px`);\n }\n\n const sizeBadge = this.#tooltip?.querySelector('.size-badge');\n if (sizeBadge) {\n sizeBadge.textContent = `${Math.round(currentColWidth)}px`;\n }\n }\n\n #onDragMove = (e) => {\n this.#updatePositions(e.clientX);\n };\n\n #onDragEnd = (e) => {\n window.removeEventListener('pointermove', this.#onDragMove);\n\n const diff = e.clientX - this.#startX;\n const isAutoFit = this.#checkIsAutoFit(this.#targetCell);\n let finalWidth = 0;\n\n if (isAutoFit && this.#nextColIndex !== null) {\n let newColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n let newNextWidth = this.#startColWidth + this.#nextColStartWidth - newColWidth;\n\n if (newNextWidth < COLLAPSED_WIDTH) {\n newNextWidth = COLLAPSED_WIDTH;\n newColWidth = this.#startColWidth + this.#nextColStartWidth - COLLAPSED_WIDTH;\n }\n\n this.setColumnWidth(this.#targetColIndex, newColWidth, this.#targetContainerType);\n this.setColumnWidth(this.#nextColIndex, newNextWidth, this.#targetContainerType);\n finalWidth = newColWidth;\n } else {\n const newColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n if (this.#targetColIndex !== null && this.#targetContainerType) {\n this.setColumnWidth(this.#targetColIndex, newColWidth, this.#targetContainerType);\n finalWidth = newColWidth;\n }\n }\n\n if (this.#targetCell) {\n const targetCell = this.#targetCell;\n if (targetCell.getAttribute('collapsed') !== 'true' && finalWidth > 20) {\n targetCell.dataset.expandWidth = String(finalWidth);\n }\n }\n\n if (this.#panel) {\n this.#tooltip?.classList.add('fade-out');\n setTimeout(() => {\n this.#panel.classList.remove('active');\n this.#tooltip?.classList.remove('fade-out');\n }, 150);\n }\n\n this.#targetColIndex = null;\n this.#nextColIndex = null;\n this.#targetContainerType = null;\n this.#targetCell = null;\n };\n\n #onDblClick = (e) => {\n\n const targetEl = e.target;\n let cell = targetEl.closest('th, td');\n if (!cell || !cell.classList.contains('resizable-edge')) return;\n\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n\n if (offsetX <= RESIZE_OFFSET) {\n cell = cell.previousElementSibling;\n }\n\n const baseColIndex = parseInt(cell.dataset.col, 10);\n const tbodyCell = this.#sheet.querySelector(`tbody.body [data-col=\"${baseColIndex}\"]`);\n if (!tbodyCell || !tbodyCell.dataset.bind || tbodyCell.classList.contains(\"CELL-RADIO\")) return;\n\n let extraPadding = 0;\n Array.from(tbodyCell.firstElementChild.children).forEach(($el) => {\n switch ($el.tagName) {\n case 'SPAN': extraPadding += 8; break;\n case 'DIV': extraPadding += 8; break;\n case 'BUTTON': extraPadding += 32; break;\n case 'SELECT': extraPadding += 32; break;\n case 'INPUT':\n switch (($el.type || 'text').toLowerCase()) {\n // 1. ์ฒดํฌ๋ฐ•์Šค / ๋ผ๋””์˜ค (๋น„๊ต์  ์ข์€ ์˜์—ญ)\n case 'checkbox':\n case 'radio':\n extraPadding += 12;\n break;\n\n // 2. ๋ฒ„ํŠผ ๊ณ„์—ด input\n case 'button':\n case 'submit':\n case 'reset':\n case 'image':\n extraPadding += 16;\n break;\n\n // 3. ํŠน์ˆ˜ ์œ„์ ฏ (์ปฌ๋Ÿฌ, ํŒŒ์ผ, ์Šฌ๋ผ์ด๋”)\n case 'color':\n case 'file':\n case 'range':\n extraPadding += 24;\n break;\n\n // 4. ํ™”๋ฉด์— ์•ˆ ๋ณด์ด๋Š” hidden ํ•„๋“œ\n case 'hidden':\n extraPadding += 0;\n break;\n\n // 5. ํ…์ŠคํŠธ ๋ฐ ์ˆซ์ž, ๋‚ ์งœ ๋“ฑ ์ผ๋ฐ˜ ์ž…๋ ฅ ํ•„๋“œ (๊ธฐ๋ณธ๊ฐ’)\n case 'text':\n case 'search':\n case 'tel':\n case 'url':\n case 'email':\n case 'password':\n case 'number':\n case 'date':\n case 'time':\n case 'datetime-local':\n case 'month':\n case 'week':\n default:\n extraPadding += 16;\n break;\n }\n break;\n }\n });\n\n const fieldIdx = this.#host.fields.get().indexOf(tbodyCell.dataset.bind);\n\n const computedStyle = window.getComputedStyle(tbodyCell);\n const font = computedStyle.font || '12px sans-serif';\n\n const headerText = cell.innerText || \"\";\n const headerSize = nine.measureTextSize(headerText, font);\n let maxTextWidth = (headerSize.width || 0) + 16;\n\n this.#host.execute(() => {\n\n this.#sheet.view.getArray().forEach((record, idx) => {\n const val = String(tbodyCell.dataset.expr ? this.#host.exprEngine.evaluate(tbodyCell.dataset.expr, record, idx) : record.v[fieldIdx] ?? \"\").trim();\n const size = nine.measureTextSize(val, font);\n if (size.width && size.width > maxTextWidth) {\n maxTextWidth = size.width;\n }\n });\n\n const calculatedWidth = Math.max(32, Math.min(400, Math.ceil(maxTextWidth) + extraPadding));\n\n this.setColumnWidth(tbodyCell.dataset.col, calculatedWidth, this.#getContainerType(cell));\n })\n };\n}\n\n\nexport class ColResizerPanel extends HTMLElement {\n #target;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n this.#renderer();\n }\n\n #renderer = () => {\n this.innerHTML = `\n <div class=\"resizer-overlay\">\n <span class=\"size-badge\">0px</span>\n </div>\n `;\n };\n}\n\nif (!customElements.get('nine-table-col-resizer-panel')) {\n customElements.define(\"nine-table-col-resizer-panel\", ColResizerPanel);\n}\n","// ui/col/ColMover.js\nimport { trace } from \"@nopeer\";\n\nexport class ColMover {\n #sheet;\n #grip;\n #indi;\n\n #isDragging = false;\n #sourceCell = null;\n #sourceColIndex = null;\n #targetColIndex = null;\n #shiftX = 0;\n #timer = null;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#grip = this.#sheet.querySelector('.ng-col-mover-grip');\n this.#indi = this.#sheet.querySelector('.ng-col-mover-indi');\n this.bindEvents();\n }\n\n bindEvents() {\n this.#sheet.addEventListener('pointerdown', this.#onPointerDown);\n }\n\n #checkIsMovable() {\n const host = this.#sheet.getRootNode()?.host;\n return this.#sheet.getAttribute('col-movable') === 'true' || host?.getAttribute('col-movable') === 'true';\n }\n\n #getDeepElementFromPoint(x, y) {\n const root = this.#sheet.getRootNode();\n let el = root.elementFromPoint ? root.elementFromPoint(x, y) : document.elementFromPoint(x, y);\n\n while (el && el.shadowRoot && el.shadowRoot.elementFromPoint) {\n const nested = el.shadowRoot.elementFromPoint(x, y);\n if (!nested || nested === el) break;\n el = nested;\n }\n\n return el;\n }\n\n #getColGroupRange(cell) {\n if (!cell || cell.dataset.col === undefined) return null;\n\n const startCol = parseInt(cell.dataset.col, 10);\n const colSpan = cell.colSpan || 1;\n const endCol = startCol + colSpan - 1;\n const rowIndex = cell.closest('tr')?.sectionRowIndex ?? 0;\n\n const table = cell.closest('table');\n if (!table) return { startCol, colSpan, endCol, rowIndex, isGroup: false, parentGroupRange: null, isValidGroup: true };\n\n const headerCells = table.querySelectorAll('thead th, thead td');\n let hasStrictChildren = false;\n let isValidGroup = true;\n let parentGroupRange = null;\n\n for (const subCell of headerCells) {\n if (subCell === cell || subCell.dataset.col === undefined) continue;\n\n const subStart = parseInt(subCell.dataset.col, 10);\n const subSpan = subCell.colSpan || 1;\n const subEnd = subStart + subSpan - 1;\n const subRowIndex = subCell.closest('tr')?.sectionRowIndex ?? 0;\n\n if (subRowIndex < rowIndex && subStart <= startCol && subEnd >= endCol && subSpan > colSpan) {\n if (!parentGroupRange) {\n parentGroupRange = { startCol: subStart, endCol: subEnd };\n } else {\n parentGroupRange.startCol = Math.max(parentGroupRange.startCol, subStart);\n parentGroupRange.endCol = Math.min(parentGroupRange.endCol, subEnd);\n }\n }\n\n const isOverlap = !(subEnd < startCol || subStart > endCol);\n if (isOverlap) {\n const isFullyContained = (subStart >= startCol && subEnd <= endCol);\n\n if (isFullyContained) {\n if (subSpan < colSpan) {\n hasStrictChildren = true;\n }\n } else if (subStart < startCol || subEnd > endCol) {\n if (!(subStart <= startCol && subEnd >= endCol)) {\n isValidGroup = false;\n }\n }\n }\n }\n\n const isRealGroup = hasStrictChildren && isValidGroup;\n\n return {\n startCol,\n colSpan: isRealGroup ? colSpan : 1,\n endCol: isRealGroup ? endCol : startCol,\n rowIndex,\n isGroup: isRealGroup,\n parentGroupRange,\n isValidGroup\n };\n }\n\n #createGroupHeaderPreview(cell) {\n const groupRange = this.#getColGroupRange(cell);\n if (!groupRange) return null;\n\n const { startCol, endCol, isGroup } = groupRange;\n\n // ํ•ต์‹ฌ: ํ…Œ์ด๋ธ”์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ตฌ์กฐ์ด๋ฏ€๋กœ cell์ด ์†ํ•œ ๋ฐ”๋กœ ๊ทธ ํ…Œ์ด๋ธ”์„ ์ง์ ‘ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.\n const origTable = cell.closest('table');\n if (!origTable) return null;\n\n let minLeft = Infinity, maxRight = -Infinity, minTop = Infinity, maxBottom = -Infinity;\n const targetCells = [];\n\n origTable.querySelectorAll('thead th, thead td').forEach(c => {\n if (c.dataset.col === undefined) return;\n const cCol = parseInt(c.dataset.col, 10);\n const cSpan = c.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n\n const isTarget = isGroup\n ? (cCol >= startCol && cEnd <= endCol)\n : (c === cell);\n\n if (isTarget) {\n const rect = c.getBoundingClientRect();\n minLeft = Math.min(minLeft, rect.left);\n maxRight = Math.max(maxRight, rect.right);\n minTop = Math.min(minTop, rect.top);\n maxBottom = Math.max(maxBottom, rect.bottom);\n\n const computedStyle = window.getComputedStyle(c);\n targetCells.push({ el: c, rect, style: computedStyle });\n }\n });\n\n if (targetCells.length === 0) return null;\n\n const groupWidth = maxRight - minLeft;\n const groupHeight = maxBottom - minTop;\n\n const headerContent = document.createElement('div');\n headerContent.className = 'grip-header-content';\n headerContent.style.position = 'relative';\n headerContent.style.width = `${groupWidth}px`;\n headerContent.style.height = `${groupHeight}px`;\n\n targetCells.forEach(({ el, rect, style }) => {\n const clonedCell = el.cloneNode(true);\n\n clonedCell.style.position = 'absolute';\n clonedCell.style.left = `${rect.left - minLeft}px`;\n clonedCell.style.top = `${rect.top - minTop}px`;\n\n clonedCell.style.width = `${rect.width}px`;\n clonedCell.style.minWidth = `${rect.width}px`;\n clonedCell.style.maxWidth = 'none';\n\n clonedCell.style.height = `${rect.height}px`;\n clonedCell.style.boxSizing = 'border-box';\n clonedCell.style.margin = '0';\n\n clonedCell.style.backgroundColor = style.backgroundColor !== 'transparent' && style.backgroundColor !== 'rgba(0, 0, 0, 0)'\n ? style.backgroundColor\n : '#f9fafb';\n clonedCell.style.color = style.color;\n clonedCell.style.font = style.font;\n clonedCell.style.fontWeight = style.fontWeight;\n clonedCell.style.fontSize = style.fontSize;\n clonedCell.style.textAlign = style.textAlign;\n clonedCell.style.padding = style.padding;\n clonedCell.style.border = style.border;\n clonedCell.style.borderRight = style.borderRight;\n clonedCell.style.borderBottom = style.borderBottom;\n clonedCell.style.display = 'flex';\n clonedCell.style.alignItems = 'center';\n clonedCell.style.justifyContent = style.textAlign === 'center' ? 'center' : (style.textAlign === 'right' ? 'flex-end' : 'flex-start');\n\n headerContent.appendChild(clonedCell);\n });\n\n return {\n element: headerContent,\n bounds: {\n left: minLeft,\n right: maxRight,\n top: minTop,\n bottom: maxBottom,\n width: groupWidth,\n height: groupHeight\n }\n };\n }\n\n #onPointerDown = (e) => {\n if (!this.#checkIsMovable()) return;\n\n const headerPart = e.target.closest('.ng-sheet-header');\n if (!headerPart) return;\n\n const cell = e.target.closest('th, td');\n if (!cell || cell.classList.contains('resizable-edge') || ['INPUT', 'BUTTON'].includes(e.target.tagName)) return;\n if (cell.dataset.col === undefined) return;\n\n e.preventDefault();\n\n const startX = e.clientX;\n const startY = e.clientY;\n\n const cancelTimer = () => {\n if (this.#timer) {\n clearTimeout(this.#timer);\n this.#timer = null;\n }\n window.removeEventListener('pointermove', onPointerMovePending);\n window.removeEventListener('pointerup', cancelTimer);\n window.removeEventListener('pointercancel', cancelTimer);\n };\n\n const onPointerMovePending = (moveEvent) => {\n const dist = Math.hypot(moveEvent.clientX - startX, moveEvent.clientY - startY);\n if (dist > 5) {\n cancelTimer();\n }\n };\n\n this.#timer = setTimeout(() => {\n cancelTimer();\n this.#startDrag(e, cell);\n }, 500);\n\n window.addEventListener('pointermove', onPointerMovePending);\n window.addEventListener('pointerup', cancelTimer, { once: true });\n window.addEventListener('pointercancel', cancelTimer, { once: true });\n };\n\n #startDrag(e, cell) {\n if (this.#isDragging) return;\n\n const preview = this.#createGroupHeaderPreview(cell);\n if (!preview) return;\n\n this.#isDragging = true;\n this.#sourceCell = cell;\n this.#sourceColIndex = parseInt(cell.dataset.col, 10);\n\n const sheetRect = this.#sheet.getBoundingClientRect();\n const { bounds, element } = preview;\n\n this.#shiftX = e.clientX - bounds.left;\n\n if (this.#grip) {\n this.#grip.replaceChildren(element);\n\n const relativeTop = bounds.top - sheetRect.top;\n const fullHeight = sheetRect.height - relativeTop;\n\n this.#grip.style.width = `${bounds.width}px`;\n this.#grip.style.height = `${fullHeight}px`;\n this.#grip.style.top = `${relativeTop}px`;\n this.#grip.style.display = 'block';\n\n this.#updateGripPosition(e.clientX);\n }\n\n document.body.style.cursor = 'move';\n\n window.addEventListener('pointermove', this.#onPointerMove);\n window.addEventListener('pointerup', this.#onPointerUp, { once: true });\n }\n\n #onPointerMove = (e) => {\n if (!this.#isDragging) return;\n\n this.#updateGripPosition(e.clientX);\n\n if (this.#grip) this.#grip.style.pointerEvents = 'none';\n if (this.#indi) this.#indi.style.pointerEvents = 'none';\n\n const targetElement = this.#getDeepElementFromPoint(e.clientX, e.clientY);\n const targetCell = targetElement?.closest('.ng-sheet-header th, .ng-sheet-header td');\n\n if (targetCell && targetCell.dataset.col !== undefined) {\n const targetColIndex = parseInt(targetCell.dataset.col, 10);\n const sheetRect = this.#sheet.getBoundingClientRect();\n const table = targetCell.closest('table');\n\n let colMinLeft = Infinity;\n let colMaxRight = -Infinity;\n\n if (table) {\n table.querySelectorAll('thead th, thead td').forEach(c => {\n if (c.dataset.col === undefined) return;\n const cCol = parseInt(c.dataset.col, 10);\n const cSpan = c.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n\n if (cCol <= targetColIndex && cEnd >= targetColIndex) {\n const cRect = c.getBoundingClientRect();\n colMinLeft = Math.min(colMinLeft, cRect.left);\n colMaxRight = Math.max(colMaxRight, cRect.right);\n }\n });\n }\n\n if (colMinLeft === Infinity) {\n const rect = targetCell.getBoundingClientRect();\n colMinLeft = rect.left;\n colMaxRight = rect.right;\n }\n\n const midX = colMinLeft + ((colMaxRight - colMinLeft) / 2);\n let calculatedTargetCol = 0;\n let indicatorLeft = 0;\n\n if (e.clientX < midX) {\n calculatedTargetCol = targetColIndex;\n indicatorLeft = colMinLeft - sheetRect.left;\n } else {\n const colSpan = targetCell.colSpan || 1;\n calculatedTargetCol = targetColIndex + colSpan;\n indicatorLeft = colMaxRight - sheetRect.left;\n }\n\n const sourceGroup = this.#getColGroupRange(this.#sourceCell);\n const movingSpan = sourceGroup.colSpan;\n\n const sourceRowStart = sourceGroup.rowIndex;\n const sourceRowSpan = this.#sourceCell.rowSpan || 1;\n const sourceRowEnd = sourceRowStart + sourceRowSpan - 1;\n\n const targetRowStart = targetCell.closest('tr')?.sectionRowIndex ?? 0;\n const targetRowSpan = targetCell.rowSpan || 1;\n const targetRowEnd = targetRowStart + targetRowSpan - 1;\n\n const isRowSpanCompatible = !(sourceRowEnd < targetRowStart || sourceRowStart > targetRowEnd);\n\n let isOutOfBoundsOfParent = false;\n if (sourceGroup.parentGroupRange) {\n const { startCol: pStart, endCol: pEnd } = sourceGroup.parentGroupRange;\n if (calculatedTargetCol < pStart || (calculatedTargetCol + movingSpan - 1) > pEnd) {\n isOutOfBoundsOfParent = true;\n }\n }\n\n let isDroppingInsideOtherGroup = false;\n if (table) {\n const spannedCells = table.querySelectorAll('thead th[colspan], thead td[colspan]');\n\n for (const sCell of spannedCells) {\n if (sCell === this.#sourceCell) continue;\n\n const sRowStart = sCell.closest('tr')?.sectionRowIndex ?? 0;\n const sRowSpan = sCell.rowSpan || 1;\n const sRowEnd = sRowStart + sRowSpan - 1;\n\n const isVerticalOverlap = !(sourceRowEnd < sRowStart || sourceRowStart > sRowEnd);\n if (!isVerticalOverlap) continue;\n\n const sStart = parseInt(sCell.dataset.col, 10);\n const sSpan = sCell.colSpan || 1;\n const sEnd = sStart + sSpan - 1;\n\n if (calculatedTargetCol > sStart && calculatedTargetCol < sEnd + 1) {\n isDroppingInsideOtherGroup = true;\n break;\n }\n\n const moveEndCol = calculatedTargetCol + movingSpan - 1;\n const isCrossIntersecting = (\n (calculatedTargetCol > sStart && calculatedTargetCol <= sEnd && moveEndCol > sEnd) ||\n (calculatedTargetCol < sStart && moveEndCol >= sStart && moveEndCol < sEnd)\n );\n\n if (isCrossIntersecting) {\n isDroppingInsideOtherGroup = true;\n break;\n }\n }\n }\n\n const isSelfGroup = (\n calculatedTargetCol >= sourceGroup.startCol &&\n calculatedTargetCol <= sourceGroup.endCol + 1\n );\n\n const isInvalidMove = !isRowSpanCompatible || isSelfGroup || isOutOfBoundsOfParent || isDroppingInsideOtherGroup || !sourceGroup.isValidGroup;\n\n if (isInvalidMove) {\n this.#targetColIndex = null;\n if (this.#indi) this.#indi.style.display = 'none';\n if (this.#grip) this.#grip.classList.add('invalid');\n } else {\n this.#targetColIndex = calculatedTargetCol;\n if (this.#grip) this.#grip.classList.remove('invalid');\n\n if (this.#indi) {\n const headerPart = targetCell.closest('.ng-sheet-header');\n const headerRect = headerPart.getBoundingClientRect();\n const relativeTop = headerRect.top - sheetRect.top;\n const fullHeight = sheetRect.height - relativeTop;\n\n this.#indi.style.top = `${relativeTop}px`;\n this.#indi.style.height = `${fullHeight}px`;\n this.#indi.style.left = `${indicatorLeft - 1}px`;\n this.#indi.style.display = 'block';\n }\n }\n } else {\n if (this.#indi) this.#indi.style.display = 'none';\n if (this.#grip) this.#grip.classList.add('invalid');\n this.#targetColIndex = null;\n }\n };\n\n #updateGripPosition(clientX) {\n if (!this.#grip) return;\n const sheetRect = this.#sheet.getBoundingClientRect();\n const left = clientX - sheetRect.left - this.#shiftX;\n this.#grip.style.left = `${left}px`;\n }\n\n #onPointerUp = (e) => {\n if (!this.#isDragging) return;\n\n window.removeEventListener('pointermove', this.#onPointerMove);\n document.body.style.cursor = '';\n\n if (this.#grip) {\n this.#grip.style.display = 'none';\n this.#grip.replaceChildren();\n }\n if (this.#indi) this.#indi.style.display = 'none';\n\n if (\n this.#targetColIndex !== null &&\n this.#sourceColIndex !== null &&\n this.#targetColIndex !== this.#sourceColIndex &&\n this.#targetColIndex !== this.#sourceColIndex + 1\n ) {\n this.moveColumn(this.#sourceColIndex, this.#targetColIndex);\n }\n\n this.#isDragging = false;\n this.#sourceCell = null;\n this.#sourceColIndex = null;\n this.#targetColIndex = null;\n };\n\n moveColumn(fromColIndex, toColIndex) {\n\n const colgroup = this.#sheet.sourceTable.querySelector('colgroup');\n const targetCol = colgroup.querySelector(`col[data-col=\"${toColIndex}\"]`);\n\n const sourceGroup = this.#getColGroupRange(this.#sourceCell);\n if (!sourceGroup || !sourceGroup.isValidGroup) return;\n\n const spanCount = sourceGroup.colSpan;\n const isInRange = (idx) => idx >= fromColIndex && idx < fromColIndex + spanCount;\n\n // 1. colgroup ๋‚ด <col> ์ด๋™ ๋ฐ fixed ์„ค์ •\n const targetViewportCol = this.#sheet.querySelector(`.ng-sheet-body-content col[data-col=\"${toColIndex}\"]`);\n const fixedType = targetViewportCol?.closest('.ng-container-left') ? 'left' : targetViewportCol?.closest('.ng-container-right') ? 'right' : null;\n\n colgroup.querySelectorAll('col').forEach(col => {\n if (isInRange(parseInt(col.getAttribute('data-col'), 10))) {\n fixedType ? col.setAttribute('fixed', fixedType) : col.removeAttribute('fixed');\n colgroup.insertBefore(col, targetCol);\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n this.#sheet.sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n const cells = Array.from(tr.children);\n const targetRowCell = cells.find(c => parseInt(c.dataset.col, 10) >= toColIndex);\n\n cells.forEach(cell => {\n if (isInRange(parseInt(cell.dataset.col, 10))) {\n tr.insertBefore(cell, targetRowCell || null);\n }\n });\n });\n });\n\n this.#sheet.recompileAndRefresh();\n }\n\n destroy() {\n this.#sheet.removeEventListener('pointerdown', this.#onPointerDown);\n }\n}","// ui/col/ColFixManager.js\nimport { trace } from \"@nopeer\";\n\nexport class ColFixManager {\n #sheet;\n\n constructor(sheet) {\n this.#sheet = sheet;\n }\n\n getFixState(targetCell, table) {\n if (!targetCell || !table) return 'none';\n\n const container = targetCell.closest('.ng-container-left, .ng-container-right, .ng-container-body');\n if (container?.classList.contains('ng-container-left')) return 'left';\n if (container?.classList.contains('ng-container-right')) return 'right';\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n if (!isNaN(baseCol)) {\n const colEl = table.querySelector(`colgroup col[data-col=\"${baseCol}\"]`);\n const fixedAttr = colEl?.getAttribute('fixed');\n if (fixedAttr) return fixedAttr;\n }\n\n return 'none';\n }\n\n canFixColumn(targetCell, table) {\n if (!targetCell || targetCell.tagName !== 'TH' || !table) return false;\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n if (isNaN(baseCol)) return false;\n\n const targetBoundaryCol = baseCol + colSpan - 1;\n const theadTrs = Array.from(table.querySelectorAll('thead tr'));\n\n if (theadTrs.length <= 1) return true;\n\n for (const tr of theadTrs) {\n const cells = Array.from(tr.querySelectorAll('th, td'));\n let cellBoundaryFound = false;\n\n for (const cell of cells) {\n const cCol = parseInt(cell.dataset.col, 10);\n const cSpan = cell.colSpan || 1;\n const cEndCol = cCol + cSpan - 1;\n\n if (cCol <= targetBoundaryCol && targetBoundaryCol < cEndCol) {\n return false;\n }\n\n if (cEndCol === targetBoundaryCol) {\n cellBoundaryFound = true;\n break;\n }\n }\n\n if (!cellBoundaryFound) return false;\n }\n\n return true;\n }\n\n executeFixToggle(action, targetCell, fixType = 'left') {\n if (!this.#sheet || !targetCell) return;\n\n const sourceTable = this.#sheet.sourceTable;\n if (!sourceTable) return;\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n const targetColIndex = baseCol + colSpan - 1;\n\n if (isNaN(targetColIndex)) return;\n\n const colgroup = sourceTable.querySelector('colgroup');\n if (!colgroup) return;\n\n const cols = Array.from(colgroup.querySelectorAll('col'));\n\n if (action === 'fix-column') {\n cols.forEach(col => {\n const idx = parseInt(col.getAttribute('data-col'), 10);\n if (idx <= targetColIndex) {\n col.setAttribute('fixed', fixType);\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n Array.from(tr.children).forEach(cell => {\n const cIdx = parseInt(cell.dataset.col, 10);\n if (!isNaN(cIdx) && cIdx <= targetColIndex) {\n cell.setAttribute('fixed', fixType);\n }\n });\n });\n });\n\n } else if (action === 'unfix-column') {\n let minBaseCol = baseCol;\n let maxEndCol = baseCol + colSpan - 1;\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach((tr, rIdx) => {\n Array.from(tr.children).forEach(cell => {\n const cCol = parseInt(cell.dataset.col, 10);\n const cSpan = cell.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n const rSpan = cell.rowSpan || 1;\n const trIndex = tr.sectionRowIndex ?? rIdx;\n\n const isVerticalOverlap = !(trIndex + rSpan - 1 < cell.closest('tr').sectionRowIndex || trIndex > (cell.closest('tr').sectionRowIndex + rSpan - 1));\n\n const isHorizontalOverlap = !(cEnd < baseCol || cCol > targetColIndex);\n\n if (isHorizontalOverlap) {\n minBaseCol = Math.min(minBaseCol, cCol);\n maxEndCol = Math.max(maxEndCol, cEnd);\n }\n });\n });\n });\n\n cols.forEach(col => {\n const idx = parseInt(col.getAttribute('data-col'), 10);\n if (idx >= minBaseCol) {\n col.removeAttribute('fixed');\n }\n });\n\n let isBroken = false;\n cols.forEach(col => {\n if (isBroken) {\n col.removeAttribute('fixed');\n } else if (!col.getAttribute('fixed')) {\n isBroken = true;\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n Array.from(tr.children).forEach(cell => {\n const cIdx = parseInt(cell.dataset.col, 10);\n if (isNaN(cIdx)) return;\n\n const correspondingCol = cols.find(c => parseInt(c.getAttribute('data-col'), 10) === cIdx);\n const isColFixed = correspondingCol?.getAttribute('fixed');\n\n if (isColFixed) {\n cell.setAttribute('fixed', isColFixed);\n } else {\n cell.removeAttribute('fixed');\n }\n });\n });\n });\n }\n\n this.#sheet.recompileAndRefresh?.();\n }\n}","import { NINE_TABLE } from '@/core/constants.js';\nimport { trace } from \"@nopeer\";\n\nexport class NineTableFilterPanel extends HTMLElement {\n\t#sheet;\n\t#host;\n\t#nineTable;\n\t#view;\n\t#button;\n\tcurrentCol = null;\n\n\tconnectedCallback() {\n\t\tthis.#init();\n\t\tdocument.addEventListener(\"mousedown\", this.#closeHandler);\n\t}\n\n\t#init = () => {\n\t\t//setTimeout(() => {\n\t\t\tthis.#renderer();\n\n\t\t\tthis.#sheet = this.closest(\"nine-table-sheet\");\n\t\t\tthis.#host = this.getRootNode().host;\n\n\t\t\tthis.#nineTable = this.querySelector(\"nine-table-simple\");\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.#view = this.#nineTable.shadowRoot.querySelector(\"nine-table-sheet\");\n\t\t\t})\n\n\n\t\t\tthis.querySelector(\".search-box\").addEventListener(\"focusin\", (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\t\t\tthis.querySelector(\".search-box\").addEventListener(\"input\", this.#onInput);\n\t\t\tthis.querySelector(\"#chkSelectAll\").addEventListener(\"change\", this.#onSelectAll);\n\t\t\tthis.querySelector(\"#btnOk\").addEventListener(\"click\", this.#onOk);\n\t\t//});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" class=\"search-box\" placeholder=\"Search...\">\n \n <nine-table-simple class=\"filter-list\" theme=\"simple\">\n <table auto-fit-col=\"true\">\n <colgroup>\n <col width=\"32\" fixed=\"left\" />\n <col width=\"180\" />\n <col width=\"0\" fixed=\"right\"/>\n </colgroup>\n <tbody>\n <tr>\n <td cell-type=\"checkbox\" data-bind=\"CHK\"></td>\n <td data-bind=\"DATA2\" html=\"true\"></td>\n <td data-bind=\"DATA\"></td>\n </tr>\n </tbody>\n </table>\n </nine-table-simple>\n\n <div class=\"footer-section\">\n <div class=\"footer-btns\">\n <label><input type=\"checkbox\" id=\"chkSelectAll\" checked> Select All</label>\n <div class=\"btn-group\">\n <button id=\"btnOk\">Apply</button>\n </div>\n </div>\n </div>\n `;\n\t}\n\n\topen(filterBtn) {\n\t\tthis.#button = filterBtn;\n\n\t\tconst cell = filterBtn.closest(\"th, td\");\n\t\tthis.currentCol = cell?.dataset.col;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst sheetRect = this.#sheet.getBoundingClientRect();\n\n\t\tconst panelWidth = this.offsetWidth || 240;\n\t\tlet left = (cellRect.right - sheetRect.left) - panelWidth;\n\t\tlet top = cellRect.bottom - sheetRect.top;\n\n\t\tif (left < 0) {\n\t\t\tleft = Math.max(0, cellRect.left - sheetRect.left);\n\t\t}\n\n\t\tthis.style.left = `${left}px`;\n\t\tthis.style.top = `${top}px`;\n\n\t\tconst searchBox = this.querySelector(\".search-box\");\n\t\tsearchBox.value = \"\";\n\n\n\t\tthis.classList.add(\"active\");\n\t\tthis.classList.add(\"loading\");\n\n\t\tsetTimeout(() => {\n\t\t\ttry {\n\t\t\t\tthis.#loadVirtualFilterItems();\n\t\t\t\tthis.#view.rowManager.scrollToDataRow(0);\n\t\t\t\tsearchBox.focus();\n\t\t\t} finally {\n\t\t\t\tthis.classList.remove(\"loading\");\n\t\t\t}\n\t\t});\n\t}\n\n\t#closeHandler = (e) => {\n\t\tconst path = e.composedPath ? e.composedPath() : [];\n\t\tif (path.includes(this) || (this.#button && path.includes(this.#button))) {\n\t\t\treturn;\n\t\t}\n\t\tthis.close();\n\t};\n\n\tclose() {\n\t\tthis.currentCol = null;\n\t\tthis.classList.remove(\"active\");\n\t\tthis.#button = null;\n\t}\n\n\t#loadVirtualFilterItems() {\n\t\tconst filteredRecords = this.#host.data.getArray();\n\t\tconst targetCols = this.#button?.columns || []; // [{ bind, expr }] ํ˜•ํƒœ ๋ฐฐ์—ด\n\t\tconst fields = this.#host.fields.get() || [];\n\t\tconst activeFilters = this.#sheet.filtering?.filters || {};\n\t\tconst exprEngine = this.#host.exprEngine;\n\n\t\tconst ds = targetCols.flatMap((colInfo) => {\n\t\t\tconst bindKey = colInfo.bind;\n\t\t\tconst exprKey = colInfo.expr;\n\n\t\t\tconst filterKey = bindKey || exprKey; // ์‹ค์ œ ํ•„ํ„ฐ ํŒŒ๋ผ๋ฏธํ„ฐ ํ‚ค๋กœ ์‚ฌ์šฉ\n\t\t\tconst fieldIdx = bindKey ? fields.indexOf(bindKey) : -1;\n\t\t\tconst activeSelectedVals = activeFilters[filterKey] || [];\n\n\t\t\tconst uniqueMap = new Map();\n\t\t\tfor (let i = 0; i < filteredRecords.length; i++) {\n\t\t\t\tconst record = filteredRecords[i];\n\t\t\t\tif (!record) continue;\n\n\t\t\t\tlet rawVal = undefined;\n\t\t\t\tif (fieldIdx >= 0 && record.v) {\n\t\t\t\t\trawVal = record.v[fieldIdx];\n\t\t\t\t} else if (bindKey && bindKey.includes(\"data.\")) {\n\t\t\t\t\trawVal = exprEngine ? exprEngine.evaluate(bindKey, record, i) : undefined;\n\t\t\t\t} else if (exprKey && exprEngine) {\n\t\t\t\t\trawVal = exprEngine.evaluate(exprKey, record, i);\n\t\t\t\t}\n\n\t\t\t\tlet displayVal = rawVal;\n\t\t\t\tif (exprKey && exprEngine) {\n\t\t\t\t\tdisplayVal = exprEngine.evaluate(exprKey, record, i);\n\t\t\t\t}\n\n\t\t\t\tif (displayVal !== undefined && displayVal !== null && !uniqueMap.has(displayVal)) {\n\t\t\t\t\tuniqueMap.set(displayVal, {\n\t\t\t\t\t\tv: rawVal, // ๐Ÿ’ก ํ•„ํ„ฐ๋ง ๋น„๊ต ๊ธฐ์ค€ (DATA)\n\t\t\t\t\t\tv2: displayVal // ๐Ÿ’ก ํ™”๋ฉด ์ถœ๋ ฅ ๊ธฐ์ค€ (DATA2)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst uniqueList = [...uniqueMap.values()];\n\n\t\t\tuniqueList.sort((a, b) => {\n\t\t\t\tconst valA = a.v2;\n\t\t\t\tconst valB = b.v2;\n\n\t\t\t\tif (valA === valB) return 0;\n\t\t\t\tif (valA === undefined || valA === null || valA === '') return 1;\n\t\t\t\tif (valB === undefined || valB === null || valB === '') return -1;\n\n\t\t\t\tconst numA = Number(valA);\n\t\t\t\tconst numB = Number(valB);\n\n\t\t\t\tconst isNumA = !isNaN(numA);\n\t\t\t\tconst isNumB = !isNaN(numB);\n\n\t\t\t\tif (isNumA && isNumB) {\n\t\t\t\t\treturn numA - numB;\n\t\t\t\t}\n\n\t\t\t\treturn String(valA).localeCompare(String(valB));\n\t\t\t});\n\t\t\tactiveSelectedVals.sort((a, b) => { return a > b ? 1 : -1; });\n\n\t\t\treturn uniqueList.map(o => ({\n\t\t\t\tLVL: 2,\n\t\t\t\tDATA: o.v, // ํ•„ํ„ฐ๋ง ๋น„๊ต์šฉ ๊ฐ’\n\t\t\t\tDATA2: (o.v2 === \"\" || o.v2 === null || o.v2 === undefined) ? '<span class=\"empty-value\">(empty)</span>' : o.v2,\n\t\t\t\tCOLNM: filterKey,\n\t\t\t\tCHK: activeSelectedVals.length === 0 || activeSelectedVals.nineBinarySearch(o.v) >= 0 ? \"Y\" : \"N\"\n\t\t\t}));\n\t\t});\n\n\t\tthis.#nineTable.data.set(ds);\n\n\t\tconst selectAllChk = this.querySelector(\"#chkSelectAll\");\n\t\tif (selectAllChk) {\n\t\t\tselectAllChk.checked = ds.length > 0 && ds.every(item => item.CHK === \"Y\");\n\t\t}\n\t}\n\n\t#onOk = () => {\n\t\tthis.#host.loading = true;\n\n\t\tconst filterRecords = this.#view.view.getArray();\n\t\tconst fields = this.#nineTable.data.getHostFields();\n\n\t\tconst checkedRecords = filterRecords.filter(record => {\n\t\t\tconst chk = record.v[fields.indexOf(\"CHK\")];\n\t\t\treturn (chk === \"Y\" || chk === true);\n\t\t});\n\n\t\tconst filterParams = { ...(this.#sheet.filtering?.filters || {}) };\n\n\t\tthis.#button.columns.forEach(colInfo => {\n\t\t\tconst filterKey = colInfo.expr || colInfo.bind;\n\t\t\tconst fieldIdx = colInfo.expr ? fields.indexOf(\"DATA2\") : fields.indexOf(\"DATA\");\n\t\t\tconst selectedVals = checkedRecords.map(r => r.v[fieldIdx]);\n\n\t\t\tif (selectedVals.length > 0) {\n\t\t\t\tfilterParams[filterKey] = selectedVals;\n\t\t\t} else {\n\t\t\t\tdelete filterParams[filterKey];\n\t\t\t}\n\t\t});\n\n\t\tconst totalCount = this.#nineTable.data.count();\n\n\t\tsetTimeout(() => {\n\t\t\ttry {\n\t\t\t\tif (totalCount === checkedRecords.length) {\n\t\t\t\t\tthis.#button.columns.forEach(colInfo => {\n\t\t\t\t\t\tconst filterKey = colInfo.expr || colInfo.bind;\n\t\t\t\t\t\tif (filterKey) this.#sheet.filtering.clear(filterKey);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.#sheet.filtering.set(filterParams);\n\t\t\t\t}\n\n\t\t\t\tthis.#sheet.querySelectorAll(\"nine-table-filter-button\").forEach(btn => {\n\t\t\t\t\tbtn.updateFilteredState();\n\t\t\t\t});\n\n\t\t\t\tthis.#sheet.invalidate();\n\t\t\t\tthis.close();\n\t\t\t} finally {\n\t\t\t\tthis.#host.loading = false;\n\t\t\t}\n\t\t});\n\t};\n\n\t#onInput = (e) => {\n\n\t\tconst query = e.target.value.toLowerCase().trim();\n\n\t\tif (!query) {\n\t\t\tthis.#view.filtering.clear();\n\t\t} else {\n\t\t\tconst rawRecords = this.#nineTable.data.getArray();\n\t\t\tconst fields = this.#nineTable.data.getHostFields();\n\t\t\tconst data2Idx = fields.indexOf(\"DATA2\");\n\n\t\t\tconst matchedValues = [];\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tconst val = data2Idx >= 0 && record.v ? record.v[data2Idx] : \"\";\n\t\t\t\tconst textVal = String(val).replace(/<[^>]*>?/gm, '').toLowerCase();\n\n\t\t\t\tif (textVal.includes(query)) {\n\t\t\t\t\tmatchedValues.push(val);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.#view.filtering.set({\n\t\t\t\tDATA2: [...new Set(matchedValues)]\n\t\t\t});\n\t\t}\n\t};\n\n\t#onSelectAll = (e) => {\n\t\tconst isChecked = e.target.checked;\n\t\tconst rawRecords = this.#nineTable?.data?.getArray() || [];\n\t\tconst fields = this.#nineTable.data.getHostFields();\n\t\tconst chkIdx = fields.indexOf(\"CHK\");\n\n\t\tif (chkIdx >= 0) {\n\t\t\trawRecords.forEach(record => {\n\t\t\t\trecord.v[chkIdx] = isChecked ? \"Y\" : \"N\";\n\t\t\t});\n\t\t}\n\n\t\tthis.#nineTable.refresh();\n\t};\n\n\t#onCancel = () => {\n\t\tthis.close();\n\t};\n}\n\nexport class NineTableFilterButton extends HTMLElement {\n\t#sheet;\n\t#columns = null;\n\n\tconnectedCallback() {\n\t\tthis.#sheet = this.closest(\"nine-table-sheet\") || this.getRootNode().host;\n\t\tthis.removeEventListener(\"click\", this.#onClick);\n\t\tthis.addEventListener(\"click\", this.#onClick);\n\t}\n\n\tget columns() {\n\t\tif (this.#columns) return this.#columns;\n\n\t\tconst cell = this.closest(\"th, td\");\n\t\tconst colIndex = cell?.dataset.col;\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\n\t\tconst cols = [];\n\t\tconst seen = new Set();\n\n\t\tif (sourceTable && colIndex !== undefined) {\n\t\t\tsourceTable.querySelectorAll(`tbody [data-col=\"${colIndex}\"]`).forEach($td => {\n\t\t\t\tconst bindKey = $td.dataset.bind;\n\t\t\t\tconst exprKey = $td.dataset.expr;\n\n\t\t\t\tif (bindKey || exprKey) {\n\t\t\t\t\tconst uniqueKey = `${bindKey || ''}_${exprKey || ''}`;\n\t\t\t\t\tif (!seen.has(uniqueKey)) {\n\t\t\t\t\t\tseen.add(uniqueKey);\n\t\t\t\t\t\tcols.push({\n\t\t\t\t\t\t\tbind: bindKey,\n\t\t\t\t\t\t\texpr: exprKey,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#columns = cols;\n\t\treturn this.#columns;\n\t}\n\n\tupdateFilteredState = () => {\n\t\tconst activeFilters = this.#sheet.filtering?.filters || {};\n\t\tconst isFiltered = this.columns.some(colInfo => {\n\t\t\tconst key = colInfo.expr || colInfo.bind;\n\t\t\treturn key && activeFilters[key] && activeFilters[key].length > 0;\n\t\t});\n\t\tthis.classList.toggle('filtered', isFiltered);\n\t};\n\n\t#onClick = (e) => {\n\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tconst panel = this.#sheet.querySelector(\"nine-table-filter-panel\");\n\t\tconst cell = this.closest(\"th, td\");\n\t\tconst col = cell.dataset.col;\n\n\t\tif (panel && panel.currentCol === col && panel.classList.contains('active')) {\n\t\t\tpanel.close();\n\t\t} else if (panel) {\n\t\t\tpanel.open(this);\n\t\t}\n\t};\n}\n\nexport class Filtering {\n\t#sheet;\n\t#host;\n\t#isFiltering = false;\n\t#filterPanel = null;\n\t#filters = {};\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = this.#sheet.getRootNode().host;\n\t\tthis.#init();\n\t}\n\n\tget filters() {\n\t\treturn this.#filters;\n\t};\n\n\t#init = () => {\n\t\tthis.#initFilterPanel();\n\t}\n\n\t#initFilterPanel = () => {\n\t\tif (this.#host.tagName.toLowerCase() === \"nine-table-simple\") {\n\t\t\treturn;\n\t\t}\n\n\t\tlet panel = this.#sheet.querySelector(\"nine-table-filter-panel\");\n\t\tif (!panel) {\n\t\t\tpanel = document.createElement(\"nine-table-filter-panel\");\n\t\t\tthis.#sheet.appendChild(panel);\n\t\t}\n\t\tthis.#filterPanel = panel;\n\t}\n\n\tisFiltering() {\n\t\treturn this.#isFiltering;\n\t}\n\n\tclear = (colnm) => {\n\t\tif (colnm) {\n\t\t\tdelete this.#filters[colnm];\n\t\t} else {\n\t\t\tthis.#filters = {};\n\t\t}\n\n\t\tthis.#isFiltering = Object.keys(this.#filters).length > 0;\n\t\tthis.#applyFiltering();\n\n\t\tthis.#sheet.querySelectorAll(\"nine-table-filter-button\").forEach(btn => {\n\t\t\tbtn.updateFilteredState();\n\t\t});\n\t}\n\n\tset = (oFilter) => {\n\n\t\tlet jsonFilter = Array.isArray(oFilter)\n\t\t\t? Object.fromEntries(Object.keys(oFilter[0]).map(k => [k, [...new Set(oFilter.map(item => item[k]))]]))\n\t\t\t: oFilter;\n\n\t\tthis.#filters = jsonFilter;\n\t\tthis.#isFiltering = Object.keys(jsonFilter).length > 0;\n\t\tthis.#sheet.toggleAttribute(\"filtering\", this.#isFiltering);\n\n\t\tthis.#applyFiltering();\n\t}\n\n\t#applyFiltering() {\n\t\tconst hostData = this.#host.data;\n\t\tconst rawRecords = hostData.getArray();\n\t\tconst fields = this.#host.data.getHostFields();\n\t\tconst sheetIndex = this.#sheet.index;\n\t\tconst exprEngine = this.#host.exprEngine;\n\n\t\tconst hasFilters = Object.keys(this.#filters).length > 0;\n\n\t\tif (!hasFilters) {\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tif (record?.m?._?.[NINE_TABLE.META.INDEX.FILTER]) {\n\t\t\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER][sheetIndex] = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.#sheet.invalidate();\n\t\t\treturn;\n\t\t}\n\n\t\tconst filterRules = Object.entries(this.#filters).map(([targetKey, allowedValues]) => {\n\t\t\tconst isExpr = targetKey.includes(\"data.\") || targetKey.includes(\"host.\") || targetKey.includes(\"rowItem.v\");\n\t\t\treturn {\n\t\t\t\ttargetKey,\n\t\t\t\tisExpr,\n\t\t\t\tfieldIdx: !isExpr ? fields.indexOf(targetKey) : -1,\n\t\t\t\tallowedSet: new Set(allowedValues)\n\t\t\t};\n\t\t});\n\n\t\trawRecords.forEach((record, recordIdx) => {\n\t\t\tif (!record) return;\n\n\t\t\tif (!record.m._[NINE_TABLE.META.INDEX.FILTER]) {\n\t\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER] = [];\n\t\t\t}\n\n\t\t\tlet isPass = true;\n\n\t\t\tfor (let i = 0; i < filterRules.length; i++) {\n\t\t\t\tconst { targetKey, isExpr, fieldIdx, allowedSet } = filterRules[i];\n\t\t\t\tlet val = undefined;\n\n\t\t\t\tif (isExpr && exprEngine) {\n\t\t\t\t\tval = exprEngine.evaluate(targetKey, record, recordIdx);\n\t\t\t\t} else if (fieldIdx >= 0 && record.v) {\n\t\t\t\t\tval = record.v[fieldIdx];\n\t\t\t\t}\n\n\t\t\t\tif (!allowedSet.has(val)) {\n\t\t\t\t\tisPass = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER][sheetIndex] = isPass;\n\t\t});\n\n\t\tthis.#sheet.invalidate();\n\t}\n}\n\nif (!customElements.get('nine-table-filter-panel')) {\n\tcustomElements.define(\"nine-table-filter-panel\", NineTableFilterPanel);\n}\n\nif (!customElements.get('nine-table-filter-button')) {\n\tcustomElements.define(\"nine-table-filter-button\", NineTableFilterButton);\n}","// ui/data/Sorting.js (๋˜๋Š” ์ •๋ ฌ ๊ด€๋ จ ์†Œ์Šค)\nimport { trace } from \"@nopeer\";\n\nexport class Sorting {\n\t#sheet;\n\t#host;\n\n\t#columns = [];\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tsetTimeout(() => {\n\t\t\tthis.#initEvents();\n\t\t}, 300);\n\t}\n\n\t#initEvents() {\n\n\t\tthis.#sheet.querySelectorAll(\"thead\").forEach($el => {\n\n\t\t\t$el.addEventListener('dblclick', (e) => {\n\n\t\t\t\tconst cell = e.target.closest('th, td');\n\t\t\t\tif (!cell || cell.classList.contains('resizable-edge')) return;\n\n\t\t\t\tif ([\"INPUT\",\"CELL-CHECKBOX\"].includes(e.target.tagName)) return;\n\n\t\t\t\tif (e.offsetX <= 2 || e.offsetX >= cell.offsetWidth - 2) return;\n\n\t\t\t\tconst host = this.#sheet.getRootNode().host;\n\n\t\t\t\thost.loading = true;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#handleSort(e, cell);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\thost.loading = false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t#handleSort(e, cell) {\n\t\tconst colIndex = cell.dataset.col;\n\t\tconst tr = cell.closest('tr');\n\t\tconst subRowIndex = tr ? tr.dataset.subrow || String(tr.sectionRowIndex) : '0';\n\n\t\tif (colIndex === undefined) return;\n\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (!sourceTable) return;\n\n\t\tlet colName = null;\n\t\tlet exprVal = null;\n\n\t\tsourceTable.querySelectorAll(`tbody [data-col=\"${colIndex}\"]`).forEach($td => {\n\t\t\tif ($td.dataset.bind) {\n\t\t\t\tcolName = $td.dataset.bind;\n\t\t\t}\n\n\t\t\tif ($td.dataset.expr) {\n\t\t\t\texprVal = $td.dataset.expr;\n\t\t\t}\n\t\t});\n\n\t\tif (!colName && !exprVal) return;\n\n\t\tconst isAsc = cell.classList.contains('asc');\n\t\tconst isDesc = cell.classList.contains('desc');\n\n\t\tif (!e.ctrlKey && !e.shiftKey) {\n\t\t\tthis.#columns = [];\n\t\t}\n\n\t\tconst existingColIndex = this.#columns.findIndex(\n\t\t\tm => (m.colIndex === colIndex && m.subRowIndex === subRowIndex) || m.colName === colName\n\t\t);\n\n\t\tconst ruleData = {\n\t\t\tcolIndex,\n\t\t\tsubRowIndex,\n\t\t\tcolname: colName || exprVal,\n\t\t\tcolName: colName || exprVal,\n\t\t\texpr: exprVal, // ๐Ÿ’ก expr ๊ทœ์น™ ๋ณด๊ด€\n\t\t\tasc: true,\n\t\t\t\"expr-func\": exprVal ? (record, idx) => this.#host.exprEngine(exprVal, record, idx) : null\n\t\t};\n\n\t\tif (!isAsc && !isDesc) {\n\t\t\tif (existingColIndex >= 0) {\n\t\t\t\tthis.#columns[existingColIndex].asc = true;\n\t\t\t} else {\n\t\t\t\tthis.#columns.push({ ...ruleData, asc: true });\n\t\t\t}\n\t\t} else if (isAsc) {\n\t\t\tif (existingColIndex >= 0) {\n\t\t\t\tthis.#columns[existingColIndex].asc = false;\n\t\t\t} else {\n\t\t\t\tthis.#columns.push({ ...ruleData, asc: false });\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#columns = this.#columns.filter(\n\t\t\t\tm => !((m.colIndex === colIndex && m.subRowIndex === subRowIndex) || m.colName === colName)\n\t\t\t);\n\t\t}\n\n\t\tthis.#applySorting(cell);\n\t}\n\n\t#applySorting(cell) {\n\n\t\tthis.#sheet.view.setSorting(this.#columns);\n\t\tthis.#syncHeaderUI();\n\t\tthis.#sheet.invalidate();\n\t\trequestAnimationFrame(() => {\n\t\tconst cells = this.#sheet.querySelectorAll('tbody.body th, tbody.body td');\n\n\t\tcells.forEach($td => {\n\t\t\t$td.classList.remove('sorting-anim-asc', 'sorting-anim-desc', 'sorting-anim-none');\n\n\t\t\tif (cell.classList.contains('asc')) {\n\t\t\t\t$td.classList.add('sorting-anim-asc');\n\t\t\t} else if (cell.classList.contains('desc')) {\n\t\t\t\t$td.classList.add('sorting-anim-desc');\n\t\t\t} else {\n\t\t\t\t$td.classList.add('sorting-anim-none');\n\t\t\t}\n\t\t});\n\n\t\trequestAnimationFrame(() => {\n\t\t\tcells.forEach($td => {\n\t\t\t\t$td.classList.remove('sorting-anim-asc', 'sorting-anim-desc', 'sorting-anim-none');\n\t\t\t});\n\t\t});\n\t\t});\n\t}\n\n\t#syncHeaderUI() {\n\t\tthis.#sheet.querySelectorAll('thead th, thead td').forEach(el => {\n\t\t\tel.classList.remove('asc', 'desc');\n\t\t});\n\n\t\tif (this.#columns.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#columns.forEach(colRule => {\n\t\t\tconst { colIndex, subRowIndex, asc } = colRule;\n\n\t\t\tif (colIndex !== undefined) {\n\t\t\t\tlet selector = `thead [data-col=\"${colIndex}\"]`;\n\t\t\t\tif (subRowIndex !== undefined) {\n\t\t\t\t\tselector = `thead tr[data-subrow=\"${subRowIndex}\"] [data-col=\"${colIndex}\"]`;\n\t\t\t\t}\n\n\t\t\t\tconst targetHeaderCells = this.#sheet.querySelectorAll(selector);\n\t\t\t\ttargetHeaderCells.forEach(cell => {\n\t\t\t\t\tcell.classList.add(asc ? 'asc' : 'desc');\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\trestore() {\n\t\tthis.#columns = [];\n\t\tif (this.#sheet.view) {\n\t\t\tthis.#sheet.view.resetSorting();\n\t\t}\n\n\t\tthis.#syncHeaderUI();\n\t\tthis.#sheet.rowManager?.refresh(true);\n\t}\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport {Grouping} from \"@/data/Grouping.js\";\n\nexport class SheetView {\n\t#sheet;\n\t#host;\n\t#sortingColumns = [];\n\t#filterRules = [];\n\t#viewIndexes = [];\n\n\t#cachedVisibleRecords = null;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.refresh();\n\t}\n\n\tgetArray = (at, colnm) => {\n\n\t\tif (!this.#cachedVisibleRecords) {\n\t\t\tconst records = this.#host.data.getArray();\n\t\t\tthis.#cachedVisibleRecords = this.#viewIndexes.map(idx => records[idx]);\n\t\t}\n\n\t\tconst visibleRecords = this.#cachedVisibleRecords;\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn visibleRecords;\n\t\t}\n\n\t\tif (at < 0 || at >= visibleRecords.length) return null;\n\n\t\tconst targetRecord = visibleRecords[at];\n\t\tif (colnm != null) {\n\t\t\tconst fields = this.#host.data.getHostFields();\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0 && targetRecord.v) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn targetRecord;\n\t};\n\n\tcount = () => {\n\t\tif (!this.#cachedVisibleRecords) {\n\t\t\tconst records = this.#host.data.getArray();\n\t\t\tthis.#cachedVisibleRecords = this.#viewIndexes.map(idx => records[idx]);\n\t\t}\n\n\t\treturn this.#cachedVisibleRecords.length;\n\t}\n\n\tget = (at, colnm) => {\n\t\tconst visibleRecords = this.getArray();\n\t\tconst fields = this.#host.data.getHostFields?.() || [];\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn visibleRecords.map(record => this.#convSingle(record, fields));\n\t\t}\n\n\t\tif (at < 0 || at >= visibleRecords.length) return null;\n\n\t\tconst targetRecord = visibleRecords[at];\n\t\tif (!targetRecord) return null;\n\n\t\tif (colnm != null) {\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0 && targetRecord.v) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn this.#convSingle(targetRecord, fields);\n\t};\n\n\t#convSingle = (o, fields) => {\n\t\tif (!o) return null;\n\t\tconst t = {};\n\t\tfields.forEach((colnm, i) => {\n\t\t\tt[colnm] = o.v ? o.v[i] : o[colnm];\n\t\t});\n\t\tif (o.m) t.m = o.m;\n\t\tif (o._) t._ = o._;\n\t\treturn t;\n\t};\n\n\trefresh = () => {\n\n\t\tthis.#cachedVisibleRecords = null;\n\n\t\tconst rawRecords = this.#host.data.getArray();\n\t\tlet indices = [];\n\t\trawRecords.forEach((record, i) => {\n\t\t\tif (!record) return;\n\t\t\tconst filterSlot = record.m?._?.[NINE_TABLE.META.INDEX.FILTER];\n\t\t\tif (filterSlot && filterSlot[this.#sheet.index] === false) return;\n\t\t\tindices.push(i);\n\t\t});\n\n\t\tif (this.#sortingColumns.length > 0) {\n\t\t\tindices = this.#applySorting(indices, rawRecords);\n\t\t}\n\n\t\tthis.#viewIndexes = indices;\n\t\tconst validRecords = indices.map(idx => rawRecords[idx]);\n\n\t\tconst groupColumns = this.#sheet.grouping?.columns || [];\n\t\tif (groupColumns.length > 0) {\n\t\t\tconst groupResult = Grouping.apply(validRecords, groupColumns, this.#host.data.getHostFields());\n\n\t\t\tthis.#cachedVisibleRecords = groupResult.renderItems; // ์ตœ์ข… ๋ Œ๋”๋ง ์•„์ดํ…œ\n\n\t\t\tthis.#sheet.grouping.setGroupMap(groupResult.groupMap); // ์ž์‹ ๋งคํ•‘ ๊ณต์œ \n\t\t} else {\n\t\t\tthis.#cachedVisibleRecords = validRecords;\n\t\t}\n\n\n\n\t}\n\n\tsetSorting = (columns) => {\n\t\tthis.#sortingColumns = columns || [];\n\t\tthis.refresh();\n\t};\n\n\tgetSorting = () => {\n\t\treturn this.#sortingColumns;\n\t};\n\n\tresetSorting = () => {\n\t\tthis.#sortingColumns = [];\n\t\tthis.refresh();\n\t};\n\n\n\t#applySorting = (indices, validRecords) => {\n\n\t\tconst fields = typeof this.#host.data.getHostFields === 'function' ? this.#host.data.getHostFields() : [];\n\n\t\tconst rulesWithIdx = this.#sortingColumns.map(rule => ({\n\t\t\t...rule,\n\t\t\tcolIndex: fields.indexOf(rule.colname || rule.colName)\n\t\t}));\n\n\t\treturn indices.sort((idxA, idxB) => {\n\t\t\tconst a = validRecords[idxA];\n\t\t\tconst b = validRecords[idxB];\n\n\t\t\tfor (const rule of rulesWithIdx) {\n\t\t\t\tconst isAsc = rule.asc;\n\t\t\t\tconst expr = rule.expr; // ๐Ÿ’ก ๋“ฑ๋ก๋œ expr ์ˆ˜์‹\n\t\t\t\tlet valA, valB;\n\n\t\t\t\tif (expr) {\n\t\t\t\t\tvalA = this.#host.exprEngine.evaluate(expr, a, idxA);\n\t\t\t\t\tvalB = this.#host.exprEngine.evaluate(expr, b, idxB);\n\t\t\t\t} else {\n\t\t\t\t\tif (rule.colIndex >= 0 && a.v && b.v) {\n\t\t\t\t\t\tvalA = a.v[rule.colIndex];\n\t\t\t\t\t\tvalB = b.v[rule.colIndex];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst isEmptyA = (valA === null || valA === undefined || valA === '');\n\t\t\t\tconst isEmptyB = (valB === null || valB === undefined || valB === '');\n\n\t\t\t\tif (isEmptyA && isEmptyB) continue;\n\t\t\t\tif (isEmptyA) return 1;\n\t\t\t\tif (isEmptyB) return -1;\n\n\t\t\t\tif (valA !== valB) {\n\t\t\t\t\tlet diff = 0;\n\n\t\t\t\t\tif (typeof valA === 'number' && typeof valB === 'number') {\n\t\t\t\t\t\tdiff = valA - valB;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst strA = String(valA);\n\t\t\t\t\t\tconst strB = String(valB);\n\t\t\t\t\t\tdiff = strA > strB ? 1 : (strA < strB ? -1 : 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (diff !== 0) {\n\t\t\t\t\t\treturn isAsc ? diff : -diff;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn idxA - idxB;\n\t\t});\n\t};\n}","import { trace } from \"@nopeer\";\nimport { TableCompiler } from \"@/layout/core/TableCompiler.js\";\n\nexport const COLLAPSED_WIDTH = 16;\n\nexport class PreCompiler {\n\n static initializeTable(host, tbl) {\n\n PreCompiler.#ensureColgroup(tbl);\n PreCompiler.#ensureThead(tbl);\n PreCompiler.#ensureSectionTbodys(tbl);\n\n PreCompiler.#ensureRowIndicator(tbl);\n\n PreCompiler.#normalizeColAttributes(tbl);\n\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tfoot tr'));\n\n PreCompiler.#createColIndicator(tbl);\n\n PreCompiler.#normalizeCollapsibleAttributes(tbl);\n\n PreCompiler.#generateCell(host, tbl);\n\n PreCompiler.#initColExpanders(tbl);\n\n PreCompiler.#initFilterButtons(host, tbl);\n\n PreCompiler.#applyInitialCellWidths(tbl);\n\n return tbl;\n }\n\n static #createColIndicator(tbl) {\n const thead = tbl.querySelector('thead');\n if (!thead || thead.querySelector('.col-indicator-rowgroup')) return;\n\n const tdTmpl = `<th data-col=\"@col\" class=\"col-indicator\" scope=\"col\"></th>`;\n\n const tr = thead.insertRow(0);\n tr.setAttribute('role', 'row');\n tr.classList.add('col-indicator-rowgroup');\n tr.classList.add('collapse');\n\n const firstRow = tbl.querySelector('tbody tr');\n if (!firstRow) return;\n\n let cnt = 0;\n firstRow.querySelectorAll('th, td').forEach(td => {\n if (!td.classList.contains('dummy')) {\n const colSpan = td.colSpan || 1;\n for (let i = 0; i < colSpan; i++) {\n const html = tdTmpl.replace('@col', cnt).replace('@text', PreCompiler.#numToExcelCol(cnt++));\n tr.insertAdjacentHTML('beforeend', html);\n }\n }\n });\n\n const cols = Array.from(tbl.querySelectorAll('colgroup col'));\n tr.querySelectorAll('.col-indicator').forEach((el, i) => {\n const background = cols[i].getAttribute('background');\n if (background) {\n el.style.background = background;\n }\n });\n }\n\n static #numToExcelCol(num) {\n let text = '';\n for (let n = num; n >= 0; n = Math.floor(n / 26) - 1) {\n text = String.fromCharCode(65 + (n % 26)) + text;\n }\n return text;\n }\n\n static #ensureSectionTbodys(tbl) {\n let tbody = tbl.querySelector('tbody:not(.head):not(.foot)');\n\n if (!tbody) return;\n\n tbody.classList.add('body');\n\n if (!tbl.querySelector('tbody.head')) {\n const headTbody = document.createElement('tbody');\n headTbody.classList.add('head');\n tbody.before(headTbody);\n }\n\n if (!tbl.querySelector('tbody.foot')) {\n const footTbody = document.createElement('tbody');\n footTbody.classList.add('foot');\n tbody.after(footTbody);\n }\n }\n\n static #ensureColgroup(tbl) {\n let colgroup = tbl.querySelector('colgroup');\n if (!colgroup) {\n colgroup = document.createElement('colgroup');\n tbl.prepend(colgroup);\n }\n\n if (colgroup.querySelectorAll('col').length === 0) {\n const firstRow = tbl.querySelector('tbody tr');\n let colCount = 1;\n if (firstRow) {\n colCount = Array.from(firstRow.querySelectorAll('th, td')).reduce((sum, cell) => {\n return sum + (parseInt(cell.getAttribute('colspan') || cell.colSpan, 10) || 1);\n }, 0);\n }\n colCount = Math.max(colCount, 1);\n\n for (let i = 0; i < colCount; i++) {\n const col = document.createElement('col');\n colgroup.appendChild(col);\n }\n }\n }\n\n static #normalizeColAttributes(tbl) {\n const cols = Array.from(tbl.querySelectorAll('colgroup col'));\n if (cols.length === 0) return;\n\n const containerWidth = tbl.clientWidth || 0;\n const defaultWidth = Math.max(Math.floor(containerWidth / cols.length), 100);\n\n cols.forEach((col, i) => {\n\n if (!col.hasAttribute('data-col')) {\n col.setAttribute('data-col', i);\n }\n\n const width = col.getAttribute('width') || parseInt(col.style.width, 10) || defaultWidth;\n col.setAttribute('width', width);\n\n const widthVal = String(width).includes('px') ? width : `${width}px`;\n col.style.width = widthVal;\n });\n }\n\n static #ensureThead(tbl) {\n if (tbl.querySelector('thead')) return;\n\n const thead = document.createElement('thead');\n const colgroup = tbl.querySelector('colgroup');\n\n if (colgroup) {\n colgroup.after(thead);\n } else {\n tbl.prepend(thead);\n }\n }\n\n static #normalizeCollapsibleAttributes(tbl) {\n const headers = tbl.querySelectorAll('thead th, thead td');\n headers.forEach(cell => {\n const isCollapsed = cell.getAttribute('collapsed') === 'true';\n if (isCollapsed && cell.getAttribute('collapsible') !== 'true') {\n cell.setAttribute('collapsible', 'true');\n }\n });\n }\n\n static #generateCell(host, $tbl) {\n\n const targetAttributes = ['data-bind', 'data-expr', 'type'];\n let autoIdCounter = 0;\n\n $tbl.querySelectorAll('tbody th, tbody td').forEach($cell => {\n const cellType = $cell.getAttribute('cell-type') || \"renderer\";\n const tagName = `cell-${cellType}`;\n\n const $datalist = $cell.querySelector(\"datalist\");\n\n if ($datalist) {\n let l = [];\n $datalist.querySelectorAll('option').forEach($option => {\n l.push({\n k: $option.getAttribute(\"k\"),\n v: $option.getAttribute(\"v\"),\n value: $option.getAttribute(\"value\"),\n });\n });\n\n const uniqueFuncName = `__ds_${Date.now()}_${++autoIdCounter}`;\n\n if (host) {\n host[uniqueFuncName] = () => l;\n }\n\n $cell.setAttribute(\"data-source\", `host.${uniqueFuncName}()`);\n\n $datalist.remove();\n }\n\n const expr = $cell.dataset.expr;\n if (expr) {\n $cell.setAttribute('data-expr', host.exprEngine.precompile(expr));\n }\n\n Array.from($cell.attributes).forEach(attr => {\n if (['data-bind', 'data-expr', 'cell-type', 'validator'].includes(attr.name)) return;\n if (attr.value.includes(\"data.\") || attr.value.includes(\"host.\")) {\n $cell.setAttribute(attr.name, host.exprEngine.precompile(attr.value));\n }\n });\n\n const innerAttrs = targetAttributes\n .filter(attr => $cell.hasAttribute(attr))\n .map(attr => `${attr}=\"${$cell.getAttribute(attr)}\"`);\n\n $cell.innerHTML = `<${tagName} ${innerAttrs.join(' ')}></${tagName}>`;\n $cell.setAttribute('tabindex', '0');\n });\n\n $tbl.querySelectorAll('thead th, thead td, tfoot th, tfoot td').forEach($cell => {\n const cellType = $cell.getAttribute('cell-type');\n if (cellType) {\n const originalContent = $cell.innerHTML;\n const tagName = `cell-${cellType}`;\n const innerAttrs = targetAttributes\n .filter(attr => $cell.hasAttribute(attr))\n .map(attr => `${attr}=\"${$cell.getAttribute(attr)}\"`);\n\n $cell.innerHTML = `<${tagName} ${innerAttrs.join(' ')} content=\"${originalContent}\"></${tagName}>`;\n }\n });\n }\n\n static #initFilterButtons(host, tbl) {\n const hostFilter = host.getAttribute('filtering') === 'true';\n const tableFilter = tbl.getAttribute('filtering') === 'true';\n\n tbl.querySelectorAll('thead tr:not(.col-indicator-rowgroup) th, thead tr:not(.col-indicator-rowgroup) td').forEach(cell => {\n const finalFiltering = cell.getAttribute('filtering') === 'true' || tableFilter || hostFilter;\n\n cell.setAttribute('filtering', finalFiltering ? 'true' : 'false');\n\n if (finalFiltering) {\n cell.appendChild(document.createElement('nine-table-filter-button'));\n }\n });\n }\n\n static #initColExpanders(tbl) {\n\n tbl.querySelectorAll('thead th, thead td').forEach(cell => {\n const isCollapsible = cell.getAttribute('collapsible') === 'true' || cell.getAttribute('expandable') === 'true';\n if (!isCollapsible) return;\n\n const colIndex = parseInt(cell.dataset.col, 10);\n const colSpan = cell.colSpan || 1;\n const col = tbl.querySelector(`colgroup col[data-col=\"${colIndex}\"]`);\n\n const currentWidth = col ? (parseInt(col.getAttribute('width'), 10) || 100) : 100;\n\n if (!cell.dataset.expandWidth || parseInt(cell.dataset.expandWidth, 10) <= COLLAPSED_WIDTH) {\n cell.dataset.expandWidth = String(currentWidth > COLLAPSED_WIDTH ? currentWidth : 100);\n }\n\n let expandBtn = cell.querySelector('nine-table-col-expand');\n if (!expandBtn) {\n expandBtn = document.createElement('nine-table-col-expand');\n cell.insertBefore(expandBtn, cell.firstChild);\n }\n\n const isCollapsed = cell.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n expandBtn.classList.add('collapsed');\n expandBtn.classList.remove('expand');\n expandBtn.setAttribute('collapsed', 'true');\n cell.style.color = 'transparent';\n\n const targetWidth = Math.max(10, Math.floor(COLLAPSED_WIDTH / colSpan));\n if (!isNaN(colIndex)) {\n for (let i = 0; i < colSpan; i++) {\n const targetCol = tbl.querySelector(`colgroup col[data-col=\"${colIndex + i}\"]`);\n if (targetCol) {\n targetCol.setAttribute('width', targetWidth);\n targetCol.style.width = `${targetWidth}px`;\n }\n }\n }\n } else {\n expandBtn.classList.remove('collapsed');\n expandBtn.classList.add('expand');\n expandBtn.setAttribute('collapsed', 'false');\n cell.style.color = '';\n }\n });\n }\n\n static #ensureRowIndicator(tbl, host) {\n\n const w = tbl.getAttribute(\"row-indicator\") === 'true' ? 48 : 0;\n\n const colgroup = tbl.querySelector('colgroup');\n\n\n const col = document.createElement('col');\n //col.className = 'row-indicator-col';\n col.setAttribute('fixed', 'left');\n col.setAttribute('width', w);\n col.style.width = `${w}px`;\n colgroup.prepend(col);\n\n\n tbl.querySelectorAll('thead, tbody, tfoot').forEach(section => {\n const rows = Array.from(section.querySelectorAll('tr'));\n if (rows.length === 0) return;\n\n const firstTr = rows[0];\n\n const indicatorCell = document.createElement('th');\n indicatorCell.className = 'row-indicator';\n indicatorCell.setAttribute('cell-type', 'row-indicator');\n\n if (rows.length > 1) {\n indicatorCell.rowSpan = rows.length;\n }\n\n firstTr.insertBefore(indicatorCell, firstTr.firstElementChild);\n });\n }\n\n static #applyInitialCellWidths(tbl) {\n\n tbl.querySelectorAll('th[data-col], td[data-col]').forEach(cell => {\n\n const startColIdx = parseInt(cell.getAttribute('data-col'), 10);\n if (isNaN(startColIdx)) return;\n\n\n const colSpan = parseInt(cell.getAttribute('colspan') || cell.colSpan, 10) || 1;\n let totalWidth = 0;\n\n\n for (let i = 0; i < colSpan; i++) {\n const targetIdx = startColIdx + i;\n const col = tbl.querySelector(`colgroup col[data-col=\"${targetIdx}\"]`);\n if (col) {\n totalWidth += parseInt(col.getAttribute('width'), 10) || 100;\n }\n }\n\n if (totalWidth > 0) {\n const widthVal = `${totalWidth}px`;\n cell.style.width = widthVal;\n cell.style.minWidth = widthVal;\n cell.style.maxWidth = widthVal;\n }\n });\n }\n}\n","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class SheetAPI {\n #sheet;\n #host;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#host = sheet.getRootNode().host;\n }\n\n /**\n currentRow = () => {\n let rows = this.currentRows();\n return (rows.length === 0) ? -1 : rows[0];\n }\n currentRows = () => {\n\n let rows = [];\n this.#shadowRoot.querySelectorAll('nine-table-sheet.active').forEach($sheet => {\n\n const arr = $sheet.view.getArray($sheet.selection.minRow);\n const rowid = arr.m._[NINE_TABLE.META.INDEX.ROWID];\n\n //trace.log(this.data.getArray($sheet.selection.minRow));\n\n rows.push(rowid);\n });\n\n return rows;\n } */\n\n\n row = {\n at: () => {\n return Math.floor(this.#sheet.selection.minRow / this.#sheet.template.length)\n },\n focus: (index) => {\n if (!this.#sheet.row.isVisible(index)) {\n this.#sheet.row.moveTo(index);\n }\n const $trs = this.#sheet.querySelectorAll(`tbody.body tr[data-index=\"${index}\"]`);\n const matrixRows = Array.from($trs, $tr => parseInt($tr.dataset.matrixRow, 10)).filter(n => !isNaN(n));\n\n // 2. col๋“ค๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐฐ์—ด๋กœ ์ˆ˜์ง‘ (colSpan ๊ณ ๋ ค)\n const cols = [];\n $trs.forEach($tr => {\n $tr.querySelectorAll('td, th').forEach($cell => {\n const col = parseInt($cell.dataset.col, 10);\n if (col != 0) cols.push(parseInt($cell.dataset.col, 10));\n });\n });\n\n return this.#sheet.selection.setRange(Math.min(...matrixRows), Math.min(...cols), Math.max(...matrixRows), Math.max(...cols));\n },\n isVisible: (index) => {\n\n const $sheetBody = this.#sheet.querySelector('.ng-sheet-body');\n\n const $trs = $sheetBody.querySelectorAll(`.ng-container-body tbody.body tr[data-index=\"${index}\"]`);\n if (!$trs || $trs.length === 0) return false;\n\n const viewportRect = $sheetBody.getBoundingClientRect();\n const theadHeight = $sheetBody.querySelector('thead')?.offsetHeight || 0;\n const tfootHeight = $sheetBody.querySelector('tfoot')?.offsetHeight || 0;\n\n const viewportTop = viewportRect.top + theadHeight;\n const viewportBottom = viewportRect.bottom - tfootHeight;\n\n let isVisible = true;\n\n for (const $tr of $trs) {\n const trRect = $tr.getBoundingClientRect();\n\n const isAbove = trRect.top < viewportTop;\n const isBelow = trRect.bottom > viewportBottom;\n\n if (isAbove || isBelow) {\n isVisible = false;\n break;\n }\n }\n\n return isVisible;\n },\n add: (dataSource, updateState) => {\n return this.#host.data.add(dataSource, updateState);\n },\n moveTo: (index, callback) => {\n if (this.#sheet.row.isVisible(index)) {\n\n } else {\n this.#sheet.scrollTo(index, callback);\n }\n },\n insert: (index, dataSource, updateState = true) => {\n\n const currentJson = this.#sheet.view.get(index);\n const rowid = currentJson.m._[NINE_TABLE.META.INDEX.ROWID];\n\n const toRowid = this.#host.data.insert(rowid, dataSource, updateState);\n const records = this.#sheet.view.getArray();\n\n const targetIndex = records.findIndex(record => {\n if (!record || !record.m || !record.m._) return false;\n return record.m._[NINE_TABLE.META.INDEX.ROWID] === toRowid; // ํƒ€์ž… ์ฐจ์ด ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด == ์‚ฌ์šฉ\n });\n\n return targetIndex;\n },\n remove: (index) => {\n\n const currentJson = this.#sheet.view.get(index);\n const rowid = currentJson.m._[NINE_TABLE.META.INDEX.ROWID];\n\n this.#host.data.remove(rowid);\n },\n };\n}","import { trace } from \"@nopeer\";\nimport './nine-table-hscrollbar.js';\nimport './nine-table-vscrollbar.js';\nimport { RowManager } from './core/RowManager.js';\nimport { TableCompiler } from \"./core/TableCompiler.js\";\nimport { CellSelection } from \"@/cell-manager/CellSelection.js\";\nimport { CellNavigation } from \"@/cell-manager/CellNavigation.js\";\n\nimport { ColResizer } from \"@/col/ColResizer.js\";\nimport { ColMover } from \"@/col/ColMover.js\";\nimport { ColFixManager } from \"@/col/ColFixManager.js\";\n\nimport { Filtering } from \"@/data/Filtering.js\";\nimport { GroupingManager } from \"@/data/Grouping.js\";\nimport { Sorting } from \"@/data/Sorting.js\";\nimport { SheetView } from \"@/data/SheetView.js\";\n\nimport { PreCompiler } from \"@/layout/core/PreCompiler.js\";\nimport { SheetAPI } from \"@/api/SheetAPI.js\";\n\nexport class NineTableSheet extends HTMLElement {\n #index;\n #host;\n #rowManager;\n #cellSelection;\n #cellNavigation;\n #colResizer;\n #colMover;\n #colFix;\n #sorting;\n #filtering;\n #grouping;\n #api;\n\n #view;\n\n #source = {\n table: null,\n };\n\n #elements;\n #trTemplateHeight;\n #template = {\n length: 0,\n height: 0,\n heights: [],\n };\n\n static SCROLLBAR_SIZE = 16;\n\n constructor() {\n super();\n\n this.#host = this.getRootNode().host;\n this.#rowManager = new RowManager(this);\n\n this.#api = new SheetAPI(this);\n\n this.#bindApiMethods();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n get template() { return this.#template; }\n get index() { return this.#index; }\n get colResizer() { return this.#colResizer; }\n get filtering() { return this.#filtering; }\n get grouping() { return this.#grouping; }\n get colMover() { return this.#colMover; }\n get colFix() { return this.#colFix; }\n get rowManager() { return this.#rowManager; }\n get selection() { return this.#cellSelection; }\n get navigation() { return this.#cellNavigation; }\n get templateLength() { return this.#source.tbody.tr.length || 0; }\n\n get elements() { return this.#elements; }\n\n /**\n get template() {\n return {\n length: this.#source?.tbody?.tr?.length || 0,\n trs: this.#source?.tbody?.tr || []\n };\n } */\n\n get isAutoFitCol() {\n const attrTrue = this.getAttribute('auto-fit-col') === 'true' || this.#host?.getAttribute('auto-fit-col') === 'true';\n const sourceTableTrue = this.#source.table?.getAttribute('auto-fit-col') === 'true';\n return attrTrue || sourceTableTrue;\n }\n\n get sourceTable() {\n return this.#source.table;\n }\n\n get source() {\n return this.#source;\n }\n\n get #isSimple() {\n return this.#host.hasAttribute('simple') || this.#host.getAttribute('theme') === 'simple';\n }\n\n scrollTo = (dataRow, callback) => {\n this.rowManager.scrollToDataRow(dataRow, 'top', callback);\n }\n\n recompileAndRefresh() {\n if (!this.#source.table) return;\n\n TableCompiler.recompile(this.#source.table);\n\n ['left', 'right', 'body'].forEach(type => {\n ['header', 'body', 'footer'].forEach(section => {\n const container = this.querySelector(`.ng-sheet-${section} .ng-container-${type}`);\n if (!container) return;\n container.querySelectorAll('table').forEach(tbl => tbl.remove());\n });\n });\n\n this.#renderSplitContainers();\n\n this.#updateContainerWidths();\n\n this.#rowManager.initialize();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n requestAnimationFrame(() => {\n this.#updateContainerWidths();\n this.#rowManager?.refresh();\n });\n }\n\n refreshLayout() {\n\n requestAnimationFrame(() => {\n\n if (!this.classList.contains('active') || !this.#source.table) return;\n\n this.#updateContainerWidths();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n this.#adjustOverlay();\n\n this.#colResizer?.refreshLayout();\n\n this.#rowManager?.refresh();\n });\n }\n\n #adjustOverlay = () => {\n const $thead = this.querySelector('.ng-container-body thead');\n const $overlay = this.querySelector('.nodata-overlay');\n $overlay.style.top = `${$thead?.offsetHeight}px`;\n }\n\n get view() {\n if (!this.#view && this.#host?.data) {\n this.#view = new SheetView(this);\n }\n return this.#view;\n }\n\n invalidate = () => {\n\n this.view.refresh();\n\n this.#rowManager.refresh(true);\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n }\n };\n\n autoFit = (enable = true) => {\n requestAnimationFrame(() => {\n this.#autoFit?.(enable);\n });\n };\n\n #autoFit = (enable = true) => {\n\n const container = this.querySelector('.ng-sheet-body .ng-container-body');\n if (!container) return;\n\n const firstColgroup = this.querySelector('.ng-container-body table colgroup');\n if (!firstColgroup) return;\n\n if (enable) {\n this.setAttribute('auto-fit-col', 'true');\n const containerWidth = container.clientWidth;\n if (containerWidth <= 0) return;\n\n let totalOriginalWidth = 0;\n const colList = [];\n\n firstColgroup.querySelectorAll('col').forEach(col => {\n const globalColIndex = col.getAttribute('data-col');\n const headerCell = this.querySelector(`thead th[data-col=\"${globalColIndex}\"]`);\n const isCollapsed = headerCell?.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n colList.unshift({ globalColIndex, width: 16, isCollapsed: true });\n } else {\n const w = parseInt(col.getAttribute('width'), 10) || 100;\n colList.push({ globalColIndex, width: w, isCollapsed: false });\n totalOriginalWidth += w;\n }\n });\n\n const collapsedTotalWidth = colList\n .filter(c => c.isCollapsed)\n .reduce((sum, c) => sum + c.width, 0);\n\n const availableWidth = Math.max(0, containerWidth - collapsedTotalWidth);\n\n if (totalOriginalWidth > 0 && colList.length > 0) {\n let allocatedTotal = 0;\n\n const calculatedCols = colList.map(item => {\n if (item.isCollapsed) {\n return { globalColIndex: item.globalColIndex, remainder: 0, width: 16 };\n }\n\n const exactWidth = (item.width * availableWidth) / totalOriginalWidth;\n const baseWidth = Math.max(30, Math.floor(exactWidth));\n allocatedTotal += baseWidth;\n return {\n globalColIndex: item.globalColIndex,\n remainder: exactWidth - Math.floor(exactWidth),\n width: baseWidth\n };\n });\n\n let remainderPixels = availableWidth - allocatedTotal;\n\n const uncollapsedCols = calculatedCols.filter(c => !colList.find(item => item.globalColIndex === c.globalColIndex)?.isCollapsed);\n\n if (remainderPixels > 0 && uncollapsedCols.length > 0) {\n uncollapsedCols.sort((a, b) => b.remainder - a.remainder);\n for (let i = 0; i < remainderPixels; i++) {\n uncollapsedCols[i % uncollapsedCols.length].width += 1;\n }\n } else if (remainderPixels < 0 && uncollapsedCols.length > 0) {\n uncollapsedCols.sort((a, b) => a.remainder - b.remainder);\n for (let i = 0; i < Math.abs(remainderPixels); i++) {\n const target = uncollapsedCols[i % uncollapsedCols.length];\n if (target.width > 30) target.width -= 1;\n }\n }\n\n calculatedCols.forEach(({ globalColIndex, width }) => {\n this.#colResizer?.setColumnWidth(globalColIndex, width, 'body');\n });\n }\n } else {\n this.removeAttribute('auto-fit-col');\n }\n\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n generateTemplate = ($table, index) => {\n\n this.#index = index;\n\n this.#source = {\n table: TableCompiler.compile($table),\n tbody: {\n tr: $table.querySelectorAll(\"tbody tr\"),\n }\n };\n\n this.querySelector(`.ng-container-body`).appendChild(this.#source.table);\n\n this.#template.height = this.#template.length = 0;\n this.#template.heights = [];\n this.querySelectorAll(`.ng-container-body tbody.body tr`).forEach(($tr) => {\n this.#template.height += $tr.offsetHeight || 0;\n this.#template.heights.push($tr.offsetHeight || 0);\n });\n this.#template.length = this.#template.heights.length;\n\n if (this.#index === 0) {\n const minRows = parseInt(this.#host.getAttribute('display-min-rows'), 10);\n const maxRows = parseInt(this.#host.getAttribute('display-max-rows'), 10);\n\n const h = (this.querySelector(\"nine-table-toolbar\")?.offsetHeight || 0) +\n (this.querySelector(\"nine-table-footer\")?.offsetHeight || 0) +\n (this.querySelector(\"thead\")?.offsetHeight || 0) +\n (this.querySelector(\"tfoot\")?.offsetHeight || 0) +\n (this.querySelector(\"tbody.head\")?.offsetHeight || 0);\n\n if (this.#host.getAttribute('auto-height') === \"true\" || !isNaN(minRows) || !isNaN(maxRows)) {\n this.#host.setAttribute('scroll-bar', \"none\");\n }\n\n if (!isNaN(minRows)) {\n this.#host.style.minHeight = h + (this.#template.height * minRows) + \"px\";\n }\n\n if (!isNaN(maxRows)) {\n this.#host.style.maxHeight = h + (this.#template.height * maxRows) + \"px\";\n }\n }\n\n this.querySelectorAll((\"tbody.body tr\")).forEach(($tr) => {\n $tr.style.display = \"none\";\n })\n\n this.querySelector(`.ng-container-body table`).remove();\n };\n\n generate = () => {\n\n this.#renderSplitContainers();\n\n this.#updateContainerWidths();\n\n this.#syncHeaderAndFooterHeights();\n\n this.#initRowHoverEvent();\n\n ['left', 'body', 'right'].forEach(type => {\n const prefix = `.ng-container-${type}`;\n this.#elements[type] = {\n thead: this.querySelector(`${prefix} thead`),\n tbody: {\n head: this.querySelector(`${prefix} tbody.head`),\n body: this.querySelector(`${prefix} tbody.body`),\n foot: this.querySelector(`${prefix} tbody.foot`),\n },\n tfoot: this.querySelector(`${prefix} tfoot`),\n };\n });\n\n this.#rowManager.initialize();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar').refresh();\n }\n\n this.#grouping.initialize();\n\n this.loaded = true;\n };\n\n\n #updateContainerWidths = () => {\n\n ['left', 'right', 'body'].forEach(type => {\n const containers = this.querySelectorAll(`.ng-container-${type}`);\n if (containers.length === 0) return;\n\n const firstTable = containers[0].querySelector('table');\n if (!firstTable) return;\n\n let width = 0;\n firstTable.querySelectorAll('col').forEach(col => {\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) width += w;\n });\n\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n if (type === 'body') {\n container.style.flex = `1`;\n } else {\n container.style.flex = `0 0 ${width}px`;\n container.style.width = `${width}px`;\n container.style.minWidth = `${width}px`;\n container.style.maxWidth = `${width}px`;\n }\n });\n });\n };\n\n #renderSplitContainers = () => {\n const colTypes = [\n { selector: '.ng-container-left', type: 'left' },\n { selector: '.ng-container-body', type: null },\n { selector: '.ng-container-right', type: 'right' }\n ];\n\n colTypes.forEach(({ selector, type }) => {\n this.querySelector(`.ng-sheet-body ${selector}`).appendChild(this.#createSplitTable(type));\n });\n };\n\n #createSplitTable = (targetFixedType) => {\n\n const $tbl = this.#source.table.cloneNode(true);\n\n if (targetFixedType === 'left') {\n $tbl.querySelectorAll(\"col, th, td\").forEach($el => {\n if ($el.getAttribute(\"fixed\") !== \"left\") $el.remove();\n });\n } else if (targetFixedType === 'right') {\n $tbl.querySelectorAll(\"col, th, td\").forEach($el => {\n if ($el.getAttribute(\"fixed\") !== \"right\") $el.remove();\n });\n } else {\n $tbl.querySelectorAll(\"[fixed=left], [fixed=right]\").forEach($el => {\n $el.remove();\n });\n }\n\n return $tbl;\n };\n\n getRowHeight = () => {\n return this.#rowManager.getRowHeight();\n };\n\n getViewHeight = () => {\n\n const viewHeight = this.#elements.content.offsetHeight || 0;\n\n const fixedHeight = (this.#elements.body.thead?.offsetHeight || 0) +\n (this.#elements.body.tfoot?.offsetHeight || 0) +\n (this.#elements.body.tbody.head.offsetHeight || 0);\n\n return viewHeight - fixedHeight;\n };\n\n isLastRow = () => {\n\n const sheet = this.querySelector('.ng-sheet-body');\n const tbody = this.querySelector(\".ng-container-body tbody.body\");\n\n const offsetHeight = (this.#elements.body.tfoot?.offsetHeight || 0);\n\n const sheetBottom = sheet.getBoundingClientRect().bottom;\n const tbodyBottom = tbody.getBoundingClientRect().bottom;\n\n return (sheetBottom - offsetHeight) >= tbodyBottom;\n };\n\n scrollToX = (scrollLeft) => {\n const bodyContainer = this.querySelector('.ng-sheet-body .ng-container-body');\n if (bodyContainer) bodyContainer.scrollLeft = scrollLeft;\n };\n\n scrollToY = (scrollTop) => {\n const bodyViewport = this.querySelector('.ng-sheet-body');\n if (bodyViewport) bodyViewport.scrollTop = scrollTop;\n };\n\n #init = () => {\n\n this.#render();\n\n this.#cellSelection = new CellSelection(this);\n this.#cellNavigation = new CellNavigation(this);\n this.#colResizer = new ColResizer(this);\n this.#colMover = new ColMover(this);\n this.#colFix = new ColFixManager(this);\n\n this.#view = new SheetView(this);\n this.#filtering = new Filtering(this);\n this.#grouping = new GroupingManager(this);\n\n if (!this.#isSimple) {\n this.#sorting = new Sorting(this);\n }\n\n this.#elements.mainBody.addEventListener('scroll', () => {\n this.querySelector(\"nine-table-hscrollbar\").refresh();\n });\n };\n\n\n\n #render = () => {\n\n this.innerHTML = `\n <div class=\"ng-sheet-body\">\n <div class=\"ng-sheet-body-content\">\n <div class=\"ng-container-left\"></div>\n <div class=\"ng-container-body\">\n \n </div>\n <div class=\"ng-container-right\"></div>\n </div>\n <div class=\"ng-virtual-height-holder\"></div>\n </div>\n\n <div class=\"nodata-overlay\">Data Not Found</div>\n\n <nine-table-vscrollbar></nine-table-vscrollbar>\n <nine-table-hscrollbar></nine-table-hscrollbar>\n <div class=\"scroll-edge\"></div>\n \n <nine-table-col-resizer-panel></nine-table-col-resizer-panel>\n \n <div class=\"ng-col-mover-grip\"></div>\n <div class=\"ng-col-mover-indi\"></div>\n `;\n\n this.#elements = {\n mainBody: this.querySelector('.ng-sheet-body .ng-container-body'),\n hscrollbar: this.querySelector('nine-table-hscrollbar'),\n vscrollbar: this.querySelector('nine-table-vscrollbar'),\n content: this.querySelector('.ng-sheet-body .ng-sheet-body-content'),\n scrollHolder: this.querySelector('.ng-sheet-body .ng-virtual-height-holder'),\n }\n };\n\n #syncHeaderAndFooterHeights = () => {\n\n const leftTable = this.querySelector('.ng-container-left table');\n const bodyTable = this.querySelector('.ng-container-body table');\n const rightTable = this.querySelector('.ng-container-right table');\n\n const leftHeaderRows = Array.from(leftTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n const bodyHeaderRows = Array.from(bodyTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n const rightHeaderRows = Array.from(rightTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n\n this.#applyMaxHeights(leftHeaderRows, bodyHeaderRows, rightHeaderRows);\n\n const leftFooterRows = Array.from(leftTable.querySelectorAll('tfoot tr'));\n const bodyFooterRows = Array.from(bodyTable.querySelectorAll('tfoot tr'));\n const rightFooterRows = Array.from(rightTable.querySelectorAll('tfoot tr'));\n\n this.#applyMaxHeights(leftFooterRows, bodyFooterRows, rightFooterRows);\n };\n\n #applyMaxHeights = (leftRows, bodyRows, rightRows) => {\n\n setTimeout(() => {\n const maxRows = Math.max(leftRows.length, bodyRows.length, rightRows.length);\n\n for (let i = 0; i < maxRows; i++) {\n\n const heights = [\n leftRows[i]?.getBoundingClientRect().height || 0,\n bodyRows[i]?.getBoundingClientRect().height || 0,\n rightRows[i]?.getBoundingClientRect().height || 0\n ];\n const maxHeight = Math.max(...heights);\n\n if (maxHeight > 0) {\n if (leftRows[i]) leftRows[i].style.height = `${maxHeight}px`;\n if (bodyRows[i]) bodyRows[i].style.height = `${maxHeight}px`;\n if (rightRows[i]) rightRows[i].style.height = `${maxHeight}px`;\n }\n }\n });\n };\n\n #initRowHoverEvent = () => {\n const bodyViewport = this.querySelector('.ng-sheet-body');\n if (!bodyViewport) return;\n\n let activeRowIndex = null;\n\n bodyViewport.addEventListener('mouseover', (e) => {\n const tr = e.target.closest('tr');\n if (!tr || !tr.dataset.row && tr.dataset.row !== '0') return;\n\n const rowIndex = tr.dataset.row;\n if (activeRowIndex === rowIndex) return;\n activeRowIndex = rowIndex;\n\n bodyViewport.querySelectorAll(`tr[data-row=\"${rowIndex}\"]`).forEach($tr => {\n $tr.classList.add('hover');\n });\n });\n\n bodyViewport.addEventListener('mouseout', (e) => {\n const tr = e.target.closest('tr');\n if (!tr) return;\n\n const relatedTarget = e.relatedTarget;\n if (tr.contains(relatedTarget)) return;\n\n bodyViewport.querySelectorAll('tr.hover').forEach($tr => {\n $tr.classList.remove('hover');\n });\n activeRowIndex = null;\n });\n }\n\n #bindApiMethods = () => {\n //const apis = [this.#sheetAPI, this.#dataAPI];\n const apis = [this.#api];\n\n apis.forEach(api => {\n // api ์ธ์Šคํ„ด์Šค(this)์— ์ง์ ‘ ์„ ์–ธ๋œ ์†์„ฑ๋“ค๊ณผ ํ”„๋กœํ† ํƒ€์ž… ์†์„ฑ์„ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ด\n // Reflect.ownKeys๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹ฌ๋ณผ์ด๋‚˜ ์ˆจ๊ฒจ์ง„ ํ”„๋กœํผํ‹ฐ๊นŒ์ง€ ์•ˆ์ „ํ•˜๊ฒŒ ํƒ์ƒ‰ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.\n const keys = new Set([\n ...Reflect.ownKeys(api),\n ...Reflect.ownKeys(Object.getPrototypeOf(api))\n ]);\n\n keys.forEach(key => {\n // constructor๋‚˜ ๋‚ด๋ถ€ ํ”„๋ผ์ด๋น— ๋ฉค๋ฒ„(#)๋Š” ์ œ์™ธ\n if (key === 'constructor' || String(key).startsWith('#')) return;\n\n const target = api[key];\n\n if (typeof target === 'function') {\n if (!this[key]) {\n //trace.log(`[Binding Function] ${key}`);\n this[key] = (...args) => target.apply(api, args);\n }\n } else if (target !== null && typeof target === 'object') {\n\n if (!this[key]) {\n //trace.log(`[Binding Object Namespace] ${key}`);\n this[key] = target; // ๊ฐ์ฒด ๋„ค์ž„์ŠคํŽ˜์ด์Šค(์˜ˆ: row) ํ†ต์งธ๋กœ ์—ฐ๊ฒฐ\n }\n }\n });\n });\n }\n\n disconnectedCallback() {\n this.#colResizer?.destroy();\n this.#colMover?.destroy();\n this.innerHTML = '';\n }\n}\n\nif (!customElements.get('nine-table-sheet')) {\n customElements.define('nine-table-sheet', NineTableSheet);\n}","import { trace } from \"@nopeer\";\nimport '@/layout/nine-table-sheets.js';\nimport '@/layout/nine-table-sheets-footer.js';\nimport '@/layout/nine-table-toolbar.js';\nimport { NineTableSheet } from \"@/layout/nine-table-sheet.js\";\nimport {PreCompiler} from \"@/layout/core/PreCompiler.js\";\nimport {NINE_TABLE} from \"@\";\n\nexport class LayoutManager {\n #host;\n\n constructor(owner) {\n this.#host = owner;\n this.#init();\n }\n\n #init = () => {\n this.#render();\n this.#initEvent();\n }\n\n set loading(val) {\n if (!!val) {\n this.#host.classList.add(\"loading\");\n } else {\n this.#host.classList.remove(\"loading\");\n }\n }\n\n\n\n #render = () => {\n\n const rawElements = Array.from(this.#host.children);\n const rawTables = rawElements.filter(el => (el.tagName.toUpperCase() === 'TABLE') );\n const sheetCount = rawTables.length;\n\n const sheetsHtml = rawTables.map((tbl, idx) => {\n const className = idx === 0 ? 'active' : '';\n const sheetId = tbl.id || `sheet${idx + 1}`;\n\n const sheetTag = `<nine-table-sheet class=\"${className}\" data-index=\"${idx}\" data-sheet-id=\"${sheetId}\" id=\"${sheetId}\"></nine-table-sheet>`;\n const splitterTag = idx < sheetCount - 1 ? `<nine-splitter class=\"h\" data-split-index=\"${idx}\"></nine-splitter>` : '';\n return sheetTag + splitterTag;\n }).join('');\n\n const cssImports = [\n `@import \"https://cdn.jsdelivr.net/npm/@ninebone/datagrid@${__APP_VERSION__}/dist/css/nine-table.css\";`,\n ];\n\n if (nine[\"nine-table\"] && nine[\"nine-table\"].cssFile) {\n cssImports.push(`@import \"${nine[\"nine-table\"].cssFile}\";`);\n }\n\n this.#host.shadowRoot.innerHTML = `\n <style>\n ${cssImports.join('\\n')}\n ${this.#host.provider.style.value}\n </style>\n \n <nine-table-toolbar></nine-table-toolbar>\n\n <nine-table-body>\n <nine-table-summary></nine-table-summary>\n <div class=\"ng-loading-bar\"></div>\n <nine-table-sheets>\n <nine-table-sheets-body>\n ${sheetsHtml}\n </nine-table-sheets-body>\n <nine-table-sheets-footer></nine-table-sheets-footer>\n </nine-table-sheets>\n <nine-table-analysis></nine-table-analysis>\n </nine-table-body>\n <nine-table-footer></nine-table-footer>\n `;\n\n rawTables.forEach($el => {\n PreCompiler.initializeTable(this.#host, $el);\n })\n\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet, idx) => {\n $sheet.classList.add('active');\n $sheet.generateTemplate(rawTables[idx], idx);\n });\n\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet) => {\n\n setTimeout(() => {\n $sheet.generate();\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n });\n\n setTimeout(() => {\n this.#host.data.clear();\n });\n };\n\n #initEvent = () => {\n\n this.#host.addEventListener(NINE_TABLE.EVENT.ROW_ADDED, () => {\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n\n this.#host.addEventListener(NINE_TABLE.EVENT.ROW_REMOVED, () => {\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n\n let lastHeight = 0; // ์ง์ „ ๋†’์ด๋ฅผ ๊ธฐ์–ตํ•  ๋ณ€์ˆ˜\n\n new ResizeObserver((entries) => {\n for (let entry of entries) {\n if (entry.target.tagName === \"NINE-TABLE\") {\n const currentHeight = entry.contentRect.height;\n\n if (currentHeight !== lastHeight) {\n lastHeight = currentHeight;\n if (this.#isAutoHeight) {\n this.#applyAutoHeight();\n }\n }\n }\n }\n }).observe(this.#host);\n };\n\n #applyAutoHeight = () => {\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet) => {\n if ($sheet.index === 0) {\n trace.log($sheet, $sheet.template.height, $sheet.view.count());\n\n const fixedHeight = ($sheet.querySelector(\"thead\")?.offsetHeight || 0) +\n ($sheet.querySelector(\"tfoot\")?.offsetHeight || 0) +\n ($sheet.querySelector(\"tbody.head\")?.offsetHeight || 0);\n const basicHeight = this.#host.offsetHeight - $sheet.offsetHeight + fixedHeight;\n\n const h = Math.min($sheet.template.height * $sheet.view.count(), window.innerHeight * 0.8);\n\n this.#host.style.height = basicHeight + (h) + \"px\";\n }\n });\n };\n\n get #isAutoHeight() {\n return this.#host.getAttribute('auto-height') === 'true';\n }\n}","import { trace } from \"@nopeer\";\n\nexport class ExprEngine {\n #host;\n #fields;\n #exprCache = new Map(); // ๐Ÿ’ก ํ†ตํ•ฉ๋œ ๋‹จ์ผ ์บ์‹œ๋กœ ๋ชจ๋“  ์ปดํŒŒ์ผ๋œ ํ•จ์ˆ˜ ๊ด€๋ฆฌ\n\n constructor(host) {\n this.#host = host;\n this.#fields = host.fields.get();\n }\n\n rewriteExpr(expr) {\n\n if (!expr || !this.#fields.length) return expr;\n\n return expr.replace(/data\\.([a-zA-Z_$][\\w$]*)/g, (match, fieldName) => {\n const idx = this.#fields.indexOf(fieldName);\n return idx >= 0 ? `rowItem.v[${idx}]` : match;\n });\n }\n\n precompile(expr) {\n if (!expr) return expr;\n return this.rewriteExpr(expr);\n }\n\n evaluate(expr, rowItem, row = 0) {\n\n if (expr === undefined || expr === null) return \"\";\n\n try {\n const trimmedExpr = String(expr).trim();\n const compiledExpr = this.rewriteExpr(trimmedExpr);\n\n if (compiledExpr.includes(\"provider.\") || compiledExpr.includes(\"host.\") || compiledExpr.includes(\"data.\") || compiledExpr.includes(\"rowItem.v\") || compiledExpr.includes(\"(\")) {\n\n let evalFn = this.#exprCache.get(compiledExpr);\n\n if (!evalFn) {\n evalFn = new Function('rowItem', 'row', 'host', `\n const data = rowItem;\n const provider = host;\n\n if (!data && !host) return \"\";\n return ${compiledExpr};\n `);\n\n this.#exprCache.set(compiledExpr, evalFn);\n }\n\n return evalFn(rowItem, row, this.#host);\n }\n\n return compiledExpr;\n } catch (e) {\n /**\n if (expr.includes(\"getCommonCode\")) {\n console.trace(\"ExprEngine evaluation error:\", e);\n } */\n return expr;\n }\n }\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class DataAPI {\n\n #host;\n\n constructor(host) {\n this.#host = host;\n }\n\n provider = {\n // ์Šคํƒ€์ผ ๋ฐ์ดํ„ฐ๋ฅผ provider ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ ์ง์ ‘ ๊ด€๋ฆฌ (์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ ์ถ•์•ฝํ˜• ์‚ฌ์šฉ)\n style: {\n value: '',\n },\n add: (providerObj) => {\n if (!providerObj || typeof providerObj !== 'object') return;\n\n const { style, ...methods } = providerObj;\n\n if (style && typeof style === 'string') {\n this.provider.style.value = style;\n }\n\n if (Object.keys(methods).length > 0) {\n setTimeout(() => {\n Object.entries(methods).forEach(([name, fn]) => {\n if (typeof fn === 'function') {\n this.#host[name] = fn;\n }\n });\n\n this.#host.rerenderer();\n });\n }\n },\n }\n\n}","export class NineTableAPI {\n #host;\n\n constructor(host) {\n this.#host = host;\n\n // ๊ด€๋ฆฌํ•  ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋“ค์„ ๋ฐฐ์—ด๋กœ ์ •์˜\n const namespaces = [\"row\"]; // ๋‚˜์ค‘์— \"col\", \"cell\" ๋“ฑ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋!\n\n namespaces.forEach(ns => {\n this[ns] = new Proxy({}, {\n get: (target, prop) => {\n const $sheet = this.#getActiveSheet();\n if (!$sheet || !$sheet[ns]) return undefined;\n\n const targetMethod = $sheet[ns][prop];\n\n if (typeof targetMethod === 'function') {\n return (...args) => targetMethod.apply($sheet[ns], args);\n }\n return targetMethod;\n }\n });\n });\n }\n\n getActiveSheets() {\n return this.#host.shadow.querySelectorAll('nine-table-sheet.active');\n }\n\n #getActiveSheet() {\n const arr = this.getActiveSheets();\n return arr.length > 0 ? arr[0] : null;\n }\n}","import { trace } from \"@nopeer\";\nimport { ngDataManager } from '@/data/ngDataManager.js';\nimport { fields } from \"@/data/Fields.js\";\nimport { LayoutManager } from '@/layout/core/LayoutManager.js';\nimport { ExprEngine } from \"@/core/ExprEngine.js\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { DataAPI } from '../api/DataAPI.js';\nimport { NineTableAPI } from '../api/NineTableAPI.js';\n\nexport default class NineTable extends HTMLElement {\n #shadowRoot;\n #dataManager;\n #layoutManager;\n #dataApi;\n #sheetApi;\n #templateCnt = 0;\n\n constructor() {\n super();\n\n if ([\"NINE-TABLE\"].includes(this.tagName)) {\n trace.log(\"Welcome nine-table\", __APP_VERSION__);\n }\n\n this.#shadowRoot = this.attachShadow({ mode: 'open' });\n this.#dataManager = new ngDataManager(this);\n\n this.#dataApi = new DataAPI(this);\n this.#sheetApi = new NineTableAPI(this);\n\n this.#bindApiMethods();\n }\n\n connectedCallback() {\n setTimeout(() => {\n this.#templateCnt = this.querySelectorAll(\"table\")?.length;\n\n this.fields = new fields(this);\n this.exprEngine = new ExprEngine(this);\n\n this.#bindDynamicSetters();\n\n this.#layoutManager = new LayoutManager(this);\n\n this.#dispatchLoad();\n });\n }\n\n disconnectedCallback() {\n //trace.log('NineTable disconnected.');\n }\n\n #dispatchLoad = () => {\n\n let checkCount = 0;\n const maxChecks = 50; // ์ตœ๋Œ€ 5์ดˆ ๋Œ€๊ธฐ (100ms * 50)\n\n const checkTimer = setInterval(() => {\n checkCount++;\n\n const sheets = this.shadow.querySelectorAll('nine-table-sheet');\n\n if (checkCount >= maxChecks) {\n clearInterval(checkTimer);\n }\n\n if (sheets.length >= this.#templateCnt) {\n let loadSheetCnt = 0;\n sheets.forEach($sheet => {\n if ($sheet.loaded) loadSheetCnt++;\n });\n\n if (loadSheetCnt >= this.#templateCnt) {\n clearInterval(checkTimer);\n this.loaded = true;\n this.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.LOAD, { bubbles: true, detail: { target: this } }));\n }\n }\n }, 100);\n }\n\n // ๐ŸŽฏ ๊ณตํ†ต ๋ฐ์ดํ„ฐ & API ์ ‘๊ทผ์ž\n get shadow() { return this.#shadowRoot; }\n get dataManager() { return this.#dataManager; }\n get data() { return this.#dataManager.data; }\n //get row() { return this.#dataManager.row; }\n\n\n\n\n\n setData(records) {\n this.#dataManager.data.set(records);\n this.refresh();\n }\n\n refresh() {\n this.activeSheet?.invalidate();\n }\n\n\n set loading(val) {\n if (this.#layoutManager) this.#layoutManager.loading = val;\n }\n\n rerenderer() {\n\n this.activeSheet?.querySelectorAll(\"tbody.body th,tbody.body td\").forEach(($cell) => {\n const customComp = Array.from($cell.children).find($el => {\n return $el.tagName.toLowerCase().startsWith('cell-') && typeof $el.rerenderer === 'function'\n });\n\n customComp?.rerenderer();\n })\n }\n\n sheet = (idOrIndex) => {\n if (idOrIndex === null || idOrIndex < 0) return this.activeSheet;\n const sheets = Array.from(this.shadow.querySelectorAll('nine-table-sheet'));\n\n if (typeof idOrIndex === 'number') return sheets[idOrIndex] || null;\n if (typeof idOrIndex === 'string') {\n return this.shadow.querySelector(`nine-table-sheet#${idOrIndex}, nine-table-sheet[data-sheet-id=\"${idOrIndex}\"]`) || null;\n }\n return sheets[0] || null;\n }\n\n get sheets() {\n return Array.from(this.shadow.querySelectorAll('nine-table-sheet'));\n }\n\n get activeSheet() {\n return this.shadow.querySelector('nine-table-sheet.active') || null;\n }\n\n #bindDynamicSetters() {\n const extractedMethodNames = new Set();\n\n this.querySelectorAll('[data-source]').forEach(el => {\n const dataSource = el.getAttribute('data-source');\n if (!dataSource) return;\n\n const matches = dataSource.matchAll(/(?:host\\.)?([a-zA-Z0-9_$]+)\\s*\\(/g);\n for (const match of matches) {\n const name = match[1];\n if (name && name !== 'host') {\n extractedMethodNames.add(name);\n }\n }\n });\n\n extractedMethodNames.forEach(methodName => {\n let internalValue = null;\n\n Object.defineProperty(this, methodName, {\n set: (newValue) => {\n internalValue = newValue;\n\n this.rerenderer();\n },\n get: () => internalValue,\n configurable: true,\n enumerable: true\n });\n });\n }\n\n execute = (fn) => {\n setTimeout(() => {\n this.loading = true;\n setTimeout(() => {\n try {\n fn.call(this);\n } finally {\n this.loading = false;\n }\n });\n });\n }\n\n #bindApiMethods() {\n\n const apis = [this.#dataApi, this.#sheetApi];\n\n apis.forEach(api => {\n // api ์ธ์Šคํ„ด์Šค(this)์— ์ง์ ‘ ์„ ์–ธ๋œ ์†์„ฑ๋“ค๊ณผ ํ”„๋กœํ† ํƒ€์ž… ์†์„ฑ์„ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ด\n // Reflect.ownKeys๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹ฌ๋ณผ์ด๋‚˜ ์ˆจ๊ฒจ์ง„ ํ”„๋กœํผํ‹ฐ๊นŒ์ง€ ์•ˆ์ „ํ•˜๊ฒŒ ํƒ์ƒ‰ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.\n const keys = new Set([\n ...Reflect.ownKeys(api),\n ...Reflect.ownKeys(Object.getPrototypeOf(api))\n ]);\n\n keys.forEach(key => {\n // constructor๋‚˜ ๋‚ด๋ถ€ ํ”„๋ผ์ด๋น— ๋ฉค๋ฒ„(#)๋Š” ์ œ์™ธ\n if (key === 'constructor' || String(key).startsWith('#')) return;\n\n const target = api[key];\n\n if (typeof target === 'function') {\n if (!this[key]) {\n //trace.log(`[Binding Function] ${key}`);\n this[key] = (...args) => target.apply(api, args);\n }\n } else if (target !== null && typeof target === 'object') {\n if (!this[key]) {\n //trace.log(`[Binding Object Namespace] ${key}`, target);\n this[key] = target; // ๊ฐ์ฒด ๋„ค์ž„์ŠคํŽ˜์ด์Šค(์˜ˆ: row) ํ†ต์งธ๋กœ ์—ฐ๊ฒฐ\n }\n }\n });\n });\n }\n}\n\nif (!customElements.get('nine-table')) {\n customElements.define('nine-table', NineTable);\n}\n\nif (!customElements.get('nine-table-simple')) {\n customElements.define('nine-table-simple', class extends NineTable {\n connectedCallback() {\n this.setAttribute('theme', 'simple');\n\n super.connectedCallback();\n }\n });\n}","export class BasicCellElement extends HTMLElement {\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tapplyBaseStyle() {\n\t}\n\n\tconnectedCallback() {\n\t}\n}","import { trace } from \"@nopeer\";\nimport { BasicCellElement } from './BasicCellElement.js';\n\nconst exprCache = new Map();\n\nexport class CellElement extends BasicCellElement {\n\t#host;\n\t#sheet;\n\t#tr;\n\t#cell;\n\t#attr;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget host() { return this.#host; }\n\tget sheet() { return this.#sheet; }\n\tget cell() { return this.#cell; }\n\tget tr() { return this.#tr; }\n\tget attr() { return this.#attr; }\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#host = this.getRootNode().host;\n\n\t\tthis.#cell = this.closest(\"th,td\");\n\t\tthis.#tr = this.#cell.closest(\"tr\");\n\t\tthis.#sheet = this.#tr.closest(\"nine-table-sheet\");\n\n\t\tthis.#cell.classList.add(this.tagName);\n\n\t\tthis.#attr = {};\n\t\tfor (let i = 0; i < this.#cell.attributes.length; i++) {\n\t\t\tconst name = this.#cell.attributes[i].name;\n\t\t\tif (![\"text-align\",\"class\",\"cell-type\",\"data-bind\",\"data-expr\",\"data-col\",\"tabindex\"].includes(name)) {\n\t\t\t\tthis.#attr[name] = this.#cell.attributes[i].value;\n\t\t\t\t//this.setAttribute(name, this.#cell.attributes[i].value);\n\t\t\t}\n\t\t}\n\n\t\tif (!this.#cell) return;\n\n\n\t\tconst root = this.shadowRoot || this;\n\n\t\t// ๐ŸŽฏ ๋ฒ„ํŠผ ์ด๋ฒคํŠธ ์—ฐ๊ฒฐ\n\t\troot.querySelectorAll(\"button, ng-expand-button\").forEach(button => {\n\t\t\tbutton.addEventListener(\"click\", () => {\n\t\t\t\tlet fn = this.getAttribute(\"onbuttonclick\") || this.getAttribute(\"onButtonClick\") || this.#cell?.getAttribute(\"onbuttonclick\") || this.#cell?.getAttribute(\"onButtonClick\");\n\n\t\t\t\tconst rowData = this.data; // Proxy Lazy ์ ‘๊ทผ\n\t\t\t\tconst curRow = parseInt(this.#cell.dataset.row, 10);\n\n\t\t\t\tif (fn && this.#host) {\n\t\t\t\t\tfn = fn.replace(\"()\", \"\");\n\t\t\t\t\tconst match = fn.match(/^(\\w+)\\s*\\(/);\n\t\t\t\t\tconst methodName = match?.[1] || fn;\n\n\t\t\t\t\tif (typeof this.#host[methodName] === 'function') {\n\t\t\t\t\t\tthis.#host[methodName].call(this.#host, rowData, curRow, this.#cell);\n\t\t\t\t\t} else if (typeof this.#host.exprFunction === 'function') {\n\t\t\t\t\t\tthis.#host.exprFunction(fn).call(this, rowData, curRow);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t/**\n\t\t\t\tthis.#host?.dispatchEvent(new CustomEvent(ninegrid.EVENT.BUTTON_CLICK, {\n\t\t\t\t\tdetail: { target: this.#cell, data: rowData, currow: curRow },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true\n\t\t\t\t})); */\n\t\t\t});\n\t\t});\n\n\t\t// ๐ŸŽฏ ๋งํฌ ์ด๋ฒคํŠธ ์—ฐ๊ฒฐ\n\t\tconst renderer = root.querySelector(\".renderer\");\n\t\tif (renderer && this.getAttribute(\"link\") === \"true\") {\n\t\t\trenderer.classList.add(\"link\");\n\n\t\t\trenderer.addEventListener(\"click\", () => {\n\t\t\t\tlet fn = this.getAttribute(\"onlinkclick\") || this.getAttribute(\"onLinkClick\");\n\n\t\t\t\tconst rowData = this.data;\n\t\t\t\tconst curRow = parseInt(this.#cell.dataset.row, 10);\n\n\t\t\t\tif (fn && this.#host) {\n\t\t\t\t\tfn = fn.replace(\"()\", \"\");\n\t\t\t\t\tconst match = fn.match(/^(\\w+)\\s*\\(/);\n\t\t\t\t\tconst methodName = match?.[1] || fn;\n\n\t\t\t\t\tif (typeof this.#host[methodName] === 'function') {\n\t\t\t\t\t\tthis.#host[methodName].call(this.#host, rowData, curRow, this.#cell);\n\t\t\t\t\t} else if (typeof this.#host.exprFunction === 'function') {\n\t\t\t\t\t\tthis.#host.exprFunction(fn).call(this, rowData, curRow);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.#host?.dispatchEvent(new CustomEvent(ninegrid.EVENT.LINK_CLICK, {\n\t\t\t\t\tdetail: { target: this.#cell, data: rowData, currow: curRow },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true\n\t\t\t\t}));\n\t\t\t});\n\t\t}\n\t}\n\n\tget data() {\n\t\tconst rawRecord = this.#tr?.data;\n\t\tif (!rawRecord) return null;\n\t\tif (!rawRecord.v) return rawRecord;\n\n\t\tconst host = this.#host;\n\n\t\treturn new Proxy(rawRecord, {\n\t\t\tget(target, prop) {\n\t\t\t\tif (prop === '__ng') return target.__ng;\n\t\t\t\tif (prop === 'v') return target.v;\n\n\t\t\t\tconst idx = host?.fields?.indexOf?.(prop) ?? -1;\n\t\t\t\treturn idx >= 0 ? target.v[idx] : target[prop];\n\t\t\t}\n\t\t});\n\t}\n\n\tget value() {\n\t\tif (!this.#cell || !this.#tr?.data) return \"\";\n\n\t\tconst bindKey = this.#cell.dataset?.bind;\n\t\tif (!bindKey) return \"\";\n\n\t\tconst rawRecord = this.#tr.data;\n\n\t\tif (rawRecord.v && Array.isArray(rawRecord.v)) {\n\t\t\tconst colIdx = this.#host.fields.get().indexOf(bindKey) ?? -1;\n\t\t\treturn colIdx >= 0 ? (rawRecord.v[colIdx] ?? \"\") : \"\";\n\t\t}\n\n\t\treturn rawRecord[bindKey] ?? \"\";\n\t}\n\n\tset value(v) {\n\t\tif (!this.#cell || !this.#host?.data) return;\n\n\t\tconst row = parseInt(this.#tr.dataset.row, 10);\n\t\tconst bindKey = this.#cell.dataset.bind;\n\t\tif (isNaN(row) || !bindKey) return;\n\n\t\tthis.#host.data.setValue(row, bindKey, v);\n\t}\n\n\tget row() {\n\t\treturn parseInt(this.#cell?.dataset?.row, 10);\n\t}\n\tget index() {\n\t\treturn parseInt(this.#cell?.dataset?.index, 10);\n\t}\n\n\tisValid() {\n\t\treturn this.#cell.classList.contains(\"invalid\") ? false : true;\n\t}\n\n\tisInvalid() {\n\t\treturn !this.isValid();\n\t}\n\n\tgetDisplayText = (defaultValue = \"\") => {\n\n\t\tif (!this.#cell || !this.#cell.closest(\"tbody\")) return defaultValue;\n\n\t\tconst rawRecord = this.#tr.data;\n\n\t\tif (!rawRecord) return defaultValue;\n\n\t\tconst expr = this.#cell.dataset.expr;\n\t\tconst bindKey = this.#cell.dataset.bind;\n\t\tconst row = parseInt(this.#cell.dataset.row, 10);\n\n\t\tif (expr) {\n\t\t\ttry {\n\t\t\t\tif (this.#tr.getAttribute(\"grouping\") === \"true\") {\n\n\t\t\t\t\treturn this.getGroupExprValue(expr, this.#tr.data, row, this.#cell);\n\t\t\t\t} else {\n\t\t\t\t\treturn this.#host.exprEngine.evaluate(expr, this.#tr.data, row);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treturn defaultValue;\n\t\t\t}\n\t\t}\n\n\t\tif (bindKey) {\n\t\t\tconst val = this.value;\n\t\t\treturn val !== null && val !== undefined ? val : defaultValue;\n\t\t}\n\n\t\treturn defaultValue;\n\t};\n\n\n\n\trefresh() {\n\n\t\tif (!this.#cell || !this.#tr) return;\n\n\t\tconst val = this.value;\n\n\t\tthis.#cell.classList.remove(\"invalid\");\n\n\t\t[\"color\",\"background\",\"background-color\",\"visible\",\"enable\",\"validator\"].forEach(v => {\n\n\t\t\tconst expr = this.#attr[v];\n\t\t\tif (expr) {\n\t\t\t\tconst result = this.#host.exprEngine.evaluate(expr, this.#tr.data, parseInt(this.#cell.dataset.row, 10));\n\n\t\t\t\tif (v === \"validator\") {\n\t\t\t\t\tif (!result) {\n\t\t\t\t\t\tthis.#cell.classList.add(\"invalid\");\n\t\t\t\t\t}\n\t\t\t\t} else if (v === \"visible\") {\n\t\t\t\t\tthis.style[\"display\"] = result ? \"\" : \"none\";\n\t\t\t\t} else if (v === \"enable\") {\n\t\t\t\t\tthis.querySelectorAll(\"input, button, textarea, select\").forEach($el => {\n\t\t\t\t\t\t$el.disabled = !result;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!!result) {\n\t\t\t\t\t\tthis.#cell.removeAttribute(\"disabled\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.#cell.setAttribute(\"disabled\", \"true\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.#cell.style[v] = result;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn val;\n\t}\n\n\tgetExprValue(expr, data, row) {\n\t\tif (!this.#host || !this.#host.exprEngine || expr === undefined || expr === null || expr === \"\") return expr;\n\n\t\treturn this.#host.exprEngine.evaluate(expr, data, row);\n\t}\n\n\tgetGroupExprValue = (expr, groupRecord, row, cell) => {\n\t\tif (!expr) return \"\";\n\n\t\ttry {\n\t\t\trow = parseInt(row, 10);\n\t\t\tconst cleanExpr = expr.replace(\"()\", \"\").trim();\n\n\t\t\tif (this.#host && typeof this.#host[cleanExpr] === 'function') {\n\t\t\t\treturn this.#host[cleanExpr].call(this, groupRecord, row, cell);\n\t\t\t}\n\n\t\t\tconst match = cleanExpr.match(/^(\\w+)\\s*\\(\\s*([\\w\\-]*)\\s*\\)/);\n\t\t\tif (match) {\n\t\t\t\tconst indices = groupRecord[GROUP_IDX.CHILDREN];\n\t\t\t\tconst allRecords = this.#host?.data?.getArray ? this.#host.data.getArray() : [];\n\t\t\t\tconst childRecords = indices ? indices.map(idx => allRecords[idx]).filter(Boolean) : [];\n\n\t\t\t\tconst [, funcName, field] = match;\n\t\t\t\tconst host = this.#host;\n\n\t\t\t\tswitch (funcName.toLowerCase()) {\n\t\t\t\t\tcase 'count':\n\t\t\t\t\t\treturn childRecords.length;\n\n\t\t\t\t\tcase 'sum': {\n\t\t\t\t\t\tconst colIdx = host?.fields?.indexOf?.(field) ?? -1;\n\t\t\t\t\t\treturn childRecords.reduce((acc, record) => {\n\t\t\t\t\t\t\tconst val = colIdx >= 0 ? record.v?.[colIdx] : record[field];\n\t\t\t\t\t\t\treturn acc + (Number(val) || 0);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'avg': {\n\t\t\t\t\t\tif (childRecords.length === 0) return 0;\n\t\t\t\t\t\tconst colIdx = host?.fields?.indexOf?.(field) ?? -1;\n\t\t\t\t\t\tconst sum = childRecords.reduce((acc, record) => {\n\t\t\t\t\t\t\tconst val = colIdx >= 0 ? record.v?.[colIdx] : record[field];\n\t\t\t\t\t\t\treturn acc + (Number(val) || 0);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t\treturn sum / childRecords.length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 3. ํ˜ธ์ŠคํŠธ์˜ exprFunction ํ™œ์šฉ\n\t\t\tif (this.#host && typeof this.#host.exprFunction === 'function') {\n\t\t\t\treturn this.#host.exprFunction(expr).call(this, groupRecord, row, this.#host.data);\n\t\t\t}\n\n\t\t\tif (expr.includes(\"data.\") || expr.includes(\"childRecords\") || expr.includes(\"groupRecord\")) {\n\t\t\t\tlet evalFn = exprCache.get(\"grp_\" + expr);\n\t\t\t\tif (!evalFn) {\n\t\t\t\t\tevalFn = new Function('groupRecord', 'row', 'cell', 'host', `\n const indices = groupRecord[3]; // GROUP_IDX.CHILDREN = 3\n const allRecords = host?.data?.getArray ? host.data.getArray() : [];\n \n let childRecords = [];\n if (Array.isArray(indices)) {\n // indices๊ฐ€ ์ˆซ์ž ์ธ๋ฑ์Šค ๋ฐฐ์—ด์ธ์ง€, rowid ๋ฌธ์ž์—ด ๋ฐฐ์—ด์ธ์ง€ ํŒ๋ณ„ํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ฒŒ ์ถ”์ถœ\n childRecords = indices.map(idx => {\n if (typeof idx === 'number') {\n return allRecords[idx];\n } else {\n // rowid ๋“ฑ ๋ฌธ์ž์—ด ์‹๋ณ„์ž์ธ ๊ฒฝ์šฐ ์ „์ฒด ๋ฐฐ์—ด์—์„œ ์ฐพ๊ฑฐ๋‚˜ dataManager ํ™œ์šฉ\n return allRecords.find(r => r?.__ng?.rowid === idx || r?.m?._?.[0] === idx);\n }\n }).filter(Boolean);\n }\n \n // ๋งŒ์•ฝ ์œ„์—์„œ ๋ชป ์ฐพ์•˜๋Š”๋ฐ host.grouping์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋งค๋‹ˆ์ € ์œ„์ž„ ์‹œ๋„\n if (childRecords.length === 0 && host?.grouping?.getChildrenRecords && groupRecord[0]) {\n childRecords = host.grouping.getChildrenRecords(groupRecord[0]);\n }\n\n const data = childRecords; // data.length ๋“ฑ์„ ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ˜ธํ™˜\n return ${expr};\n `);\n\t\t\t\t\texprCache.set(\"grp_\" + expr, evalFn);\n\t\t\t\t}\n\t\t\t\treturn evalFn(groupRecord, row, cell, this.#host);\n\t\t\t}\n\n\t\t\treturn expr;\n\t\t} catch (e) {\n\t\t\tconsole.error(\"Group expr evaluation error:\", expr, e);\n\t\t\treturn expr;\n\t\t}\n\t};\n}\n\nexport class EditableCellElement extends CellElement {\n\n\tget host() { return super.host; }\n\tget sheet() { return super.sheet; }\n\tget cell() { return super.cell; }\n\tget tr() { return super.tr; }\n\tget attr() { return super.attr; }\n\n\tgetExprValue(expr, data, row, cell) {\n\t\treturn super.getExprValue(expr, data, row, cell);\n\t}\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\t}\n\n\trefresh() {\n\t\treturn super.refresh();\n\t}\n\n\tgetExprValue = (expr, data, row, cell) => {\n\t\treturn super.getExprValue(expr, data, row, cell);\n\t}\n\n\tisValid = () => {\n\t\treturn super.isValid();\n\t}\n\n\tisInvalid = () => {\n\t\treturn super.isInvalid();\n\t}\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputText extends EditableCellElement\n{\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\t\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#initEvent();\n\t};\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\t\tthis.#target.value = v;\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#target.addEventListener(\"input\", e => {\n\t\t\tif (this.#maxbyte) {\n\t\t\t\tconst maxByteNum = Number(this.#maxbyte);\n\t\t\t\tconst currentBytes = nine.getByteLength(e.target.value);\n\n\t\t\t\tif (currentBytes > maxByteNum) {\n\t\t\t\t\te.target.value = nine.cut(e.target.value, maxByteNum);\n\t\t\t\t\tthis.value = e.target.value;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.innerHTML = `\n\t\t\t<input type=\"text\" ondragstart=\"return false;\">\n\t\t`;\n\t};\n\n\tget #maxbyte() {\n\t\treturn this.cell.getAttribute(\"maxbyte\") || this.cell.getAttribute(\"max-byte\");\n\t}\n}\n\nif (!customElements.get('cell-input')) {\n\tcustomElements.define(\"cell-input\", CellInputText);\n}\n","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputNumber extends EditableCellElement\n{\n\t#target;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#initEvent();\n\n\n\t};\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" ondragstart=\"return false;\">\n `;\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#target.addEventListener(\"keydown\", this.#onKeyDown);\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\n\t\tthis.#target.value = v;//v !== undefined && v !== null ? v : \"\";\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tconst v = this.#target.value;\n\n\t\tif (v !== \"\" && v !== null && v !== undefined) {\n\t\t\tconst num = Number(v);\n\n\t\t\tif (isNaN(num) || (this.#max && num > Number(this.#max)) || (this.#min && num < Number(this.#min))) {\n\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t\telse if (this.#scale) {\n\t\t\t\tconst str = String(v);\n\t\t\t\tconst idx = str.indexOf('.');\n\t\t\t\tif (idx >= 0 && str.substring(idx + 1).length > Number(this.#scale)) {\n\t\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t#onKeyDown = e => {\n\n\t\tif ([\"Escape\", \"Enter\", \"Tab\", \"Home\", \"End\", \"ArrowLeft\", \"ArrowRight\", \"PageUp\", \"PageDown\", \"Backspace\", \"Delete\"].includes(e.code)) return;\n\n\t\tconst target = e.target;\n\t\tconst value = target.value;\n\t\tconst selectionStart = target.selectionStart;\n\t\tconst key = e.key;\n\n\t\tif (key === \"-\") {\n\t\t\tif (value.includes(\"-\") || selectionStart !== 0) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (key === \".\") {\n\t\t\tconst scale = Number(this.#scale);\n\n\t\t\tif (isNaN(scale) || scale <= 0 || value.includes(\".\")) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tlet validKey = [];\n\t\tif (this.#scale && Number(this.#scale) > 0) validKey.push(\".\");\n\t\tif (this.#min || Number(this.#min) > 0) validKey.push(\"-\");\n\n\t\tconst isNumKey = (e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105);\n\n\t\tif (!isNumKey && !validKey.includes(e.key)) {\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#scale && isNumKey && e.target.selectionStart == e.target.selectionEnd) {\n\t\t\tconst s = e.target.value;\n\t\t\tconst idx = s.indexOf(\".\");\n\t\t\tif (idx >= 0 && e.target.selectionStart > idx) {\n\t\t\t\tconst decimalPart = s.substr(idx + 1);\n\t\t\t\tif (decimalPart.length >= Number(this.#scale)) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.#maxbyte && nine.getByteLength(e.target.value) >= Number(this.#maxbyte) && e.target.selectionStart == e.target.selectionEnd) {\n\t\t\te.preventDefault();\n\t\t}\n\t}\n\n\tget #min() {\n\t\treturn this.cell.getAttribute(\"min\") || \"\";\n\t}\n\n\tget #max() {\n\t\treturn this.cell.getAttribute(\"max\") || \"\";\n\t}\n\n\tget #scale() {\n\t\treturn this.cell.getAttribute(\"scale\") || \"\";\n\t}\n\n\tget #maxbyte() {\n\t\treturn this.cell.getAttribute(\"maxbyte\") || this.cell.getAttribute(\"max-byte\");\n\t}\n}\n\nif (!customElements.get('cell-input-number')) {\n\tcustomElements.define(\"cell-input-number\", CellInputNumber);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputColor extends EditableCellElement\n{\n\t#target;\n\t#btn;\n\t#dataSource;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input[type=color]\");\n\t\tthis.#btn = this.querySelector(\"button\");\n\n\t\t//this.#rendererColor();\n\n\t\tthis.#initEvent();\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#btn.addEventListener(\"click\", () => {\n\t\t\tthis.#target.click();\n\t\t});\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"color\" ondragstart=\"return false;\">\n <button tabindex=\"-1\" type=\"button\"></button>\n `;\n\t};\n\n\trerenderer = () => {\n\t\tthis.refresh();\n\t};\n\n\t#rendererColor = () => {\n\n\t\tconst dataSource = this.cell.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, this.tr.data, this.tr.dataset.row);\n\n\t\tthis.querySelector(\"datalist\")?.remove();\n\n\t\tif (this.#dataSource && Array.isArray(this.#dataSource)) {\n\t\t\tconst datalistId = `color-list-${Math.random().toString(36).substr(2, 9)}`;\n\n\t\t\tconst datalist = document.createElement('datalist');\n\t\t\tdatalist.id = datalistId;\n\n\t\t\tconst fragment = document.createDocumentFragment();\n\n\t\t\tthis.#dataSource.forEach(v => {\n\t\t\t\tif (v.value) {\n\t\t\t\t\tconst option = document.createElement('option');\n\t\t\t\t\toption.value = v.value;\n\t\t\t\t\tfragment.appendChild(option);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdatalist.appendChild(fragment);\n\t\t\tthis.appendChild(datalist);\n\n\t\t\tthis.#target.setAttribute(\"list\", datalistId);\n\t\t}\n\t};\n\n\trefresh = () => {\n\t\tif (!this.tr.data) return;\n\n\t\tconst v = super.refresh();\n\n\t\tthis.#rendererColor();\n\n\t\tthis.#target.value = v !== undefined && v !== null && v !== \"\" ? v : \"#ffffff\";\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tconst v = this.#target.value;\n\n\t\tif (v !== \"\" && v !== null && v !== undefined) {\n\t\t\tif (!this.#isValidColor(v)) {\n\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t\telse if (this.#dataSource && Array.isArray(this.#dataSource) && this.#dataSource.length > 0) {\n\t\t\t\tconst exists = this.#dataSource.some(item => {\n\t\t\t\t\tconst itemCode = item.value !== undefined ? item.value : (item.code !== undefined ? item.code : '');\n\t\t\t\t\treturn itemCode.toLowerCase() === v.toLowerCase();\n\t\t\t\t});\n\n\t\t\t\tif (!exists) {\n\t\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t#isValidColor = (v) => {\n\t\tif (typeof v !== \"string\" || v.length != 7 || !v.startsWith(\"#\")) return false;\n\n\t\tvar r = parseInt(v.substr(1, 2), 16);\n\t\tvar g = parseInt(v.substr(3, 2), 16);\n\t\tvar b = parseInt(v.substr(5, 2), 16);\n\n\t\tif (isNaN(r) || isNaN(g) || isNaN(b)) return false;\n\t\tif (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) return false;\n\n\t\treturn true;\n\t}\n}\n\nif (!customElements.get('cell-input-color')) {\n\tcustomElements.define(\"cell-input-color\", CellInputColor);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputDate extends EditableCellElement\n{\n\t#target;\n\t#type;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#target.classList.toggle(\"has-value\", !!val); // ๐Ÿ’ก ์‹ค์‹œ๊ฐ„ ๋ฐ˜์˜\n\t\t\tthis.#validate(val);\n\n\t\t\tsuper.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tsuper.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.#type = this.cell.getAttribute(\"date-type\") || \"date\";\n\t\tif (![\"date\",\"datetime-local\",\"time\",\"week\",\"month\"].includes(this.#type)) {\n\t\t\tthrow `invalid type : ${this.#type}`;\n\t\t}\n\n\t\tlet attr = [];\n\t\tfor (let i = 0; i < this.cell.attributes.length; i++) {\n\t\t\tif ([\"value\", \"max\", \"min\", \"step\"].includes(this.cell.attributes[i].name)) {\n\t\t\t\tattr.push(`${this.cell.attributes[i].name}=\"${this.cell.attributes[i].value}\"`);\n\t\t\t}\n\t\t}\n\n\t\tthis.innerHTML = `\n <input\n type=\"${this.#type}\"\n data-placeholder=\"${this.cell.getAttribute('placeholder') || 'Select'}\"\n ${attr.join(\" \")}\n required\n />\n `;\n\t};\n\n\trefresh = () => {\n\n\t\tconst v = super.refresh();\n\n\t\tlet formattedVal = v;\n\t\tif (formattedVal) {\n\n\t\t\tswitch (this.#type) {\n\t\t\t\tcase \"date\":\n\t\t\t\t\tformattedVal = formattedVal.substr(0, 10);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"datetime-local\":\n\t\t\t\t\tformattedVal = formattedVal.substr(0, 16);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"time\":\n\t\t\t\t\tvar d = new Date(v);\n\t\t\t\t\tif (d != \"Invalid Date\" && !isNaN(d)) {\n\t\t\t\t\t\tformattedVal = (\"00\" + d.getHours()).slice(-2) + \":\" + (\"00\" + d.getMinutes()).slice(-2);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"month\":\n\t\t\t\t\tvar d = new Date(v);\n\t\t\t\t\tif (d != \"Invalid Date\" && !isNaN(d)) {\n\t\t\t\t\t\tformattedVal = (\"0000\" + d.getFullYear()).slice(-4) + \"-\" + (\"00\" + (d.getMonth() + 1)).slice(-2);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.#target.value = formattedVal || \"\";\n\t\tthis.#target.classList.toggle(\"has-value\", !!formattedVal); // ๐Ÿ’ก ๊ฐ’์ด ์žˆ์œผ๋ฉด ํด๋ž˜์Šค ์ถ”๊ฐ€\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate(formattedVal);\n\t\t}\n\t};\n\n\t#validate = (val) => {\n\n\t\tif (val !== \"\" && val !== null && val !== undefined) {\n\t\t\tlet isValid = this.#isValidDate(val);\n\n\t\t\tif (isValid) {\n\t\t\t\tif (this.#min && val < this.#min) isValid = false;\n\t\t\t\tif (this.#max && val > this.#max) isValid = false;\n\t\t\t}\n\n\t\t\tif (!isValid) {\n\t\t\t\tsuper.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t}\n\t};\n\n\t#isValidDate = (v) => {\n\n\t\tif (typeof v !== \"string\") return false;\n\n\t\tlet isValid = true;\n\n\t\tswitch (this.#type) {\n\t\t\tcase \"date\":\n\t\t\tcase \"datetime-local\":\n\t\t\t\tconst year = Number(v.substr(0, 4));\n\t\t\t\tconst month = Number(v.substr(5, 2));\n\t\t\t\tconst day = Number(v.substr(8, 2));\n\n\t\t\t\tif (isNaN(year) || isNaN(month) || isNaN(day)) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if (month < 1 || month > 12 || day < 1 || day > 31) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if ([4, 6, 9, 11].includes(month) && day == 31) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if (month == 2) {\n\t\t\t\t\tlet isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));\n\t\t\t\t\tif (day > 29 || (day == 29 && !isleap)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (isValid) {\n\t\t\tswitch (this.#type) {\n\t\t\t\tcase \"datetime-local\":\n\t\t\t\t\tvar t = v.substr(10, 1);\n\t\t\t\t\tvar hour = Number(v.substr(11, 2));\n\t\t\t\t\tvar min = Number(v.substr(14, 2));\n\n\t\t\t\t\tif (t != \"T\") {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (isNaN(hour) || isNaN(min)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (hour < 0 || hour > 23 || min < 0 || min > 59) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"month\":\n\t\t\t\t\tvar year = Number(v.substr(0, 4));\n\t\t\t\t\tvar month = Number(v.substr(5, 2));\n\n\t\t\t\t\tif (isNaN(year) || isNaN(month)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (month < 1 || month > 12) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"week\":\n\t\t\t\t\tvar year = Number(v.substr(0, 4));\n\t\t\t\t\tvar w = v.substr(5, 1);\n\t\t\t\t\tvar week = Number(v.substr(6, 2));\n\n\t\t\t\t\tif (w != \"W\") {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (isNaN(year) || isNaN(week)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (week <= 0 || week > 53) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn isValid;\n\t}\n\n\tget #min() {\n\t\treturn this.cell.getAttribute(\"min\");\n\t}\n\n\tget #max() {\n\t\treturn this.cell.getAttribute(\"max\");\n\t}\n\n\tget #step() {\n\t\treturn this.cell.getAttribute(\"step\");\n\t}\n}\n\nif (!customElements.get('cell-input-date')) {\n\tcustomElements.define(\"cell-input-date\", CellInputDate);\n}","import { EditableCellElement } from \"./core/CellElement.js\";\nimport {trace} from \"@nopeer\";\n\nclass CellCheckbox extends EditableCellElement {\n #target;\n #label;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n this.#renderer();\n\n this.#target = this.querySelector(\"input\");\n this.#label = this.querySelector(\"span\");\n\n this.#initEvent();\n }\n\n get dataSource() {\n return [\n { value: this.trueValue, text: this.#trueText },\n { value: this.falseValue, text: this.#falseText }\n ];\n }\n\n #initEvent = () => {\n if (this.closest(\"thead\")) {\n this.#target.addEventListener(\"change\", (e) => {\n super.sheet.querySelector(`tbody.body [data-col=\"${super.cell.dataset.col}\"] cell-checkbox`)?.selectAll(e.target.checked);\n });\n }\n\n this.#target.addEventListener(\"change\", (event) => {\n if (!this.closest(\"tbody\")) return;\n\n if (this.#isRadio) {\n this.selectAll(false);\n this.value = this.trueValue;\n }\n else {\n this.value = event.target.checked ? this.trueValue : this.falseValue;\n }\n\n this.sheet.rowManager.refresh(true);\n });\n };\n\n #renderer = () => {\n\n const trueValue = this.trueValue;//this.cell.getAttribute(\"true-value\") || false;\n //const selectedBorderColor = this.getAttribute(\"selected-border-color\") || \"dimgray\";\n\n const originalContent = this.cell.getAttribute(\"content\") || \"\";\n const childHtml = this.#isRadio ? `<input type=\"radio\" value=\"${trueValue}\" />` : `<label><input type=\"checkbox\" /><span>${originalContent}</span></label>`;\n\n this.innerHTML = `\n ${childHtml}\n `;\n }\n\n refresh = () => {\n const val = super.refresh();\n\n this.#target.checked = (val === this.trueValue);\n\n if (this.isValid()) {\n this.#validate(val);\n }\n\n const displayText = (val === this.trueValue) ? this.#trueText : ((val === this.falseValue) ? this.#falseText : val);\n\n if (this.#label) {\n this.#label.textContent = displayText;\n }\n };\n\n #validate = (val) => {\n\n this.cell.classList.remove(\"invalid\");\n\n if (val !== \"\" && val !== null && val !== undefined) {\n if (val !== this.trueValue && val !== this.falseValue) {\n this.cell.classList.add(\"invalid\");\n }\n }\n };\n\n selectAll = (v) => {\n if (this.closest(\"thead\")) return; // ํ—ค๋” ์ž์‹ ์€ ์ œ์™ธ\n\n const data = this.host.data.getArray();\n const colIndex = this.host.fields.indexOf(this.cell.dataset.bind);\n\n if (colIndex < 0) return;\n\n for (let i = 0; i < data.length; i++) {\n if (this.#enable && super.getExprValue(this.#enable, data[i], i, this.cell) === false) continue;\n if (this.#readonly && super.getExprValue(this.#readonly, data[i], i, this.cell) === true) continue;\n if (this.#visible && super.getExprValue(this.#visible, data[i], i, this.cell) === false) continue;\n\n data[i].v[colIndex] = v ? this.trueValue : this.falseValue;\n }\n\n super.sheet.invalidate();\n };\n\n get trueValue() {\n return this.cell.getAttribute(\"true-value\") || \"Y\";\n }\n get falseValue() {\n return this.cell.getAttribute(\"false-value\")|| \"N\";\n }\n get #trueText() {\n return this.cell.getAttribute(\"true-text\") || \"\";\n }\n get #falseText() {\n return this.cell.getAttribute(\"false-text\") || \"\";\n }\n get #isRadio() {\n return this.cell.getAttribute(\"is-radio\") || false;\n }\n get #enable() {\n return this.cell.getAttribute(\"enable\") || false;\n }\n get #readonly() {\n return this.cell.getAttribute(\"readonly\") || false;\n }\n get #visible() {\n return this.cell.getAttribute(\"visible\") || false;\n }\n}\n\nif (!customElements.get('cell-checkbox')) {\n customElements.define(\"cell-checkbox\", CellCheckbox);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellRadio extends EditableCellElement {\n\t#target;\n\t#radioList = [];\n\t#dataSource = [];\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#rendererRadio();\n\n\t\tthis.#initEvent();\n\t}\n\n\t#initEvent = () => {\n\n\t\tthis.cell.addEventListener(\"keydown\", e => {\n\n\t\t\tif (this.cell.hasAttribute(\"readonly\") || this.cell.classList.contains(\"readonly\")) return;\n\t\t\tif (this.cell.getAttribute(\"disabled\") === \"true\") return;\n\n\t\t\tif (e.code === \"Space\") {\n\t\t\t\te.preventDefault();\n\n\t\t\t\tlet matchIndex = -1;\n\n\t\t\t\tthis.#radioList.forEach(($el,index) => {\n\t\t\t\t\tif (this.value === $el.getAttribute(\"value\")) {\n\t\t\t\t\t\tmatchIndex = index;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tmatchIndex = (matchIndex === this.#radioList.length - 1) ? 0 : (matchIndex >= 0 ? matchIndex + 1 : 0);\n\t\t\t\tthis.value = this.#radioList[matchIndex].getAttribute(\"value\");\n\n\t\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t\t}\n\t\t});\n\t};\n\n\t#rendererRadio = () => {\n\n\t\tif (!this.host) return;\n\n\t\tconst dataSource = this.cell.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, this.tr.data, this.tr.dataset.row);\n\n\t\tthis.#target.replaceChildren();\n\n\t\tif (this.#dataSource && Array.isArray(this.#dataSource)) {\n\n\t\t\tconst fragment = document.createDocumentFragment();\n\n\t\t\tthis.#dataSource.forEach(v => {\n\t\t\t\tconst codeVal = v[this.#keyName] !== undefined ? v[this.#keyName] : '';\n\t\t\t\tconst nameVal = v[this.#valueName] !== undefined ? v[this.#valueName] : '';\n\n\t\t\t\tconst label = document.createElement('label');\n\n\t\t\t\tconst input = document.createElement('input');\n\t\t\t\tinput.type = 'radio';\n\t\t\t\tinput.value = codeVal;\n\n\t\t\t\tconst span = document.createElement('span');\n\t\t\t\tspan.textContent = nameVal;\n\n\t\t\t\tlabel.appendChild(input);\n\t\t\t\tlabel.appendChild(span);\n\t\t\t\tfragment.appendChild(label);\n\t\t\t});\n\n\t\t\tthis.#target.appendChild(fragment);\n\n\n\t\t\tthis.#radioList = Array.from(this.querySelectorAll(\"input\"));\n\n\n\n\t\t\tthis.#radioList.forEach($el => {\n\t\t\t\t$el.addEventListener(\"change\", (e) => {\n\t\t\t\t\tthis.value = e.target.value;\n\t\t\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.innerHTML = `\n\t\t\t<div></div>\n `;\n\n\t\tthis.#target = this.querySelector(\"div\");\n\t};\n\n\trerenderer = () => {\n\t\tthis.#rendererRadio();\n\t\tthis.refresh();\n\t};\n\n\trefresh = () => {\n\n\t\tconst v = super.refresh();\n\n\t\tthis.#radioList.forEach($el => {\n\t\t\t$el.checked = (v === $el.value);\n\t\t});\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tif (this.value === null || this.value === undefined || this.value === \"\" || !Array.isArray(this.#dataSource)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst idx = this.#dataSource.findIndex(m => this.value === m[this.#keyName]);\n\t\tif (idx < 0) {\n\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t}\n\t};\n\n\tget dataSource() {\n\t\treturn this.#dataSource;\n\t}\n\n\tget #keyName() {\n\t\treturn this.cell.getAttribute(\"key-name\") || \"k\";\n\t}\n\n\tget #valueName() {\n\t\treturn this.cell.getAttribute(\"value-name\") || \"v\";\n\t}\n}\n\nif (!customElements.get('cell-radio')) {\n\tcustomElements.define(\"cell-radio\", CellRadio);\n}","import { trace } from \"@nopeer\";\n\nexport class CellComboPanel extends HTMLElement {\n\t#parent;\n\t#keyName;\n\t#valueName;\n\t#isOpen = false;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#renderer();\n\t\tthis.#initEvents();\n\t}\n\n\t#initData = (dataSource, keyName, valueName, multi, separator) => {\n\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\t\tif (!grd || !dataSource || dataSource.length === 0) return;\n\n\t\tconst itemsAttr = this.#parent.getAttribute(\"items\");\n\t\tlet fieldKeys = [];\n\n\t\tif (itemsAttr) {\n\t\t\tfieldKeys = itemsAttr.split(\",\").map(s => s.trim());\n\t\t} else {\n\t\t\tfieldKeys = [valueName].filter(Boolean);\n\t\t}\n\n\t\tconst activeColumnCount = fieldKeys.length;\n\n\t\tgrd.shadowRoot.querySelector(\".ng-container-left\").style.display = multi ? '' : 'none';\n\n\t\tgrd.shadowRoot.querySelectorAll('table colgroup col, tbody td').forEach(($el, idx) => {\n\n\t\t\tconst col = parseInt($el.dataset.col, 10);\n\t\t\tif (col >= 2) {\n\t\t\t\t$el.style.display = (col - 2 >= activeColumnCount) ? 'none' : '';\n\t\t\t}\n\t\t});\n\n\t\tconst formattedData = dataSource.map(item => {\n\t\t\tconst row = {\n\t\t\t\tCHK: \"N\",\n\t\t\t\tk: keyName && item[keyName] !== undefined ? item[keyName] : (item[0] !== undefined ? item[0] : \"\")\n\t\t\t};\n\n\t\t\tfieldKeys.forEach((key, idx) => {\n\t\t\t\trow[`tmp${idx + 1}`] = item[key] !== undefined ? item[key] : (item[idx] !== undefined ? item[idx] : \"\");\n\t\t\t});\n\t\t\treturn row;\n\t\t});\n\n\t\tgrd.data.set(formattedData);\n\n\t\tif (multi && this.#parent.value) {\n\t\t\tconst selectedKeys = String(this.#parent.value).split(separator || \",\");\n\t\t\tgrd.data.getValidData().forEach(m => {\n\t\t\t\tif (selectedKeys.includes(String(m.v[1]))) {\n\t\t\t\t\tm.v[0] = \"Y\";\n\t\t\t\t}\n\t\t\t});\n\t\t\tgrd.refreshData();\n\t\t}\n\t};\n\n\topen = (parent, dataSource, keyName, valueName, multi, separator) => {\n\t\tthis.#parent = parent;\n\t\tthis.#keyName = keyName;\n\t\tthis.#valueName = valueName;\n\t\tthis.#isOpen = true;\n\n\t\tthis.classList.add(\"active\");\n\n\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\t\tif (!grd || !dataSource) return;\n\n\t\tthis.querySelector(\".search-input\").value = \"\";\n\t\tthis.querySelector(\"#chkAll\").checked = true;\n\n\t\tif (dataSource.length > 10) {\n\t\t\tthis.classList.add(\"expand\");\n\t\t} else {\n\t\t\tthis.classList.remove(\"expand\");\n\t\t}\n\n\t\tif (multi) {\n\t\t\tthis.classList.add(\"multi\");\n\t\t} else {\n\t\t\tthis.classList.remove(\"multi\");\n\t\t}\n\n\t\tconst sheet = parent.closest(\"nine-table-sheet\");\n\t\tconst btnEl = parent.querySelector(\".btn1\");\n\t\tif (!btnEl || !sheet) return;\n\n\t\tconst btnRect = btnEl.getBoundingClientRect();\n\t\tconst sheetRect = sheet.getBoundingClientRect();\n\n\t\tlet left = btnRect.left - sheetRect.left;\n\t\tlet top = btnRect.bottom - sheetRect.top + 2;\n\n\t\tconst panelWidth = this.offsetWidth || 250;\n\t\tconst panelHeight = this.offsetHeight || 250;\n\t\tif (left + panelWidth > sheetRect.width) {\n\t\t\tleft = Math.max(0, sheetRect.width - panelWidth - 5);\n\t\t}\n\n\t\tif (left < 0) {\n\t\t\tleft = 5;\n\t\t}\n\n\t\tif (top + panelHeight > sheetRect.height) {\n\t\t\tconst upwardTop = (btnRect.top - sheetRect.top) - panelHeight - 2;\n\t\t\tif (upwardTop >= 0) {\n\t\t\t\ttop = upwardTop;\n\t\t\t} else {\n\t\t\t\ttop = Math.max(0, sheetRect.height - panelHeight - 5);\n\t\t\t}\n\t\t}\n\n\t\tthis.style.left = `${left}px`;\n\t\tthis.style.top = `${top}px`;\n\n\t\tsetTimeout(() => {\n\n\t\t\tthis.#initData(dataSource, keyName, valueName, multi, separator);\n\n\t\t\tconst viewContainer = grd.shadowRoot.querySelector(\".ng-container-body table tbody.body\");\n\n\t\t\tif (!viewContainer.__hasClickEvent) {\n\n\t\t\t\tviewContainer.addEventListener(\"mousedown\", (e) => {\n\n\t\t\t\t\tconst tr = e.target.closest(\"tr\");\n\t\t\t\t\tif (!tr) return;\n\n\t\t\t\t\tif (!multi) {\n\t\t\t\t\t\tthis.#onClickRow(e);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tviewContainer.__hasClickEvent = true;\n\t\t\t}\n\t\t}, 100);\n\t}\n\n\tclose = () => {\n\t\tthis.classList.remove(\"active\");\n\t\tthis.#isOpen = false;\n\t\tif (this.#parent && this.#parent.cell) {\n\t\t\tthis.#parent.cell.focus();\n\t\t}\n\t}\n\n\t#onClickRow = (e) => {\n\n\t\tconst sheet = e.target.closest(\"nine-table-sheet\");\n\t\tconst tr = e.target.closest(\"tr\");\n\n\t\tconst rowIndex = parseInt(tr.dataset.row, 10);\n\t\tconst record = sheet.view.get(rowIndex);\n\n\t\tthis.#parent.value = record.k;\n\n\t\tthis.#parent.sheet.rowManager.refresh(true);\n\n\t\tthis.close();\n\t}\n\n\t#onOk = () => {\n\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\t\tconst data = grd.data.getValidData();\n\n\t\tconst selectedKeys = [];\n\t\tdata.forEach(o => {\n\t\t\tif (o.v[0] === \"Y\") {\n\t\t\t\tselectedKeys.push(o.v[1]);\n\t\t\t}\n\t\t});\n\n\t\tthis.#parent.value = selectedKeys.join(this.#parent.getAttribute(\"multi-separator\") || \",\");\n\t\tthis.#parent.sheet.rowManager.refresh(true);\n\n\t\tthis.close();\n\t}\n\n\t#onSelectAll = (e) => {\n\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\t\tconst isChecked = e.target.checked ? \"Y\" : \"N\";\n\t\tgrd.data.getValidData().forEach(m => { m.v[0] = isChecked; });\n\t\tgrd.refreshData();\n\t}\n\n\t#onInput = (e) => {\n\t\tconst keyword = e.target.value.toLowerCase();\n\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\n\t\tgrd.data.getValidDataNF().forEach(m => {\n\t\t\tconst match = Object.values(m.v).some(val =>\n\t\t\t\tval !== null && val !== undefined && String(val).toLowerCase().includes(keyword)\n\t\t\t);\n\t\t\tm.__ng.filtered = !match;\n\t\t});\n\n\t\tgrd.data.resetRecords();\n\t\tgrd.dataManager.viewRecords.reset();\n\t}\n\n\tget isOpen() {\n\t\treturn this.#isOpen;\n\t}\n\n\tget targetCell() {\n\t\treturn this.#parent;\n\t}\n\n\t#initEvents = () => {\n\t\tthis.querySelector(\".search-input\").addEventListener(\"input\", this.#onInput);\n\t\tthis.querySelector(\"#btnOk\").addEventListener(\"click\", this.#onOk);\n\t\tthis.querySelector(\"#chkAll\").addEventListener(\"change\", this.#onSelectAll);\n\n\t\tdocument.addEventListener(\"mousedown\", (e) => {\n\t\t\tconst path = e.composedPath ? e.composedPath() : [];\n\n\t\t\tif (path.includes(this)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.close();\n\t\t});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <div class=\"head\">\n <input type=\"text\" class=\"search-input\" placeholder=\"Search...\" />\n </div>\n \n <nine-table-simple class=\"combo-list\" theme=\"simple\">\n <table auto-fit-col=\"true\">\n <colgroup>\n <col width=\"30\" fixed=\"left\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"0\" />\n </colgroup>\n <tbody>\n <tr>\n <td cell-type=\"checkbox\" data-bind=\"CHK\"></td>\n <td data-bind=\"tmp1\" />\n <td data-bind=\"tmp2\" />\n <td data-bind=\"tmp3\" />\n <td data-bind=\"tmp4\" />\n <td data-bind=\"tmp5\" />\n <td data-bind=\"tmp6\" />\n <td data-bind=\"tmp7\" />\n <td data-bind=\"tmp8\" />\n <td data-bind=\"tmp9\" />\n <td data-bind=\"tmp10\" />\n <td data-bind=\"k\" />\n </tr>\n </tbody>\n </table>\n </nine-table-simple>\n \n <div class=\"footer\">\n <div>\n <input id=\"chkAll\" type=\"checkbox\" checked>\n <label for=\"chkAll\">Select All</label>\n </div>\n <button id=\"btnOk\">OK</button>\n </div>\n `;\n\t};\n}\n\nif (!customElements.get('cell-combo-panel')) {\n\tcustomElements.define(\"cell-combo-panel\", CellComboPanel);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\nimport \"./cell-combo-panel.js\";\n\nexport class CellCombo extends EditableCellElement {\n\t#targetBtn;\n\t#dataSource = [];\n\t#keyName;\n\t#valueName;\n\t#multi;\n\t#multiSeparator;\n\t#panel;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tthis.#renderer();\n\t\tsuper.connectedCallback();\n\n\t\tthis.#keyName = super.cell.getAttribute(\"key-name\") || \"k\";\n\t\tthis.#valueName = super.cell.getAttribute(\"value-name\") || \"v\";\n\t\tthis.#multi = super.cell.getAttribute('multi') === \"true\";\n\t\tthis.#multiSeparator = super.cell.getAttribute(\"multi-separator\") || \",\";\n\n\t\tthis.#initData();\n\t\tthis.#initEvent();\n\t}\n\n\trerenderer = () => {\n\t\tthis.#initData();\n\t\tthis.refresh();\n\t};\n\n\t#initData = () => {\n\t\tif (!super.sheet || !super.cell) return;\n\n\t\tconst dataSource = super.cell?.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, super.tr.data, super.tr.dataset.row);\n\t}\n\n\t#initEvent = () => {\n\t\tthis.querySelectorAll(\"button\").forEach(btn => {\n\t\t\tbtn.addEventListener(\"click\", (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tthis.#togglePanel();\n\t\t\t});\n\t\t});\n\t}\n\n\t#togglePanel = () => {\n\n\t\tif (!this.#panel) {\n\t\t\tthis.#panel = super.sheet.querySelector(\"cell-combo-panel\");\n\t\t\tif (!this.#panel) {\n\t\t\t\tthis.#panel = document.createElement(\"cell-combo-panel\");\n\t\t\t\tsuper.sheet.appendChild(this.#panel);\n\t\t\t}\n\t\t}\n\n\t\tif (this.#panel.isOpen && this.#panel.targetCell === this) {\n\t\t\tthis.#panel.close();\n\t\t} else {\n\t\t\tthis.#panel.open(this, this.#dataSource, this.#keyName, this.#valueName, this.#multi, this.#multiSeparator);\n\t\t}\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <button class=\"btn1\" type=\"button\" tabindex=\"-1\">Select</button>\n <button class=\"btn2\" type=\"button\" tabindex=\"-1\"></button>\n `;\n\n\t\tthis.#targetBtn = this.querySelector(\".btn1\");\n\t};\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\t\tif (!this.#targetBtn) return v;\n\n\t\tthis.#targetBtn.textContent = this.#getDisplayText() || \"Select\";\n\t\tthis.#validateInput();\n\n\t\treturn v;\n\t};\n\n\t#getDisplayText = () => {\n\t\tif (!this.value || !Array.isArray(this.#dataSource)) return \"\";\n\n\t\tif (this.#multi) {\n\t\t\tconst keys = String(this.value).split(this.#multiSeparator);\n\t\t\treturn this.#dataSource\n\t\t\t\t.filter(m => keys.includes(String(m[this.#keyName])))\n\t\t\t\t.map(m => m[this.#valueName])\n\t\t\t\t.join(this.#multiSeparator);\n\t\t} else {\n\t\t\tconst found = this.#dataSource.find(m => String(m[this.#keyName]) === String(this.value));\n\t\t\treturn found ? found[this.#valueName] : this.value;\n\t\t}\n\t}\n\n\t#validateInput = () => {\n\t\tif (!super.cell) return;\n\t\tsuper.cell.classList.remove(\"invalid\");\n\n\t\tif (this.value === null || this.value === undefined || this.value === \"\" || !Array.isArray(this.#dataSource)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst list = this.#multi ? String(this.value).split(this.#multiSeparator) : [this.value];\n\t\tfor (const v of list) {\n\t\t\tconst idx = this.#dataSource.findIndex(m => String(v) === String(m[this.#keyName]));\n\t\t\tif (idx < 0) {\n\t\t\t\tsuper.cell.classList.add(\"invalid\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t};\n\n\tget dataSource() {\n\t\treturn this.#dataSource;\n\t}\n}\n\nif (!customElements.get('cell-combo')) {\n\tcustomElements.define(\"cell-combo\", CellCombo);\n}","import { trace } from \"@nopeer\";\nimport { CellElement } from \"./core/CellElement.js\";\n\nclass CellRenderer extends CellElement {\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"span\");\n\t}\n\n\trefresh = () => {\n\n\t\tsuper.refresh();\n\n\t\tif (this.cell.getAttribute(\"html\") === \"true\") {\n\t\t\tthis.#target.innerHTML = this.getDisplayText();\n\t\t} else {\n\t\t\tthis.#target.textContent = this.getDisplayText();\n\t\t}\n\t};\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <span class=\"wrapper\"></span>\n `;\n\t};\n}\n\nif (!customElements.get(\"cell-renderer\")) {\n\tcustomElements.define(\"cell-renderer\", CellRenderer);\n}","import { CellElement } from \"./core/CellElement.js\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { trace } from \"@nopeer\";\n\nexport class CellButton extends CellElement {\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tthis.#renderer();\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#target = this.querySelector(\"button\");\n\n\t\tthis.#target.removeEventListener(\"click\", this.#cellButtonClick);\n\t\tthis.#target.addEventListener(\"click\", this.#cellButtonClick);\n\t}\n\n\t#cellButtonClick = e => {\n\t\te.stopPropagation();\n\n\t\tconst rowid = parseInt(this.cell.dataset.row, 10);\n\n\t\tconst customEvent = new CustomEvent(NINE_TABLE.EVENT.CELL_BUTTON_CLICK, {\n\t\t\tbubbles: true,\n\t\t\tcomposed: true,\n\t\t\tdetail: {\n\t\t\t\toriginalEvent: e,\n\t\t\t\tcell: this.cell,\n\t\t\t\trow: rowid,\n\t\t\t\tcol: parseInt(this.cell.dataset.col, 10),\n\t\t\t\tbind: this.dataset.bind,\n\t\t\t\tdata: this.host.data.get(rowid),\n\t\t\t\tvalue: this.value,\n\t\t\t}\n\t\t});\n\n\t\tthis.dispatchEvent(customEvent);\n\t};\n\n\trefresh = () => {\n\t\tconst rawValue = super.refresh ? super.refresh() : this.value;\n\t\t//let displayValue = this.getDisplayText(rawValue);\n\t\tthis.#target.innerHTML = this.getDisplayText(rawValue);\n\t};\n\n\t#renderer = () => {\n\n\t\tconst buttonText = \"...\";//this.getAttribute(\"text\") || super.attr[\"text\"] || \"\";\n\n\t\tthis.innerHTML = `\n <button class=\"button\">${buttonText}</button>\n `;\n\t};\n}\n\nif (!customElements.get('cell-button')) {\n\tcustomElements.define(\"cell-button\", CellButton);\n}","import { trace } from \"@nopeer\";\nimport { CellElement } from \"./core/CellElement.js\";\nimport {NINE_TABLE} from \"@\";\n\nclass CellRowIndicator extends CellElement {\n\t#mainTarget;\n\t#subTarget;\n\t#statusTarget;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#renderer();\n\t\tsuper.connectedCallback();\n\n\t\tif (this.cell) {\n\t\t\tthis.cell.removeAttribute(\"tabindex\");\n\t\t\tthis.cell.dataset.bind = \"rowState\";\n\t\t}\n\n\t\tthis.#mainTarget = this.querySelector(\".ng-row-main\");\n\t\tthis.#subTarget = this.querySelector(\".ng-row-sub\");\n\t\tthis.#statusTarget = this.querySelector(\".row-status\");\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n\t\t\t<span class=\"ng-row-main\"></span>\n <span class=\"ng-row-sub\"></span>\n <span class=\"row-status\"></span>\n `;\n\t}\n\n\trefresh = () => {\n\t\tif (!this.cell || !this.tr) return;\n\n\t\tthis.classList.remove(\"is-insert\", \"is-update\", \"is-delete\");\n\n\t\tconst row = this.row;\n\t\tif (isNaN(row)) return;\n\n\t\tconst rawRecord = this.tr.data;\n\n\t\tif (rawRecord) {\n\t\t\tswitch (rawRecord.m._[NINE_TABLE.META.INDEX.ROW_STATE]) {\n\t\t\t\tcase NINE_TABLE.ROW_STATE.INSERT:\n\t\t\t\t\tthis.classList.add(\"is-insert\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase NINE_TABLE.ROW_STATE.UPDATE:\n\t\t\t\t\tthis.classList.add(\"is-update\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase NINE_TABLE.ROW_STATE.DELETE:\n\t\t\t\t\tthis.classList.add(\"is-delete\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tconst displayNum = this.index + 1;\n\t\tconst formattedNum = displayNum.toLocaleString();\n\n\t\tif (displayNum >= 10000) {\n\n\t\t\tconst splitIndex = formattedNum.length - 4;\n\t\t\tconst prefixPart = formattedNum.substring(0, splitIndex + 1);\n\t\t\tconst suffixPart = formattedNum.substring(splitIndex + 1);\n\n\t\t\tthis.#mainTarget.innerHTML = `\n \t<span class=\"ng-row-prefix\">${prefixPart}</span>\n \t<span class=\"ng-row-suffix\">${suffixPart}</span>\n \t<div class=\"row-status\"></div>\n \t`;\n\t\t} else {\n\t\t\tthis.#mainTarget.innerHTML = `${formattedNum}`;\n\t\t}\n\n\t\tconst isSorted = this.sheet.querySelector(\"thead .asc,thead .desc\") ? true : false;\n\t\tconst isFitered = this.sheet.querySelector(\"thead nine-table-filter-button.filtered\") ? true : false;\n\n\t\tthis.#subTarget.innerHTML = row;\n\t\tthis.#subTarget.style.display = (isSorted || isFitered) ? \"\" : \"none\";\n\t};\n}\n\nif (!customElements.get('cell-row-indicator')) {\n\tcustomElements.define(\"cell-row-indicator\", CellRowIndicator);\n}","// ui/col/col-expand.js\nimport { COLLAPSED_WIDTH } from \"@/layout/core/TableCompiler.js\";\n\nexport class ColExpand extends HTMLElement {\n #sheet;\n #cell;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#cell = this.closest('th, td');\n this.#sheet = this.closest('nine-table-sheet');\n\n if (this.#cell) {\n this.#cell.style.position = 'relative';\n }\n\n const isCollapsed =\n this.getAttribute('collapsed') === 'true' ||\n this.#cell?.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n requestAnimationFrame(() => {\n this.collapse(true);\n });\n } else {\n this.classList.remove('collapsed');\n this.classList.add('expand');\n }\n\n this.removeEventListener('click', this.#onClick);\n this.addEventListener('click', this.#onClick);\n }\n\n #onClick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (this.classList.contains('expand')) {\n this.collapse();\n } else {\n this.expand();\n }\n };\n\n expand = () => {\n if (!this.#sheet?.colResizer || !this.#cell) return;\n const colIndex = parseInt(this.#cell.dataset.col, 10);\n const colSpan = this.#cell.colSpan || 1;\n\n this.classList.remove('collapsed');\n this.classList.add('expand');\n this.#cell.setAttribute('collapsed', 'false');\n this.#cell.style.color = '';\n\n const targetWidth = parseInt(this.#cell.dataset.expandWidth, 10) || 100;\n\n if (colSpan === 1) {\n this.#sheet.colResizer.setColumnWidth(colIndex, targetWidth);\n } else {\n const singleWidth = Math.max(30, Math.floor(targetWidth / colSpan));\n for (let i = 0; i < colSpan; i++) {\n this.#sheet.colResizer.setColumnWidth(colIndex + i, singleWidth);\n }\n }\n\n requestAnimationFrame(() => {\n if (typeof this.#sheet.refreshLayout === 'function') {\n this.#sheet.refreshLayout();\n }\n });\n };\n\n collapse = (isInitialInit = false) => {\n if (!this.#sheet?.colResizer || !this.#cell) return;\n const colIndex = parseInt(this.#cell.dataset.col, 10);\n const colSpan = this.#cell.colSpan || 1;\n\n if (this.classList.contains('expand')) {\n const col = this.#sheet.querySelector(`colgroup col[data-col=\"${colIndex}\"]`);\n const currentW = col ? parseInt(col.getAttribute('width'), 10) : 0;\n if (currentW > COLLAPSED_WIDTH) {\n this.#cell.dataset.expandWidth = String(currentW * colSpan);\n }\n }\n\n this.classList.remove('expand');\n this.classList.add('collapsed');\n this.#cell.setAttribute('collapsed', 'true');\n this.#cell.style.color = 'transparent';\n\n if (colSpan === 1) {\n this.#sheet.colResizer.setColumnWidth(colIndex, COLLAPSED_WIDTH);\n } else {\n const splitWidth = Math.max(10, Math.floor(COLLAPSED_WIDTH / colSpan));\n for (let i = 0; i < colSpan; i++) {\n this.#sheet.colResizer.setColumnWidth(colIndex + i, splitWidth);\n }\n }\n\n requestAnimationFrame(() => {\n if (typeof this.#sheet.refreshLayout === 'function') {\n this.#sheet.refreshLayout();\n }\n });\n };\n\n disconnectedCallback() {\n this.removeEventListener('click', this.#onClick);\n }\n}\n\nif (!customElements.get('nine-table-col-expand')) {\n customElements.define('nine-table-col-expand', ColExpand);\n}","import { trace } from \"@nopeer\";\nimport { ColFixManager } from \"@/col/ColFixManager.js\";\n\nexport class ContextMenu extends HTMLElement {\n #tableHost;\n #panel;\n\n connectedCallback() {\n const root = this.getRootNode();\n this.#tableHost = root instanceof ShadowRoot ? root.host : (this.closest('nine-table') || root.host);\n\n if (!this.#tableHost) {\n this.#tableHost = this.parentElement?.closest('nine-table') || this.assignedSlot?.closest('nine-table');\n }\n\n if (!this.#tableHost) return;\n }\n\n #onContextMenu = (e) => {\n const path = e.composedPath ? e.composedPath() : [];\n const targetCell = path.find(el => el.tagName === 'TH' || el.tagName === 'TD');\n\n if (!targetCell) return;\n\n const targetTable = path.find(el => el.tagName === 'TABLE') || targetCell.closest('table');\n\n e.preventDefault();\n e.stopPropagation();\n\n this.openMenu(e.clientX, e.clientY, targetCell, targetTable);\n };\n\n #getTargetSheet(targetCell) {\n return targetCell?.closest('nine-table-sheet') || this.#tableHost.activeSheet || this.#tableHost;\n }\n\n #getFixManager(targetCell) {\n const sheet = this.#getTargetSheet(targetCell);\n if (!sheet) return null;\n\n if (!sheet.colFix) {\n sheet.colFix = new ColFixManager(sheet);\n }\n return sheet.colFix;\n }\n\n #parseCustomMenuItems(containerElement, activeTable) {\n const items = [];\n const activeTableId = activeTable?.id;\n const allUls = Array.from(containerElement.querySelectorAll(':scope > ul'));\n\n allUls.forEach(rootUl => {\n const targetTableAttr = rootUl.getAttribute('target-table');\n\n if (!targetTableAttr || (activeTableId && targetTableAttr === activeTableId)) {\n const parsedList = this.#traverseUl(rootUl);\n items.push(...parsedList);\n }\n });\n\n return items;\n }\n\n #traverseUl(ulEl) {\n const list = [];\n Array.from(ulEl.children).forEach(child => {\n const tagName = child.tagName.toLowerCase();\n\n if (tagName === 'hr' || child.classList.contains('separator')) {\n list.push({ type: 'separator' });\n return;\n }\n\n if (tagName === 'li') {\n let name = '';\n const spanEl = child.querySelector(':scope > span');\n if (spanEl) {\n name = spanEl.textContent.trim();\n } else {\n name = Array.from(child.childNodes)\n .filter(n => n.nodeType === Node.TEXT_NODE)\n .map(n => n.textContent.trim())\n .join('');\n }\n\n const subUl = child.querySelector(':scope > ul');\n const item = {\n menuId: child.id || name,\n name: name,\n className: child.className || '',\n disabled: child.hasAttribute('disabled') || child.getAttribute('disabled') === 'true',\n isCustom: true\n };\n\n if (subUl) {\n item.items = this.#traverseUl(subUl);\n }\n\n list.push(item);\n }\n });\n return list;\n }\n\n #buildMenuItems(activeTable, isHeaderCell, targetCell) {\n const useDefault = this.getAttribute('use-default-menu') !== 'false';\n let rawItems = [];\n\n const customItems = this.#parseCustomMenuItems(this, activeTable);\n if (customItems.length > 0) {\n rawItems.push(...customItems);\n }\n\n const fixManager = this.#getFixManager(targetCell);\n const currentFixState = fixManager?.getFixState(targetCell, activeTable) ?? 'none';\n const isFixable = isHeaderCell && (fixManager?.canFixColumn(targetCell, activeTable) ?? false);\n\n let fixMenuItem = null;\n if (currentFixState === 'left' || currentFixState === 'right') {\n fixMenuItem = {\n menuId: 'unfix-column',\n name: 'Unfix Column',\n className: 'ng-menu-unfix-col',\n disabled: !isHeaderCell\n };\n } else {\n fixMenuItem = {\n menuId: 'fix-column',\n name: 'Fix Column',\n className: 'ng-menu-fix-col',\n disabled: !isFixable\n };\n }\n\n if (useDefault) {\n rawItems.push(\n { type: 'separator' },\n {\n menuId: 'sort',\n name: 'Sort',\n className: 'ng-menu-sort',\n disabled: !isHeaderCell\n },\n fixMenuItem,\n { type: 'separator' },\n { menuId: 'filtering', name: 'Filtering', className: 'ng-menu-filtering' },\n { menuId: 'maximize', name: 'Maximize', className: 'maximize' },\n {\n menuId: 'export',\n name: 'Export',\n className: 'export',\n items: [\n { menuId: 'export-excel', name: 'Excel', className: 'export-excel' },\n { menuId: 'export-pdf', name: 'PDF', className: 'export-pdf', disabled: true }\n ]\n },\n {\n menuId: 'properties',\n name: 'Options',\n className: 'options',\n items: [\n { menuId: 'show-title-bar', name: 'Title Bar Show/Hide', className: 'show-title-bar' },\n { menuId: 'show-status-bar', name: 'Status Bar Show/Hide', className: 'show-status-bar' },\n { menuId: 'auto-fit-col', name: 'Auto Fit Columns', className: 'auto-fit-col' }\n ]\n }\n );\n }\n\n const cleanedItems = [];\n rawItems.forEach((item) => {\n if (item.type === 'separator') {\n if (cleanedItems.length === 0 || cleanedItems[cleanedItems.length - 1].type === 'separator') {\n return;\n }\n }\n cleanedItems.push(item);\n });\n\n if (cleanedItems.length > 0 && cleanedItems[cleanedItems.length - 1].type === 'separator') {\n cleanedItems.pop();\n }\n\n return cleanedItems;\n }\n\n openMenu(x, y, targetCell, targetTable) {\n const targetParent = this.#tableHost.shadowRoot || this.#tableHost;\n\n if (!this.#panel) {\n this.#panel = document.createElement('nine-table-menu-panel');\n targetParent.appendChild(this.#panel);\n }\n\n const isHeaderCell = !!targetCell.closest('thead');\n const menuItems = this.#buildMenuItems(targetTable, isHeaderCell, targetCell);\n\n this.#panel.render(menuItems, (e) => this.#handleMenuClick(e, targetCell, targetTable));\n\n const targetSheet = this.#getTargetSheet(targetCell);\n this.#syncMenuStates(targetSheet);\n\n this.#panel.openAt(x, y);\n }\n\n #syncMenuStates(targetSheet) {\n if (!this.#panel || !targetSheet) return;\n\n const isFiltering = targetSheet.filtering?.isFiltering?.() || false;\n this.#panel.toggleItemState('filtering', 'on', isFiltering);\n\n const autoFit = this.#tableHost.getAttribute('auto-fit-col') === 'true';\n this.#panel.toggleItemState('auto-fit-col', 'on', autoFit);\n\n const showTitle = this.#tableHost.getAttribute('show-title-bar') === 'true';\n this.#panel.toggleItemState('show-title-bar', 'on', showTitle);\n }\n\n #handleMenuClick(e, targetCell, targetTable) {\n const menuId = e.menuId;\n\n const customEvent = new CustomEvent('menu-click', {\n detail: { menuId, targetCell, targetTable, originalEvent: e },\n bubbles: true,\n composed: true\n });\n this.dispatchEvent(customEvent);\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const targetSheet = this.#getTargetSheet(targetCell);\n\n switch (menuId) {\n case 'fix-column':\n case 'unfix-column':\n const fixManager = this.#getFixManager(targetCell);\n fixManager?.executeFixToggle(menuId, targetCell);\n break;\n\n case 'sort':\n if (!isNaN(baseCol)) {\n targetSheet.sorting?.handleSortFromMenu?.(baseCol, targetCell);\n }\n break;\n\n case 'filtering':\n targetSheet?.filtering?.toggle();\n break;\n\n case 'auto-fit-col':\n this.#tableHost.setAttribute('auto-fit-col', this.#tableHost.getAttribute('auto-fit-col') === 'true' ? 'false' : 'true');\n break;\n\n case 'show-title-bar':\n this.#tableHost.setAttribute('show-title-bar', this.#tableHost.getAttribute('show-title-bar') === 'true' ? 'false' : 'true');\n break;\n }\n\n this.#panel.close();\n }\n\n disconnectedCallback() {\n this.#tableHost?.removeEventListener('contextmenu', this.#onContextMenu);\n }\n}\n\nif (!customElements.get('nine-table-menu')) {\n customElements.define('nine-table-menu', ContextMenu);\n}","// ui/menu/nine-table-menu-panel.js\n\nexport class MenuPanel extends HTMLElement {\n #onCallback;\n #closeHandler = null;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n this.style.position = 'fixed';\n this.style.display = 'none';\n this.style.zIndex = '99999';\n\n this.innerHTML = `\n <div class=\"menu-wrapper\">\n <ul class=\"menu-container\"></ul>\n </div>\n `;\n }\n\n render(items, callback) {\n this.#onCallback = callback;\n const container = this.querySelector('.menu-container');\n if (!container) return;\n\n container.innerHTML = '';\n\n this.#appendItems(container, items);\n this.#bindClickEvents();\n }\n\n openAt(x, y, targetCell = null) {\n this.style.display = 'block';\n\n if (targetCell) {\n const cellRect = targetCell.getBoundingClientRect();\n const cellRightX = cellRect.right;\n\n requestAnimationFrame(() => {\n const wrapper = this.querySelector('.menu-wrapper');\n if (!wrapper) return;\n const panelWidth = wrapper.getBoundingClientRect().width;\n\n let calculatedLeft = cellRightX - panelWidth;\n\n if (calculatedLeft < 0) {\n calculatedLeft = cellRect.left;\n }\n\n const panelHeight = wrapper.getBoundingClientRect().height;\n let calculatedTop = y;\n if (y + panelHeight > window.innerHeight) {\n calculatedTop = y - panelHeight;\n }\n\n this.style.left = `${calculatedLeft}px`;\n this.style.top = `${calculatedTop}px`;\n });\n } else {\n this.style.left = `${x}px`;\n this.style.top = `${y}px`;\n\n requestAnimationFrame(() => {\n const wrapper = this.querySelector('.menu-wrapper');\n if (!wrapper) return;\n const rect = wrapper.getBoundingClientRect();\n\n if (x + rect.width > window.innerWidth) {\n this.style.left = `${x - rect.width}px`;\n }\n if (y + rect.height > window.innerHeight) {\n this.style.top = `${y - rect.height}px`;\n }\n });\n }\n\n if (this.#closeHandler) {\n window.removeEventListener('pointerdown', this.#closeHandler);\n }\n\n this.#closeHandler = (e) => {\n const path = e.composedPath ? e.composedPath() : [];\n if (!path.includes(this) && !this.contains(e.target)) {\n this.close();\n }\n };\n\n setTimeout(() => {\n window.addEventListener('pointerdown', this.#closeHandler);\n }, 0);\n }\n\n close() {\n this.style.display = 'none';\n if (this.#closeHandler) {\n window.removeEventListener('pointerdown', this.#closeHandler);\n this.#closeHandler = null;\n }\n }\n\n toggleItemState(menuId, className, condition) {\n const li = this.querySelector(`li[menu-id=\"${menuId}\"]`);\n if (li) {\n condition ? li.classList.add(className) : li.classList.remove(className);\n }\n }\n\n #appendItems(parentUl, items) {\n items.forEach(item => {\n if (item.type === 'separator') {\n const sep = document.createElement('li');\n sep.className = 'ng-menu-separator';\n parentUl.appendChild(sep);\n return;\n }\n\n const li = document.createElement('li');\n li.setAttribute('menu-id', item.menuId);\n li.className = `${item.className || ''} ${item.items ? 'submenu' : ''} ${item.disabled ? 'disabled' : ''}`.trim();\n\n const span = document.createElement('span');\n span.textContent = item.name;\n li.appendChild(span);\n\n if (item.items && item.items.length > 0) {\n const subUl = document.createElement('ul');\n subUl.className = 'ng-menu-sublist';\n this.#appendItems(subUl, item.items);\n li.appendChild(subUl);\n }\n\n parentUl.appendChild(li);\n });\n }\n\n #bindClickEvents() {\n this.querySelectorAll('li[menu-id]').forEach(li => {\n li.addEventListener('click', (e) => {\n e.stopPropagation();\n if (li.classList.contains('disabled')) return;\n\n const menuId = li.getAttribute('menu-id');\n this.#onCallback?.({ menuId, target: li });\n this.close();\n });\n });\n }\n\n disconnectedCallback() {\n this.close();\n }\n}\n\nif (!customElements.get('nine-table-menu-panel')) {\n customElements.define('nine-table-menu-panel', MenuPanel);\n}"],"mappings":"C,oUAAA,MAAM,UAAU,iBAAmB,SAAS,EAAQ,CAGhD,IAAIM,EAAQ,EACRC,EAAM,KAAK,OAAS,EACpBC,EAEJ,KAAOF,GAASC,GAAK,CAGjB,GAFA,EAAM,UAAUD,EAAQC,GAAO,CAAC,EAE5BE,IAAW,KAAKD,GAChB,OAAOA,EAEHC,EAAS,KAAKD,GACd,EAAMA,EAAM,EAEZ,EAAQA,EAAM,CAG1B,CAEA,MAAO,EACX,EAEA,IAAME,EAAuB,IAAI,QAEjC,YAAY,UAAU,yBAA2B,SAC7C,EACA,EACA,EACA,EACA,EAAe,IACjB,CACE,IAAMC,EAAK,KAEND,EAAqB,IAAIC,CAAE,GAC5BD,EAAqB,IAAIC,EAAI,CAAE,MAAO,KAAM,SAAU,IAAK,CAAC,EAEhE,IAAMC,EAAQF,EAAqB,IAAIC,CAAE,EAEzCA,EAAG,iBAAiBE,EAAe,GAAM,CACrC,EAAE,aAAe,EAAE,OAEnB,AAEID,EAAM,SADN,aAAaA,EAAM,KAAK,EACV,MAIlB,EAAM,MAAQ,eAAiB,CAC3B,EAAM,MAAQ,KACd,EAAM,SAAWE,EAAU,KAAKH,EAAI,CAAC,CACzC,EAAGI,CAAY,CACnB,CAAC,EAEDJ,EAAG,iBAAiBK,EAAgB,GAAM,CACtC,AAEIJ,EAAM,SADN,aAAaA,EAAM,KAAK,EACV,MAGlB,AAEIA,EAAM,YADNA,EAAM,SAAS,EACE,MAGrBK,EAAW,KAAKN,EAAI,CAAC,CACzB,CAAC,CACL,EAGA,KAAK,iBAAmB,EAAO,EAAQ,oBAAsB,CAEzD,GADI,OAAOO,GAAU,WAAU,GAAgB,IAC3C,CAACA,EAAO,MAAO,CAAE,MAAO,KAAM,OAAQ,IAAK,EAE/C,IAAMC,EAAa,GAAS,CACxB,IAAMC,EAAM,SAAS,cAAc,KAAK,EAExC,MADA,GAAI,UAAYC,EACTD,EAAI,aAAeA,EAAI,WAAa,EAC/C,EAEA,EAAQF,EAAM,WAAW;EAAM,MAAM,EAErC,IAAII,EAAS,SAAS,KAAK,cAAc,8BAA8B,EAClEA,IACD,EAAS,SAAS,cAAc,QAAQ,EACxC,EAAO,GAAK,wBACZ,EAAO,MAAM,QAAU,+EACvB,SAAS,KAAK,YAAYA,CAAM,GAGpC,IAAMC,EAAUD,EAAO,WAAW,IAAI,EACtC,EAAQ,KAAOE,EAEf,IAAIC,EAAI,EACJC,EAAI,EAER,IAAK,IAAIC,KAAKT,EAAM,MAAM,MAAM,EAAG,CAC/B,IAAMU,EAAYT,EAAUQ,CAAC,EACvBE,EAAUN,EAAQ,YAAYK,CAAS,EAE7C,EAAI,KAAK,IAAIH,EAAGI,EAAQ,KAAK,EAE7B,IAAMC,EAASD,EAAQ,uBAAyB,GAC1CE,EAAUF,EAAQ,wBAA0B,EAClD,GAAKC,EAASC,CAClB,CAEA,MAAO,CACH,MAAON,EACP,OAAQC,CACZ,CACJ,ECvGA,IAAaM,EAAQ,IAAI,cAPEhC,EAAAA,MAAY,WAAY,CAC/C,aAAc,CACV,MAAM,EACN,KAAK,KAAK,aAAc,OAAO,CACnC,CACJ,ECPakC,EAAa,CACtB,KAAM,CACF,MAAO,CACH,MAAO,EACP,UAAW,EACX,OAAQ,EACR,MAAO,CAGX,CACJ,EACA,UAAW,CACP,MAAO,EACP,OAAQ,EACR,OAAQ,EACR,OAAQ,EACR,OAAQ,CACZ,EACA,MAAO,CACH,KAAM,OACN,UAAW,YACX,YAAa,cACb,kBAAoB,mBACxB,CACJ,ECrBaC,EAAb,KAAmB,CAClB,GACA,GAAU,GAEV,YAAY,EAAQ,CACnB,KAAKC,GAAUC,CAChB,CAEA,IAAI,IAAK,CACR,OAAO,KAAKC,EACb,CACA,IAAI,GAAG,EAAG,CACT,KAAKA,GAAU,SAASX,EAAG,EAAE,CAC9B,CAEA,UAAc,KAAKS,GAAQ,WAAW,MACvC,EAEaG,EAAb,MAAaA,CAAO,CACnB,GACA,GACA,GAAU,EACV,GAAiB,CAAC,EAElB,OAAO,WAAa,CACnB,OAAQ,CAIT,EAEA,OAAO,UAAY,CAClB,MAAO,QACP,OAAQ,SACR,OAAQ,SACR,OAAQ,SACR,OAAQ,QACT,EAEA,YAAY,EAAM,EAAQ,CACzB,KAAKC,GAAQC,EACb,KAAKL,GAAUC,EACf,KAAKK,GAAY,CAClB,CAGA,QACoB,KAAKN,GAAQ,YAAc,CAAC,EAAA,CAC7B,OAAO,GAAQO,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,aAAeA,EAAW,UAAU,MAAM,EAG3G,IAAI,OAAQ,CACX,OAAO,KAAK,MACb,CAEA,UACQ,KAAK,OAGb,UAAY,EAAI,IAAU,CACzB,IAAMU,EAAe,KAAKC,GAAiB,EAE3C,GAAIC,GAA2B,KAC9B,OAAOF,EAGR,GAAIE,EAAK,GAAKA,GAAMF,EAAa,OAAQ,OAAO,KAEhD,IAAMG,EAAeH,EAAaE,GAElC,GAAIE,GAAS,KAAM,CAElB,IAAMC,EADS,KAAK,cACH,CAAC,CAAC,QAAQD,CAAK,EAChC,OAAQC,GAAO,EAAKF,EAAa,EAAEE,GAAO,IAC3C,CAEA,OAAOF,CACR,EAEA,UAAY,EAAU,EAAU,IAAU,CAEzC,IAAMG,EADe,KAAKL,GACC,CAAC,CAACM,GAEZD,EAAQ,EAAEE,KACVC,GAASH,EAAQ,KAAK,WAAaX,EAAO,UAAU,SACpE,EAAQ,KAAK,SAAWA,EAAO,UAAU,QAG1C,EAAQ,EAAEa,GAAYC,CACvB,EAGA,KAAO,EAAI,IAAU,CACpB,IAAMT,EAAe,KAAKC,GAAiB,EAE3C,GAAIC,GAA2B,KAC9B,OAAO,KAAKQ,GAAMV,CAAY,EAG/B,GAAIE,EAAK,GAAKA,GAAMF,EAAa,OAAQ,OAAO,KAEhD,IAAMG,EAAeH,EAAaE,GAC5BS,EAAS,KAAK,cAAc,EAElC,GAAIP,GAAS,KAAM,CAClB,IAAMC,EAAMM,EAAO,QAAQP,CAAK,EAChC,OAAQC,GAAO,EAAKF,EAAa,EAAEE,GAAO,IAC3C,CAEA,OAAO,KAAKK,GAAMP,CAAY,CAC/B,EAEA,WACQ,KAAKX,GAAQ,YAAc,CAAC,EAGpC,kBACQ,OAAO,KAAKI,GAAM,QAAQ,KAAQ,WAAa,KAAKA,GAAM,OAAO,IAAI,EAAI,CAAC,EAGlF,OAAoB,CACnB,KAAKgB,GAAiB,CAAC,EACvB,IAAMC,EAAmB,KAAKjB,GAAM,UAAY,CAAC,EACjD,MAAM,KAAKiB,CAAgB,CAAC,CAAC,QAAQ,GAAM,CAC1C,KAAKD,GAAe,KAAK7C,EAAG,wBAAwB,CAAC,CAAC,QAAU,EAAE,CACnE,CAAC,GAEA,KAAKyB,GAAQ,YAAc,CAAC,EAAA,CAAG,QAAQ,GAAK,CAC5C,AAAaT,EAAE,OAAO,KAAK+B,GAAgB,EAC3C,EAAE,KAAK,OAAS,KAAKF,GAAe,MAAM,CAC3C,CAAC,CACF,EAEA,IAAI,QAAS,CACZ,OAAO,KAAKF,GAAM,KAAKlB,GAAQ,UAAU,CAC1C,CACA,IAAI,OAAO,EAAG,CACb,KAAK,IAAIT,CAAC,CACX,CAEA,OAAoB,CACnB,KAAKa,GAAM,WAAW,iBAAiB,kBAAkB,CAAC,CAAC,QAAQ,GAAO,CACzEmB,EAAI,WAAW,CAChB,CAAC,EAED,KAAKnB,GAAM,WAAW,cAAc,0BAA0B,CAAC,EAAE,QAAQ,CAC1E,EAEA,IAAO,GAAe,CAErB,IAAMoB,MAAiB,CACtB,KAAKpB,GAAM,QAAU,GACrB,eAAiB,CAChB,GAAI,CACH,KAAK,MAAM,EACX,KAAK,IAAIqB,EAAY,EAAK,EAC1B,KAAKC,GAAY,CAClB,QAAU,CACT,KAAKtB,GAAM,QAAU,EACtB,CACD,CAAC,CACF,EAEI,KAAKA,GAAM,OACdoB,EAAS,EAGT,KAAKpB,GAAM,iBAAiBN,EAAW,MAAM,KAAM,GAAK,CACvD0B,EAAS,CACV,EAAG,CAAE,KAAM,EAAK,CAAC,CAInB,EAEA,IAAI,QAAS,CACZ,MAAO,MAAKG,IACb,CAEA,IAAI,QAAS,CACZ,OAAO,KAAKlB,GAAiB,CAAC,CAAC,MAChC,CAEA,IAAI,OAAQ,CACX,OAAO,KAAK,MACb,CAEA,aAAc,CACb,OAAO,KAAK,MACb,CAEA,IAAmB,EAAQ,KACnB,CACN,SAAUN,EAAO,UAAU,MAC3B,QAAS,GACT,SAAU,GACV,OAAQ,KAAKiB,GAAe,MAAM,EAClC,EAAG,CAAC,EACJ,EAAG,CAAC,EACJ,GAAI,CAAC,EAAG,EAAG,EAAG,EAAGjB,EAAO,UAAU,MAAO,GAAO,GAAO,GAAM,GAAO,GAAM,GAAM,GAAO,KAAKiB,GAAe,MAAM,EAAG,GAAI,CAAC,EAAG,CAAC,CAAC,EAC9H,EAAG,CAACQ,EAAO9B,EAAW,UAAU,MAAO,CAAC,EAAG,CAAC,CAAC,CAC9C,GAGD,UAAc,CACb,KAAKE,GAAQ,WAAa,CAAC,EAC3B,KAAK0B,GAAY,CAClB,EAEA,UAAc,CACb,KAAK1B,GAAQ,WAAa,CAAC,EACvB,KAAKA,GAAQ,aAAa,OAC7B,KAAKA,GAAQ,YAAY,MAAM,EAGhC,KAAK2B,GAAU,EAEf,KAAKD,GAAY,CAClB,EAEA,GAAe,GAAc,CACvB,MAAM,QAAQG,CAAS,IAAG,EAAY,CAACA,CAAS,GAErD,IAAMV,EAAS,KAAK,cAAc,CAAC,CAAC,OAAS,EAAI,KAAK,cAAc,EAAI,OAAO,KAAKU,EAAU,IAAM,CAAC,CAAC,EAChGC,EAAM,CAAC,EAUb,OARAD,EAAU,QAAQ,GAAQ,CACzB,IAAME,EAAI,CAAE,EAAG,CAAC,CAAE,EAClBZ,EAAO,QAAQ,GAAS,CACvBY,EAAE,EAAE,KAAKC,EAAKpB,KAAW,IAAA,IAAaoB,EAAKpB,KAAW,KAAOoB,EAAKpB,GAAS,EAAE,CAC9E,CAAC,EACDkB,EAAI,KAAKC,CAAC,CACX,CAAC,EAEMD,CACR,EAEA,GAAkB,IACZ,MAAM,QAAQA,CAAG,IAAG,EAAM,CAACA,CAAG,GACnCA,EAAI,QAAQ,GAAK,CAChB,IAAMF,EAAQ,KAAK,OAEnB,EAAE,EAAI,KAAKN,GAAgBM,CAAK,EAChC,EAAE,KAAOG,EAAE,EACX,EAAE,KAAK,MAAQH,EAGf,EAAE,EAAE,EAAE9B,EAAW,KAAK,MAAM,OAAS8B,EACrC,EAAE,EAAE,EAAE9B,EAAW,KAAK,MAAM,WAAaA,EAAW,UAAU,KAC/D,CAAC,EACMgC,GAGR,GAAoB,GACL,KAAK9B,GAAQ,WAAW,UAAU,GAC3C,CAACiC,GAAU,CAACA,EAAO,GAAK,CAACA,EAAO,EAAE,EAAU,GACzCA,EAAO,EAAE,EAAEnC,EAAW,KAAK,MAAM,SAAW8B,CAGzC,EAGZ,KAAO,EAAY,EAAc,KAAS,CACrCH,IAAe,IAAA,KAAW,EAAa,CAAC,GAC5C,IAAMK,EAAM,KAAKI,GAAYT,CAAU,EAEjCU,EAAe,KAAKC,GAAeN,CAAG,EAE5C,KAAK9B,GAAQ,WAAa,KAAKA,GAAQ,WAAW,OAAOmC,CAAY,EAErE,IAAME,EAAM,KAAK,MAAM,EAAI,EAe3B,OAdIC,GACHR,EAAI,SAAS,EAAG,IAAQ,CACvB,IAAMzD,EAAS,KAAK2B,GAAQ,WAAW,KAAKA,GAAQ,WAAW,OAAS,EAAIa,GACxExC,IAAQ,EAAO,EAAE,EAAEyB,EAAW,KAAK,MAAM,WAAaA,EAAW,UAAU,OAChF,CAAC,EAGF,KAAK4B,GAAY,EAEjB,KAAKtB,GAAM,cAAc,IAAI,YAAYN,EAAW,MAAM,UAAW,CACpE,QAAS,GACT,OAAQ,CAAE,OAAQ,KAAKM,GAAO,MAAO+B,EAAa,OAAS,EAAIA,EAAa,EAAE,CAAC,EAAE,EAAErC,EAAW,KAAK,MAAM,OAAS,IAAK,CACxH,CAAC,CAAC,EAEKuC,CACR,EAGA,QAAU,EAAO,EAAY,EAAc,KAAS,CAG/CZ,IAAe,IAAA,KAAW,EAAa,CAAC,GAC5C,IAAMK,EAAM,KAAKI,GAAYT,CAAU,EACvC,GAAIK,EAAI,SAAW,EAAG,MAAO,GAE7B,IAAIS,EAAc,KAAKC,GAAiBZ,CAAK,EASvCO,EAAe,KAAKC,GAAeN,CAAG,EAyB5C,OAnBA,KAAK9B,GAAQ,WAAW,OAAOuC,EAAa,EAAG,GAAGJ,CAAY,EAE1DG,GACHH,EAAa,SAAS,EAAG,IAAQ,CAChC,IAAM9D,EAAS,KAAK2B,GAAQ,WAAWuC,EAAc1B,GAEjDxC,GAAUA,EAAO,GAAKA,EAAO,EAAE,IAClC,EAAO,EAAE,EAAEyB,EAAW,KAAK,MAAM,WAAaA,EAAW,UAAU,OAErE,CAAC,EAGF,KAAK4B,GAAY,EAEjB,KAAKtB,GAAM,cAAc,IAAI,YAAYN,EAAW,MAAM,UAAW,CACpE,QAAS,GACT,OAAQ,CAAE,OAAQ,KAAKM,GAAO,MAAO+B,EAAa,OAAS,EAAIA,EAAa,EAAE,CAAC,EAAE,EAAErC,EAAW,KAAK,MAAM,OAAS,IAAK,CACxH,CAAC,CAAC,EAEKqC,EAAa,EAAE,CAAC,EAAE,EAAErC,EAAW,KAAK,MAAM,MAClD,EAEA,OAAU,GAAM,CACf,IAAIgC,EAAM,CAAC,EACX,AAKCA,EALG,MAAM,QAAQvC,CAAC,EACZ,GAIA,CAAC,SAASA,EAAG,EAAE,CAAC,EAGvB,IAAIkD,EAAW,CAAC,EAChBX,EAAI,QAAQ,GAAS,CACpBW,EAAS,KAAK,KAAKD,GAAiBZ,CAAK,CAAC,CAC3C,CAAC,EAED,IAAMc,EAAU,KAAK1C,GAAQ,WAE7ByC,EAAS,MAAM,EAAG,IAAME,EAAIC,CAAC,CAAC,CAAC,QAAQ,GAAS,CAE9C,IAAMC,EAAWH,EAAQI,EAAM,CAAC,EAAE,EAAEhD,EAAW,KAAK,MAAM,OAEtD4C,EAAQI,EAAM,CAAC,EAAE,EAAEhD,EAAW,KAAK,MAAM,aAAeA,EAAW,UAAU,OAChF,KAAKE,GAAQ,WAAa,KAAKA,GAAQ,WAAW,OAAO,GAAQO,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,SAAW+C,CAAQ,EAEnH,KAAK7C,GAAQ,WAAW,QAAQ,GAAQ,CACnCO,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,SAAW+C,IAC7C,EAAK,EAAE,EAAE/C,EAAW,KAAK,MAAM,WAAaA,EAAW,UAAU,OAEnE,CAAC,CAGJ,CAAC,EAED,KAAK4B,GAAY,EAEjB,KAAKtB,GAAM,cAAc,IAAI,YAAYN,EAAW,MAAM,YAAa,CACtE,QAAS,GACT,OAAQ,CAAE,OAAQ,KAAKM,GAAO,MAAO0B,EAAI,OAAS,EAAIA,EAAI,GAAK,IAAK,CACrE,CAAC,CAAC,CACH,EAEA,UAAY,EAAO,EAAO,IAAU,CAEnC,EAAQ,SAASF,EAAO,EAAE,EAE1B,IAAMmB,EADS,KAAK,cACC,CAAC,CAAC,QAAQnC,CAAK,EACpC,GAAImC,EAAU,EAAG,OAEjB,IAAMD,EAAQ,KAAKN,GAAiBZ,CAAK,EAGnCd,EADU,KAAKd,GAAQ,WACL8C,GACnBhC,IAEYA,EAAQ,EAAEiC,KACV9B,GAASH,EAAQ,EAAE,EAAEhB,EAAW,KAAK,MAAM,aAAeA,EAAW,UAAU,SAC/F,EAAQ,EAAE,EAAEA,EAAW,KAAK,MAAM,WAAaA,EAAW,UAAU,QAGrE,EAAQ,EAAEiD,GAAW9B,EACtB,EAEA,eAAkB,GAAa,CAE9B,IAAMyB,EAAU,KAAK1C,GAAQ,WAM5B,OAJGgD,EACI,KAAK9B,GAAOwB,EAAQ,OAAO,GAAiBnC,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,aAAekD,CAAY,CAAE,EAGxG,CACN,EAAG,KAAK9B,GAAOwB,EAAQ,OAAO,GAAiBnC,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,aAAeA,EAAW,UAAU,MAAU,CAAE,EAC9H,EAAG,KAAKoB,GAAOwB,EAAQ,OAAO,GAAiBnC,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,aAAeA,EAAW,UAAU,MAAU,CAAE,EAC9H,EAAG,KAAKoB,GAAOwB,EAAQ,OAAO,GAAiBnC,EAAK,EAAE,EAAET,EAAW,KAAK,MAAM,aAAeA,EAAW,UAAU,MAAU,CAAE,CAC/H,CAEF,EAEA,GAAS,GAAQ,CAChB,GAAI,CAACgC,EAAK,OAAOA,EAEjB,IAAMmB,EAAW,CAAC,MAAM,QAAQnB,CAAG,EAC7BoB,EAAYD,EAAW,CAACnB,CAAG,EAAIA,EAC/BX,EAAS,KAAK,cAAc,EAE5BgC,EAASD,EAAU,OAAO,GAAK,CAACnB,EAAE,MAAM,OAAO,CAAC,CAAC,IAAI,GAAK,CAC/D,IAAM,EAAI,CAAC,EAKX,OAJAZ,EAAO,SAAS,EAAO,IAAM,CAC5B,EAAEP,GAASmB,EAAE,EAAIA,EAAE,EAAEqB,GAAKrB,EAAEnB,EAC7B,CAAC,EACD,EAAE,KAAOmB,EAAE,KACJ,CACR,CAAC,EAED,OAAOkB,EAAWE,EAAO,GAAKA,CAC/B,CACD,EC9aaE,EAAb,KAA2B,CAC1B,GAEA,YAAY,EAAM,CACjB,KAAKjD,GAAQC,EAEb,KAAK,IAAM,IAAIN,EAAM,IAAI,EACzB,KAAK,KAAO,IAAII,EAAO,KAAKC,GAAO,IAAI,EAEvC,KAAK,WAAa,CAAC,EACnB,KAAK,YAAc,CAAC,EACpB,KAAK,WAAa,CAAC,EACnB,KAAK,QAAU,GAEf,KAAK,YAAY,UAAc,CAC1B,KAAKA,GAAM,MAAM,QAAQ,KAAKA,GAAM,KAAK,OAAO,CACrD,EAEA,KAAK,cAAiB,GAAO,CACxB,KAAK,MAAM,KAAK,KAAK,MAAM,EAE/B,KAAK,WAAa,CAAC,EACnB,KAAK,YAAc,CAAC,EACpB,KAAK,WAAa,CAAC,EAEnB,KAAK,KAAK,IAAIkD,GAAM,CAAC,CAAC,CACvB,EAEA,KAAK,YAAe,GAAS,CAC5B,IAAMC,EAAS,SAASC,EAAM,EAAE,EAChC,GAAI,KAAU,KAAK,KAAK,MAAM,GAC9B,OAAO,KAAK,KAAK,aAAa,CAAC,CAACD,EAAO,EAAE,MAAM,QAChD,EAEA,KAAK,mBAAuB,KAAK,IAAI,GACrC,KAAK,eAAkB,GAAS,CAAE,KAAK,IAAI,GAAKC,CAAM,EAEtD,KAAK,WAAa,EAAQ,IAAU,KAAK,KAAK,IAAIC,EAAQ7C,CAAK,EAE/D,KAAK,WAAa,EAAQ,EAAO,IAAM,CACtC,EAAS,SAAS6C,EAAQ,EAAE,EAC5B,KAAK,KAAK,SAASA,EAAQ7C,EAAOrB,CAAC,CACpC,EAGA,KAAK,cAAc,CAAC,CAAC,CACtB,CACD,EC/Ca4B,EAAb,KAAoB,CACnB,GACA,GAAU,CAAC,EAEX,YAAY,EAAM,CACjB,KAAKf,GAAQC,EACb,KAAKqD,GAAM,CACZ,CAEA,KAAM,CACL,OAAO,KAAKC,GAAQ,IAAI,GAAKC,EAAE,IAAI,CACpC,CAEA,WAAY,CACX,OAAO,KAAKD,EACb,CAEA,QAAQ,EAAW,CAClB,IAAME,EAAQ,KAAKF,GAAQ,KAAK,GAAKC,EAAE,OAASE,CAAS,EACzD,OAAOD,EAAQA,EAAM,KAAO,QAC7B,CAEA,KAAO,EAAK,EAAO,WAAa,CAC/B/B,EAAI,QAAQ,GAAS,CACf,KAAK6B,GAAQ,KAAK,GAAKC,EAAE,OAASG,CAAK,GAC3C,KAAKJ,GAAQ,KAAK,CAAE,KAAMI,EAAa,MAAK,CAAC,CAE/C,CAAC,EACD,KAAKC,GAAQ,CACd,EAEA,QAAQ,EAAG,CACV,OAAO,KAAKL,GAAQ,UAAU,GAAKC,EAAE,OAASrE,CAAC,CAChD,CAEA,SAAS,EAAG,CACX,OAAO,KAAKoE,GAAQ,KAAK,GAAKC,EAAE,OAASrE,CAAC,CAC3C,CAEA,OAAgB,CACf,IAAM0E,EAAM,IAAI,IAChB,KAAKN,GAAQ,QAAQ,GAAK,CACzBM,EAAI,IAAIL,EAAE,KAAMA,EAAE,IAAI,CACvB,CAAC,EAED,KAAKD,GAAU,MAAM,KAAKM,GAAM,CAACC,EAAMC,MAAW,CAAE,OAAM,MAAK,EAAE,EAEjE,KAAKR,GAAU,KAAKA,GAAQ,OAAO,GAAKC,EAAE,OAAS,IAAMA,EAAE,OAAS,MAAM,EAE1E,KAAKD,GAAQ,MAAM,EAAG,IAAgBf,EAAE,KAAK,OAASD,EAAE,KAAK,OAAU,EAAI,EAAK,CACjF,EAEA,OAAc,CACb,KAAKgB,GAAU,CAAC,EAEhB,IAAMS,EAAY,MAAM,KAAK,KAAKhE,GAAM,iBAAiB,OAAO,CAAC,EAEjE,GAAKgE,GAAaA,EAAU,SAAW,EAEvC,KAAK,IAAMC,KAAOD,EAEjBC,EAAI,iBAAiB,aAAa,CAAC,CAAC,QAAS,GAAO,CACnD,IAAMP,EAAYvF,EAAG,QAAQ,KACvB+F,EAAY/F,EAAG,aAAa,WAAW,GAAK,SAE9CuF,GACH,KAAKH,GAAQ,KAAK,CAAE,KAAMG,EAAW,KAAMQ,CAAU,CAAC,CAExD,CAAC,EAQD,CALC,YAAa,mBAAoB,QAAS,UAC1C,UAAW,WAAY,gBAAiB,eACxC,aAAc,aAAc,UAGrB,CAAC,CAAC,QAAQ,GAAQ,CACzBD,EAAI,iBAAiB,IAAIE,EAAK,EAAE,CAAC,CAAC,QAAS,GAAO,CACjD,IAAIC,EAAOjG,EAAG,aAAagG,CAAI,EAC/B,GAAKC,EAEL,IAAIA,EAAK,QAAQ,OAAO,EAAI,EAAG,CAC9B,IAAMC,EAAYD,EAAK,OAAO,MAAM,EAEpC,GAAIC,EAAY,EACf,GAAI,CACH,EAAO,OAAO,OAAOD,EAAK,UAAU,EAAGC,CAAS,CAAC,CAAC,KAAK,EAAE,CAC1D,MAAY,CACX,EAAO,EACR,CAEF,CAEAD,EAAK,MAAM,OAAO,CAAC,CAAC,QAAQ,GAAK,CAChC,GAAIjF,EAAE,KAAK,GAAK,GAAI,CACnB,IAAMkF,EAAYlF,EAAE,OAAO,gBAAgB,EACvCmF,EAAc,GAEdD,GAAa,EAChB,EAAclF,EAAE,UAAU,EAAGkF,CAAS,EAC5BD,EAAK,WAAW,OAAO,IACjC,EAAcjF,EAAE,QAAQ,QAAS,EAAE,GAGhCmF,GACH,KAAKf,GAAQ,KAAK,CAAE,KAAMe,EAAa,KAAM,QAAS,CAAC,CAEzD,CACD,CAAC,CAjBD,CAkBD,CAAC,CACF,CAAC,EAGF,KAAKV,GAAQ,CAFb,CAGD,CACD,ECrHaW,EAAb,cAAqC,WAAY,CAC7C,aAAc,CACV,MAAM,CACV,CAEA,mBAAoB,CAChB,KAAKjB,GAAM,CACf,CAEA,OAAc,CAEd,CAEJ,EAEK,eAAe,IAAI,mBAAmB,GACvC,eAAe,OAAO,oBAAqBiB,CAAe,EChB9D,IAAaC,EAAb,cAA2C,WAAY,CACnD,GAEA,aAAc,CACV,MAAM,CACV,CAEA,mBAAoB,CAChB,KAAKlB,GAAM,CACf,CAEA,YAAgB,CACZ,KAAK,cAAc,YAAY,CAAC,CAAC,UAAY,KAAKtD,GAAM,KAAK,MAAM,CAAC,CAAC,eAAe,CACxF,EAEA,OAAc,CACV,KAAKA,GAAQ,KAAK,YAAY,CAAC,CAAC,KAEhC,KAAKyE,GAAQ,EAEb,KAAK,cAAc,eAAe,CAAC,EAAE,iBAAiB,QAAU,GAAM,CAClE,IAAMC,EAAgB,EAAE,SAAW,EAAE,SAAW,EAAE,SAC5CC,EAAU,EAAE,OAAO,QAAQ,oBAAoB,EAErD,GAAI,CAACA,EAAS,OAEd,IAAMjC,EAAQ,SAASiC,EAAQ,QAAQ,MAAO,EAAE,EAChD,KAAKC,GAAalC,EAAOgC,CAAa,CAC1C,CAAC,EAED,eAAiB,CACb,KAAKE,GAAa,EAAG,EAAK,CAC9B,CAAC,CACL,EAEA,IAAgB,EAAO,EAAgB,KAAU,CAE7C,IAAMC,MAAwB,CAC1B,IAAMC,EAAS,MAAM,KAAK,KAAK9E,GAAM,WAAW,iBAAiB,kBAAkB,CAAC,EAGpF,MAFwB,KAAK,KAAKA,GAAM,WAAW,iBAAiB,eAAe,CAE3E,CAAC,CAAC,QAAQ,GAAK+E,EAAE,MAAM,YAAY,UAAW,MAAM,CAAC,EAE7D,IAAMC,EAAeF,EAChB,KAAK,EAAO,KAAS,CAAE,QAAO,KAAI,EAAE,CAAC,CACrC,QAAQ,CAAE,WAAYG,EAAM,UAAU,SAAS,QAAQ,CAAC,EAE7D,GAAI,IAAa,OAAS,GAE1B,IAAK,IAAIjC,EAAI,EAAGA,EAAIgC,EAAa,OAAS,EAAG,IAAK,CAC9C,IAAME,EAAaF,EAAahC,EAAE,CAAC,IAE7BmC,EAAiB,KAAKnF,GAAM,WAAW,cAAc,mCAAmCkF,EAAW,GAAG,EACxGC,GACAA,EAAe,MAAM,YAAY,UAAW,EAAE,CAEtD,CACJ,EAEMC,EAAS,KAAK,cAAc,eAAe,EAC3CC,EAAO,KAAKrF,GAAM,WAAW,cAAc,wBAAwB,EACnEsF,EAAWF,EAAO,iBAAiB,oBAAoB,EACvDG,EAAgBF,EAAK,iBAAiB,kBAAkB,EAE9D,GAAI,CAACC,EAAS5C,GAAQ,OAEtB,GAAI,CAACgC,EACDY,EAAS,SAAS,EAAK,IAAQ,CAC3BE,EAAI,UAAU/E,IAAQiC,CAAK,CAC/B,CAAC,EAED6C,EAAc,SAAS,EAAO,IAAQ,CAClC,IAAME,EAAWhF,IAAQiC,EACzBuC,EAAM,UAAU,OAAO,SAAUQ,CAAQ,EACzC,EAAM,MAAM,KAAOA,EAAW,WAAa,EAC/C,CAAC,MACE,CACH,IAAMC,EAAaJ,EAAS5C,GACtBiD,EAAaP,EAAO,iBAAiB,2BAA2B,EAEtE,GAAIM,EAAW,UAAU,SAAS,QAAQ,GAAKC,EAAW,QAAU,EAChE,OAGJD,EAAW,UAAU,OAAO,QAAQ,EACpC,IAAME,EAAcP,EAAK,cAAc,gCAAgC3C,EAAM,GAAG,EAC5EkD,IACAA,EAAY,UAAU,OAAO,QAAQ,EAChCA,EAAY,UAAU,SAAS,QAAQ,IACxC,EAAY,MAAM,KAAO,IAGrC,CAEA,IAAMZ,EAAeK,EAAK,iBAAiB,yBAAyB,EAEpEL,GAAc,QAAQ,GAAS,CAC3B,EAAM,MAAM,KAAQA,EAAa,OAAS,EAAK,SAAW,WAEtD,OAAOC,EAAM,eAAkB,WAC/BA,EAAM,cAAc,EAEpBA,EAAM,aAAa,CAE3B,CAAC,EAEDJ,EAAgB,CACpB,EAEA,IAAU,CAIN,IAAMgB,EAHc,MAAM,KAAK,KAAK7F,GAAM,QACd,CAAC,CAAC,OAAO,GAAO7B,EAAG,QAAQ,YAAY,IAAM,OAEhD,CAAC,CAAC,KAAK,EAAO,IAI5B,8BAHWsC,IAAQ,EAAI,SAAW,GAGM,gBAAgBA,EAAI,IAFnDqF,EAAM,aAAa,SAAS,GAAK,SAASrF,EAAM,IAEe,sBAClF,CAAC,CAAC,KAAK,EAAE,EAEV,KAAK,UAAY;wCACeoF,EAAS;;SAG7C,CACJ,EAEaE,EAAb,cAAkC,WAAY,CAC1C,aAAc,CACV,MAAM,CACV,CAEA,mBAAoB,CAEpB,CAEA,UAAU,EAAU,CAChB,KAAK,UAAU,OAAO,SAAUN,CAAQ,CAC5C,CACJ,EAEK,eAAe,IAAI,oBAAoB,GACxC,eAAe,OAAO,qBAAsBM,CAAY,EAGvD,eAAe,IAAI,0BAA0B,GAC9C,eAAe,OAAO,2BAA4BvB,CAAqB,EChJ3E,IAAawB,EAAb,cAA6B,WAAY,CACrC,GACA,GAEA,mBAAoB,CAChB,KAAKhG,GAAQ,KAAK,YAAY,CAAC,CAAC,KAChC,KAAKyE,GAAQ,EACb,KAAKwB,GAAY,CACrB,CAEA,IAAU,CACN,KAAK,UAAY;;;;;;;;;;;;;UAejB,KAAKC,GAAmB,KAAK,cAAc,mBAAmB,EAC9D,KAAKC,GAAmB,CAC5B,CAEA,IAAqB,CACjB,IAAMC,EAAW,KAAKpG,GAAM,aAAa,OAAO,IAAM,UAAY,KAAKA,GAAM,UAAU,SAAS,QAAQ,EAClGqG,EAAc,KAAKrG,GAAM,aAAa,cAAc,IAAM,QAC1DsG,EAAW,KAAKtG,GAAM,aAAa,WAAW,IAAM,QACpDuG,EAAU,KAAKvG,GAAM,aAAa,SAAS,GAAK,GAElDoG,GAAY,CAACC,EACb,KAAK,aAAa,SAAU,EAAE,EAE9B,KAAK,gBAAgB,QAAQ,EAGjC,KAAK,aAAa,YAAaC,EAAW,OAAS,OAAO,EAC1D,KAAK,cAAcC,CAAO,CAC9B,CAEA,IAAc,CACV,IAAMC,EAAU,KAAK,cAAc,mBAAmB,EAClDA,GACAA,EAAQ,iBAAiB,eAAkB,CACvC,IAAMC,EAAO,sDACPC,EAAiB,KAAK1G,GAAM,aAAa,SAAS,GAAK,GAC7D,EAAQ,UAAYwG,EAAQ,YAAcC,EAAOC,EAAiBD,CACtE,CAAC,EAGL,IAAME,EAAU,KAAK,cAAc,sBAAsB,EACrDA,GACAA,EAAQ,iBAAiB,YAAe,CACpC,KAAK3G,GAAM,cAAc,IAAI,YAAY,qBAAsB,CAC3D,QAAS,GACT,SAAU,GACV,OAAQ,CAAE,YAAa,KAAKA,EAAM,CACtC,CAAC,CAAC,CACN,CAAC,CAET,CAEA,iBAAiB,EAAS,CAClB,KAAKkG,IACL,KAAKA,GAAiB,OAAOU,CAAO,CAE5C,CAEA,cAAc,EAAM,CAChB,IAAMJ,EAAU,KAAK,cAAc,mBAAmB,EAClDA,IAAS,EAAQ,YAAcK,EACvC,CACJ,EAEK,eAAe,IAAI,oBAAoB,GACxC,eAAe,OAAO,qBAAsBb,CAAO,EChFvD,IAAac,EAAb,cAAyC,WAAY,CACjD,GACA,GAAY,GACZ,GACA,GACA,GACA,GAEA,aAAc,CACV,MAAM,CACV,CAEA,mBAAoB,CAEhB,GADA,KAAKC,GAAS,KAAK,QAAQ,kBAAkB,GAAK,KAAK,YAAY,CAAC,CAAC,KACjE,CAAC,KAAKA,GAAQ,OAElB,KAAK,UAAY;;;;UAMjB,IAAMC,MAAsB,CACxB,IAAM3B,EAAO,KAAK0B,GAAO,cAAc,mCAAmC,EACrE1B,GAKL,KAAK4B,GAAY,CACb,UAAY5B,EACZ,MAAY,KAAK,cAAc,eAAe,EAC9C,MAAY,KAAK,cAAc,eAAe,EAC9C,KAAY,KAAK,cAAc,cAAc,EAC7C,MAAY,KAAK,cAAc,eAAe,CAClD,EAEA,KAAK/B,GAAM,EACX,KAAK4D,GAAe,EACpB,KAAK,QAAQ,GAdT,WAAWF,EAAe,EAAE,CAepC,EAEAA,EAAc,CAClB,CAEA,sBAAuB,CACf,KAAKG,IACL,KAAKA,GAAgB,WAAW,CAExC,CAEA,OAAuB,CACnB,GAAI,CAAC,KAAKJ,GAAQ,OAClB,IAAM1B,EAAO,KAAK0B,GAAO,cAAc,mCAAmC,EACrE1B,IAEL,KAAK8B,GAAkB,IAAI,mBAAqB,CAC5C,KAAK,QAAQ,CACjB,CAAC,EACD,KAAKA,GAAgB,QAAQ9B,CAAI,EACrC,EAEA,YAAgB,CAEZ,GAAI,CAAC,KAAK0B,IAAU,CAAC,KAAKE,IAAa,KAAKG,GAAW,OAEvD,IAAM/B,EAAO,KAAK4B,GAAU,UACtBnB,EAAQT,EAAK,cAAc,OAAO,EACxC,GAAI,CAACS,EAAO,OAEZ,IAAMuB,EAAQ,KAAKJ,GAAU,MACvBK,EAAQ,KAAKL,GAAU,MAEvBM,EAAYlC,EAAK,YACjBmC,EAAa1B,EAAM,YAEnB2B,EAAgBF,IAAc,GAAKC,EAAaD,EAGtD,GAFA,KAAKR,GAAO,UAAU,OAAO,kBAAmBU,CAAY,EAExD,CAACA,EACD,OAGJ,IAAMC,EAAaL,EAAM,YACzB,GAAIK,GAAc,EAAG,OAErB,IAAMC,EAAa,KAAK,IAAI,KAAK,IAAkBJ,EAAYC,EAA1BE,EAAuCA,CAAU,EAAG,EAAE,EAC3F,EAAM,MAAM,MAAQ,GAAGC,EAAW,IAElC,IAAMC,EAAcvC,EAAK,WACnBwC,EAAgBL,EAAaD,EAE/BO,EAAI,EACJD,EAAgB,IAChB,EAAI,SAAUD,EAAcC,GAAkBH,EAAaC,GAAa,EAAE,GAE1EG,EAAI,IAAG,EAAI,GAEf,IAAMC,EAAeL,EAAaC,EAC9BG,EAAIC,IAAc,EAAIA,GAE1B,EAAM,MAAM,KAAO,GAAGD,EAAE,IAExB,KAAKb,GAAU,KAAK,SAAYa,IAAM,EACtC,KAAKb,GAAU,MAAM,SAAYa,GAAKC,EAAe,CACzD,EAEA,GAAgB,GAAM,CAClB,GAAI,CAAC,KAAKd,GAAW,MAAO,GAE5B,IAAM5B,EAAO,KAAK4B,GAAU,UACtBnB,EAAQT,EAAK,cAAc,OAAO,EACxC,GAAI,CAACS,EAAO,MAAO,GAEnB,IAAMkC,EAAa,KAAKf,GAAU,MAAM,sBAAsB,EACxDU,EAAa,KAAKV,GAAU,MAAM,YAEpCgB,EAAUC,EACVD,EAAU,IAAG,EAAU,GAC3B,IAAMF,EAAeC,EAAW,MAAQL,EACpCM,EAAUF,IAAc,EAAUA,GACtC,EAAU,SAASE,EAAS,EAAE,EAE9B,KAAKhB,GAAU,MAAM,MAAM,KAAO,GAAGgB,EAAQ,IAE7C,KAAKhB,GAAU,KAAK,SAAYgB,IAAY,EAC5C,KAAKhB,GAAU,MAAM,SAAYgB,GAAWF,EAAe,EAE3D,IAAMR,EAAYlC,EAAK,YAEjBwC,EADa/B,EAAM,YACUyB,EAOnC,OALIQ,EAAe,GAAKF,EAAgB,IAEpC,EAAK,WADkBI,EAAUF,EAAgBF,GAI7CI,EAAU,GAAKA,EAAUF,EAAe,CACpD,EAEA,OAAc,CACV,IAAMI,EAAe,GAAQ,CACzB,cAAc,KAAKC,EAAU,EAC7B,cAAc,KAAKC,EAAU,EAE7B,IAAMC,EAAY,SAAS,KAAKrB,GAAU,MAAM,MAAM,MAAQ,EAAG,EAAE,EACnE,KAAKsB,GAAaD,EAAYE,CAAG,EAEjC,KAAKJ,GAAa,gBAAkB,CAChC,cAAc,KAAKA,EAAU,EAE7B,KAAKC,GAAa,gBAAkB,CAChC,IAAMI,EAAmB,SAAS,KAAKxB,GAAU,MAAM,MAAM,MAAQ,EAAG,EAAE,EACrE,KAAKsB,GAAaE,EAAmBD,CAAG,GACzC,cAAc,KAAKH,EAAU,CAErC,EAAG,EAAE,CACT,EAAG,GAAG,CACV,EAEMK,MAAmB,CACrB,cAAc,KAAKN,EAAU,EAC7B,cAAc,KAAKC,EAAU,CACjC,EAGA,CAAC,UAAW,YAAY,CAAC,CAAC,QAAQ,GAAO,CACrC,KAAKpB,GAAU,KAAK,iBAAiB0B,EAAKD,CAAU,EACpD,KAAKzB,GAAU,MAAM,iBAAiB0B,EAAKD,CAAU,EACrD,KAAKzB,GAAU,MAAM,iBAAiB0B,EAAKD,CAAU,CACzD,CAAC,EAED,KAAKzB,GAAU,KAAK,iBAAiB,YAAa,GAAK,CAAM2B,EAAE,SAAW,GAAWT,EAAY,GAAG,CAAG,CAAC,EACxG,KAAKlB,GAAU,MAAM,iBAAiB,YAAa,GAAK,CAAM2B,EAAE,SAAW,GAAWT,EAAY,EAAE,CAAG,CAAC,EAIxG,KAAKlB,GAAU,MAAM,iBAAiB,YAAa,GAAK,CACpD,GAAI,EAAE,SAAW,EAAG,OACpB,EAAE,eAAe,EACjB,IAAM4B,EAAY,KAAK5B,GAAU,MAAM,sBAAsB,EACvDU,EAAa,KAAKV,GAAU,MAAM,YACxC,KAAKsB,GAAa,EAAE,QAAUM,EAAU,KAAQlB,EAAa,CAAE,CACnE,CAAC,EAED,KAAKV,GAAU,MAAM,iBAAiB,YAAa,GAAK,CACpD,GAAI,EAAE,SAAW,EAAG,OACpB,EAAE,gBAAgB,EAClB,EAAE,eAAe,EACjB,KAAKG,GAAY,GACjB,KAAK,OAAS,EAAE,QAAU,KAAKH,GAAU,MAAM,sBAAsB,CAAC,CAAC,KAEvE,IAAM6B,EAAe,GAAc,CAC/B,GAAI,CAAC,KAAK1B,GAAW,OACrB,IAAMyB,EAAY,KAAK5B,GAAU,MAAM,sBAAsB,EAC7D,KAAKsB,GAAaQ,EAAU,QAAUF,EAAU,KAAO,KAAK,MAAM,CACtE,EAEMG,MAAkB,CACpB,KAAK5B,GAAY,GACjBsB,EAAW,EACX,SAAS,oBAAoB,YAAaI,CAAW,EACrD,SAAS,oBAAoB,UAAWE,CAAS,EACjD,KAAK,QAAQ,CACjB,EAEA,SAAS,iBAAiB,YAAaF,CAAW,EAClD,SAAS,iBAAiB,UAAWE,CAAS,CAClD,CAAC,CACL,CACJ,EAEK,eAAe,IAAI,uBAAuB,GAC3C,eAAe,OAAO,wBAAyBlC,CAAmB,ECrNtE,IAAamC,EAAb,cAAyC,WAAY,CACjD,GACA,GACA,GAAY,GACZ,GACA,GAAU,EAEV,GAAiB,EAEjB,aAAc,CACV,MAAM,CACV,CAEA,mBAAoB,CAChB,KAAKjJ,GAAQ,KAAK,YAAY,CAAC,CAAC,KAChC,KAAKkJ,GAAS,KAAK,QAAQ,kBAAkB,EAE7C,KAAK,UAAY;;;;UAMjB,IAAMlC,MAAsB,CACxB,IAAM3B,EAAO,KAAK6D,GAAO,cAAc,gBAAgB,EAClD7D,GAKL,KAAK4B,GAAY,CACb,UAAW5B,EACX,MAAO,KAAK,cAAc,eAAe,EACzC,MAAO,KAAK,cAAc,eAAe,EACzC,IAAK,KAAK,cAAc,aAAa,EACrC,OAAQ,KAAK,cAAc,gBAAgB,CAC/C,EAEA,KAAK/B,GAAM,EACX,KAAK,QAAQ,GAbT,WAAW0D,EAAe,EAAE,CAcpC,EAEAA,EAAc,CAClB,CAEA,OAAsB,CAClB,IAAMmC,EAAc,KAAKD,GAAO,KAAK,SAAS,EACxCE,EAAaD,EAAcA,EAAY,OAAS,EAEhDE,EAAe,KAAKH,GAAO,UAAU,aACvCI,EAAmBD,GAAe,WAAWA,EAAa,MAAM,MAAM,GAAK,GAE3E,CAACC,GAAoBA,GAAoB,KAEzC,AAIIA,EALc,KAAKJ,GAAO,aAAa,cAAc,2BAA2B,GACnE,KAAKA,GAAO,WACL,KAAK,aAAe,KAAK,aAAgB,KAAK,aAAgBE,EAAa,GAG5EA,GADD,KAAKF,GAAO,aAAa,GAAK,IAKxD,IAAMK,EAAqB,KACrBC,EAAaF,EAAmBC,EAElCE,EAAc,EACdC,EAAgBJ,EAOpB,OALIE,IACA,EAAcD,EAAqBD,EACnC,EAAgBC,GAGb,CAAE,mBAAkB,gBAAe,cAAa,aAAY,YAAW,CAClF,EAGA,YAAgB,CAGZ,GAFI,KAAKnC,IAEL,CAAC,KAAK8B,IAAU,CAAC,KAAKA,GAAO,UAAY,CAAC,KAAKjC,GAAW,OAE9D,IAAM5B,EAAO,KAAK4B,GAAU,UACtBI,EAAQ,KAAKJ,GAAU,MACvBK,EAAQ,KAAKL,GAAU,MACvB,CAAE,iBAAkB,KAAK0C,GAAc,EAEvCC,GAAe,KAAKV,GAAO,cAAc,OAAO,CAAC,EAAE,cAAgB,IACpE,KAAKA,GAAO,cAAc,OAAO,CAAC,EAAE,cAAgB,IACpD,KAAKA,GAAO,cAAc,YAAY,CAAC,EAAE,cAAgB,GAExDW,EAAc,KAAKX,GAAO,cAAc,gBAAgB,CAAC,CAAC,cAAgB,EAC1EY,EAAaD,EAAaD,EAG1BR,EADc,KAAKF,GAAO,KAAK,SACR,CAAC,CAAC,OAEzBI,EAAmB,KAAKJ,GAAO,aAAa,EAAIE,EAEhDW,EAAgBT,EAAmBQ,EAIzC,GAFA,KAAKZ,GAAO,UAAU,OAAO,kBAAmBa,CAAY,EAExD,CAACA,EACD,OAGJ,IAAMC,EAAc3C,EAAM,aAC1B,GAAI2C,GAAe,EAAG,OAEtB,IAAMC,EAAc,KAAK,IAAI,KAAK,IAAmBJ,EAAaP,EAA5BU,EAA+CA,CAAW,EAAG,EAAE,EACrG,EAAM,MAAM,OAAS,GAAGC,EAAY,IAEpC,IAAMC,EAAmB7E,EAAK,UACxB8E,EAAe,KAAK,IAAIT,EAAgB,KAAKR,GAAO,WAAW,aAAa,EAAG,CAAC,EAElFkB,EAAW,EACXD,EAAe,IACf,EAAYD,EAAmBC,GAAiBH,EAAcC,IAGlE,IAAMI,EAAcL,EAAcC,EAC9BG,EAAW,IAAG,EAAW,GACzBA,EAAWC,IAAa,EAAWA,GAEvC,EAAM,MAAM,IAAM,GAAGD,EAAS,IAE9B,KAAKnD,GAAU,IAAI,SAAYiD,GAAoB,EACnD,KAAKjD,GAAU,OAAO,SAAYiD,GAAoBC,EAAe,CACzE,EAEA,OAAc,CAEV,KAAKlD,GAAU,MAAM,iBAAiB,YAAc,GAAM,CACtD,GAAI,EAAE,SAAW,EAAG,OACpB,EAAE,gBAAgB,EAClB,EAAE,eAAe,EACjB,KAAKG,GAAY,GAEjB,KAAKkD,GAAU,EAAE,QACjB,KAAKC,GAAiB,WAAW,KAAKtD,GAAU,MAAM,MAAM,GAAG,GAAK,EAIpE,IAAMoD,EAHY,KAAKpD,GAAU,MAAM,sBACX,CAAC,CAAC,OACV,KAAKA,GAAU,MAAM,aAGnC6B,EAAe,GAAc,CAE/B,GADI,CAAC,KAAK1B,IACNiD,GAAe,EAAG,OAGtB,IAAMG,EAASzB,EAAU,QAAU,KAAKuB,GACpCG,EAAiB,KAAKF,GAAiBC,EAEvCC,EAAiB,IAAG,EAAiB,GACrCA,EAAiBJ,IAAa,EAAiBA,GAEnD,KAAKpD,GAAU,MAAM,MAAM,IAAM,GAAGwD,EAAe,IAEnD,IAAMC,EAAQD,EAAiBJ,EAEzBM,EAAW,KAAKzB,GAAO,aAAa,EACpCY,GAAc,KAAKZ,GAAO,cAAc,gBAAgB,CAAC,CAAC,cAAgB,IAC3E,KAAKA,GAAO,SAAS,KAAK,OAAO,cAAgB,IACjD,KAAKA,GAAO,SAAS,KAAK,OAAO,cAAgB,IACjD,KAAKA,GAAO,SAAS,KAAK,MAAM,KAAK,cAAgB,GAEpD0B,EAAkB,KAAK,MAAMd,EAAaa,CAAS,EAEnD,CAAE,cAAe,KAAKhB,GAAc,EACpCkB,EAAY,KAAK,MAAMH,GAAStB,EAAawB,EAAkB,EAAE,EAEvE,KAAK1B,GAAO,WAAW,gBAAgB2B,CAAS,EAEhD,GAAM,CAAE,mBAAkB,iBAAkB,KAAKlB,GAAc,EACzDO,EAAmB,KAAKjD,GAAU,UAAU,UAC5CkD,EAAe,KAAK,IAAIT,EAAgB,KAAKR,GAAO,WAAW,aAAa,EAAG,CAAC,EAEtF,KAAKjC,GAAU,IAAI,SAAYiD,GAAoB,EACnD,KAAKjD,GAAU,OAAO,SAAYiD,GAAoBC,EAAe,CACzE,EAEMnB,MAAkB,CACpB,KAAK5B,GAAY,GACjB,SAAS,oBAAoB,YAAa0B,CAAW,EACrD,SAAS,oBAAoB,UAAWE,CAAS,CACrD,EAEA,SAAS,iBAAiB,YAAaF,CAAW,EAClD,SAAS,iBAAiB,UAAWE,CAAS,CAClD,CAAC,EAED,KAAK/B,GAAU,MAAM,iBAAiB,YAAc,GAAM,CACtD,GAAI,EAAE,SAAW,GAAK,EAAE,SAAW,KAAKA,GAAU,MAAO,OACzD,IAAM4B,EAAY,KAAK5B,GAAU,MAAM,sBAAsB,EACvDgD,EAAc,KAAKhD,GAAU,MAAM,aAEnCoD,EADc,KAAKpD,GAAU,MAAM,aACPgD,EAElC,GAAII,EAAc,EAAG,CACjB,IAAMS,EAAS,EAAE,QAAUjC,EAAU,IAAOoB,EAAc,EACpDS,EAAQ,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGI,EAAST,CAAW,CAAC,EAErD,CAAE,cAAe,KAAKV,GAAc,EACpCkB,EAAY,KAAK,IAAI,EAAG,KAAK,IAAI,KAAK,MAAMH,GAAStB,EAAa,EAAE,EAAGA,EAAa,CAAC,CAAC,EAGxFyB,GAAa,GAAK,KAAK3B,GAAO,YAAc,OAAO,KAAKA,GAAO,WAAW,iBAAoB,YAC9F,KAAKA,GAAO,WAAW,gBAAgB2B,EAAW,KAAK,CAE/D,CACA,KAAK,QAAQ,CACjB,CAAC,EAED,IAAIE,EAAiB,KAEfC,EAAyB,GAAc,CACzC,GAAID,EAAgB,OAEpB,IAAME,MAAmB,CACrB,IAAMC,EAAW,KAAKhC,GAAO,cAAc,eAAe,EAM1D,GAJI,CAACgC,GAAYA,EAAS,QAAQ,MAAQ,IAAA,IAItCC,IAAc,QAAU,KAAKjC,GAAO,UAAU,EAC9C,OAGJ,IAAMkC,EAAa,SAASF,EAAS,QAAQ,IAAK,EAAE,EAC9CL,EAAYM,IAAc,OAASC,EAAW,EAAI,KAAK,IAAI,EAAGA,EAAW,CAAC,EAEhF,KAAKlC,GAAO,WAAW,gBAAgB2B,EAAW,SAAY,CAC1D,KAAK,QAAQ,CACjB,CAAC,CACL,EAEAI,EAAW,EACX,EAAiB,YAAYA,EAAY,GAAG,CAChD,EAEMI,MAA6B,CAC/B,AAEIN,KADA,cAAcA,CAAc,EACX,KAEzB,EAEA,KAAK9D,GAAU,IAAI,iBAAiB,YAAc,GAAM,CAChD,EAAE,SAAW,GACjB+D,EAAsB,IAAI,CAC9B,CAAC,EAED,KAAK/D,GAAU,OAAO,iBAAiB,YAAc,GAAM,CACnD,EAAE,SAAW,GACjB+D,EAAsB,MAAM,CAChC,CAAC,EAED,SAAS,iBAAiB,UAAWK,CAAoB,EACzD,KAAKpE,GAAU,IAAI,iBAAiB,aAAcoE,CAAoB,EACtE,KAAKpE,GAAU,OAAO,iBAAiB,aAAcoE,CAAoB,CAC7E,CACJ,EAEK,eAAe,IAAI,uBAAuB,GAC3C,eAAe,OAAO,wBAAyBpC,CAAmB,EC3QtE,IAAaxL,EAAY,CACxB,GAAI,EACJ,MAAO,EACP,KAAM,EACN,SAAU,CACX,EAEa8N,EAAb,KAA6B,CAC5B,GACA,GACA,GAAgB,CAAC,EACjB,GAAY,IAAI,IAChB,GAAc,GAEd,YAAY,EAAO,CAClB,KAAKrC,GAASjE,EACd,KAAKjF,GAAQ,KAAKkJ,GAAO,YAAY,CAAC,CAAC,IACxC,CAEA,IAAI,SAAU,CACb,OAAO,KAAKsC,EACb,CAEA,IAAI,UAAW,CACd,OAAO,KAAKC,EACb,CAEA,eAAmB,CAClB,IAAIC,EAAe,CAAC,EACdC,EAAc,KAAKzC,GAAO,YAC5ByC,GACHA,EAAY,iBAAiB,2BAA2B,CAAC,CAAC,QAAS,GAAQ,CAC1E,IAAMC,EAAOC,EAAI,cAAc,oBAAoB,EAC/CD,GAAQA,EAAM,QAAQ,MACzBF,EAAa,KAAKE,EAAM,QAAQ,IAAI,CAEtC,CAAC,EAGF,KAAKJ,GAAgBE,CACtB,EAEA,OAAQ,CAEP,GAAI,KAAKI,GAAa,OACtB,KAAKA,GAAc,GAEnB,IAAIJ,EAAe,CAAC,EACdC,EAAc,KAAKzC,GAAO,YAC5ByC,GACHA,EAAY,iBAAiB,2BAA2B,CAAC,CAAC,QAAS,GAAQ,CAC1E,IAAMC,EAAOC,EAAI,cAAc,oBAAoB,EAC/CD,GAAQA,EAAM,QAAQ,MACzBF,EAAa,KAAKE,EAAM,QAAQ,IAAI,CAEtC,CAAC,EAGF,KAAKJ,GAAgBE,EAErB,KAAKI,GAAc,GACnB,KAAK5C,GAAO,UAAU,CAAC,EACvB,KAAKA,GAAO,KAAK,QAAQ,CAC1B,CAEA,OAAQ,CACP,KAAKsC,GAAgB,CAAC,EACtB,KAAKC,GAAU,MAAM,EACrB,KAAKK,GAAc,GACnB,KAAK5C,GAAO,UAAU,CAAC,EACvB,KAAKA,GAAO,KAAK,QAAQ,CAC1B,CAEA,YAAY,EAAK,CAChB,KAAKuC,GAAY5H,CAClB,CAEA,kBAAkB,EAAS,CAC1B,OAAO,KAAK4H,GAAU,IAAIM,CAAO,GAAK,CAAC,CACxC,CAEA,mBAAmB,EAAS,CAC3B,IAAMC,EAAS,KAAK,kBAAkBD,CAAO,EACvCE,EAAc,KAAKjM,GAAM,KAC/B,OAAOgM,EAAO,IAAI,GAASC,EAAY,SAASzK,CAAK,CAAC,CAAC,CAAC,OAAO,OAAO,CACvE,CACD,EAEa0K,EAAb,MAAaA,CAAS,CAErB,OAAO,MAAM,EAAY,EAAe,CAAC,EAAG,EAAS,CAAC,EAAG,CACxD,GAAI,CAACR,GAAgBA,EAAa,SAAW,EAC5C,MAAO,CAAE,QAAS,CAAC,EAAG,YAAa,CAAC,EAAG,SAAU,IAAI,GAAM,EAG5D,IAAMS,EAAWC,EAAW,OAAO,GAAK,CAACzK,EAAE,MAAM,OAAO,EAClD0K,EAAW,IAAI,IAEfC,EAAaJ,EAASK,GAAgBJ,EAAUT,EAAc3K,CAAM,EACpEyL,EAAa,CAAC,EACdC,EAAc,CAAC,EAIrB,OAFAP,EAASQ,GAAaJ,EAAY,EAAGZ,EAAcc,EAAYC,EAAaJ,EAAU,EAAE,EAEjF,CAAE,QAASG,EAAY,cAAa,UAAS,CACrD,CAEA,MAAOE,GAAa,EAAY,EAAO,EAAc,EAAW,EAAa,EAAU,EAAU,CAChG,IAAIC,EAAU,EACRC,EAAeC,IAAUnB,EAAa,OAAS,EAErD,IAAK,GAAI,CAACoB,EAAUC,KAAoBC,EAAW,QAAQ,EAAG,CAC7D,IAAMjB,EAAUkB,EAAW,GAAGA,EAAS,GAAG,MAAc,KAAK,MAEvDjB,EAASE,EAASgB,GAAmBH,CAAe,EAC1DV,EAAS,IAAIN,EAASC,CAAM,EAE5B,IAAMmB,EAAc,CAAC,EACrB,EAAY1P,EAAU,IAAMsO,EAC5B,EAAYtO,EAAU,OAASoP,EAC/B,EAAYpP,EAAU,MAAQqP,EAC9B,EAAYrP,EAAU,UAAYuO,EAElC,EAAY,gBAAkB,GAC9B,EAAY,UAAYD,EAExBqB,EAAU,KAAKD,CAAW,EAE1BV,EAAY,KAAK,CAChB,KAAM,QACN,OAAQU,EACC,SACV,CAAC,EAEG,CAACP,GAAeG,aAA2B,IAC9Cb,EAASQ,GAAaK,EAAiBF,EAAQ,EAAGnB,EAAc0B,EAAWX,EAAaJ,EAAUN,CAAO,EAGzGG,EAD6BmB,GAAoBN,CACvC,CAAC,CAAC,QAAQ,GAAU,CAC7B,EAAO,gBAAkB,GACzB,EAAO,UAAYhB,EACnBqB,EAAU,KAAKvL,CAAM,EAErB4K,EAAY,KAAK,CAChB,KAAM,OACE,SACC,SACV,CAAC,CACF,CAAC,CAEH,CACD,CAEA,MAAOF,GAAgB,EAAS,EAAc,EAAQ,CACrD,IAAM3L,EAAWG,EAAO,QAAQ2K,EAAa,EAAE,EACzC4B,EAAgB5B,EAAa,MAAM,CAAC,EACpC7H,EAAM,IAAI,IAQhB,GANAvB,EAAQ,QAAQ,GAAU,CACzB,IAAMiL,EAAM3M,GAAY,EAAIiB,EAAO,EAAEjB,GAAY,YAC5CiD,EAAI,IAAI0J,CAAG,GAAG1J,EAAI,IAAI0J,EAAK,CAAC,CAAC,EAClC1J,EAAI,IAAI0J,CAAG,CAAC,CAAC,KAAK1L,CAAM,CACzB,CAAC,EAEGyL,EAAc,OAAS,EAAG,CAC7B,IAAMvK,EAAS,IAAI,IACnB,IAAK,GAAI,CAACwK,EAAKC,KAAe3J,EAAI,QAAQ,EACzCd,EAAO,IAAIwK,EAAKrB,EAASK,GAAgBiB,EAAYF,EAAevM,CAAM,CAAC,EAE5E,OAAOgC,CACR,CACA,OAAOc,CACR,CAEA,MAAOqJ,GAAmB,EAAiB,CAC1C,IAAIlB,EAAS,CAAC,EACd,GAAIe,aAA2B,IAC9B,IAAK,IAAIU,KAAUV,EAAgB,OAAO,EACzC,EAASf,EAAO,OAAOE,EAASgB,GAAmBO,CAAM,CAAC,OAEjD,MAAM,QAAQV,CAAe,IACvC,EAASf,EAAO,OAAOe,EAAgB,IAAI,GAAKW,EAAE,MAAM,OAASA,EAAE,GAAG,IAAI,EAAE,CAAC,GAE9E,OAAO1B,CACR,CAEA,MAAOqB,GAAoB,EAAiB,CAC3C,IAAI/K,EAAU,CAAC,EACf,GAAIyK,aAA2B,IAC9B,IAAK,IAAIU,KAAUV,EAAgB,OAAO,EACzC,EAAUzK,EAAQ,OAAO4J,EAASmB,GAAoBI,CAAM,CAAC,OAEpD,MAAM,QAAQV,CAAe,IACvC,EAAUzK,EAAQ,OAAOyK,CAAe,GAEzC,OAAOzK,CACR,CACD,ECnMaqL,EAAb,KAAwB,CACpB,GAAoB,EAEpB,GACA,GACA,GAEA,GAAsB,IAAI,IAE1B,GAAkB,KAClB,GAAe,EACf,GAEA,GAAwB,GACxB,GAAa,GAEb,YAAY,EAAO,CACf,KAAK3N,GAAQiF,EAAM,YAAY,CAAC,CAAC,KACjC,KAAKiE,GAASjE,EAEd,KAAK2I,GAAoB,CAC7B,CAEA,cAAe,CACX,OAAO,KAAK1E,GAAO,SAAS,MAChC,CAEA,SAAW,EAAQ,KAAU,CAEzB,GAAI,CAAC,KAAKA,GAAO,UAAU,SAAS,QAAQ,EAAG,OAE/C,IAAM2E,EAAe,KAAK3E,GAAO,cAAc,gBAAgB,EAC1D2E,KAEoB,CAAC,KAAK3E,GAAO,SAAS,QAAU,KAAKA,GAAO,SAAS,QAAU,KAGpF,KAAK4E,GAAuB,EACxB,KAAK5E,GAAO,SAAS,QAAU,KAAKA,GAAO,SAAS,OAAS,GAC7D,KAAK6E,GAAqB,GAKlC,KAAKC,GAAcH,EAAa,UAAWI,CAAK,EAEhD,KAAK/E,GAAO,cAAc,uBAAuB,CAAC,EAAE,QAAQ,EAChE,EAEA,IAAiB,EAAW,EAAQ,KAAU,CAE1C,GAAI,KAAKgF,GAAY,CACjB,KAAKC,GAAqBC,EAAWH,CAAK,EAC1C,MACJ,CAEA,IAAMtD,EAAY,KAAKzB,GAAO,SAAS,OACvC,GAAI,CAACyB,GAAaA,GAAa,EAAG,OAElC,IAAMxB,EAAc,KAAKD,GAAO,KAAK,SAAS,EACxCE,EAAaD,EAAY,OAE/B,GAAIC,IAAe,EAAG,CAClB,KAAKF,GAAO,SAAS,aAAa,MAAM,OAAS,MACjD,MACJ,CAEA,IAAMU,GAAe,KAAKV,GAAO,SAAS,KAAK,OAAO,cAAgB,IACjE,KAAKA,GAAO,SAAS,KAAK,OAAO,cAAgB,GAClD,KAAKA,GAAO,SAAS,KAAK,MAAM,KAAK,aAEnCY,EAAa,KAAKZ,GAAO,cAAc,gBAAgB,CAAC,CAAC,cAAgB,EACzEmF,EAAwB,KAAK,IAAIjF,EAAauB,GAAab,EAAaF,EAAce,GAAaA,EAAW,CAAC,EAE/GpB,EAAqB,KACrBC,EAAa6E,EAAwB9E,EAEvCE,EAAc,EACd6E,EAAqBD,EAErB7E,IACA,EAAcD,EAAqB8E,EACnC,EAAqB9E,GAIzB,KAAKL,GAAO,SAAS,aAAa,MAAM,OAAS,GAAGoF,EAAmB,IAEvE,IAAMC,EAAkB/E,EAAc4E,EAAY3E,EAAe2E,EAE3DI,EAAgB,KAAK,IAAI,EAAGpF,EAAa,CAAC,EAC1CqF,EAAmB,KAAK,IAAIF,EAAiBF,CAAqB,EAClEK,EAAa,KAAK,IAAI,EAAG,KAAK,IAAI,KAAK,MAAMD,EAAmB9D,CAAS,EAAG6D,CAAa,CAAC,EAUhG,KAAKtF,GAAO,SAAS,KAAK,MAAM,KAAK,MAAM,UACvC,KAAKA,GAAO,SAAS,KAAK,MAAM,KAAK,MAAM,UACvC,KAAKA,GAAO,SAAS,MAAM,MAAM,KAAK,MAAM,UAAY,qBAAqBuF,EAAmB9D,EAAU,UAGlH,IAAMgE,EAAU,KAAKC,GAAS,QACxBC,EAAoBF,GAAWA,EAAQ,QAAQ,MAAQ,IAAA,GAAY,SAASA,EAAQ,QAAQ,IAAK,EAAE,EAAI,IAExGV,GAASY,IAAsBH,KAIpC,CACI,KAAKxF,GAAO,SAAS,KAAK,MAAM,KAChC,KAAKA,GAAO,SAAS,KAAK,MAAM,KAChC,KAAKA,GAAO,SAAS,MAAM,MAAM,IACrC,CAAC,CAAC,SAAS,EAAQ,IAAa,CACvB4F,GAILA,EAFoB,iBAAiB,eAElC,CAAC,CAAC,SAAS,EAAK,IAAU,CACzB,IAAMC,EAAYL,EAAa,KAAK,MAAMhM,EAAQ,KAAKwG,GAAO,SAAS,MAAM,EAE7E,GAAI6F,GAAa3F,EAAY,CACzB,EAAI,MAAM,QAAU,OACpB,EAAI,QAAQ,UAAY,KACxB,EAAI,QAAQ,IAAM,KAClB,EAAI,QAAQ,MAAQ,KACpB,MACJ,CAEA,IAAMvH,EAASsH,EAAY4F,GAE3B,GAAI,CAAClN,EAAQ,CACT,EAAI,MAAM,QAAU,OACpB,MACJ,CAEA,IAAML,EAAQK,EAAO,EAAE,EAAEnC,EAAW,KAAK,MAAM,OAE/C,EAAI,MAAM,QAAU,GAEpB,KAAKsP,GAAanD,EAAKhK,EAAQL,EAAOuN,CAAS,CACnD,CAAC,CACL,CAAC,EAED,KAAK7F,GAAO,UAAU,QAAQ,EAClC,EAGA,IAAwB,EAAW,EAAQ,KAAU,CAEjD,IAAM+F,EAAiB,KAAK/F,GAAO,KAAK,SAAS,GAAK,CAAC,EACjDgG,EAAoBD,EAAe,OAEzC,GAAIC,IAAsB,EAAG,CACzB,KAAKhG,GAAO,SAAS,aAAa,MAAM,OAAS,MACjD,MACJ,CAGA,IAAMiG,EAAc,KAAKjG,GAAO,cAAc,uCAAuC,EAC/EkG,EAAiB,KAAKlG,GAAO,gBAAkB,EAE/CmG,EAAiB,GAAS,CAC5B,GAAIlP,EAAK,OAAS,QAAS,CACvB,IAAM0M,EAAQ1M,EAAK,OAAOzC,EAAU,QAAU,EAE9C,OADoB,KAAKwL,GAAO,SAAS,OAAO2D,IAAU,KAAK3D,GAAO,SAAS,OAASkG,CAE5F,CAAO,CACH,IAAIE,EAAiB,EACfF,EAAiB,KAAKlG,GAAO,gBAAkB,EAEjDqG,EAAoB,EACxB,IAAI,IAAIvM,EAAI,EAAGA,EAAIoM,EAAiB,EAAG,IACnC,GAAqB,KAAKlG,GAAO,SAAS,QAAQlG,IAAM,EAI5D,MAFA,GAAiB,KAAKkG,GAAO,SAAS,OAASqG,EAExCD,EAAiB,EAAIA,EAAiB,KAAKpG,GAAO,SAAS,MACtE,CACJ,EAGIoF,EAAqB,EACnBkB,EAAkB,MAAMN,CAAiB,EAC/C,IAAK,IAAIlM,EAAI,EAAGA,EAAIkM,EAAmB,IAAK,CACxC,IAAMhQ,EAAImQ,EAAcJ,EAAejM,EAAE,EACzC,EAAYA,GAAK9D,EACjB,GAAsBA,CAC1B,CAEA,KAAKgK,GAAO,SAAS,aAAa,MAAM,OAAS,GAAGoF,EAAmB,IAEvE,IAAMmB,EAAuB,KAAKvG,GAAO,aAErCwG,EAAoB,EACpBhB,EAAa,EAEjB,IAAK,IAAI1L,EAAI,EAAGA,EAAIkM,EAAmB,IAAK,CACxC,IAAMhQ,EAAIsQ,EAAYxM,GACtB,GAAI0M,EAAoBxQ,EAAIkP,EAAW,CACnC,EAAapL,EACb,KACJ,CACA,GAAqB9D,EACrB,EAAa8D,CACjB,CAEA,IAAM2M,EAAUvB,EAAYsB,EACxBP,GACAA,EAAY,iBAAiB,OAAO,CAAC,CAAC,QAAS,GAAW,CACtD,EAAO,MAAM,IAAM,IAAI,KAAK,IAAI,EAAGQ,CAAO,EAAE,GAChD,CAAC,EAGL,IAAMhB,EAAU,KAAKC,GAAS,QACxBC,EAAoBF,GAAWA,EAAQ,QAAQ,eAAiB,IAAA,GAChE,SAASA,EAAQ,QAAQ,aAAc,EAAE,EACzC,GAEN,GAAI,CAACV,GAASY,IAAsBH,EAChC,OAGJ,IAAMkB,EAAmB,KAAK,KAAKH,GAAwB,KAAKvG,GAAO,SAAS,OAASkG,EAAe,EAClGS,GAAiB,KAAK3G,GAAO,SAAS,SAAS,QAAU,GAAK,GAC9D4G,EAAcpB,EACdqB,EAAY,KAAK,IAAIb,EAAmBR,EAAakB,EAAmBC,CAAa,EACrFG,EAAgBf,EAAe,MAAMa,EAAaC,CAAS,EAEjE,CAAC,qBAAsB,qBAAsB,qBAAqB,CAAC,CAAC,QAAQ,GAAY,CACpF,IAAME,EAAY,KAAK/G,GAAO,cAAc,kBAAkBgH,GAAU,EACxE,GAAI,CAACD,EAAW,OAEhB,IAAME,EAAM,MAAM,KAAKF,EAAU,iBAAiB,eAAe,CAAC,EAElE,IAAK,IAAIjN,EAAI,EAAGA,EAAImN,EAAI,OAAQ,GAAKf,EAAgB,CACjD,IAAMgB,EAAY,KAAK,MAAMpN,EAAIoM,CAAc,EACzCjP,EAAO6P,EAAcI,GACrBC,EAAWF,EAAI,MAAMnN,EAAGA,EAAIoM,CAAc,EAEhD,GAAI,CAACjP,GAAQiQ,GAAaJ,EAAc,OAAQ,CAC5CK,EAAS,QAAQ,GAAM,CACnB,EAAG,MAAM,QAAU,OACnB,EAAG,QAAQ,UAAY,KACvB,EAAG,QAAQ,IAAM,KACjB,EAAG,QAAQ,MAAQ,IACvB,CAAC,EACD,QACJ,CAEA,IAAMtB,EAAYL,EAAa0B,EAE/BC,EAAS,SAAS,EAAI,IAAW,CAC7B,IAAMC,EAAe5B,EAAa0B,EAClC,EAAG,QAAQ,aAAeE,EAC1B,EAAG,QAAQ,IAAOnQ,EAAK,OAAS,OAAU4O,EAAY,GAEtD,IAAMwB,EAAYC,EAAG,aAAa,UAAU,IAAM,OAElD,GAAIrQ,EAAK,OAAS,QACVoQ,GAEIE,IADUtQ,EAAK,OAAOzC,EAAU,QAEhC,EAAG,MAAM,QAAU,GACnB,KAAKgT,GAAkBF,EAAIvB,EAAgB9O,EAAK,OAAQmQ,CAAY,IAQxE,EAAG,MAAM,QAAU,OACnB,EAAG,QAAQ,UAAY,KACvB,EAAG,QAAQ,IAAM,KACjB,EAAG,QAAQ,MAAQ,WAGvB,GAAIC,EACA,EAAG,MAAM,QAAU,OACnB,EAAG,QAAQ,UAAY,KACvB,EAAG,QAAQ,IAAM,KACjB,EAAG,QAAQ,MAAQ,SAChB,CACH,EAAG,MAAM,QAAU,GAEnB,IAAM/O,EAAQrB,EAAK,OAAO,GAAG,OAAS,EACtC,KAAK6O,GAAawB,EAAIrQ,EAAK,OAAQqB,EAAO8O,CAAY,CAC1D,CAER,CAAC,CACL,CACJ,CAAC,EAED,KAAKpH,GAAO,UAAU,QAAQ,CAClC,EAEA,IAAqB,EAAK,EAAgB,EAAa,IAAiB,CACpE,IAAMkG,EAAiB,KAAKlG,GAAO,gBAAkB,EAC/CyH,EAAc,SAAS9E,EAAI,QAAQ,OAAQ,EAAE,GAAK,EAClD+E,EAAaN,EAAelB,EAAkBuB,EAE9CE,EAAU1D,EAAYzP,EAAU,UAChCoT,EAAa,KAAK9Q,GAAM,KAAK,SAAS,EACtC+Q,EAAkBF,EAAUA,EAAQ,IAAI,GAAOC,EAAWrQ,EAAI,CAAC,CAAC,OAAO,OAAO,EAAI,CAAC,EAGzF,EAAI,QAAQ,aAAe6P,EAC3B,EAAI,QAAQ,IAAM,GAClB,EAAI,QAAQ,UAAYM,EACxB,EAAI,KAAOG,EACX,EAAI,QAAQ,QAAU5D,EAAYzP,EAAU,IAG5C,MAAM,KAAKmO,EAAI,KAAK,CAAC,CAAC,QAAS,GAAU,CAErC,EAAM,QAAQ,IAAMyE,EAEpB,IAAMU,EAAa,MAAM,KAAKpF,EAAM,QAAQ,CAAC,CAAC,KAAK,GAC/CzK,EAAI,QAAQ,YAAY,CAAC,CAAC,WAAW,OAAO,GAAK,OAAOA,EAAI,SAAY,UAC5E,EAGI6P,IAAe,IAAA,IAAa,OAAOA,EAAW,SAAY,YAC1DA,GAAY,QAAQ,CAE5B,CAAC,CACL,EAEA,IAAgB,EAAK,EAAQ,EAAO,IAAc,CAC9C,IAAM5B,EAAiB,KAAKlG,GAAO,gBAAkB,EAC/CyH,EAAc,SAAS9E,EAAI,QAAQ,OAAQ,EAAE,GAAK,EAClD+E,EAAa7B,EAAYK,EAAkBuB,EAEjD,EAAI,QAAQ,MAAQ5B,EACpB,EAAI,QAAQ,IAAMvN,EAClB,EAAI,QAAQ,UAAYoP,EACxB,EAAI,KAAO/O,EAEX,MAAM,KAAKgK,EAAI,KAAK,CAAC,CAAC,QAAS,GAAU,CACrC,EAAM,QAAQ,MAAQkD,EACtB,EAAM,QAAQ,IAAMvN,EAMpB,MAJyB,KAAKoK,EAAM,QAAQ,CAAC,CAAC,KAAK,GAC/CzK,EAAI,QAAQ,YAAY,CAAC,CAAC,WAAW,OAAO,GAAK,OAAOA,EAAI,SAAY,UAGnE,CAAC,EAAE,QAAQ,CACxB,CAAC,CACL,EAEA,eAAmB,CAEf,KAAK+M,GAAa,OAAKhF,GAAO,YAAY,cAAc,2BAA2B,EAGnF,KAAK+H,GAAoB,MAAM,EAE/B,KAAKrC,GAAW,CACZ,aAAc,KAAK1F,GAAO,iBAAiB,sBAAsB,EACjE,QAAS,KAAKA,GAAO,cAAc,iDAAiD,CACxF,EAEA,CAAC,qBAAsB,qBAAsB,qBAAqB,CAAC,CAAC,QAAQ,GAAY,CACpF,IAAM+G,EAAY,KAAK/G,GAAO,cAAc,kBAAkBgH,GAAU,EACxE,GAAI,CAACD,EAAW,OAEhB,IAAMiB,EAAUjB,EAAU,cAAc,OAAO,EAC/C,GAAI,CAACiB,EAAS,OAEd,IAAMC,EAAQD,EAAQ,cAAc,YAAY,EAChD,GAAI,CAACC,EAAO,OAGZ,IAAMC,EADM,MAAM,KAAKD,EAAM,iBAAiB,IAAI,CAC5B,CAAC,CAAC,IAAI,GAAMX,EAAG,UAAU,EAAI,CAAC,EACpD,KAAKS,GAAoB,IAAIf,EAAUkB,CAAW,CACtD,CAAC,EAED,IAAMvD,EAAe,KAAK3E,GAAO,cAAc,gBAAgB,EAE3D2E,IACA,KAAKwD,GAAexD,EAAa,aAGjC,KAAKC,GAAuB,EAC5B,KAAKC,GAAqB,EAC1B,KAAKC,GAAcH,EAAa,UAAW,EAAI,EAE/CA,EAAa,iBAAiB,SAAW,GAAM,CAE3C,GAAI,KAAKyD,GAAuB,OAEhC,IAAM3G,EAAY,KAAKzB,GAAO,SAAS,QAAU,GAC9B,KAAKA,GAAO,KAAK,SAAS,CAAC,EAAE,QAAU,GACfyB,GAEdkD,EAAa,eAI1C,KAAKG,GAAcH,EAAa,SAAS,EAEzC,KAAK3E,GAAO,cAAc,uBAAuB,CAAC,CAAC,QAAQ,EAE/D,EAAG,CAAE,QAAS,EAAK,CAAC,EAE5B,EAEA,gBAAgB,EAAS,EAAQ,MAAO,EAAY,CAEhD,IAAM2E,EAAe,KAAK3E,GAAO,cAAc,gBAAgB,EAGzDE,EADc,KAAKF,GAAO,KAAK,SACR,CAAC,EAAE,QAAU,EAEpC2B,EAAY,KAAK,IAAI,EAAG,KAAK,IAAI0G,EAASnI,EAAa,CAAC,CAAC,EAC3DoI,EAAkB,EAEtB,GAAI,KAAKtD,GAAY,CACjB,IAAM/D,EAAe,KAAK,IAAI0D,EAAa,aAAeA,EAAa,aAAc,CAAC,EAGtF,EADchD,EAAY,KAAK,IAAIzB,EAAa,EAAG,CAAC,EAC1Be,CAC9B,KAAO,CAEH,IAAMQ,EAAY,KAAKzB,GAAO,SAAS,OACjCuI,EAAqB5G,EAAYF,EAEjCf,GAAe,KAAKV,GAAO,SAAS,KAAK,OAAO,cAAgB,IACjE,KAAKA,GAAO,SAAS,KAAK,OAAO,cAAgB,GAClD,KAAKA,GAAO,SAAS,KAAK,MAAM,KAAK,aAEnCY,EAAa+D,EAAa,cAAgB,EAC1CQ,EAAwB,KAAK,IAAIjF,EAAauB,EAAYf,EAAcE,EAAY,CAAC,EAErFP,EAAqB,KACrBC,EAAa6E,EAAwB9E,EAEvCE,EAAc,EACdD,IACA,EAAcD,EAAqB8E,GAGvC,EAAkBoD,EAAqBhI,CAC3C,CAEA,KAAK6H,GAAwB,GAC7B,EAAa,UAAYE,EACzB,KAAKxD,GAAcwD,CAAe,EAElC,0BAA4B,CACxB,0BAA4B,CACxB,KAAKF,GAAwB,GACzB,OAAOI,GAAe,YAAYA,EAAW,CACrD,CAAC,CACL,CAAC,CACL,CAIA,YAAgB,CACZ,AAEI,KAAKvK,MADL,KAAKA,GAAgB,WAAW,EACT,KAE/B,EAEA,OAA+B,CAwB/B,EAEA,OAAwB,CAEpB,GAAI,KAAKkK,GAAe,GAAK,KAAKnI,GAAO,SAAS,OAAS,EAAG,CAC1D,IAAMyI,EAAc,KAAK,KAAK,KAAKN,GAAe,KAAKnI,GAAO,SAAS,MAAM,EAEzE2G,EAAgB,KAAK+B,GACzB,GAAI,KAAK1D,IAAc,KAAKhF,GAAO,SAAU,CACzC,IAAM2I,EAAa,KAAK3I,GAAO,SAAS,SAAS,QAAU,EAC3D,GAAkB2I,EAAa,EACnC,CAEA,KAAKC,GAAkBH,EAAc9B,CACzC,CACJ,EAEA,OAA6B,CAEzB,CAAC,qBAAsB,qBAAsB,qBAAqB,CAAC,CAAC,QAAQ,GAAY,CACpF,IAAMI,EAAY,KAAK/G,GAAO,cAAc,kBAAkBgH,GAAU,EACpED,GAAaA,EAAU,cAAc,OAAO,GAC5C,KAAK8B,GAAY9B,CAAS,CAElC,CAAC,EAED,KAAK+B,GAAgB,CACzB,EAEA,GAAe,GAAc,CACzB,IAAIC,EAAkB,KAClBhC,EAAU,UAAU,SAAS,mBAAmB,EAAG,EAAkB,OAChEA,EAAU,UAAU,SAAS,oBAAoB,IAAG,EAAkB,SAE/E,IAAMmB,EAAc,MAAM,KAAK,KAAKlI,GAAO,YAAY,iBAAiB,eAAe,CAAC,CAAC,CAAC,IAAI,GAAM,CAChG,IAAMgJ,EAAW1B,EAAG,UAAU,EAAI,EAgBlC,OAdIyB,IAAoB,OACpBC,EAAS,iBAAiB,OAAO,CAAC,CAAC,QAAQ,GAAS,CAC5CtG,EAAM,aAAa,OAAO,IAAM,QAAQA,EAAM,OAAO,CAC7D,CAAC,EACMqG,IAAoB,QAC3BC,EAAS,iBAAiB,OAAO,CAAC,CAAC,QAAQ,GAAS,CAC5CtG,EAAM,aAAa,OAAO,IAAM,SAASA,EAAM,OAAO,CAC9D,CAAC,EAEDsG,EAAS,iBAAiB,6BAA6B,CAAC,CAAC,QAAQ,GAAS,CACtEtG,EAAM,OAAO,CACjB,CAAC,EAGEsG,CACX,CAAC,EAED,GAAId,EAAY,SAAW,EAAG,OAE9B,IAAMe,EAAclC,EAAU,cAAc,YAAY,EACxD,GAAI,CAACkC,EAAa,OAElBA,EAAY,iBAAiB,IAAI,CAAC,CAAC,QAAQ,GAAM3B,EAAG,OAAO,CAAC,EAE5D,IAAM4B,EAAW,SAAS,uBAAuB,EACjD,IAAK,IAAIpP,EAAI,EAAGA,EAAI,KAAK8O,GAAiB,IACtCV,EAAY,QAAQ,GAAQgB,EAAS,YAAYC,EAAK,UAAU,EAAI,CAAC,CAAC,EAI1EF,EAAY,YAAYC,CAAQ,EAE5BnC,EAAU,UAAU,SAAS,mBAAmB,IAChD,KAAKrB,GAAS,QAAUuD,EAAY,cAAc,IAAI,EAE9D,EAIA,OAAwB,CACpB,IAAMG,EAAY,KAAKpJ,GAAO,cAAc,yCAAyC,EAC/EqJ,EAAY,KAAKrJ,GAAO,cAAc,yCAAyC,EAC/EsJ,EAAa,KAAKtJ,GAAO,cAAc,0CAA0C,EAEvF,GAAIqJ,EAAW,CACX,IAAME,EAAWH,EAAY,MAAM,KAAKA,EAAU,iBAAiB,UAAU,CAAC,EAAI,CAAC,EAC7EI,EAAW,MAAM,KAAKH,EAAU,iBAAiB,UAAU,CAAC,EAC5DI,EAAYH,EAAa,MAAM,KAAKA,EAAW,iBAAiB,UAAU,CAAC,EAAI,CAAC,EAEhFI,EAAU,KAAK,IAAIH,EAAS,OAAQC,EAAS,OAAQC,EAAU,MAAM,EAE3E,IAAK,IAAI3P,EAAI,EAAGA,EAAI4P,EAAS,IAAK,CAC9B,IAAMC,EAAU,CACZJ,EAASzP,EAAE,EAAE,sBAAsB,CAAC,CAAC,QAAU,EAC/C0P,EAAS1P,EAAE,EAAE,sBAAsB,CAAC,CAAC,QAAU,EAC/C2P,EAAU3P,EAAE,EAAE,sBAAsB,CAAC,CAAC,QAAU,CACpD,EACM8P,EAAY,KAAK,IAAI,GAAGD,CAAO,EAEjCC,EAAY,IACRL,EAASzP,KAAI,EAASA,EAAE,CAAC,MAAM,OAAS,GAAG8P,EAAU,KACrDJ,EAAS1P,KAAI,EAASA,EAAE,CAAC,MAAM,OAAS,GAAG8P,EAAU,KACrDH,EAAU3P,KAAI,EAAUA,EAAE,CAAC,MAAM,OAAS,GAAG8P,EAAU,KAEnE,CACJ,CACJ,EAEA,OAA4B,CAEnB,KAAK5J,IAAY,KAAKA,cAAkB,cAE7C,KAAK/B,GAAkB,IAAI,eAAgB,GAAY,CACnD,IAAK,IAAM4L,KAASC,EAAS,CAGzB,GAAI,CADYD,EAAM,OACT,UAAU,SAAS,QAAQ,EAAG,SAE3C,IAAME,EAASF,EAAM,YAAY,OACnBA,EAAM,YAAY,MAEpB,GAAK,KAAK7J,GAAO,cACzB,KAAKA,GAAO,QAAQ,EAAI,EAGxB+J,EAAS,GAAK,KAAK5B,KAAiB4B,IACpC,KAAK5B,GAAe4B,EAEpB,KAAKC,GAAgB,EAEjB,KAAKhK,GAAO,SAAS,SAAW,OAChC,KAAK6E,GAAqB,EAC1B,KAAK,QAAQ,GAGzB,CACJ,CAAC,EAED,KAAK5G,GAAgB,QAAQ,KAAK+B,EAAM,EAC5C,CACJ,ECznBaiK,EAAb,MAAaA,CAAc,CAEvB,OAAO,QAAQ,EAAW,CAEtB,IAAMC,EAASC,EAAU,UAAU,EAAI,EASvC,OAPAF,EAAc,cAAcC,EAAQA,EAAO,iBAAiB,UAAU,CAAC,EACvED,EAAc,cAAcC,EAAQA,EAAO,iBAAiB,gCAAgC,CAAC,EAC7FD,EAAc,cAAcC,EAAQA,EAAO,iBAAiB,sCAAsC,CAAC,EACnGD,EAAc,cAAcC,EAAQA,EAAO,iBAAiB,UAAU,CAAC,EAEvED,EAAcG,GAAmBF,CAAM,EAEhCA,CACX,CAEA,OAAO,UAAU,EAAQ,CAUrB,OAPAD,EAAc,cAAcC,EAAQA,EAAO,iBAAiB,UAAU,CAAC,EACvED,EAAc,cAAcC,EAAQA,EAAO,iBAAiB,gCAAgC,CAAC,EAC7FD,EAAc,cAAcC,EAAQA,EAAO,iBAAiB,sCAAsC,CAAC,EACnGD,EAAc,cAAcC,EAAQA,EAAO,iBAAiB,UAAU,CAAC,EAEvED,EAAcG,GAAmBF,CAAM,EAEhCA,CACX,CAEA,MAAOE,GAAmB,EAAQ,CAE9BF,EAAO,iBAAiB,cAAc,CAAC,CAAC,SAAS,EAAM,IAAM,CACzDG,EAAK,aAAa,WAAYvQ,CAAC,EAC/B,IAAMwQ,EAAQD,EAAK,aAAa,OAAO,EAEvCH,EAAO,iBAAiB,cAAcpQ,EAAE,GAAG,CAAC,CAAC,QAAQ,GAAO,CACxDwQ,EAAQrS,EAAI,aAAa,QAASqS,CAAK,EAAIrS,EAAI,gBAAgB,OAAO,CAC1E,CAAC,CACL,CAAC,CACL,CAEA,OAAO,cAAc,EAAQ,EAAK,CAE9B,IAAMsS,EAAOL,EAAO,iBAAiB,cAAc,EAC7CM,EAAO,MAAM,KAAK,CAAE,OAAQvD,EAAI,MAAO,MAAS,MAAMsD,EAAK,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC,EAEnFtD,EAAI,SAAS,EAAK,IAAU,CAExB,EAAI,QAAQ,OAASzN,EAErB,IAAI9B,EAAW,EAEfiL,EAAI,iBAAiB,QAAQ,CAAC,CAAC,QAAQ,GAAS,CAE5C,KAAOjL,EAAW6S,EAAK,QAAUC,EAAKhR,EAAM,CAAC9B,KAAc,MACvD,IAGJ,EAAM,QAAQ,IAAMA,EAEpB,IAAM+S,EAAU/H,EAAM,SAAW,EAC3BgI,EAAUhI,EAAM,SAAW,EAEjC,IAAK,IAAI8B,EAAI,EAAGA,EAAIiG,EAAS,IACzB,IAAK,IAAIE,EAAI,EAAGA,EAAID,EAAS,IACrBlR,EAAQgL,EAAIyC,EAAI,QAAUvP,EAAWiT,EAAIJ,EAAK,SAC9C,EAAK/Q,EAAQgL,EAAE,CAAC9M,EAAWiT,GAAKjI,GAK5C,GAAYgI,CAChB,CAAC,CACL,CAAC,CACL,CAEJ,EC9EaE,EAAb,KAA2B,CAC1B,GACA,GAAS,CAAE,SAAU,GAAI,SAAU,GAAI,OAAQ,GAAI,OAAQ,EAAG,EAE9D,YAAY,EAAO,CAClB,KAAK5K,GAASjE,EACd,KAAK8O,GAAY,CAClB,CAEA,GAAc,EAAI,CACjB,GAAI,CAACvD,EAAI,MAAO,CAAE,QAAS,GAAI,YAAa,GAAI,UAAW,EAAG,EAE9D,IAAMe,EAAU,SAASf,EAAG,QAAQ,MAAO,EAAE,EAC7C,GAAI,MAAMe,CAAO,EAAG,MAAO,CAAE,QAAS,GAAI,YAAa,GAAI,UAAW,EAAG,EAEzE,IAAMJ,EAAQX,EAAG,QAAQ,OAAO,EAG1BwD,EAFM,MAAM,KAAK7C,EAAM,iBAAiB,IAAI,CAE3B,CAAC,CAAC,OAAO,GAAK,SAAS8C,EAAE,QAAQ,MAAO,EAAE,IAAM1C,CAAO,EACxEZ,EAAcqD,EAAa,QAAQxD,CAAE,EACrCpB,EAAiB4E,EAAa,OAAS,EAAIA,EAAa,OAAS,EAIvE,MAAO,CAAE,UAAS,cAAa,UAFZzC,EAAUnC,GAAmBuB,GAAe,EAAIA,EAAeH,EAAG,gBAAkBpB,EAE9D,CAC1C,CAEA,SAAS,EAAW,EAAK,CACxB,KAAKlG,GAAO,iBAAiB,mBAAmB,CAAC,CAAC,QAAQ,GAAO,CAChE2C,EAAI,UAAU,OAAO,gBAAgB,EACrCA,EAAI,iBAAiB,mBAAmB,CAAC,CAAC,QAAQ,GAAO,CACxDqI,EAAI,UAAU,OAAO,gBAAgB,CACtC,CAAC,CACF,CAAC,EAED,IAAMA,EAAM,KAAKhL,GAAO,cAAc,8CAA8C0H,EAAU,kBAAkBuD,EAAI,GAAG,EAClHD,IAELA,EAAI,UAAU,IAAI,gBAAgB,EAClCA,EAAI,QAAQ,IAAI,CAAC,EAAE,UAAU,IAAI,gBAAgB,EAClD,CAEA,SAAS,EAAU,EAAU,EAAQ,EAAQ,CAC5C,IAAIE,EAAK,KAAK,IAAIC,EAAUC,CAAM,EAC9BC,EAAK,KAAK,IAAIF,EAAUC,CAAM,EAC9BE,EAAK,KAAK,IAAIC,EAAUC,CAAM,EAC9BC,EAAK,KAAK,IAAIF,EAAUC,CAAM,EAE5BE,EAAa,KAAK1L,GAAO,iBAAiB,6DAA6D,EAEzG2L,EAAW,GACXC,EAAY,EAEhB,KAAOD,GAAYC,EAAY,GAC9B,EAAW,GACX,IAEAF,EAAW,QAAQ,GAAa,CAM/B,MAJyB,KAAK3E,EAAU,iBAAiB,UAAU,CAAC,CAAC,CAAC,OAAO,GACrEO,EAAG,MAAM,UAAY,MAGpB,CAAC,CAAC,QAAQ,GAAM,CACxB,GAAM,CAAE,aAAc,KAAKuE,GAAcvE,CAAE,EACvCI,EAAY,GAEhBJ,EAAG,iBAAiB,QAAQ,CAAC,CAAC,QAAQ,GAAQ,CAC7C,IAAM2D,EAAM,SAASa,EAAK,QAAQ,IAAK,EAAE,EACzC,GAAI,MAAMb,CAAG,EAAG,OAEhB,IAAMR,EAAU,SAASqB,EAAK,SAAW,EAAG,EAAE,EACxCpB,EAAU,SAASoB,EAAK,SAAW,EAAG,EAAE,EAExCC,EAAarE,EAAY+C,EAAU,EACnCuB,EAAaf,EAAMP,EAAU,EAInC,GAFuBqB,GAAcb,GAAMxD,GAAa2D,GAAMW,GAAcV,GAAML,GAAOQ,EAErE,CACnB,IAAMQ,EAAM,KAAK,IAAIf,EAAIxD,CAAS,EAC5BwE,EAAM,KAAK,IAAIb,EAAIU,CAAU,EAC7BI,EAAM,KAAK,IAAIb,EAAIL,CAAG,EACtBmB,EAAM,KAAK,IAAIX,EAAIO,CAAU,GAE/BC,IAAQf,GAAMgB,IAAQb,GAAMc,IAAQb,GAAMc,IAAQX,KACrD,EAAKQ,EAAK,EAAKC,EAAK,EAAKC,EAAK,EAAKC,EACnC,EAAW,GAEb,CACD,CAAC,CACF,CAAC,CACF,CAAC,EAGF,KAAKC,GAAS,CAAE,SAAUnB,EAAI,SAAUI,EAAI,OAAQD,EAAI,OAAQI,CAAG,EAKnE,KAAK,OAAO,CACb,CAEA,IAAI,QAAS,CACZ,OAAO,KAAKY,GAAO,QACpB,CACA,IAAI,QAAS,CACZ,OAAO,KAAKA,GAAO,MACpB,CACA,IAAI,QAAS,CACZ,OAAO,KAAKA,GAAO,QACpB,CACA,IAAI,QAAS,CACZ,OAAO,KAAKA,GAAO,MACpB,CAEA,YAAgB,CACf,KAAK,OAAO,CACb,EAEA,WAAe,CACd,GAAM,CAAE,WAAU,WAAU,SAAQ,UAAW,KAAKA,GAE9CX,EAAa,KAAK1L,GAAO,iBAC9B,6DACD,EAEA0L,EAAW,QAAQ,GAAa,CAC/B3E,EAAU,iBAAiB,8FAA8F,CAAC,CAAC,QAAQ,GAAM,CACxI9R,EAAG,UAAU,OAAO,WAAY,eAAgB,kBAAmB,gBAAiB,iBAAkB,gBAAgB,CACvH,CAAC,EAED8R,EAAU,iBAAiB,mBAAmB,CAAC,CAAC,QAAQ,GAAM,CAC7DO,EAAG,UAAU,OAAO,gBAAgB,CACrC,CAAC,CACF,CAAC,EAEG6D,EAAW,GAAKI,EAAW,GAE/BG,EAAW,QAAS,GAAc,CAKjC,MAJyB,KAAK3E,EAAU,iBAAiB,UAAU,CAAC,CAAC,CAAC,OAAO,GACrEO,EAAG,MAAM,UAAY,MAGpB,CAAC,CAAC,QAAQ,GAAM,CACxB,GAAM,CAAE,aAAc,KAAKuE,GAAcvE,CAAE,EACvCI,EAAY,IAGZA,GAAayD,GAAYzD,GAAa0D,GACzCrE,EAAU,iBAAiB,wBAAwBO,EAAG,QAAQ,MAAM,GAAG,CAAC,CAAC,QAAQ,GAAM,CACtFA,EAAG,UAAU,IAAI,UAAU,CAC5B,CAAC,EAMFA,EAAG,iBAAiB,QAAQ,CAAC,CAAC,QAAQ,GAAQ,CAC7C,IAAM2D,EAAM,SAASa,EAAK,QAAQ,IAAK,EAAE,EACzC,GAAI,MAAMb,CAAG,EAAG,OAEhB,IAAMR,EAAU,SAASqB,EAAK,SAAW,EAAG,EAAE,EACxCpB,EAAU,SAASoB,EAAK,SAAW,EAAG,EAAE,EAExCC,EAAarE,EAAY+C,EAAU,EACnCuB,EAAaf,EAAMP,EAAU,EAEhBqB,GAAcZ,GAAYzD,GAAa0D,GAAUY,GAAcT,GAAYN,GAAOO,IAGrGM,EAAK,UAAU,IAAI,UAAU,EAEzBpE,GAAayD,GAAUW,EAAK,UAAU,IAAI,cAAc,EACxDC,GAAcX,GAAQU,EAAK,UAAU,IAAI,iBAAiB,EAC1Db,GAAOM,GAAUO,EAAK,UAAU,IAAI,eAAe,EACnDE,GAAcR,GAAQM,EAAK,UAAU,IAAI,gBAAgB,EAC9D,CAAC,EACF,CAAC,CACF,CAAC,CACF,EAEA,IAAc,CACb,IAAMQ,EAAW,KAAKtM,GAAO,cAAc,gBAAgB,EACtDsM,GAILA,EAAS,iBAAiB,YAAc,GAAM,CAC7C,GAAI,EAAE,SAAW,EAAG,OAEpB,IAAMR,EAAO,EAAE,OAAO,QAAQ,QAAQ,EAEtC,GADI,CAACA,GACDA,EAAK,QAAQ,MAAQ,IAAA,IAAaA,EAAK,QAAQ,MAAQ,IAAA,GAAW,OAEtE,KAAK9L,GAAO,MAAM,WAAa,OAC/B,KAAKA,GAAO,MAAM,iBAAmB,OAErC,IAAMsH,EAAKwE,EAAK,QAAQ,IAAI,EACtB,CAAE,UAAWX,GAAa,KAAKU,GAAcvE,CAAE,EAC/CiE,EAAW,SAASO,EAAK,QAAQ,IAAK,EAAE,EAE9C,GAAIX,EAAW,EAAG,CACjB,KAAKnL,GAAO,MAAM,WAAa,GAC/B,KAAKA,GAAO,MAAM,iBAAmB,GACrC,MACD,CAEA,KAAK,SAASmL,EAAUI,CAAQ,EAChC,KAAK,SAASJ,EAAUI,EAAUJ,EAAUI,CAAQ,EAEpD,IAAIgB,EAAgBpB,EAChBqB,EAAUjB,EAER3L,EAAe,GAAc,CAElC,IAAI6M,EADa,SAAS,iBAAiB5M,EAAU,QAASA,EAAU,OAChD,CAAC,EAAE,QAAQ,QAAQ,EAE3C,GAAI,CAAC4M,GAAc,CAAC,KAAKzM,GAAO,SAASyM,CAAU,EAAG,CACrD,IAAMC,EAAW,KAAK1M,GAAO,iBAAiB,qFAAqF,EACnI,IAAK,IAAM2K,KAAK+B,EAAU,CACzB,IAAMC,EAAOhC,EAAE,sBAAsB,EACrC,GACC9K,EAAU,SAAW8M,EAAK,MAC1B9M,EAAU,SAAW8M,EAAK,OAC1B9M,EAAU,SAAW8M,EAAK,KAC1B9M,EAAU,SAAW8M,EAAK,OACzB,CACD,EAAahC,EACb,KACD,CACD,CACD,CAGA,GADI,CAAC8B,GACDA,EAAW,QAAQ,MAAQ,IAAA,IAAaA,EAAW,QAAQ,MAAQ,IAAA,GAAW,OAElF,IAAMG,EAAWH,EAAW,QAAQ,IAAI,EAClC,CAAE,UAAWrB,GAAW,KAAKS,GAAce,CAAQ,EACnDpB,EAAS,SAASiB,EAAW,QAAQ,IAAK,EAAE,EAE9CrB,EAAS,IACTmB,IAAkBnB,GAAUoB,IAAYhB,KAE5C,EAAgBJ,EAChB,EAAUI,EAEV,KAAK,SAASL,EAAUI,EAAUH,EAAQI,CAAM,EACjD,EAEM1L,MAAkB,CACvB,KAAKE,GAAO,MAAM,WAAa,GAC/B,KAAKA,GAAO,MAAM,iBAAmB,GAErC,SAAS,oBAAoB,YAAaJ,CAAW,EACrD,SAAS,oBAAoB,UAAWE,CAAS,CAClD,EAEA,SAAS,iBAAiB,YAAaF,CAAW,EAClD,SAAS,iBAAiB,UAAWE,CAAS,CAC/C,CAAC,CACF,CACD,ECtQa+M,EAAb,KAA4B,CAC3B,GACA,GAEA,GAAe,KACf,GAAa,KAEb,YAAY,EAAO,CAClB,KAAK7M,GAASjE,EACd,KAAKjF,GAAQiF,EAAM,YAAY,CAAC,CAAC,KAEjC,KAAK8O,GAAY,CAClB,CAEA,IAAI,aAAc,CACjB,OAAO,KAAKiC,EACb,CAEA,IAAI,YAAY,EAAM,CACrB,GAAI,CAAChB,EAAM,OAEX,KAAKgB,GAAehB,EACpBA,EAAK,MAAM,CAAE,cAAe,EAAK,CAAC,EAElC,KAAKiB,GAAajB,EAAK,QAAQ,IAAI,EACnC,IAAMpE,EAAY,SAAS,KAAKqF,GAAW,QAAQ,UAAW,EAAE,EAEhE,KAAK/M,GAAO,UAAU,SAAS0H,EAAW,KAAKoF,GAAa,QAAQ,GAAG,CACxE,CAGA,IAAc,EAAG,IAAS,CAEzB,GAAKhB,EAEL,QAAQ,EAAE,KAAV,CACC,IAAK,MACA,EAAE,SACA,KAAKkB,GAAmBlB,CAAI,GAChCA,EAAK,eAAe,CAAE,OAAQ,UAAW,MAAO,SAAU,CAAC,EAGvD,KAAKmB,GAAoBnB,CAAI,GACjCA,EAAK,eAAe,CAAE,OAAQ,UAAW,MAAO,SAAU,CAAC,EAG7D,MACD,IAAK,aACC,KAAKmB,GAAoBnB,CAAI,GACjCA,EAAK,eAAe,CAAE,OAAQ,UAAW,MAAO,SAAU,CAAC,EAE5D,MACD,IAAK,YACC,KAAKkB,GAAmBlB,CAAI,GAChCA,EAAK,eAAe,CAAE,OAAQ,UAAW,MAAO,SAAU,CAAC,CAG9D,CAEA,KAAK,YAAcA,EACnB,KAAK9L,GAAO,UAAU,SAAS,KAAK+M,GAAW,QAAQ,UAAWjB,EAAK,QAAQ,IAAK,KAAKiB,GAAW,QAAQ,UAAWjB,EAAK,QAAQ,GAAG,CAHvI,CAID,EAEA,IAAc,EAAG,IAAS,CACzB,GAAIA,EAAM,CACT,IAAIoB,EAAY,GAChB,OAAQ,EAAE,KAAV,CACC,IAAK,QACA,EAAE,SACD,KAAKC,GAAoBrB,CAAI,IAChC,EAAY,IAOd,MACD,IAAK,YACA,KAAKqB,GAAoBrB,CAAI,IAChC,EAAY,IAEb,MACD,IAAK,UACA,KAAKsB,GAAoBtB,CAAI,IAChC,EAAY,GAGf,CAEA,GAAIoB,EAAW,CACd,KAAK,YAAcpB,EACnB,KAAK9L,GAAO,UAAU,SAAS,KAAK+M,GAAW,QAAQ,UAAWjB,EAAK,QAAQ,IAAK,KAAKiB,GAAW,QAAQ,UAAWjB,EAAK,QAAQ,GAAG,EACvI,MACD,CACD,CAEA,IAAMjG,EAAY,SAAS,KAAKkH,GAAW,QAAQ,MAAO,EAAE,EACxDM,EAAiB,GACrB,OAAQ,EAAE,KAAV,CACC,IAAK,QACJ,GAAI,EAAE,SAAU,CACf,IAAM3L,EAAkB,KAAK4L,GAAoB,EACjD,EAAiB,KAAK,IAAIzH,EAAYnE,EAAkB,EAAG,CAAC,CAC7D,KACC,GAAiB,KAAK,IAAImE,EAAW,KAAK7F,GAAO,KAAK,MAAM,CAAC,EAE9D,MACD,IAAK,YACJ,EAAiB,KAAK,IAAI6F,EAAW,KAAK7F,GAAO,KAAK,MAAM,CAAC,EAC7D,MACD,IAAK,UACJ,IAAM0B,EAAkB,KAAK4L,GAAoB,EACjD,EAAiB,KAAK,IAAIzH,EAAYnE,EAAkB,EAAG,CAAC,CAE9D,CAEA,GAAI2L,EAAiB,EAAG,OAExB,IAAI3F,EAAY,SAAS,KAAKqF,GAAW,QAAQ,UAAW,EAAE,EACxD9B,EAAM,SAAS,KAAK6B,GAAa,QAAQ,IAAK,EAAE,EAChDrC,EAAU,SAAS,KAAKqC,GAAa,QAAS,EAAE,GAAK,EAE3D,OAAQ,EAAE,KAAV,CACC,IAAK,YACJ,GAAarC,EACb,MACD,IAAK,UACJ,GAEF,CAEA,KAAKzK,GAAO,WAAW,gBAAgBqN,EAAgB,SAAY,CAClE,IAAME,EAAc,KAAKC,GAAU9F,EAAWuD,CAAG,EAE7CsC,IACH,KAAK,YAAcA,EACnB,KAAKvN,GAAO,UAAU,SAAS,KAAK+M,GAAW,QAAQ,UAAWQ,EAAY,QAAQ,IAAK,KAAKR,GAAW,QAAQ,UAAWQ,EAAY,QAAQ,GAAG,EAEvJ,CAAC,CACF,EAEA,SAAY,GAAM,CAcjB,GAZI,EAAE,OAAO,UAAY,UACpB,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,OAAO,IAAI,GAC9B,CAAC,YAAY,aAAa,OAAO,KAAK,CAAC,CAAC,SAAS,EAAE,IAAI,GAKxD,CAAC,OAAO,iBAAiB,OAAO,OAAO,OAAO,CAAC,CAAC,SAAS,EAAE,OAAO,IAAI,IAKvE,CAAC,KAAKT,IAAgB,CAAC,KAAKC,GAC/B,OAGD,IAAIU,EACJ,OAAQ,EAAE,KAAV,CACC,IAAK,MACJ,EAAW,EAAE,SAAW,KAAKC,GAAiB,EAAI,KAAKC,GAAa,EACpE,MACD,IAAK,aACJ,EAAW,KAAKA,GAAa,EAC7B,MACD,IAAK,YACJ,EAAW,KAAKD,GAAiB,EACjC,MACD,IAAK,QACJ,EAAW,EAAE,SAAW,KAAKE,GAAW,EAAI,KAAKC,GAAa,EAC9D,MACD,IAAK,YACJ,EAAW,KAAKA,GAAa,EAC7B,MACD,IAAK,UACJ,EAAW,KAAKD,GAAW,CAE7B,CAEA,EAAE,eAAe,EAEb,CAAC,YAAY,aAAa,KAAK,CAAC,CAAC,SAAS,EAAE,IAAI,EACnD,KAAKE,GAAW,EAAGL,CAAQ,EAEnB,CAAC,QAAQ,UAAU,WAAW,CAAC,CAAC,SAAS,EAAE,IAAI,GACvD,KAAKM,GAAW,EAAGN,CAAQ,CAE7B,EAEA,OAAqB,CACpB,IAAMxC,EAAM,SAAS,KAAK6B,GAAa,QAAQ,IAAK,EAAE,EAChDpC,EAAU,SAAS,KAAKoC,GAAa,QAAS,EAAE,GAAK,EACrDjH,EAAY,SAAS,KAAKkH,GAAW,QAAQ,MAAO,EAAE,EACtDrF,EAAY,SAAS,KAAKqF,GAAW,QAAQ,UAAW,EAAE,EAE1DiB,EAAU/C,EAAMP,EAElB+C,EAAW,KAAKzN,GAAO,cAAc,6BAA6B0H,EAAU,kBAAkBsG,EAAQ,GAAG,EAK7G,MAJA,CACCP,IAAW,KAAKzN,GAAO,cAAc,wBAAwB6F,EAAU,kBAAkBmI,EAAQ,GAAG,EAG9FP,CACR,EAEA,OAAyB,CAExB,IAAMxC,EAAM,SAAS,KAAK6B,GAAa,QAAQ,IAAK,EAAE,EAChDjH,EAAY,SAAS,KAAKkH,GAAW,QAAQ,MAAO,EAAE,EACtDrF,EAAY,SAAS,KAAKqF,GAAW,QAAQ,UAAW,EAAE,EAE5DU,EACJ,IAAK,IAAI,EAAIxC,EAAM,EAAG,GAAK,IAC1B,EAAW,KAAKjL,GAAO,cAAc,6BAA6B0H,EAAU,kBAAkB,EAAE,GAAG,EACnG,AACC+F,IAAW,KAAKzN,GAAO,cAAc,wBAAwB6F,EAAU,kBAAkB,EAAE,GAAG,EAG3F,IANyB,KAS9B,OAAO4H,CACR,EAIA,IAAa,EAAW,IAAQ,CAE/B,IAAM9K,EAAM,KAAK3C,GAAO,cAAc,6BAA6B0H,EAAU,GAAG,EAChF,GAAI,CAAC/E,EAAK,OAEV,IAAMkD,EAAY,SAASlD,EAAI,QAAQ,MAAO,EAAE,EAE5C8J,EAAa,KAAKzM,GAAO,cAAc,6BAA6B0H,EAAU,kBAAkBuD,EAAI,GAAG,EA2B3G,OA1BKwB,IACJ,KAAKzM,GAAO,iBAAiB,6BAA6B0H,EAAU,MAAM,CAAC,CAAC,QAAQ,GAAS,CAC5F,IAAMuG,EAAU,SAASvL,EAAM,QAAQ,IAAK,EAAE,EACxCgI,EAAU,SAAShI,EAAM,QAAS,EAAE,GAAK,EAE3CuI,GAAOgD,GAAWhD,EAAMgD,EAAUvD,IACrC,EAAahI,EAEf,CAAC,EAEI+J,IACJ,EAAa,KAAKzM,GAAO,cAAc,wBAAwB6F,EAAU,kBAAkBoF,EAAI,GAAG,EAE7FwB,GACJ,KAAKzM,GAAO,iBAAiB,wBAAwB6F,EAAU,MAAM,CAAC,CAAC,QAAQ,GAAS,CACvF,IAAMoI,EAAU,SAASvL,EAAM,QAAQ,IAAK,EAAE,EACxCgI,EAAU,SAAShI,EAAM,QAAS,EAAE,GAAK,EAE3CuI,GAAOgD,GAAWhD,EAAMgD,EAAUvD,IACrC,EAAahI,EAEf,CAAC,IAKG+J,CACR,EAEA,OAAmB,CAClB,IAAMxB,EAAM,SAAS,KAAK6B,GAAa,QAAQ,IAAK,EAAE,EAChDpF,EAAY,SAAS,KAAKqF,GAAW,QAAQ,UAAW,EAAE,EAEhE,OAAO,KAAKS,GAAU9F,EAAY,EAAGuD,CAAG,CACzC,EAEA,OAAqB,CACpB,IAAMA,EAAM,SAAS,KAAK6B,GAAa,QAAQ,IAAK,EAAE,EAChDpF,EAAY,SAAS,KAAKqF,GAAW,QAAQ,UAAW,EAAE,EAC1DtC,EAAU,SAAS,KAAKqC,GAAa,QAAS,EAAE,GAAK,EAE3D,OAAO,KAAKU,GAAU9F,EAAY+C,EAASQ,CAAG,CAC/C,EAGA,GAAuB,GAAS,CAC/B,IAAMtG,EAAe,KAAK3E,GAAO,cAAc,gBAAgB,EAC/D,GAAI,CAAC2E,GAAgB,CAACmH,EAAM,MAAO,GAEnC,IAAMoC,EAAWpC,EAAK,sBAAsB,EACtCqC,EAAexJ,EAAa,sBAAsB,EAClDyJ,EAAczJ,EAAa,cAAc,OAAO,CAAC,EAAE,cAAgB,EAGzE,OAAOuJ,EAAS,KAAQC,EAAa,IAAMC,CAC5C,EAGA,GAAuB,GAAS,CAC/B,IAAMzJ,EAAe,KAAK3E,GAAO,cAAc,gBAAgB,EAC/D,GAAI,CAAC2E,GAAgB,CAACmH,EAAM,MAAO,GAEnC,IAAMoC,EAAWpC,EAAK,sBAAsB,EACtCqC,EAAexJ,EAAa,sBAAsB,EAGxD,OAAOuJ,EAAS,QAAUC,EAAa,MACxC,EAGA,GAAsB,GAAS,CAC9B,IAAME,EAAgB,KAAKrO,GAAO,cAAc,oBAAoB,EACpE,GAAI,CAACqO,GAAiB,CAACvC,EAAM,MAAO,GAEpC,IAAMoC,EAAWpC,EAAK,sBAAsB,EACtCqC,EAAeE,EAAc,sBAAsB,EAGzD,OAAOH,EAAS,MAAQC,EAAa,IACtC,EAGA,GAAuB,GAAS,CAC/B,IAAME,EAAgB,KAAKrO,GAAO,cAAc,oBAAoB,EACpE,GAAI,CAACqO,GAAiB,CAACvC,EAAM,MAAO,GAEpC,IAAMoC,EAAWpC,EAAK,sBAAsB,EACtCqC,EAAeE,EAAc,sBAAsB,EAGzD,OAAOH,EAAS,OAASC,EAAa,KACvC,EAUA,OAA4B,CAC3B,IAAMxJ,EAAe,KAAK3E,GAAO,cAAc,gBAAgB,EACzDsO,EAAiB3J,EAAa,cAAgBA,EAAa,cAAc,OAAO,CAAC,EAAE,cAAgB,GACnGlD,EAAY,KAAKzB,GAAO,WAAW,aAAa,EAGtD,OAAO,KAAK,IAAI,EAAG,KAAK,MAAMsO,EAAiB7M,CAAS,CAAC,CAC1D,EAEA,IAAc,CACb,KAAKzB,GAAO,iBAAiB,YAAc,GAAM,CAChD,GAAI,EAAE,SAAW,EAAG,OACpB,IAAM8L,EAAO,EAAE,OAAO,QAAQ,QAAQ,EACjCA,GACDA,EAAK,QAAQ,QAAU,IAAA,IAAaA,EAAK,QAAQ,MAAQ,IAAA,KAEzDA,EAAK,cAAc,oBAAoB,EAC1C,KAAK9L,GAAO,IAAI,MAAM8L,EAAK,QAAQ,KAAK,EAExC,KAAK,YAAcA,EAErB,CAAC,EAED,KAAK9L,GAAO,iBAAiB,UAAY,GAAM,CAC1C,CAAC,QAAS,MAAO,UAAW,YAAa,YAAa,YAAY,CAAC,CAAC,SAAS,EAAE,IAAI,GACtF,KAAK,SAAS,CAAC,CAEjB,CAAC,CACF,CACD,EC7WMuO,EAAgB,EAETC,EAAb,KAAwB,CACpB,GACA,GACA,GACA,GAEA,GAAkB,KAClB,GAAgB,KAChB,GAAuB,KACvB,GAAc,KACd,GAAU,EACV,GAAiB,EACjB,GAAqB,EACrB,GAAkB,EAClB,GAAa,EAEb,YAAY,EAAO,CACf,KAAKxO,GAASjE,EACd,KAAKjF,GAAQiF,EAAM,YAAY,CAAC,CAAC,KACjC,KAAK0S,GAAS,KAAKzO,GAAO,cAAc,8BAA8B,EAEtE,KAAK0O,GAAW,KAAKD,GAAO,cAAc,kBAAkB,EAC5D,KAAK,WAAW,CACpB,CAEA,SAAU,CACN,KAAKzO,GAAO,oBAAoB,cAAe,KAAK2O,EAAc,EAClE,KAAK3O,GAAO,oBAAoB,cAAe,KAAK4O,EAAc,EAClE,KAAK5O,GAAO,oBAAoB,WAAY,KAAK6O,EAAW,CAChE,CAEA,cAAc,EAAgB,OAAQ,CAClC,IAAMnD,EAAa,MAAM,KAAK,KAAK1L,GAAO,iBAAiB,iBAAiB8O,GAAe,CAAC,EAC5F,GAAIpD,EAAW,SAAW,EAQ1B,IANyBoD,IAAkB,QAAUA,IAAkB,SAEnE,MAAK9O,GAAO,cACZ0L,EAAW,EAAE,CAAC,cAAc,OAAO,CAAC,EAAE,aAAa,cAAc,IAAM,OAG3D,CAEZ,IAAMqD,EAAgBrD,EAAW,EAAE,CAAC,cAAc,gBAAgB,EAClE,GAAI,CAACqD,EAAe,OAEpB,IAAIC,EAAa,EACXC,EAAY,CAAC,EAEnB,MAAM,KAAKF,EAAc,iBAAiB,KAAK,CAAC,CAAC,CAAC,QAAQ,GAAO,CAC7D,IAAMG,EAASjE,EAAI,aAAa,UAAU,EACpClV,EAAI,SAASkV,EAAI,aAAa,OAAO,EAAG,EAAE,EAC3C,MAAMlV,CAAC,IACR,EAAUmZ,GAAUnZ,EACpB,GAAcA,EAEtB,CAAC,EAED2V,EAAW,QAAQ,GAAa,CAC5B,IAAMyD,EAASpI,EAAU,iBAAiB,OAAO,EAE7C+H,IAAkB,OAClBK,EAAO,QAAQ,GAAO,CAClB,EAAI,MAAM,MAAQ,GAAGH,EAAW,GAEpC,CAAC,GAED,EAAU,MAAM,KAAO,OAAOA,EAAW,IACzC,EAAU,MAAM,MAAQ,GAAGA,EAAW,IACtC,EAAU,MAAM,SAAW,GAAGA,EAAW,IACzC,EAAU,MAAM,SAAW,GAAGA,EAAW,IAEzCG,EAAO,QAAQ,GAAO,CAClB,EAAI,MAAM,MAAQ,GAAGH,EAAW,IAChC,EAAI,MAAM,SAAW,GAAGA,EAAW,IACnC,EAAI,MAAM,SAAW,GAAGA,EAAW,IAEnC,OAAO,QAAQC,CAAS,CAAC,CAAC,SAAS,CAACC,EAAQnZ,KAAO,CAC/CgF,EAAI,iBAAiB,gBAAgBmU,EAAO,mBAAmBA,EAAO,GAAG,CAAC,CAAC,QAAQ,GAAQ,CACvF,EAAK,MAAM,MAAQ,GAAGnZ,EAAE,IACxB,EAAK,MAAM,SAAW,GAAGA,EAAE,IAC3B,EAAK,MAAM,SAAW,GAAGA,EAAE,GAC/B,CAAC,CACL,CAAC,CACL,CAAC,EAET,CAAC,CACL,MACI2V,EAAW,QAAQ,GAAa,CAE5B3E,EADyB,iBAAiB,OACrC,CAAC,CAAC,QAAQ,GAAO,CAItB,CAAC,CACL,CAAC,EAGL,KAAK/G,GAAO,cAAc,uBAAuB,CAAC,EAAE,QAAQ,CAHvD,CAIT,CAEA,eAAe,EAAgB,EAAO,EAAgB,KAAM,CAExD,IAAIoP,EAAa,CAAC,EAIlB,GAFA,EAAa,MAAM,KAAK,KAAKpP,GAAO,iBAAiB,gCAAgCqP,EAAe,GAAG,CAAC,EAEpGD,EAAW,SAAW,EAAG,OAE7B,IAAME,EAAiBF,EAAW,EAAE,CAAC,QAAQ,6DAA6D,EACpGG,EAAwBT,IAC1BQ,GAAgB,UAAU,SAAS,mBAAmB,EAAI,OACtDA,GAAgB,UAAU,SAAS,oBAAoB,EAAI,QAAU,QAG7EF,EAAW,QAAQ,GAAO,CACtBnE,EAAI,aAAa,QAASuE,CAAK,EAC/B,EAAI,MAAM,MAAQ,GAAGA,EAAM,GAC/B,CAAC,EAED,IAAMC,EAAY,KAAKzP,GAAO,aAAa,cAAc,0BAA0BqP,EAAe,GAAG,EACjGI,IACAA,EAAU,aAAa,QAASD,CAAK,EACrC,EAAU,MAAM,MAAQ,GAAGA,EAAM,KAGrC,KAAK,cAAcD,CAAqB,GAEpCA,IAA0B,QAAUA,IAA0B,UAC9D,KAAK,cAAc,MAAM,EAG7B,KAAKvP,GAAO,YAAY,QAAQ,CACpC,CAEA,GAAgB,EAAY,CACxB,GAAI,KAAKA,GAAO,aAAc,MAAO,GACrC,IAAMpD,EAAQ6P,GAAY,QAAQ,OAAO,EAEzC,MADA,GAAI7P,GAASA,EAAM,aAAa,cAAc,IAAM,OAExD,CAEA,YAAa,CACT,KAAKoD,GAAO,iBAAiB,cAAe,KAAK2O,EAAc,EAI/D,KAAK3O,GAAO,yBAAyB,WAAY,KAAK6O,GAAa,cAAe,KAAKD,EAAc,CACzG,CAEA,GAAkB,EAAM,CACpB,IAAM7H,EAAY+E,EAAK,QAAQ,6DAA6D,EAI5F,OAHK/E,EACDA,EAAU,UAAU,SAAS,mBAAmB,EAAU,OAC1DA,EAAU,UAAU,SAAS,oBAAoB,EAAU,QACxD,OAHgB,IAI3B,CAEA,GAAkB,GAAM,CAGpB,IAAM2I,EAAa,EAAE,OAAO,QAAQ,OAAO,EAC3C,GAAI,CAACA,EAAY,OAEjB,IAAM5D,EAAO,EAAE,OAAO,QAAQ,QAAQ,EAOtC,GALA4D,EAAW,iBAAiB,iBAAiB,CAAC,CAAC,QAAQ,GAAM,CACrDza,IAAO6W,GAAM7W,EAAG,UAAU,OAAO,gBAAgB,CACzD,CAAC,EAEG,CAAC6W,GAAQA,EAAK,QAAQ,MAAQ,IAAA,IAC9BA,EAAK,aAAa,WAAW,IAAM,OAAQ,OAE/C,IAAMa,EAAOb,EAAK,sBAAsB,EAClC6D,EAAU,EAAE,QAAUhD,EAAK,KAC3BiD,EAAaD,GAAWpB,EACxBsB,EAAelD,EAAK,MAAQgD,GAAYpB,EAE9C,GAAIqB,EAAY,CACZ,IAAME,EAAWhE,EAAK,uBACtB,GAAI,CAACgE,GAAYA,EAAS,aAAa,WAAW,IAAM,OAAQ,CAC5DhE,EAAK,UAAU,OAAO,gBAAgB,EACtC,MACJ,CACJ,CAEI8D,GAAcC,EACd/D,EAAK,UAAU,IAAI,gBAAgB,EAEnCA,EAAK,UAAU,OAAO,gBAAgB,CAE9C,EAEA,GAAkB,GAAM,CAGpB,GAAI,CADe,EAAE,aAAa,QAAQ,OAC5B,EAAG,OAEjB,IAAMA,EAAO,EAAE,aAAa,QAAQ,QAAQ,EAE5C,GAAI,CAACA,GAAQ,CAACA,EAAK,UAAU,SAAS,gBAAgB,EAAG,OAIzD,EAAE,eAAe,EACjB,IAAMa,EAAOb,EAAK,sBAAsB,EAClC6D,EAAU,EAAE,QAAUhD,EAAK,KAE7BF,EAAaX,EAEjB,GAAI6D,GAAWpB,EAAe,CAC1B,IAAMuB,EAAWhE,EAAK,uBACtB,GAAIgE,GAAYA,EAAS,QAAQ,MAAQ,IAAA,IAAaA,EAAS,aAAa,WAAW,IAAM,OACzF,EAAaA,OACV,GAAI,CAAChE,EAAK,uBACb,MAER,CAEA,KAAKiE,GAActD,EACnB,KAAKuD,GAAuB,KAAKC,GAAkBxD,CAAU,EAE7D,IAAM1F,EAAY,KAAK/G,GAAO,cAAc,iBAAiB,KAAKgQ,IAAsB,EACxF,GAAI,CAACjJ,EAAW,OAEhB,IAAMmJ,EAAe,SAASzD,EAAW,QAAQ,IAAK,EAAE,EAClD/B,EAAU+B,EAAW,SAAW,EAItC,GAHA,KAAK0D,GAAkBD,EAAexF,EAAU,EAE9B,KAAK0F,GAAgB3D,CAC3B,EAAG,CACX,KAAK4D,GAAgB,KAAKF,GAAkB,EAC5C,IAAMG,EAAYvJ,EAAU,cAAc,iBAAiB,KAAKsJ,GAAc,GAAG,EAC7EC,EACA,KAAKC,GAAqB,SAASD,EAAU,aAAa,OAAO,EAAG,EAAE,GAAK,IAE3E,KAAKD,GAAgB,IAE7B,KACI,MAAKA,GAAgB,KAGzB,IAAMG,EAAa/D,EAAW,sBAAsB,EAC9CgE,EAAY,KAAKzQ,GAAO,sBAAsB,EAEpD,KAAK0Q,GAAkBF,EAAW,MAClC,KAAKG,GAAaH,EAAW,KAAOC,EAAU,KAG9C,IAAMG,EADc7J,EAAU,cAAc,iBAAiB,KAAKoJ,GAAgB,GAC1D,CAAC,EAAE,aAAa,OAAO,EAC/C,KAAKU,GAAkBD,GAAS,CAAC,MAAM,SAASA,EAAO,EAAE,CAAC,EAAK,SAASA,EAAO,EAAE,EAAIJ,EAAW,MAAQ9F,EAExG,KAAKoG,GAAU,EAAE,QAEb,KAAKrC,KACL,KAAKA,GAAO,UAAU,IAAI,QAAQ,EAClC,KAAKsC,GAAiB,EAAE,OAAO,GAGnC,OAAO,iBAAiB,cAAe,KAAKC,EAAW,EACvD,OAAO,iBAAiB,YAAa,KAAKC,GAAY,CAAE,KAAM,EAAK,CAAC,CACxE,EAEA,GAAiB,EAAS,CACtB,IAAIC,EAAOC,EAAU,KAAKL,GACpBM,EAAY,KAAKhB,GAAgB,KAAKL,EAAW,EAEvD,GAAIqB,GAAa,KAAKf,KAAkB,KAAM,CAC1C,IAAMgB,EAAU,KAAKd,GAAA,GACfe,EAAU,EAAE,KAAKT,GAAA,IACvB,EAAO,KAAK,IAAIS,EAAS,KAAK,IAAIJ,EAAMG,CAAO,CAAC,CACpD,CAEA,IAAME,EAAkB,KAAK,IAAA,GAAqB,KAAKV,GAAiBK,CAAI,EAGxEM,EAAgBL,EADD,KAAKpB,GAAY,sBACG,CAAC,CAAC,KAEzC,GAAIqB,GAAa,KAAKf,KAAkB,KAAM,CAC1C,IAAMoB,EAAe,KAAKf,IAAmB,KAAKH,GAAA,IAClD,EAAgB,KAAK,IAAIiB,EAAeC,CAAY,CACxD,CAEA,IAAMC,EAAmB,KAAK,IAAA,GAAqBF,CAAa,EAE5D,KAAK/C,KACL,KAAKA,GAAO,MAAM,YAAY,6BAA8B,GAAG,KAAKkC,GAAW,GAAG,EAClF,KAAKlC,GAAO,MAAM,YAAY,8BAA+B,GAAGiD,EAAiB,GAAG,GAGxF,IAAMC,EAAY,KAAKjD,IAAU,cAAc,aAAa,EACxDiD,IACA,EAAU,YAAc,GAAG,KAAK,MAAMJ,CAAe,EAAE,IAE/D,CAEA,GAAe,GAAM,CACjB,KAAKR,GAAiB,EAAE,OAAO,CACnC,EAEA,GAAc,GAAM,CAChB,OAAO,oBAAoB,cAAe,KAAKC,EAAW,EAE1D,IAAME,EAAO,EAAE,QAAU,KAAKJ,GACxBM,EAAY,KAAKhB,GAAgB,KAAKL,EAAW,EACnD6B,EAAa,EAEjB,GAAIR,GAAa,KAAKf,KAAkB,KAAM,CAC1C,IAAIwB,EAAc,KAAK,IAAA,GAAqB,KAAKhB,GAAiBK,CAAI,EAClEY,EAAe,KAAKjB,GAAiB,KAAKN,GAAqBsB,EAE/DC,EAAA,KACA,EAAA,GACA,EAAc,KAAKjB,GAAiB,KAAKN,GAAA,IAG7C,KAAK,eAAe,KAAKJ,GAAiB0B,EAAa,KAAK7B,EAAoB,EAChF,KAAK,eAAe,KAAKK,GAAeyB,EAAc,KAAK9B,EAAoB,EAC/E,EAAa6B,CACjB,KAAO,CACH,IAAMA,EAAc,KAAK,IAAA,GAAqB,KAAKhB,GAAiBK,CAAI,EACpE,KAAKf,KAAoB,MAAQ,KAAKH,KACtC,KAAK,eAAe,KAAKG,GAAiB0B,EAAa,KAAK7B,EAAoB,EAChF,EAAa6B,EAErB,CAEA,GAAI,KAAK9B,GAAa,CAClB,IAAMtD,EAAa,KAAKsD,GACpBtD,EAAW,aAAa,WAAW,IAAM,QAAUmF,EAAa,KAChE,EAAW,QAAQ,YAAc,OAAOA,CAAU,EAE1D,CAEI,KAAKnD,KACL,KAAKC,IAAU,UAAU,IAAI,UAAU,EACvC,eAAiB,CACb,KAAKD,GAAO,UAAU,OAAO,QAAQ,EACrC,KAAKC,IAAU,UAAU,OAAO,UAAU,CAC9C,EAAG,GAAG,GAGV,KAAKyB,GAAkB,KACvB,KAAKE,GAAgB,KACrB,KAAKL,GAAuB,KAC5B,KAAKD,GAAc,IACvB,EAEA,GAAe,GAAM,CAGjB,IAAIjE,EADa,EAAE,OACC,QAAQ,QAAQ,EACpC,GAAI,CAACA,GAAQ,CAACA,EAAK,UAAU,SAAS,gBAAgB,EAAG,OAEzD,IAAMa,EAAOb,EAAK,sBAAsB,EACxB,EAAE,QAAUa,EAAK,MAElB4B,IACX,EAAOzC,EAAK,wBAGhB,IAAMoE,EAAe,SAASpE,EAAK,QAAQ,IAAK,EAAE,EAC5CiG,EAAY,KAAK/R,GAAO,cAAc,yBAAyBkQ,EAAa,GAAG,EACrF,GAAI,CAAC6B,GAAa,CAACA,EAAU,QAAQ,MAAQA,EAAU,UAAU,SAAS,YAAY,EAAG,OAEzF,IAAIC,EAAe,EACnB,MAAM,KAAKD,EAAU,kBAAkB,QAAQ,CAAC,CAAC,QAAS,GAAQ,CAC9D,OAAQ9Z,EAAI,QAAZ,CACI,IAAK,OAAQ,GAAgB,EAAG,MAChC,IAAK,MAAO,GAAgB,EAAG,MAC/B,IAAK,SAAU,GAAgB,GAAI,MACnC,IAAK,SAAU,GAAgB,GAAI,MACnC,IAAK,QACD,QAASA,EAAI,MAAQ,OAAA,CAAQ,YAAY,EAAzC,CAEI,IAAK,WACL,IAAK,QACD,GAAgB,GAChB,MAGJ,IAAK,SACL,IAAK,SACL,IAAK,QACL,IAAK,QACD,GAAgB,GAChB,MAGJ,IAAK,QACL,IAAK,OACL,IAAK,QACD,GAAgB,GAChB,MAGJ,IAAK,SACD,GAAgB,EAChB,MAeJ,QACI,GAAgB,EAExB,CAER,CACJ,CAAC,EAED,IAAMga,EAAW,KAAKnb,GAAM,OAAO,IAAI,CAAC,CAAC,QAAQib,EAAU,QAAQ,IAAI,EAGjEG,EADgB,OAAO,iBAAiBH,CACrB,CAAC,CAAC,MAAQ,kBAE7BI,EAAarG,EAAK,WAAa,GAEjCsG,GADe,KAAK,gBAAgBD,EAAYD,CACvB,CAAC,CAAC,OAAS,GAAK,GAE7C,KAAKpb,GAAM,YAAc,CAErB,KAAKkJ,GAAO,KAAK,SAAS,CAAC,CAAC,SAAS,EAAQ,IAAQ,CACjD,IAAMqS,EAAM,OAAON,EAAU,QAAQ,KAAO,KAAKjb,GAAM,WAAW,SAASib,EAAU,QAAQ,KAAMpZ,EAAQpB,CAAG,EAAIoB,EAAO,EAAEsZ,IAAa,EAAE,CAAC,CAAC,KAAK,EAC3IK,EAAO,KAAK,gBAAgBD,EAAKH,CAAI,EACvCI,EAAK,OAASA,EAAK,MAAQF,IAC3B,EAAeE,EAAK,MAE5B,CAAC,EAED,IAAMC,EAAkB,KAAK,IAAI,GAAI,KAAK,IAAI,IAAK,KAAK,KAAKH,CAAY,EAAIJ,CAAY,CAAC,EAE1F,KAAK,eAAeD,EAAU,QAAQ,IAAKQ,EAAiB,KAAKtC,GAAkBnE,CAAI,CAAC,CAC5F,CAAC,CACL,CACJ,EAGa0G,EAAb,cAAqC,WAAY,CAG7C,aAAc,CACV,MAAM,CACV,CAEA,mBAAoB,CAEhB,KAAKC,GAAU,CACnB,CAEA,OAAkB,CACd,KAAK,UAAY;;;;SAKrB,CACJ,EAEK,eAAe,IAAI,8BAA8B,GAClD,eAAe,OAAO,+BAAgCD,CAAe,ECzdzE,IAAaE,EAAb,KAAsB,CAClB,GACA,GACA,GAEA,GAAc,GACd,GAAc,KACd,GAAkB,KAClB,GAAkB,KAClB,GAAU,EACV,GAAS,KAET,YAAY,EAAO,CACf,KAAK1S,GAASjE,EACd,KAAK4W,GAAQ,KAAK3S,GAAO,cAAc,oBAAoB,EAC3D,KAAK4S,GAAQ,KAAK5S,GAAO,cAAc,oBAAoB,EAC3D,KAAK,WAAW,CACpB,CAEA,YAAa,CACT,KAAKA,GAAO,iBAAiB,cAAe,KAAK4O,EAAc,CACnE,CAEA,IAAkB,CACd,IAAM7X,EAAO,KAAKiJ,GAAO,YAAY,CAAC,EAAE,KACxC,OAAO,KAAKA,GAAO,aAAa,aAAa,IAAM,QAAUjJ,GAAM,aAAa,aAAa,IAAM,MACvG,CAEA,GAAyB,EAAG,EAAG,CAC3B,IAAM8b,EAAO,KAAK7S,GAAO,YAAY,EACjC/K,EAAK4d,EAAK,iBAAmBA,EAAK,iBAAiB7T,EAAG8T,CAAC,EAAI,SAAS,iBAAiB9T,EAAG8T,CAAC,EAE7F,KAAO7d,GAAMA,EAAG,YAAcA,EAAG,WAAW,kBAAkB,CAC1D,IAAM8d,EAAS9d,EAAG,WAAW,iBAAiB+J,EAAG8T,CAAC,EAClD,GAAI,CAACC,GAAUA,IAAW9d,EAAI,MAC9B,EAAK8d,CACT,CAEA,OAAO9d,CACX,CAEA,GAAkB,EAAM,CACpB,GAAI,CAAC6W,GAAQA,EAAK,QAAQ,MAAQ,IAAA,GAAW,OAAO,KAEpD,IAAMP,EAAW,SAASO,EAAK,QAAQ,IAAK,EAAE,EACxCpB,EAAUoB,EAAK,SAAW,EAC1BN,EAASD,EAAWb,EAAU,EAC9BjT,EAAWqU,EAAK,QAAQ,IAAI,CAAC,EAAE,iBAAmB,EAElDlP,EAAQkP,EAAK,QAAQ,OAAO,EAClC,GAAI,CAAClP,EAAO,MAAO,CAAE,WAAU,UAAS,SAAQ,WAAU,QAAS,GAAO,iBAAkB,KAAM,aAAc,EAAK,EAErH,IAAMoW,EAAcpW,EAAM,iBAAiB,oBAAoB,EAC3DqW,EAAoB,GACpBC,EAAe,GACfC,EAAmB,KAEvB,IAAK,IAAMC,KAAWJ,EAAa,CAC/B,GAAII,IAAYtH,GAAQsH,EAAQ,QAAQ,MAAQ,IAAA,GAAW,SAE3D,IAAMC,EAAW,SAASD,EAAQ,QAAQ,IAAK,EAAE,EAC3CE,EAAUF,EAAQ,SAAW,EAC7BG,EAASF,EAAWC,EAAU,GAChBF,EAAQ,QAAQ,IAAI,CAAC,EAAE,iBAAmB,GAE5C3b,GAAY4b,GAAY9H,GAAYgI,GAAU/H,GAAU8H,EAAU5I,IAC3EyI,GAGD,EAAiB,SAAW,KAAK,IAAIA,EAAiB,SAAUE,CAAQ,EACxE,EAAiB,OAAS,KAAK,IAAIF,EAAiB,OAAQI,CAAM,GAHlE,EAAmB,CAAE,SAAUF,EAAU,OAAQE,CAAO,GAO5CA,EAAShI,GAAY8H,EAAW7H,IAEtB6H,GAAY9H,GAAYgI,GAAU/H,EAGpD8H,EAAU5I,IACV,EAAoB,KAEjB2I,EAAW9H,GAAYgI,EAAS/H,KACjC6H,GAAY9H,GAAYgI,GAAU/H,IACpC,EAAe,KAI/B,CAEA,IAAMgI,EAAcP,GAAqBC,EAEzC,MAAO,CACH,WACA,QAASM,EAAc9I,EAAU,EACjC,OAAQ8I,EAAchI,EAASD,EAC/B,WACA,QAASiI,EACT,mBACA,cACJ,CACJ,CAEA,GAA0B,EAAM,CAC5B,IAAMC,EAAa,KAAKC,GAAkB5H,CAAI,EAC9C,GAAI,CAAC2H,EAAY,OAAO,KAExB,GAAM,CAAE,WAAU,SAAQ,WAAYA,EAGhCE,EAAY7H,EAAK,QAAQ,OAAO,EACtC,GAAI,CAAC6H,EAAW,OAAO,KAEvB,IAAIC,EAAU,IAAUC,EAAW,KAAWC,EAAS,IAAUC,EAAY,KACvEC,EAAc,CAAC,EAwBrB,GAtBAL,EAAU,iBAAiB,oBAAoB,CAAC,CAAC,QAAQ,GAAK,CAC1D,GAAIhJ,EAAE,QAAQ,MAAQ,IAAA,GAAW,OACjC,IAAMsJ,EAAO,SAAStJ,EAAE,QAAQ,IAAK,EAAE,EAEjCuJ,EAAOD,GADCtJ,EAAE,SAAW,GACC,EAM5B,GAJiBwJ,EACVF,GAAQ1I,GAAY2I,GAAQ1I,EAC5Bb,IAAMmB,EAEC,CACV,IAAMa,EAAOhC,EAAE,sBAAsB,EACrC,EAAU,KAAK,IAAIiJ,EAASjH,EAAK,IAAI,EACrC,EAAW,KAAK,IAAIkH,EAAUlH,EAAK,KAAK,EACxC,EAAS,KAAK,IAAImH,EAAQnH,EAAK,GAAG,EAClC,EAAY,KAAK,IAAIoH,EAAWpH,EAAK,MAAM,EAE3C,IAAMyH,EAAgB,OAAO,iBAAiBzJ,CAAC,EAC/CqJ,EAAY,KAAK,CAAE,GAAIrJ,EAAG,OAAM,MAAOyJ,CAAc,CAAC,CAC1D,CACJ,CAAC,EAEGJ,EAAY,SAAW,EAAG,OAAO,KAErC,IAAMK,EAAaR,EAAWD,EACxBU,EAAcP,EAAYD,EAE1BS,EAAgB,SAAS,cAAc,KAAK,EAwClD,MAvCA,GAAc,UAAY,sBAC1B,EAAc,MAAM,SAAW,WAC/B,EAAc,MAAM,MAAQ,GAAGF,EAAW,IAC1C,EAAc,MAAM,OAAS,GAAGC,EAAY,IAE5CN,EAAY,SAAS,CAAE,KAAI,OAAM,WAAY,CACzC,IAAMQ,EAAavf,EAAG,UAAU,EAAI,EAEpC,EAAW,MAAM,SAAW,WAC5B,EAAW,MAAM,KAAO,GAAG0X,EAAK,KAAOiH,EAAQ,IAC/C,EAAW,MAAM,IAAM,GAAGjH,EAAK,IAAMmH,EAAO,IAE5C,EAAW,MAAM,MAAQ,GAAGnH,EAAK,MAAM,IACvC,EAAW,MAAM,SAAW,GAAGA,EAAK,MAAM,IAC1C,EAAW,MAAM,SAAW,OAE5B,EAAW,MAAM,OAAS,GAAGA,EAAK,OAAO,IACzC,EAAW,MAAM,UAAY,aAC7B,EAAW,MAAM,OAAS,IAE1B,EAAW,MAAM,gBAAkB8H,EAAM,kBAAoB,eAAiBA,EAAM,kBAAoB,mBAClGA,EAAM,gBACN,UACN,EAAW,MAAM,MAAQA,EAAM,MAC/B,EAAW,MAAM,KAAOA,EAAM,KAC9B,EAAW,MAAM,WAAaA,EAAM,WACpC,EAAW,MAAM,SAAWA,EAAM,SAClC,EAAW,MAAM,UAAYA,EAAM,UACnC,EAAW,MAAM,QAAUA,EAAM,QACjC,EAAW,MAAM,OAASA,EAAM,OAChC,EAAW,MAAM,YAAcA,EAAM,YACrC,EAAW,MAAM,aAAeA,EAAM,aACtC,EAAW,MAAM,QAAU,OAC3B,EAAW,MAAM,WAAa,SAC9B,EAAW,MAAM,eAAiBA,EAAM,YAAc,SAAW,SAAYA,EAAM,YAAc,QAAU,WAAa,aAExHF,EAAc,YAAYC,CAAU,CACxC,CAAC,EAEM,CACH,QAASD,EACT,OAAQ,CACJ,KAAMX,EACN,MAAOC,EACP,IAAKC,EACL,OAAQC,EACR,MAAOM,EACP,OAAQC,CACZ,CACJ,CACJ,CAEA,GAAkB,GAAM,CAIpB,GAHI,CAAC,KAAKI,GAAgB,GAGtB,CADe,EAAE,OAAO,QAAQ,kBACtB,EAAG,OAEjB,IAAM5I,EAAO,EAAE,OAAO,QAAQ,QAAQ,EAEtC,GADI,CAACA,GAAQA,EAAK,UAAU,SAAS,gBAAgB,GAAK,CAAC,QAAS,QAAQ,CAAC,CAAC,SAAS,EAAE,OAAO,OAAO,GACnGA,EAAK,QAAQ,MAAQ,IAAA,GAAW,OAEpC,EAAE,eAAe,EAEjB,IAAM6I,EAAS,EAAE,QACXC,EAAS,EAAE,QAEXC,MAAoB,CACtB,AAEI,KAAKC,MADL,aAAa,KAAKA,EAAM,EACV,MAElB,OAAO,oBAAoB,cAAeC,CAAoB,EAC9D,OAAO,oBAAoB,YAAaF,CAAW,EACnD,OAAO,oBAAoB,gBAAiBA,CAAW,CAC3D,EAEME,EAAwB,GAAc,CAC3B,KAAK,MAAMlV,EAAU,QAAU8U,EAAQ9U,EAAU,QAAU+U,CACjE,EAAI,GACPC,EAAY,CAEpB,EAEA,KAAKC,GAAS,eAAiB,CAC3BD,EAAY,EACZ,KAAKG,GAAW,EAAGlJ,CAAI,CAC3B,EAAG,GAAG,EAEN,OAAO,iBAAiB,cAAeiJ,CAAoB,EAC3D,OAAO,iBAAiB,YAAaF,EAAa,CAAE,KAAM,EAAK,CAAC,EAChE,OAAO,iBAAiB,gBAAiBA,EAAa,CAAE,KAAM,EAAK,CAAC,CACxE,EAEA,GAAW,EAAG,EAAM,CAChB,GAAI,KAAKI,GAAa,OAEtB,IAAMC,EAAU,KAAKC,GAA0BrJ,CAAI,EACnD,GAAI,CAACoJ,EAAS,OAEd,KAAKD,GAAc,GACnB,KAAKG,GAActJ,EACnB,KAAKuJ,GAAkB,SAASvJ,EAAK,QAAQ,IAAK,EAAE,EAEpD,IAAM2E,EAAY,KAAKzQ,GAAO,sBAAsB,EAC9C,CAAE,SAAQ,WAAYkV,EAI5B,GAFA,KAAKI,GAAU,EAAE,QAAUC,EAAO,KAE9B,KAAK5C,GAAO,CACZ,KAAKA,GAAM,gBAAgBjV,CAAO,EAElC,IAAM8X,EAAcD,EAAO,IAAM9E,EAAU,IACrCgF,EAAahF,EAAU,OAAS+E,EAEtC,KAAK7C,GAAM,MAAM,MAAQ,GAAG4C,EAAO,MAAM,IACzC,KAAK5C,GAAM,MAAM,OAAS,GAAG8C,EAAW,IACxC,KAAK9C,GAAM,MAAM,IAAM,GAAG6C,EAAY,IACtC,KAAK7C,GAAM,MAAM,QAAU,QAE3B,KAAK+C,GAAoB,EAAE,OAAO,CACtC,CAEA,SAAS,KAAK,MAAM,OAAS,OAE7B,OAAO,iBAAiB,cAAe,KAAK/G,EAAc,EAC1D,OAAO,iBAAiB,YAAa,KAAKgH,GAAc,CAAE,KAAM,EAAK,CAAC,CAC1E,CAEA,GAAkB,GAAM,CACpB,GAAI,CAAC,KAAKV,GAAa,OAEvB,KAAKS,GAAoB,EAAE,OAAO,EAE9B,KAAK/C,KAAO,KAAKA,GAAM,MAAM,cAAgB,QAC7C,KAAKC,KAAO,KAAKA,GAAM,MAAM,cAAgB,QAGjD,IAAMnG,EADgB,KAAKmJ,GAAyB,EAAE,QAAS,EAAE,OAClC,CAAC,EAAE,QAAQ,0CAA0C,EAEpF,GAAInJ,GAAcA,EAAW,QAAQ,MAAQ,IAAA,GAAW,CACpD,IAAMoJ,EAAiB,SAASpJ,EAAW,QAAQ,IAAK,EAAE,EACpDgE,EAAY,KAAKzQ,GAAO,sBAAsB,EAC9CpD,EAAQ6P,EAAW,QAAQ,OAAO,EAEpCqJ,EAAa,IACbC,EAAc,KAiBlB,GAfInZ,GACAA,EAAM,iBAAiB,oBAAoB,CAAC,CAAC,QAAQ,GAAK,CACtD,GAAI+N,EAAE,QAAQ,MAAQ,IAAA,GAAW,OACjC,IAAMsJ,EAAO,SAAStJ,EAAE,QAAQ,IAAK,EAAE,EAEjCuJ,EAAOD,GADCtJ,EAAE,SAAW,GACC,EAE5B,GAAIsJ,GAAQ4B,GAAkB3B,GAAQ2B,EAAgB,CAClD,IAAMG,EAAQrL,EAAE,sBAAsB,EACtC,EAAa,KAAK,IAAImL,EAAYE,EAAM,IAAI,EAC5C,EAAc,KAAK,IAAID,EAAaC,EAAM,KAAK,CACnD,CACJ,CAAC,EAGDF,IAAe,IAAU,CACzB,IAAMnJ,EAAOF,EAAW,sBAAsB,EAC9C,EAAaE,EAAK,KAClB,EAAcA,EAAK,KACvB,CAEA,IAAMsJ,EAAOH,GAAeC,EAAcD,GAAc,EACpDI,EAAsB,EACtBC,EAAgB,EAEhB,EAAE,QAAUF,GACZ,EAAsBJ,EACtB,EAAgBC,EAAarF,EAAU,OAGvC,EAAsBoF,GADNpJ,EAAW,SAAW,GAEtC,EAAgBsJ,EAActF,EAAU,MAG5C,IAAM2F,EAAc,KAAK1C,GAAkB,KAAK0B,EAAW,EACrDiB,EAAaD,EAAY,QAEzBE,EAAiBF,EAAY,SAE7BG,EAAeD,GADC,KAAKlB,GAAY,SAAW,GACI,EAEhDoB,EAAiB/J,EAAW,QAAQ,IAAI,CAAC,EAAE,iBAAmB,EAE9DgK,EAAeD,GADC/J,EAAW,SAAW,GACU,EAEhDiK,EAAsB,EAAEH,EAAeC,GAAkBF,EAAiBG,GAE5EE,EAAwB,GAC5B,GAAIP,EAAY,iBAAkB,CAC9B,GAAM,CAAE,SAAUQ,EAAQ,OAAQC,GAAST,EAAY,kBACnDF,EAAsBU,GAAWV,EAAsBG,EAAa,EAAKQ,KACzE,EAAwB,GAEhC,CAEA,IAAIC,EAA6B,GACjC,GAAIla,EAAO,CACP,IAAMma,EAAena,EAAM,iBAAiB,sCAAsC,EAElF,IAAK,IAAMoa,KAASD,EAAc,CAC9B,GAAIC,IAAU,KAAK5B,GAAa,SAEhC,IAAM6B,EAAYD,EAAM,QAAQ,IAAI,CAAC,EAAE,iBAAmB,EAEpDE,EAAUD,GADCD,EAAM,SAAW,GACK,EAGvC,GAD4BT,EAAeU,GAAaX,EAAiBY,EACjD,SAExB,IAAMC,EAAS,SAASH,EAAM,QAAQ,IAAK,EAAE,EAEvCI,EAAOD,GADCH,EAAM,SAAW,GACD,EAE9B,GAAId,EAAsBiB,GAAUjB,EAAsBkB,EAAO,EAAG,CAChE,EAA6B,GAC7B,KACJ,CAEA,IAAMC,EAAanB,EAAsBG,EAAa,EAMtD,GAJKH,EAAsBiB,GAAUjB,GAAuBkB,GAAQC,EAAaD,GAC5ElB,EAAsBiB,GAAUE,GAAcF,GAAUE,EAAaD,EAGjD,CACrB,EAA6B,GAC7B,KACJ,CACJ,CACJ,CAEA,IAAME,EACFpB,GAAuBE,EAAY,UACnCF,GAAuBE,EAAY,OAAS,EAKhD,GAFsB,CAACM,GAAuBY,GAAeX,GAAyBG,GAA8B,CAACV,EAAY,aAG7H,KAAKjG,GAAkB,KACnB,KAAKyC,KAAO,KAAKA,GAAM,MAAM,QAAU,QACvC,KAAKD,IAAO,KAAKA,GAAM,UAAU,IAAI,SAAS,OAKlD,GAHA,KAAKxC,GAAkB+F,EACnB,KAAKvD,IAAO,KAAKA,GAAM,UAAU,OAAO,SAAS,EAEjD,KAAKC,GAAO,CAGZ,IAAM4C,EAFa/I,EAAW,QAAQ,kBACV,CAAC,CAAC,sBACD,CAAC,CAAC,IAAMgE,EAAU,IACzCgF,EAAahF,EAAU,OAAS+E,EAEtC,KAAK5C,GAAM,MAAM,IAAM,GAAG4C,EAAY,IACtC,KAAK5C,GAAM,MAAM,OAAS,GAAG6C,EAAW,IACxC,KAAK7C,GAAM,MAAM,KAAO,GAAGuD,EAAgB,EAAE,IAC7C,KAAKvD,GAAM,MAAM,QAAU,OAC/B,CAER,MACQ,KAAKA,KAAO,KAAKA,GAAM,MAAM,QAAU,QACvC,KAAKD,IAAO,KAAKA,GAAM,UAAU,IAAI,SAAS,EAClD,KAAKxC,GAAkB,IAE/B,EAEA,GAAoB,EAAS,CACzB,GAAI,CAAC,KAAKwC,GAAO,OAEjB,IAAM4E,EAAOpG,EADK,KAAKnR,GAAO,sBACC,CAAC,CAAC,KAAO,KAAKsV,GAC7C,KAAK3C,GAAM,MAAM,KAAO,GAAG4E,EAAK,GACpC,CAEA,GAAgB,GAAM,CACb,KAAKtC,KAEV,OAAO,oBAAoB,cAAe,KAAKtG,EAAc,EAC7D,SAAS,KAAK,MAAM,OAAS,GAEzB,KAAKgE,KACL,KAAKA,GAAM,MAAM,QAAU,OAC3B,KAAKA,GAAM,gBAAgB,GAE3B,KAAKC,KAAO,KAAKA,GAAM,MAAM,QAAU,QAGvC,KAAKzC,KAAoB,MACzB,KAAKkF,KAAoB,MACzB,KAAKlF,KAAoB,KAAKkF,IAC9B,KAAKlF,KAAoB,KAAKkF,GAAkB,GAEhD,KAAK,WAAW,KAAKA,GAAiB,KAAKlF,EAAe,EAG9D,KAAK8E,GAAc,GACnB,KAAKG,GAAc,KACnB,KAAKC,GAAkB,KACvB,KAAKlF,GAAkB,KAC3B,EAEA,WAAW,EAAc,EAAY,CAEjC,IAAMqH,EAAW,KAAKxX,GAAO,YAAY,cAAc,UAAU,EAC3DyX,EAAYD,EAAS,cAAc,iBAAiBE,EAAW,GAAG,EAElEtB,EAAc,KAAK1C,GAAkB,KAAK0B,EAAW,EAC3D,GAAI,CAACgB,GAAe,CAACA,EAAY,aAAc,OAE/C,IAAMuB,EAAYvB,EAAY,QACxBwB,EAAa,GAAQrgB,GAAOsgB,GAAgBtgB,EAAMsgB,EAAeF,EAGjEG,EAAoB,KAAK9X,GAAO,cAAc,wCAAwC0X,EAAW,GAAG,EACpGK,EAAYD,GAAmB,QAAQ,oBAAoB,EAAI,OAASA,GAAmB,QAAQ,qBAAqB,EAAI,QAAU,KAE5IN,EAAS,iBAAiB,KAAK,CAAC,CAAC,QAAQ,GAAO,CACxCI,EAAU,SAAS3M,EAAI,aAAa,UAAU,EAAG,EAAE,CAAC,IACpD8M,EAAY9M,EAAI,aAAa,QAAS8M,CAAS,EAAI9M,EAAI,gBAAgB,OAAO,EAC9EuM,EAAS,aAAavM,EAAKwM,CAAS,EAE5C,CAAC,EAED,CAAC,QAAS,QAAS,OAAO,CAAC,CAAC,QAAQ,GAAS,CACzC,KAAKzX,GAAO,YAAY,iBAAiB,GAAGgY,EAAM,IAAI,CAAC,CAAC,QAAQ,GAAM,CAClE,IAAMC,EAAQ,MAAM,KAAK3Q,EAAG,QAAQ,EAC9B4Q,EAAgBD,EAAM,KAAK,GAAK,SAAStN,EAAE,QAAQ,IAAK,EAAE,GAAK+M,CAAU,EAE/EO,EAAM,QAAQ,GAAQ,CACdL,EAAU,SAAS9L,EAAK,QAAQ,IAAK,EAAE,CAAC,GACxCxE,EAAG,aAAawE,EAAMoM,GAAiB,IAAI,CAEnD,CAAC,CACL,CAAC,CACL,CAAC,EAED,KAAKlY,GAAO,oBAAoB,CACpC,CAEA,SAAU,CACN,KAAKA,GAAO,oBAAoB,cAAe,KAAK4O,EAAc,CACtE,CACJ,EC5eauJ,EAAb,KAA2B,CACvB,GAEA,YAAY,EAAO,CACf,KAAKnY,GAASjE,CAClB,CAEA,YAAY,EAAY,EAAO,CAC3B,GAAI,CAAC0Q,GAAc,CAAC7P,EAAO,MAAO,OAElC,IAAMmK,EAAY0F,EAAW,QAAQ,6DAA6D,EAClG,GAAI1F,GAAW,UAAU,SAAS,mBAAmB,EAAG,MAAO,OAC/D,GAAIA,GAAW,UAAU,SAAS,oBAAoB,EAAG,MAAO,QAEhE,IAAMqR,EAAU,SAAS3L,EAAW,QAAQ,IAAK,EAAE,EACnD,GAAI,CAAC,MAAM2L,CAAO,EAAG,CAEjB,IAAMC,EADQzb,EAAM,cAAc,0BAA0Bwb,EAAQ,GAC9C,CAAC,EAAE,aAAa,OAAO,EAC7C,GAAIC,EAAW,OAAOA,CAC1B,CAEA,MAAO,MACX,CAEA,aAAa,EAAY,EAAO,CAC5B,GAAI,CAAC5L,GAAcA,EAAW,UAAY,MAAQ,CAAC7P,EAAO,MAAO,GAEjE,IAAMwb,EAAU,SAAS3L,EAAW,QAAQ,IAAK,EAAE,EAC7C/B,EAAU+B,EAAW,SAAW,EACtC,GAAI,MAAM2L,CAAO,EAAG,MAAO,GAE3B,IAAME,EAAoBF,EAAU1N,EAAU,EACxC6N,EAAW,MAAM,KAAK3b,EAAM,iBAAiB,UAAU,CAAC,EAE9D,GAAI2b,EAAS,QAAU,EAAG,MAAO,GAEjC,IAAK,IAAMjR,KAAMiR,EAAU,CACvB,IAAMN,EAAQ,MAAM,KAAK3Q,EAAG,iBAAiB,QAAQ,CAAC,EAClDkR,EAAoB,GAExB,IAAK,IAAM1M,KAAQmM,EAAO,CACtB,IAAMhE,EAAO,SAASnI,EAAK,QAAQ,IAAK,EAAE,EAEpC2M,EAAUxE,GADFnI,EAAK,SAAW,GACC,EAE/B,GAAImI,GAAQqE,GAAqBA,EAAoBG,EACjD,MAAO,GAGX,GAAIA,IAAYH,EAAmB,CAC/B,EAAoB,GACpB,KACJ,CACJ,CAEA,GAAI,CAACE,EAAmB,MAAO,EACnC,CAEA,MAAO,EACX,CAEA,iBAAiB,EAAQ,EAAY,EAAU,OAAQ,CACnD,GAAI,CAAC,KAAKxY,IAAU,CAACyM,EAAY,OAEjC,IAAMhK,EAAc,KAAKzC,GAAO,YAChC,GAAI,CAACyC,EAAa,OAElB,IAAM2V,EAAU,SAAS3L,EAAW,QAAQ,IAAK,EAAE,EAC7C/B,EAAU+B,EAAW,SAAW,EAChCoJ,EAAiBuC,EAAU1N,EAAU,EAE3C,GAAI,MAAMmL,CAAc,EAAG,OAE3B,IAAM2B,EAAW/U,EAAY,cAAc,UAAU,EACrD,GAAI,CAAC+U,EAAU,OAEf,IAAMjN,EAAO,MAAM,KAAKiN,EAAS,iBAAiB,KAAK,CAAC,EAExD,GAAIkB,IAAW,aACXnO,EAAK,QAAQ,GAAO,CACJ,SAASU,EAAI,aAAa,UAAU,EAAG,EAC7C,GAAK4K,GACP5K,EAAI,aAAa,QAAS0N,CAAO,CAEzC,CAAC,EAED,CAAC,QAAS,QAAS,OAAO,CAAC,CAAC,QAAQ,GAAS,CACzClW,EAAY,iBAAiB,GAAGuV,EAAM,IAAI,CAAC,CAAC,QAAQ,GAAM,CACtD,MAAM,KAAK1Q,EAAG,QAAQ,CAAC,CAAC,QAAQ,GAAQ,CACpC,IAAMsR,EAAO,SAAS9M,EAAK,QAAQ,IAAK,EAAE,EACtC,CAAC,MAAM8M,CAAI,GAAKA,GAAQ/C,GACxB/J,EAAK,aAAa,QAAS6M,CAAO,CAE1C,CAAC,CACL,CAAC,CACL,CAAC,OAEE,GAAID,IAAW,eAAgB,CAClC,IAAIG,EAAaT,EACbU,EAAYV,EAAU1N,EAAU,EAEpC,CAAC,QAAS,QAAS,OAAO,CAAC,CAAC,QAAQ,GAAS,CACzCjI,EAAY,iBAAiB,GAAGuV,EAAM,IAAI,CAAC,CAAC,SAAS,EAAI,IAAS,CAC9D,MAAM,KAAK1Q,EAAG,QAAQ,CAAC,CAAC,QAAQ,GAAQ,CACpC,IAAM2M,EAAO,SAASnI,EAAK,QAAQ,IAAK,EAAE,EAEpCoI,EAAOD,GADCnI,EAAK,SAAW,GACF,EACtBiN,EAAQjN,EAAK,SAAW,GACdxE,EAAG,iBAAmB0R,GAEAD,EAAQ,EAAIjN,EAAK,QAAQ,IAAI,CAAC,CAAC,iBAA8BA,EAAK,QAAQ,IAAI,CAAC,CAAC,gBAAkBiN,EAAQ,EAElH7E,EAAOkE,GAAWnE,EAAO4B,IAGnD,EAAa,KAAK,IAAIgD,EAAY5E,CAAI,EACtC,EAAY,KAAK,IAAI6E,EAAW5E,CAAI,EAE5C,CAAC,CACL,CAAC,CACL,CAAC,EAED3J,EAAK,QAAQ,GAAO,CACJ,SAASU,EAAI,aAAa,UAAU,EAAG,EAC7C,GAAK4N,GACP5N,EAAI,gBAAgB,OAAO,CAEnC,CAAC,EAED,IAAIgO,EAAW,GACf1O,EAAK,QAAQ,GAAO,CACZ0O,EACAhO,EAAI,gBAAgB,OAAO,EACnBA,EAAI,aAAa,OAAO,IAChC,EAAW,GAEnB,CAAC,EAED,CAAC,QAAS,QAAS,OAAO,CAAC,CAAC,QAAQ,GAAS,CACzCxI,EAAY,iBAAiB,GAAGuV,EAAM,IAAI,CAAC,CAAC,QAAQ,GAAM,CACtD,MAAM,KAAK1Q,EAAG,QAAQ,CAAC,CAAC,QAAQ,GAAQ,CACpC,IAAMsR,EAAO,SAAS9M,EAAK,QAAQ,IAAK,EAAE,EAC1C,GAAI,MAAM8M,CAAI,EAAG,OAGjB,IAAMM,EADmB3O,EAAK,KAAK,GAAK,SAASI,EAAE,aAAa,UAAU,EAAG,EAAE,IAAMiO,CACnD,CAAC,EAAE,aAAa,OAAO,EAErDM,EACApN,EAAK,aAAa,QAASoN,CAAU,EAErCpN,EAAK,gBAAgB,OAAO,CAEpC,CAAC,CACL,CAAC,CACL,CAAC,CACL,CAEA,KAAK9L,GAAO,sBAAsB,CACtC,CACJ,EC/JamZ,EAAb,cAA0C,WAAY,CACrD,GACA,GACA,GACA,GACA,GACA,WAAa,KAEb,mBAAoB,CACnB,KAAK/e,GAAM,EACX,SAAS,iBAAiB,YAAa,KAAKgf,EAAa,CAC1D,CAEA,OAAc,CAEZ,KAAK3G,GAAU,EAEf,KAAKzS,GAAS,KAAK,QAAQ,kBAAkB,EAC7C,KAAKlJ,GAAQ,KAAK,YAAY,CAAC,CAAC,KAEhC,KAAKuiB,GAAa,KAAK,cAAc,mBAAmB,EAExD,eAAiB,CAChB,KAAKC,GAAQ,KAAKD,GAAW,WAAW,cAAc,kBAAkB,CACzE,CAAC,EAGD,KAAK,cAAc,aAAa,CAAC,CAAC,iBAAiB,UAAY,GAAM,CACpE,EAAE,gBAAgB,CACnB,CAAC,EACD,KAAK,cAAc,aAAa,CAAC,CAAC,iBAAiB,QAAS,KAAKE,EAAQ,EACzE,KAAK,cAAc,eAAe,CAAC,CAAC,iBAAiB,SAAU,KAAKC,EAAY,EAChF,KAAK,cAAc,QAAQ,CAAC,CAAC,iBAAiB,QAAS,KAAKC,EAAK,CAEnE,EAEA,OAAkB,CACjB,KAAK,UAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA6BlB,EAEA,KAAK,EAAW,CACf,KAAKC,GAAUC,EAEf,IAAM7N,EAAO6N,EAAU,QAAQ,QAAQ,EACvC,KAAK,WAAa7N,GAAM,QAAQ,IAEhC,IAAMoC,EAAWpC,EAAK,sBAAsB,EACtC2E,EAAY,KAAKzQ,GAAO,sBAAsB,EAE9C4Z,EAAa,KAAK,aAAe,IACnCrC,EAAQrJ,EAAS,MAAQuC,EAAU,KAAQmJ,EAC3CC,EAAM3L,EAAS,OAASuC,EAAU,IAElC8G,EAAO,IACV,EAAO,KAAK,IAAI,EAAGrJ,EAAS,KAAOuC,EAAU,IAAI,GAGlD,KAAK,MAAM,KAAO,GAAG8G,EAAK,IAC1B,KAAK,MAAM,IAAM,GAAGsC,EAAI,IAExB,IAAMC,EAAY,KAAK,cAAc,aAAa,EAClD,EAAU,MAAQ,GAGlB,KAAK,UAAU,IAAI,QAAQ,EAC3B,KAAK,UAAU,IAAI,SAAS,EAE5B,eAAiB,CAChB,GAAI,CACH,KAAKC,GAAwB,EAC7B,KAAKT,GAAM,WAAW,gBAAgB,CAAC,EACvCQ,EAAU,MAAM,CACjB,QAAU,CACT,KAAK,UAAU,OAAO,SAAS,CAChC,CACD,CAAC,CACF,CAEA,GAAiB,GAAM,CACtB,IAAME,EAAO,EAAE,aAAe,EAAE,aAAa,EAAI,CAAC,EAC9CA,EAAK,SAAS,IAAI,GAAM,KAAKN,IAAWM,EAAK,SAAS,KAAKN,EAAO,GAGtE,KAAK,MAAM,CACZ,EAEA,OAAQ,CACP,KAAK,WAAa,KAClB,KAAK,UAAU,OAAO,QAAQ,EAC9B,KAAKA,GAAU,IAChB,CAEA,IAA0B,CACzB,IAAMO,EAAkB,KAAKnjB,GAAM,KAAK,SAAS,EAC3CsY,EAAa,KAAKsK,IAAS,SAAW,CAAC,EACvC7hB,EAAS,KAAKf,GAAM,OAAO,IAAI,GAAK,CAAC,EACrCojB,EAAgB,KAAKla,GAAO,WAAW,SAAW,CAAC,EACnDma,EAAa,KAAKrjB,GAAM,WAExBkD,EAAKoV,EAAW,QAAS,GAAY,CAC1C,IAAMgL,EAAUC,EAAQ,KAClBC,EAAUD,EAAQ,KAElBE,EAAYH,GAAWE,EACvBrI,EAAWmI,EAAUviB,EAAO,QAAQuiB,CAAO,EAAI,GAC/CI,EAAqBN,EAAcK,IAAc,CAAC,EAElDE,EAAY,IAAI,IACtB,IAAK,IAAI3gB,EAAI,EAAGA,EAAImgB,EAAgB,OAAQ,IAAK,CAChD,IAAMthB,EAASshB,EAAgBngB,GAC/B,GAAI,CAACnB,EAAQ,SAEb,IAAI+hB,EACAzI,GAAY,GAAKtZ,EAAO,EAC3B,EAASA,EAAO,EAAEsZ,GACRmI,GAAWA,EAAQ,SAAS,OAAO,EAC7C,EAASD,EAAaA,EAAW,SAASC,EAASzhB,EAAQmB,CAAC,EAAI,IAAA,GACtDwgB,GAAWH,IACrB,EAASA,EAAW,SAASG,EAAS3hB,EAAQmB,CAAC,GAGhD,IAAI6gB,EAAaD,EACbJ,GAAWH,IACd,EAAaA,EAAW,SAASG,EAAS3hB,EAAQmB,CAAC,GAGhD6gB,GAA2C,MAAQ,CAACF,EAAU,IAAIE,CAAU,GAC/EF,EAAU,IAAIE,EAAY,CACzB,EAAGD,EACH,GAAIC,CACL,CAAC,CAEH,CAEA,IAAMC,EAAa,CAAC,GAAGH,EAAU,OAAO,CAAC,EAwBzC,OAtBAG,EAAW,MAAM,EAAG,IAAM,CACzB,IAAMC,EAAOvhB,EAAE,GACTwhB,EAAOzhB,EAAE,GAEf,GAAIwhB,IAASC,EAAM,MAAO,GAC1B,GAAID,GAA+B,MAAQA,IAAS,GAAI,MAAO,GAC/D,GAAIC,GAA+B,MAAQA,IAAS,GAAI,MAAO,GAE/D,IAAMC,EAAO,OAAOF,CAAI,EAClBG,EAAO,OAAOF,CAAI,EASxB,MAJI,CAHY,MAAMC,CAAI,GAGZ,CAFE,MAAMC,CAAI,EAGlBD,EAAOC,EAGR,OAAOH,CAAI,CAAC,CAAC,cAAc,OAAOC,CAAI,CAAC,CAC/C,CAAC,EACDN,EAAmB,MAAM,EAAG,IAAelhB,EAAID,EAAI,EAAI,EAAK,EAErDuhB,EAAW,IAAI,IAAM,CAC3B,IAAK,EACL,KAAMniB,EAAE,EACR,MAAQA,EAAE,KAAO,IAAMA,EAAE,KAAO,MAAQA,EAAE,KAAO,IAAA,GAAa,2CAA6CA,EAAE,GAC7G,MAAO8hB,EACP,IAAKC,EAAmB,SAAW,GAAKA,EAAmB,iBAAiB/hB,EAAE,CAAC,GAAK,EAAI,IAAM,GAC/F,EAAE,CACH,CAAC,EAED,KAAK4gB,GAAW,KAAK,IAAIrf,CAAE,EAE3B,IAAMihB,EAAe,KAAK,cAAc,eAAe,EACnDA,IACH,EAAa,QAAUjhB,EAAG,OAAS,GAAKA,EAAG,MAAM,GAAQ/C,EAAK,MAAQ,GAAG,EAE3E,CAEA,OAAc,CACb,KAAKH,GAAM,QAAU,GAErB,IAAMokB,EAAgB,KAAK5B,GAAM,KAAK,SAAS,EACzCzhB,EAAS,KAAKwhB,GAAW,KAAK,cAAc,EAE5C8B,EAAiBD,EAAc,OAAO,GAAU,CACrD,IAAME,EAAMziB,EAAO,EAAEd,EAAO,QAAQ,KAAK,GACzC,OAAQujB,IAAQ,KAAOA,IAAQ,EAChC,CAAC,EAEKC,EAAe,CAAE,GAAI,KAAKrb,GAAO,WAAW,SAAW,CAAC,CAAG,EAEjE,KAAK0Z,GAAQ,QAAQ,QAAQ,GAAW,CACvC,IAAMa,EAAYF,EAAQ,MAAQA,EAAQ,KACpCpI,EAAWoI,EAAQ,KAAOxiB,EAAO,QAAQ,OAAO,EAAIA,EAAO,QAAQ,MAAM,EACzEyjB,EAAeH,EAAe,IAAI,GAAK3W,EAAE,EAAEyN,EAAS,EAEtDqJ,EAAa,OAAS,EACzB,EAAaf,GAAae,EAE1B,OAAOD,EAAad,EAEtB,CAAC,EAED,IAAMra,EAAa,KAAKmZ,GAAW,KAAK,MAAM,EAE9C,eAAiB,CAChB,GAAI,CACCnZ,IAAeib,EAAe,OACjC,KAAKzB,GAAQ,QAAQ,QAAQ,GAAW,CACvC,IAAMa,EAAYF,EAAQ,MAAQA,EAAQ,KACtCE,GAAW,KAAKva,GAAO,UAAU,MAAMua,CAAS,CACrD,CAAC,EAED,KAAKva,GAAO,UAAU,IAAIqb,CAAY,EAGvC,KAAKrb,GAAO,iBAAiB,0BAA0B,CAAC,CAAC,QAAQ,GAAO,CACvEub,EAAI,oBAAoB,CACzB,CAAC,EAED,KAAKvb,GAAO,WAAW,EACvB,KAAK,MAAM,CACZ,QAAU,CACT,KAAKlJ,GAAM,QAAU,EACtB,CACD,CAAC,CACF,EAEA,GAAY,GAAM,CAEjB,IAAM0kB,EAAQ,EAAE,OAAO,MAAM,YAAY,CAAC,CAAC,KAAK,EAEhD,GAAI,CAACA,EACJ,KAAKlC,GAAM,UAAU,MAAM,MACrB,CACN,IAAMpW,EAAa,KAAKmW,GAAW,KAAK,SAAS,EAE3CoC,EADS,KAAKpC,GAAW,KAAK,cACd,CAAC,CAAC,QAAQ,OAAO,EAEjCqC,EAAgB,CAAC,EACvBxY,EAAW,QAAQ,GAAU,CAC5B,IAAMmP,EAAMoJ,GAAY,GAAK9iB,EAAO,EAAIA,EAAO,EAAE8iB,GAAY,GAC7C,OAAOpJ,CAAG,CAAC,CAAC,QAAQ,aAAc,EAAE,CAAC,CAAC,YAE5C,CAAC,CAAC,SAASmJ,CAAK,GACzBE,EAAc,KAAKrJ,CAAG,CAExB,CAAC,EAED,KAAKiH,GAAM,UAAU,IAAI,CACxB,MAAO,CAAC,GAAG,IAAI,IAAIoC,CAAa,CAAC,CAClC,CAAC,CACF,CACD,EAEA,GAAgB,GAAM,CACrB,IAAMC,EAAY,EAAE,OAAO,QACrBzY,EAAa,KAAKmW,IAAY,MAAM,SAAS,GAAK,CAAC,EAEnDuC,EADS,KAAKvC,GAAW,KAAK,cAChB,CAAC,CAAC,QAAQ,KAAK,EAE/BuC,GAAU,GACb1Y,EAAW,QAAQ,GAAU,CAC5B,EAAO,EAAE0Y,GAAUD,EAAY,IAAM,GACtC,CAAC,EAGF,KAAKtC,GAAW,QAAQ,CACzB,CAKD,EAEawC,EAAb,cAA2C,WAAY,CACtD,GACA,GAAW,KAEX,mBAAoB,CACnB,KAAK7b,GAAS,KAAK,QAAQ,kBAAkB,GAAK,KAAK,YAAY,CAAC,CAAC,KACrE,KAAK,oBAAoB,QAAS,KAAK8b,EAAQ,EAC/C,KAAK,iBAAiB,QAAS,KAAKA,EAAQ,CAC7C,CAEA,IAAI,SAAU,CACb,GAAI,KAAKC,GAAU,OAAO,KAAKA,GAG/B,IAAMrkB,EADO,KAAK,QAAQ,QACN,CAAC,EAAE,QAAQ,IACzB+K,EAAc,KAAKzC,GAAO,YAE1BuK,EAAO,CAAC,EACRyR,EAAO,IAAI,IAqBjB,OAnBIvZ,GAAe/K,IAAa,IAAA,IAC/B+K,EAAY,iBAAiB,oBAAoB/K,EAAS,GAAG,CAAC,CAAC,QAAQ,GAAO,CAC7E,IAAM0iB,EAAUpP,EAAI,QAAQ,KACtBsP,EAAUtP,EAAI,QAAQ,KAE5B,GAAIoP,GAAWE,EAAS,CACvB,IAAM2B,EAAY,GAAG7B,GAAW,GAAG,GAAGE,GAAW,KAC5C0B,EAAK,IAAIC,CAAS,IACtBD,EAAK,IAAIC,CAAS,EAClB1R,EAAK,KAAK,CACT,KAAM6P,EACN,KAAME,CACP,CAAC,EAEH,CACD,CAAC,EAGF,KAAKyB,GAAWxR,EACT,KAAKwR,EACb,CAEA,wBAA4B,CAC3B,IAAM7B,EAAgB,KAAKla,GAAO,WAAW,SAAW,CAAC,EACnDkc,EAAa,KAAK,QAAQ,KAAK,GAAW,CAC/C,IAAM7X,EAAMgW,EAAQ,MAAQA,EAAQ,KACpC,OAAOhW,GAAO6V,EAAc7V,IAAQ6V,EAAc7V,EAAI,CAAC,OAAS,CACjE,CAAC,EACD,KAAK,UAAU,OAAO,WAAY6X,CAAU,CAC7C,EAEA,GAAY,GAAM,CAEjB,EAAE,eAAe,EACjB,EAAE,gBAAgB,EAElB,IAAMC,EAAQ,KAAKnc,GAAO,cAAc,yBAAyB,EAE3DiL,EADO,KAAK,QAAQ,QACX,CAAC,CAAC,QAAQ,IAErBkR,GAASA,EAAM,aAAelR,GAAOkR,EAAM,UAAU,SAAS,QAAQ,EACzEA,EAAM,MAAM,EACFA,GACVA,EAAM,KAAK,IAAI,CAEjB,CACD,EAEaC,EAAb,KAAuB,CACtB,GACA,GACA,GAAe,GACf,GAAe,KACf,GAAW,CAAC,EAEZ,YAAY,EAAO,CAClB,KAAKpc,GAASjE,EACd,KAAKjF,GAAQ,KAAKkJ,GAAO,YAAY,CAAC,CAAC,KACvC,KAAK5F,GAAM,CACZ,CAEA,IAAI,SAAU,CACb,OAAO,KAAKiiB,EACb,CAEA,OAAc,CACb,KAAKC,GAAiB,CACvB,EAEA,OAAyB,CACxB,GAAI,KAAKxlB,GAAM,QAAQ,YAAY,IAAM,oBACxC,OAGD,IAAIqlB,EAAQ,KAAKnc,GAAO,cAAc,yBAAyB,EAC1Dmc,IACJ,EAAQ,SAAS,cAAc,yBAAyB,EACxD,KAAKnc,GAAO,YAAYmc,CAAK,GAE9B,KAAKI,GAAeJ,CACrB,EAEA,aAAc,CACb,OAAO,KAAKK,EACb,CAEA,MAAS,GAAU,CACdllB,EACH,OAAO,KAAK+kB,GAAS/kB,GAErB,KAAK+kB,GAAW,CAAC,EAGlB,KAAKG,GAAe,OAAO,KAAK,KAAKH,EAAQ,CAAC,CAAC,OAAS,EACxD,KAAKI,GAAgB,EAErB,KAAKzc,GAAO,iBAAiB,0BAA0B,CAAC,CAAC,QAAQ,GAAO,CACvEub,EAAI,oBAAoB,CACzB,CAAC,CACF,EAEA,IAAO,GAAY,CAElB,IAAImB,EAAa,MAAM,QAAQC,CAAO,EACnC,OAAO,YAAY,OAAO,KAAKA,EAAQ,EAAE,CAAC,CAAC,IAAI,GAAK,CAACC,EAAG,CAAC,GAAG,IAAI,IAAID,EAAQ,IAAI,GAAQ1lB,EAAK2lB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EACpGD,EAEH,KAAKN,GAAWK,EAChB,KAAKF,GAAe,OAAO,KAAKE,CAAU,CAAC,CAAC,OAAS,EACrD,KAAK1c,GAAO,gBAAgB,YAAa,KAAKwc,EAAY,EAE1D,KAAKC,GAAgB,CACtB,EAEA,IAAkB,CAEjB,IAAMvZ,EADW,KAAKpM,GAAM,KACA,SAAS,EAC/Be,EAAS,KAAKf,GAAM,KAAK,cAAc,EACvC+lB,EAAa,KAAK7c,GAAO,MACzBma,EAAa,KAAKrjB,GAAM,WAI9B,GAAI,EAFe,OAAO,KAAK,KAAKulB,EAAQ,CAAC,CAAC,OAAS,GAEtC,CAChBnZ,EAAW,QAAQ,GAAU,CACxBvK,GAAQ,GAAG,IAAInC,EAAW,KAAK,MAAM,UACxC,EAAO,EAAE,EAAEA,EAAW,KAAK,MAAM,OAAO,CAACqmB,GAAc,GAEzD,CAAC,EACD,KAAK7c,GAAO,WAAW,EACvB,MACD,CAEA,IAAM8c,EAAc,OAAO,QAAQ,KAAKT,EAAQ,CAAC,CAAC,KAAK,CAACU,EAAWC,KAAmB,CACrF,IAAMC,EAASF,EAAU,SAAS,OAAO,GAAKA,EAAU,SAAS,OAAO,GAAKA,EAAU,SAAS,WAAW,EAC3G,MAAO,CACN,YACA,SACA,SAAWE,EAAqC,GAA5BplB,EAAO,QAAQklB,CAAS,EAC5C,WAAY,IAAI,IAAIC,CAAa,CAClC,CACD,CAAC,EAED9Z,EAAW,SAAS,EAAQ,IAAc,CACzC,GAAI,CAACvK,EAAQ,OAERA,EAAO,EAAE,EAAEnC,EAAW,KAAK,MAAM,UACrC,EAAO,EAAE,EAAEA,EAAW,KAAK,MAAM,QAAU,CAAC,GAG7C,IAAI0mB,EAAS,GAEb,IAAK,IAAIpjB,EAAI,EAAGA,EAAIgjB,EAAY,OAAQ,IAAK,CAC5C,GAAM,CAAE,YAAW,SAAQ,WAAU,cAAeA,EAAYhjB,GAC5DuY,EAQJ,GANI4K,GAAU9C,EACb,EAAMA,EAAW,SAAS4C,EAAWpkB,EAAQwkB,CAAS,EAC5ClL,GAAY,GAAKtZ,EAAO,IAClC,EAAMA,EAAO,EAAEsZ,IAGZ,CAACmL,EAAW,IAAI/K,CAAG,EAAG,CACzB,EAAS,GACT,KACD,CACD,CAEA,EAAO,EAAE,EAAE7b,EAAW,KAAK,MAAM,OAAO,CAACqmB,GAAcK,CACxD,CAAC,EAED,KAAKld,GAAO,WAAW,CACxB,CACD,EAEK,eAAe,IAAI,yBAAyB,GAChD,eAAe,OAAO,0BAA2BmZ,CAAoB,EAGjE,eAAe,IAAI,0BAA0B,GACjD,eAAe,OAAO,2BAA4B0C,CAAqB,ECpfxE,IAAawB,EAAb,KAAqB,CACpB,GACA,GAEA,GAAW,CAAC,EAEZ,YAAY,EAAO,CAClB,KAAKrd,GAASjE,EACd,KAAKjF,GAAQiF,EAAM,YAAY,CAAC,CAAC,KAEjC,eAAiB,CAChB,KAAK8O,GAAY,CAClB,EAAG,GAAG,CACP,CAEA,IAAc,CAEb,KAAK7K,GAAO,iBAAiB,OAAO,CAAC,CAAC,QAAQ,GAAO,CAEpD/H,EAAI,iBAAiB,WAAa,GAAM,CAEvC,IAAM6T,EAAO,EAAE,OAAO,QAAQ,QAAQ,EAKtC,GAJI,CAACA,GAAQA,EAAK,UAAU,SAAS,gBAAgB,GAEjD,CAAC,QAAQ,eAAe,CAAC,CAAC,SAAS,EAAE,OAAO,OAAO,GAEnD,EAAE,SAAW,GAAK,EAAE,SAAWA,EAAK,YAAc,EAAG,OAEzD,IAAM/U,EAAO,KAAKiJ,GAAO,YAAY,CAAC,CAAC,KAEvC,EAAK,QAAU,GACf,eAAiB,CAChB,GAAI,CACH,KAAKsd,GAAY,EAAGxR,CAAI,CACzB,QAAU,CACT,EAAK,QAAU,EAChB,CACD,CAAC,CACF,CAAC,CACF,CAAC,CACF,CAEA,GAAY,EAAG,EAAM,CACpB,IAAMpU,EAAWoU,EAAK,QAAQ,IACxBxE,EAAKwE,EAAK,QAAQ,IAAI,EACtBrE,EAAcH,EAAKA,EAAG,QAAQ,QAAU,OAAOA,EAAG,eAAe,EAAI,IAE3E,GAAI5P,IAAa,IAAA,GAAW,OAE5B,IAAM+K,EAAc,KAAKzC,GAAO,YAChC,GAAI,CAACyC,EAAa,OAElB,IAAI8a,EAAU,KACVC,EAAU,KAYd,GAVA/a,EAAY,iBAAiB,oBAAoB/K,EAAS,GAAG,CAAC,CAAC,QAAQ,GAAO,CACzEsT,EAAI,QAAQ,OACf,EAAUA,EAAI,QAAQ,MAGnBA,EAAI,QAAQ,OACf,EAAUA,EAAI,QAAQ,KAExB,CAAC,EAEG,CAACuS,GAAW,CAACC,EAAS,OAE1B,IAAMC,EAAQ3R,EAAK,UAAU,SAAS,KAAK,EACrC4R,EAAS5R,EAAK,UAAU,SAAS,MAAM,EAEzC,CAAC,EAAE,SAAW,CAAC,EAAE,WACpB,KAAKiQ,GAAW,CAAC,GAGlB,IAAM4B,EAAmB,KAAK5B,GAAS,UACtC,GAAM6B,EAAE,WAAalmB,GAAYkmB,EAAE,cAAgBnW,GAAgBmW,EAAE,UAAYL,CAClF,EAEMM,EAAW,CAChB,WACA,cACA,QAASN,GAAWC,EACpB,QAASD,GAAWC,EACpB,KAAMA,EACN,IAAK,GACL,YAAaA,GAAW,EAAQ,IAAQ,KAAK1mB,GAAM,WAAW0mB,EAAS7kB,EAAQpB,CAAG,EAAI,IACvF,EAEI,CAACkmB,GAAS,CAACC,EACVC,GAAoB,EACvB,KAAK5B,GAAS4B,EAAiB,CAAC,IAAM,GAEtC,KAAK5B,GAAS,KAAK,CAAE,GAAG8B,EAAU,IAAK,EAAK,CAAC,EAEpCJ,EACNE,GAAoB,EACvB,KAAK5B,GAAS4B,EAAiB,CAAC,IAAM,GAEtC,KAAK5B,GAAS,KAAK,CAAE,GAAG8B,EAAU,IAAK,EAAM,CAAC,EAG/C,KAAK9B,GAAW,KAAKA,GAAS,OAC7B,GAAK,EAAG6B,EAAE,WAAalmB,GAAYkmB,EAAE,cAAgBnW,GAAgBmW,EAAE,UAAYL,EACpF,EAGD,KAAKO,GAAchS,CAAI,CACxB,CAEA,GAAc,EAAM,CAEnB,KAAK9L,GAAO,KAAK,WAAW,KAAK+b,EAAQ,EACzC,KAAKgC,GAAc,EACnB,KAAK/d,GAAO,WAAW,EACvB,0BAA4B,CAC5B,IAAMiY,EAAQ,KAAKjY,GAAO,iBAAiB,8BAA8B,EAEzEiY,EAAM,QAAQ,GAAO,CACpBjN,EAAI,UAAU,OAAO,mBAAoB,oBAAqB,mBAAmB,EAE7Ec,EAAK,UAAU,SAAS,KAAK,EAChCd,EAAI,UAAU,IAAI,kBAAkB,EAC1Bc,EAAK,UAAU,SAAS,MAAM,EACxCd,EAAI,UAAU,IAAI,mBAAmB,EAErCA,EAAI,UAAU,IAAI,mBAAmB,CAEvC,CAAC,EAED,0BAA4B,CAC3BiN,EAAM,QAAQ,GAAO,CACpBjN,EAAI,UAAU,OAAO,mBAAoB,oBAAqB,mBAAmB,CAClF,CAAC,CACF,CAAC,CACD,CAAC,CACF,CAEA,IAAgB,CACf,KAAKhL,GAAO,iBAAiB,oBAAoB,CAAC,CAAC,QAAQ,GAAM,CAChE/K,EAAG,UAAU,OAAO,MAAO,MAAM,CAClC,CAAC,EAEG,KAAK8mB,GAAS,SAAW,GAI7B,KAAKA,GAAS,QAAQ,GAAW,CAChC,GAAM,CAAE,WAAU,cAAa,OAAQiC,EAEvC,GAAItmB,IAAa,IAAA,GAAW,CAC3B,IAAIsP,EAAW,oBAAoBtP,EAAS,IACxC+P,IAAgB,IAAA,KACnB,EAAW,yBAAyBA,EAAY,gBAAgB/P,EAAS,KAI1E,KAD+BsI,GAAO,iBAAiBgH,CACvC,CAAC,CAAC,QAAQ,GAAQ,CACjC8E,EAAK,UAAU,IAAImS,EAAM,MAAQ,MAAM,CACxC,CAAC,CACF,CACD,CAAC,CACF,CAEA,SAAU,CACT,KAAKlC,GAAW,CAAC,EACb,KAAK/b,GAAO,MACf,KAAKA,GAAO,KAAK,aAAa,EAG/B,KAAK+d,GAAc,EACnB,KAAK/d,GAAO,YAAY,QAAQ,EAAI,CACrC,CACD,EC3Kake,EAAb,KAAuB,CACtB,GACA,GACA,GAAkB,CAAC,EAEnB,GAAe,CAAC,EAEhB,GAAwB,KAExB,YAAY,EAAO,CAClB,KAAKle,GAASjE,EACd,KAAKjF,GAAQiF,EAAM,YAAY,CAAC,CAAC,KAEjC,KAAK,QAAQ,CACd,CAEA,UAAY,EAAI,IAAU,CAEzB,GAAI,CAAC,KAAKoiB,GAAuB,CAChC,IAAM/kB,EAAU,KAAKtC,GAAM,KAAK,SAAS,EACzC,KAAKqnB,GAAwB,KAAKC,GAAa,IAAI,GAAOhlB,EAAQ7B,EAAI,CACvE,CAEA,IAAM8mB,EAAiB,KAAKF,GAE5B,GAAI/mB,GAA2B,KAC9B,OAAOinB,EAGR,GAAIjnB,EAAK,GAAKA,GAAMinB,EAAe,OAAQ,OAAO,KAElD,IAAMhnB,EAAegnB,EAAejnB,GACpC,GAAIE,GAAS,KAAM,CAElB,IAAMC,EADS,KAAKT,GAAM,KAAK,cACd,CAAC,CAAC,QAAQQ,CAAK,EAChC,OAAQC,GAAO,GAAKF,EAAa,EAAKA,EAAa,EAAEE,GAAO,IAC7D,CAEA,OAAOF,CACR,EAEA,UAAc,CACb,GAAI,CAAC,KAAK8mB,GAAuB,CAChC,IAAM/kB,EAAU,KAAKtC,GAAM,KAAK,SAAS,EACzC,KAAKqnB,GAAwB,KAAKC,GAAa,IAAI,GAAOhlB,EAAQ7B,EAAI,CACvE,CAEA,OAAO,KAAK4mB,GAAsB,MACnC,EAEA,KAAO,EAAI,IAAU,CACpB,IAAME,EAAiB,KAAK,SAAS,EAC/BxmB,EAAS,KAAKf,GAAM,KAAK,gBAAgB,GAAK,CAAC,EAErD,GAAIM,GAA2B,KAC9B,OAAOinB,EAAe,IAAI,GAAU,KAAKC,GAAY3lB,EAAQd,CAAM,CAAC,EAGrE,GAAIT,EAAK,GAAKA,GAAMinB,EAAe,OAAQ,OAAO,KAElD,IAAMhnB,EAAegnB,EAAejnB,GACpC,GAAI,CAACC,EAAc,OAAO,KAE1B,GAAIC,GAAS,KAAM,CAClB,IAAMC,EAAMM,EAAO,QAAQP,CAAK,EAChC,OAAQC,GAAO,GAAKF,EAAa,EAAKA,EAAa,EAAEE,GAAO,IAC7D,CAEA,OAAO,KAAK+mB,GAAYjnB,EAAcQ,CAAM,CAC7C,EAEA,IAAe,EAAG,IAAW,CAC5B,GAAI,CAACY,EAAG,OAAO,KACf,IAAMsS,EAAI,CAAC,EAMX,OALAlT,EAAO,SAAS,EAAO,IAAM,CAC5B,EAAEP,GAASmB,EAAE,EAAIA,EAAE,EAAEqB,GAAKrB,EAAEnB,EAC7B,CAAC,EACGmB,EAAE,IAAG,EAAE,EAAIA,EAAE,GACbA,EAAE,IAAG,EAAE,EAAIA,EAAE,GACVsS,CACR,EAEA,YAAgB,CAEf,KAAKoT,GAAwB,KAE7B,IAAMjb,EAAa,KAAKpM,GAAM,KAAK,SAAS,EACxC6Q,EAAU,CAAC,EACfzE,EAAW,SAAS,EAAQ,IAAM,CACjC,GAAI,CAACvK,EAAQ,OACb,IAAM4lB,EAAa5lB,EAAO,GAAG,IAAInC,EAAW,KAAK,MAAM,QACnD+nB,GAAcA,EAAW,KAAKve,GAAO,SAAW,IACpD2H,EAAQ,KAAK7N,CAAC,CACf,CAAC,EAEG,KAAK0kB,GAAgB,OAAS,IACjC,EAAU,KAAKV,GAAcnW,EAASzE,CAAU,GAGjD,KAAKkb,GAAezW,EACpB,IAAMzQ,EAAeyQ,EAAQ,IAAI,GAAOzE,EAAW3L,EAAI,EAEjDiL,EAAe,KAAKxC,GAAO,UAAU,SAAW,CAAC,EACvD,GAAIwC,EAAa,OAAS,EAAG,CAC5B,IAAMic,EAAczb,EAAS,MAAM9L,EAAcsL,EAAc,KAAK1L,GAAM,KAAK,cAAc,CAAC,EAE9F,KAAKqnB,GAAwBM,EAAY,YAEzC,KAAKze,GAAO,SAAS,YAAYye,EAAY,QAAQ,CACtD,KACC,MAAKN,GAAwBjnB,CAK/B,EAEA,WAAc,GAAY,CACzB,KAAKsnB,GAAkBE,GAAW,CAAC,EACnC,KAAK,QAAQ,CACd,EAEA,eACQ,KAAKF,GAGb,iBAAqB,CACpB,KAAKA,GAAkB,CAAC,EACxB,KAAK,QAAQ,CACd,EAGA,IAAiB,EAAS,IAAiB,CAE1C,IAAM3mB,EAAS,OAAO,KAAKf,GAAM,KAAK,eAAkB,WAAa,KAAKA,GAAM,KAAK,cAAc,EAAI,CAAC,EAElG6nB,EAAe,KAAKH,GAAgB,IAAI,IAAS,CACtD,GAAGI,EACH,SAAU/mB,EAAO,QAAQ+mB,EAAK,SAAWA,EAAK,OAAO,CACtD,EAAE,EAEF,OAAOjX,EAAQ,MAAM,EAAM,IAAS,CACnC,IAAMrO,EAAIpC,EAAa2nB,GACjBxlB,EAAInC,EAAa4nB,GAEvB,IAAK,IAAMF,KAAQD,EAAc,CAChC,IAAMlB,EAAQmB,EAAK,IACb1jB,EAAO0jB,EAAK,KACd/D,EAAMC,EAEN5f,GACH,EAAO,KAAKpE,GAAM,WAAW,SAASoE,EAAM5B,EAAGulB,CAAI,EACnD,EAAO,KAAK/nB,GAAM,WAAW,SAASoE,EAAM7B,EAAGylB,CAAI,GAE/CF,EAAK,UAAY,GAAKtlB,EAAE,GAAKD,EAAE,IAClC,EAAOC,EAAE,EAAEslB,EAAK,UAChB,EAAOvlB,EAAE,EAAEulB,EAAK,WAIlB,IAAMG,EAAYlE,GAAS,MAA8BA,IAAS,GAC5DmE,EAAYlE,GAAS,MAA8BA,IAAS,GAElE,GAAI,KAAYkE,GAChB,IAAID,EAAU,MAAO,GACrB,GAAIC,EAAU,MAAO,GAErB,GAAInE,IAASC,EAAM,CAClB,IAAI5J,EAAO,EAEX,GAAI,OAAO2J,GAAS,UAAY,OAAOC,GAAS,SAC/C,EAAOD,EAAOC,MACR,CACN,IAAMmE,EAAO,OAAOpE,CAAI,EAClBqE,EAAO,OAAOpE,CAAI,EACxB,EAAOmE,EAAOC,EAAO,EAAKD,EAAOC,EAAO,GAAK,CAC9C,CAEA,GAAIhO,IAAS,EACZ,OAAOuM,EAAQvM,EAAO,CAACA,CAEzB,CAjBqB,CAkBtB,CAEA,OAAO2N,EAAOC,CACf,CAAC,CACF,CACD,EC1LaK,EAAb,MAAaA,CAAY,CAErB,OAAO,gBAAgB,EAAM,EAAK,CA2B9B,OAzBAA,EAAYC,GAAgBrkB,CAAG,EAC/BokB,EAAYE,GAAatkB,CAAG,EAC5BokB,EAAYG,GAAqBvkB,CAAG,EAEpCokB,EAAYI,GAAoBxkB,CAAG,EAEnCokB,EAAYK,GAAwBzkB,CAAG,EAEvCkP,EAAc,cAAclP,EAAKA,EAAI,iBAAiB,UAAU,CAAC,EACjEkP,EAAc,cAAclP,EAAKA,EAAI,iBAAiB,gCAAgC,CAAC,EACvFkP,EAAc,cAAclP,EAAKA,EAAI,iBAAiB,sCAAsC,CAAC,EAC7FkP,EAAc,cAAclP,EAAKA,EAAI,iBAAiB,UAAU,CAAC,EAEjEokB,EAAYM,GAAoB1kB,CAAG,EAEnCokB,EAAYO,GAAgC3kB,CAAG,EAE/CokB,EAAYQ,GAAc5oB,EAAMgE,CAAG,EAEnCokB,EAAYS,GAAkB7kB,CAAG,EAEjCokB,EAAYU,GAAmB9oB,EAAMgE,CAAG,EAExCokB,EAAYW,GAAwB/kB,CAAG,EAEhCA,CACX,CAEA,MAAO0kB,GAAoB,EAAK,CAC5B,IAAMM,EAAQhlB,EAAI,cAAc,OAAO,EACvC,GAAI,CAACglB,GAASA,EAAM,cAAc,yBAAyB,EAAG,OAE9D,IAEMzY,EAAKyY,EAAM,UAAU,CAAC,EAC5BzY,EAAG,aAAa,OAAQ,KAAK,EAC7BA,EAAG,UAAU,IAAI,wBAAwB,EACzCA,EAAG,UAAU,IAAI,UAAU,EAE3B,IAAM0Y,EAAWjlB,EAAI,cAAc,UAAU,EAC7C,GAAI,CAACilB,EAAU,OAEf,IAAIC,EAAM,EACVD,EAAS,iBAAiB,QAAQ,CAAC,CAAC,QAAQ,GAAM,CAC9C,GAAI,CAACE,EAAG,UAAU,SAAS,OAAO,EAAG,CACjC,IAAMxV,EAAUwV,EAAG,SAAW,EAC9B,IAAK,IAAIpmB,EAAI,EAAGA,EAAI4Q,EAAS,IAAK,CAC9B,IAAM/U,EAAO,8DAAO,QAAQ,OAAQsqB,CAAG,CAAC,CAAC,QAAQ,QAASd,EAAYgB,GAAe,GAAK,CAAC,EAC3F7Y,EAAG,mBAAmB,YAAa3R,CAAI,CAC3C,CACJ,CACJ,CAAC,EAED,IAAM4U,EAAO,MAAM,KAAKxP,EAAI,iBAAiB,cAAc,CAAC,EAC5DuM,EAAG,iBAAiB,gBAAgB,CAAC,CAAC,SAAS,EAAI,IAAM,CACrD,IAAM8Y,EAAa7V,EAAKzQ,EAAE,CAAC,aAAa,YAAY,EAChDsmB,IACA,EAAG,MAAM,WAAaA,EAE9B,CAAC,CACL,CAEA,MAAOD,GAAe,EAAK,CACvB,IAAIxiB,EAAO,GACX,IAAK,IAAI,EAAI0iB,EAAK,GAAK,EAAG,EAAI,KAAK,MAAM,EAAI,EAAE,EAAI,EAC/C,EAAO,OAAO,aAAa,GAAM,EAAI,EAAG,EAAI1iB,EAEhD,OAAOA,CACX,CAEA,MAAO2hB,GAAqB,EAAK,CAC7B,IAAIrX,EAAQlN,EAAI,cAAc,6BAA6B,EAE3D,GAAKkN,EAEL,CAEA,GAFAA,EAAM,UAAU,IAAI,MAAM,EAEtB,CAAClN,EAAI,cAAc,YAAY,EAAG,CAClC,IAAMulB,EAAY,SAAS,cAAc,OAAO,EAChDA,EAAU,UAAU,IAAI,MAAM,EAC9BrY,EAAM,OAAOqY,CAAS,CAC1B,CAEA,GAAI,CAACvlB,EAAI,cAAc,YAAY,EAAG,CAClC,IAAMwlB,EAAY,SAAS,cAAc,OAAO,EAChDA,EAAU,UAAU,IAAI,MAAM,EAC9BtY,EAAM,MAAMsY,CAAS,CACzB,CAZ0B,CAa9B,CAEA,MAAOnB,GAAgB,EAAK,CACxB,IAAI5H,EAAWzc,EAAI,cAAc,UAAU,EAM3C,GALKyc,IACD,EAAW,SAAS,cAAc,UAAU,EAC5Czc,EAAI,QAAQyc,CAAQ,GAGpBA,EAAS,iBAAiB,KAAK,CAAC,CAAC,SAAW,EAAG,CAC/C,IAAMwI,EAAWjlB,EAAI,cAAc,UAAU,EACzCylB,EAAW,EACXR,IACA,EAAW,MAAM,KAAKA,EAAS,iBAAiB,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAK,IAC7DS,GAAO,SAAS3U,EAAK,aAAa,SAAS,GAAKA,EAAK,QAAS,EAAE,GAAK,GAC7E,CAAC,GAER,EAAW,KAAK,IAAI0U,EAAU,CAAC,EAE/B,IAAK,IAAI1mB,EAAI,EAAGA,EAAI0mB,EAAU,IAAK,CAC/B,IAAMvV,EAAM,SAAS,cAAc,KAAK,EACxCuM,EAAS,YAAYvM,CAAG,CAC5B,CACJ,CACJ,CAEA,MAAOuU,GAAwB,EAAK,CAChC,IAAMjV,EAAO,MAAM,KAAKxP,EAAI,iBAAiB,cAAc,CAAC,EAC5D,GAAIwP,EAAK,SAAW,EAAG,OAEvB,IAAMmW,EAAiB3lB,EAAI,aAAe,EACpC4lB,EAAe,KAAK,IAAI,KAAK,MAAMD,EAAiBnW,EAAK,MAAM,EAAG,GAAG,EAE3EA,EAAK,SAAS,EAAK,IAAM,CAEhBU,EAAI,aAAa,UAAU,GAC5BA,EAAI,aAAa,WAAYnR,CAAC,EAGlC,IAAM0V,EAAQvE,EAAI,aAAa,OAAO,GAAK,SAASA,EAAI,MAAM,MAAO,EAAE,GAAK0V,EAC5E1V,EAAI,aAAa,QAASuE,CAAK,EAE/B,IAAMoR,EAAW,OAAOpR,CAAK,CAAC,CAAC,SAAS,IAAI,EAAIA,EAAQ,GAAGA,EAAM,IACjE,EAAI,MAAM,MAAQoR,CACtB,CAAC,CACL,CAEA,MAAOvB,GAAa,EAAK,CACrB,GAAItkB,EAAI,cAAc,OAAO,EAAG,OAEhC,IAAMglB,EAAQ,SAAS,cAAc,OAAO,EACtCvI,EAAWzc,EAAI,cAAc,UAAU,EAEzCyc,EACAA,EAAS,MAAMuI,CAAK,EAEpBhlB,EAAI,QAAQglB,CAAK,CAEzB,CAEA,MAAOL,GAAgC,EAAK,CAExC3kB,EADoB,iBAAiB,oBAC/B,CAAC,CAAC,QAAQ,GAAQ,CACA+Q,EAAK,aAAa,WAAW,IAAM,QACpCA,EAAK,aAAa,aAAa,IAAM,QACpDA,EAAK,aAAa,cAAe,MAAM,CAE/C,CAAC,CACL,CAEA,MAAO6T,GAAc,EAAM,EAAM,CAE7B,IAAMkB,EAAmB,CAAC,YAAa,YAAa,MAAM,EACtDC,EAAgB,EAEpBC,EAAK,iBAAiB,oBAAoB,CAAC,CAAC,QAAQ,GAAS,CAEzD,IAAMC,EAAU,QADCte,EAAM,aAAa,WAAW,GAAK,aAG9Cue,EAAYve,EAAM,cAAc,UAAU,EAEhD,GAAIue,EAAW,CACX,IAAIriB,EAAI,CAAC,EACTqiB,EAAU,iBAAiB,QAAQ,CAAC,CAAC,QAAQ,GAAW,CACpDriB,EAAE,KAAK,CACH,EAAGsiB,EAAQ,aAAa,GAAG,EAC3B,EAAGA,EAAQ,aAAa,GAAG,EAC3B,MAAOA,EAAQ,aAAa,OAAO,CACvC,CAAC,CACL,CAAC,EAED,IAAMC,EAAiB,QAAQ,KAAK,IAAI,EAAE,GAAG,EAAEL,IAE3C/pB,IACA,EAAKoqB,OAAwBviB,GAGjC8D,EAAM,aAAa,cAAe,QAAQye,EAAe,GAAG,EAE5DF,EAAU,OAAO,CACrB,CAEA,IAAM/lB,EAAOwH,EAAM,QAAQ,KACvBxH,GACAwH,EAAM,aAAa,YAAa3L,EAAK,WAAW,WAAWmE,CAAI,CAAC,EAGpE,MAAM,KAAKwH,EAAM,UAAU,CAAC,CAAC,QAAQ,GAAQ,CACrC,CAAC,YAAa,YAAa,YAAa,WAAW,CAAC,CAAC,SAASzH,EAAK,IAAI,IACvEA,EAAK,MAAM,SAAS,OAAO,GAAKA,EAAK,MAAM,SAAS,OAAO,IAC3DyH,EAAM,aAAazH,EAAK,KAAMlE,EAAK,WAAW,WAAWkE,EAAK,KAAK,CAAC,CAE5E,CAAC,EAMD,EAAM,UAAY,IAAI+lB,EAAQ,GAJXH,EACd,OAAO,GAAQne,EAAM,aAAazH,CAAI,CAAC,CAAC,CACxC,IAAI,GAAQ,GAAGA,EAAK,IAAIyH,EAAM,aAAazH,CAAI,EAAE,EAEZ,CAAC,CAAC,KAAK,GAAG,EAAE,KAAK+lB,EAAQ,GACnEte,EAAM,aAAa,WAAY,GAAG,CACtC,CAAC,EAEDqe,EAAK,iBAAiB,wCAAwC,CAAC,CAAC,QAAQ,GAAS,CAC7E,IAAMK,EAAW1e,EAAM,aAAa,WAAW,EAC/C,GAAI0e,EAAU,CACV,IAAMC,EAAkB3e,EAAM,UACxBse,EAAU,QAAQI,IAKxB,EAAM,UAAY,IAAIJ,EAAQ,GAJXH,EACd,OAAO,GAAQne,EAAM,aAAazH,CAAI,CAAC,CAAC,CACxC,IAAI,GAAQ,GAAGA,EAAK,IAAIyH,EAAM,aAAazH,CAAI,EAAE,EAEZ,CAAC,CAAC,KAAK,GAAG,EAAE,YAAYomB,EAAgB,MAAML,EAAQ,EACpG,CACJ,CAAC,CACL,CAEA,MAAOnB,GAAmB,EAAM,EAAK,CACjC,IAAMyB,EAAavqB,EAAK,aAAa,WAAW,IAAM,OAChDwqB,EAAcxmB,EAAI,aAAa,WAAW,IAAM,OAEtDA,EAAI,iBAAiB,oFAAoF,CAAC,CAAC,QAAQ,GAAQ,CACvH,IAAMymB,EAAiB1V,EAAK,aAAa,WAAW,IAAM,QAAUyV,GAAeD,EAEnFxV,EAAK,aAAa,YAAa0V,EAAiB,OAAS,OAAO,EAE5DA,GACA1V,EAAK,YAAY,SAAS,cAAc,0BAA0B,CAAC,CAE3E,CAAC,CACL,CAEA,MAAO8T,GAAkB,EAAK,CAE1B7kB,EAAI,iBAAiB,oBAAoB,CAAC,CAAC,QAAQ,GAAQ,CAEvD,GADsB+Q,EAAK,aAAa,aAAa,IAAM,QAAUA,EAAK,aAAa,YAAY,IAAM,OACrF,OAEpB,IAAMpU,EAAW,SAASoU,EAAK,QAAQ,IAAK,EAAE,EACxCpB,EAAUoB,EAAK,SAAW,EAC1Bb,EAAMlQ,EAAI,cAAc,0BAA0BrD,EAAS,GAAG,EAE9D+pB,EAAexW,GAAO,SAASA,EAAI,aAAa,OAAO,EAAG,EAAE,GAAK,KAEnE,CAACa,EAAK,QAAQ,aAAe,SAASA,EAAK,QAAQ,YAAa,EAAE,GAAA,MAClE,EAAK,QAAQ,YAAc,OAAO2V,EAAA,GAAiCA,EAAe,GAAG,GAGzF,IAAIC,EAAY5V,EAAK,cAAc,uBAAuB,EAQ1D,GAPK4V,IACD,EAAY,SAAS,cAAc,uBAAuB,EAC1D5V,EAAK,aAAa4V,EAAW5V,EAAK,UAAU,GAG5BA,EAAK,aAAa,WAAW,IAAM,OAEtC,CACb4V,EAAU,UAAU,IAAI,WAAW,EACnCA,EAAU,UAAU,OAAO,QAAQ,EACnCA,EAAU,aAAa,YAAa,MAAM,EAC1C,EAAK,MAAM,MAAQ,cAEnB,IAAMC,EAAc,KAAK,IAAI,GAAI,KAAK,MAAA,GAAwBjX,CAAO,CAAC,EACtE,GAAI,CAAC,MAAMhT,CAAQ,EACf,IAAK,IAAIoC,EAAI,EAAGA,EAAI4Q,EAAS,IAAK,CAC9B,IAAM+M,EAAY1c,EAAI,cAAc,0BAA0BrD,EAAWoC,EAAE,GAAG,EAC1E2d,IACAA,EAAU,aAAa,QAASkK,CAAW,EAC3C,EAAU,MAAM,MAAQ,GAAGA,EAAY,IAE/C,CAER,MACID,EAAU,UAAU,OAAO,WAAW,EACtCA,EAAU,UAAU,IAAI,QAAQ,EAChCA,EAAU,aAAa,YAAa,OAAO,EAC3C,EAAK,MAAM,MAAQ,EAE3B,CAAC,CACL,CAEA,MAAOnC,GAAoB,EAAK,EAAM,CAElC,IAAMxpB,EAAIgF,EAAI,aAAa,eAAe,IAAM,OAAS,GAAK,EAExDyc,EAAWzc,EAAI,cAAc,UAAU,EAGvCkQ,EAAM,SAAS,cAAc,KAAK,EAExCA,EAAI,aAAa,QAAS,MAAM,EAChCA,EAAI,aAAa,QAASlV,CAAC,EAC3B,EAAI,MAAM,MAAQ,GAAGA,EAAE,IACvByhB,EAAS,QAAQvM,CAAG,EAGpBlQ,EAAI,iBAAiB,qBAAqB,CAAC,CAAC,QAAQ,GAAW,CAC3D,IAAM6mB,EAAO,MAAM,KAAKC,EAAQ,iBAAiB,IAAI,CAAC,EACtD,GAAID,EAAK,SAAW,EAAG,OAEvB,IAAMnc,EAAUmc,EAAK,GAEfE,EAAgB,SAAS,cAAc,IAAI,EACjD,EAAc,UAAY,gBAC1BA,EAAc,aAAa,YAAa,eAAe,EAEnDF,EAAK,OAAS,IACd,EAAc,QAAUA,EAAK,QAGjCnc,EAAQ,aAAaqc,EAAerc,EAAQ,iBAAiB,CACjE,CAAC,CACL,CAEA,MAAOqa,GAAwB,EAAK,CAEhC/kB,EAAI,iBAAiB,4BAA4B,CAAC,CAAC,QAAQ,GAAQ,CAE/D,IAAMgnB,EAAc,SAASjW,EAAK,aAAa,UAAU,EAAG,EAAE,EAC9D,GAAI,MAAMiW,CAAW,EAAG,OAGxB,IAAMrX,EAAU,SAASoB,EAAK,aAAa,SAAS,GAAKA,EAAK,QAAS,EAAE,GAAK,EAC1EkD,EAAa,EAGjB,IAAK,IAAIlV,EAAI,EAAGA,EAAI4Q,EAAS,IAAK,CAC9B,IAAMsX,EAAYD,EAAcjoB,EAC1BmR,EAAMlQ,EAAI,cAAc,0BAA0BinB,EAAU,GAAG,EACjE/W,IACA,GAAc,SAASA,EAAI,aAAa,OAAO,EAAG,EAAE,GAAK,IAEjE,CAEA,GAAI+D,EAAa,EAAG,CAChB,IAAM4R,EAAW,GAAG5R,EAAW,IAC/B,EAAK,MAAM,MAAQ4R,EACnB,EAAK,MAAM,SAAWA,EACtB,EAAK,MAAM,SAAWA,CAC1B,CACJ,CAAC,CACL,CACJ,ECnWaqB,EAAb,KAAsB,CAClB,GACA,GAEA,YAAY,EAAO,CACf,KAAKjiB,GAASjE,EACd,KAAKjF,GAAQiF,EAAM,YAAY,CAAC,CAAC,IACrC,CAwBA,IAAM,CACF,OACW,KAAK,MAAM,KAAKiE,GAAO,UAAU,OAAS,KAAKA,GAAO,SAAS,MAAM,EAEhF,MAAQ,GAAU,CACT,KAAKA,GAAO,IAAI,UAAUxG,CAAK,GAChC,KAAKwG,GAAO,IAAI,OAAOxG,CAAK,EAEhC,IAAM0oB,EAAO,KAAKliB,GAAO,iBAAiB,6BAA6BxG,EAAM,GAAG,EAC1E2oB,EAAa,MAAM,KAAKD,EAAM,GAAO,SAASvf,EAAI,QAAQ,UAAW,EAAE,CAAC,CAAC,CAAC,OAAO,GAAK,CAAC,MAAMyf,CAAC,CAAC,EAG/F7X,EAAO,CAAC,EAQd,OAPA2X,EAAK,QAAQ,GAAO,CAChBvf,EAAI,iBAAiB,QAAQ,CAAC,CAAC,QAAQ,GAAS,CAChC,SAASD,EAAM,QAAQ,IAAK,EAClC,GAAK,GAAG6H,EAAK,KAAK,SAAS7H,EAAM,QAAQ,IAAK,EAAE,CAAC,CAC3D,CAAC,CACL,CAAC,EAEM,KAAK1C,GAAO,UAAU,SAAS,KAAK,IAAI,GAAGmiB,CAAU,EAAG,KAAK,IAAI,GAAG5X,CAAI,EAAG,KAAK,IAAI,GAAG4X,CAAU,EAAG,KAAK,IAAI,GAAG5X,CAAI,CAAC,CAChI,EACA,UAAY,GAAU,CAElB,IAAM8X,EAAa,KAAKriB,GAAO,cAAc,gBAAgB,EAEvDkiB,EAAOG,EAAW,iBAAiB,gDAAgD7oB,EAAM,GAAG,EAClG,GAAI,CAAC0oB,GAAQA,EAAK,SAAW,EAAG,MAAO,GAEvC,IAAM/T,EAAekU,EAAW,sBAAsB,EAChDjU,EAAciU,EAAW,cAAc,OAAO,CAAC,EAAE,cAAgB,EACjEC,EAAcD,EAAW,cAAc,OAAO,CAAC,EAAE,cAAgB,EAEjEE,EAAcpU,EAAa,IAAMC,EACjCoU,EAAiBrU,EAAa,OAASmU,EAEzCpV,EAAY,GAEhB,IAAK,IAAMvK,KAAOuf,EAAM,CACpB,IAAMO,EAAS9f,EAAI,sBAAsB,EAEnC+f,EAAUD,EAAO,IAAMF,EACvBI,EAAUF,EAAO,OAASD,EAEhC,GAAIE,GAAWC,EAAS,CACpB,EAAY,GACZ,KACJ,CACJ,CAEA,OAAOzV,CACX,EACA,KAAM,EAAY,IACP,KAAKpW,GAAM,KAAK,IAAIqB,EAAYa,CAAW,EAEtD,QAAS,EAAO,IAAa,CACrB,KAAKgH,GAAO,IAAI,UAAUxG,CAAK,GAG/B,KAAKwG,GAAO,SAASxG,EAAOopB,CAAQ,CAE5C,EACA,QAAS,EAAO,EAAY,EAAc,KAAS,CAG/C,IAAMtqB,EADc,KAAK0H,GAAO,KAAK,IAAIxG,CACjB,CAAC,CAAC,EAAE,EAAEhD,EAAW,KAAK,MAAM,OAE9CqsB,EAAU,KAAK/rB,GAAM,KAAK,OAAOwB,EAAOH,EAAYa,CAAW,EAQrE,OAPgB,KAAKgH,GAAO,KAAK,SAEP,CAAC,CAAC,UAAU,GAC9B,CAACrH,GAAU,CAACA,EAAO,GAAK,CAACA,EAAO,EAAE,EAAU,GACzCA,EAAO,EAAE,EAAEnC,EAAW,KAAK,MAAM,SAAWqsB,CAGtC,CACrB,EACA,OAAS,GAAU,CAGf,IAAMvqB,EADc,KAAK0H,GAAO,KAAK,IAAIxG,CACjB,CAAC,CAAC,EAAE,EAAEhD,EAAW,KAAK,MAAM,OAEpD,KAAKM,GAAM,KAAK,OAAOwB,CAAK,CAChC,CACJ,CACJ,ECnGawqB,EAAb,cAAoC,WAAY,CAC5C,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GAEA,GAEA,GAAU,CACN,MAAO,IACX,EAEA,GAEA,GAAY,CACR,OAAQ,EACR,OAAQ,EACR,QAAS,CAAC,CACd,EAEA,OAAO,eAAiB,GAExB,aAAc,CACV,MAAM,EAEN,KAAKhsB,GAAQ,KAAK,YAAY,CAAC,CAAC,KAChC,KAAKisB,GAAc,IAAIte,EAAW,IAAI,EAEtC,KAAKue,GAAO,IAAIf,EAAS,IAAI,EAE7B,KAAKgB,GAAgB,CACzB,CAEA,mBAAoB,CAChB,KAAK7oB,GAAM,CACf,CAEA,IAAI,UAAW,CAAE,OAAO,KAAK8oB,EAAW,CACxC,IAAI,OAAQ,CAAE,OAAO,KAAKC,EAAQ,CAClC,IAAI,YAAa,CAAE,OAAO,KAAKC,EAAa,CAC5C,IAAI,WAAY,CAAE,OAAO,KAAKC,EAAY,CAC1C,IAAI,UAAW,CAAE,OAAO,KAAKC,EAAW,CACxC,IAAI,UAAW,CAAE,OAAO,KAAKC,EAAW,CACxC,IAAI,QAAS,CAAE,OAAO,KAAKC,EAAS,CACpC,IAAI,YAAa,CAAE,OAAO,KAAKT,EAAa,CAC5C,IAAI,WAAY,CAAE,OAAO,KAAKU,EAAgB,CAC9C,IAAI,YAAa,CAAE,OAAO,KAAKC,EAAiB,CAChD,IAAI,gBAAiB,CAAE,OAAO,KAAKC,GAAQ,MAAM,GAAG,QAAU,CAAG,CAEjE,IAAI,UAAW,CAAE,OAAO,KAAK5lB,EAAW,CAUxC,IAAI,cAAe,CACf,IAAM6lB,EAAW,KAAK,aAAa,cAAc,IAAM,QAAU,KAAK9sB,IAAO,aAAa,cAAc,IAAM,OACxG+sB,EAAkB,KAAKF,GAAQ,OAAO,aAAa,cAAc,IAAM,OAC7E,OAAOC,GAAYC,CACvB,CAEA,IAAI,aAAc,CACd,OAAO,KAAKF,GAAQ,KACxB,CAEA,IAAI,QAAS,CACT,OAAO,KAAKA,EAChB,CAEA,GAAIG,IAAY,CACZ,OAAO,KAAKhtB,GAAM,aAAa,QAAQ,GAAK,KAAKA,GAAM,aAAa,OAAO,IAAM,QACrF,CAEA,UAAY,EAAS,IAAa,CAC9B,KAAK,WAAW,gBAAgBuR,EAAS,MAAOua,CAAQ,CAC5D,EAEA,qBAAsB,CACb,KAAKe,GAAQ,QAElB1Z,EAAc,UAAU,KAAK0Z,GAAQ,KAAK,EAE1C,CAAC,OAAQ,QAAS,MAAM,CAAC,CAAC,QAAQ,GAAQ,CACtC,CAAC,SAAU,OAAQ,QAAQ,CAAC,CAAC,QAAQ,GAAW,CAC5C,IAAM5c,EAAY,KAAK,cAAc,aAAa8a,EAAQ,iBAAiBhnB,GAAM,EAC5EkM,GACLA,EAAU,iBAAiB,OAAO,CAAC,CAAC,QAAQ,GAAOhM,EAAI,OAAO,CAAC,CACnE,CAAC,CACL,CAAC,EAED,KAAKgpB,GAAuB,EAE5B,KAAKC,GAAuB,EAE5B,KAAKjB,GAAY,WAAW,EAExB,KAAK,aACL,KAAK,QAAQ,EAAI,EAEjB,KAAK,cAAc,uBAAuB,CAAC,EAAE,QAAQ,EAGzD,0BAA4B,CACxB,KAAKiB,GAAuB,EAC5B,KAAKjB,IAAa,QAAQ,CAC9B,CAAC,EACL,CAEA,eAAgB,CAEZ,0BAA4B,CAEnB,KAAK,UAAU,SAAS,QAAQ,GAAM,KAAKY,GAAQ,QAExD,KAAKK,GAAuB,EAExB,KAAK,aACL,KAAK,QAAQ,EAAI,EAEjB,KAAK,cAAc,uBAAuB,CAAC,EAAE,QAAQ,EAGzD,KAAKC,GAAe,EAEpB,KAAKb,IAAa,cAAc,EAEhC,KAAKL,IAAa,QAAQ,EAC9B,CAAC,CACL,CAEA,OAAuB,CACnB,IAAMmB,EAAS,KAAK,cAAc,0BAA0B,EACtDC,EAAW,KAAK,cAAc,iBAAiB,EACrD,EAAS,MAAM,IAAM,GAAGD,GAAQ,aAAa,GACjD,EAEA,IAAI,MAAO,CAIP,MAHI,CAAC,KAAK5K,IAAS,KAAKxiB,IAAO,OAC3B,KAAKwiB,GAAQ,IAAI4E,EAAU,IAAI,GAE5B,KAAK5E,EAChB,CAEA,eAAmB,CAEf,KAAK,KAAK,QAAQ,EAElB,KAAKyJ,GAAY,QAAQ,EAAI,EAEzB,KAAK,cACL,KAAK,QAAQ,EAAI,CAEzB,EAEA,SAAW,EAAS,KAAS,CACzB,0BAA4B,CACxB,KAAKqB,KAAWC,CAAM,CAC1B,CAAC,CACL,EAEA,IAAY,EAAS,KAAS,CAE1B,IAAMtd,EAAY,KAAK,cAAc,mCAAmC,EACxE,GAAI,CAACA,EAAW,OAEhB,IAAMgI,EAAgB,KAAK,cAAc,mCAAmC,EAC5E,GAAKA,EAEL,IAAIsV,EAAQ,CACR,KAAK,aAAa,eAAgB,MAAM,EACxC,IAAM3D,EAAiB3Z,EAAU,YACjC,GAAI2Z,GAAkB,EAAG,OAEzB,IAAI4D,EAAqB,EACnBC,EAAU,CAAC,EAEjBxV,EAAc,iBAAiB,KAAK,CAAC,CAAC,QAAQ,GAAO,CACjD,IAAMM,EAAiBpE,EAAI,aAAa,UAAU,EAIlD,GAHmB,KAAK,cAAc,sBAAsBoE,EAAe,GAC9C,CAAC,EAAE,aAAa,WAAW,IAAM,OAG1DkV,EAAQ,QAAQ,CAAE,iBAAgB,MAAO,GAAI,YAAa,EAAK,CAAC,MAC7D,CACH,IAAMxuB,EAAI,SAASkV,EAAI,aAAa,OAAO,EAAG,EAAE,GAAK,IACrDsZ,EAAQ,KAAK,CAAE,iBAAgB,MAAOxuB,EAAG,YAAa,EAAM,CAAC,EAC7D,GAAsBA,CAC1B,CACJ,CAAC,EAED,IAAMyuB,EAAsBD,EACvB,OAAO,GAAK5Z,EAAE,WAAW,CAAC,CAC1B,QAAQ,EAAK,IAAM8V,EAAM9V,EAAE,MAAO,CAAC,EAElC8Z,EAAiB,KAAK,IAAI,EAAG/D,EAAiB8D,CAAmB,EAEvE,GAAIF,EAAqB,GAAKC,EAAQ,OAAS,EAAG,CAC9C,IAAIG,EAAiB,EAEfC,EAAiBJ,EAAQ,IAAI,GAAQ,CACvC,GAAIttB,EAAK,YACL,MAAO,CAAE,eAAgBA,EAAK,eAAgB,UAAW,EAAG,MAAO,EAAG,EAG1E,IAAM2tB,EAAc3tB,EAAK,MAAQwtB,EAAkBH,EAC7CO,EAAY,KAAK,IAAI,GAAI,KAAK,MAAMD,CAAU,CAAC,EAErD,MADA,IAAkBC,EACX,CACH,eAAgB5tB,EAAK,eACrB,UAAW2tB,EAAa,KAAK,MAAMA,CAAU,EAC7C,MAAOC,CACX,CACJ,CAAC,EAEGC,EAAkBL,EAAiBC,EAEjCK,EAAkBJ,EAAe,OAAO,GAAK,CAACJ,EAAQ,KAAK,GAAQttB,EAAK,iBAAmB0T,EAAE,cAAc,CAAC,EAAE,WAAW,EAE/H,GAAIma,EAAkB,GAAKC,EAAgB,OAAS,EAAG,CACnDA,EAAgB,MAAM,EAAG,IAAM1rB,EAAE,UAAYC,EAAE,SAAS,EACxD,IAAK,IAAIQ,EAAI,EAAGA,EAAIgrB,EAAiB,IACjC,EAAgBhrB,EAAIirB,EAAgB,OAAO,CAAC,OAAS,CAE7D,MAAO,GAAID,EAAkB,GAAKC,EAAgB,OAAS,EAAG,CAC1DA,EAAgB,MAAM,EAAG,IAAMzrB,EAAE,UAAYD,EAAE,SAAS,EACxD,IAAK,IAAIS,EAAI,EAAGA,EAAI,KAAK,IAAIgrB,CAAe,EAAG,IAAK,CAChD,IAAM/vB,EAASgwB,EAAgBjrB,EAAIirB,EAAgB,QAC/ChwB,EAAO,MAAQ,IAAI,IAAO,KAClC,CACJ,CAEA4vB,EAAe,SAAS,CAAE,iBAAgB,WAAY,CAClD,KAAKvB,IAAa,eAAe/T,EAAgBG,EAAO,MAAM,CAClE,CAAC,CACL,CACJ,MACI,KAAK,gBAAgB,cAAc,EAGvC,KAAK,cAAc,uBAAuB,CAAC,EAAE,QAAQ,CAHd,CAI3C,EAEA,kBAAoB,EAAQ,IAAU,CAqBlC,GAnBA,KAAK2T,GAAS3pB,EAEd,KAAKmqB,GAAU,CACX,MAAO1Z,EAAc,QAAQC,CAAM,EACnC,MAAO,CACH,GAAIA,EAAO,iBAAiB,UAAU,CAC1C,CACJ,EAEA,KAAK,cAAc,oBAAoB,CAAC,CAAC,YAAY,KAAKyZ,GAAQ,KAAK,EAEvE,KAAKT,GAAU,OAAS,KAAKA,GAAU,OAAS,EAChD,KAAKA,GAAU,QAAU,CAAC,EAC1B,KAAK,iBAAiB,kCAAkC,CAAC,CAAC,QAAS,GAAQ,CACvE,KAAKA,GAAU,QAAUvgB,EAAI,cAAgB,EAC7C,KAAKugB,GAAU,QAAQ,KAAKvgB,EAAI,cAAgB,CAAC,CACrD,CAAC,EACD,KAAKugB,GAAU,OAAS,KAAKA,GAAU,QAAQ,OAE3C,KAAKC,KAAW,EAAG,CACnB,IAAM6B,EAAU,SAAS,KAAKluB,GAAM,aAAa,kBAAkB,EAAG,EAAE,EAClE4S,EAAU,SAAS,KAAK5S,GAAM,aAAa,kBAAkB,EAAG,EAAE,EAElEd,GAAK,KAAK,cAAc,oBAAoB,CAAC,EAAE,cAAgB,IAChE,KAAK,cAAc,mBAAmB,CAAC,EAAE,cAAgB,IACzD,KAAK,cAAc,OAAO,CAAC,EAAE,cAAgB,IAC7C,KAAK,cAAc,OAAO,CAAC,EAAE,cAAgB,IAC7C,KAAK,cAAc,YAAY,CAAC,EAAE,cAAgB,GAEnD,KAAKc,GAAM,aAAa,aAAa,IAAM,QAAW,MAAMkuB,CAAO,GAAM,MAAMtb,CAAO,GACtF,KAAK5S,GAAM,aAAa,aAAc,MAAM,EAG3C,MAAMkuB,CAAO,IACd,KAAKluB,GAAM,MAAM,UAAYd,EAAK,KAAKktB,GAAU,OAAS8B,EAAW,MAGpE,MAAMtb,CAAO,IACd,KAAK5S,GAAM,MAAM,UAAYd,EAAK,KAAKktB,GAAU,OAASxZ,EAAW,KAE7E,CAEA,KAAK,iBAAkB,eAAgB,CAAC,CAAC,QAAS,GAAQ,CACtD,EAAI,MAAM,QAAU,MACxB,CAAC,EAED,KAAK,cAAc,0BAA0B,CAAC,CAAC,OAAO,CAC1D,EAEA,aAAiB,CAEb,KAAKqa,GAAuB,EAE5B,KAAKC,GAAuB,EAE5B,KAAKiB,GAA4B,EAEjC,KAAKC,GAAmB,EAExB,CAAC,OAAQ,OAAQ,OAAO,CAAC,CAAC,QAAQ,GAAQ,CACtC,IAAMC,EAAS,iBAAiBtqB,IAChC,KAAKkD,GAAUlD,GAAQ,CACnB,MAAO,KAAK,cAAc,GAAGsqB,EAAO,OAAO,EAC3C,MAAO,CACH,KAAM,KAAK,cAAc,GAAGA,EAAO,YAAY,EAC/C,KAAM,KAAK,cAAc,GAAGA,EAAO,YAAY,EAC/C,KAAM,KAAK,cAAc,GAAGA,EAAO,YAAY,CACnD,EACA,MAAO,KAAK,cAAc,GAAGA,EAAO,OAAO,CAC/C,CACJ,CAAC,EAED,KAAKpC,GAAY,WAAW,EAExB,KAAK,aACL,KAAK,QAAQ,EAAI,EAEjB,KAAK,cAAc,uBAAuB,CAAC,CAAC,QAAQ,EAGxD,KAAKO,GAAU,WAAW,EAE1B,KAAK,OAAS,EAClB,EAGA,OAA+B,CAE3B,CAAC,OAAQ,QAAS,MAAM,CAAC,CAAC,QAAQ,GAAQ,CACtC,IAAM5X,EAAa,KAAK,iBAAiB,iBAAiB7Q,GAAM,EAChE,GAAI6Q,EAAW,SAAW,EAAG,OAE7B,IAAM0Z,EAAa1Z,EAAW,EAAE,CAAC,cAAc,OAAO,EACtD,GAAI,CAAC0Z,EAAY,OAEjB,IAAI5V,EAAQ,EACZ4V,EAAW,iBAAiB,KAAK,CAAC,CAAC,QAAQ,GAAO,CAC9C,IAAMrvB,EAAI,SAASkV,EAAI,aAAa,OAAO,EAAG,EAAE,EAC3C,MAAMlV,CAAC,IAAG,GAASA,EAC5B,CAAC,EAED2V,EAAW,QAAQ,GAAa,CACb3E,EAAU,iBAAiB,OAAO,EAC7ClM,IAAS,OACT,EAAU,MAAM,KAAO,KAEvB,EAAU,MAAM,KAAO,OAAO2U,EAAM,IACpC,EAAU,MAAM,MAAQ,GAAGA,EAAM,IACjC,EAAU,MAAM,SAAW,GAAGA,EAAM,IACpC,EAAU,MAAM,SAAW,GAAGA,EAAM,IAE5C,CAAC,CACL,CAAC,CACL,EAEA,OAA+B,CAO3B,CALI,CAAE,SAAU,qBAAsB,KAAM,MAAO,EAC/C,CAAE,SAAU,qBAAsB,KAAM,IAAK,EAC7C,CAAE,SAAU,sBAAuB,KAAM,OAAQ,CAG9C,CAAC,CAAC,SAAS,CAAE,WAAU,UAAW,CACrC,KAAK,cAAc,kBAAkBxI,GAAU,CAAC,CAAC,YAAY,KAAKqe,GAAkBxqB,CAAI,CAAC,CAC7F,CAAC,CACL,EAEA,GAAqB,GAAoB,CAErC,IAAMkmB,EAAO,KAAK4C,GAAQ,MAAM,UAAU,EAAI,EAgB9C,OAdI5a,IAAoB,OACpBgY,EAAK,iBAAiB,aAAa,CAAC,CAAC,QAAQ,GAAO,CAC5C9oB,EAAI,aAAa,OAAO,IAAM,QAAQA,EAAI,OAAO,CACzD,CAAC,EACM8Q,IAAoB,QAC3BgY,EAAK,iBAAiB,aAAa,CAAC,CAAC,QAAQ,GAAO,CAC5C9oB,EAAI,aAAa,OAAO,IAAM,SAASA,EAAI,OAAO,CAC1D,CAAC,EAED8oB,EAAK,iBAAiB,6BAA6B,CAAC,CAAC,QAAQ,GAAO,CAChE9oB,EAAI,OAAO,CACf,CAAC,EAGE8oB,CACX,EAEA,iBACW,KAAKgC,GAAY,aAAa,EAGzC,mBAEuB,KAAKhlB,GAAU,QAAQ,cAAgB,KAErC,KAAKA,GAAU,KAAK,OAAO,cAAgB,IAC3D,KAAKA,GAAU,KAAK,OAAO,cAAgB,IAC3C,KAAKA,GAAU,KAAK,MAAM,KAAK,cAAgB,IAKxD,cAAkB,CAEd,IAAMhC,EAAQ,KAAK,cAAc,gBAAgB,EAC3CkM,EAAQ,KAAK,cAAc,+BAA+B,EAE1Dqd,EAAgB,KAAKvnB,GAAU,KAAK,OAAO,cAAgB,EAE3DwnB,EAAcxpB,EAAM,sBAAsB,CAAC,CAAC,OAC5CypB,EAAcvd,EAAM,sBAAsB,CAAC,CAAC,OAElD,OAAQsd,EAAcD,GAAiBE,CAC3C,EAEA,UAAa,GAAe,CACxB,IAAMC,EAAgB,KAAK,cAAc,mCAAmC,EACxEA,IAAe,EAAc,WAAaC,EAClD,EAEA,UAAa,GAAc,CACvB,IAAM/gB,EAAe,KAAK,cAAc,gBAAgB,EACpDA,IAAc,EAAa,UAAYO,EAC/C,EAEA,OAAc,CAEV,KAAK3J,GAAQ,EAEb,KAAKkoB,GAAiB,IAAI7Y,EAAc,IAAI,EAC5C,KAAK8Y,GAAkB,IAAI7W,EAAe,IAAI,EAC9C,KAAKuW,GAAc,IAAI5U,EAAW,IAAI,EACtC,KAAK+U,GAAY,IAAI7Q,EAAS,IAAI,EAClC,KAAK8Q,GAAU,IAAIrL,EAAc,IAAI,EAErC,KAAKmB,GAAQ,IAAI4E,EAAU,IAAI,EAC/B,KAAKmF,GAAa,IAAIjH,EAAU,IAAI,EACpC,KAAKkH,GAAY,IAAIjhB,EAAgB,IAAI,EAEpC,KAAKyhB,KACN,KAAK6B,GAAW,IAAItI,EAAQ,IAAI,GAGpC,KAAKtf,GAAU,SAAS,iBAAiB,aAAgB,CACrD,KAAK,cAAc,uBAAuB,CAAC,CAAC,QAAQ,CACxD,CAAC,CACL,EAIA,OAAgB,CAEZ,KAAK,UAAY;;;;;;;;;;;;;;;;;;;;;;UAwBjB,KAAKA,GAAY,CACb,SAAU,KAAK,cAAc,mCAAmC,EAChE,WAAY,KAAK,cAAc,uBAAuB,EACtD,WAAY,KAAK,cAAc,uBAAuB,EACtD,QAAS,KAAK,cAAc,uCAAuC,EACnE,aAAc,KAAK,cAAc,0CAA0C,CAC/E,CACJ,EAEA,OAAoC,CAEhC,IAAMqL,EAAY,KAAK,cAAc,0BAA0B,EACzDC,EAAY,KAAK,cAAc,0BAA0B,EACzDC,EAAa,KAAK,cAAc,2BAA2B,EAE3Dsc,EAAiB,MAAM,KAAKxc,EAAU,iBAAiB,uCAAuC,CAAC,EAC/Fyc,EAAiB,MAAM,KAAKxc,EAAU,iBAAiB,uCAAuC,CAAC,EAC/Fyc,EAAkB,MAAM,KAAKxc,EAAW,iBAAiB,uCAAuC,CAAC,EAEvG,KAAKyc,GAAiBH,EAAgBC,EAAgBC,CAAe,EAErE,IAAME,EAAiB,MAAM,KAAK5c,EAAU,iBAAiB,UAAU,CAAC,EAClE6c,EAAiB,MAAM,KAAK5c,EAAU,iBAAiB,UAAU,CAAC,EAClE6c,EAAkB,MAAM,KAAK5c,EAAW,iBAAiB,UAAU,CAAC,EAE1E,KAAKyc,GAAiBC,EAAgBC,EAAgBC,CAAe,CACzE,EAEA,IAAoB,EAAU,EAAU,IAAc,CAElD,eAAiB,CACb,IAAMxc,EAAU,KAAK,IAAIH,EAAS,OAAQC,EAAS,OAAQC,EAAU,MAAM,EAE3E,IAAK,IAAI,EAAI,EAAG,EAAIC,EAAS,IAAK,CAE9B,IAAMC,EAAU,CACZJ,EAAS,EAAE,EAAE,sBAAsB,CAAC,CAAC,QAAU,EAC/CC,EAAS,EAAE,EAAE,sBAAsB,CAAC,CAAC,QAAU,EAC/CC,EAAU,EAAE,EAAE,sBAAsB,CAAC,CAAC,QAAU,CACpD,EACMG,EAAY,KAAK,IAAI,GAAGD,CAAO,EAEjCC,EAAY,IACRL,EAAS,KAAI,EAAS,EAAE,CAAC,MAAM,OAAS,GAAGK,EAAU,KACrDJ,EAAS,KAAI,EAAS,EAAE,CAAC,MAAM,OAAS,GAAGI,EAAU,KACrDH,EAAU,KAAI,EAAU,EAAE,CAAC,MAAM,OAAS,GAAGG,EAAU,KAEnE,CACJ,CAAC,CACL,EAEA,OAA2B,CACvB,IAAMjF,EAAe,KAAK,cAAc,gBAAgB,EACxD,GAAI,CAACA,EAAc,OAEnB,IAAIwhB,EAAiB,KAErBxhB,EAAa,iBAAiB,YAAc,GAAM,CAC9C,IAAM2C,EAAK5H,EAAE,OAAO,QAAQ,IAAI,EAChC,GAAI,CAAC4H,GAAM,CAACA,EAAG,QAAQ,KAAOA,EAAG,QAAQ,MAAQ,IAAK,OAEtD,IAAM7P,EAAW6P,EAAG,QAAQ,IACxB6e,IAAmB1uB,IACvB,EAAiBA,EAEjBkN,EAAa,iBAAiB,gBAAgBlN,EAAS,GAAG,CAAC,CAAC,QAAQ,GAAO,CACvEkL,EAAI,UAAU,IAAI,OAAO,CAC7B,CAAC,EACL,CAAC,EAEDgC,EAAa,iBAAiB,WAAa,GAAM,CAC7C,IAAM2C,EAAK5H,EAAE,OAAO,QAAQ,IAAI,EAChC,GAAI,CAAC4H,EAAI,OAET,IAAM8e,EAAgB1mB,EAAE,cACpB4H,EAAG,SAAS8e,CAAa,IAE7BzhB,EAAa,iBAAiB,UAAU,CAAC,CAAC,QAAQ,GAAO,CACrDhC,EAAI,UAAU,OAAO,OAAO,CAChC,CAAC,EACD,EAAiB,KACrB,CAAC,CACL,EAEA,OAAwB,CAIpB,CAFc,KAAKqgB,EAEhB,CAAC,CAAC,QAAQ,GAAO,CAQhB,IALiB,IAAI,CACjB,GAAG,QAAQ,QAAQqD,CAAG,EACtB,GAAG,QAAQ,QAAQ,OAAO,eAAeA,CAAG,CAAC,CACjD,CAEG,CAAA,CAAE,QAAQ,GAAO,CAEhB,GAAIhiB,IAAQ,eAAiB,OAAOA,CAAG,CAAC,CAAC,WAAW,GAAG,EAAG,OAE1D,IAAMtP,EAASsxB,EAAIhiB,GAEf,OAAOtP,GAAW,WACb,KAAKsP,KAEN,KAAKA,IAAQ,GAAGiiB,IAASvxB,EAAO,MAAMsxB,EAAKC,CAAI,GAEzB,OAAOvxB,GAAW,UAArCA,IAEF,KAAKsP,KAEN,KAAKA,GAAOtP,GAGxB,CAAC,CACL,CAAC,CACL,EAEA,sBAAuB,CACnB,KAAKquB,IAAa,QAAQ,EAC1B,KAAKG,IAAW,QAAQ,EACxB,KAAK,UAAY,EACrB,CACJ,EAEK,eAAe,IAAI,kBAAkB,GACtC,eAAe,OAAO,mBAAoBT,CAAc,ECvnB5D,IAAayD,EAAb,KAA2B,CACvB,GAEA,YAAY,EAAO,CACf,KAAKzvB,GAAQ0vB,EACb,KAAKpsB,GAAM,CACf,CAEA,OAAc,CACV,KAAKmB,GAAQ,EACb,KAAKkrB,GAAW,CACpB,EAEA,IAAI,QAAQ,EAAK,CACPpU,EACF,KAAKvb,GAAM,UAAU,IAAI,SAAS,EAElC,KAAKA,GAAM,UAAU,OAAO,SAAS,CAE7C,CAIA,OAAgB,CAGZ,IAAMgE,EADc,MAAM,KAAK,KAAKhE,GAAM,QACd,CAAC,CAAC,OAAO,GAAO7B,EAAG,QAAQ,YAAY,IAAM,OAAS,EAC5EyxB,EAAa5rB,EAAU,OAEvB6rB,EAAa7rB,EAAU,KAAK,EAAK,IAAQ,CAC3C,IAAM8rB,EAAYrvB,IAAQ,EAAI,SAAW,GACnCsvB,EAAU9rB,EAAI,IAAM,QAAQxD,EAAM,IAIxC,MAAO,4BAFsCqvB,EAAU,gBAAgBrvB,EAAI,mBAAmBsvB,EAAQ,QAAQA,EAAQ,wBAClGtvB,EAAMmvB,EAAa,EAAI,8CAA8CnvB,EAAI,oBAAsB,GAEvH,CAAC,CAAC,CAAC,KAAK,EAAE,EAEJuvB,EAAa,CACf,2FACJ,EAEI,KAAK,eAAiB,KAAK,aAAa,CAAC,SACzCA,EAAW,KAAK,YAAY,KAAK,aAAa,CAAC,QAAQ,GAAG,EAG9D,KAAKhwB,GAAM,WAAW,UAAY;;kBAExBgwB,EAAW,KAAK;CAAI,EAAE;kBACtB,KAAKhwB,GAAM,SAAS,MAAM,MAAM;;;;;;;;;;0BAUxB6vB,EAAW;;;;;;;UAS7B7rB,EAAU,QAAQ,GAAO,CACrBqkB,EAAY,gBAAgB,KAAKroB,GAAOmB,CAAG,CAC/C,CAAC,EAED,KAAKnB,GAAM,WAAW,iBAAiB,kBAAkB,CAAC,CAAC,SAAS,EAAQ,IAAQ,CAChFiwB,EAAO,UAAU,IAAI,QAAQ,EAC7BA,EAAO,iBAAiBjsB,EAAUvD,GAAMA,CAAG,CAC/C,CAAC,EAED,KAAKT,GAAM,WAAW,iBAAiB,kBAAkB,CAAC,CAAC,QAAS,GAAW,CAE3E,eAAiB,CACbiwB,EAAO,SAAS,EACZ,KAAKC,IAAe,KAAKC,GAAiB,CAClD,CAAC,CACL,CAAC,EAED,eAAiB,CACb,KAAKnwB,GAAM,KAAK,MAAM,CAC1B,CAAC,CACL,EAEA,OAAmB,CAEf,KAAKA,GAAM,iBAAiBN,EAAW,MAAM,cAAiB,CACtD,KAAKwwB,IAAe,KAAKC,GAAiB,CAClD,CAAC,EAED,KAAKnwB,GAAM,iBAAiBN,EAAW,MAAM,gBAAmB,CACxD,KAAKwwB,IAAe,KAAKC,GAAiB,CAClD,CAAC,EAED,IAAIC,EAAa,EAEjB,IAAI,eAAgB,GAAY,CAC5B,IAAK,IAAIrd,KAASC,EACd,GAAID,EAAM,OAAO,UAAY,aAAc,CACvC,IAAMsd,EAAgBtd,EAAM,YAAY,OAEpCsd,IAAkBD,IAClB,EAAaC,EACT,KAAKH,IACL,KAAKC,GAAiB,EAGlC,CAER,CAAC,CAAC,CAAC,QAAQ,KAAKnwB,EAAK,CACzB,EAEA,OAAyB,CACrB,KAAKA,GAAM,WAAW,iBAAiB,kBAAkB,CAAC,CAAC,QAAS,GAAW,CAC3E,GAAIiwB,EAAO,QAAU,EAAG,CACpBzwB,EAAM,IAAIywB,EAAQA,EAAO,SAAS,OAAQA,EAAO,KAAK,MAAM,CAAC,EAE7D,IAAMrmB,GAAeqmB,EAAO,cAAc,OAAO,CAAC,EAAE,cAAgB,IAC/DA,EAAO,cAAc,OAAO,CAAC,EAAE,cAAgB,IAC/CA,EAAO,cAAc,YAAY,CAAC,EAAE,cAAgB,GACnDK,EAAc,KAAKtwB,GAAM,aAAeiwB,EAAO,aAAermB,EAE9D1K,EAAI,KAAK,IAAI+wB,EAAO,SAAS,OAASA,EAAO,KAAK,MAAM,EAAG,OAAO,YAAc,EAAG,EAEzF,KAAKjwB,GAAM,MAAM,OAASswB,EAAepxB,EAAK,IAClD,CACJ,CAAC,CACL,EAEA,GAAIgxB,IAAgB,CAChB,OAAO,KAAKlwB,GAAM,aAAa,aAAa,IAAM,MACtD,CACJ,EChJauwB,EAAb,KAAwB,CACpB,GACA,GACA,GAAa,IAAI,IAEjB,YAAY,EAAM,CACd,KAAKvwB,GAAQC,EACb,KAAKsD,GAAUtD,EAAK,OAAO,IAAI,CACnC,CAEA,YAAY,EAAM,CAId,MAFI,CAACmE,GAAQ,CAAC,KAAKb,GAAQ,OAAea,EAEnCA,EAAK,QAAQ,6BAA8B,EAAO,IAAc,CACnE,IAAM3D,EAAM,KAAK8C,GAAQ,QAAQG,CAAS,EAC1C,OAAOjD,GAAO,EAAI,aAAaA,EAAI,GAAK+vB,CAC5C,CAAC,CACL,CAEA,WAAW,EAAM,CAEb,OADKpsB,GACE,KAAK,YAAYA,CAAI,CAChC,CAEA,SAAS,EAAM,EAAS,EAAM,EAAG,CAE7B,GAAIA,GAA+B,KAAM,MAAO,GAEhD,GAAI,CACA,IAAMqsB,EAAc,OAAOrsB,CAAI,CAAC,CAAC,KAAK,EAChCssB,EAAe,KAAK,YAAYD,CAAW,EAEjD,GAAIC,EAAa,SAAS,WAAW,GAAKA,EAAa,SAAS,OAAO,GAAKA,EAAa,SAAS,OAAO,GAAKA,EAAa,SAAS,WAAW,GAAKA,EAAa,SAAS,GAAG,EAAG,CAE5K,IAAIC,EAAS,KAAKC,GAAW,IAAIF,CAAY,EAc7C,OAZKC,IACD,EAAa,SAAS,UAAW,MAAO,OAAQ;;;;;iCAKnCD,EAAa;qBACzB,EAED,KAAKE,GAAW,IAAIF,EAAcC,CAAM,GAGrCA,EAAOE,EAAS5uB,EAAK,KAAKjC,EAAK,CAC1C,CAEA,OAAO0wB,CACX,MAAY,CAKR,OAAOtsB,CACX,CACJ,CACJ,EC5Da0sB,EAAb,KAAqB,CAEjB,GAEA,YAAY,EAAM,CACd,KAAK9wB,GAAQC,CACjB,CAEA,SAAW,CAEP,MAAO,CACH,MAAO,EACX,EACA,IAAM,GAAgB,CAClB,GAAI,CAAC8wB,GAAe,OAAOA,GAAgB,SAAU,OAErD,GAAM,CAAE,QAAO,GAAGC,GAAYD,EAE1BpT,GAAS,OAAOA,GAAU,WAC1B,KAAK,SAAS,MAAM,MAAQA,GAG5B,OAAO,KAAKqT,CAAO,CAAC,CAAC,OAAS,GAC9B,eAAiB,CACb,OAAO,QAAQA,CAAO,CAAC,CAAC,SAAS,CAACltB,EAAMmtB,KAAQ,CACxC,OAAOA,GAAO,aACd,KAAKjxB,GAAM8D,GAAQmtB,EAE3B,CAAC,EAED,KAAKjxB,GAAM,WAAW,CAC1B,CAAC,CAET,CACJ,CAEJ,ECvCakxB,EAAb,KAA0B,CACtB,GAEA,YAAY,EAAM,CACd,KAAKlxB,GAAQC,EAKb,CAFoB,KAEX,CAAC,CAAC,QAAQ,GAAM,CACrB,KAAKkxB,GAAM,IAAI,MAAM,CAAC,EAAG,CACrB,KAAM,EAAQ,IAAS,CACnB,IAAMlB,EAAS,KAAKmB,GAAgB,EACpC,GAAI,CAACnB,GAAU,CAACA,EAAOkB,GAAK,OAE5B,IAAME,EAAepB,EAAOkB,EAAG,CAACG,GAKhC,OAHI,OAAOD,GAAiB,YAChB,GAAG7B,IAAS6B,EAAa,MAAMpB,EAAOkB,GAAK3B,CAAI,EAEpD6B,CACX,CACJ,CAAC,CACL,CAAC,CACL,CAEA,iBAAkB,CACd,OAAO,KAAKrxB,GAAM,OAAO,iBAAiB,yBAAyB,CACvE,CAEA,IAAkB,CACd,IAAM0B,EAAM,KAAK,gBAAgB,EACjC,OAAOA,EAAI,OAAS,EAAIA,EAAI,GAAK,IACrC,CACJ,ECzBqB6vB,EAArB,cAAuC,WAAY,CAC/C,GACA,GACA,GACA,GACA,GACA,GAAe,EAEf,aAAc,CACV,MAAM,EAEF,CAAC,YAAY,CAAC,CAAC,SAAS,KAAK,OAAO,GACpC/xB,EAAM,IAAI,qBAAA,QAAqC,EAGnD,KAAKgyB,GAAc,KAAK,aAAa,CAAE,KAAM,MAAO,CAAC,EACrD,KAAKC,GAAe,IAAIxuB,EAAc,IAAI,EAE1C,KAAKyuB,GAAW,IAAIZ,EAAQ,IAAI,EAChC,KAAKa,GAAY,IAAIT,EAAa,IAAI,EAEtC,KAAK/E,GAAgB,CAC1B,CAEC,mBAAoB,CAChB,eAAiB,CACb,KAAKyF,GAAe,KAAK,iBAAiB,OAAO,CAAC,EAAE,OAEpD,KAAK,OAAS,IAAI7wB,EAAO,IAAI,EAC7B,KAAK,WAAa,IAAIwvB,EAAW,IAAI,EAErC,KAAKsB,GAAoB,EAEzB,KAAKC,GAAiB,IAAIrC,EAAc,IAAI,EAE5C,KAAKsC,GAAc,CACvB,CAAC,CACL,CAEA,sBAAuB,CAEvB,CAEA,OAAsB,CAElB,IAAIC,EAAa,EAGXC,EAAa,gBAAkB,CACjC,IAEA,IAAMntB,EAAS,KAAK,OAAO,iBAAiB,kBAAkB,EAM9D,GAJIktB,GAAc,IACd,cAAcC,CAAU,EAGxBntB,EAAO,QAAU,KAAK8sB,GAAc,CACpC,IAAIM,EAAe,EACnBptB,EAAO,QAAQ,GAAU,CACjBmrB,EAAO,QAAQ,GACvB,CAAC,EAEGiC,GAAgB,KAAKN,KACrB,cAAcK,CAAU,EACxB,KAAK,OAAS,GACd,KAAK,cAAc,IAAI,YAAYvyB,EAAW,MAAM,KAAM,CAAE,QAAS,GAAM,OAAQ,CAAE,OAAQ,IAAK,CAAE,CAAC,CAAC,EAE9G,CACJ,EAAG,GAAG,CACV,EAGA,IAAI,QAAS,CAAE,OAAO,KAAK8xB,EAAa,CACxC,IAAI,aAAc,CAAE,OAAO,KAAKC,EAAc,CAC9C,IAAI,MAAO,CAAE,OAAO,KAAKA,GAAa,IAAM,CAO5C,QAAQ,EAAS,CACb,KAAKA,GAAa,KAAK,IAAInvB,CAAO,EAClC,KAAK,QAAQ,CACjB,CAEA,SAAU,CACN,KAAK,aAAa,WAAW,CACjC,CAGA,IAAI,QAAQ,EAAK,CACT,KAAKwvB,KAAgB,KAAKA,GAAe,QAAUvW,EAC3D,CAEA,YAAa,CAET,KAAK,aAAa,iBAAiB,6BAA6B,CAAC,CAAC,QAAS,GAAU,CAKjF,MAJyB,KAAK3P,EAAM,QAAQ,CAAC,CAAC,KAAK,GACxCzK,EAAI,QAAQ,YAAY,CAAC,CAAC,WAAW,OAAO,GAAK,OAAOA,EAAI,YAAe,UAG7E,CAAC,EAAE,WAAW,CAC3B,CAAC,CACL,CAEA,MAAS,GAAc,CACnB,GAAIgxB,IAAc,MAAQA,EAAY,EAAG,OAAO,KAAK,YACrD,IAAMrtB,EAAS,MAAM,KAAK,KAAK,OAAO,iBAAiB,kBAAkB,CAAC,EAM1E,OAJI,OAAOqtB,GAAc,SAAiBrtB,EAAOqtB,IAAc,KAC3D,OAAOA,GAAc,SACd,KAAK,OAAO,cAAc,oBAAoBA,EAAU,oCAAoCA,EAAU,GAAG,GAAK,KAElHrtB,EAAO,IAAM,IACxB,EAEA,IAAI,QAAS,CACT,OAAO,MAAM,KAAK,KAAK,OAAO,iBAAiB,kBAAkB,CAAC,CACtE,CAEA,IAAI,aAAc,CACd,OAAO,KAAK,OAAO,cAAc,yBAAyB,GAAK,IACnE,CAEA,IAAsB,CAClB,IAAMstB,EAAuB,IAAI,IAEjC,KAAK,iBAAiB,eAAe,CAAC,CAAC,QAAQ,GAAM,CACjD,IAAM/wB,EAAalD,EAAG,aAAa,aAAa,EAChD,GAAI,CAACkD,EAAY,OAEjB,IAAMgxB,EAAUhxB,EAAW,SAAS,mCAAmC,EACvE,IAAK,IAAMmvB,KAAS6B,EAAS,CACzB,IAAMvuB,EAAO0sB,EAAM,GACf1sB,GAAQA,IAAS,QACjBsuB,EAAqB,IAAItuB,CAAI,CAErC,CACJ,CAAC,EAEDsuB,EAAqB,QAAQ,GAAc,CACvC,IAAIE,EAAgB,KAEpB,OAAO,eAAe,KAAMC,EAAY,CACpC,IAAM,GAAa,CACf,EAAgBC,EAEhB,KAAK,WAAW,CACpB,EACA,QAAWF,EACX,aAAc,GACd,WAAY,EAChB,CAAC,CACL,CAAC,CACL,CAEA,QAAW,GAAO,CACd,eAAiB,CACb,KAAK,QAAU,GACf,eAAiB,CACb,GAAI,CACArB,EAAG,KAAK,IAAI,CAChB,QAAU,CACN,KAAK,QAAU,EACnB,CACJ,CAAC,CACL,CAAC,CACL,EAEA,IAAkB,CAId,CAFc,KAAKS,GAAU,KAAKC,EAE/B,CAAC,CAAC,QAAQ,GAAO,CAQhB,IALiB,IAAI,CACjB,GAAG,QAAQ,QAAQpC,CAAG,EACtB,GAAG,QAAQ,QAAQ,OAAO,eAAeA,CAAG,CAAC,CACjD,CAEG,CAAA,CAAE,QAAQ,GAAO,CAEhB,GAAIhiB,IAAQ,eAAiB,OAAOA,CAAG,CAAC,CAAC,WAAW,GAAG,EAAG,OAE1D,IAAMtP,EAASsxB,EAAIhiB,GAEf,OAAOtP,GAAW,WACb,KAAKsP,KAEN,KAAKA,IAAQ,GAAGiiB,IAASvxB,EAAO,MAAMsxB,EAAKC,CAAI,GAEzB,OAAOvxB,GAAW,UAArCA,IACF,KAAKsP,KAEN,KAAKA,GAAOtP,GAGxB,CAAC,CACL,CAAC,CACL,CACJ,EAEK,eAAe,IAAI,YAAY,GAChC,eAAe,OAAO,aAAcszB,CAAS,EAG5C,eAAe,IAAI,mBAAmB,GACvC,eAAe,OAAO,oBAAqB,cAAcA,CAAU,CAC/D,mBAAoB,CAChB,KAAK,aAAa,QAAS,QAAQ,EAEnC,MAAM,kBAAkB,CAC5B,CACJ,CAAC,ECjOL,IAAakB,EAAb,cAAsC,WAAY,CAEjD,aAAc,CACb,MAAM,CACP,CAEA,gBAAiB,CACjB,CAEA,mBAAoB,CACpB,CACD,ECRMC,EAAY,IAAI,IAETC,EAAb,cAAiCF,CAAiB,CACjD,GACA,GACA,GACA,GACA,GAEA,aAAc,CACb,MAAM,CACP,CAEA,IAAI,MAAO,CAAE,OAAO,KAAKzyB,EAAO,CAChC,IAAI,OAAQ,CAAE,OAAO,KAAKkJ,EAAQ,CAClC,IAAI,MAAO,CAAE,OAAO,KAAK0pB,EAAO,CAChC,IAAI,IAAK,CAAE,OAAO,KAAKC,EAAK,CAC5B,IAAI,MAAO,CAAE,OAAO,KAAKC,EAAO,CAEhC,mBAAoB,CACnB,MAAM,kBAAkB,EAExB,KAAK9yB,GAAQ,KAAK,YAAY,CAAC,CAAC,KAEhC,KAAK4yB,GAAQ,KAAK,QAAQ,OAAO,EACjC,KAAKC,GAAM,KAAKD,GAAM,QAAQ,IAAI,EAClC,KAAK1pB,GAAS,KAAK2pB,GAAI,QAAQ,kBAAkB,EAEjD,KAAKD,GAAM,UAAU,IAAI,KAAK,OAAO,EAErC,KAAKE,GAAQ,CAAC,EACd,IAAK,IAAI9vB,EAAI,EAAGA,EAAI,KAAK4vB,GAAM,WAAW,OAAQ,IAAK,CACtD,IAAM9uB,EAAO,KAAK8uB,GAAM,WAAW5vB,EAAE,CAAC,KACjC,CAAC,aAAa,QAAQ,YAAY,YAAY,YAAY,WAAW,UAAU,CAAC,CAAC,SAASc,CAAI,IAClG,KAAKgvB,GAAMhvB,GAAQ,KAAK8uB,GAAM,WAAW5vB,EAAE,CAAC,MAG9C,CAEA,GAAI,CAAC,KAAK4vB,GAAO,OAGjB,IAAM7W,EAAO,KAAK,YAAc,KAGhCA,EAAK,iBAAiB,0BAA0B,CAAC,CAAC,QAAQ,GAAU,CACnEgX,EAAO,iBAAiB,YAAe,CACtC,IAAI9B,EAAK,KAAK,aAAa,eAAe,GAAK,KAAK,aAAa,eAAe,GAAK,KAAK2B,IAAO,aAAa,eAAe,GAAK,KAAKA,IAAO,aAAa,eAAe,EAEpKlyB,EAAU,KAAK,KACfsyB,EAAS,SAAS,KAAKJ,GAAM,QAAQ,IAAK,EAAE,EAElD,GAAI3B,GAAM,KAAKjxB,GAAO,CACrB,EAAKixB,EAAG,QAAQ,KAAM,EAAE,EAExB,IAAMsB,EADQtB,EAAG,MAAM,aACA,CAAC,GAAG,IAAMA,EAE7B,OAAO,KAAKjxB,GAAMuyB,IAAgB,WACrC,KAAKvyB,GAAMuyB,EAAW,CAAC,KAAK,KAAKvyB,GAAOU,EAASsyB,EAAQ,KAAKJ,EAAK,EACzD,OAAO,KAAK5yB,GAAM,cAAiB,YAC7C,KAAKA,GAAM,aAAaixB,CAAE,CAAC,CAAC,KAAK,KAAMvwB,EAASsyB,CAAM,CAExD,CAOD,CAAC,CACF,CAAC,EAGD,IAAMC,EAAWlX,EAAK,cAAc,WAAW,EAC3CkX,GAAY,KAAK,aAAa,MAAM,IAAM,SAC7CA,EAAS,UAAU,IAAI,MAAM,EAE7BA,EAAS,iBAAiB,YAAe,CACxC,IAAIhC,EAAK,KAAK,aAAa,aAAa,GAAK,KAAK,aAAa,aAAa,EAEtEvwB,EAAU,KAAK,KACfsyB,EAAS,SAAS,KAAKJ,GAAM,QAAQ,IAAK,EAAE,EAElD,GAAI3B,GAAM,KAAKjxB,GAAO,CACrB,EAAKixB,EAAG,QAAQ,KAAM,EAAE,EAExB,IAAMsB,EADQtB,EAAG,MAAM,aACA,CAAC,GAAG,IAAMA,EAE7B,OAAO,KAAKjxB,GAAMuyB,IAAgB,WACrC,KAAKvyB,GAAMuyB,EAAW,CAAC,KAAK,KAAKvyB,GAAOU,EAASsyB,EAAQ,KAAKJ,EAAK,EACzD,OAAO,KAAK5yB,GAAM,cAAiB,YAC7C,KAAKA,GAAM,aAAaixB,CAAE,CAAC,CAAC,KAAK,KAAMvwB,EAASsyB,CAAM,CAExD,CAEA,KAAKhzB,IAAO,cAAc,IAAI,YAAY,SAAS,MAAM,WAAY,CACpE,OAAQ,CAAE,OAAQ,KAAK4yB,GAAO,KAAMlyB,EAAS,OAAQsyB,CAAO,EAC5D,QAAS,GACT,SAAU,EACX,CAAC,CAAC,CACH,CAAC,EAEH,CAEA,IAAI,MAAO,CACV,IAAME,EAAY,KAAKL,IAAK,KAC5B,GAAI,CAACK,EAAW,OAAO,KACvB,GAAI,CAACA,EAAU,EAAG,OAAOA,EAEzB,IAAMjzB,EAAO,KAAKD,GAElB,OAAO,IAAI,MAAMkzB,EAAW,CAC3B,IAAI,EAAQ,EAAM,CACjB,GAAI5B,IAAS,OAAQ,OAAOrzB,EAAO,KACnC,GAAIqzB,IAAS,IAAK,OAAOrzB,EAAO,EAEhC,IAAMwC,EAAMR,GAAM,QAAQ,UAAUqxB,CAAI,GAAK,GAC7C,OAAO7wB,GAAO,EAAIxC,EAAO,EAAEwC,GAAOxC,EAAOqzB,EAC1C,CACD,CAAC,CACF,CAEA,IAAI,OAAQ,CACX,GAAI,CAAC,KAAKsB,IAAS,CAAC,KAAKC,IAAK,KAAM,MAAO,GAE3C,IAAMvP,EAAU,KAAKsP,GAAM,SAAS,KACpC,GAAI,CAACtP,EAAS,MAAO,GAErB,IAAM4P,EAAY,KAAKL,GAAI,KAE3B,GAAIK,EAAU,GAAK,MAAM,QAAQA,EAAU,CAAC,EAAG,CAC9C,IAAM9a,EAAS,KAAKpY,GAAM,OAAO,IAAI,CAAC,CAAC,QAAQsjB,CAAO,GAAK,GAC3D,OAAOlL,GAAU,EAAK8a,EAAU,EAAE9a,IAAW,GAAM,EACpD,CAEA,OAAO8a,EAAU5P,IAAY,EAC9B,CAEA,IAAI,MAAM,EAAG,CACZ,GAAI,CAAC,KAAKsP,IAAS,CAAC,KAAK5yB,IAAO,KAAM,OAEtC,IAAMiC,EAAM,SAAS,KAAK4wB,GAAI,QAAQ,IAAK,EAAE,EACvCvP,EAAU,KAAKsP,GAAM,QAAQ,KAC/B,OAAM3wB,CAAG,GAAMqhB,GAEnB,KAAKtjB,GAAM,KAAK,SAASiC,EAAKqhB,EAASnkB,CAAC,CACzC,CAEA,IAAI,KAAM,CACT,OAAO,SAAS,KAAKyzB,IAAO,SAAS,IAAK,EAAE,CAC7C,CACA,IAAI,OAAQ,CACX,OAAO,SAAS,KAAKA,IAAO,SAAS,MAAO,EAAE,CAC/C,CAEA,SAAU,CACT,MAAO,MAAKA,GAAM,UAAU,SAAS,SAAS,CAC/C,CAEA,WAAY,CACX,MAAO,CAAC,KAAK,QAAQ,CACtB,CAEA,gBAAkB,EAAe,KAAO,CAMvC,GAJI,CAAC,KAAKA,IAAS,CAAC,KAAKA,GAAM,QAAQ,OAAO,GAI1C,CAFc,KAAKC,GAAI,KAEX,OAAOM,EAEvB,IAAM/uB,EAAO,KAAKwuB,GAAM,QAAQ,KAC1BtP,EAAU,KAAKsP,GAAM,QAAQ,KAC7B3wB,EAAM,SAAS,KAAK2wB,GAAM,QAAQ,IAAK,EAAE,EAE/C,GAAIxuB,EACH,GAAI,CAKF,OAJG,KAAKyuB,GAAI,aAAa,UAAU,IAAM,OAElC,KAAK,kBAAkBzuB,EAAM,KAAKyuB,GAAI,KAAM5wB,EAAK,KAAK2wB,EAAK,EAE3D,KAAK5yB,GAAM,WAAW,SAASoE,EAAM,KAAKyuB,GAAI,KAAM5wB,CAAG,CAEhE,MAAY,CACX,OAAOkxB,CACR,CAQD,OALI7P,EACS,KAAK,OACgC6P,EAG3CA,CACR,EAIA,SAAU,CAET,GAAI,CAAC,KAAKP,IAAS,CAAC,KAAKC,GAAK,OAE9B,IAAMtX,EAAM,KAAK,MAgCjB,OA9BA,KAAKqX,GAAM,UAAU,OAAO,SAAS,EAErC,CAAC,QAAQ,aAAa,mBAAmB,UAAU,SAAS,WAAW,CAAC,CAAC,QAAQ,GAAK,CAErF,IAAMxuB,EAAO,KAAK0uB,GAAM3zB,GACxB,GAAIiF,EAAM,CACT,IAAMrB,EAAS,KAAK/C,GAAM,WAAW,SAASoE,EAAM,KAAKyuB,GAAI,KAAM,SAAS,KAAKD,GAAM,QAAQ,IAAK,EAAE,CAAC,EAEnGzzB,IAAM,YACJ4D,GACJ,KAAK6vB,GAAM,UAAU,IAAI,SAAS,EAEzBzzB,IAAM,UAChB,KAAK,MAAMi0B,QAAarwB,EAAS,GAAK,OAC5B5D,IAAM,UAChB,KAAK,iBAAiB,iCAAiC,CAAC,CAAC,QAAQ,GAAO,CACvE,EAAI,SAAW,CAAC4D,CACjB,CAAC,EAEKA,EACL,KAAK6vB,GAAM,gBAAgB,UAAU,EAErC,KAAKA,GAAM,aAAa,WAAY,MAAM,GAG3C,KAAKA,GAAM,MAAMzzB,GAAK4D,CAExB,CACD,CAAC,EAEMwY,CACR,CAEA,aAAa,EAAM,EAAM,EAAK,CAG7B,MAFI,CAAC,KAAKvb,IAAS,CAAC,KAAKA,GAAM,YAAcoE,GAA+B,MAAQA,IAAS,GAAWA,EAEjG,KAAKpE,GAAM,WAAW,SAASoE,EAAMivB,EAAMpxB,CAAG,CACtD,CAEA,mBAAqB,EAAM,EAAa,EAAK,IAAS,CACrD,GAAI,CAACmC,EAAM,MAAO,GAElB,GAAI,CACH,EAAM,SAASnC,EAAK,EAAE,EACtB,IAAMqxB,EAAYlvB,EAAK,QAAQ,KAAM,EAAE,CAAC,CAAC,KAAK,EAE9C,GAAI,KAAKpE,IAAS,OAAO,KAAKA,GAAMszB,IAAe,WAClD,OAAO,KAAKtzB,GAAMszB,EAAU,CAAC,KAAK,KAAMnmB,EAAalL,EAAK+S,CAAI,EAG/D,IAAMwb,EAAQ8C,EAAU,MAAM,8BAA8B,EAC5D,GAAI9C,EAAO,CACV,IAAM3f,EAAU1D,EAAY,UAAU,UAChC2D,EAAa,KAAK9Q,IAAO,MAAM,SAAW,KAAKA,GAAM,KAAK,SAAS,EAAI,CAAC,EACxEuzB,EAAe1iB,EAAUA,EAAQ,IAAI,GAAOC,EAAWrQ,EAAI,CAAC,CAAC,OAAO,OAAO,EAAI,CAAC,EAEhF,EAAG+yB,EAAUC,GAASjD,EACtBvwB,EAAO,KAAKD,GAElB,OAAQwzB,EAAS,YAAY,EAA7B,CACC,IAAK,QACJ,OAAOD,EAAa,OAErB,IAAK,MAAO,CACX,IAAMnb,EAASnY,GAAM,QAAQ,UAAUwzB,CAAK,GAAK,GACjD,OAAOF,EAAa,QAAQ,EAAK,IAAW,CAC3C,IAAMhY,EAAMnD,GAAU,EAAIvW,EAAO,IAAIuW,GAAUvW,EAAO4xB,GACtD,OAAOC,GAAO,OAAOnY,CAAG,GAAK,EAC9B,EAAG,CAAC,CACL,CAEA,IAAK,MAAO,CACX,GAAIgY,EAAa,SAAW,EAAG,MAAO,GACtC,IAAMnb,EAASnY,GAAM,QAAQ,UAAUwzB,CAAK,GAAK,GAKjD,OAJYF,EAAa,QAAQ,EAAK,IAAW,CAChD,IAAMhY,EAAMnD,GAAU,EAAIvW,EAAO,IAAIuW,GAAUvW,EAAO4xB,GACtD,OAAOC,GAAO,OAAOnY,CAAG,GAAK,EAC9B,EAAG,CACM,EAAIgY,EAAa,MAC3B,CACD,CACD,CAGA,GAAI,KAAKvzB,IAAS,OAAO,KAAKA,GAAM,cAAiB,WACpD,OAAO,KAAKA,GAAM,aAAaoE,CAAI,CAAC,CAAC,KAAK,KAAM+I,EAAalL,EAAK,KAAKjC,GAAM,IAAI,EAGlF,GAAIoE,EAAK,SAAS,OAAO,GAAKA,EAAK,SAAS,cAAc,GAAKA,EAAK,SAAS,aAAa,EAAG,CAC5F,IAAIusB,EAAS+B,EAAU,IAAI,OAAStuB,CAAI,EA6BxC,OA5BKusB,IACJ,EAAa,SAAS,cAAe,MAAO,OAAQ,OAAQ;;;;;;;;;;;;;;;;;;;;;;;4BAuBrCvsB,EAAK;iBAChB,EACZsuB,EAAU,IAAI,OAAStuB,EAAMusB,CAAM,GAE7BA,EAAOxjB,EAAalL,EAAK+S,EAAM,KAAKhV,EAAK,CACjD,CAEA,OAAOoE,CACR,OAASwE,EAAG,CAEX,OADA,QAAQ,MAAM,+BAAgCxE,EAAMwE,CAAC,EAC9CxE,CACR,CACD,CACD,EAEauvB,EAAb,cAAyChB,CAAY,CAEpD,IAAI,MAAO,CAAE,OAAO,MAAM,IAAM,CAChC,IAAI,OAAQ,CAAE,OAAO,MAAM,KAAO,CAClC,IAAI,MAAO,CAAE,OAAO,MAAM,IAAM,CAChC,IAAI,IAAK,CAAE,OAAO,MAAM,EAAI,CAC5B,IAAI,MAAO,CAAE,OAAO,MAAM,IAAM,CAEhC,aAAa,EAAM,EAAM,EAAK,EAAM,CACnC,OAAO,MAAM,aAAavuB,EAAMivB,EAAMpxB,EAAK+S,CAAI,CAChD,CAEA,aAAc,CACb,MAAM,CACP,CAEA,mBAAoB,CACnB,MAAM,kBAAkB,CACzB,CAEA,SAAU,CACT,OAAO,MAAM,QAAQ,CACtB,CAEA,cAAgB,EAAM,EAAM,EAAK,IACzB,MAAM,aAAa5Q,EAAMivB,EAAMpxB,EAAK+S,CAAI,EAGhD,YACQ,MAAM,QAAQ,EAGtB,cACQ,MAAM,UAAU,CAEzB,EChXM4e,EAAN,cAA4BD,CAC5B,CACC,GAEA,aAAc,CACb,MAAM,CACP,CAEA,mBAAoB,CAEnB,MAAM,kBAAkB,EAExB,KAAKhY,GAAU,EAEf,KAAKkY,GAAU,KAAK,cAAc,OAAO,EAEzC,KAAKlE,GAAW,CACjB,CAEA,YAAgB,CACf,IAAMxwB,EAAI,MAAM,QAAQ,EACxB,KAAK00B,GAAQ,MAAQ10B,CACtB,EAEA,OAAmB,CAClB,KAAK00B,GAAQ,iBAAiB,QAAS,GAAK,CAC3C,GAAI,KAAKC,GAAU,CAClB,IAAMC,EAAa,OAAO,KAAKD,EAAQ,EAClB,KAAK,cAAc,EAAE,OAAO,KAElC,EAAIC,IAClB,EAAE,OAAO,MAAQ,KAAK,IAAI,EAAE,OAAO,MAAOA,CAAU,EACpD,KAAK,MAAQ,EAAE,OAAO,MAExB,CACD,CAAC,EAED,KAAKF,GAAQ,iBAAiB,SAAW,GAAU,CAClD,KAAK,MAAQG,EAAM,OAAO,MAC1B,KAAK,MAAM,WAAW,QAAQ,EAAI,CACnC,CAAC,CACF,EAEA,OAAkB,CAEjB,KAAK,UAAY;;GAGlB,EAEA,GAAIF,IAAW,CACd,OAAO,KAAK,KAAK,aAAa,SAAS,GAAK,KAAK,KAAK,aAAa,UAAU,CAC9E,CACD,EAEK,eAAe,IAAI,YAAY,GACnC,eAAe,OAAO,aAAcF,CAAa,ECxDlD,IAAMK,EAAN,cAA8BN,CAC9B,CACC,GAEA,aAAe,CACd,MAAM,CACP,CAEA,mBAAoB,CAEnB,MAAM,kBAAkB,EAExB,KAAKhY,GAAU,EAEf,KAAKkY,GAAU,KAAK,cAAc,OAAO,EAEzC,KAAKlE,GAAW,CAGjB,CAEA,OAAkB,CACjB,KAAK,UAAY;;QAGlB,EAEA,OAAmB,CAClB,KAAKkE,GAAQ,iBAAiB,UAAW,KAAKK,EAAU,EAExD,KAAKL,GAAQ,iBAAiB,QAAU,GAAU,CACjD,KAAK,MAAQG,EAAM,OAAO,MAC1B,KAAK,MAAM,WAAW,QAAQ,EAAI,CACnC,CAAC,EAED,KAAKH,GAAQ,iBAAiB,SAAW,GAAU,CAClD,KAAK,MAAQG,EAAM,OAAO,MAC1B,KAAK,MAAM,WAAW,QAAQ,EAAI,CACnC,CAAC,CACF,EAEA,YAAgB,CACf,IAAM70B,EAAI,MAAM,QAAQ,EAExB,KAAK00B,GAAQ,MAAQ10B,EAEjB,KAAK,QAAQ,GAChB,KAAKg1B,GAAU,CAEjB,EAEA,OAAkB,CAEjB,IAAMh1B,EAAI,KAAK00B,GAAQ,MAEvB,GAAI10B,IAAM,IAAMA,GAAM,KAAyB,CAC9C,IAAMoqB,EAAM,OAAOpqB,CAAC,EAEpB,GAAI,MAAMoqB,CAAG,GAAM,KAAK6K,IAAQ7K,EAAM,OAAO,KAAK6K,EAAI,GAAO,KAAKC,IAAQ9K,EAAM,OAAO,KAAK8K,EAAI,EAC/F,KAAK,KAAK,UAAU,IAAI,SAAS,OAE7B,GAAI,KAAKC,GAAQ,CACrB,IAAMC,EAAM,OAAOp1B,CAAC,EACdsB,EAAM8zB,EAAI,QAAQ,GAAG,EACvB9zB,GAAO,GAAK8zB,EAAI,UAAU9zB,EAAM,CAAC,CAAC,CAAC,OAAS,OAAO,KAAK6zB,EAAM,GACjE,KAAK,KAAK,UAAU,IAAI,SAAS,CAEnC,CACD,CACD,EAEA,GAAa,GAAK,CAEjB,GAAI,CAAC,SAAU,QAAS,MAAO,OAAQ,MAAO,YAAa,aAAc,SAAU,WAAY,YAAa,QAAQ,CAAC,CAAC,SAAS,EAAE,IAAI,EAAG,OAExI,IAAMr2B,EAAS,EAAE,OACX4C,EAAQ5C,EAAO,MACfu2B,EAAiBv2B,EAAO,eACxBsP,EAAM,EAAE,IAEd,GAAIA,IAAQ,MACP1M,EAAM,SAAS,GAAG,GAAK2zB,IAAmB,GAAG,CAChD,EAAE,eAAe,EACjB,MACD,CAGD,GAAIjnB,IAAQ,IAAK,CAChB,IAAMknB,EAAQ,OAAO,KAAKH,EAAM,EAEhC,GAAI,MAAMG,CAAK,GAAKA,GAAS,GAAK5zB,EAAM,SAAS,GAAG,EAAG,CACtD,EAAE,eAAe,EACjB,MACD,CACD,CAEA,IAAI6zB,EAAW,CAAC,EACZ,KAAKJ,IAAU,OAAO,KAAKA,EAAM,EAAI,GAAGI,EAAS,KAAK,GAAG,GACzD,KAAKL,IAAQ,OAAO,KAAKA,EAAI,EAAI,IAAGK,EAAS,KAAK,GAAG,EAEzD,IAAMC,EAAY,EAAE,SAAW,IAAM,EAAE,SAAW,IAAQ,EAAE,SAAW,IAAM,EAAE,SAAW,IAE1F,GAAI,CAACA,GAAY,CAACD,EAAS,SAAS,EAAE,GAAG,EACxC,EAAE,eAAe,MAIlB,IAAI,KAAKJ,IAAUK,GAAY,EAAE,OAAO,gBAAkB,EAAE,OAAO,aAAc,CAChF,IAAM5vB,EAAI,EAAE,OAAO,MACbtE,EAAMsE,EAAE,QAAQ,GAAG,EACrBtE,GAAO,GAAK,EAAE,OAAO,eAAiBA,GACrBsE,EAAE,OAAOtE,EAAM,CACrB,CAAC,CAAC,QAAU,OAAO,KAAK6zB,EAAM,GAC3C,EAAE,eAAe,CAGpB,CAEI,KAAKR,IAAY,KAAK,cAAc,EAAE,OAAO,KAAK,GAAK,OAAO,KAAKA,EAAQ,GAAK,EAAE,OAAO,gBAAkB,EAAE,OAAO,cACvH,EAAE,eAAe,CAHlB,CAKD,EAEA,GAAIO,IAAO,CACV,OAAO,KAAK,KAAK,aAAa,KAAK,GAAK,EACzC,CAEA,GAAID,IAAO,CACV,OAAO,KAAK,KAAK,aAAa,KAAK,GAAK,EACzC,CAEA,GAAIE,IAAS,CACZ,OAAO,KAAK,KAAK,aAAa,OAAO,GAAK,EAC3C,CAEA,GAAIR,IAAW,CACd,OAAO,KAAK,KAAK,aAAa,SAAS,GAAK,KAAK,KAAK,aAAa,UAAU,CAC9E,CACD,EAEK,eAAe,IAAI,mBAAmB,GAC1C,eAAe,OAAO,oBAAqBG,CAAe,EC7I3D,IAAMW,EAAN,cAA6BjB,CAC7B,CACC,GACA,GACA,GAEA,aAAe,CACd,MAAM,CACP,CAEA,mBAAoB,CAEnB,MAAM,kBAAkB,EAExB,KAAKhY,GAAU,EAEf,KAAKkY,GAAU,KAAK,cAAc,mBAAmB,EACrD,KAAKgB,GAAO,KAAK,cAAc,QAAQ,EAIvC,KAAKlF,GAAW,CACjB,CAEA,OAAmB,CAClB,KAAKkF,GAAK,iBAAiB,YAAe,CACzC,KAAKhB,GAAQ,MAAM,CACpB,CAAC,EAED,KAAKA,GAAQ,iBAAiB,QAAU,GAAU,CACjD,IAAMtY,EAAMyY,EAAM,OAAO,MACzB,KAAK,MAAQzY,EACb,KAAK4Y,GAAU5Y,CAAG,EAElB,KAAK,MAAM,WAAW,QAAQ,EAAI,CACnC,CAAC,EAED,KAAKsY,GAAQ,iBAAiB,SAAW,GAAU,CAClD,IAAMtY,EAAMyY,EAAM,OAAO,MACzB,KAAK,MAAQzY,EACb,KAAK4Y,GAAU5Y,CAAG,EAElB,KAAK,MAAM,WAAW,QAAQ,EAAI,CACnC,CAAC,CACF,EAEA,OAAkB,CACjB,KAAK,UAAY;;;QAIlB,EAEA,eAAmB,CAClB,KAAK,QAAQ,CACd,EAEA,OAAuB,CAEtB,IAAMla,EAAa,KAAK,KAAK,aAAa,aAAa,EACvD,GAAKA,IAEL,KAAKyzB,GAAc,MAAM,aAAazzB,EAAY,KAAK,GAAG,KAAM,KAAK,GAAG,QAAQ,GAAG,EAEnF,KAAK,cAAc,UAAU,CAAC,EAAE,OAAO,EAEnC,KAAKyzB,IAAe,MAAM,QAAQ,KAAKA,EAAW,GAAG,CACxD,IAAMC,EAAa,cAAc,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAG,CAAC,IAEjEC,EAAW,SAAS,cAAc,UAAU,EAClD,EAAS,GAAKD,EAEd,IAAM3iB,EAAW,SAAS,uBAAuB,EAEjD,KAAK0iB,GAAY,QAAQ,GAAK,CAC7B,GAAI31B,EAAE,MAAO,CACZ,IAAM81B,EAAS,SAAS,cAAc,QAAQ,EAC9C,EAAO,MAAQ91B,EAAE,MACjBiT,EAAS,YAAY6iB,CAAM,CAC5B,CACD,CAAC,EAEDD,EAAS,YAAY5iB,CAAQ,EAC7B,KAAK,YAAY4iB,CAAQ,EAEzB,KAAKnB,GAAQ,aAAa,OAAQkB,CAAU,CAC7C,CACD,EAEA,YAAgB,CACf,GAAI,CAAC,KAAK,GAAG,KAAM,OAEnB,IAAM51B,EAAI,MAAM,QAAQ,EAExB,KAAK+1B,GAAe,EAEpB,KAAKrB,GAAQ,MAAQ10B,GAAyB,MAAQA,IAAM,GAAKA,EAAI,UAEjE,KAAK,QAAQ,GAChB,KAAKg1B,GAAU,CAEjB,EAEA,OAAkB,CAEjB,IAAMh1B,EAAI,KAAK00B,GAAQ,MAEnB10B,IAAM,IAAMA,GAAM,OAChB,KAAKg2B,GAAch2B,CAAC,EAGhB,KAAK21B,IAAe,MAAM,QAAQ,KAAKA,EAAW,GAAK,KAAKA,GAAY,OAAS,IAC1E,KAAKA,GAAY,KAAK,IACnB30B,EAAK,QAAU,IAAA,GAA0BA,EAAK,OAAS,IAAA,GAAwB,GAAZA,EAAK,KAA7CA,EAAK,MAA+C,CAChF,YAAY,IAAMhB,EAAE,YAAY,CAGvC,GACT,KAAK,KAAK,UAAU,IAAI,SAAS,GATlC,KAAK,KAAK,UAAU,IAAI,SAAS,EAapC,EAEA,GAAiB,GAAM,CACtB,GAAI,OAAOA,GAAM,UAAYA,EAAE,QAAU,GAAK,CAACA,EAAE,WAAW,GAAG,EAAG,MAAO,GAEzE,IAAIuO,EAAI,SAASvO,EAAE,OAAO,EAAG,CAAC,EAAG,EAAE,EAC/Bi2B,EAAI,SAASj2B,EAAE,OAAO,EAAG,CAAC,EAAG,EAAE,EAC/BoD,EAAI,SAASpD,EAAE,OAAO,EAAG,CAAC,EAAG,EAAE,EAKnC,MAFA,EADI,MAAMuO,CAAC,GAAK,MAAM0nB,CAAC,GAAK,MAAM7yB,CAAC,GAC/BmL,EAAI,GAAKA,EAAI,KAAO0nB,EAAI,GAAKA,EAAI,KAAO7yB,EAAI,GAAKA,EAAI,IAG1D,CACD,EAEK,eAAe,IAAI,kBAAkB,GACzC,eAAe,OAAO,mBAAoBqyB,CAAc,EC3IzD,IAAMS,EAAN,cAA4B1B,CAC5B,CACC,GACA,GAEA,aAAe,CACd,MAAM,CACP,CAEA,mBAAoB,CACnB,MAAM,kBAAkB,EAExB,KAAKhY,GAAU,EAEf,KAAKkY,GAAU,KAAK,cAAc,OAAO,EAEzC,KAAKA,GAAQ,iBAAiB,QAAU,GAAU,CACjD,IAAMtY,EAAMyY,EAAM,OAAO,MACzB,KAAK,MAAQzY,EACb,KAAKsY,GAAQ,UAAU,OAAO,YAAa,CAAC,CAACtY,CAAG,EAChD,KAAK4Y,GAAU5Y,CAAG,EAElB,MAAM,MAAM,WAAW,QAAQ,EAAI,CACpC,CAAC,EAED,KAAKsY,GAAQ,iBAAiB,SAAW,GAAU,CAClD,IAAMtY,EAAMyY,EAAM,OAAO,MACzB,KAAK,MAAQzY,EACb,KAAK4Y,GAAU5Y,CAAG,EAElB,MAAM,MAAM,WAAW,QAAQ,EAAI,CACpC,CAAC,CACF,CAEA,OAAkB,CAGjB,GADA,KAAK+Z,GAAQ,KAAK,KAAK,aAAa,WAAW,GAAK,OAChD,CAAC,CAAC,OAAO,iBAAiB,OAAO,OAAO,OAAO,CAAC,CAAC,SAAS,KAAKA,EAAK,EACvE,KAAM,kBAAkB,KAAKA,KAG9B,IAAInxB,EAAO,CAAC,EACZ,IAAK,IAAInB,EAAI,EAAGA,EAAI,KAAK,KAAK,WAAW,OAAQ,IAC5C,CAAC,QAAS,MAAO,MAAO,MAAM,CAAC,CAAC,SAAS,KAAK,KAAK,WAAWA,EAAE,CAAC,IAAI,GACxEmB,EAAK,KAAK,GAAG,KAAK,KAAK,WAAWnB,EAAE,CAAC,KAAK,IAAI,KAAK,KAAK,WAAWA,EAAE,CAAC,MAAM,EAAE,EAIhF,KAAK,UAAY;;qBAEE,KAAKsyB,GAAM;iCACC,KAAK,KAAK,aAAa,aAAa,GAAK,SAAS;eACpEnxB,EAAK,KAAK,GAAG,EAAE;;;QAI7B,EAEA,YAAgB,CAEf,IAAMhF,EAAI,MAAM,QAAQ,EAEpBo2B,EAAep2B,EACnB,GAAIo2B,EAEH,OAAQ,KAAKD,GAAb,CACC,IAAK,OACJ,EAAeC,EAAa,OAAO,EAAG,EAAE,EACxC,MACD,IAAK,iBACJ,EAAeA,EAAa,OAAO,EAAG,EAAE,EACxC,MACD,IAAK,OACJ,IAAIC,EAAI,IAAI,KAAKr2B,CAAC,EACdq2B,GAAK,gBAAkB,CAAC,MAAMA,CAAC,IAClC,GAAgB,KAAOA,EAAE,SAAS,EAAA,CAAG,MAAM,EAAE,EAAI,KAAO,KAAOA,EAAE,WAAW,EAAA,CAAG,MAAM,EAAE,GAExF,MACD,IAAK,QACJ,IAAIA,EAAI,IAAI,KAAKr2B,CAAC,EACdq2B,GAAK,gBAAkB,CAAC,MAAMA,CAAC,IAClC,GAAgB,OAASA,EAAE,YAAY,EAAA,CAAG,MAAM,EAAE,EAAI,KAAO,MAAQA,EAAE,SAAS,EAAI,GAAA,CAAI,MAAM,EAAE,EAGnG,CAGD,KAAK3B,GAAQ,MAAQ0B,GAAgB,GACrC,KAAK1B,GAAQ,UAAU,OAAO,YAAa,CAAC,CAAC0B,CAAY,EAErD,KAAK,QAAQ,GAChB,KAAKpB,GAAUoB,CAAY,CAE7B,EAEA,GAAa,GAAQ,CAEpB,GAAIha,IAAQ,IAAMA,GAAQ,KAA2B,CACpD,IAAIka,EAAU,KAAKC,GAAana,CAAG,EAE/Bka,IACC,KAAKpB,IAAQ9Y,EAAM,KAAK8Y,KAAM,EAAU,IACxC,KAAKD,IAAQ7Y,EAAM,KAAK6Y,KAAM,EAAU,KAGxCqB,GACJ,MAAM,KAAK,UAAU,IAAI,SAAS,CAEpC,CACD,EAEA,GAAgB,GAAM,CAErB,GAAI,OAAOt2B,GAAM,SAAU,MAAO,GAElC,IAAIs2B,EAAU,GAEd,OAAQ,KAAKH,GAAb,CACC,IAAK,OACL,IAAK,iBACJ,IAAMK,EAAQ,OAAOx2B,EAAE,OAAO,EAAG,CAAC,CAAC,EAC7By2B,EAAQ,OAAOz2B,EAAE,OAAO,EAAG,CAAC,CAAC,EAC7B02B,EAAQ,OAAO12B,EAAE,OAAO,EAAG,CAAC,CAAC,EAEnC,GAAI,MAAMw2B,CAAI,GAAK,MAAMC,CAAK,GAAK,MAAMC,CAAG,EAC3C,EAAU,QACJ,GAAID,EAAQ,GAAKA,EAAQ,IAAMC,EAAM,GAAKA,EAAM,GACtD,EAAU,QACJ,GAAI,CAAC,EAAG,EAAG,EAAG,EAAE,CAAC,CAAC,SAASD,CAAK,GAAKC,GAAO,GAClD,EAAU,QACJ,GAAID,GAAS,EAAG,CACtB,IAAIE,EAAUH,EAAO,GAAK,IAAMA,EAAO,KAAO,GAAKA,EAAO,KAAO,IAC7DE,EAAM,IAAOA,GAAO,IAAM,CAACC,KAC9B,EAAU,GAEZ,CAEF,CAEA,GAAIL,EACH,OAAQ,KAAKH,GAAb,CACC,IAAK,iBACJ,IAAIrhB,EAAO9U,EAAE,OAAO,GAAI,CAAC,EACrB42B,EAAO,OAAO52B,EAAE,OAAO,GAAI,CAAC,CAAC,EAC7B62B,EAAO,OAAO72B,EAAE,OAAO,GAAI,CAAC,CAAC,EAE7B8U,GAAK,KAEE,MAAM8hB,CAAI,GAAK,MAAMC,CAAG,GAExBD,EAAO,GAAKA,EAAO,IAAMC,EAAM,GAAKA,EAAM,MACpD,EAAU,IAJV,EAAU,GAMX,MAED,IAAK,QACJ,IAAIL,EAAQ,OAAOx2B,EAAE,OAAO,EAAG,CAAC,CAAC,EAC7By2B,EAAQ,OAAOz2B,EAAE,OAAO,EAAG,CAAC,CAAC,GAE7B,MAAMw2B,CAAI,GAAK,MAAMC,CAAK,GAEnBA,EAAQ,GAAKA,EAAQ,MAC/B,EAAU,IAEX,MAED,IAAK,OACJ,IAAID,EAAO,OAAOx2B,EAAE,OAAO,EAAG,CAAC,CAAC,EAC5BF,EAAOE,EAAE,OAAO,EAAG,CAAC,EACpB82B,EAAO,OAAO92B,EAAE,OAAO,EAAG,CAAC,CAAC,EAE5BF,GAAK,KAEE,MAAM02B,CAAI,GAAK,MAAMM,CAAI,GAEzBA,GAAQ,GAAKA,EAAO,MAC9B,EAAU,IAJV,EAAU,EAOb,CAGD,OAAOR,CACR,EAEA,GAAIpB,IAAO,CACV,OAAO,KAAK,KAAK,aAAa,KAAK,CACpC,CAEA,GAAID,IAAO,CACV,OAAO,KAAK,KAAK,aAAa,KAAK,CACpC,CAKD,EAEK,eAAe,IAAI,iBAAiB,GACxC,eAAe,OAAO,kBAAmBiB,CAAa,ECvMvD,IAAMa,EAAN,cAA2BvC,CAAoB,CAC3C,GACA,GAEA,aAAc,CACV,MAAM,CACV,CAEA,mBAAoB,CAChB,MAAM,kBAAkB,EAExB,KAAKhY,GAAU,EAEf,KAAKkY,GAAU,KAAK,cAAc,OAAO,EACzC,KAAKsC,GAAS,KAAK,cAAc,MAAM,EAEvC,KAAKxG,GAAW,CACpB,CAEA,IAAI,YAAa,CACb,MAAO,CACH,CAAE,MAAO,KAAK,UAAW,KAAM,KAAKyG,EAAU,EAC9C,CAAE,MAAO,KAAK,WAAY,KAAM,KAAKC,EAAW,CACpD,CACJ,CAEA,OAAmB,CACX,KAAK,QAAQ,OAAO,GACpB,KAAKxC,GAAQ,iBAAiB,SAAW,GAAM,CAC3C,MAAM,MAAM,cAAc,yBAAyB,MAAM,KAAK,QAAQ,IAAI,iBAAiB,CAAC,EAAE,UAAU,EAAE,OAAO,OAAO,CAC5H,CAAC,EAGL,KAAKA,GAAQ,iBAAiB,SAAW,GAAU,CAC1C,KAAK,QAAQ,OAAO,IAErB,KAAKyC,IACL,KAAK,UAAU,EAAK,EACpB,KAAK,MAAQ,KAAK,WAGlB,KAAK,MAAQtC,EAAM,OAAO,QAAU,KAAK,UAAY,KAAK,WAG9D,KAAK,MAAM,WAAW,QAAQ,EAAI,EACtC,CAAC,CACL,EAEA,OAAkB,CAEd,IAAMuC,EAAY,KAAK,UAGjBhM,EAAkB,KAAK,KAAK,aAAa,SAAS,GAAK,GACvDiM,EAAY,KAAKF,GAAW,8BAA8BC,EAAU,MAAQ,yCAAyChM,EAAgB,iBAE3I,KAAK,UAAY;cACXiM,EAAU;SAEpB,EAEA,YAAgB,CACZ,IAAMjb,EAAM,MAAM,QAAQ,EAE1B,KAAKsY,GAAQ,QAAWtY,IAAQ,KAAK,UAEjC,KAAK,QAAQ,GACb,KAAK4Y,GAAU5Y,CAAG,EAGtB,IAAMkb,EAAelb,IAAQ,KAAK,UAAa,KAAK6a,GAAc7a,IAAQ,KAAK,WAAc,KAAK8a,GAAa9a,EAE3G,KAAK4a,KACL,KAAKA,GAAO,YAAcM,EAElC,EAEA,GAAa,GAAQ,CAEjB,KAAK,KAAK,UAAU,OAAO,SAAS,EAEhClb,IAAQ,IAAMA,GAAQ,MAClBA,IAAQ,KAAK,WAAaA,IAAQ,KAAK,YACvC,KAAK,KAAK,UAAU,IAAI,SAAS,CAG7C,EAEA,UAAa,GAAM,CACf,GAAI,KAAK,QAAQ,OAAO,EAAG,OAE3B,IAAM8X,EAAO,KAAK,KAAK,KAAK,SAAS,EAC/BzyB,EAAW,KAAK,KAAK,OAAO,QAAQ,KAAK,KAAK,QAAQ,IAAI,EAEhE,GAAI,IAAW,GAEf,KAAK,IAAIoC,EAAI,EAAGA,EAAIqwB,EAAK,OAAQ,IACzB,KAAKqD,IAAW,MAAM,aAAa,KAAKA,GAASrD,EAAKrwB,GAAIA,EAAG,KAAK,IAAI,IAAM,IAC5E,KAAK2zB,IAAa,MAAM,aAAa,KAAKA,GAAWtD,EAAKrwB,GAAIA,EAAG,KAAK,IAAI,IAAM,IAChF,KAAK4zB,IAAY,MAAM,aAAa,KAAKA,GAAUvD,EAAKrwB,GAAIA,EAAG,KAAK,IAAI,IAAM,KAElF,EAAKA,EAAE,CAAC,EAAEpC,GAAYzB,EAAI,KAAK,UAAY,KAAK,YAGpD,MAAM,MAAM,WAAW,CAFvB,CAGJ,EAEA,IAAI,WAAY,CACZ,OAAO,KAAK,KAAK,aAAa,YAAY,GAAK,GACnD,CACA,IAAI,YAAa,CACb,OAAO,KAAK,KAAK,aAAa,aAAa,GAAI,GACnD,CACA,GAAIi3B,IAAY,CACZ,OAAO,KAAK,KAAK,aAAa,WAAW,GAAK,EAClD,CACA,GAAIC,IAAa,CACb,OAAO,KAAK,KAAK,aAAa,YAAY,GAAK,EACnD,CACA,GAAIC,IAAW,CACX,OAAO,KAAK,KAAK,aAAa,UAAU,GAAK,EACjD,CACA,GAAII,IAAU,CACV,OAAO,KAAK,KAAK,aAAa,QAAQ,GAAK,EAC/C,CACA,GAAIC,IAAY,CACZ,OAAO,KAAK,KAAK,aAAa,UAAU,GAAK,EACjD,CACA,GAAIC,IAAW,CACX,OAAO,KAAK,KAAK,aAAa,SAAS,GAAK,EAChD,CACJ,EAEK,eAAe,IAAI,eAAe,GACnC,eAAe,OAAO,gBAAiBV,CAAY,ECtIvD,IAAMW,EAAN,cAAwBlD,CAAoB,CAC3C,GACA,GAAa,CAAC,EACd,GAAc,CAAC,EAEf,aAAc,CACb,MAAM,CACP,CAEA,mBAAoB,CACnB,MAAM,kBAAkB,EAExB,KAAKhY,GAAU,EAEf,KAAKmb,GAAe,EAEpB,KAAKnH,GAAW,CACjB,CAEA,OAAmB,CAElB,KAAK,KAAK,iBAAiB,UAAW,GAAK,CAE1C,GAAI,OAAK,KAAK,aAAa,UAAU,GAAK,KAAK,KAAK,UAAU,SAAS,UAAU,IAC7E,KAAK,KAAK,aAAa,UAAU,IAAM,QAEvC,EAAE,OAAS,QAAS,CACvB,EAAE,eAAe,EAEjB,IAAIoH,EAAa,GAEjB,KAAKC,GAAW,SAAS,EAAI,IAAU,CACtC,GAAI,KAAK,QAAU71B,EAAI,aAAa,OAAO,EAE1C,MADA,GAAauB,EACN,EAET,CAAC,EAED,EAAcq0B,IAAe,KAAKC,GAAW,OAAS,EAAK,EAAKD,GAAc,EAAIA,EAAa,EAAI,EACnG,KAAK,MAAQ,KAAKC,GAAWD,EAAW,CAAC,aAAa,OAAO,EAE7D,KAAK,MAAM,WAAW,QAAQ,EAAI,CACnC,CACD,CAAC,CACF,EAEA,OAAuB,CAEtB,GAAI,CAAC,KAAK,KAAM,OAEhB,IAAM11B,EAAa,KAAK,KAAK,aAAa,aAAa,EACvD,GAAKA,IAEL,KAAKyzB,GAAc,MAAM,aAAazzB,EAAY,KAAK,GAAG,KAAM,KAAK,GAAG,QAAQ,GAAG,EAEnF,KAAKwyB,GAAQ,gBAAgB,EAEzB,KAAKiB,IAAe,MAAM,QAAQ,KAAKA,EAAW,GAAG,CAExD,IAAM1iB,EAAW,SAAS,uBAAuB,EAEjD,KAAK0iB,GAAY,QAAQ,GAAK,CAC7B,IAAMmC,EAAU93B,EAAE,KAAK+3B,MAAc,IAAA,GAA+B,GAAnB/3B,EAAE,KAAK+3B,IAClDC,EAAUh4B,EAAE,KAAKi4B,MAAgB,IAAA,GAAiC,GAArBj4B,EAAE,KAAKi4B,IAEpDC,EAAQ,SAAS,cAAc,OAAO,EAEtCC,EAAQ,SAAS,cAAc,OAAO,EAC5C,EAAM,KAAO,QACb,EAAM,MAAQL,EAEd,IAAMM,EAAO,SAAS,cAAc,MAAM,EAC1C,EAAK,YAAcJ,EAEnBE,EAAM,YAAYC,CAAK,EACvBD,EAAM,YAAYE,CAAI,EACtBnlB,EAAS,YAAYilB,CAAK,CAC3B,CAAC,EAED,KAAKxD,GAAQ,YAAYzhB,CAAQ,EAGjC,KAAK4kB,GAAa,MAAM,KAAK,KAAK,iBAAiB,OAAO,CAAC,EAI3D,KAAKA,GAAW,QAAQ,GAAO,CAC9B71B,EAAI,iBAAiB,SAAW,GAAM,CACrC,KAAK,MAAQ,EAAE,OAAO,MACtB,KAAK,MAAM,WAAW,QAAQ,EAAI,CACnC,CAAC,CACF,CAAC,CACF,CACD,EAEA,OAAkB,CAEjB,KAAK,UAAY;;UAIjB,KAAK0yB,GAAU,KAAK,cAAc,KAAK,CACxC,EAEA,eAAmB,CAClB,KAAKiD,GAAe,EACpB,KAAK,QAAQ,CACd,EAEA,YAAgB,CAEf,IAAM33B,EAAI,MAAM,QAAQ,EAExB,KAAK63B,GAAW,QAAQ,GAAO,CAC9B,EAAI,QAAW73B,IAAMgC,EAAI,KAC1B,CAAC,EAEG,KAAK,QAAQ,GAChB,KAAKgzB,GAAU,CAEjB,EAEA,OAAkB,CAEb,KAAK,QAAU,MAAQ,KAAK,QAAU,IAAA,IAAa,KAAK,QAAU,IAAO,MAAM,QAAQ,KAAKW,EAAW,GAI/F,KAAKA,GAAY,UAAU,GAAK,KAAK,QAAUhO,EAAE,KAAKoQ,GAC5D,EAAI,GACT,KAAK,KAAK,UAAU,IAAI,SAAS,CAEnC,EAEA,IAAI,YAAa,CAChB,OAAO,KAAKpC,EACb,CAEA,GAAIoC,IAAW,CACd,OAAO,KAAK,KAAK,aAAa,UAAU,GAAK,GAC9C,CAEA,GAAIE,IAAa,CAChB,OAAO,KAAK,KAAK,aAAa,YAAY,GAAK,GAChD,CACD,EAEK,eAAe,IAAI,YAAY,GACnC,eAAe,OAAO,aAAcP,CAAS,ECrJ9C,IAAaW,EAAb,cAAoC,WAAY,CAC/C,GACA,GACA,GACA,GAAU,GAEV,aAAc,CACb,MAAM,CACP,CAEA,mBAAoB,CACnB,KAAK7b,GAAU,EACf,KAAK5H,GAAY,CAClB,CAEA,IAAa,EAAY,EAAS,EAAW,EAAO,IAAc,CACjE,IAAM0jB,EAAM,KAAK,cAAc,mBAAmB,EAClD,GAAI,CAACA,GAAO,CAACp2B,GAAcA,EAAW,SAAW,EAAG,OAEpD,IAAMq2B,EAAY,KAAK93B,GAAQ,aAAa,OAAO,EAC/C+3B,EAAY,CAAC,EAEjB,AAGCA,EAHGD,EACSA,EAAU,MAAM,GAAG,CAAC,CAAC,IAAI,GAAK3yB,EAAE,KAAK,CAAC,EAEtC,CAAC6yB,CAAS,CAAC,CAAC,OAAO,OAAO,EAGvC,IAAMC,EAAoBF,EAAU,OAEpC,EAAI,WAAW,cAAc,oBAAoB,CAAC,CAAC,MAAM,QAAUG,EAAQ,GAAK,OAEhFL,EAAI,WAAW,iBAAiB,8BAA8B,CAAC,CAAC,SAAS,EAAK,IAAQ,CAErF,IAAMtjB,EAAM,SAAShT,EAAI,QAAQ,IAAK,EAAE,EACpCgT,GAAO,IACV,EAAI,MAAM,QAAWA,EAAM,GAAK0jB,EAAqB,OAAS,GAEhE,CAAC,EAED,IAAME,EAAgB12B,EAAW,IAAI,GAAQ,CAC5C,IAAMY,EAAM,CACX,IAAK,IACL,EAAG+1B,GAAW73B,EAAK63B,KAAa,IAAA,GAAY73B,EAAK63B,GAAY73B,EAAK,KAAO,IAAA,GAAsB,GAAVA,EAAK,EAC3F,EAKA,OAHAw3B,EAAU,SAAS,EAAK,IAAQ,CAC/B,EAAI,MAAMl3B,EAAM,KAAON,EAAKoN,KAAS,IAAA,GAAyBpN,EAAKM,KAAS,IAAA,GAAwB,GAAZN,EAAKM,GAA5CN,EAAKoN,EACvD,CAAC,EACMtL,CACR,CAAC,EAID,GAFAw1B,EAAI,KAAK,IAAIM,CAAa,EAEtBD,GAAS,KAAKl4B,GAAQ,MAAO,CAChC,IAAMq4B,EAAe,OAAO,KAAKr4B,GAAQ,KAAK,CAAC,CAAC,MAAMs4B,GAAa,GAAG,EACtET,EAAI,KAAK,aAAa,CAAC,CAAC,QAAQ,GAAK,CAChCQ,EAAa,SAAS,OAAOnR,EAAE,EAAE,EAAE,CAAC,IACvC,EAAE,EAAE,GAAK,IAEX,CAAC,EACD2Q,EAAI,YAAY,CACjB,CACD,EAEA,MAAQ,EAAQ,EAAY,EAAS,EAAW,EAAO,IAAc,CACpE,KAAK73B,GAAUC,EACf,KAAKq3B,GAAWc,EAChB,KAAKZ,GAAaQ,EAClB,KAAKO,GAAU,GAEf,KAAK,UAAU,IAAI,QAAQ,EAE3B,IAAMV,EAAM,KAAK,cAAc,mBAAmB,EAClD,GAAI,CAACA,GAAO,CAACp2B,EAAY,OAEzB,KAAK,cAAc,eAAe,CAAC,CAAC,MAAQ,GAC5C,KAAK,cAAc,SAAS,CAAC,CAAC,QAAU,GAEpCA,EAAW,OAAS,GACvB,KAAK,UAAU,IAAI,QAAQ,EAE3B,KAAK,UAAU,OAAO,QAAQ,EAG3By2B,EACH,KAAK,UAAU,IAAI,OAAO,EAE1B,KAAK,UAAU,OAAO,OAAO,EAG9B,IAAM7yB,EAAQpF,EAAO,QAAQ,kBAAkB,EACzCu4B,EAAQv4B,EAAO,cAAc,OAAO,EAC1C,GAAI,CAACu4B,GAAS,CAACnzB,EAAO,OAEtB,IAAMozB,EAAUD,EAAM,sBAAsB,EACtCze,EAAY1U,EAAM,sBAAsB,EAE1Cwb,EAAO4X,EAAQ,KAAO1e,EAAU,KAChCoJ,EAAMsV,EAAQ,OAAS1e,EAAU,IAAM,EAErCmJ,EAAa,KAAK,aAAe,IACjCwV,EAAc,KAAK,cAAgB,IASzC,GARI7X,EAAOqC,EAAanJ,EAAU,QACjC,EAAO,KAAK,IAAI,EAAGA,EAAU,MAAQmJ,EAAa,CAAC,GAGhDrC,EAAO,IACV,EAAO,GAGJsC,EAAMuV,EAAc3e,EAAU,OAAQ,CACzC,IAAM4e,EAAaF,EAAQ,IAAM1e,EAAU,IAAO2e,EAAc,EAChE,AAGCvV,EAHGwV,GAAa,EACVA,EAEA,KAAK,IAAI,EAAG5e,EAAU,OAAS2e,EAAc,CAAC,CAEtD,CAEA,KAAK,MAAM,KAAO,GAAG7X,EAAK,IAC1B,KAAK,MAAM,IAAM,GAAGsC,EAAI,IAExB,eAAiB,CAEhB,KAAKyV,GAAUn3B,EAAY22B,EAASJ,EAAWE,EAAOI,CAAS,EAE/D,IAAMO,EAAgBhB,EAAI,WAAW,cAAc,qCAAqC,EAExF,AAWCgB,EAAc,mBATdA,EAAc,iBAAiB,YAAc,GAAM,CAEvC,EAAE,OAAO,QAAQ,IACtB,IAEDX,GACJ,KAAKY,GAAY,CAAC,EAEpB,CAAC,EAC+B,GAElC,EAAG,GAAG,CACP,EAEA,UAAc,CACb,KAAK,UAAU,OAAO,QAAQ,EAC9B,KAAKP,GAAU,GACX,KAAKv4B,IAAW,KAAKA,GAAQ,MAChC,KAAKA,GAAQ,KAAK,MAAM,CAE1B,EAEA,GAAe,GAAM,CAEpB,IAAMqF,EAAQ,EAAE,OAAO,QAAQ,kBAAkB,EAC3CuL,EAAK,EAAE,OAAO,QAAQ,IAAI,EAE1B7P,EAAW,SAAS6P,EAAG,QAAQ,IAAK,EAAE,EACtC3O,EAASoD,EAAM,KAAK,IAAItE,CAAQ,EAEtC,KAAKf,GAAQ,MAAQiC,EAAO,EAE5B,KAAKjC,GAAQ,MAAM,WAAW,QAAQ,EAAI,EAE1C,KAAK,MAAM,CACZ,EAEA,OAAc,CAEb,IAAMyzB,EADM,KAAK,cAAc,mBAChB,CAAC,CAAC,KAAK,aAAa,EAE7B4E,EAAe,CAAC,EACtB5E,EAAK,QAAQ,GAAK,CACb1xB,EAAE,EAAE,KAAO,KACds2B,EAAa,KAAKt2B,EAAE,EAAE,EAAE,CAE1B,CAAC,EAED,KAAK/B,GAAQ,MAAQq4B,EAAa,KAAK,KAAKr4B,GAAQ,aAAa,iBAAiB,GAAK,GAAG,EAC1F,KAAKA,GAAQ,MAAM,WAAW,QAAQ,EAAI,EAE1C,KAAK,MAAM,CACZ,EAEA,GAAgB,GAAM,CACrB,IAAM63B,EAAM,KAAK,cAAc,mBAAmB,EAC5C5S,EAAY,EAAE,OAAO,QAAU,IAAM,IAC3C4S,EAAI,KAAK,aAAa,CAAC,CAAC,QAAQ,GAAK,CAAE,EAAE,EAAE,GAAK5S,CAAW,CAAC,EAC5D4S,EAAI,YAAY,CACjB,EAEA,GAAY,GAAM,CACjB,IAAMkB,EAAU,EAAE,OAAO,MAAM,YAAY,EACrClB,EAAM,KAAK,cAAc,mBAAmB,EAElDA,EAAI,KAAK,eAAe,CAAC,CAAC,QAAQ,GAAK,CACtC,IAAMjH,EAAQ,OAAO,OAAO1J,EAAE,CAAC,CAAC,CAAC,KAAK,GACrCvL,GAAQ,MAA6B,OAAOA,CAAG,CAAC,CAAC,YAAY,CAAC,CAAC,SAASod,CAAO,CAChF,EACA,EAAE,KAAK,SAAW,CAACnI,CACpB,CAAC,EAEDiH,EAAI,KAAK,aAAa,EACtBA,EAAI,YAAY,YAAY,MAAM,CACnC,EAEA,IAAI,QAAS,CACZ,OAAO,KAAKU,EACb,CAEA,IAAI,YAAa,CAChB,OAAO,KAAKv4B,EACb,CAEA,OAAoB,CACnB,KAAK,cAAc,eAAe,CAAC,CAAC,iBAAiB,QAAS,KAAK6iB,EAAQ,EAC3E,KAAK,cAAc,QAAQ,CAAC,CAAC,iBAAiB,QAAS,KAAKE,EAAK,EACjE,KAAK,cAAc,SAAS,CAAC,CAAC,iBAAiB,SAAU,KAAKD,EAAY,EAE1E,SAAS,iBAAiB,YAAc,GAAM,EAChC,EAAE,aAAe,EAAE,aAAa,EAAI,CAAC,EAAA,CAEzC,SAAS,IAAI,GAGtB,KAAK,MAAM,CACZ,CAAC,CACF,EAEA,OAAkB,CACjB,KAAK,UAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAgDlB,CACD,EAEK,eAAe,IAAI,kBAAkB,GACzC,eAAe,OAAO,mBAAoB8U,CAAc,ECzRzD,IAAaoB,EAAb,cAA+BjF,CAAoB,CAClD,GACA,GAAc,CAAC,EACf,GACA,GACA,GACA,GACA,GAEA,aAAc,CACb,MAAM,CACP,CAEA,mBAAoB,CAEnB,KAAKhY,GAAU,EACf,MAAM,kBAAkB,EAExB,KAAKub,GAAW,MAAM,KAAK,aAAa,UAAU,GAAK,IACvD,KAAKE,GAAa,MAAM,KAAK,aAAa,YAAY,GAAK,IAC3D,KAAKyB,GAAS,MAAM,KAAK,aAAa,OAAO,IAAM,OACnD,KAAKC,GAAkB,MAAM,KAAK,aAAa,iBAAiB,GAAK,IAErE,KAAKN,GAAU,EACf,KAAK7I,GAAW,CACjB,CAEA,eAAmB,CAClB,KAAK6I,GAAU,EACf,KAAK,QAAQ,CACd,EAEA,OAAkB,CACjB,GAAI,CAAC,MAAM,OAAS,CAAC,MAAM,KAAM,OAEjC,IAAMn3B,EAAa,MAAM,MAAM,aAAa,aAAa,EACpDA,IAEL,KAAKyzB,GAAc,MAAM,aAAazzB,EAAY,MAAM,GAAG,KAAM,MAAM,GAAG,QAAQ,GAAG,EACtF,EAEA,OAAmB,CAClB,KAAK,iBAAiB,QAAQ,CAAC,CAAC,QAAQ,GAAO,CAC9CojB,EAAI,iBAAiB,QAAU,GAAM,CACpC,EAAE,gBAAgB,EAClB,KAAKsU,GAAa,CACnB,CAAC,CACF,CAAC,CACF,EAEA,OAAqB,CAEf,KAAKphB,KACT,KAAKA,GAAS,MAAM,MAAM,cAAc,kBAAkB,EACrD,KAAKA,KACT,KAAKA,GAAS,SAAS,cAAc,kBAAkB,EACvD,MAAM,MAAM,YAAY,KAAKA,EAAM,IAIjC,KAAKA,GAAO,QAAU,KAAKA,GAAO,aAAe,KACpD,KAAKA,GAAO,MAAM,EAElB,KAAKA,GAAO,KAAK,KAAM,KAAKmd,GAAa,KAAKoC,GAAU,KAAKE,GAAY,KAAKyB,GAAQ,KAAKC,EAAe,CAE5G,EAEA,OAAkB,CACjB,KAAK,UAAY;;;UAKjB,KAAKE,GAAa,KAAK,cAAc,OAAO,CAC7C,EAEA,YAAgB,CACf,IAAM75B,EAAI,MAAM,QAAQ,EAMxB,OALK,KAAK65B,KAEV,KAAKA,GAAW,YAAc,KAAKC,GAAgB,GAAK,SACxD,KAAKC,GAAe,GAEb/5B,CACR,EAEA,OAAwB,CACvB,GAAI,CAAC,KAAK,OAAS,CAAC,MAAM,QAAQ,KAAK21B,EAAW,EAAG,MAAO,GAE5D,GAAI,KAAK+D,GAAQ,CAChB,IAAMM,EAAO,OAAO,KAAK,KAAK,CAAC,CAAC,MAAM,KAAKL,EAAe,EAC1D,OAAO,KAAKhE,GACV,OAAO,GAAKqE,EAAK,SAAS,OAAOrS,EAAE,KAAKoQ,GAAS,CAAC,CAAC,CAAC,CACpD,IAAI,GAAKpQ,EAAE,KAAKsQ,GAAW,CAAC,CAC5B,KAAK,KAAK0B,EAAe,CAC5B,CAAO,CACN,IAAMr1B,EAAQ,KAAKqxB,GAAY,KAAK,GAAK,OAAOhO,EAAE,KAAKoQ,GAAS,IAAM,OAAO,KAAK,KAAK,CAAC,EACxF,OAAOzzB,EAAQA,EAAM,KAAK2zB,IAAc,KAAK,KAC9C,CACD,EAEA,OAAuB,CAItB,GAHI,CAAC,MAAM,OACX,MAAM,KAAK,UAAU,OAAO,SAAS,EAEjC,KAAK,QAAU,MAAQ,KAAK,QAAU,IAAA,IAAa,KAAK,QAAU,IAAM,CAAC,MAAM,QAAQ,KAAKtC,EAAW,GAC1G,OAGD,IAAMsE,EAAO,KAAKP,GAAS,OAAO,KAAK,KAAK,CAAC,CAAC,MAAM,KAAKC,EAAe,EAAI,CAAC,KAAK,KAAK,EACvF,IAAK,IAAM35B,KAAKi6B,EAEf,GADY,KAAKtE,GAAY,UAAU,GAAK,OAAO31B,CAAC,IAAM,OAAO2nB,EAAE,KAAKoQ,GAAS,CAC3E,EAAI,EAAG,CACZ,MAAM,KAAK,UAAU,IAAI,SAAS,EAClC,KACD,CAEF,EAEA,IAAI,YAAa,CAChB,OAAO,KAAKpC,EACb,CACD,EAEK,eAAe,IAAI,YAAY,GACnC,eAAe,OAAO,aAAc8D,CAAS,EC9H9C,IAAMS,EAAN,cAA2B1G,CAAY,CACtC,GAEA,aAAc,CACb,MAAM,CACP,CAEA,mBAAoB,CACnB,MAAM,kBAAkB,EAExB,KAAKhX,GAAU,EAEf,KAAKkY,GAAU,KAAK,cAAc,MAAM,CACzC,CAEA,YAAgB,CAEf,MAAM,QAAQ,EAEV,KAAK,KAAK,aAAa,MAAM,IAAM,OACtC,KAAKA,GAAQ,UAAY,KAAK,eAAe,EAE7C,KAAKA,GAAQ,YAAc,KAAK,eAAe,CAEjD,EAEA,OAAkB,CACjB,KAAK,UAAY;;QAGlB,CACD,EAEK,eAAe,IAAI,eAAe,GACtC,eAAe,OAAO,gBAAiBwF,CAAY,ECjCpD,IAAaC,EAAb,cAAgC3G,CAAY,CAC3C,GAEA,aAAc,CACb,MAAM,CACP,CAEA,mBAAoB,CAEnB,KAAKhX,GAAU,EAEf,MAAM,kBAAkB,EAExB,KAAKkY,GAAU,KAAK,cAAc,QAAQ,EAE1C,KAAKA,GAAQ,oBAAoB,QAAS,KAAK0F,EAAgB,EAC/D,KAAK1F,GAAQ,iBAAiB,QAAS,KAAK0F,EAAgB,CAC7D,CAEA,GAAmB,GAAK,CACvB,EAAE,gBAAgB,EAElB,IAAM/3B,EAAQ,SAAS,KAAK,KAAK,QAAQ,IAAK,EAAE,EAE1Cg4B,EAAc,IAAI,YAAY95B,EAAW,MAAM,kBAAmB,CACvE,QAAS,GACT,SAAU,GACV,OAAQ,CACP,cAAe,EACf,KAAM,KAAK,KACX,IAAK8B,EACL,IAAK,SAAS,KAAK,KAAK,QAAQ,IAAK,EAAE,EACvC,KAAM,KAAK,QAAQ,KACnB,KAAM,KAAK,KAAK,KAAK,IAAIA,CAAK,EAC9B,MAAO,KAAK,KACb,CACD,CAAC,EAED,KAAK,cAAcg4B,CAAW,CAC/B,EAEA,YAAgB,CACf,IAAMC,EAAW,MAAM,QAAU,MAAM,QAAQ,EAAI,KAAK,MAExD,KAAK5F,GAAQ,UAAY,KAAK,eAAe4F,CAAQ,CACtD,EAEA,OAAkB,CAIjB,KAAK,UAAY;;SAGlB,CACD,EAEK,eAAe,IAAI,aAAa,GACpC,eAAe,OAAO,cAAeH,CAAU,EC1DhD,IAAMI,GAAN,cAA+B/G,CAAY,CAC1C,GACA,GACA,GAEA,aAAc,CACb,MAAM,CACP,CAEA,mBAAoB,CACnB,KAAKhX,GAAU,EACf,MAAM,kBAAkB,EAEpB,KAAK,OACR,KAAK,KAAK,gBAAgB,UAAU,EACpC,KAAK,KAAK,QAAQ,KAAO,YAG1B,KAAKge,GAAc,KAAK,cAAc,cAAc,EACpD,KAAKC,GAAa,KAAK,cAAc,aAAa,EAClD,KAAKC,GAAgB,KAAK,cAAc,aAAa,CACtD,CAEA,OAAkB,CACjB,KAAK,UAAY;;;;SAKlB,EAEA,YAAgB,CACf,GAAI,CAAC,KAAK,MAAQ,CAAC,KAAK,GAAI,OAE5B,KAAK,UAAU,OAAO,YAAa,YAAa,WAAW,EAE3D,IAAM53B,EAAM,KAAK,IACjB,GAAI,MAAMA,CAAG,EAAG,OAEhB,IAAMixB,EAAY,KAAK,GAAG,KAE1B,GAAIA,EACH,OAAQA,EAAU,EAAE,EAAExzB,EAAW,KAAK,MAAM,WAA5C,CACC,KAAKA,EAAW,UAAU,OACzB,KAAK,UAAU,IAAI,WAAW,EAC9B,MACD,KAAKA,EAAW,UAAU,OACzB,KAAK,UAAU,IAAI,WAAW,EAC9B,MACD,KAAKA,EAAW,UAAU,OACzB,KAAK,UAAU,IAAI,WAAW,CAIhC,CAGD,IAAMo6B,EAAa,KAAK,MAAQ,EAC1BC,EAAeD,EAAW,eAAe,EAE/C,GAAIA,GAAc,IAAO,CAExB,IAAME,EAAaD,EAAa,OAAS,EACnCE,EAAaF,EAAa,UAAU,EAAGC,EAAa,CAAC,EACrDE,EAAaH,EAAa,UAAUC,EAAa,CAAC,EAExD,KAAKL,GAAY,UAAY;2CACWM,EAAW;2CACXC,EAAW;;UAGpD,KACC,MAAKP,GAAY,UAAY,GAAGI,IAGjC,IAAMI,EAAW,OAAK,MAAM,cAAc,wBAAwB,EAC5DC,EAAY,OAAK,MAAM,cAAc,yCAAyC,EAEpF,KAAKR,GAAW,UAAY33B,EAC5B,KAAK23B,GAAW,MAAM,QAAWO,GAAYC,EAAa,GAAK,MAChE,CACD,EAEK,eAAe,IAAI,oBAAoB,GAC3C,eAAe,OAAO,qBAAsBV,EAAgB,ECrF7D,IAAaW,GAAb,cAA+B,WAAY,CACvC,GACA,GAEA,aAAc,CACV,MAAM,CACV,CAEA,mBAAoB,CAChB,KAAKzH,GAAQ,KAAK,QAAQ,QAAQ,EAClC,KAAK1pB,GAAS,KAAK,QAAQ,kBAAkB,EAEzC,KAAK0pB,KACL,KAAKA,GAAM,MAAM,SAAW,YAI5B,KAAK,aAAa,WAAW,IAAM,QACnC,KAAKA,IAAO,aAAa,WAAW,IAAM,OAG1C,0BAA4B,CACxB,KAAK,SAAS,EAAI,CACtB,CAAC,GAED,KAAK,UAAU,OAAO,WAAW,EACjC,KAAK,UAAU,IAAI,QAAQ,GAG/B,KAAK,oBAAoB,QAAS,KAAK5N,EAAQ,EAC/C,KAAK,iBAAiB,QAAS,KAAKA,EAAQ,CAChD,CAEA,GAAY,GAAM,CACd,EAAE,eAAe,EACjB,EAAE,gBAAgB,EAEd,KAAK,UAAU,SAAS,QAAQ,EAChC,KAAK,SAAS,EAEd,KAAK,OAAO,CAEpB,EAEA,WAAe,CACX,GAAI,CAAC,KAAK9b,IAAQ,YAAc,CAAC,KAAK0pB,GAAO,OAC7C,IAAMhyB,EAAW,SAAS,KAAKgyB,GAAM,QAAQ,IAAK,EAAE,EAC9Chf,EAAU,KAAKgf,GAAM,SAAW,EAEtC,KAAK,UAAU,OAAO,WAAW,EACjC,KAAK,UAAU,IAAI,QAAQ,EAC3B,KAAKA,GAAM,aAAa,YAAa,OAAO,EAC5C,KAAKA,GAAM,MAAM,MAAQ,GAEzB,IAAM/H,EAAc,SAAS,KAAK+H,GAAM,QAAQ,YAAa,EAAE,GAAK,IAEpE,GAAIhf,IAAY,EACZ,KAAK1K,GAAO,WAAW,eAAetI,EAAUiqB,CAAW,MACxD,CACH,IAAMyP,EAAc,KAAK,IAAI,GAAI,KAAK,MAAMzP,EAAcjX,CAAO,CAAC,EAClE,IAAK,IAAI5Q,EAAI,EAAGA,EAAI4Q,EAAS,IACzB,KAAK1K,GAAO,WAAW,eAAetI,EAAWoC,EAAGs3B,CAAW,CAEvE,CAEA,0BAA4B,CACpB,OAAO,KAAKpxB,GAAO,eAAkB,YACrC,KAAKA,GAAO,cAAc,CAElC,CAAC,CACL,EAEA,UAAY,EAAgB,KAAU,CAClC,GAAI,CAAC,KAAKA,IAAQ,YAAc,CAAC,KAAK0pB,GAAO,OAC7C,IAAMhyB,EAAW,SAAS,KAAKgyB,GAAM,QAAQ,IAAK,EAAE,EAC9Chf,EAAU,KAAKgf,GAAM,SAAW,EAEtC,GAAI,KAAK,UAAU,SAAS,QAAQ,EAAG,CACnC,IAAMze,EAAM,KAAKjL,GAAO,cAAc,0BAA0BtI,EAAS,GAAG,EACtE25B,EAAWpmB,EAAM,SAASA,EAAI,aAAa,OAAO,EAAG,EAAE,EAAI,EAC7DomB,EAAA,KACA,KAAK3H,GAAM,QAAQ,YAAc,OAAO2H,EAAW3mB,CAAO,EAElE,CAOA,GALA,KAAK,UAAU,OAAO,QAAQ,EAC9B,KAAK,UAAU,IAAI,WAAW,EAC9B,KAAKgf,GAAM,aAAa,YAAa,MAAM,EAC3C,KAAKA,GAAM,MAAM,MAAQ,cAErBhf,IAAY,EACZ,KAAK1K,GAAO,WAAW,eAAetI,EAAA,EAAyB,MAC5D,CACH,IAAM45B,EAAa,KAAK,IAAI,GAAI,KAAK,MAAA,GAAwB5mB,CAAO,CAAC,EACrE,IAAK,IAAI5Q,EAAI,EAAGA,EAAI4Q,EAAS,IACzB,KAAK1K,GAAO,WAAW,eAAetI,EAAWoC,EAAGw3B,CAAU,CAEtE,CAEA,0BAA4B,CACpB,OAAO,KAAKtxB,GAAO,eAAkB,YACrC,KAAKA,GAAO,cAAc,CAElC,CAAC,CACL,EAEA,sBAAuB,CACnB,KAAK,oBAAoB,QAAS,KAAK8b,EAAQ,CACnD,CACJ,EAEK,eAAe,IAAI,uBAAuB,GAC3C,eAAe,OAAO,wBAAyBqV,EAAS,EChH5D,IAAaI,GAAb,cAAiC,WAAY,CACzC,GACA,GAEA,mBAAoB,CAChB,IAAM1e,EAAO,KAAK,YAAY,EAC9B,KAAK2e,GAAa3e,aAAgB,WAAaA,EAAK,KAAQ,KAAK,QAAQ,YAAY,GAAKA,EAAK,KAE/F,AACI,KAAK2e,KAAa,KAAK,eAAe,QAAQ,YAAY,GAAK,KAAK,cAAc,QAAQ,YAAY,EAGrG,KAAKA,EACd,CAEA,GAAkB,GAAM,CACpB,IAAMxX,EAAO,EAAE,aAAe,EAAE,aAAa,EAAI,CAAC,EAC5CvN,EAAauN,EAAK,KAAK,GAAM/kB,EAAG,UAAY,MAAQA,EAAG,UAAY,IAAI,EAE7E,GAAI,CAACwX,EAAY,OAEjB,IAAMglB,EAAczX,EAAK,KAAK,GAAM/kB,EAAG,UAAY,OAAO,GAAKwX,EAAW,QAAQ,OAAO,EAEzF,EAAE,eAAe,EACjB,EAAE,gBAAgB,EAElB,KAAK,SAAS,EAAE,QAAS,EAAE,QAASA,EAAYglB,CAAW,CAC/D,EAEA,GAAgB,EAAY,CACxB,OAAOhlB,GAAY,QAAQ,kBAAkB,GAAK,KAAK+kB,GAAW,aAAe,KAAKA,EAC1F,CAEA,GAAe,EAAY,CACvB,IAAMz1B,EAAQ,KAAK21B,GAAgBjlB,CAAU,EAM7C,OALK1Q,GAEL,AACIA,EAAM,SAAS,IAAIoc,EAAcpc,CAAK,EAEnCA,EAAM,QALM,IAMvB,CAEA,GAAsB,EAAkB,EAAa,CACjD,IAAM41B,EAAQ,CAAC,EACTC,EAAgBC,GAAa,GAYnC,OATA,MAFqB,KAAKC,EAAiB,iBAAiB,aAAa,CAEpE,CAAC,CAAC,QAAQ,GAAU,CACrB,IAAMC,EAAkBC,EAAO,aAAa,cAAc,EAE1D,GAAI,CAACD,GAAoBH,GAAiBG,IAAoBH,EAAgB,CAC1E,IAAMK,EAAa,KAAKC,GAAYF,CAAM,EAC1CL,EAAM,KAAK,GAAGM,CAAU,CAC5B,CACJ,CAAC,EAEMN,CACX,CAEA,GAAY,EAAM,CACd,IAAMzB,EAAO,CAAC,EAqCd,OApCA,MAAM,KAAKiC,EAAK,QAAQ,CAAC,CAAC,QAAQ,GAAS,CACvC,IAAMnR,EAAUoR,EAAM,QAAQ,YAAY,EAE1C,GAAIpR,IAAY,MAAQoR,EAAM,UAAU,SAAS,WAAW,EACxDlC,EAAK,KAAK,CAAE,KAAM,WAAY,CAAC,OAInC,GAAIlP,IAAY,KAAM,CAClB,IAAIpmB,EAAO,GACLy3B,EAASD,EAAM,cAAc,eAAe,EAClD,AAGIx3B,EAHAy3B,EACOA,EAAO,YAAY,KAAK,EAExB,MAAM,KAAKD,EAAM,UAAU,CAAC,CAC9B,OAAO,GAAKhQ,EAAE,WAAa,KAAK,SAAS,CAAC,CAC1C,IAAI,GAAKA,EAAE,YAAY,KAAK,CAAC,CAAC,CAC9B,KAAK,EAAE,EAGhB,IAAMkQ,EAAQF,EAAM,cAAc,aAAa,EACzCn7B,EAAO,CACT,OAAQm7B,EAAM,IAAMx3B,EACd,OACN,UAAWw3B,EAAM,WAAa,GAC9B,SAAUA,EAAM,aAAa,UAAU,GAAKA,EAAM,aAAa,UAAU,IAAM,OAC/E,SAAU,EACd,EAEIE,IACA,EAAK,MAAQ,KAAKJ,GAAYI,CAAK,GAGvCpC,EAAK,KAAKj5B,CAAI,CAClB,CACJ,CAAC,EACMi5B,CACX,CAEA,GAAgB,EAAa,EAAc,EAAY,CACnD,IAAMqC,EAAa,KAAK,aAAa,kBAAkB,IAAM,QACzDC,EAAW,CAAC,EAEVC,EAAc,KAAKC,GAAsB,KAAMb,CAAW,EAC5DY,EAAY,OAAS,GACrBD,EAAS,KAAK,GAAGC,CAAW,EAGhC,IAAME,EAAa,KAAKC,GAAenmB,CAAU,EAC3ComB,EAAkBF,GAAY,YAAYlmB,EAAYolB,CAAW,GAAK,OACtEiB,EAAYC,IAAiBJ,GAAY,aAAalmB,EAAYolB,CAAW,GAAK,IAEpFmB,EAAc,KAClB,AAQIA,EARAH,IAAoB,QAAUA,IAAoB,QACpC,CACV,OAAQ,eACR,KAAM,eACN,UAAW,oBACX,SAAU,CAACE,CACf,EAEc,CACV,OAAQ,aACR,KAAM,aACN,UAAW,kBACX,SAAU,CAACD,CACf,EAGAP,GACAC,EAAS,KACL,CAAE,KAAM,WAAY,EACpB,CACI,OAAQ,OACR,KAAM,OACN,UAAW,eACX,SAAU,CAACO,CACf,EACAC,EACA,CAAE,KAAM,WAAY,EACpB,CAAE,OAAQ,YAAa,KAAM,YAAa,UAAW,mBAAoB,EACzE,CAAE,OAAQ,WAAY,KAAM,WAAY,UAAW,UAAW,EAC9D,CACI,OAAQ,SACR,KAAM,SACN,UAAW,SACX,MAAO,CACH,CAAE,OAAQ,eAAgB,KAAM,QAAS,UAAW,cAAe,EACnE,CAAE,OAAQ,aAAc,KAAM,MAAO,UAAW,aAAc,SAAU,EAAK,CACjF,CACJ,EACA,CACI,OAAQ,aACR,KAAM,UACN,UAAW,UACX,MAAO,CACH,CAAE,OAAQ,iBAAkB,KAAM,sBAAuB,UAAW,gBAAiB,EACrF,CAAE,OAAQ,kBAAmB,KAAM,uBAAwB,UAAW,iBAAkB,EACxF,CAAE,OAAQ,eAAgB,KAAM,mBAAoB,UAAW,cAAe,CAClF,CACJ,CACJ,EAGJ,IAAMC,EAAe,CAAC,EActB,OAbAT,EAAS,QAAS,GAAS,EACnBv7B,EAAK,OAAS,aACVg8B,EAAa,SAAW,GAAKA,EAAaA,EAAa,OAAS,EAAE,CAAC,OAAS,cAIpFA,EAAa,KAAKh8B,CAAI,CAC1B,CAAC,EAEGg8B,EAAa,OAAS,GAAKA,EAAaA,EAAa,OAAS,EAAE,CAAC,OAAS,aAC1EA,EAAa,IAAI,EAGdA,CACX,CAEA,SAAS,EAAG,EAAG,EAAY,EAAa,CACpC,IAAMC,EAAe,KAAK1B,GAAW,YAAc,KAAKA,GAEnD,KAAK/iB,KACN,KAAKA,GAAS,SAAS,cAAc,uBAAuB,EAC5DykB,EAAa,YAAY,KAAKzkB,EAAM,GAGxC,IAAMskB,EAAe,CAAC,CAACtmB,EAAW,QAAQ,OAAO,EAC3C0mB,EAAY,KAAKC,GAAgB3B,EAAasB,EAActmB,CAAU,EAE5E,KAAKgC,GAAO,OAAO0kB,EAAY,GAAM,KAAKE,GAAiB,EAAG5mB,EAAYglB,CAAW,CAAC,EAEtF,IAAM/0B,EAAc,KAAKg1B,GAAgBjlB,CAAU,EACnD,KAAK6mB,GAAgB52B,CAAW,EAEhC,KAAK+R,GAAO,OAAOzP,EAAG8T,CAAC,CAC3B,CAEA,GAAgB,EAAa,CACzB,GAAI,CAAC,KAAKrE,IAAU,CAAC/R,EAAa,OAElC,IAAM62B,EAAc72B,EAAY,WAAW,cAAc,GAAK,GAC9D,KAAK+R,GAAO,gBAAgB,YAAa,KAAM8kB,CAAW,EAE1D,IAAMC,EAAU,KAAKhC,GAAW,aAAa,cAAc,IAAM,OACjE,KAAK/iB,GAAO,gBAAgB,eAAgB,KAAM+kB,CAAO,EAEzD,IAAMC,EAAY,KAAKjC,GAAW,aAAa,gBAAgB,IAAM,OACrE,KAAK/iB,GAAO,gBAAgB,iBAAkB,KAAMglB,CAAS,CACjE,CAEA,GAAiB,EAAG,EAAY,EAAa,CACzC,IAAMC,EAAS,EAAE,OAEXpD,EAAc,IAAI,YAAY,aAAc,CAC9C,OAAQ,CAAE,SAAQ,aAAY,cAAa,cAAe,CAAE,EAC5D,QAAS,GACT,SAAU,EACd,CAAC,EACD,KAAK,cAAcA,CAAW,EAE9B,IAAMlY,EAAU,SAAS3L,EAAW,QAAQ,IAAK,EAAE,EAC7C/P,EAAc,KAAKg1B,GAAgBjlB,CAAU,EAEnD,OAAQinB,EAAR,CACI,IAAK,aACL,IAAK,eAED,KADwBd,GAAenmB,CAC9B,CAAC,EAAE,iBAAiBinB,EAAQjnB,CAAU,EAC/C,MAEJ,IAAK,OACI,MAAM2L,CAAO,GACd1b,EAAY,SAAS,qBAAqB0b,EAAS3L,CAAU,EAEjE,MAEJ,IAAK,YACD/P,GAAa,WAAW,OAAO,EAC/B,MAEJ,IAAK,eACD,KAAK80B,GAAW,aAAa,eAAgB,KAAKA,GAAW,aAAa,cAAc,IAAM,OAAS,QAAU,MAAM,EACvH,MAEJ,IAAK,iBACD,KAAKA,GAAW,aAAa,iBAAkB,KAAKA,GAAW,aAAa,gBAAgB,IAAM,OAAS,QAAU,MAAM,CAEnI,CAEA,KAAK/iB,GAAO,MAAM,CACtB,CAEA,sBAAuB,CACnB,KAAK+iB,IAAY,oBAAoB,cAAe,KAAKmC,EAAc,CAC3E,CACJ,EAEK,eAAe,IAAI,iBAAiB,GACrC,eAAe,OAAO,kBAAmBpC,EAAW,ECxQxD,IAAaqC,GAAb,cAA+B,WAAY,CACvC,GACA,GAAgB,KAEhB,aAAc,CACV,MAAM,CACV,CAEA,mBAAoB,CAEhB,KAAK,MAAM,SAAW,QACtB,KAAK,MAAM,QAAU,OACrB,KAAK,MAAM,OAAS,QAEpB,KAAK,UAAY;;;;SAKrB,CAEA,OAAO,EAAO,EAAU,CACpB,KAAKC,GAAcjR,EACnB,IAAM7b,EAAY,KAAK,cAAc,iBAAiB,EACjDA,IAEL,EAAU,UAAY,GAEtB,KAAK+sB,GAAa/sB,EAAW4qB,CAAK,EAClC,KAAKoC,GAAiB,EAC1B,CAEA,OAAO,EAAG,EAAG,EAAa,KAAM,CAG5B,GAFA,KAAK,MAAM,QAAU,QAEjBtnB,EAAY,CACZ,IAAMyB,EAAWzB,EAAW,sBAAsB,EAC5CunB,EAAa9lB,EAAS,MAE5B,0BAA4B,CACxB,IAAM+lB,EAAU,KAAK,cAAc,eAAe,EAClD,GAAI,CAACA,EAAS,OACd,IAAMra,EAAaqa,EAAQ,sBAAsB,CAAC,CAAC,MAE/CC,EAAiBF,EAAapa,EAE9Bsa,EAAiB,IACjB,EAAiBhmB,EAAS,MAG9B,IAAMkhB,EAAc6E,EAAQ,sBAAsB,CAAC,CAAC,OAChDE,EAAgBrhB,EAChBA,EAAIsc,EAAc,OAAO,cACzB,EAAgBtc,EAAIsc,GAGxB,KAAK,MAAM,KAAO,GAAG8E,EAAe,IACpC,KAAK,MAAM,IAAM,GAAGC,EAAc,GACtC,CAAC,CACL,KACI,MAAK,MAAM,KAAO,GAAGn1B,EAAE,IACvB,KAAK,MAAM,IAAM,GAAG8T,EAAE,IAEtB,0BAA4B,CACxB,IAAMmhB,EAAU,KAAK,cAAc,eAAe,EAClD,GAAI,CAACA,EAAS,OACd,IAAMtnB,EAAOsnB,EAAQ,sBAAsB,EAEvCj1B,EAAI2N,EAAK,MAAQ,OAAO,aACxB,KAAK,MAAM,KAAO,GAAG3N,EAAI2N,EAAK,MAAM,KAEpCmG,EAAInG,EAAK,OAAS,OAAO,cACzB,KAAK,MAAM,IAAM,GAAGmG,EAAInG,EAAK,OAAO,IAE5C,CAAC,EAGD,KAAKyM,IACL,OAAO,oBAAoB,cAAe,KAAKA,EAAa,EAGhE,KAAKA,GAAiB,GAAM,CAEpB,EADS,EAAE,aAAe,EAAE,aAAa,EAAI,CAAC,EAAA,CACxC,SAAS,IAAI,GAAK,CAAC,KAAK,SAAS,EAAE,MAAM,GAC/C,KAAK,MAAM,CAEnB,EAEA,eAAiB,CACb,OAAO,iBAAiB,cAAe,KAAKA,EAAa,CAC7D,EAAG,CAAC,CACR,CAEA,OAAQ,CACJ,KAAK,MAAM,QAAU,OACrB,AAEI,KAAKA,MADL,OAAO,oBAAoB,cAAe,KAAKA,EAAa,EACvC,KAE7B,CAEA,gBAAgB,EAAQ,EAAW,EAAW,CAC1C,IAAMgb,EAAK,KAAK,cAAc,eAAeV,EAAO,GAAG,EACnDU,IACAC,EAAYD,EAAG,UAAU,IAAIxN,CAAS,EAAIwN,EAAG,UAAU,OAAOxN,CAAS,EAE/E,CAEA,GAAa,EAAU,EAAO,CAC1B+K,EAAM,QAAQ,GAAQ,CAClB,GAAI16B,EAAK,OAAS,YAAa,CAC3B,IAAMq9B,EAAM,SAAS,cAAc,IAAI,EACvC,EAAI,UAAY,oBAChBC,EAAS,YAAYD,CAAG,EACxB,MACJ,CAEA,IAAMF,EAAK,SAAS,cAAc,IAAI,EACtCA,EAAG,aAAa,UAAWn9B,EAAK,MAAM,EACtC,EAAG,UAAY,GAAGA,EAAK,WAAa,GAAG,GAAGA,EAAK,MAAQ,UAAY,GAAG,GAAGA,EAAK,SAAW,WAAa,KAAK,KAAK,EAEhH,IAAMo3B,EAAO,SAAS,cAAc,MAAM,EAI1C,GAHA,EAAK,YAAcp3B,EAAK,KACxBm9B,EAAG,YAAY/F,CAAI,EAEfp3B,EAAK,OAASA,EAAK,MAAM,OAAS,EAAG,CACrC,IAAMq7B,EAAQ,SAAS,cAAc,IAAI,EACzC,EAAM,UAAY,kBAClB,KAAKwB,GAAaxB,EAAOr7B,EAAK,KAAK,EACnCm9B,EAAG,YAAY9B,CAAK,CACxB,CAEAiC,EAAS,YAAYH,CAAE,CAC3B,CAAC,CACL,CAEA,IAAmB,CACf,KAAK,iBAAiB,aAAa,CAAC,CAAC,QAAQ,GAAM,CAC/CA,EAAG,iBAAiB,QAAU,GAAM,CAEhC,GADA10B,EAAE,gBAAgB,EACd00B,EAAG,UAAU,SAAS,UAAU,EAAG,OAEvC,IAAMV,EAASU,EAAG,aAAa,SAAS,EACxC,KAAKP,KAAc,CAAE,SAAQ,OAAQO,CAAG,CAAC,EACzC,KAAK,MAAM,CACf,CAAC,CACL,CAAC,CACL,CAEA,sBAAuB,CACnB,KAAK,MAAM,CACf,CACJ,EAEK,eAAe,IAAI,uBAAuB,GAC3C,eAAe,OAAO,wBAAyBR,EAAS,E"}
1
+ {"version":3,"file":"nine-table.umd.js","names":["traceOrigin","GROUP_IDX","GROUP_IDX","factory","global","exports","start","end","mid","target","elementDebounceState","el","state","pointerEvent","pointerFn","debounceTime","dblClickEvent","dblClickFn","_text","stripHtml","tmp","html","canvas","context","_font","w","h","v","cleanText","metrics","ascent","descent","trace","_ninebone_util","NINE_TABLE","ngRow","#parent","parent","#newrow","ngData","#host","host","#initialize","item","validRecords","#getValidRecords","at","targetRecord","colnm","idx","rowData","rowIndex","colIndex","value","#conv","fields","#defaultHeight","templateElements","#getDefaultMeta","$el","loadData","dataSource","#invalidate","#nextId","rowid","jsonArray","arr","o","json","record","#json2Array","processedArr","#defaultInsert","row","updateState","targetIndex","#getIndexFromRow","arrIndex","records","b","a","targetId","index","COL_IDX","rowState","isSingle","targetArr","result","i","ngDataManager","ds","rowIdx","nRow","rowidx","#init","#fields","f","found","fieldName","fName","#adjust","map","name","type","rawTables","tbl","fieldType","attr","expr","lastIndex","targetField","NineTableSheets","NineTableSheetsFooter","#render","isMultiSelect","tabItem","#switchSheet","updateSplitters","sheets","s","activeSheets","sheet","currentIdx","targetSplitter","tabBar","body","tabItems","sheetElements","tab","isActive","clickedTab","activeTabs","targetSheet","tabsHtml","table","SheetTabItem","Toolbar","#bindEvents","#customContainer","#syncStateFromHost","isSimple","showToolbar","showMenu","caption","titleEl","link","currentCaption","menuBtn","element","text","NineTableHScrollBar","#owner","initWhenReady","#elements","#observeResize","#resizeObserver","#dragging","track","thumb","bodyWidth","tableWidth","needsHScroll","trackWidth","thumbWidth","currentLeft","maxScrollLeft","l","maxThumbLeft","trackBound","targetX","x","delayScroll","#interval1","#interval2","thumbLeft","#thumbMoveTo","pos","currentThumbLeft","clearTimer","evt","e","trackRect","onMouseMove","moveEvent","onMouseUp","NineTableVScrollBar","#sheet","viewRecords","totalCount","scrollHolder","rawContentHeight","MAX_BROWSER_HEIGHT","useScaling","scaleFactor","contentHeight","#getScaleInfo","fixedHeight","bodyHeight","viewHeight","needsVScroll","trackHeight","thumbHeight","currentScrollTop","maxScrollTop","thumbTop","maxThumbTop","#startY","#startThumbTop","deltaY","targetThumbTop","ratio","rowHeight","visibleRowCount","targetRow","clickY","scrollInterval","startContinuousScroll","scrollStep","$firstTr","direction","currentRow","stopContinuousScroll","GROUP_IDX$1","GroupingManager","#groupColumns","#groupMap","groupColumns","sourceTable","$cell","$tr","#isApplying","groupId","rowIds","dataManager","Grouping","validRaw","rawRecords","groupMap","nestedTree","#buildNestedMap","flatResult","renderItems","#flattenTree","counter","isLastLevel","depth","groupKey","subMapOrRecords","mapOrArray","parentId","#collectLeafRowIds","groupRecord","resultArr","#collectLeafRecords","remainingCols","key","subRecords","subVal","r","RowManager","#initResizeObserver","bodyViewport","#measureAndCacheHeight","#renderAllContainers","#handleScroll","force","#isGrouped","#handleGroupedScroll","scrollTop","rawTotalVirtualHeight","totalVirtualHeight","actualScrollTop","maxStartIndex","clampedScrollTop","startIndex","firstTr","#element","currentStartIndex","$tbody","dataIndex","#bindRowData","allRenderItems","totalVirtualCount","bodyContent","templateLength","getItemHeight","dataRowsHeight","groupHeightsTotal","itemHeights","viewportClientHeight","accumulatedHeight","offsetY","visibleRowsCount","dynamicBuffer","targetStart","targetEnd","renderedItems","container","selector","trs","itemIndex","chunkTrs","virtualIndex","isTrGroup","tr","subIdx","#bindGroupRowData","subRowIndex","matrixRow","indices","allRecords","childrenRecords","customComp","#containerTemplates","tableEl","tbody","templateTrs","#sheetHeight","#isProgrammaticScroll","dataRow","targetScrollTop","rawTargetScrollTop","onRendered","#updateRowCount","visibleRows","#BUFFER_ROW_COUNT","groupDepth","#cachedRowCount","#renderRows","#syncRowHeights","targetFixedType","clonedTr","targetTbody","fragment","tmpl","leftTable","bodyTable","rightTable","leftRows","bodyRows","rightRows","maxRows","heights","maxHeight","entry","entries","height","TableCompiler","$table","$srcTable","#syncColAttributes","$col","fixed","cols","grid","rowSpan","colSpan","c","CellSelection","#initEvents","sameGroupTrs","t","$td","col","r1","startRow","endRow","r2","c1","startCol","endCol","c2","containers","expanded","loopCount","#getMatrixRow","cell","cellEndRow","cellEndCol","nsR","neR","nsC","neC","sanitize","val","#range","mainZone","lastMatrixRow","lastCol","targetCell","allCells","rect","targetTr","CellNavigation","#currentCell","#currentTr","#isCellLeftVisible","#isCellRightVisible","isVisible","#isCellBelowVisible","#isCellAboveVisible","scrollTopIndex","#getVisibleRowCount","currentCell","#findCell","nextCell","#getPreviousCell","#getNextCell","#getUpCell","#getDownCell","#moveCellH","#moveCellV","nextCol","cellCol","cellRect","viewportRect","theadHeight","bodyViewport2","viewportHeight","RESIZE_OFFSET","ColResizer","#panel","#tooltip","#onPointerMove","#onPointerDown","#onDblClick","containerType","firstColgroup","totalWidth","colWidths","colIdx","tables","targetCols","globalColIndex","firstContainer","resolvedContainerType","width","sourceCol","headerPart","offsetX","isLeftEdge","isRightEdge","prevCell","#targetCell","#targetContainerType","#getContainerType","baseColIndex","#targetColIndex","#checkIsAutoFit","#nextColIndex","nextColEl","#nextColStartWidth","targetRect","sheetRect","#startCellWidth","#startLeft","attrW","#startColWidth","#startX","#updatePositions","#onDragMove","#onDragEnd","diff","clientX","isAutoFit","maxDiff","minDiff","currentColWidth","realCellWidth","maxCellWidth","currentCellWidth","sizeBadge","finalWidth","newColWidth","newNextWidth","tbodyCell","extraPadding","fieldIdx","font","headerText","maxTextWidth","size","calculatedWidth","ColResizerPanel","#renderer","ColMover","#grip","#indi","root","y","nested","headerCells","hasStrictChildren","isValidGroup","parentGroupRange","subCell","subStart","subSpan","subEnd","isRealGroup","groupRange","#getColGroupRange","origTable","minLeft","maxRight","minTop","maxBottom","targetCells","cCol","cEnd","isGroup","computedStyle","groupWidth","groupHeight","headerContent","clonedCell","style","#checkIsMovable","startX","startY","cancelTimer","#timer","onPointerMovePending","#startDrag","#isDragging","preview","#createGroupHeaderPreview","#sourceCell","#sourceColIndex","#shiftX","bounds","relativeTop","fullHeight","#updateGripPosition","#onPointerUp","#getDeepElementFromPoint","targetColIndex","colMinLeft","colMaxRight","cRect","midX","calculatedTargetCol","indicatorLeft","sourceGroup","movingSpan","sourceRowStart","sourceRowEnd","targetRowStart","targetRowEnd","isRowSpanCompatible","isOutOfBoundsOfParent","pStart","pEnd","isDroppingInsideOtherGroup","spannedCells","sCell","sRowStart","sRowEnd","sStart","sEnd","moveEndCol","isSelfGroup","left","colgroup","targetCol","toColIndex","spanCount","isInRange","fromColIndex","targetViewportCol","fixedType","group","cells","targetRowCell","ColFixManager","baseCol","fixedAttr","targetBoundaryCol","theadTrs","cellBoundaryFound","cEndCol","action","fixType","cIdx","minBaseCol","maxEndCol","rSpan","rIdx","isBroken","isColFixed","NineTableFilterPanel","#closeHandler","#nineTable","#view","#onInput","#onSelectAll","#onOk","#button","filterBtn","panelWidth","top","searchBox","#loadVirtualFilterItems","path","filteredRecords","activeFilters","exprEngine","bindKey","colInfo","exprKey","filterKey","activeSelectedVals","uniqueMap","rawVal","displayVal","uniqueList","valA","valB","numA","numB","selectAllChk","filterRecords","checkedRecords","chk","filterParams","selectedVals","btn","query","data2Idx","matchedValues","isChecked","chkIdx","NineTableFilterButton","#onClick","#columns","seen","uniqueKey","isFiltered","panel","Filtering","#filters","#initFilterPanel","#filterPanel","#isFiltering","#applyFiltering","jsonFilter","oFilter","k","sheetIndex","filterRules","targetKey","allowedValues","isExpr","isPass","recordIdx","allowedSet","Sorting","#handleSort","colName","exprVal","isAsc","isDesc","existingColIndex","m","ruleData","#applySorting","#syncHeaderUI","colRule","asc","SheetView","#cachedVisibleRecords","#viewIndexes","visibleRecords","#convSingle","filterSlot","#sortingColumns","groupResult","columns","rulesWithIdx","rule","idxA","idxB","isEmptyA","isEmptyB","strA","strB","PreCompiler","#ensureColgroup","#ensureThead","#ensureSectionTbodys","#ensureRowIndicator","#normalizeColAttributes","#createColIndicator","#normalizeCollapsibleAttributes","#generateCell","#initColExpanders","#initFilterButtons","#applyInitialCellWidths","thead","firstRow","cnt","td","#numToExcelCol","background","num","headTbody","footTbody","colCount","sum","containerWidth","defaultWidth","widthVal","targetAttributes","autoIdCounter","$tbl","tagName","$datalist","$option","uniqueFuncName","cellType","originalContent","hostFilter","tableFilter","finalFiltering","currentWidth","expandBtn","targetWidth","rows","section","indicatorCell","startColIdx","targetIdx","SheetAPI","colEl","resolve","$trs","matrixRows","n","callback","$sheetBody","tfootHeight","viewportTop","viewportBottom","trRect","isAbove","isBelow","toRowid","NineTableSheet","#rowManager","#api","#bindApiMethods","#template","#index","#colResizer","#filtering","#grouping","#colMover","#colFix","#cellSelection","#cellNavigation","#source","attrTrue","sourceTableTrue","#isSimple","#renderSplitContainers","#updateContainerWidths","#adjustOverlay","$thead","$overlay","#autoFit","enable","totalOriginalWidth","colList","collapsedTotalWidth","availableWidth","allocatedTotal","calculatedCols","exactWidth","baseWidth","remainderPixels","uncollapsedCols","activeParent","$parent","minRows","#syncHeaderAndFooterHeights","#initRowHoverEvent","prefix","firstTable","#createSplitTable","offsetHeight","sheetBottom","tbodyBottom","bodyContainer","scrollLeft","#sorting","leftHeaderRows","bodyHeaderRows","rightHeaderRows","#applyMaxHeights","leftFooterRows","bodyFooterRows","rightFooterRows","activeRowIndex","relatedTarget","api","args","LayoutManager","owner","#initEvent","sheetCount","sheetsHtml","className","sheetId","cssImports","$sheet","#isAutoHeight","#applyAutoHeight","lastHeight","currentHeight","basicHeight","ExprEngine","match","trimmedExpr","compiledExpr","evalFn","#exprCache","rowItem","DataAPI","providerObj","methods","fn","NineTableAPI","ns","#getActiveSheet","targetMethod","prop","NineTable","#shadowRoot","#dataManager","#dataApi","#sheetApi","#templateCnt","#bindDynamicSetters","#layoutManager","#dispatchLoad","checkCount","checkTimer","loadSheetCnt","idOrIndex","extractedMethodNames","matches","internalValue","methodName","newValue","BasicCellElement","exprCache","CellElement","#updateRowState","#cell","#tr","#attr","button","curRow","renderer","rawRecord","defaultValue","\"display\"","data","cleanExpr","childRecords","funcName","field","acc","EditableCellElement","CellInputText","#target","#maxbyte","maxByteNum","event","CellInputNumber","#onKeyDown","#validate","#max","#min","#scale","str","selectionStart","scale","validKey","isNumKey","CellInputColor","#btn","#dataSource","datalistId","datalist","option","#rendererColor","#isValidColor","g","CellInputDate","#type","formattedVal","d","isValid","#isValidDate","year","month","day","isleap","hour","min","week","CellCheckbox","#label","#trueText","#falseText","#isRadio","trueValue","childHtml","displayText","#enable","#readonly","#visible","CellRadio","#rendererRadio","matchIndex","#radioList","codeVal","#keyName","nameVal","#valueName","label","input","span","CellComboPanel","#grd","grd","itemsAttr","fieldKeys","valueName","activeColumnCount","formattedData","keyName","multi","selectedKeys","#separator","kIndex","chkIndex","#selectRow","currentValue","$btn","btnRect","isDropDown","#isOpen","separator","#isPanelBelow","#calculatePanelHeight","#calculatePanelLeft","#initData","#checkRow","#returnRow","#onKeydown_input","#onKeydown","CellCombo","#targetBtn","#getDisplayText","#validateInput","#multi","keys","#multiSeparator","list","#togglePanel","CellRenderer","CellButton","#cellButtonClick","customEvent","rawValue","CellRowIndicator","#mainTarget","#subTarget","#statusTarget","displayNum","formattedNum","splitIndex","prefixPart","suffixPart","isSorted","isFitered","ColExpand","singleWidth","currentW","splitWidth","ContextMenu","#tableHost","targetTable","#getTargetSheet","items","activeTableId","activeTable","containerElement","targetTableAttr","rootUl","parsedList","#traverseUl","ulEl","child","spanEl","subUl","useDefault","rawItems","customItems","#parseCustomMenuItems","fixManager","#getFixManager","currentFixState","isFixable","isHeaderCell","fixMenuItem","cleanedItems","targetParent","menuItems","#buildMenuItems","#handleMenuClick","#syncMenuStates","isFiltering","autoFit","showTitle","menuId","#onContextMenu","MenuPanel","#onCallback","#appendItems","#bindClickEvents","cellRightX","wrapper","calculatedLeft","panelHeight","calculatedTop","li","condition","sep","parentUl"],"sources":["../src/core/protype.js","../src/external/NoPeer.js","../src/core/constants.js","../src/data/ngData.js","../src/data/ngDataManager.js","../src/data/Fields.js","../src/layout/nine-table-sheets.js","../src/layout/nine-table-sheets-footer.js","../src/layout/nine-table-toolbar.js","../src/layout/nine-table-hscrollbar.js","../src/layout/nine-table-vscrollbar.js","../src/data/Grouping.js","../src/layout/core/RowManager.js","../src/layout/core/TableCompiler.js","../src/cell-manager/CellSelection.js","../src/cell-manager/CellNavigation.js","../src/col/ColResizer.js","../src/col/ColMover.js","../src/col/ColFixManager.js","../src/data/Filtering.js","../src/data/Sorting.js","../src/data/SheetView.js","../src/layout/core/PreCompiler.js","../src/api/SheetAPI.js","../src/layout/nine-table-sheet.js","../src/layout/core/LayoutManager.js","../src/core/ExprEngine.js","../src/api/DataAPI.js","../src/api/NineTableAPI.js","../src/core/nine-table.js","../src/cell/core/BasicCellElement.js","../src/cell/core/CellElement.js","../src/cell/cell-input-text.js","../src/cell/cell-input-number.js","../src/cell/cell-input-color.js","../src/cell/cell-input-date.js","../src/cell/cell-checkbox.js","../src/cell/cell-radio.js","../src/cell/cell-combo-panel.js","../src/cell/cell-combo.js","../src/cell/cell-renderer.js","../src/cell/cell-button.js","../src/cell/cell-row-indicator.js","../src/col/col-expand.js","../src/menu/nine-table-menu.js","../src/menu/nine-table-menu-panel.js"],"sourcesContent":["Array.prototype.nineBinarySearch = function(target) {\n //this.sort((a, b) => { return a > b ? 1 : -1; });\n\n let start = 0;\n let end = this.length - 1;\n let mid;\n\n while (start <= end) {\n mid = parseInt((start + end) / 2);\n\n if (target === this[mid]) {\n return mid;\n } else {\n if (target < this[mid]) {\n end = mid - 1;\n } else {\n start = mid + 1;\n }\n }\n }\n\n return -1;\n};\n\nconst elementDebounceState = new WeakMap();\n\nHTMLElement.prototype.addDebounseEventListener = function(\n dblClickEvent,\n dblClickFn,\n pointerEvent,\n pointerFn,\n debounceTime = 500\n) {\n const el = this;\n\n if (!elementDebounceState.has(el)) {\n elementDebounceState.set(el, { timer: null, cancelFn: null });\n }\n const state = elementDebounceState.get(el);\n\n el.addEventListener(pointerEvent, (e) => {\n e.actualTarget = e.target;\n\n if (state.timer) {\n clearTimeout(state.timer);\n state.timer = null;\n }\n\n // ๐Ÿ’ก 500ms ๋™์•ˆ ๋Œ€๊ธฐํ•œ ๋’ค์—์•ผ ์‹ค์ œ pointerFn์ด ์‹คํ–‰๋จ\n state.timer = setTimeout(() => {\n state.timer = null;\n state.cancelFn = pointerFn.call(el, e);\n }, debounceTime);\n });\n\n el.addEventListener(dblClickEvent, (e) => {\n if (state.timer) {\n clearTimeout(state.timer);\n state.timer = null;\n }\n\n if (state.cancelFn) {\n state.cancelFn();\n state.cancelFn = null;\n }\n\n dblClickFn.call(el, e);\n });\n};\n\n\nnine.measureTextSize = (_text, _font = '12px sans-serif') => {\n if (typeof _text === 'number') _text = _text + \"\";\n if (!_text) return { width: null, height: null };\n\n const stripHtml = (html) => {\n const tmp = document.createElement(\"DIV\");\n tmp.innerHTML = html;\n return tmp.textContent || tmp.innerText || \"\";\n };\n\n _text = _text.replaceAll(\"\\n\", \"<br>\");\n\n let canvas = document.body.querySelector('canvas#_nine_measure_canvas_');\n if (!canvas) {\n canvas = document.createElement('canvas');\n canvas.id = '_nine_measure_canvas_';\n canvas.style.cssText = 'position: absolute; visibility: hidden; pointer-events: none; left: -9999px;';\n document.body.appendChild(canvas);\n }\n\n const context = canvas.getContext('2d');\n context.font = _font;\n\n let w = 0;\n let h = 0;\n\n for (let v of _text.split(\"<br>\")) {\n const cleanText = stripHtml(v);\n const metrics = context.measureText(cleanText);\n\n w = Math.max(w, metrics.width);\n\n const ascent = metrics.fontBoundingBoxAscent || 10;\n const descent = metrics.fontBoundingBoxDescent || 3;\n h += ascent + descent;\n }\n\n return {\n width: w,\n height: h\n };\n};","import { trace as traceOrigin } from '@ninebone/util';\n\nexport class Trace extends traceOrigin.constructor {\n constructor() {\n super();\n this.init(\"nine-table\", \"green\");\n }\n}\n\nexport const trace = new Trace();\n","export const NINE_TABLE = {\n META: {\n INDEX: {\n ROWID: 0,\n ROW_STATE: 1,\n FILTER: 2,\n GROUP: 3,\n // SELECT: 2,\n // EXPAND: 3\n }\n },\n ROW_STATE: {\n EMPTY: 0,\n NORMAL: 1,\n INSERT: 2,\n UPDATE: 3,\n DELETE: 9\n },\n EVENT: {\n LOAD: \"load\",\n ROW_ADDED: \"row-added\",\n ROW_REMOVED: \"row-removed\",\n CELL_BUTTON_CLICK: \"cell-button-click\",\n },\n};","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class ngRow {\n\t#parent;\n\t#newrow = -1;\n\n\tconstructor(parent) {\n\t\tthis.#parent = parent;\n\t}\n\n\tget at() {\n\t\treturn this.#newrow;\n\t}\n\tset at(v) {\n\t\tthis.#newrow = parseInt(v, 10);\n\t}\n\n\tcount = () => this.#parent.rawRecords.length;\n}\n\nexport class ngData {\n\t#host;\n\t#parent;\n\t#nextId = 0;\n\t#defaultHeight = [];\n\n\tstatic META_INDEX = {\n\t\tFILTER: 0,\n\t\t// GROUP: 1,\n\t\t// SELECT: 2,\n\t\t// EXPAND: 3\n\t};\n\n\tstatic ROW_STATE = {\n\t\tEMPTY: 'EMPTY',\n\t\tNORMAL: 'NORMAL',\n\t\tINSERT: 'INSERT',\n\t\tUPDATE: 'UPDATE',\n\t\tDELETE: 'DELETE'\n\t};\n\n\tconstructor(host, parent) {\n\t\tthis.#host = host;\n\t\tthis.#parent = parent;\n\t\tthis.#initialize();\n\t}\n\n\n\t#getValidRecords = () => {\n\t\tconst rawRecords = this.#parent.rawRecords || [];\n\t\treturn rawRecords.filter(item => item.m._[NINE_TABLE.META.INDEX.ROW_STATE] !== NINE_TABLE.ROW_STATE.DELETE);\n\t};\n\n\tget count() {\n\t\treturn this.length;\n\t}\n\n\tcount = () => {\n\t\treturn this.length;\n\t};\n\n\tgetArray = (at, colnm) => {\n\t\tconst validRecords = this.#getValidRecords();\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn validRecords; // ๋ณ€ํ™˜ ์—†์ด ๋ฐฐ์—ด ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ (๋ Œ๋”๋ง ์ตœ์ ํ™”)\n\t\t}\n\n\t\tif (at < 0 || at >= validRecords.length) return null;\n\n\t\tconst targetRecord = validRecords[at];\n\n\t\tif (colnm != null) {\n\t\t\tconst fields = this.getHostFields();\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn targetRecord;\n\t};\n\n\tsetArray = (rowIndex, colIndex, value) => {\n\t\tconst validRecords = this.#getValidRecords();\n\t\tconst rowData = validRecords[rowIndex];\n\n\t\tconst oldValue = rowData.v[colIndex];\n\t\tif (oldValue !== value && rowData.__ng.rowState !== ngData.ROW_STATE.INSERT) {\n\t\t\trowData.__ng.rowState = ngData.ROW_STATE.UPDATE;\n\t\t}\n\n\t\trowData.v[colIndex] = value;\n\t};\n\n\n\tget = (at, colnm) => {\n\t\tconst validRecords = this.#getValidRecords();\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn this.#conv(validRecords);\n\t\t}\n\n\t\tif (at < 0 || at >= validRecords.length) return null;\n\n\t\tconst targetRecord = validRecords[at];\n\t\tconst fields = this.getHostFields();\n\n\t\tif (colnm != null) {\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn this.#conv(targetRecord);\n\t};\n\n\tgetAll = () => {\n\t\treturn this.#parent.rawRecords || [];\n\t};\n\n\tgetHostFields = () => {\n\t\treturn typeof this.#host.fields?.get === 'function' ? this.#host.fields.get() : [];\n\t};\n\n\t#initialize = () => {\n\t\tthis.#defaultHeight = [];\n\t\tconst templateElements = this.#host.template || [];\n\t\tArray.from(templateElements).forEach(el => {\n\t\t\tthis.#defaultHeight.push(el.getBoundingClientRect?.().height || 24);\n\t\t});\n\n\t\t(this.#parent.rawRecords || []).forEach(v => {\n\t\t\tif (!v.__ng) v.__ng = this.#getDefaultMeta();\n\t\t\tv.__ng.height = this.#defaultHeight.slice();\n\t\t});\n\t};\n\n\tget source() {\n\t\treturn this.#conv(this.#parent.rawRecords);\n\t}\n\tset source(v) {\n\t\tthis.set(v);\n\t}\n\n\t#invalidate = () => {\n\t\tthis.#host.shadowRoot.querySelectorAll(\"nine-table-sheet\").forEach($el => {\n\t\t\t$el.invalidate();\n\t\t});\n\n\t\tthis.#host.shadowRoot.querySelector(\"nine-table-sheets-footer\")?.refresh();\n\t};\n\n\tset = (dataSource) => {\n\n\t\tconst loadData = () => {\n\t\t\tthis.#host.loading = true;\n\t\t\tsetTimeout(() => {\n\t\t\t\ttry {\n\t\t\t\t\tthis.clear();\n\t\t\t\t\tthis.add(dataSource, false);\n\t\t\t\t\tthis.#invalidate();\n\t\t\t\t} finally {\n\t\t\t\t\tthis.#host.loading = false;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (this.#host.loaded) {\n\t\t\tloadData();\n\t\t}\n\t\telse {\n\t\t\tthis.#host.addEventListener(NINE_TABLE.EVENT.LOAD, e => {\n\t\t\t\tloadData();\n\t\t\t}, { once: true });\n\t\t}\n\t};\n\n\tget nextId() {\n\t\treturn this.#nextId++;\n\t}\n\n\tget length() {\n\t\treturn this.#getValidRecords().length;\n\t}\n\n\tget count() {\n\t\treturn this.length;\n\t}\n\n\tgetRowCount() {\n\t\treturn this.length;\n\t}\n\n\t#getDefaultMeta = (rowid = 0) => {\n\t\treturn {\n\t\t\trowState: ngData.ROW_STATE.EMPTY,\n\t\t\tdeleted: false,\n\t\t\tfiltered: false,\n\t\t\theight: this.#defaultHeight.slice(),\n\t\t\to: {},\n\t\t\tc: {},\n\t\t\t__: [0, 0, 0, 0, ngData.ROW_STATE.EMPTY, false, false, true, false, true, true, false, this.#defaultHeight.slice(), -1, {}, {}],\n\t\t\t_: [rowid, NINE_TABLE.ROW_STATE.EMPTY, [], []],\n\t\t};\n\t};\n\n\treset = () => {\n\t\tthis.#parent.rawRecords = [];\n\t\tthis.#invalidate();\n\t};\n\n\tclear = () => {\n\t\tthis.#parent.rawRecords = [];\n\t\tif (this.#parent.viewRecords?.reset) {\n\t\t\tthis.#parent.viewRecords.reset();\n\t\t}\n\n\t\tthis.#nextId = 0;\n\n\t\tthis.#invalidate();\n\t};\n\n\t#json2Array = (jsonArray) => {\n\t\tif (!Array.isArray(jsonArray)) jsonArray = [jsonArray];\n\n\t\tconst fields = this.getHostFields().length > 0 ? this.getHostFields() : Object.keys(jsonArray[0] || {});\n\t\tconst arr = [];\n\n\t\tjsonArray.forEach(json => {\n\t\t\tconst o = { v: [] };\n\t\t\tfields.forEach(colnm => {\n\t\t\t\to.v.push(json[colnm] !== undefined && json[colnm] !== null ? json[colnm] : \"\");\n\t\t\t});\n\t\t\tarr.push(o);\n\t\t});\n\n\t\treturn arr;\n\t};\n\n\t#defaultInsert = (arr) => {\n\t\tif (!Array.isArray(arr)) arr = [arr];\n\t\tarr.forEach(o => {\n\t\t\tconst rowid = this.nextId;\n\n\t\t\to.m = this.#getDefaultMeta(rowid);\n\t\t\to.__ng = o.m;\n\t\t\to.__ng.rowid = rowid;\n\t\t\t//o.__ng.rowState = ngData.ROW_STATE.INSERT;\n\n\t\t\to.m._[NINE_TABLE.META.INDEX.ROWID] = rowid;\n\t\t\to.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.EMPTY;\n\t\t});\n\t\treturn arr;\n\t};\n\n\t#getIndexFromRow = (rowid) => {\n\t\tconst index = this.#parent.rawRecords.findIndex(record => {\n\t\t\tif (!record || !record.m || !record.m._) return false;\n\t\t\treturn record.m._[NINE_TABLE.META.INDEX.ROWID] === rowid;\n\t\t});\n\n\t\treturn index;\n\t}\n\n\tadd = (dataSource, updateState = true) => {\n\t\tif (dataSource === undefined) dataSource = {};\n\t\tconst arr = this.#json2Array(dataSource);\n\n\t\tconst processedArr = this.#defaultInsert(arr);\n\n\t\tthis.#parent.rawRecords = this.#parent.rawRecords.concat(processedArr);\n\n\t\tconst row = this.count() - 1;\n\t\tif (updateState) {\n\t\t\tarr.forEach((_, idx) => {\n\t\t\t\tconst target = this.#parent.rawRecords[this.#parent.rawRecords.length - 1 - idx];\n\t\t\t\tif (target) target.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.INSERT;\n\t\t\t});\n\t\t}\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_ADDED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: processedArr.length > 0 ? processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID] : null }\n\t\t}));\n\n\t\treturn row;\n\t};\n\n\n\tinsert = (rowid, dataSource, updateState = true) => {\n\t\t//trace.log(\"์ฐพ์„ rowid:\", rowid);\n\n\t\tif (dataSource === undefined) dataSource = {};\n\t\tconst arr = this.#json2Array(dataSource);\n\t\tif (arr.length === 0) return -1;\n\n\t\tlet targetIndex = this.#getIndexFromRow(rowid);\n\t\t/**\n\t\tif (rowid !== undefined && rowid !== null) {\n\t\t\ttargetIndex = this.#parent.rawRecords.findIndex(record => {\n\t\t\t\tif (!record || !record.m || !record.m._) return false;\n\t\t\t\treturn record.m._[NINE_TABLE.META.INDEX.ROWID] === rowid;\n\t\t\t});\n\t\t} */\n\n\t\tconst processedArr = this.#defaultInsert(arr);\n\n\t\t//if (targetIndex === -1) {\n\t\t//\ttargetIndex = this.#parent.rawRecords.length;\n\t\t//}\n\n\t\tthis.#parent.rawRecords.splice(targetIndex, 0, ...processedArr);\n\n\t\tif (updateState) {\n\t\t\tprocessedArr.forEach((_, idx) => {\n\t\t\t\tconst target = this.#parent.rawRecords[targetIndex + idx];\n\n\t\t\t\tif (target && target.m && target.m._) {\n\t\t\t\t\ttarget.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.INSERT;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_ADDED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: processedArr.length > 0 ? processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID] : null }\n\t\t}));\n\n\t\treturn processedArr[0].m._[NINE_TABLE.META.INDEX.ROWID]; // ์‚ฝ์ž…๋œ ์‹ค์ œ ๋ฐฐ์—ด ์ธ๋ฑ์Šค ๋ฐ˜ํ™˜\n\t};\n\n\tremove = (v) => {\n\t\tlet arr = [];\n\t\tif (Array.isArray(v)) {\n\t\t\tarr = at;\n\t\t//} else if (typeof at === \"undefined\") {\n\t\t//\tarr = [this.#parent.host.row.at];\n\t\t} else {\n\t\t\tarr = [parseInt(v, 10)];\n\t\t}\n\n\t\tlet arrIndex = [];\n\t\tarr.forEach(rowid => {\n\t\t\tarrIndex.push(this.#getIndexFromRow(rowid));\n\t\t});\n\n\t\tconst records = this.#parent.rawRecords;//this.#getValidRecords();\n\n\t\tarrIndex.sort((a, b) => b - a).forEach(index => {\n\t\t\t//if (validRecords[index]) {\n\t\t\t\tconst targetId = records[index].m._[NINE_TABLE.META.INDEX.ROWID];\n\n\t\t\t\tif (records[index].m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.INSERT) {\n\t\t\t\t\tthis.#parent.rawRecords = this.#parent.rawRecords.filter(item => item.m._[NINE_TABLE.META.INDEX.ROWID] !== targetId);\n\t\t\t\t} else {\n\t\t\t\t\tthis.#parent.rawRecords.forEach(item => {\n\t\t\t\t\t\tif (item.m._[NINE_TABLE.META.INDEX.ROWID] === targetId) {\n\t\t\t\t\t\t\titem.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.DELETE;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t//}\n\t\t});\n\n\t\tthis.#invalidate();\n\n\t\tthis.#host.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.ROW_REMOVED, {\n\t\t\tbubbles: true,\n\t\t\tdetail: { target: this.#host, rowid: arr.length > 0 ? arr[0] : null }\n\t\t}));\n\t};\n\n\tsetValue = (rowid, colnm, value, updateState = true) => {\n\n\t\trowid = parseInt(rowid, 10);\n\t\tconst fields = this.getHostFields();\n\t\tconst COL_IDX = fields.indexOf(colnm);\n\t\tif (COL_IDX < 0) return;\n\n\t\tconst index = this.#getIndexFromRow(rowid);\n\n\t\tconst records = this.#parent.rawRecords;\n\t\tconst rowData = records[index];\n\t\tif (!rowData) return;\n\n\t\tconst oldValue = rowData.v[COL_IDX];\n\t\tif (oldValue !== value && updateState && rowData.m._[NINE_TABLE.META.INDEX.ROW_STATE] !== NINE_TABLE.ROW_STATE.INSERT) {\n\t\t\trowData.m._[NINE_TABLE.META.INDEX.ROW_STATE] = NINE_TABLE.ROW_STATE.UPDATE;\n\t\t}\n\n\t\trowData.v[COL_IDX] = value;\n\t};\n\n\tgetChangedData = (rowState) => {\n\n\t\tconst records = this.#parent.rawRecords;\n\n\t\tif (rowState) {\n\t\t\treturn this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === rowState; } ) );\n\t\t}\n\t\telse {\n\t\t\treturn {\n\t\t\t\tC: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.INSERT; } ) ),\n\t\t\t\tU: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.UPDATE; } ) ),\n\t\t\t\tD: this.#conv( records.filter(item => { return item.m._[NINE_TABLE.META.INDEX.ROW_STATE] === NINE_TABLE.ROW_STATE.DELETE; } ) ),\n\t\t\t};\n\t\t}\n\t};\n\n\t#conv = (arr) => {\n\t\tif (!arr) return arr;\n\n\t\tconst isSingle = !Array.isArray(arr);\n\t\tconst targetArr = isSingle ? [arr] : arr;\n\t\tconst fields = this.getHostFields();\n\n\t\tconst result = targetArr.filter(o => !o.__ng?.deleted).map(o => {\n\t\t\tconst t = {};\n\t\t\tfields.forEach((colnm, i) => {\n\t\t\t\tt[colnm] = o.v ? o.v[i] : o[colnm];\n\t\t\t});\n\t\t\tt.__ng = o.__ng;\n\t\t\treturn t;\n\t\t});\n\n\t\treturn isSingle ? result[0] : result;\n\t};\n}\n","import { ngRow, ngData } from \"./ngData.js\";\n\nexport class ngDataManager {\n\t#host;\n\n\tconstructor(host) {\n\t\tthis.#host = host;\n\n\t\tthis.row = new ngRow(this);\n\t\tthis.data = new ngData(this.#host, this);\n\n\t\tthis.rawRecords = [];\n\t\tthis.viewRecords = [];\n\t\tthis.delRecords = [];\n\t\tthis.pageCnt = 25;\n\n\t\tthis.viewRecords.reset = () => {\n\t\t\tif (this.#host.view?.redraw) this.#host.view.redraw();\n\t\t};\n\n\t\tthis.setDataSource = (ds) => {\n\t\t\tif (this.data) this.data.reset();\n\n\t\t\tthis.rawRecords = [];\n\t\t\tthis.viewRecords = [];\n\t\t\tthis.delRecords = [];\n\n\t\t\tthis.data.set(ds || []);\n\t\t};\n\n\t\tthis.getRowState = (nRow) => {\n\t\t\tconst rowIdx = parseInt(nRow, 10);\n\t\t\tif (rowIdx >= this.data.count()) return;\n\t\t\treturn this.data.getValidData()[rowIdx]?.__ng?.rowState;\n\t\t};\n\n\t\tthis.getRowPosition = () => this.row.at;\n\t\tthis.setRowPosition = (nRow) => { this.row.at = nRow; };\n\n\t\tthis.getColumn = (rowidx, colnm) => this.data.get(rowidx, colnm);\n\n\t\tthis.setColumn = (rowidx, colnm, v) => {\n\t\t\trowidx = parseInt(rowidx, 10);\n\t\t\tthis.data.setValue(rowidx, colnm, v);\n\t\t};\n\n\t\t// ์ดˆ๊ธฐ ๋นˆ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ\n\t\tthis.setDataSource([]);\n\t}\n}","import { trace } from \"@nopeer\";\n\nexport class fields {\n\t#host;\n\t#fields = [];\n\n\tconstructor(host) {\n\t\tthis.#host = host;\n\t\tthis.#init();\n\t};\n\n\tget() {\n\t\treturn this.#fields.map(f => f.name);\n\t};\n\n\tgetFields() {\n\t\treturn this.#fields;\n\t}\n\n\tgetType(fieldName) {\n\t\tconst found = this.#fields.find(f => f.name === fieldName);\n\t\treturn found ? found.type : 'string';\n\t}\n\n\tadd = (arr, type = 'string') => {\n\t\tarr.forEach(fName => {\n\t\t\tif (!this.#fields.some(f => f.name === fName)) {\n\t\t\t\tthis.#fields.push({ name: fName, type: type });\n\t\t\t}\n\t\t});\n\t\tthis.#adjust();\n\t};\n\n\tindexOf(v) {\n\t\treturn this.#fields.findIndex(f => f.name === v);\n\t};\n\n\tincludes(v) {\n\t\treturn this.#fields.some(f => f.name === v);\n\t};\n\n\t#adjust = () => {\n\t\tconst map = new Map();\n\t\tthis.#fields.forEach(f => {\n\t\t\tmap.set(f.name, f.type);\n\t\t});\n\n\t\tthis.#fields = Array.from(map, ([name, type]) => ({ name, type }));\n\n\t\tthis.#fields = this.#fields.filter(f => f.name !== \"\" && f.name !== \"__ng\");\n\n\t\tthis.#fields.sort((a, b) => { return (a.name.length < b.name.length) ? 1 : -1; });\n\t};\n\n\t#init = () => {\n\t\tthis.#fields = [];\n\n\t\tconst rawTables = Array.from(this.#host.querySelectorAll(\"table\"));\n\n\t\tif (!rawTables || rawTables.length === 0) return;\n\n\t\tfor (const tbl of rawTables) {\n\n\t\t\ttbl.querySelectorAll('[data-bind]').forEach((el) => {\n\t\t\t\tconst fieldName = el.dataset.bind;\n\t\t\t\tconst fieldType = el.getAttribute(\"data-type\") || 'string';\n\n\t\t\t\tif (fieldName) {\n\t\t\t\t\tthis.#fields.push({ name: fieldName, type: fieldType });\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tconst exprAttrs = [\n\t\t\t\t\"data-expr\", \"background-color\", \"color\", \"tooltip\",\n\t\t\t\t\"visible\", \"readonly\", \"enable-button\", \"enable-check\",\n\t\t\t\t\"class-expr\", \"icon-color\", \"icon-src\"\n\t\t\t];\n\n\t\t\texprAttrs.forEach(attr => {\n\t\t\t\ttbl.querySelectorAll(`[${attr}]`).forEach((el) => {\n\t\t\t\t\tlet expr = el.getAttribute(attr);\n\t\t\t\t\tif (!expr) return;\n\n\t\t\t\t\tif (expr.indexOf(\"data.\") < 0) {\n\t\t\t\t\t\tconst lastIndex = expr.search(/[(]/g);\n\n\t\t\t\t\t\tif (lastIndex > 0) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\texpr = String(window[expr.substring(0, lastIndex).trim()]);\n\t\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t\texpr = \"\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\texpr.split(\"data.\").forEach(v => {\n\t\t\t\t\t\tif (v.trim() != \"\") {\n\t\t\t\t\t\t\tconst lastIndex = v.search(/[^_A-Za-z0-9]/g);\n\t\t\t\t\t\t\tlet targetField = '';\n\n\t\t\t\t\t\t\tif (lastIndex >= 0) {\n\t\t\t\t\t\t\t\ttargetField = v.substring(0, lastIndex);\n\t\t\t\t\t\t\t} else if (expr.startsWith(\"data.\")) {\n\t\t\t\t\t\t\t\ttargetField = v.replace(\"data.\", \"\");\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (targetField) {\n\t\t\t\t\t\t\t\tthis.#fields.push({ name: targetField, type: 'string' });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tthis.#adjust();\n\t};\n};","export class NineTableSheets extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n #init = () => {\n\n };\n\n}\n\nif (!customElements.get('nine-table-sheets')) {\n customElements.define('nine-table-sheets', NineTableSheets);\n}","export class NineTableSheetsFooter extends HTMLElement {\n #host;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n refresh = () => {\n this.querySelector(\"#row-count\").innerHTML = this.#host.data.count().toLocaleString();\n };\n\n #init = () => {\n this.#host = this.getRootNode().host;\n\n this.#render();\n\n this.querySelector('.nine-tab-bar')?.addEventListener('click', (e) => {\n const isMultiSelect = e.ctrlKey || e.metaKey || e.shiftKey;\n const tabItem = e.target.closest('nt-sheets-tab-item');\n\n if (!tabItem) return;\n\n const index = parseInt(tabItem.dataset.index, 10);\n this.#switchSheet(index, isMultiSelect);\n });\n\n setTimeout(() => {\n this.#switchSheet(0, false);\n })\n };\n\n #switchSheet = (index, isMultiSelect = false) => {\n\n const updateSplitters = () => {\n const sheets = Array.from(this.#host.shadowRoot.querySelectorAll('nine-table-sheet'));\n const splitters = Array.from(this.#host.shadowRoot.querySelectorAll('nine-splitter'));\n\n splitters.forEach(s => s.style.setProperty('display', 'none'));\n\n const activeSheets = sheets\n .map((sheet, idx) => ({ sheet, idx }))\n .filter(({ sheet }) => sheet.classList.contains('active'));\n\n if (activeSheets.length < 2) return;\n\n for (let i = 0; i < activeSheets.length - 1; i++) {\n const currentIdx = activeSheets[i].idx;\n\n const targetSplitter = this.#host.shadowRoot.querySelector(`nine-splitter[data-split-index=\"${currentIdx}\"]`);\n if (targetSplitter) {\n targetSplitter.style.setProperty('display', '');\n }\n }\n };\n\n const tabBar = this.querySelector('.nine-tab-bar');\n const body = this.#host.shadowRoot.querySelector('nine-table-sheets-body');\n const tabItems = tabBar.querySelectorAll('nt-sheets-tab-item');\n const sheetElements = body.querySelectorAll('nine-table-sheet');\n\n if (!tabItems[index]) return;\n\n if (!isMultiSelect) {\n tabItems.forEach((tab, idx) => {\n tab.setActive(idx === index);\n });\n\n sheetElements.forEach((sheet, idx) => {\n const isActive = idx === index;\n sheet.classList.toggle('active', isActive);\n sheet.style.flex = isActive ? '1 1 100%' : '';\n });\n } else {\n const clickedTab = tabItems[index];\n const activeTabs = tabBar.querySelectorAll('nt-sheets-tab-item.active');\n\n if (clickedTab.classList.contains('active') && activeTabs.length <= 1) {\n return;\n }\n\n clickedTab.classList.toggle('active');\n const targetSheet = body.querySelector(`nine-table-sheet[data-index=\"${index}\"]`);\n if (targetSheet) {\n targetSheet.classList.toggle('active');\n if (!targetSheet.classList.contains('active')) {\n targetSheet.style.flex = '';\n }\n }\n }\n\n const activeSheets = body.querySelectorAll('nine-table-sheet.active');\n\n activeSheets?.forEach(sheet => {\n sheet.style.flex = (activeSheets.length > 1) ? '1 1 0%' : '1 1 100%';\n\n if (typeof sheet.refreshLayout === 'function') {\n sheet.refreshLayout();\n } else {\n sheet.invalidate?.();\n }\n });\n\n updateSplitters();\n };\n\n #render() {\n const rawElements = Array.from(this.#host.children);\n const rawTables = rawElements.filter(el => (el.tagName.toUpperCase() === 'TABLE'));\n\n const tabsHtml = rawTables.map((table, idx) => {\n const className = idx === 0 ? 'active' : '';\n const tabName = table.getAttribute('caption') || `Sheet ${idx + 1}`;\n\n return `<nt-sheets-tab-item class=\"${className}\" data-index=\"${idx}\">${tabName}</nt-sheets-tab-item>`;\n }).join('');\n\n this.innerHTML = `\n <div class=\"nine-tab-bar\">${tabsHtml}</div>\n <div class=\"sheets-counter\">Total : <span id=\"row-count\">0</span></div>\n `;\n };\n}\n\nexport class SheetTabItem extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n }\n\n setActive(isActive) {\n this.classList.toggle('active', isActive);\n }\n}\n\nif (!customElements.get('nt-sheets-tab-item')) {\n customElements.define('nt-sheets-tab-item', SheetTabItem);\n}\n\nif (!customElements.get('nine-table-sheets-footer')) {\n customElements.define('nine-table-sheets-footer', NineTableSheetsFooter);\n}","import { trace } from \"@nopeer\";\n\nexport class Toolbar extends HTMLElement {\n #host;\n #customContainer;\n\n connectedCallback() {\n this.#host = this.getRootNode().host;\n this.#render();\n this.#bindEvents();\n }\n\n #render() {\n this.innerHTML = `\n <div class=\"ng-toolbar-left\">\n <button type=\"button\" class=\"ng-toolbar-menu-btn\" title=\"Menu\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#374151\" stroke-width=\"2\">\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\"></line>\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\"></line>\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\"></line>\n </svg>\n </button>\n <span class=\"ng-toolbar-title\"></span>\n </div>\n\n <div class=\"ng-toolbar-custom\" id=\"custom-container\"></div>\n `;\n\n this.#customContainer = this.querySelector('#custom-container');\n this.#syncStateFromHost();\n }\n\n #syncStateFromHost() {\n const isSimple = this.#host.getAttribute('theme') === 'simple' || this.#host.classList.contains('simple');\n const showToolbar = this.#host.getAttribute('show-toolbar') !== 'false';\n const showMenu = this.#host.getAttribute('show-menu') !== 'false';\n const caption = this.#host.getAttribute('caption') || '';\n\n if (isSimple || !showToolbar) {\n this.setAttribute('hidden', '');\n } else {\n this.removeAttribute('hidden');\n }\n\n this.setAttribute('show-menu', showMenu ? 'true' : 'false');\n this.updateCaption(caption);\n }\n\n #bindEvents() {\n const titleEl = this.querySelector('.ng-toolbar-title');\n if (titleEl) {\n titleEl.addEventListener('dblclick', () => {\n const link = '<font color=\"green\">https://www.ninegrid.net</font>';\n const currentCaption = this.#host.getAttribute('caption') || '';\n titleEl.innerHTML = titleEl.innerHTML === link ? currentCaption : link;\n });\n }\n\n const menuBtn = this.querySelector('.ng-toolbar-menu-btn');\n if (menuBtn) {\n menuBtn.addEventListener('click', () => {\n this.#host.dispatchEvent(new CustomEvent('toolbar-menu-click', {\n bubbles: true,\n composed: true,\n detail: { targetTable: this.#host }\n }));\n });\n }\n }\n\n addCustomElement(element) {\n if (this.#customContainer) {\n this.#customContainer.append(element);\n }\n }\n\n updateCaption(text) {\n const titleEl = this.querySelector('.ng-toolbar-title');\n if (titleEl) titleEl.textContent = text;\n }\n}\n\nif (!customElements.get('nine-table-toolbar')) {\n customElements.define('nine-table-toolbar', Toolbar);\n}","// ui/nine-table-hscrollbar.js\nimport { trace } from \"@nopeer\";\n\nexport class NineTableHScrollBar extends HTMLElement {\n #owner;\n #dragging = false;\n #elements;\n #interval1;\n #interval2;\n #resizeObserver;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#owner = this.closest(\"nine-table-sheet\") || this.getRootNode().host;\n if (!this.#owner) return;\n\n this.innerHTML = `\n <button class='scroll-left' disabled><div class='scroll-icon'></div></button>\n <div class='scroll-track'><div class='scroll-thumb'></div></div>\n <button class='scroll-right' disabled><div class='scroll-icon'></div></button>\n `;\n\n const initWhenReady = () => {\n const body = this.#owner.querySelector(\".ng-sheet-body .ng-container-body\");\n if (!body) {\n setTimeout(initWhenReady, 10);\n return;\n }\n\n this.#elements = {\n container : body,\n track : this.querySelector(\".scroll-track\"),\n thumb : this.querySelector(\".scroll-thumb\"),\n left : this.querySelector(\".scroll-left\"),\n right : this.querySelector(\".scroll-right\"),\n };\n\n this.#init();\n this.#observeResize();\n this.refresh();\n };\n\n initWhenReady();\n }\n\n disconnectedCallback() {\n if (this.#resizeObserver) {\n this.#resizeObserver.disconnect();\n }\n }\n\n #observeResize = () => {\n if (!this.#owner) return;\n const body = this.#owner.querySelector(\".ng-sheet-body .ng-container-body\");\n if (!body) return;\n\n this.#resizeObserver = new ResizeObserver(() => {\n this.refresh();\n });\n this.#resizeObserver.observe(body);\n };\n\n refresh = () => {\n\n if (!this.#owner || !this.#elements || this.#dragging) return;\n\n const body = this.#elements.container;\n const table = body.querySelector(\"table\");\n if (!table) return;\n\n const track = this.#elements.track;\n const thumb = this.#elements.thumb;\n\n const bodyWidth = body.clientWidth;\n const tableWidth = table.scrollWidth;\n\n const needsHScroll = (bodyWidth !== 0 && tableWidth > bodyWidth);\n this.#owner.classList.toggle('hscroll-visible', needsHScroll);\n\n if (!needsHScroll) {\n return;\n }\n\n const trackWidth = track.clientWidth;\n if (trackWidth <= 0) return;\n\n const thumbWidth = Math.max(Math.min(trackWidth * (bodyWidth / tableWidth), trackWidth), 20);\n thumb.style.width = `${thumbWidth}px`;\n\n const currentLeft = body.scrollLeft;\n const maxScrollLeft = tableWidth - bodyWidth;\n\n let l = 0;\n if (maxScrollLeft > 0) {\n l = parseInt((currentLeft / maxScrollLeft) * (trackWidth - thumbWidth), 10);\n }\n if (l < 0) l = 0;\n\n const maxThumbLeft = trackWidth - thumbWidth;\n if (l > maxThumbLeft) l = maxThumbLeft;\n\n thumb.style.left = `${l}px`;\n\n this.#elements.left.disabled = (l === 0);\n this.#elements.right.disabled = (l >= maxThumbLeft - 1);\n };\n\n #thumbMoveTo = (x) => {\n if (!this.#elements) return false;\n\n const body = this.#elements.container;\n const table = body.querySelector(\"table\");\n if (!table) return false;\n\n const trackBound = this.#elements.track.getBoundingClientRect();\n const thumbWidth = this.#elements.thumb.clientWidth;\n\n let targetX = x;\n if (targetX < 0) targetX = 0;\n const maxThumbLeft = trackBound.width - thumbWidth;\n if (targetX > maxThumbLeft) targetX = maxThumbLeft;\n targetX = parseInt(targetX, 10);\n\n this.#elements.thumb.style.left = `${targetX}px`;\n\n this.#elements.left.disabled = (targetX === 0);\n this.#elements.right.disabled = (targetX >= maxThumbLeft - 1);\n\n const bodyWidth = body.clientWidth;\n const tableWidth = table.scrollWidth;\n const maxScrollLeft = tableWidth - bodyWidth;\n\n if (maxThumbLeft > 0 && maxScrollLeft > 0) {\n const newScrollLeft = (targetX / maxThumbLeft) * maxScrollLeft;\n body.scrollLeft = newScrollLeft;\n }\n\n return (targetX > 0 && targetX < maxThumbLeft - 1);\n };\n\n #init = () => {\n const delayScroll = (pos) => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n\n const thumbLeft = parseInt(this.#elements.thumb.style.left || 0, 10);\n this.#thumbMoveTo(thumbLeft + pos);\n\n this.#interval1 = setInterval(() => {\n clearInterval(this.#interval1);\n\n this.#interval2 = setInterval(() => {\n const currentThumbLeft = parseInt(this.#elements.thumb.style.left || 0, 10);\n if (!this.#thumbMoveTo(currentThumbLeft + pos)) {\n clearInterval(this.#interval2);\n }\n }, 50);\n }, 500);\n };\n\n const clearTimer = () => {\n clearInterval(this.#interval1);\n clearInterval(this.#interval2);\n };\n\n //['mouseup', 'mouseleave', 'touchend'].forEach(evt => {\n ['mouseup', 'mouseleave'].forEach(evt => {\n this.#elements.left.addEventListener(evt, clearTimer);\n this.#elements.right.addEventListener(evt, clearTimer);\n this.#elements.track.addEventListener(evt, clearTimer);\n });\n\n this.#elements.left.addEventListener(\"mousedown\", e => { if (e.button !== 0) return; delayScroll(-20); });\n this.#elements.right.addEventListener(\"mousedown\", e => { if (e.button !== 0) return; delayScroll(20); });\n //this.#elements.left.addEventListener(\"touchstart\", () => delayScroll(-20));\n //this.#elements.right.addEventListener(\"touchstart\", () => delayScroll(20));\n\n this.#elements.track.addEventListener(\"mousedown\", e => {\n if (e.button !== 0) return;\n e.preventDefault();\n const trackRect = this.#elements.track.getBoundingClientRect();\n const thumbWidth = this.#elements.thumb.clientWidth;\n this.#thumbMoveTo(e.clientX - trackRect.left - (thumbWidth / 2));\n });\n\n this.#elements.thumb.addEventListener(\"mousedown\", e => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n this.#dragging = true;\n this.shiftX = e.clientX - this.#elements.thumb.getBoundingClientRect().left;\n\n const onMouseMove = (moveEvent) => {\n if (!this.#dragging) return;\n const trackRect = this.#elements.track.getBoundingClientRect();\n this.#thumbMoveTo(moveEvent.clientX - trackRect.left - this.shiftX);\n };\n\n const onMouseUp = () => {\n this.#dragging = false;\n clearTimer();\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n this.refresh();\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n };\n}\n\nif (!customElements.get('nine-table-hscrollbar')) {\n customElements.define(\"nine-table-hscrollbar\", NineTableHScrollBar);\n}","// ui/nine-table-vscrollbar.js\nimport { trace } from \"@nopeer\";\n\nexport class NineTableVScrollBar extends HTMLElement {\n #host;\n #sheet;\n #dragging = false;\n #elements;\n #startY = 0;\n #startScrollTop = 0;\n #startThumbTop = 0;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#host = this.getRootNode().host;\n this.#sheet = this.closest(\"nine-table-sheet\");\n\n this.innerHTML = `\n <button class='scroll-top' disabled><div class='scroll-icon'></div></button>\n <div class='scroll-track'><div class='scroll-thumb'></div></div>\n <button class='scroll-bottom' disabled><div class='scroll-icon'></div></button>\n `;\n\n const initWhenReady = () => {\n const body = this.#sheet.querySelector(\".ng-sheet-body\");\n if (!body) {\n setTimeout(initWhenReady, 10);\n return;\n }\n\n this.#elements = {\n container: body,\n track: this.querySelector(\".scroll-track\"),\n thumb: this.querySelector(\".scroll-thumb\"),\n top: this.querySelector(\".scroll-top\"),\n bottom: this.querySelector(\".scroll-bottom\"),\n };\n\n this.#init();\n this.refresh();\n };\n\n initWhenReady();\n }\n\n #getScaleInfo = () => {\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords ? viewRecords.length : 0;\n\n const scrollHolder = this.#sheet.elements?.scrollHolder;\n let rawContentHeight = scrollHolder ? parseFloat(scrollHolder.style.height) || 0 : 0;\n\n if (!rawContentHeight || rawContentHeight <= 0) {\n const isGrouped = this.#sheet.sourceTable?.querySelector(\"tbody tr[grouping='true']\") ? true : false;\n if (isGrouped && this.#sheet.rowManager) {\n rawContentHeight = (body.scrollHeight > body.clientHeight) ? body.scrollHeight : (totalCount * 30);\n } else {\n const rowHeight = this.#sheet.getRowHeight() || 1;\n rawContentHeight = totalCount * rowHeight;\n }\n }\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawContentHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n let contentHeight = rawContentHeight;\n\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawContentHeight;\n contentHeight = MAX_BROWSER_HEIGHT;\n }\n\n return { rawContentHeight, contentHeight, scaleFactor, useScaling, totalCount };\n };\n\n\n refresh = () => {\n if (this.#dragging) return;\n\n if (!this.#sheet || !this.#sheet.elements || !this.#elements) return;\n\n const body = this.#elements.container;\n const track = this.#elements.track;\n const thumb = this.#elements.thumb;\n const { contentHeight } = this.#getScaleInfo();\n\n const fixedHeight = (this.#sheet.querySelector('thead')?.offsetHeight || 0) +\n (this.#sheet.querySelector('tfoot')?.offsetHeight || 0) +\n (this.#sheet.querySelector('tbody.head')?.offsetHeight || 0);\n\n const bodyHeight = (this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0);\n const viewHeight = bodyHeight - fixedHeight;\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords.length;\n\n const rawContentHeight = this.#sheet.getRowHeight() * totalCount;\n\n const needsVScroll = (rawContentHeight > viewHeight);\n\n this.#sheet.classList.toggle('vscroll-visible', needsVScroll);\n\n if (!needsVScroll) {\n return;\n }\n\n const trackHeight = track.clientHeight;\n if (trackHeight <= 0) return;\n\n const thumbHeight = Math.max(Math.min(trackHeight * (bodyHeight / rawContentHeight), trackHeight), 20);\n thumb.style.height = `${thumbHeight}px`;\n\n const currentScrollTop = body.scrollTop;\n const maxScrollTop = Math.max(contentHeight - this.#sheet.rowManager.getRowHeight(), 1);\n\n let thumbTop = 0;\n if (maxScrollTop > 0) {\n thumbTop = (currentScrollTop / maxScrollTop) * (trackHeight - thumbHeight);\n }\n\n const maxThumbTop = trackHeight - thumbHeight;\n if (thumbTop < 0) thumbTop = 0;\n if (thumbTop > maxThumbTop) thumbTop = maxThumbTop;\n\n thumb.style.top = `${thumbTop}px`;\n\n this.#elements.top.disabled = (currentScrollTop <= 0);\n this.#elements.bottom.disabled = (currentScrollTop >= maxScrollTop - 1);\n };\n\n #init = () => {\n\n this.#elements.thumb.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n e.stopPropagation();\n e.preventDefault();\n this.#dragging = true;\n\n this.#startY = e.clientY;\n this.#startThumbTop = parseFloat(this.#elements.thumb.style.top) || 0;\n const trackRect = this.#elements.track.getBoundingClientRect();\n const trackHeight = trackRect.height;\n const thumbHeight = this.#elements.thumb.clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n\n const onMouseMove = (moveEvent) => {\n if (!this.#dragging) return;\n if (maxThumbTop <= 0) return;\n\n\n const deltaY = moveEvent.clientY - this.#startY;\n let targetThumbTop = this.#startThumbTop + deltaY;\n\n if (targetThumbTop < 0) targetThumbTop = 0;\n if (targetThumbTop > maxThumbTop) targetThumbTop = maxThumbTop;\n\n this.#elements.thumb.style.top = `${targetThumbTop}px`;\n\n const ratio = targetThumbTop / maxThumbTop;\n\n const rowHeight =this.#sheet.getRowHeight();\n const viewHeight = (this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0) -\n (this.#sheet.elements.body.thead?.offsetHeight || 0) -\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) -\n (this.#sheet.elements.body.tbody.head.offsetHeight || 0);\n\n const visibleRowCount = Math.floor(viewHeight / rowHeight);\n\n const { totalCount } = this.#getScaleInfo();\n const targetRow = Math.floor(ratio * (totalCount - visibleRowCount + 1));\n\n this.#sheet.rowManager.scrollToDataRow(targetRow);\n\n const { rawContentHeight, contentHeight } = this.#getScaleInfo();\n const currentScrollTop = this.#elements.container.scrollTop;\n const maxScrollTop = Math.max(contentHeight - this.#sheet.rowManager.getRowHeight(), 0);\n\n this.#elements.top.disabled = (currentScrollTop <= 0);\n this.#elements.bottom.disabled = (currentScrollTop >= maxScrollTop - 1);\n };\n\n const onMouseUp = () => {\n this.#dragging = false;\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n\n this.#elements.track.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0 || e.target === this.#elements.thumb) return;\n const trackRect = this.#elements.track.getBoundingClientRect();\n const thumbHeight = this.#elements.thumb.clientHeight;\n const trackHeight = this.#elements.track.clientHeight;\n const maxThumbTop = trackHeight - thumbHeight;\n\n if (maxThumbTop > 0) {\n const clickY = e.clientY - trackRect.top - (thumbHeight / 2);\n const ratio = Math.max(0, Math.min(1, clickY / maxThumbTop));\n\n const { totalCount } = this.#getScaleInfo();\n const targetRow = Math.max(0, Math.min(Math.floor(ratio * (totalCount - 1)), totalCount - 1));\n\n\n if (targetRow >= 0 && this.#sheet.rowManager && typeof this.#sheet.rowManager.scrollToDataRow === 'function') {\n this.#sheet.rowManager.scrollToDataRow(targetRow, 'top');\n }\n }\n this.refresh();\n });\n\n let scrollInterval = null;\n\n const startContinuousScroll = (direction) => {\n if (scrollInterval) return;\n\n const scrollStep = () => {\n const $firstTr = this.#sheet.querySelector(\"tbody.body tr\");\n\n if (!$firstTr || $firstTr.dataset.row === undefined) {\n return;\n }\n\n if (direction === 'down' && this.#sheet.isLastRow()) {\n return;\n }\n\n const currentRow = parseInt($firstTr.dataset.row, 10);\n const targetRow = direction === 'down' ? currentRow+1 : Math.max(0, currentRow-1);\n\n this.#sheet.rowManager.scrollToDataRow(targetRow, null, () => {\n this.refresh();\n });\n };\n\n scrollStep();\n scrollInterval = setInterval(scrollStep, 200); // 100ms ๊ฐ„๊ฒฉ ๋ฐ˜๋ณต\n };\n\n const stopContinuousScroll = () => {\n if (scrollInterval) {\n clearInterval(scrollInterval);\n scrollInterval = null;\n }\n };\n\n this.#elements.top.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n startContinuousScroll('up');\n });\n\n this.#elements.bottom.addEventListener(\"mousedown\", (e) => {\n if (e.button !== 0) return;\n startContinuousScroll('down');\n });\n\n document.addEventListener(\"mouseup\", stopContinuousScroll);\n this.#elements.top.addEventListener(\"mouseleave\", stopContinuousScroll);\n this.#elements.bottom.addEventListener(\"mouseleave\", stopContinuousScroll);\n };\n}\n\nif (!customElements.get('nine-table-vscrollbar')) {\n customElements.define(\"nine-table-vscrollbar\", NineTableVScrollBar);\n}\n\n","import { trace } from \"@nopeer\";\n\nexport const GROUP_IDX = {\n\tID: 0,\n\tDEPTH: 1,\n\tNAME: 2,\n\tCHILDREN: 3,\n};\n\nexport class GroupingManager {\n\t#sheet;\n\t#host;\n\t#groupColumns = [];\n\t#groupMap = new Map(); // ๊ทธ๋ฃน๋ณ„ ์ž์‹ ID ๋งคํ•‘ ๊ด€๋ฆฌ์šฉ\n\t#isApplying = false;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = this.#sheet.getRootNode().host;\n\t}\n\n\tget columns() {\n\t\treturn this.#groupColumns;\n\t}\n\n\tget groupMap() {\n\t\treturn this.#groupMap;\n\t}\n\n\tinitialize = () => {\n\t\tlet groupColumns = [];\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (sourceTable) {\n\t\t\tsourceTable.querySelectorAll('tbody tr[grouping=\"true\"]').forEach(($tr) => {\n\t\t\t\tconst $cell =$tr.querySelector(`[cell-type=\"tree\"]`);\n\t\t\t\tif ($cell &&$cell.dataset.bind) {\n\t\t\t\t\tgroupColumns.push($cell.dataset.bind);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#groupColumns = groupColumns;\n\t};\n\n\tapply() {\n\n\t\tif (this.#isApplying) return;\n\t\tthis.#isApplying = true;\n\n\t\tlet groupColumns = [];\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (sourceTable) {\n\t\t\tsourceTable.querySelectorAll('tbody tr[grouping=\"true\"]').forEach(($tr) => {\n\t\t\t\tconst $cell =$tr.querySelector(`[cell-type=\"tree\"]`);\n\t\t\t\tif ($cell &&$cell.dataset.bind) {\n\t\t\t\t\tgroupColumns.push($cell.dataset.bind);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#groupColumns = groupColumns;\n\n\t\tthis.#isApplying = false;\n\t\tthis.#sheet.scrollToY(0);\n\t\tthis.#sheet.view.refresh();\n\t}\n\n\tclear() {\n\t\tthis.#groupColumns = [];\n\t\tthis.#groupMap.clear();\n\t\tthis.#isApplying = false;\n\t\tthis.#sheet.scrollToY(0);\n\t\tthis.#sheet.view.refresh();\n\t}\n\n\tsetGroupMap(map) {\n\t\tthis.#groupMap = map;\n\t}\n\n\tgetChildrenRowIds(groupId) {\n\t\treturn this.#groupMap.get(groupId) || [];\n\t}\n\n\tgetChildrenRecords(groupId) {\n\t\tconst rowIds = this.getChildrenRowIds(groupId);\n\t\tconst dataManager = this.#host.data;\n\t\treturn rowIds.map(rowid => dataManager.getArray(rowid)).filter(Boolean);\n\t}\n}\n\nexport class Grouping {\n\n\tstatic apply(rawRecords, groupColumns = [], fields = []) {\n\t\tif (!groupColumns || groupColumns.length === 0) {\n\t\t\treturn { headers: [], renderItems: [], groupMap: new Map() };\n\t\t}\n\n\t\tconst validRaw = rawRecords.filter(o => !o.__ng?.deleted);\n\t\tconst groupMap = new Map();\n\n\t\tconst nestedTree = Grouping.#buildNestedMap(validRaw, groupColumns, fields);\n\t\tconst flatResult = [];\n\t\tconst renderItems = [];\n\n\t\tGrouping.#flattenTree(nestedTree, 0, groupColumns, flatResult, renderItems, groupMap, \"\");\n\n\t\treturn { headers: flatResult, renderItems, groupMap };\n\t}\n\n\tstatic #flattenTree(mapOrArray, depth, groupColumns, resultArr, renderItems, groupMap, parentId) {\n\t\tlet counter = 0;\n\t\tconst isLastLevel = (depth === groupColumns.length - 1); // ๐Ÿ’ก ์—ฐ์‚ฐ์ž ์ˆ˜์ • ๋ฐ˜์˜\n\n\t\tfor (let [groupKey, subMapOrRecords] of mapOrArray.entries()) {\n\t\t\tconst groupId = parentId ? `${parentId}_${counter++}` : `g_${counter++}`;\n\n\t\t\tconst rowIds = Grouping.#collectLeafRowIds(subMapOrRecords);\n\t\t\tgroupMap.set(groupId, rowIds);\n\n\t\t\tconst groupRecord = [];\n\t\t\tgroupRecord[GROUP_IDX.ID] = groupId;\n\t\t\tgroupRecord[GROUP_IDX.DEPTH] = depth;\n\t\t\tgroupRecord[GROUP_IDX.NAME] = groupKey;\n\t\t\tgroupRecord[GROUP_IDX.CHILDREN] = rowIds;\n\n\t\t\tgroupRecord.__isGroupHeader = true;\n\t\t\tgroupRecord.__groupId = groupId;\n\n\t\t\tresultArr.push(groupRecord);\n\n\t\t\trenderItems.push({\n\t\t\t\ttype: 'group',\n\t\t\t\trecord: groupRecord,\n\t\t\t\tgroupId: groupId\n\t\t\t});\n\n\t\t\tif (!isLastLevel && subMapOrRecords instanceof Map) {\n\t\t\t\tGrouping.#flattenTree(subMapOrRecords, depth + 1, groupColumns, resultArr, renderItems, groupMap, groupId);\n\t\t\t} else {\n\t\t\t\tconst leafRecords = Grouping.#collectLeafRecords(subMapOrRecords);\n\t\t\t\tleafRecords.forEach(record => {\n\t\t\t\t\trecord.__isGroupHeader = false;\n\t\t\t\t\trecord.__groupId = groupId;\n\t\t\t\t\tresultArr.push(record);\n\n\t\t\t\t\trenderItems.push({\n\t\t\t\t\t\ttype: 'data',\n\t\t\t\t\t\trecord: record,\n\t\t\t\t\t\tgroupId: groupId\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic #buildNestedMap(records, groupColumns, fields) {\n\t\tconst colIndex = fields.indexOf(groupColumns[0]);\n\t\tconst remainingCols = groupColumns.slice(1);\n\t\tconst map = new Map();\n\n\t\trecords.forEach(record => {\n\t\t\tconst key = colIndex >= 0 ? record.v[colIndex] : '(Unknown)';\n\t\t\tif (!map.has(key)) map.set(key, []);\n\t\t\tmap.get(key).push(record);\n\t\t});\n\n\t\tif (remainingCols.length > 0) {\n\t\t\tconst result = new Map();\n\t\t\tfor (let [key, subRecords] of map.entries()) {\n\t\t\t\tresult.set(key, Grouping.#buildNestedMap(subRecords, remainingCols, fields));\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t\treturn map;\n\t}\n\n\tstatic #collectLeafRowIds(subMapOrRecords) {\n\t\tlet rowIds = [];\n\t\tif (subMapOrRecords instanceof Map) {\n\t\t\tfor (let subVal of subMapOrRecords.values()) {\n\t\t\t\trowIds = rowIds.concat(Grouping.#collectLeafRowIds(subVal));\n\t\t\t}\n\t\t} else if (Array.isArray(subMapOrRecords)) {\n\t\t\trowIds = rowIds.concat(subMapOrRecords.map(r => r.__ng?.rowid ?? r.m?._?.[0]));\n\t\t}\n\t\treturn rowIds;\n\t}\n\n\tstatic #collectLeafRecords(subMapOrRecords) {\n\t\tlet records = [];\n\t\tif (subMapOrRecords instanceof Map) {\n\t\t\tfor (let subVal of subMapOrRecords.values()) {\n\t\t\t\trecords = records.concat(Grouping.#collectLeafRecords(subVal));\n\t\t\t}\n\t\t} else if (Array.isArray(subMapOrRecords)) {\n\t\t\trecords = records.concat(subMapOrRecords);\n\t\t}\n\t\treturn records;\n\t}\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { GROUP_IDX } from \"@/data/Grouping.js\";\n\nexport class RowManager {\n #BUFFER_ROW_COUNT = 3;\n\n #host;\n #sheet;\n #element;\n\n #containerTemplates = new Map();\n\n #resizeObserver = null;\n #sheetHeight = 0;\n #cachedRowCount;\n\n #isProgrammaticScroll = false;\n #isGrouped = false;\n\n constructor(sheet) {\n this.#host = sheet.getRootNode().host;\n this.#sheet = sheet;\n\n this.#initResizeObserver();\n }\n\n getRowHeight() {\n return this.#sheet.template.height;\n }\n\n refresh = (force = false) => {\n\n if (!this.#sheet.classList.contains('active')) return;\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n if (!bodyViewport) return;\n\n const wasInvalidHeight = !this.#sheet.template.height || this.#sheet.template.height <= 0;\n\n if (wasInvalidHeight) {\n this.#measureAndCacheHeight();\n if (this.#sheet.template.height && this.#sheet.template.height > 0) {\n this.#renderAllContainers();\n }\n }\n\n\n this.#handleScroll(bodyViewport.scrollTop, force);\n\n this.#sheet.querySelector('nine-table-vscrollbar')?.refresh();\n };\n\n #handleScroll = (scrollTop, force = false) => {\n\n if (this.#isGrouped) {\n this.#handleGroupedScroll(scrollTop, force);\n return;\n }\n\n const rowHeight = this.#sheet.template.height;\n if (!rowHeight || rowHeight <= 0) return;\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords.length;\n\n if (totalCount === 0) {\n this.#sheet.elements.scrollHolder.style.height = '0px';\n return;\n }\n\n const fixedHeight = (this.#sheet.elements.body.thead?.offsetHeight || 0) +\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) +\n this.#sheet.elements.body.tbody.head.offsetHeight;\n\n const viewHeight = this.#sheet.querySelector('.ng-sheet-body').offsetHeight || 0;\n const rawTotalVirtualHeight = Math.max(totalCount * rowHeight - (viewHeight - fixedHeight - rowHeight) - rowHeight, 0);\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawTotalVirtualHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n let totalVirtualHeight = rawTotalVirtualHeight;\n\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawTotalVirtualHeight;\n totalVirtualHeight = MAX_BROWSER_HEIGHT;\n }\n\n\n this.#sheet.elements.scrollHolder.style.height = `${totalVirtualHeight}px`;\n\n const actualScrollTop = useScaling ? (scrollTop / scaleFactor) : scrollTop;\n\n const maxStartIndex = Math.max(0, totalCount - 1);\n const clampedScrollTop = Math.min(actualScrollTop, rawTotalVirtualHeight);\n const startIndex = Math.max(0, Math.min(Math.floor(clampedScrollTop / rowHeight), maxStartIndex));\n\n //trace.log(clampedScrollTop % rowHeight, rowHeight);\n\n /*\n * FIX: Use GPU-accelerated transform3d instead of 'top' positioning.\n * On mobile devices (iOS Safari), direct 'top' updates trigger expensive\n * layout reflows and cause severe scrolling lag during inertia touch scrolls.\n * translate3d forces hardware compositing for buttery-smooth performance.\n */\n this.#sheet.elements.left.tbody.body.style.transform =\n this.#sheet.elements.body.tbody.body.style.transform =\n this.#sheet.elements.right.tbody.body.style.transform = `translate3d(0px, -${clampedScrollTop % rowHeight}px, 0px)`;\n\n\n const firstTr = this.#element.firstTr;\n const currentStartIndex = firstTr && firstTr.dataset.row !== undefined ? parseInt(firstTr.dataset.row, 10) : -1;\n\n if (!force && currentStartIndex === startIndex) {\n return;\n }\n\n [\n this.#sheet.elements.left.tbody.body,\n this.#sheet.elements.body.tbody.body,\n this.#sheet.elements.right.tbody.body\n ].forEach(($tbody, tbodyIdx) => {\n if (!$tbody) return;\n\n const rows = $tbody.querySelectorAll('tbody.body tr');\n\n rows.forEach(($tr, index) => {\n const dataIndex = startIndex + Math.floor(index / this.#sheet.template.length);\n\n if (dataIndex >= totalCount) {\n $tr.style.display = 'none';\n $tr.dataset.matrixRow = null;\n $tr.dataset.row = null;\n $tr.dataset.index = null;\n return;\n }\n\n const record = viewRecords[dataIndex];//this.#sheet.view.getArray(dataIndex);\n\n if (!record) {\n $tr.style.display = 'none';\n return;\n }\n\n const rowid = record.m._[NINE_TABLE.META.INDEX.ROWID];\n\n $tr.style.display = '';\n\n this.#bindRowData($tr, record, rowid, dataIndex);\n });\n });\n\n this.#sheet.selection.refresh();\n };\n\n\n #handleGroupedScroll = (scrollTop, force = false) => {\n\n const allRenderItems = this.#sheet.view.getArray() || [];\n const totalVirtualCount = allRenderItems.length;\n\n if (totalVirtualCount === 0) {\n this.#sheet.elements.scrollHolder.style.height = '0px';\n return;\n }\n\n\n const bodyContent = this.#sheet.querySelector('.ng-sheet-body .ng-sheet-body-content');\n const templateLength = this.#sheet.templateLength || 1;\n\n const getItemHeight = (item) => {\n if (item.type === 'group') {\n const depth = item.record[GROUP_IDX.DEPTH] || 0;\n const groupHeight = this.#sheet.template.height[depth] || this.#sheet.template.height / templateLength;\n return groupHeight;\n } else {\n let dataRowsHeight = 0;\n const templateLength = this.#sheet.templateLength || 1;\n\n let groupHeightsTotal = 0;\n for(let i = 0; i < templateLength - 1; i++) {\n groupHeightsTotal += this.#sheet.template.heights[i] || 0;\n }\n dataRowsHeight = this.#sheet.template.height - groupHeightsTotal;\n\n return dataRowsHeight > 0 ? dataRowsHeight : this.#sheet.template.height;\n }\n };\n\n\n let totalVirtualHeight = 0;\n const itemHeights = new Array(totalVirtualCount);\n for (let i = 0; i < totalVirtualCount; i++) {\n const h = getItemHeight(allRenderItems[i]);\n itemHeights[i] = h;\n totalVirtualHeight += h;\n }\n\n this.#sheet.elements.scrollHolder.style.height = `${totalVirtualHeight}px`;\n\n const viewportClientHeight = this.#sheet.clientHeight;\n\n let accumulatedHeight = 0;\n let startIndex = 0;\n\n for (let i = 0; i < totalVirtualCount; i++) {\n const h = itemHeights[i];\n if (accumulatedHeight + h > scrollTop) {\n startIndex = i;\n break;\n }\n accumulatedHeight += h;\n startIndex = i;\n }\n\n const offsetY = scrollTop - accumulatedHeight;\n if (bodyContent) {\n bodyContent.querySelectorAll(\"tbody\").forEach(($tbody) => {\n $tbody.style.top = `-${Math.max(0, offsetY)}px`;\n });\n }\n\n const firstTr = this.#element.firstTr;\n const currentStartIndex = firstTr && firstTr.dataset.virtualIndex !== undefined\n ? parseInt(firstTr.dataset.virtualIndex, 10)\n : -1;\n\n if (!force && currentStartIndex === startIndex) {\n return;\n }\n\n const visibleRowsCount = Math.ceil(viewportClientHeight / (this.#sheet.template.height / templateLength));\n const dynamicBuffer = (this.#sheet.grouping.columns?.length || 1) * 15;\n const targetStart = startIndex;\n const targetEnd = Math.min(totalVirtualCount, startIndex + visibleRowsCount + dynamicBuffer);\n const renderedItems = allRenderItems.slice(targetStart, targetEnd);\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (!container) return;\n\n const trs = Array.from(container.querySelectorAll('tbody.body tr'));\n\n for (let i = 0; i < trs.length; i += templateLength) {\n const itemIndex = Math.floor(i / templateLength);\n const item = renderedItems[itemIndex];\n const chunkTrs = trs.slice(i, i + templateLength);\n\n if (!item || itemIndex >= renderedItems.length) {\n chunkTrs.forEach(tr => {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n });\n continue;\n }\n\n const dataIndex = startIndex + itemIndex;\n\n chunkTrs.forEach((tr, subIdx) => {\n const virtualIndex = startIndex + itemIndex;\n tr.dataset.virtualIndex = virtualIndex;\n tr.dataset.row = (item.type === 'data') ? dataIndex : '';\n\n const isTrGroup = tr.getAttribute('grouping') === 'true';\n\n if (item.type === 'group') {\n if (isTrGroup) {\n const depth = item.record[GROUP_IDX.DEPTH];\n if (subIdx === depth) {\n tr.style.display = '';\n this.#bindGroupRowData(tr, allRenderItems, item.record, virtualIndex);\n } else {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n }\n } else {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n }\n } else {\n if (isTrGroup) {\n tr.style.display = 'none';\n tr.dataset.matrixRow = null;\n tr.dataset.row = null;\n tr.dataset.index = null;\n } else {\n tr.style.display = '';\n\n const rowid = item.record.m?.rowid ?? 0;\n this.#bindRowData(tr, item.record, rowid, virtualIndex);\n }\n }\n });\n }\n });\n\n this.#sheet.selection.refresh();\n };\n\n #bindGroupRowData = ($tr, allRenderItems, groupRecord, virtualIndex) => {\n const templateLength = this.#sheet.templateLength || 1;\n const subRowIndex = parseInt($tr.dataset.subrow, 10) || 0;\n const matrixRow = (virtualIndex * templateLength) + subRowIndex;\n\n const indices = groupRecord[GROUP_IDX.CHILDREN];\n const allRecords = this.#host.data.getArray();\n const childrenRecords = indices ? indices.map(idx => allRecords[idx]).filter(Boolean) : [];\n\n\n $tr.dataset.virtualIndex = virtualIndex;\n $tr.dataset.row = '';\n $tr.dataset.matrixRow = matrixRow;\n $tr.data = childrenRecords;//groupRecord;\n $tr.dataset.groupId = groupRecord[GROUP_IDX.ID];\n\n\n Array.from($tr.cells).forEach(($cell) => {\n\n $cell.dataset.row = virtualIndex;\n\n const customComp = Array.from($cell.children).find($el =>\n $el.tagName.toLowerCase().startsWith('cell-') || typeof $el.refresh === 'function'\n );\n\n\n if (customComp !== undefined && typeof customComp.refresh === 'function') {\n customComp?.refresh();\n }\n });\n };\n\n #bindRowData = ($tr, record, rowid, dataIndex) => {\n const templateLength = this.#sheet.templateLength || 1;\n const subRowIndex = parseInt($tr.dataset.subrow, 10) || 0;\n const matrixRow = (dataIndex * templateLength) + subRowIndex;\n\n $tr.dataset.index = dataIndex;\n $tr.dataset.row = rowid;\n $tr.dataset.matrixRow = matrixRow;\n $tr.data = record;\n\n Array.from($tr.cells).forEach(($cell) => {\n $cell.dataset.index = dataIndex;\n $cell.dataset.row = rowid;\n\n const customComp = Array.from($cell.children).find($el =>\n $el.tagName.toLowerCase().startsWith('cell-') && typeof $el.refresh === 'function'\n );\n\n customComp?.refresh();\n });\n };\n\n initialize = () => {\n\n this.#isGrouped = this.#sheet.sourceTable.querySelector(\"tbody tr[grouping='true']\") ? true : false;\n\n //this.#cachedTemplateHeight = null;\n this.#containerTemplates.clear();\n\n this.#element = {\n scrollTables: this.#sheet.querySelectorAll('.ng-sheet-body table'),\n firstTr: this.#sheet.querySelector('.ng-sheet-body .ng-container-body tbody.body tr'),\n };\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (!container) return;\n\n const tableEl = container.querySelector('table');\n if (!tableEl) return;\n\n const tbody = tableEl.querySelector('tbody.body');\n if (!tbody) return;\n\n const trs = Array.from(tbody.querySelectorAll('tr'));\n const templateTrs = trs.map(tr => tr.cloneNode(true));\n this.#containerTemplates.set(selector, templateTrs);\n });\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\n if (bodyViewport) {\n this.#sheetHeight = bodyViewport.clientHeight;\n //trace.log(\"this.#sheetHeight\", this.#sheetHeight, this.#sheet);\n\n this.#measureAndCacheHeight();\n this.#renderAllContainers();\n this.#handleScroll(bodyViewport.scrollTop, true);\n\n bodyViewport.addEventListener('scroll', (e) => {\n\n this.#sheet.querySelectorAll(\"cell-combo-panel\").forEach($el => {\n $el.classList.remove('active');\n });\n\n\n if (this.#isProgrammaticScroll) return;\n\n const rowHeight = this.#sheet.template.height || 0;\n const totalCount = this.#sheet.view.getArray()?.length || 0;\n const rawTotalVirtualHeight = totalCount * rowHeight;\n\n if (rawTotalVirtualHeight <= bodyViewport.clientHeight) {\n return;\n }\n\n this.#handleScroll(bodyViewport.scrollTop);\n\n this.#sheet.querySelector('nine-table-vscrollbar').refresh();\n\n }, { passive: true });\n }\n };\n\n scrollToDataRow(dataRow, align = 'top', onRendered) {\n\n const bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\n const viewRecords = this.#sheet.view.getArray();\n const totalCount = viewRecords?.length || 0;\n\n const targetRow = Math.max(0, Math.min(dataRow, totalCount - 1));\n let targetScrollTop = 0;\n\n if (this.#isGrouped) {\n const maxScrollTop = Math.max(bodyViewport.scrollHeight - bodyViewport.clientHeight, 1);\n // targetRow๊ฐ€ ์ „์ฒด totalCount์—์„œ ์ฐจ์ง€ํ•˜๋Š” ๋น„์œจ(ratio)๋งŒํผ ์‹ค์ œ ์Šคํฌ๋กค ์ตœ๋Œ€ ๋†’์ด์— ๊ณฑํ•ด์คŒ\n const ratio = targetRow / Math.max(totalCount - 1, 1);\n targetScrollTop = ratio * maxScrollTop;\n } else {\n\n const rowHeight = this.#sheet.template.height;\n const rawTargetScrollTop = targetRow * rowHeight;\n\n const fixedHeight = (this.#sheet.elements.body.thead?.offsetHeight || 0) +\n (this.#sheet.elements.body.tfoot?.offsetHeight || 0) +\n this.#sheet.elements.body.tbody.head.offsetHeight;\n\n const viewHeight = bodyViewport.offsetHeight || 0;\n const rawTotalVirtualHeight = Math.max(totalCount * rowHeight + fixedHeight - viewHeight, 0);\n\n const MAX_BROWSER_HEIGHT = 15000000;\n const useScaling = rawTotalVirtualHeight > MAX_BROWSER_HEIGHT;\n\n let scaleFactor = 1;\n if (useScaling) {\n scaleFactor = MAX_BROWSER_HEIGHT / rawTotalVirtualHeight;\n }\n\n targetScrollTop = rawTargetScrollTop * scaleFactor;\n }\n\n this.#isProgrammaticScroll = true;\n bodyViewport.scrollTop = targetScrollTop;\n this.#handleScroll(targetScrollTop);\n\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.#isProgrammaticScroll = false;\n if (typeof onRendered === 'function') onRendered();\n });\n });\n }\n\n\n\n destroy = () => {\n if (this.#resizeObserver) {\n this.#resizeObserver.disconnect();\n this.#resizeObserver = null;\n }\n };\n\n #measureAndCacheHeight = () => {\n this.#updateRowCount();\n return;\n if (!this.#sheet.classList.contains('active')) return;\n\n if (!this.#sheet.sourceTable) return;\n\n const trTemplates = this.#sheet.sourceTable?.querySelectorAll('tbody.body tr');\n\n const $tbody = this.#sheet.querySelector('.ng-container-body tbody.body');\n if (!$tbody) return;\n\n $tbody?.querySelectorAll('tr')?.forEach(tr => tr.remove());\n\n const fragment = document.createDocumentFragment();\n trTemplates.forEach($tr => fragment.appendChild($tr.cloneNode(true)));\n $tbody?.appendChild(fragment);\n\n const renderedTrs = $tbody.querySelectorAll('tr');\n\n renderedTrs.forEach(tr => tr.remove());\n\n this.#updateRowCount();\n };\n\n #updateRowCount = () => {\n\n if (this.#sheetHeight > 0 && this.#sheet.template.height > 0) {\n const visibleRows = Math.ceil(this.#sheetHeight / this.#sheet.template.height);\n\n let dynamicBuffer = this.#BUFFER_ROW_COUNT;\n if (this.#isGrouped && this.#sheet.grouping) {\n const groupDepth = this.#sheet.grouping.columns?.length || 1;\n dynamicBuffer += (groupDepth * 15);\n }\n\n this.#cachedRowCount = visibleRows + dynamicBuffer;\n }\n };\n\n #renderAllContainers = () => {\n\n ['.ng-container-body', '.ng-container-left', '.ng-container-right'].forEach(selector => {\n const container = this.#sheet.querySelector(`.ng-sheet-body ${selector}`);\n if (container && container.querySelector('tbody')) {\n this.#renderRows(container);\n }\n });\n\n this.#syncRowHeights();\n };\n\n #renderRows = (container) => {\n\n let targetFixedType = null;\n if (container.classList.contains('ng-container-left')) targetFixedType = 'left';\n else if (container.classList.contains('ng-container-right')) targetFixedType = 'right';\n\n const templateTrs = Array.from(this.#sheet.sourceTable.querySelectorAll('tbody.body tr')).map(tr => {\n const clonedTr = tr.cloneNode(true);\n\n\n if (targetFixedType === 'left') {\n clonedTr.querySelectorAll('th,td').forEach($cell => {\n if ($cell.getAttribute('fixed') !== 'left') $cell.remove();\n });\n } else if (targetFixedType === 'right') {\n clonedTr.querySelectorAll('th,td').forEach($cell => {\n if ($cell.getAttribute('fixed') !== 'right') $cell.remove();\n });\n } else {\n clonedTr.querySelectorAll('[fixed=left], [fixed=right]').forEach($cell => {\n $cell.remove();\n });\n }\n\n return clonedTr;\n });\n\n if (templateTrs.length === 0) return;\n\n const targetTbody = container.querySelector('tbody.body');\n\n targetTbody.querySelectorAll(\"tr\").forEach(tr => tr.remove());\n\n const fragment = document.createDocumentFragment();\n for (let i = 0; i < this.#cachedRowCount; i++) {\n templateTrs.forEach(tmpl => fragment.appendChild(tmpl.cloneNode(true)));\n }\n\n\n targetTbody.appendChild(fragment);\n\n if (container.classList.contains('ng-container-body')) {\n this.#element.firstTr = targetTbody.querySelector('tr');\n }\n };\n\n\n\n #syncRowHeights = () => {\n const leftTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-left table');\n const bodyTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-body table');\n const rightTable = this.#sheet.querySelector('.ng-sheet-body .ng-container-right table');\n\n if (bodyTable) {\n const leftRows = leftTable ? Array.from(leftTable.querySelectorAll('tbody tr')) : [];\n const bodyRows = Array.from(bodyTable.querySelectorAll('tbody tr'));\n const rightRows = rightTable ? Array.from(rightTable.querySelectorAll('tbody tr')) : [];\n\n const maxRows = Math.max(leftRows.length, bodyRows.length, rightRows.length);\n\n for (let i = 0; i < maxRows; i++) {\n const heights = [\n leftRows[i]?.getBoundingClientRect().height || 0,\n bodyRows[i]?.getBoundingClientRect().height || 0,\n rightRows[i]?.getBoundingClientRect().height || 0\n ];\n const maxHeight = Math.max(...heights);\n\n if (maxHeight > 0) {\n if (leftRows[i]) leftRows[i].style.height = `${maxHeight}px`;\n if (bodyRows[i]) bodyRows[i].style.height = `${maxHeight}px`;\n if (rightRows[i]) rightRows[i].style.height = `${maxHeight}px`;\n }\n }\n }\n };\n\n #initResizeObserver = () => {\n\n if (!this.#sheet || !(this.#sheet instanceof HTMLElement)) return;\n\n this.#resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n\n const sheetEl = entry.target;\n if (!sheetEl.classList.contains('active')) continue;\n\n const height = entry.contentRect.height;\n const width = entry.contentRect.width;\n\n if (width > 0 && this.#sheet.isAutoFitCol) {\n this.#sheet.autoFit(true);\n }\n\n if (height > 0 && this.#sheetHeight !== height) {\n this.#sheetHeight = height;\n //trace.log(\"this.#sheetHeight\", this.#sheetHeight);\n this.#updateRowCount();\n\n if (this.#sheet.template.height !== null) {\n this.#renderAllContainers();\n this.refresh();\n }\n }\n }\n });\n\n this.#resizeObserver.observe(this.#sheet);\n };\n}","import { trace } from \"@nopeer\";\n\nexport const COLLAPSED_WIDTH = 16;\n\nexport class TableCompiler {\n\n static compile($srcTable) {\n\n const $table = $srcTable.cloneNode(true);\n\n TableCompiler.resetColIndex($table, $table.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tfoot tr'));\n\n TableCompiler.#syncColAttributes($table);\n\n return $table;\n }\n\n static recompile($table) {\n\n\n TableCompiler.resetColIndex($table, $table.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex($table, $table.querySelectorAll('tfoot tr'));\n\n TableCompiler.#syncColAttributes($table);\n\n return $table;\n }\n\n static #syncColAttributes($table) {\n\n $table.querySelectorAll('colgroup col').forEach(($col, i) => {\n $col.setAttribute('data-col', i);\n const fixed = $col.getAttribute('fixed');\n\n $table.querySelectorAll(`[data-col=\"${i}\"]`).forEach($el => {\n fixed ? $el.setAttribute('fixed', fixed) : $el.removeAttribute('fixed');\n });\n });\n }\n\n static resetColIndex($table, trs) {\n\n const cols = $table.querySelectorAll('colgroup col');\n const grid = Array.from({ length: trs.length }, () => Array(cols.length).fill(null));\n\n trs.forEach(($tr, index) => {\n\n $tr.dataset.subrow = index;\n\n let colIndex = 0;\n\n $tr.querySelectorAll('th, td').forEach($cell => {\n\n while (colIndex < cols.length && grid[index][colIndex] !== null) {\n colIndex++;\n }\n\n $cell.dataset.col = colIndex;\n\n const rowSpan = $cell.rowSpan || 1;\n const colSpan = $cell.colSpan || 1;\n\n for (let r = 0; r < rowSpan; r++) {\n for (let c = 0; c < colSpan; c++) {\n if (index + r < trs.length && colIndex + c < cols.length) {\n grid[index + r][colIndex + c] = $cell;\n }\n }\n }\n\n colIndex += colSpan;\n });\n });\n }\n\n}","import { trace } from \"@nopeer\";\n\nexport class CellSelection {\n\t#sheet;\n\t#host;\n\t#range = { startRow: -1, startCol: -1, endRow: -1, endCol: -1 };\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.#initEvents();\n\t}\n\n\t#getMatrixRow(tr) {\n\t\tif (!tr) return { dataRow: -1, subRowIndex: -1, matrixRow: -1 };\n\n\t\tconst dataRow = parseInt(tr.dataset.index, 10);\n\t\tif (isNaN(dataRow)) return { dataRow: -1, subRowIndex: -1, matrixRow: -1 };\n\n\t\tconst tbody = tr.closest('tbody');\n\t\tconst trs = Array.from(tbody.querySelectorAll('tr'));\n\n\t\tconst sameGroupTrs = trs.filter(t => parseInt(t.dataset.index, 10) === dataRow);\n\t\tconst subRowIndex = sameGroupTrs.indexOf(tr);\n\t\tconst templateLength = sameGroupTrs.length > 0 ? sameGroupTrs.length : 1;\n\n\t\tconst matrixRow = (dataRow * templateLength) + (subRowIndex >= 0 ? subRowIndex : (tr.sectionRowIndex % templateLength));\n\n\t\treturn { dataRow, subRowIndex, matrixRow };\n\t}\n\n\tsetFocus(matrixRow, col) {\n\t\tthis.#sheet.querySelectorAll(`tr.selected-start`).forEach($tr => {\n\t\t\t$tr.classList.remove(\"selected-start\");\n\t\t\t$tr.querySelectorAll(`td.selected-start`).forEach($td => {\n\t\t\t\t$td.classList.remove(\"selected-start\");\n\t\t\t});\n\t\t});\n\n\t\tconst $td = this.#sheet.querySelector(`.ng-sheet-body-content tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${col}\"]`);\n\t\tif (!$td) return;\n\n\t\t$td.classList.add(\"selected-start\");\n\t\t$td.closest('tr')?.classList.add(\"selected-start\");\n\t}\n\n\tsetRange(startRow, startCol, endRow, endCol) {\n\t\tlet r1 = Math.min(startRow, endRow);\n\t\tlet r2 = Math.max(startRow, endRow);\n\t\tlet c1 = Math.min(startCol, endCol);\n\t\tlet c2 = Math.max(startCol, endCol);\n\n\n\t\tif (this.#host.tagName === \"NINE-TABLE-SIMPLE\") {\n\t\t\tc1 = 1;\n\t\t\tc2 = 10;\n\t\t}\n\n\t\tconst containers = this.#sheet.querySelectorAll('.ng-container-left, .ng-container-body, .ng-container-right');\n\n\t\tlet expanded = true;\n\t\tlet loopCount = 0;\n\n\t\twhile (expanded && loopCount < 5) {\n\t\t\texpanded = false;\n\t\t\tloopCount++;\n\n\t\t\tcontainers.forEach(container => {\n\n\t\t\t\tconst visibleTrs = Array.from(container.querySelectorAll('tbody tr')).filter(tr => {\n\t\t\t\t\treturn tr.style.display !== 'none'; // ํ˜น์€ tr.offsetHeight > 0 ์ฒดํฌ\n\t\t\t\t});\n\n\t\t\t\tvisibleTrs.forEach(tr => {\n\t\t\t\t\tconst { matrixRow } = this.#getMatrixRow(tr);\n\t\t\t\t\tif (matrixRow < 0) return;\n\n\t\t\t\t\ttr.querySelectorAll('td, th').forEach(cell => {\n\t\t\t\t\t\tconst col = parseInt(cell.dataset.col, 10);\n\t\t\t\t\t\tif (isNaN(col)) return;\n\n\t\t\t\t\t\tconst colEl = this.#sheet.querySelector(`col[data-col=\"${col}\"]`);\n\t\t\t\t\t\tif (colEl.style.display !== 'none') {\n\t\t\t\t\t\t\tconst rowSpan = parseInt(cell.rowSpan || 1, 10);\n\t\t\t\t\t\t\tconst colSpan = parseInt(cell.colSpan || 1, 10);\n\n\t\t\t\t\t\t\tconst cellEndRow = matrixRow + rowSpan - 1;\n\t\t\t\t\t\t\tconst cellEndCol = col + colSpan - 1;\n\n\t\t\t\t\t\t\tconst isIntersecting = cellEndRow >= r1 && matrixRow <= r2 && cellEndCol >= c1 && col <= c2;\n\n\t\t\t\t\t\t\tif (isIntersecting) {\n\t\t\t\t\t\t\t\tconst nsR = Math.min(r1, matrixRow);\n\t\t\t\t\t\t\t\tconst neR = Math.max(r2, cellEndRow);\n\t\t\t\t\t\t\t\tconst nsC = Math.min(c1, col);\n\t\t\t\t\t\t\t\tconst neC = Math.max(c2, cellEndCol);\n\n\t\t\t\t\t\t\t\tif (nsR !== r1 || neR !== r2 || nsC !== c1 || neC !== c2) {\n\t\t\t\t\t\t\t\t\tr1 = nsR; r2 = neR; c1 = nsC; c2 = neC;\n\t\t\t\t\t\t\t\t\texpanded = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tconst sanitize = (val) => (!Number.isFinite(val) ? -1 : val);\n\n\t\tthis.#range = {\n\t\t\tstartRow: sanitize(r1),\n\t\t\tstartCol: sanitize(c1),\n\t\t\tendRow: sanitize(r2),\n\t\t\tendCol: sanitize(c2)\n\t\t};\n\n\t\t//trace.log(this.#range);\n\n\t\tthis.render();\n\t}\n\n\tclear = () => {\n\t\tthis.#range = { startRow: -1, startCol: -1, endRow: -1, endCol: -1 };\n\t};\n\n\tget minRow() {\n\t\treturn this.#range.startRow;\n\t};\n\tget maxRow() {\n\t\treturn this.#range.endRow;\n\t};\n\tget minCol() {\n\t\treturn this.#range.startCol;\n\t};\n\tget maxCol() {\n\t\treturn this.#range.endCol;\n\t};\n\n\trefresh = () => {\n\t\tthis.render();\n\t}\n\n\trender = () => {\n\t\tconst { startRow, startCol, endRow, endCol } = this.#range;\n\n\t\tconst containers = this.#sheet.querySelectorAll(\n\t\t\t'.ng-container-left, .ng-container-body, .ng-container-right'\n\t\t);\n\n\t\tcontainers.forEach(container => {\n\t\t\tcontainer.querySelectorAll('.selected, .selected-top, .selected-bottom, .selected-left, .selected-right, .selected-start').forEach(el => {\n\t\t\t\tel.classList.remove('selected', 'selected-top', 'selected-bottom', 'selected-left', 'selected-right', 'selected-start');\n\t\t\t});\n\n\t\t\tcontainer.querySelectorAll('tr.selected-start').forEach(tr => {\n\t\t\t\ttr.classList.remove('selected-start');\n\t\t\t});\n\t\t});\n\n\t\tif (startRow < 0 || startCol < 0) return;\n\n\t\tcontainers.forEach((container) => {\n\t\t\tconst visibleTrs = Array.from(container.querySelectorAll('tbody tr')).filter(tr => {\n\t\t\t\treturn tr.style.display !== 'none';\n\t\t\t});\n\n\t\t\tvisibleTrs.forEach(tr => {\n\t\t\t\tconst { matrixRow } = this.#getMatrixRow(tr);\n\t\t\t\tif (matrixRow < 0) return;\n\n\n\t\t\t\tif (matrixRow >= startRow && matrixRow <= endRow) {\n\t\t\t\t\tcontainer.querySelectorAll(`tbody tr[data-index=\"${tr.dataset.index}\"]`).forEach(tr => {\n\t\t\t\t\t\ttr.classList.add('selected');\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t//trace.log(this.#sheet.view);\n\n\n\t\t\t\ttr.querySelectorAll('td, th').forEach(cell => {\n\t\t\t\t\tconst col = parseInt(cell.dataset.col, 10);\n\t\t\t\t\tif (isNaN(col)) return;\n\n\t\t\t\t\tconst rowSpan = parseInt(cell.rowSpan || 1, 10);\n\t\t\t\t\tconst colSpan = parseInt(cell.colSpan || 1, 10);\n\n\t\t\t\t\tconst cellEndRow = matrixRow + rowSpan - 1;\n\t\t\t\t\tconst cellEndCol = col + colSpan - 1;\n\n\t\t\t\t\tconst isSelected = cellEndRow >= startRow && matrixRow <= endRow && cellEndCol >= startCol && col <= endCol;\n\t\t\t\t\tif (!isSelected) return;\n\n\t\t\t\t\tcell.classList.add('selected');\n\n\t\t\t\t\tif (matrixRow <= startRow) cell.classList.add('selected-top');\n\t\t\t\t\tif (cellEndRow >= endRow) cell.classList.add('selected-bottom');\n\t\t\t\t\tif (col <= startCol) cell.classList.add('selected-left');\n\t\t\t\t\tif (cellEndCol >= endCol) cell.classList.add('selected-right');\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t#initEvents() {\n\t\tconst mainZone = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!mainZone) {\n\t\t\treturn;\n\t\t}\n\n\t\tmainZone.addEventListener('mousedown', (e) => {\n\t\t\tif (e.button !== 0) return;\n\n\t\t\tconst cell = e.target.closest('td, th');\n\t\t\tif (!cell) return;\n\t\t\tif (cell.dataset.row === undefined || cell.dataset.col === undefined) return;\n\n\t\t\tthis.#sheet.style.userSelect = 'none';\n\t\t\tthis.#sheet.style.webkitUserSelect = 'none';\n\n\t\t\tconst tr = cell.closest('tr');\n\t\t\tconst { matrixRow: startRow } = this.#getMatrixRow(tr);\n\t\t\tconst startCol = parseInt(cell.dataset.col, 10);\n\n\t\t\tif (startRow < 0) {\n\t\t\t\tthis.#sheet.style.userSelect = '';\n\t\t\t\tthis.#sheet.style.webkitUserSelect = '';\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.setFocus(startRow, startCol);\n\t\t\tthis.setRange(startRow, startCol, startRow, startCol);\n\n\t\t\tlet lastMatrixRow = startRow;\n\t\t\tlet lastCol = startCol;\n\n\t\t\tconst onMouseMove = (moveEvent) => {\n\t\t\t\tconst targetEl = document.elementFromPoint(moveEvent.clientX, moveEvent.clientY);\n\t\t\t\tlet targetCell = targetEl?.closest('td, th');\n\n\t\t\t\tif (!targetCell || !this.#sheet.contains(targetCell)) {\n\t\t\t\t\tconst allCells = this.#sheet.querySelectorAll('.ng-sheet-body-content tbody tr td, .ng-sheet-body-content tbody tr:not(.nodata) th');\n\t\t\t\t\tfor (const c of allCells) {\n\t\t\t\t\t\tconst rect = c.getBoundingClientRect();\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tmoveEvent.clientX >= rect.left &&\n\t\t\t\t\t\t\tmoveEvent.clientX <= rect.right &&\n\t\t\t\t\t\t\tmoveEvent.clientY >= rect.top &&\n\t\t\t\t\t\t\tmoveEvent.clientY <= rect.bottom\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\ttargetCell = c;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!targetCell) return;\n\t\t\t\tif (targetCell.dataset.row === undefined || targetCell.dataset.col === undefined) return;\n\n\t\t\t\tconst targetTr = targetCell.closest('tr');\n\t\t\t\tconst { matrixRow: endRow } = this.#getMatrixRow(targetTr);\n\t\t\t\tconst endCol = parseInt(targetCell.dataset.col, 10);\n\n\t\t\t\tif (endRow < 0) return;\n\t\t\t\tif (lastMatrixRow === endRow && lastCol === endCol) return;\n\n\t\t\t\tlastMatrixRow = endRow;\n\t\t\t\tlastCol = endCol;\n\n\t\t\t\tthis.setRange(startRow, startCol, endRow, endCol);\n\t\t\t};\n\n\t\t\tconst onMouseUp = () => {\n\t\t\t\tthis.#sheet.style.userSelect = '';\n\t\t\t\tthis.#sheet.style.webkitUserSelect = '';\n\n\t\t\t\tdocument.removeEventListener('mousemove', onMouseMove);\n\t\t\t\tdocument.removeEventListener('mouseup', onMouseUp);\n\t\t\t};\n\n\t\t\tdocument.addEventListener('mousemove', onMouseMove);\n\t\t\tdocument.addEventListener('mouseup', onMouseUp);\n\t\t});\n\t}\n}","import { trace } from \"@nopeer\";\n\nexport class CellNavigation {\n\t#sheet;\n\t#host;\n\n\t#currentCell = null;\n\t#currentTr = null;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.#initEvents();\n\t}\n\n\tget currentCell() {\n\t\treturn this.#currentCell;\n\t}\n\n\tset currentCell(cell) {\n\t\tif (!cell) return;\n\n\t\tthis.#currentCell = cell;\n\t\tcell.focus({ preventScroll: true });\n\n\t\tthis.#currentTr = cell.closest(\"tr\");\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tthis.#sheet.selection.setFocus(matrixRow, this.#currentCell.dataset.col);\n\t}\n\n\n\t#moveCellH = (e, cell) => {\n\n\t\tif (!cell) return;\n\n\t\tswitch (e.code) {\n\t\t\tcase \"Tab\":\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\tif (!this.#isCellLeftVisible(cell)) {\n\t\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (!this.#isCellRightVisible(cell)) {\n\t\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tif (!this.#isCellRightVisible(cell) || !this.#isCellLeftVisible(cell)) {\n\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tif (!this.#isCellLeftVisible(cell)) {\n\t\t\t\t\tcell.scrollIntoView({ inline: 'nearest', block: 'nearest' });\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.currentCell = cell;\n\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, cell.dataset.col, this.#currentTr.dataset.matrixRow, cell.dataset.col);\n\t};\n\n\t#moveCellV = (e, cell) => {\n\t\tif (cell) {\n\t\t\tlet isVisible = false;\n\t\t\tswitch (e.code) {\n\t\t\t\tcase \"Enter\":\n\t\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowDown\":\n\t\t\t\t\tif (this.#isCellBelowVisible(cell)) {\n\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"ArrowUp\":\n\t\t\t\t\tif (this.#isCellAboveVisible(cell)) {\n\t\t\t\t\t\tisVisible = true;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (isVisible) {\n\t\t\t\tthis.currentCell = cell;\n\t\t\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, cell.dataset.col, this.#currentTr.dataset.matrixRow, cell.dataset.col);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tlet scrollTopIndex = -1;\n\t\tswitch (e.code) {\n\t\t\tcase \"Enter\":\n\t\t\t\tif (e.shiftKey) {\n\t\t\t\t\tconst visibleRowCount = this.#getVisibleRowCount();\n\t\t\t\t\tscrollTopIndex = Math.max(dataIndex - visibleRowCount + 0, 0);\n\t\t\t\t} else {\n\t\t\t\t\tscrollTopIndex = Math.min(dataIndex, this.#sheet.view.count());\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tscrollTopIndex = Math.min(dataIndex, this.#sheet.view.count());\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tconst visibleRowCount = this.#getVisibleRowCount();\n\t\t\t\tscrollTopIndex = Math.max(dataIndex - visibleRowCount + 0, 0);\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (scrollTopIndex < 0) return;\n\n\t\tlet matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst rowSpan = parseInt(this.#currentCell.rowSpan, 10) || 1;\n\n\t\tswitch (e.code) {\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tmatrixRow += rowSpan;\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tmatrixRow --;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tthis.#sheet.rowManager.scrollToDataRow(scrollTopIndex, null, () => {\n\t\t\tconst currentCell = this.#findCell(matrixRow, col);\n\n\t\t\tif (currentCell) {\n\t\t\t\tthis.currentCell = currentCell;\n\t\t\t\tthis.#sheet.selection.setRange(this.#currentTr.dataset.matrixRow, currentCell.dataset.col, this.#currentTr.dataset.matrixRow, currentCell.dataset.col);\n\t\t\t}\n\t\t});\n\t}\n\n\tmoveCell = (e) => {\n\n\t\tif (e.target.tagName === \"INPUT\") {\n\t\t\tif ([\"text\"].includes(e.target.type)) {\n\t\t\t\tif ([\"ArrowLeft\",\"ArrowRight\",\"Home\",\"End\"].includes(e.code)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ([\"date\",\"datetime-local\",\"time\",\"week\",\"month\"].includes(e.target.type)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.#currentCell || !this.#currentTr) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet nextCell;\n\t\tswitch (e.code) {\n\t\t\tcase \"Tab\":\n\t\t\t\tnextCell = e.shiftKey ? this.#getPreviousCell() : this.#getNextCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowRight\":\n\t\t\t\tnextCell = this.#getNextCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowLeft\":\n\t\t\t\tnextCell = this.#getPreviousCell();\n\t\t\t\tbreak;\n\t\t\tcase \"Enter\":\n\t\t\t\tnextCell = e.shiftKey ? this.#getUpCell() : this.#getDownCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tnextCell = this.#getDownCell();\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowUp\":\n\t\t\t\tnextCell = this.#getUpCell();\n\t\t\t\tbreak;\n\t\t}\n\n\t\te.preventDefault();\n\n\t\tif ([\"ArrowLeft\",\"ArrowRight\",\"Tab\"].includes(e.code)) {\n\t\t\tthis.#moveCellH(e, nextCell);\n\t\t}\n\t\telse if ([\"Enter\",\"ArrowUp\",\"ArrowDown\"].includes(e.code)) {\n\t\t\tthis.#moveCellV(e, nextCell);\n\t\t}\n\t}\n\n\t#getNextCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst colSpan = parseInt(this.#currentCell.colSpan, 10) || 1;\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tconst nextCol = col + colSpan;\n\n\t\tlet nextCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${nextCol}\"]`);\n\t\tif (!nextCell) {\n\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${nextCol}\"]`);\n\t\t}\n\n\t\treturn nextCell;\n\t}\n\n\t#getPreviousCell = () => {\n\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst dataIndex = parseInt(this.#currentTr.dataset.index, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\tlet nextCell;\n\t\tfor (let i = col - 1; i >= 0; i--) {\n\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${i}\"]`);\n\t\t\tif (!nextCell) {\n\t\t\t\tnextCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${i}\"]`);\n\t\t\t}\n\n\t\t\tif (nextCell) break;\n\t\t}\n\n\t\treturn nextCell;\n\t}\n\n\n\n\t#findCell = (matrixRow, col) => {\n\n\t\tconst $tr = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"]`);\n\t\tif (!$tr) return;\n\n\t\tconst dataIndex = parseInt($tr.dataset.index, 10);\n\n\t\tlet targetCell = this.#sheet.querySelector(`tbody tr[data-matrix-row=\"${matrixRow}\"] td[data-col=\"${col}\"]`);\n\t\tif (!targetCell) {\n\t\t\tthis.#sheet.querySelectorAll(`tbody tr[data-matrix-row=\"${matrixRow}\"] td`).forEach($cell => {\n\t\t\t\tconst cellCol = parseInt($cell.dataset.col, 10);\n\t\t\t\tconst colSpan = parseInt($cell.colSpan, 10) || 1;\n\n\t\t\t\tif (col >= cellCol && col < cellCol + colSpan) {\n\t\t\t\t\ttargetCell = $cell;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tif (!targetCell) {\n\t\t\t\ttargetCell = this.#sheet.querySelector(`tbody tr[data-index=\"${dataIndex}\"] td[data-col=\"${col}\"]`);\n\n\t\t\t\tif (!targetCell) {\n\t\t\t\t\tthis.#sheet.querySelectorAll(`tbody tr[data-index=\"${dataIndex}\"] td`).forEach($cell => {\n\t\t\t\t\t\tconst cellCol = parseInt($cell.dataset.col, 10);\n\t\t\t\t\t\tconst colSpan = parseInt($cell.colSpan, 10) || 1;\n\n\t\t\t\t\t\tif (col >= cellCol && col < cellCol + colSpan) {\n\t\t\t\t\t\t\ttargetCell = $cell;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn targetCell;\n\t}\n\n\t#getUpCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\n\t\treturn this.#findCell(matrixRow - 1, col);\n\t}\n\n\t#getDownCell = () => {\n\t\tconst col = parseInt(this.#currentCell.dataset.col, 10);\n\t\tconst matrixRow = parseInt(this.#currentTr.dataset.matrixRow, 10);\n\t\tconst rowSpan = parseInt(this.#currentCell.rowSpan, 10) || 1;\n\n\t\treturn this.#findCell(matrixRow + rowSpan, col);\n\t}\n\n\t// 1. ์œ„์ชฝ ์ž˜๋ฆผ ์ฒดํฌ (๊ธฐ์ค€: bodyViewport)\n\t#isCellAboveVisible = (cell) => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!bodyViewport || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport.getBoundingClientRect();\n\t\tconst theadHeight = bodyViewport.querySelector('thead')?.offsetHeight || 0;\n\n\t\t// ์…€์˜ ์ƒ๋‹จ์ด ํ—ค๋” ์•„๋ž˜์ชฝ๋ณด๋‹ค ์œ„์— ์žˆ์œผ๋ฉด ์ž˜๋ฆฐ(์•ˆ ๋ณด์ด๋Š”) ์ƒํƒœ\n\t\treturn cellRect.top >= (viewportRect.top + theadHeight);\n\t}\n\n\t// 2. ์•„๋ž˜์ชฝ ์ž˜๋ฆผ ์ฒดํฌ (๊ธฐ์ค€: bodyViewport)\n\t#isCellBelowVisible = (cell) => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tif (!bodyViewport || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport.getBoundingClientRect();\n\n\t\t// ์…€์˜ ํ•˜๋‹จ์ด ๋ทฐํฌํŠธ ํ•˜๋‹จ๋ณด๋‹ค ์•„๋ž˜์— ์žˆ์œผ๋ฉด ์ž˜๋ฆฐ ์ƒํƒœ\n\t\treturn cellRect.bottom <= viewportRect.bottom;\n\t}\n\n\t// 3. ์™ผ์ชฝ ์ž˜๋ฆผ ์ฒดํฌ (๊ธฐ์ค€: bodyViewport2)\n\t#isCellLeftVisible = (cell) => {\n\t\tconst bodyViewport2 = this.#sheet.querySelector('.ng-container-body'); // ๋˜๋Š” ์ขŒ์šฐ ์Šคํฌ๋กค์„ ๋‹ด๋‹นํ•˜๋Š” ๋ทฐํฌํŠธ\n\t\tif (!bodyViewport2 || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport2.getBoundingClientRect();\n\n\t\t// ์…€์˜ ์ขŒ์ธก์ด ๋ทฐํฌํŠธ ์ขŒ์ธก๋ณด๋‹ค ์™ผ์ชฝ์— ์žˆ์œผ๋ฉด ์ž˜๋ฆฐ ์ƒํƒœ\n\t\treturn cellRect.left >= viewportRect.left;\n\t}\n\n\t// 4. ์˜ค๋ฅธ์ชฝ ์ž˜๋ฆผ ์ฒดํฌ (๊ธฐ์ค€: bodyViewport2)\n\t#isCellRightVisible = (cell) => {\n\t\tconst bodyViewport2 = this.#sheet.querySelector('.ng-container-body');\n\t\tif (!bodyViewport2 || !cell) return true;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst viewportRect = bodyViewport2.getBoundingClientRect();\n\n\t\t// ์…€์˜ ์šฐ์ธก์ด ๋ทฐํฌํŠธ ์šฐ์ธก๋ณด๋‹ค ์˜ค๋ฅธ์ชฝ์— ์žˆ์œผ๋ฉด ์ž˜๋ฆฐ ์ƒํƒœ\n\t\treturn cellRect.right <= viewportRect.right;\n\t}\n\n\t// ๐Ÿ’ก ํ•„์š”ํ•˜๋‹ค๋ฉด ์ด 4๊ฐœ๋ฅผ ์กฐํ•ฉํ•ด์„œ ์ „์ฒด ๊ฐ€์‹œ์„ฑ์„ ํŒ๋‹จํ•˜๋Š” ํ†ตํ•ฉ ํ•จ์ˆ˜๋„ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\n\t#isCellVisible = (cell) => {\n\t\treturn this.#isCellAboveVisible(cell) &&\n\t\t\tthis.#isCellBelowVisible(cell) &&\n\t\t\tthis.#isCellLeftVisible(cell) &&\n\t\t\tthis.#isCellRightVisible(cell);\n\t}\n\n\t#getVisibleRowCount = () => {\n\t\tconst bodyViewport = this.#sheet.querySelector('.ng-sheet-body');\n\t\tconst viewportHeight = bodyViewport.clientHeight - (bodyViewport.querySelector('thead')?.offsetHeight || 0);\n\t\tconst rowHeight = this.#sheet.rowManager.getRowHeight();\n\n\t\t// ๋ทฐํฌํŠธ ๋†’์ด์— ๋“ค์–ด์˜ค๋Š” ํ–‰ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ (์†Œ์ˆ˜์  ๋ฒ„๋ฆผ)\n\t\treturn Math.max(1, Math.floor(viewportHeight / rowHeight));\n\t}\n\n\t#initEvents() {\n\t\tthis.#sheet.addEventListener('mousedown', (e) => {\n\t\t\tif (e.button !== 0) return;\n\t\t\tconst cell = e.target.closest('td, th');\n\t\t\tif (!cell) return;\n\t\t\tif (cell.dataset.index === undefined || cell.dataset.col === undefined) return;\n\n\t\t\tif (cell.querySelector(\"cell-row-indicator\")) {\n\t\t\t\tthis.#sheet.row.focus(cell.dataset.index);\n\t\t\t} else {\n\t\t\t\tthis.currentCell = cell;\n\t\t\t}\n\t\t});\n\n\t\tthis.#sheet.addEventListener('keydown', (e) => {\n\n\t\t\tconst cell = e.target.closest('td,th');\n\t\t\tif (!cell || !this.#sheet.contains(cell)) return;\n\n\t\t\tif (this.#host.tagName === 'NINE-TABLE-SIMPLE') {\n\t\t\t\tif ([\"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(e.code)) {\n\t\t\t\t\tthis.moveCell(e);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif ([\"Enter\", \"Tab\", \"ArrowUp\", \"ArrowDown\", \"ArrowLeft\", \"ArrowRight\"].includes(e.code)) {\n\t\t\t\t\tthis.moveCell(e);\n\t\t\t\t} else if ([\"Space\"].includes(e.code)) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}","// ui/col/ColResizer.js\nimport { trace } from \"@nopeer\";\nimport { COLLAPSED_WIDTH } from \"@/layout/core/TableCompiler.js\";\n\nconst RESIZE_OFFSET = 2; // ๐ŸŽฏ ๋ฆฌ์‚ฌ์ด์ฆˆ ๊ฐ์ง€ ์˜์—ญ ์˜คํ”„์…‹์„ ์ƒ๋‹จ์œผ๋กœ ์ถ”์ถœ\n\nexport class ColResizer {\n #sheet;\n #host;\n #panel;\n #tooltip;\n\n #targetColIndex = null;\n #nextColIndex = null;\n #targetContainerType = null;\n #targetCell = null;\n #startX = 0;\n #startColWidth = 0;\n #nextColStartWidth = 0;\n #startCellWidth = 0;\n #startLeft = 0;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#host = sheet.getRootNode().host;\n this.#panel = this.#sheet.querySelector('nine-table-col-resizer-panel');\n\n this.#tooltip = this.#panel.querySelector('.resizer-overlay');\n this.bindEvents();\n }\n\n destroy() {\n this.#sheet.removeEventListener('pointermove', this.#onPointerMove);\n this.#sheet.removeEventListener('pointerdown', this.#onPointerDown);\n this.#sheet.removeEventListener('dblclick', this.#onDblClick);\n }\n\n refreshLayout(containerType = 'body') {\n const containers = Array.from(this.#sheet.querySelectorAll(`.ng-container-${containerType}`));\n if (containers.length === 0) return;\n\n const isFixedContainer = containerType === 'left' || containerType === 'right';\n const isAutoFit = !isFixedContainer && (\n this.#sheet.isAutoFitCol ||\n containers[0].querySelector('table')?.getAttribute('auto-fit-col') === 'true'\n );\n\n if (!isAutoFit) {\n\n const firstColgroup = containers[0].querySelector('table colgroup');\n if (!firstColgroup) return;\n\n let totalWidth = 0;\n const colWidths = {};\n\n Array.from(firstColgroup.querySelectorAll('col')).forEach(col => {\n const colIdx = col.getAttribute('data-col');\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) {\n colWidths[colIdx] = w;\n totalWidth += w;\n }\n });\n\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n\n if (containerType === 'body') {\n tables.forEach(tbl => {\n tbl.style.width = `${totalWidth}px`;\n //tbl.style.minWidth = `${totalWidth}px`;\n });\n } else {\n container.style.flex = `0 0 ${totalWidth}px`;\n container.style.width = `${totalWidth}px`;\n container.style.minWidth = `${totalWidth}px`;\n container.style.maxWidth = `${totalWidth}px`;\n\n tables.forEach(tbl => {\n tbl.style.width = `${totalWidth}px`;\n tbl.style.minWidth = `${totalWidth}px`;\n tbl.style.maxWidth = `${totalWidth}px`;\n\n Object.entries(colWidths).forEach(([colIdx, w]) => {\n tbl.querySelectorAll(`th[data-col=\"${colIdx}\"], td[data-col=\"${colIdx}\"]`).forEach(cell => {\n //cell.style.width = `${w}px`;\n //cell.style.minWidth = `${w}px`;\n //cell.style.maxWidth = `${w}px`;\n });\n });\n });\n }\n });\n } else {\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n tables.forEach(tbl => {\n //tbl.style.width = '100%';\n //tbl.style.minWidth = '100%';\n //tbl.style.maxWidth = '';\n });\n });\n }\n\n this.#sheet.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n setColumnWidth(globalColIndex, width, containerType = null) {\n\n let targetCols = [];\n\n targetCols = Array.from(this.#sheet.querySelectorAll(`table colgroup col[data-col=\"${globalColIndex}\"]`));\n\n if (targetCols.length === 0) return;\n\n const firstContainer = targetCols[0].closest('.ng-container-left, .ng-container-body, .ng-container-right');\n const resolvedContainerType = containerType || (\n firstContainer?.classList.contains('ng-container-left') ? 'left' :\n firstContainer?.classList.contains('ng-container-right') ? 'right' : 'body'\n );\n\n targetCols.forEach(col => {\n col.setAttribute('width', width);\n col.style.width = `${width}px`;\n });\n\n const sourceCol = this.#sheet.sourceTable?.querySelector(`colgroup col[data-col=\"${globalColIndex}\"]`);\n if (sourceCol) {\n sourceCol.setAttribute('width', width);\n sourceCol.style.width = `${width}px`;\n }\n\n this.refreshLayout(resolvedContainerType);\n\n if (resolvedContainerType === 'left' || resolvedContainerType === 'right') {\n this.refreshLayout('body');\n }\n\n this.#sheet.rowManager?.refresh();\n }\n\n #checkIsAutoFit(targetCell) {\n if (this.#sheet.isAutoFitCol) return true;\n const table = targetCell?.closest('table');\n if (table && table.getAttribute('auto-fit-col') === 'true') return true;\n return false;\n }\n\n bindEvents() {\n this.#sheet.addEventListener('pointermove', this.#onPointerMove);\n //this.#sheet.addEventListener('pointerdown', this.#onPointerDown);\n //this.#sheet.addEventListener('dblclick', this.#onDblClick);\n\n this.#sheet.addDebounseEventListener('dblclick', this.#onDblClick, 'pointerdown', this.#onPointerDown);\n }\n\n #getContainerType(cell) {\n const container = cell.closest('.ng-container-left, .ng-container-body, .ng-container-right');\n if (!container) return null;\n if (container.classList.contains('ng-container-left')) return 'left';\n if (container.classList.contains('ng-container-right')) return 'right';\n return 'body';\n }\n\n #onPointerMove = (e) => {\n\n\n const headerPart = e.target.closest('thead');\n if (!headerPart) return;\n\n const cell = e.target.closest('th, td');\n\n headerPart.querySelectorAll('.resizable-edge').forEach(el => {\n if (el !== cell) el.classList.remove('resizable-edge');\n });\n\n if (!cell || cell.dataset.col === undefined) return;\n if (cell.getAttribute('collapsed') === 'true') return;\n\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n const isLeftEdge = offsetX <= RESIZE_OFFSET;\n const isRightEdge = (rect.width - offsetX) <= RESIZE_OFFSET;\n\n if (isLeftEdge) {\n const prevCell = cell.previousElementSibling;\n if (!prevCell || prevCell.getAttribute('collapsed') === 'true') {\n cell.classList.remove('resizable-edge');\n return;\n }\n }\n\n if (isLeftEdge || isRightEdge) {\n cell.classList.add('resizable-edge');\n } else {\n cell.classList.remove('resizable-edge');\n }\n };\n\n #onPointerDown = (e) => {\n\n const headerPart = e.actualTarget.closest('thead');\n if (!headerPart) return;\n\n const cell = e.actualTarget.closest('th, td');\n\n if (!cell || !cell.classList.contains('resizable-edge')) return;\n\n\n\n e.preventDefault();\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n\n let targetCell = cell;\n\n if (offsetX <= RESIZE_OFFSET) {\n const prevCell = cell.previousElementSibling;\n if (prevCell && prevCell.dataset.col !== undefined && prevCell.getAttribute('collapsed') !== 'true') {\n targetCell = prevCell;\n } else if (!cell.previousElementSibling) {\n return;\n }\n }\n\n this.#targetCell = targetCell;\n this.#targetContainerType = this.#getContainerType(targetCell);\n\n const container = this.#sheet.querySelector(`.ng-container-${this.#targetContainerType}`);\n if (!container) return;\n\n const baseColIndex = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n this.#targetColIndex = baseColIndex + colSpan - 1;\n\n const isAutoFit = this.#checkIsAutoFit(targetCell);\n if (isAutoFit) {\n this.#nextColIndex = this.#targetColIndex + 1;\n const nextColEl = container.querySelector(`col[data-col=\"${this.#nextColIndex}\"]`);\n if (nextColEl) {\n this.#nextColStartWidth = parseInt(nextColEl.getAttribute('width'), 10) || 100;\n } else {\n this.#nextColIndex = null;\n }\n } else {\n this.#nextColIndex = null;\n }\n\n const targetRect = targetCell.getBoundingClientRect();\n const sheetRect = this.#sheet.getBoundingClientRect();\n\n this.#startCellWidth = targetRect.width;\n this.#startLeft = targetRect.left - sheetRect.left;\n\n const targetColEl = container.querySelector(`col[data-col=\"${this.#targetColIndex}\"]`);\n const attrW = targetColEl?.getAttribute('width');\n this.#startColWidth = (attrW && !isNaN(parseInt(attrW, 10))) ? parseInt(attrW, 10) : targetRect.width / colSpan;\n\n this.#startX = e.clientX;\n\n if (this.#panel) {\n this.#panel.classList.add('active');\n this.#updatePositions(e.clientX);\n }\n\n window.addEventListener('pointermove', this.#onDragMove);\n window.addEventListener('pointerup', this.#onDragEnd, { once: true });\n };\n\n #updatePositions(clientX) {\n let diff = clientX - this.#startX;\n const isAutoFit = this.#checkIsAutoFit(this.#targetCell);\n\n if (isAutoFit && this.#nextColIndex !== null) {\n const maxDiff = this.#nextColStartWidth - COLLAPSED_WIDTH;\n const minDiff = -(this.#startColWidth - COLLAPSED_WIDTH);\n diff = Math.max(minDiff, Math.min(diff, maxDiff));\n }\n\n const currentColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n\n const targetRect = this.#targetCell.getBoundingClientRect();\n let realCellWidth = clientX - targetRect.left;\n\n if (isAutoFit && this.#nextColIndex !== null) {\n const maxCellWidth = this.#startCellWidth + (this.#nextColStartWidth - COLLAPSED_WIDTH);\n realCellWidth = Math.min(realCellWidth, maxCellWidth);\n }\n\n const currentCellWidth = Math.max(COLLAPSED_WIDTH, realCellWidth);\n\n if (this.#panel) {\n this.#panel.style.setProperty('--col-resizer-tooltip-left', `${this.#startLeft}px`);\n this.#panel.style.setProperty('--col-resizer-tooltip-width', `${currentCellWidth}px`);\n }\n\n const sizeBadge = this.#tooltip?.querySelector('.size-badge');\n if (sizeBadge) {\n sizeBadge.textContent = `${Math.round(currentColWidth)}px`;\n }\n }\n\n #onDragMove = (e) => {\n this.#updatePositions(e.clientX);\n };\n\n #onDragEnd = (e) => {\n window.removeEventListener('pointermove', this.#onDragMove);\n\n const diff = e.clientX - this.#startX;\n const isAutoFit = this.#checkIsAutoFit(this.#targetCell);\n let finalWidth = 0;\n\n if (isAutoFit && this.#nextColIndex !== null) {\n let newColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n let newNextWidth = this.#startColWidth + this.#nextColStartWidth - newColWidth;\n\n if (newNextWidth < COLLAPSED_WIDTH) {\n newNextWidth = COLLAPSED_WIDTH;\n newColWidth = this.#startColWidth + this.#nextColStartWidth - COLLAPSED_WIDTH;\n }\n\n this.setColumnWidth(this.#targetColIndex, newColWidth, this.#targetContainerType);\n this.setColumnWidth(this.#nextColIndex, newNextWidth, this.#targetContainerType);\n finalWidth = newColWidth;\n } else {\n const newColWidth = Math.max(COLLAPSED_WIDTH, this.#startColWidth + diff);\n if (this.#targetColIndex !== null && this.#targetContainerType) {\n this.setColumnWidth(this.#targetColIndex, newColWidth, this.#targetContainerType);\n finalWidth = newColWidth;\n }\n }\n\n if (this.#targetCell) {\n const targetCell = this.#targetCell;\n if (targetCell.getAttribute('collapsed') !== 'true' && finalWidth > 20) {\n targetCell.dataset.expandWidth = String(finalWidth);\n }\n }\n\n if (this.#panel) {\n this.#tooltip?.classList.add('fade-out');\n setTimeout(() => {\n this.#panel.classList.remove('active');\n this.#tooltip?.classList.remove('fade-out');\n }, 150);\n }\n\n this.#targetColIndex = null;\n this.#nextColIndex = null;\n this.#targetContainerType = null;\n this.#targetCell = null;\n };\n\n #onDblClick = (e) => {\n\n const targetEl = e.target;\n let cell = targetEl.closest('th, td');\n if (!cell || !cell.classList.contains('resizable-edge')) return;\n\n const rect = cell.getBoundingClientRect();\n const offsetX = e.clientX - rect.left;\n\n if (offsetX <= RESIZE_OFFSET) {\n cell = cell.previousElementSibling;\n }\n\n const baseColIndex = parseInt(cell.dataset.col, 10);\n const tbodyCell = this.#sheet.querySelector(`tbody.body [data-col=\"${baseColIndex}\"]`);\n if (!tbodyCell || !tbodyCell.dataset.bind || tbodyCell.classList.contains(\"CELL-RADIO\")) return;\n\n let extraPadding = 0;\n Array.from(tbodyCell.firstElementChild.children).forEach(($el) => {\n switch ($el.tagName) {\n case 'SPAN': extraPadding += 8; break;\n case 'DIV': extraPadding += 8; break;\n case 'BUTTON': extraPadding += 32; break;\n case 'SELECT': extraPadding += 32; break;\n case 'INPUT':\n switch (($el.type || 'text').toLowerCase()) {\n // 1. ์ฒดํฌ๋ฐ•์Šค / ๋ผ๋””์˜ค (๋น„๊ต์  ์ข์€ ์˜์—ญ)\n case 'checkbox':\n case 'radio':\n extraPadding += 12;\n break;\n\n // 2. ๋ฒ„ํŠผ ๊ณ„์—ด input\n case 'button':\n case 'submit':\n case 'reset':\n case 'image':\n extraPadding += 16;\n break;\n\n // 3. ํŠน์ˆ˜ ์œ„์ ฏ (์ปฌ๋Ÿฌ, ํŒŒ์ผ, ์Šฌ๋ผ์ด๋”)\n case 'color':\n case 'file':\n case 'range':\n extraPadding += 24;\n break;\n\n // 4. ํ™”๋ฉด์— ์•ˆ ๋ณด์ด๋Š” hidden ํ•„๋“œ\n case 'hidden':\n extraPadding += 0;\n break;\n\n // 5. ํ…์ŠคํŠธ ๋ฐ ์ˆซ์ž, ๋‚ ์งœ ๋“ฑ ์ผ๋ฐ˜ ์ž…๋ ฅ ํ•„๋“œ (๊ธฐ๋ณธ๊ฐ’)\n case 'text':\n case 'search':\n case 'tel':\n case 'url':\n case 'email':\n case 'password':\n case 'number':\n case 'date':\n case 'time':\n case 'datetime-local':\n case 'month':\n case 'week':\n default:\n extraPadding += 16;\n break;\n }\n break;\n }\n });\n\n const fieldIdx = this.#host.fields.get().indexOf(tbodyCell.dataset.bind);\n\n const computedStyle = window.getComputedStyle(tbodyCell);\n const font = computedStyle.font || '12px sans-serif';\n\n const headerText = cell.innerText || \"\";\n const headerSize = nine.measureTextSize(headerText, font);\n let maxTextWidth = (headerSize.width || 0) + 16;\n\n this.#host.execute(() => {\n\n this.#sheet.view.getArray().forEach((record, idx) => {\n const val = String(tbodyCell.dataset.expr ? this.#host.exprEngine.evaluate(tbodyCell.dataset.expr, record, idx) : record.v[fieldIdx] ?? \"\").trim();\n const size = nine.measureTextSize(val, font);\n if (size.width && size.width > maxTextWidth) {\n maxTextWidth = size.width;\n }\n });\n\n const calculatedWidth = Math.max(32, Math.min(400, Math.ceil(maxTextWidth) + extraPadding));\n\n this.setColumnWidth(tbodyCell.dataset.col, calculatedWidth, this.#getContainerType(cell));\n })\n };\n}\n\n\nexport class ColResizerPanel extends HTMLElement {\n #target;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n this.#renderer();\n }\n\n #renderer = () => {\n this.innerHTML = `\n <div class=\"resizer-overlay\">\n <span class=\"size-badge\">0px</span>\n </div>\n `;\n };\n}\n\nif (!customElements.get('nine-table-col-resizer-panel')) {\n customElements.define(\"nine-table-col-resizer-panel\", ColResizerPanel);\n}\n","// ui/col/ColMover.js\nimport { trace } from \"@nopeer\";\n\nexport class ColMover {\n #sheet;\n #grip;\n #indi;\n\n #isDragging = false;\n #sourceCell = null;\n #sourceColIndex = null;\n #targetColIndex = null;\n #shiftX = 0;\n #timer = null;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#grip = this.#sheet.querySelector('.ng-col-mover-grip');\n this.#indi = this.#sheet.querySelector('.ng-col-mover-indi');\n this.bindEvents();\n }\n\n bindEvents() {\n this.#sheet.addEventListener('pointerdown', this.#onPointerDown);\n }\n\n #checkIsMovable() {\n const host = this.#sheet.getRootNode()?.host;\n return this.#sheet.getAttribute('col-movable') === 'true' || host?.getAttribute('col-movable') === 'true';\n }\n\n #getDeepElementFromPoint(x, y) {\n const root = this.#sheet.getRootNode();\n let el = root.elementFromPoint ? root.elementFromPoint(x, y) : document.elementFromPoint(x, y);\n\n while (el && el.shadowRoot && el.shadowRoot.elementFromPoint) {\n const nested = el.shadowRoot.elementFromPoint(x, y);\n if (!nested || nested === el) break;\n el = nested;\n }\n\n return el;\n }\n\n #getColGroupRange(cell) {\n if (!cell || cell.dataset.col === undefined) return null;\n\n const startCol = parseInt(cell.dataset.col, 10);\n const colSpan = cell.colSpan || 1;\n const endCol = startCol + colSpan - 1;\n const rowIndex = cell.closest('tr')?.sectionRowIndex ?? 0;\n\n const table = cell.closest('table');\n if (!table) return { startCol, colSpan, endCol, rowIndex, isGroup: false, parentGroupRange: null, isValidGroup: true };\n\n const headerCells = table.querySelectorAll('thead th, thead td');\n let hasStrictChildren = false;\n let isValidGroup = true;\n let parentGroupRange = null;\n\n for (const subCell of headerCells) {\n if (subCell === cell || subCell.dataset.col === undefined) continue;\n\n const subStart = parseInt(subCell.dataset.col, 10);\n const subSpan = subCell.colSpan || 1;\n const subEnd = subStart + subSpan - 1;\n const subRowIndex = subCell.closest('tr')?.sectionRowIndex ?? 0;\n\n if (subRowIndex < rowIndex && subStart <= startCol && subEnd >= endCol && subSpan > colSpan) {\n if (!parentGroupRange) {\n parentGroupRange = { startCol: subStart, endCol: subEnd };\n } else {\n parentGroupRange.startCol = Math.max(parentGroupRange.startCol, subStart);\n parentGroupRange.endCol = Math.min(parentGroupRange.endCol, subEnd);\n }\n }\n\n const isOverlap = !(subEnd < startCol || subStart > endCol);\n if (isOverlap) {\n const isFullyContained = (subStart >= startCol && subEnd <= endCol);\n\n if (isFullyContained) {\n if (subSpan < colSpan) {\n hasStrictChildren = true;\n }\n } else if (subStart < startCol || subEnd > endCol) {\n if (!(subStart <= startCol && subEnd >= endCol)) {\n isValidGroup = false;\n }\n }\n }\n }\n\n const isRealGroup = hasStrictChildren && isValidGroup;\n\n return {\n startCol,\n colSpan: isRealGroup ? colSpan : 1,\n endCol: isRealGroup ? endCol : startCol,\n rowIndex,\n isGroup: isRealGroup,\n parentGroupRange,\n isValidGroup\n };\n }\n\n #createGroupHeaderPreview(cell) {\n const groupRange = this.#getColGroupRange(cell);\n if (!groupRange) return null;\n\n const { startCol, endCol, isGroup } = groupRange;\n\n // ํ•ต์‹ฌ: ํ…Œ์ด๋ธ”์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ตฌ์กฐ์ด๋ฏ€๋กœ cell์ด ์†ํ•œ ๋ฐ”๋กœ ๊ทธ ํ…Œ์ด๋ธ”์„ ์ง์ ‘ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.\n const origTable = cell.closest('table');\n if (!origTable) return null;\n\n let minLeft = Infinity, maxRight = -Infinity, minTop = Infinity, maxBottom = -Infinity;\n const targetCells = [];\n\n origTable.querySelectorAll('thead th, thead td').forEach(c => {\n if (c.dataset.col === undefined) return;\n const cCol = parseInt(c.dataset.col, 10);\n const cSpan = c.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n\n const isTarget = isGroup\n ? (cCol >= startCol && cEnd <= endCol)\n : (c === cell);\n\n if (isTarget) {\n const rect = c.getBoundingClientRect();\n minLeft = Math.min(minLeft, rect.left);\n maxRight = Math.max(maxRight, rect.right);\n minTop = Math.min(minTop, rect.top);\n maxBottom = Math.max(maxBottom, rect.bottom);\n\n const computedStyle = window.getComputedStyle(c);\n targetCells.push({ el: c, rect, style: computedStyle });\n }\n });\n\n if (targetCells.length === 0) return null;\n\n const groupWidth = maxRight - minLeft;\n const groupHeight = maxBottom - minTop;\n\n const headerContent = document.createElement('div');\n headerContent.className = 'grip-header-content';\n headerContent.style.position = 'relative';\n headerContent.style.width = `${groupWidth}px`;\n headerContent.style.height = `${groupHeight}px`;\n\n targetCells.forEach(({ el, rect, style }) => {\n const clonedCell = el.cloneNode(true);\n\n clonedCell.style.position = 'absolute';\n clonedCell.style.left = `${rect.left - minLeft}px`;\n clonedCell.style.top = `${rect.top - minTop}px`;\n\n clonedCell.style.width = `${rect.width}px`;\n clonedCell.style.minWidth = `${rect.width}px`;\n clonedCell.style.maxWidth = 'none';\n\n clonedCell.style.height = `${rect.height}px`;\n clonedCell.style.boxSizing = 'border-box';\n clonedCell.style.margin = '0';\n\n clonedCell.style.backgroundColor = style.backgroundColor !== 'transparent' && style.backgroundColor !== 'rgba(0, 0, 0, 0)'\n ? style.backgroundColor\n : '#f9fafb';\n clonedCell.style.color = style.color;\n clonedCell.style.font = style.font;\n clonedCell.style.fontWeight = style.fontWeight;\n clonedCell.style.fontSize = style.fontSize;\n clonedCell.style.textAlign = style.textAlign;\n clonedCell.style.padding = style.padding;\n clonedCell.style.border = style.border;\n clonedCell.style.borderRight = style.borderRight;\n clonedCell.style.borderBottom = style.borderBottom;\n clonedCell.style.display = 'flex';\n clonedCell.style.alignItems = 'center';\n clonedCell.style.justifyContent = style.textAlign === 'center' ? 'center' : (style.textAlign === 'right' ? 'flex-end' : 'flex-start');\n\n headerContent.appendChild(clonedCell);\n });\n\n return {\n element: headerContent,\n bounds: {\n left: minLeft,\n right: maxRight,\n top: minTop,\n bottom: maxBottom,\n width: groupWidth,\n height: groupHeight\n }\n };\n }\n\n #onPointerDown = (e) => {\n if (!this.#checkIsMovable()) return;\n\n const headerPart = e.target.closest('.ng-sheet-header');\n if (!headerPart) return;\n\n const cell = e.target.closest('th, td');\n if (!cell || cell.classList.contains('resizable-edge') || ['INPUT', 'BUTTON'].includes(e.target.tagName)) return;\n if (cell.dataset.col === undefined) return;\n\n e.preventDefault();\n\n const startX = e.clientX;\n const startY = e.clientY;\n\n const cancelTimer = () => {\n if (this.#timer) {\n clearTimeout(this.#timer);\n this.#timer = null;\n }\n window.removeEventListener('pointermove', onPointerMovePending);\n window.removeEventListener('pointerup', cancelTimer);\n window.removeEventListener('pointercancel', cancelTimer);\n };\n\n const onPointerMovePending = (moveEvent) => {\n const dist = Math.hypot(moveEvent.clientX - startX, moveEvent.clientY - startY);\n if (dist > 5) {\n cancelTimer();\n }\n };\n\n this.#timer = setTimeout(() => {\n cancelTimer();\n this.#startDrag(e, cell);\n }, 500);\n\n window.addEventListener('pointermove', onPointerMovePending);\n window.addEventListener('pointerup', cancelTimer, { once: true });\n window.addEventListener('pointercancel', cancelTimer, { once: true });\n };\n\n #startDrag(e, cell) {\n if (this.#isDragging) return;\n\n const preview = this.#createGroupHeaderPreview(cell);\n if (!preview) return;\n\n this.#isDragging = true;\n this.#sourceCell = cell;\n this.#sourceColIndex = parseInt(cell.dataset.col, 10);\n\n const sheetRect = this.#sheet.getBoundingClientRect();\n const { bounds, element } = preview;\n\n this.#shiftX = e.clientX - bounds.left;\n\n if (this.#grip) {\n this.#grip.replaceChildren(element);\n\n const relativeTop = bounds.top - sheetRect.top;\n const fullHeight = sheetRect.height - relativeTop;\n\n this.#grip.style.width = `${bounds.width}px`;\n this.#grip.style.height = `${fullHeight}px`;\n this.#grip.style.top = `${relativeTop}px`;\n this.#grip.style.display = 'block';\n\n this.#updateGripPosition(e.clientX);\n }\n\n document.body.style.cursor = 'move';\n\n window.addEventListener('pointermove', this.#onPointerMove);\n window.addEventListener('pointerup', this.#onPointerUp, { once: true });\n }\n\n #onPointerMove = (e) => {\n if (!this.#isDragging) return;\n\n this.#updateGripPosition(e.clientX);\n\n if (this.#grip) this.#grip.style.pointerEvents = 'none';\n if (this.#indi) this.#indi.style.pointerEvents = 'none';\n\n const targetElement = this.#getDeepElementFromPoint(e.clientX, e.clientY);\n const targetCell = targetElement?.closest('.ng-sheet-header th, .ng-sheet-header td');\n\n if (targetCell && targetCell.dataset.col !== undefined) {\n const targetColIndex = parseInt(targetCell.dataset.col, 10);\n const sheetRect = this.#sheet.getBoundingClientRect();\n const table = targetCell.closest('table');\n\n let colMinLeft = Infinity;\n let colMaxRight = -Infinity;\n\n if (table) {\n table.querySelectorAll('thead th, thead td').forEach(c => {\n if (c.dataset.col === undefined) return;\n const cCol = parseInt(c.dataset.col, 10);\n const cSpan = c.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n\n if (cCol <= targetColIndex && cEnd >= targetColIndex) {\n const cRect = c.getBoundingClientRect();\n colMinLeft = Math.min(colMinLeft, cRect.left);\n colMaxRight = Math.max(colMaxRight, cRect.right);\n }\n });\n }\n\n if (colMinLeft === Infinity) {\n const rect = targetCell.getBoundingClientRect();\n colMinLeft = rect.left;\n colMaxRight = rect.right;\n }\n\n const midX = colMinLeft + ((colMaxRight - colMinLeft) / 2);\n let calculatedTargetCol = 0;\n let indicatorLeft = 0;\n\n if (e.clientX < midX) {\n calculatedTargetCol = targetColIndex;\n indicatorLeft = colMinLeft - sheetRect.left;\n } else {\n const colSpan = targetCell.colSpan || 1;\n calculatedTargetCol = targetColIndex + colSpan;\n indicatorLeft = colMaxRight - sheetRect.left;\n }\n\n const sourceGroup = this.#getColGroupRange(this.#sourceCell);\n const movingSpan = sourceGroup.colSpan;\n\n const sourceRowStart = sourceGroup.rowIndex;\n const sourceRowSpan = this.#sourceCell.rowSpan || 1;\n const sourceRowEnd = sourceRowStart + sourceRowSpan - 1;\n\n const targetRowStart = targetCell.closest('tr')?.sectionRowIndex ?? 0;\n const targetRowSpan = targetCell.rowSpan || 1;\n const targetRowEnd = targetRowStart + targetRowSpan - 1;\n\n const isRowSpanCompatible = !(sourceRowEnd < targetRowStart || sourceRowStart > targetRowEnd);\n\n let isOutOfBoundsOfParent = false;\n if (sourceGroup.parentGroupRange) {\n const { startCol: pStart, endCol: pEnd } = sourceGroup.parentGroupRange;\n if (calculatedTargetCol < pStart || (calculatedTargetCol + movingSpan - 1) > pEnd) {\n isOutOfBoundsOfParent = true;\n }\n }\n\n let isDroppingInsideOtherGroup = false;\n if (table) {\n const spannedCells = table.querySelectorAll('thead th[colspan], thead td[colspan]');\n\n for (const sCell of spannedCells) {\n if (sCell === this.#sourceCell) continue;\n\n const sRowStart = sCell.closest('tr')?.sectionRowIndex ?? 0;\n const sRowSpan = sCell.rowSpan || 1;\n const sRowEnd = sRowStart + sRowSpan - 1;\n\n const isVerticalOverlap = !(sourceRowEnd < sRowStart || sourceRowStart > sRowEnd);\n if (!isVerticalOverlap) continue;\n\n const sStart = parseInt(sCell.dataset.col, 10);\n const sSpan = sCell.colSpan || 1;\n const sEnd = sStart + sSpan - 1;\n\n if (calculatedTargetCol > sStart && calculatedTargetCol < sEnd + 1) {\n isDroppingInsideOtherGroup = true;\n break;\n }\n\n const moveEndCol = calculatedTargetCol + movingSpan - 1;\n const isCrossIntersecting = (\n (calculatedTargetCol > sStart && calculatedTargetCol <= sEnd && moveEndCol > sEnd) ||\n (calculatedTargetCol < sStart && moveEndCol >= sStart && moveEndCol < sEnd)\n );\n\n if (isCrossIntersecting) {\n isDroppingInsideOtherGroup = true;\n break;\n }\n }\n }\n\n const isSelfGroup = (\n calculatedTargetCol >= sourceGroup.startCol &&\n calculatedTargetCol <= sourceGroup.endCol + 1\n );\n\n const isInvalidMove = !isRowSpanCompatible || isSelfGroup || isOutOfBoundsOfParent || isDroppingInsideOtherGroup || !sourceGroup.isValidGroup;\n\n if (isInvalidMove) {\n this.#targetColIndex = null;\n if (this.#indi) this.#indi.style.display = 'none';\n if (this.#grip) this.#grip.classList.add('invalid');\n } else {\n this.#targetColIndex = calculatedTargetCol;\n if (this.#grip) this.#grip.classList.remove('invalid');\n\n if (this.#indi) {\n const headerPart = targetCell.closest('.ng-sheet-header');\n const headerRect = headerPart.getBoundingClientRect();\n const relativeTop = headerRect.top - sheetRect.top;\n const fullHeight = sheetRect.height - relativeTop;\n\n this.#indi.style.top = `${relativeTop}px`;\n this.#indi.style.height = `${fullHeight}px`;\n this.#indi.style.left = `${indicatorLeft - 1}px`;\n this.#indi.style.display = 'block';\n }\n }\n } else {\n if (this.#indi) this.#indi.style.display = 'none';\n if (this.#grip) this.#grip.classList.add('invalid');\n this.#targetColIndex = null;\n }\n };\n\n #updateGripPosition(clientX) {\n if (!this.#grip) return;\n const sheetRect = this.#sheet.getBoundingClientRect();\n const left = clientX - sheetRect.left - this.#shiftX;\n this.#grip.style.left = `${left}px`;\n }\n\n #onPointerUp = (e) => {\n if (!this.#isDragging) return;\n\n window.removeEventListener('pointermove', this.#onPointerMove);\n document.body.style.cursor = '';\n\n if (this.#grip) {\n this.#grip.style.display = 'none';\n this.#grip.replaceChildren();\n }\n if (this.#indi) this.#indi.style.display = 'none';\n\n if (\n this.#targetColIndex !== null &&\n this.#sourceColIndex !== null &&\n this.#targetColIndex !== this.#sourceColIndex &&\n this.#targetColIndex !== this.#sourceColIndex + 1\n ) {\n this.moveColumn(this.#sourceColIndex, this.#targetColIndex);\n }\n\n this.#isDragging = false;\n this.#sourceCell = null;\n this.#sourceColIndex = null;\n this.#targetColIndex = null;\n };\n\n moveColumn(fromColIndex, toColIndex) {\n\n const colgroup = this.#sheet.sourceTable.querySelector('colgroup');\n const targetCol = colgroup.querySelector(`col[data-col=\"${toColIndex}\"]`);\n\n const sourceGroup = this.#getColGroupRange(this.#sourceCell);\n if (!sourceGroup || !sourceGroup.isValidGroup) return;\n\n const spanCount = sourceGroup.colSpan;\n const isInRange = (idx) => idx >= fromColIndex && idx < fromColIndex + spanCount;\n\n // 1. colgroup ๋‚ด <col> ์ด๋™ ๋ฐ fixed ์„ค์ •\n const targetViewportCol = this.#sheet.querySelector(`.ng-sheet-body-content col[data-col=\"${toColIndex}\"]`);\n const fixedType = targetViewportCol?.closest('.ng-container-left') ? 'left' : targetViewportCol?.closest('.ng-container-right') ? 'right' : null;\n\n colgroup.querySelectorAll('col').forEach(col => {\n if (isInRange(parseInt(col.getAttribute('data-col'), 10))) {\n fixedType ? col.setAttribute('fixed', fixedType) : col.removeAttribute('fixed');\n colgroup.insertBefore(col, targetCol);\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n this.#sheet.sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n const cells = Array.from(tr.children);\n const targetRowCell = cells.find(c => parseInt(c.dataset.col, 10) >= toColIndex);\n\n cells.forEach(cell => {\n if (isInRange(parseInt(cell.dataset.col, 10))) {\n tr.insertBefore(cell, targetRowCell || null);\n }\n });\n });\n });\n\n this.#sheet.recompileAndRefresh();\n }\n\n destroy() {\n this.#sheet.removeEventListener('pointerdown', this.#onPointerDown);\n }\n}","// ui/col/ColFixManager.js\nimport { trace } from \"@nopeer\";\n\nexport class ColFixManager {\n #sheet;\n\n constructor(sheet) {\n this.#sheet = sheet;\n }\n\n getFixState(targetCell, table) {\n if (!targetCell || !table) return 'none';\n\n const container = targetCell.closest('.ng-container-left, .ng-container-right, .ng-container-body');\n if (container?.classList.contains('ng-container-left')) return 'left';\n if (container?.classList.contains('ng-container-right')) return 'right';\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n if (!isNaN(baseCol)) {\n const colEl = table.querySelector(`colgroup col[data-col=\"${baseCol}\"]`);\n const fixedAttr = colEl?.getAttribute('fixed');\n if (fixedAttr) return fixedAttr;\n }\n\n return 'none';\n }\n\n canFixColumn(targetCell, table) {\n if (!targetCell || targetCell.tagName !== 'TH' || !table) return false;\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n if (isNaN(baseCol)) return false;\n\n const targetBoundaryCol = baseCol + colSpan - 1;\n const theadTrs = Array.from(table.querySelectorAll('thead tr'));\n\n if (theadTrs.length <= 1) return true;\n\n for (const tr of theadTrs) {\n const cells = Array.from(tr.querySelectorAll('th, td'));\n let cellBoundaryFound = false;\n\n for (const cell of cells) {\n const cCol = parseInt(cell.dataset.col, 10);\n const cSpan = cell.colSpan || 1;\n const cEndCol = cCol + cSpan - 1;\n\n if (cCol <= targetBoundaryCol && targetBoundaryCol < cEndCol) {\n return false;\n }\n\n if (cEndCol === targetBoundaryCol) {\n cellBoundaryFound = true;\n break;\n }\n }\n\n if (!cellBoundaryFound) return false;\n }\n\n return true;\n }\n\n executeFixToggle(action, targetCell, fixType = 'left') {\n if (!this.#sheet || !targetCell) return;\n\n const sourceTable = this.#sheet.sourceTable;\n if (!sourceTable) return;\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const colSpan = targetCell.colSpan || 1;\n const targetColIndex = baseCol + colSpan - 1;\n\n if (isNaN(targetColIndex)) return;\n\n const colgroup = sourceTable.querySelector('colgroup');\n if (!colgroup) return;\n\n const cols = Array.from(colgroup.querySelectorAll('col'));\n\n if (action === 'fix-column') {\n cols.forEach(col => {\n const idx = parseInt(col.getAttribute('data-col'), 10);\n if (idx <= targetColIndex) {\n col.setAttribute('fixed', fixType);\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n Array.from(tr.children).forEach(cell => {\n const cIdx = parseInt(cell.dataset.col, 10);\n if (!isNaN(cIdx) && cIdx <= targetColIndex) {\n cell.setAttribute('fixed', fixType);\n }\n });\n });\n });\n\n } else if (action === 'unfix-column') {\n let minBaseCol = baseCol;\n let maxEndCol = baseCol + colSpan - 1;\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach((tr, rIdx) => {\n Array.from(tr.children).forEach(cell => {\n const cCol = parseInt(cell.dataset.col, 10);\n const cSpan = cell.colSpan || 1;\n const cEnd = cCol + cSpan - 1;\n const rSpan = cell.rowSpan || 1;\n const trIndex = tr.sectionRowIndex ?? rIdx;\n\n const isVerticalOverlap = !(trIndex + rSpan - 1 < cell.closest('tr').sectionRowIndex || trIndex > (cell.closest('tr').sectionRowIndex + rSpan - 1));\n\n const isHorizontalOverlap = !(cEnd < baseCol || cCol > targetColIndex);\n\n if (isHorizontalOverlap) {\n minBaseCol = Math.min(minBaseCol, cCol);\n maxEndCol = Math.max(maxEndCol, cEnd);\n }\n });\n });\n });\n\n cols.forEach(col => {\n const idx = parseInt(col.getAttribute('data-col'), 10);\n if (idx >= minBaseCol) {\n col.removeAttribute('fixed');\n }\n });\n\n let isBroken = false;\n cols.forEach(col => {\n if (isBroken) {\n col.removeAttribute('fixed');\n } else if (!col.getAttribute('fixed')) {\n isBroken = true;\n }\n });\n\n ['thead', 'tbody', 'tfoot'].forEach(group => {\n sourceTable.querySelectorAll(`${group} tr`).forEach(tr => {\n Array.from(tr.children).forEach(cell => {\n const cIdx = parseInt(cell.dataset.col, 10);\n if (isNaN(cIdx)) return;\n\n const correspondingCol = cols.find(c => parseInt(c.getAttribute('data-col'), 10) === cIdx);\n const isColFixed = correspondingCol?.getAttribute('fixed');\n\n if (isColFixed) {\n cell.setAttribute('fixed', isColFixed);\n } else {\n cell.removeAttribute('fixed');\n }\n });\n });\n });\n }\n\n this.#sheet.recompileAndRefresh?.();\n }\n}","import { NINE_TABLE } from '@/core/constants.js';\nimport { trace } from \"@nopeer\";\n\nexport class NineTableFilterPanel extends HTMLElement {\n\t#sheet;\n\t#host;\n\t#nineTable;\n\t#view;\n\t#button;\n\tcurrentCol = null;\n\n\tconnectedCallback() {\n\t\tthis.#init();\n\t\tdocument.addEventListener(\"mousedown\", this.#closeHandler);\n\t}\n\n\t#init = () => {\n\t\t//setTimeout(() => {\n\t\t\tthis.#renderer();\n\n\t\t\tthis.#sheet = this.closest(\"nine-table-sheet\");\n\t\t\tthis.#host = this.getRootNode().host;\n\n\t\t\tthis.#nineTable = this.querySelector(\"nine-table-simple\");\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.#view = this.#nineTable.shadowRoot.querySelector(\"nine-table-sheet\");\n\t\t\t})\n\n\n\t\t\tthis.querySelector(\".search-box\").addEventListener(\"focusin\", (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t});\n\t\t\tthis.querySelector(\".search-box\").addEventListener(\"input\", this.#onInput);\n\t\t\tthis.querySelector(\"#chkSelectAll\").addEventListener(\"change\", this.#onSelectAll);\n\t\t\tthis.querySelector(\"#btnOk\").addEventListener(\"click\", this.#onOk);\n\t\t//});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" class=\"search-box\" placeholder=\"Search...\">\n \n <nine-table-simple class=\"filter-list\" theme=\"simple\">\n <table auto-fit-col=\"true\">\n <colgroup>\n <col width=\"32\" fixed=\"left\" />\n <col width=\"180\" />\n <col width=\"0\" fixed=\"right\"/>\n </colgroup>\n <tbody>\n <tr>\n <td cell-type=\"checkbox\" data-bind=\"CHK\"></td>\n <td data-bind=\"DATA2\" html=\"true\"></td>\n <td data-bind=\"DATA\"></td>\n </tr>\n </tbody>\n </table>\n </nine-table-simple>\n\n <div class=\"footer-section\">\n <div class=\"footer-btns\">\n <label><input type=\"checkbox\" id=\"chkSelectAll\" checked> Select All</label>\n <div class=\"btn-group\">\n <button id=\"btnOk\">Apply</button>\n </div>\n </div>\n </div>\n `;\n\t}\n\n\topen(filterBtn) {\n\t\tthis.#button = filterBtn;\n\n\t\tconst cell = filterBtn.closest(\"th, td\");\n\t\tthis.currentCol = cell?.dataset.col;\n\n\t\tconst cellRect = cell.getBoundingClientRect();\n\t\tconst sheetRect = this.#sheet.getBoundingClientRect();\n\n\t\tconst panelWidth = this.offsetWidth || 240;\n\t\tlet left = (cellRect.right - sheetRect.left) - panelWidth;\n\t\tlet top = cellRect.bottom - sheetRect.top;\n\n\t\tif (left < 0) {\n\t\t\tleft = Math.max(0, cellRect.left - sheetRect.left);\n\t\t}\n\n\t\tthis.style.left = `${left}px`;\n\t\tthis.style.top = `${top}px`;\n\n\t\tconst searchBox = this.querySelector(\".search-box\");\n\t\tsearchBox.value = \"\";\n\n\n\t\tthis.classList.add(\"active\");\n\t\tthis.classList.add(\"loading\");\n\n\t\tsetTimeout(() => {\n\t\t\ttry {\n\t\t\t\tthis.#loadVirtualFilterItems();\n\t\t\t\tthis.#view.rowManager.scrollToDataRow(0);\n\t\t\t\tsearchBox.focus();\n\t\t\t} finally {\n\t\t\t\tthis.classList.remove(\"loading\");\n\t\t\t}\n\t\t});\n\t}\n\n\t#closeHandler = (e) => {\n\t\tconst path = e.composedPath ? e.composedPath() : [];\n\t\tif (path.includes(this) || (this.#button && path.includes(this.#button))) {\n\t\t\treturn;\n\t\t}\n\t\tthis.close();\n\t};\n\n\tclose() {\n\t\tthis.currentCol = null;\n\t\tthis.classList.remove(\"active\");\n\t\tthis.#button = null;\n\t}\n\n\t#loadVirtualFilterItems() {\n\t\tconst filteredRecords = this.#host.data.getArray();\n\t\tconst targetCols = this.#button?.columns || []; // [{ bind, expr }] ํ˜•ํƒœ ๋ฐฐ์—ด\n\t\tconst fields = this.#host.fields.get() || [];\n\t\tconst activeFilters = this.#sheet.filtering?.filters || {};\n\t\tconst exprEngine = this.#host.exprEngine;\n\n\t\tconst ds = targetCols.flatMap((colInfo) => {\n\t\t\tconst bindKey = colInfo.bind;\n\t\t\tconst exprKey = colInfo.expr;\n\n\t\t\tconst filterKey = bindKey || exprKey; // ์‹ค์ œ ํ•„ํ„ฐ ํŒŒ๋ผ๋ฏธํ„ฐ ํ‚ค๋กœ ์‚ฌ์šฉ\n\t\t\tconst fieldIdx = bindKey ? fields.indexOf(bindKey) : -1;\n\t\t\tconst activeSelectedVals = activeFilters[filterKey] || [];\n\n\t\t\tconst uniqueMap = new Map();\n\t\t\tfor (let i = 0; i < filteredRecords.length; i++) {\n\t\t\t\tconst record = filteredRecords[i];\n\t\t\t\tif (!record) continue;\n\n\t\t\t\tlet rawVal = undefined;\n\t\t\t\tif (fieldIdx >= 0 && record.v) {\n\t\t\t\t\trawVal = record.v[fieldIdx];\n\t\t\t\t} else if (bindKey && bindKey.includes(\"data.\")) {\n\t\t\t\t\trawVal = exprEngine ? exprEngine.evaluate(bindKey, record, i) : undefined;\n\t\t\t\t} else if (exprKey && exprEngine) {\n\t\t\t\t\trawVal = exprEngine.evaluate(exprKey, record, i);\n\t\t\t\t}\n\n\t\t\t\tlet displayVal = rawVal;\n\t\t\t\tif (exprKey && exprEngine) {\n\t\t\t\t\tdisplayVal = exprEngine.evaluate(exprKey, record, i);\n\t\t\t\t}\n\n\t\t\t\tif (displayVal !== undefined && displayVal !== null && !uniqueMap.has(displayVal)) {\n\t\t\t\t\tuniqueMap.set(displayVal, {\n\t\t\t\t\t\tv: rawVal, // ๐Ÿ’ก ํ•„ํ„ฐ๋ง ๋น„๊ต ๊ธฐ์ค€ (DATA)\n\t\t\t\t\t\tv2: displayVal // ๐Ÿ’ก ํ™”๋ฉด ์ถœ๋ ฅ ๊ธฐ์ค€ (DATA2)\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst uniqueList = [...uniqueMap.values()];\n\n\t\t\tuniqueList.sort((a, b) => {\n\t\t\t\tconst valA = a.v2;\n\t\t\t\tconst valB = b.v2;\n\n\t\t\t\tif (valA === valB) return 0;\n\t\t\t\tif (valA === undefined || valA === null || valA === '') return 1;\n\t\t\t\tif (valB === undefined || valB === null || valB === '') return -1;\n\n\t\t\t\tconst numA = Number(valA);\n\t\t\t\tconst numB = Number(valB);\n\n\t\t\t\tconst isNumA = !isNaN(numA);\n\t\t\t\tconst isNumB = !isNaN(numB);\n\n\t\t\t\tif (isNumA && isNumB) {\n\t\t\t\t\treturn numA - numB;\n\t\t\t\t}\n\n\t\t\t\treturn String(valA).localeCompare(String(valB));\n\t\t\t});\n\t\t\tactiveSelectedVals.sort((a, b) => { return a > b ? 1 : -1; });\n\n\t\t\treturn uniqueList.map(o => ({\n\t\t\t\tLVL: 2,\n\t\t\t\tDATA: o.v, // ํ•„ํ„ฐ๋ง ๋น„๊ต์šฉ ๊ฐ’\n\t\t\t\tDATA2: (o.v2 === \"\" || o.v2 === null || o.v2 === undefined) ? '<span class=\"empty-value\">(empty)</span>' : o.v2,\n\t\t\t\tCOLNM: filterKey,\n\t\t\t\tCHK: activeSelectedVals.length === 0 || activeSelectedVals.nineBinarySearch(o.v) >= 0 ? \"Y\" : \"N\"\n\t\t\t}));\n\t\t});\n\n\t\tthis.#nineTable.data.set(ds);\n\n\t\tconst selectAllChk = this.querySelector(\"#chkSelectAll\");\n\t\tif (selectAllChk) {\n\t\t\tselectAllChk.checked = ds.length > 0 && ds.every(item => item.CHK === \"Y\");\n\t\t}\n\t}\n\n\t#onOk = () => {\n\t\tthis.#host.loading = true;\n\n\t\tconst filterRecords = this.#view.view.getArray();\n\t\tconst fields = this.#nineTable.data.getHostFields();\n\n\t\tconst checkedRecords = filterRecords.filter(record => {\n\t\t\tconst chk = record.v[fields.indexOf(\"CHK\")];\n\t\t\treturn (chk === \"Y\" || chk === true);\n\t\t});\n\n\t\tconst filterParams = { ...(this.#sheet.filtering?.filters || {}) };\n\n\t\tthis.#button.columns.forEach(colInfo => {\n\t\t\tconst filterKey = colInfo.expr || colInfo.bind;\n\t\t\tconst fieldIdx = colInfo.expr ? fields.indexOf(\"DATA2\") : fields.indexOf(\"DATA\");\n\t\t\tconst selectedVals = checkedRecords.map(r => r.v[fieldIdx]);\n\n\t\t\tif (selectedVals.length > 0) {\n\t\t\t\tfilterParams[filterKey] = selectedVals;\n\t\t\t} else {\n\t\t\t\tdelete filterParams[filterKey];\n\t\t\t}\n\t\t});\n\n\t\tconst totalCount = this.#nineTable.data.count();\n\n\t\tsetTimeout(() => {\n\t\t\ttry {\n\t\t\t\tif (totalCount === checkedRecords.length) {\n\t\t\t\t\tthis.#button.columns.forEach(colInfo => {\n\t\t\t\t\t\tconst filterKey = colInfo.expr || colInfo.bind;\n\t\t\t\t\t\tif (filterKey) this.#sheet.filtering.clear(filterKey);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.#sheet.filtering.set(filterParams);\n\t\t\t\t}\n\n\t\t\t\tthis.#sheet.querySelectorAll(\"nine-table-filter-button\").forEach(btn => {\n\t\t\t\t\tbtn.updateFilteredState();\n\t\t\t\t});\n\n\t\t\t\tthis.#sheet.invalidate();\n\t\t\t\tthis.close();\n\t\t\t} finally {\n\t\t\t\tthis.#host.loading = false;\n\t\t\t}\n\t\t});\n\t};\n\n\t#onInput = (e) => {\n\n\t\tconst query = e.target.value.toLowerCase().trim();\n\n\t\tif (!query) {\n\t\t\tthis.#view.filtering.clear();\n\t\t} else {\n\t\t\tconst rawRecords = this.#nineTable.data.getArray();\n\t\t\tconst fields = this.#nineTable.data.getHostFields();\n\t\t\tconst data2Idx = fields.indexOf(\"DATA2\");\n\n\t\t\tconst matchedValues = [];\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tconst val = data2Idx >= 0 && record.v ? record.v[data2Idx] : \"\";\n\t\t\t\tconst textVal = String(val).replace(/<[^>]*>?/gm, '').toLowerCase();\n\n\t\t\t\tif (textVal.includes(query)) {\n\t\t\t\t\tmatchedValues.push(val);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.#view.filtering.set({\n\t\t\t\tDATA2: [...new Set(matchedValues)]\n\t\t\t});\n\t\t}\n\t};\n\n\t#onSelectAll = (e) => {\n\t\tconst isChecked = e.target.checked;\n\t\tconst rawRecords = this.#nineTable?.data?.getArray() || [];\n\t\tconst fields = this.#nineTable.data.getHostFields();\n\t\tconst chkIdx = fields.indexOf(\"CHK\");\n\n\t\tif (chkIdx >= 0) {\n\t\t\trawRecords.forEach(record => {\n\t\t\t\trecord.v[chkIdx] = isChecked ? \"Y\" : \"N\";\n\t\t\t});\n\t\t}\n\n\t\tthis.#nineTable.refresh();\n\t};\n\n\t#onCancel = () => {\n\t\tthis.close();\n\t};\n}\n\nexport class NineTableFilterButton extends HTMLElement {\n\t#sheet;\n\t#columns = null;\n\n\tconnectedCallback() {\n\t\tthis.#sheet = this.closest(\"nine-table-sheet\") || this.getRootNode().host;\n\t\tthis.removeEventListener(\"click\", this.#onClick);\n\t\tthis.addEventListener(\"click\", this.#onClick);\n\t}\n\n\tget columns() {\n\t\tif (this.#columns) return this.#columns;\n\n\t\tconst cell = this.closest(\"th, td\");\n\t\tconst colIndex = cell?.dataset.col;\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\n\t\tconst cols = [];\n\t\tconst seen = new Set();\n\n\t\tif (sourceTable && colIndex !== undefined) {\n\t\t\tsourceTable.querySelectorAll(`tbody [data-col=\"${colIndex}\"]`).forEach($td => {\n\t\t\t\tconst bindKey = $td.dataset.bind;\n\t\t\t\tconst exprKey = $td.dataset.expr;\n\n\t\t\t\tif (bindKey || exprKey) {\n\t\t\t\t\tconst uniqueKey = `${bindKey || ''}_${exprKey || ''}`;\n\t\t\t\t\tif (!seen.has(uniqueKey)) {\n\t\t\t\t\t\tseen.add(uniqueKey);\n\t\t\t\t\t\tcols.push({\n\t\t\t\t\t\t\tbind: bindKey,\n\t\t\t\t\t\t\texpr: exprKey,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.#columns = cols;\n\t\treturn this.#columns;\n\t}\n\n\tupdateFilteredState = () => {\n\t\tconst activeFilters = this.#sheet.filtering?.filters || {};\n\t\tconst isFiltered = this.columns.some(colInfo => {\n\t\t\tconst key = colInfo.expr || colInfo.bind;\n\t\t\treturn key && activeFilters[key] && activeFilters[key].length > 0;\n\t\t});\n\t\tthis.classList.toggle('filtered', isFiltered);\n\t};\n\n\t#onClick = (e) => {\n\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tconst panel = this.#sheet.querySelector(\"nine-table-filter-panel\");\n\t\tconst cell = this.closest(\"th, td\");\n\t\tconst col = cell.dataset.col;\n\n\t\tif (panel && panel.currentCol === col && panel.classList.contains('active')) {\n\t\t\tpanel.close();\n\t\t} else if (panel) {\n\t\t\tpanel.open(this);\n\t\t}\n\t};\n}\n\nexport class Filtering {\n\t#sheet;\n\t#host;\n\t#isFiltering = false;\n\t#filterPanel = null;\n\t#filters = {};\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = this.#sheet.getRootNode().host;\n\t\tthis.#init();\n\t}\n\n\tget filters() {\n\t\treturn this.#filters;\n\t};\n\n\t#init = () => {\n\t\tthis.#initFilterPanel();\n\t}\n\n\t#initFilterPanel = () => {\n\t\tif (this.#host.tagName.toLowerCase() === \"nine-table-simple\") {\n\t\t\treturn;\n\t\t}\n\n\t\tlet panel = this.#sheet.querySelector(\"nine-table-filter-panel\");\n\t\tif (!panel) {\n\t\t\tpanel = document.createElement(\"nine-table-filter-panel\");\n\t\t\tthis.#sheet.appendChild(panel);\n\t\t}\n\t\tthis.#filterPanel = panel;\n\t}\n\n\tisFiltering() {\n\t\treturn this.#isFiltering;\n\t}\n\n\tclear = (colnm) => {\n\t\tif (colnm) {\n\t\t\tdelete this.#filters[colnm];\n\t\t} else {\n\t\t\tthis.#filters = {};\n\t\t}\n\n\t\tthis.#isFiltering = Object.keys(this.#filters).length > 0;\n\t\tthis.#applyFiltering();\n\n\t\tthis.#sheet.querySelectorAll(\"nine-table-filter-button\").forEach(btn => {\n\t\t\tbtn.updateFilteredState();\n\t\t});\n\t}\n\n\tset = (oFilter) => {\n\n\t\tlet jsonFilter = Array.isArray(oFilter)\n\t\t\t? Object.fromEntries(Object.keys(oFilter[0]).map(k => [k, [...new Set(oFilter.map(item => item[k]))]]))\n\t\t\t: oFilter;\n\n\t\tthis.#filters = jsonFilter;\n\t\tthis.#isFiltering = Object.keys(jsonFilter).length > 0;\n\t\tthis.#sheet.toggleAttribute(\"filtering\", this.#isFiltering);\n\n\t\tthis.#applyFiltering();\n\t}\n\n\t#applyFiltering() {\n\t\tconst hostData = this.#host.data;\n\t\tconst rawRecords = hostData.getArray();\n\t\tconst fields = this.#host.data.getHostFields();\n\t\tconst sheetIndex = this.#sheet.index;\n\t\tconst exprEngine = this.#host.exprEngine;\n\n\t\tconst hasFilters = Object.keys(this.#filters).length > 0;\n\n\t\tif (!hasFilters) {\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tif (record?.m?._?.[NINE_TABLE.META.INDEX.FILTER]) {\n\t\t\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER][sheetIndex] = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.#sheet.invalidate();\n\t\t\treturn;\n\t\t}\n\n\t\tconst filterRules = Object.entries(this.#filters).map(([targetKey, allowedValues]) => {\n\t\t\tconst isExpr = targetKey.includes(\"data.\") || targetKey.includes(\"host.\") || targetKey.includes(\"rowItem.v\");\n\t\t\treturn {\n\t\t\t\ttargetKey,\n\t\t\t\tisExpr,\n\t\t\t\tfieldIdx: !isExpr ? fields.indexOf(targetKey) : -1,\n\t\t\t\tallowedSet: new Set(allowedValues)\n\t\t\t};\n\t\t});\n\n\t\trawRecords.forEach((record, recordIdx) => {\n\t\t\tif (!record) return;\n\n\t\t\tif (!record.m._[NINE_TABLE.META.INDEX.FILTER]) {\n\t\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER] = [];\n\t\t\t}\n\n\t\t\tlet isPass = true;\n\n\t\t\tfor (let i = 0; i < filterRules.length; i++) {\n\t\t\t\tconst { targetKey, isExpr, fieldIdx, allowedSet } = filterRules[i];\n\t\t\t\tlet val = undefined;\n\n\t\t\t\tif (isExpr && exprEngine) {\n\t\t\t\t\tval = exprEngine.evaluate(targetKey, record, recordIdx);\n\t\t\t\t} else if (fieldIdx >= 0 && record.v) {\n\t\t\t\t\tval = record.v[fieldIdx];\n\t\t\t\t}\n\n\t\t\t\tif (!allowedSet.has(val)) {\n\t\t\t\t\tisPass = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trecord.m._[NINE_TABLE.META.INDEX.FILTER][sheetIndex] = isPass;\n\t\t});\n\n\t\tthis.#sheet.selection.clear();\n\n\t\tthis.#sheet.invalidate();\n\t}\n}\n\nif (!customElements.get('nine-table-filter-panel')) {\n\tcustomElements.define(\"nine-table-filter-panel\", NineTableFilterPanel);\n}\n\nif (!customElements.get('nine-table-filter-button')) {\n\tcustomElements.define(\"nine-table-filter-button\", NineTableFilterButton);\n}","// ui/data/Sorting.js (๋˜๋Š” ์ •๋ ฌ ๊ด€๋ จ ์†Œ์Šค)\nimport { trace } from \"@nopeer\";\n\nexport class Sorting {\n\t#sheet;\n\t#host;\n\n\t#columns = [];\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tsetTimeout(() => {\n\t\t\tthis.#initEvents();\n\t\t}, 300);\n\t}\n\n\t#initEvents() {\n\n\t\tthis.#sheet.querySelectorAll(\"thead\").forEach($el => {\n\n\t\t\t$el.addEventListener('dblclick', (e) => {\n\n\t\t\t\tconst cell = e.target.closest('th, td');\n\t\t\t\tif (!cell || cell.classList.contains('resizable-edge')) return;\n\n\t\t\t\tif ([\"INPUT\",\"CELL-CHECKBOX\"].includes(e.target.tagName)) return;\n\n\t\t\t\tif (e.offsetX <= 2 || e.offsetX >= cell.offsetWidth - 2) return;\n\n\t\t\t\tconst host = this.#sheet.getRootNode().host;\n\n\t\t\t\thost.loading = true;\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.#handleSort(e, cell);\n\t\t\t\t\t} finally {\n\t\t\t\t\t\thost.loading = false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\t#handleSort(e, cell) {\n\t\tconst colIndex = cell.dataset.col;\n\t\tconst tr = cell.closest('tr');\n\t\tconst subRowIndex = tr ? tr.dataset.subrow || String(tr.sectionRowIndex) : '0';\n\n\t\tif (colIndex === undefined) return;\n\n\t\tconst sourceTable = this.#sheet.sourceTable;\n\t\tif (!sourceTable) return;\n\n\t\tlet colName = null;\n\t\tlet exprVal = null;\n\n\t\tsourceTable.querySelectorAll(`tbody [data-col=\"${colIndex}\"]`).forEach($td => {\n\t\t\tif ($td.dataset.bind) {\n\t\t\t\tcolName = $td.dataset.bind;\n\t\t\t}\n\n\t\t\tif ($td.dataset.expr) {\n\t\t\t\texprVal = $td.dataset.expr;\n\t\t\t}\n\t\t});\n\n\t\tif (!colName && !exprVal) return;\n\n\t\tconst isAsc = cell.classList.contains('asc');\n\t\tconst isDesc = cell.classList.contains('desc');\n\n\t\tif (!e.ctrlKey && !e.shiftKey) {\n\t\t\tthis.#columns = [];\n\t\t}\n\n\t\tconst existingColIndex = this.#columns.findIndex(\n\t\t\tm => (m.colIndex === colIndex && m.subRowIndex === subRowIndex) || m.colName === colName\n\t\t);\n\n\t\tconst ruleData = {\n\t\t\tcolIndex,\n\t\t\tsubRowIndex,\n\t\t\tcolname: colName || exprVal,\n\t\t\tcolName: colName || exprVal,\n\t\t\texpr: exprVal, // ๐Ÿ’ก expr ๊ทœ์น™ ๋ณด๊ด€\n\t\t\tasc: true,\n\t\t\t\"expr-func\": exprVal ? (record, idx) => this.#host.exprEngine(exprVal, record, idx) : null\n\t\t};\n\n\t\tif (!isAsc && !isDesc) {\n\t\t\tif (existingColIndex >= 0) {\n\t\t\t\tthis.#columns[existingColIndex].asc = true;\n\t\t\t} else {\n\t\t\t\tthis.#columns.push({ ...ruleData, asc: true });\n\t\t\t}\n\t\t} else if (isAsc) {\n\t\t\tif (existingColIndex >= 0) {\n\t\t\t\tthis.#columns[existingColIndex].asc = false;\n\t\t\t} else {\n\t\t\t\tthis.#columns.push({ ...ruleData, asc: false });\n\t\t\t}\n\t\t} else {\n\t\t\tthis.#columns = this.#columns.filter(\n\t\t\t\tm => !((m.colIndex === colIndex && m.subRowIndex === subRowIndex) || m.colName === colName)\n\t\t\t);\n\t\t}\n\n\t\tthis.#applySorting(cell);\n\t}\n\n\t#applySorting(cell) {\n\n\t\tthis.#sheet.view.setSorting(this.#columns);\n\t\tthis.#syncHeaderUI();\n\t\tthis.#sheet.invalidate();\n\t\trequestAnimationFrame(() => {\n\t\tconst cells = this.#sheet.querySelectorAll('tbody.body th, tbody.body td');\n\n\t\tcells.forEach($td => {\n\t\t\t$td.classList.remove('sorting-anim-asc', 'sorting-anim-desc', 'sorting-anim-none');\n\n\t\t\tif (cell.classList.contains('asc')) {\n\t\t\t\t$td.classList.add('sorting-anim-asc');\n\t\t\t} else if (cell.classList.contains('desc')) {\n\t\t\t\t$td.classList.add('sorting-anim-desc');\n\t\t\t} else {\n\t\t\t\t$td.classList.add('sorting-anim-none');\n\t\t\t}\n\t\t});\n\n\t\trequestAnimationFrame(() => {\n\t\t\tcells.forEach($td => {\n\t\t\t\t$td.classList.remove('sorting-anim-asc', 'sorting-anim-desc', 'sorting-anim-none');\n\t\t\t});\n\t\t});\n\t\t});\n\t}\n\n\t#syncHeaderUI() {\n\t\tthis.#sheet.querySelectorAll('thead th, thead td').forEach(el => {\n\t\t\tel.classList.remove('asc', 'desc');\n\t\t});\n\n\t\tif (this.#columns.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#columns.forEach(colRule => {\n\t\t\tconst { colIndex, subRowIndex, asc } = colRule;\n\n\t\t\tif (colIndex !== undefined) {\n\t\t\t\tlet selector = `thead [data-col=\"${colIndex}\"]`;\n\t\t\t\tif (subRowIndex !== undefined) {\n\t\t\t\t\tselector = `thead tr[data-subrow=\"${subRowIndex}\"] [data-col=\"${colIndex}\"]`;\n\t\t\t\t}\n\n\t\t\t\tconst targetHeaderCells = this.#sheet.querySelectorAll(selector);\n\t\t\t\ttargetHeaderCells.forEach(cell => {\n\t\t\t\t\tcell.classList.add(asc ? 'asc' : 'desc');\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\trestore() {\n\t\tthis.#columns = [];\n\t\tif (this.#sheet.view) {\n\t\t\tthis.#sheet.view.resetSorting();\n\t\t}\n\n\t\tthis.#syncHeaderUI();\n\t\tthis.#sheet.rowManager?.refresh(true);\n\t}\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport {Grouping} from \"@/data/Grouping.js\";\n\nexport class SheetView {\n\t#sheet;\n\t#host;\n\t#sortingColumns = [];\n\t#filterRules = [];\n\t#viewIndexes = [];\n\n\t#cachedVisibleRecords = null;\n\n\tconstructor(sheet) {\n\t\tthis.#sheet = sheet;\n\t\tthis.#host = sheet.getRootNode().host;\n\n\t\tthis.refresh();\n\t}\n\n\tgetArray = (at, colnm) => {\n\n\t\tif (!this.#cachedVisibleRecords) {\n\t\t\tconst records = this.#host.data.getArray();\n\t\t\tthis.#cachedVisibleRecords = this.#viewIndexes.map(idx => records[idx]);\n\t\t}\n\n\t\tconst visibleRecords = this.#cachedVisibleRecords;\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn visibleRecords;\n\t\t}\n\n\t\tif (at < 0 || at >= visibleRecords.length) return null;\n\n\t\tconst targetRecord = visibleRecords[at];\n\t\tif (colnm != null) {\n\t\t\tconst fields = this.#host.data.getHostFields();\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0 && targetRecord.v) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn targetRecord;\n\t};\n\n\tcount = () => {\n\t\tif (!this.#cachedVisibleRecords) {\n\t\t\tconst records = this.#host.data.getArray();\n\t\t\tthis.#cachedVisibleRecords = this.#viewIndexes.map(idx => records[idx]);\n\t\t}\n\n\t\treturn this.#cachedVisibleRecords.length;\n\t}\n\n\tget = (at, colnm) => {\n\t\tconst visibleRecords = this.getArray();\n\t\tconst fields = this.#host.data.getHostFields?.() || [];\n\n\t\tif (at === undefined || at === null) {\n\t\t\treturn visibleRecords.map(record => this.#convSingle(record, fields));\n\t\t}\n\n\t\tif (at < 0 || at >= visibleRecords.length) return null;\n\n\t\tconst targetRecord = visibleRecords[at];\n\t\tif (!targetRecord) return null;\n\n\t\tif (colnm != null) {\n\t\t\tconst idx = fields.indexOf(colnm);\n\t\t\treturn (idx >= 0 && targetRecord.v) ? targetRecord.v[idx] : null;\n\t\t}\n\n\t\treturn this.#convSingle(targetRecord, fields);\n\t};\n\n\t#convSingle = (o, fields) => {\n\t\tif (!o) return null;\n\t\tconst t = {};\n\t\tfields.forEach((colnm, i) => {\n\t\t\tt[colnm] = o.v ? o.v[i] : o[colnm];\n\t\t});\n\t\tif (o.m) t.m = o.m;\n\t\tif (o._) t._ = o._;\n\t\treturn t;\n\t};\n\n\trefresh = () => {\n\n\t\tthis.#cachedVisibleRecords = null;\n\n\t\tconst rawRecords = this.#host.data.getArray();\n\t\tlet indices = [];\n\t\trawRecords.forEach((record, i) => {\n\t\t\tif (!record) return;\n\t\t\tconst filterSlot = record.m?._?.[NINE_TABLE.META.INDEX.FILTER];\n\t\t\tif (filterSlot && filterSlot[this.#sheet.index] === false) return;\n\t\t\tindices.push(i);\n\t\t});\n\n\t\tif (this.#sortingColumns.length > 0) {\n\t\t\tindices = this.#applySorting(indices, rawRecords);\n\t\t}\n\n\t\tthis.#viewIndexes = indices;\n\t\tconst validRecords = indices.map(idx => rawRecords[idx]);\n\n\t\tconst groupColumns = this.#sheet.grouping?.columns || [];\n\t\tif (groupColumns.length > 0) {\n\t\t\tconst groupResult = Grouping.apply(validRecords, groupColumns, this.#host.data.getHostFields());\n\n\t\t\tthis.#cachedVisibleRecords = groupResult.renderItems; // ์ตœ์ข… ๋ Œ๋”๋ง ์•„์ดํ…œ\n\n\t\t\tthis.#sheet.grouping.setGroupMap(groupResult.groupMap); // ์ž์‹ ๋งคํ•‘ ๊ณต์œ \n\t\t} else {\n\t\t\tthis.#cachedVisibleRecords = validRecords;\n\t\t}\n\n\n\n\t}\n\n\tsetSorting = (columns) => {\n\t\tthis.#sortingColumns = columns || [];\n\t\tthis.refresh();\n\t};\n\n\tgetSorting = () => {\n\t\treturn this.#sortingColumns;\n\t};\n\n\tresetSorting = () => {\n\t\tthis.#sortingColumns = [];\n\t\tthis.refresh();\n\t};\n\n\n\t#applySorting = (indices, validRecords) => {\n\n\t\tconst fields = typeof this.#host.data.getHostFields === 'function' ? this.#host.data.getHostFields() : [];\n\n\t\tconst rulesWithIdx = this.#sortingColumns.map(rule => ({\n\t\t\t...rule,\n\t\t\tcolIndex: fields.indexOf(rule.colname || rule.colName)\n\t\t}));\n\n\t\treturn indices.sort((idxA, idxB) => {\n\t\t\tconst a = validRecords[idxA];\n\t\t\tconst b = validRecords[idxB];\n\n\t\t\tfor (const rule of rulesWithIdx) {\n\t\t\t\tconst isAsc = rule.asc;\n\t\t\t\tconst expr = rule.expr; // ๐Ÿ’ก ๋“ฑ๋ก๋œ expr ์ˆ˜์‹\n\t\t\t\tlet valA, valB;\n\n\t\t\t\tif (expr) {\n\t\t\t\t\tvalA = this.#host.exprEngine.evaluate(expr, a, idxA);\n\t\t\t\t\tvalB = this.#host.exprEngine.evaluate(expr, b, idxB);\n\t\t\t\t} else {\n\t\t\t\t\tif (rule.colIndex >= 0 && a.v && b.v) {\n\t\t\t\t\t\tvalA = a.v[rule.colIndex];\n\t\t\t\t\t\tvalB = b.v[rule.colIndex];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst isEmptyA = (valA === null || valA === undefined || valA === '');\n\t\t\t\tconst isEmptyB = (valB === null || valB === undefined || valB === '');\n\n\t\t\t\tif (isEmptyA && isEmptyB) continue;\n\t\t\t\tif (isEmptyA) return 1;\n\t\t\t\tif (isEmptyB) return -1;\n\n\t\t\t\tif (valA !== valB) {\n\t\t\t\t\tlet diff = 0;\n\n\t\t\t\t\tif (typeof valA === 'number' && typeof valB === 'number') {\n\t\t\t\t\t\tdiff = valA - valB;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst strA = String(valA);\n\t\t\t\t\t\tconst strB = String(valB);\n\t\t\t\t\t\tdiff = strA > strB ? 1 : (strA < strB ? -1 : 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (diff !== 0) {\n\t\t\t\t\t\treturn isAsc ? diff : -diff;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn idxA - idxB;\n\t\t});\n\t};\n}","import { trace } from \"@nopeer\";\nimport { TableCompiler } from \"@/layout/core/TableCompiler.js\";\n\nexport const COLLAPSED_WIDTH = 16;\n\nexport class PreCompiler {\n\n static initializeTable(host, tbl) {\n\n PreCompiler.#ensureColgroup(tbl);\n PreCompiler.#ensureThead(tbl);\n PreCompiler.#ensureSectionTbodys(tbl);\n\n PreCompiler.#ensureRowIndicator(tbl);\n\n PreCompiler.#normalizeColAttributes(tbl);\n\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('thead tr'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tbody.body tr[grouping=\"true\"]'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tbody.body tr:not([grouping=\"true\"])'));\n TableCompiler.resetColIndex(tbl, tbl.querySelectorAll('tfoot tr'));\n\n PreCompiler.#createColIndicator(tbl);\n\n PreCompiler.#normalizeCollapsibleAttributes(tbl);\n\n PreCompiler.#generateCell(host, tbl);\n\n PreCompiler.#initColExpanders(tbl);\n\n PreCompiler.#initFilterButtons(host, tbl);\n\n PreCompiler.#applyInitialCellWidths(tbl);\n\n return tbl;\n }\n\n static #createColIndicator(tbl) {\n const thead = tbl.querySelector('thead');\n if (!thead || thead.querySelector('.col-indicator-rowgroup')) return;\n\n const tdTmpl = `<th data-col=\"@col\" class=\"col-indicator\" scope=\"col\"></th>`;\n\n const tr = thead.insertRow(0);\n tr.setAttribute('role', 'row');\n tr.classList.add('col-indicator-rowgroup');\n tr.classList.add('collapse');\n\n const firstRow = tbl.querySelector('tbody tr');\n if (!firstRow) return;\n\n let cnt = 0;\n firstRow.querySelectorAll('th, td').forEach(td => {\n if (!td.classList.contains('dummy')) {\n const colSpan = td.colSpan || 1;\n for (let i = 0; i < colSpan; i++) {\n const html = tdTmpl.replace('@col', cnt).replace('@text', PreCompiler.#numToExcelCol(cnt++));\n tr.insertAdjacentHTML('beforeend', html);\n }\n }\n });\n\n const cols = Array.from(tbl.querySelectorAll('colgroup col'));\n tr.querySelectorAll('.col-indicator').forEach((el, i) => {\n const background = cols[i].getAttribute('background');\n if (background) {\n el.style.background = background;\n }\n });\n }\n\n static #numToExcelCol(num) {\n let text = '';\n for (let n = num; n >= 0; n = Math.floor(n / 26) - 1) {\n text = String.fromCharCode(65 + (n % 26)) + text;\n }\n return text;\n }\n\n static #ensureSectionTbodys(tbl) {\n let tbody = tbl.querySelector('tbody:not(.head):not(.foot)');\n\n if (!tbody) return;\n\n tbody.classList.add('body');\n\n if (!tbl.querySelector('tbody.head')) {\n const headTbody = document.createElement('tbody');\n headTbody.classList.add('head');\n tbody.before(headTbody);\n }\n\n if (!tbl.querySelector('tbody.foot')) {\n const footTbody = document.createElement('tbody');\n footTbody.classList.add('foot');\n tbody.after(footTbody);\n }\n }\n\n static #ensureColgroup(tbl) {\n let colgroup = tbl.querySelector('colgroup');\n if (!colgroup) {\n colgroup = document.createElement('colgroup');\n tbl.prepend(colgroup);\n }\n\n if (colgroup.querySelectorAll('col').length === 0) {\n const firstRow = tbl.querySelector('tbody tr');\n let colCount = 1;\n if (firstRow) {\n colCount = Array.from(firstRow.querySelectorAll('th, td')).reduce((sum, cell) => {\n return sum + (parseInt(cell.getAttribute('colspan') || cell.colSpan, 10) || 1);\n }, 0);\n }\n colCount = Math.max(colCount, 1);\n\n for (let i = 0; i < colCount; i++) {\n const col = document.createElement('col');\n colgroup.appendChild(col);\n }\n }\n }\n\n static #normalizeColAttributes(tbl) {\n const cols = Array.from(tbl.querySelectorAll('colgroup col'));\n if (cols.length === 0) return;\n\n const containerWidth = tbl.clientWidth || 0;\n const defaultWidth = Math.max(Math.floor(containerWidth / cols.length), 100);\n\n cols.forEach((col, i) => {\n\n if (!col.hasAttribute('data-col')) {\n col.setAttribute('data-col', i);\n }\n\n const width = col.getAttribute('width') || parseInt(col.style.width, 10) || defaultWidth;\n col.setAttribute('width', width);\n\n const widthVal = String(width).includes('px') ? width : `${width}px`;\n col.style.width = widthVal;\n });\n }\n\n static #ensureThead(tbl) {\n if (tbl.querySelector('thead')) return;\n\n const thead = document.createElement('thead');\n const colgroup = tbl.querySelector('colgroup');\n\n if (colgroup) {\n colgroup.after(thead);\n } else {\n tbl.prepend(thead);\n }\n }\n\n static #normalizeCollapsibleAttributes(tbl) {\n const headers = tbl.querySelectorAll('thead th, thead td');\n headers.forEach(cell => {\n const isCollapsed = cell.getAttribute('collapsed') === 'true';\n if (isCollapsed && cell.getAttribute('collapsible') !== 'true') {\n cell.setAttribute('collapsible', 'true');\n }\n });\n }\n\n static #generateCell(host, $tbl) {\n\n const targetAttributes = ['data-bind', 'data-expr', 'type'];\n let autoIdCounter = 0;\n\n $tbl.querySelectorAll('tbody th, tbody td').forEach($cell => {\n const cellType = $cell.getAttribute('cell-type') || \"renderer\";\n const tagName = `cell-${cellType}`;\n\n const $datalist = $cell.querySelector(\"datalist\");\n\n if ($datalist) {\n let l = [];\n $datalist.querySelectorAll('option').forEach($option => {\n l.push({\n k: $option.getAttribute(\"k\"),\n v: $option.getAttribute(\"v\"),\n value: $option.getAttribute(\"value\"),\n });\n });\n\n const uniqueFuncName = `__ds_${Date.now()}_${++autoIdCounter}`;\n\n if (host) {\n host[uniqueFuncName] = () => l;\n }\n\n $cell.setAttribute(\"data-source\", `host.${uniqueFuncName}()`);\n\n $datalist.remove();\n }\n\n const expr = $cell.dataset.expr;\n if (expr) {\n $cell.setAttribute('data-expr', host.exprEngine.precompile(expr));\n }\n\n Array.from($cell.attributes).forEach(attr => {\n if (['data-bind', 'data-expr', 'cell-type', 'validator'].includes(attr.name)) return;\n if (attr.value.includes(\"data.\") || attr.value.includes(\"host.\")) {\n $cell.setAttribute(attr.name, host.exprEngine.precompile(attr.value));\n }\n });\n\n const innerAttrs = targetAttributes\n .filter(attr => $cell.hasAttribute(attr))\n .map(attr => `${attr}=\"${$cell.getAttribute(attr)}\"`);\n\n $cell.innerHTML = `<${tagName} ${innerAttrs.join(' ')}></${tagName}>`;\n $cell.setAttribute('tabindex', '0');\n });\n\n $tbl.querySelectorAll('thead th, thead td, tfoot th, tfoot td').forEach($cell => {\n const cellType = $cell.getAttribute('cell-type');\n if (cellType) {\n const originalContent = $cell.innerHTML;\n const tagName = `cell-${cellType}`;\n const innerAttrs = targetAttributes\n .filter(attr => $cell.hasAttribute(attr))\n .map(attr => `${attr}=\"${$cell.getAttribute(attr)}\"`);\n\n $cell.innerHTML = `<${tagName} ${innerAttrs.join(' ')} content=\"${originalContent}\"></${tagName}>`;\n }\n });\n }\n\n static #initFilterButtons(host, tbl) {\n const hostFilter = host.getAttribute('filtering') === 'true';\n const tableFilter = tbl.getAttribute('filtering') === 'true';\n\n tbl.querySelectorAll('thead tr:not(.col-indicator-rowgroup) th, thead tr:not(.col-indicator-rowgroup) td').forEach(cell => {\n const finalFiltering = cell.getAttribute('filtering') === 'true' || tableFilter || hostFilter;\n\n cell.setAttribute('filtering', finalFiltering ? 'true' : 'false');\n\n if (finalFiltering) {\n cell.appendChild(document.createElement('nine-table-filter-button'));\n }\n });\n }\n\n static #initColExpanders(tbl) {\n\n tbl.querySelectorAll('thead th, thead td').forEach(cell => {\n const isCollapsible = cell.getAttribute('collapsible') === 'true' || cell.getAttribute('expandable') === 'true';\n if (!isCollapsible) return;\n\n const colIndex = parseInt(cell.dataset.col, 10);\n const colSpan = cell.colSpan || 1;\n const col = tbl.querySelector(`colgroup col[data-col=\"${colIndex}\"]`);\n\n const currentWidth = col ? (parseInt(col.getAttribute('width'), 10) || 100) : 100;\n\n if (!cell.dataset.expandWidth || parseInt(cell.dataset.expandWidth, 10) <= COLLAPSED_WIDTH) {\n cell.dataset.expandWidth = String(currentWidth > COLLAPSED_WIDTH ? currentWidth : 100);\n }\n\n let expandBtn = cell.querySelector('nine-table-col-expand');\n if (!expandBtn) {\n expandBtn = document.createElement('nine-table-col-expand');\n cell.insertBefore(expandBtn, cell.firstChild);\n }\n\n const isCollapsed = cell.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n expandBtn.classList.add('collapsed');\n expandBtn.classList.remove('expand');\n expandBtn.setAttribute('collapsed', 'true');\n cell.style.color = 'transparent';\n\n const targetWidth = Math.max(10, Math.floor(COLLAPSED_WIDTH / colSpan));\n if (!isNaN(colIndex)) {\n for (let i = 0; i < colSpan; i++) {\n const targetCol = tbl.querySelector(`colgroup col[data-col=\"${colIndex + i}\"]`);\n if (targetCol) {\n targetCol.setAttribute('width', targetWidth);\n targetCol.style.width = `${targetWidth}px`;\n }\n }\n }\n } else {\n expandBtn.classList.remove('collapsed');\n expandBtn.classList.add('expand');\n expandBtn.setAttribute('collapsed', 'false');\n cell.style.color = '';\n }\n });\n }\n\n static #ensureRowIndicator(tbl, host) {\n\n const w = tbl.getAttribute(\"row-indicator\") === 'true' ? 48 : 4;\n\n const colgroup = tbl.querySelector('colgroup');\n\n\n const col = document.createElement('col');\n //col.className = 'row-indicator-col';\n col.setAttribute('fixed', 'left');\n col.setAttribute('width', w);\n col.style.width = `${w}px`;\n colgroup.prepend(col);\n\n\n tbl.querySelectorAll('thead, tbody, tfoot').forEach(section => {\n const rows = Array.from(section.querySelectorAll('tr'));\n if (rows.length === 0) return;\n\n const firstTr = rows[0];\n\n const indicatorCell = document.createElement('th');\n indicatorCell.className = 'row-indicator';\n indicatorCell.setAttribute('cell-type', 'row-indicator');\n\n if (rows.length > 1) {\n indicatorCell.rowSpan = rows.length;\n }\n\n firstTr.insertBefore(indicatorCell, firstTr.firstElementChild);\n });\n }\n\n static #applyInitialCellWidths(tbl) {\n\n tbl.querySelectorAll('th[data-col], td[data-col]').forEach(cell => {\n\n const startColIdx = parseInt(cell.getAttribute('data-col'), 10);\n if (isNaN(startColIdx)) return;\n\n\n const colSpan = parseInt(cell.getAttribute('colspan') || cell.colSpan, 10) || 1;\n let totalWidth = 0;\n\n\n for (let i = 0; i < colSpan; i++) {\n const targetIdx = startColIdx + i;\n const col = tbl.querySelector(`colgroup col[data-col=\"${targetIdx}\"]`);\n if (col) {\n totalWidth += parseInt(col.getAttribute('width'), 10) || 100;\n }\n }\n\n if (totalWidth > 0) {\n const widthVal = `${totalWidth}px`;\n //cell.style.width = widthVal;\n //cell.style.minWidth = widthVal;\n //cell.style.maxWidth = widthVal;\n }\n });\n }\n}\n","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class SheetAPI {\n #sheet;\n #host;\n\n constructor(sheet) {\n this.#sheet = sheet;\n this.#host = sheet.getRootNode().host;\n }\n\n /**\n currentRow = () => {\n let rows = this.currentRows();\n return (rows.length === 0) ? -1 : rows[0];\n }\n currentRows = () => {\n\n let rows = [];\n this.#shadowRoot.querySelectorAll('nine-table-sheet.active').forEach($sheet => {\n\n const arr = $sheet.view.getArray($sheet.selection.minRow);\n const rowid = arr.m._[NINE_TABLE.META.INDEX.ROWID];\n\n //trace.log(this.data.getArray($sheet.selection.minRow));\n\n rows.push(rowid);\n });\n\n return rows;\n } */\n\n col = {\n // 1. ํŠน์ • ์ปฌ๋Ÿผ์˜ ๋„ˆ๋น„ ์„ค์ • (ColResizer ํ™œ์šฉ)\n setWidth: (colIndex, width, containerType = null) => {\n const targetCols = Array.from(this.#sheet.querySelectorAll(`table colgroup col[data-col=\"${colIndex}\"]`));\n targetCols.forEach(col => {\n col.setAttribute('width', width);\n col.style.width = `${width}px`;\n });\n\n },\n\n // 2. ํŠน์ • ์ปฌ๋Ÿผ์˜ ํ˜„์žฌ ๋„ˆ๋น„ ๊ฐ€์ ธ์˜ค๊ธฐ\n getWidth: (colIndex) => {\n const colEl = this.#sheet.querySelector(`table colgroup col[data-col=\"${colIndex}\"]`);\n if (!colEl) return 0;\n return parseInt(colEl.getAttribute('width') || colEl.style.width, 10) || 0;\n },\n measureAutoFitColumnWidth: (cell, tbodyCell) => {\n\n const fieldIdx = this.#host.fields.get().indexOf(tbodyCell.dataset.bind);\n const computedStyle = window.getComputedStyle(tbodyCell);\n const font = computedStyle.font || '12px sans-serif';\n let maxTextWidth = 32;\n\n this.#sheet.view.getArray().forEach((record, idx) => {\n const val = String(tbodyCell.dataset.expr ? this.#host.exprEngine.evaluate(tbodyCell.dataset.expr, record, idx) : record.v[fieldIdx] ?? \"\").trim();\n const size = nine.measureTextSize(val, font);\n if (size.width && size.width > maxTextWidth) {\n maxTextWidth = size.width;\n }\n });\n\n return maxTextWidth;\n },\n // 3. ํŠน์ • ์ปฌ๋Ÿผ ์ž๋™ ๋งž์ถค (์•„๊นŒ ๋ถ„๋ฆฌํ•œ measureAutoFitColumnWidth ์—ฐ๋™)\n autoFit: (colIndex) => {\n const cell = this.#sheet.querySelector(`thead th[data-col=\"${colIndex}\"]`);\n const tbodyCell = this.#sheet.querySelector(`tbody.body [data-col=\"${colIndex}\"]`);\n\n if (!cell || !tbodyCell) return;\n\n this.#host.execute(() => {\n const calculatedWidth = this.col.measureAutoFitColumnWidth(cell, tbodyCell);\n if (calculatedWidth !== null) {\n this.col.setWidth(colIndex, calculatedWidth);\n }\n });\n },\n\n // 4. ์ปฌ๋Ÿผ ํ‘œ์‹œ/์ˆจ๊น€ ์ฒ˜๋ฆฌ\n setVisible: (colIndex, isVisible) => {\n const targets = this.#sheet.querySelectorAll(`table colgroup col[data-col=\"${colIndex}\"], th[data-col=\"${colIndex}\"], td[data-col=\"${colIndex}\"]`);\n targets.forEach(el => {\n el.style.display = isVisible ? '' : 'none';\n });\n this.#sheet.rowManager?.refresh();\n }\n };\n\n row = {\n at: () => {\n if (this.#sheet.selection.minRow < 0) return -1;\n return Math.floor(this.#sheet.selection.minRow / this.#sheet.template.length);\n },\n focus: async (index, callback) => {\n // 1. ํ™”๋ฉด์— ์•ˆ ๋ณด์ด๋ฉด moveTo ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆผ\n if (!this.#sheet.row.isVisible(index)) {\n await new Promise((resolve) => {\n this.#sheet.row.moveTo(index, () => {\n resolve();\n });\n });\n } else {\n // 2. ์ด๋ฏธ ๋ณด์ด๋”๋ผ๋„ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋”๋ง ํ์— ํ•œ ํ…œํฌ ์–‘๋ณด (requestAnimationFrame)\n await new Promise((resolve) => requestAnimationFrame(resolve));\n }\n\n // 3. ๋ Œ๋”๋ง์ด ์™„์ „ํžˆ ์•ˆ์ •ํ™”๋œ ์‹œ์ ์— DOM ์กฐํšŒ ๋ฐ ์„ ํƒ ์ฒ˜๋ฆฌ\n const $trs = this.#sheet.querySelectorAll(`tbody.body tr[data-index=\"${index}\"]`);\n const matrixRows = Array.from($trs, $tr => parseInt($tr.dataset.matrixRow, 10)).filter(n => !isNaN(n));\n\n const cols = [];\n $trs.forEach($tr => {\n $tr.querySelectorAll('td, th').forEach($cell => {\n const col = parseInt($cell.dataset.col, 10);\n if (col != 0) cols.push(parseInt($cell.dataset.col, 10));\n });\n });\n\n if (matrixRows.length === 0 || cols.length === 0) return;\n\n const result = this.#sheet.selection.setRange(Math.min(...matrixRows), Math.min(...cols), Math.max(...matrixRows), Math.max(...cols));\n\n if (typeof callback === 'function') {\n callback();\n }\n\n return result;\n },\n isVisible: (index) => {\n\n const $sheetBody = this.#sheet.querySelector('.ng-sheet-body');\n\n const $trs = $sheetBody.querySelectorAll(`.ng-container-body tbody.body tr[data-index=\"${index}\"]`);\n if (!$trs || $trs.length === 0) return false;\n\n const viewportRect = $sheetBody.getBoundingClientRect();\n const theadHeight = $sheetBody.querySelector('thead')?.offsetHeight || 0;\n const tfootHeight = $sheetBody.querySelector('tfoot')?.offsetHeight || 0;\n\n const viewportTop = viewportRect.top + theadHeight;\n const viewportBottom = viewportRect.bottom - tfootHeight;\n\n let isVisible = true;\n\n for (const $tr of $trs) {\n const trRect = $tr.getBoundingClientRect();\n\n const isAbove = trRect.top < viewportTop;\n const isBelow = trRect.bottom > viewportBottom;\n\n if (isAbove || isBelow) {\n isVisible = false;\n break;\n }\n }\n\n return isVisible;\n },\n add: (dataSource, updateState) => {\n return this.#host.data.add(dataSource, updateState);\n },\n moveTo: (index, callback) => {\n if (this.#sheet.row.isVisible(index)) {\n if (typeof callback === 'function') callback();\n } else {\n this.#sheet.scrollTo(index, () => {\n if (typeof callback === 'function') callback();\n });\n }\n },\n insert: (index, dataSource, updateState = true) => {\n\n const currentJson = this.#sheet.view.get(index);\n const rowid = currentJson.m._[NINE_TABLE.META.INDEX.ROWID];\n\n const toRowid = this.#host.data.insert(rowid, dataSource, updateState);\n const records = this.#sheet.view.getArray();\n\n const targetIndex = records.findIndex(record => {\n if (!record || !record.m || !record.m._) return false;\n return record.m._[NINE_TABLE.META.INDEX.ROWID] === toRowid; // ํƒ€์ž… ์ฐจ์ด ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด == ์‚ฌ์šฉ\n });\n\n return targetIndex;\n },\n remove: (index) => {\n\n const currentJson = this.#sheet.view.get(index);\n const rowid = currentJson.m._[NINE_TABLE.META.INDEX.ROWID];\n\n this.#host.data.remove(rowid);\n },\n };\n}","import { trace } from \"@nopeer\";\nimport './nine-table-hscrollbar.js';\nimport './nine-table-vscrollbar.js';\nimport { RowManager } from './core/RowManager.js';\nimport { TableCompiler } from \"./core/TableCompiler.js\";\nimport { CellSelection } from \"@/cell-manager/CellSelection.js\";\nimport { CellNavigation } from \"@/cell-manager/CellNavigation.js\";\n\nimport { ColResizer } from \"@/col/ColResizer.js\";\nimport { ColMover } from \"@/col/ColMover.js\";\nimport { ColFixManager } from \"@/col/ColFixManager.js\";\n\nimport { Filtering } from \"@/data/Filtering.js\";\nimport { GroupingManager } from \"@/data/Grouping.js\";\nimport { Sorting } from \"@/data/Sorting.js\";\nimport { SheetView } from \"@/data/SheetView.js\";\n\nimport { PreCompiler } from \"@/layout/core/PreCompiler.js\";\nimport { SheetAPI } from \"@/api/SheetAPI.js\";\n\nexport class NineTableSheet extends HTMLElement {\n #index;\n #host;\n #rowManager;\n #cellSelection;\n #cellNavigation;\n #colResizer;\n #colMover;\n #colFix;\n #sorting;\n #filtering;\n #grouping;\n #api;\n\n #view;\n\n #source = {\n table: null,\n };\n\n #elements;\n\n #template = {\n length: 0,\n height: 0,\n heights: [],\n };\n\n static SCROLLBAR_SIZE = 16;\n\n constructor() {\n super();\n\n this.#host = this.getRootNode().host;\n this.#rowManager = new RowManager(this);\n\n this.#api = new SheetAPI(this);\n\n this.#bindApiMethods();\n }\n\n connectedCallback() {\n this.#init();\n }\n\n get template() { return this.#template; }\n get index() { return this.#index; }\n get colResizer() { return this.#colResizer; }\n get filtering() { return this.#filtering; }\n get grouping() { return this.#grouping; }\n get colMover() { return this.#colMover; }\n get colFix() { return this.#colFix; }\n get rowManager() { return this.#rowManager; }\n get selection() { return this.#cellSelection; }\n get navigation() { return this.#cellNavigation; }\n get templateLength() { return this.#source.tbody.tr.length || 0; }\n\n get elements() { return this.#elements; }\n\n /**\n get template() {\n return {\n length: this.#source?.tbody?.tr?.length || 0,\n trs: this.#source?.tbody?.tr || []\n };\n } */\n\n get isAutoFitCol() {\n const attrTrue = this.getAttribute('auto-fit-col') === 'true' || this.#host?.getAttribute('auto-fit-col') === 'true';\n const sourceTableTrue = this.#source.table?.getAttribute('auto-fit-col') === 'true';\n return attrTrue || sourceTableTrue;\n }\n\n get sourceTable() {\n return this.#source.table;\n }\n\n get source() {\n return this.#source;\n }\n\n get #isSimple() {\n return this.#host.hasAttribute('simple') || this.#host.getAttribute('theme') === 'simple';\n }\n\n scrollTo = (dataRow, callback) => {\n this.rowManager.scrollToDataRow(dataRow, 'top', callback);\n }\n\n recompileAndRefresh() {\n if (!this.#source.table) return;\n\n TableCompiler.recompile(this.#source.table);\n\n ['left', 'right', 'body'].forEach(type => {\n ['header', 'body', 'footer'].forEach(section => {\n const container = this.querySelector(`.ng-sheet-${section} .ng-container-${type}`);\n if (!container) return;\n container.querySelectorAll('table').forEach(tbl => tbl.remove());\n });\n });\n\n this.#renderSplitContainers();\n\n this.#updateContainerWidths();\n\n this.#rowManager.initialize();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n requestAnimationFrame(() => {\n this.#updateContainerWidths();\n this.#rowManager?.refresh();\n });\n }\n\n refreshLayout() {\n\n requestAnimationFrame(() => {\n\n if (!this.classList.contains('active') || !this.#source.table) return;\n\n this.#updateContainerWidths();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n this.#adjustOverlay();\n\n this.#colResizer?.refreshLayout();\n\n this.#rowManager?.refresh();\n });\n }\n\n #adjustOverlay = () => {\n const $thead = this.querySelector('.ng-container-body thead');\n const $overlay = this.querySelector('.nodata-overlay');\n $overlay.style.top = `${$thead?.offsetHeight}px`;\n }\n\n get view() {\n if (!this.#view && this.#host?.data) {\n this.#view = new SheetView(this);\n }\n return this.#view;\n }\n\n invalidate = () => {\n\n this.view.refresh();\n\n this.#rowManager.refresh(true);\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n }\n };\n\n autoFit = (enable = true) => {\n requestAnimationFrame(() => {\n this.#autoFit?.(enable);\n });\n };\n\n #autoFit = (enable = true) => {\n\n const container = this.querySelector('.ng-sheet-body .ng-container-body');\n if (!container) return;\n\n const firstColgroup = this.querySelector('.ng-container-body table colgroup');\n if (!firstColgroup) return;\n\n if (enable) {\n this.setAttribute('auto-fit-col', 'true');\n const containerWidth = container.clientWidth;\n if (containerWidth <= 0) return;\n\n let totalOriginalWidth = 0;\n const colList = [];\n\n firstColgroup.querySelectorAll('col').forEach(col => {\n const globalColIndex = col.getAttribute('data-col');\n const headerCell = this.querySelector(`thead th[data-col=\"${globalColIndex}\"]`);\n const isCollapsed = headerCell?.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n colList.unshift({ globalColIndex, width: 16, isCollapsed: true });\n } else {\n const w = parseInt(col.getAttribute('width'), 10) || 100;\n colList.push({ globalColIndex, width: w, isCollapsed: false });\n totalOriginalWidth += w;\n }\n });\n\n const collapsedTotalWidth = colList\n .filter(c => c.isCollapsed)\n .reduce((sum, c) => sum + c.width, 0);\n\n const availableWidth = Math.max(0, containerWidth - collapsedTotalWidth);\n\n if (totalOriginalWidth > 0 && colList.length > 0) {\n let allocatedTotal = 0;\n\n const calculatedCols = colList.map(item => {\n if (item.isCollapsed) {\n return { globalColIndex: item.globalColIndex, remainder: 0, width: 16 };\n }\n\n const exactWidth = (item.width * availableWidth) / totalOriginalWidth;\n const baseWidth = Math.max(30, Math.floor(exactWidth));\n allocatedTotal += baseWidth;\n return {\n globalColIndex: item.globalColIndex,\n remainder: exactWidth - Math.floor(exactWidth),\n width: baseWidth\n };\n });\n\n let remainderPixels = availableWidth - allocatedTotal;\n\n const uncollapsedCols = calculatedCols.filter(c => !colList.find(item => item.globalColIndex === c.globalColIndex)?.isCollapsed);\n\n if (remainderPixels > 0 && uncollapsedCols.length > 0) {\n uncollapsedCols.sort((a, b) => b.remainder - a.remainder);\n for (let i = 0; i < remainderPixels; i++) {\n uncollapsedCols[i % uncollapsedCols.length].width += 1;\n }\n } else if (remainderPixels < 0 && uncollapsedCols.length > 0) {\n uncollapsedCols.sort((a, b) => a.remainder - b.remainder);\n for (let i = 0; i < Math.abs(remainderPixels); i++) {\n const target = uncollapsedCols[i % uncollapsedCols.length];\n if (target.width > 30) target.width -= 1;\n }\n }\n\n calculatedCols.forEach(({ globalColIndex, width }) => {\n this.#colResizer?.setColumnWidth(globalColIndex, width, 'body');\n });\n }\n } else {\n this.removeAttribute('auto-fit-col');\n }\n\n this.querySelector('nine-table-hscrollbar')?.refresh();\n }\n\n generateTemplate = ($table, index) => {\n\n const activeParent = (v) => {\n\n if (['NINE-TABLE-SIMPLE'].includes(this.#host.tagName)) {\n const $parent = this.#host.closest(\"nine-table-filter-panel, cell-combo-panel\");\n if ($parent) {\n v ? $parent.classList.add('active') : $parent.classList.remove('active');\n }\n }\n };\n\n activeParent(true);\n\n this.#index = index;\n\n this.#source = {\n table: TableCompiler.compile($table),\n tbody: {\n tr: $table.querySelectorAll(\"tbody tr\"),\n }\n };\n\n this.querySelector(`.ng-container-body`).appendChild(this.#source.table);\n\n this.#template.height = this.#template.length = 0;\n this.#template.heights = [];\n this.querySelectorAll(`.ng-container-body tbody.body tr`).forEach(($tr) => {\n this.#template.height += Math.max($tr.offsetHeight || 0, 28);\n this.#template.heights.push($tr.offsetHeight || 0);\n //if (['NINE-TABLE-SIMPLE'].includes(this.#host.tagName)) {\n // trace.log(this.#host, $tr.offsetHeight, $tr.clientHeight);\n //}\n });\n this.#template.length = this.#template.heights.length;\n\n if (this.#index === 0) {\n const minRows = parseInt(this.#host.getAttribute('display-min-rows'), 10);\n const maxRows = parseInt(this.#host.getAttribute('display-max-rows'), 10);\n\n const h = (this.querySelector(\"nine-table-toolbar\")?.offsetHeight || 0) +\n (this.querySelector(\"nine-table-footer\")?.offsetHeight || 0) +\n (this.querySelector(\"thead\")?.offsetHeight || 0) +\n (this.querySelector(\"tfoot\")?.offsetHeight || 0) +\n (this.querySelector(\"tbody.head\")?.offsetHeight || 0);\n\n if (this.#host.getAttribute('auto-height') === \"true\" || !isNaN(minRows) || !isNaN(maxRows)) {\n this.#host.setAttribute('scroll-bar', \"none\");\n }\n\n if (!isNaN(minRows)) {\n this.#host.style.minHeight = h + (this.#template.height * minRows) + \"px\";\n }\n\n if (!isNaN(maxRows)) {\n this.#host.style.maxHeight = h + (this.#template.height * maxRows) + \"px\";\n }\n }\n\n this.querySelectorAll((\"tbody.body tr\")).forEach(($tr) => {\n $tr.style.display = \"none\";\n });\n\n this.querySelector(`.ng-container-body table`).remove();\n\n activeParent(false);\n };\n\n generate = () => {\n\n this.#renderSplitContainers();\n\n this.#updateContainerWidths();\n\n this.#syncHeaderAndFooterHeights();\n\n this.#initRowHoverEvent();\n\n ['left', 'body', 'right'].forEach(type => {\n const prefix = `.ng-container-${type}`;\n this.#elements[type] = {\n thead: this.querySelector(`${prefix} thead`),\n tbody: {\n head: this.querySelector(`${prefix} tbody.head`),\n body: this.querySelector(`${prefix} tbody.body`),\n foot: this.querySelector(`${prefix} tbody.foot`),\n },\n tfoot: this.querySelector(`${prefix} tfoot`),\n };\n });\n\n this.#rowManager.initialize();\n\n if (this.isAutoFitCol) {\n this.autoFit(true);\n } else {\n this.querySelector('nine-table-hscrollbar').refresh();\n }\n\n this.#grouping.initialize();\n\n this.loaded = true;\n };\n\n\n #updateContainerWidths = () => {\n\n if (this.#host.classList.contains(\"combo-list\")) return;\n\n ['left', 'right', 'body'].forEach(type => {\n const containers = this.querySelectorAll(`.ng-container-${type}`);\n if (containers.length === 0) return;\n\n const firstTable = containers[0].querySelector('table');\n if (!firstTable) return;\n\n let width = 0;\n firstTable.querySelectorAll('col').forEach(col => {\n const w = parseInt(col.getAttribute('width'), 10);\n if (!isNaN(w)) width += w;\n });\n\n containers.forEach(container => {\n const tables = container.querySelectorAll('table');\n if (type === 'body') {\n container.style.flex = `1`;\n } else {\n container.style.flex = `0 0 ${width}px`;\n container.style.width = `${width}px`;\n container.style.minWidth = `${width}px`;\n container.style.maxWidth = `${width}px`;\n }\n });\n });\n };\n\n #renderSplitContainers = () => {\n const colTypes = [\n { selector: '.ng-container-left', type: 'left' },\n { selector: '.ng-container-body', type: null },\n { selector: '.ng-container-right', type: 'right' }\n ];\n\n colTypes.forEach(({ selector, type }) => {\n this.querySelector(`.ng-sheet-body ${selector}`).appendChild(this.#createSplitTable(type));\n });\n };\n\n #createSplitTable = (targetFixedType) => {\n\n const $tbl = this.#source.table.cloneNode(true);\n\n if (targetFixedType === 'left') {\n $tbl.querySelectorAll(\"col, th, td\").forEach($el => {\n if ($el.getAttribute(\"fixed\") !== \"left\") $el.remove();\n });\n } else if (targetFixedType === 'right') {\n $tbl.querySelectorAll(\"col, th, td\").forEach($el => {\n if ($el.getAttribute(\"fixed\") !== \"right\") $el.remove();\n });\n } else {\n $tbl.querySelectorAll(\"[fixed=left], [fixed=right]\").forEach($el => {\n $el.remove();\n });\n }\n\n return $tbl;\n };\n\n getRowHeight = () => {\n return this.#rowManager.getRowHeight();\n };\n\n getViewHeight = () => {\n\n const viewHeight = this.#elements.content.offsetHeight || 0;\n\n const fixedHeight = (this.#elements.body.thead?.offsetHeight || 0) +\n (this.#elements.body.tfoot?.offsetHeight || 0) +\n (this.#elements.body.tbody.head.offsetHeight || 0);\n\n return viewHeight - fixedHeight;\n };\n\n isLastRow = () => {\n\n const sheet = this.querySelector('.ng-sheet-body');\n const tbody = this.querySelector(\".ng-container-body tbody.body\");\n\n const offsetHeight = (this.#elements.body.tfoot?.offsetHeight || 0);\n\n const sheetBottom = sheet.getBoundingClientRect().bottom;\n const tbodyBottom = tbody.getBoundingClientRect().bottom;\n\n return (sheetBottom - offsetHeight) >= tbodyBottom;\n };\n\n scrollToX = (scrollLeft) => {\n const bodyContainer = this.querySelector('.ng-sheet-body .ng-container-body');\n if (bodyContainer) bodyContainer.scrollLeft = scrollLeft;\n };\n\n scrollToY = (scrollTop) => {\n const bodyViewport = this.querySelector('.ng-sheet-body');\n if (bodyViewport) bodyViewport.scrollTop = scrollTop;\n };\n\n #init = () => {\n\n this.#render();\n\n this.#cellSelection = new CellSelection(this);\n this.#cellNavigation = new CellNavigation(this);\n this.#colResizer = new ColResizer(this);\n this.#colMover = new ColMover(this);\n this.#colFix = new ColFixManager(this);\n\n this.#view = new SheetView(this);\n this.#filtering = new Filtering(this);\n this.#grouping = new GroupingManager(this);\n\n if (!this.#isSimple) {\n this.#sorting = new Sorting(this);\n }\n\n this.#elements.mainBody.addEventListener('scroll', (e) => {\n this.querySelectorAll(\"nine-table-filter-panel,cell-combo-panel\").forEach($el => {\n $el.classList.remove('active');\n });\n this.querySelector(\"nine-table-hscrollbar\").refresh();\n });\n };\n\n\n\n #render = () => {\n\n this.setAttribute(\"tabindex\", \"0\");\n\n this.innerHTML = `\n <div class=\"ng-sheet-body\">\n <div class=\"ng-sheet-body-content\">\n <div class=\"ng-container-left\"></div>\n <div class=\"ng-container-body\">\n \n </div>\n <div class=\"ng-container-right\"></div>\n </div>\n <div class=\"ng-virtual-height-holder\"></div>\n </div>\n\n <div class=\"nodata-overlay\">Data Not Found</div>\n\n <nine-table-vscrollbar></nine-table-vscrollbar>\n <nine-table-hscrollbar></nine-table-hscrollbar>\n <div class=\"scroll-edge\"></div>\n \n <nine-table-col-resizer-panel></nine-table-col-resizer-panel>\n \n \n <div class=\"ng-col-mover-grip\"></div>\n <div class=\"ng-col-mover-indi\"></div>\n `;\n\n this.#elements = {\n mainBody: this.querySelector('.ng-sheet-body .ng-container-body'),\n hscrollbar: this.querySelector('nine-table-hscrollbar'),\n vscrollbar: this.querySelector('nine-table-vscrollbar'),\n content: this.querySelector('.ng-sheet-body .ng-sheet-body-content'),\n scrollHolder: this.querySelector('.ng-sheet-body .ng-virtual-height-holder'),\n }\n };\n\n #syncHeaderAndFooterHeights = () => {\n\n const leftTable = this.querySelector('.ng-container-left table');\n const bodyTable = this.querySelector('.ng-container-body table');\n const rightTable = this.querySelector('.ng-container-right table');\n\n const leftHeaderRows = Array.from(leftTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n const bodyHeaderRows = Array.from(bodyTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n const rightHeaderRows = Array.from(rightTable.querySelectorAll('thead tr:not(.col-indicator-rowgroup)'));\n\n this.#applyMaxHeights(leftHeaderRows, bodyHeaderRows, rightHeaderRows);\n\n const leftFooterRows = Array.from(leftTable.querySelectorAll('tfoot tr'));\n const bodyFooterRows = Array.from(bodyTable.querySelectorAll('tfoot tr'));\n const rightFooterRows = Array.from(rightTable.querySelectorAll('tfoot tr'));\n\n this.#applyMaxHeights(leftFooterRows, bodyFooterRows, rightFooterRows);\n };\n\n #applyMaxHeights = (leftRows, bodyRows, rightRows) => {\n\n setTimeout(() => {\n const maxRows = Math.max(leftRows.length, bodyRows.length, rightRows.length);\n\n for (let i = 0; i < maxRows; i++) {\n\n const heights = [\n leftRows[i]?.getBoundingClientRect().height || 0,\n bodyRows[i]?.getBoundingClientRect().height || 0,\n rightRows[i]?.getBoundingClientRect().height || 0\n ];\n const maxHeight = Math.max(...heights);\n\n if (maxHeight > 0) {\n if (leftRows[i]) leftRows[i].style.height = `${maxHeight}px`;\n if (bodyRows[i]) bodyRows[i].style.height = `${maxHeight}px`;\n if (rightRows[i]) rightRows[i].style.height = `${maxHeight}px`;\n }\n }\n });\n };\n\n #initRowHoverEvent = () => {\n const bodyViewport = this.querySelector('.ng-sheet-body');\n if (!bodyViewport) return;\n\n let activeRowIndex = null;\n\n bodyViewport.addEventListener('mouseover', (e) => {\n const tr = e.target.closest('tr');\n if (!tr || !tr.dataset.row && tr.dataset.row !== '0') return;\n\n const rowIndex = tr.dataset.row;\n if (activeRowIndex === rowIndex) return;\n activeRowIndex = rowIndex;\n\n bodyViewport.querySelectorAll(`tr[data-row=\"${rowIndex}\"]`).forEach($tr => {\n $tr.classList.add('hover');\n });\n });\n\n bodyViewport.addEventListener('mouseout', (e) => {\n const tr = e.target.closest('tr');\n if (!tr) return;\n\n const relatedTarget = e.relatedTarget;\n if (tr.contains(relatedTarget)) return;\n\n bodyViewport.querySelectorAll('tr.hover').forEach($tr => {\n $tr.classList.remove('hover');\n });\n activeRowIndex = null;\n });\n }\n\n #bindApiMethods = () => {\n //const apis = [this.#sheetAPI, this.#dataAPI];\n const apis = [this.#api];\n\n apis.forEach(api => {\n // api ์ธ์Šคํ„ด์Šค(this)์— ์ง์ ‘ ์„ ์–ธ๋œ ์†์„ฑ๋“ค๊ณผ ํ”„๋กœํ† ํƒ€์ž… ์†์„ฑ์„ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ด\n // Reflect.ownKeys๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹ฌ๋ณผ์ด๋‚˜ ์ˆจ๊ฒจ์ง„ ํ”„๋กœํผํ‹ฐ๊นŒ์ง€ ์•ˆ์ „ํ•˜๊ฒŒ ํƒ์ƒ‰ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.\n const keys = new Set([\n ...Reflect.ownKeys(api),\n ...Reflect.ownKeys(Object.getPrototypeOf(api))\n ]);\n\n keys.forEach(key => {\n // constructor๋‚˜ ๋‚ด๋ถ€ ํ”„๋ผ์ด๋น— ๋ฉค๋ฒ„(#)๋Š” ์ œ์™ธ\n if (key === 'constructor' || String(key).startsWith('#')) return;\n\n const target = api[key];\n\n if (typeof target === 'function') {\n if (!this[key]) {\n //trace.log(`[Binding Function] ${key}`);\n this[key] = (...args) => target.apply(api, args);\n }\n } else if (target !== null && typeof target === 'object') {\n\n if (!this[key]) {\n //trace.log(`[Binding Object Namespace] ${key}`);\n this[key] = target; // ๊ฐ์ฒด ๋„ค์ž„์ŠคํŽ˜์ด์Šค(์˜ˆ: row) ํ†ต์งธ๋กœ ์—ฐ๊ฒฐ\n }\n }\n });\n });\n }\n\n disconnectedCallback() {\n this.#colResizer?.destroy();\n this.#colMover?.destroy();\n this.innerHTML = '';\n }\n}\n\nif (!customElements.get('nine-table-sheet')) {\n customElements.define('nine-table-sheet', NineTableSheet);\n}","import { trace } from \"@nopeer\";\nimport '@/layout/nine-table-sheets.js';\nimport '@/layout/nine-table-sheets-footer.js';\nimport '@/layout/nine-table-toolbar.js';\nimport { NineTableSheet } from \"@/layout/nine-table-sheet.js\";\nimport {PreCompiler} from \"@/layout/core/PreCompiler.js\";\nimport {NINE_TABLE} from \"@\";\n\nexport class LayoutManager {\n #host;\n\n constructor(owner) {\n this.#host = owner;\n this.#init();\n }\n\n #init = () => {\n this.#render();\n this.#initEvent();\n }\n\n set loading(val) {\n if (!!val) {\n this.#host.classList.add(\"loading\");\n } else {\n this.#host.classList.remove(\"loading\");\n }\n }\n\n\n\n #render = () => {\n\n const rawElements = Array.from(this.#host.children);\n const rawTables = rawElements.filter(el => (el.tagName.toUpperCase() === 'TABLE') );\n const sheetCount = rawTables.length;\n\n const sheetsHtml = rawTables.map((tbl, idx) => {\n const className = idx === 0 ? 'active' : '';\n const sheetId = tbl.id || `sheet${idx + 1}`;\n\n const sheetTag = `<nine-table-sheet class=\"${className}\" data-index=\"${idx}\" data-sheet-id=\"${sheetId}\" id=\"${sheetId}\"></nine-table-sheet>`;\n const splitterTag = idx < sheetCount - 1 ? `<nine-splitter class=\"h\" data-split-index=\"${idx}\"></nine-splitter>` : '';\n return sheetTag + splitterTag;\n }).join('');\n\n const cssImports = [\n `@import \"https://cdn.jsdelivr.net/npm/@ninebone/datagrid@${__APP_VERSION__}/dist/css/nine-table.css\";`,\n ];\n\n if (nine[\"nine-table\"] && nine[\"nine-table\"].cssFile) {\n cssImports.push(`@import \"${nine[\"nine-table\"].cssFile}\";`);\n }\n\n this.#host.shadowRoot.innerHTML = `\n <style>\n ${cssImports.join('\\n')}\n ${this.#host.provider.style.value}\n </style>\n \n <nine-table-toolbar></nine-table-toolbar>\n\n <nine-table-body>\n <nine-table-summary></nine-table-summary>\n <div class=\"ng-loading-bar\"></div>\n <nine-table-sheets>\n <nine-table-sheets-body>\n ${sheetsHtml}\n </nine-table-sheets-body>\n <nine-table-sheets-footer></nine-table-sheets-footer>\n </nine-table-sheets>\n <nine-table-analysis></nine-table-analysis>\n </nine-table-body>\n <nine-table-footer></nine-table-footer>\n `;\n\n rawTables.forEach($el => {\n PreCompiler.initializeTable(this.#host, $el);\n })\n\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet, idx) => {\n $sheet.classList.add('active');\n $sheet.generateTemplate(rawTables[idx], idx);\n });\n\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet) => {\n\n setTimeout(() => {\n $sheet.generate();\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n });\n\n\n setTimeout(() => {\n this.#host.data.clear();\n });\n };\n\n #initEvent = () => {\n\n this.#host.addEventListener(NINE_TABLE.EVENT.ROW_ADDED, () => {\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n\n this.#host.addEventListener(NINE_TABLE.EVENT.ROW_REMOVED, () => {\n if (this.#isAutoHeight) this.#applyAutoHeight();\n });\n\n let lastHeight = 0; // ์ง์ „ ๋†’์ด๋ฅผ ๊ธฐ์–ตํ•  ๋ณ€์ˆ˜\n\n new ResizeObserver((entries) => {\n for (let entry of entries) {\n if (entry.target.tagName === \"NINE-TABLE\") {\n const currentHeight = entry.contentRect.height;\n\n if (currentHeight !== lastHeight) {\n lastHeight = currentHeight;\n if (this.#isAutoHeight) {\n this.#applyAutoHeight();\n }\n }\n }\n }\n }).observe(this.#host);\n };\n\n #applyAutoHeight = () => {\n this.#host.shadowRoot.querySelectorAll('nine-table-sheet').forEach(($sheet) => {\n if ($sheet.index === 0) {\n const fixedHeight = ($sheet.querySelector(\"thead\")?.offsetHeight || 0) +\n ($sheet.querySelector(\"tfoot\")?.offsetHeight || 0) +\n ($sheet.querySelector(\"tbody.head\")?.offsetHeight || 0);\n const basicHeight = this.#host.offsetHeight - $sheet.offsetHeight + fixedHeight;\n\n const h = Math.min($sheet.template.height * $sheet.view.count(), window.innerHeight * 0.8);\n\n this.#host.style.height = basicHeight + (h) + \"px\";\n }\n });\n };\n\n get #isAutoHeight() {\n return this.#host.getAttribute('auto-height') === 'true';\n }\n}","import { trace } from \"@nopeer\";\n\nexport class ExprEngine {\n #host;\n #fields;\n #exprCache = new Map(); // ๐Ÿ’ก ํ†ตํ•ฉ๋œ ๋‹จ์ผ ์บ์‹œ๋กœ ๋ชจ๋“  ์ปดํŒŒ์ผ๋œ ํ•จ์ˆ˜ ๊ด€๋ฆฌ\n\n constructor(host) {\n this.#host = host;\n this.#fields = host.fields.get();\n }\n\n rewriteExpr(expr) {\n\n if (!expr || !this.#fields.length) return expr;\n\n return expr.replace(/data\\.([a-zA-Z_$][\\w$]*)/g, (match, fieldName) => {\n const idx = this.#fields.indexOf(fieldName);\n return idx >= 0 ? `rowItem.v[${idx}]` : match;\n });\n }\n\n precompile(expr) {\n if (!expr) return expr;\n return this.rewriteExpr(expr);\n }\n\n evaluate(expr, rowItem, row = 0) {\n\n if (expr === undefined || expr === null) return \"\";\n\n try {\n const trimmedExpr = String(expr).trim();\n const compiledExpr = this.rewriteExpr(trimmedExpr);\n\n if (compiledExpr.includes(\"provider.\") || compiledExpr.includes(\"host.\") || compiledExpr.includes(\"data.\") || compiledExpr.includes(\"rowItem.v\") || compiledExpr.includes(\"(\")) {\n\n let evalFn = this.#exprCache.get(compiledExpr);\n\n if (!evalFn) {\n evalFn = new Function('rowItem', 'row', 'host', `\n const data = rowItem;\n const provider = host;\n\n if (!data && !host) return \"\";\n return ${compiledExpr};\n `);\n\n this.#exprCache.set(compiledExpr, evalFn);\n }\n\n return evalFn(rowItem, row, this.#host);\n }\n\n return compiledExpr;\n } catch (e) {\n /**\n if (expr.includes(\"getCommonCode\")) {\n console.trace(\"ExprEngine evaluation error:\", e);\n } */\n return expr;\n }\n }\n}","import { trace } from \"@nopeer\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\n\nexport class DataAPI {\n\n #host;\n\n constructor(host) {\n this.#host = host;\n }\n\n provider = {\n // ์Šคํƒ€์ผ ๋ฐ์ดํ„ฐ๋ฅผ provider ๊ฐ์ฒด ๋‚ด๋ถ€์—์„œ ์ง์ ‘ ๊ด€๋ฆฌ (์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ ์ถ•์•ฝํ˜• ์‚ฌ์šฉ)\n style: {\n value: '',\n },\n add: (providerObj) => {\n if (!providerObj || typeof providerObj !== 'object') return;\n\n const { style, ...methods } = providerObj;\n\n if (style && typeof style === 'string') {\n this.provider.style.value = style;\n }\n\n if (Object.keys(methods).length > 0) {\n setTimeout(() => {\n Object.entries(methods).forEach(([name, fn]) => {\n if (typeof fn === 'function') {\n this.#host[name] = fn;\n }\n });\n\n this.#host.rerenderer();\n });\n }\n },\n }\n\n}","export class NineTableAPI {\n #host;\n\n constructor(host) {\n this.#host = host;\n\n // ๊ด€๋ฆฌํ•  ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋“ค์„ ๋ฐฐ์—ด๋กœ ์ •์˜\n const namespaces = [\"col\", \"row\"]; // ๋‚˜์ค‘์— \"col\", \"cell\" ๋“ฑ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋!\n\n namespaces.forEach(ns => {\n this[ns] = new Proxy({}, {\n get: (target, prop) => {\n const $sheet = this.#getActiveSheet();\n if (!$sheet || !$sheet[ns]) return undefined;\n\n const targetMethod = $sheet[ns][prop];\n\n if (typeof targetMethod === 'function') {\n return (...args) => targetMethod.apply($sheet[ns], args);\n }\n return targetMethod;\n }\n });\n });\n }\n\n getActiveSheets() {\n return this.#host.shadow.querySelectorAll('nine-table-sheet.active');\n }\n\n #getActiveSheet() {\n const arr = this.getActiveSheets();\n return arr.length > 0 ? arr[0] : null;\n }\n}","import { trace } from \"@nopeer\";\nimport { ngDataManager } from '@/data/ngDataManager.js';\nimport { fields } from \"@/data/Fields.js\";\nimport { LayoutManager } from '@/layout/core/LayoutManager.js';\nimport { ExprEngine } from \"@/core/ExprEngine.js\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { DataAPI } from '../api/DataAPI.js';\nimport { NineTableAPI } from '../api/NineTableAPI.js';\n\nexport default class NineTable extends HTMLElement {\n #shadowRoot;\n #dataManager;\n #layoutManager;\n #dataApi;\n #sheetApi;\n #templateCnt = 0;\n\n constructor() {\n super();\n\n if ([\"NINE-TABLE\"].includes(this.tagName)) {\n trace.log(\"Welcome nine-table\", __APP_VERSION__);\n }\n\n this.#shadowRoot = this.attachShadow({ mode: 'open' });\n this.#dataManager = new ngDataManager(this);\n\n this.#dataApi = new DataAPI(this);\n this.#sheetApi = new NineTableAPI(this);\n\n this.#bindApiMethods();\n }\n\n connectedCallback() {\n setTimeout(() => {\n this.#templateCnt = this.querySelectorAll(\"table\")?.length;\n\n this.fields = new fields(this);\n this.exprEngine = new ExprEngine(this);\n\n this.#bindDynamicSetters();\n\n this.#layoutManager = new LayoutManager(this);\n\n this.#dispatchLoad();\n });\n }\n\n disconnectedCallback() {\n //trace.log('NineTable disconnected.');\n }\n\n #dispatchLoad = () => {\n\n let checkCount = 0;\n const maxChecks = 50; // ์ตœ๋Œ€ 5์ดˆ ๋Œ€๊ธฐ (100ms * 50)\n\n const checkTimer = setInterval(() => {\n checkCount++;\n\n const sheets = this.shadow.querySelectorAll('nine-table-sheet');\n\n if (checkCount >= maxChecks) {\n clearInterval(checkTimer);\n }\n\n if (sheets.length >= this.#templateCnt) {\n let loadSheetCnt = 0;\n sheets.forEach($sheet => {\n if ($sheet.loaded) loadSheetCnt++;\n });\n\n if (loadSheetCnt >= this.#templateCnt) {\n clearInterval(checkTimer);\n this.loaded = true;\n this.dispatchEvent(new CustomEvent(NINE_TABLE.EVENT.LOAD, { bubbles: true, detail: { target: this } }));\n }\n }\n }, 100);\n }\n\n // ๐ŸŽฏ ๊ณตํ†ต ๋ฐ์ดํ„ฐ & API ์ ‘๊ทผ์ž\n get shadow() { return this.#shadowRoot; }\n get dataManager() { return this.#dataManager; }\n get data() { return this.#dataManager.data; }\n //get row() { return this.#dataManager.row; }\n\n\n\n\n\n setData(records) {\n this.#dataManager.data.set(records);\n this.refresh();\n }\n\n refresh() {\n this.activeSheet?.invalidate();\n }\n\n\n set loading(val) {\n if (this.#layoutManager) this.#layoutManager.loading = val;\n }\n\n rerenderer() {\n\n this.activeSheet?.querySelectorAll(\"tbody.body th,tbody.body td\").forEach(($cell) => {\n const customComp = Array.from($cell.children).find($el => {\n return $el.tagName.toLowerCase().startsWith('cell-') && typeof $el.rerenderer === 'function'\n });\n\n customComp?.rerenderer();\n })\n }\n\n sheet = (idOrIndex) => {\n if (idOrIndex === null || idOrIndex < 0) return this.activeSheet;\n const sheets = Array.from(this.shadow.querySelectorAll('nine-table-sheet'));\n\n if (typeof idOrIndex === 'number') return sheets[idOrIndex] || null;\n if (typeof idOrIndex === 'string') {\n return this.shadow.querySelector(`nine-table-sheet#${idOrIndex}, nine-table-sheet[data-sheet-id=\"${idOrIndex}\"]`) || null;\n }\n return sheets[0] || null;\n }\n\n get sheets() {\n return Array.from(this.shadow.querySelectorAll('nine-table-sheet'));\n }\n\n get activeSheet() {\n return this.shadow.querySelector('nine-table-sheet.active') || null;\n }\n\n #bindDynamicSetters() {\n const extractedMethodNames = new Set();\n\n this.querySelectorAll('[data-source]').forEach(el => {\n const dataSource = el.getAttribute('data-source');\n if (!dataSource) return;\n\n const matches = dataSource.matchAll(/(?:host\\.)?([a-zA-Z0-9_$]+)\\s*\\(/g);\n for (const match of matches) {\n const name = match[1];\n if (name && name !== 'host') {\n extractedMethodNames.add(name);\n }\n }\n });\n\n extractedMethodNames.forEach(methodName => {\n let internalValue = null;\n\n Object.defineProperty(this, methodName, {\n set: (newValue) => {\n internalValue = newValue;\n\n this.rerenderer();\n },\n get: () => internalValue,\n configurable: true,\n enumerable: true\n });\n });\n }\n\n execute = (fn) => {\n setTimeout(() => {\n this.loading = true;\n setTimeout(() => {\n try {\n fn.call(this);\n } finally {\n this.loading = false;\n }\n });\n });\n }\n\n #bindApiMethods() {\n\n const apis = [this.#dataApi, this.#sheetApi];\n\n apis.forEach(api => {\n // api ์ธ์Šคํ„ด์Šค(this)์— ์ง์ ‘ ์„ ์–ธ๋œ ์†์„ฑ๋“ค๊ณผ ํ”„๋กœํ† ํƒ€์ž… ์†์„ฑ์„ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ด\n // Reflect.ownKeys๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹ฌ๋ณผ์ด๋‚˜ ์ˆจ๊ฒจ์ง„ ํ”„๋กœํผํ‹ฐ๊นŒ์ง€ ์•ˆ์ „ํ•˜๊ฒŒ ํƒ์ƒ‰ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.\n const keys = new Set([\n ...Reflect.ownKeys(api),\n ...Reflect.ownKeys(Object.getPrototypeOf(api))\n ]);\n\n keys.forEach(key => {\n // constructor๋‚˜ ๋‚ด๋ถ€ ํ”„๋ผ์ด๋น— ๋ฉค๋ฒ„(#)๋Š” ์ œ์™ธ\n if (key === 'constructor' || String(key).startsWith('#')) return;\n\n const target = api[key];\n\n if (typeof target === 'function') {\n if (!this[key]) {\n //trace.log(`[Binding Function] ${key}`);\n this[key] = (...args) => target.apply(api, args);\n }\n } else if (target !== null && typeof target === 'object') {\n if (!this[key]) {\n //trace.log(`[Binding Object Namespace] ${key}`, target);\n this[key] = target; // ๊ฐ์ฒด ๋„ค์ž„์ŠคํŽ˜์ด์Šค(์˜ˆ: row) ํ†ต์งธ๋กœ ์—ฐ๊ฒฐ\n }\n }\n });\n });\n }\n}\n\nif (!customElements.get('nine-table')) {\n customElements.define('nine-table', NineTable);\n}\n\nif (!customElements.get('nine-table-simple')) {\n customElements.define('nine-table-simple', class extends NineTable {\n connectedCallback() {\n this.setAttribute('theme', 'simple');\n\n super.connectedCallback();\n }\n });\n}","export class BasicCellElement extends HTMLElement {\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tapplyBaseStyle() {\n\t}\n\n\tconnectedCallback() {\n\t}\n}","import { trace } from \"@nopeer\";\nimport { BasicCellElement } from './BasicCellElement.js';\n\nconst exprCache = new Map();\n\nexport class CellElement extends BasicCellElement {\n\t#host;\n\t#sheet;\n\t#tr;\n\t#cell;\n\t#attr;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tget #updateRowState() {\n\t\treturn this.#cell.getAttribute(\"update-row-state\") === \"false\";\n\t}\n\n\tget host() { return this.#host; }\n\tget sheet() { return this.#sheet; }\n\tget cell() { return this.#cell; }\n\tget tr() { return this.#tr; }\n\tget attr() { return this.#attr; }\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#host = this.getRootNode().host;\n\n\t\tthis.#cell = this.closest(\"th,td\");\n\t\tthis.#tr = this.#cell.closest(\"tr\");\n\t\tthis.#sheet = this.#tr.closest(\"nine-table-sheet\");\n\n\t\tthis.#cell.classList.add(this.tagName);\n\n\t\tthis.#attr = {};\n\t\tfor (let i = 0; i < this.#cell.attributes.length; i++) {\n\t\t\tconst name = this.#cell.attributes[i].name;\n\t\t\tif (![\"text-align\",\"class\",\"cell-type\",\"data-bind\",\"data-expr\",\"data-col\",\"tabindex\"].includes(name)) {\n\t\t\t\tthis.#attr[name] = this.#cell.attributes[i].value;\n\t\t\t\t//this.setAttribute(name, this.#cell.attributes[i].value);\n\t\t\t}\n\t\t}\n\n\t\tif (!this.#cell) return;\n\n\n\t\tconst root = this.shadowRoot || this;\n\n\t\t// ๐ŸŽฏ ๋ฒ„ํŠผ ์ด๋ฒคํŠธ ์—ฐ๊ฒฐ\n\t\troot.querySelectorAll(\"button, ng-expand-button\").forEach(button => {\n\t\t\tbutton.addEventListener(\"click\", () => {\n\t\t\t\tlet fn = this.getAttribute(\"onbuttonclick\") || this.getAttribute(\"onButtonClick\") || this.#cell?.getAttribute(\"onbuttonclick\") || this.#cell?.getAttribute(\"onButtonClick\");\n\n\t\t\t\tconst rowData = this.data; // Proxy Lazy ์ ‘๊ทผ\n\t\t\t\tconst curRow = parseInt(this.#cell.dataset.row, 10);\n\n\t\t\t\tif (fn && this.#host) {\n\t\t\t\t\tfn = fn.replace(\"()\", \"\");\n\t\t\t\t\tconst match = fn.match(/^(\\w+)\\s*\\(/);\n\t\t\t\t\tconst methodName = match?.[1] || fn;\n\n\t\t\t\t\tif (typeof this.#host[methodName] === 'function') {\n\t\t\t\t\t\tthis.#host[methodName].call(this.#host, rowData, curRow, this.#cell);\n\t\t\t\t\t} else if (typeof this.#host.exprFunction === 'function') {\n\t\t\t\t\t\tthis.#host.exprFunction(fn).call(this, rowData, curRow);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t/**\n\t\t\t\tthis.#host?.dispatchEvent(new CustomEvent(ninegrid.EVENT.BUTTON_CLICK, {\n\t\t\t\t\tdetail: { target: this.#cell, data: rowData, currow: curRow },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true\n\t\t\t\t})); */\n\t\t\t});\n\t\t});\n\n\t\t// ๐ŸŽฏ ๋งํฌ ์ด๋ฒคํŠธ ์—ฐ๊ฒฐ\n\t\tconst renderer = root.querySelector(\".renderer\");\n\t\tif (renderer && this.getAttribute(\"link\") === \"true\") {\n\t\t\trenderer.classList.add(\"link\");\n\n\t\t\trenderer.addEventListener(\"click\", () => {\n\t\t\t\tlet fn = this.getAttribute(\"onlinkclick\") || this.getAttribute(\"onLinkClick\");\n\n\t\t\t\tconst rowData = this.data;\n\t\t\t\tconst curRow = parseInt(this.#cell.dataset.row, 10);\n\n\t\t\t\tif (fn && this.#host) {\n\t\t\t\t\tfn = fn.replace(\"()\", \"\");\n\t\t\t\t\tconst match = fn.match(/^(\\w+)\\s*\\(/);\n\t\t\t\t\tconst methodName = match?.[1] || fn;\n\n\t\t\t\t\tif (typeof this.#host[methodName] === 'function') {\n\t\t\t\t\t\tthis.#host[methodName].call(this.#host, rowData, curRow, this.#cell);\n\t\t\t\t\t} else if (typeof this.#host.exprFunction === 'function') {\n\t\t\t\t\t\tthis.#host.exprFunction(fn).call(this, rowData, curRow);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.#host?.dispatchEvent(new CustomEvent(ninegrid.EVENT.LINK_CLICK, {\n\t\t\t\t\tdetail: { target: this.#cell, data: rowData, currow: curRow },\n\t\t\t\t\tbubbles: true,\n\t\t\t\t\tcomposed: true\n\t\t\t\t}));\n\t\t\t});\n\t\t}\n\t}\n\n\tget data() {\n\t\tconst rawRecord = this.#tr?.data;\n\t\tif (!rawRecord) return null;\n\t\tif (!rawRecord.v) return rawRecord;\n\n\t\tconst host = this.#host;\n\n\t\treturn new Proxy(rawRecord, {\n\t\t\tget(target, prop) {\n\t\t\t\tif (prop === '__ng') return target.__ng;\n\t\t\t\tif (prop === 'v') return target.v;\n\n\t\t\t\tconst idx = host?.fields?.indexOf?.(prop) ?? -1;\n\t\t\t\treturn idx >= 0 ? target.v[idx] : target[prop];\n\t\t\t}\n\t\t});\n\t}\n\n\tget value() {\n\t\tif (!this.#cell || !this.#tr?.data) return \"\";\n\n\t\tconst bindKey = this.#cell.dataset?.bind;\n\t\tif (!bindKey) return \"\";\n\n\t\tconst rawRecord = this.#tr.data;\n\n\t\tif (rawRecord.v && Array.isArray(rawRecord.v)) {\n\t\t\tconst colIdx = this.#host.fields.get().indexOf(bindKey) ?? -1;\n\t\t\treturn colIdx >= 0 ? (rawRecord.v[colIdx] ?? \"\") : \"\";\n\t\t}\n\n\t\treturn rawRecord[bindKey] ?? \"\";\n\t}\n\n\tset value(v) {\n\t\tif (!this.#cell || !this.#host?.data) return;\n\n\t\tconst row = parseInt(this.#tr.dataset.row, 10);\n\t\tconst bindKey = this.#cell.dataset.bind;\n\t\tif (isNaN(row) || !bindKey) return;\n\n\t\t//update-row-state\n\t\tthis.#host.data.setValue(row, bindKey, v, this.#updateRowState);\n\t}\n\n\tget row() {\n\t\treturn parseInt(this.#cell?.dataset?.row, 10);\n\t}\n\tget index() {\n\t\treturn parseInt(this.#cell?.dataset?.index, 10);\n\t}\n\n\tisValid() {\n\t\treturn this.#cell.classList.contains(\"invalid\") ? false : true;\n\t}\n\n\tisInvalid() {\n\t\treturn !this.isValid();\n\t}\n\n\tgetDisplayText = (defaultValue = \"\") => {\n\n\t\tif (!this.#cell || !this.#cell.closest(\"tbody\")) return defaultValue;\n\n\t\tconst rawRecord = this.#tr.data;\n\n\t\tif (!rawRecord) return defaultValue;\n\n\t\tconst expr = this.#cell.dataset.expr;\n\t\tconst bindKey = this.#cell.dataset.bind;\n\t\tconst row = parseInt(this.#cell.dataset.row, 10);\n\n\t\tif (expr) {\n\t\t\ttry {\n\t\t\t\tif (this.#tr.getAttribute(\"grouping\") === \"true\") {\n\n\t\t\t\t\treturn this.getGroupExprValue(expr, this.#tr.data, row, this.#cell);\n\t\t\t\t} else {\n\t\t\t\t\treturn this.#host.exprEngine.evaluate(expr, this.#tr.data, row);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\treturn defaultValue;\n\t\t\t}\n\t\t}\n\n\t\tif (bindKey) {\n\t\t\tconst val = this.value;\n\t\t\treturn val !== null && val !== undefined ? val : defaultValue;\n\t\t}\n\n\t\treturn defaultValue;\n\t};\n\n\n\n\trefresh() {\n\n\t\tif (!this.#cell || !this.#tr) return;\n\n\t\tconst val = this.value;\n\n\t\tthis.#cell.classList.remove(\"invalid\");\n\n\t\t[\"color\",\"background\",\"background-color\",\"visible\",\"enable\",\"validator\"].forEach(v => {\n\n\t\t\tconst expr = this.#attr[v];\n\t\t\tif (expr) {\n\t\t\t\tconst result = this.#host.exprEngine.evaluate(expr, this.#tr.data, parseInt(this.#cell.dataset.row, 10));\n\n\t\t\t\tif (v === \"validator\") {\n\t\t\t\t\tif (!result) {\n\t\t\t\t\t\tthis.#cell.classList.add(\"invalid\");\n\t\t\t\t\t}\n\t\t\t\t} else if (v === \"visible\") {\n\t\t\t\t\tthis.style[\"display\"] = result ? \"\" : \"none\";\n\t\t\t\t} else if (v === \"enable\") {\n\t\t\t\t\tthis.querySelectorAll(\"input, button, textarea, select\").forEach($el => {\n\t\t\t\t\t\t$el.disabled = !result;\n\t\t\t\t\t});\n\n\t\t\t\t\tif (!!result) {\n\t\t\t\t\t\tthis.#cell.removeAttribute(\"disabled\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.#cell.setAttribute(\"disabled\", \"true\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.#cell.style[v] = result;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn val;\n\t}\n\n\tgetExprValue(expr, data, row) {\n\t\tif (!this.#host || !this.#host.exprEngine || expr === undefined || expr === null || expr === \"\") return expr;\n\n\t\treturn this.#host.exprEngine.evaluate(expr, data, row);\n\t}\n\n\tgetGroupExprValue = (expr, groupRecord, row, cell) => {\n\t\tif (!expr) return \"\";\n\n\t\ttry {\n\t\t\trow = parseInt(row, 10);\n\t\t\tconst cleanExpr = expr.replace(\"()\", \"\").trim();\n\n\t\t\tif (this.#host && typeof this.#host[cleanExpr] === 'function') {\n\t\t\t\treturn this.#host[cleanExpr].call(this, groupRecord, row, cell);\n\t\t\t}\n\n\t\t\tconst match = cleanExpr.match(/^(\\w+)\\s*\\(\\s*([\\w\\-]*)\\s*\\)/);\n\t\t\tif (match) {\n\t\t\t\tconst indices = groupRecord[GROUP_IDX.CHILDREN];\n\t\t\t\tconst allRecords = this.#host?.data?.getArray ? this.#host.data.getArray() : [];\n\t\t\t\tconst childRecords = indices ? indices.map(idx => allRecords[idx]).filter(Boolean) : [];\n\n\t\t\t\tconst [, funcName, field] = match;\n\t\t\t\tconst host = this.#host;\n\n\t\t\t\tswitch (funcName.toLowerCase()) {\n\t\t\t\t\tcase 'count':\n\t\t\t\t\t\treturn childRecords.length;\n\n\t\t\t\t\tcase 'sum': {\n\t\t\t\t\t\tconst colIdx = host?.fields?.indexOf?.(field) ?? -1;\n\t\t\t\t\t\treturn childRecords.reduce((acc, record) => {\n\t\t\t\t\t\t\tconst val = colIdx >= 0 ? record.v?.[colIdx] : record[field];\n\t\t\t\t\t\t\treturn acc + (Number(val) || 0);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 'avg': {\n\t\t\t\t\t\tif (childRecords.length === 0) return 0;\n\t\t\t\t\t\tconst colIdx = host?.fields?.indexOf?.(field) ?? -1;\n\t\t\t\t\t\tconst sum = childRecords.reduce((acc, record) => {\n\t\t\t\t\t\t\tconst val = colIdx >= 0 ? record.v?.[colIdx] : record[field];\n\t\t\t\t\t\t\treturn acc + (Number(val) || 0);\n\t\t\t\t\t\t}, 0);\n\t\t\t\t\t\treturn sum / childRecords.length;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 3. ํ˜ธ์ŠคํŠธ์˜ exprFunction ํ™œ์šฉ\n\t\t\tif (this.#host && typeof this.#host.exprFunction === 'function') {\n\t\t\t\treturn this.#host.exprFunction(expr).call(this, groupRecord, row, this.#host.data);\n\t\t\t}\n\n\t\t\tif (expr.includes(\"data.\") || expr.includes(\"childRecords\") || expr.includes(\"groupRecord\")) {\n\t\t\t\tlet evalFn = exprCache.get(\"grp_\" + expr);\n\t\t\t\tif (!evalFn) {\n\t\t\t\t\tevalFn = new Function('groupRecord', 'row', 'cell', 'host', `\n const indices = groupRecord[3]; // GROUP_IDX.CHILDREN = 3\n const allRecords = host?.data?.getArray ? host.data.getArray() : [];\n \n let childRecords = [];\n if (Array.isArray(indices)) {\n // indices๊ฐ€ ์ˆซ์ž ์ธ๋ฑ์Šค ๋ฐฐ์—ด์ธ์ง€, rowid ๋ฌธ์ž์—ด ๋ฐฐ์—ด์ธ์ง€ ํŒ๋ณ„ํ•˜์—ฌ ์•ˆ์ „ํ•˜๊ฒŒ ์ถ”์ถœ\n childRecords = indices.map(idx => {\n if (typeof idx === 'number') {\n return allRecords[idx];\n } else {\n // rowid ๋“ฑ ๋ฌธ์ž์—ด ์‹๋ณ„์ž์ธ ๊ฒฝ์šฐ ์ „์ฒด ๋ฐฐ์—ด์—์„œ ์ฐพ๊ฑฐ๋‚˜ dataManager ํ™œ์šฉ\n return allRecords.find(r => r?.__ng?.rowid === idx || r?.m?._?.[0] === idx);\n }\n }).filter(Boolean);\n }\n \n // ๋งŒ์•ฝ ์œ„์—์„œ ๋ชป ์ฐพ์•˜๋Š”๋ฐ host.grouping์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋งค๋‹ˆ์ € ์œ„์ž„ ์‹œ๋„\n if (childRecords.length === 0 && host?.grouping?.getChildrenRecords && groupRecord[0]) {\n childRecords = host.grouping.getChildrenRecords(groupRecord[0]);\n }\n\n const data = childRecords; // data.length ๋“ฑ์„ ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ˜ธํ™˜\n return ${expr};\n `);\n\t\t\t\t\texprCache.set(\"grp_\" + expr, evalFn);\n\t\t\t\t}\n\t\t\t\treturn evalFn(groupRecord, row, cell, this.#host);\n\t\t\t}\n\n\t\t\treturn expr;\n\t\t} catch (e) {\n\t\t\tconsole.error(\"Group expr evaluation error:\", expr, e);\n\t\t\treturn expr;\n\t\t}\n\t};\n}\n\nexport class EditableCellElement extends CellElement {\n\n\tget host() { return super.host; }\n\tget sheet() { return super.sheet; }\n\tget cell() { return super.cell; }\n\tget tr() { return super.tr; }\n\tget attr() { return super.attr; }\n\n\tgetExprValue(expr, data, row, cell) {\n\t\treturn super.getExprValue(expr, data, row, cell);\n\t}\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\t}\n\n\trefresh() {\n\t\treturn super.refresh();\n\t}\n\n\tgetExprValue = (expr, data, row, cell) => {\n\t\treturn super.getExprValue(expr, data, row, cell);\n\t}\n\n\tisValid = () => {\n\t\treturn super.isValid();\n\t}\n\n\tisInvalid = () => {\n\t\treturn super.isInvalid();\n\t}\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputText extends EditableCellElement\n{\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\t\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#initEvent();\n\t};\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\t\tthis.#target.value = v;\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#target.addEventListener(\"input\", e => {\n\t\t\tif (this.#maxbyte) {\n\t\t\t\tconst maxByteNum = Number(this.#maxbyte);\n\t\t\t\tconst currentBytes = nine.getByteLength(e.target.value);\n\n\t\t\t\tif (currentBytes > maxByteNum) {\n\t\t\t\t\te.target.value = nine.cut(e.target.value, maxByteNum);\n\t\t\t\t\tthis.value = e.target.value;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.innerHTML = `\n\t\t\t<input type=\"text\" ondragstart=\"return false;\">\n\t\t`;\n\t};\n\n\tget #maxbyte() {\n\t\treturn this.cell.getAttribute(\"maxbyte\") || this.cell.getAttribute(\"max-byte\");\n\t}\n}\n\nif (!customElements.get('cell-input')) {\n\tcustomElements.define(\"cell-input\", CellInputText);\n}\n","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputNumber extends EditableCellElement\n{\n\t#target;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#initEvent();\n\n\n\t};\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" ondragstart=\"return false;\">\n `;\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#target.addEventListener(\"keydown\", this.#onKeyDown);\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tthis.value = event.target.value;\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\n\t\tthis.#target.value = v;//v !== undefined && v !== null ? v : \"\";\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tconst v = this.#target.value;\n\n\t\tif (v !== \"\" && v !== null && v !== undefined) {\n\t\t\tconst num = Number(v);\n\n\t\t\tif (isNaN(num) || (this.#max && num > Number(this.#max)) || (this.#min && num < Number(this.#min))) {\n\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t\telse if (this.#scale) {\n\t\t\t\tconst str = String(v);\n\t\t\t\tconst idx = str.indexOf('.');\n\t\t\t\tif (idx >= 0 && str.substring(idx + 1).length > Number(this.#scale)) {\n\t\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t#onKeyDown = e => {\n\n\t\tif ([\"Escape\", \"Enter\", \"Tab\", \"Home\", \"End\", \"ArrowLeft\", \"ArrowRight\", \"PageUp\", \"PageDown\", \"Backspace\", \"Delete\"].includes(e.code)) return;\n\n\t\tconst target = e.target;\n\t\tconst value = target.value;\n\t\tconst selectionStart = target.selectionStart;\n\t\tconst key = e.key;\n\n\t\tif (key === \"-\") {\n\t\t\tif (value.includes(\"-\") || selectionStart !== 0) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (key === \".\") {\n\t\t\tconst scale = Number(this.#scale);\n\n\t\t\tif (isNaN(scale) || scale <= 0 || value.includes(\".\")) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tlet validKey = [];\n\t\tif (this.#scale && Number(this.#scale) > 0) validKey.push(\".\");\n\t\tif (this.#min || Number(this.#min) > 0) validKey.push(\"-\");\n\n\t\tconst isNumKey = (e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105);\n\n\t\tif (!isNumKey && !validKey.includes(e.key)) {\n\t\t\te.preventDefault();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#scale && isNumKey && e.target.selectionStart == e.target.selectionEnd) {\n\t\t\tconst s = e.target.value;\n\t\t\tconst idx = s.indexOf(\".\");\n\t\t\tif (idx >= 0 && e.target.selectionStart > idx) {\n\t\t\t\tconst decimalPart = s.substr(idx + 1);\n\t\t\t\tif (decimalPart.length >= Number(this.#scale)) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.#maxbyte && nine.getByteLength(e.target.value) >= Number(this.#maxbyte) && e.target.selectionStart == e.target.selectionEnd) {\n\t\t\te.preventDefault();\n\t\t}\n\t}\n\n\tget #min() {\n\t\treturn this.cell.getAttribute(\"min\") || \"\";\n\t}\n\n\tget #max() {\n\t\treturn this.cell.getAttribute(\"max\") || \"\";\n\t}\n\n\tget #scale() {\n\t\treturn this.cell.getAttribute(\"scale\") || \"\";\n\t}\n\n\tget #maxbyte() {\n\t\treturn this.cell.getAttribute(\"maxbyte\") || this.cell.getAttribute(\"max-byte\");\n\t}\n}\n\nif (!customElements.get('cell-input-number')) {\n\tcustomElements.define(\"cell-input-number\", CellInputNumber);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputColor extends EditableCellElement\n{\n\t#target;\n\t#btn;\n\t#dataSource;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input[type=color]\");\n\t\tthis.#btn = this.querySelector(\"button\");\n\n\t\t//this.#rendererColor();\n\n\t\tthis.#initEvent();\n\t};\n\n\t#initEvent = () => {\n\t\tthis.#btn.addEventListener(\"click\", () => {\n\t\t\tthis.#target.click();\n\t\t});\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"color\" ondragstart=\"return false;\">\n <button tabindex=\"-1\" type=\"button\"></button>\n `;\n\t};\n\n\trerenderer = () => {\n\t\tthis.refresh();\n\t};\n\n\t#rendererColor = () => {\n\n\t\tconst dataSource = this.cell.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, this.tr.data, this.tr.dataset.row);\n\n\t\tthis.querySelector(\"datalist\")?.remove();\n\n\t\tif (this.#dataSource && Array.isArray(this.#dataSource)) {\n\t\t\tconst datalistId = `color-list-${Math.random().toString(36).substr(2, 9)}`;\n\n\t\t\tconst datalist = document.createElement('datalist');\n\t\t\tdatalist.id = datalistId;\n\n\t\t\tconst fragment = document.createDocumentFragment();\n\n\t\t\tthis.#dataSource.forEach(v => {\n\t\t\t\tif (v.value) {\n\t\t\t\t\tconst option = document.createElement('option');\n\t\t\t\t\toption.value = v.value;\n\t\t\t\t\tfragment.appendChild(option);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdatalist.appendChild(fragment);\n\t\t\tthis.appendChild(datalist);\n\n\t\t\tthis.#target.setAttribute(\"list\", datalistId);\n\t\t}\n\t};\n\n\trefresh = () => {\n\t\tif (!this.tr.data) return;\n\n\t\tconst v = super.refresh();\n\n\t\tthis.#rendererColor();\n\n\t\tthis.#target.value = v !== undefined && v !== null && v !== \"\" ? v : \"#ffffff\";\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tconst v = this.#target.value;\n\n\t\tif (v !== \"\" && v !== null && v !== undefined) {\n\t\t\tif (!this.#isValidColor(v)) {\n\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t\telse if (this.#dataSource && Array.isArray(this.#dataSource) && this.#dataSource.length > 0) {\n\t\t\t\tconst exists = this.#dataSource.some(item => {\n\t\t\t\t\tconst itemCode = item.value !== undefined ? item.value : (item.code !== undefined ? item.code : '');\n\t\t\t\t\treturn itemCode.toLowerCase() === v.toLowerCase();\n\t\t\t\t});\n\n\t\t\t\tif (!exists) {\n\t\t\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\t#isValidColor = (v) => {\n\t\tif (typeof v !== \"string\" || v.length != 7 || !v.startsWith(\"#\")) return false;\n\n\t\tvar r = parseInt(v.substr(1, 2), 16);\n\t\tvar g = parseInt(v.substr(3, 2), 16);\n\t\tvar b = parseInt(v.substr(5, 2), 16);\n\n\t\tif (isNaN(r) || isNaN(g) || isNaN(b)) return false;\n\t\tif (r < 0 || r > 255 || g < 0 || g > 255 || b < 0 || b > 255) return false;\n\n\t\treturn true;\n\t}\n}\n\nif (!customElements.get('cell-input-color')) {\n\tcustomElements.define(\"cell-input-color\", CellInputColor);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellInputDate extends EditableCellElement\n{\n\t#target;\n\t#type;\n\n\tconstructor () {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"input\");\n\n\t\tthis.#target.addEventListener(\"input\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#target.classList.toggle(\"has-value\", !!val); // ๐Ÿ’ก ์‹ค์‹œ๊ฐ„ ๋ฐ˜์˜\n\t\t\tthis.#validate(val);\n\n\t\t\tsuper.sheet.rowManager.refresh(true);\n\t\t});\n\n\t\tthis.#target.addEventListener(\"change\", (event) => {\n\t\t\tconst val = event.target.value;\n\t\t\tthis.value = val;\n\t\t\tthis.#validate(val);\n\n\t\t\tsuper.sheet.rowManager.refresh(true);\n\t\t});\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.#type = this.cell.getAttribute(\"date-type\") || \"date\";\n\t\tif (![\"date\",\"datetime-local\",\"time\",\"week\",\"month\"].includes(this.#type)) {\n\t\t\tthrow `invalid type : ${this.#type}`;\n\t\t}\n\n\t\tlet attr = [];\n\t\tfor (let i = 0; i < this.cell.attributes.length; i++) {\n\t\t\tif ([\"value\", \"max\", \"min\", \"step\"].includes(this.cell.attributes[i].name)) {\n\t\t\t\tattr.push(`${this.cell.attributes[i].name}=\"${this.cell.attributes[i].value}\"`);\n\t\t\t}\n\t\t}\n\n\t\tthis.innerHTML = `\n <input\n type=\"${this.#type}\"\n data-placeholder=\"${this.cell.getAttribute('placeholder') || 'Select'}\"\n ${attr.join(\" \")}\n required\n />\n `;\n\t};\n\n\trefresh = () => {\n\n\t\tconst v = super.refresh();\n\n\t\tlet formattedVal = v;\n\t\tif (formattedVal) {\n\n\t\t\tswitch (this.#type) {\n\t\t\t\tcase \"date\":\n\t\t\t\t\tformattedVal = formattedVal.substr(0, 10);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"datetime-local\":\n\t\t\t\t\tformattedVal = formattedVal.substr(0, 16);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"time\":\n\t\t\t\t\tvar d = new Date(v);\n\t\t\t\t\tif (d != \"Invalid Date\" && !isNaN(d)) {\n\t\t\t\t\t\tformattedVal = (\"00\" + d.getHours()).slice(-2) + \":\" + (\"00\" + d.getMinutes()).slice(-2);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"month\":\n\t\t\t\t\tvar d = new Date(v);\n\t\t\t\t\tif (d != \"Invalid Date\" && !isNaN(d)) {\n\t\t\t\t\t\tformattedVal = (\"0000\" + d.getFullYear()).slice(-4) + \"-\" + (\"00\" + (d.getMonth() + 1)).slice(-2);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis.#target.value = formattedVal || \"\";\n\t\tthis.#target.classList.toggle(\"has-value\", !!formattedVal); // ๐Ÿ’ก ๊ฐ’์ด ์žˆ์œผ๋ฉด ํด๋ž˜์Šค ์ถ”๊ฐ€\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate(formattedVal);\n\t\t}\n\t};\n\n\t#validate = (val) => {\n\n\t\tif (val !== \"\" && val !== null && val !== undefined) {\n\t\t\tlet isValid = this.#isValidDate(val);\n\n\t\t\tif (isValid) {\n\t\t\t\tif (this.#min && val < this.#min) isValid = false;\n\t\t\t\tif (this.#max && val > this.#max) isValid = false;\n\t\t\t}\n\n\t\t\tif (!isValid) {\n\t\t\t\tsuper.cell.classList.add(\"invalid\");\n\t\t\t}\n\t\t}\n\t};\n\n\t#isValidDate = (v) => {\n\n\t\tif (typeof v !== \"string\") return false;\n\n\t\tlet isValid = true;\n\n\t\tswitch (this.#type) {\n\t\t\tcase \"date\":\n\t\t\tcase \"datetime-local\":\n\t\t\t\tconst year = Number(v.substr(0, 4));\n\t\t\t\tconst month = Number(v.substr(5, 2));\n\t\t\t\tconst day = Number(v.substr(8, 2));\n\n\t\t\t\tif (isNaN(year) || isNaN(month) || isNaN(day)) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if (month < 1 || month > 12 || day < 1 || day > 31) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if ([4, 6, 9, 11].includes(month) && day == 31) {\n\t\t\t\t\tisValid = false;\n\t\t\t\t} else if (month == 2) {\n\t\t\t\t\tlet isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));\n\t\t\t\t\tif (day > 29 || (day == 29 && !isleap)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (isValid) {\n\t\t\tswitch (this.#type) {\n\t\t\t\tcase \"datetime-local\":\n\t\t\t\t\tvar t = v.substr(10, 1);\n\t\t\t\t\tvar hour = Number(v.substr(11, 2));\n\t\t\t\t\tvar min = Number(v.substr(14, 2));\n\n\t\t\t\t\tif (t != \"T\") {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (isNaN(hour) || isNaN(min)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (hour < 0 || hour > 23 || min < 0 || min > 59) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"month\":\n\t\t\t\t\tvar year = Number(v.substr(0, 4));\n\t\t\t\t\tvar month = Number(v.substr(5, 2));\n\n\t\t\t\t\tif (isNaN(year) || isNaN(month)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (month < 1 || month > 12) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"week\":\n\t\t\t\t\tvar year = Number(v.substr(0, 4));\n\t\t\t\t\tvar w = v.substr(5, 1);\n\t\t\t\t\tvar week = Number(v.substr(6, 2));\n\n\t\t\t\t\tif (w != \"W\") {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (isNaN(year) || isNaN(week)) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t} else if (week <= 0 || week > 53) {\n\t\t\t\t\t\tisValid = false;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn isValid;\n\t}\n\n\tget #min() {\n\t\treturn this.cell.getAttribute(\"min\");\n\t}\n\n\tget #max() {\n\t\treturn this.cell.getAttribute(\"max\");\n\t}\n\n\tget #step() {\n\t\treturn this.cell.getAttribute(\"step\");\n\t}\n}\n\nif (!customElements.get('cell-input-date')) {\n\tcustomElements.define(\"cell-input-date\", CellInputDate);\n}","import { EditableCellElement } from \"./core/CellElement.js\";\nimport {trace} from \"@nopeer\";\n\nclass CellCheckbox extends EditableCellElement {\n #target;\n #label;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n this.#renderer();\n\n this.#target = this.querySelector(\"input\");\n this.#label = this.querySelector(\"span\");\n\n this.#initEvent();\n }\n\n get dataSource() {\n return [\n { value: this.trueValue, text: this.#trueText },\n { value: this.falseValue, text: this.#falseText }\n ];\n }\n\n #initEvent = () => {\n if (this.closest(\"thead\")) {\n this.#target.addEventListener(\"change\", (e) => {\n super.sheet.querySelector(`tbody.body [data-col=\"${super.cell.dataset.col}\"] cell-checkbox`)?.selectAll(e.target.checked);\n });\n }\n\n this.#target.addEventListener(\"change\", (event) => {\n if (!this.closest(\"tbody\")) return;\n\n if (this.#isRadio) {\n this.selectAll(false);\n this.value = this.trueValue;\n }\n else {\n this.value = event.target.checked ? this.trueValue : this.falseValue;\n }\n\n this.sheet.rowManager.refresh(true);\n });\n };\n\n #renderer = () => {\n\n const trueValue = this.trueValue;//this.cell.getAttribute(\"true-value\") || false;\n //const selectedBorderColor = this.getAttribute(\"selected-border-color\") || \"dimgray\";\n\n const originalContent = this.cell.getAttribute(\"content\") || \"\";\n const childHtml = this.#isRadio ? `<input type=\"radio\" value=\"${trueValue}\" />` : `<label><input type=\"checkbox\" /><span>${originalContent}</span></label>`;\n\n this.innerHTML = `\n ${childHtml}\n `;\n }\n\n refresh = () => {\n const val = super.refresh();\n\n this.#target.checked = (val === this.trueValue);\n\n if (this.isValid()) {\n this.#validate(val);\n }\n\n const displayText = (val === this.trueValue) ? this.#trueText : ((val === this.falseValue) ? this.#falseText : val);\n\n if (this.#label) {\n this.#label.textContent = displayText;\n }\n };\n\n #validate = (val) => {\n\n this.cell.classList.remove(\"invalid\");\n\n if (val !== \"\" && val !== null && val !== undefined) {\n if (val !== this.trueValue && val !== this.falseValue) {\n this.cell.classList.add(\"invalid\");\n }\n }\n };\n\n selectAll = (v) => {\n if (this.closest(\"thead\")) return; // ํ—ค๋” ์ž์‹ ์€ ์ œ์™ธ\n\n const data = this.host.data.getArray();\n const colIndex = this.host.fields.indexOf(this.cell.dataset.bind);\n\n if (colIndex < 0) return;\n\n for (let i = 0; i < data.length; i++) {\n if (this.#enable && super.getExprValue(this.#enable, data[i], i, this.cell) === false) continue;\n if (this.#readonly && super.getExprValue(this.#readonly, data[i], i, this.cell) === true) continue;\n if (this.#visible && super.getExprValue(this.#visible, data[i], i, this.cell) === false) continue;\n\n data[i].v[colIndex] = v ? this.trueValue : this.falseValue;\n }\n\n super.sheet.invalidate();\n };\n\n get trueValue() {\n return this.cell.getAttribute(\"true-value\") || \"Y\";\n }\n get falseValue() {\n return this.cell.getAttribute(\"false-value\")|| \"N\";\n }\n get #trueText() {\n return this.cell.getAttribute(\"true-text\") || \"\";\n }\n get #falseText() {\n return this.cell.getAttribute(\"false-text\") || \"\";\n }\n get #isRadio() {\n return this.cell.getAttribute(\"is-radio\") || false;\n }\n get #enable() {\n return this.cell.getAttribute(\"enable\") || false;\n }\n get #readonly() {\n return this.cell.getAttribute(\"readonly\") || false;\n }\n get #visible() {\n return this.cell.getAttribute(\"visible\") || false;\n }\n}\n\nif (!customElements.get('cell-checkbox')) {\n customElements.define(\"cell-checkbox\", CellCheckbox);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\n\nclass CellRadio extends EditableCellElement {\n\t#target;\n\t#radioList = [];\n\t#dataSource = [];\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#rendererRadio();\n\n\t\tthis.#initEvent();\n\t}\n\n\t#initEvent = () => {\n\n\t\tthis.cell.addEventListener(\"keydown\", e => {\n\n\t\t\tif (this.cell.hasAttribute(\"readonly\") || this.cell.classList.contains(\"readonly\")) return;\n\t\t\tif (this.cell.getAttribute(\"disabled\") === \"true\") return;\n\n\t\t\tif (e.code === \"Space\") {\n\t\t\t\te.preventDefault();\n\n\t\t\t\tlet matchIndex = -1;\n\n\t\t\t\tthis.#radioList.forEach(($el,index) => {\n\t\t\t\t\tif (this.value === $el.getAttribute(\"value\")) {\n\t\t\t\t\t\tmatchIndex = index;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tmatchIndex = (matchIndex === this.#radioList.length - 1) ? 0 : (matchIndex >= 0 ? matchIndex + 1 : 0);\n\t\t\t\tthis.value = this.#radioList[matchIndex].getAttribute(\"value\");\n\n\t\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t\t}\n\t\t});\n\t};\n\n\t#rendererRadio = () => {\n\n\t\tif (!this.host) return;\n\n\t\tconst dataSource = this.cell.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, this.tr.data, this.tr.dataset.row);\n\n\t\tthis.#target.replaceChildren();\n\n\t\tif (this.#dataSource && Array.isArray(this.#dataSource)) {\n\n\t\t\tconst fragment = document.createDocumentFragment();\n\n\t\t\tthis.#dataSource.forEach(v => {\n\t\t\t\tconst codeVal = v[this.#keyName] !== undefined ? v[this.#keyName] : '';\n\t\t\t\tconst nameVal = v[this.#valueName] !== undefined ? v[this.#valueName] : '';\n\n\t\t\t\tconst label = document.createElement('label');\n\n\t\t\t\tconst input = document.createElement('input');\n\t\t\t\tinput.type = 'radio';\n\t\t\t\tinput.value = codeVal;\n\n\t\t\t\tconst span = document.createElement('span');\n\t\t\t\tspan.textContent = nameVal;\n\n\t\t\t\tlabel.appendChild(input);\n\t\t\t\tlabel.appendChild(span);\n\t\t\t\tfragment.appendChild(label);\n\t\t\t});\n\n\t\t\tthis.#target.appendChild(fragment);\n\n\n\t\t\tthis.#radioList = Array.from(this.querySelectorAll(\"input\"));\n\n\n\n\t\t\tthis.#radioList.forEach($el => {\n\t\t\t\t$el.addEventListener(\"change\", (e) => {\n\t\t\t\t\tthis.value = e.target.value;\n\t\t\t\t\tthis.sheet.rowManager.refresh(true);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t};\n\n\t#renderer = () => {\n\n\t\tthis.innerHTML = `\n\t\t\t<div></div>\n `;\n\n\t\tthis.#target = this.querySelector(\"div\");\n\t};\n\n\trerenderer = () => {\n\t\tthis.#rendererRadio();\n\t\tthis.refresh();\n\t};\n\n\trefresh = () => {\n\n\t\tconst v = super.refresh();\n\n\t\tthis.#radioList.forEach($el => {\n\t\t\t$el.checked = (v === $el.value);\n\t\t});\n\n\t\tif (this.isValid()) {\n\t\t\tthis.#validate();\n\t\t}\n\t};\n\n\t#validate = () => {\n\n\t\tif (this.value === null || this.value === undefined || this.value === \"\" || !Array.isArray(this.#dataSource)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst idx = this.#dataSource.findIndex(m => this.value === m[this.#keyName]);\n\t\tif (idx < 0) {\n\t\t\tthis.cell.classList.add(\"invalid\");\n\t\t}\n\t};\n\n\tget dataSource() {\n\t\treturn this.#dataSource;\n\t}\n\n\tget #keyName() {\n\t\treturn this.cell.getAttribute(\"key-name\") || \"k\";\n\t}\n\n\tget #valueName() {\n\t\treturn this.cell.getAttribute(\"value-name\") || \"v\";\n\t}\n}\n\nif (!customElements.get('cell-radio')) {\n\tcustomElements.define(\"cell-radio\", CellRadio);\n}","import { trace } from \"@nopeer\";\nimport {NINE_TABLE} from \"@\";\n\nexport class CellComboPanel extends HTMLElement {\n\t#parent;\n\t#keyName;\n\t#valueName;\n\t#isOpen = false;\n\n\t#grd;\n\t#sheet;\n\t#separator;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#renderer();\n\n\t\tthis.#grd = this.querySelector(\"nine-table-simple\");\n\t\tsetTimeout(() => {\n\t\t\tthis.#sheet = this.#grd.shadowRoot.querySelector(\"nine-table-sheet\");\n\t\t\tthis.#initEvents();\n\t\t})\n\t}\n\n\t#initData = (dataSource, keyName, valueName, multi) => {\n\n\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\t\tif (!grd || !dataSource || dataSource.length === 0) return;\n\n\t\tconst itemsAttr = this.#parent.closest(\"th,td\").getAttribute(\"items\");\n\t\tlet fieldKeys = [];\n\n\t\tif (itemsAttr) {\n\t\t\tfieldKeys = itemsAttr.split(\",\").map(s => s.trim());\n\t\t} else {\n\t\t\tfieldKeys = [valueName].filter(Boolean);\n\t\t}\n\n\t\tconst activeColumnCount = fieldKeys.length;\n\n\t\t//grd.shadowRoot.querySelector(\".ng-container-left\").style.display = multi ? '' : 'none';\n\n\t\tconst sheet = grd.shadowRoot.querySelector(\"nine-table-sheet\");\n\n\t\tsheet.source.table.querySelectorAll('colgroup col, tbody td').forEach(($el, idx) => {\n\t\t\tconst col = parseInt($el.dataset.col, 10);\n\t\t\tif (col >= 2) {\n\t\t\t\t$el.style.display = (col - 2 >= activeColumnCount) ? 'none' : '';\n\t\t\t}\n\t\t});\n\n\t\tgrd.shadowRoot.querySelectorAll('table colgroup col').forEach(($el, idx) => {\n\t\t\tconst col = parseInt($el.dataset.col, 10);\n\t\t\tif (col >= 2) {\n\t\t\t\t$el.style.display = (col - 2 >= activeColumnCount) ? 'none' : '';\n\t\t\t}\n\t\t});\n\n\n\t\tconst formattedData = dataSource.map(item => {\n\t\t\tconst row = {\n\t\t\t\tCHK: \"N\",\n\t\t\t\tk: keyName && item[keyName] !== undefined ? item[keyName] : (item[0] !== undefined ? item[0] : \"\")\n\t\t\t};\n\n\t\t\tfieldKeys.forEach((key, idx) => {\n\t\t\t\trow[`tmp${idx + 1}`] = item[key] !== undefined ? item[key] : (item[idx] !== undefined ? item[idx] : \"\");\n\t\t\t});\n\t\t\treturn row;\n\t\t});\n\n\t\tgrd.addEventListener(NINE_TABLE.EVENT.ROW_ADDED, () => {\n\t\t\tsetTimeout(() => {\n\n\t\t\t\tthis.style.opacity = \"\";\n\t\t\t\tthis.classList.add(\"active\");\n\n\t\t\t\tgrd.shadowRoot.querySelectorAll('colgroup col').forEach(($el, idx) => {\n\t\t\t\t\tconst col = parseInt($el.dataset.col, 10);\n\t\t\t\t\tif (col >= 2 && $el.style.display !== \"none\") {\n\t\t\t\t\t\tsheet.col.autoFit(col);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tconst fields = this.#grd.fields.get();\n\n\t\t\t\tif (multi) {\n\t\t\t\t\tconst selectedKeys = this.#parent.value ? String(this.#parent.value).split(this.#separator).map(s => s.trim()) : [];\n\t\t\t\t\tconst kIndex = fields.indexOf(\"k\");\n\t\t\t\t\tconst chkIndex = fields.indexOf(\"CHK\");\n\n\t\t\t\t\tthis.#grd.data.getArray().forEach(record => {\n\t\t\t\t\t\trecord.v[chkIndex] = (selectedKeys.includes(String(record.v[kIndex]))) ? \"Y\" : \"N\";\n\t\t\t\t\t});\n\n\t\t\t\t\tconst index = this.#sheet.view.getArray().findIndex((record, idx) => {\n\t\t\t\t\t\treturn record.v[kIndex] === selectedKeys[0];\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.#selectRow(index);\n\t\t\t\t} else {\n\t\t\t\t\tconst currentValue = this.#parent.value;\n\t\t\t\t\tconst kIndex = fields.indexOf(\"k\");\n\t\t\t\t\tconst index = this.#sheet.view.getArray().findIndex((record, idx) => {\n\t\t\t\t\t\treturn record.v[kIndex] === currentValue;\n\t\t\t\t\t});\n\n\t\t\t\t\tthis.#selectRow(index);\n\t\t\t\t}\n\t\t\t})\n\t\t}, {once: true});\n\n\t\tif (multi && this.#parent.value) {\n\t\t\t/**\n\t\t\tconst selectedKeys = String(this.#parent.value).split(separator || \",\");\n\t\t\tgrd.data.getValidData().forEach(m => {\n\t\t\t\tif (selectedKeys.includes(String(m.v[1]))) {\n\t\t\t\t\tm.v[0] = \"Y\";\n\t\t\t\t}\n\t\t\t});\n\t\t\tgrd.refreshData();\n\t\t\t\t*/\n\t\t}\n\n\t\tif (formattedData.length * this.#sheet.template.height >= this.offsetHeight) {\n\t\t\tthis.classList.add(\"expand\");\n\t\t} else {\n\t\t\tthis.classList.remove(\"expand\");\n\t\t}\n\n\t\tgrd.data.set(formattedData);\n\n\n\t};\n\n\t#isPanelBelow = ($btn) => {\n\t\tconst $sheet = $btn.closest(\".ng-sheet-body\");\n\n\t\tconst btnRect = $btn.getBoundingClientRect();\n\t\tconst sheetRect = $sheet.getBoundingClientRect();\n\t\tconst spaceBelow = sheetRect.bottom - btnRect.bottom;\n\t\tconst spaceAbove = btnRect.top - sheetRect.top;\n\n\t\treturn spaceBelow >= spaceAbove;\n\t};\n\n\t#calculatePanelHeight = ($btn, isDropDown = 0) => {\n\t\tconst $sheet = $btn.closest(\".ng-sheet-body\");\n\n\t\tconst btnRect = $btn.getBoundingClientRect();\n\t\tconst sheetRect = $sheet.getBoundingClientRect();\n\n\t\tlet h = (isDropDown ? (sheetRect.bottom - btnRect.bottom) : (btnRect.top - sheetRect.top)) - 5;\n\n\t\treturn h;\n\t}\n\n\t#calculatePanelLeft = ($btn) => {\n\n\t\tconst $cell = $btn.closest(\"th,td\");\n\t\tconst $sheet = $cell.closest(\".ng-sheet-body\");\n\n\n\t\tconst cellRect = $cell.getBoundingClientRect();\n\t\tconst sheetRect = $sheet.getBoundingClientRect();\n\n\t\tlet left = cellRect.left - sheetRect.left;\n\n\t\tconst panelWidth = this.offsetWidth;\n\t\tif (left + panelWidth > sheetRect.width) {\n\t\t\tleft = Math.max(0, sheetRect.width - panelWidth - 2);\n\t\t}\n\n\t\tif (left < 0) {\n\t\t\tleft = 5;\n\t\t}\n\n\t\treturn left;\n\t};\n\n\topen = (parent, dataSource, keyName, valueName, multi, separator) => {\n\t\tthis.#parent = parent;\n\t\tthis.#keyName = keyName;\n\t\tthis.#valueName = valueName;\n\t\tthis.#isOpen = true;\n\n\t\tthis.#separator = separator;\n\n\t\tthis.classList.add(\"active\");\n\t\tthis.style.opacity = \"0\";\n\n\t\tsetTimeout(() => {\n\t\t\tconst grd = this.querySelector(\"nine-table-simple\");\n\t\t\tif (!grd || !dataSource) return;\n\n\t\t\tthis.querySelector(\".search-input\").value = \"\";\n\t\t\tthis.querySelector(\"#chkAll\").checked = true;\n\n\t\t\tconst sheet = parent.closest(\".ng-sheet-body\");\n\t\t\tconst btnRect = parent.getBoundingClientRect();\n\t\t\tconst sheetRect = sheet.getBoundingClientRect();\n\n\t\t\tconst isDropDown = this.#isPanelBelow(parent);\n\t\t\tconst h = this.#calculatePanelHeight(parent, isDropDown);\n\t\t\tconst l = this.#calculatePanelLeft(parent);\n\t\t\tconst t = isDropDown ? (btnRect.bottom - sheetRect.top) : (btnRect.top - sheetRect.top - h);\n\n\t\t\tthis.style.height = `${h}px`;\n\t\t\tthis.style.left = `${l}px`;\n\t\t\tthis.style.top = `${t}px`;\n\t\t\t//this.style.opacity = \"\";\n\n\t\t\tif (multi) {\n\t\t\t\tthis.classList.add(\"multi\");\n\t\t\t\tthis.#grd.classList.add(\"multi\");\n\t\t\t} else {\n\t\t\t\tthis.classList.remove(\"multi\");\n\t\t\t\tthis.#grd.classList.remove(\"multi\");\n\t\t\t}\n\n\t\t\tthis.#initData(dataSource, keyName, valueName, multi);\n\t\t}, 100);\n\t}\n\n\tclose = () => {\n\t\tthis.classList.remove(\"active\");\n\t\tthis.#isOpen = false;\n\t\tif (this.#parent && this.#parent.cell) {\n\t\t\tthis.#parent.cell.focus();\n\t\t}\n\t}\n\n\n\n\n\n\t#onClick = (e) => {\n\t\tconst $cell = e.target.closest(\"th,td\");\n\t\tif (this.#grd.classList.contains(\"multi\")) {\n\t\t\tconst index = parseInt($cell?.dataset.index, 10);\n\t\t\tthis.#checkRow(index);\n\t\t}\n\t\telse {\n\t\t\tconst col = parseInt($cell?.dataset.col, 10);\n\n\t\t\tif (col >= 2) {\n\t\t\t\tthis.#returnRow();\n\t\t\t}\n\t\t}\n\t}\n\n\t#onKeydown_input = (e) => {\n\t\tswitch (e.code) {\n\t\t\tcase \"Enter\":\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tconst index = this.#grd.row.at();\n\t\t\t\tif (index < 0) {\n\t\t\t\t\tthis.#selectRow(0)\n\t\t\t\t} else {\n\t\t\t\t\tthis.#selectRow(index)\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"Tab\":\n\t\t\t\tthis.#selectRow(this.#grd.row.at());\n\t\t\t\tbreak;\n\t\t}\n\t};\n\n\t#onKeydown = (e) => {\n\t\tlet index;\n\t\tswitch (e.code) {\n\t\t\tcase \"Escape\":\n\t\t\t\tthis.close();\n\t\t\t\tbreak;\n\t\t\tcase \"Enter\":\n\t\t\t\tif (this.classList.contains(\"multi\")) {\n\t\t\t\t\tthis.#onOk();\n\t\t\t\t} else {\n\t\t\t\t\tthis.#returnRow();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"Tab\":\n\t\t\t\tif (this.classList.contains(\"expand\")) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis.querySelector(\"input[type='text']\").focus();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"ArrowDown\":\n\t\t\t\tindex = this.#grd.row.at();\n\t\t\t\tif (index < 0) {\n\t\t\t\t\tthis.#selectRow(0)\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"Space\":\n\t\t\t\te.preventDefault();\n\t\t\t\tif ([\"TH\",\"TD\"].includes(e.target.tagName)) {\n\t\t\t\t\tthis.#checkRow(this.#grd.row.at());\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t#onOk = () => {\n\n\t\tconst fields = this.#grd.fields.get();\n\t\tconst kIndex = fields.indexOf(\"k\");\n\t\tconst chkIndex = fields.indexOf(\"CHK\");\n\n\t\tconst arr = [];\n\t\tthis.#sheet.view.getArray().forEach(o => {\n\t\t\tif (o.v[chkIndex] === \"Y\") {\n\t\t\t\tarr.push(o.v[kIndex]);\n\t\t\t}\n\t\t});\n\n\t\tthis.#parent.value = arr.join(this.#separator);\n\n\t\tthis.#parent.sheet.rowManager.refresh(true);\n\t\tthis.close();\n\t}\n\n\t#returnRow = () => {\n\t\tconst index = this.#grd.row.at();\n\n\t\tif (index >= 0) {\n\t\t\tconst record = this.#sheet.view.get(index);\n\n\t\t\tthis.#parent.value = record.k;\n\t\t\tthis.#parent.sheet.rowManager.refresh(true);\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\t#checkRow = (index) => {\n\n\t\tif (this.#grd.classList.contains(\"multi\") && index >= 0) {\n\t\t\tconst record = this.#sheet.view.get(index);\n\n\t\t\tthis.#grd.data.setValue(record.m._[NINE_TABLE.META.INDEX.ROWID], \"CHK\", record.CHK === \"Y\" ? \"N\" : \"Y\");\n\n\t\t\tthis.#grd.refresh();\n\t\t}\n\t};\n\n\t#selectRow = (index) => {\n\t\tif (index !== -1) {\n\t\t\tthis.#sheet.row.focus(index, () => {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tconst cell = this.#sheet.querySelector(`tr[data-index=\"${index}\"] td[data-col=\"2\"]`);\n\t\t\t\t\tthis.#sheet.navigation.currentCell = cell;\n\t\t\t\t\tcell.focus();\n\t\t\t\t\tthis.#sheet.invalidate();\n\t\t\t\t});\n\t\t\t});\n\t\t} else {\n\t\t\tthis.#sheet.row.focus(-1, () => {\n\t\t\t});\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.#sheet.selection.clear();\n\n\t\t\t\tthis.#sheet.navigation.currentCell = this.#sheet.querySelector(`tr[data-index=\"0\"] td[data-col=\"2\"]`);\n\t\t\t\tthis.#sheet.focus();\n\t\t\t\tthis.#sheet.invalidate();\n\t\t\t});\n\t\t}\n\t}\n\n\t#onSelectAll = (e) => {\n\n\t\tconst chkIdx = this.#grd.fields.get().indexOf(\"CHK\");\n\n\t\tthis.#grd.data.getArray().forEach(record => {\n\t\t\trecord.v[chkIdx] = e.target.checked ? \"Y\" : \"N\";\n\t\t});\n\n\t\tthis.#sheet.invalidate();\n\t};\n\n\n\t#onInput = (e) => {\n\t\tconst query = e.target.value.toLowerCase().trim();\n\n\t\tif (!query) {\n\t\t\tthis.#sheet.filtering.clear();\n\t\t} else {\n\t\t\tconst rawRecords = this.#grd.data.getArray();\n\t\t\tconst fields = this.#grd.fields.get();\n\n\t\t\tconst colnm = \"tmp1\";\n\t\t\tconst data2Idx = fields.indexOf(colnm);\n\n\t\t\tconst matchedValues = [];\n\t\t\trawRecords.forEach(record => {\n\t\t\t\tconst val = data2Idx >= 0 && record.v ? record.v[data2Idx] : \"\";\n\t\t\t\tconst textVal = String(val).replace(/<[^>]*>?/gm, '').toLowerCase();\n\n\t\t\t\tif (textVal.includes(query)) {\n\t\t\t\t\tmatchedValues.push(val);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.#sheet.filtering.set({\n\t\t\t\t[colnm]: [...new Set(matchedValues)]\n\t\t\t});\n\t\t}\n\t}\n\n\tget isOpen() {\n\t\treturn this.#isOpen;\n\t}\n\n\tget targetCell() {\n\t\treturn this.#parent;\n\t}\n\n\t#initEvents = () => {\n\t\tthis.querySelector(\".search-input\").addEventListener(\"input\", this.#onInput);\n\t\tthis.querySelector(\".search-input\").addEventListener(\"keydown\", this.#onKeydown_input);\n\t\tthis.querySelector(\"#btnOk\").addEventListener(\"click\", this.#onOk);\n\t\tthis.querySelector(\"#chkAll\").addEventListener(\"change\", this.#onSelectAll);\n\n\t\tthis.#sheet.addEventListener(\"keydown\", this.#onKeydown);\n\t\tthis.#sheet.addEventListener(\"click\", this.#onClick);\n\n\t\tdocument.addEventListener(\"mousedown\", (e) => {\n\t\t\tconst path = e.composedPath ? e.composedPath() : [];\n\n\t\t\tif (path.includes(this)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.close();\n\t\t});\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <input type=\"text\" class=\"search-input\" placeholder=\"Search...\" />\n \n <nine-table-simple class=\"combo-list\" theme=\"simple\">\n <table auto-fit-col=\"true\">\n <colgroup>\n <col width=\"30\" fixed=\"left\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"100\" />\n <col width=\"0\" />\n </colgroup>\n <tbody>\n <tr>\n <td cell-type=\"checkbox\" data-bind=\"CHK\"></td>\n <td data-bind=\"tmp1\" />\n <td data-bind=\"tmp2\" />\n <td data-bind=\"tmp3\" />\n <td data-bind=\"tmp4\" />\n <td data-bind=\"tmp5\" />\n <td data-bind=\"tmp6\" />\n <td data-bind=\"tmp7\" />\n <td data-bind=\"tmp8\" />\n <td data-bind=\"tmp9\" />\n <td data-bind=\"tmp10\" />\n <td data-bind=\"k\" />\n </tr>\n </tbody>\n </table>\n </nine-table-simple>\n \n <div class=\"footer\">\n <label for=\"chkAll\"><input id=\"chkAll\" type=\"checkbox\" checked><span>Select All</span></label>\n <button id=\"btnOk\">OK</button>\n </div>\n `;\n\t};\n}\n\nif (!customElements.get('cell-combo-panel')) {\n\tcustomElements.define(\"cell-combo-panel\", CellComboPanel);\n}","import { trace } from \"@nopeer\";\nimport { EditableCellElement } from \"./core/CellElement.js\";\nimport \"./cell-combo-panel.js\";\n\nexport class CellCombo extends EditableCellElement {\n\t#targetBtn;\n\t#dataSource = [];\n\t#keyName;\n\t#valueName;\n\t#multi;\n\t#multiSeparator;\n\t#panel;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#init();\n\t}\n\n\trerenderer = () => {\n\t\tthis.#initData();\n\t\tthis.refresh();\n\t};\n\n\n\trefresh = () => {\n\t\tconst v = super.refresh();\n\t\tif (!this.#targetBtn) return v;\n\n\t\tthis.#targetBtn.textContent = this.#getDisplayText() || \"Select\";\n\t\tthis.#validateInput();\n\n\t\treturn v;\n\t};\n\n\t#getDisplayText = () => {\n\t\tif (!this.value || !Array.isArray(this.#dataSource)) return \"\";\n\n\t\tif (this.#multi) {\n\t\t\tconst keys = String(this.value).split(this.#multiSeparator);\n\t\t\treturn this.#dataSource\n\t\t\t\t.filter(m => keys.includes(String(m[this.#keyName])))\n\t\t\t\t.map(m => m[this.#valueName])\n\t\t\t\t.join(this.#multiSeparator);\n\t\t} else {\n\t\t\tconst found = this.#dataSource.find(m => String(m[this.#keyName]) === String(this.value));\n\t\t\treturn found ? found[this.#valueName] : this.value;\n\t\t}\n\t}\n\n\t#validateInput = () => {\n\t\tif (!super.cell) return;\n\t\tsuper.cell.classList.remove(\"invalid\");\n\n\t\tif (this.value === null || this.value === undefined || this.value === \"\" || !Array.isArray(this.#dataSource)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst list = this.#multi ? String(this.value).split(this.#multiSeparator) : [this.value];\n\t\tfor (const v of list) {\n\t\t\tconst idx = this.#dataSource.findIndex(m => String(v) === String(m[this.#keyName]));\n\t\t\tif (idx < 0) {\n\t\t\t\tsuper.cell.classList.add(\"invalid\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t};\n\n\t#init = () => {\n\t\tthis.#renderer();\n\n\t\tthis.#keyName = this.cell.getAttribute(\"key-name\") || \"k\";\n\t\tthis.#valueName = this.cell.getAttribute(\"value-name\") || \"v\";\n\t\tthis.#multi = this.cell.getAttribute('multi') === \"true\";\n\t\tthis.#multiSeparator = this.cell.getAttribute(\"multi-separator\") || \",\";\n\n\t\tthis.#initData();\n\t\tthis.#initEvent();\n\t}\n\n\t#initData = () => {\n\t\tif (!super.sheet || !super.cell) return;\n\n\t\tconst dataSource = super.cell?.getAttribute(\"data-source\");\n\t\tif (!dataSource) return;\n\n\t\tthis.#dataSource = super.getExprValue(dataSource, super.tr.data, super.tr.dataset.row);\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <button class=\"btn1\" type=\"button\" tabindex=\"-1\">Select</button>\n <button class=\"btn2\" type=\"button\" tabindex=\"-1\"></button>\n `;\n\n\t\tthis.#targetBtn = this.querySelector(\".btn1\");\n\t};\n\n\t#initEvent = () => {\n\t\tthis.querySelectorAll(\"button\").forEach(btn => {\n\t\t\tbtn.addEventListener(\"click\", (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tthis.#togglePanel();\n\t\t\t});\n\t\t});\n\n\n\t\tthis.cell.addEventListener('keydown', (e) => {\n\t\t\tif ([\"Space\"].includes(e.code)) {\n\t\t\t\tthis.#togglePanel();\n\t\t\t}\n\t\t});\n\t}\n\n\t#togglePanel = () => {\n\n\t\tif (!this.#panel) {\n\t\t\tthis.#panel = super.sheet.querySelector(\"cell-combo-panel\");\n\t\t\tif (!this.#panel) {\n\t\t\t\tthis.#panel = document.createElement(\"cell-combo-panel\");\n\t\t\t\tsuper.sheet.appendChild(this.#panel);\n\t\t\t}\n\t\t}\n\n\t\tif (this.#panel.isOpen && this.#panel.targetCell === this) {\n\t\t\tthis.#panel.close();\n\t\t} else {\n\t\t\tthis.#panel.open(this, this.#dataSource, this.#keyName, this.#valueName, this.#multi, this.#multiSeparator);\n\t\t}\n\t}\n\n\tget dataSource() {\n\t\treturn this.#dataSource;\n\t}\n}\n\nif (!customElements.get('cell-combo')) {\n\tcustomElements.define(\"cell-combo\", CellCombo);\n}","import { trace } from \"@nopeer\";\nimport { CellElement } from \"./core/CellElement.js\";\n\nclass CellRenderer extends CellElement {\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tsuper.connectedCallback();\n\n\t\tthis.#renderer();\n\n\t\tthis.#target = this.querySelector(\"span\");\n\t}\n\n\trefresh = () => {\n\n\t\tsuper.refresh();\n\n\t\tif (this.cell.getAttribute(\"html\") === \"true\") {\n\t\t\tthis.#target.innerHTML = this.getDisplayText();\n\t\t} else {\n\t\t\tthis.#target.textContent = this.getDisplayText();\n\t\t}\n\t};\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n <span class=\"wrapper\"></span>\n `;\n\t};\n}\n\nif (!customElements.get(\"cell-renderer\")) {\n\tcustomElements.define(\"cell-renderer\", CellRenderer);\n}","import { CellElement } from \"./core/CellElement.js\";\nimport { NINE_TABLE } from \"@/core/constants.js\";\nimport { trace } from \"@nopeer\";\n\nexport class CellButton extends CellElement {\n\t#target;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\n\t\tthis.#renderer();\n\n\t\tsuper.connectedCallback();\n\n\t\tthis.#target = this.querySelector(\"button\");\n\n\t\tthis.#target.removeEventListener(\"click\", this.#cellButtonClick);\n\t\tthis.#target.addEventListener(\"click\", this.#cellButtonClick);\n\t}\n\n\t#cellButtonClick = e => {\n\t\te.stopPropagation();\n\n\t\tconst rowid = parseInt(this.cell.dataset.row, 10);\n\n\t\tconst customEvent = new CustomEvent(NINE_TABLE.EVENT.CELL_BUTTON_CLICK, {\n\t\t\tbubbles: true,\n\t\t\tcomposed: true,\n\t\t\tdetail: {\n\t\t\t\toriginalEvent: e,\n\t\t\t\tcell: this.cell,\n\t\t\t\trow: rowid,\n\t\t\t\tcol: parseInt(this.cell.dataset.col, 10),\n\t\t\t\tbind: this.dataset.bind,\n\t\t\t\tdata: this.host.data.get(rowid),\n\t\t\t\tvalue: this.value,\n\t\t\t}\n\t\t});\n\n\t\tthis.dispatchEvent(customEvent);\n\t};\n\n\trefresh = () => {\n\t\tconst rawValue = super.refresh ? super.refresh() : this.value;\n\t\t//let displayValue = this.getDisplayText(rawValue);\n\t\tthis.#target.innerHTML = this.getDisplayText(rawValue);\n\t};\n\n\t#renderer = () => {\n\n\t\tconst buttonText = \"...\";//this.getAttribute(\"text\") || super.attr[\"text\"] || \"\";\n\n\t\tthis.innerHTML = `\n <button class=\"button\">${buttonText}</button>\n `;\n\t};\n}\n\nif (!customElements.get('cell-button')) {\n\tcustomElements.define(\"cell-button\", CellButton);\n}","import { trace } from \"@nopeer\";\nimport { CellElement } from \"./core/CellElement.js\";\nimport {NINE_TABLE} from \"@\";\n\nclass CellRowIndicator extends CellElement {\n\t#mainTarget;\n\t#subTarget;\n\t#statusTarget;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#renderer();\n\t\tsuper.connectedCallback();\n\n\t\tif (this.cell) {\n\t\t\tthis.cell.removeAttribute(\"tabindex\");\n\t\t\tthis.cell.dataset.bind = \"rowState\";\n\t\t}\n\n\t\tthis.#mainTarget = this.querySelector(\".ng-row-main\");\n\t\tthis.#subTarget = this.querySelector(\".ng-row-sub\");\n\t\tthis.#statusTarget = this.querySelector(\".row-status\");\n\t}\n\n\t#renderer = () => {\n\t\tthis.innerHTML = `\n\t\t\t<span class=\"ng-row-main\"></span>\n <span class=\"ng-row-sub\"></span>\n <span class=\"row-status\"></span>\n `;\n\t}\n\n\trefresh = () => {\n\t\tif (!this.cell || !this.tr) return;\n\n\t\tthis.classList.remove(\"is-insert\", \"is-update\", \"is-delete\");\n\n\t\tconst row = this.row;\n\t\tif (isNaN(row)) return;\n\n\t\tconst rawRecord = this.tr.data;\n\n\t\tif (rawRecord) {\n\t\t\tswitch (rawRecord.m._[NINE_TABLE.META.INDEX.ROW_STATE]) {\n\t\t\t\tcase NINE_TABLE.ROW_STATE.INSERT:\n\t\t\t\t\tthis.classList.add(\"is-insert\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase NINE_TABLE.ROW_STATE.UPDATE:\n\t\t\t\t\tthis.classList.add(\"is-update\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase NINE_TABLE.ROW_STATE.DELETE:\n\t\t\t\t\tthis.classList.add(\"is-delete\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tconst displayNum = this.index + 1;\n\t\tconst formattedNum = displayNum.toLocaleString();\n\n\t\tif (displayNum >= 10000) {\n\n\t\t\tconst splitIndex = formattedNum.length - 4;\n\t\t\tconst prefixPart = formattedNum.substring(0, splitIndex + 1);\n\t\t\tconst suffixPart = formattedNum.substring(splitIndex + 1);\n\n\t\t\tthis.#mainTarget.innerHTML = `\n \t<span class=\"ng-row-prefix\">${prefixPart}</span>\n \t<span class=\"ng-row-suffix\">${suffixPart}</span>\n \t<div class=\"row-status\"></div>\n \t`;\n\t\t} else {\n\t\t\tthis.#mainTarget.innerHTML = `${formattedNum}`;\n\t\t}\n\n\t\tconst isSorted = this.sheet.querySelector(\"thead .asc,thead .desc\") ? true : false;\n\t\tconst isFitered = this.sheet.querySelector(\"thead nine-table-filter-button.filtered\") ? true : false;\n\n\t\tthis.#subTarget.innerHTML = row;\n\t\tthis.#subTarget.style.display = (isSorted || isFitered) ? \"\" : \"none\";\n\t};\n}\n\nif (!customElements.get('cell-row-indicator')) {\n\tcustomElements.define(\"cell-row-indicator\", CellRowIndicator);\n}","// ui/col/col-expand.js\nimport { COLLAPSED_WIDTH } from \"@/layout/core/TableCompiler.js\";\n\nexport class ColExpand extends HTMLElement {\n #sheet;\n #cell;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.#cell = this.closest('th, td');\n this.#sheet = this.closest('nine-table-sheet');\n\n if (this.#cell) {\n this.#cell.style.position = 'relative';\n }\n\n const isCollapsed =\n this.getAttribute('collapsed') === 'true' ||\n this.#cell?.getAttribute('collapsed') === 'true';\n\n if (isCollapsed) {\n requestAnimationFrame(() => {\n this.collapse(true);\n });\n } else {\n this.classList.remove('collapsed');\n this.classList.add('expand');\n }\n\n this.removeEventListener('click', this.#onClick);\n this.addEventListener('click', this.#onClick);\n }\n\n #onClick = (e) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (this.classList.contains('expand')) {\n this.collapse();\n } else {\n this.expand();\n }\n };\n\n expand = () => {\n if (!this.#sheet?.colResizer || !this.#cell) return;\n const colIndex = parseInt(this.#cell.dataset.col, 10);\n const colSpan = this.#cell.colSpan || 1;\n\n this.classList.remove('collapsed');\n this.classList.add('expand');\n this.#cell.setAttribute('collapsed', 'false');\n this.#cell.style.color = '';\n\n const targetWidth = parseInt(this.#cell.dataset.expandWidth, 10) || 100;\n\n if (colSpan === 1) {\n this.#sheet.colResizer.setColumnWidth(colIndex, targetWidth);\n } else {\n const singleWidth = Math.max(30, Math.floor(targetWidth / colSpan));\n for (let i = 0; i < colSpan; i++) {\n this.#sheet.colResizer.setColumnWidth(colIndex + i, singleWidth);\n }\n }\n\n requestAnimationFrame(() => {\n if (typeof this.#sheet.refreshLayout === 'function') {\n this.#sheet.refreshLayout();\n }\n });\n };\n\n collapse = (isInitialInit = false) => {\n if (!this.#sheet?.colResizer || !this.#cell) return;\n const colIndex = parseInt(this.#cell.dataset.col, 10);\n const colSpan = this.#cell.colSpan || 1;\n\n if (this.classList.contains('expand')) {\n const col = this.#sheet.querySelector(`colgroup col[data-col=\"${colIndex}\"]`);\n const currentW = col ? parseInt(col.getAttribute('width'), 10) : 0;\n if (currentW > COLLAPSED_WIDTH) {\n this.#cell.dataset.expandWidth = String(currentW * colSpan);\n }\n }\n\n this.classList.remove('expand');\n this.classList.add('collapsed');\n this.#cell.setAttribute('collapsed', 'true');\n this.#cell.style.color = 'transparent';\n\n if (colSpan === 1) {\n this.#sheet.colResizer.setColumnWidth(colIndex, COLLAPSED_WIDTH);\n } else {\n const splitWidth = Math.max(10, Math.floor(COLLAPSED_WIDTH / colSpan));\n for (let i = 0; i < colSpan; i++) {\n this.#sheet.colResizer.setColumnWidth(colIndex + i, splitWidth);\n }\n }\n\n requestAnimationFrame(() => {\n if (typeof this.#sheet.refreshLayout === 'function') {\n this.#sheet.refreshLayout();\n }\n });\n };\n\n disconnectedCallback() {\n this.removeEventListener('click', this.#onClick);\n }\n}\n\nif (!customElements.get('nine-table-col-expand')) {\n customElements.define('nine-table-col-expand', ColExpand);\n}","import { trace } from \"@nopeer\";\nimport { ColFixManager } from \"@/col/ColFixManager.js\";\n\nexport class ContextMenu extends HTMLElement {\n #tableHost;\n #panel;\n\n connectedCallback() {\n const root = this.getRootNode();\n this.#tableHost = root instanceof ShadowRoot ? root.host : (this.closest('nine-table') || root.host);\n\n if (!this.#tableHost) {\n this.#tableHost = this.parentElement?.closest('nine-table') || this.assignedSlot?.closest('nine-table');\n }\n\n if (!this.#tableHost) return;\n }\n\n #onContextMenu = (e) => {\n const path = e.composedPath ? e.composedPath() : [];\n const targetCell = path.find(el => el.tagName === 'TH' || el.tagName === 'TD');\n\n if (!targetCell) return;\n\n const targetTable = path.find(el => el.tagName === 'TABLE') || targetCell.closest('table');\n\n e.preventDefault();\n e.stopPropagation();\n\n this.openMenu(e.clientX, e.clientY, targetCell, targetTable);\n };\n\n #getTargetSheet(targetCell) {\n return targetCell?.closest('nine-table-sheet') || this.#tableHost.activeSheet || this.#tableHost;\n }\n\n #getFixManager(targetCell) {\n const sheet = this.#getTargetSheet(targetCell);\n if (!sheet) return null;\n\n if (!sheet.colFix) {\n sheet.colFix = new ColFixManager(sheet);\n }\n return sheet.colFix;\n }\n\n #parseCustomMenuItems(containerElement, activeTable) {\n const items = [];\n const activeTableId = activeTable?.id;\n const allUls = Array.from(containerElement.querySelectorAll(':scope > ul'));\n\n allUls.forEach(rootUl => {\n const targetTableAttr = rootUl.getAttribute('target-table');\n\n if (!targetTableAttr || (activeTableId && targetTableAttr === activeTableId)) {\n const parsedList = this.#traverseUl(rootUl);\n items.push(...parsedList);\n }\n });\n\n return items;\n }\n\n #traverseUl(ulEl) {\n const list = [];\n Array.from(ulEl.children).forEach(child => {\n const tagName = child.tagName.toLowerCase();\n\n if (tagName === 'hr' || child.classList.contains('separator')) {\n list.push({ type: 'separator' });\n return;\n }\n\n if (tagName === 'li') {\n let name = '';\n const spanEl = child.querySelector(':scope > span');\n if (spanEl) {\n name = spanEl.textContent.trim();\n } else {\n name = Array.from(child.childNodes)\n .filter(n => n.nodeType === Node.TEXT_NODE)\n .map(n => n.textContent.trim())\n .join('');\n }\n\n const subUl = child.querySelector(':scope > ul');\n const item = {\n menuId: child.id || name,\n name: name,\n className: child.className || '',\n disabled: child.hasAttribute('disabled') || child.getAttribute('disabled') === 'true',\n isCustom: true\n };\n\n if (subUl) {\n item.items = this.#traverseUl(subUl);\n }\n\n list.push(item);\n }\n });\n return list;\n }\n\n #buildMenuItems(activeTable, isHeaderCell, targetCell) {\n const useDefault = this.getAttribute('use-default-menu') !== 'false';\n let rawItems = [];\n\n const customItems = this.#parseCustomMenuItems(this, activeTable);\n if (customItems.length > 0) {\n rawItems.push(...customItems);\n }\n\n const fixManager = this.#getFixManager(targetCell);\n const currentFixState = fixManager?.getFixState(targetCell, activeTable) ?? 'none';\n const isFixable = isHeaderCell && (fixManager?.canFixColumn(targetCell, activeTable) ?? false);\n\n let fixMenuItem = null;\n if (currentFixState === 'left' || currentFixState === 'right') {\n fixMenuItem = {\n menuId: 'unfix-column',\n name: 'Unfix Column',\n className: 'ng-menu-unfix-col',\n disabled: !isHeaderCell\n };\n } else {\n fixMenuItem = {\n menuId: 'fix-column',\n name: 'Fix Column',\n className: 'ng-menu-fix-col',\n disabled: !isFixable\n };\n }\n\n if (useDefault) {\n rawItems.push(\n { type: 'separator' },\n {\n menuId: 'sort',\n name: 'Sort',\n className: 'ng-menu-sort',\n disabled: !isHeaderCell\n },\n fixMenuItem,\n { type: 'separator' },\n { menuId: 'filtering', name: 'Filtering', className: 'ng-menu-filtering' },\n { menuId: 'maximize', name: 'Maximize', className: 'maximize' },\n {\n menuId: 'export',\n name: 'Export',\n className: 'export',\n items: [\n { menuId: 'export-excel', name: 'Excel', className: 'export-excel' },\n { menuId: 'export-pdf', name: 'PDF', className: 'export-pdf', disabled: true }\n ]\n },\n {\n menuId: 'properties',\n name: 'Options',\n className: 'options',\n items: [\n { menuId: 'show-title-bar', name: 'Title Bar Show/Hide', className: 'show-title-bar' },\n { menuId: 'show-status-bar', name: 'Status Bar Show/Hide', className: 'show-status-bar' },\n { menuId: 'auto-fit-col', name: 'Auto Fit Columns', className: 'auto-fit-col' }\n ]\n }\n );\n }\n\n const cleanedItems = [];\n rawItems.forEach((item) => {\n if (item.type === 'separator') {\n if (cleanedItems.length === 0 || cleanedItems[cleanedItems.length - 1].type === 'separator') {\n return;\n }\n }\n cleanedItems.push(item);\n });\n\n if (cleanedItems.length > 0 && cleanedItems[cleanedItems.length - 1].type === 'separator') {\n cleanedItems.pop();\n }\n\n return cleanedItems;\n }\n\n openMenu(x, y, targetCell, targetTable) {\n const targetParent = this.#tableHost.shadowRoot || this.#tableHost;\n\n if (!this.#panel) {\n this.#panel = document.createElement('nine-table-menu-panel');\n targetParent.appendChild(this.#panel);\n }\n\n const isHeaderCell = !!targetCell.closest('thead');\n const menuItems = this.#buildMenuItems(targetTable, isHeaderCell, targetCell);\n\n this.#panel.render(menuItems, (e) => this.#handleMenuClick(e, targetCell, targetTable));\n\n const targetSheet = this.#getTargetSheet(targetCell);\n this.#syncMenuStates(targetSheet);\n\n this.#panel.openAt(x, y);\n }\n\n #syncMenuStates(targetSheet) {\n if (!this.#panel || !targetSheet) return;\n\n const isFiltering = targetSheet.filtering?.isFiltering?.() || false;\n this.#panel.toggleItemState('filtering', 'on', isFiltering);\n\n const autoFit = this.#tableHost.getAttribute('auto-fit-col') === 'true';\n this.#panel.toggleItemState('auto-fit-col', 'on', autoFit);\n\n const showTitle = this.#tableHost.getAttribute('show-title-bar') === 'true';\n this.#panel.toggleItemState('show-title-bar', 'on', showTitle);\n }\n\n #handleMenuClick(e, targetCell, targetTable) {\n const menuId = e.menuId;\n\n const customEvent = new CustomEvent('menu-click', {\n detail: { menuId, targetCell, targetTable, originalEvent: e },\n bubbles: true,\n composed: true\n });\n this.dispatchEvent(customEvent);\n\n const baseCol = parseInt(targetCell.dataset.col, 10);\n const targetSheet = this.#getTargetSheet(targetCell);\n\n switch (menuId) {\n case 'fix-column':\n case 'unfix-column':\n const fixManager = this.#getFixManager(targetCell);\n fixManager?.executeFixToggle(menuId, targetCell);\n break;\n\n case 'sort':\n if (!isNaN(baseCol)) {\n targetSheet.sorting?.handleSortFromMenu?.(baseCol, targetCell);\n }\n break;\n\n case 'filtering':\n targetSheet?.filtering?.toggle();\n break;\n\n case 'auto-fit-col':\n this.#tableHost.setAttribute('auto-fit-col', this.#tableHost.getAttribute('auto-fit-col') === 'true' ? 'false' : 'true');\n break;\n\n case 'show-title-bar':\n this.#tableHost.setAttribute('show-title-bar', this.#tableHost.getAttribute('show-title-bar') === 'true' ? 'false' : 'true');\n break;\n }\n\n this.#panel.close();\n }\n\n disconnectedCallback() {\n this.#tableHost?.removeEventListener('contextmenu', this.#onContextMenu);\n }\n}\n\nif (!customElements.get('nine-table-menu')) {\n customElements.define('nine-table-menu', ContextMenu);\n}","// ui/menu/nine-table-menu-panel.js\n\nexport class MenuPanel extends HTMLElement {\n #onCallback;\n #closeHandler = null;\n\n constructor() {\n super();\n }\n\n connectedCallback() {\n\n this.style.position = 'fixed';\n this.style.display = 'none';\n this.style.zIndex = '99999';\n\n this.innerHTML = `\n <div class=\"menu-wrapper\">\n <ul class=\"menu-container\"></ul>\n </div>\n `;\n }\n\n render(items, callback) {\n this.#onCallback = callback;\n const container = this.querySelector('.menu-container');\n if (!container) return;\n\n container.innerHTML = '';\n\n this.#appendItems(container, items);\n this.#bindClickEvents();\n }\n\n openAt(x, y, targetCell = null) {\n this.style.display = 'block';\n\n if (targetCell) {\n const cellRect = targetCell.getBoundingClientRect();\n const cellRightX = cellRect.right;\n\n requestAnimationFrame(() => {\n const wrapper = this.querySelector('.menu-wrapper');\n if (!wrapper) return;\n const panelWidth = wrapper.getBoundingClientRect().width;\n\n let calculatedLeft = cellRightX - panelWidth;\n\n if (calculatedLeft < 0) {\n calculatedLeft = cellRect.left;\n }\n\n const panelHeight = wrapper.getBoundingClientRect().height;\n let calculatedTop = y;\n if (y + panelHeight > window.innerHeight) {\n calculatedTop = y - panelHeight;\n }\n\n this.style.left = `${calculatedLeft}px`;\n this.style.top = `${calculatedTop}px`;\n });\n } else {\n this.style.left = `${x}px`;\n this.style.top = `${y}px`;\n\n requestAnimationFrame(() => {\n const wrapper = this.querySelector('.menu-wrapper');\n if (!wrapper) return;\n const rect = wrapper.getBoundingClientRect();\n\n if (x + rect.width > window.innerWidth) {\n this.style.left = `${x - rect.width}px`;\n }\n if (y + rect.height > window.innerHeight) {\n this.style.top = `${y - rect.height}px`;\n }\n });\n }\n\n if (this.#closeHandler) {\n window.removeEventListener('pointerdown', this.#closeHandler);\n }\n\n this.#closeHandler = (e) => {\n const path = e.composedPath ? e.composedPath() : [];\n if (!path.includes(this) && !this.contains(e.target)) {\n this.close();\n }\n };\n\n setTimeout(() => {\n window.addEventListener('pointerdown', this.#closeHandler);\n }, 0);\n }\n\n close() {\n this.style.display = 'none';\n if (this.#closeHandler) {\n window.removeEventListener('pointerdown', this.#closeHandler);\n this.#closeHandler = null;\n }\n }\n\n toggleItemState(menuId, className, condition) {\n const li = this.querySelector(`li[menu-id=\"${menuId}\"]`);\n if (li) {\n condition ? li.classList.add(className) : li.classList.remove(className);\n }\n }\n\n #appendItems(parentUl, items) {\n items.forEach(item => {\n if (item.type === 'separator') {\n const sep = document.createElement('li');\n sep.className = 'ng-menu-separator';\n parentUl.appendChild(sep);\n return;\n }\n\n const li = document.createElement('li');\n li.setAttribute('menu-id', item.menuId);\n li.className = `${item.className || ''} ${item.items ? 'submenu' : ''} ${item.disabled ? 'disabled' : ''}`.trim();\n\n const span = document.createElement('span');\n span.textContent = item.name;\n li.appendChild(span);\n\n if (item.items && item.items.length > 0) {\n const subUl = document.createElement('ul');\n subUl.className = 'ng-menu-sublist';\n this.#appendItems(subUl, item.items);\n li.appendChild(subUl);\n }\n\n parentUl.appendChild(li);\n });\n }\n\n #bindClickEvents() {\n this.querySelectorAll('li[menu-id]').forEach(li => {\n li.addEventListener('click', (e) => {\n e.stopPropagation();\n if (li.classList.contains('disabled')) return;\n\n const menuId = li.getAttribute('menu-id');\n this.#onCallback?.({ menuId, target: li });\n this.close();\n });\n });\n }\n\n disconnectedCallback() {\n this.close();\n }\n}\n\nif (!customElements.get('nine-table-menu-panel')) {\n customElements.define('nine-table-menu-panel', MenuPanel);\n}"],"mappings":"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"}