@vivekjha659/react-image-editor 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/TextEditor.jsx","../src/utils/getStrokePattern.js","../src/utils/konvaThreshold.js","../src/KonvaRectangle.jsx","../src/ArrowKonva.jsx","../src/KonvaCircle.jsx","../src/KonvaDoubleArrow.jsx","../src/index.js","../src/ImageEditorModal.jsx","../src/ui/Button.jsx","../src/ui/Label.jsx","../src/ui/Select.jsx","../src/ui/Slider.jsx","../src/ui/toast.js","../src/CurveTool.jsx","../src/CurveArrowTool.jsx","../src/MobileView.jsx","../src/hooks/useHistoryManager.js","../src/utils/canvasReplay.js","../src/utils/actionCreators.js","../src/utils/resolveImageSource.js","../src/utils/buildImageEditResult.js"],"sourcesContent":["\r\n\"use client\";\r\n\r\nimport React, {\r\n useRef,\r\n useState,\r\n useEffect,\r\n forwardRef,\r\n useImperativeHandle,\r\n} from \"react\";\r\nimport { Stage, Layer, Text, Transformer, Group, Rect } from \"react-konva\";\r\n\r\nconst TextEditor = forwardRef(\r\n (\r\n {\r\n width,\r\n height,\r\n active,\r\n allowCreate,\r\n color,\r\n setColor,\r\n backgroundColor,\r\n setBackgroundColor,\r\n fontSize,\r\n fontFamily,\r\n onAdd,\r\n onMove,\r\n texts,\r\n setTexts,\r\n onFlatten,\r\n onElementSelect,\r\n onElementDeselect,\r\n checkTrashZoneCollision,\r\n updateTrashZoneState,\r\n onDragStateChange,\r\n onDelete,\r\n },\r\n ref,\r\n ) => {\r\n const [selectedId, setSelectedId] = useState(null);\r\n const [editingText, setEditingText] = useState(null);\r\n\r\n const stageRef = useRef(null);\r\n const trRef = useRef(null);\r\n const justDraggedRef = useRef(false);\r\n\r\n const [lastDist, setLastDist] = useState(0);\r\n const [lastTap, setLastTap] = useState(0);\r\n const [tapTimeout, setTapTimeout] = useState(null);\r\n const [tapCount, setTapCount] = useState(0);\r\n\r\n const getDistance = (p1, p2) => {\r\n return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));\r\n };\r\n\r\n useImperativeHandle(ref, () => ({\r\n flatten: () => {\r\n onFlatten(texts);\r\n setTexts([]);\r\n setSelectedId(null);\r\n },\r\n }));\r\n\r\n useEffect(() => {\r\n if (stageRef.current) {\r\n const stage = stageRef.current;\r\n stage.width(width);\r\n stage.height(height);\r\n stage.size({ width, height });\r\n stage.batchDraw();\r\n }\r\n }, [width, height]);\r\n\r\n useEffect(() => {\r\n if (stageRef.current && active) {\r\n const stage = stageRef.current;\r\n const drawingCanvas = document.querySelector(\r\n 'canvas[class*=\"absolute w-full h-full\"]:last-of-type',\r\n );\r\n\r\n if (drawingCanvas) {\r\n const actualWidth = drawingCanvas.width;\r\n const actualHeight = drawingCanvas.height;\r\n stage.width(actualWidth);\r\n stage.height(actualHeight);\r\n stage.size({ width: actualWidth, height: actualHeight });\r\n stage.batchDraw();\r\n }\r\n }\r\n }, [active, width, height]);\r\n\r\n useEffect(() => {\r\n const handleKeyDown = (e) => {\r\n if ((e.key === \"Delete\" || e.key === \"Backspace\") && selectedId) {\r\n onDelete?.(selectedId);\r\n setSelectedId(null);\r\n if (onElementDeselect) {\r\n onElementDeselect();\r\n }\r\n }\r\n };\r\n window.addEventListener(\"keydown\", handleKeyDown);\r\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\r\n }, [selectedId, onDelete, onElementDeselect]);\r\n\r\n useEffect(() => {\r\n if (trRef.current && selectedId) {\r\n const node = stageRef.current.findOne(`#${selectedId}`);\r\n if (node) {\r\n trRef.current.nodes([node]);\r\n trRef.current.getLayer().batchDraw();\r\n }\r\n }\r\n }, [selectedId, texts]);\r\n\r\n useEffect(() => {\r\n if (selectedId && active) {\r\n setTexts((arr) =>\r\n arr.map((t) =>\r\n t.id === selectedId\r\n ? {\r\n ...t,\r\n fill: color,\r\n backgroundColor: backgroundColor,\r\n }\r\n : t,\r\n ),\r\n );\r\n }\r\n }, [color, backgroundColor, selectedId, active, setTexts]);\r\n\r\n const handleDoubleTap = (e, id) => {\r\n if (justDraggedRef.current) return;\r\n const now = Date.now();\r\n const DOUBLE_TAP_DELAY = 300;\r\n\r\n if (tapTimeout) {\r\n clearTimeout(tapTimeout);\r\n setTapTimeout(null);\r\n }\r\n\r\n if (now - lastTap < DOUBLE_TAP_DELAY && tapCount === 1) {\r\n setTapCount(0);\r\n setLastTap(0);\r\n if (e.evt) {\r\n e.evt.preventDefault();\r\n e.evt.stopPropagation();\r\n }\r\n handleDblClick(e, id);\r\n } else {\r\n setLastTap(now);\r\n setTapCount(1);\r\n const timeout = setTimeout(() => {\r\n setTapCount(0);\r\n setLastTap(0);\r\n setTapTimeout(null);\r\n }, DOUBLE_TAP_DELAY);\r\n setTapTimeout(timeout);\r\n setSelectedId(id);\r\n if (onElementSelect) {\r\n onElementSelect(id, \"text\");\r\n }\r\n }\r\n };\r\n\r\n const handleDragMove = (e, id) => {\r\n const stage = e.target.getStage();\r\n const node = e.target;\r\n const { x, y } = node.position();\r\n\r\n const stageContainer = stage.container();\r\n const stageRect = stageContainer.getBoundingClientRect();\r\n const screenX = stageRect.left + x;\r\n const screenY = stageRect.top + y;\r\n\r\n if (checkTrashZoneCollision && updateTrashZoneState) {\r\n const isOverTrash = checkTrashZoneCollision(screenX, screenY);\r\n updateTrashZoneState(isOverTrash);\r\n }\r\n };\r\n\r\n const handleDragEnd = (e, id) => {\r\n const group = e.target;\r\n const stage = e.target.getStage();\r\n const { x, y } = group.position();\r\n const previousText = texts.find((t) => t.id === id);\r\n\r\n justDraggedRef.current = true;\r\n setTimeout(() => {\r\n justDraggedRef.current = false;\r\n }, 0);\r\n\r\n if (updateTrashZoneState) {\r\n updateTrashZoneState(false);\r\n }\r\n\r\n const stageContainer = stage.container();\r\n const stageRect = stageContainer.getBoundingClientRect();\r\n const screenX = stageRect.left + x;\r\n const screenY = stageRect.top + y;\r\n\r\n if (\r\n checkTrashZoneCollision &&\r\n checkTrashZoneCollision(screenX, screenY)\r\n ) {\r\n onDelete?.(id); // records DELETE_ELEMENT in history — syncKonvaState will remove it\r\n setSelectedId(null);\r\n if (trRef.current) {\r\n trRef.current.nodes([]);\r\n trRef.current.getLayer().batchDraw();\r\n }\r\n if (onElementDeselect) onElementDeselect();\r\n onDragStateChange?.(false);\r\n return;\r\n }\r\n\r\n const newText = {\r\n ...previousText,\r\n x,\r\n y,\r\n };\r\n\r\n setTexts((arr) => arr.map((t) => (t.id === id ? newText : t)));\r\n\r\n if (onMove && previousText) {\r\n const hasChanged = previousText.x !== x || previousText.y !== y;\r\n if (hasChanged) {\r\n onMove(id, newText, previousText);\r\n }\r\n }\r\n onDragStateChange?.(false);\r\n };\r\n\r\n const handleDblClick = (e, id) => {\r\n if (!allowCreate) return;\r\n const group = e.target.getParent();\r\n const textNode = group.findOne(\"Text\");\r\n setEditingText({\r\n id,\r\n x: group.x(),\r\n y: group.y(),\r\n value: textNode.text(),\r\n fill: color,\r\n backgroundColor: backgroundColor,\r\n });\r\n };\r\n\r\n const handleTouchMove = (e) => {\r\n if (!active || !selectedId) return;\r\n\r\n const touch1 = e.evt.touches[0];\r\n const touch2 = e.evt.touches[1];\r\n\r\n if (touch1 && touch2) {\r\n e.evt.preventDefault();\r\n const dist = getDistance(\r\n { x: touch1.clientX, y: touch1.clientY },\r\n { x: touch2.clientX, y: touch2.clientY },\r\n );\r\n\r\n if (lastDist > 0) {\r\n const scale = dist / lastDist;\r\n setTexts((arr) =>\r\n arr.map((t) =>\r\n t.id === selectedId\r\n ? {\r\n ...t,\r\n scaleX: (t.scaleX || 1) * scale,\r\n scaleY: (t.scaleY || 1) * scale,\r\n }\r\n : t,\r\n ),\r\n );\r\n }\r\n setLastDist(dist);\r\n }\r\n };\r\n\r\n const handleTouchEnd = () => {\r\n setLastDist(0);\r\n };\r\n\r\n const handleTextClick = (id) => {\r\n if (justDraggedRef.current) return;\r\n setSelectedId(id);\r\n setColor(texts.find((t) => t.id === id)?.fill || \"#000000\");\r\n setBackgroundColor(\r\n texts.find((t) => t.id === id)?.backgroundColor || \"transparent\",\r\n );\r\n if (onElementSelect) {\r\n onElementSelect(id, \"text\");\r\n }\r\n };\r\n\r\n const handleStageDblClick = (e) => {\r\n if (!allowCreate) return;\r\n if (e.target !== e.target.getStage()) return;\r\n const pos = e.target.getStage().getPointerPosition();\r\n setEditingText({\r\n id: null,\r\n x: pos.x,\r\n y: pos.y,\r\n value: \"\",\r\n fill: color,\r\n backgroundColor: backgroundColor,\r\n });\r\n };\r\n\r\n const handleDeselection = () => {\r\n if (selectedId) {\r\n setSelectedId(null);\r\n if (trRef.current) {\r\n trRef.current.nodes([]);\r\n trRef.current.getLayer().batchDraw();\r\n }\r\n if (onElementDeselect) {\r\n onElementDeselect();\r\n }\r\n }\r\n };\r\n\r\n const renderTextarea = () => {\r\n if (!editingText) return null;\r\n return (\r\n <textarea\r\n style={{\r\n position: \"absolute\",\r\n top: editingText.y,\r\n left: editingText.x,\r\n fontSize: fontSize,\r\n fontFamily: fontFamily,\r\n zIndex: 1000,\r\n minWidth: 50,\r\n minHeight: 24,\r\n background: backgroundColor,\r\n color: color,\r\n border: \"1px solid #ccc\",\r\n padding: 2,\r\n }}\r\n value={editingText.value}\r\n autoFocus\r\n onChange={(e) =>\r\n setEditingText((edit) => edit && { ...edit, value: e.target.value })\r\n }\r\n onBlur={() => {\r\n if (editingText.value.trim()) {\r\n if (editingText.id) {\r\n setTexts((arr) =>\r\n arr.map((t) =>\r\n t.id === editingText.id\r\n ? {\r\n ...t,\r\n text: editingText.value,\r\n fill: color,\r\n backgroundColor: backgroundColor,\r\n }\r\n : t,\r\n ),\r\n );\r\n } else {\r\n const newId = `text-${Date.now()}`;\r\n const newText = {\r\n id: newId,\r\n x: editingText.x,\r\n y: editingText.y,\r\n text: editingText.value,\r\n fontSize,\r\n fontFamily,\r\n fill: color,\r\n backgroundColor: backgroundColor,\r\n draggable: true,\r\n };\r\n setTexts((arr) => [...arr, newText]);\r\n if (onAdd && editingText.value.trim().length > 0) {\r\n onAdd(newText);\r\n }\r\n setSelectedId(newId);\r\n if (onElementSelect) {\r\n onElementSelect(newId, \"text\");\r\n }\r\n }\r\n }\r\n setEditingText(null);\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\" && !e.shiftKey) {\r\n e.preventDefault();\r\n e.target.blur();\r\n }\r\n if (e.key === \"Escape\") {\r\n setEditingText(null);\r\n }\r\n }}\r\n />\r\n );\r\n };\r\n\r\n const handleTransformEnd = (e, id) => {\r\n const group = e.target;\r\n const previousText = texts.find((t) => t.id === id);\r\n const scaleX = group.scaleX();\r\n const scaleY = group.scaleY();\r\n const x = group.x();\r\n const y = group.y();\r\n\r\n const newText = {\r\n ...previousText,\r\n x,\r\n y,\r\n scaleX,\r\n scaleY,\r\n };\r\n\r\n setTexts((arr) => arr.map((t) => (t.id === id ? newText : t)));\r\n\r\n if (onMove && previousText) {\r\n const hasChanged =\r\n previousText.x !== x ||\r\n previousText.y !== y ||\r\n (previousText.scaleX || 1) !== scaleX ||\r\n (previousText.scaleY || 1) !== scaleY;\r\n if (hasChanged) {\r\n onMove(id, newText, previousText);\r\n }\r\n }\r\n };\r\n\r\n return (\r\n <div style={{ width, height, position: \"absolute\", inset: 0, pointerEvents: active ? \"auto\" : \"none\", }}>\r\n <Stage\r\n width={width}\r\n height={height}\r\n ref={stageRef}\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n zIndex: 30,\r\n pointerEvents: active ? \"auto\" : \"none\",\r\n }}\r\n onDblClick={handleStageDblClick}\r\n onTouchMove={handleTouchMove}\r\n onTouchEnd={handleTouchEnd}\r\n onClick={(e) => {\r\n const clickedOnEmpty = e.target === e.target.getStage();\r\n if (clickedOnEmpty) {\r\n handleDeselection();\r\n }\r\n }}\r\n onTap={(e) => {\r\n const clickedOnEmpty = e.target === e.target.getStage();\r\n if (clickedOnEmpty) {\r\n const now = Date.now();\r\n const DOUBLE_TAP_DELAY = 400;\r\n if (now - lastTap < DOUBLE_TAP_DELAY) {\r\n handleStageDblClick(e);\r\n } else {\r\n handleDeselection();\r\n }\r\n setLastTap(now);\r\n }\r\n }}\r\n >\r\n <Layer>\r\n {texts.map((t) => {\r\n const textNode = document.createElement(\"span\");\r\n textNode.innerText = t.text;\r\n textNode.style.fontSize = `${t.fontSize}px`;\r\n textNode.style.fontFamily = t.fontFamily;\r\n textNode.style.lineHeight = \"1\";\r\n textNode.style.position = \"absolute\";\r\n textNode.style.visibility = \"hidden\";\r\n document.body.appendChild(textNode);\r\n const padding = 6;\r\n const width = textNode.offsetWidth + padding * 2;\r\n const height = textNode.offsetHeight + padding * 2;\r\n document.body.removeChild(textNode);\r\n\r\n return (\r\n <Group\r\n key={t.id}\r\n id={t.id}\r\n x={t.x}\r\n y={t.y}\r\n scaleX={t.scaleX || 1}\r\n scaleY={t.scaleY || 1}\r\n draggable={t.draggable}\r\n onClick={() => {\r\n handleTextClick(t.id);\r\n }}\r\n onTap={(e) => {\r\n handleTextClick(t.id);\r\n handleDoubleTap(e, t.id);\r\n }}\r\n onDblClick={(e) => handleDblClick(e, t.id)}\r\n onDragStart={() => {\r\n setSelectedId(t.id);\r\n onElementSelect?.(t.id, \"text\");\r\n onDragStateChange?.(true);\r\n }}\r\n onDragMove={(e) => handleDragMove(e, t.id)}\r\n onDragEnd={(e) => handleDragEnd(e, t.id)}\r\n onTransformEnd={(e) => handleTransformEnd(e, t.id)}\r\n >\r\n <Rect\r\n width={width}\r\n height={height}\r\n fill={t.backgroundColor}\r\n cornerRadius={10}\r\n />\r\n <Text\r\n text={t.text}\r\n fontSize={t.fontSize}\r\n fontFamily={t.fontFamily}\r\n fill={t.fill}\r\n x={padding}\r\n y={padding}\r\n lineHeight={1}\r\n />\r\n </Group>\r\n );\r\n })}\r\n <Transformer\r\n ref={trRef}\r\n rotateEnabled={false}\r\n enabledAnchors={[\r\n \"top-left\",\r\n \"top-right\",\r\n \"bottom-left\",\r\n \"bottom-right\",\r\n ]}\r\n anchorSize={8}\r\n borderDash={[4, 4]}\r\n />\r\n </Layer>\r\n </Stage>\r\n {renderTextarea()}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nexport default TextEditor;","export function getDashPattern(strokeStyle, brushSize) {\r\n switch (strokeStyle) {\r\n case \"dashed\": return [brushSize * 3, brushSize * 2];\r\n case \"dotted\": return [brushSize, brushSize];\r\n default: return [];\r\n }\r\n}","export const KONVA_THRESHOLDS = {\r\n MIN_ARROW_LENGTH: 10,\r\n MIN_RECT_SIZE: 10,\r\n MIN_CIRCLE_RADIUS: 5,\r\n MIN_DOUBLE_ARROW_LENGTH: 10,\r\n};","\"use client\";\r\n\r\nimport React, {\r\n useRef,\r\n useState,\r\n useEffect,\r\n forwardRef,\r\n useImperativeHandle,\r\n} from \"react\";\r\nimport { Stage, Layer, Rect, Transformer } from \"react-konva\";\r\nimport { getDashPattern } from \"@/utils/getStrokePattern\";\r\nimport { KONVA_THRESHOLDS } from \"@/utils/konvaThreshold\";\r\n\r\nconst KonvaRectangle = forwardRef(\r\n (\r\n {\r\n width,\r\n height,\r\n active,\r\n color,\r\n setColor,\r\n brushSize,\r\n setBrushSize,\r\n strokeStyle,\r\n setStrokeStyle,\r\n backgroundColor,\r\n setBackgroundColor,\r\n onAdd,\r\n rectangles = [], // Ensure it defaults to empty array\r\n setRectangles,\r\n onFlatten,\r\n onElementSelect,\r\n onElementDeselect,\r\n checkTrashZoneCollision,\r\n updateTrashZoneState,\r\n onMove,\r\n },\r\n ref,\r\n ) => {\r\n const [newRect, setNewRect] = useState(null);\r\n const [selectedId, setSelectedId] = useState(null);\r\n const stageRef = useRef(null);\r\n const trRef = useRef(null);\r\n\r\n useImperativeHandle(ref, () => ({\r\n flatten: () => {\r\n if (onFlatten) onFlatten(rectangles);\r\n if (setRectangles) setRectangles([]);\r\n setSelectedId(null);\r\n },\r\n }));\r\n\r\n useEffect(() => {\r\n if (stageRef.current) {\r\n const stage = stageRef.current;\r\n stage.width(width);\r\n stage.height(height);\r\n stage.batchDraw();\r\n }\r\n }, [width, height]);\r\n\r\n // Handle Keyboard Actions\r\n useEffect(() => {\r\n const handleKeyDown = (e) => {\r\n if ((e.key === \"Delete\" || e.key === \"Backspace\") && selectedId) {\r\n const targeted = rectangles.find((r) => r.id === selectedId);\r\n if (onMove && targeted) {\r\n onMove(selectedId, null, targeted, \"DELETE\");\r\n } else if (setRectangles) {\r\n setRectangles((rects) => rects.filter((r) => r.id !== selectedId));\r\n }\r\n setSelectedId(null);\r\n\r\n if (trRef.current) {\r\n trRef.current.nodes([]);\r\n trRef.current.getLayer().batchDraw();\r\n }\r\n\r\n if (onElementDeselect) onElementDeselect();\r\n }\r\n };\r\n window.addEventListener(\"keydown\", handleKeyDown);\r\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\r\n }, [selectedId, rectangles, setRectangles, onElementDeselect, onMove]);\r\n\r\n // Transformer Selection Synchronizer\r\n useEffect(() => {\r\n if (trRef.current && stageRef.current) {\r\n if (selectedId) {\r\n const node = stageRef.current.findOne(`#${selectedId}`);\r\n if (node) {\r\n trRef.current.nodes([node]);\r\n trRef.current.getLayer().batchDraw();\r\n return;\r\n }\r\n }\r\n trRef.current.nodes([]);\r\n trRef.current.getLayer().batchDraw();\r\n }\r\n }, [selectedId, rectangles]);\r\n\r\n // Property panel changes dynamic observer\r\n useEffect(() => {\r\n if (selectedId && active && setRectangles) {\r\n const targeted = rectangles.find((r) => r.id === selectedId);\r\n if (!targeted) return;\r\n\r\n if (\r\n targeted.stroke !== color ||\r\n targeted.strokeWidth !== brushSize ||\r\n targeted.strokeStyle !== strokeStyle ||\r\n targeted.fill !== backgroundColor\r\n ) {\r\n setRectangles((rects) =>\r\n rects.map((r) =>\r\n r.id === selectedId\r\n ? {\r\n ...r,\r\n stroke: color,\r\n strokeWidth: brushSize,\r\n strokeStyle: strokeStyle,\r\n dash: getDashPattern(strokeStyle, brushSize),\r\n fill: backgroundColor || \"transparent\",\r\n }\r\n : r,\r\n ),\r\n );\r\n }\r\n }\r\n }, [\r\n color,\r\n backgroundColor,\r\n selectedId,\r\n strokeStyle,\r\n brushSize,\r\n active,\r\n rectangles,\r\n setRectangles,\r\n ]);\r\n\r\n const handleMouseDown = (e) => {\r\n if (!active) return;\r\n if (e.evt) e.evt.preventDefault();\r\n\r\n const clickedOnEmpty = e.target === e.target.getStage();\r\n if (!clickedOnEmpty) return;\r\n\r\n const pos = e.target.getStage().getPointerPosition();\r\n if (!pos) return;\r\n\r\n const id = `rect-${Date.now()}`;\r\n setNewRect({\r\n id,\r\n x: pos.x,\r\n y: pos.y,\r\n width: 0,\r\n height: 0,\r\n stroke: color || \"#000000\",\r\n strokeWidth: brushSize || 3,\r\n strokeStyle: strokeStyle || \"solid\",\r\n draggable: true,\r\n rotation: 0,\r\n dash: getDashPattern(strokeStyle || \"solid\", brushSize || 3),\r\n fill: backgroundColor || \"transparent\",\r\n });\r\n setSelectedId(id);\r\n };\r\n\r\n const handleMouseMove = (e) => {\r\n if (!active || !newRect) return;\r\n if (e.evt) e.evt.preventDefault();\r\n\r\n const pos = e.target.getStage().getPointerPosition();\r\n if (!pos) return;\r\n\r\n setNewRect({\r\n ...newRect,\r\n width: Math.abs(pos.x - newRect.x),\r\n height: Math.abs(pos.y - newRect.y),\r\n x: Math.min(pos.x, newRect.x),\r\n y: Math.min(pos.y, newRect.y),\r\n });\r\n };\r\n\r\n const handleMouseUp = (e) => {\r\n if (!active || !newRect) return;\r\n if (e.evt) e.evt.preventDefault();\r\n\r\n // Ensure fallback thresholds so shapes are never dropped due to small sizing\r\n const minW = KONVA_THRESHOLDS?.MIN_RECT_WIDTH ?? 2;\r\n const minH = KONVA_THRESHOLDS?.MIN_RECT_HEIGHT ?? 2;\r\n\r\n if (newRect.width >= minW && newRect.height >= minH) {\r\n // Optimistically update local hook context immediately to prevent disappearance flicker\r\n if (setRectangles) {\r\n setRectangles((rects) => [...rects, newRect]);\r\n }\r\n\r\n if (onAdd) {\r\n onAdd(newRect); // Commit to parent history layout array\r\n }\r\n }\r\n setNewRect(null);\r\n };\r\n\r\n const handleRectClick = (id) => {\r\n const clickedRect = rectangles.find((r) => r.id === id);\r\n if (!clickedRect) return;\r\n\r\n setSelectedId(id);\r\n if (setColor) setColor(clickedRect.stroke || \"#000000\");\r\n if (setBackgroundColor)\r\n setBackgroundColor(clickedRect.fill || \"transparent\");\r\n if (setBrushSize) setBrushSize(clickedRect.strokeWidth || 3);\r\n if (setStrokeStyle) setStrokeStyle(clickedRect.strokeStyle || \"solid\");\r\n\r\n if (onElementSelect) {\r\n onElementSelect(id, \"rectangle\");\r\n }\r\n };\r\n\r\n const handleDragMove = (e, id) => {\r\n if (!active) return;\r\n const stage = e.target.getStage();\r\n const node = e.target;\r\n const { x, y } = node.position();\r\n\r\n const stageRect = stage.container().getBoundingClientRect();\r\n const screenX = stageRect.left + x;\r\n const screenY = stageRect.top + y;\r\n\r\n if (checkTrashZoneCollision && updateTrashZoneState) {\r\n const isOverTrash = checkTrashZoneCollision(screenX, screenY);\r\n updateTrashZoneState(isOverTrash);\r\n }\r\n };\r\n\r\n const handleDragEnd = (e, id) => {\r\n if (!active) return;\r\n const stage = e.target.getStage();\r\n const node = e.target;\r\n const { x, y } = node.position();\r\n\r\n const previousRect = rectangles.find((r) => r.id === id);\r\n if (updateTrashZoneState) updateTrashZoneState(false);\r\n\r\n const stageRect = stage.container().getBoundingClientRect();\r\n const screenX = stageRect.left + x;\r\n const screenY = stageRect.top + y;\r\n\r\n if (\r\n checkTrashZoneCollision &&\r\n checkTrashZoneCollision(screenX, screenY)\r\n ) {\r\n if (onMove && previousRect) {\r\n onMove(id, null, previousRect, \"DELETE\");\r\n } else if (setRectangles) {\r\n setRectangles((rects) => rects.filter((r) => r.id !== id));\r\n setSelectedId(null);\r\n }\r\n if (trRef.current) trRef.current.nodes([]);\r\n if (onElementDeselect) onElementDeselect();\r\n return;\r\n }\r\n\r\n const updated = { ...previousRect, x, y };\r\n\r\n if (\r\n onMove &&\r\n previousRect &&\r\n (previousRect.x !== x || previousRect.y !== y)\r\n ) {\r\n onMove(id, updated, previousRect);\r\n } else if (setRectangles) {\r\n setRectangles((rects) => rects.map((r) => (r.id === id ? updated : r)));\r\n }\r\n };\r\n\r\n const handleTransformEnd = (e, id) => {\r\n if (!active) return;\r\n const node = e.target;\r\n const previousRect = rectangles.find((r) => r.id === id);\r\n if (!previousRect) return;\r\n\r\n const scaleX = node.scaleX();\r\n const scaleY = node.scaleY();\r\n const rotation = node.rotation();\r\n\r\n const newWidth = Math.max(\r\n KONVA_THRESHOLDS?.MIN_RECT_WIDTH ?? 2,\r\n node.width() * scaleX,\r\n );\r\n const newHeight = Math.max(\r\n KONVA_THRESHOLDS?.MIN_RECT_HEIGHT ?? 2,\r\n node.height() * scaleY,\r\n );\r\n\r\n node.scaleX(1);\r\n node.scaleY(1);\r\n\r\n const updated = {\r\n ...previousRect,\r\n x: node.x(),\r\n y: node.y(),\r\n width: newWidth,\r\n height: newHeight,\r\n rotation: rotation,\r\n };\r\n\r\n if (onMove) {\r\n onMove(id, updated, previousRect);\r\n } else if (setRectangles) {\r\n setRectangles((rects) => rects.map((r) => (r.id === id ? updated : r)));\r\n }\r\n };\r\n\r\n return (\r\n <Stage\r\n width={width}\r\n height={height}\r\n ref={stageRef}\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n zIndex: 30,\r\n pointerEvents: active ? \"auto\" : \"none\", // Keeps click-through on passive layer seamless\r\n }}\r\n onMouseDown={handleMouseDown}\r\n onMouseMove={handleMouseMove}\r\n onMouseUp={handleMouseUp}\r\n onTouchStart={handleMouseDown}\r\n onTouchMove={handleMouseMove}\r\n onTouchEnd={handleMouseUp}\r\n onClick={(e) => {\r\n if (e.target === e.target.getStage()) {\r\n setSelectedId(null);\r\n if (onElementDeselect) onElementDeselect();\r\n }\r\n }}\r\n onTap={(e) => {\r\n if (e.target === e.target.getStage()) {\r\n setSelectedId(null);\r\n if (onElementDeselect) onElementDeselect();\r\n }\r\n }}\r\n >\r\n <Layer>\r\n {rectangles.map((rect) => (\r\n <Rect\r\n key={rect.id}\r\n id={rect.id}\r\n x={rect.x}\r\n y={rect.y}\r\n width={rect.width}\r\n height={rect.height}\r\n stroke={rect.stroke}\r\n strokeWidth={rect.strokeWidth}\r\n dash={rect.dash}\r\n draggable={active && rect.draggable}\r\n rotation={rect.rotation}\r\n fill={rect.fill === \"transparent\" ? undefined : rect.fill}\r\n onClick={() => handleRectClick(rect.id)}\r\n onTap={() => handleRectClick(rect.id)}\r\n onDragMove={(e) => handleDragMove(e, rect.id)}\r\n onDragEnd={(e) => handleDragEnd(e, rect.id)}\r\n onTransformEnd={(e) => handleTransformEnd(e, rect.id)}\r\n />\r\n ))}\r\n {newRect && (\r\n <Rect\r\n x={newRect.x}\r\n y={newRect.y}\r\n width={newRect.width}\r\n height={newRect.height}\r\n stroke={newRect.stroke}\r\n strokeWidth={newRect.strokeWidth}\r\n dash={newRect.dash}\r\n fill={newRect.fill === \"transparent\" ? undefined : newRect.fill}\r\n />\r\n )}\r\n {active && (\r\n <Transformer\r\n ref={trRef}\r\n rotateEnabled={false}\r\n enabledAnchors={[\r\n \"top-left\",\r\n \"top-right\",\r\n \"bottom-left\",\r\n \"bottom-right\",\r\n \"middle-left\",\r\n \"middle-right\",\r\n \"top-center\",\r\n \"bottom-center\",\r\n ]}\r\n anchorSize={8}\r\n borderDash={[4, 4]}\r\n />\r\n )}\r\n </Layer>\r\n </Stage>\r\n );\r\n },\r\n);\r\n\r\nexport default KonvaRectangle;\r\n","\"use client\";\r\n\r\nimport React, {\r\n useRef,\r\n useState,\r\n useEffect,\r\n forwardRef,\r\n useImperativeHandle,\r\n} from \"react\";\r\nimport { Stage, Layer, Arrow, Transformer } from \"react-konva\";\r\nimport { getDashPattern } from \"@/utils/getStrokePattern\";\r\nimport { KONVA_THRESHOLDS } from \"@/utils/konvaThreshold\";\r\n\r\nconst ArrowKonva = forwardRef(\r\n (\r\n {\r\n width,\r\n height,\r\n active,\r\n color,\r\n setColor,\r\n brushSize,\r\n setBrushSize,\r\n strokeStyle,\r\n setStrokeStyle,\r\n onAdd,\r\n onMove,\r\n arrows,\r\n setArrows,\r\n onFlatten,\r\n onElementSelect,\r\n onElementDeselect,\r\n checkTrashZoneCollision,\r\n updateTrashZoneState,\r\n },\r\n ref,\r\n ) => {\r\n const [newArrow, setNewArrow] = useState(null);\r\n const [selectedId, setSelectedId] = useState(null);\r\n const [lastDist, setLastDist] = useState(0);\r\n const [lastRotation, setLastRotation] = useState(0);\r\n\r\n const stageRef = useRef(null);\r\n const trRef = useRef(null);\r\n\r\n // ── imperative handle ──────────────────────────────────────────────────\r\n useImperativeHandle(ref, () => ({\r\n flatten: () => {\r\n onFlatten(arrows);\r\n setArrows([]);\r\n setSelectedId(null);\r\n },\r\n }));\r\n\r\n // ── sync stage size ────────────────────────────────────────────────────\r\n useEffect(() => {\r\n if (stageRef.current) {\r\n stageRef.current.width(width);\r\n stageRef.current.height(height);\r\n stageRef.current.batchDraw();\r\n }\r\n }, [width, height]);\r\n\r\n // ── keyboard delete ────────────────────────────────────────────────────\r\n useEffect(() => {\r\n const handleKeyDown = (e) => {\r\n if ((e.key === \"Delete\" || e.key === \"Backspace\") && selectedId) {\r\n setArrows((arrs) => arrs.filter((a) => a.id !== selectedId));\r\n setSelectedId(null);\r\n }\r\n };\r\n window.addEventListener(\"keydown\", handleKeyDown);\r\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\r\n }, [selectedId, setArrows]);\r\n\r\n // ── transformer sync ───────────────────────────────────────────────────\r\n useEffect(() => {\r\n if (trRef.current && selectedId && stageRef.current) {\r\n const node = stageRef.current.findOne(`#${selectedId}`);\r\n if (node) {\r\n trRef.current.nodes([node]);\r\n trRef.current.getLayer().batchDraw();\r\n }\r\n } else if (trRef.current) {\r\n trRef.current.nodes([]);\r\n trRef.current.getLayer().batchDraw();\r\n }\r\n }, [selectedId, arrows]);\r\n\r\n // ── live colour / size update on selected arrow ────────────────────────\r\n useEffect(() => {\r\n if (selectedId) {\r\n setArrows((arrs) =>\r\n arrs.map((a) =>\r\n a.id === selectedId\r\n ? {\r\n ...a,\r\n stroke: color,\r\n strokeWidth: brushSize,\r\n strokeStyle,\r\n dash: getDashPattern(strokeStyle, brushSize),\r\n }\r\n : a,\r\n ),\r\n );\r\n }\r\n }, [color, selectedId, brushSize, strokeStyle]);\r\n\r\n // ── helpers ────────────────────────────────────────────────────────────\r\n const constrainToBounds = (points, canvasWidth, canvasHeight) => {\r\n const [x1, y1, x2, y2] = points;\r\n return [\r\n Math.max(0, Math.min(canvasWidth, x1)),\r\n Math.max(0, Math.min(canvasHeight, y1)),\r\n Math.max(0, Math.min(canvasWidth, x2)),\r\n Math.max(0, Math.min(canvasHeight, y2)),\r\n ];\r\n };\r\n\r\n const getDistance = (p1, p2) =>\r\n Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));\r\n\r\n const getAngle = (p1, p2) => Math.atan2(p2.y - p1.y, p2.x - p1.x);\r\n\r\n const getCenter = (p1, p2) => ({\r\n x: (p1.x + p2.x) / 2,\r\n y: (p1.y + p2.y) / 2,\r\n });\r\n\r\n // ── stage events ───────────────────────────────────────────────────────\r\n const handleStageClick = (e) => {\r\n if (!active) return;\r\n if (e.evt) e.evt.preventDefault();\r\n if (e.evt.touches && e.evt.touches.length > 1) return;\r\n\r\n const clickedOnEmpty = e.target === e.target.getStage();\r\n if (!clickedOnEmpty) return;\r\n\r\n if (selectedId) {\r\n setSelectedId(null);\r\n onElementDeselect?.();\r\n }\r\n\r\n const pos = e.target.getStage().getPointerPosition();\r\n if (!pos) return;\r\n\r\n const id = `arrow-${Date.now()}`;\r\n setNewArrow({\r\n id,\r\n points: [pos.x, pos.y, pos.x, pos.y],\r\n stroke: color,\r\n strokeWidth: brushSize,\r\n strokeStyle,\r\n dash: getDashPattern(strokeStyle, brushSize),\r\n draggable: true,\r\n });\r\n setSelectedId(id);\r\n };\r\n\r\n const handleMouseMove = (e) => {\r\n if (!active || !newArrow) return;\r\n if (e.evt) e.evt.preventDefault();\r\n\r\n const pos = e.target.getStage().getPointerPosition();\r\n if (!pos) return;\r\n\r\n setNewArrow({\r\n ...newArrow,\r\n points: [\r\n newArrow.points[0],\r\n newArrow.points[1],\r\n Math.max(0, Math.min(width, pos.x)),\r\n Math.max(0, Math.min(height, pos.y)),\r\n ],\r\n });\r\n };\r\n\r\n const handleMouseUp = (e) => {\r\n if (!active || !newArrow) return;\r\n if (e.evt) e.evt.preventDefault();\r\n\r\n const [x1, y1, x2, y2] = newArrow.points;\r\n const arrowLength = Math.sqrt(\r\n Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2),\r\n );\r\n\r\n if (arrowLength >= KONVA_THRESHOLDS.MIN_ARROW_LENGTH) {\r\n setArrows((arrs) => [...arrs, newArrow]);\r\n onAdd?.(newArrow);\r\n }\r\n setNewArrow(null);\r\n };\r\n\r\n const handleTouchMove = (e) => {\r\n if (!active) return;\r\n const touch1 = e.evt.touches[0];\r\n const touch2 = e.evt.touches[1];\r\n\r\n if (newArrow && !touch2) {\r\n handleMouseMove(e);\r\n return;\r\n }\r\n\r\n if (touch1 && touch2 && selectedId) {\r\n e.evt.preventDefault();\r\n\r\n const dist = getDistance(\r\n { x: touch1.clientX, y: touch1.clientY },\r\n { x: touch2.clientX, y: touch2.clientY },\r\n );\r\n const angle = getAngle(\r\n { x: touch1.clientX, y: touch1.clientY },\r\n { x: touch2.clientX, y: touch2.clientY },\r\n );\r\n\r\n if (lastDist > 0) {\r\n const scale = dist / lastDist;\r\n const rotationDelta = angle - lastRotation;\r\n\r\n setArrows((arrs) =>\r\n arrs.map((a) => {\r\n if (a.id !== selectedId) return a;\r\n const [x1, y1, x2, y2] = a.points;\r\n const cx = (x1 + x2) / 2,\r\n cy = (y1 + y2) / 2;\r\n const len = Math.sqrt(\r\n Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2),\r\n );\r\n const ang = Math.atan2(y2 - y1, x2 - x1);\r\n const nl = len * scale;\r\n const na = ang + rotationDelta;\r\n const hl = nl / 2;\r\n return {\r\n ...a,\r\n points: [\r\n cx - hl * Math.cos(na),\r\n cy - hl * Math.sin(na),\r\n cx + hl * Math.cos(na),\r\n cy + hl * Math.sin(na),\r\n ],\r\n };\r\n }),\r\n );\r\n }\r\n setLastDist(dist);\r\n setLastRotation(angle);\r\n }\r\n };\r\n\r\n const handleTouchEnd = (e) => {\r\n setLastDist(0);\r\n setLastRotation(0);\r\n if (newArrow && !e.evt.touches.length) handleMouseUp(e);\r\n };\r\n\r\n // ── arrow interaction ──────────────────────────────────────────────────\r\n const handleArrowClick = (id) => {\r\n const clicked = arrows.find((a) => a.id === id);\r\n setSelectedId(id);\r\n setColor(clicked?.stroke || \"#000000\");\r\n if (clicked?.strokeStyle) setStrokeStyle(clicked.strokeStyle);\r\n setBrushSize(clicked?.strokeWidth || 3);\r\n onElementSelect?.(id, \"arrow\");\r\n };\r\n\r\n const handleTransformEnd = (e, id) => {\r\n const node = e.target;\r\n const previousArrow = arrows.find((a) => a.id === id);\r\n\r\n const scaleX = node.scaleX();\r\n const scaleY = node.scaleY();\r\n const rotation = node.rotation();\r\n const oldPoints = node.points();\r\n\r\n const cx = (oldPoints[0] + oldPoints[2]) / 2;\r\n const cy = (oldPoints[1] + oldPoints[3]) / 2;\r\n const len = Math.sqrt(\r\n Math.pow(oldPoints[2] - oldPoints[0], 2) +\r\n Math.pow(oldPoints[3] - oldPoints[1], 2),\r\n );\r\n const ang = Math.atan2(\r\n oldPoints[3] - oldPoints[1],\r\n oldPoints[2] - oldPoints[0],\r\n );\r\n const nl = len * Math.max(scaleX, scaleY);\r\n const na = ang + (rotation * Math.PI) / 180;\r\n const hl = nl / 2;\r\n\r\n const constrainedPoints = constrainToBounds(\r\n [\r\n cx - hl * Math.cos(na),\r\n cy - hl * Math.sin(na),\r\n cx + hl * Math.cos(na),\r\n cy + hl * Math.sin(na),\r\n ],\r\n width,\r\n height,\r\n );\r\n\r\n node.scaleX(1);\r\n node.scaleY(1);\r\n node.rotation(0);\r\n node.x(0);\r\n node.y(0);\r\n\r\n const updated = {\r\n ...previousArrow,\r\n points: constrainedPoints,\r\n stroke: color,\r\n strokeWidth: brushSize,\r\n strokeStyle,\r\n dash: getDashPattern(strokeStyle, brushSize),\r\n };\r\n\r\n setArrows((arrs) => arrs.map((a) => (a.id === id ? updated : a)));\r\n\r\n if (onMove && previousArrow) {\r\n const changed = !previousArrow.points.every(\r\n (p, i) => p === constrainedPoints[i],\r\n );\r\n if (changed) onMove(id, updated, previousArrow);\r\n }\r\n };\r\n\r\n const handleDragMove = (e, id) => {\r\n if (!checkTrashZoneCollision || !updateTrashZoneState) return;\r\n const node = e.target;\r\n const stage = node.getStage();\r\n const { x, y } = node.position();\r\n const pts = node.points();\r\n const cx = (pts[0] + pts[2]) / 2;\r\n const cy = (pts[1] + pts[3]) / 2;\r\n const rect = stage.container().getBoundingClientRect();\r\n updateTrashZoneState(\r\n checkTrashZoneCollision(rect.left + cx + x, rect.top + cy + y),\r\n );\r\n };\r\n\r\n const handleDragEnd = (e, id) => {\r\n const node = e.target;\r\n const stage = node.getStage();\r\n const x = node.x();\r\n const y = node.y();\r\n const previousArrow = arrows.find((a) => a.id === id);\r\n\r\n updateTrashZoneState?.(false);\r\n\r\n const rect = stage.container().getBoundingClientRect();\r\n const pts = node.points();\r\n const cx = (pts[0] + pts[2]) / 2 + x;\r\n const cy = (pts[1] + pts[3]) / 2 + y;\r\n\r\n if (checkTrashZoneCollision?.(rect.left + cx, rect.top + cy)) {\r\n setArrows((arrs) => arrs.filter((a) => a.id !== id));\r\n setSelectedId(null);\r\n onElementDeselect?.();\r\n return;\r\n }\r\n\r\n const newPoints = constrainToBounds(\r\n [pts[0] + x, pts[1] + y, pts[2] + x, pts[3] + y],\r\n width,\r\n height,\r\n );\r\n node.x(0);\r\n node.y(0);\r\n\r\n const updated = {\r\n ...previousArrow,\r\n points: newPoints,\r\n stroke: color,\r\n strokeWidth: brushSize,\r\n strokeStyle,\r\n dash: getDashPattern(strokeStyle, brushSize),\r\n };\r\n\r\n setArrows((arrs) => arrs.map((a) => (a.id === id ? updated : a)));\r\n\r\n if (onMove && previousArrow) {\r\n const changed = !previousArrow.points.every(\r\n (p, i) => p === newPoints[i],\r\n );\r\n if (changed) onMove(id, updated, previousArrow);\r\n }\r\n };\r\n\r\n // ── render ─────────────────────────────────────────────────────────────\r\n return (\r\n <Stage\r\n width={width}\r\n height={height}\r\n ref={stageRef}\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n zIndex: 30,\r\n pointerEvents: active ? \"auto\" : \"none\",\r\n }}\r\n onMouseDown={handleStageClick}\r\n onMouseMove={handleMouseMove}\r\n onMouseUp={handleMouseUp}\r\n onTouchStart={handleStageClick}\r\n onTouchMove={handleTouchMove}\r\n onTouchEnd={handleTouchEnd}\r\n onClick={(e) => {\r\n if (e.target === e.target.getStage() && selectedId) {\r\n setSelectedId(null);\r\n onElementDeselect?.();\r\n }\r\n }}\r\n onTap={(e) => {\r\n if (e.target === e.target.getStage() && selectedId) {\r\n setSelectedId(null);\r\n onElementDeselect?.();\r\n }\r\n }}\r\n >\r\n <Layer>\r\n {arrows.map((arrow) => (\r\n <Arrow\r\n key={arrow.id}\r\n id={arrow.id}\r\n points={arrow.points}\r\n stroke={arrow.stroke}\r\n strokeWidth={arrow.strokeWidth}\r\n hitStrokeWidth={Math.max(60, arrow.strokeWidth * 4)}\r\n perfectDrawEnabled={false}\r\n dash={arrow.dash}\r\n pointerLength={15}\r\n pointerWidth={15}\r\n fill={arrow.stroke}\r\n draggable={arrow.draggable}\r\n onClick={(e) => {\r\n e.cancelBubble = true;\r\n handleArrowClick(arrow.id);\r\n }}\r\n onTap={(e) => {\r\n e.cancelBubble = true;\r\n handleArrowClick(arrow.id);\r\n }}\r\n onDragMove={(e) => handleDragMove(e, arrow.id)}\r\n onDragEnd={(e) => handleDragEnd(e, arrow.id)}\r\n onTransformEnd={(e) => handleTransformEnd(e, arrow.id)}\r\n />\r\n ))}\r\n\r\n {newArrow && (\r\n <Arrow\r\n points={newArrow.points}\r\n stroke={newArrow.stroke}\r\n strokeWidth={newArrow.strokeWidth}\r\n hitStrokeWidth={Math.max(90, newArrow.strokeWidth * 4)}\r\n perfectDrawEnabled={false}\r\n dash={newArrow.dash}\r\n pointerLength={15}\r\n pointerWidth={15}\r\n fill={newArrow.stroke}\r\n />\r\n )}\r\n\r\n <Transformer\r\n ref={trRef}\r\n rotateEnabled={true}\r\n enabledAnchors={[\r\n \"top-left\",\r\n \"top-right\",\r\n \"bottom-left\",\r\n \"bottom-right\",\r\n \"middle-left\",\r\n \"middle-right\",\r\n ]}\r\n anchorSize={8}\r\n borderDash={[4, 4]}\r\n />\r\n </Layer>\r\n </Stage>\r\n );\r\n },\r\n);\r\n\r\nArrowKonva.displayName = \"ArrowKonva\";\r\nexport default ArrowKonva;\r\n","\"use client\";\r\n\r\nimport React, {\r\n useRef,\r\n useState,\r\n forwardRef,\r\n useEffect,\r\n useImperativeHandle,\r\n} from \"react\";\r\nimport { Stage, Layer, Circle, Transformer } from \"react-konva\";\r\nimport { getDashPattern } from \"@/utils/getStrokePattern\";\r\nimport { KONVA_THRESHOLDS } from \"@/utils/konvaThreshold\";\r\n\r\nconst KonvaCircle = forwardRef(\r\n (\r\n {\r\n width,\r\n height,\r\n active,\r\n color,\r\n setColor,\r\n brushSize,\r\n setBrushSize,\r\n strokeStyle,\r\n setStrokeStyle,\r\n backgroundColor,\r\n setBackgroundColor,\r\n onAdd,\r\n onMove,\r\n circles,\r\n setCircles,\r\n onFlatten,\r\n onElementSelect,\r\n onElementDeselect,\r\n checkTrashZoneCollision,\r\n updateTrashZoneState,\r\n },\r\n ref,\r\n ) => {\r\n const [newCircle, setNewCircle] = useState(null);\r\n const [selectedId, setSelectedId] = useState(null);\r\n const stageRef = useRef(null);\r\n const trRef = useRef(null);\r\n\r\n useImperativeHandle(ref, () => ({\r\n flatten: () => {\r\n onFlatten(circles);\r\n setCircles([]);\r\n setSelectedId(null);\r\n },\r\n }));\r\n\r\n useEffect(() => {\r\n if (stageRef.current) {\r\n const stage = stageRef.current;\r\n stage.width(width);\r\n stage.height(height);\r\n stage.batchDraw();\r\n }\r\n }, [width, height]);\r\n\r\n useEffect(() => {\r\n const handleKeyDown = (e) => {\r\n if ((e.key === \"Delete\" || e.key === \"Backspace\") && selectedId) {\r\n setCircles((circle) => circle.filter((c) => c.id !== selectedId));\r\n setSelectedId(null);\r\n }\r\n };\r\n window.addEventListener(\"keydown\", handleKeyDown);\r\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\r\n }, [selectedId, setCircles]);\r\n\r\n const handleStageClick = (e) => {\r\n if (!active) return;\r\n if (e.evt) {\r\n e.evt.preventDefault();\r\n }\r\n\r\n const clickedOnEmpty = e.target === e.target.getStage();\r\n if (!clickedOnEmpty) return;\r\n\r\n if (selectedId) {\r\n setSelectedId(null);\r\n if (onElementDeselect) {\r\n onElementDeselect();\r\n }\r\n }\r\n\r\n const pos = e.target.getStage().getPointerPosition();\r\n if (!pos) return;\r\n\r\n const id = `circle-${Date.now()}`;\r\n setNewCircle({\r\n id,\r\n x: pos.x,\r\n y: pos.y,\r\n radius: 1,\r\n stroke: color,\r\n strokeWidth: brushSize,\r\n strokeStyle: strokeStyle,\r\n draggable: true,\r\n dash: getDashPattern(strokeStyle, brushSize),\r\n fill:\r\n backgroundColor && backgroundColor !== \"transparent\"\r\n ? backgroundColor\r\n : undefined,\r\n });\r\n setSelectedId(id);\r\n };\r\n\r\n const handleMouseMove = (e) => {\r\n if (!active || !newCircle) return;\r\n if (e.evt) {\r\n e.evt.preventDefault();\r\n }\r\n\r\n const pos = e.target.getStage().getPointerPosition();\r\n if (!pos) return;\r\n\r\n const dx = pos.x - newCircle.x;\r\n const dy = pos.y - newCircle.y;\r\n setNewCircle({\r\n ...newCircle,\r\n radius: Math.sqrt(dx * dx + dy * dy),\r\n });\r\n };\r\n\r\n const handleMouseUp = (e) => {\r\n if (!active || !newCircle) return;\r\n if (e.evt) {\r\n e.evt.preventDefault();\r\n }\r\n\r\n if (newCircle.radius >= KONVA_THRESHOLDS.MIN_CIRCLE_RADIUS) {\r\n setCircles((cs) => [...cs, newCircle]);\r\n if (onAdd) {\r\n onAdd(newCircle);\r\n }\r\n }\r\n setNewCircle(null);\r\n };\r\n\r\n const handleCircleClick = (id) => {\r\n const clickedCircle = circles.find((c) => c.id === id);\r\n\r\n setSelectedId(id);\r\n setColor(clickedCircle?.stroke || \"#000000\");\r\n setBackgroundColor(clickedCircle?.fill || \"transparent\");\r\n setBrushSize(clickedCircle?.strokeWidth || 3);\r\n setStrokeStyle(clickedCircle?.strokeStyle || \"solid\");\r\n\r\n if (onElementSelect) {\r\n onElementSelect(id, \"circle\");\r\n }\r\n };\r\n\r\n const handleTransformEnd = (e, id) => {\r\n const node = e.target;\r\n const previousCircle = circles.find((c) => c.id === id);\r\n if (!previousCircle) return;\r\n\r\n const scaleX = node.scaleX();\r\n const scaleY = node.scaleY();\r\n const uniformScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\r\n const newRadius = Math.max(\r\n previousCircle.radius * uniformScale,\r\n KONVA_THRESHOLDS.MIN_CIRCLE_RADIUS,\r\n );\r\n\r\n const newCenterX = previousCircle.x;\r\n const newCenterY = previousCircle.y;\r\n\r\n node.radius(newRadius);\r\n node.x(newCenterX);\r\n node.y(newCenterY);\r\n node.scaleX(1);\r\n node.scaleY(1);\r\n node.rotation(0);\r\n\r\n node.getLayer().batchDraw();\r\n\r\n const newCircle = {\r\n ...previousCircle,\r\n radius: newRadius,\r\n x: newCenterX,\r\n y: newCenterY,\r\n };\r\n\r\n setCircles((cs) => cs.map((c) => (c.id === id ? newCircle : c)));\r\n\r\n if (onMove && previousCircle) {\r\n const hasChanged = previousCircle.radius !== newRadius;\r\n if (hasChanged) {\r\n onMove(id, newCircle, previousCircle);\r\n }\r\n }\r\n };\r\n\r\n const handleDragMove = (e, id) => {\r\n const stage = e.target.getStage();\r\n const node = e.target;\r\n const { x, y } = node.position();\r\n\r\n const stageContainer = stage.container();\r\n const stageRect = stageContainer.getBoundingClientRect();\r\n const screenX = stageRect.left + x;\r\n const screenY = stageRect.top + y;\r\n\r\n if (checkTrashZoneCollision && updateTrashZoneState) {\r\n const isOverTrash = checkTrashZoneCollision(screenX, screenY);\r\n updateTrashZoneState(isOverTrash);\r\n }\r\n };\r\n\r\n const handleDragEnd = (e, id) => {\r\n const stage = e.target.getStage();\r\n const node = e.target;\r\n const { x, y } = node.position();\r\n\r\n const previousCircle = circles.find((c) => c.id === id);\r\n\r\n if (updateTrashZoneState) {\r\n updateTrashZoneState(false);\r\n }\r\n\r\n const stageContainer = stage.container();\r\n const stageRect = stageContainer.getBoundingClientRect();\r\n const screenX = stageRect.left + x;\r\n const screenY = stageRect.top + y;\r\n\r\n if (\r\n checkTrashZoneCollision &&\r\n checkTrashZoneCollision(screenX, screenY)\r\n ) {\r\n setCircles((circles) => circles.filter((c) => c.id !== id));\r\n setSelectedId(null);\r\n if (onElementDeselect) onElementDeselect();\r\n return;\r\n }\r\n\r\n setCircles((circles) =>\r\n circles.map((c) => (c.id === id ? { ...c, x, y } : c)),\r\n );\r\n\r\n if (\r\n onMove &&\r\n previousCircle &&\r\n (previousCircle.x !== x || previousCircle.y !== y)\r\n ) {\r\n const newCircle = { ...previousCircle, x, y };\r\n onMove(id, newCircle, previousCircle);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if (trRef.current && selectedId && stageRef.current) {\r\n const node = stageRef.current.findOne(`#${selectedId}`);\r\n if (node) {\r\n trRef.current.nodes([node]);\r\n trRef.current.getLayer().batchDraw();\r\n }\r\n } else if (trRef.current) {\r\n trRef.current.nodes([]);\r\n trRef.current.getLayer().batchDraw();\r\n }\r\n }, [selectedId, circles]);\r\n\r\n useEffect(() => {\r\n if (selectedId) {\r\n setCircles((cs) =>\r\n cs.map((c) =>\r\n c.id === selectedId\r\n ? {\r\n ...c,\r\n stroke: color,\r\n strokeWidth: brushSize,\r\n strokeStyle: strokeStyle,\r\n dash: getDashPattern(strokeStyle, brushSize),\r\n ...(backgroundColor &&\r\n backgroundColor !== \"transparent\" && {\r\n fill: backgroundColor,\r\n }),\r\n }\r\n : c,\r\n ),\r\n );\r\n }\r\n }, [\r\n color,\r\n backgroundColor,\r\n selectedId,\r\n strokeStyle,\r\n brushSize,\r\n setCircles,\r\n ]);\r\n\r\n return (\r\n <Stage\r\n ref={stageRef}\r\n width={width}\r\n height={height}\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n zIndex: 30,\r\n pointerEvents: active ? \"auto\" : \"none\",\r\n }}\r\n onMouseDown={handleStageClick}\r\n onMouseMove={handleMouseMove}\r\n onMouseUp={handleMouseUp}\r\n onTouchStart={handleStageClick}\r\n onTouchMove={handleMouseMove}\r\n onTouchEnd={handleMouseUp}\r\n onClick={(e) => {\r\n const clickedOnEmpty = e.target === e.target.getStage();\r\n if (clickedOnEmpty && selectedId) {\r\n setSelectedId(null);\r\n if (onElementDeselect) {\r\n onElementDeselect();\r\n }\r\n }\r\n }}\r\n onTap={(e) => {\r\n const clickedOnEmpty = e.target === e.target.getStage();\r\n if (clickedOnEmpty && selectedId) {\r\n setSelectedId(null);\r\n if (onElementDeselect) {\r\n onElementDeselect();\r\n }\r\n }\r\n }}\r\n >\r\n <Layer>\r\n {circles.map((circle) => (\r\n <Circle\r\n key={circle.id}\r\n id={circle.id}\r\n x={circle.x}\r\n y={circle.y}\r\n radius={circle.radius}\r\n stroke={circle.stroke}\r\n strokeWidth={circle.strokeWidth}\r\n dash={circle.dash}\r\n draggable={circle.draggable}\r\n fill={circle.fill}\r\n onClick={() => handleCircleClick(circle.id)}\r\n onTap={() => handleCircleClick(circle.id)}\r\n onDragMove={(e) => handleDragMove(e, circle.id)}\r\n onDragEnd={(e) => handleDragEnd(e, circle.id)}\r\n onTransformEnd={(e) => handleTransformEnd(e, circle.id)}\r\n />\r\n ))}\r\n {newCircle && (\r\n <Circle\r\n x={newCircle.x}\r\n y={newCircle.y}\r\n radius={newCircle.radius}\r\n stroke={newCircle.stroke}\r\n strokeWidth={newCircle.strokeWidth}\r\n dash={newCircle.dash}\r\n fill={newCircle.fill}\r\n />\r\n )}\r\n <Transformer\r\n ref={trRef}\r\n rotateEnabled={false}\r\n enabledAnchors={[\r\n \"top-left\",\r\n \"top-right\",\r\n \"bottom-left\",\r\n \"bottom-right\",\r\n ]}\r\n anchorSize={8}\r\n borderDash={[4, 4]}\r\n keepRatio={true}\r\n centeredScaling={true}\r\n />\r\n </Layer>\r\n </Stage>\r\n );\r\n },\r\n);\r\n\r\nexport default KonvaCircle;\r\n","\"use client\";\r\n\r\nimport React, {\r\n useRef,\r\n useState,\r\n useEffect,\r\n forwardRef,\r\n useImperativeHandle,\r\n} from \"react\";\r\nimport { Stage, Layer, Arrow, Transformer } from \"react-konva\";\r\nimport { getDashPattern } from \"@/utils/getStrokePattern\";\r\nimport { KONVA_THRESHOLDS } from \"@/utils/konvaThreshold\";\r\n\r\nconst KonvaDoubleArrow = forwardRef(\r\n (\r\n {\r\n width,\r\n height,\r\n active,\r\n color,\r\n setColor,\r\n brushSize,\r\n setBrushSize,\r\n strokeStyle,\r\n setStrokeStyle,\r\n onAdd,\r\n onMove,\r\n arrows,\r\n setArrows,\r\n onFlatten,\r\n onElementSelect,\r\n onElementDeselect,\r\n checkTrashZoneCollision,\r\n updateTrashZoneState,\r\n },\r\n ref,\r\n ) => {\r\n const [newArrow, setNewArrow] = useState(null);\r\n const [selectedId, setSelectedId] = useState(null);\r\n const stageRef = useRef(null);\r\n const trRef = useRef(null);\r\n\r\n // Responsive sizing check for touch interactions\r\n const isMobile = typeof window !== \"undefined\" && window.innerWidth < 1024;\r\n\r\n useImperativeHandle(ref, () => ({\r\n flatten: () => {\r\n onFlatten(arrows);\r\n setArrows([]);\r\n setSelectedId(null);\r\n },\r\n }));\r\n\r\n // Clears selections instantly when the tool is deactivated or switched\r\n useEffect(() => {\r\n if (!active) {\r\n setSelectedId(null);\r\n if (onElementDeselect) {\r\n onElementDeselect();\r\n }\r\n }\r\n }, [active, onElementDeselect]);\r\n\r\n useEffect(() => {\r\n if (stageRef.current) {\r\n const stage = stageRef.current;\r\n stage.width(width);\r\n stage.height(height);\r\n stage.batchDraw();\r\n }\r\n }, [width, height]);\r\n\r\n useEffect(() => {\r\n if (trRef.current && stageRef.current) {\r\n if (selectedId) {\r\n const node = stageRef.current.findOne(`#${selectedId}`);\r\n if (node) {\r\n trRef.current.nodes([node]);\r\n } else {\r\n trRef.current.nodes([]);\r\n }\r\n } else {\r\n trRef.current.nodes([]);\r\n }\r\n trRef.current.getLayer().batchDraw();\r\n }\r\n }, [selectedId, arrows]);\r\n\r\n useEffect(() => {\r\n if (trRef.current && selectedId && stageRef.current) {\r\n const node = stageRef.current.findOne(`#${selectedId}`);\r\n if (node) {\r\n trRef.current.nodes([node]);\r\n trRef.current.getLayer().batchDraw();\r\n }\r\n } else if (trRef.current) {\r\n trRef.current.nodes([]);\r\n trRef.current.getLayer().batchDraw();\r\n }\r\n }, [selectedId, arrows]);\r\n\r\n useEffect(() => {\r\n if (selectedId) {\r\n setArrows((arrs) =>\r\n arrs.map((a) =>\r\n a.id === selectedId\r\n ? {\r\n ...a,\r\n stroke: color,\r\n strokeWidth: brushSize,\r\n strokeStyle: strokeStyle,\r\n dash: getDashPattern(strokeStyle, brushSize),\r\n }\r\n : a,\r\n ),\r\n );\r\n }\r\n }, [color, selectedId, brushSize, strokeStyle, setArrows]);\r\n\r\n const handleStageClick = (e) => {\r\n if (!active) return;\r\n if (e.evt && e.evt.cancelable) {\r\n e.evt.preventDefault();\r\n }\r\n\r\n const clickedOnEmpty = e.target === e.target.getStage();\r\n if (!clickedOnEmpty) return;\r\n\r\n if (selectedId) {\r\n setSelectedId(null);\r\n if (onElementDeselect) {\r\n onElementDeselect();\r\n }\r\n }\r\n\r\n const pos = e.target.getStage().getPointerPosition();\r\n if (!pos) return;\r\n\r\n const id = `double-arrow-${Date.now()}`;\r\n setNewArrow({\r\n id,\r\n points: [pos.x, pos.y, pos.x, pos.y],\r\n stroke: color,\r\n strokeWidth: brushSize,\r\n draggable: true,\r\n strokeStyle: strokeStyle,\r\n dash: getDashPattern(strokeStyle, brushSize),\r\n });\r\n setSelectedId(id);\r\n };\r\n\r\n const handleMouseMove = (e) => {\r\n if (!active || !newArrow) return;\r\n if (e.evt && e.evt.cancelable) {\r\n e.evt.preventDefault();\r\n }\r\n\r\n const pos = e.target.getStage().getPointerPosition();\r\n if (!pos) return;\r\n\r\n setNewArrow({\r\n ...newArrow,\r\n points: [newArrow.points[0], newArrow.points[1], pos.x, pos.y],\r\n });\r\n };\r\n\r\n const handleMouseUp = (e) => {\r\n if (!active || !newArrow) return;\r\n if (e.evt && e.evt.cancelable) {\r\n e.evt.preventDefault();\r\n }\r\n\r\n const [x1, y1, x2, y2] = newArrow.points;\r\n const arrowLength = Math.sqrt(\r\n Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2),\r\n );\r\n\r\n if (arrowLength >= KONVA_THRESHOLDS.MIN_DOUBLE_ARROW_LENGTH) {\r\n setArrows((arrs) => [...arrs, newArrow]);\r\n if (onAdd) {\r\n onAdd(newArrow);\r\n }\r\n } else {\r\n // Discarded drawing gesture: Remove selection nodes to prevent ghost outlines\r\n setSelectedId(null);\r\n if (onElementDeselect) {\r\n onElementDeselect();\r\n }\r\n }\r\n setNewArrow(null);\r\n };\r\n\r\n const handleTouchEnd = (e) => {\r\n if (newArrow) {\r\n handleMouseUp(e);\r\n }\r\n };\r\n\r\n const constrainToBounds = (points, canvasWidth, canvasHeight) => {\r\n const [x1, y1, x2, y2] = points;\r\n const constrainedX1 = Math.max(0, Math.min(canvasWidth, x1));\r\n const constrainedY1 = Math.max(0, Math.min(canvasHeight, y1));\r\n const constrainedX2 = Math.max(0, Math.min(canvasWidth, x2));\r\n const constrainedY2 = Math.max(0, Math.min(canvasHeight, y2));\r\n return [constrainedX1, constrainedY1, constrainedX2, constrainedY2];\r\n };\r\n\r\n const handleArrowClick = (id) => {\r\n const clickedArrow = arrows.find((a) => a.id === id);\r\n\r\n setSelectedId(id);\r\n setColor(clickedArrow?.stroke || \"#000000\");\r\n if (clickedArrow?.strokeStyle) {\r\n setStrokeStyle(clickedArrow.strokeStyle);\r\n }\r\n setBrushSize(clickedArrow?.strokeWidth || 3);\r\n\r\n if (onElementSelect) {\r\n onElementSelect(id, \"double-arrow\");\r\n }\r\n };\r\n\r\n const handleTransformEnd = (e, id) => {\r\n const node = e.target;\r\n const previousArrow = arrows.find((a) => a.id === id);\r\n\r\n const scaleX = node.scaleX();\r\n const scaleY = node.scaleY();\r\n const rotation = node.rotation();\r\n const oldPoints = node.points();\r\n\r\n const centerX = (oldPoints[0] + oldPoints[2]) / 2;\r\n const centerY = (oldPoints[1] + oldPoints[3]) / 2;\r\n\r\n const originalLength = Math.sqrt(\r\n Math.pow(oldPoints[2] - oldPoints[0], 2) +\r\n Math.pow(oldPoints[3] - oldPoints[1], 2),\r\n );\r\n const originalAngle = Math.atan2(\r\n oldPoints[3] - oldPoints[1],\r\n oldPoints[2] - oldPoints[0],\r\n );\r\n\r\n const newLength = originalLength * Math.max(scaleX, scaleY);\r\n const newAngle = originalAngle + (rotation * Math.PI) / 180;\r\n\r\n const halfLength = newLength / 2;\r\n let newPoints = [\r\n centerX - halfLength * Math.cos(newAngle),\r\n centerY - halfLength * Math.sin(newAngle),\r\n centerX + halfLength * Math.cos(newAngle),\r\n centerY + halfLength * Math.sin(newAngle),\r\n ];\r\n\r\n const constrainedPoints = constrainToBounds(newPoints, width, height);\r\n\r\n node.scaleX(1);\r\n node.scaleY(1);\r\n node.rotation(0);\r\n node.x(0);\r\n node.y(0);\r\n\r\n const newArrow = {\r\n ...previousArrow,\r\n points: constrainedPoints,\r\n stroke: color,\r\n strokeWidth: brushSize,\r\n strokeStyle: strokeStyle,\r\n dash: getDashPattern(strokeStyle, brushSize),\r\n };\r\n\r\n setArrows((arrs) => arrs.map((a) => (a.id === id ? newArrow : a)));\r\n\r\n if (onMove && previousArrow) {\r\n const hasChanged = !previousArrow.points.every(\r\n (point, index) => point === constrainedPoints[index],\r\n );\r\n if (hasChanged) {\r\n onMove(id, newArrow, previousArrow);\r\n }\r\n }\r\n };\r\n\r\n const handleDragMove = (e, id) => {\r\n const stage = e.target.getStage();\r\n const node = e.target;\r\n const { x, y } = node.position();\r\n\r\n const oldPoints = node.points();\r\n const centerX = (oldPoints[0] + oldPoints[2]) / 2;\r\n const centerY = (oldPoints[1] + oldPoints[3]) / 2;\r\n\r\n const stageContainer = stage.container();\r\n const stageRect = stageContainer.getBoundingClientRect();\r\n\r\n const screenX = stageRect.left + centerX + x;\r\n const screenY = stageRect.top + centerY + y;\r\n\r\n if (checkTrashZoneCollision && updateTrashZoneState) {\r\n const isOverTrash = checkTrashZoneCollision(screenX, screenY);\r\n updateTrashZoneState(isOverTrash);\r\n }\r\n };\r\n\r\n const handleDragEnd = (e, id) => {\r\n const node = e.target;\r\n const stage = e.target.getStage();\r\n const x = node.x();\r\n const y = node.y();\r\n\r\n const previousArrow = arrows.find((a) => a.id === id);\r\n\r\n if (updateTrashZoneState) {\r\n updateTrashZoneState(false);\r\n }\r\n\r\n const stageContainer = stage.container();\r\n const stageRect = stageContainer.getBoundingClientRect();\r\n\r\n const oldPoints = node.points();\r\n const centerX = (oldPoints[0] + oldPoints[2]) / 2;\r\n const centerY = (oldPoints[1] + oldPoints[3]) / 2;\r\n\r\n const screenX = stageRect.left + centerX + x;\r\n const screenY = stageRect.top + centerY + y;\r\n\r\n if (\r\n checkTrashZoneCollision &&\r\n checkTrashZoneCollision(screenX, screenY)\r\n ) {\r\n setArrows((arrs) => arrs.filter((a) => a.id !== id));\r\n setSelectedId(null);\r\n if (onElementDeselect) onElementDeselect();\r\n return;\r\n }\r\n\r\n const dx = x;\r\n const dy = y;\r\n\r\n let newPoints = [\r\n oldPoints[0] + dx,\r\n oldPoints[1] + dy,\r\n oldPoints[2] + dx,\r\n oldPoints[3] + dy,\r\n ];\r\n\r\n newPoints = constrainToBounds(newPoints, width, height);\r\n\r\n node.x(0);\r\n node.y(0);\r\n\r\n const newArrow = {\r\n ...previousArrow,\r\n points: newPoints,\r\n stroke: color,\r\n strokeWidth: brushSize,\r\n strokeStyle: strokeStyle,\r\n dash: getDashPattern(strokeStyle, brushSize),\r\n };\r\n\r\n setArrows((arrs) => arrs.map((a) => (a.id === id ? newArrow : a)));\r\n\r\n if (onMove && previousArrow) {\r\n const hasChanged = !previousArrow.points.every(\r\n (point, index) => point === newPoints[index],\r\n );\r\n if (hasChanged) {\r\n onMove(id, newArrow, previousArrow);\r\n }\r\n }\r\n };\r\n\r\n return (\r\n <Stage\r\n width={width}\r\n height={height}\r\n ref={stageRef}\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n zIndex: 30,\r\n pointerEvents: active ? \"auto\" : \"none\",\r\n }}\r\n onMouseDown={handleStageClick}\r\n onMouseMove={handleMouseMove}\r\n onMouseUp={handleMouseUp}\r\n onTouchStart={handleStageClick}\r\n onTouchMove={handleMouseMove}\r\n onTouchEnd={handleTouchEnd}\r\n onClick={(e) => {\r\n const clickedOnEmpty = e.target === e.target.getStage();\r\n if (clickedOnEmpty && selectedId) {\r\n setSelectedId(null);\r\n if (onElementDeselect) {\r\n onElementDeselect();\r\n }\r\n }\r\n }}\r\n onTap={(e) => {\r\n const clickedOnEmpty = e.target === e.target.getStage();\r\n if (clickedOnEmpty && selectedId) {\r\n setSelectedId(null);\r\n if (onElementDeselect) {\r\n onElementDeselect();\r\n }\r\n }\r\n }}\r\n >\r\n <Layer>\r\n {arrows.map((arrow) => (\r\n <Arrow\r\n key={arrow.id}\r\n id={arrow.id}\r\n points={arrow.points}\r\n stroke={arrow.stroke}\r\n strokeWidth={arrow.strokeWidth}\r\n hitStrokeWidth={Math.max(90, arrow.strokeWidth * 4)}\r\n perfectDrawEnabled={false}\r\n dash={arrow.dash}\r\n pointerLength={15}\r\n pointerWidth={15}\r\n fill={arrow.stroke}\r\n draggable={arrow.draggable}\r\n onClick={(e) => {\r\n e.cancelBubble = true;\r\n handleArrowClick(arrow.id);\r\n }}\r\n onTap={(e) => {\r\n e.cancelBubble = true;\r\n handleArrowClick(arrow.id);\r\n }}\r\n onDragMove={(e) => handleDragMove(e, arrow.id)}\r\n onDragEnd={(e) => handleDragEnd(e, arrow.id)}\r\n onTransformEnd={(e) => handleTransformEnd(e, arrow.id)}\r\n pointerAtBeginning={true}\r\n pointerAtEnding={true}\r\n />\r\n ))}\r\n {newArrow && (\r\n <Arrow\r\n points={newArrow.points}\r\n stroke={newArrow.stroke}\r\n strokeWidth={newArrow.strokeWidth}\r\n hitStrokeWidth={Math.max(90, newArrow.strokeWidth * 4)}\r\n perfectDrawEnabled={false}\r\n pointerLength={15}\r\n pointerWidth={15}\r\n fill={newArrow.stroke}\r\n dash={newArrow.dash}\r\n pointerAtBeginning={true}\r\n pointerAtEnding={true}\r\n />\r\n )}\r\n <Transformer\r\n ref={trRef}\r\n rotateEnabled={true}\r\n enabledAnchors={[\r\n \"top-left\",\r\n \"top-right\",\r\n \"bottom-left\",\r\n \"bottom-right\",\r\n ]}\r\n anchorSize={8}\r\n borderDash={[4, 4]}\r\n />\r\n </Layer>\r\n </Stage>\r\n );\r\n },\r\n);\r\n\r\nexport default KonvaDoubleArrow;\r\n","export { default as ImageEditorModal } from \"./ImageEditorModal\";\nexport {\n resolveImageSource,\n getImageSourceKey,\n} from \"./utils/resolveImageSource\";\nexport { buildImageEditResult } from \"./utils/buildImageEditResult\";\n","\"use client\";\r\n\r\nimport React, {\r\n useState,\r\n useRef,\r\n useEffect,\r\n useCallback,\r\n Suspense,\r\n lazy,\r\n} from \"react\";\r\nimport { GrClear } from \"react-icons/gr\";\r\nimport { TbArrowCurveRight } from \"react-icons/tb\";\r\nimport {\r\n Pencil,\r\n Palette,\r\n Minus,\r\n Plus,\r\n Eraser,\r\n Square,\r\n Circle,\r\n Undo2,\r\n Redo2,\r\n Type,\r\n ArrowRight,\r\n ArrowRightLeft,\r\n MinusIcon,\r\n Grip,\r\n DotIcon,\r\n Crop,\r\n PenTool,\r\n Download,\r\n Filter,\r\n Trash2,\r\n} from \"lucide-react\";\r\n\r\n// ── local ui shims (no Radix/shadcn needed) ──\r\nimport { Button } from \"./ui/Button\";\r\nimport { Label } from \"./ui/Label\";\r\nimport { Select, SelectItem } from \"./ui/Select\";\r\nimport { Slider } from \"./ui/Slider\";\r\nimport { useToast } from \"./ui/toast\";\r\n\r\n// ── editor sub-components ──\r\n// React.lazy replaces next/dynamic\r\nconst TextEditor = lazy(() => import(\"./TextEditor\"));\r\nconst KonvaRectangle = lazy(() => import(\"./KonvaRectangle\"));\r\nconst ArrowKonva = lazy(() => import(\"./ArrowKonva\"));\r\nconst KonvaCircle = lazy(() => import(\"./KonvaCircle\"));\r\nconst KonvaDoubleArrow = lazy(() => import(\"./KonvaDoubleArrow\"));\r\n\r\nimport { CurveTool } from \"./CurveTool\";\r\nimport CurveArrowTool from \"./CurveArrowTool\";\r\nimport MobileView from \"./MobileView\";\r\nimport { useHistoryManager } from \"@/hooks/useHistoryManager\";\r\nimport { ActionCreators } from \"@/utils/actionCreators\";\r\nimport {\r\n resolveImageSource,\r\n getImageSourceKey,\r\n} from \"@/utils/resolveImageSource\";\r\nimport { buildImageEditResult } from \"@/utils/buildImageEditResult\";\r\n\r\nconst minBrushSize = 1;\r\nconst maxBrushSize = 20;\r\n\r\n/**\r\n * @typedef {\r\n * | { kind: \"url\", url: string, name?: string }\r\n * | { kind: \"file\", file: File, name?: string }\r\n * | { kind: \"blob\", blob: Blob, name?: string }\r\n * | { kind: \"dataUrl\", dataUrl: string, name?: string }\r\n * } EditableImageSource\r\n *\r\n * @typedef {{\r\n * blob: Blob,\r\n * file: File,\r\n * dataUrl: string,\r\n * width: number,\r\n * height: number,\r\n * }} ImageEditResult\r\n */\r\n\r\n/**\r\n * @param {object} props\r\n * @param {boolean} props.isOpen\r\n * @param {() => void} props.onClose\r\n * @param {EditableImageSource} props.image - accepts a remote url, a File, a Blob, or a dataUrl\r\n * @param {(result: ImageEditResult) => void} props.onSave - receives the edited image as a Blob/File/dataUrl bundle\r\n */\r\nexport default function ImageEditorModal({ isOpen, onClose, image, onSave }) {\r\n const { toast } = useToast();\r\n\r\n const baseCanvasRef = useRef(null);\r\n const drawingCanvasRef = useRef(null);\r\n\r\n // ── resolved image source (handles url / file / blob / dataUrl uniformly) ──\r\n const [resolvedImage, setResolvedImage] = useState({\r\n src: null,\r\n name: undefined,\r\n });\r\n\r\n useEffect(() => {\r\n if (!image) {\r\n setResolvedImage({ src: null, name: undefined });\r\n return;\r\n }\r\n const { src, name, cleanup } = resolveImageSource(image);\r\n setResolvedImage({ src, name });\r\n return cleanup;\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [getImageSourceKey(image)]);\r\n\r\n const [activeTool, setActiveTool] = useState(null);\r\n const [isDrawing, setIsDrawing] = useState(false);\r\n const [startPoint, setStartPoint] = useState(null);\r\n const [fontSize, setFontSize] = useState(22);\r\n const [textInputPosition, setTextInputPosition] = useState(null);\r\n const [text, setText] = useState(\"\");\r\n const [isTextToolActive, setIsTextToolActive] = useState(false);\r\n const [showCropConfirm, setShowCropConfirm] = useState(false);\r\n const [showCurveConfirm, setShowCurveConfirm] = useState(false);\r\n const [showCurveArrowConfirm, setShowCurveArrowConfirm] = useState(false);\r\n const [currentStroke, setCurrentStroke] = useState([]);\r\n const [fontFamily, setFontFamily] = useState(\"sans-serif\");\r\n const [cropArea, setCropArea] = useState(null);\r\n const [isCropping, setIsCropping] = useState(false);\r\n const [dragStart, setDragStart] = useState(null);\r\n const [backgroundColor, setBackgroundColor] = useState(\"transparent\");\r\n const [currentColor, setCurrentColor] = useState(\"#ff0000\");\r\n const [brushSize, setBrushSize] = useState(3);\r\n const [strokeStyle, setStrokeStyle] = useState(\"solid\");\r\n const [selectedElementId, setSelectedElementId] = useState(null);\r\n const [selectedElementType, setSelectedElementType] = useState(null);\r\n const [showTrashIcon, setShowTrashIcon] = useState(false);\r\n const [isDraggedOverTrash, setIsDraggedOverTrash] = useState(false);\r\n const [canvasDimensions, setCanvasDimensions] = useState({\r\n width: 420,\r\n height: 750,\r\n });\r\n const [imageDrawParams, setImageDrawParams] = useState(null);\r\n const [mounted, setMounted] = useState(false);\r\n const [showCancelConfirm, setShowCancelConfirm] = useState(false);\r\n const [eraserCursor, setEraserCursor] = useState(null);\r\n const [isMobile, setIsMobile] = useState(false);\r\n const [isTextDragging, setIsTextDragging] = useState(false);\r\n const [textColor, setTextColor] = useState(\"#000000\");\r\n const TEXT_BG_CYCLE = [\r\n \"#ffffff\",\r\n \"#000000\",\r\n \"rgba(0,0,0,0.5)\",\r\n \"transparent\",\r\n ];\r\n const TEXT_BG_CONTRAST = [\"#000000\", \"#ffffff\", \"#ffffff\", null];\r\n\r\n const [textBgColor, setTextBgColor] = useState(TEXT_BG_CYCLE[0]);\r\n\r\n const cycleTextBg = useCallback(() => {\r\n const idx = TEXT_BG_CYCLE.indexOf(textBgColor);\r\n const nextIdx = (idx + 1) % TEXT_BG_CYCLE.length;\r\n setTextBgColor(TEXT_BG_CYCLE[nextIdx]);\r\n\r\n const forcedColor = TEXT_BG_CONTRAST[nextIdx];\r\n if (forcedColor) setTextColor(forcedColor);\r\n }, [textBgColor]);\r\n\r\n const {\r\n historyState,\r\n canUndo,\r\n canRedo,\r\n undo,\r\n redo,\r\n actionCount,\r\n addAction,\r\n createAction,\r\n replayManager,\r\n rectangles,\r\n setRectangles,\r\n circles,\r\n setCircles,\r\n arrows,\r\n setArrows,\r\n doubleArrows,\r\n setDoubleArrows,\r\n texts,\r\n setTexts,\r\n konvaRectRef,\r\n konvaCircleRef,\r\n konvaArrowRef,\r\n konvaDoubleArrowRef,\r\n textEditorRef,\r\n } = useHistoryManager({ drawingCanvasRef, baseCanvasRef });\r\n\r\n // ── lifecycle ──────────────────────────────────────────────────────────────\r\n\r\n useEffect(() => {\r\n const check = () => setIsMobile(window.innerWidth < 1024);\r\n check();\r\n window.addEventListener(\"resize\", check);\r\n return () => window.removeEventListener(\"resize\", check);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n\r\n // Hardens background scroll locking on real WebKit & Blink mobile viewports\r\n const originalOverflow = document.body.style.overflow;\r\n const originalPosition = document.body.style.position;\r\n const originalWidth = document.body.style.width;\r\n const originalHeight = document.body.style.height;\r\n\r\n document.body.style.overflow = \"hidden\";\r\n document.body.style.position = \"fixed\";\r\n document.body.style.width = \"100%\";\r\n document.body.style.height = \"100dvh\";\r\n\r\n return () => {\r\n document.body.style.overflow = originalOverflow;\r\n document.body.style.position = originalPosition;\r\n document.body.style.width = originalWidth;\r\n document.body.style.height = originalHeight;\r\n };\r\n }, [isOpen]);\r\n\r\n useEffect(() => {\r\n setMounted(true);\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (activeTool === \"eraser\") setBrushSize(20);\r\n else setBrushSize(3);\r\n }, [activeTool]);\r\n\r\n useEffect(() => {\r\n const check = () =>\r\n setShowTrashIcon(window.innerWidth < 1024 && selectedElementId !== null);\r\n check();\r\n window.addEventListener(\"resize\", check);\r\n return () => window.removeEventListener(\"resize\", check);\r\n }, [selectedElementId]);\r\n\r\n useEffect(() => {\r\n const updateDimensions = () => {\r\n const c = drawingCanvasRef.current;\r\n if (c) setCanvasDimensions({ width: c.width, height: c.height });\r\n };\r\n updateDimensions();\r\n const c = drawingCanvasRef.current;\r\n if (c) {\r\n const ro = new ResizeObserver(updateDimensions);\r\n ro.observe(c);\r\n return () => ro.disconnect();\r\n }\r\n }, []);\r\n\r\n // ── keyboard shortcuts ─────────────────────────────────────────────────────\r\n\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n const handleKeyDown = (e) => {\r\n // target the modal wrapper by its data attribute instead of role=\"dialog\"\r\n const modal = document.getElementById(\"image-editor-modal\");\r\n if (!modal?.contains(document.activeElement)) return;\r\n if (e.ctrlKey && !e.shiftKey && !e.altKey) {\r\n if (e.key === \"z\") {\r\n e.preventDefault();\r\n undo();\r\n }\r\n if (e.key === \"y\") {\r\n e.preventDefault();\r\n redo();\r\n }\r\n }\r\n };\r\n window.addEventListener(\"keydown\", handleKeyDown);\r\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\r\n }, [isOpen, undo, redo]);\r\n\r\n // ── canvas drawing ─────────────────────────────────────────────────────────\r\n\r\n const drawImageOnCanvas = useCallback(() => {\r\n const baseCanvas = baseCanvasRef.current;\r\n const drawingCanvas = drawingCanvasRef.current;\r\n const baseCtx = baseCanvas?.getContext(\"2d\");\r\n const drawingCtx = drawingCanvas?.getContext(\"2d\");\r\n if (!baseCanvas || !baseCtx || !drawingCanvas || !drawingCtx) return;\r\n\r\n if (!resolvedImage.src) return;\r\n\r\n const img = new Image();\r\n // Cache-busting only makes sense for real network URLs; object URLs\r\n // (file/blob) and dataUrls are already unique per-value.\r\n const isRemoteUrl = image?.kind === \"url\";\r\n if (isRemoteUrl) img.crossOrigin = \"anonymous\";\r\n img.src = isRemoteUrl\r\n ? resolvedImage.src +\r\n (resolvedImage.src.includes(\"?\") ? \"&\" : \"?\") +\r\n \"cb=\" +\r\n Date.now()\r\n : resolvedImage.src;\r\n img.onload = () => {\r\n const container = baseCanvas.parentElement;\r\n if (!container) return;\r\n const isMobile = window.innerWidth < 1024;\r\n let canvasWidth, canvasHeight;\r\n if (isMobile) {\r\n const r = container.getBoundingClientRect();\r\n canvasWidth = r.width;\r\n canvasHeight = r.height;\r\n } else {\r\n canvasWidth = 420;\r\n canvasHeight = 750;\r\n }\r\n baseCanvas.width = canvasWidth;\r\n baseCanvas.height = canvasHeight;\r\n drawingCanvas.width = canvasWidth;\r\n drawingCanvas.height = canvasHeight;\r\n setCanvasDimensions({ width: canvasWidth, height: canvasHeight });\r\n baseCtx.clearRect(0, 0, canvasWidth, canvasHeight);\r\n drawingCtx.clearRect(0, 0, canvasWidth, canvasHeight);\r\n\r\n const imgAR = img.naturalWidth / img.naturalHeight;\r\n const canvasAR = canvasWidth / canvasHeight;\r\n let drawWidth, drawHeight, offsetX, offsetY;\r\n if (imgAR > canvasAR) {\r\n drawWidth = canvasWidth;\r\n drawHeight = canvasWidth / imgAR;\r\n offsetX = 0;\r\n offsetY = (canvasHeight - drawHeight) / 2;\r\n } else {\r\n drawWidth = canvasHeight * imgAR;\r\n drawHeight = canvasHeight;\r\n offsetX = (canvasWidth - drawWidth) / 2;\r\n offsetY = 0;\r\n }\r\n baseCtx.drawImage(img, offsetX, offsetY, drawWidth, drawHeight);\r\n drawingCtx.globalCompositeOperation = \"source-over\";\r\n setImageDrawParams({\r\n offsetX,\r\n offsetY,\r\n drawWidth,\r\n drawHeight,\r\n naturalWidth: img.naturalWidth,\r\n naturalHeight: img.naturalHeight,\r\n });\r\n };\r\n img.onerror = () => console.error(\"Failed to load image for editing.\");\r\n }, [resolvedImage.src, image?.kind]);\r\n\r\n useEffect(() => {\r\n if (!isOpen || !resolvedImage.src) return;\r\n const t = setTimeout(() => {\r\n if (baseCanvasRef.current && drawingCanvasRef.current)\r\n drawImageOnCanvas();\r\n }, 0);\r\n return () => clearTimeout(t);\r\n }, [isOpen, resolvedImage.src, drawImageOnCanvas]);\r\n\r\n useEffect(() => {\r\n if (!isOpen) return;\r\n const handleResize = () => {\r\n if (baseCanvasRef.current && drawingCanvasRef.current)\r\n drawImageOnCanvas();\r\n };\r\n window.addEventListener(\"resize\", handleResize);\r\n return () => window.removeEventListener(\"resize\", handleResize);\r\n }, [isOpen, drawImageOnCanvas]);\r\n\r\n // ── konva callbacks ────────────────────────────────────────────────────────\r\n\r\n const handleKonvaRectAdd = useCallback(\r\n (rectangle) => {\r\n addAction(\r\n createAction(\"konva\", \"ADD_RECTANGLE\", {\r\n elementType: \"rectangle\",\r\n elementId: rectangle.id,\r\n data: { ...rectangle, _createdAt: Date.now() },\r\n }),\r\n );\r\n },\r\n [createAction, addAction],\r\n );\r\n\r\n const handleKonvaRectMove = useCallback(\r\n (id, newData, previousData) => {\r\n addAction(\r\n createAction(\"konva\", \"MOVE_ELEMENT\", {\r\n elementType: \"rectangle\",\r\n elementId: id,\r\n data: newData,\r\n previousData,\r\n }),\r\n );\r\n },\r\n [createAction, addAction],\r\n );\r\n\r\n const handleKonvaCircleAdd = useCallback(\r\n (circle) => {\r\n addAction(\r\n createAction(\"konva\", \"ADD_CIRCLE\", {\r\n elementType: \"circle\",\r\n elementId: circle.id,\r\n data: { ...circle, _createdAt: Date.now() },\r\n }),\r\n );\r\n },\r\n [createAction, addAction],\r\n );\r\n\r\n const handleKonvaCircleMove = useCallback(\r\n (id, newData, previousData) => {\r\n addAction(\r\n createAction(\"konva\", \"MOVE_ELEMENT\", {\r\n elementType: \"circle\",\r\n elementId: id,\r\n data: newData,\r\n previousData,\r\n }),\r\n );\r\n },\r\n [createAction, addAction],\r\n );\r\n\r\n const handleKonvaArrowAdd = useCallback(\r\n (arrow) => {\r\n addAction(\r\n createAction(\"konva\", \"ADD_ARROW\", {\r\n elementType: \"arrow\",\r\n elementId: arrow.id,\r\n data: { ...arrow, _createdAt: Date.now() },\r\n }),\r\n );\r\n },\r\n [createAction, addAction],\r\n );\r\n\r\n const handleKonvaArrowMove = useCallback(\r\n (id, newData, previousData) => {\r\n addAction(\r\n createAction(\"konva\", \"MOVE_ELEMENT\", {\r\n elementType: \"arrow\",\r\n elementId: id,\r\n data: newData,\r\n previousData,\r\n }),\r\n );\r\n },\r\n [createAction, addAction],\r\n );\r\n\r\n const handleKonvaDoubleArrowAdd = useCallback(\r\n (doubleArrow) => {\r\n addAction(\r\n createAction(\"konva\", \"ADD_DOUBLE_ARROW\", {\r\n elementType: \"double-arrow\",\r\n elementId: doubleArrow.id,\r\n data: { ...doubleArrow, _createdAt: Date.now() },\r\n }),\r\n );\r\n },\r\n [createAction, addAction],\r\n );\r\n\r\n const handleKonvaDoubleArrowMove = useCallback(\r\n (id, newData, previousData) => {\r\n addAction(\r\n createAction(\"konva\", \"MOVE_ELEMENT\", {\r\n elementType: \"double-arrow\",\r\n elementId: id,\r\n data: newData,\r\n previousData,\r\n }),\r\n );\r\n },\r\n [createAction, addAction],\r\n );\r\n\r\n const handleKonvaTextAdd = useCallback(\r\n (textShape) => {\r\n addAction(\r\n createAction(\"konva\", \"ADD_TEXT\", {\r\n elementType: \"text\",\r\n elementId: textShape.id,\r\n data: { ...textShape, _createdAt: Date.now() },\r\n }),\r\n );\r\n },\r\n [createAction, addAction],\r\n );\r\n\r\n const handleKonvaTextMove = useCallback(\r\n (id, newData, previousData) => {\r\n addAction(\r\n createAction(\"konva\", \"MOVE_ELEMENT\", {\r\n elementType: \"text\",\r\n elementId: id,\r\n data: newData,\r\n previousData,\r\n }),\r\n );\r\n },\r\n [createAction, addAction],\r\n );\r\n\r\n // ── flatten callbacks ──────────────────────────────────────────────────────\r\n\r\n const handleKonvaRectFlatten = useCallback(\r\n (rects) => {\r\n const ctx = drawingCanvasRef.current?.getContext(\"2d\");\r\n if (!ctx) return;\r\n rects.forEach((r) => {\r\n ctx.save();\r\n ctx.strokeStyle = r.stroke;\r\n ctx.lineWidth = r.strokeWidth;\r\n if (r.dash?.length > 0) ctx.setLineDash(r.dash);\r\n if (r.fill) {\r\n ctx.fillStyle = r.fill;\r\n ctx.fillRect(r.x, r.y, r.width, r.height);\r\n }\r\n ctx.strokeRect(r.x, r.y, r.width, r.height);\r\n ctx.restore();\r\n });\r\n setRectangles([]);\r\n },\r\n [setRectangles],\r\n );\r\n\r\n const handleKonvaCircleFlatten = useCallback(\r\n (circleShapes) => {\r\n const ctx = drawingCanvasRef.current?.getContext(\"2d\");\r\n if (!ctx) return;\r\n circleShapes.forEach((c) => {\r\n ctx.save();\r\n ctx.strokeStyle = c.stroke;\r\n ctx.lineWidth = c.strokeWidth ?? 1;\r\n if (c.dash?.length > 0) ctx.setLineDash(c.dash);\r\n else ctx.setLineDash([]);\r\n ctx.beginPath();\r\n ctx.arc(c.x, c.y, c.radius, 0, 2 * Math.PI);\r\n if (c.fill && c.fill !== \"transparent\") {\r\n ctx.fillStyle = c.fill;\r\n ctx.fill();\r\n }\r\n ctx.stroke();\r\n ctx.restore();\r\n });\r\n setCircles([]);\r\n },\r\n [setCircles],\r\n );\r\n\r\n const handleKonvaArrowFlatten = useCallback(\r\n (arrowShapes) => {\r\n if (!drawingCanvasRef.current || !imageDrawParams) return;\r\n const ctx = drawingCanvasRef.current.getContext(\"2d\");\r\n if (!ctx) return;\r\n const {\r\n offsetX,\r\n offsetY,\r\n drawWidth,\r\n drawHeight,\r\n naturalWidth,\r\n naturalHeight,\r\n } = imageDrawParams;\r\n const scaleX = drawWidth / naturalWidth;\r\n const scaleY = drawHeight / naturalHeight;\r\n arrowShapes.forEach((a) => {\r\n const [x1, y1, x2, y2] = a.points;\r\n const drawX1 = offsetX + ((x1 - offsetX) / scaleX) * scaleX;\r\n const drawY1 = offsetY + ((y1 - offsetY) / scaleY) * scaleY;\r\n const drawX2 = offsetX + ((x2 - offsetX) / scaleX) * scaleX;\r\n const drawY2 = offsetY + ((y2 - offsetY) / scaleY) * scaleY;\r\n ctx.save();\r\n ctx.strokeStyle = a.stroke;\r\n ctx.lineWidth = a.strokeWidth ?? 1;\r\n switch (strokeStyle) {\r\n case \"dashed\":\r\n ctx.setLineDash([brushSize * 3, brushSize * 2]);\r\n break;\r\n case \"dotted\":\r\n ctx.setLineDash([brushSize, brushSize]);\r\n break;\r\n default:\r\n ctx.setLineDash([]);\r\n }\r\n ctx.beginPath();\r\n ctx.moveTo(drawX1, drawY1);\r\n ctx.lineTo(drawX2, drawY2);\r\n ctx.stroke();\r\n const headlen = 15;\r\n const angle = Math.atan2(drawY2 - drawY1, drawX2 - drawX1);\r\n ctx.setLineDash([]);\r\n ctx.beginPath();\r\n ctx.moveTo(drawX2, drawY2);\r\n ctx.lineTo(\r\n drawX2 - headlen * Math.cos(angle - Math.PI / 7),\r\n drawY2 - headlen * Math.sin(angle - Math.PI / 7),\r\n );\r\n ctx.lineTo(\r\n drawX2 - headlen * Math.cos(angle + Math.PI / 7),\r\n drawY2 - headlen * Math.sin(angle + Math.PI / 7),\r\n );\r\n ctx.lineTo(drawX2, drawY2);\r\n ctx.stroke();\r\n ctx.fillStyle = a.stroke;\r\n ctx.fill();\r\n ctx.restore();\r\n });\r\n setArrows([]);\r\n },\r\n [imageDrawParams, setArrows, strokeStyle, brushSize],\r\n );\r\n\r\n const handleKonvaDoubleArrowFlatten = useCallback(\r\n (arrowShapes) => {\r\n if (!drawingCanvasRef.current || !imageDrawParams) return;\r\n const ctx = drawingCanvasRef.current.getContext(\"2d\");\r\n if (!ctx) return;\r\n const {\r\n offsetX,\r\n offsetY,\r\n drawWidth,\r\n drawHeight,\r\n naturalWidth,\r\n naturalHeight,\r\n } = imageDrawParams;\r\n const scaleX = drawWidth / naturalWidth;\r\n const scaleY = drawHeight / naturalHeight;\r\n arrowShapes.forEach((a) => {\r\n const [x1, y1, x2, y2] = a.points;\r\n const drawX1 = offsetX + ((x1 - offsetX) / scaleX) * scaleX;\r\n const drawY1 = offsetY + ((y1 - offsetY) / scaleY) * scaleY;\r\n const drawX2 = offsetX + ((x2 - offsetX) / scaleX) * scaleX;\r\n const drawY2 = offsetY + ((y2 - offsetY) / scaleY) * scaleY;\r\n ctx.save();\r\n ctx.strokeStyle = a.stroke;\r\n ctx.lineWidth = a.strokeWidth ?? 1;\r\n switch (strokeStyle) {\r\n case \"dashed\":\r\n ctx.setLineDash([brushSize * 3, brushSize * 2]);\r\n break;\r\n case \"dotted\":\r\n ctx.setLineDash([brushSize, brushSize]);\r\n break;\r\n default:\r\n ctx.setLineDash([]);\r\n }\r\n ctx.beginPath();\r\n ctx.moveTo(drawX1, drawY1);\r\n ctx.lineTo(drawX2, drawY2);\r\n ctx.stroke();\r\n const headlen = 15;\r\n const angle = Math.atan2(drawY2 - drawY1, drawX2 - drawX1);\r\n ctx.setLineDash([]);\r\n // first head\r\n ctx.beginPath();\r\n ctx.moveTo(drawX1, drawY1);\r\n ctx.lineTo(\r\n drawX1 + headlen * Math.cos(angle - Math.PI / 6),\r\n drawY1 + headlen * Math.sin(angle - Math.PI / 6),\r\n );\r\n ctx.lineTo(\r\n drawX1 + headlen * Math.cos(angle + Math.PI / 6),\r\n drawY1 + headlen * Math.sin(angle + Math.PI / 6),\r\n );\r\n ctx.closePath();\r\n ctx.fill();\r\n ctx.stroke();\r\n // second head\r\n ctx.beginPath();\r\n ctx.moveTo(drawX2, drawY2);\r\n ctx.lineTo(\r\n drawX2 + headlen * Math.cos(angle - Math.PI + Math.PI / 6),\r\n drawY2 + headlen * Math.sin(angle - Math.PI + Math.PI / 6),\r\n );\r\n ctx.lineTo(\r\n drawX2 + headlen * Math.cos(angle - Math.PI - Math.PI / 6),\r\n drawY2 + headlen * Math.sin(angle - Math.PI - Math.PI / 6),\r\n );\r\n ctx.closePath();\r\n ctx.fill();\r\n ctx.stroke();\r\n ctx.restore();\r\n });\r\n setDoubleArrows([]);\r\n },\r\n [imageDrawParams, setDoubleArrows, strokeStyle, brushSize],\r\n );\r\n\r\n const handleTextFlatten = useCallback(\r\n (textShapes) => {\r\n const ctx = drawingCanvasRef.current?.getContext(\"2d\");\r\n if (!ctx) return;\r\n textShapes.forEach((t) => {\r\n ctx.save();\r\n const scaleX = t.scaleX || 1;\r\n const scaleY = t.scaleY || 1;\r\n const scaledFontSize = t.fontSize * scaleY;\r\n const padding = 6 * Math.min(scaleX, scaleY);\r\n const span = document.createElement(\"span\");\r\n span.innerText = t.text;\r\n span.style.cssText = `font-size:${scaledFontSize}px;font-family:${t.fontFamily};position:absolute;visibility:hidden`;\r\n document.body.appendChild(span);\r\n const width = (span.offsetWidth + padding * 2) * scaleX;\r\n const height = (span.offsetHeight + padding * 2) * scaleY;\r\n document.body.removeChild(span);\r\n if (t.backgroundColor && t.backgroundColor !== \"transparent\") {\r\n ctx.fillStyle = t.backgroundColor;\r\n const radius = 10 * Math.min(scaleX, scaleY);\r\n const { x, y } = t;\r\n ctx.beginPath();\r\n ctx.moveTo(x + radius, y);\r\n ctx.lineTo(x + width - radius, y);\r\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius);\r\n ctx.lineTo(x + width, y + height - radius);\r\n ctx.quadraticCurveTo(\r\n x + width,\r\n y + height,\r\n x + width - radius,\r\n y + height,\r\n );\r\n ctx.lineTo(x + radius, y + height);\r\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius);\r\n ctx.lineTo(x, y + radius);\r\n ctx.quadraticCurveTo(x, y, x + radius, y);\r\n ctx.closePath();\r\n ctx.fill();\r\n }\r\n ctx.font = `${scaledFontSize}px ${t.fontFamily}`;\r\n ctx.fillStyle = t.fill;\r\n ctx.fillText(t.text, t.x + padding, t.y + padding + scaledFontSize);\r\n ctx.restore();\r\n });\r\n setTexts([]);\r\n },\r\n [setTexts],\r\n );\r\n\r\n // ── misc helpers ───────────────────────────────────────────────────────────\r\n\r\n const getCurrentCanvasDimensions = useCallback(() => {\r\n const c = drawingCanvasRef.current;\r\n return c\r\n ? { width: c.width, height: c.height }\r\n : { width: 420, height: 750 };\r\n }, []);\r\n\r\n const checkTrashZoneCollision = useCallback((screenX, screenY) => {\r\n const zone = document.getElementById(\"trash-zone\");\r\n if (!zone) return false;\r\n const r = zone.getBoundingClientRect();\r\n const tol = 80;\r\n return (\r\n screenX >= r.left - tol &&\r\n screenX <= r.right + tol &&\r\n screenY >= r.top - tol &&\r\n screenY <= r.bottom + tol\r\n );\r\n }, []);\r\n\r\n const updateTrashZoneState = useCallback(\r\n (isOver) => setIsDraggedOverTrash(isOver),\r\n [],\r\n );\r\n\r\n const hasDrawingCanvasContent = useCallback(() => {\r\n const c = drawingCanvasRef.current;\r\n const ctx = c?.getContext(\"2d\");\r\n if (!c || !ctx) return false;\r\n return ctx\r\n .getImageData(0, 0, c.width, c.height)\r\n .data.some((p, i) => i % 4 === 3 && p !== 0);\r\n }, []);\r\n\r\n const hasUnsavedChanges =\r\n hasDrawingCanvasContent() ||\r\n rectangles.length > 0 ||\r\n texts.length > 0 ||\r\n arrows.length > 0 ||\r\n circles.length > 0 ||\r\n doubleArrows.length > 0 ||\r\n textInputPosition !== null ||\r\n cropArea !== null;\r\n\r\n // ── crop ──────────────────────────────────────────────────────────────────\r\n\r\n const drawCropOverlay = useCallback(() => {\r\n const canvas = drawingCanvasRef.current;\r\n const ctx = canvas?.getContext(\"2d\");\r\n if (!canvas || !ctx || !cropArea) return;\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n ctx.globalCompositeOperation = \"source-over\";\r\n ctx.fillStyle = \"rgba(0,0,0,0.5)\";\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n ctx.globalCompositeOperation = \"destination-out\";\r\n ctx.fillRect(cropArea.x, cropArea.y, cropArea.width, cropArea.height);\r\n ctx.globalCompositeOperation = \"source-over\";\r\n ctx.strokeStyle = \"#ffffff\";\r\n ctx.lineWidth = 2;\r\n ctx.setLineDash([5, 5]);\r\n ctx.strokeRect(cropArea.x, cropArea.y, cropArea.width, cropArea.height);\r\n ctx.strokeStyle = \"rgba(0,0,0,0.8)\";\r\n ctx.lineWidth = 1;\r\n ctx.strokeRect(\r\n cropArea.x - 1,\r\n cropArea.y - 1,\r\n cropArea.width + 2,\r\n cropArea.height + 2,\r\n );\r\n ctx.setLineDash([]);\r\n const hs = 8;\r\n [\r\n [cropArea.x - hs / 2, cropArea.y - hs / 2],\r\n [cropArea.x + cropArea.width - hs / 2, cropArea.y - hs / 2],\r\n [cropArea.x - hs / 2, cropArea.y + cropArea.height - hs / 2],\r\n [\r\n cropArea.x + cropArea.width - hs / 2,\r\n cropArea.y + cropArea.height - hs / 2,\r\n ],\r\n ].forEach(([x, y]) => {\r\n ctx.fillStyle = \"#ffffff\";\r\n ctx.fillRect(x, y, hs, hs);\r\n ctx.strokeStyle = \"#000000\";\r\n ctx.lineWidth = 1;\r\n ctx.strokeRect(x, y, hs, hs);\r\n });\r\n }, [cropArea]);\r\n\r\n const applyCrop = useCallback(() => {\r\n if (!cropArea || !baseCanvasRef.current) return;\r\n const baseCanvas = baseCanvasRef.current;\r\n const drawingCanvas = drawingCanvasRef.current;\r\n const baseCtx = baseCanvas.getContext(\"2d\");\r\n const drawingCtx = drawingCanvas?.getContext(\"2d\");\r\n const imageData = baseCtx?.getImageData(\r\n 0,\r\n 0,\r\n baseCanvas.width,\r\n baseCanvas.height,\r\n );\r\n if (!baseCtx || !drawingCtx || !drawingCanvas) return;\r\n\r\n const v = {\r\n x: Math.max(0, Math.min(cropArea.x, baseCanvas.width)),\r\n y: Math.max(0, Math.min(cropArea.y, baseCanvas.height)),\r\n width: Math.min(cropArea.width, baseCanvas.width - cropArea.x),\r\n height: Math.min(cropArea.height, baseCanvas.height - cropArea.y),\r\n };\r\n if (imageData)\r\n addAction(createAction(\"base\", \"CROP_IMAGE\", { cropArea: v, imageData }));\r\n\r\n const tmpBase = document.createElement(\"canvas\");\r\n const tmpDrawing = document.createElement(\"canvas\");\r\n tmpBase.width = tmpDrawing.width = v.width;\r\n tmpBase.height = tmpDrawing.height = v.height;\r\n const tmpBaseCtx = tmpBase.getContext(\"2d\");\r\n const tmpDrawingCtx = tmpDrawing.getContext(\"2d\");\r\n if (!tmpBaseCtx || !tmpDrawingCtx) return;\r\n\r\n tmpBaseCtx.drawImage(\r\n baseCanvas,\r\n v.x,\r\n v.y,\r\n v.width,\r\n v.height,\r\n 0,\r\n 0,\r\n v.width,\r\n v.height,\r\n );\r\n\r\n const dId = drawingCtx.getImageData(\r\n 0,\r\n 0,\r\n drawingCanvas.width,\r\n drawingCanvas.height,\r\n );\r\n const hasActualDrawing = dId.data.some(\r\n (val, i) => i % 4 === 3 && val === 255,\r\n );\r\n if (!hasActualDrawing)\r\n tmpDrawingCtx.drawImage(\r\n baseCanvas,\r\n v.x,\r\n v.y,\r\n v.width,\r\n v.height,\r\n 0,\r\n 0,\r\n v.width,\r\n v.height,\r\n );\r\n\r\n baseCanvas.width = drawingCanvas.width = v.width;\r\n baseCanvas.height = drawingCanvas.height = v.height;\r\n baseCtx.clearRect(0, 0, v.width, v.height);\r\n drawingCtx.clearRect(0, 0, v.width, v.height);\r\n baseCtx.globalCompositeOperation = \"source-over\";\r\n drawingCtx.globalCompositeOperation = \"source-over\";\r\n baseCtx.drawImage(tmpBase, 0, 0);\r\n if (hasActualDrawing) drawingCtx.drawImage(tmpDrawing, 0, 0);\r\n\r\n setCanvasDimensions({ width: v.width, height: v.height });\r\n setCropArea(null);\r\n setIsCropping(false);\r\n setDragStart(null);\r\n setActiveTool(null);\r\n }, [cropArea, addAction, createAction]);\r\n\r\n useEffect(() => {\r\n if (activeTool === \"crop\") drawCropOverlay();\r\n }, [cropArea, activeTool, drawCropOverlay]);\r\n\r\n // ── filters ────────────────────────────────────────────────────────────────\r\n\r\n const applyBlackAndWhite = useCallback(() => {\r\n const baseCanvas = baseCanvasRef.current;\r\n const ctx = baseCanvas?.getContext(\"2d\");\r\n if (!baseCanvas || !ctx || !imageDrawParams) return;\r\n const prev = ctx.getImageData(0, 0, baseCanvas.width, baseCanvas.height);\r\n const { offsetX, offsetY, drawWidth, drawHeight } = imageDrawParams;\r\n const area = ctx.getImageData(offsetX, offsetY, drawWidth, drawHeight);\r\n const d = area.data;\r\n for (let i = 0; i < d.length; i += 4) {\r\n const gray = (d[i] + d[i + 1] + d[i + 2]) / 3;\r\n d[i] = d[i + 1] = d[i + 2] = gray;\r\n }\r\n ctx.putImageData(area, offsetX, offsetY);\r\n const next = ctx.getImageData(0, 0, baseCanvas.width, baseCanvas.height);\r\n addAction(ActionCreators.applyFilter(\"blackAndWhite\", prev, next));\r\n toast({\r\n title: \"Filter Applied\",\r\n description: \"Black & White filter applied successfully\",\r\n });\r\n }, [addAction, toast, imageDrawParams]);\r\n\r\n const downloadImage = () => {\r\n const baseCanvas = baseCanvasRef.current;\r\n const drawingCanvas = drawingCanvasRef.current;\r\n if (!baseCanvas || !drawingCanvas) return;\r\n const tmp = document.createElement(\"canvas\");\r\n tmp.width = baseCanvas.width;\r\n tmp.height = baseCanvas.height;\r\n const ctx = tmp.getContext(\"2d\");\r\n if (!ctx) return;\r\n ctx.drawImage(baseCanvas, 0, 0);\r\n ctx.drawImage(drawingCanvas, 0, 0);\r\n const a = document.createElement(\"a\");\r\n a.download = `edited-${resolvedImage.name || \"image\"}.png`;\r\n a.href = tmp.toDataURL(\"image/png\");\r\n a.click();\r\n };\r\n\r\n const flattenLayers = useCallback(() => {\r\n const baseCanvas = baseCanvasRef.current;\r\n const drawingCanvas = drawingCanvasRef.current;\r\n if (!baseCanvas || !drawingCanvas) return;\r\n const tmp = document.createElement(\"canvas\");\r\n tmp.width = baseCanvas.width;\r\n tmp.height = baseCanvas.height;\r\n const tmpCtx = tmp.getContext(\"2d\");\r\n if (!tmpCtx) return;\r\n tmpCtx.drawImage(baseCanvas, 0, 0);\r\n tmpCtx.drawImage(drawingCanvas, 0, 0);\r\n const baseCtx = baseCanvas.getContext(\"2d\");\r\n const drawingCtx = drawingCanvas.getContext(\"2d\");\r\n if (!baseCtx || !drawingCtx) return;\r\n baseCtx.clearRect(0, 0, baseCanvas.width, baseCanvas.height);\r\n baseCtx.drawImage(tmp, 0, 0);\r\n drawingCtx.clearRect(0, 0, drawingCanvas.width, drawingCanvas.height);\r\n }, []);\r\n\r\n // ── mouse / touch drawing ──────────────────────────────────────────────────\r\n\r\n const getMousePos = (e) => {\r\n const canvas = drawingCanvasRef.current;\r\n if (!canvas) return { x: 0, y: 0 };\r\n const rect = canvas.getBoundingClientRect();\r\n const clientX = \"touches\" in e ? e.touches[0].clientX : e.clientX;\r\n const clientY = \"touches\" in e ? e.touches[0].clientY : e.clientY;\r\n return {\r\n x: (clientX - rect.left) * (canvas.width / rect.width),\r\n y: (clientY - rect.top) * (canvas.height / rect.height),\r\n };\r\n };\r\n\r\n const handleEraserCursorMove = (e) => {\r\n if (activeTool !== \"eraser\") return;\r\n setEraserCursor(getMousePos(e));\r\n };\r\n\r\n const startDrawing = (e) => {\r\n const pos = getMousePos(e);\r\n if (activeTool === \"text\") {\r\n setTextInputPosition(pos);\r\n return;\r\n }\r\n if (activeTool === \"curve\" || activeTool === \"curve-arrow\") return;\r\n if (activeTool === \"crop\") {\r\n const ctx = drawingCanvasRef.current?.getContext(\"2d\");\r\n if (ctx) ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\r\n setIsDrawing(true);\r\n setIsCropping(true);\r\n setDragStart(pos);\r\n setCropArea({ x: pos.x, y: pos.y, width: 0, height: 0 });\r\n drawCropOverlay();\r\n return;\r\n }\r\n const ctx = drawingCanvasRef.current?.getContext(\"2d\");\r\n if (!ctx) return;\r\n setIsDrawing(true);\r\n setStartPoint(pos);\r\n setCurrentStroke([pos]);\r\n if ([\"pencil\", \"eraser\"].includes(activeTool)) {\r\n ctx.beginPath();\r\n ctx.moveTo(pos.x, pos.y);\r\n ctx.globalCompositeOperation =\r\n activeTool === \"eraser\" ? \"destination-out\" : \"source-over\";\r\n if (activeTool !== \"eraser\") ctx.strokeStyle = currentColor;\r\n }\r\n };\r\n\r\n const draw = (e) => {\r\n const currentPos = getMousePos(e);\r\n if (activeTool === \"text\" || !isDrawing) return;\r\n if (activeTool === \"curve\" || activeTool === \"curve-arrow\") return;\r\n const drawingCanvas = drawingCanvasRef.current;\r\n const ctx = drawingCanvas?.getContext(\"2d\");\r\n if (!drawingCanvas || !ctx) return;\r\n setCurrentStroke((prev) => [...prev, currentPos]);\r\n\r\n if (activeTool === \"crop\" && dragStart && isDrawing) {\r\n const x = Math.max(0, Math.min(currentPos.x, drawingCanvas.width));\r\n const y = Math.max(0, Math.min(currentPos.y, drawingCanvas.height));\r\n const w = x - dragStart.x,\r\n h = y - dragStart.y;\r\n setCropArea({\r\n x: w < 0 ? x : dragStart.x,\r\n y: h < 0 ? y : dragStart.y,\r\n width: Math.abs(w),\r\n height: Math.abs(h),\r\n });\r\n requestAnimationFrame(() => drawCropOverlay());\r\n return;\r\n }\r\n if ([\"pencil\", \"eraser\"].includes(activeTool)) {\r\n ctx.globalCompositeOperation =\r\n activeTool === \"eraser\" ? \"destination-out\" : \"source-over\";\r\n if (activeTool !== \"eraser\") ctx.strokeStyle = currentColor;\r\n ctx.lineTo(currentPos.x, currentPos.y);\r\n ctx.lineWidth = brushSize;\r\n ctx.lineCap = \"round\";\r\n ctx.lineJoin = \"round\";\r\n ctx.stroke();\r\n }\r\n if (activeTool === \"line\" && startPoint) {\r\n ctx.clearRect(0, 0, drawingCanvas.width, drawingCanvas.height);\r\n if (replayManager?.current) {\r\n historyState.actions\r\n .filter((a) => a.target === \"drawing\")\r\n .forEach((a) => replayManager.current.applyDrawingAction(a));\r\n }\r\n ctx.save();\r\n ctx.globalCompositeOperation = \"source-over\";\r\n ctx.strokeStyle = currentColor;\r\n ctx.lineWidth = brushSize;\r\n ctx.lineCap = \"round\";\r\n ctx.lineJoin = \"round\";\r\n switch (strokeStyle) {\r\n case \"dashed\":\r\n ctx.setLineDash([brushSize * 3, brushSize * 2]);\r\n break;\r\n case \"dotted\":\r\n ctx.setLineDash([brushSize, brushSize]);\r\n break;\r\n default:\r\n ctx.setLineDash([]);\r\n }\r\n ctx.beginPath();\r\n ctx.moveTo(startPoint.x, startPoint.y);\r\n ctx.lineTo(currentPos.x, currentPos.y);\r\n ctx.stroke();\r\n ctx.restore();\r\n }\r\n };\r\n\r\n const stopDrawing = () => {\r\n if (activeTool === \"crop\") {\r\n setIsDrawing(false);\r\n if (cropArea && cropArea.width > 10 && cropArea.height > 10) {\r\n setIsCropping(false);\r\n setDragStart(null);\r\n requestAnimationFrame(() => drawCropOverlay());\r\n } else {\r\n setCropArea(null);\r\n setIsCropping(false);\r\n setDragStart(null);\r\n const ctx = drawingCanvasRef.current?.getContext(\"2d\");\r\n if (ctx) ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\r\n }\r\n return;\r\n }\r\n if (activeTool === \"curve\" || activeTool === \"curve-arrow\") return;\r\n if (!isDrawing) return;\r\n const ctx = drawingCanvasRef.current?.getContext(\"2d\");\r\n if (ctx) {\r\n if ([\"pencil\", \"eraser\"].includes(activeTool)) {\r\n ctx.closePath();\r\n ctx.globalCompositeOperation = \"source-over\";\r\n if (currentStroke.length > 0) {\r\n addAction(\r\n createAction(\r\n \"drawing\",\r\n activeTool === \"pencil\" ? \"DRAW_PENCIL\" : \"DRAW_ERASER\",\r\n {\r\n points: currentStroke,\r\n color: currentColor,\r\n strokeWidth: brushSize,\r\n strokeStyle,\r\n isEraser: activeTool === \"eraser\",\r\n },\r\n ),\r\n );\r\n // ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\r\n }\r\n } else if (activeTool === \"line\" && startPoint) {\r\n const endPoint = currentStroke[currentStroke.length - 1] || startPoint;\r\n addAction(\r\n createAction(\"drawing\", \"DRAW_LINE\", {\r\n points: [startPoint, endPoint],\r\n color: currentColor,\r\n strokeWidth: brushSize,\r\n strokeStyle,\r\n startPoint,\r\n endPoint,\r\n isEraser: false,\r\n }),\r\n );\r\n // ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\r\n }\r\n setIsDrawing(false);\r\n setStartPoint(null);\r\n setCurrentStroke([]);\r\n }\r\n };\r\n\r\n // ── save / cancel ──────────────────────────────────────────────────────────\r\n\r\n const handleSave = async () => {\r\n if (cropArea) return;\r\n konvaRectRef.current?.flatten();\r\n konvaCircleRef.current?.flatten();\r\n konvaArrowRef.current?.flatten();\r\n konvaDoubleArrowRef.current?.flatten();\r\n textEditorRef.current?.flatten();\r\n const baseCanvas = baseCanvasRef.current;\r\n const drawingCanvas = drawingCanvasRef.current;\r\n if (!baseCanvas || !drawingCanvas) return;\r\n const tmp = document.createElement(\"canvas\");\r\n tmp.width = baseCanvas.width;\r\n tmp.height = baseCanvas.height;\r\n const ctx = tmp.getContext(\"2d\");\r\n if (!ctx) return;\r\n ctx.drawImage(baseCanvas, 0, 0);\r\n ctx.drawImage(drawingCanvas, 0, 0);\r\n\r\n try {\r\n const result = await buildImageEditResult(tmp, {\r\n fileName: `edited-${resolvedImage.name || \"image\"}.png`,\r\n });\r\n onSave(result);\r\n } catch (err) {\r\n console.error(\"Failed to build image edit result:\", err);\r\n toast({\r\n title: \"Save failed\",\r\n description: \"Could not export the edited image. Please try again.\",\r\n variant: \"destructive\",\r\n });\r\n }\r\n };\r\n\r\n const handleCancel = () => {\r\n if (hasUnsavedChanges) setShowCancelConfirm(true);\r\n else onClose();\r\n };\r\n\r\n const confirmToolOptions = useCallback(() => {\r\n switch (activeTool) {\r\n case \"rectangle\":\r\n konvaRectRef.current?.flatten();\r\n break;\r\n case \"circle\":\r\n konvaCircleRef.current?.flatten();\r\n break;\r\n case \"arrow\":\r\n konvaArrowRef.current?.flatten();\r\n break;\r\n case \"double-arrow\":\r\n konvaDoubleArrowRef.current?.flatten();\r\n break;\r\n case \"text\":\r\n textEditorRef.current?.flatten();\r\n break;\r\n default:\r\n break; // pencil / eraser / line / curve / curve-arrow: nothing pending\r\n }\r\n setActiveTool(null);\r\n }, [\r\n activeTool,\r\n konvaRectRef,\r\n konvaCircleRef,\r\n konvaArrowRef,\r\n konvaDoubleArrowRef,\r\n textEditorRef,\r\n ]);\r\n\r\n const handleConfirmCancel = () => {\r\n setShowCancelConfirm(false);\r\n onClose();\r\n };\r\n\r\n const handleToolChange = (tool) => {\r\n if (activeTool === \"eraser\") setBrushSize(10);\r\n else if (activeTool === \"pencil\") setBrushSize(3);\r\n if (tool === \"crop\") {\r\n setCropArea(null);\r\n setIsCropping(false);\r\n setDragStart(null);\r\n const ctx = drawingCanvasRef.current?.getContext(\"2d\");\r\n if (ctx) {\r\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\r\n ctx.globalCompositeOperation = \"source-over\";\r\n }\r\n }\r\n if (tool === \"text\") {\r\n setTextInputPosition(null);\r\n setText(\"\");\r\n }\r\n setSelectedElementId(null);\r\n setSelectedElementType(null);\r\n setShowTrashIcon(false);\r\n setIsDraggedOverTrash(false);\r\n setIsTextToolActive(tool === \"text\");\r\n setActiveTool(tool);\r\n };\r\n\r\n // ── shared Konva props factory ─────────────────────────────────────────────\r\n\r\n const sharedKonvaProps = {\r\n width: getCurrentCanvasDimensions().width,\r\n height: getCurrentCanvasDimensions().height,\r\n color: currentColor,\r\n setColor: setCurrentColor,\r\n brushSize,\r\n setBrushSize,\r\n strokeStyle,\r\n setStrokeStyle,\r\n backgroundColor,\r\n setBackgroundColor,\r\n onElementSelect: (id, type) => {\r\n setSelectedElementId(id);\r\n setSelectedElementType(type);\r\n },\r\n onElementDeselect: () => {\r\n setSelectedElementId(null);\r\n setSelectedElementType(null);\r\n },\r\n checkTrashZoneCollision,\r\n updateTrashZoneState,\r\n };\r\n\r\n const handleKonvaTextDelete = useCallback(\r\n (id) => {\r\n addAction(\r\n createAction(\"konva\", \"DELETE_ELEMENT\", {\r\n elementType: \"text\",\r\n elementId: id,\r\n }),\r\n );\r\n },\r\n [createAction, addAction],\r\n );\r\n\r\n if (!isOpen) return null;\r\n\r\n // ── render ─────────────────────────────────────────────────────────────────\r\n\r\n return (\r\n <div\r\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/80\"\r\n id=\"image-editor-modal\"\r\n tabIndex={-1}\r\n >\r\n <div\r\n className=\"flex flex-col bg-white w-screen h-screen lg:rounded-lg lg:w-[98vw] lg:max-w-5xl lg:h-[80vh] overflow-hidden\"\r\n style={isMobile ? { height: \"100dvh\" } : undefined}\r\n >\r\n {/* Header */}\r\n <div className=\"p-4 border-b hidden lg:flex items-center justify-between\">\r\n <h2 className=\"text-lg font-semibold\">\r\n Edit Image: {resolvedImage.name}\r\n </h2>\r\n </div>\r\n\r\n {/* Body */}\r\n <div className=\"flex flex-col lg:flex-row flex-grow overflow-hidden\">\r\n {/* ── Mobile toolbar ── */}\r\n <div className=\"lg:hidden\">\r\n <MobileView\r\n historyState={historyState}\r\n undo={undo}\r\n canUndo={canUndo}\r\n redo={redo}\r\n canRedo={canRedo}\r\n setActiveTool={setActiveTool}\r\n activeTool={activeTool}\r\n drawingCanvasRef={drawingCanvasRef}\r\n handleToolChange={handleToolChange}\r\n currentColor={currentColor}\r\n setCurrentColor={setCurrentColor}\r\n backgroundColor={backgroundColor}\r\n setBackgroundColor={setBackgroundColor}\r\n brushSize={brushSize}\r\n setBrushSize={setBrushSize}\r\n minBrushSize={minBrushSize}\r\n maxBrushSize={maxBrushSize}\r\n cropArea={cropArea}\r\n setCropArea={setCropArea}\r\n flattenLayers={flattenLayers}\r\n konvaRectRef={konvaRectRef}\r\n konvaCircleRef={konvaCircleRef}\r\n konvaArrowRef={konvaArrowRef}\r\n konvaDoubleArrowRef={konvaDoubleArrowRef}\r\n textEditorRef={textEditorRef}\r\n downloadImage={downloadImage}\r\n showCropConfirm={showCropConfirm}\r\n handleSave={handleSave}\r\n handleCancel={handleCancel}\r\n isTextDragging={isTextDragging}\r\n textColor={textColor}\r\n setTextColor={setTextColor}\r\n textBgColor={textBgColor}\r\n cycleTextBg={cycleTextBg}\r\n // setShowCropConfirm={setShowCropConfirm}\r\n applyCrop={applyCrop}\r\n confirmToolOptions={confirmToolOptions}\r\n />\r\n </div>\r\n\r\n {/* ── Left panel (desktop) ── */}\r\n <div className=\"hidden lg:flex flex-col lg:w-52 lg:flex-shrink-0 lg:border-r p-2 gap-2 overflow-y-auto\">\r\n {/* Undo / Redo */}\r\n <div className=\"flex justify-between gap-2\">\r\n <Button\r\n variant=\"outline\"\r\n onClick={undo}\r\n disabled={!canUndo}\r\n title={`Undo (${actionCount} actions)`}\r\n className=\"flex items-center gap-2 p-3\"\r\n >\r\n <Undo2 className=\"h-4 w-4\" /> Undo\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n onClick={redo}\r\n disabled={!canRedo}\r\n title=\"Redo\"\r\n className=\"flex items-center gap-2 p-3\"\r\n >\r\n <Redo2 className=\"h-4 w-4\" /> Redo\r\n </Button>\r\n </div>\r\n\r\n {/* Tool grid */}\r\n <div className=\"grid grid-cols-2 gap-2\">\r\n {[\r\n [\"pencil\", <Pencil className=\"h-4 w-4\" />, \"Pencil\"],\r\n [\"eraser\", <Eraser className=\"h-4 w-4\" />, \"Eraser\"],\r\n [\"rectangle\", <Square className=\"h-4 w-4\" />, \"Rectangle\"],\r\n [\"circle\", <Circle className=\"h-4 w-4\" />, \"Circle\"],\r\n [\"text\", <Type className=\"h-4 w-4\" />, \"Text\"],\r\n [\"arrow\", <ArrowRight className=\"h-4 w-4\" />, \"Arrow\"],\r\n [\r\n \"double-arrow\",\r\n <ArrowRightLeft className=\"h-4 w-4\" />,\r\n \"Double Arrow\",\r\n ],\r\n [\"line\", <MinusIcon className=\"h-4 w-4\" />, \"Line\"],\r\n ].map(([tool, icon, label]) => (\r\n <Button\r\n key={tool}\r\n variant={activeTool === tool ? \"secondary\" : \"ghost\"}\r\n onClick={() => handleToolChange(tool)}\r\n className=\"!flex !flex-col !px-2 !py-1 !gap-1 min-w-[45%] !h-max\"\r\n >\r\n {icon} {label}\r\n </Button>\r\n ))}\r\n\r\n {/* Crop — with confirm guard */}\r\n <Button\r\n variant={activeTool === \"crop\" ? \"secondary\" : \"ghost\"}\r\n onClick={() => {\r\n const c = drawingCanvasRef.current;\r\n const ctx = c?.getContext(\"2d\");\r\n if (!c || !ctx) return;\r\n const hasChanges = ctx\r\n .getImageData(0, 0, c.width, c.height)\r\n .data.some((p, i) => i % 4 === 3 && p !== 0);\r\n if (hasChanges && activeTool !== \"crop\") {\r\n setShowCropConfirm(true);\r\n setShowCurveArrowConfirm(false);\r\n setShowCurveConfirm(false);\r\n } else handleToolChange(\"crop\");\r\n }}\r\n className=\"!flex !flex-col !px-2 !py-1 !gap-1 min-w-[45%] !h-max\"\r\n >\r\n <Crop className=\"h-4 w-4\" /> Crop\r\n </Button>\r\n\r\n <Button\r\n variant={activeTool === \"curve\" ? \"secondary\" : \"ghost\"}\r\n onClick={() => setActiveTool(\"curve\")}\r\n className=\"!flex !flex-col !px-2 !py-1 !gap-1 min-w-[45%] !h-max\"\r\n >\r\n <PenTool className=\"h-4 w-4\" /> Curve\r\n </Button>\r\n\r\n <Button\r\n variant={activeTool === \"curve-arrow\" ? \"secondary\" : \"ghost\"}\r\n onClick={() => setActiveTool(\"curve-arrow\")}\r\n className=\"!flex !flex-col !px-2 !py-1 !gap-1 min-w-[45%] !h-max\"\r\n >\r\n <TbArrowCurveRight className=\"h-4 w-4\" /> Curve Arrow\r\n </Button>\r\n </div>\r\n\r\n {/* Crop controls */}\r\n {activeTool === \"crop\" && (\r\n <div className=\"space-y-2 mt-2\">\r\n <p className=\"text-sm text-gray-500\">\r\n Draw a rectangle to crop. Click Apply to confirm.\r\n </p>\r\n <Button\r\n variant=\"outline\"\r\n onClick={() => {\r\n setCropArea(null);\r\n const ctx = drawingCanvasRef.current?.getContext(\"2d\");\r\n if (ctx)\r\n ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\r\n }}\r\n className=\"!flex !flex-col !px-2 !py-1 !gap-1 w-full !h-max\"\r\n >\r\n Cancel\r\n </Button>\r\n <Button\r\n onClick={applyCrop}\r\n disabled={!cropArea}\r\n className=\"!flex !flex-col !px-2 !py-1 !gap-1 w-full !h-max\"\r\n >\r\n Apply\r\n </Button>\r\n </div>\r\n )}\r\n\r\n {/* Stroke style */}\r\n {activeTool &&\r\n [\r\n \"line\",\r\n \"rectangle\",\r\n \"circle\",\r\n \"arrow\",\r\n \"double-arrow\",\r\n \"curve\",\r\n \"curve-arrow\",\r\n ].includes(activeTool) && (\r\n <div className=\"mt-4\">\r\n <Label\r\n htmlFor=\"stroke-style\"\r\n className=\"flex items-center gap-2 mb-1\"\r\n >\r\n <Grip className=\"h-4 w-4\" /> Stroke Style\r\n </Label>\r\n <Select value={strokeStyle} onValueChange={setStrokeStyle}>\r\n <SelectItem value=\"solid\">Solid</SelectItem>\r\n <SelectItem value=\"dashed\">Dashed</SelectItem>\r\n <SelectItem value=\"dotted\">Dotted</SelectItem>\r\n </Select>\r\n </div>\r\n )}\r\n\r\n {/* Background color */}\r\n {activeTool &&\r\n [\"text\", \"rectangle\", \"circle\"].includes(activeTool) && (\r\n <div className=\"flex items-center gap-2 mt-2\">\r\n <Label htmlFor=\"backgroundColor\" className=\"text-sm\">\r\n Background\r\n </Label>\r\n <input\r\n id=\"backgroundColor\"\r\n type=\"color\"\r\n value={\r\n backgroundColor === \"transparent\"\r\n ? \"#ffffff\"\r\n : backgroundColor\r\n }\r\n onChange={(e) => setBackgroundColor(e.target.value)}\r\n className=\"rounded-full w-6 h-6 cursor-pointer\"\r\n />\r\n <GrClear\r\n className=\"h-4 w-4 cursor-pointer\"\r\n onClick={() => setBackgroundColor(\"transparent\")}\r\n />\r\n </div>\r\n )}\r\n\r\n {/* Color picker */}\r\n <div className=\"flex items-center gap-2 mt-4\">\r\n <Label\r\n htmlFor=\"color-picker-lg\"\r\n className=\"flex items-center gap-2\"\r\n >\r\n <Palette className=\"h-4 w-4\" /> Color\r\n </Label>\r\n <input\r\n type=\"color\"\r\n value={currentColor}\r\n onChange={(e) => setCurrentColor(e.target.value)}\r\n className=\"rounded-full w-12 h-6 cursor-pointer\"\r\n />\r\n </div>\r\n\r\n {/* Brush size */}\r\n <div className=\"mt-4\">\r\n <Label htmlFor=\"brush-size-lg\" className=\"mb-2 block\">\r\n Brush Size: {brushSize}px\r\n </Label>\r\n <div className=\"flex items-center gap-2\">\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={() =>\r\n setBrushSize((s) => Math.max(minBrushSize, s - 1))\r\n }\r\n className=\"h-8 w-8\"\r\n >\r\n <Minus className=\"h-4 w-4\" />\r\n </Button>\r\n <Slider\r\n id=\"brush-size-lg\"\r\n min={minBrushSize}\r\n max={maxBrushSize}\r\n step={1}\r\n value={[brushSize]}\r\n onValueChange={(v) => setBrushSize(v[0])}\r\n className=\"flex-grow\"\r\n />\r\n <Button\r\n variant=\"outline\"\r\n size=\"icon\"\r\n onClick={() =>\r\n setBrushSize((s) => Math.min(maxBrushSize, s + 1))\r\n }\r\n className=\"h-8 w-8\"\r\n >\r\n <Plus className=\"h-4 w-4\" />\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* ── Canvas area ── */}\r\n <div className=\"flex-1 flex items-center justify-center bg-black lg:bg-gray-100 min-h-0 relative overflow-hidden px-2 pb-[80px] lg:p-0\">\r\n <div\r\n className=\"relative lg:border-2 lg:border-gray-300 w-full h-full lg:w-[420px] lg:h-[750px]\"\r\n id=\"drawing-canvas\"\r\n >\r\n <canvas\r\n ref={baseCanvasRef}\r\n className=\"absolute bg-black lg:bg-white object-contain w-full h-full\"\r\n />\r\n <canvas\r\n ref={drawingCanvasRef}\r\n onMouseDown={startDrawing}\r\n onMouseMove={(e) => {\r\n draw(e);\r\n handleEraserCursorMove(e);\r\n }}\r\n onMouseUp={stopDrawing}\r\n onMouseLeave={() => {\r\n stopDrawing();\r\n setEraserCursor(null);\r\n }}\r\n onTouchStart={startDrawing}\r\n onTouchMove={(e) => {\r\n draw(e);\r\n handleEraserCursorMove(e);\r\n }}\r\n onTouchEnd={() => {\r\n stopDrawing();\r\n setEraserCursor(null);\r\n }}\r\n className=\"absolute w-full h-full\"\r\n style={{\r\n cursor:\r\n activeTool === \"text\"\r\n ? \"text\"\r\n : activeTool === null\r\n ? \"default\"\r\n : activeTool === \"eraser\"\r\n ? \"none\"\r\n : \"crosshair\",\r\n }}\r\n />\r\n\r\n {/* Konva layers — wrapped in Suspense (replaces next/dynamic) */}\r\n {mounted && (\r\n <Suspense fallback={null}>\r\n {activeTool === \"rectangle\" && (\r\n <KonvaRectangle\r\n ref={konvaRectRef}\r\n {...sharedKonvaProps}\r\n active={true}\r\n onAdd={handleKonvaRectAdd}\r\n onMove={handleKonvaRectMove}\r\n rectangles={rectangles}\r\n setRectangles={setRectangles}\r\n onFlatten={handleKonvaRectFlatten}\r\n />\r\n )}\r\n {activeTool === \"circle\" && (\r\n <KonvaCircle\r\n ref={konvaCircleRef}\r\n {...sharedKonvaProps}\r\n active={true}\r\n onAdd={handleKonvaCircleAdd}\r\n onMove={handleKonvaCircleMove}\r\n circles={circles}\r\n setCircles={setCircles}\r\n onFlatten={handleKonvaCircleFlatten}\r\n />\r\n )}\r\n {activeTool === \"arrow\" && (\r\n <ArrowKonva\r\n ref={konvaArrowRef}\r\n {...sharedKonvaProps}\r\n active={true}\r\n onAdd={handleKonvaArrowAdd}\r\n onMove={handleKonvaArrowMove}\r\n arrows={arrows}\r\n setArrows={setArrows}\r\n onFlatten={handleKonvaArrowFlatten}\r\n />\r\n )}\r\n {activeTool === \"double-arrow\" && (\r\n <KonvaDoubleArrow\r\n ref={konvaDoubleArrowRef}\r\n {...sharedKonvaProps}\r\n active={true}\r\n onAdd={handleKonvaDoubleArrowAdd}\r\n onMove={handleKonvaDoubleArrowMove}\r\n arrows={doubleArrows}\r\n setArrows={setDoubleArrows}\r\n onFlatten={handleKonvaDoubleArrowFlatten}\r\n />\r\n )}\r\n {activeTool === \"text\" && (\r\n <TextEditor\r\n ref={textEditorRef}\r\n {...sharedKonvaProps}\r\n color={textColor}\r\n setColor={setTextColor}\r\n backgroundColor={textBgColor}\r\n setBackgroundColor={setTextBgColor}\r\n active={true}\r\n allowCreate={true}\r\n fontSize={fontSize}\r\n fontFamily={fontFamily}\r\n onAdd={handleKonvaTextAdd}\r\n onMove={handleKonvaTextMove}\r\n texts={texts}\r\n setTexts={setTexts}\r\n onFlatten={handleTextFlatten}\r\n onDelete={handleKonvaTextDelete}\r\n />\r\n )}\r\n\r\n {/* Passive layers — keep shapes visible when tool changes */}\r\n {activeTool !== \"rectangle\" && rectangles.length > 0 && (\r\n <KonvaRectangle\r\n ref={konvaRectRef}\r\n {...sharedKonvaProps}\r\n active={false}\r\n onAdd={handleKonvaRectAdd}\r\n onMove={handleKonvaRectMove}\r\n rectangles={rectangles}\r\n setRectangles={setRectangles}\r\n onFlatten={handleKonvaRectFlatten}\r\n />\r\n )}\r\n {activeTool !== \"circle\" && circles.length > 0 && (\r\n <KonvaCircle\r\n ref={konvaCircleRef}\r\n {...sharedKonvaProps}\r\n active={false}\r\n onAdd={handleKonvaCircleAdd}\r\n onMove={handleKonvaCircleMove}\r\n circles={circles}\r\n setCircles={setCircles}\r\n onFlatten={handleKonvaCircleFlatten}\r\n />\r\n )}\r\n {activeTool !== \"arrow\" && arrows.length > 0 && (\r\n <ArrowKonva\r\n ref={konvaArrowRef}\r\n {...sharedKonvaProps}\r\n active={false}\r\n onAdd={handleKonvaArrowAdd}\r\n onMove={handleKonvaArrowMove}\r\n arrows={arrows}\r\n setArrows={setArrows}\r\n onFlatten={handleKonvaArrowFlatten}\r\n />\r\n )}\r\n {activeTool !== \"double-arrow\" && doubleArrows.length > 0 && (\r\n <KonvaDoubleArrow\r\n ref={konvaDoubleArrowRef}\r\n {...sharedKonvaProps}\r\n active={false}\r\n onAdd={handleKonvaDoubleArrowAdd}\r\n onMove={handleKonvaDoubleArrowMove}\r\n arrows={doubleArrows}\r\n setArrows={setDoubleArrows}\r\n onFlatten={handleKonvaDoubleArrowFlatten}\r\n />\r\n )}\r\n {activeTool !== \"text\" && texts.length > 0 && (\r\n <TextEditor\r\n ref={textEditorRef}\r\n {...sharedKonvaProps}\r\n color={textColor}\r\n setColor={setTextColor}\r\n backgroundColor={textBgColor}\r\n setBackgroundColor={setTextBgColor}\r\n active={isMobile && activeTool === null}\r\n allowCreate={false}\r\n fontSize={fontSize}\r\n fontFamily={fontFamily}\r\n onAdd={handleKonvaTextAdd}\r\n onMove={handleKonvaTextMove}\r\n texts={texts}\r\n setTexts={setTexts}\r\n onFlatten={handleTextFlatten}\r\n onDragStateChange={setIsTextDragging}\r\n onDelete={handleKonvaTextDelete}\r\n />\r\n )}\r\n </Suspense>\r\n )}\r\n\r\n {/* Curve tools */}\r\n {activeTool === \"curve\" && (\r\n <CurveTool\r\n active\r\n canvasRef={drawingCanvasRef}\r\n currentColor={currentColor}\r\n setActiveTool={setActiveTool}\r\n strokeStyle={strokeStyle}\r\n brushSize={brushSize}\r\n createAction={createAction}\r\n addAction={addAction}\r\n replayManager={replayManager}\r\n historyState={historyState}\r\n />\r\n )}\r\n {activeTool === \"curve-arrow\" && (\r\n <CurveArrowTool\r\n active\r\n canvasRef={drawingCanvasRef}\r\n currentColor={currentColor}\r\n setActiveTool={setActiveTool}\r\n strokeStyle={strokeStyle}\r\n brushSize={brushSize}\r\n createAction={createAction}\r\n addAction={addAction}\r\n replayManager={replayManager}\r\n historyState={historyState}\r\n />\r\n )}\r\n\r\n {/* Eraser cursor ring */}\r\n {eraserCursor && activeTool === \"eraser\" && (\r\n <div\r\n style={{\r\n position: \"absolute\",\r\n left: `${eraserCursor.x - brushSize / 2}px`,\r\n top: `${eraserCursor.y - brushSize / 2}px`,\r\n width: `${brushSize}px`,\r\n height: `${brushSize}px`,\r\n border: \"2px solid #07070780\",\r\n borderRadius: \"50%\",\r\n pointerEvents: \"none\",\r\n background: \"rgba(255,255,255,0.1)\",\r\n zIndex: 10,\r\n boxSizing: \"border-box\",\r\n }}\r\n />\r\n )}\r\n\r\n {/* Mobile trash drop zone */}\r\n {showTrashIcon && (\r\n <div\r\n id=\"trash-zone\"\r\n className={`fixed top-0 left-0 p-3 rounded-full shadow-lg border-2 transition-all duration-200 text-white ${\r\n isDraggedOverTrash\r\n ? \"bg-red-600 border-red-700 scale-125\"\r\n : \"bg-red-500 border-red-600\"\r\n }`}\r\n style={{\r\n background: isDraggedOverTrash\r\n ? \"linear-gradient(135deg,#dc2626,#b91c1c)\"\r\n : \"linear-gradient(135deg,#ef4444,#dc2626)\",\r\n boxShadow: isDraggedOverTrash\r\n ? \"0 6px 20px rgba(239,68,68,.6)\"\r\n : \"0 4px 15px rgba(239,68,68,.4)\",\r\n zIndex: 9999,\r\n pointerEvents: \"none\",\r\n }}\r\n >\r\n <Trash2\r\n className={`h-6 w-6 transition-transform duration-200 ${isDraggedOverTrash ? \"scale-110\" : \"\"}`}\r\n />\r\n <div className=\"absolute -top-8 left-1/2 -translate-x-1/2 bg-black text-white text-[8px] px-2 py-1 rounded whitespace-nowrap pointer-events-none\">\r\n {isDraggedOverTrash\r\n ? \"Release to delete\"\r\n : \"Drag here to delete\"}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n\r\n {/* ── Bottom black spacer (mobile only) ── */}\r\n <div className=\"lg:hidden bg-black flex-shrink-0 pb-[env(safe-area-inset-bottom)]\" />\r\n </div>\r\n\r\n {/* ── Footer ── */}\r\n <div className=\"p-2 sm:p-4 border-t hidden lg:flex justify-end flex-row gap-2 flex-wrap\">\r\n <Button\r\n variant=\"outline\"\r\n onClick={applyBlackAndWhite}\r\n className=\"flex items-center text-[12px] w-max\"\r\n >\r\n <Filter className=\"h-4 w-4\" />\r\n <span className=\"hidden sm:block ml-1\">Apply Filter</span>\r\n </Button>\r\n <Button\r\n variant=\"secondary\"\r\n onClick={downloadImage}\r\n className=\"flex items-center text-[12px] w-max\"\r\n >\r\n <Download className=\"h-4 w-4\" />\r\n <span className=\"hidden sm:block ml-1\">Download</span>\r\n </Button>\r\n <Button\r\n variant=\"outline\"\r\n onClick={handleCancel}\r\n className=\"text-[12px] w-max\"\r\n >\r\n Cancel\r\n </Button>\r\n <Button onClick={handleSave} className=\"text-[12px] w-max\">\r\n Save Changes\r\n </Button>\r\n </div>\r\n </div>\r\n\r\n {/* ── Cancel confirm overlay ── */}\r\n {showCancelConfirm && (\r\n <div className=\"absolute inset-0 z-50 flex items-center justify-center bg-black/60\">\r\n <div className=\"bg-white rounded-lg p-6 w-[90%] max-w-md shadow-xl\">\r\n <h3 className=\"text-lg font-semibold mb-2\">\r\n Are you sure you want to cancel?\r\n </h3>\r\n <p className=\"text-gray-600 mb-4\">\r\n You have unsaved changes. Are you sure you want to cancel and lose\r\n your work?\r\n </p>\r\n <div className=\"flex justify-end gap-2\">\r\n <Button\r\n variant=\"outline\"\r\n onClick={() => setShowCancelConfirm(false)}\r\n className=\"mt-0\"\r\n >\r\n No, keep editing\r\n </Button>\r\n <Button variant=\"destructive\" onClick={handleConfirmCancel}>\r\n Yes, cancel\r\n </Button>\r\n </div>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import React from \"react\";\r\n\r\nconst variantClasses = {\r\n default: \"bg-blue-600 text-white hover:bg-blue-700\",\r\n outline: \"border border-gray-300 bg-white text-gray-700 hover:bg-gray-50\",\r\n ghost: \"bg-transparent text-gray-700 hover:bg-gray-100\",\r\n secondary: \"bg-gray-200 text-gray-800 hover:bg-gray-300\",\r\n destructive: \"bg-red-600 text-white hover:bg-red-700\",\r\n};\r\n\r\nconst sizeClasses = {\r\n default: \"px-3 py-2 text-sm\",\r\n icon: \"p-2\",\r\n sm: \"px-2 py-1 text-xs\",\r\n};\r\n\r\nexport function Button({\r\n children,\r\n onClick,\r\n variant = \"default\",\r\n size = \"default\",\r\n disabled = false,\r\n type = \"button\",\r\n className = \"\",\r\n title,\r\n}) {\r\n return (\r\n <button\r\n type={type}\r\n onClick={onClick}\r\n disabled={disabled}\r\n title={title}\r\n className={`inline-flex items-center justify-center rounded font-medium transition-colors duration-150 focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed ${variantClasses[variant] ?? variantClasses.default} ${sizeClasses[size] ?? sizeClasses.default} ${className}`}\r\n >\r\n {children}\r\n </button>\r\n );\r\n}","import React from \"react\";\r\n\r\nexport function Label({ children, htmlFor, className = \"\" }) {\r\n return (\r\n <label htmlFor={htmlFor} className={`text-sm font-medium text-gray-700 ${className}`}>\r\n {children}\r\n </label>\r\n );\r\n}","import React from \"react\";\r\n\r\nexport function Select({ value, onValueChange, children }) {\r\n // Extract items from children to build native select\r\n return (\r\n <div className=\"relative\">\r\n <select\r\n value={value}\r\n onChange={(e) => onValueChange(e.target.value)}\r\n className=\"w-full border border-gray-300 rounded px-2 py-1.5 text-sm bg-white focus:outline-none focus:ring-1 focus:ring-blue-500 appearance-none pr-7\"\r\n >\r\n {children}\r\n </select>\r\n <div className=\"pointer-events-none absolute inset-y-0 right-2 flex items-center text-gray-500 text-xs\">▼</div>\r\n </div>\r\n );\r\n}\r\n\r\n// These are pass-through — the Select above renders a native <select>\r\nexport function SelectTrigger({ children }) { return <>{children}</>; }\r\nexport function SelectValue({ placeholder }) { return null; }\r\nexport function SelectContent({ children }) { return <>{children}</>; }\r\n\r\nexport function SelectItem({ value, children }) {\r\n // Extract text from children (could be a div with icon + text)\r\n return <option value={value}>{typeof children === \"string\" ? children : value}</option>;\r\n}","import React from \"react\";\r\n\r\nexport function Slider({ min, max, step, value, onValueChange, className = \"\", id }) {\r\n return (\r\n <input\r\n id={id}\r\n type=\"range\"\r\n min={min}\r\n max={max}\r\n step={step}\r\n value={value[0]}\r\n onChange={(e) => onValueChange([Number(e.target.value)])}\r\n className={`w-full h-2 bg-gray-200 rounded-lg appearance-none cursor-pointer accent-blue-600 ${className}`}\r\n />\r\n );\r\n}","import { toast } from \"react-toastify\";\r\n\r\nexport function useToast() {\r\n return {\r\n toast: ({ title, description, variant } = {}) => {\r\n const message = description ? `${title}: ${description}` : title;\r\n if (variant === \"destructive\") {\r\n toast.error(message, { autoClose: 4000 });\r\n } else {\r\n toast.success(message, { autoClose: 3000 });\r\n }\r\n },\r\n };\r\n}","\"use client\";\r\n\r\nimport React, { useEffect, useState, useRef, useCallback } from \"react\";\r\n\r\nexport const CurveTool = ({\r\n active,\r\n canvasRef,\r\n onFinishCurve,\r\n setActiveTool,\r\n currentColor,\r\n strokeStyle,\r\n brushSize,\r\n createAction,\r\n addAction,\r\n replayManager,\r\n historyState,\r\n}) => {\r\n const [curves, setCurves] = useState([]);\r\n const [currentCurve, setCurrentCurve] = useState([]);\r\n const [selectedCurveIndex, setSelectedCurveIndex] = useState(null);\r\n const [dragging, setDragging] = useState(null);\r\n const [mousePos, setMousePos] = useState(null);\r\n const [drawing, setDrawing] = useState(false);\r\n\r\n // Group all dynamic states inside a ref to ensure stable event bindings\r\n const stateRef = useRef({\r\n drawing: false,\r\n currentCurve,\r\n currentColor,\r\n brushSize,\r\n strokeStyle,\r\n curves,\r\n dragging,\r\n selectedCurveIndex,\r\n historyState,\r\n replayManager,\r\n });\r\n\r\n // Keep ref up-to-date with current states\r\n useEffect(() => {\r\n stateRef.current = {\r\n drawing,\r\n currentCurve,\r\n currentColor,\r\n brushSize,\r\n strokeStyle,\r\n curves,\r\n dragging,\r\n selectedCurveIndex,\r\n historyState,\r\n replayManager,\r\n };\r\n }, [\r\n drawing,\r\n currentCurve,\r\n currentColor,\r\n brushSize,\r\n strokeStyle,\r\n curves,\r\n dragging,\r\n selectedCurveIndex,\r\n historyState,\r\n replayManager,\r\n ]);\r\n\r\n // Helper to get coordinates for both Mouse and Touch\r\n const getPointerPos = (e) => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return { x: 0, y: 0 };\r\n const rect = canvas.getBoundingClientRect();\r\n\r\n // Handle touch vs mouse\r\n const clientX = e.touches ? e.touches[0].clientX : e.clientX;\r\n const clientY = e.touches ? e.touches[0].clientY : e.clientY;\r\n\r\n return {\r\n x: (clientX - rect.left) * (canvas.width / rect.width),\r\n y: (clientY - rect.top) * (canvas.height / rect.height),\r\n };\r\n };\r\n\r\n const drawBezier = (ctx, points, color, size, style) => {\r\n if (points.length < 2) return;\r\n ctx.beginPath();\r\n ctx.moveTo(points[0].x, points[0].y);\r\n\r\n for (let i = 0; i < points.length - 1; i++) {\r\n const p0 = points[i - 1] || points[i];\r\n const p1 = points[i];\r\n const p2 = points[i + 1];\r\n const p3 = points[i + 2] || p2;\r\n\r\n const cp1x = p1.x + (p2.x - p0.x) / 6;\r\n const cp1y = p1.y + (p2.y - p0.y) / 6;\r\n const cp2x = p2.x - (p3.x - p1.x) / 6;\r\n const cp2y = p2.y - (p3.y - p1.y) / 6;\r\n\r\n ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, p2.x, p2.y);\r\n }\r\n\r\n ctx.strokeStyle = color;\r\n ctx.lineWidth = size;\r\n ctx.lineCap = \"round\";\r\n ctx.lineJoin = \"round\";\r\n\r\n if (style === \"dashed\") ctx.setLineDash([size * 3, size * 2]);\r\n else if (style === \"dotted\") ctx.setLineDash([size, size]);\r\n else ctx.setLineDash([]);\r\n\r\n ctx.stroke();\r\n ctx.setLineDash([]);\r\n };\r\n\r\n const draw = useCallback(() => {\r\n const canvas = canvasRef.current;\r\n const ctx = canvas?.getContext(\"2d\");\r\n if (!canvas || !ctx) return;\r\n\r\n const {\r\n curves: localCurves,\r\n currentCurve: currCurve,\r\n drawing: isDrawing,\r\n selectedCurveIndex: selIdx,\r\n currentColor: color,\r\n brushSize: size,\r\n strokeStyle: style,\r\n historyState: hist,\r\n replayManager: replay,\r\n } = stateRef.current;\r\n\r\n // Clear and redraw background history\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n if (replay?.current) {\r\n const drawingActions = hist?.actions?.filter(\r\n (a) => a.target === \"drawing\",\r\n );\r\n drawingActions?.forEach((a) => replay.current.applyDrawingAction(a));\r\n }\r\n\r\n // Draw finished curves (local state)\r\n localCurves.forEach((curve, idx) => {\r\n drawBezier(ctx, curve, color, size, style);\r\n if (selIdx === idx) {\r\n curve.forEach((pt) => {\r\n ctx.beginPath();\r\n ctx.arc(pt.x, pt.y, 5, 0, 2 * Math.PI);\r\n ctx.fillStyle = color;\r\n ctx.fill();\r\n });\r\n }\r\n });\r\n\r\n // Draw curve currently being created\r\n if (isDrawing && currCurve.length > 0) {\r\n const previewPoints = [...currCurve];\r\n if (mousePos) previewPoints.push(mousePos);\r\n drawBezier(ctx, previewPoints, color, size, style);\r\n\r\n // Dash line to current mouse position\r\n const lastPoint = currCurve[currCurve.length - 1];\r\n if (mousePos) {\r\n ctx.beginPath();\r\n ctx.moveTo(lastPoint.x, lastPoint.y);\r\n ctx.lineTo(mousePos.x, mousePos.y);\r\n ctx.strokeStyle = color;\r\n ctx.setLineDash([5, 5]);\r\n ctx.stroke();\r\n }\r\n }\r\n }, [canvasRef, mousePos]);\r\n\r\n useEffect(() => {\r\n draw();\r\n }, [draw]);\r\n\r\n const handleFinish = useCallback(() => {\r\n const {\r\n currentCurve: currCurve,\r\n currentColor: color,\r\n brushSize: size,\r\n strokeStyle: style,\r\n } = stateRef.current;\r\n\r\n if (currCurve.length > 1) {\r\n const action = createAction(\"drawing\", \"DRAW_CURVE\", {\r\n points: currCurve,\r\n color,\r\n strokeWidth: size,\r\n strokeStyle: style,\r\n });\r\n addAction(action);\r\n\r\n // Local cleanups\r\n setCurrentCurve([]);\r\n setDrawing(false);\r\n setActiveTool(null); // This safely unmounts the tool\r\n }\r\n }, [addAction, createAction, setActiveTool]);\r\n\r\n const handleStart = (e) => {\r\n if (e.type === \"touchstart\") e.preventDefault();\r\n\r\n const pos = getPointerPos(e);\r\n const {\r\n drawing: isDrawing,\r\n currentCurve: currCurve,\r\n curves: localCurves,\r\n } = stateRef.current;\r\n\r\n if (isDrawing) {\r\n // Tap-to-Finalize: Tap very close to the last point to save curve immediately\r\n const lastPt = currCurve[currCurve.length - 1];\r\n if (lastPt && Math.hypot(lastPt.x - pos.x, lastPt.y - pos.y) < 22) {\r\n handleFinish();\r\n return;\r\n }\r\n setCurrentCurve((prev) => [...prev, pos]);\r\n return;\r\n }\r\n\r\n // Hit testing for existing points\r\n const hitIdx = localCurves.findIndex((c) =>\r\n c.some((pt) => Math.hypot(pt.x - pos.x, pt.y - pos.y) < 15),\r\n );\r\n if (hitIdx !== -1) {\r\n setSelectedCurveIndex(hitIdx);\r\n const ptIdx = localCurves[hitIdx].findIndex(\r\n (pt) => Math.hypot(pt.x - pos.x, pt.y - pos.y) < 15,\r\n );\r\n setDragging(ptIdx);\r\n return;\r\n }\r\n\r\n setDrawing(true);\r\n setCurrentCurve([pos]);\r\n };\r\n\r\n const handleMove = (e) => {\r\n const pos = getPointerPos(e);\r\n setMousePos(pos);\r\n\r\n const {\r\n dragging: dragIdx,\r\n selectedCurveIndex: selIdx,\r\n curves: localCurves,\r\n } = stateRef.current;\r\n if (dragIdx !== null && selIdx !== null) {\r\n const newCurves = [...localCurves];\r\n newCurves[selIdx][dragIdx] = pos;\r\n setCurves(newCurves);\r\n }\r\n };\r\n\r\n const handleEnd = () => {\r\n setDragging(null);\r\n };\r\n\r\n // Safe Unmount Auto-Commit Effect: Saves progress instantly when user changes active tools\r\n useEffect(() => {\r\n return () => {\r\n const {\r\n currentCurve: currCurve,\r\n currentColor: color,\r\n brushSize: size,\r\n strokeStyle: style,\r\n } = stateRef.current;\r\n\r\n if (currCurve && currCurve.length > 1) {\r\n const action = createAction(\"drawing\", \"DRAW_CURVE\", {\r\n points: currCurve,\r\n color,\r\n strokeWidth: size,\r\n strokeStyle: style,\r\n });\r\n // Defer dispatch briefly to prevent React commit conflicts\r\n setTimeout(() => {\r\n addAction(action);\r\n }, 0);\r\n }\r\n };\r\n }, [addAction, createAction]);\r\n\r\n useEffect(() => {\r\n if (!active) return;\r\n const canvas = canvasRef.current;\r\n if (!canvas) return;\r\n\r\n canvas.addEventListener(\"mousedown\", handleStart);\r\n canvas.addEventListener(\"mousemove\", handleMove);\r\n canvas.addEventListener(\"mouseup\", handleEnd);\r\n canvas.addEventListener(\"touchstart\", handleStart, { passive: false });\r\n canvas.addEventListener(\"touchmove\", handleMove, { passive: false });\r\n canvas.addEventListener(\"touchend\", handleEnd);\r\n\r\n const handleKey = (e) => {\r\n if (e.key === \"Enter\") handleFinish();\r\n if (e.key === \"Escape\") {\r\n setDrawing(false);\r\n setCurrentCurve([]);\r\n }\r\n };\r\n window.addEventListener(\"keydown\", handleKey);\r\n\r\n return () => {\r\n canvas.removeEventListener(\"mousedown\", handleStart);\r\n canvas.removeEventListener(\"mousemove\", handleMove);\r\n canvas.removeEventListener(\"mouseup\", handleEnd);\r\n canvas.removeEventListener(\"touchstart\", handleStart);\r\n canvas.removeEventListener(\"touchmove\", handleMove);\r\n canvas.removeEventListener(\"touchend\", handleEnd);\r\n window.removeEventListener(\"keydown\", handleKey);\r\n };\r\n }, [active, canvasRef]); // Runs once on mounting/activation\r\n\r\n return null;\r\n};\r\n","\"use client\";\r\n\r\nimport React, { useEffect, useState, useCallback, useRef } from \"react\";\r\n\r\nconst CurveArrowTool = ({\r\n active,\r\n canvasRef,\r\n onFinishCurve,\r\n currentColor,\r\n strokeStyle,\r\n brushSize,\r\n addAction,\r\n replayManager,\r\n historyState,\r\n}) => {\r\n const [drawing, setDrawing] = useState(false);\r\n const curveRef = useRef([]);\r\n const requestRef = useRef();\r\n\r\n // Unified ref keeps config fresh without thrashing canvas listeners\r\n const stateRef = useRef({\r\n drawing: false,\r\n currentColor,\r\n strokeStyle,\r\n brushSize,\r\n historyState,\r\n replayManager,\r\n });\r\n\r\n // Keep stateRef in sync whenever drawing configs or history update\r\n useEffect(() => {\r\n stateRef.current = {\r\n drawing,\r\n currentColor,\r\n strokeStyle,\r\n brushSize,\r\n historyState,\r\n replayManager,\r\n };\r\n }, [\r\n drawing,\r\n currentColor,\r\n strokeStyle,\r\n brushSize,\r\n historyState,\r\n replayManager,\r\n ]);\r\n\r\n // Helper to draw the arrowhead\r\n const drawArrowHead = (ctx, from, to, size, color) => {\r\n const headLength = Math.max(10, size * 2.5);\r\n const angle = Math.atan2(to.y - from.y, to.x - from.x);\r\n ctx.save();\r\n ctx.strokeStyle = color;\r\n ctx.fillStyle = color;\r\n ctx.lineWidth = Math.max(1.5, size * 0.9);\r\n ctx.lineCap = \"round\";\r\n ctx.lineJoin = \"round\";\r\n ctx.beginPath();\r\n ctx.moveTo(\r\n to.x - headLength * Math.cos(angle - Math.PI / 6),\r\n to.y - headLength * Math.sin(angle - Math.PI / 6),\r\n );\r\n ctx.lineTo(to.x, to.y);\r\n ctx.lineTo(\r\n to.x - headLength * Math.cos(angle + Math.PI / 6),\r\n to.y - headLength * Math.sin(angle + Math.PI / 6),\r\n );\r\n ctx.stroke();\r\n ctx.restore();\r\n };\r\n\r\n const renderCanvas = useCallback(() => {\r\n const canvas = canvasRef.current;\r\n const ctx = canvas?.getContext(\"2d\");\r\n if (!canvas || !ctx) return;\r\n\r\n const {\r\n currentColor: color,\r\n brushSize: size,\r\n strokeStyle: style,\r\n historyState: hist,\r\n replayManager: replay,\r\n } = stateRef.current;\r\n\r\n // 1. Clear context for fresh rendering\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n // 2. Replay persistent history state\r\n if (replay?.current && hist?.actions) {\r\n const drawingActions = hist.actions.filter((a) => a.target === \"drawing\");\r\n drawingActions.forEach((a) => replay.current.applyDrawingAction(a));\r\n }\r\n\r\n // 3. Render current active curve stroke\r\n const pts = curveRef.current;\r\n if (pts.length >= 2) {\r\n ctx.save();\r\n ctx.beginPath();\r\n ctx.moveTo(pts[0].x, pts[0].y);\r\n\r\n const start = pts[0];\r\n const end = pts[pts.length - 1];\r\n const mid =\r\n pts.length === 3\r\n ? pts[1]\r\n : { x: (start.x + end.x) / 2, y: (start.y + end.y) / 2 };\r\n\r\n ctx.quadraticCurveTo(mid.x, mid.y, end.x, end.y);\r\n\r\n ctx.strokeStyle = color;\r\n ctx.lineWidth = size;\r\n ctx.lineCap = \"round\";\r\n ctx.lineJoin = \"round\";\r\n\r\n if (style === \"dashed\") ctx.setLineDash([size * 3, size * 2]);\r\n else if (style === \"dotted\") ctx.setLineDash([size, size]);\r\n else ctx.setLineDash([]);\r\n\r\n ctx.stroke();\r\n ctx.setLineDash([]);\r\n\r\n // Render arrowheads on both ends\r\n drawArrowHead(ctx, mid, end, size, color);\r\n drawArrowHead(ctx, mid, start, size, color);\r\n ctx.restore();\r\n }\r\n }, [canvasRef]);\r\n\r\n // Handle external redraws during history mutations (e.g. undo/redo)\r\n useEffect(() => {\r\n if (active) renderCanvas();\r\n }, [historyState, active, renderCanvas]);\r\n\r\n const getEventPos = (e) => {\r\n const canvas = canvasRef.current;\r\n const rect = canvas.getBoundingClientRect();\r\n const clientX = e.touches ? e.touches[0].clientX : e.clientX;\r\n const clientY = e.touches ? e.touches[0].clientY : e.clientY;\r\n return {\r\n x: (clientX - rect.left) * (canvas.width / rect.width),\r\n y: (clientY - rect.top) * (canvas.height / rect.height),\r\n };\r\n };\r\n\r\n const handleStart = (e) => {\r\n if (!active) return;\r\n if (e.touches && e.touches.length > 1) return;\r\n\r\n const pos = getEventPos(e);\r\n curveRef.current = [pos, pos];\r\n setDrawing(true);\r\n };\r\n\r\n const handleMove = (e) => {\r\n if (!stateRef.current.drawing) return;\r\n if (e.cancelable) e.preventDefault();\r\n\r\n const pos = getEventPos(e);\r\n const start = curveRef.current[0];\r\n if (!start) return;\r\n\r\n // Generate midpoint arc offset\r\n const midPoint = {\r\n x: (start.x + pos.x) / 2 + (pos.y - start.y) * 0.15,\r\n y: (start.y + pos.y) / 2 - (pos.x - start.x) * 0.15,\r\n };\r\n\r\n curveRef.current = [start, midPoint, pos];\r\n\r\n if (requestRef.current) cancelAnimationFrame(requestRef.current);\r\n requestRef.current = requestAnimationFrame(renderCanvas);\r\n };\r\n\r\n const handleEnd = () => {\r\n if (!stateRef.current.drawing) return;\r\n setDrawing(false);\r\n cancelAnimationFrame(requestRef.current);\r\n\r\n if (curveRef.current.length >= 2) {\r\n const {\r\n currentColor: color,\r\n brushSize: size,\r\n strokeStyle: style,\r\n } = stateRef.current;\r\n\r\n const action = {\r\n target: \"drawing\",\r\n type: \"DRAW_CURVE_ARROW\",\r\n payload: {\r\n points: [...curveRef.current],\r\n color,\r\n strokeWidth: size,\r\n strokeStyle: style,\r\n },\r\n };\r\n addAction(action);\r\n if (onFinishCurve) onFinishCurve(curveRef.current);\r\n }\r\n curveRef.current = [];\r\n };\r\n\r\n useEffect(() => {\r\n if (!active) return;\r\n const canvas = canvasRef.current;\r\n if (!canvas) return;\r\n\r\n // Tap/touch triggers inside the viewport canvas bounds\r\n canvas.addEventListener(\"mousedown\", handleStart);\r\n canvas.addEventListener(\"touchstart\", handleStart, { passive: false });\r\n\r\n // Track move, finish, or gesture drop on the global context to avoid getting stuck\r\n window.addEventListener(\"mousemove\", handleMove, { passive: false });\r\n window.addEventListener(\"mouseup\", handleEnd);\r\n window.addEventListener(\"touchmove\", handleMove, { passive: false });\r\n window.addEventListener(\"touchend\", handleEnd);\r\n window.addEventListener(\"touchcancel\", handleEnd);\r\n\r\n return () => {\r\n canvas.removeEventListener(\"mousedown\", handleStart);\r\n canvas.removeEventListener(\"touchstart\", handleStart);\r\n\r\n window.removeEventListener(\"mousemove\", handleMove);\r\n window.removeEventListener(\"mouseup\", handleEnd);\r\n window.removeEventListener(\"touchmove\", handleMove);\r\n window.removeEventListener(\"touchend\", handleEnd);\r\n window.removeEventListener(\"touchcancel\", handleEnd);\r\n };\r\n }, [active, canvasRef]);\r\n\r\n return null;\r\n};\r\n\r\nexport default CurveArrowTool;\r\n","\"use client\";\r\n\r\nimport React, { useState, useRef, useCallback } from \"react\";\r\nimport {\r\n X,\r\n Download,\r\n Crop,\r\n Sticker,\r\n Type,\r\n Pencil,\r\n Undo2,\r\n Check,\r\n Square,\r\n Circle,\r\n ArrowRight,\r\n ArrowRightLeft,\r\n} from \"lucide-react\";\r\n\r\nconst TOOLBAR_HEIGHT = \"56px\"; // fixed on every level — canvas never resizes\r\n\r\nconst MobileView = ({\r\n historyState,\r\n flattenLayers,\r\n undo,\r\n canUndo,\r\n activeTool,\r\n setActiveTool,\r\n handleToolChange,\r\n drawingCanvasRef,\r\n currentColor,\r\n setCurrentColor,\r\n brushSize,\r\n setBrushSize,\r\n minBrushSize,\r\n maxBrushSize,\r\n cropArea,\r\n setCropArea,\r\n applyCrop,\r\n konvaRectRef,\r\n konvaCircleRef,\r\n konvaArrowRef,\r\n konvaDoubleArrowRef,\r\n textEditorRef,\r\n downloadImage,\r\n handleSave,\r\n handleCancel,\r\n isTextDragging,\r\n textColor,\r\n setTextColor,\r\n textBgColor,\r\n cycleTextBg,\r\n}) => {\r\n const [level, setLevel] = useState(null); // null | \"pencil\" | \"text\" | \"crop\" | \"sticker\"\r\n\r\n const sessionFloorRef = useRef(-1);\r\n const scopedCanUndo =\r\n canUndo && historyState.currentStep > sessionFloorRef.current;\r\n\r\n const cropHistoryRef = useRef([]);\r\n const prevCropAreaRef = useRef(null);\r\n React.useEffect(() => {\r\n if (level === \"crop\") {\r\n cropHistoryRef.current.push(prevCropAreaRef.current);\r\n }\r\n prevCropAreaRef.current = cropArea;\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [cropArea]);\r\n\r\n const enterLevel = (nextLevel, tool) => {\r\n sessionFloorRef.current = historyState.currentStep;\r\n cropHistoryRef.current = [];\r\n prevCropAreaRef.current = null;\r\n if (tool) handleToolChange(tool);\r\n setLevel(nextLevel);\r\n };\r\n\r\n const backToLevel1 = () => {\r\n setActiveTool(null);\r\n setLevel(null);\r\n };\r\n\r\n const confirmPencil = () => {\r\n flattenLayers();\r\n backToLevel1();\r\n };\r\n\r\n const confirmText = () => backToLevel1();\r\n\r\n const confirmSticker = () => {\r\n konvaRectRef.current?.flatten();\r\n konvaCircleRef.current?.flatten();\r\n konvaArrowRef.current?.flatten();\r\n konvaDoubleArrowRef.current?.flatten();\r\n flattenLayers();\r\n backToLevel1();\r\n };\r\n\r\n const confirmCrop = () => {\r\n applyCrop();\r\n setLevel(null);\r\n };\r\n\r\n const discardCrop = () => {\r\n setCropArea(null);\r\n const ctx = drawingCanvasRef.current?.getContext(\"2d\");\r\n if (ctx) ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);\r\n backToLevel1();\r\n };\r\n\r\n const barClass =\r\n \"flex items-center justify-between px-3 w-full flex-shrink-0\";\r\n const barStyle = { height: TOOLBAR_HEIGHT };\r\n\r\n return (\r\n <div className=\"lg:hidden flex flex-col w-full bg-black text-white\">\r\n {/* ── Level 1 ──────────────────────────────────────────────────────── */}\r\n {level === null && (\r\n <div\r\n className={barClass}\r\n style={{\r\n ...barStyle,\r\n opacity: isTextDragging ? 0 : 1,\r\n pointerEvents: isTextDragging ? \"none\" : \"auto\",\r\n }}\r\n >\r\n <button onClick={handleCancel} title=\"Discard\">\r\n <X className=\"h-5 w-5\" />\r\n </button>\r\n\r\n <div className=\"flex items-center gap-5\">\r\n <button onClick={downloadImage} title=\"Download\">\r\n <Download className=\"h-5 w-5\" />\r\n </button>\r\n <button onClick={() => enterLevel(\"crop\", \"crop\")} title=\"Crop\">\r\n <Crop className=\"h-5 w-5\" />\r\n </button>\r\n <button\r\n onClick={() => enterLevel(\"sticker\", \"rectangle\")}\r\n title=\"Sticker\"\r\n >\r\n <Sticker className=\"h-5 w-5\" />\r\n </button>\r\n <button onClick={() => enterLevel(\"text\", \"text\")} title=\"Text\">\r\n <Type className=\"h-5 w-5\" />\r\n </button>\r\n <button\r\n onClick={() => enterLevel(\"pencil\", \"pencil\")}\r\n title=\"Pencil\"\r\n >\r\n <Pencil className=\"h-5 w-5\" />\r\n </button>\r\n <button\r\n onClick={handleSave}\r\n title=\"Send\"\r\n className=\"bg-green-700 p-1 rounded-full\"\r\n >\r\n <Check className=\"h-5 w-5 text-white-400 font-bold\" />\r\n </button>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* ── Level 2: Pencil ──────────────────────────────────────────────── */}\r\n {level === \"pencil\" && (\r\n <div className={barClass} style={barStyle}>\r\n <div className=\"flex items-center gap-3\">\r\n <button onClick={confirmPencil} title=\"Confirm\">\r\n <Check className=\"h-5 w-5 text-green-400\" />\r\n </button>\r\n <button\r\n onClick={undo}\r\n disabled={!scopedCanUndo}\r\n className=\"disabled:opacity-30\"\r\n title=\"Undo\"\r\n >\r\n <Undo2 className=\"h-5 w-5\" />\r\n </button>\r\n </div>\r\n <div className=\"flex items-center gap-3\">\r\n <span className=\"text-xs opacity-70 whitespace-nowrap\">\r\n {brushSize}px\r\n </span>\r\n <input\r\n type=\"range\"\r\n min={minBrushSize}\r\n max={maxBrushSize}\r\n step={1}\r\n value={brushSize}\r\n onChange={(e) => setBrushSize(Number(e.target.value))}\r\n className=\"w-20 accent-white\"\r\n />\r\n <label\r\n className=\"relative w-6 h-6 rounded-full flex-shrink-0 cursor-pointer overflow-hidden\"\r\n style={{\r\n background: currentColor,\r\n border: \"2px solid rgba(255,255,255,0.7)\",\r\n boxShadow: \"0 1px 4px rgba(0,0,0,0.6)\",\r\n }}\r\n >\r\n <input\r\n type=\"color\"\r\n value={currentColor}\r\n onChange={(e) => setCurrentColor(e.target.value)}\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n opacity: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n cursor: \"pointer\",\r\n border: \"none\",\r\n padding: 0,\r\n }}\r\n />\r\n </label>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* ── Level 2: Text ────────────────────────────────────────────────── */}\r\n {level === \"text\" && (\r\n <div\r\n className={barClass}\r\n style={{\r\n ...barStyle,\r\n opacity: isTextDragging ? 0 : 1,\r\n pointerEvents: isTextDragging ? \"none\" : \"auto\",\r\n }}\r\n >\r\n <button onClick={confirmText} title=\"Confirm\">\r\n <Check className=\"h-5 w-5 text-green-400\" />\r\n </button>\r\n\r\n <div className=\"flex items-center gap-3\">\r\n <button\r\n onClick={cycleTextBg}\r\n title=\"Text background\"\r\n className=\"relative w-7 h-7 rounded-md flex items-center justify-center flex-shrink-0\"\r\n style={{\r\n background:\r\n textBgColor === \"transparent\"\r\n ? \"repeating-conic-gradient(#666 0% 25%, #333 0% 50%) 50% / 8px 8px\"\r\n : textBgColor,\r\n border: \"2px solid rgba(255,255,255,0.7)\",\r\n }}\r\n >\r\n <span\r\n className=\"text-xs font-semibold\"\r\n style={{\r\n color:\r\n textBgColor === \"#ffffff\"\r\n ? \"#000\"\r\n : textBgColor === \"transparent\"\r\n ? \"#fff\"\r\n : \"#fff\",\r\n }}\r\n >\r\n A\r\n </span>\r\n </button>\r\n\r\n <label\r\n className=\"relative w-6 h-6 rounded-full flex-shrink-0 cursor-pointer overflow-hidden\"\r\n style={{\r\n background: textColor,\r\n border: \"2px solid rgba(255,255,255,0.7)\",\r\n boxShadow: \"0 1px 4px rgba(0,0,0,0.6)\",\r\n }}\r\n >\r\n <input\r\n type=\"color\"\r\n value={textColor}\r\n onChange={(e) => setTextColor(e.target.value)}\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n opacity: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n cursor: \"pointer\",\r\n border: \"none\",\r\n padding: 0,\r\n }}\r\n />\r\n </label>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* ── Level 2: Crop ────────────────────────────────────────────────── */}\r\n {level === \"crop\" && (\r\n <div className={barClass} style={barStyle}>\r\n <button onClick={confirmCrop} disabled={!cropArea} title=\"Confirm\">\r\n <Check\r\n className={`h-5 w-5 ${cropArea ? \"text-green-400\" : \"text-gray-500\"}`}\r\n />\r\n </button>\r\n <button\r\n onClick={discardCrop}\r\n className=\"text-sm opacity-80\"\r\n title=\"Discard\"\r\n >\r\n Discard\r\n </button>\r\n </div>\r\n )}\r\n\r\n {/* ── Level 2: Sticker ─────────────────────────────────────────────── */}\r\n {level === \"sticker\" && (\r\n <div className={barClass} style={barStyle}>\r\n <div className=\"flex items-center gap-3\">\r\n <button onClick={confirmSticker} title=\"Confirm\">\r\n <Check className=\"h-5 w-5 text-green-400\" />\r\n </button>\r\n <button\r\n onClick={undo}\r\n disabled={!scopedCanUndo}\r\n className=\"disabled:opacity-30\"\r\n title=\"Undo\"\r\n >\r\n <Undo2 className=\"h-5 w-5\" />\r\n </button>\r\n </div>\r\n <div className=\"flex items-center gap-4\">\r\n {[\r\n [\"rectangle\", <Square className=\"h-5 w-5\" />],\r\n [\"circle\", <Circle className=\"h-5 w-5\" />],\r\n [\"arrow\", <ArrowRight className=\"h-5 w-5\" />],\r\n [\"double-arrow\", <ArrowRightLeft className=\"h-5 w-5\" />],\r\n ].map(([tool, icon]) => (\r\n <button\r\n key={tool}\r\n onClick={() => handleToolChange(tool)}\r\n className={`p-1 rounded ${activeTool === tool ? \"bg-white/20\" : \"\"}`}\r\n title={tool}\r\n >\r\n {icon}\r\n </button>\r\n ))}\r\n <label\r\n className=\"relative w-6 h-6 rounded-full flex-shrink-0 cursor-pointer overflow-hidden\"\r\n style={{\r\n background: currentColor,\r\n border: \"2px solid rgba(255,255,255,0.7)\",\r\n boxShadow: \"0 1px 4px rgba(0,0,0,0.6)\",\r\n }}\r\n >\r\n <input\r\n type=\"color\"\r\n value={currentColor}\r\n onChange={(e) => setCurrentColor(e.target.value)}\r\n style={{\r\n position: \"absolute\",\r\n inset: 0,\r\n opacity: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n cursor: \"pointer\",\r\n border: \"none\",\r\n padding: 0,\r\n }}\r\n />\r\n </label>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default MobileView;\r\n","\"use client\";\r\n\r\nimport { useState, useRef, useCallback, useEffect, useReducer } from \"react\";\r\nimport {\r\n applyDrawingAction,\r\n replayAllDrawingActions,\r\n} from \"@/utils/canvasReplay\";\r\n\r\nexport function useHistoryManager({ drawingCanvasRef, baseCanvasRef }) {\r\n // ── History stack ────────────────────────────────────────────────────────\r\n // Stored in refs so addAction / undo / redo never have stale-closure issues.\r\n const allActionsRef = useRef([]); // full stack including redo-able future\r\n const currentStepRef = useRef(-1); // index of last committed action (-1 = empty)\r\n\r\n // Trigger re-renders when refs mutate (canUndo / canRedo / actionCount updates)\r\n const [, forceUpdate] = useReducer((x) => x + 1, 0);\r\n\r\n // ── Konva element arrays (owned here, passed as props to Konva components) ─\r\n const [rectangles, setRectangles] = useState([]);\r\n const [circles, setCircles] = useState([]);\r\n const [arrows, setArrows] = useState([]);\r\n const [doubleArrows, setDoubleArrows] = useState([]);\r\n const [texts, setTexts] = useState([]);\r\n\r\n // ── Konva component imperative refs (for flatten() on Save) ──────────────\r\n const konvaRectRef = useRef(null);\r\n const konvaCircleRef = useRef(null);\r\n const konvaArrowRef = useRef(null);\r\n const konvaDoubleArrowRef = useRef(null);\r\n const textEditorRef = useRef(null);\r\n\r\n // ── Replay manager ref ────────────────────────────────────────────────────\r\n const replayManager = useRef({\r\n applyDrawingAction: () => {},\r\n });\r\n\r\n useEffect(() => {\r\n replayManager.current = {\r\n applyDrawingAction: (action) => {\r\n const canvas = drawingCanvasRef.current;\r\n const ctx = canvas?.getContext(\"2d\");\r\n if (ctx) applyDrawingAction(ctx, action);\r\n },\r\n };\r\n }, [drawingCanvasRef]);\r\n\r\n // ── Internal: replay drawing canvas to a given step ──────────────────────\r\n const replayDrawingCanvas = useCallback(\r\n (all, step) => {\r\n const canvas = drawingCanvasRef.current;\r\n if (!canvas) return;\r\n // replayAllDrawingActions clears first, then replays every DRAW_* action\r\n replayAllDrawingActions(canvas, all.slice(0, step + 1));\r\n },\r\n [drawingCanvasRef],\r\n );\r\n\r\n // ── Internal: derive Konva arrays from the action log up to `step` ────────\r\n // This is the single source of truth for Konva state.\r\n // Handles ADD, MOVE, and DELETE actions for all element types.\r\n const deriveKonvaState = useCallback((all, step) => {\r\n const rectMap = new Map();\r\n const circMap = new Map();\r\n const arrowMap = new Map();\r\n const dblMap = new Map();\r\n const textMap = new Map();\r\n\r\n all\r\n .slice(0, step + 1)\r\n .filter((a) => a.target === \"konva\")\r\n .forEach(({ type, payload }) => {\r\n if (!payload) return;\r\n const { elementType, elementId, data } = payload;\r\n\r\n switch (type) {\r\n case \"ADD_RECTANGLE\":\r\n rectMap.set(data.id, data);\r\n break;\r\n case \"ADD_CIRCLE\":\r\n circMap.set(data.id, data);\r\n break;\r\n case \"ADD_ARROW\":\r\n arrowMap.set(data.id, data);\r\n break;\r\n case \"ADD_DOUBLE_ARROW\":\r\n dblMap.set(data.id, data);\r\n break;\r\n case \"ADD_TEXT\":\r\n textMap.set(data.id, data);\r\n break;\r\n case \"MOVE_ELEMENT\": {\r\n const map = {\r\n rectangle: rectMap,\r\n circle: circMap,\r\n arrow: arrowMap,\r\n \"double-arrow\": dblMap,\r\n text: textMap,\r\n }[elementType];\r\n if (map?.has(elementId)) {\r\n map.set(elementId, { ...map.get(elementId), ...data });\r\n }\r\n break;\r\n }\r\n case \"DELETE_ELEMENT\":\r\n [rectMap, circMap, arrowMap, dblMap, textMap].forEach((m) =>\r\n m.delete(elementId),\r\n );\r\n break;\r\n }\r\n });\r\n\r\n return {\r\n rects: [...rectMap.values()],\r\n circs: [...circMap.values()],\r\n arrs: [...arrowMap.values()],\r\n dblArrs: [...dblMap.values()],\r\n txts: [...textMap.values()],\r\n };\r\n }, []);\r\n\r\n // Push derived Konva state into React state\r\n const syncKonvaState = useCallback(\r\n (all, step) => {\r\n const { rects, circs, arrs, dblArrs, txts } = deriveKonvaState(all, step);\r\n setRectangles(rects);\r\n setCircles(circs);\r\n setArrows(arrs);\r\n setDoubleArrows(dblArrs);\r\n setTexts(txts);\r\n },\r\n [deriveKonvaState],\r\n );\r\n\r\n // ── Internal: undo a single base-canvas action ────────────────────────────\r\n const undoBaseAction = useCallback(\r\n (action) => {\r\n const canvas = baseCanvasRef.current;\r\n const ctx = canvas?.getContext(\"2d\");\r\n if (!canvas || !ctx) return;\r\n\r\n if (action.type === \"APPLY_FILTER\") {\r\n const id = action.payload?.previousImageData;\r\n if (id) ctx.putImageData(id, 0, 0);\r\n }\r\n if (action.type === \"CROP_IMAGE\") {\r\n // Restore pre-crop canvas (dimensions may differ)\r\n const id = action.payload?.imageData;\r\n if (id) {\r\n canvas.width = id.width;\r\n canvas.height = id.height;\r\n ctx.putImageData(id, 0, 0);\r\n }\r\n }\r\n },\r\n [baseCanvasRef],\r\n );\r\n\r\n const redoBaseAction = useCallback(\r\n (action) => {\r\n const canvas = baseCanvasRef.current;\r\n const ctx = canvas?.getContext(\"2d\");\r\n if (!canvas || !ctx) return;\r\n\r\n if (action.type === \"APPLY_FILTER\") {\r\n const id = action.payload?.newImageData;\r\n if (id) ctx.putImageData(id, 0, 0);\r\n }\r\n // CROP_IMAGE redo: the crop was already applied; nothing to replay here\r\n // (re-applying would require re-running applyCrop logic)\r\n },\r\n [baseCanvasRef],\r\n );\r\n\r\n // ── Public API ────────────────────────────────────────────────────────────\r\n\r\n const createAction = useCallback(\r\n (target, type, payload) => ({\r\n id: `${target}-${type}-${Date.now()}-${Math.random().toString(36).slice(2)}`,\r\n target,\r\n type,\r\n payload,\r\n }),\r\n [],\r\n );\r\n\r\n const addAction = useCallback(\r\n (action) => {\r\n // Trim any redo-able future actions, then append\r\n const trimmed = allActionsRef.current.slice(\r\n 0,\r\n currentStepRef.current + 1,\r\n );\r\n const newAll = [...trimmed, action];\r\n const newStep = trimmed.length; // same as currentStep + 1\r\n\r\n allActionsRef.current = newAll;\r\n currentStepRef.current = newStep;\r\n\r\n // Drawing actions: synchronously clear + replay so there's no canvas flash\r\n if (action.target === \"drawing\") {\r\n replayDrawingCanvas(newAll, newStep);\r\n }\r\n\r\n // Konva actions: rebuild element arrays from history (authoritative)\r\n if (action.target === \"konva\") {\r\n syncKonvaState(newAll, newStep);\r\n }\r\n\r\n // Base actions (filters, crop): caller already mutated the canvas;\r\n // we only record here for undo/redo. No extra canvas work needed.\r\n\r\n forceUpdate(); // update canUndo / canRedo / actionCount in UI\r\n },\r\n [replayDrawingCanvas, syncKonvaState, forceUpdate],\r\n );\r\n\r\n const undo = useCallback(() => {\r\n const all = allActionsRef.current;\r\n if (currentStepRef.current < 0) return;\r\n\r\n const undoneAction = all[currentStepRef.current];\r\n const newStep = currentStepRef.current - 1;\r\n currentStepRef.current = newStep;\r\n\r\n if (undoneAction?.target === \"base\") undoBaseAction(undoneAction);\r\n\r\n replayDrawingCanvas(all, newStep);\r\n syncKonvaState(all, newStep);\r\n forceUpdate();\r\n }, [replayDrawingCanvas, syncKonvaState, undoBaseAction, forceUpdate]);\r\n\r\n const redo = useCallback(() => {\r\n const all = allActionsRef.current;\r\n if (currentStepRef.current >= all.length - 1) return;\r\n\r\n const newStep = currentStepRef.current + 1;\r\n const redoneAction = all[newStep];\r\n currentStepRef.current = newStep;\r\n\r\n if (redoneAction?.target === \"base\") redoBaseAction(redoneAction);\r\n\r\n replayDrawingCanvas(all, newStep);\r\n syncKonvaState(all, newStep);\r\n forceUpdate();\r\n }, [replayDrawingCanvas, syncKonvaState, redoBaseAction, forceUpdate]);\r\n\r\n // ── Derived values (computed from refs at render time) ───────────────────\r\n // Since forceUpdate() is called whenever refs mutate, these are always fresh.\r\n const historyState = {\r\n actions: allActionsRef.current.slice(0, currentStepRef.current + 1),\r\n currentStep: currentStepRef.current,\r\n };\r\n const canUndo = currentStepRef.current >= 0;\r\n const canRedo = currentStepRef.current < allActionsRef.current.length - 1;\r\n const actionCount = currentStepRef.current + 1;\r\n\r\n return {\r\n // History\r\n historyState,\r\n canUndo,\r\n canRedo,\r\n undo,\r\n redo,\r\n actionCount,\r\n addAction,\r\n createAction,\r\n // Canvas replay (used by ImageEditorModal during line preview)\r\n replayManager,\r\n // Konva element state\r\n rectangles,\r\n setRectangles,\r\n circles,\r\n setCircles,\r\n arrows,\r\n setArrows,\r\n doubleArrows,\r\n setDoubleArrows,\r\n texts,\r\n setTexts,\r\n // Konva imperative refs (used by handleSave to flatten before export)\r\n konvaRectRef,\r\n konvaCircleRef,\r\n konvaArrowRef,\r\n konvaDoubleArrowRef,\r\n textEditorRef,\r\n };\r\n}\r\n","const drawArrowHead = (ctx, from, to, size, color) => {\r\n const headLength = Math.max(10, size * 2.5);\r\n const angle = Math.atan2(to.y - from.y, to.x - from.x);\r\n\r\n ctx.save();\r\n ctx.strokeStyle = color;\r\n ctx.fillStyle = color;\r\n ctx.lineWidth = Math.max(1.5, size * 0.9);\r\n ctx.lineCap = \"round\";\r\n ctx.lineJoin = \"round\";\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(\r\n to.x - headLength * Math.cos(angle - Math.PI / 6),\r\n to.y - headLength * Math.sin(angle - Math.PI / 6),\r\n );\r\n ctx.lineTo(to.x, to.y);\r\n ctx.lineTo(\r\n to.x - headLength * Math.cos(angle + Math.PI / 6),\r\n to.y - headLength * Math.sin(angle + Math.PI / 6),\r\n );\r\n ctx.stroke();\r\n ctx.restore();\r\n};\r\n\r\nexport function applyDrawingAction(ctx, action) {\r\n if (!ctx || !action?.payload) return;\r\n\r\n const { type, payload } = action;\r\n ctx.save();\r\n\r\n // ── Pencil / Eraser ──────────────────────────────────────────────────────\r\n if (type === \"DRAW_PENCIL\" || type === \"DRAW_ERASER\") {\r\n const { points, color, strokeWidth, isEraser } = payload;\r\n if (!points?.length) {\r\n ctx.restore();\r\n return;\r\n }\r\n\r\n ctx.globalCompositeOperation = isEraser ? \"destination-out\" : \"source-over\";\r\n ctx.strokeStyle = color || \"#000000\";\r\n ctx.lineWidth = strokeWidth || 3;\r\n ctx.lineCap = \"round\";\r\n ctx.lineJoin = \"round\";\r\n ctx.setLineDash([]);\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(points[0].x, points[0].y);\r\n for (let i = 1; i < points.length; i++) {\r\n ctx.lineTo(points[i].x, points[i].y);\r\n }\r\n ctx.stroke();\r\n }\r\n\r\n // ── Straight line ────────────────────────────────────────────────────────\r\n if (type === \"DRAW_LINE\") {\r\n const { startPoint, endPoint, color, strokeWidth, strokeStyle } = payload;\r\n if (!startPoint || !endPoint) {\r\n ctx.restore();\r\n return;\r\n }\r\n\r\n ctx.globalCompositeOperation = \"source-over\";\r\n ctx.strokeStyle = color || \"#000000\";\r\n ctx.lineWidth = strokeWidth || 3;\r\n ctx.lineCap = \"round\";\r\n ctx.lineJoin = \"round\";\r\n\r\n switch (strokeStyle) {\r\n case \"dashed\":\r\n ctx.setLineDash([strokeWidth * 3, strokeWidth * 2]);\r\n break;\r\n case \"dotted\":\r\n ctx.setLineDash([strokeWidth, strokeWidth]);\r\n break;\r\n default:\r\n ctx.setLineDash([]);\r\n }\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(startPoint.x, startPoint.y);\r\n ctx.lineTo(endPoint.x, endPoint.y);\r\n ctx.stroke();\r\n }\r\n\r\n if (type === \"DRAW_CURVE\") {\r\n const { points, color, strokeWidth, strokeStyle } = payload;\r\n if (!points || points.length < 2) {\r\n ctx.restore();\r\n return;\r\n }\r\n\r\n ctx.globalCompositeOperation = \"source-over\";\r\n ctx.strokeStyle = color || \"#000000\";\r\n ctx.lineWidth = strokeWidth || 3;\r\n ctx.lineCap = \"round\";\r\n ctx.lineJoin = \"round\";\r\n\r\n switch (strokeStyle) {\r\n case \"dashed\":\r\n ctx.setLineDash([strokeWidth * 3, strokeWidth * 2]);\r\n break;\r\n case \"dotted\":\r\n ctx.setLineDash([strokeWidth, strokeWidth]);\r\n break;\r\n default:\r\n ctx.setLineDash([]);\r\n }\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(points[0].x, points[0].y);\r\n\r\n // Use the same Bezier logic as the Tool for consistency\r\n for (let i = 0; i < points.length - 1; i++) {\r\n const p0 = points[i - 1] || points[i];\r\n const p1 = points[i];\r\n const p2 = points[i + 1];\r\n const p3 = points[i + 2] || p2;\r\n\r\n const cp1x = p1.x + (p2.x - p0.x) / 6;\r\n const cp1y = p1.y + (p2.y - p0.y) / 6;\r\n const cp2x = p2.x - (p3.x - p1.x) / 6;\r\n const cp2y = p2.y - (p3.y - p1.y) / 6;\r\n\r\n ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, p2.x, p2.y);\r\n }\r\n ctx.stroke();\r\n }\r\n\r\n if (type === \"DRAW_CURVE_ARROW\") {\r\n const { points, color, strokeWidth, strokeStyle } = payload;\r\n if (!points || points.length < 2) {\r\n ctx.restore();\r\n return;\r\n }\r\n\r\n ctx.save();\r\n ctx.strokeStyle = color;\r\n ctx.lineWidth = strokeWidth;\r\n ctx.lineCap = \"round\";\r\n ctx.lineJoin = \"round\";\r\n\r\n // Dash Logic\r\n if (strokeStyle === \"dashed\")\r\n ctx.setLineDash([strokeWidth * 3, strokeWidth * 2]);\r\n else if (strokeStyle === \"dotted\")\r\n ctx.setLineDash([strokeWidth, strokeWidth]);\r\n else ctx.setLineDash([]);\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(points[0].x, points[0].y);\r\n\r\n if (points.length === 3) {\r\n // Matches the tool's MidPoint logic\r\n ctx.quadraticCurveTo(points[1].x, points[1].y, points[2].x, points[2].y);\r\n } else {\r\n ctx.lineTo(points[1].x, points[1].y); // Fallback for 2 points\r\n }\r\n ctx.stroke();\r\n ctx.setLineDash([]);\r\n\r\n // Draw arrow heads at BOTH ends\r\n const start = points[0];\r\n const end = points[points.length - 1];\r\n const mid =\r\n points.length === 3\r\n ? points[1]\r\n : { x: (start.x + end.x) / 2, y: (start.y + end.y) / 2 };\r\n\r\n drawArrowHead(ctx, mid, end, strokeWidth, color);\r\n drawArrowHead(ctx, mid, start, strokeWidth, color);\r\n ctx.restore();\r\n }\r\n\r\n ctx.restore();\r\n}\r\n\r\n/**\r\n * Clears the canvas then replays every drawing action in the provided list.\r\n * Call this with the slice of history up to the current step.\r\n */\r\nexport function replayAllDrawingActions(canvas, actions) {\r\n const ctx = canvas?.getContext(\"2d\");\r\n if (!canvas || !ctx) return;\r\n\r\n ctx.clearRect(0, 0, canvas.width, canvas.height);\r\n ctx.globalCompositeOperation = \"source-over\";\r\n\r\n actions\r\n .filter((a) => a.target === \"drawing\")\r\n .forEach((a) => applyDrawingAction(ctx, a));\r\n}\r\n","/**\r\n * ActionCreators Utility\r\n * Standardizes action payloads across the Canvas drawing timeline layers.\r\n * Supports freehand tracks, vector overlays, filters, and custom curves.\r\n */\r\nexport const ActionCreators = {\r\n // ── Vector Elements (Konva Layer) ──────────────────────────────────────────\r\n \r\n createKonvaAction: (type, elementId, elementType, data, previousData = null) => ({\r\n id: `action_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\r\n target: \"konva\",\r\n type,\r\n payload: {\r\n elementId,\r\n elementType,\r\n data,\r\n previousData,\r\n timestamp: Date.now()\r\n }\r\n }),\r\n\r\n // ── Standard Core Drawing Elements (Canvas Overlays) ───────────────────────\r\n\r\n drawFreehandPath: (points, color, brushSize, strokeStyle, tool = \"pencil\") => ({\r\n id: `action_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\r\n target: \"drawing\",\r\n type: \"ADD_FREEHAND_PATH\",\r\n payload: {\r\n tool,\r\n points, // Array of { x, y } coordinates\r\n color,\r\n size: brushSize,\r\n style: strokeStyle,\r\n timestamp: Date.now()\r\n }\r\n }),\r\n\r\n drawLine: (startPoint, endPoint, color, brushSize, strokeStyle) => ({\r\n id: `action_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\r\n target: \"drawing\",\r\n type: \"DRAW_LINE\",\r\n payload: {\r\n startPoint,\r\n endPoint,\r\n color,\r\n size: brushSize,\r\n style: strokeStyle,\r\n timestamp: Date.now()\r\n }\r\n }),\r\n\r\n // ── Spline & Bezier Elements (Curve Tracking Components) ──────────────────\r\n\r\n drawCurve: (points, color, brushSize, strokeStyle) => ({\r\n id: `action_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\r\n target: \"drawing\",\r\n type: \"DRAW_CURVE\",\r\n payload: {\r\n points, // Array of selected plot control vectors\r\n color,\r\n size: brushSize,\r\n style: strokeStyle,\r\n timestamp: Date.now()\r\n }\r\n }),\r\n\r\n drawCurveArrow: (points, color, brushSize, strokeStyle) => ({\r\n id: `action_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\r\n target: \"drawing\",\r\n type: \"DRAW_CURVE_ARROW\",\r\n payload: {\r\n points,\r\n color,\r\n size: brushSize,\r\n style: strokeStyle,\r\n timestamp: Date.now()\r\n }\r\n }),\r\n\r\n // ── Image Geometry Adjustments (Base Photograph Layer) ────────────────────\r\n\r\n cropImage: (cropArea, previousImageData) => ({\r\n id: `action_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\r\n target: \"base\",\r\n type: \"CROP_IMAGE\",\r\n payload: {\r\n cropArea, // Coordinates mapping spatial dimensions {x, y, width, height}\r\n imageData: previousImageData, // Cached array backup for undo rollbacks\r\n timestamp: Date.now()\r\n }\r\n }),\r\n\r\n // ── Pixel-Level Raster Filters (OpenCV Engine) ─────────────────────────────\r\n\r\n applyFilter: (filterType, previousImageData, nextImageData) => ({\r\n id: `action_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\r\n target: \"base\",\r\n type: \"APPLY_FILTER\",\r\n payload: {\r\n filterType, // \"blackAndWhite\" | \"pencilSketch\"\r\n prev: previousImageData, // Snapshots used by timeline managers to\r\n next: nextImageData, // hot-swap image buffers during history hops\r\n timestamp: Date.now()\r\n }\r\n })\r\n};\r\n\r\n","/**\n * @typedef {\n * | { kind: \"url\", url: string, name?: string }\n * | { kind: \"file\", file: File, name?: string }\n * | { kind: \"blob\", blob: Blob, name?: string }\n * | { kind: \"dataUrl\", dataUrl: string, name?: string }\n * } EditableImageSource\n */\n\n/**\n * Normalizes any EditableImageSource into something an <img>/canvas can load.\n *\n * - \"url\" -> passed through as-is (consumer's own remote/static URL)\n * - \"dataUrl\" -> passed through as-is (already a usable src)\n * - \"file\" -> wrapped in an object URL (must be revoked when done)\n * - \"blob\" -> wrapped in an object URL (must be revoked when done)\n *\n * @param {EditableImageSource | null | undefined} source\n * @returns {{ src: string | null, name: string | undefined, isObjectUrl: boolean, cleanup: () => void }}\n */\nexport function resolveImageSource(source) {\n const noop = () => {};\n\n if (!source) {\n return { src: null, name: undefined, isObjectUrl: false, cleanup: noop };\n }\n\n switch (source.kind) {\n case \"url\":\n if (!source.url) {\n throw new Error('resolveImageSource: \"url\" source is missing `url`');\n }\n return {\n src: source.url,\n name: source.name,\n isObjectUrl: false,\n cleanup: noop,\n };\n\n case \"dataUrl\":\n if (!source.dataUrl) {\n throw new Error(\n 'resolveImageSource: \"dataUrl\" source is missing `dataUrl`',\n );\n }\n return {\n src: source.dataUrl,\n name: source.name,\n isObjectUrl: false,\n cleanup: noop,\n };\n\n case \"file\": {\n if (!source.file) {\n throw new Error('resolveImageSource: \"file\" source is missing `file`');\n }\n const objectUrl = URL.createObjectURL(source.file);\n return {\n src: objectUrl,\n name: source.name || source.file.name,\n isObjectUrl: true,\n cleanup: () => URL.revokeObjectURL(objectUrl),\n };\n }\n\n case \"blob\": {\n if (!source.blob) {\n throw new Error('resolveImageSource: \"blob\" source is missing `blob`');\n }\n const objectUrl = URL.createObjectURL(source.blob);\n return {\n src: objectUrl,\n name: source.name,\n isObjectUrl: true,\n cleanup: () => URL.revokeObjectURL(objectUrl),\n };\n }\n\n default:\n throw new Error(\n `resolveImageSource: unknown source kind \"${source?.kind}\". ` +\n 'Expected one of \"url\" | \"file\" | \"blob\" | \"dataUrl\".',\n );\n }\n}\n\n/**\n * Produces a stable, comparable key for an EditableImageSource so callers can\n * use it as a `useEffect`/`useMemo` dependency without re-resolving (and\n * re-revoking) object URLs on every render just because a consumer passed a\n * fresh object literal.\n *\n * @param {EditableImageSource | null | undefined} source\n * @returns {string | null}\n */\nexport function getImageSourceKey(source) {\n if (!source) return null;\n switch (source.kind) {\n case \"url\":\n return `url:${source.url}`;\n case \"dataUrl\":\n // dataUrls can be long; length + a slice is enough to detect changes\n // without hashing the whole thing on every render.\n return `dataUrl:${source.dataUrl.length}:${source.dataUrl.slice(0, 64)}`;\n case \"file\":\n return `file:${source.file.name}:${source.file.size}:${source.file.lastModified}`;\n case \"blob\":\n return `blob:${source.blob.size}:${source.blob.type}`;\n default:\n return `unknown:${String(source.kind)}`;\n }\n}\n","/**\n * @typedef {{\n * blob: Blob,\n * file: File,\n * dataUrl: string,\n * width: number,\n * height: number,\n * }} ImageEditResult\n */\n\n/**\n * Builds an ImageEditResult from a canvas at save time.\n *\n * Uses canvas.toBlob() (async, non-blocking) for the Blob/File and\n * canvas.toDataURL() for the dataUrl convenience field, since callers that\n * only need one form shouldn't have to await a FileReader round-trip.\n *\n * @param {HTMLCanvasElement} canvas\n * @param {object} [options]\n * @param {string} [options.fileName] - defaults to \"edited-image.png\"\n * @param {string} [options.mimeType] - defaults to \"image/png\"\n * @param {number} [options.quality] - only used for lossy mime types (e.g. image/jpeg)\n * @returns {Promise<ImageEditResult>}\n */\nexport function buildImageEditResult(canvas, options = {}) {\n const {\n fileName = \"edited-image.png\",\n mimeType = \"image/png\",\n quality,\n } = options;\n\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new Error(\"buildImageEditResult: canvas.toBlob() returned null\"));\n return;\n }\n const file = new File([blob], fileName, { type: mimeType });\n const dataUrl = canvas.toDataURL(mimeType, quality);\n resolve({\n blob,\n file,\n dataUrl,\n width: canvas.width,\n height: canvas.height,\n });\n },\n mimeType,\n quality,\n );\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA,IAGAA,eAOA,oBA0TQC,qBAxTF,YAmhBC;AA/hBP;AAAA;AAAA;AAGA,IAAAD,gBAMO;AACP,yBAA6D;AA0TrD,IAAAC,sBAAA;AAxTR,IAAM,iBAAa;AAAA,MACjB,CACE;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,GACA,QACG;AACH,cAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,IAAI;AACjD,cAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,IAAI;AAEnD,cAAM,eAAW,sBAAO,IAAI;AAC5B,cAAM,YAAQ,sBAAO,IAAI;AACzB,cAAM,qBAAiB,sBAAO,KAAK;AAEnC,cAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,CAAC;AAC1C,cAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,CAAC;AACxC,cAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,IAAI;AACjD,cAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,CAAC;AAE1C,cAAM,cAAc,CAAC,IAAI,OAAO;AAC9B,iBAAO,KAAK,KAAK,KAAK,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;AAAA,QACtE;AAEA,+CAAoB,KAAK,OAAO;AAAA,UAC9B,SAAS,MAAM;AACb,sBAAU,KAAK;AACf,qBAAS,CAAC,CAAC;AACX,0BAAc,IAAI;AAAA,UACpB;AAAA,QACF,EAAE;AAEF,qCAAU,MAAM;AACd,cAAI,SAAS,SAAS;AACpB,kBAAM,QAAQ,SAAS;AACvB,kBAAM,MAAM,KAAK;AACjB,kBAAM,OAAO,MAAM;AACnB,kBAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC5B,kBAAM,UAAU;AAAA,UAClB;AAAA,QACF,GAAG,CAAC,OAAO,MAAM,CAAC;AAElB,qCAAU,MAAM;AACd,cAAI,SAAS,WAAW,QAAQ;AAC9B,kBAAM,QAAQ,SAAS;AACvB,kBAAM,gBAAgB,SAAS;AAAA,cAC7B;AAAA,YACF;AAEA,gBAAI,eAAe;AACjB,oBAAM,cAAc,cAAc;AAClC,oBAAM,eAAe,cAAc;AACnC,oBAAM,MAAM,WAAW;AACvB,oBAAM,OAAO,YAAY;AACzB,oBAAM,KAAK,EAAE,OAAO,aAAa,QAAQ,aAAa,CAAC;AACvD,oBAAM,UAAU;AAAA,YAClB;AAAA,UACF;AAAA,QACF,GAAG,CAAC,QAAQ,OAAO,MAAM,CAAC;AAE1B,qCAAU,MAAM;AACd,gBAAM,gBAAgB,CAAC,MAAM;AAC3B,iBAAK,EAAE,QAAQ,YAAY,EAAE,QAAQ,gBAAgB,YAAY;AAC/D,yBAAW,UAAU;AACrB,4BAAc,IAAI;AAClB,kBAAI,mBAAmB;AACrB,kCAAkB;AAAA,cACpB;AAAA,YACF;AAAA,UACF;AACA,iBAAO,iBAAiB,WAAW,aAAa;AAChD,iBAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,QAClE,GAAG,CAAC,YAAY,UAAU,iBAAiB,CAAC;AAE5C,qCAAU,MAAM;AACd,cAAI,MAAM,WAAW,YAAY;AAC/B,kBAAM,OAAO,SAAS,QAAQ,QAAQ,IAAI,UAAU,EAAE;AACtD,gBAAI,MAAM;AACR,oBAAM,QAAQ,MAAM,CAAC,IAAI,CAAC;AAC1B,oBAAM,QAAQ,SAAS,EAAE,UAAU;AAAA,YACrC;AAAA,UACF;AAAA,QACF,GAAG,CAAC,YAAY,KAAK,CAAC;AAEtB,qCAAU,MAAM;AACd,cAAI,cAAc,QAAQ;AACxB;AAAA,cAAS,CAAC,QACR,IAAI;AAAA,gBAAI,CAAC,MACP,EAAE,OAAO,aACL;AAAA,kBACE,GAAG;AAAA,kBACH,MAAM;AAAA,kBACN;AAAA,gBACF,IACA;AAAA,cACN;AAAA,YACF;AAAA,UACF;AAAA,QACF,GAAG,CAAC,OAAO,iBAAiB,YAAY,QAAQ,QAAQ,CAAC;AAEzD,cAAM,kBAAkB,CAAC,GAAG,OAAO;AACjC,cAAI,eAAe,QAAS;AAC5B,gBAAM,MAAM,KAAK,IAAI;AACrB,gBAAM,mBAAmB;AAEzB,cAAI,YAAY;AACd,yBAAa,UAAU;AACvB,0BAAc,IAAI;AAAA,UACpB;AAEA,cAAI,MAAM,UAAU,oBAAoB,aAAa,GAAG;AACtD,wBAAY,CAAC;AACb,uBAAW,CAAC;AACZ,gBAAI,EAAE,KAAK;AACT,gBAAE,IAAI,eAAe;AACrB,gBAAE,IAAI,gBAAgB;AAAA,YACxB;AACA,2BAAe,GAAG,EAAE;AAAA,UACtB,OAAO;AACL,uBAAW,GAAG;AACd,wBAAY,CAAC;AACb,kBAAM,UAAU,WAAW,MAAM;AAC/B,0BAAY,CAAC;AACb,yBAAW,CAAC;AACZ,4BAAc,IAAI;AAAA,YACpB,GAAG,gBAAgB;AACnB,0BAAc,OAAO;AACrB,0BAAc,EAAE;AAChB,gBAAI,iBAAiB;AACnB,8BAAgB,IAAI,MAAM;AAAA,YAC5B;AAAA,UACF;AAAA,QACF;AAEA,cAAM,iBAAiB,CAAC,GAAG,OAAO;AAChC,gBAAM,QAAQ,EAAE,OAAO,SAAS;AAChC,gBAAM,OAAO,EAAE;AACf,gBAAM,EAAE,GAAG,EAAE,IAAI,KAAK,SAAS;AAE/B,gBAAM,iBAAiB,MAAM,UAAU;AACvC,gBAAM,YAAY,eAAe,sBAAsB;AACvD,gBAAM,UAAU,UAAU,OAAO;AACjC,gBAAM,UAAU,UAAU,MAAM;AAEhC,cAAI,2BAA2B,sBAAsB;AACnD,kBAAM,cAAc,wBAAwB,SAAS,OAAO;AAC5D,iCAAqB,WAAW;AAAA,UAClC;AAAA,QACF;AAEA,cAAM,gBAAgB,CAAC,GAAG,OAAO;AAC/B,gBAAM,QAAQ,EAAE;AAChB,gBAAM,QAAQ,EAAE,OAAO,SAAS;AAChC,gBAAM,EAAE,GAAG,EAAE,IAAI,MAAM,SAAS;AAChC,gBAAM,eAAe,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAElD,yBAAe,UAAU;AACzB,qBAAW,MAAM;AACf,2BAAe,UAAU;AAAA,UAC3B,GAAG,CAAC;AAEJ,cAAI,sBAAsB;AACxB,iCAAqB,KAAK;AAAA,UAC5B;AAEA,gBAAM,iBAAiB,MAAM,UAAU;AACvC,gBAAM,YAAY,eAAe,sBAAsB;AACvD,gBAAM,UAAU,UAAU,OAAO;AACjC,gBAAM,UAAU,UAAU,MAAM;AAEhC,cACE,2BACA,wBAAwB,SAAS,OAAO,GACxC;AACA,uBAAW,EAAE;AACb,0BAAc,IAAI;AAClB,gBAAI,MAAM,SAAS;AACjB,oBAAM,QAAQ,MAAM,CAAC,CAAC;AACtB,oBAAM,QAAQ,SAAS,EAAE,UAAU;AAAA,YACrC;AACA,gBAAI,kBAAmB,mBAAkB;AACzC,gCAAoB,KAAK;AACzB;AAAA,UACF;AAEA,gBAAM,UAAU;AAAA,YACd,GAAG;AAAA,YACH;AAAA,YACA;AAAA,UACF;AAEA,mBAAS,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAO,EAAE,OAAO,KAAK,UAAU,CAAE,CAAC;AAE7D,cAAI,UAAU,cAAc;AAC1B,kBAAM,aAAa,aAAa,MAAM,KAAK,aAAa,MAAM;AAC9D,gBAAI,YAAY;AACd,qBAAO,IAAI,SAAS,YAAY;AAAA,YAClC;AAAA,UACF;AACA,8BAAoB,KAAK;AAAA,QAC3B;AAEA,cAAM,iBAAiB,CAAC,GAAG,OAAO;AAChC,cAAI,CAAC,YAAa;AAClB,gBAAM,QAAQ,EAAE,OAAO,UAAU;AACjC,gBAAM,WAAW,MAAM,QAAQ,MAAM;AACrC,yBAAe;AAAA,YACb;AAAA,YACA,GAAG,MAAM,EAAE;AAAA,YACX,GAAG,MAAM,EAAE;AAAA,YACX,OAAO,SAAS,KAAK;AAAA,YACrB,MAAM;AAAA,YACN;AAAA,UACF,CAAC;AAAA,QACH;AAEA,cAAM,kBAAkB,CAAC,MAAM;AAC7B,cAAI,CAAC,UAAU,CAAC,WAAY;AAE5B,gBAAM,SAAS,EAAE,IAAI,QAAQ,CAAC;AAC9B,gBAAM,SAAS,EAAE,IAAI,QAAQ,CAAC;AAE9B,cAAI,UAAU,QAAQ;AACpB,cAAE,IAAI,eAAe;AACrB,kBAAM,OAAO;AAAA,cACX,EAAE,GAAG,OAAO,SAAS,GAAG,OAAO,QAAQ;AAAA,cACvC,EAAE,GAAG,OAAO,SAAS,GAAG,OAAO,QAAQ;AAAA,YACzC;AAEA,gBAAI,WAAW,GAAG;AAChB,oBAAM,QAAQ,OAAO;AACrB;AAAA,gBAAS,CAAC,QACR,IAAI;AAAA,kBAAI,CAAC,MACP,EAAE,OAAO,aACL;AAAA,oBACE,GAAG;AAAA,oBACH,SAAS,EAAE,UAAU,KAAK;AAAA,oBAC1B,SAAS,EAAE,UAAU,KAAK;AAAA,kBAC5B,IACA;AAAA,gBACN;AAAA,cACF;AAAA,YACF;AACA,wBAAY,IAAI;AAAA,UAClB;AAAA,QACF;AAEA,cAAM,iBAAiB,MAAM;AAC3B,sBAAY,CAAC;AAAA,QACf;AAEA,cAAM,kBAAkB,CAAC,OAAO;AAC9B,cAAI,eAAe,QAAS;AAC5B,wBAAc,EAAE;AAChB,mBAAS,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,SAAS;AAC1D;AAAA,YACE,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,mBAAmB;AAAA,UACrD;AACA,cAAI,iBAAiB;AACnB,4BAAgB,IAAI,MAAM;AAAA,UAC5B;AAAA,QACF;AAEA,cAAM,sBAAsB,CAAC,MAAM;AACjC,cAAI,CAAC,YAAa;AAClB,cAAI,EAAE,WAAW,EAAE,OAAO,SAAS,EAAG;AACtC,gBAAM,MAAM,EAAE,OAAO,SAAS,EAAE,mBAAmB;AACnD,yBAAe;AAAA,YACb,IAAI;AAAA,YACJ,GAAG,IAAI;AAAA,YACP,GAAG,IAAI;AAAA,YACP,OAAO;AAAA,YACP,MAAM;AAAA,YACN;AAAA,UACF,CAAC;AAAA,QACH;AAEA,cAAM,oBAAoB,MAAM;AAC9B,cAAI,YAAY;AACd,0BAAc,IAAI;AAClB,gBAAI,MAAM,SAAS;AACjB,oBAAM,QAAQ,MAAM,CAAC,CAAC;AACtB,oBAAM,QAAQ,SAAS,EAAE,UAAU;AAAA,YACrC;AACA,gBAAI,mBAAmB;AACrB,gCAAkB;AAAA,YACpB;AAAA,UACF;AAAA,QACF;AAEA,cAAM,iBAAiB,MAAM;AAC3B,cAAI,CAAC,YAAa,QAAO;AACzB,iBACE;AAAA,YAAC;AAAA;AAAA,cACC,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,KAAK,YAAY;AAAA,gBACjB,MAAM,YAAY;AAAA,gBAClB;AAAA,gBACA;AAAA,gBACA,QAAQ;AAAA,gBACR,UAAU;AAAA,gBACV,WAAW;AAAA,gBACX,YAAY;AAAA,gBACZ;AAAA,gBACA,QAAQ;AAAA,gBACR,SAAS;AAAA,cACX;AAAA,cACA,OAAO,YAAY;AAAA,cACnB,WAAS;AAAA,cACT,UAAU,CAAC,MACT,eAAe,CAAC,SAAS,QAAQ,EAAE,GAAG,MAAM,OAAO,EAAE,OAAO,MAAM,CAAC;AAAA,cAErE,QAAQ,MAAM;AACZ,oBAAI,YAAY,MAAM,KAAK,GAAG;AAC5B,sBAAI,YAAY,IAAI;AAClB;AAAA,sBAAS,CAAC,QACR,IAAI;AAAA,wBAAI,CAAC,MACP,EAAE,OAAO,YAAY,KACjB;AAAA,0BACE,GAAG;AAAA,0BACH,MAAM,YAAY;AAAA,0BAClB,MAAM;AAAA,0BACN;AAAA,wBACF,IACA;AAAA,sBACN;AAAA,oBACF;AAAA,kBACF,OAAO;AACL,0BAAM,QAAQ,QAAQ,KAAK,IAAI,CAAC;AAChC,0BAAM,UAAU;AAAA,sBACd,IAAI;AAAA,sBACJ,GAAG,YAAY;AAAA,sBACf,GAAG,YAAY;AAAA,sBACf,MAAM,YAAY;AAAA,sBAClB;AAAA,sBACA;AAAA,sBACA,MAAM;AAAA,sBACN;AAAA,sBACA,WAAW;AAAA,oBACb;AACA,6BAAS,CAAC,QAAQ,CAAC,GAAG,KAAK,OAAO,CAAC;AACnC,wBAAI,SAAS,YAAY,MAAM,KAAK,EAAE,SAAS,GAAG;AAChD,4BAAM,OAAO;AAAA,oBACf;AACA,kCAAc,KAAK;AACnB,wBAAI,iBAAiB;AACnB,sCAAgB,OAAO,MAAM;AAAA,oBAC/B;AAAA,kBACF;AAAA,gBACF;AACA,+BAAe,IAAI;AAAA,cACrB;AAAA,cACA,WAAW,CAAC,MAAM;AAChB,oBAAI,EAAE,QAAQ,WAAW,CAAC,EAAE,UAAU;AACpC,oBAAE,eAAe;AACjB,oBAAE,OAAO,KAAK;AAAA,gBAChB;AACA,oBAAI,EAAE,QAAQ,UAAU;AACtB,iCAAe,IAAI;AAAA,gBACrB;AAAA,cACF;AAAA;AAAA,UACF;AAAA,QAEJ;AAEA,cAAM,qBAAqB,CAAC,GAAG,OAAO;AACpC,gBAAM,QAAQ,EAAE;AAChB,gBAAM,eAAe,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAClD,gBAAM,SAAS,MAAM,OAAO;AAC5B,gBAAM,SAAS,MAAM,OAAO;AAC5B,gBAAM,IAAI,MAAM,EAAE;AAClB,gBAAM,IAAI,MAAM,EAAE;AAElB,gBAAM,UAAU;AAAA,YACd,GAAG;AAAA,YACH;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,mBAAS,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAO,EAAE,OAAO,KAAK,UAAU,CAAE,CAAC;AAE7D,cAAI,UAAU,cAAc;AAC1B,kBAAM,aACJ,aAAa,MAAM,KACnB,aAAa,MAAM,MAClB,aAAa,UAAU,OAAO,WAC9B,aAAa,UAAU,OAAO;AACjC,gBAAI,YAAY;AACd,qBAAO,IAAI,SAAS,YAAY;AAAA,YAClC;AAAA,UACF;AAAA,QACF;AAEA,eACE,8CAAC,SAAI,OAAO,EAAE,OAAO,QAAQ,UAAU,YAAY,OAAO,GAAG,eAAe,SAAS,SAAS,OAAQ,GACpG;AAAA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA,KAAK;AAAA,cACL,OAAO;AAAA,gBACL,UAAU;AAAA,gBACV,OAAO;AAAA,gBACP,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,eAAe,SAAS,SAAS;AAAA,cACnC;AAAA,cACA,YAAY;AAAA,cACZ,aAAa;AAAA,cACb,YAAY;AAAA,cACZ,SAAS,CAAC,MAAM;AACd,sBAAM,iBAAiB,EAAE,WAAW,EAAE,OAAO,SAAS;AACtD,oBAAI,gBAAgB;AAClB,oCAAkB;AAAA,gBACpB;AAAA,cACF;AAAA,cACA,OAAO,CAAC,MAAM;AACZ,sBAAM,iBAAiB,EAAE,WAAW,EAAE,OAAO,SAAS;AACtD,oBAAI,gBAAgB;AAClB,wBAAM,MAAM,KAAK,IAAI;AACrB,wBAAM,mBAAmB;AACzB,sBAAI,MAAM,UAAU,kBAAkB;AACpC,wCAAoB,CAAC;AAAA,kBACvB,OAAO;AACL,sCAAkB;AAAA,kBACpB;AACA,6BAAW,GAAG;AAAA,gBAChB;AAAA,cACF;AAAA,cAEA,wDAAC,4BACE;AAAA,sBAAM,IAAI,CAAC,MAAM;AAChB,wBAAM,WAAW,SAAS,cAAc,MAAM;AAC9C,2BAAS,YAAY,EAAE;AACvB,2BAAS,MAAM,WAAW,GAAG,EAAE,QAAQ;AACvC,2BAAS,MAAM,aAAa,EAAE;AAC9B,2BAAS,MAAM,aAAa;AAC5B,2BAAS,MAAM,WAAW;AAC1B,2BAAS,MAAM,aAAa;AAC5B,2BAAS,KAAK,YAAY,QAAQ;AAClC,wBAAM,UAAU;AAChB,wBAAMC,SAAQ,SAAS,cAAc,UAAU;AAC/C,wBAAMC,UAAS,SAAS,eAAe,UAAU;AACjD,2BAAS,KAAK,YAAY,QAAQ;AAElC,yBACE;AAAA,oBAAC;AAAA;AAAA,sBAEC,IAAI,EAAE;AAAA,sBACN,GAAG,EAAE;AAAA,sBACL,GAAG,EAAE;AAAA,sBACL,QAAQ,EAAE,UAAU;AAAA,sBACpB,QAAQ,EAAE,UAAU;AAAA,sBACpB,WAAW,EAAE;AAAA,sBACb,SAAS,MAAM;AACb,wCAAgB,EAAE,EAAE;AAAA,sBACtB;AAAA,sBACA,OAAO,CAAC,MAAM;AACZ,wCAAgB,EAAE,EAAE;AACpB,wCAAgB,GAAG,EAAE,EAAE;AAAA,sBACzB;AAAA,sBACA,YAAY,CAAC,MAAM,eAAe,GAAG,EAAE,EAAE;AAAA,sBACzC,aAAa,MAAM;AACjB,sCAAc,EAAE,EAAE;AAClB,0CAAkB,EAAE,IAAI,MAAM;AAC9B,4CAAoB,IAAI;AAAA,sBAC1B;AAAA,sBACA,YAAY,CAAC,MAAM,eAAe,GAAG,EAAE,EAAE;AAAA,sBACzC,WAAW,CAAC,MAAM,cAAc,GAAG,EAAE,EAAE;AAAA,sBACvC,gBAAgB,CAAC,MAAM,mBAAmB,GAAG,EAAE,EAAE;AAAA,sBAEjD;AAAA;AAAA,0BAAC;AAAA;AAAA,4BACC,OAAOD;AAAA,4BACP,QAAQC;AAAA,4BACR,MAAM,EAAE;AAAA,4BACR,cAAc;AAAA;AAAA,wBAChB;AAAA,wBACA;AAAA,0BAAC;AAAA;AAAA,4BACC,MAAM,EAAE;AAAA,4BACR,UAAU,EAAE;AAAA,4BACZ,YAAY,EAAE;AAAA,4BACd,MAAM,EAAE;AAAA,4BACR,GAAG;AAAA,4BACH,GAAG;AAAA,4BACH,YAAY;AAAA;AAAA,wBACd;AAAA;AAAA;AAAA,oBAtCK,EAAE;AAAA,kBAuCT;AAAA,gBAEJ,CAAC;AAAA,gBACD;AAAA,kBAAC;AAAA;AAAA,oBACC,KAAK;AAAA,oBACL,eAAe;AAAA,oBACf,gBAAgB;AAAA,sBACd;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,oBACF;AAAA,oBACA,YAAY;AAAA,oBACZ,YAAY,CAAC,GAAG,CAAC;AAAA;AAAA,gBACnB;AAAA,iBACF;AAAA;AAAA,UACF;AAAA,UACC,eAAe;AAAA,WAClB;AAAA,MAEJ;AAAA,IACF;AAEA,IAAO,qBAAQ;AAAA;AAAA;;;AC/hBR,SAAS,eAAe,aAAa,WAAW;AACrD,UAAQ,aAAa;AAAA,IACnB,KAAK;AAAU,aAAO,CAAC,YAAY,GAAG,YAAY,CAAC;AAAA,IACnD,KAAK;AAAU,aAAO,CAAC,WAAW,SAAS;AAAA,IAC3C;AAAe,aAAO,CAAC;AAAA,EACzB;AACF;AANA;AAAA;AAAA;AAAA;;;ACAA,IAAa;AAAb;AAAA;AAAO,IAAM,mBAAmB;AAAA,MAC9B,kBAAwB;AAAA,MACxB,eAAwB;AAAA,MACxB,mBAAyB;AAAA,MACzB,yBAAyB;AAAA,IAC3B;AAAA;AAAA;;;ACLA;AAAA;AAAA;AAAA;AAAA,IAEAC,gBAOAC,qBAmVQC,qBA/UF,gBAyYC;AAtZP;AAAA;AAAA;AAEA,IAAAF,iBAMO;AACP,IAAAC,sBAAgD;AAChD;AACA;AAiVQ,IAAAC,sBAAA;AA/UR,IAAM,qBAAiB;AAAA,MACrB,CACE;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,aAAa,CAAC;AAAA;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,GACA,QACG;AACH,cAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,IAAI;AAC3C,cAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,IAAI;AACjD,cAAM,eAAW,uBAAO,IAAI;AAC5B,cAAM,YAAQ,uBAAO,IAAI;AAEzB,gDAAoB,KAAK,OAAO;AAAA,UAC9B,SAAS,MAAM;AACb,gBAAI,UAAW,WAAU,UAAU;AACnC,gBAAI,cAAe,eAAc,CAAC,CAAC;AACnC,0BAAc,IAAI;AAAA,UACpB;AAAA,QACF,EAAE;AAEF,sCAAU,MAAM;AACd,cAAI,SAAS,SAAS;AACpB,kBAAM,QAAQ,SAAS;AACvB,kBAAM,MAAM,KAAK;AACjB,kBAAM,OAAO,MAAM;AACnB,kBAAM,UAAU;AAAA,UAClB;AAAA,QACF,GAAG,CAAC,OAAO,MAAM,CAAC;AAGlB,sCAAU,MAAM;AACd,gBAAM,gBAAgB,CAAC,MAAM;AAC3B,iBAAK,EAAE,QAAQ,YAAY,EAAE,QAAQ,gBAAgB,YAAY;AAC/D,oBAAM,WAAW,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,UAAU;AAC3D,kBAAI,UAAU,UAAU;AACtB,uBAAO,YAAY,MAAM,UAAU,QAAQ;AAAA,cAC7C,WAAW,eAAe;AACxB,8BAAc,CAAC,UAAU,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,UAAU,CAAC;AAAA,cACnE;AACA,4BAAc,IAAI;AAElB,kBAAI,MAAM,SAAS;AACjB,sBAAM,QAAQ,MAAM,CAAC,CAAC;AACtB,sBAAM,QAAQ,SAAS,EAAE,UAAU;AAAA,cACrC;AAEA,kBAAI,kBAAmB,mBAAkB;AAAA,YAC3C;AAAA,UACF;AACA,iBAAO,iBAAiB,WAAW,aAAa;AAChD,iBAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,QAClE,GAAG,CAAC,YAAY,YAAY,eAAe,mBAAmB,MAAM,CAAC;AAGrE,sCAAU,MAAM;AACd,cAAI,MAAM,WAAW,SAAS,SAAS;AACrC,gBAAI,YAAY;AACd,oBAAM,OAAO,SAAS,QAAQ,QAAQ,IAAI,UAAU,EAAE;AACtD,kBAAI,MAAM;AACR,sBAAM,QAAQ,MAAM,CAAC,IAAI,CAAC;AAC1B,sBAAM,QAAQ,SAAS,EAAE,UAAU;AACnC;AAAA,cACF;AAAA,YACF;AACA,kBAAM,QAAQ,MAAM,CAAC,CAAC;AACtB,kBAAM,QAAQ,SAAS,EAAE,UAAU;AAAA,UACrC;AAAA,QACF,GAAG,CAAC,YAAY,UAAU,CAAC;AAG3B,sCAAU,MAAM;AACd,cAAI,cAAc,UAAU,eAAe;AACzC,kBAAM,WAAW,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,UAAU;AAC3D,gBAAI,CAAC,SAAU;AAEf,gBACE,SAAS,WAAW,SACpB,SAAS,gBAAgB,aACzB,SAAS,gBAAgB,eACzB,SAAS,SAAS,iBAClB;AACA;AAAA,gBAAc,CAAC,UACb,MAAM;AAAA,kBAAI,CAAC,MACT,EAAE,OAAO,aACL;AAAA,oBACE,GAAG;AAAA,oBACH,QAAQ;AAAA,oBACR,aAAa;AAAA,oBACb;AAAA,oBACA,MAAM,eAAe,aAAa,SAAS;AAAA,oBAC3C,MAAM,mBAAmB;AAAA,kBAC3B,IACA;AAAA,gBACN;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,cAAM,kBAAkB,CAAC,MAAM;AAC7B,cAAI,CAAC,OAAQ;AACb,cAAI,EAAE,IAAK,GAAE,IAAI,eAAe;AAEhC,gBAAM,iBAAiB,EAAE,WAAW,EAAE,OAAO,SAAS;AACtD,cAAI,CAAC,eAAgB;AAErB,gBAAM,MAAM,EAAE,OAAO,SAAS,EAAE,mBAAmB;AACnD,cAAI,CAAC,IAAK;AAEV,gBAAM,KAAK,QAAQ,KAAK,IAAI,CAAC;AAC7B,qBAAW;AAAA,YACT;AAAA,YACA,GAAG,IAAI;AAAA,YACP,GAAG,IAAI;AAAA,YACP,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,QAAQ,SAAS;AAAA,YACjB,aAAa,aAAa;AAAA,YAC1B,aAAa,eAAe;AAAA,YAC5B,WAAW;AAAA,YACX,UAAU;AAAA,YACV,MAAM,eAAe,eAAe,SAAS,aAAa,CAAC;AAAA,YAC3D,MAAM,mBAAmB;AAAA,UAC3B,CAAC;AACD,wBAAc,EAAE;AAAA,QAClB;AAEA,cAAM,kBAAkB,CAAC,MAAM;AAC7B,cAAI,CAAC,UAAU,CAAC,QAAS;AACzB,cAAI,EAAE,IAAK,GAAE,IAAI,eAAe;AAEhC,gBAAM,MAAM,EAAE,OAAO,SAAS,EAAE,mBAAmB;AACnD,cAAI,CAAC,IAAK;AAEV,qBAAW;AAAA,YACT,GAAG;AAAA,YACH,OAAO,KAAK,IAAI,IAAI,IAAI,QAAQ,CAAC;AAAA,YACjC,QAAQ,KAAK,IAAI,IAAI,IAAI,QAAQ,CAAC;AAAA,YAClC,GAAG,KAAK,IAAI,IAAI,GAAG,QAAQ,CAAC;AAAA,YAC5B,GAAG,KAAK,IAAI,IAAI,GAAG,QAAQ,CAAC;AAAA,UAC9B,CAAC;AAAA,QACH;AAEA,cAAM,gBAAgB,CAAC,MAAM;AAC3B,cAAI,CAAC,UAAU,CAAC,QAAS;AACzB,cAAI,EAAE,IAAK,GAAE,IAAI,eAAe;AAGhC,gBAAM,OAAO,kBAAkB,kBAAkB;AACjD,gBAAM,OAAO,kBAAkB,mBAAmB;AAElD,cAAI,QAAQ,SAAS,QAAQ,QAAQ,UAAU,MAAM;AAEnD,gBAAI,eAAe;AACjB,4BAAc,CAAC,UAAU,CAAC,GAAG,OAAO,OAAO,CAAC;AAAA,YAC9C;AAEA,gBAAI,OAAO;AACT,oBAAM,OAAO;AAAA,YACf;AAAA,UACF;AACA,qBAAW,IAAI;AAAA,QACjB;AAEA,cAAM,kBAAkB,CAAC,OAAO;AAC9B,gBAAM,cAAc,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACtD,cAAI,CAAC,YAAa;AAElB,wBAAc,EAAE;AAChB,cAAI,SAAU,UAAS,YAAY,UAAU,SAAS;AACtD,cAAI;AACF,+BAAmB,YAAY,QAAQ,aAAa;AACtD,cAAI,aAAc,cAAa,YAAY,eAAe,CAAC;AAC3D,cAAI,eAAgB,gBAAe,YAAY,eAAe,OAAO;AAErE,cAAI,iBAAiB;AACnB,4BAAgB,IAAI,WAAW;AAAA,UACjC;AAAA,QACF;AAEA,cAAM,iBAAiB,CAAC,GAAG,OAAO;AAChC,cAAI,CAAC,OAAQ;AACb,gBAAM,QAAQ,EAAE,OAAO,SAAS;AAChC,gBAAM,OAAO,EAAE;AACf,gBAAM,EAAE,GAAG,EAAE,IAAI,KAAK,SAAS;AAE/B,gBAAM,YAAY,MAAM,UAAU,EAAE,sBAAsB;AAC1D,gBAAM,UAAU,UAAU,OAAO;AACjC,gBAAM,UAAU,UAAU,MAAM;AAEhC,cAAI,2BAA2B,sBAAsB;AACnD,kBAAM,cAAc,wBAAwB,SAAS,OAAO;AAC5D,iCAAqB,WAAW;AAAA,UAClC;AAAA,QACF;AAEA,cAAM,gBAAgB,CAAC,GAAG,OAAO;AAC/B,cAAI,CAAC,OAAQ;AACb,gBAAM,QAAQ,EAAE,OAAO,SAAS;AAChC,gBAAM,OAAO,EAAE;AACf,gBAAM,EAAE,GAAG,EAAE,IAAI,KAAK,SAAS;AAE/B,gBAAM,eAAe,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACvD,cAAI,qBAAsB,sBAAqB,KAAK;AAEpD,gBAAM,YAAY,MAAM,UAAU,EAAE,sBAAsB;AAC1D,gBAAM,UAAU,UAAU,OAAO;AACjC,gBAAM,UAAU,UAAU,MAAM;AAEhC,cACE,2BACA,wBAAwB,SAAS,OAAO,GACxC;AACA,gBAAI,UAAU,cAAc;AAC1B,qBAAO,IAAI,MAAM,cAAc,QAAQ;AAAA,YACzC,WAAW,eAAe;AACxB,4BAAc,CAAC,UAAU,MAAM,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;AACzD,4BAAc,IAAI;AAAA,YACpB;AACA,gBAAI,MAAM,QAAS,OAAM,QAAQ,MAAM,CAAC,CAAC;AACzC,gBAAI,kBAAmB,mBAAkB;AACzC;AAAA,UACF;AAEA,gBAAM,UAAU,EAAE,GAAG,cAAc,GAAG,EAAE;AAExC,cACE,UACA,iBACC,aAAa,MAAM,KAAK,aAAa,MAAM,IAC5C;AACA,mBAAO,IAAI,SAAS,YAAY;AAAA,UAClC,WAAW,eAAe;AACxB,0BAAc,CAAC,UAAU,MAAM,IAAI,CAAC,MAAO,EAAE,OAAO,KAAK,UAAU,CAAE,CAAC;AAAA,UACxE;AAAA,QACF;AAEA,cAAM,qBAAqB,CAAC,GAAG,OAAO;AACpC,cAAI,CAAC,OAAQ;AACb,gBAAM,OAAO,EAAE;AACf,gBAAM,eAAe,WAAW,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACvD,cAAI,CAAC,aAAc;AAEnB,gBAAM,SAAS,KAAK,OAAO;AAC3B,gBAAM,SAAS,KAAK,OAAO;AAC3B,gBAAM,WAAW,KAAK,SAAS;AAE/B,gBAAM,WAAW,KAAK;AAAA,YACpB,kBAAkB,kBAAkB;AAAA,YACpC,KAAK,MAAM,IAAI;AAAA,UACjB;AACA,gBAAM,YAAY,KAAK;AAAA,YACrB,kBAAkB,mBAAmB;AAAA,YACrC,KAAK,OAAO,IAAI;AAAA,UAClB;AAEA,eAAK,OAAO,CAAC;AACb,eAAK,OAAO,CAAC;AAEb,gBAAM,UAAU;AAAA,YACd,GAAG;AAAA,YACH,GAAG,KAAK,EAAE;AAAA,YACV,GAAG,KAAK,EAAE;AAAA,YACV,OAAO;AAAA,YACP,QAAQ;AAAA,YACR;AAAA,UACF;AAEA,cAAI,QAAQ;AACV,mBAAO,IAAI,SAAS,YAAY;AAAA,UAClC,WAAW,eAAe;AACxB,0BAAc,CAAC,UAAU,MAAM,IAAI,CAAC,MAAO,EAAE,OAAO,KAAK,UAAU,CAAE,CAAC;AAAA,UACxE;AAAA,QACF;AAEA,eACE;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,KAAK;AAAA,YACL,OAAO;AAAA,cACL,UAAU;AAAA,cACV,OAAO;AAAA,cACP,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,eAAe,SAAS,SAAS;AAAA;AAAA,YACnC;AAAA,YACA,aAAa;AAAA,YACb,aAAa;AAAA,YACb,WAAW;AAAA,YACX,cAAc;AAAA,YACd,aAAa;AAAA,YACb,YAAY;AAAA,YACZ,SAAS,CAAC,MAAM;AACd,kBAAI,EAAE,WAAW,EAAE,OAAO,SAAS,GAAG;AACpC,8BAAc,IAAI;AAClB,oBAAI,kBAAmB,mBAAkB;AAAA,cAC3C;AAAA,YACF;AAAA,YACA,OAAO,CAAC,MAAM;AACZ,kBAAI,EAAE,WAAW,EAAE,OAAO,SAAS,GAAG;AACpC,8BAAc,IAAI;AAClB,oBAAI,kBAAmB,mBAAkB;AAAA,cAC3C;AAAA,YACF;AAAA,YAEA,wDAAC,6BACE;AAAA,yBAAW,IAAI,CAAC,SACf;AAAA,gBAAC;AAAA;AAAA,kBAEC,IAAI,KAAK;AAAA,kBACT,GAAG,KAAK;AAAA,kBACR,GAAG,KAAK;AAAA,kBACR,OAAO,KAAK;AAAA,kBACZ,QAAQ,KAAK;AAAA,kBACb,QAAQ,KAAK;AAAA,kBACb,aAAa,KAAK;AAAA,kBAClB,MAAM,KAAK;AAAA,kBACX,WAAW,UAAU,KAAK;AAAA,kBAC1B,UAAU,KAAK;AAAA,kBACf,MAAM,KAAK,SAAS,gBAAgB,SAAY,KAAK;AAAA,kBACrD,SAAS,MAAM,gBAAgB,KAAK,EAAE;AAAA,kBACtC,OAAO,MAAM,gBAAgB,KAAK,EAAE;AAAA,kBACpC,YAAY,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE;AAAA,kBAC5C,WAAW,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE;AAAA,kBAC1C,gBAAgB,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE;AAAA;AAAA,gBAhB/C,KAAK;AAAA,cAiBZ,CACD;AAAA,cACA,WACC;AAAA,gBAAC;AAAA;AAAA,kBACC,GAAG,QAAQ;AAAA,kBACX,GAAG,QAAQ;AAAA,kBACX,OAAO,QAAQ;AAAA,kBACf,QAAQ,QAAQ;AAAA,kBAChB,QAAQ,QAAQ;AAAA,kBAChB,aAAa,QAAQ;AAAA,kBACrB,MAAM,QAAQ;AAAA,kBACd,MAAM,QAAQ,SAAS,gBAAgB,SAAY,QAAQ;AAAA;AAAA,cAC7D;AAAA,cAED,UACC;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK;AAAA,kBACL,eAAe;AAAA,kBACf,gBAAgB;AAAA,oBACd;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,kBACF;AAAA,kBACA,YAAY;AAAA,kBACZ,YAAY,CAAC,GAAG,CAAC;AAAA;AAAA,cACnB;AAAA,eAEJ;AAAA;AAAA,QACF;AAAA,MAEJ;AAAA,IACF;AAEA,IAAO,yBAAQ;AAAA;AAAA;;;ACtZf;AAAA;AAAA;AAAA;AAAA,IAEAC,gBAOAC,qBA0ZQC,qBAtZF,YAsdC;AAneP;AAAA;AAAA;AAEA,IAAAF,iBAMO;AACP,IAAAC,sBAAiD;AACjD;AACA;AAwZQ,IAAAC,sBAAA;AAtZR,IAAM,iBAAa;AAAA,MACjB,CACE;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,GACA,QACG;AACH,cAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,IAAI;AAC7C,cAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,IAAI;AACjD,cAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,CAAC;AAC1C,cAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,CAAC;AAElD,cAAM,eAAW,uBAAO,IAAI;AAC5B,cAAM,YAAQ,uBAAO,IAAI;AAGzB,gDAAoB,KAAK,OAAO;AAAA,UAC9B,SAAS,MAAM;AACb,sBAAU,MAAM;AAChB,sBAAU,CAAC,CAAC;AACZ,0BAAc,IAAI;AAAA,UACpB;AAAA,QACF,EAAE;AAGF,sCAAU,MAAM;AACd,cAAI,SAAS,SAAS;AACpB,qBAAS,QAAQ,MAAM,KAAK;AAC5B,qBAAS,QAAQ,OAAO,MAAM;AAC9B,qBAAS,QAAQ,UAAU;AAAA,UAC7B;AAAA,QACF,GAAG,CAAC,OAAO,MAAM,CAAC;AAGlB,sCAAU,MAAM;AACd,gBAAM,gBAAgB,CAAC,MAAM;AAC3B,iBAAK,EAAE,QAAQ,YAAY,EAAE,QAAQ,gBAAgB,YAAY;AAC/D,wBAAU,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,UAAU,CAAC;AAC3D,4BAAc,IAAI;AAAA,YACpB;AAAA,UACF;AACA,iBAAO,iBAAiB,WAAW,aAAa;AAChD,iBAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,QAClE,GAAG,CAAC,YAAY,SAAS,CAAC;AAG1B,sCAAU,MAAM;AACd,cAAI,MAAM,WAAW,cAAc,SAAS,SAAS;AACnD,kBAAM,OAAO,SAAS,QAAQ,QAAQ,IAAI,UAAU,EAAE;AACtD,gBAAI,MAAM;AACR,oBAAM,QAAQ,MAAM,CAAC,IAAI,CAAC;AAC1B,oBAAM,QAAQ,SAAS,EAAE,UAAU;AAAA,YACrC;AAAA,UACF,WAAW,MAAM,SAAS;AACxB,kBAAM,QAAQ,MAAM,CAAC,CAAC;AACtB,kBAAM,QAAQ,SAAS,EAAE,UAAU;AAAA,UACrC;AAAA,QACF,GAAG,CAAC,YAAY,MAAM,CAAC;AAGvB,sCAAU,MAAM;AACd,cAAI,YAAY;AACd;AAAA,cAAU,CAAC,SACT,KAAK;AAAA,gBAAI,CAAC,MACR,EAAE,OAAO,aACL;AAAA,kBACE,GAAG;AAAA,kBACH,QAAQ;AAAA,kBACR,aAAa;AAAA,kBACb;AAAA,kBACA,MAAM,eAAe,aAAa,SAAS;AAAA,gBAC7C,IACA;AAAA,cACN;AAAA,YACF;AAAA,UACF;AAAA,QACF,GAAG,CAAC,OAAO,YAAY,WAAW,WAAW,CAAC;AAG9C,cAAM,oBAAoB,CAAC,QAAQ,aAAa,iBAAiB;AAC/D,gBAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI;AACzB,iBAAO;AAAA,YACL,KAAK,IAAI,GAAG,KAAK,IAAI,aAAa,EAAE,CAAC;AAAA,YACrC,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,EAAE,CAAC;AAAA,YACtC,KAAK,IAAI,GAAG,KAAK,IAAI,aAAa,EAAE,CAAC;AAAA,YACrC,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,EAAE,CAAC;AAAA,UACxC;AAAA,QACF;AAEA,cAAM,cAAc,CAAC,IAAI,OACvB,KAAK,KAAK,KAAK,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;AAE/D,cAAM,WAAW,CAAC,IAAI,OAAO,KAAK,MAAM,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC;AAEhE,cAAM,YAAY,CAAC,IAAI,QAAQ;AAAA,UAC7B,IAAI,GAAG,IAAI,GAAG,KAAK;AAAA,UACnB,IAAI,GAAG,IAAI,GAAG,KAAK;AAAA,QACrB;AAGA,cAAM,mBAAmB,CAAC,MAAM;AAC9B,cAAI,CAAC,OAAQ;AACb,cAAI,EAAE,IAAK,GAAE,IAAI,eAAe;AAChC,cAAI,EAAE,IAAI,WAAW,EAAE,IAAI,QAAQ,SAAS,EAAG;AAE/C,gBAAM,iBAAiB,EAAE,WAAW,EAAE,OAAO,SAAS;AACtD,cAAI,CAAC,eAAgB;AAErB,cAAI,YAAY;AACd,0BAAc,IAAI;AAClB,gCAAoB;AAAA,UACtB;AAEA,gBAAM,MAAM,EAAE,OAAO,SAAS,EAAE,mBAAmB;AACnD,cAAI,CAAC,IAAK;AAEV,gBAAM,KAAK,SAAS,KAAK,IAAI,CAAC;AAC9B,sBAAY;AAAA,YACV;AAAA,YACA,QAAQ,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAAA,YACnC,QAAQ;AAAA,YACR,aAAa;AAAA,YACb;AAAA,YACA,MAAM,eAAe,aAAa,SAAS;AAAA,YAC3C,WAAW;AAAA,UACb,CAAC;AACD,wBAAc,EAAE;AAAA,QAClB;AAEA,cAAM,kBAAkB,CAAC,MAAM;AAC7B,cAAI,CAAC,UAAU,CAAC,SAAU;AAC1B,cAAI,EAAE,IAAK,GAAE,IAAI,eAAe;AAEhC,gBAAM,MAAM,EAAE,OAAO,SAAS,EAAE,mBAAmB;AACnD,cAAI,CAAC,IAAK;AAEV,sBAAY;AAAA,YACV,GAAG;AAAA,YACH,QAAQ;AAAA,cACN,SAAS,OAAO,CAAC;AAAA,cACjB,SAAS,OAAO,CAAC;AAAA,cACjB,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,IAAI,CAAC,CAAC;AAAA,cAClC,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,IAAI,CAAC,CAAC;AAAA,YACrC;AAAA,UACF,CAAC;AAAA,QACH;AAEA,cAAM,gBAAgB,CAAC,MAAM;AAC3B,cAAI,CAAC,UAAU,CAAC,SAAU;AAC1B,cAAI,EAAE,IAAK,GAAE,IAAI,eAAe;AAEhC,gBAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,SAAS;AAClC,gBAAM,cAAc,KAAK;AAAA,YACvB,KAAK,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC;AAAA,UAC5C;AAEA,cAAI,eAAe,iBAAiB,kBAAkB;AACpD,sBAAU,CAAC,SAAS,CAAC,GAAG,MAAM,QAAQ,CAAC;AACvC,oBAAQ,QAAQ;AAAA,UAClB;AACA,sBAAY,IAAI;AAAA,QAClB;AAEA,cAAM,kBAAkB,CAAC,MAAM;AAC7B,cAAI,CAAC,OAAQ;AACb,gBAAM,SAAS,EAAE,IAAI,QAAQ,CAAC;AAC9B,gBAAM,SAAS,EAAE,IAAI,QAAQ,CAAC;AAE9B,cAAI,YAAY,CAAC,QAAQ;AACvB,4BAAgB,CAAC;AACjB;AAAA,UACF;AAEA,cAAI,UAAU,UAAU,YAAY;AAClC,cAAE,IAAI,eAAe;AAErB,kBAAM,OAAO;AAAA,cACX,EAAE,GAAG,OAAO,SAAS,GAAG,OAAO,QAAQ;AAAA,cACvC,EAAE,GAAG,OAAO,SAAS,GAAG,OAAO,QAAQ;AAAA,YACzC;AACA,kBAAM,QAAQ;AAAA,cACZ,EAAE,GAAG,OAAO,SAAS,GAAG,OAAO,QAAQ;AAAA,cACvC,EAAE,GAAG,OAAO,SAAS,GAAG,OAAO,QAAQ;AAAA,YACzC;AAEA,gBAAI,WAAW,GAAG;AAChB,oBAAM,QAAQ,OAAO;AACrB,oBAAM,gBAAgB,QAAQ;AAE9B;AAAA,gBAAU,CAAC,SACT,KAAK,IAAI,CAAC,MAAM;AACd,sBAAI,EAAE,OAAO,WAAY,QAAO;AAChC,wBAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE;AAC3B,wBAAM,MAAM,KAAK,MAAM,GACrB,MAAM,KAAK,MAAM;AACnB,wBAAM,MAAM,KAAK;AAAA,oBACf,KAAK,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC;AAAA,kBAC5C;AACA,wBAAM,MAAM,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE;AACvC,wBAAM,KAAK,MAAM;AACjB,wBAAM,KAAK,MAAM;AACjB,wBAAM,KAAK,KAAK;AAChB,yBAAO;AAAA,oBACL,GAAG;AAAA,oBACH,QAAQ;AAAA,sBACN,KAAK,KAAK,KAAK,IAAI,EAAE;AAAA,sBACrB,KAAK,KAAK,KAAK,IAAI,EAAE;AAAA,sBACrB,KAAK,KAAK,KAAK,IAAI,EAAE;AAAA,sBACrB,KAAK,KAAK,KAAK,IAAI,EAAE;AAAA,oBACvB;AAAA,kBACF;AAAA,gBACF,CAAC;AAAA,cACH;AAAA,YACF;AACA,wBAAY,IAAI;AAChB,4BAAgB,KAAK;AAAA,UACvB;AAAA,QACF;AAEA,cAAM,iBAAiB,CAAC,MAAM;AAC5B,sBAAY,CAAC;AACb,0BAAgB,CAAC;AACjB,cAAI,YAAY,CAAC,EAAE,IAAI,QAAQ,OAAQ,eAAc,CAAC;AAAA,QACxD;AAGA,cAAM,mBAAmB,CAAC,OAAO;AAC/B,gBAAM,UAAU,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC9C,wBAAc,EAAE;AAChB,mBAAS,SAAS,UAAU,SAAS;AACrC,cAAI,SAAS,YAAa,gBAAe,QAAQ,WAAW;AAC5D,uBAAa,SAAS,eAAe,CAAC;AACtC,4BAAkB,IAAI,OAAO;AAAA,QAC/B;AAEA,cAAM,qBAAqB,CAAC,GAAG,OAAO;AACpC,gBAAM,OAAO,EAAE;AACf,gBAAM,gBAAgB,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAEpD,gBAAM,SAAS,KAAK,OAAO;AAC3B,gBAAM,SAAS,KAAK,OAAO;AAC3B,gBAAM,WAAW,KAAK,SAAS;AAC/B,gBAAM,YAAY,KAAK,OAAO;AAE9B,gBAAM,MAAM,UAAU,CAAC,IAAI,UAAU,CAAC,KAAK;AAC3C,gBAAM,MAAM,UAAU,CAAC,IAAI,UAAU,CAAC,KAAK;AAC3C,gBAAM,MAAM,KAAK;AAAA,YACf,KAAK,IAAI,UAAU,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,IACrC,KAAK,IAAI,UAAU,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC;AAAA,UAC3C;AACA,gBAAM,MAAM,KAAK;AAAA,YACf,UAAU,CAAC,IAAI,UAAU,CAAC;AAAA,YAC1B,UAAU,CAAC,IAAI,UAAU,CAAC;AAAA,UAC5B;AACA,gBAAM,KAAK,MAAM,KAAK,IAAI,QAAQ,MAAM;AACxC,gBAAM,KAAK,MAAO,WAAW,KAAK,KAAM;AACxC,gBAAM,KAAK,KAAK;AAEhB,gBAAM,oBAAoB;AAAA,YACxB;AAAA,cACE,KAAK,KAAK,KAAK,IAAI,EAAE;AAAA,cACrB,KAAK,KAAK,KAAK,IAAI,EAAE;AAAA,cACrB,KAAK,KAAK,KAAK,IAAI,EAAE;AAAA,cACrB,KAAK,KAAK,KAAK,IAAI,EAAE;AAAA,YACvB;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,eAAK,OAAO,CAAC;AACb,eAAK,OAAO,CAAC;AACb,eAAK,SAAS,CAAC;AACf,eAAK,EAAE,CAAC;AACR,eAAK,EAAE,CAAC;AAER,gBAAM,UAAU;AAAA,YACd,GAAG;AAAA,YACH,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,aAAa;AAAA,YACb;AAAA,YACA,MAAM,eAAe,aAAa,SAAS;AAAA,UAC7C;AAEA,oBAAU,CAAC,SAAS,KAAK,IAAI,CAAC,MAAO,EAAE,OAAO,KAAK,UAAU,CAAE,CAAC;AAEhE,cAAI,UAAU,eAAe;AAC3B,kBAAM,UAAU,CAAC,cAAc,OAAO;AAAA,cACpC,CAAC,GAAG,MAAM,MAAM,kBAAkB,CAAC;AAAA,YACrC;AACA,gBAAI,QAAS,QAAO,IAAI,SAAS,aAAa;AAAA,UAChD;AAAA,QACF;AAEA,cAAM,iBAAiB,CAAC,GAAG,OAAO;AAChC,cAAI,CAAC,2BAA2B,CAAC,qBAAsB;AACvD,gBAAM,OAAO,EAAE;AACf,gBAAM,QAAQ,KAAK,SAAS;AAC5B,gBAAM,EAAE,GAAG,EAAE,IAAI,KAAK,SAAS;AAC/B,gBAAM,MAAM,KAAK,OAAO;AACxB,gBAAM,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;AAC/B,gBAAM,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;AAC/B,gBAAM,OAAO,MAAM,UAAU,EAAE,sBAAsB;AACrD;AAAA,YACE,wBAAwB,KAAK,OAAO,KAAK,GAAG,KAAK,MAAM,KAAK,CAAC;AAAA,UAC/D;AAAA,QACF;AAEA,cAAM,gBAAgB,CAAC,GAAG,OAAO;AAC/B,gBAAM,OAAO,EAAE;AACf,gBAAM,QAAQ,KAAK,SAAS;AAC5B,gBAAM,IAAI,KAAK,EAAE;AACjB,gBAAM,IAAI,KAAK,EAAE;AACjB,gBAAM,gBAAgB,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAEpD,iCAAuB,KAAK;AAE5B,gBAAM,OAAO,MAAM,UAAU,EAAE,sBAAsB;AACrD,gBAAM,MAAM,KAAK,OAAO;AACxB,gBAAM,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI;AACnC,gBAAM,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI;AAEnC,cAAI,0BAA0B,KAAK,OAAO,IAAI,KAAK,MAAM,EAAE,GAAG;AAC5D,sBAAU,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;AACnD,0BAAc,IAAI;AAClB,gCAAoB;AACpB;AAAA,UACF;AAEA,gBAAM,YAAY;AAAA,YAChB,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;AAAA,YAC/C;AAAA,YACA;AAAA,UACF;AACA,eAAK,EAAE,CAAC;AACR,eAAK,EAAE,CAAC;AAER,gBAAM,UAAU;AAAA,YACd,GAAG;AAAA,YACH,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,aAAa;AAAA,YACb;AAAA,YACA,MAAM,eAAe,aAAa,SAAS;AAAA,UAC7C;AAEA,oBAAU,CAAC,SAAS,KAAK,IAAI,CAAC,MAAO,EAAE,OAAO,KAAK,UAAU,CAAE,CAAC;AAEhE,cAAI,UAAU,eAAe;AAC3B,kBAAM,UAAU,CAAC,cAAc,OAAO;AAAA,cACpC,CAAC,GAAG,MAAM,MAAM,UAAU,CAAC;AAAA,YAC7B;AACA,gBAAI,QAAS,QAAO,IAAI,SAAS,aAAa;AAAA,UAChD;AAAA,QACF;AAGA,eACE;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,KAAK;AAAA,YACL,OAAO;AAAA,cACL,UAAU;AAAA,cACV,OAAO;AAAA,cACP,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,eAAe,SAAS,SAAS;AAAA,YACnC;AAAA,YACA,aAAa;AAAA,YACb,aAAa;AAAA,YACb,WAAW;AAAA,YACX,cAAc;AAAA,YACd,aAAa;AAAA,YACb,YAAY;AAAA,YACZ,SAAS,CAAC,MAAM;AACd,kBAAI,EAAE,WAAW,EAAE,OAAO,SAAS,KAAK,YAAY;AAClD,8BAAc,IAAI;AAClB,oCAAoB;AAAA,cACtB;AAAA,YACF;AAAA,YACA,OAAO,CAAC,MAAM;AACZ,kBAAI,EAAE,WAAW,EAAE,OAAO,SAAS,KAAK,YAAY;AAClD,8BAAc,IAAI;AAClB,oCAAoB;AAAA,cACtB;AAAA,YACF;AAAA,YAEA,wDAAC,6BACE;AAAA,qBAAO,IAAI,CAAC,UACX;AAAA,gBAAC;AAAA;AAAA,kBAEC,IAAI,MAAM;AAAA,kBACV,QAAQ,MAAM;AAAA,kBACd,QAAQ,MAAM;AAAA,kBACd,aAAa,MAAM;AAAA,kBACnB,gBAAgB,KAAK,IAAI,IAAI,MAAM,cAAc,CAAC;AAAA,kBAClD,oBAAoB;AAAA,kBACpB,MAAM,MAAM;AAAA,kBACZ,eAAe;AAAA,kBACf,cAAc;AAAA,kBACd,MAAM,MAAM;AAAA,kBACZ,WAAW,MAAM;AAAA,kBACjB,SAAS,CAAC,MAAM;AACd,sBAAE,eAAe;AACjB,qCAAiB,MAAM,EAAE;AAAA,kBAC3B;AAAA,kBACA,OAAO,CAAC,MAAM;AACZ,sBAAE,eAAe;AACjB,qCAAiB,MAAM,EAAE;AAAA,kBAC3B;AAAA,kBACA,YAAY,CAAC,MAAM,eAAe,GAAG,MAAM,EAAE;AAAA,kBAC7C,WAAW,CAAC,MAAM,cAAc,GAAG,MAAM,EAAE;AAAA,kBAC3C,gBAAgB,CAAC,MAAM,mBAAmB,GAAG,MAAM,EAAE;AAAA;AAAA,gBAtBhD,MAAM;AAAA,cAuBb,CACD;AAAA,cAEA,YACC;AAAA,gBAAC;AAAA;AAAA,kBACC,QAAQ,SAAS;AAAA,kBACjB,QAAQ,SAAS;AAAA,kBACjB,aAAa,SAAS;AAAA,kBACtB,gBAAgB,KAAK,IAAI,IAAI,SAAS,cAAc,CAAC;AAAA,kBACrD,oBAAoB;AAAA,kBACpB,MAAM,SAAS;AAAA,kBACf,eAAe;AAAA,kBACf,cAAc;AAAA,kBACd,MAAM,SAAS;AAAA;AAAA,cACjB;AAAA,cAGF;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK;AAAA,kBACL,eAAe;AAAA,kBACf,gBAAgB;AAAA,oBACd;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,kBACF;AAAA,kBACA,YAAY;AAAA,kBACZ,YAAY,CAAC,GAAG,CAAC;AAAA;AAAA,cACnB;AAAA,eACF;AAAA;AAAA,QACF;AAAA,MAEJ;AAAA,IACF;AAEA,eAAW,cAAc;AACzB,IAAO,qBAAQ;AAAA;AAAA;;;ACnef;AAAA;AAAA;AAAA;AAAA,IAEAC,gBAOAC,qBAqUQC,qBAjUF,aAoXC;AAjYP;AAAA;AAAA;AAEA,IAAAF,iBAMO;AACP,IAAAC,sBAAkD;AAClD;AACA;AAmUQ,IAAAC,sBAAA;AAjUR,IAAM,kBAAc;AAAA,MAClB,CACE;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,GACA,QACG;AACH,cAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,IAAI;AAC/C,cAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,IAAI;AACjD,cAAM,eAAW,uBAAO,IAAI;AAC5B,cAAM,YAAQ,uBAAO,IAAI;AAEzB,gDAAoB,KAAK,OAAO;AAAA,UAC9B,SAAS,MAAM;AACb,sBAAU,OAAO;AACjB,uBAAW,CAAC,CAAC;AACb,0BAAc,IAAI;AAAA,UACpB;AAAA,QACF,EAAE;AAEF,sCAAU,MAAM;AACd,cAAI,SAAS,SAAS;AACpB,kBAAM,QAAQ,SAAS;AACvB,kBAAM,MAAM,KAAK;AACjB,kBAAM,OAAO,MAAM;AACnB,kBAAM,UAAU;AAAA,UAClB;AAAA,QACF,GAAG,CAAC,OAAO,MAAM,CAAC;AAElB,sCAAU,MAAM;AACd,gBAAM,gBAAgB,CAAC,MAAM;AAC3B,iBAAK,EAAE,QAAQ,YAAY,EAAE,QAAQ,gBAAgB,YAAY;AAC/D,yBAAW,CAAC,WAAW,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO,UAAU,CAAC;AAChE,4BAAc,IAAI;AAAA,YACpB;AAAA,UACF;AACA,iBAAO,iBAAiB,WAAW,aAAa;AAChD,iBAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,QAClE,GAAG,CAAC,YAAY,UAAU,CAAC;AAE3B,cAAM,mBAAmB,CAAC,MAAM;AAC9B,cAAI,CAAC,OAAQ;AACb,cAAI,EAAE,KAAK;AACT,cAAE,IAAI,eAAe;AAAA,UACvB;AAEA,gBAAM,iBAAiB,EAAE,WAAW,EAAE,OAAO,SAAS;AACtD,cAAI,CAAC,eAAgB;AAErB,cAAI,YAAY;AACd,0BAAc,IAAI;AAClB,gBAAI,mBAAmB;AACrB,gCAAkB;AAAA,YACpB;AAAA,UACF;AAEA,gBAAM,MAAM,EAAE,OAAO,SAAS,EAAE,mBAAmB;AACnD,cAAI,CAAC,IAAK;AAEV,gBAAM,KAAK,UAAU,KAAK,IAAI,CAAC;AAC/B,uBAAa;AAAA,YACX;AAAA,YACA,GAAG,IAAI;AAAA,YACP,GAAG,IAAI;AAAA,YACP,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,aAAa;AAAA,YACb;AAAA,YACA,WAAW;AAAA,YACX,MAAM,eAAe,aAAa,SAAS;AAAA,YAC3C,MACE,mBAAmB,oBAAoB,gBACnC,kBACA;AAAA,UACR,CAAC;AACD,wBAAc,EAAE;AAAA,QAClB;AAEA,cAAM,kBAAkB,CAAC,MAAM;AAC7B,cAAI,CAAC,UAAU,CAAC,UAAW;AAC3B,cAAI,EAAE,KAAK;AACT,cAAE,IAAI,eAAe;AAAA,UACvB;AAEA,gBAAM,MAAM,EAAE,OAAO,SAAS,EAAE,mBAAmB;AACnD,cAAI,CAAC,IAAK;AAEV,gBAAM,KAAK,IAAI,IAAI,UAAU;AAC7B,gBAAM,KAAK,IAAI,IAAI,UAAU;AAC7B,uBAAa;AAAA,YACX,GAAG;AAAA,YACH,QAAQ,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE;AAAA,UACrC,CAAC;AAAA,QACH;AAEA,cAAM,gBAAgB,CAAC,MAAM;AAC3B,cAAI,CAAC,UAAU,CAAC,UAAW;AAC3B,cAAI,EAAE,KAAK;AACT,cAAE,IAAI,eAAe;AAAA,UACvB;AAEA,cAAI,UAAU,UAAU,iBAAiB,mBAAmB;AAC1D,uBAAW,CAAC,OAAO,CAAC,GAAG,IAAI,SAAS,CAAC;AACrC,gBAAI,OAAO;AACT,oBAAM,SAAS;AAAA,YACjB;AAAA,UACF;AACA,uBAAa,IAAI;AAAA,QACnB;AAEA,cAAM,oBAAoB,CAAC,OAAO;AAChC,gBAAM,gBAAgB,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAErD,wBAAc,EAAE;AAChB,mBAAS,eAAe,UAAU,SAAS;AAC3C,6BAAmB,eAAe,QAAQ,aAAa;AACvD,uBAAa,eAAe,eAAe,CAAC;AAC5C,yBAAe,eAAe,eAAe,OAAO;AAEpD,cAAI,iBAAiB;AACnB,4BAAgB,IAAI,QAAQ;AAAA,UAC9B;AAAA,QACF;AAEA,cAAM,qBAAqB,CAAC,GAAG,OAAO;AACpC,gBAAM,OAAO,EAAE;AACf,gBAAM,iBAAiB,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACtD,cAAI,CAAC,eAAgB;AAErB,gBAAM,SAAS,KAAK,OAAO;AAC3B,gBAAM,SAAS,KAAK,OAAO;AAC3B,gBAAM,eAAe,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG,KAAK,IAAI,MAAM,CAAC;AAChE,gBAAM,YAAY,KAAK;AAAA,YACrB,eAAe,SAAS;AAAA,YACxB,iBAAiB;AAAA,UACnB;AAEA,gBAAM,aAAa,eAAe;AAClC,gBAAM,aAAa,eAAe;AAElC,eAAK,OAAO,SAAS;AACrB,eAAK,EAAE,UAAU;AACjB,eAAK,EAAE,UAAU;AACjB,eAAK,OAAO,CAAC;AACb,eAAK,OAAO,CAAC;AACb,eAAK,SAAS,CAAC;AAEf,eAAK,SAAS,EAAE,UAAU;AAE1B,gBAAMC,aAAY;AAAA,YAChB,GAAG;AAAA,YACH,QAAQ;AAAA,YACR,GAAG;AAAA,YACH,GAAG;AAAA,UACL;AAEA,qBAAW,CAAC,OAAO,GAAG,IAAI,CAAC,MAAO,EAAE,OAAO,KAAKA,aAAY,CAAE,CAAC;AAE/D,cAAI,UAAU,gBAAgB;AAC5B,kBAAM,aAAa,eAAe,WAAW;AAC7C,gBAAI,YAAY;AACd,qBAAO,IAAIA,YAAW,cAAc;AAAA,YACtC;AAAA,UACF;AAAA,QACF;AAEA,cAAM,iBAAiB,CAAC,GAAG,OAAO;AAChC,gBAAM,QAAQ,EAAE,OAAO,SAAS;AAChC,gBAAM,OAAO,EAAE;AACf,gBAAM,EAAE,GAAG,EAAE,IAAI,KAAK,SAAS;AAE/B,gBAAM,iBAAiB,MAAM,UAAU;AACvC,gBAAM,YAAY,eAAe,sBAAsB;AACvD,gBAAM,UAAU,UAAU,OAAO;AACjC,gBAAM,UAAU,UAAU,MAAM;AAEhC,cAAI,2BAA2B,sBAAsB;AACnD,kBAAM,cAAc,wBAAwB,SAAS,OAAO;AAC5D,iCAAqB,WAAW;AAAA,UAClC;AAAA,QACF;AAEA,cAAM,gBAAgB,CAAC,GAAG,OAAO;AAC/B,gBAAM,QAAQ,EAAE,OAAO,SAAS;AAChC,gBAAM,OAAO,EAAE;AACf,gBAAM,EAAE,GAAG,EAAE,IAAI,KAAK,SAAS;AAE/B,gBAAM,iBAAiB,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAEtD,cAAI,sBAAsB;AACxB,iCAAqB,KAAK;AAAA,UAC5B;AAEA,gBAAM,iBAAiB,MAAM,UAAU;AACvC,gBAAM,YAAY,eAAe,sBAAsB;AACvD,gBAAM,UAAU,UAAU,OAAO;AACjC,gBAAM,UAAU,UAAU,MAAM;AAEhC,cACE,2BACA,wBAAwB,SAAS,OAAO,GACxC;AACA,uBAAW,CAACC,aAAYA,SAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;AAC1D,0BAAc,IAAI;AAClB,gBAAI,kBAAmB,mBAAkB;AACzC;AAAA,UACF;AAEA;AAAA,YAAW,CAACA,aACVA,SAAQ,IAAI,CAAC,MAAO,EAAE,OAAO,KAAK,EAAE,GAAG,GAAG,GAAG,EAAE,IAAI,CAAE;AAAA,UACvD;AAEA,cACE,UACA,mBACC,eAAe,MAAM,KAAK,eAAe,MAAM,IAChD;AACA,kBAAMD,aAAY,EAAE,GAAG,gBAAgB,GAAG,EAAE;AAC5C,mBAAO,IAAIA,YAAW,cAAc;AAAA,UACtC;AAAA,QACF;AAEA,sCAAU,MAAM;AACd,cAAI,MAAM,WAAW,cAAc,SAAS,SAAS;AACnD,kBAAM,OAAO,SAAS,QAAQ,QAAQ,IAAI,UAAU,EAAE;AACtD,gBAAI,MAAM;AACR,oBAAM,QAAQ,MAAM,CAAC,IAAI,CAAC;AAC1B,oBAAM,QAAQ,SAAS,EAAE,UAAU;AAAA,YACrC;AAAA,UACF,WAAW,MAAM,SAAS;AACxB,kBAAM,QAAQ,MAAM,CAAC,CAAC;AACtB,kBAAM,QAAQ,SAAS,EAAE,UAAU;AAAA,UACrC;AAAA,QACF,GAAG,CAAC,YAAY,OAAO,CAAC;AAExB,sCAAU,MAAM;AACd,cAAI,YAAY;AACd;AAAA,cAAW,CAAC,OACV,GAAG;AAAA,gBAAI,CAAC,MACN,EAAE,OAAO,aACL;AAAA,kBACE,GAAG;AAAA,kBACH,QAAQ;AAAA,kBACR,aAAa;AAAA,kBACb;AAAA,kBACA,MAAM,eAAe,aAAa,SAAS;AAAA,kBAC3C,GAAI,mBACF,oBAAoB,iBAAiB;AAAA,oBACnC,MAAM;AAAA,kBACR;AAAA,gBACJ,IACA;AAAA,cACN;AAAA,YACF;AAAA,UACF;AAAA,QACF,GAAG;AAAA,UACD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,eACE;AAAA,UAAC;AAAA;AAAA,YACC,KAAK;AAAA,YACL;AAAA,YACA;AAAA,YACA,OAAO;AAAA,cACL,UAAU;AAAA,cACV,OAAO;AAAA,cACP,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,eAAe,SAAS,SAAS;AAAA,YACnC;AAAA,YACA,aAAa;AAAA,YACb,aAAa;AAAA,YACb,WAAW;AAAA,YACX,cAAc;AAAA,YACd,aAAa;AAAA,YACb,YAAY;AAAA,YACZ,SAAS,CAAC,MAAM;AACd,oBAAM,iBAAiB,EAAE,WAAW,EAAE,OAAO,SAAS;AACtD,kBAAI,kBAAkB,YAAY;AAChC,8BAAc,IAAI;AAClB,oBAAI,mBAAmB;AACrB,oCAAkB;AAAA,gBACpB;AAAA,cACF;AAAA,YACF;AAAA,YACA,OAAO,CAAC,MAAM;AACZ,oBAAM,iBAAiB,EAAE,WAAW,EAAE,OAAO,SAAS;AACtD,kBAAI,kBAAkB,YAAY;AAChC,8BAAc,IAAI;AAClB,oBAAI,mBAAmB;AACrB,oCAAkB;AAAA,gBACpB;AAAA,cACF;AAAA,YACF;AAAA,YAEA,wDAAC,6BACE;AAAA,sBAAQ,IAAI,CAAC,WACZ;AAAA,gBAAC;AAAA;AAAA,kBAEC,IAAI,OAAO;AAAA,kBACX,GAAG,OAAO;AAAA,kBACV,GAAG,OAAO;AAAA,kBACV,QAAQ,OAAO;AAAA,kBACf,QAAQ,OAAO;AAAA,kBACf,aAAa,OAAO;AAAA,kBACpB,MAAM,OAAO;AAAA,kBACb,WAAW,OAAO;AAAA,kBAClB,MAAM,OAAO;AAAA,kBACb,SAAS,MAAM,kBAAkB,OAAO,EAAE;AAAA,kBAC1C,OAAO,MAAM,kBAAkB,OAAO,EAAE;AAAA,kBACxC,YAAY,CAAC,MAAM,eAAe,GAAG,OAAO,EAAE;AAAA,kBAC9C,WAAW,CAAC,MAAM,cAAc,GAAG,OAAO,EAAE;AAAA,kBAC5C,gBAAgB,CAAC,MAAM,mBAAmB,GAAG,OAAO,EAAE;AAAA;AAAA,gBAdjD,OAAO;AAAA,cAed,CACD;AAAA,cACA,aACC;AAAA,gBAAC;AAAA;AAAA,kBACC,GAAG,UAAU;AAAA,kBACb,GAAG,UAAU;AAAA,kBACb,QAAQ,UAAU;AAAA,kBAClB,QAAQ,UAAU;AAAA,kBAClB,aAAa,UAAU;AAAA,kBACvB,MAAM,UAAU;AAAA,kBAChB,MAAM,UAAU;AAAA;AAAA,cAClB;AAAA,cAEF;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK;AAAA,kBACL,eAAe;AAAA,kBACf,gBAAgB;AAAA,oBACd;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,kBACF;AAAA,kBACA,YAAY;AAAA,kBACZ,YAAY,CAAC,GAAG,CAAC;AAAA,kBACjB,WAAW;AAAA,kBACX,iBAAiB;AAAA;AAAA,cACnB;AAAA,eACF;AAAA;AAAA,QACF;AAAA,MAEJ;AAAA,IACF;AAEA,IAAO,sBAAQ;AAAA;AAAA;;;ACjYf;AAAA;AAAA;AAAA;AAAA,IAEAE,gBAOAC,qBAiZQC,sBA7YF,kBA4cC;AAzdP;AAAA;AAAA;AAEA,IAAAF,iBAMO;AACP,IAAAC,sBAAiD;AACjD;AACA;AA+YQ,IAAAC,uBAAA;AA7YR,IAAM,uBAAmB;AAAA,MACvB,CACE;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,GACA,QACG;AACH,cAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,IAAI;AAC7C,cAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,IAAI;AACjD,cAAM,eAAW,uBAAO,IAAI;AAC5B,cAAM,YAAQ,uBAAO,IAAI;AAGzB,cAAM,WAAW,OAAO,WAAW,eAAe,OAAO,aAAa;AAEtE,gDAAoB,KAAK,OAAO;AAAA,UAC9B,SAAS,MAAM;AACb,sBAAU,MAAM;AAChB,sBAAU,CAAC,CAAC;AACZ,0BAAc,IAAI;AAAA,UACpB;AAAA,QACF,EAAE;AAGF,sCAAU,MAAM;AACd,cAAI,CAAC,QAAQ;AACX,0BAAc,IAAI;AAClB,gBAAI,mBAAmB;AACrB,gCAAkB;AAAA,YACpB;AAAA,UACF;AAAA,QACF,GAAG,CAAC,QAAQ,iBAAiB,CAAC;AAE9B,sCAAU,MAAM;AACd,cAAI,SAAS,SAAS;AACpB,kBAAM,QAAQ,SAAS;AACvB,kBAAM,MAAM,KAAK;AACjB,kBAAM,OAAO,MAAM;AACnB,kBAAM,UAAU;AAAA,UAClB;AAAA,QACF,GAAG,CAAC,OAAO,MAAM,CAAC;AAElB,sCAAU,MAAM;AACd,cAAI,MAAM,WAAW,SAAS,SAAS;AACrC,gBAAI,YAAY;AACd,oBAAM,OAAO,SAAS,QAAQ,QAAQ,IAAI,UAAU,EAAE;AACtD,kBAAI,MAAM;AACR,sBAAM,QAAQ,MAAM,CAAC,IAAI,CAAC;AAAA,cAC5B,OAAO;AACL,sBAAM,QAAQ,MAAM,CAAC,CAAC;AAAA,cACxB;AAAA,YACF,OAAO;AACL,oBAAM,QAAQ,MAAM,CAAC,CAAC;AAAA,YACxB;AACA,kBAAM,QAAQ,SAAS,EAAE,UAAU;AAAA,UACrC;AAAA,QACF,GAAG,CAAC,YAAY,MAAM,CAAC;AAEvB,sCAAU,MAAM;AACd,cAAI,MAAM,WAAW,cAAc,SAAS,SAAS;AACnD,kBAAM,OAAO,SAAS,QAAQ,QAAQ,IAAI,UAAU,EAAE;AACtD,gBAAI,MAAM;AACR,oBAAM,QAAQ,MAAM,CAAC,IAAI,CAAC;AAC1B,oBAAM,QAAQ,SAAS,EAAE,UAAU;AAAA,YACrC;AAAA,UACF,WAAW,MAAM,SAAS;AACxB,kBAAM,QAAQ,MAAM,CAAC,CAAC;AACtB,kBAAM,QAAQ,SAAS,EAAE,UAAU;AAAA,UACrC;AAAA,QACF,GAAG,CAAC,YAAY,MAAM,CAAC;AAEvB,sCAAU,MAAM;AACd,cAAI,YAAY;AACd;AAAA,cAAU,CAAC,SACT,KAAK;AAAA,gBAAI,CAAC,MACR,EAAE,OAAO,aACL;AAAA,kBACE,GAAG;AAAA,kBACH,QAAQ;AAAA,kBACR,aAAa;AAAA,kBACb;AAAA,kBACA,MAAM,eAAe,aAAa,SAAS;AAAA,gBAC7C,IACA;AAAA,cACN;AAAA,YACF;AAAA,UACF;AAAA,QACF,GAAG,CAAC,OAAO,YAAY,WAAW,aAAa,SAAS,CAAC;AAEzD,cAAM,mBAAmB,CAAC,MAAM;AAC9B,cAAI,CAAC,OAAQ;AACb,cAAI,EAAE,OAAO,EAAE,IAAI,YAAY;AAC7B,cAAE,IAAI,eAAe;AAAA,UACvB;AAEA,gBAAM,iBAAiB,EAAE,WAAW,EAAE,OAAO,SAAS;AACtD,cAAI,CAAC,eAAgB;AAErB,cAAI,YAAY;AACd,0BAAc,IAAI;AAClB,gBAAI,mBAAmB;AACrB,gCAAkB;AAAA,YACpB;AAAA,UACF;AAEA,gBAAM,MAAM,EAAE,OAAO,SAAS,EAAE,mBAAmB;AACnD,cAAI,CAAC,IAAK;AAEV,gBAAM,KAAK,gBAAgB,KAAK,IAAI,CAAC;AACrC,sBAAY;AAAA,YACV;AAAA,YACA,QAAQ,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAAA,YACnC,QAAQ;AAAA,YACR,aAAa;AAAA,YACb,WAAW;AAAA,YACX;AAAA,YACA,MAAM,eAAe,aAAa,SAAS;AAAA,UAC7C,CAAC;AACD,wBAAc,EAAE;AAAA,QAClB;AAEA,cAAM,kBAAkB,CAAC,MAAM;AAC7B,cAAI,CAAC,UAAU,CAAC,SAAU;AAC1B,cAAI,EAAE,OAAO,EAAE,IAAI,YAAY;AAC7B,cAAE,IAAI,eAAe;AAAA,UACvB;AAEA,gBAAM,MAAM,EAAE,OAAO,SAAS,EAAE,mBAAmB;AACnD,cAAI,CAAC,IAAK;AAEV,sBAAY;AAAA,YACV,GAAG;AAAA,YACH,QAAQ,CAAC,SAAS,OAAO,CAAC,GAAG,SAAS,OAAO,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAAA,UAC/D,CAAC;AAAA,QACH;AAEA,cAAM,gBAAgB,CAAC,MAAM;AAC3B,cAAI,CAAC,UAAU,CAAC,SAAU;AAC1B,cAAI,EAAE,OAAO,EAAE,IAAI,YAAY;AAC7B,cAAE,IAAI,eAAe;AAAA,UACvB;AAEA,gBAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,SAAS;AAClC,gBAAM,cAAc,KAAK;AAAA,YACvB,KAAK,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,CAAC;AAAA,UAC5C;AAEA,cAAI,eAAe,iBAAiB,yBAAyB;AAC3D,sBAAU,CAAC,SAAS,CAAC,GAAG,MAAM,QAAQ,CAAC;AACvC,gBAAI,OAAO;AACT,oBAAM,QAAQ;AAAA,YAChB;AAAA,UACF,OAAO;AAEL,0BAAc,IAAI;AAClB,gBAAI,mBAAmB;AACrB,gCAAkB;AAAA,YACpB;AAAA,UACF;AACA,sBAAY,IAAI;AAAA,QAClB;AAEA,cAAM,iBAAiB,CAAC,MAAM;AAC5B,cAAI,UAAU;AACZ,0BAAc,CAAC;AAAA,UACjB;AAAA,QACF;AAEA,cAAM,oBAAoB,CAAC,QAAQ,aAAa,iBAAiB;AAC/D,gBAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI;AACzB,gBAAM,gBAAgB,KAAK,IAAI,GAAG,KAAK,IAAI,aAAa,EAAE,CAAC;AAC3D,gBAAM,gBAAgB,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,EAAE,CAAC;AAC5D,gBAAM,gBAAgB,KAAK,IAAI,GAAG,KAAK,IAAI,aAAa,EAAE,CAAC;AAC3D,gBAAM,gBAAgB,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,EAAE,CAAC;AAC5D,iBAAO,CAAC,eAAe,eAAe,eAAe,aAAa;AAAA,QACpE;AAEA,cAAM,mBAAmB,CAAC,OAAO;AAC/B,gBAAM,eAAe,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAEnD,wBAAc,EAAE;AAChB,mBAAS,cAAc,UAAU,SAAS;AAC1C,cAAI,cAAc,aAAa;AAC7B,2BAAe,aAAa,WAAW;AAAA,UACzC;AACA,uBAAa,cAAc,eAAe,CAAC;AAE3C,cAAI,iBAAiB;AACnB,4BAAgB,IAAI,cAAc;AAAA,UACpC;AAAA,QACF;AAEA,cAAM,qBAAqB,CAAC,GAAG,OAAO;AACpC,gBAAM,OAAO,EAAE;AACf,gBAAM,gBAAgB,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAEpD,gBAAM,SAAS,KAAK,OAAO;AAC3B,gBAAM,SAAS,KAAK,OAAO;AAC3B,gBAAM,WAAW,KAAK,SAAS;AAC/B,gBAAM,YAAY,KAAK,OAAO;AAE9B,gBAAM,WAAW,UAAU,CAAC,IAAI,UAAU,CAAC,KAAK;AAChD,gBAAM,WAAW,UAAU,CAAC,IAAI,UAAU,CAAC,KAAK;AAEhD,gBAAM,iBAAiB,KAAK;AAAA,YAC1B,KAAK,IAAI,UAAU,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,IACrC,KAAK,IAAI,UAAU,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC;AAAA,UAC3C;AACA,gBAAM,gBAAgB,KAAK;AAAA,YACzB,UAAU,CAAC,IAAI,UAAU,CAAC;AAAA,YAC1B,UAAU,CAAC,IAAI,UAAU,CAAC;AAAA,UAC5B;AAEA,gBAAM,YAAY,iBAAiB,KAAK,IAAI,QAAQ,MAAM;AAC1D,gBAAM,WAAW,gBAAiB,WAAW,KAAK,KAAM;AAExD,gBAAM,aAAa,YAAY;AAC/B,cAAI,YAAY;AAAA,YACd,UAAU,aAAa,KAAK,IAAI,QAAQ;AAAA,YACxC,UAAU,aAAa,KAAK,IAAI,QAAQ;AAAA,YACxC,UAAU,aAAa,KAAK,IAAI,QAAQ;AAAA,YACxC,UAAU,aAAa,KAAK,IAAI,QAAQ;AAAA,UAC1C;AAEA,gBAAM,oBAAoB,kBAAkB,WAAW,OAAO,MAAM;AAEpE,eAAK,OAAO,CAAC;AACb,eAAK,OAAO,CAAC;AACb,eAAK,SAAS,CAAC;AACf,eAAK,EAAE,CAAC;AACR,eAAK,EAAE,CAAC;AAER,gBAAMC,YAAW;AAAA,YACf,GAAG;AAAA,YACH,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,aAAa;AAAA,YACb;AAAA,YACA,MAAM,eAAe,aAAa,SAAS;AAAA,UAC7C;AAEA,oBAAU,CAAC,SAAS,KAAK,IAAI,CAAC,MAAO,EAAE,OAAO,KAAKA,YAAW,CAAE,CAAC;AAEjE,cAAI,UAAU,eAAe;AAC3B,kBAAM,aAAa,CAAC,cAAc,OAAO;AAAA,cACvC,CAAC,OAAO,UAAU,UAAU,kBAAkB,KAAK;AAAA,YACrD;AACA,gBAAI,YAAY;AACd,qBAAO,IAAIA,WAAU,aAAa;AAAA,YACpC;AAAA,UACF;AAAA,QACF;AAEA,cAAM,iBAAiB,CAAC,GAAG,OAAO;AAChC,gBAAM,QAAQ,EAAE,OAAO,SAAS;AAChC,gBAAM,OAAO,EAAE;AACf,gBAAM,EAAE,GAAG,EAAE,IAAI,KAAK,SAAS;AAE/B,gBAAM,YAAY,KAAK,OAAO;AAC9B,gBAAM,WAAW,UAAU,CAAC,IAAI,UAAU,CAAC,KAAK;AAChD,gBAAM,WAAW,UAAU,CAAC,IAAI,UAAU,CAAC,KAAK;AAEhD,gBAAM,iBAAiB,MAAM,UAAU;AACvC,gBAAM,YAAY,eAAe,sBAAsB;AAEvD,gBAAM,UAAU,UAAU,OAAO,UAAU;AAC3C,gBAAM,UAAU,UAAU,MAAM,UAAU;AAE1C,cAAI,2BAA2B,sBAAsB;AACnD,kBAAM,cAAc,wBAAwB,SAAS,OAAO;AAC5D,iCAAqB,WAAW;AAAA,UAClC;AAAA,QACF;AAEA,cAAM,gBAAgB,CAAC,GAAG,OAAO;AAC/B,gBAAM,OAAO,EAAE;AACf,gBAAM,QAAQ,EAAE,OAAO,SAAS;AAChC,gBAAM,IAAI,KAAK,EAAE;AACjB,gBAAM,IAAI,KAAK,EAAE;AAEjB,gBAAM,gBAAgB,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAEpD,cAAI,sBAAsB;AACxB,iCAAqB,KAAK;AAAA,UAC5B;AAEA,gBAAM,iBAAiB,MAAM,UAAU;AACvC,gBAAM,YAAY,eAAe,sBAAsB;AAEvD,gBAAM,YAAY,KAAK,OAAO;AAC9B,gBAAM,WAAW,UAAU,CAAC,IAAI,UAAU,CAAC,KAAK;AAChD,gBAAM,WAAW,UAAU,CAAC,IAAI,UAAU,CAAC,KAAK;AAEhD,gBAAM,UAAU,UAAU,OAAO,UAAU;AAC3C,gBAAM,UAAU,UAAU,MAAM,UAAU;AAE1C,cACE,2BACA,wBAAwB,SAAS,OAAO,GACxC;AACA,sBAAU,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;AACnD,0BAAc,IAAI;AAClB,gBAAI,kBAAmB,mBAAkB;AACzC;AAAA,UACF;AAEA,gBAAM,KAAK;AACX,gBAAM,KAAK;AAEX,cAAI,YAAY;AAAA,YACd,UAAU,CAAC,IAAI;AAAA,YACf,UAAU,CAAC,IAAI;AAAA,YACf,UAAU,CAAC,IAAI;AAAA,YACf,UAAU,CAAC,IAAI;AAAA,UACjB;AAEA,sBAAY,kBAAkB,WAAW,OAAO,MAAM;AAEtD,eAAK,EAAE,CAAC;AACR,eAAK,EAAE,CAAC;AAER,gBAAMA,YAAW;AAAA,YACf,GAAG;AAAA,YACH,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,aAAa;AAAA,YACb;AAAA,YACA,MAAM,eAAe,aAAa,SAAS;AAAA,UAC7C;AAEA,oBAAU,CAAC,SAAS,KAAK,IAAI,CAAC,MAAO,EAAE,OAAO,KAAKA,YAAW,CAAE,CAAC;AAEjE,cAAI,UAAU,eAAe;AAC3B,kBAAM,aAAa,CAAC,cAAc,OAAO;AAAA,cACvC,CAAC,OAAO,UAAU,UAAU,UAAU,KAAK;AAAA,YAC7C;AACA,gBAAI,YAAY;AACd,qBAAO,IAAIA,WAAU,aAAa;AAAA,YACpC;AAAA,UACF;AAAA,QACF;AAEA,eACE;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA,KAAK;AAAA,YACL,OAAO;AAAA,cACL,UAAU;AAAA,cACV,OAAO;AAAA,cACP,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,QAAQ;AAAA,cACR,eAAe,SAAS,SAAS;AAAA,YACnC;AAAA,YACA,aAAa;AAAA,YACb,aAAa;AAAA,YACb,WAAW;AAAA,YACX,cAAc;AAAA,YACd,aAAa;AAAA,YACb,YAAY;AAAA,YACZ,SAAS,CAAC,MAAM;AACd,oBAAM,iBAAiB,EAAE,WAAW,EAAE,OAAO,SAAS;AACtD,kBAAI,kBAAkB,YAAY;AAChC,8BAAc,IAAI;AAClB,oBAAI,mBAAmB;AACrB,oCAAkB;AAAA,gBACpB;AAAA,cACF;AAAA,YACF;AAAA,YACA,OAAO,CAAC,MAAM;AACZ,oBAAM,iBAAiB,EAAE,WAAW,EAAE,OAAO,SAAS;AACtD,kBAAI,kBAAkB,YAAY;AAChC,8BAAc,IAAI;AAClB,oBAAI,mBAAmB;AACrB,oCAAkB;AAAA,gBACpB;AAAA,cACF;AAAA,YACF;AAAA,YAEA,yDAAC,6BACE;AAAA,qBAAO,IAAI,CAAC,UACX;AAAA,gBAAC;AAAA;AAAA,kBAEC,IAAI,MAAM;AAAA,kBACV,QAAQ,MAAM;AAAA,kBACd,QAAQ,MAAM;AAAA,kBACd,aAAa,MAAM;AAAA,kBACnB,gBAAgB,KAAK,IAAI,IAAI,MAAM,cAAc,CAAC;AAAA,kBAClD,oBAAoB;AAAA,kBACpB,MAAM,MAAM;AAAA,kBACZ,eAAe;AAAA,kBACf,cAAc;AAAA,kBACd,MAAM,MAAM;AAAA,kBACZ,WAAW,MAAM;AAAA,kBACjB,SAAS,CAAC,MAAM;AACd,sBAAE,eAAe;AACjB,qCAAiB,MAAM,EAAE;AAAA,kBAC3B;AAAA,kBACA,OAAO,CAAC,MAAM;AACZ,sBAAE,eAAe;AACjB,qCAAiB,MAAM,EAAE;AAAA,kBAC3B;AAAA,kBACA,YAAY,CAAC,MAAM,eAAe,GAAG,MAAM,EAAE;AAAA,kBAC7C,WAAW,CAAC,MAAM,cAAc,GAAG,MAAM,EAAE;AAAA,kBAC3C,gBAAgB,CAAC,MAAM,mBAAmB,GAAG,MAAM,EAAE;AAAA,kBACrD,oBAAoB;AAAA,kBACpB,iBAAiB;AAAA;AAAA,gBAxBZ,MAAM;AAAA,cAyBb,CACD;AAAA,cACA,YACC;AAAA,gBAAC;AAAA;AAAA,kBACC,QAAQ,SAAS;AAAA,kBACjB,QAAQ,SAAS;AAAA,kBACjB,aAAa,SAAS;AAAA,kBACtB,gBAAgB,KAAK,IAAI,IAAI,SAAS,cAAc,CAAC;AAAA,kBACrD,oBAAoB;AAAA,kBACpB,eAAe;AAAA,kBACf,cAAc;AAAA,kBACd,MAAM,SAAS;AAAA,kBACf,MAAM,SAAS;AAAA,kBACf,oBAAoB;AAAA,kBACpB,iBAAiB;AAAA;AAAA,cACnB;AAAA,cAEF;AAAA,gBAAC;AAAA;AAAA,kBACC,KAAK;AAAA,kBACL,eAAe;AAAA,kBACf,gBAAgB;AAAA,oBACd;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,kBACF;AAAA,kBACA,YAAY;AAAA,kBACZ,YAAY,CAAC,GAAG,CAAC;AAAA;AAAA,cACnB;AAAA,eACF;AAAA;AAAA,QACF;AAAA,MAEJ;AAAA,IACF;AAEA,IAAO,2BAAQ;AAAA;AAAA;;;ACzdf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,IAAAC,iBAOO;AACP,gBAAwB;AACxB,gBAAkC;AAClC,IAAAC,uBAqBO;;;ACjCP,mBAAkB;AA2Bd;AAzBJ,IAAM,iBAAiB;AAAA,EACrB,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,WAAW;AAAA,EACX,aAAa;AACf;AAEA,IAAM,cAAc;AAAA,EAClB,SAAS;AAAA,EACT,MAAM;AAAA,EACN,IAAI;AACN;AAEO,SAAS,OAAO;AAAA,EACrB;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,WAAW;AAAA,EACX,OAAO;AAAA,EACP,YAAY;AAAA,EACZ;AACF,GAAG;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,iKAAiK,eAAe,OAAO,KAAK,eAAe,OAAO,IAAI,YAAY,IAAI,KAAK,YAAY,OAAO,IAAI,SAAS;AAAA,MAErR;AAAA;AAAA,EACH;AAEJ;;;ACrCA,IAAAC,gBAAkB;AAId,IAAAC,sBAAA;AAFG,SAAS,MAAM,EAAE,UAAU,SAAS,YAAY,GAAG,GAAG;AAC3D,SACE,6CAAC,WAAM,SAAkB,WAAW,qCAAqC,SAAS,IAC/E,UACH;AAEJ;;;ACRA,IAAAC,gBAAkB;AAKd,IAAAC,sBAAA;AAHG,SAAS,OAAO,EAAE,OAAO,eAAe,SAAS,GAAG;AAEzD,SACE,8CAAC,SAAI,WAAU,YACb;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,UAAU,CAAC,MAAM,cAAc,EAAE,OAAO,KAAK;AAAA,QAC7C,WAAU;AAAA,QAET;AAAA;AAAA,IACH;AAAA,IACA,6CAAC,SAAI,WAAU,0FAAyF,oBAAC;AAAA,KAC3G;AAEJ;AAOO,SAAS,WAAW,EAAE,OAAO,SAAS,GAAG;AAE9C,SAAO,6CAAC,YAAO,OAAe,iBAAO,aAAa,WAAW,WAAW,OAAM;AAChF;;;AC1BA,IAAAC,gBAAkB;AAId,IAAAC,sBAAA;AAFG,SAAS,OAAO,EAAE,KAAK,KAAK,MAAM,OAAO,eAAe,YAAY,IAAI,GAAG,GAAG;AACnF,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,MAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,MAAM,CAAC;AAAA,MACd,UAAU,CAAC,MAAM,cAAc,CAAC,OAAO,EAAE,OAAO,KAAK,CAAC,CAAC;AAAA,MACvD,WAAW,oFAAoF,SAAS;AAAA;AAAA,EAC1G;AAEJ;;;ACfA,4BAAsB;AAEf,SAAS,WAAW;AACzB,SAAO;AAAA,IACL,OAAO,CAAC,EAAE,OAAO,aAAa,QAAQ,IAAI,CAAC,MAAM;AAC/C,YAAM,UAAU,cAAc,GAAG,KAAK,KAAK,WAAW,KAAK;AAC3D,UAAI,YAAY,eAAe;AAC7B,oCAAM,MAAM,SAAS,EAAE,WAAW,IAAK,CAAC;AAAA,MAC1C,OAAO;AACL,oCAAM,QAAQ,SAAS,EAAE,WAAW,IAAK,CAAC;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AACF;;;ACXA,IAAAC,gBAAgE;AAEzD,IAAM,YAAY,CAAC;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,CAAC,CAAC;AACvC,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,CAAC,CAAC;AACnD,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,wBAAS,IAAI;AACjE,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,IAAI;AAC7C,QAAM,CAAC,UAAU,WAAW,QAAI,wBAAS,IAAI;AAC7C,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAG5C,QAAM,eAAW,sBAAO;AAAA,IACtB,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAGD,+BAAU,MAAM;AACd,aAAS,UAAU;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAGD,QAAM,gBAAgB,CAAC,MAAM;AAC3B,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ,QAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AACjC,UAAM,OAAO,OAAO,sBAAsB;AAG1C,UAAM,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,UAAU,EAAE;AACrD,UAAM,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,UAAU,EAAE;AAErD,WAAO;AAAA,MACL,IAAI,UAAU,KAAK,SAAS,OAAO,QAAQ,KAAK;AAAA,MAChD,IAAI,UAAU,KAAK,QAAQ,OAAO,SAAS,KAAK;AAAA,IAClD;AAAA,EACF;AAEA,QAAM,aAAa,CAAC,KAAK,QAAQ,OAAO,MAAM,UAAU;AACtD,QAAI,OAAO,SAAS,EAAG;AACvB,QAAI,UAAU;AACd,QAAI,OAAO,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;AAEnC,aAAS,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK;AAC1C,YAAM,KAAK,OAAO,IAAI,CAAC,KAAK,OAAO,CAAC;AACpC,YAAM,KAAK,OAAO,CAAC;AACnB,YAAM,KAAK,OAAO,IAAI,CAAC;AACvB,YAAM,KAAK,OAAO,IAAI,CAAC,KAAK;AAE5B,YAAM,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK;AACpC,YAAM,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK;AACpC,YAAM,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK;AACpC,YAAM,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK;AAEpC,UAAI,cAAc,MAAM,MAAM,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC;AAAA,IACtD;AAEA,QAAI,cAAc;AAClB,QAAI,YAAY;AAChB,QAAI,UAAU;AACd,QAAI,WAAW;AAEf,QAAI,UAAU,SAAU,KAAI,YAAY,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC;AAAA,aACnD,UAAU,SAAU,KAAI,YAAY,CAAC,MAAM,IAAI,CAAC;AAAA,QACpD,KAAI,YAAY,CAAC,CAAC;AAEvB,QAAI,OAAO;AACX,QAAI,YAAY,CAAC,CAAC;AAAA,EACpB;AAEA,QAAM,WAAO,2BAAY,MAAM;AAC7B,UAAM,SAAS,UAAU;AACzB,UAAM,MAAM,QAAQ,WAAW,IAAI;AACnC,QAAI,CAAC,UAAU,CAAC,IAAK;AAErB,UAAM;AAAA,MACJ,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,SAAS;AAAA,MACT,oBAAoB;AAAA,MACpB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,aAAa;AAAA,MACb,cAAc;AAAA,MACd,eAAe;AAAA,IACjB,IAAI,SAAS;AAGb,QAAI,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAC/C,QAAI,QAAQ,SAAS;AACnB,YAAM,iBAAiB,MAAM,SAAS;AAAA,QACpC,CAAC,MAAM,EAAE,WAAW;AAAA,MACtB;AACA,sBAAgB,QAAQ,CAAC,MAAM,OAAO,QAAQ,mBAAmB,CAAC,CAAC;AAAA,IACrE;AAGA,gBAAY,QAAQ,CAAC,OAAO,QAAQ;AAClC,iBAAW,KAAK,OAAO,OAAO,MAAM,KAAK;AACzC,UAAI,WAAW,KAAK;AAClB,cAAM,QAAQ,CAAC,OAAO;AACpB,cAAI,UAAU;AACd,cAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,KAAK,EAAE;AACrC,cAAI,YAAY;AAChB,cAAI,KAAK;AAAA,QACX,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAGD,QAAI,aAAa,UAAU,SAAS,GAAG;AACrC,YAAM,gBAAgB,CAAC,GAAG,SAAS;AACnC,UAAI,SAAU,eAAc,KAAK,QAAQ;AACzC,iBAAW,KAAK,eAAe,OAAO,MAAM,KAAK;AAGjD,YAAM,YAAY,UAAU,UAAU,SAAS,CAAC;AAChD,UAAI,UAAU;AACZ,YAAI,UAAU;AACd,YAAI,OAAO,UAAU,GAAG,UAAU,CAAC;AACnC,YAAI,OAAO,SAAS,GAAG,SAAS,CAAC;AACjC,YAAI,cAAc;AAClB,YAAI,YAAY,CAAC,GAAG,CAAC,CAAC;AACtB,YAAI,OAAO;AAAA,MACb;AAAA,IACF;AAAA,EACF,GAAG,CAAC,WAAW,QAAQ,CAAC;AAExB,+BAAU,MAAM;AACd,SAAK;AAAA,EACP,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,mBAAe,2BAAY,MAAM;AACrC,UAAM;AAAA,MACJ,cAAc;AAAA,MACd,cAAc;AAAA,MACd,WAAW;AAAA,MACX,aAAa;AAAA,IACf,IAAI,SAAS;AAEb,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,SAAS,aAAa,WAAW,cAAc;AAAA,QACnD,QAAQ;AAAA,QACR;AAAA,QACA,aAAa;AAAA,QACb,aAAa;AAAA,MACf,CAAC;AACD,gBAAU,MAAM;AAGhB,sBAAgB,CAAC,CAAC;AAClB,iBAAW,KAAK;AAChB,oBAAc,IAAI;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,WAAW,cAAc,aAAa,CAAC;AAE3C,QAAM,cAAc,CAAC,MAAM;AACzB,QAAI,EAAE,SAAS,aAAc,GAAE,eAAe;AAE9C,UAAM,MAAM,cAAc,CAAC;AAC3B,UAAM;AAAA,MACJ,SAAS;AAAA,MACT,cAAc;AAAA,MACd,QAAQ;AAAA,IACV,IAAI,SAAS;AAEb,QAAI,WAAW;AAEb,YAAM,SAAS,UAAU,UAAU,SAAS,CAAC;AAC7C,UAAI,UAAU,KAAK,MAAM,OAAO,IAAI,IAAI,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,IAAI;AACjE,qBAAa;AACb;AAAA,MACF;AACA,sBAAgB,CAAC,SAAS,CAAC,GAAG,MAAM,GAAG,CAAC;AACxC;AAAA,IACF;AAGA,UAAM,SAAS,YAAY;AAAA,MAAU,CAAC,MACpC,EAAE,KAAK,CAAC,OAAO,KAAK,MAAM,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE;AAAA,IAC5D;AACA,QAAI,WAAW,IAAI;AACjB,4BAAsB,MAAM;AAC5B,YAAM,QAAQ,YAAY,MAAM,EAAE;AAAA,QAChC,CAAC,OAAO,KAAK,MAAM,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI;AAAA,MACnD;AACA,kBAAY,KAAK;AACjB;AAAA,IACF;AAEA,eAAW,IAAI;AACf,oBAAgB,CAAC,GAAG,CAAC;AAAA,EACvB;AAEA,QAAM,aAAa,CAAC,MAAM;AACxB,UAAM,MAAM,cAAc,CAAC;AAC3B,gBAAY,GAAG;AAEf,UAAM;AAAA,MACJ,UAAU;AAAA,MACV,oBAAoB;AAAA,MACpB,QAAQ;AAAA,IACV,IAAI,SAAS;AACb,QAAI,YAAY,QAAQ,WAAW,MAAM;AACvC,YAAM,YAAY,CAAC,GAAG,WAAW;AACjC,gBAAU,MAAM,EAAE,OAAO,IAAI;AAC7B,gBAAU,SAAS;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,YAAY,MAAM;AACtB,gBAAY,IAAI;AAAA,EAClB;AAGA,+BAAU,MAAM;AACd,WAAO,MAAM;AACX,YAAM;AAAA,QACJ,cAAc;AAAA,QACd,cAAc;AAAA,QACd,WAAW;AAAA,QACX,aAAa;AAAA,MACf,IAAI,SAAS;AAEb,UAAI,aAAa,UAAU,SAAS,GAAG;AACrC,cAAM,SAAS,aAAa,WAAW,cAAc;AAAA,UACnD,QAAQ;AAAA,UACR;AAAA,UACA,aAAa;AAAA,UACb,aAAa;AAAA,QACf,CAAC;AAED,mBAAW,MAAM;AACf,oBAAU,MAAM;AAAA,QAClB,GAAG,CAAC;AAAA,MACN;AAAA,IACF;AAAA,EACF,GAAG,CAAC,WAAW,YAAY,CAAC;AAE5B,+BAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AACb,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ;AAEb,WAAO,iBAAiB,aAAa,WAAW;AAChD,WAAO,iBAAiB,aAAa,UAAU;AAC/C,WAAO,iBAAiB,WAAW,SAAS;AAC5C,WAAO,iBAAiB,cAAc,aAAa,EAAE,SAAS,MAAM,CAAC;AACrE,WAAO,iBAAiB,aAAa,YAAY,EAAE,SAAS,MAAM,CAAC;AACnE,WAAO,iBAAiB,YAAY,SAAS;AAE7C,UAAM,YAAY,CAAC,MAAM;AACvB,UAAI,EAAE,QAAQ,QAAS,cAAa;AACpC,UAAI,EAAE,QAAQ,UAAU;AACtB,mBAAW,KAAK;AAChB,wBAAgB,CAAC,CAAC;AAAA,MACpB;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,SAAS;AAE5C,WAAO,MAAM;AACX,aAAO,oBAAoB,aAAa,WAAW;AACnD,aAAO,oBAAoB,aAAa,UAAU;AAClD,aAAO,oBAAoB,WAAW,SAAS;AAC/C,aAAO,oBAAoB,cAAc,WAAW;AACpD,aAAO,oBAAoB,aAAa,UAAU;AAClD,aAAO,oBAAoB,YAAY,SAAS;AAChD,aAAO,oBAAoB,WAAW,SAAS;AAAA,IACjD;AAAA,EACF,GAAG,CAAC,QAAQ,SAAS,CAAC;AAEtB,SAAO;AACT;;;ACzTA,IAAAC,gBAAgE;AAEhE,IAAM,iBAAiB,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,KAAK;AAC5C,QAAM,eAAW,sBAAO,CAAC,CAAC;AAC1B,QAAM,iBAAa,sBAAO;AAG1B,QAAM,eAAW,sBAAO;AAAA,IACtB,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAGD,+BAAU,MAAM;AACd,aAAS,UAAU;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAGD,QAAMC,iBAAgB,CAAC,KAAK,MAAM,IAAI,MAAM,UAAU;AACpD,UAAM,aAAa,KAAK,IAAI,IAAI,OAAO,GAAG;AAC1C,UAAM,QAAQ,KAAK,MAAM,GAAG,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,CAAC;AACrD,QAAI,KAAK;AACT,QAAI,cAAc;AAClB,QAAI,YAAY;AAChB,QAAI,YAAY,KAAK,IAAI,KAAK,OAAO,GAAG;AACxC,QAAI,UAAU;AACd,QAAI,WAAW;AACf,QAAI,UAAU;AACd,QAAI;AAAA,MACF,GAAG,IAAI,aAAa,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,MAChD,GAAG,IAAI,aAAa,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,IAClD;AACA,QAAI,OAAO,GAAG,GAAG,GAAG,CAAC;AACrB,QAAI;AAAA,MACF,GAAG,IAAI,aAAa,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,MAChD,GAAG,IAAI,aAAa,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,IAClD;AACA,QAAI,OAAO;AACX,QAAI,QAAQ;AAAA,EACd;AAEA,QAAM,mBAAe,2BAAY,MAAM;AACrC,UAAM,SAAS,UAAU;AACzB,UAAM,MAAM,QAAQ,WAAW,IAAI;AACnC,QAAI,CAAC,UAAU,CAAC,IAAK;AAErB,UAAM;AAAA,MACJ,cAAc;AAAA,MACd,WAAW;AAAA,MACX,aAAa;AAAA,MACb,cAAc;AAAA,MACd,eAAe;AAAA,IACjB,IAAI,SAAS;AAGb,QAAI,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAG/C,QAAI,QAAQ,WAAW,MAAM,SAAS;AACpC,YAAM,iBAAiB,KAAK,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS;AACxE,qBAAe,QAAQ,CAAC,MAAM,OAAO,QAAQ,mBAAmB,CAAC,CAAC;AAAA,IACpE;AAGA,UAAM,MAAM,SAAS;AACrB,QAAI,IAAI,UAAU,GAAG;AACnB,UAAI,KAAK;AACT,UAAI,UAAU;AACd,UAAI,OAAO,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;AAE7B,YAAM,QAAQ,IAAI,CAAC;AACnB,YAAM,MAAM,IAAI,IAAI,SAAS,CAAC;AAC9B,YAAM,MACJ,IAAI,WAAW,IACX,IAAI,CAAC,IACL,EAAE,IAAI,MAAM,IAAI,IAAI,KAAK,GAAG,IAAI,MAAM,IAAI,IAAI,KAAK,EAAE;AAE3D,UAAI,iBAAiB,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/C,UAAI,cAAc;AAClB,UAAI,YAAY;AAChB,UAAI,UAAU;AACd,UAAI,WAAW;AAEf,UAAI,UAAU,SAAU,KAAI,YAAY,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC;AAAA,eACnD,UAAU,SAAU,KAAI,YAAY,CAAC,MAAM,IAAI,CAAC;AAAA,UACpD,KAAI,YAAY,CAAC,CAAC;AAEvB,UAAI,OAAO;AACX,UAAI,YAAY,CAAC,CAAC;AAGlB,MAAAA,eAAc,KAAK,KAAK,KAAK,MAAM,KAAK;AACxC,MAAAA,eAAc,KAAK,KAAK,OAAO,MAAM,KAAK;AAC1C,UAAI,QAAQ;AAAA,IACd;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAGd,+BAAU,MAAM;AACd,QAAI,OAAQ,cAAa;AAAA,EAC3B,GAAG,CAAC,cAAc,QAAQ,YAAY,CAAC;AAEvC,QAAM,cAAc,CAAC,MAAM;AACzB,UAAM,SAAS,UAAU;AACzB,UAAM,OAAO,OAAO,sBAAsB;AAC1C,UAAM,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,UAAU,EAAE;AACrD,UAAM,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,UAAU,EAAE;AACrD,WAAO;AAAA,MACL,IAAI,UAAU,KAAK,SAAS,OAAO,QAAQ,KAAK;AAAA,MAChD,IAAI,UAAU,KAAK,QAAQ,OAAO,SAAS,KAAK;AAAA,IAClD;AAAA,EACF;AAEA,QAAM,cAAc,CAAC,MAAM;AACzB,QAAI,CAAC,OAAQ;AACb,QAAI,EAAE,WAAW,EAAE,QAAQ,SAAS,EAAG;AAEvC,UAAM,MAAM,YAAY,CAAC;AACzB,aAAS,UAAU,CAAC,KAAK,GAAG;AAC5B,eAAW,IAAI;AAAA,EACjB;AAEA,QAAM,aAAa,CAAC,MAAM;AACxB,QAAI,CAAC,SAAS,QAAQ,QAAS;AAC/B,QAAI,EAAE,WAAY,GAAE,eAAe;AAEnC,UAAM,MAAM,YAAY,CAAC;AACzB,UAAM,QAAQ,SAAS,QAAQ,CAAC;AAChC,QAAI,CAAC,MAAO;AAGZ,UAAM,WAAW;AAAA,MACf,IAAI,MAAM,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,KAAK;AAAA,MAC/C,IAAI,MAAM,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,KAAK;AAAA,IACjD;AAEA,aAAS,UAAU,CAAC,OAAO,UAAU,GAAG;AAExC,QAAI,WAAW,QAAS,sBAAqB,WAAW,OAAO;AAC/D,eAAW,UAAU,sBAAsB,YAAY;AAAA,EACzD;AAEA,QAAM,YAAY,MAAM;AACtB,QAAI,CAAC,SAAS,QAAQ,QAAS;AAC/B,eAAW,KAAK;AAChB,yBAAqB,WAAW,OAAO;AAEvC,QAAI,SAAS,QAAQ,UAAU,GAAG;AAChC,YAAM;AAAA,QACJ,cAAc;AAAA,QACd,WAAW;AAAA,QACX,aAAa;AAAA,MACf,IAAI,SAAS;AAEb,YAAM,SAAS;AAAA,QACb,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,SAAS;AAAA,UACP,QAAQ,CAAC,GAAG,SAAS,OAAO;AAAA,UAC5B;AAAA,UACA,aAAa;AAAA,UACb,aAAa;AAAA,QACf;AAAA,MACF;AACA,gBAAU,MAAM;AAChB,UAAI,cAAe,eAAc,SAAS,OAAO;AAAA,IACnD;AACA,aAAS,UAAU,CAAC;AAAA,EACtB;AAEA,+BAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AACb,UAAM,SAAS,UAAU;AACzB,QAAI,CAAC,OAAQ;AAGb,WAAO,iBAAiB,aAAa,WAAW;AAChD,WAAO,iBAAiB,cAAc,aAAa,EAAE,SAAS,MAAM,CAAC;AAGrE,WAAO,iBAAiB,aAAa,YAAY,EAAE,SAAS,MAAM,CAAC;AACnE,WAAO,iBAAiB,WAAW,SAAS;AAC5C,WAAO,iBAAiB,aAAa,YAAY,EAAE,SAAS,MAAM,CAAC;AACnE,WAAO,iBAAiB,YAAY,SAAS;AAC7C,WAAO,iBAAiB,eAAe,SAAS;AAEhD,WAAO,MAAM;AACX,aAAO,oBAAoB,aAAa,WAAW;AACnD,aAAO,oBAAoB,cAAc,WAAW;AAEpD,aAAO,oBAAoB,aAAa,UAAU;AAClD,aAAO,oBAAoB,WAAW,SAAS;AAC/C,aAAO,oBAAoB,aAAa,UAAU;AAClD,aAAO,oBAAoB,YAAY,SAAS;AAChD,aAAO,oBAAoB,eAAe,SAAS;AAAA,IACrD;AAAA,EACF,GAAG,CAAC,QAAQ,SAAS,CAAC;AAEtB,SAAO;AACT;AAEA,IAAO,yBAAQ;;;ACvOf,IAAAC,gBAAqD;AACrD,0BAaO;AA8GK,IAAAC,sBAAA;AA5GZ,IAAM,iBAAiB;AAEvB,IAAM,aAAa,CAAC;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,IAAI;AAEvC,QAAM,sBAAkB,sBAAO,EAAE;AACjC,QAAM,gBACJ,WAAW,aAAa,cAAc,gBAAgB;AAExD,QAAM,qBAAiB,sBAAO,CAAC,CAAC;AAChC,QAAM,sBAAkB,sBAAO,IAAI;AACnC,gBAAAC,QAAM,UAAU,MAAM;AACpB,QAAI,UAAU,QAAQ;AACpB,qBAAe,QAAQ,KAAK,gBAAgB,OAAO;AAAA,IACrD;AACA,oBAAgB,UAAU;AAAA,EAE5B,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,aAAa,CAAC,WAAW,SAAS;AACtC,oBAAgB,UAAU,aAAa;AACvC,mBAAe,UAAU,CAAC;AAC1B,oBAAgB,UAAU;AAC1B,QAAI,KAAM,kBAAiB,IAAI;AAC/B,aAAS,SAAS;AAAA,EACpB;AAEA,QAAM,eAAe,MAAM;AACzB,kBAAc,IAAI;AAClB,aAAS,IAAI;AAAA,EACf;AAEA,QAAM,gBAAgB,MAAM;AAC1B,kBAAc;AACd,iBAAa;AAAA,EACf;AAEA,QAAM,cAAc,MAAM,aAAa;AAEvC,QAAM,iBAAiB,MAAM;AAC3B,iBAAa,SAAS,QAAQ;AAC9B,mBAAe,SAAS,QAAQ;AAChC,kBAAc,SAAS,QAAQ;AAC/B,wBAAoB,SAAS,QAAQ;AACrC,kBAAc;AACd,iBAAa;AAAA,EACf;AAEA,QAAM,cAAc,MAAM;AACxB,cAAU;AACV,aAAS,IAAI;AAAA,EACf;AAEA,QAAM,cAAc,MAAM;AACxB,gBAAY,IAAI;AAChB,UAAM,MAAM,iBAAiB,SAAS,WAAW,IAAI;AACrD,QAAI,IAAK,KAAI,UAAU,GAAG,GAAG,IAAI,OAAO,OAAO,IAAI,OAAO,MAAM;AAChE,iBAAa;AAAA,EACf;AAEA,QAAM,WACJ;AACF,QAAM,WAAW,EAAE,QAAQ,eAAe;AAE1C,SACE,8CAAC,SAAI,WAAU,sDAEZ;AAAA,cAAU,QACT;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,QACX,OAAO;AAAA,UACL,GAAG;AAAA,UACH,SAAS,iBAAiB,IAAI;AAAA,UAC9B,eAAe,iBAAiB,SAAS;AAAA,QAC3C;AAAA,QAEA;AAAA,uDAAC,YAAO,SAAS,cAAc,OAAM,WACnC,uDAAC,yBAAE,WAAU,WAAU,GACzB;AAAA,UAEA,8CAAC,SAAI,WAAU,2BACb;AAAA,yDAAC,YAAO,SAAS,eAAe,OAAM,YACpC,uDAAC,gCAAS,WAAU,WAAU,GAChC;AAAA,YACA,6CAAC,YAAO,SAAS,MAAM,WAAW,QAAQ,MAAM,GAAG,OAAM,QACvD,uDAAC,4BAAK,WAAU,WAAU,GAC5B;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MAAM,WAAW,WAAW,WAAW;AAAA,gBAChD,OAAM;AAAA,gBAEN,uDAAC,+BAAQ,WAAU,WAAU;AAAA;AAAA,YAC/B;AAAA,YACA,6CAAC,YAAO,SAAS,MAAM,WAAW,QAAQ,MAAM,GAAG,OAAM,QACvD,uDAAC,4BAAK,WAAU,WAAU,GAC5B;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MAAM,WAAW,UAAU,QAAQ;AAAA,gBAC5C,OAAM;AAAA,gBAEN,uDAAC,8BAAO,WAAU,WAAU;AAAA;AAAA,YAC9B;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,OAAM;AAAA,gBACN,WAAU;AAAA,gBAEV,uDAAC,6BAAM,WAAU,oCAAmC;AAAA;AAAA,YACtD;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,IAID,UAAU,YACT,8CAAC,SAAI,WAAW,UAAU,OAAO,UAC/B;AAAA,oDAAC,SAAI,WAAU,2BACb;AAAA,qDAAC,YAAO,SAAS,eAAe,OAAM,WACpC,uDAAC,6BAAM,WAAU,0BAAyB,GAC5C;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,UAAU,CAAC;AAAA,YACX,WAAU;AAAA,YACV,OAAM;AAAA,YAEN,uDAAC,6BAAM,WAAU,WAAU;AAAA;AAAA,QAC7B;AAAA,SACF;AAAA,MACA,8CAAC,SAAI,WAAU,2BACb;AAAA,sDAAC,UAAK,WAAU,wCACb;AAAA;AAAA,UAAU;AAAA,WACb;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,KAAKF;AAAA,YACL,KAAKC;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,aAAa,OAAO,EAAE,OAAO,KAAK,CAAC;AAAA,YACpD,WAAU;AAAA;AAAA,QACZ;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,WAAW;AAAA,YACb;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,gBAAgB,EAAE,OAAO,KAAK;AAAA,gBAC/C,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,SAAS;AAAA,kBACT,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,SAAS;AAAA,gBACX;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,SACF;AAAA,OACF;AAAA,IAID,UAAU,UACT;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,QACX,OAAO;AAAA,UACL,GAAG;AAAA,UACH,SAAS,iBAAiB,IAAI;AAAA,UAC9B,eAAe,iBAAiB,SAAS;AAAA,QAC3C;AAAA,QAEA;AAAA,uDAAC,YAAO,SAAS,aAAa,OAAM,WAClC,uDAAC,6BAAM,WAAU,0BAAyB,GAC5C;AAAA,UAEA,8CAAC,SAAI,WAAU,2BACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,OAAM;AAAA,gBACN,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,YACE,gBAAgB,gBACZ,qEACA;AAAA,kBACN,QAAQ;AAAA,gBACV;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,OAAO;AAAA,sBACL,OACE,gBAAgB,YACZ,SACA,gBAAgB,gBACd,SACA;AAAA,oBACV;AAAA,oBACD;AAAA;AAAA,gBAED;AAAA;AAAA,YACF;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,WAAU;AAAA,gBACV,OAAO;AAAA,kBACL,YAAY;AAAA,kBACZ,QAAQ;AAAA,kBACR,WAAW;AAAA,gBACb;AAAA,gBAEA;AAAA,kBAAC;AAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAO;AAAA,oBACP,UAAU,CAAC,MAAM,aAAa,EAAE,OAAO,KAAK;AAAA,oBAC5C,OAAO;AAAA,sBACL,UAAU;AAAA,sBACV,OAAO;AAAA,sBACP,SAAS;AAAA,sBACT,OAAO;AAAA,sBACP,QAAQ;AAAA,sBACR,QAAQ;AAAA,sBACR,QAAQ;AAAA,sBACR,SAAS;AAAA,oBACX;AAAA;AAAA,gBACF;AAAA;AAAA,YACF;AAAA,aACF;AAAA;AAAA;AAAA,IACF;AAAA,IAID,UAAU,UACT,8CAAC,SAAI,WAAW,UAAU,OAAO,UAC/B;AAAA,mDAAC,YAAO,SAAS,aAAa,UAAU,CAAC,UAAU,OAAM,WACvD;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,WAAW,WAAW,mBAAmB,eAAe;AAAA;AAAA,MACrE,GACF;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,SAAS;AAAA,UACT,WAAU;AAAA,UACV,OAAM;AAAA,UACP;AAAA;AAAA,MAED;AAAA,OACF;AAAA,IAID,UAAU,aACT,8CAAC,SAAI,WAAW,UAAU,OAAO,UAC/B;AAAA,oDAAC,SAAI,WAAU,2BACb;AAAA,qDAAC,YAAO,SAAS,gBAAgB,OAAM,WACrC,uDAAC,6BAAM,WAAU,0BAAyB,GAC5C;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,UAAU,CAAC;AAAA,YACX,WAAU;AAAA,YACV,OAAM;AAAA,YAEN,uDAAC,6BAAM,WAAU,WAAU;AAAA;AAAA,QAC7B;AAAA,SACF;AAAA,MACA,8CAAC,SAAI,WAAU,2BACZ;AAAA;AAAA,UACC,CAAC,aAAa,6CAAC,8BAAO,WAAU,WAAU,CAAE;AAAA,UAC5C,CAAC,UAAU,6CAAC,8BAAO,WAAU,WAAU,CAAE;AAAA,UACzC,CAAC,SAAS,6CAAC,kCAAW,WAAU,WAAU,CAAE;AAAA,UAC5C,CAAC,gBAAgB,6CAAC,sCAAe,WAAU,WAAU,CAAE;AAAA,QACzD,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,MAChB;AAAA,UAAC;AAAA;AAAA,YAEC,SAAS,MAAM,iBAAiB,IAAI;AAAA,YACpC,WAAW,eAAe,eAAe,OAAO,gBAAgB,EAAE;AAAA,YAClE,OAAO;AAAA,YAEN;AAAA;AAAA,UALI;AAAA,QAMP,CACD;AAAA,QACD;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,YAAY;AAAA,cACZ,QAAQ;AAAA,cACR,WAAW;AAAA,YACb;AAAA,YAEA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,UAAU,CAAC,MAAM,gBAAgB,EAAE,OAAO,KAAK;AAAA,gBAC/C,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,SAAS;AAAA,kBACT,OAAO;AAAA,kBACP,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,QAAQ;AAAA,kBACR,SAAS;AAAA,gBACX;AAAA;AAAA,YACF;AAAA;AAAA,QACF;AAAA,SACF;AAAA,OACF;AAAA,KAEJ;AAEJ;AAEA,IAAO,qBAAQ;;;AChXf,IAAAE,gBAAqE;;;ACFrE,IAAM,gBAAgB,CAAC,KAAK,MAAM,IAAI,MAAM,UAAU;AACpD,QAAM,aAAa,KAAK,IAAI,IAAI,OAAO,GAAG;AAC1C,QAAM,QAAQ,KAAK,MAAM,GAAG,IAAI,KAAK,GAAG,GAAG,IAAI,KAAK,CAAC;AAErD,MAAI,KAAK;AACT,MAAI,cAAc;AAClB,MAAI,YAAY;AAChB,MAAI,YAAY,KAAK,IAAI,KAAK,OAAO,GAAG;AACxC,MAAI,UAAU;AACd,MAAI,WAAW;AAEf,MAAI,UAAU;AACd,MAAI;AAAA,IACF,GAAG,IAAI,aAAa,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,IAChD,GAAG,IAAI,aAAa,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,EAClD;AACA,MAAI,OAAO,GAAG,GAAG,GAAG,CAAC;AACrB,MAAI;AAAA,IACF,GAAG,IAAI,aAAa,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,IAChD,GAAG,IAAI,aAAa,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,EAClD;AACA,MAAI,OAAO;AACX,MAAI,QAAQ;AACd;AAEO,SAAS,mBAAmB,KAAK,QAAQ;AAC9C,MAAI,CAAC,OAAO,CAAC,QAAQ,QAAS;AAE9B,QAAM,EAAE,MAAM,QAAQ,IAAI;AAC1B,MAAI,KAAK;AAGT,MAAI,SAAS,iBAAiB,SAAS,eAAe;AACpD,UAAM,EAAE,QAAQ,OAAO,aAAa,SAAS,IAAI;AACjD,QAAI,CAAC,QAAQ,QAAQ;AACnB,UAAI,QAAQ;AACZ;AAAA,IACF;AAEA,QAAI,2BAA2B,WAAW,oBAAoB;AAC9D,QAAI,cAAc,SAAS;AAC3B,QAAI,YAAY,eAAe;AAC/B,QAAI,UAAU;AACd,QAAI,WAAW;AACf,QAAI,YAAY,CAAC,CAAC;AAElB,QAAI,UAAU;AACd,QAAI,OAAO,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;AACnC,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAI,OAAO,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;AAAA,IACrC;AACA,QAAI,OAAO;AAAA,EACb;AAGA,MAAI,SAAS,aAAa;AACxB,UAAM,EAAE,YAAY,UAAU,OAAO,aAAa,YAAY,IAAI;AAClE,QAAI,CAAC,cAAc,CAAC,UAAU;AAC5B,UAAI,QAAQ;AACZ;AAAA,IACF;AAEA,QAAI,2BAA2B;AAC/B,QAAI,cAAc,SAAS;AAC3B,QAAI,YAAY,eAAe;AAC/B,QAAI,UAAU;AACd,QAAI,WAAW;AAEf,YAAQ,aAAa;AAAA,MACnB,KAAK;AACH,YAAI,YAAY,CAAC,cAAc,GAAG,cAAc,CAAC,CAAC;AAClD;AAAA,MACF,KAAK;AACH,YAAI,YAAY,CAAC,aAAa,WAAW,CAAC;AAC1C;AAAA,MACF;AACE,YAAI,YAAY,CAAC,CAAC;AAAA,IACtB;AAEA,QAAI,UAAU;AACd,QAAI,OAAO,WAAW,GAAG,WAAW,CAAC;AACrC,QAAI,OAAO,SAAS,GAAG,SAAS,CAAC;AACjC,QAAI,OAAO;AAAA,EACb;AAEA,MAAI,SAAS,cAAc;AACzB,UAAM,EAAE,QAAQ,OAAO,aAAa,YAAY,IAAI;AACpD,QAAI,CAAC,UAAU,OAAO,SAAS,GAAG;AAChC,UAAI,QAAQ;AACZ;AAAA,IACF;AAEA,QAAI,2BAA2B;AAC/B,QAAI,cAAc,SAAS;AAC3B,QAAI,YAAY,eAAe;AAC/B,QAAI,UAAU;AACd,QAAI,WAAW;AAEf,YAAQ,aAAa;AAAA,MACnB,KAAK;AACH,YAAI,YAAY,CAAC,cAAc,GAAG,cAAc,CAAC,CAAC;AAClD;AAAA,MACF,KAAK;AACH,YAAI,YAAY,CAAC,aAAa,WAAW,CAAC;AAC1C;AAAA,MACF;AACE,YAAI,YAAY,CAAC,CAAC;AAAA,IACtB;AAEA,QAAI,UAAU;AACd,QAAI,OAAO,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;AAGnC,aAAS,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK;AAC1C,YAAM,KAAK,OAAO,IAAI,CAAC,KAAK,OAAO,CAAC;AACpC,YAAM,KAAK,OAAO,CAAC;AACnB,YAAM,KAAK,OAAO,IAAI,CAAC;AACvB,YAAM,KAAK,OAAO,IAAI,CAAC,KAAK;AAE5B,YAAM,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK;AACpC,YAAM,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK;AACpC,YAAM,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK;AACpC,YAAM,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK;AAEpC,UAAI,cAAc,MAAM,MAAM,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC;AAAA,IACtD;AACA,QAAI,OAAO;AAAA,EACb;AAEA,MAAI,SAAS,oBAAoB;AAC/B,UAAM,EAAE,QAAQ,OAAO,aAAa,YAAY,IAAI;AACpD,QAAI,CAAC,UAAU,OAAO,SAAS,GAAG;AAChC,UAAI,QAAQ;AACZ;AAAA,IACF;AAEA,QAAI,KAAK;AACT,QAAI,cAAc;AAClB,QAAI,YAAY;AAChB,QAAI,UAAU;AACd,QAAI,WAAW;AAGf,QAAI,gBAAgB;AAClB,UAAI,YAAY,CAAC,cAAc,GAAG,cAAc,CAAC,CAAC;AAAA,aAC3C,gBAAgB;AACvB,UAAI,YAAY,CAAC,aAAa,WAAW,CAAC;AAAA,QACvC,KAAI,YAAY,CAAC,CAAC;AAEvB,QAAI,UAAU;AACd,QAAI,OAAO,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;AAEnC,QAAI,OAAO,WAAW,GAAG;AAEvB,UAAI,iBAAiB,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;AAAA,IACzE,OAAO;AACL,UAAI,OAAO,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;AAAA,IACrC;AACA,QAAI,OAAO;AACX,QAAI,YAAY,CAAC,CAAC;AAGlB,UAAM,QAAQ,OAAO,CAAC;AACtB,UAAM,MAAM,OAAO,OAAO,SAAS,CAAC;AACpC,UAAM,MACJ,OAAO,WAAW,IACd,OAAO,CAAC,IACR,EAAE,IAAI,MAAM,IAAI,IAAI,KAAK,GAAG,IAAI,MAAM,IAAI,IAAI,KAAK,EAAE;AAE3D,kBAAc,KAAK,KAAK,KAAK,aAAa,KAAK;AAC/C,kBAAc,KAAK,KAAK,OAAO,aAAa,KAAK;AACjD,QAAI,QAAQ;AAAA,EACd;AAEA,MAAI,QAAQ;AACd;AAMO,SAAS,wBAAwB,QAAQ,SAAS;AACvD,QAAM,MAAM,QAAQ,WAAW,IAAI;AACnC,MAAI,CAAC,UAAU,CAAC,IAAK;AAErB,MAAI,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAC/C,MAAI,2BAA2B;AAE/B,UACG,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EACpC,QAAQ,CAAC,MAAM,mBAAmB,KAAK,CAAC,CAAC;AAC9C;;;ADvLO,SAAS,kBAAkB,EAAE,kBAAkB,cAAc,GAAG;AAGrE,QAAM,oBAAgB,sBAAO,CAAC,CAAC;AAC/B,QAAM,qBAAiB,sBAAO,EAAE;AAGhC,QAAM,CAAC,EAAE,WAAW,QAAI,0BAAW,CAAC,MAAM,IAAI,GAAG,CAAC;AAGlD,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAS,CAAC,CAAC;AAC/C,QAAM,CAAC,SAAS,UAAU,QAAI,wBAAS,CAAC,CAAC;AACzC,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAS,CAAC,CAAC;AACvC,QAAM,CAAC,cAAc,eAAe,QAAI,wBAAS,CAAC,CAAC;AACnD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,CAAC,CAAC;AAGrC,QAAM,mBAAe,sBAAO,IAAI;AAChC,QAAM,qBAAiB,sBAAO,IAAI;AAClC,QAAM,oBAAgB,sBAAO,IAAI;AACjC,QAAM,0BAAsB,sBAAO,IAAI;AACvC,QAAM,oBAAgB,sBAAO,IAAI;AAGjC,QAAM,oBAAgB,sBAAO;AAAA,IAC3B,oBAAoB,MAAM;AAAA,IAAC;AAAA,EAC7B,CAAC;AAED,+BAAU,MAAM;AACd,kBAAc,UAAU;AAAA,MACtB,oBAAoB,CAAC,WAAW;AAC9B,cAAM,SAAS,iBAAiB;AAChC,cAAM,MAAM,QAAQ,WAAW,IAAI;AACnC,YAAI,IAAK,oBAAmB,KAAK,MAAM;AAAA,MACzC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,gBAAgB,CAAC;AAGrB,QAAM,0BAAsB;AAAA,IAC1B,CAAC,KAAK,SAAS;AACb,YAAM,SAAS,iBAAiB;AAChC,UAAI,CAAC,OAAQ;AAEb,8BAAwB,QAAQ,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC;AAAA,IACxD;AAAA,IACA,CAAC,gBAAgB;AAAA,EACnB;AAKA,QAAM,uBAAmB,2BAAY,CAAC,KAAK,SAAS;AAClD,UAAM,UAAU,oBAAI,IAAI;AACxB,UAAM,UAAU,oBAAI,IAAI;AACxB,UAAM,WAAW,oBAAI,IAAI;AACzB,UAAM,SAAS,oBAAI,IAAI;AACvB,UAAM,UAAU,oBAAI,IAAI;AAExB,QACG,MAAM,GAAG,OAAO,CAAC,EACjB,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO,EAClC,QAAQ,CAAC,EAAE,MAAM,QAAQ,MAAM;AAC9B,UAAI,CAAC,QAAS;AACd,YAAM,EAAE,aAAa,WAAW,KAAK,IAAI;AAEzC,cAAQ,MAAM;AAAA,QACZ,KAAK;AACH,kBAAQ,IAAI,KAAK,IAAI,IAAI;AACzB;AAAA,QACF,KAAK;AACH,kBAAQ,IAAI,KAAK,IAAI,IAAI;AACzB;AAAA,QACF,KAAK;AACH,mBAAS,IAAI,KAAK,IAAI,IAAI;AAC1B;AAAA,QACF,KAAK;AACH,iBAAO,IAAI,KAAK,IAAI,IAAI;AACxB;AAAA,QACF,KAAK;AACH,kBAAQ,IAAI,KAAK,IAAI,IAAI;AACzB;AAAA,QACF,KAAK,gBAAgB;AACnB,gBAAM,MAAM;AAAA,YACV,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,OAAO;AAAA,YACP,gBAAgB;AAAA,YAChB,MAAM;AAAA,UACR,EAAE,WAAW;AACb,cAAI,KAAK,IAAI,SAAS,GAAG;AACvB,gBAAI,IAAI,WAAW,EAAE,GAAG,IAAI,IAAI,SAAS,GAAG,GAAG,KAAK,CAAC;AAAA,UACvD;AACA;AAAA,QACF;AAAA,QACA,KAAK;AACH,WAAC,SAAS,SAAS,UAAU,QAAQ,OAAO,EAAE;AAAA,YAAQ,CAAC,MACrD,EAAE,OAAO,SAAS;AAAA,UACpB;AACA;AAAA,MACJ;AAAA,IACF,CAAC;AAEH,WAAO;AAAA,MACL,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC;AAAA,MAC3B,OAAO,CAAC,GAAG,QAAQ,OAAO,CAAC;AAAA,MAC3B,MAAM,CAAC,GAAG,SAAS,OAAO,CAAC;AAAA,MAC3B,SAAS,CAAC,GAAG,OAAO,OAAO,CAAC;AAAA,MAC5B,MAAM,CAAC,GAAG,QAAQ,OAAO,CAAC;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,QAAM,qBAAiB;AAAA,IACrB,CAAC,KAAK,SAAS;AACb,YAAM,EAAE,OAAO,OAAO,MAAM,SAAS,KAAK,IAAI,iBAAiB,KAAK,IAAI;AACxE,oBAAc,KAAK;AACnB,iBAAW,KAAK;AAChB,gBAAU,IAAI;AACd,sBAAgB,OAAO;AACvB,eAAS,IAAI;AAAA,IACf;AAAA,IACA,CAAC,gBAAgB;AAAA,EACnB;AAGA,QAAM,qBAAiB;AAAA,IACrB,CAAC,WAAW;AACV,YAAM,SAAS,cAAc;AAC7B,YAAM,MAAM,QAAQ,WAAW,IAAI;AACnC,UAAI,CAAC,UAAU,CAAC,IAAK;AAErB,UAAI,OAAO,SAAS,gBAAgB;AAClC,cAAM,KAAK,OAAO,SAAS;AAC3B,YAAI,GAAI,KAAI,aAAa,IAAI,GAAG,CAAC;AAAA,MACnC;AACA,UAAI,OAAO,SAAS,cAAc;AAEhC,cAAM,KAAK,OAAO,SAAS;AAC3B,YAAI,IAAI;AACN,iBAAO,QAAQ,GAAG;AAClB,iBAAO,SAAS,GAAG;AACnB,cAAI,aAAa,IAAI,GAAG,CAAC;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,qBAAiB;AAAA,IACrB,CAAC,WAAW;AACV,YAAM,SAAS,cAAc;AAC7B,YAAM,MAAM,QAAQ,WAAW,IAAI;AACnC,UAAI,CAAC,UAAU,CAAC,IAAK;AAErB,UAAI,OAAO,SAAS,gBAAgB;AAClC,cAAM,KAAK,OAAO,SAAS;AAC3B,YAAI,GAAI,KAAI,aAAa,IAAI,GAAG,CAAC;AAAA,MACnC;AAAA,IAGF;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAIA,QAAM,mBAAe;AAAA,IACnB,CAAC,QAAQ,MAAM,aAAa;AAAA,MAC1B,IAAI,GAAG,MAAM,IAAI,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAAA,MAC1E;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,gBAAY;AAAA,IAChB,CAAC,WAAW;AAEV,YAAM,UAAU,cAAc,QAAQ;AAAA,QACpC;AAAA,QACA,eAAe,UAAU;AAAA,MAC3B;AACA,YAAM,SAAS,CAAC,GAAG,SAAS,MAAM;AAClC,YAAM,UAAU,QAAQ;AAExB,oBAAc,UAAU;AACxB,qBAAe,UAAU;AAGzB,UAAI,OAAO,WAAW,WAAW;AAC/B,4BAAoB,QAAQ,OAAO;AAAA,MACrC;AAGA,UAAI,OAAO,WAAW,SAAS;AAC7B,uBAAe,QAAQ,OAAO;AAAA,MAChC;AAKA,kBAAY;AAAA,IACd;AAAA,IACA,CAAC,qBAAqB,gBAAgB,WAAW;AAAA,EACnD;AAEA,QAAM,WAAO,2BAAY,MAAM;AAC7B,UAAM,MAAM,cAAc;AAC1B,QAAI,eAAe,UAAU,EAAG;AAEhC,UAAM,eAAe,IAAI,eAAe,OAAO;AAC/C,UAAM,UAAU,eAAe,UAAU;AACzC,mBAAe,UAAU;AAEzB,QAAI,cAAc,WAAW,OAAQ,gBAAe,YAAY;AAEhE,wBAAoB,KAAK,OAAO;AAChC,mBAAe,KAAK,OAAO;AAC3B,gBAAY;AAAA,EACd,GAAG,CAAC,qBAAqB,gBAAgB,gBAAgB,WAAW,CAAC;AAErE,QAAM,WAAO,2BAAY,MAAM;AAC7B,UAAM,MAAM,cAAc;AAC1B,QAAI,eAAe,WAAW,IAAI,SAAS,EAAG;AAE9C,UAAM,UAAU,eAAe,UAAU;AACzC,UAAM,eAAe,IAAI,OAAO;AAChC,mBAAe,UAAU;AAEzB,QAAI,cAAc,WAAW,OAAQ,gBAAe,YAAY;AAEhE,wBAAoB,KAAK,OAAO;AAChC,mBAAe,KAAK,OAAO;AAC3B,gBAAY;AAAA,EACd,GAAG,CAAC,qBAAqB,gBAAgB,gBAAgB,WAAW,CAAC;AAIrE,QAAM,eAAe;AAAA,IACnB,SAAS,cAAc,QAAQ,MAAM,GAAG,eAAe,UAAU,CAAC;AAAA,IAClE,aAAa,eAAe;AAAA,EAC9B;AACA,QAAM,UAAU,eAAe,WAAW;AAC1C,QAAM,UAAU,eAAe,UAAU,cAAc,QAAQ,SAAS;AACxE,QAAM,cAAc,eAAe,UAAU;AAE7C,SAAO;AAAA;AAAA,IAEL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AEzRO,IAAM,iBAAiB;AAAA;AAAA,EAG5B,mBAAmB,CAAC,MAAM,WAAW,aAAa,MAAM,eAAe,UAAU;AAAA,IAC/E,IAAI,UAAU,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAAA,IACnE,QAAQ;AAAA,IACR;AAAA,IACA,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,IACtB;AAAA,EACF;AAAA;AAAA,EAIA,kBAAkB,CAAC,QAAQ,OAAO,WAAW,aAAa,OAAO,cAAc;AAAA,IAC7E,IAAI,UAAU,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAAA,IACnE,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,MACA;AAAA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW,KAAK,IAAI;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,UAAU,CAAC,YAAY,UAAU,OAAO,WAAW,iBAAiB;AAAA,IAClE,IAAI,UAAU,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAAA,IACnE,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW,KAAK,IAAI;AAAA,IACtB;AAAA,EACF;AAAA;AAAA,EAIA,WAAW,CAAC,QAAQ,OAAO,WAAW,iBAAiB;AAAA,IACrD,IAAI,UAAU,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAAA,IACnE,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW,KAAK,IAAI;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,gBAAgB,CAAC,QAAQ,OAAO,WAAW,iBAAiB;AAAA,IAC1D,IAAI,UAAU,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAAA,IACnE,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA,MACP,WAAW,KAAK,IAAI;AAAA,IACtB;AAAA,EACF;AAAA;AAAA,EAIA,WAAW,CAAC,UAAU,uBAAuB;AAAA,IAC3C,IAAI,UAAU,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAAA,IACnE,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA;AAAA,MACA,WAAW;AAAA;AAAA,MACX,WAAW,KAAK,IAAI;AAAA,IACtB;AAAA,EACF;AAAA;AAAA,EAIA,aAAa,CAAC,YAAY,mBAAmB,mBAAmB;AAAA,IAC9D,IAAI,UAAU,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAAA,IACnE,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA;AAAA,MACA,MAAM;AAAA;AAAA,MACN,MAAM;AAAA;AAAA,MACN,WAAW,KAAK,IAAI;AAAA,IACtB;AAAA,EACF;AACF;;;ACrFO,SAAS,mBAAmB,QAAQ;AACzC,QAAM,OAAO,MAAM;AAAA,EAAC;AAEpB,MAAI,CAAC,QAAQ;AACX,WAAO,EAAE,KAAK,MAAM,MAAM,QAAW,aAAa,OAAO,SAAS,KAAK;AAAA,EACzE;AAEA,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,UAAI,CAAC,OAAO,KAAK;AACf,cAAM,IAAI,MAAM,mDAAmD;AAAA,MACrE;AACA,aAAO;AAAA,QACL,KAAK,OAAO;AAAA,QACZ,MAAM,OAAO;AAAA,QACb,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,IAEF,KAAK;AACH,UAAI,CAAC,OAAO,SAAS;AACnB,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,QACL,KAAK,OAAO;AAAA,QACZ,MAAM,OAAO;AAAA,QACb,aAAa;AAAA,QACb,SAAS;AAAA,MACX;AAAA,IAEF,KAAK,QAAQ;AACX,UAAI,CAAC,OAAO,MAAM;AAChB,cAAM,IAAI,MAAM,qDAAqD;AAAA,MACvE;AACA,YAAM,YAAY,IAAI,gBAAgB,OAAO,IAAI;AACjD,aAAO;AAAA,QACL,KAAK;AAAA,QACL,MAAM,OAAO,QAAQ,OAAO,KAAK;AAAA,QACjC,aAAa;AAAA,QACb,SAAS,MAAM,IAAI,gBAAgB,SAAS;AAAA,MAC9C;AAAA,IACF;AAAA,IAEA,KAAK,QAAQ;AACX,UAAI,CAAC,OAAO,MAAM;AAChB,cAAM,IAAI,MAAM,qDAAqD;AAAA,MACvE;AACA,YAAM,YAAY,IAAI,gBAAgB,OAAO,IAAI;AACjD,aAAO;AAAA,QACL,KAAK;AAAA,QACL,MAAM,OAAO;AAAA,QACb,aAAa;AAAA,QACb,SAAS,MAAM,IAAI,gBAAgB,SAAS;AAAA,MAC9C;AAAA,IACF;AAAA,IAEA;AACE,YAAM,IAAI;AAAA,QACR,4CAA4C,QAAQ,IAAI;AAAA,MAE1D;AAAA,EACJ;AACF;AAWO,SAAS,kBAAkB,QAAQ;AACxC,MAAI,CAAC,OAAQ,QAAO;AACpB,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,OAAO,OAAO,GAAG;AAAA,IAC1B,KAAK;AAGH,aAAO,WAAW,OAAO,QAAQ,MAAM,IAAI,OAAO,QAAQ,MAAM,GAAG,EAAE,CAAC;AAAA,IACxE,KAAK;AACH,aAAO,QAAQ,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,YAAY;AAAA,IACjF,KAAK;AACH,aAAO,QAAQ,OAAO,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI;AAAA,IACrD;AACE,aAAO,WAAW,OAAO,OAAO,IAAI,CAAC;AAAA,EACzC;AACF;;;ACvFO,SAAS,qBAAqB,QAAQ,UAAU,CAAC,GAAG;AACzD,QAAM;AAAA,IACJ,WAAW;AAAA,IACX,WAAW;AAAA,IACX;AAAA,EACF,IAAI;AAEJ,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,WAAO;AAAA,MACL,CAAC,SAAS;AACR,YAAI,CAAC,MAAM;AACT,iBAAO,IAAI,MAAM,qDAAqD,CAAC;AACvE;AAAA,QACF;AACA,cAAM,OAAO,IAAI,KAAK,CAAC,IAAI,GAAG,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1D,cAAM,UAAU,OAAO,UAAU,UAAU,OAAO;AAClD,gBAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA,OAAO,OAAO;AAAA,UACd,QAAQ,OAAO;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;Ab6tCQ,IAAAC,uBAAA;AAruCR,IAAMC,kBAAa,qBAAK,MAAM,qEAAsB;AACpD,IAAMC,sBAAiB,qBAAK,MAAM,6EAA0B;AAC5D,IAAMC,kBAAa,qBAAK,MAAM,qEAAsB;AACpD,IAAMC,mBAAc,qBAAK,MAAM,uEAAuB;AACtD,IAAMC,wBAAmB,qBAAK,MAAM,iFAA4B;AAahE,IAAM,eAAe;AACrB,IAAM,eAAe;AA0BN,SAAR,iBAAkC,EAAE,QAAQ,SAAS,OAAO,OAAO,GAAG;AAC3E,QAAM,EAAE,OAAAC,OAAM,IAAI,SAAS;AAE3B,QAAM,oBAAgB,uBAAO,IAAI;AACjC,QAAM,uBAAmB,uBAAO,IAAI;AAGpC,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS;AAAA,IACjD,KAAK;AAAA,IACL,MAAM;AAAA,EACR,CAAC;AAED,gCAAU,MAAM;AACd,QAAI,CAAC,OAAO;AACV,uBAAiB,EAAE,KAAK,MAAM,MAAM,OAAU,CAAC;AAC/C;AAAA,IACF;AACA,UAAM,EAAE,KAAK,MAAM,QAAQ,IAAI,mBAAmB,KAAK;AACvD,qBAAiB,EAAE,KAAK,KAAK,CAAC;AAC9B,WAAO;AAAA,EAET,GAAG,CAAC,kBAAkB,KAAK,CAAC,CAAC;AAE7B,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,IAAI;AACjD,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,KAAK;AAChD,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,IAAI;AACjD,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,EAAE;AAC3C,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,yBAAS,IAAI;AAC/D,QAAM,CAAC,MAAM,OAAO,QAAI,yBAAS,EAAE;AACnC,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,yBAAS,KAAK;AAC9D,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAAS,KAAK;AAC5D,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,yBAAS,KAAK;AAC9D,QAAM,CAAC,uBAAuB,wBAAwB,QAAI,yBAAS,KAAK;AACxE,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS,CAAC,CAAC;AACrD,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,YAAY;AACzD,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,IAAI;AAC7C,QAAM,CAAC,YAAY,aAAa,QAAI,yBAAS,KAAK;AAClD,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,IAAI;AAC/C,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAAS,aAAa;AACpE,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,SAAS;AAC1D,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,CAAC;AAC5C,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,OAAO;AACtD,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,yBAAS,IAAI;AAC/D,QAAM,CAAC,qBAAqB,sBAAsB,QAAI,yBAAS,IAAI;AACnE,QAAM,CAAC,eAAe,gBAAgB,QAAI,yBAAS,KAAK;AACxD,QAAM,CAAC,oBAAoB,qBAAqB,QAAI,yBAAS,KAAK;AAClE,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,yBAAS;AAAA,IACvD,OAAO;AAAA,IACP,QAAQ;AAAA,EACV,CAAC;AACD,QAAM,CAAC,iBAAiB,kBAAkB,QAAI,yBAAS,IAAI;AAC3D,QAAM,CAAC,SAAS,UAAU,QAAI,yBAAS,KAAK;AAC5C,QAAM,CAAC,mBAAmB,oBAAoB,QAAI,yBAAS,KAAK;AAChE,QAAM,CAAC,cAAc,eAAe,QAAI,yBAAS,IAAI;AACrD,QAAM,CAAC,UAAU,WAAW,QAAI,yBAAS,KAAK;AAC9C,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,yBAAS,KAAK;AAC1D,QAAM,CAAC,WAAW,YAAY,QAAI,yBAAS,SAAS;AACpD,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,mBAAmB,CAAC,WAAW,WAAW,WAAW,IAAI;AAE/D,QAAM,CAAC,aAAa,cAAc,QAAI,yBAAS,cAAc,CAAC,CAAC;AAE/D,QAAM,kBAAc,4BAAY,MAAM;AACpC,UAAM,MAAM,cAAc,QAAQ,WAAW;AAC7C,UAAM,WAAW,MAAM,KAAK,cAAc;AAC1C,mBAAe,cAAc,OAAO,CAAC;AAErC,UAAM,cAAc,iBAAiB,OAAO;AAC5C,QAAI,YAAa,cAAa,WAAW;AAAA,EAC3C,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,kBAAkB,EAAE,kBAAkB,cAAc,CAAC;AAIzD,gCAAU,MAAM;AACd,UAAM,QAAQ,MAAM,YAAY,OAAO,aAAa,IAAI;AACxD,UAAM;AACN,WAAO,iBAAiB,UAAU,KAAK;AACvC,WAAO,MAAM,OAAO,oBAAoB,UAAU,KAAK;AAAA,EACzD,GAAG,CAAC,CAAC;AAEL,gCAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AAGb,UAAM,mBAAmB,SAAS,KAAK,MAAM;AAC7C,UAAM,mBAAmB,SAAS,KAAK,MAAM;AAC7C,UAAM,gBAAgB,SAAS,KAAK,MAAM;AAC1C,UAAM,iBAAiB,SAAS,KAAK,MAAM;AAE3C,aAAS,KAAK,MAAM,WAAW;AAC/B,aAAS,KAAK,MAAM,WAAW;AAC/B,aAAS,KAAK,MAAM,QAAQ;AAC5B,aAAS,KAAK,MAAM,SAAS;AAE7B,WAAO,MAAM;AACX,eAAS,KAAK,MAAM,WAAW;AAC/B,eAAS,KAAK,MAAM,WAAW;AAC/B,eAAS,KAAK,MAAM,QAAQ;AAC5B,eAAS,KAAK,MAAM,SAAS;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,gCAAU,MAAM;AACd,eAAW,IAAI;AAAA,EACjB,GAAG,CAAC,CAAC;AAEL,gCAAU,MAAM;AACd,QAAI,eAAe,SAAU,cAAa,EAAE;AAAA,QACvC,cAAa,CAAC;AAAA,EACrB,GAAG,CAAC,UAAU,CAAC;AAEf,gCAAU,MAAM;AACd,UAAM,QAAQ,MACZ,iBAAiB,OAAO,aAAa,QAAQ,sBAAsB,IAAI;AACzE,UAAM;AACN,WAAO,iBAAiB,UAAU,KAAK;AACvC,WAAO,MAAM,OAAO,oBAAoB,UAAU,KAAK;AAAA,EACzD,GAAG,CAAC,iBAAiB,CAAC;AAEtB,gCAAU,MAAM;AACd,UAAM,mBAAmB,MAAM;AAC7B,YAAMC,KAAI,iBAAiB;AAC3B,UAAIA,GAAG,qBAAoB,EAAE,OAAOA,GAAE,OAAO,QAAQA,GAAE,OAAO,CAAC;AAAA,IACjE;AACA,qBAAiB;AACjB,UAAM,IAAI,iBAAiB;AAC3B,QAAI,GAAG;AACL,YAAM,KAAK,IAAI,eAAe,gBAAgB;AAC9C,SAAG,QAAQ,CAAC;AACZ,aAAO,MAAM,GAAG,WAAW;AAAA,IAC7B;AAAA,EACF,GAAG,CAAC,CAAC;AAIL,gCAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AACb,UAAM,gBAAgB,CAAC,MAAM;AAE3B,YAAM,QAAQ,SAAS,eAAe,oBAAoB;AAC1D,UAAI,CAAC,OAAO,SAAS,SAAS,aAAa,EAAG;AAC9C,UAAI,EAAE,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,QAAQ;AACzC,YAAI,EAAE,QAAQ,KAAK;AACjB,YAAE,eAAe;AACjB,eAAK;AAAA,QACP;AACA,YAAI,EAAE,QAAQ,KAAK;AACjB,YAAE,eAAe;AACjB,eAAK;AAAA,QACP;AAAA,MACF;AAAA,IACF;AACA,WAAO,iBAAiB,WAAW,aAAa;AAChD,WAAO,MAAM,OAAO,oBAAoB,WAAW,aAAa;AAAA,EAClE,GAAG,CAAC,QAAQ,MAAM,IAAI,CAAC;AAIvB,QAAM,wBAAoB,4BAAY,MAAM;AAC1C,UAAM,aAAa,cAAc;AACjC,UAAM,gBAAgB,iBAAiB;AACvC,UAAM,UAAU,YAAY,WAAW,IAAI;AAC3C,UAAM,aAAa,eAAe,WAAW,IAAI;AACjD,QAAI,CAAC,cAAc,CAAC,WAAW,CAAC,iBAAiB,CAAC,WAAY;AAE9D,QAAI,CAAC,cAAc,IAAK;AAExB,UAAM,MAAM,IAAI,MAAM;AAGtB,UAAM,cAAc,OAAO,SAAS;AACpC,QAAI,YAAa,KAAI,cAAc;AACnC,QAAI,MAAM,cACN,cAAc,OACb,cAAc,IAAI,SAAS,GAAG,IAAI,MAAM,OACzC,QACA,KAAK,IAAI,IACT,cAAc;AAClB,QAAI,SAAS,MAAM;AACjB,YAAM,YAAY,WAAW;AAC7B,UAAI,CAAC,UAAW;AAChB,YAAMC,YAAW,OAAO,aAAa;AACrC,UAAI,aAAa;AACjB,UAAIA,WAAU;AACZ,cAAM,IAAI,UAAU,sBAAsB;AAC1C,sBAAc,EAAE;AAChB,uBAAe,EAAE;AAAA,MACnB,OAAO;AACL,sBAAc;AACd,uBAAe;AAAA,MACjB;AACA,iBAAW,QAAQ;AACnB,iBAAW,SAAS;AACpB,oBAAc,QAAQ;AACtB,oBAAc,SAAS;AACvB,0BAAoB,EAAE,OAAO,aAAa,QAAQ,aAAa,CAAC;AAChE,cAAQ,UAAU,GAAG,GAAG,aAAa,YAAY;AACjD,iBAAW,UAAU,GAAG,GAAG,aAAa,YAAY;AAEpD,YAAM,QAAQ,IAAI,eAAe,IAAI;AACrC,YAAM,WAAW,cAAc;AAC/B,UAAI,WAAW,YAAY,SAAS;AACpC,UAAI,QAAQ,UAAU;AACpB,oBAAY;AACZ,qBAAa,cAAc;AAC3B,kBAAU;AACV,mBAAW,eAAe,cAAc;AAAA,MAC1C,OAAO;AACL,oBAAY,eAAe;AAC3B,qBAAa;AACb,mBAAW,cAAc,aAAa;AACtC,kBAAU;AAAA,MACZ;AACA,cAAQ,UAAU,KAAK,SAAS,SAAS,WAAW,UAAU;AAC9D,iBAAW,2BAA2B;AACtC,yBAAmB;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc,IAAI;AAAA,QAClB,eAAe,IAAI;AAAA,MACrB,CAAC;AAAA,IACH;AACA,QAAI,UAAU,MAAM,QAAQ,MAAM,mCAAmC;AAAA,EACvE,GAAG,CAAC,cAAc,KAAK,OAAO,IAAI,CAAC;AAEnC,gCAAU,MAAM;AACd,QAAI,CAAC,UAAU,CAAC,cAAc,IAAK;AACnC,UAAM,IAAI,WAAW,MAAM;AACzB,UAAI,cAAc,WAAW,iBAAiB;AAC5C,0BAAkB;AAAA,IACtB,GAAG,CAAC;AACJ,WAAO,MAAM,aAAa,CAAC;AAAA,EAC7B,GAAG,CAAC,QAAQ,cAAc,KAAK,iBAAiB,CAAC;AAEjD,gCAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AACb,UAAM,eAAe,MAAM;AACzB,UAAI,cAAc,WAAW,iBAAiB;AAC5C,0BAAkB;AAAA,IACtB;AACA,WAAO,iBAAiB,UAAU,YAAY;AAC9C,WAAO,MAAM,OAAO,oBAAoB,UAAU,YAAY;AAAA,EAChE,GAAG,CAAC,QAAQ,iBAAiB,CAAC;AAI9B,QAAM,yBAAqB;AAAA,IACzB,CAAC,cAAc;AACb;AAAA,QACE,aAAa,SAAS,iBAAiB;AAAA,UACrC,aAAa;AAAA,UACb,WAAW,UAAU;AAAA,UACrB,MAAM,EAAE,GAAG,WAAW,YAAY,KAAK,IAAI,EAAE;AAAA,QAC/C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,cAAc,SAAS;AAAA,EAC1B;AAEA,QAAM,0BAAsB;AAAA,IAC1B,CAAC,IAAI,SAAS,iBAAiB;AAC7B;AAAA,QACE,aAAa,SAAS,gBAAgB;AAAA,UACpC,aAAa;AAAA,UACb,WAAW;AAAA,UACX,MAAM;AAAA,UACN;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,cAAc,SAAS;AAAA,EAC1B;AAEA,QAAM,2BAAuB;AAAA,IAC3B,CAAC,WAAW;AACV;AAAA,QACE,aAAa,SAAS,cAAc;AAAA,UAClC,aAAa;AAAA,UACb,WAAW,OAAO;AAAA,UAClB,MAAM,EAAE,GAAG,QAAQ,YAAY,KAAK,IAAI,EAAE;AAAA,QAC5C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,cAAc,SAAS;AAAA,EAC1B;AAEA,QAAM,4BAAwB;AAAA,IAC5B,CAAC,IAAI,SAAS,iBAAiB;AAC7B;AAAA,QACE,aAAa,SAAS,gBAAgB;AAAA,UACpC,aAAa;AAAA,UACb,WAAW;AAAA,UACX,MAAM;AAAA,UACN;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,cAAc,SAAS;AAAA,EAC1B;AAEA,QAAM,0BAAsB;AAAA,IAC1B,CAAC,UAAU;AACT;AAAA,QACE,aAAa,SAAS,aAAa;AAAA,UACjC,aAAa;AAAA,UACb,WAAW,MAAM;AAAA,UACjB,MAAM,EAAE,GAAG,OAAO,YAAY,KAAK,IAAI,EAAE;AAAA,QAC3C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,cAAc,SAAS;AAAA,EAC1B;AAEA,QAAM,2BAAuB;AAAA,IAC3B,CAAC,IAAI,SAAS,iBAAiB;AAC7B;AAAA,QACE,aAAa,SAAS,gBAAgB;AAAA,UACpC,aAAa;AAAA,UACb,WAAW;AAAA,UACX,MAAM;AAAA,UACN;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,cAAc,SAAS;AAAA,EAC1B;AAEA,QAAM,gCAA4B;AAAA,IAChC,CAAC,gBAAgB;AACf;AAAA,QACE,aAAa,SAAS,oBAAoB;AAAA,UACxC,aAAa;AAAA,UACb,WAAW,YAAY;AAAA,UACvB,MAAM,EAAE,GAAG,aAAa,YAAY,KAAK,IAAI,EAAE;AAAA,QACjD,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,cAAc,SAAS;AAAA,EAC1B;AAEA,QAAM,iCAA6B;AAAA,IACjC,CAAC,IAAI,SAAS,iBAAiB;AAC7B;AAAA,QACE,aAAa,SAAS,gBAAgB;AAAA,UACpC,aAAa;AAAA,UACb,WAAW;AAAA,UACX,MAAM;AAAA,UACN;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,cAAc,SAAS;AAAA,EAC1B;AAEA,QAAM,yBAAqB;AAAA,IACzB,CAAC,cAAc;AACb;AAAA,QACE,aAAa,SAAS,YAAY;AAAA,UAChC,aAAa;AAAA,UACb,WAAW,UAAU;AAAA,UACrB,MAAM,EAAE,GAAG,WAAW,YAAY,KAAK,IAAI,EAAE;AAAA,QAC/C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,cAAc,SAAS;AAAA,EAC1B;AAEA,QAAM,0BAAsB;AAAA,IAC1B,CAAC,IAAI,SAAS,iBAAiB;AAC7B;AAAA,QACE,aAAa,SAAS,gBAAgB;AAAA,UACpC,aAAa;AAAA,UACb,WAAW;AAAA,UACX,MAAM;AAAA,UACN;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,cAAc,SAAS;AAAA,EAC1B;AAIA,QAAM,6BAAyB;AAAA,IAC7B,CAAC,UAAU;AACT,YAAM,MAAM,iBAAiB,SAAS,WAAW,IAAI;AACrD,UAAI,CAAC,IAAK;AACV,YAAM,QAAQ,CAAC,MAAM;AACnB,YAAI,KAAK;AACT,YAAI,cAAc,EAAE;AACpB,YAAI,YAAY,EAAE;AAClB,YAAI,EAAE,MAAM,SAAS,EAAG,KAAI,YAAY,EAAE,IAAI;AAC9C,YAAI,EAAE,MAAM;AACV,cAAI,YAAY,EAAE;AAClB,cAAI,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM;AAAA,QAC1C;AACA,YAAI,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM;AAC1C,YAAI,QAAQ;AAAA,MACd,CAAC;AACD,oBAAc,CAAC,CAAC;AAAA,IAClB;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,+BAA2B;AAAA,IAC/B,CAAC,iBAAiB;AAChB,YAAM,MAAM,iBAAiB,SAAS,WAAW,IAAI;AACrD,UAAI,CAAC,IAAK;AACV,mBAAa,QAAQ,CAAC,MAAM;AAC1B,YAAI,KAAK;AACT,YAAI,cAAc,EAAE;AACpB,YAAI,YAAY,EAAE,eAAe;AACjC,YAAI,EAAE,MAAM,SAAS,EAAG,KAAI,YAAY,EAAE,IAAI;AAAA,YACzC,KAAI,YAAY,CAAC,CAAC;AACvB,YAAI,UAAU;AACd,YAAI,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,KAAK,EAAE;AAC1C,YAAI,EAAE,QAAQ,EAAE,SAAS,eAAe;AACtC,cAAI,YAAY,EAAE;AAClB,cAAI,KAAK;AAAA,QACX;AACA,YAAI,OAAO;AACX,YAAI,QAAQ;AAAA,MACd,CAAC;AACD,iBAAW,CAAC,CAAC;AAAA,IACf;AAAA,IACA,CAAC,UAAU;AAAA,EACb;AAEA,QAAM,8BAA0B;AAAA,IAC9B,CAAC,gBAAgB;AACf,UAAI,CAAC,iBAAiB,WAAW,CAAC,gBAAiB;AACnD,YAAM,MAAM,iBAAiB,QAAQ,WAAW,IAAI;AACpD,UAAI,CAAC,IAAK;AACV,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI;AACJ,YAAM,SAAS,YAAY;AAC3B,YAAM,SAAS,aAAa;AAC5B,kBAAY,QAAQ,CAAC,MAAM;AACzB,cAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE;AAC3B,cAAM,SAAS,WAAY,KAAK,WAAW,SAAU;AACrD,cAAM,SAAS,WAAY,KAAK,WAAW,SAAU;AACrD,cAAM,SAAS,WAAY,KAAK,WAAW,SAAU;AACrD,cAAM,SAAS,WAAY,KAAK,WAAW,SAAU;AACrD,YAAI,KAAK;AACT,YAAI,cAAc,EAAE;AACpB,YAAI,YAAY,EAAE,eAAe;AACjC,gBAAQ,aAAa;AAAA,UACnB,KAAK;AACH,gBAAI,YAAY,CAAC,YAAY,GAAG,YAAY,CAAC,CAAC;AAC9C;AAAA,UACF,KAAK;AACH,gBAAI,YAAY,CAAC,WAAW,SAAS,CAAC;AACtC;AAAA,UACF;AACE,gBAAI,YAAY,CAAC,CAAC;AAAA,QACtB;AACA,YAAI,UAAU;AACd,YAAI,OAAO,QAAQ,MAAM;AACzB,YAAI,OAAO,QAAQ,MAAM;AACzB,YAAI,OAAO;AACX,cAAM,UAAU;AAChB,cAAM,QAAQ,KAAK,MAAM,SAAS,QAAQ,SAAS,MAAM;AACzD,YAAI,YAAY,CAAC,CAAC;AAClB,YAAI,UAAU;AACd,YAAI,OAAO,QAAQ,MAAM;AACzB,YAAI;AAAA,UACF,SAAS,UAAU,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,UAC/C,SAAS,UAAU,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,QACjD;AACA,YAAI;AAAA,UACF,SAAS,UAAU,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,UAC/C,SAAS,UAAU,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,QACjD;AACA,YAAI,OAAO,QAAQ,MAAM;AACzB,YAAI,OAAO;AACX,YAAI,YAAY,EAAE;AAClB,YAAI,KAAK;AACT,YAAI,QAAQ;AAAA,MACd,CAAC;AACD,gBAAU,CAAC,CAAC;AAAA,IACd;AAAA,IACA,CAAC,iBAAiB,WAAW,aAAa,SAAS;AAAA,EACrD;AAEA,QAAM,oCAAgC;AAAA,IACpC,CAAC,gBAAgB;AACf,UAAI,CAAC,iBAAiB,WAAW,CAAC,gBAAiB;AACnD,YAAM,MAAM,iBAAiB,QAAQ,WAAW,IAAI;AACpD,UAAI,CAAC,IAAK;AACV,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI;AACJ,YAAM,SAAS,YAAY;AAC3B,YAAM,SAAS,aAAa;AAC5B,kBAAY,QAAQ,CAAC,MAAM;AACzB,cAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE;AAC3B,cAAM,SAAS,WAAY,KAAK,WAAW,SAAU;AACrD,cAAM,SAAS,WAAY,KAAK,WAAW,SAAU;AACrD,cAAM,SAAS,WAAY,KAAK,WAAW,SAAU;AACrD,cAAM,SAAS,WAAY,KAAK,WAAW,SAAU;AACrD,YAAI,KAAK;AACT,YAAI,cAAc,EAAE;AACpB,YAAI,YAAY,EAAE,eAAe;AACjC,gBAAQ,aAAa;AAAA,UACnB,KAAK;AACH,gBAAI,YAAY,CAAC,YAAY,GAAG,YAAY,CAAC,CAAC;AAC9C;AAAA,UACF,KAAK;AACH,gBAAI,YAAY,CAAC,WAAW,SAAS,CAAC;AACtC;AAAA,UACF;AACE,gBAAI,YAAY,CAAC,CAAC;AAAA,QACtB;AACA,YAAI,UAAU;AACd,YAAI,OAAO,QAAQ,MAAM;AACzB,YAAI,OAAO,QAAQ,MAAM;AACzB,YAAI,OAAO;AACX,cAAM,UAAU;AAChB,cAAM,QAAQ,KAAK,MAAM,SAAS,QAAQ,SAAS,MAAM;AACzD,YAAI,YAAY,CAAC,CAAC;AAElB,YAAI,UAAU;AACd,YAAI,OAAO,QAAQ,MAAM;AACzB,YAAI;AAAA,UACF,SAAS,UAAU,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,UAC/C,SAAS,UAAU,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,QACjD;AACA,YAAI;AAAA,UACF,SAAS,UAAU,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,UAC/C,SAAS,UAAU,KAAK,IAAI,QAAQ,KAAK,KAAK,CAAC;AAAA,QACjD;AACA,YAAI,UAAU;AACd,YAAI,KAAK;AACT,YAAI,OAAO;AAEX,YAAI,UAAU;AACd,YAAI,OAAO,QAAQ,MAAM;AACzB,YAAI;AAAA,UACF,SAAS,UAAU,KAAK,IAAI,QAAQ,KAAK,KAAK,KAAK,KAAK,CAAC;AAAA,UACzD,SAAS,UAAU,KAAK,IAAI,QAAQ,KAAK,KAAK,KAAK,KAAK,CAAC;AAAA,QAC3D;AACA,YAAI;AAAA,UACF,SAAS,UAAU,KAAK,IAAI,QAAQ,KAAK,KAAK,KAAK,KAAK,CAAC;AAAA,UACzD,SAAS,UAAU,KAAK,IAAI,QAAQ,KAAK,KAAK,KAAK,KAAK,CAAC;AAAA,QAC3D;AACA,YAAI,UAAU;AACd,YAAI,KAAK;AACT,YAAI,OAAO;AACX,YAAI,QAAQ;AAAA,MACd,CAAC;AACD,sBAAgB,CAAC,CAAC;AAAA,IACpB;AAAA,IACA,CAAC,iBAAiB,iBAAiB,aAAa,SAAS;AAAA,EAC3D;AAEA,QAAM,wBAAoB;AAAA,IACxB,CAAC,eAAe;AACd,YAAM,MAAM,iBAAiB,SAAS,WAAW,IAAI;AACrD,UAAI,CAAC,IAAK;AACV,iBAAW,QAAQ,CAAC,MAAM;AACxB,YAAI,KAAK;AACT,cAAM,SAAS,EAAE,UAAU;AAC3B,cAAM,SAAS,EAAE,UAAU;AAC3B,cAAM,iBAAiB,EAAE,WAAW;AACpC,cAAM,UAAU,IAAI,KAAK,IAAI,QAAQ,MAAM;AAC3C,cAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,aAAK,YAAY,EAAE;AACnB,aAAK,MAAM,UAAU,aAAa,cAAc,kBAAkB,EAAE,UAAU;AAC9E,iBAAS,KAAK,YAAY,IAAI;AAC9B,cAAM,SAAS,KAAK,cAAc,UAAU,KAAK;AACjD,cAAM,UAAU,KAAK,eAAe,UAAU,KAAK;AACnD,iBAAS,KAAK,YAAY,IAAI;AAC9B,YAAI,EAAE,mBAAmB,EAAE,oBAAoB,eAAe;AAC5D,cAAI,YAAY,EAAE;AAClB,gBAAM,SAAS,KAAK,KAAK,IAAI,QAAQ,MAAM;AAC3C,gBAAM,EAAE,GAAG,EAAE,IAAI;AACjB,cAAI,UAAU;AACd,cAAI,OAAO,IAAI,QAAQ,CAAC;AACxB,cAAI,OAAO,IAAI,QAAQ,QAAQ,CAAC;AAChC,cAAI,iBAAiB,IAAI,OAAO,GAAG,IAAI,OAAO,IAAI,MAAM;AACxD,cAAI,OAAO,IAAI,OAAO,IAAI,SAAS,MAAM;AACzC,cAAI;AAAA,YACF,IAAI;AAAA,YACJ,IAAI;AAAA,YACJ,IAAI,QAAQ;AAAA,YACZ,IAAI;AAAA,UACN;AACA,cAAI,OAAO,IAAI,QAAQ,IAAI,MAAM;AACjC,cAAI,iBAAiB,GAAG,IAAI,QAAQ,GAAG,IAAI,SAAS,MAAM;AAC1D,cAAI,OAAO,GAAG,IAAI,MAAM;AACxB,cAAI,iBAAiB,GAAG,GAAG,IAAI,QAAQ,CAAC;AACxC,cAAI,UAAU;AACd,cAAI,KAAK;AAAA,QACX;AACA,YAAI,OAAO,GAAG,cAAc,MAAM,EAAE,UAAU;AAC9C,YAAI,YAAY,EAAE;AAClB,YAAI,SAAS,EAAE,MAAM,EAAE,IAAI,SAAS,EAAE,IAAI,UAAU,cAAc;AAClE,YAAI,QAAQ;AAAA,MACd,CAAC;AACD,eAAS,CAAC,CAAC;AAAA,IACb;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAIA,QAAM,iCAA6B,4BAAY,MAAM;AACnD,UAAM,IAAI,iBAAiB;AAC3B,WAAO,IACH,EAAE,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO,IACnC,EAAE,OAAO,KAAK,QAAQ,IAAI;AAAA,EAChC,GAAG,CAAC,CAAC;AAEL,QAAM,8BAA0B,4BAAY,CAAC,SAAS,YAAY;AAChE,UAAM,OAAO,SAAS,eAAe,YAAY;AACjD,QAAI,CAAC,KAAM,QAAO;AAClB,UAAM,IAAI,KAAK,sBAAsB;AACrC,UAAM,MAAM;AACZ,WACE,WAAW,EAAE,OAAO,OACpB,WAAW,EAAE,QAAQ,OACrB,WAAW,EAAE,MAAM,OACnB,WAAW,EAAE,SAAS;AAAA,EAE1B,GAAG,CAAC,CAAC;AAEL,QAAM,2BAAuB;AAAA,IAC3B,CAAC,WAAW,sBAAsB,MAAM;AAAA,IACxC,CAAC;AAAA,EACH;AAEA,QAAM,8BAA0B,4BAAY,MAAM;AAChD,UAAM,IAAI,iBAAiB;AAC3B,UAAM,MAAM,GAAG,WAAW,IAAI;AAC9B,QAAI,CAAC,KAAK,CAAC,IAAK,QAAO;AACvB,WAAO,IACJ,aAAa,GAAG,GAAG,EAAE,OAAO,EAAE,MAAM,EACpC,KAAK,KAAK,CAAC,GAAG,MAAM,IAAI,MAAM,KAAK,MAAM,CAAC;AAAA,EAC/C,GAAG,CAAC,CAAC;AAEL,QAAM,oBACJ,wBAAwB,KACxB,WAAW,SAAS,KACpB,MAAM,SAAS,KACf,OAAO,SAAS,KAChB,QAAQ,SAAS,KACjB,aAAa,SAAS,KACtB,sBAAsB,QACtB,aAAa;AAIf,QAAM,sBAAkB,4BAAY,MAAM;AACxC,UAAM,SAAS,iBAAiB;AAChC,UAAM,MAAM,QAAQ,WAAW,IAAI;AACnC,QAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAU;AAClC,QAAI,UAAU,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAC/C,QAAI,2BAA2B;AAC/B,QAAI,YAAY;AAChB,QAAI,SAAS,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AAC9C,QAAI,2BAA2B;AAC/B,QAAI,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS,OAAO,SAAS,MAAM;AACpE,QAAI,2BAA2B;AAC/B,QAAI,cAAc;AAClB,QAAI,YAAY;AAChB,QAAI,YAAY,CAAC,GAAG,CAAC,CAAC;AACtB,QAAI,WAAW,SAAS,GAAG,SAAS,GAAG,SAAS,OAAO,SAAS,MAAM;AACtE,QAAI,cAAc;AAClB,QAAI,YAAY;AAChB,QAAI;AAAA,MACF,SAAS,IAAI;AAAA,MACb,SAAS,IAAI;AAAA,MACb,SAAS,QAAQ;AAAA,MACjB,SAAS,SAAS;AAAA,IACpB;AACA,QAAI,YAAY,CAAC,CAAC;AAClB,UAAM,KAAK;AACX;AAAA,MACE,CAAC,SAAS,IAAI,KAAK,GAAG,SAAS,IAAI,KAAK,CAAC;AAAA,MACzC,CAAC,SAAS,IAAI,SAAS,QAAQ,KAAK,GAAG,SAAS,IAAI,KAAK,CAAC;AAAA,MAC1D,CAAC,SAAS,IAAI,KAAK,GAAG,SAAS,IAAI,SAAS,SAAS,KAAK,CAAC;AAAA,MAC3D;AAAA,QACE,SAAS,IAAI,SAAS,QAAQ,KAAK;AAAA,QACnC,SAAS,IAAI,SAAS,SAAS,KAAK;AAAA,MACtC;AAAA,IACF,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM;AACpB,UAAI,YAAY;AAChB,UAAI,SAAS,GAAG,GAAG,IAAI,EAAE;AACzB,UAAI,cAAc;AAClB,UAAI,YAAY;AAChB,UAAI,WAAW,GAAG,GAAG,IAAI,EAAE;AAAA,IAC7B,CAAC;AAAA,EACH,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,gBAAY,4BAAY,MAAM;AAClC,QAAI,CAAC,YAAY,CAAC,cAAc,QAAS;AACzC,UAAM,aAAa,cAAc;AACjC,UAAM,gBAAgB,iBAAiB;AACvC,UAAM,UAAU,WAAW,WAAW,IAAI;AAC1C,UAAM,aAAa,eAAe,WAAW,IAAI;AACjD,UAAM,YAAY,SAAS;AAAA,MACzB;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AACA,QAAI,CAAC,WAAW,CAAC,cAAc,CAAC,cAAe;AAE/C,UAAM,IAAI;AAAA,MACR,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,GAAG,WAAW,KAAK,CAAC;AAAA,MACrD,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,GAAG,WAAW,MAAM,CAAC;AAAA,MACtD,OAAO,KAAK,IAAI,SAAS,OAAO,WAAW,QAAQ,SAAS,CAAC;AAAA,MAC7D,QAAQ,KAAK,IAAI,SAAS,QAAQ,WAAW,SAAS,SAAS,CAAC;AAAA,IAClE;AACA,QAAI;AACF,gBAAU,aAAa,QAAQ,cAAc,EAAE,UAAU,GAAG,UAAU,CAAC,CAAC;AAE1E,UAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAM,aAAa,SAAS,cAAc,QAAQ;AAClD,YAAQ,QAAQ,WAAW,QAAQ,EAAE;AACrC,YAAQ,SAAS,WAAW,SAAS,EAAE;AACvC,UAAM,aAAa,QAAQ,WAAW,IAAI;AAC1C,UAAM,gBAAgB,WAAW,WAAW,IAAI;AAChD,QAAI,CAAC,cAAc,CAAC,cAAe;AAEnC,eAAW;AAAA,MACT;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF,EAAE;AAAA,MACF;AAAA,MACA;AAAA,MACA,EAAE;AAAA,MACF,EAAE;AAAA,IACJ;AAEA,UAAM,MAAM,WAAW;AAAA,MACrB;AAAA,MACA;AAAA,MACA,cAAc;AAAA,MACd,cAAc;AAAA,IAChB;AACA,UAAM,mBAAmB,IAAI,KAAK;AAAA,MAChC,CAAC,KAAK,MAAM,IAAI,MAAM,KAAK,QAAQ;AAAA,IACrC;AACA,QAAI,CAAC;AACH,oBAAc;AAAA,QACZ;AAAA,QACA,EAAE;AAAA,QACF,EAAE;AAAA,QACF,EAAE;AAAA,QACF,EAAE;AAAA,QACF;AAAA,QACA;AAAA,QACA,EAAE;AAAA,QACF,EAAE;AAAA,MACJ;AAEF,eAAW,QAAQ,cAAc,QAAQ,EAAE;AAC3C,eAAW,SAAS,cAAc,SAAS,EAAE;AAC7C,YAAQ,UAAU,GAAG,GAAG,EAAE,OAAO,EAAE,MAAM;AACzC,eAAW,UAAU,GAAG,GAAG,EAAE,OAAO,EAAE,MAAM;AAC5C,YAAQ,2BAA2B;AACnC,eAAW,2BAA2B;AACtC,YAAQ,UAAU,SAAS,GAAG,CAAC;AAC/B,QAAI,iBAAkB,YAAW,UAAU,YAAY,GAAG,CAAC;AAE3D,wBAAoB,EAAE,OAAO,EAAE,OAAO,QAAQ,EAAE,OAAO,CAAC;AACxD,gBAAY,IAAI;AAChB,kBAAc,KAAK;AACnB,iBAAa,IAAI;AACjB,kBAAc,IAAI;AAAA,EACpB,GAAG,CAAC,UAAU,WAAW,YAAY,CAAC;AAEtC,gCAAU,MAAM;AACd,QAAI,eAAe,OAAQ,iBAAgB;AAAA,EAC7C,GAAG,CAAC,UAAU,YAAY,eAAe,CAAC;AAI1C,QAAM,yBAAqB,4BAAY,MAAM;AAC3C,UAAM,aAAa,cAAc;AACjC,UAAM,MAAM,YAAY,WAAW,IAAI;AACvC,QAAI,CAAC,cAAc,CAAC,OAAO,CAAC,gBAAiB;AAC7C,UAAM,OAAO,IAAI,aAAa,GAAG,GAAG,WAAW,OAAO,WAAW,MAAM;AACvE,UAAM,EAAE,SAAS,SAAS,WAAW,WAAW,IAAI;AACpD,UAAM,OAAO,IAAI,aAAa,SAAS,SAAS,WAAW,UAAU;AACrE,UAAM,IAAI,KAAK;AACf,aAAS,IAAI,GAAG,IAAI,EAAE,QAAQ,KAAK,GAAG;AACpC,YAAM,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK;AAC5C,QAAE,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI;AAAA,IAC/B;AACA,QAAI,aAAa,MAAM,SAAS,OAAO;AACvC,UAAM,OAAO,IAAI,aAAa,GAAG,GAAG,WAAW,OAAO,WAAW,MAAM;AACvE,cAAU,eAAe,YAAY,iBAAiB,MAAM,IAAI,CAAC;AACjE,IAAAF,OAAM;AAAA,MACJ,OAAO;AAAA,MACP,aAAa;AAAA,IACf,CAAC;AAAA,EACH,GAAG,CAAC,WAAWA,QAAO,eAAe,CAAC;AAEtC,QAAM,gBAAgB,MAAM;AAC1B,UAAM,aAAa,cAAc;AACjC,UAAM,gBAAgB,iBAAiB;AACvC,QAAI,CAAC,cAAc,CAAC,cAAe;AACnC,UAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,QAAI,QAAQ,WAAW;AACvB,QAAI,SAAS,WAAW;AACxB,UAAM,MAAM,IAAI,WAAW,IAAI;AAC/B,QAAI,CAAC,IAAK;AACV,QAAI,UAAU,YAAY,GAAG,CAAC;AAC9B,QAAI,UAAU,eAAe,GAAG,CAAC;AACjC,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,WAAW,UAAU,cAAc,QAAQ,OAAO;AACpD,MAAE,OAAO,IAAI,UAAU,WAAW;AAClC,MAAE,MAAM;AAAA,EACV;AAEA,QAAM,oBAAgB,4BAAY,MAAM;AACtC,UAAM,aAAa,cAAc;AACjC,UAAM,gBAAgB,iBAAiB;AACvC,QAAI,CAAC,cAAc,CAAC,cAAe;AACnC,UAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,QAAI,QAAQ,WAAW;AACvB,QAAI,SAAS,WAAW;AACxB,UAAM,SAAS,IAAI,WAAW,IAAI;AAClC,QAAI,CAAC,OAAQ;AACb,WAAO,UAAU,YAAY,GAAG,CAAC;AACjC,WAAO,UAAU,eAAe,GAAG,CAAC;AACpC,UAAM,UAAU,WAAW,WAAW,IAAI;AAC1C,UAAM,aAAa,cAAc,WAAW,IAAI;AAChD,QAAI,CAAC,WAAW,CAAC,WAAY;AAC7B,YAAQ,UAAU,GAAG,GAAG,WAAW,OAAO,WAAW,MAAM;AAC3D,YAAQ,UAAU,KAAK,GAAG,CAAC;AAC3B,eAAW,UAAU,GAAG,GAAG,cAAc,OAAO,cAAc,MAAM;AAAA,EACtE,GAAG,CAAC,CAAC;AAIL,QAAM,cAAc,CAAC,MAAM;AACzB,UAAM,SAAS,iBAAiB;AAChC,QAAI,CAAC,OAAQ,QAAO,EAAE,GAAG,GAAG,GAAG,EAAE;AACjC,UAAM,OAAO,OAAO,sBAAsB;AAC1C,UAAM,UAAU,aAAa,IAAI,EAAE,QAAQ,CAAC,EAAE,UAAU,EAAE;AAC1D,UAAM,UAAU,aAAa,IAAI,EAAE,QAAQ,CAAC,EAAE,UAAU,EAAE;AAC1D,WAAO;AAAA,MACL,IAAI,UAAU,KAAK,SAAS,OAAO,QAAQ,KAAK;AAAA,MAChD,IAAI,UAAU,KAAK,QAAQ,OAAO,SAAS,KAAK;AAAA,IAClD;AAAA,EACF;AAEA,QAAM,yBAAyB,CAAC,MAAM;AACpC,QAAI,eAAe,SAAU;AAC7B,oBAAgB,YAAY,CAAC,CAAC;AAAA,EAChC;AAEA,QAAM,eAAe,CAAC,MAAM;AAC1B,UAAM,MAAM,YAAY,CAAC;AACzB,QAAI,eAAe,QAAQ;AACzB,2BAAqB,GAAG;AACxB;AAAA,IACF;AACA,QAAI,eAAe,WAAW,eAAe,cAAe;AAC5D,QAAI,eAAe,QAAQ;AACzB,YAAMG,OAAM,iBAAiB,SAAS,WAAW,IAAI;AACrD,UAAIA,KAAK,CAAAA,KAAI,UAAU,GAAG,GAAGA,KAAI,OAAO,OAAOA,KAAI,OAAO,MAAM;AAChE,mBAAa,IAAI;AACjB,oBAAc,IAAI;AAClB,mBAAa,GAAG;AAChB,kBAAY,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,OAAO,GAAG,QAAQ,EAAE,CAAC;AACvD,sBAAgB;AAChB;AAAA,IACF;AACA,UAAM,MAAM,iBAAiB,SAAS,WAAW,IAAI;AACrD,QAAI,CAAC,IAAK;AACV,iBAAa,IAAI;AACjB,kBAAc,GAAG;AACjB,qBAAiB,CAAC,GAAG,CAAC;AACtB,QAAI,CAAC,UAAU,QAAQ,EAAE,SAAS,UAAU,GAAG;AAC7C,UAAI,UAAU;AACd,UAAI,OAAO,IAAI,GAAG,IAAI,CAAC;AACvB,UAAI,2BACF,eAAe,WAAW,oBAAoB;AAChD,UAAI,eAAe,SAAU,KAAI,cAAc;AAAA,IACjD;AAAA,EACF;AAEA,QAAM,OAAO,CAAC,MAAM;AAClB,UAAM,aAAa,YAAY,CAAC;AAChC,QAAI,eAAe,UAAU,CAAC,UAAW;AACzC,QAAI,eAAe,WAAW,eAAe,cAAe;AAC5D,UAAM,gBAAgB,iBAAiB;AACvC,UAAM,MAAM,eAAe,WAAW,IAAI;AAC1C,QAAI,CAAC,iBAAiB,CAAC,IAAK;AAC5B,qBAAiB,CAAC,SAAS,CAAC,GAAG,MAAM,UAAU,CAAC;AAEhD,QAAI,eAAe,UAAU,aAAa,WAAW;AACnD,YAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,GAAG,cAAc,KAAK,CAAC;AACjE,YAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,GAAG,cAAc,MAAM,CAAC;AAClE,YAAM,IAAI,IAAI,UAAU,GACtB,IAAI,IAAI,UAAU;AACpB,kBAAY;AAAA,QACV,GAAG,IAAI,IAAI,IAAI,UAAU;AAAA,QACzB,GAAG,IAAI,IAAI,IAAI,UAAU;AAAA,QACzB,OAAO,KAAK,IAAI,CAAC;AAAA,QACjB,QAAQ,KAAK,IAAI,CAAC;AAAA,MACpB,CAAC;AACD,4BAAsB,MAAM,gBAAgB,CAAC;AAC7C;AAAA,IACF;AACA,QAAI,CAAC,UAAU,QAAQ,EAAE,SAAS,UAAU,GAAG;AAC7C,UAAI,2BACF,eAAe,WAAW,oBAAoB;AAChD,UAAI,eAAe,SAAU,KAAI,cAAc;AAC/C,UAAI,OAAO,WAAW,GAAG,WAAW,CAAC;AACrC,UAAI,YAAY;AAChB,UAAI,UAAU;AACd,UAAI,WAAW;AACf,UAAI,OAAO;AAAA,IACb;AACA,QAAI,eAAe,UAAU,YAAY;AACvC,UAAI,UAAU,GAAG,GAAG,cAAc,OAAO,cAAc,MAAM;AAC7D,UAAI,eAAe,SAAS;AAC1B,qBAAa,QACV,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EACpC,QAAQ,CAAC,MAAM,cAAc,QAAQ,mBAAmB,CAAC,CAAC;AAAA,MAC/D;AACA,UAAI,KAAK;AACT,UAAI,2BAA2B;AAC/B,UAAI,cAAc;AAClB,UAAI,YAAY;AAChB,UAAI,UAAU;AACd,UAAI,WAAW;AACf,cAAQ,aAAa;AAAA,QACnB,KAAK;AACH,cAAI,YAAY,CAAC,YAAY,GAAG,YAAY,CAAC,CAAC;AAC9C;AAAA,QACF,KAAK;AACH,cAAI,YAAY,CAAC,WAAW,SAAS,CAAC;AACtC;AAAA,QACF;AACE,cAAI,YAAY,CAAC,CAAC;AAAA,MACtB;AACA,UAAI,UAAU;AACd,UAAI,OAAO,WAAW,GAAG,WAAW,CAAC;AACrC,UAAI,OAAO,WAAW,GAAG,WAAW,CAAC;AACrC,UAAI,OAAO;AACX,UAAI,QAAQ;AAAA,IACd;AAAA,EACF;AAEA,QAAM,cAAc,MAAM;AACxB,QAAI,eAAe,QAAQ;AACzB,mBAAa,KAAK;AAClB,UAAI,YAAY,SAAS,QAAQ,MAAM,SAAS,SAAS,IAAI;AAC3D,sBAAc,KAAK;AACnB,qBAAa,IAAI;AACjB,8BAAsB,MAAM,gBAAgB,CAAC;AAAA,MAC/C,OAAO;AACL,oBAAY,IAAI;AAChB,sBAAc,KAAK;AACnB,qBAAa,IAAI;AACjB,cAAMA,OAAM,iBAAiB,SAAS,WAAW,IAAI;AACrD,YAAIA,KAAK,CAAAA,KAAI,UAAU,GAAG,GAAGA,KAAI,OAAO,OAAOA,KAAI,OAAO,MAAM;AAAA,MAClE;AACA;AAAA,IACF;AACA,QAAI,eAAe,WAAW,eAAe,cAAe;AAC5D,QAAI,CAAC,UAAW;AAChB,UAAM,MAAM,iBAAiB,SAAS,WAAW,IAAI;AACrD,QAAI,KAAK;AACP,UAAI,CAAC,UAAU,QAAQ,EAAE,SAAS,UAAU,GAAG;AAC7C,YAAI,UAAU;AACd,YAAI,2BAA2B;AAC/B,YAAI,cAAc,SAAS,GAAG;AAC5B;AAAA,YACE;AAAA,cACE;AAAA,cACA,eAAe,WAAW,gBAAgB;AAAA,cAC1C;AAAA,gBACE,QAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,aAAa;AAAA,gBACb;AAAA,gBACA,UAAU,eAAe;AAAA,cAC3B;AAAA,YACF;AAAA,UACF;AAAA,QAEF;AAAA,MACF,WAAW,eAAe,UAAU,YAAY;AAC9C,cAAM,WAAW,cAAc,cAAc,SAAS,CAAC,KAAK;AAC5D;AAAA,UACE,aAAa,WAAW,aAAa;AAAA,YACnC,QAAQ,CAAC,YAAY,QAAQ;AAAA,YAC7B,OAAO;AAAA,YACP,aAAa;AAAA,YACb;AAAA,YACA;AAAA,YACA;AAAA,YACA,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MAEF;AACA,mBAAa,KAAK;AAClB,oBAAc,IAAI;AAClB,uBAAiB,CAAC,CAAC;AAAA,IACrB;AAAA,EACF;AAIA,QAAM,aAAa,YAAY;AAC7B,QAAI,SAAU;AACd,iBAAa,SAAS,QAAQ;AAC9B,mBAAe,SAAS,QAAQ;AAChC,kBAAc,SAAS,QAAQ;AAC/B,wBAAoB,SAAS,QAAQ;AACrC,kBAAc,SAAS,QAAQ;AAC/B,UAAM,aAAa,cAAc;AACjC,UAAM,gBAAgB,iBAAiB;AACvC,QAAI,CAAC,cAAc,CAAC,cAAe;AACnC,UAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,QAAI,QAAQ,WAAW;AACvB,QAAI,SAAS,WAAW;AACxB,UAAM,MAAM,IAAI,WAAW,IAAI;AAC/B,QAAI,CAAC,IAAK;AACV,QAAI,UAAU,YAAY,GAAG,CAAC;AAC9B,QAAI,UAAU,eAAe,GAAG,CAAC;AAEjC,QAAI;AACF,YAAM,SAAS,MAAM,qBAAqB,KAAK;AAAA,QAC7C,UAAU,UAAU,cAAc,QAAQ,OAAO;AAAA,MACnD,CAAC;AACD,aAAO,MAAM;AAAA,IACf,SAAS,KAAK;AACZ,cAAQ,MAAM,sCAAsC,GAAG;AACvD,MAAAH,OAAM;AAAA,QACJ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,eAAe,MAAM;AACzB,QAAI,kBAAmB,sBAAqB,IAAI;AAAA,QAC3C,SAAQ;AAAA,EACf;AAEA,QAAM,yBAAqB,4BAAY,MAAM;AAC3C,YAAQ,YAAY;AAAA,MAClB,KAAK;AACH,qBAAa,SAAS,QAAQ;AAC9B;AAAA,MACF,KAAK;AACH,uBAAe,SAAS,QAAQ;AAChC;AAAA,MACF,KAAK;AACH,sBAAc,SAAS,QAAQ;AAC/B;AAAA,MACF,KAAK;AACH,4BAAoB,SAAS,QAAQ;AACrC;AAAA,MACF,KAAK;AACH,sBAAc,SAAS,QAAQ;AAC/B;AAAA,MACF;AACE;AAAA,IACJ;AACA,kBAAc,IAAI;AAAA,EACpB,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,sBAAsB,MAAM;AAChC,yBAAqB,KAAK;AAC1B,YAAQ;AAAA,EACV;AAEA,QAAM,mBAAmB,CAAC,SAAS;AACjC,QAAI,eAAe,SAAU,cAAa,EAAE;AAAA,aACnC,eAAe,SAAU,cAAa,CAAC;AAChD,QAAI,SAAS,QAAQ;AACnB,kBAAY,IAAI;AAChB,oBAAc,KAAK;AACnB,mBAAa,IAAI;AACjB,YAAM,MAAM,iBAAiB,SAAS,WAAW,IAAI;AACrD,UAAI,KAAK;AACP,YAAI,UAAU,GAAG,GAAG,IAAI,OAAO,OAAO,IAAI,OAAO,MAAM;AACvD,YAAI,2BAA2B;AAAA,MACjC;AAAA,IACF;AACA,QAAI,SAAS,QAAQ;AACnB,2BAAqB,IAAI;AACzB,cAAQ,EAAE;AAAA,IACZ;AACA,yBAAqB,IAAI;AACzB,2BAAuB,IAAI;AAC3B,qBAAiB,KAAK;AACtB,0BAAsB,KAAK;AAC3B,wBAAoB,SAAS,MAAM;AACnC,kBAAc,IAAI;AAAA,EACpB;AAIA,QAAM,mBAAmB;AAAA,IACvB,OAAO,2BAA2B,EAAE;AAAA,IACpC,QAAQ,2BAA2B,EAAE;AAAA,IACrC,OAAO;AAAA,IACP,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,iBAAiB,CAAC,IAAI,SAAS;AAC7B,2BAAqB,EAAE;AACvB,6BAAuB,IAAI;AAAA,IAC7B;AAAA,IACA,mBAAmB,MAAM;AACvB,2BAAqB,IAAI;AACzB,6BAAuB,IAAI;AAAA,IAC7B;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,4BAAwB;AAAA,IAC5B,CAAC,OAAO;AACN;AAAA,QACE,aAAa,SAAS,kBAAkB;AAAA,UACtC,aAAa;AAAA,UACb,WAAW;AAAA,QACb,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,cAAc,SAAS;AAAA,EAC1B;AAEA,MAAI,CAAC,OAAQ,QAAO;AAIpB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,IAAG;AAAA,MACH,UAAU;AAAA,MAEV;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO,WAAW,EAAE,QAAQ,SAAS,IAAI;AAAA,YAGzC;AAAA,4DAAC,SAAI,WAAU,4DACb,yDAAC,QAAG,WAAU,yBAAwB;AAAA;AAAA,gBACvB,cAAc;AAAA,iBAC7B,GACF;AAAA,cAGA,+CAAC,SAAI,WAAU,uDAEb;AAAA,8DAAC,SAAI,WAAU,aACb;AAAA,kBAAC;AAAA;AAAA,oBACC;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBAEA;AAAA,oBACA;AAAA;AAAA,gBACF,GACF;AAAA,gBAGA,+CAAC,SAAI,WAAU,0FAEb;AAAA,iEAAC,SAAI,WAAU,8BACb;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAQ;AAAA,wBACR,SAAS;AAAA,wBACT,UAAU,CAAC;AAAA,wBACX,OAAO,SAAS,WAAW;AAAA,wBAC3B,WAAU;AAAA,wBAEV;AAAA,wEAAC,8BAAM,WAAU,WAAU;AAAA,0BAAE;AAAA;AAAA;AAAA,oBAC/B;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAQ;AAAA,wBACR,SAAS;AAAA,wBACT,UAAU,CAAC;AAAA,wBACX,OAAM;AAAA,wBACN,WAAU;AAAA,wBAEV;AAAA,wEAAC,8BAAM,WAAU,WAAU;AAAA,0BAAE;AAAA;AAAA;AAAA,oBAC/B;AAAA,qBACF;AAAA,kBAGA,+CAAC,SAAI,WAAU,0BACZ;AAAA;AAAA,sBACC,CAAC,UAAU,8CAAC,+BAAO,WAAU,WAAU,GAAI,QAAQ;AAAA,sBACnD,CAAC,UAAU,8CAAC,+BAAO,WAAU,WAAU,GAAI,QAAQ;AAAA,sBACnD,CAAC,aAAa,8CAAC,+BAAO,WAAU,WAAU,GAAI,WAAW;AAAA,sBACzD,CAAC,UAAU,8CAAC,+BAAO,WAAU,WAAU,GAAI,QAAQ;AAAA,sBACnD,CAAC,QAAQ,8CAAC,6BAAK,WAAU,WAAU,GAAI,MAAM;AAAA,sBAC7C,CAAC,SAAS,8CAAC,mCAAW,WAAU,WAAU,GAAI,OAAO;AAAA,sBACrD;AAAA,wBACE;AAAA,wBACA,8CAAC,uCAAe,WAAU,WAAU;AAAA,wBACpC;AAAA,sBACF;AAAA,sBACA,CAAC,QAAQ,8CAAC,kCAAU,WAAU,WAAU,GAAI,MAAM;AAAA,oBACpD,EAAE,IAAI,CAAC,CAAC,MAAM,MAAM,KAAK,MACvB;AAAA,sBAAC;AAAA;AAAA,wBAEC,SAAS,eAAe,OAAO,cAAc;AAAA,wBAC7C,SAAS,MAAM,iBAAiB,IAAI;AAAA,wBACpC,WAAU;AAAA,wBAET;AAAA;AAAA,0BAAK;AAAA,0BAAE;AAAA;AAAA;AAAA,sBALH;AAAA,oBAMP,CACD;AAAA,oBAGD;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAS,eAAe,SAAS,cAAc;AAAA,wBAC/C,SAAS,MAAM;AACb,gCAAM,IAAI,iBAAiB;AAC3B,gCAAM,MAAM,GAAG,WAAW,IAAI;AAC9B,8BAAI,CAAC,KAAK,CAAC,IAAK;AAChB,gCAAM,aAAa,IAChB,aAAa,GAAG,GAAG,EAAE,OAAO,EAAE,MAAM,EACpC,KAAK,KAAK,CAAC,GAAG,MAAM,IAAI,MAAM,KAAK,MAAM,CAAC;AAC7C,8BAAI,cAAc,eAAe,QAAQ;AACvC,+CAAmB,IAAI;AACvB,qDAAyB,KAAK;AAC9B,gDAAoB,KAAK;AAAA,0BAC3B,MAAO,kBAAiB,MAAM;AAAA,wBAChC;AAAA,wBACA,WAAU;AAAA,wBAEV;AAAA,wEAAC,6BAAK,WAAU,WAAU;AAAA,0BAAE;AAAA;AAAA;AAAA,oBAC9B;AAAA,oBAEA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAS,eAAe,UAAU,cAAc;AAAA,wBAChD,SAAS,MAAM,cAAc,OAAO;AAAA,wBACpC,WAAU;AAAA,wBAEV;AAAA,wEAAC,gCAAQ,WAAU,WAAU;AAAA,0BAAE;AAAA;AAAA;AAAA,oBACjC;AAAA,oBAEA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAS,eAAe,gBAAgB,cAAc;AAAA,wBACtD,SAAS,MAAM,cAAc,aAAa;AAAA,wBAC1C,WAAU;AAAA,wBAEV;AAAA,wEAAC,+BAAkB,WAAU,WAAU;AAAA,0BAAE;AAAA;AAAA;AAAA,oBAC3C;AAAA,qBACF;AAAA,kBAGC,eAAe,UACd,+CAAC,SAAI,WAAU,kBACb;AAAA,kEAAC,OAAE,WAAU,yBAAwB,+DAErC;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAQ;AAAA,wBACR,SAAS,MAAM;AACb,sCAAY,IAAI;AAChB,gCAAM,MAAM,iBAAiB,SAAS,WAAW,IAAI;AACrD,8BAAI;AACF,gCAAI,UAAU,GAAG,GAAG,IAAI,OAAO,OAAO,IAAI,OAAO,MAAM;AAAA,wBAC3D;AAAA,wBACA,WAAU;AAAA,wBACX;AAAA;AAAA,oBAED;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAS;AAAA,wBACT,UAAU,CAAC;AAAA,wBACX,WAAU;AAAA,wBACX;AAAA;AAAA,oBAED;AAAA,qBACF;AAAA,kBAID,cACC;AAAA,oBACE;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA;AAAA,kBACF,EAAE,SAAS,UAAU,KACnB,+CAAC,SAAI,WAAU,QACb;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAQ;AAAA,wBACR,WAAU;AAAA,wBAEV;AAAA,wEAAC,6BAAK,WAAU,WAAU;AAAA,0BAAE;AAAA;AAAA;AAAA,oBAC9B;AAAA,oBACA,+CAAC,UAAO,OAAO,aAAa,eAAe,gBACzC;AAAA,oEAAC,cAAW,OAAM,SAAQ,mBAAK;AAAA,sBAC/B,8CAAC,cAAW,OAAM,UAAS,oBAAM;AAAA,sBACjC,8CAAC,cAAW,OAAM,UAAS,oBAAM;AAAA,uBACnC;AAAA,qBACF;AAAA,kBAIH,cACC,CAAC,QAAQ,aAAa,QAAQ,EAAE,SAAS,UAAU,KACjD,+CAAC,SAAI,WAAU,gCACb;AAAA,kEAAC,SAAM,SAAQ,mBAAkB,WAAU,WAAU,wBAErD;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,IAAG;AAAA,wBACH,MAAK;AAAA,wBACL,OACE,oBAAoB,gBAChB,YACA;AAAA,wBAEN,UAAU,CAAC,MAAM,mBAAmB,EAAE,OAAO,KAAK;AAAA,wBAClD,WAAU;AAAA;AAAA,oBACZ;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,WAAU;AAAA,wBACV,SAAS,MAAM,mBAAmB,aAAa;AAAA;AAAA,oBACjD;AAAA,qBACF;AAAA,kBAIJ,+CAAC,SAAI,WAAU,gCACb;AAAA;AAAA,sBAAC;AAAA;AAAA,wBACC,SAAQ;AAAA,wBACR,WAAU;AAAA,wBAEV;AAAA,wEAAC,gCAAQ,WAAU,WAAU;AAAA,0BAAE;AAAA;AAAA;AAAA,oBACjC;AAAA,oBACA;AAAA,sBAAC;AAAA;AAAA,wBACC,MAAK;AAAA,wBACL,OAAO;AAAA,wBACP,UAAU,CAAC,MAAM,gBAAgB,EAAE,OAAO,KAAK;AAAA,wBAC/C,WAAU;AAAA;AAAA,oBACZ;AAAA,qBACF;AAAA,kBAGA,+CAAC,SAAI,WAAU,QACb;AAAA,mEAAC,SAAM,SAAQ,iBAAgB,WAAU,cAAa;AAAA;AAAA,sBACvC;AAAA,sBAAU;AAAA,uBACzB;AAAA,oBACA,+CAAC,SAAI,WAAU,2BACb;AAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,SAAQ;AAAA,0BACR,MAAK;AAAA,0BACL,SAAS,MACP,aAAa,CAAC,MAAM,KAAK,IAAI,cAAc,IAAI,CAAC,CAAC;AAAA,0BAEnD,WAAU;AAAA,0BAEV,wDAAC,8BAAM,WAAU,WAAU;AAAA;AAAA,sBAC7B;AAAA,sBACA;AAAA,wBAAC;AAAA;AAAA,0BACC,IAAG;AAAA,0BACH,KAAK;AAAA,0BACL,KAAK;AAAA,0BACL,MAAM;AAAA,0BACN,OAAO,CAAC,SAAS;AAAA,0BACjB,eAAe,CAAC,MAAM,aAAa,EAAE,CAAC,CAAC;AAAA,0BACvC,WAAU;AAAA;AAAA,sBACZ;AAAA,sBACA;AAAA,wBAAC;AAAA;AAAA,0BACC,SAAQ;AAAA,0BACR,MAAK;AAAA,0BACL,SAAS,MACP,aAAa,CAAC,MAAM,KAAK,IAAI,cAAc,IAAI,CAAC,CAAC;AAAA,0BAEnD,WAAU;AAAA,0BAEV,wDAAC,6BAAK,WAAU,WAAU;AAAA;AAAA,sBAC5B;AAAA,uBACF;AAAA,qBACF;AAAA,mBACF;AAAA,gBAGA,8CAAC,SAAI,WAAU,0HACb;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAU;AAAA,oBACV,IAAG;AAAA,oBAEH;AAAA;AAAA,wBAAC;AAAA;AAAA,0BACC,KAAK;AAAA,0BACL,WAAU;AAAA;AAAA,sBACZ;AAAA,sBACA;AAAA,wBAAC;AAAA;AAAA,0BACC,KAAK;AAAA,0BACL,aAAa;AAAA,0BACb,aAAa,CAAC,MAAM;AAClB,iCAAK,CAAC;AACN,mDAAuB,CAAC;AAAA,0BAC1B;AAAA,0BACA,WAAW;AAAA,0BACX,cAAc,MAAM;AAClB,wCAAY;AACZ,4CAAgB,IAAI;AAAA,0BACtB;AAAA,0BACA,cAAc;AAAA,0BACd,aAAa,CAAC,MAAM;AAClB,iCAAK,CAAC;AACN,mDAAuB,CAAC;AAAA,0BAC1B;AAAA,0BACA,YAAY,MAAM;AAChB,wCAAY;AACZ,4CAAgB,IAAI;AAAA,0BACtB;AAAA,0BACA,WAAU;AAAA,0BACV,OAAO;AAAA,4BACL,QACE,eAAe,SACX,SACA,eAAe,OACb,YACA,eAAe,WACb,SACA;AAAA,0BACZ;AAAA;AAAA,sBACF;AAAA,sBAGC,WACC,+CAAC,2BAAS,UAAU,MACjB;AAAA,uCAAe,eACd;AAAA,0BAACJ;AAAA,0BAAA;AAAA,4BACC,KAAK;AAAA,4BACJ,GAAG;AAAA,4BACJ,QAAQ;AAAA,4BACR,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR;AAAA,4BACA;AAAA,4BACA,WAAW;AAAA;AAAA,wBACb;AAAA,wBAED,eAAe,YACd;AAAA,0BAACE;AAAA,0BAAA;AAAA,4BACC,KAAK;AAAA,4BACJ,GAAG;AAAA,4BACJ,QAAQ;AAAA,4BACR,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR;AAAA,4BACA;AAAA,4BACA,WAAW;AAAA;AAAA,wBACb;AAAA,wBAED,eAAe,WACd;AAAA,0BAACD;AAAA,0BAAA;AAAA,4BACC,KAAK;AAAA,4BACJ,GAAG;AAAA,4BACJ,QAAQ;AAAA,4BACR,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR;AAAA,4BACA;AAAA,4BACA,WAAW;AAAA;AAAA,wBACb;AAAA,wBAED,eAAe,kBACd;AAAA,0BAACE;AAAA,0BAAA;AAAA,4BACC,KAAK;AAAA,4BACJ,GAAG;AAAA,4BACJ,QAAQ;AAAA,4BACR,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR,QAAQ;AAAA,4BACR,WAAW;AAAA,4BACX,WAAW;AAAA;AAAA,wBACb;AAAA,wBAED,eAAe,UACd;AAAA,0BAACJ;AAAA,0BAAA;AAAA,4BACC,KAAK;AAAA,4BACJ,GAAG;AAAA,4BACJ,OAAO;AAAA,4BACP,UAAU;AAAA,4BACV,iBAAiB;AAAA,4BACjB,oBAAoB;AAAA,4BACpB,QAAQ;AAAA,4BACR,aAAa;AAAA,4BACb;AAAA,4BACA;AAAA,4BACA,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR;AAAA,4BACA;AAAA,4BACA,WAAW;AAAA,4BACX,UAAU;AAAA;AAAA,wBACZ;AAAA,wBAID,eAAe,eAAe,WAAW,SAAS,KACjD;AAAA,0BAACC;AAAA,0BAAA;AAAA,4BACC,KAAK;AAAA,4BACJ,GAAG;AAAA,4BACJ,QAAQ;AAAA,4BACR,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR;AAAA,4BACA;AAAA,4BACA,WAAW;AAAA;AAAA,wBACb;AAAA,wBAED,eAAe,YAAY,QAAQ,SAAS,KAC3C;AAAA,0BAACE;AAAA,0BAAA;AAAA,4BACC,KAAK;AAAA,4BACJ,GAAG;AAAA,4BACJ,QAAQ;AAAA,4BACR,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR;AAAA,4BACA;AAAA,4BACA,WAAW;AAAA;AAAA,wBACb;AAAA,wBAED,eAAe,WAAW,OAAO,SAAS,KACzC;AAAA,0BAACD;AAAA,0BAAA;AAAA,4BACC,KAAK;AAAA,4BACJ,GAAG;AAAA,4BACJ,QAAQ;AAAA,4BACR,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR;AAAA,4BACA;AAAA,4BACA,WAAW;AAAA;AAAA,wBACb;AAAA,wBAED,eAAe,kBAAkB,aAAa,SAAS,KACtD;AAAA,0BAACE;AAAA,0BAAA;AAAA,4BACC,KAAK;AAAA,4BACJ,GAAG;AAAA,4BACJ,QAAQ;AAAA,4BACR,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR,QAAQ;AAAA,4BACR,WAAW;AAAA,4BACX,WAAW;AAAA;AAAA,wBACb;AAAA,wBAED,eAAe,UAAU,MAAM,SAAS,KACvC;AAAA,0BAACJ;AAAA,0BAAA;AAAA,4BACC,KAAK;AAAA,4BACJ,GAAG;AAAA,4BACJ,OAAO;AAAA,4BACP,UAAU;AAAA,4BACV,iBAAiB;AAAA,4BACjB,oBAAoB;AAAA,4BACpB,QAAQ,YAAY,eAAe;AAAA,4BACnC,aAAa;AAAA,4BACb;AAAA,4BACA;AAAA,4BACA,OAAO;AAAA,4BACP,QAAQ;AAAA,4BACR;AAAA,4BACA;AAAA,4BACA,WAAW;AAAA,4BACX,mBAAmB;AAAA,4BACnB,UAAU;AAAA;AAAA,wBACZ;AAAA,yBAEJ;AAAA,sBAID,eAAe,WACd;AAAA,wBAAC;AAAA;AAAA,0BACC,QAAM;AAAA,0BACN,WAAW;AAAA,0BACX;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA;AAAA,sBACF;AAAA,sBAED,eAAe,iBACd;AAAA,wBAAC;AAAA;AAAA,0BACC,QAAM;AAAA,0BACN,WAAW;AAAA,0BACX;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA;AAAA,sBACF;AAAA,sBAID,gBAAgB,eAAe,YAC9B;AAAA,wBAAC;AAAA;AAAA,0BACC,OAAO;AAAA,4BACL,UAAU;AAAA,4BACV,MAAM,GAAG,aAAa,IAAI,YAAY,CAAC;AAAA,4BACvC,KAAK,GAAG,aAAa,IAAI,YAAY,CAAC;AAAA,4BACtC,OAAO,GAAG,SAAS;AAAA,4BACnB,QAAQ,GAAG,SAAS;AAAA,4BACpB,QAAQ;AAAA,4BACR,cAAc;AAAA,4BACd,eAAe;AAAA,4BACf,YAAY;AAAA,4BACZ,QAAQ;AAAA,4BACR,WAAW;AAAA,0BACb;AAAA;AAAA,sBACF;AAAA,sBAID,iBACC;AAAA,wBAAC;AAAA;AAAA,0BACC,IAAG;AAAA,0BACH,WAAW,iGACT,qBACI,wCACA,2BACN;AAAA,0BACA,OAAO;AAAA,4BACL,YAAY,qBACR,4CACA;AAAA,4BACJ,WAAW,qBACP,kCACA;AAAA,4BACJ,QAAQ;AAAA,4BACR,eAAe;AAAA,0BACjB;AAAA,0BAEA;AAAA;AAAA,8BAAC;AAAA;AAAA,gCACC,WAAW,6CAA6C,qBAAqB,cAAc,EAAE;AAAA;AAAA,4BAC/F;AAAA,4BACA,8CAAC,SAAI,WAAU,oIACZ,+BACG,sBACA,uBACN;AAAA;AAAA;AAAA,sBACF;AAAA;AAAA;AAAA,gBAEJ,GACF;AAAA,gBAGA,8CAAC,SAAI,WAAU,qEAAoE;AAAA,iBACrF;AAAA,cAGA,+CAAC,SAAI,WAAU,2EACb;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,WAAU;AAAA,oBAEV;AAAA,oEAAC,+BAAO,WAAU,WAAU;AAAA,sBAC5B,8CAAC,UAAK,WAAU,wBAAuB,0BAAY;AAAA;AAAA;AAAA,gBACrD;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,WAAU;AAAA,oBAEV;AAAA,oEAAC,iCAAS,WAAU,WAAU;AAAA,sBAC9B,8CAAC,UAAK,WAAU,wBAAuB,sBAAQ;AAAA;AAAA;AAAA,gBACjD;AAAA,gBACA;AAAA,kBAAC;AAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,SAAS;AAAA,oBACT,WAAU;AAAA,oBACX;AAAA;AAAA,gBAED;AAAA,gBACA,8CAAC,UAAO,SAAS,YAAY,WAAU,qBAAoB,0BAE3D;AAAA,iBACF;AAAA;AAAA;AAAA,QACF;AAAA,QAGC,qBACC,8CAAC,SAAI,WAAU,sEACb,yDAAC,SAAI,WAAU,sDACb;AAAA,wDAAC,QAAG,WAAU,8BAA6B,8CAE3C;AAAA,UACA,8CAAC,OAAE,WAAU,sBAAqB,2FAGlC;AAAA,UACA,+CAAC,SAAI,WAAU,0BACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAQ;AAAA,gBACR,SAAS,MAAM,qBAAqB,KAAK;AAAA,gBACzC,WAAU;AAAA,gBACX;AAAA;AAAA,YAED;AAAA,YACA,8CAAC,UAAO,SAAQ,eAAc,SAAS,qBAAqB,yBAE5D;AAAA,aACF;AAAA,WACF,GACF;AAAA;AAAA;AAAA,EAEJ;AAEJ;","names":["import_react","import_jsx_runtime","width","height","import_react","import_react_konva","import_jsx_runtime","import_react","import_react_konva","import_jsx_runtime","import_react","import_react_konva","import_jsx_runtime","newCircle","circles","import_react","import_react_konva","import_jsx_runtime","newArrow","import_react","import_lucide_react","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_react","drawArrowHead","import_react","import_jsx_runtime","minBrushSize","maxBrushSize","React","import_react","import_jsx_runtime","TextEditor","KonvaRectangle","ArrowKonva","KonvaCircle","KonvaDoubleArrow","toast","c","isMobile","ctx"]}