@xom11/whiteboard 0.24.0 → 0.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ExcalidrawWithMenus-KBLDWPM2.mjs → ExcalidrawWithMenus-WENZRYYE.mjs} +2 -2
- package/dist/{ExcalidrawWithMenus-KBLDWPM2.mjs.map → ExcalidrawWithMenus-WENZRYYE.mjs.map} +1 -1
- package/dist/catalog.json +4 -4
- package/dist/{chunk-TOOHCAWP.mjs → chunk-4D5CSIJO.mjs} +4 -4
- package/dist/{chunk-TOOHCAWP.mjs.map → chunk-4D5CSIJO.mjs.map} +1 -1
- package/dist/chunk-6V4SH4JJ.mjs +1801 -0
- package/dist/chunk-6V4SH4JJ.mjs.map +1 -0
- package/dist/{chunk-VBJLUHCY.mjs → chunk-AZIARTGX.mjs} +3 -3
- package/dist/{chunk-VBJLUHCY.mjs.map → chunk-AZIARTGX.mjs.map} +1 -1
- package/dist/{chunk-6XUPIGVD.mjs → chunk-BKSXPNPQ.mjs} +4 -123
- package/dist/chunk-BKSXPNPQ.mjs.map +1 -0
- package/dist/{chunk-O6QTYAKE.mjs → chunk-CRAPWQKJ.mjs} +4 -4
- package/dist/{chunk-O6QTYAKE.mjs.map → chunk-CRAPWQKJ.mjs.map} +1 -1
- package/dist/{chunk-RBUILBX3.mjs → chunk-CSCF3YFZ.mjs} +5 -5
- package/dist/{chunk-RBUILBX3.mjs.map → chunk-CSCF3YFZ.mjs.map} +1 -1
- package/dist/{chunk-7WG2KDRF.mjs → chunk-IBTRMWD6.mjs} +3 -3
- package/dist/{chunk-7WG2KDRF.mjs.map → chunk-IBTRMWD6.mjs.map} +1 -1
- package/dist/{chunk-RD34F5PM.mjs → chunk-ICR4CVOE.mjs} +2 -2
- package/dist/chunk-ICR4CVOE.mjs.map +1 -0
- package/dist/{chunk-33PEN2WC.mjs → chunk-LVNCYP4J.mjs} +6 -6
- package/dist/{chunk-33PEN2WC.mjs.map → chunk-LVNCYP4J.mjs.map} +1 -1
- package/dist/{chunk-FZY33J6Z.mjs → chunk-MFOGFFIL.mjs} +6 -6
- package/dist/{chunk-FZY33J6Z.mjs.map → chunk-MFOGFFIL.mjs.map} +1 -1
- package/dist/{chunk-TQYQVXNW.mjs → chunk-QGNU34T7.mjs} +2 -2
- package/dist/chunk-QGNU34T7.mjs.map +1 -0
- package/dist/{chunk-RXOFO64U.mjs → chunk-SGFJLHHG.mjs} +3 -3
- package/dist/{chunk-RXOFO64U.mjs.map → chunk-SGFJLHHG.mjs.map} +1 -1
- package/dist/{chunk-2SKXRBGS.mjs → chunk-WWMQ2VHZ.mjs} +4 -4
- package/dist/{chunk-2SKXRBGS.mjs.map → chunk-WWMQ2VHZ.mjs.map} +1 -1
- package/dist/{chunk-XVSO7FBM.mjs → chunk-YIPI3WUL.mjs} +5 -5
- package/dist/{chunk-XVSO7FBM.mjs.map → chunk-YIPI3WUL.mjs.map} +1 -1
- package/dist/{chunk-VRWZILTG.mjs → chunk-ZBJBQKJ2.mjs} +128 -3
- package/dist/chunk-ZBJBQKJ2.mjs.map +1 -0
- package/dist/geometry-2d.js +2056 -100
- package/dist/geometry-2d.js.map +1 -1
- package/dist/geometry-2d.mjs +6 -6
- package/dist/geometry-3d.js +2051 -15
- package/dist/geometry-3d.js.map +1 -1
- package/dist/geometry-3d.mjs +5 -5
- package/dist/graph-2d.js +1938 -8
- package/dist/graph-2d.js.map +1 -1
- package/dist/graph-2d.mjs +8 -8
- package/dist/{host-EVJT3LIF.mjs → host-DOAYVL35.mjs} +29 -28
- package/dist/host-DOAYVL35.mjs.map +1 -0
- package/dist/{host-3N4E4KJH.mjs → host-GKNQBBUE.mjs} +11 -11
- package/dist/{host-3N4E4KJH.mjs.map → host-GKNQBBUE.mjs.map} +1 -1
- package/dist/{host-6SNSZ332.mjs → host-QS2EOTRJ.mjs} +3 -3
- package/dist/{host-6SNSZ332.mjs.map → host-QS2EOTRJ.mjs.map} +1 -1
- package/dist/{host-HN4X3TBC.mjs → host-TLIXN4CF.mjs} +8 -8
- package/dist/{host-HN4X3TBC.mjs.map → host-TLIXN4CF.mjs.map} +1 -1
- package/dist/index.js +2044 -120
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +22 -30
- package/dist/index.mjs.map +1 -1
- package/dist/latex.js.map +1 -1
- package/dist/latex.mjs +1 -1
- package/dist/render-SA4JTOW3.mjs +8 -0
- package/dist/{render-OCVGDKK6.mjs.map → render-SA4JTOW3.mjs.map} +1 -1
- package/dist/serialize-3NZS6A6Q.mjs +6 -0
- package/dist/{serialize-GKN6OVPM.mjs.map → serialize-3NZS6A6Q.mjs.map} +1 -1
- package/package.json +11 -2
- package/dist/chunk-3KBL77M6.mjs +0 -127
- package/dist/chunk-3KBL77M6.mjs.map +0 -1
- package/dist/chunk-6XUPIGVD.mjs.map +0 -1
- package/dist/chunk-RD34F5PM.mjs.map +0 -1
- package/dist/chunk-TQYQVXNW.mjs.map +0 -1
- package/dist/chunk-VRWZILTG.mjs.map +0 -1
- package/dist/host-EVJT3LIF.mjs.map +0 -1
- package/dist/render-OCVGDKK6.mjs +0 -8
- package/dist/serialize-GKN6OVPM.mjs +0 -6
package/dist/geometry-2d.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/scene/types.ts","../src/core/scene/registry.ts","../src/core/scene/reducer.ts","../src/core/scene/store.ts","../src/core/scene/selectors.ts","../src/core/scene/hooks/useEditorState.ts","../src/core/scene/hooks/index.ts","../src/core/scene/expressions/parser.ts","../src/core/scene/index.ts","../src/stamps/shared/serializeScene.ts","../src/stamps/geometry-2d/serialize.ts","../src/stamps/geometry-2d/editor/theme.ts","../src/core/scene/render/types2d.ts","../src/core/scene/render/JxgRenderer.ts","../src/stamps/shared/jxgOffscreenRender.ts","../src/stamps/geometry-2d/render.ts","../src/stamps/shared/svgToStampFile.ts","../src/stamps/geometry-2d/types.ts","../src/core/scene/ui/LeftPanelShell.tsx","../src/core/scene/ui/kindMeta.ts","../src/core/scene/ui/ObjectRowMenu.tsx","../src/core/scene/ui/ObjectRow.tsx","../src/core/scene/ui/ObjectListPanel.tsx","../src/stamps/shared/StampLeftPanel/AxisGridSection.tsx","../src/stamps/shared/StampLeftPanel/types.ts","../src/stamps/shared/StampLeftPanel/useToolHoverTooltip.ts","../src/stamps/shared/StampLeftPanel/ToolGrid.tsx","../src/stamps/shared/StampLeftPanel/Desktop.tsx","../src/stamps/shared/MobileToolDrawer.tsx","../src/stamps/shared/StampLeftPanel/Mobile.tsx","../src/stamps/shared/StampLeftPanel/index.tsx","../src/stamps/geometry-2d/editor/icons.tsx","../src/stamps/geometry-2d/editor/tools.tsx","../src/stamps/geometry-2d/editor/handlers/pointerDown/move.ts","../src/stamps/geometry-2d/editor/handlers/pointerDown/select.ts","../src/stamps/shared/safeJsx.ts","../src/stamps/geometry-2d/editor/handlers/utils.ts","../src/stamps/geometry-2d/editor/handlers/pointerDown/point.ts","../src/stamps/geometry-2d/editor/handlers/pointerDown/singleTarget.ts","../src/stamps/geometry-2d/editor/handlers/pointerDown/polygon.ts","../src/stamps/geometry-2d/editor/handlers/classifyPointVsCircle.ts","../src/stamps/geometry-2d/editor/handlers/finalizeShape.ts","../src/stamps/geometry-2d/editor/transforms.ts","../src/stamps/geometry-2d/editor/handlers/transform.ts","../src/stamps/geometry-2d/editor/handlers/pointerDown/multiClick.ts","../src/stamps/geometry-2d/editor/handlers/pointerDown/index.ts","../src/stamps/geometry-2d/editor/handlers/pointerMove.ts","../src/stamps/geometry-2d/editor/handlers/pointerUp.ts","../src/stamps/geometry-2d/editor/handlers/index.ts","../src/stamps/geometry-2d/editor/hitTest.ts","../src/stamps/shared/useToolStateMachine.ts","../src/stamps/shared/attachJxgWheelZoom.ts","../src/stamps/shared/initJxgBoard.ts","../src/stamps/geometry-2d/editor/snapshot.ts","../src/stamps/geometry-2d/editor/preview.ts","../src/stamps/geometry-2d/editor/previewActions.ts","../src/stamps/geometry-2d/editor/attrMapping.ts","../src/stamps/geometry-2d/editor/buildHandle.ts","../src/stamps/geometry-2d/editor/idResolvers.ts","../src/stamps/geometry-2d/editor/useAxisGridSync.ts","../src/stamps/geometry-2d/editor/useEditorShortcuts.ts","../src/stamps/geometry-2d/editor/useJxgSceneIdMap.ts","../src/stamps/geometry-2d/editor/MiniBoard.tsx","../src/stamps/shared/excalidrawPalette.ts","../src/stamps/shared/useIsMobile.ts","../src/stamps/geometry-2d/editor/PropertiesPopover.tsx","../src/stamps/geometry-2d/editor/MultiPropertiesPopover.tsx","../src/stamps/geometry-2d/editor/TransformParamPopover.tsx","../src/stamps/shared/StampLeftPanel/constants.ts","../src/stamps/shared/Toast/ToastProvider.tsx","../src/stamps/shared/Toast/Toast.tsx","../src/stamps/shared/Toast/useToast.ts","../src/stamps/shared/Toast/ToastHost.tsx","../src/stamps/shared/Toast/index.ts","../src/stamps/geometry-2d/editor/useAiFigure.ts","../src/stamps/geometry-2d/editor/AiFigurePrompt.tsx","../src/stamps/geometry-2d/editor/EditorPanel.tsx","../src/stamps/shared/useChordShortcut.ts","../src/stamps/shared/insertImage.ts","../src/stamps/shared/useStampStore.ts","../src/stamps/geometry-2d/host.tsx","../src/stamps/geometry-2d/index.tsx"],"names":["produce","React","init_types","jsx","jsxs","React2","React3","Fragment","useState","useRef","useEffect","useCallback","useMemo","createPortal","UndoIcon","RedoIcon","id","label","ids","sc","jxgFromSceneId","forwardRef","MiniBoard2D","useId","jxgIdToSceneId","screenCoordsOf","objectsAt","clearPreviewSegs","removePhantom","useImperativeHandle","useLayoutEffect","rect","w","left","top","Icons","useReducer","createContext","useContext","init_Toast","GeometryEditorPanelInner","GeometryEditorPanel","A_CODE","GeometryStampHost","lazy"],"mappings":"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","file":"geometry-2d.js","sourcesContent":["// src/core/scene/types.ts\n\nexport type SceneObject<A = Record<string, unknown>> = {\n id: string;\n kind: string;\n label: string;\n visible: boolean;\n locked: boolean;\n layer: string;\n schemaVersion: number;\n attrs: A;\n};\n\n// View per domain — narrow theo `state.meta.domain`.\nexport type View2D = {\n readonly bbox: readonly [number, number, number, number]; // [xmin, ymax, xmax, ymin]\n readonly showAxis: boolean;\n readonly showGrid: boolean;\n};\n\nexport type View3D = {\n readonly bbox3D: readonly [number, number, number, number, number, number]; // [xmin, xmax, ymin, ymax, zmin, zmax]\n readonly azimuth: number;\n readonly elevation: number;\n};\n\nexport type ViewGraph2D = {\n readonly xMin: number;\n readonly xMax: number;\n readonly yMin: number;\n readonly yMax: number;\n readonly showAxis: boolean;\n readonly showGrid: boolean;\n};\n\n// Union of all view shapes — narrow qua state.meta.domain.\nexport type SceneView = View2D | View3D | ViewGraph2D;\n\n// Discriminated union: domain narrow → view shape narrow.\nexport type StateMeta =\n | { readonly domain: '2d'; readonly version: number; readonly view: View2D }\n | { readonly domain: '3d'; readonly version: number; readonly view: View3D }\n | { readonly domain: 'graph2d'; readonly version: number; readonly view: ViewGraph2D };\n\nexport type Domain = StateMeta['domain'];\n\n// Backward-compat alias: UPDATE_VIEW patch dùng graph-2d shape (chỉ graph-2d\n// dispatch action này hiện tại).\nexport type ViewSettings = ViewGraph2D;\n\nexport type State = {\n readonly objects: Readonly<Record<string, SceneObject>>;\n readonly order: readonly string[];\n readonly counter: number;\n readonly meta: StateMeta;\n};\n\nexport type Action =\n | { type: 'ADD'; payload: { obj: SceneObject } }\n | { type: 'UPDATE'; payload: { id: string; patch: Partial<Omit<SceneObject, 'id' | 'kind' | 'attrs'>> } }\n | { type: 'UPDATE_ATTRS'; payload: { id: string; patch: Record<string, unknown> } }\n | { type: 'DELETE'; payload: { id: string } }\n | { type: 'RESET' }\n | { type: 'LOAD'; payload: { state: State } }\n | { type: 'TRANSACTION'; payload: { actions: Action[] } }\n | { type: 'UPDATE_VIEW'; payload: { patch: Partial<ViewSettings> } };\n\nexport type RenderCtx = {\n jxg: unknown;\n resolveRef: (id: string) => unknown;\n defaults: Readonly<Record<string, unknown>>;\n /** Map tham số (parameter.label → parameter.value). Chỉ graph2d dùng. */\n paramMap?: Readonly<Record<string, number>>;\n};\n\nexport type KindDef<A = Record<string, unknown>> = {\n type: string;\n schemaVersion: number;\n migrate: Record<number, (prev: any) => any>;\n validate?: (attrs: A) => void;\n dependsOn: (attrs: A) => string[];\n describe: (obj: SceneObject<A>, state?: State) => string;\n measure?: (obj: SceneObject<A>, state: State) =>\n | { label: string; value: number }[]\n | null;\n render: (obj: SceneObject<A>, ctx: RenderCtx) => unknown;\n update?: (\n obj: SceneObject<A>,\n prev: SceneObject<A>,\n ctx: RenderCtx,\n existing: unknown,\n ) => void;\n};\n\nexport const DEFAULT_VIEW_2D: View2D = {\n bbox: [-10, 10, 10, -10],\n showAxis: false,\n showGrid: false,\n};\n\nexport const DEFAULT_VIEW_3D: View3D = {\n bbox3D: [-5, 5, -5, 5, -5, 5],\n azimuth: 60,\n elevation: 30,\n};\n\nexport const DEFAULT_VIEW_GRAPH2D: ViewGraph2D = {\n xMin: -10, xMax: 10, yMin: -10, yMax: 10,\n showAxis: true, showGrid: true,\n};\n\n// EMPTY_STATE giữ shape '3d' (legacy default). Dùng `createEmptyState(domain)`\n// khi cần state cụ thể cho domain — đảm bảo meta.view khớp domain.\nexport const EMPTY_STATE: State = {\n objects: {},\n order: [],\n counter: 0,\n meta: { domain: '3d', version: 1, view: DEFAULT_VIEW_3D },\n};\n\nexport function createEmptyState(domain: Domain): State {\n const base = { objects: {}, order: [], counter: 0 } as const;\n switch (domain) {\n case '2d':\n return { ...base, meta: { domain: '2d', version: 1, view: DEFAULT_VIEW_2D } };\n case '3d':\n return { ...base, meta: { domain: '3d', version: 1, view: DEFAULT_VIEW_3D } };\n case 'graph2d':\n return { ...base, meta: { domain: 'graph2d', version: 1, view: DEFAULT_VIEW_GRAPH2D } };\n }\n}\n","// src/core/scene/registry.ts\nimport type { KindDef } from './types';\n\nconst registry = new Map<string, KindDef>();\n\nexport function registerKind<A = Record<string, unknown>>(def: KindDef<A>): void {\n if (registry.has(def.type)) {\n console.warn(`[scene] kind \"${def.type}\" đã được đăng ký — ghi đè định nghĩa cũ`);\n }\n registry.set(def.type, def as unknown as KindDef);\n}\n\nexport function getKind(type: string): KindDef {\n const def = registry.get(type);\n if (!def) throw new Error(`[scene] unknown kind: ${type}`);\n return def;\n}\n\nexport function listKinds(): KindDef[] {\n return Array.from(registry.values());\n}\n\n// Chỉ dùng cho test — reset registry giữa các test case.\nexport function __clearRegistryForTests(): void {\n registry.clear();\n}\n","// src/core/scene/reducer.ts\nimport type { Draft } from 'immer';\nimport type { Action, State, SceneObject } from './types';\nimport { getKind } from './registry';\n\nfunction collectDependents(state: Draft<State> | State, rootId: string): Set<string> {\n const dependents = new Set<string>([rootId]);\n let grew = true;\n while (grew) {\n grew = false;\n for (const obj of Object.values(state.objects) as SceneObject[]) {\n if (dependents.has(obj.id)) continue;\n let kindDef;\n try { kindDef = getKind(obj.kind); } catch { continue; }\n const refs = kindDef.dependsOn(obj.attrs as never);\n if (refs.some(r => dependents.has(r))) {\n dependents.add(obj.id);\n grew = true;\n }\n }\n }\n return dependents;\n}\n\nexport function reduce(draft: Draft<State>, action: Action): void {\n switch (action.type) {\n case 'ADD': {\n const { obj } = action.payload;\n if (draft.objects[obj.id]) throw new Error(`[scene] id \"${obj.id}\" đã tồn tại`);\n const kindDef = getKind(obj.kind);\n kindDef.validate?.(obj.attrs as never);\n draft.objects[obj.id] = obj;\n draft.order.push(obj.id);\n draft.counter += 1;\n return;\n }\n case 'UPDATE': {\n const { id, patch } = action.payload;\n const obj = draft.objects[id];\n if (!obj) return;\n Object.assign(obj, patch);\n return;\n }\n case 'UPDATE_ATTRS': {\n const { id, patch } = action.payload;\n const obj = draft.objects[id];\n if (!obj) return;\n const kindDef = getKind(obj.kind);\n const nextAttrs = { ...(obj.attrs as object), ...patch };\n kindDef.validate?.(nextAttrs as never);\n obj.attrs = nextAttrs;\n return;\n }\n case 'DELETE': {\n const { id } = action.payload;\n if (!draft.objects[id]) return;\n const toDelete = collectDependents(draft, id);\n for (const delId of toDelete) {\n delete draft.objects[delId];\n }\n draft.order = draft.order.filter(x => !toDelete.has(x));\n return;\n }\n case 'RESET': {\n draft.objects = {};\n draft.order = [];\n draft.counter = 0;\n return;\n }\n case 'LOAD': {\n const { state } = action.payload;\n draft.objects = { ...state.objects };\n draft.order = [...state.order];\n draft.counter = state.counter;\n // Cast qua Draft<State['meta']> — immer chấp nhận structurally\n // identical shape, chỉ stricter readonly.\n draft.meta = { ...state.meta } as typeof draft.meta;\n return;\n }\n case 'TRANSACTION': {\n for (const sub of action.payload.actions) {\n reduce(draft, sub);\n }\n return;\n }\n case 'UPDATE_VIEW': {\n // Action payload typed cho graph-2d ViewSettings. Bỏ qua nếu domain\n // khác (view shape không tương thích — 2d dùng bbox, 3d dùng bbox3D).\n if (draft.meta.domain !== 'graph2d') return;\n Object.assign(draft.meta.view, action.payload.patch);\n return;\n }\n }\n}\n","// src/core/scene/store.ts\nimport { produce } from 'immer';\nimport { reduce } from './reducer';\nimport type { Action, State } from './types';\n\nexport type StoreListener = (next: State, prev: State, action: Action) => void;\n\nexport interface Store {\n getState(): State;\n dispatch(action: Action): void;\n subscribe(listener: StoreListener): () => void;\n undo(): void;\n redo(): void;\n canUndo(): boolean;\n canRedo(): boolean;\n transaction(fn: (dispatch: (a: Action) => void) => void): void;\n withoutHistory(fn: () => void): void;\n}\n\nexport type StoreOptions = { historyLimit?: number };\n\nconst HISTORY_DEFAULT = 100;\n\nconst UNDO_ACTION: Action = { type: 'TRANSACTION', payload: { actions: [] } };\nconst REDO_ACTION: Action = { type: 'TRANSACTION', payload: { actions: [] } };\n\nexport function createStore(initial: State, options: StoreOptions = {}): Store {\n const limit = options.historyLimit ?? HISTORY_DEFAULT;\n let state = initial;\n const past: State[] = [];\n const future: State[] = [];\n const listeners = new Set<StoreListener>();\n let dispatching = false;\n let suspendHistory = false;\n let transactionActions: Action[] | null = null;\n\n function notify(prev: State, action: Action): void {\n listeners.forEach(l => l(state, prev, action));\n }\n\n function pushHistory(prev: State): void {\n if (suspendHistory) return;\n past.push(prev);\n if (past.length > limit) past.shift();\n future.length = 0;\n }\n\n function applyAction(action: Action): void {\n const prev = state;\n state = produce(state, draft => { reduce(draft, action); });\n if (state !== prev) {\n pushHistory(prev);\n notify(prev, action);\n }\n }\n\n return {\n getState: () => state,\n\n dispatch(action: Action) {\n if (dispatching) throw new Error('[scene] không được dispatch trong subscriber');\n if (transactionActions) {\n transactionActions.push(action);\n return;\n }\n dispatching = true;\n try { applyAction(action); } finally { dispatching = false; }\n },\n\n subscribe(listener) {\n listeners.add(listener);\n return () => { listeners.delete(listener); };\n },\n\n undo() {\n const prev = past.pop();\n if (!prev) return;\n future.push(state);\n const old = state;\n state = prev;\n notify(old, UNDO_ACTION);\n },\n\n redo() {\n const next = future.pop();\n if (!next) return;\n past.push(state);\n if (past.length > limit) past.shift();\n const old = state;\n state = next;\n notify(old, REDO_ACTION);\n },\n\n canUndo: () => past.length > 0,\n canRedo: () => future.length > 0,\n\n transaction(fn) {\n if (transactionActions) throw new Error('[scene] transaction lồng nhau không hỗ trợ');\n transactionActions = [];\n try { fn((a) => { transactionActions!.push(a); }); }\n finally {\n const actions = transactionActions;\n transactionActions = null;\n if (actions.length > 0) {\n applyAction({ type: 'TRANSACTION', payload: { actions } });\n }\n }\n },\n\n withoutHistory(fn) {\n const prevSuspend = suspendHistory;\n suspendHistory = true;\n try { fn(); } finally { suspendHistory = prevSuspend; }\n },\n };\n}\n","// src/core/scene/selectors.ts\nimport type { State, SceneObject } from './types';\nimport { getKind } from './registry';\n\nexport function listObjects(state: State): SceneObject[] {\n return state.order\n .map(id => state.objects[id])\n .filter((o): o is SceneObject => o !== undefined);\n}\n\nexport function byKind(state: State, kind: string): SceneObject[] {\n return listObjects(state).filter(o => o.kind === kind);\n}\n\nexport function dependentsOf(state: State, rootId: string): Set<string> {\n const result = new Set<string>([rootId]);\n let grew = true;\n while (grew) {\n grew = false;\n for (const obj of Object.values(state.objects)) {\n if (result.has(obj.id)) continue;\n let def;\n try { def = getKind(obj.kind); } catch { continue; }\n const refs = def.dependsOn(obj.attrs as never);\n if (refs.some(r => result.has(r))) {\n result.add(obj.id);\n grew = true;\n }\n }\n }\n return result;\n}\n\nconst ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\n/**\n * Nhóm các kind chia chung namespace label. User nhìn point free, intersection,\n * midpoint đều là \"điểm\" có tên 1 chữ cái — không được trùng tên dù khác kind\n * trong scene store. Ví dụ tam giác ABC + giao điểm 2 đường: giao điểm phải là\n * D (không phải A trùng đỉnh tam giác).\n */\nconst LABEL_GROUPS: Record<string, readonly string[]> = {\n point: ['point', 'intersection'],\n intersection: ['point', 'intersection'],\n};\n\nexport function nextLabel(state: State, kind: string): string {\n const kinds = LABEL_GROUPS[kind] ?? [kind];\n const used = new Set(\n listObjects(state).filter(o => kinds.includes(o.kind)).map(o => o.label),\n );\n for (const c of ALPHABET) if (!used.has(c)) return c;\n let idx = 1;\n while (true) {\n for (const c of ALPHABET) {\n const candidate = `${c}${idx}`;\n if (!used.has(candidate)) return candidate;\n }\n idx += 1;\n }\n}\n","// src/core/scene/hooks/useEditorState.ts\nimport * as React from 'react';\nimport type { Store } from '../store';\nimport type { State } from '../types';\n\nexport interface UseEditorStateOptions {\n /** Store sẵn có (host owns). */\n store: Store;\n /** Serialized scene để LOAD lúc mount. Null/undefined = bỏ qua. */\n initialState?: { state: State } | null;\n /** Notify host mỗi khi store fire (canUndo/canRedo có thể đổi). */\n onHistoryChange?: (canUndo: boolean, canRedo: boolean) => void;\n /** Bind Ctrl/Cmd+Z, Cmd+Shift+Z, Ctrl+Y. Default true. */\n bindKeyboardShortcuts?: boolean;\n}\n\n// Side effects chung cho stamp editor panel mà host owns store:\n// - LOAD initial state một lần (trong withoutHistory để không bẩn undo stack).\n// - Propagate canUndo/canRedo lên host qua callback.\n// - Bind global keyboard shortcuts cho undo/redo.\nexport function useEditorState(opts: UseEditorStateOptions): void {\n const { store, initialState, onHistoryChange, bindKeyboardShortcuts = true } = opts;\n\n const onHistoryChangeRef = React.useRef(onHistoryChange);\n onHistoryChangeRef.current = onHistoryChange;\n\n React.useEffect(() => {\n if (initialState?.state) {\n const loaded = initialState.state;\n store.withoutHistory(() => {\n store.dispatch({ type: 'LOAD', payload: { state: loaded } });\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n React.useEffect(() => {\n onHistoryChangeRef.current?.(store.canUndo(), store.canRedo());\n const unsub = store.subscribe(() => {\n onHistoryChangeRef.current?.(store.canUndo(), store.canRedo());\n });\n return unsub;\n }, [store]);\n\n React.useEffect(() => {\n if (!bindKeyboardShortcuts) return;\n const onKey = (e: KeyboardEvent) => {\n const ae = document.activeElement as HTMLElement | null;\n const inField = !!(\n ae && (ae.tagName === 'INPUT' || ae.tagName === 'TEXTAREA' || ae.isContentEditable)\n );\n if (inField) return;\n if (!(e.metaKey || e.ctrlKey)) return;\n const key = e.key.toLowerCase();\n if (key === 'z' && !e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n store.undo();\n } else if ((key === 'z' && e.shiftKey) || (key === 'y' && !e.shiftKey)) {\n e.preventDefault();\n e.stopPropagation();\n store.redo();\n }\n };\n window.addEventListener('keydown', onKey, { capture: true });\n return () => window.removeEventListener('keydown', onKey, { capture: true });\n }, [store, bindKeyboardShortcuts]);\n}\n","// src/core/scene/hooks/index.ts\nexport { useSceneStore } from './useSceneStore';\nexport type { SceneStoreApi } from './useSceneStore';\nexport { useEditorState } from './useEditorState';\nexport type { UseEditorStateOptions } from './useEditorState';\n","// src/core/scene/expressions/parser.ts\n// Pure expression parser cho function2d kind. Không import JSXGraph/React.\n\nexport const ALLOWED_CONSTANTS = ['pi', 'e'] as const;\nexport const ALLOWED_FUNCTIONS = [\n 'sin', 'cos', 'tan',\n 'asin', 'acos', 'atan', 'atan2',\n 'sinh', 'cosh', 'tanh',\n 'exp', 'log', 'log10', 'ln',\n 'sqrt', 'cbrt', 'abs',\n 'floor', 'ceil', 'round',\n 'min', 'max', 'pow',\n] as const;\n\nconst ID_RE = /[A-Za-z_][A-Za-z0-9_]*/g;\nconst UNSAFE_RE = /[=;{}]|\\beval\\b|\\bnew\\b|\\breturn\\b|\\bthis\\b|\\bwindow\\b|\\bdocument\\b|\\bglobal\\b|\\bprocess\\b/;\n\nconst NUMBER_RE = /^[+-]?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$/;\n\nexport type ValidateResult = { ok: true } | { ok: false; error: string };\n\n// Detect identifiers used as function calls (followed by '(')\nconst FUNC_CALL_RE = /([A-Za-z_][A-Za-z0-9_]*)\\s*\\(/g;\n\n/** Kiểm tra expression có hợp lệ không. */\nexport function validate(expression: string): ValidateResult {\n const trimmed = expression.trim();\n if (!trimmed) return { ok: false, error: 'Biểu thức rỗng' };\n if (UNSAFE_RE.test(trimmed)) return { ok: false, error: 'Biểu thức chứa toán tử hoặc identifier không cho phép' };\n\n // Replace ^ với ** (JS không có ^)\n const jsExpr = trimmed.replace(/\\^/g, '**');\n\n // Check function call identifiers — must be in ALLOWED_FUNCTIONS\n let fm: RegExpExecArray | null;\n FUNC_CALL_RE.lastIndex = 0;\n while ((fm = FUNC_CALL_RE.exec(jsExpr)) !== null) {\n const fnName = fm[1];\n if (!(ALLOWED_FUNCTIONS as readonly string[]).includes(fnName)) {\n return { ok: false, error: `Hàm không hợp lệ: ${fnName}` };\n }\n }\n\n // Check identifiers\n const ids = new Set<string>();\n let m: RegExpExecArray | null;\n ID_RE.lastIndex = 0;\n while ((m = ID_RE.exec(jsExpr)) !== null) ids.add(m[0]);\n\n for (const id of ids) {\n if (id === 'x') continue;\n if ((ALLOWED_CONSTANTS as readonly string[]).includes(id)) continue;\n if ((ALLOWED_FUNCTIONS as readonly string[]).includes(id)) continue;\n // Remaining identifiers treat as parameter — OK at validate time.\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(id)) {\n return { ok: false, error: `Identifier không hợp lệ: ${id}` };\n }\n }\n\n // Try syntactic compile (with dummy params) to catch syntax errors.\n try {\n buildFunctionBody(jsExpr, Array.from(ids).filter(\n (id) => id !== 'x' && !(ALLOWED_CONSTANTS as readonly string[]).includes(id) && !(ALLOWED_FUNCTIONS as readonly string[]).includes(id),\n ));\n } catch (err) {\n return { ok: false, error: `Cú pháp lỗi: ${(err as Error).message}` };\n }\n\n return { ok: true };\n}\n\n/**\n * Compile expression thành function (x: number) => number.\n * - `params` map từ identifier → value để inline vào closure.\n * - Trả string error nếu invalid.\n */\nexport function compile(\n expression: string,\n params: Record<string, number>,\n): ((x: number) => number) | string {\n const v = validate(expression);\n if (!v.ok) return v.error;\n const jsExpr = expression.trim().replace(/\\^/g, '**');\n\n const ids = new Set<string>();\n let m: RegExpExecArray | null;\n ID_RE.lastIndex = 0;\n while ((m = ID_RE.exec(jsExpr)) !== null) ids.add(m[0]);\n\n const paramNames: string[] = [];\n for (const id of ids) {\n if (id === 'x') continue;\n if ((ALLOWED_CONSTANTS as readonly string[]).includes(id)) continue;\n if ((ALLOWED_FUNCTIONS as readonly string[]).includes(id)) continue;\n paramNames.push(id);\n }\n\n try {\n const body = buildFunctionBody(jsExpr, paramNames);\n // eslint-disable-next-line @typescript-eslint/no-implied-eval, no-new-func\n const fn = new Function('x', ...paramNames, body) as (\n x: number,\n ...args: number[]\n ) => number;\n const args = paramNames.map((name) => params[name] ?? NaN);\n return (x: number) => fn(x, ...args);\n } catch (err) {\n return `Compile error: ${(err as Error).message}`;\n }\n}\n\nfunction buildFunctionBody(jsExpr: string, _paramNames: string[]): string {\n // Inline Math constants and functions.\n // sin → Math.sin, pi → Math.PI, e → Math.E, ln → Math.log.\n let body = jsExpr;\n body = body.replace(/\\bln\\b/g, 'Math.log');\n body = body.replace(/\\blog\\b/g, 'Math.log10');\n body = body.replace(/\\bpi\\b/g, '(Math.PI)');\n body = body.replace(/\\be\\b(?!\\w)/g, '(Math.E)');\n for (const fn of ALLOWED_FUNCTIONS) {\n if (fn === 'log' || fn === 'log10') continue; // already handled\n body = body.replace(new RegExp(`\\\\b${fn}\\\\b`, 'g'), `Math.${fn}`);\n }\n return `\"use strict\"; return (${body});`;\n}\n\n/** Liệt kê free identifiers (≠ x, ≠ allowed const/func). */\nexport function collectFreeVars(expression: string): string[] {\n const v = validate(expression);\n if (!v.ok) return [];\n const ids = new Set<string>();\n let m: RegExpExecArray | null;\n ID_RE.lastIndex = 0;\n while ((m = ID_RE.exec(expression)) !== null) ids.add(m[0]);\n const out: string[] = [];\n for (const id of ids) {\n if (id === 'x') continue;\n if ((ALLOWED_CONSTANTS as readonly string[]).includes(id)) continue;\n if ((ALLOWED_FUNCTIONS as readonly string[]).includes(id)) continue;\n if (NUMBER_RE.test(id)) continue;\n out.push(id);\n }\n return out.sort();\n}\n","// src/core/scene/index.ts\nexport type {\n SceneObject,\n State,\n StateMeta,\n Domain,\n SceneView,\n View2D,\n View3D,\n ViewGraph2D,\n ViewSettings,\n Action,\n KindDef,\n RenderCtx,\n} from './types';\nexport {\n EMPTY_STATE,\n DEFAULT_VIEW_2D,\n DEFAULT_VIEW_3D,\n DEFAULT_VIEW_GRAPH2D,\n createEmptyState,\n} from './types';\nexport { createStore } from './store';\nexport type { Store, StoreListener, StoreOptions } from './store';\nexport { reduce } from './reducer';\nexport { registerKind, getKind, listKinds } from './registry';\nexport { listObjects, byKind, dependentsOf, nextLabel } from './selectors';\nexport { migrateState } from './migrations/runMigrations';\nexport { registerStateMigration, CURRENT_STATE_VERSION } from './migrations/state';\n\nexport { useSceneStore, useEditorState } from './hooks';\nexport type { SceneStoreApi, UseEditorStateOptions } from './hooks';\n\n// IMPORTANT: import kinds barrel để side-effect register chạy.\nimport './kinds';\n","// Shared serialize/deserialize cho scene State của stamp interactive\n// (geometry-2d, geometry-3d, graph-2d). Sau Tier D PR 3, customData chỉ\n// store JSON.stringify(state) — không còn envelope `{version, bbox, state}`.\n//\n// View info (bbox/axis/grid/azimuth/elevation) nằm trong `state.meta.view`\n// (discriminated union theo domain). createEmptyState set default view.\n//\n// Note: v0.20 KHÔNG support backward-compat envelope cũ. Data sessionStorage\n// cũ sẽ fallback về empty state khi parse fail (per user spec).\n\nimport { createEmptyState, type Domain, type State } from '../../core/scene';\n\nexport function serializeScene(state: State): string {\n return JSON.stringify(state);\n}\n\nfunction isValidState(value: unknown, domain: Domain): value is State {\n if (!value || typeof value !== 'object') return false;\n const v = value as Partial<State>;\n if (!v.meta || typeof v.meta !== 'object') return false;\n if (v.meta.domain !== domain) return false;\n if (!v.meta.view || typeof v.meta.view !== 'object') return false;\n if (!v.objects || typeof v.objects !== 'object') return false;\n if (!Array.isArray(v.order)) return false;\n return true;\n}\n\nexport function deserializeScene(domain: Domain, raw: string): State {\n if (!raw) return createEmptyState(domain);\n try {\n const parsed = JSON.parse(raw);\n if (isValidState(parsed, domain)) return parsed;\n } catch {\n /* swallow — fallback empty state */\n }\n return createEmptyState(domain);\n}\n","// src/stamps/geometry-2d/serialize.ts\n//\n// Sau Tier D PR 3: customData.jsonState chỉ chứa `JSON.stringify(state)`\n// (không còn envelope `{version, bbox, state, showAxis, showGrid}`).\n// View info (bbox/axis/grid) nằm trong `state.meta.view` (View2D shape).\n\nimport { serializeScene, deserializeScene } from '../shared/serializeScene';\nimport type { State, View2D } from '../../core/scene';\n\nexport function serializeBoard(state: State, view: View2D): string {\n const withView: State = {\n ...state,\n meta: { domain: '2d', version: state.meta.version, view },\n };\n return serializeScene(withView);\n}\n\nexport function deserializeBoard(raw: string): State {\n return deserializeScene('2d', raw);\n}\n","// Theme-aware palette cho geometry stamps.\n//\n// Dùng `Theme2D` từ `core/scene/render/types2d` (cùng abstraction graph-2d).\n// JxgRenderer nhận theme qua constructor options và phân phối qua RenderCtx\n// đến mỗi kind handler — không cần sentinel string trong attrs nữa.\n\nimport { type Theme2D } from '../../../core/scene/render/types2d';\n\nexport const themeStroke = (dark: boolean): string => (dark ? '#e2e8f0' : '#0f172a');\nexport const themeAxis = (dark: boolean): string => (dark ? '#cbd5e1' : '#94a3b8');\nexport const themeGrid = (dark: boolean): string => (dark ? '#475569' : '#e2e8f0');\nexport const themeLabel = (dark: boolean): string => (dark ? '#e2e8f0' : '#000000');\n\nexport function paletteFor(isDark: boolean): Theme2D {\n const stroke = themeStroke(isDark);\n return {\n stroke,\n fill: '#60a5fa',\n axis: themeAxis(isDark),\n grid: themeGrid(isDark),\n label: themeLabel(isDark),\n // Geometry-2d điểm fill = stroke color (đồng bộ chấm điểm với nét vẽ).\n pointFill: stroke,\n };\n}\n","// src/core/scene/render/types2d.ts\nimport type { RenderCtx } from '../types';\n\nexport type Theme2D = {\n stroke: string;\n fill: string;\n label: string;\n axis: string;\n grid: string;\n pointFill: string;\n};\n\nexport const DEFAULT_THEME_2D: Theme2D = {\n stroke: '#0f172a',\n fill: '#60a5fa',\n label: '#0f172a',\n axis: '#94a3b8',\n grid: '#e2e8f0',\n pointFill: '#1e40af',\n};\n\nexport type RenderCtx2D = RenderCtx & {\n theme: Theme2D;\n};\n","// src/core/scene/render/JxgRenderer.ts\nimport type { Store } from '../store';\nimport type { State, SceneObject, RenderCtx } from '../types';\nimport { getKind } from '../registry';\nimport { DEFAULT_THEME_2D, type Theme2D } from './types2d';\nimport { collectFreeVars } from '../expressions/parser';\n\nexport type JxgRendererOptions = { theme?: Theme2D };\n\nexport class JxgRenderer {\n private board: unknown;\n private store: Store;\n private theme: Theme2D;\n private elements = new Map<string, unknown>();\n private unsubscribe: () => void;\n private disposed = false;\n\n /** Chỉ dùng cho domain='graph2d': parameter.label → parameter.value */\n private paramMap: Record<string, number> = {};\n /** Chỉ dùng cho domain='graph2d': function2d.id → expression string */\n private functionExpr: Record<string, string> = {};\n\n constructor(store: Store, board: unknown, options: JxgRendererOptions = {}) {\n this.store = store;\n this.board = board;\n this.theme = options.theme ?? DEFAULT_THEME_2D;\n this.unsubscribe = store.subscribe((next, prev) => this.applyDiff(prev, next));\n // Render state hiện tại (vd LOAD chạy trước khi subscribe).\n this.applyDiff(undefined, store.getState());\n }\n\n private ctx(): RenderCtx {\n return {\n jxg: this.board,\n resolveRef: (id: string) => {\n // Synthetic \"<polyId>:border:<N>\" → polygon.borders[N]. Polygon edges\n // là sub-segment do JSXGraph auto-tạo bên trong polygon; chúng không\n // có scene id riêng. Synthetic id cho phép construct tools (vd\n // perpendicular qua một cạnh đa giác) tham chiếu cạnh như một line.\n const m = /^(.+):border:(\\d+)$/.exec(id);\n if (m) {\n const poly = this.elements.get(m[1]) as { borders?: unknown[] } | undefined;\n if (!poly) throw new Error(`[scene/2d] resolveRef: chưa render polygon id=\"${m[1]}\"`);\n const borders = poly.borders;\n const idx = parseInt(m[2], 10);\n if (!Array.isArray(borders) || !borders[idx]) {\n throw new Error(`[scene/2d] resolveRef: polygon \"${m[1]}\" không có border[${idx}]`);\n }\n return borders[idx];\n }\n const el = this.elements.get(id);\n if (!el) throw new Error(`[scene/2d] resolveRef: chưa render id=\"${id}\"`);\n return el;\n },\n defaults: { theme: this.theme, _functionExpr: this.functionExpr },\n paramMap: this.paramMap,\n };\n }\n\n /**\n * Rebuild `paramMap` và `functionExpr` từ state hiện tại.\n * Chỉ chạy khi domain='graph2d'. Chi phí thấp vì parameters thường ≤ 8.\n */\n private rebuildGraphMaps(state: State): void {\n if (state.meta.domain !== 'graph2d') return;\n const params: Record<string, number> = {};\n const fns: Record<string, string> = {};\n for (const id of state.order) {\n const obj = state.objects[id];\n if (obj.kind === 'parameter') {\n params[obj.label] = (obj.attrs as { value: number }).value;\n } else if (obj.kind === 'function2d') {\n fns[obj.id] = (obj.attrs as { expression: string }).expression;\n }\n }\n this.paramMap = params;\n this.functionExpr = fns;\n }\n\n private create(obj: SceneObject): void {\n try {\n const def = getKind(obj.kind);\n const el = def.render(obj, this.ctx());\n this.elements.set(obj.id, el);\n this.attachFreePointDragSync(obj, el);\n } catch (err) {\n console.warn(`[scene/render/2d] không render được ${obj.kind} id=\"${obj.id}\":`, err);\n }\n }\n\n /**\n * Đồng bộ toạ độ live của free point về scene.constraint khi user kéo bằng\n * tay (Move tool / mobile drag). JSXGraph mutate obj.X()/Y() ngay nhưng\n * constraint vẫn giữ giá trị lúc tạo → serialize sẽ ra SVG y hệt cũ →\n * fileId SHA-256 trùng → Excalidraw bỏ qua refresh. (Regression từ\n * commit f41f366 sau scene v2 port.)\n *\n * Chỉ áp dụng cho free point — glider/intersection/midpoint không drag được\n * trực tiếp (toạ độ derived từ ref khác).\n */\n private attachFreePointDragSync(obj: SceneObject, el: unknown): void {\n if (obj.kind !== 'point') return;\n const c = (obj.attrs as { constraint?: { kind?: string } }).constraint;\n if (!c || c.kind !== 'free') return;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const point = el as any;\n if (typeof point.on !== 'function') return;\n const sceneId = obj.id;\n point.on('up', () => {\n if (this.disposed) return;\n if (typeof point.X !== 'function' || typeof point.Y !== 'function') return;\n const x = point.X();\n const y = point.Y();\n if (!Number.isFinite(x) || !Number.isFinite(y)) return;\n const cur = this.store.getState().objects[sceneId];\n if (!cur) return;\n const curC = (cur.attrs as { constraint?: { kind?: string; x?: number; y?: number } }).constraint;\n if (!curC || curC.kind !== 'free') return;\n if (curC.x === x && curC.y === y) return;\n this.store.dispatch({\n type: 'UPDATE_ATTRS',\n payload: { id: sceneId, patch: { constraint: { kind: 'free', x, y } } },\n });\n });\n }\n\n private remove(id: string): void {\n // Selection halo (nếu có) phải bị xoá TRƯỚC element gốc — halo tham chiếu\n // tới point1/point2/center/vertices của element gốc qua lambda; xoá element\n // gốc trước sẽ làm halo dangling.\n this.removeHalo(id);\n this.selectedIds.delete(id);\n const el = this.elements.get(id);\n if (!el) return;\n try {\n const helpers = (el as Record<string, unknown>)._helpers;\n // Element chính bị remove trước, sau đó helpers (glider phụ trợ cho\n // tangent ...). Helpers thường là parent của element chính — nếu xoá\n // parent trước, JSXGraph có thể phàn nàn dangling reference.\n (this.board as { removeObject?: (e: unknown) => void }).removeObject?.(el);\n if (Array.isArray(helpers)) {\n for (const h of helpers) {\n try {\n (this.board as { removeObject?: (e: unknown) => void }).removeObject?.(h);\n } catch { /* ignore */ }\n }\n }\n } catch (err) {\n console.warn(`[scene/render/2d] không remove được id=\"${id}\":`, err);\n }\n this.elements.delete(id);\n }\n\n private applyDiff(prev: State | undefined, next: State): void {\n if (this.disposed) return;\n\n // Rebuild paramMap + functionExpr TRƯỚC khi diff, để ctx() có đúng\n // paramMap khi render lần đầu tiên.\n this.rebuildGraphMaps(next);\n\n const prevObjs = prev?.objects ?? {};\n const nextObjs = next.objects;\n\n // Xoá ids biến mất.\n for (const id of Object.keys(prevObjs)) {\n if (!(id in nextObjs)) this.remove(id);\n }\n\n // Thêm/cập nhật theo state.order — đảm bảo refs có trước.\n for (const id of next.order) {\n const cur = nextObjs[id];\n const old = prevObjs[id] as SceneObject | undefined;\n if (!old) {\n this.create(cur);\n continue;\n }\n if (Object.is(old, cur)) continue;\n const def = getKind(cur.kind);\n const existing = this.elements.get(id);\n if (def.update && existing) {\n try { def.update(cur, old, this.ctx(), existing); continue; }\n catch (err) { console.warn(`[scene/render/2d] update fail, recreate:`, err); }\n }\n this.remove(id);\n this.create(cur);\n }\n\n // Sau diff bình thường: nếu domain='graph2d', detect parameter value changes\n // và force re-render các function2d phụ thuộc.\n if (next.meta.domain === 'graph2d' && prev) {\n const changedParams = new Set<string>();\n for (const id of next.order) {\n const cur = next.objects[id];\n const old = prev.objects[id] as SceneObject | undefined;\n if (cur.kind !== 'parameter' || old?.kind !== 'parameter') continue;\n if ((cur.attrs as { value: number }).value !== (old.attrs as { value: number }).value) {\n changedParams.add(cur.label);\n }\n }\n if (changedParams.size > 0) {\n for (const id of next.order) {\n const obj = next.objects[id];\n if (obj.kind !== 'function2d') continue;\n const expr = (obj.attrs as { expression: string }).expression;\n const refs = collectFreeVars(expr);\n if (refs.some((r) => changedParams.has(r))) {\n this.remove(id);\n this.create(obj);\n }\n }\n }\n }\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.unsubscribe();\n for (const id of Array.from(this.elements.keys())) this.remove(id);\n this.disposed = true;\n }\n\n /** Return the rendered JSXGraph element for a scene id, or null if not found. */\n getElement(id: string): unknown {\n return this.elements.get(id) ?? null;\n }\n\n /** Return a read-only view of the scene id → JSXGraph element map (for hit-test). */\n listElements(): Map<string, unknown> {\n return this.elements;\n }\n\n // Selection halo overlay model: thay vì đổi màu element gốc thành đỏ, tạo\n // một halo element gray phía sau (lower layer) → giữ nguyên màu gốc. Hỗ\n // trợ multi-select cho cả canvas click-selection lẫn ObjectListPanel.\n private selectedIds: Set<string> = new Set();\n private haloMap: Map<string, unknown[]> = new Map();\n\n highlight(ids: string | string[] | null): void {\n if (this.disposed) return;\n const newIds = new Set<string>(\n ids == null ? [] : Array.isArray(ids) ? ids : [ids],\n );\n // Remove halos cho ids đã bị bỏ chọn.\n for (const id of this.selectedIds) {\n if (!newIds.has(id)) this.removeHalo(id);\n }\n // Add halos cho ids mới chọn.\n for (const id of newIds) {\n if (!this.selectedIds.has(id) && this.elements.has(id)) this.addHalo(id);\n }\n this.selectedIds = newIds;\n try {\n (this.board as { update?: () => void }).update?.();\n } catch { /* ignore */ }\n }\n\n private removeHalo(id: string): void {\n const halos = this.haloMap.get(id);\n if (!halos) return;\n const board = this.board as { removeObject?: (e: unknown) => void };\n for (const h of halos) {\n try { board.removeObject?.(h); } catch { /* ignore */ }\n }\n this.haloMap.delete(id);\n }\n\n private addHalo(id: string): void {\n const el = this.elements.get(id) as\n | {\n elType?: string;\n getAttribute?: (k: string) => unknown;\n X?: () => number;\n Y?: () => number;\n point1?: unknown;\n point2?: unknown;\n center?: unknown;\n Radius?: () => number;\n vertices?: unknown[];\n }\n | undefined;\n if (!el) return;\n const board = this.board as {\n create?: (kind: string, parents: unknown[], attrs?: unknown) => unknown;\n };\n if (!board.create) return;\n\n // Selection palette — gray fill + darker gray border (xem\n // tham chiếu /tmp/ss.png).\n const SEL_STROKE = '#475569'; // slate-600\n const SEL_FILL = '#cbd5e1'; // slate-300\n const haloBase = {\n strokeColor: SEL_STROKE,\n strokeOpacity: 0.55,\n fillColor: SEL_FILL,\n fillOpacity: 0.3,\n fixed: true,\n withLabel: false,\n name: '',\n highlight: false,\n layer: 4,\n needsRegularUpdate: true,\n };\n const halos: unknown[] = [];\n try {\n switch (el.elType) {\n case 'point':\n case 'glider':\n case 'intersection': {\n const baseSize = (el.getAttribute?.('size') as number | undefined) ?? 4;\n const halo = board.create('point', [\n () => el.X?.() ?? 0,\n () => el.Y?.() ?? 0,\n ], {\n ...haloBase,\n size: baseSize + 6,\n face: 'o',\n strokeWidth: 2,\n strokeOpacity: 0.75,\n fillOpacity: 0.25,\n });\n halos.push(halo);\n break;\n }\n case 'segment': {\n if (el.point1 && el.point2) {\n const halo = board.create('segment', [el.point1, el.point2], {\n ...haloBase,\n strokeWidth: 9,\n straightFirst: false,\n straightLast: false,\n });\n halos.push(halo);\n }\n break;\n }\n case 'line':\n case 'arrow':\n case 'ray':\n case 'vector':\n case 'tangent':\n case 'normal':\n case 'parallel':\n case 'perpendicular':\n case 'bisector': {\n if (el.point1 && el.point2) {\n const halo = board.create('line', [el.point1, el.point2], {\n ...haloBase,\n strokeWidth: 9,\n });\n halos.push(halo);\n }\n break;\n }\n case 'circle': {\n if (el.center && typeof el.Radius === 'function') {\n const halo = board.create('circle', [el.center, () => el.Radius?.() ?? 0], {\n ...haloBase,\n strokeWidth: 9,\n fillOpacity: 0,\n });\n halos.push(halo);\n }\n break;\n }\n case 'polygon': {\n if (Array.isArray(el.vertices) && el.vertices.length >= 3) {\n // JSXGraph polygon.vertices có thể append vertex đầu lặp lại ở\n // cuối để đóng path — trim cho an toàn.\n const last = el.vertices.length - 1;\n const verts = el.vertices[last] === el.vertices[0]\n ? el.vertices.slice(0, last)\n : el.vertices.slice();\n const halo = board.create('polygon', verts, {\n ...haloBase,\n fillOpacity: 0.2,\n borders: {\n strokeColor: SEL_STROKE,\n strokeWidth: 7,\n strokeOpacity: 0.55,\n highlight: false,\n },\n });\n halos.push(halo);\n }\n break;\n }\n default:\n // Các kind khác (curve, arc, sector, angle, ...) — chưa hỗ trợ halo.\n break;\n }\n } catch (err) {\n console.warn('[scene/render/2d] halo create fail:', err);\n }\n if (halos.length) this.haloMap.set(id, halos);\n }\n}\n","/**\n * Shared offscreen JSXGraph render pipeline.\n *\n * Each JSXGraph stamp (geometry-2d, geometry-3d, graph-2d) needs the same\n * boilerplate to dump SVG offscreen: lazy import JSXGraph, create a hidden\n * DIV with explicit pixel dimensions, initBoard, attach a scene-store renderer\n * (or create a view3d), force update, clone the SVG node, add xmlns, serialize,\n * then tear everything down. This helper owns that lifecycle so each stamp\n * only writes the unique part — what to render — inside `setup`.\n *\n * Intrinsic SVG resolution matters: Excalidraw loads stamp SVGs via <img> then\n * drawImage onto canvas. The browser rasterizes SVG at its intrinsic\n * width/height, so dims passed here should be generous enough that the bitmap\n * downscales (sharp) instead of upscales (blurry) when the user zooms or views\n * on a retina display.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgModule = any;\n\nexport interface JxgOffscreenRenderOpts {\n /** JSXGraph bounding box: [xmin, ymax, xmax, ymin]. */\n bbox: [number, number, number, number];\n /** Offscreen container size in CSS pixels. Becomes SVG intrinsic size. */\n dims: { width: number; height: number };\n axis?: boolean;\n grid?: boolean;\n keepAspectRatio?: boolean;\n /** Mutate JXG.Options before initBoard (e.g. text.display='internal', palette). */\n applyOptions?: (JXG: JxgModule) => void;\n /**\n * Build the scene on the board. Return a disposable (typically the\n * `JxgRenderer` or `JxgRenderer3D` instance) — its `dispose()` is invoked\n * during teardown before `freeBoard`.\n */\n setup: (board: unknown, JXG: JxgModule) => { dispose: () => void } | Promise<{ dispose: () => void }>;\n /** Optional mutation on the cloned <svg> before serialization. */\n postProcessSvg?: (clone: SVGElement) => void;\n}\n\nexport interface JxgOffscreenRenderResult {\n svgString: string;\n width: number;\n height: number;\n}\n\nexport async function renderJsxgOffscreen(\n opts: JxgOffscreenRenderOpts,\n): Promise<JxgOffscreenRenderResult> {\n const { bbox, dims, axis = false, grid = false, keepAspectRatio = true } = opts;\n const JXG: JxgModule = (await import('jsxgraph')).default;\n\n if (opts.applyOptions) {\n try {\n opts.applyOptions(JXG);\n } catch {\n /* swallow option-apply errors */\n }\n }\n\n const containerId =\n 'jxg_offscreen_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8);\n const container = document.createElement('div');\n container.id = containerId;\n container.style.cssText =\n `position:absolute;top:-99999px;left:-99999px;` +\n `width:${dims.width}px;height:${dims.height}px;` +\n `visibility:hidden;pointer-events:none;`;\n document.body.appendChild(container);\n\n let board: unknown = null;\n let disposable: { dispose: () => void } | null = null;\n try {\n board = JXG.JSXGraph.initBoard(containerId, {\n boundingbox: bbox,\n axis,\n grid,\n keepAspectRatio,\n showCopyright: false,\n showNavigation: false,\n });\n disposable = await opts.setup(board, JXG);\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (board as any)?.update?.();\n } catch {\n /* ignore — board may already be in valid state */\n }\n\n const svgEl = container.querySelector('svg');\n if (!svgEl) throw new Error('renderJsxgOffscreen: no SVG produced by JSXGraph');\n const clone = svgEl.cloneNode(true) as SVGElement;\n if (!clone.getAttribute('xmlns')) {\n clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n }\n if (opts.postProcessSvg) opts.postProcessSvg(clone);\n const svgString = new XMLSerializer().serializeToString(clone);\n return { svgString, width: dims.width, height: dims.height };\n } finally {\n try {\n disposable?.dispose();\n } catch {\n /* ignore */\n }\n try {\n if (board) JXG.JSXGraph.freeBoard(board);\n } catch {\n /* ignore */\n }\n if (container.parentNode) container.parentNode.removeChild(container);\n }\n}\n","import { deserializeBoard } from './serialize';\nimport { paletteFor } from './editor/theme';\nimport { createStore } from '../../core/scene';\nimport { DEFAULT_VIEW_2D } from '../../core/scene/types';\nimport { JxgRenderer } from '../../core/scene/render/JxgRenderer';\nimport { renderJsxgOffscreen } from '../shared/jxgOffscreenRender';\n\n/**\n * Re-render geometry SVG từ jsonState đã serialize. Dùng cho:\n * 1. Restore math-stamp file sau khi reload page (Excalidraw mất binary files).\n * 2. Generate SVG lúc INSERT (thay vì clone DOM với màu theo theme editor).\n *\n * LƯU Ý quan trọng — luôn dùng LIGHT palette (nét đậm). Excalidraw apply CSS\n * `filter: invert(93%) hue-rotate(180deg)` lên canvas trong dark mode → nét\n * đậm tự đảo thành sáng. Nếu ta bake nét sáng vào SVG cho dark mode, filter\n * sẽ đảo thành đậm → chìm vào nền tối. Giải pháp: luôn dùng nét đậm + để\n * Excalidraw tự lo invert.\n *\n * Implementation: tạo 1 div ẩn (off-screen, real dimensions để JSXGraph render\n * chuẩn), initBoard, replay creation log từ jsonState, dump SVG, dọn dẹp.\n *\n * Container dimensions phải MATCH aspect ratio của bbox (đã được editor lưu\n * sau khi JSXGraph adjust với keepAspectRatio:true). Trước đây hardcode\n * 400×300 + keepAspectRatio:false làm shape bị kéo dãn (circle thành ellipse,\n * góc vuông lệch) khi bbox không 4:3 → ảnh hiển thị khác với editor lúc\n * double-click. Fix: tính container W/H từ bbox + keepAspectRatio:true để\n * SVG output khớp với view trong editor.\n *\n * Lý do JXG.Options.text.display = 'internal': JSXGraph mặc định render\n * label bằng HTML <div> overlay → clone SVG export sẽ thiếu label.\n */\n\nconst PIXELS_PER_UNIT = 20;\nconst MIN_DIM = 100;\nconst MAX_DIM = 1200;\nconst FALLBACK_W = 400;\nconst FALLBACK_H = 300;\n\nexport function containerDimsForBbox(bbox: [number, number, number, number]): { width: number; height: number } {\n const [xmin, ymax, xmax, ymin] = bbox;\n const w = Math.abs(xmax - xmin);\n const h = Math.abs(ymax - ymin);\n if (!Number.isFinite(w) || !Number.isFinite(h) || w <= 0 || h <= 0) {\n return { width: FALLBACK_W, height: FALLBACK_H };\n }\n let width = w * PIXELS_PER_UNIT;\n let height = h * PIXELS_PER_UNIT;\n const maxAxis = Math.max(width, height);\n if (maxAxis > MAX_DIM) {\n const ratio = MAX_DIM / maxAxis;\n width *= ratio;\n height *= ratio;\n }\n const minAxis = Math.min(width, height);\n if (minAxis < MIN_DIM) {\n const ratio = MIN_DIM / minAxis;\n width *= ratio;\n height *= ratio;\n }\n return { width: Math.round(width), height: Math.round(height) };\n}\n\nexport async function renderGeometrySvgFromState(jsonState: string): Promise<string> {\n const state = deserializeBoard(jsonState);\n const view = state.meta.domain === '2d' ? state.meta.view : DEFAULT_VIEW_2D;\n const bbox = view.bbox as [number, number, number, number];\n // Stamps inserted vào Excalidraw canvas → luôn dùng light palette.\n // Excalidraw's THEME_FILTER tự đảo nét trong dark mode.\n const palette = paletteFor(false);\n const dims = containerDimsForBbox(bbox);\n const { svgString } = await renderJsxgOffscreen({\n bbox,\n dims,\n axis: view.showAxis,\n grid: view.showGrid,\n keepAspectRatio: true,\n applyOptions: (JXG) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const opts = (JXG as any).Options;\n if (!opts) return;\n opts.text = opts.text || {};\n opts.text.display = 'internal';\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n opts.text.strokeColor = palette.label;\n opts.label = opts.label || {};\n opts.label.display = 'internal';\n opts.label.strokeColor = palette.label;\n opts.axis = opts.axis || {};\n opts.axis.strokeColor = palette.axis;\n opts.grid = opts.grid || {};\n opts.grid.strokeColor = palette.grid;\n },\n setup: (board) => {\n const store = createStore(state);\n return new JxgRenderer(store, board);\n },\n });\n return svgString;\n}\n","// SVG inline base64 helper dùng chung cho 3 stamp (geometry-2d, geometry-3d,\n// graph-2d):\n//\n// - `svgToStampFile(svg, fileId)` — sync, dùng cho `restoreFileFromCustomData`\n// khi caller đã có fileId từ element.\n// - `createStampFile(svg)` — async, dùng cho insert path khi cần generate\n// fileId mới từ hash SVG content.\n//\n// Output luôn là SVG inline base64 — Excalidraw render native + tự đảo màu\n// trong dark mode qua CSS filter. KHÔNG raster sang PNG.\n\nconst DEFAULT_WIDTH = 200;\nconst DEFAULT_HEIGHT = 100;\n\nexport interface StampFileResult {\n fileId: string;\n dataURL: string;\n mimeType: 'image/svg+xml';\n width: number;\n height: number;\n}\n\nasync function hashSvgToFileId(input: string): Promise<string> {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const buf = new TextEncoder().encode(input);\n const digest = await crypto.subtle.digest('SHA-256', buf);\n return Array.from(new Uint8Array(digest))\n .slice(0, 16)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n // Double-hash FNV-1a (32-bit chained) → 16 hex chars. Fallback Node/jsdom.\n let h1 = 0x811c9dc5;\n let h2 = 0xcbf29ce4;\n for (let i = 0; i < input.length; i++) {\n const c = input.charCodeAt(i);\n h1 ^= c;\n h1 = Math.imul(h1, 0x01000193);\n h2 ^= c + i;\n h2 = Math.imul(h2, 0x100000001b3 & 0xffffffff);\n }\n return (\n (h1 >>> 0).toString(16).padStart(8, '0') +\n (h2 >>> 0).toString(16).padStart(8, '0')\n );\n}\n\nfunction parseDim(svg: string, attr: 'width' | 'height'): number {\n const re = new RegExp(`<svg[^>]*\\\\s${attr}=\"(\\\\d+(?:\\\\.\\\\d+)?)`, 'i');\n const m = svg.match(re);\n if (m) return Math.max(1, Math.round(parseFloat(m[1])));\n const vb = svg.match(/viewBox=\"([\\d.\\s-]+)\"/i);\n if (vb) {\n const parts = vb[1].trim().split(/\\s+/).map(parseFloat);\n if (parts.length === 4) {\n return Math.max(1, Math.round(attr === 'width' ? parts[2] : parts[3]));\n }\n }\n return attr === 'width' ? DEFAULT_WIDTH : DEFAULT_HEIGHT;\n}\n\nexport function parseSvgDims(svg: string): { width: number; height: number } {\n return { width: parseDim(svg, 'width'), height: parseDim(svg, 'height') };\n}\n\nexport function svgToStampFile(svgString: string, fileId: string): StampFileResult {\n const { width, height } = parseSvgDims(svgString);\n const utf8 = unescape(encodeURIComponent(svgString));\n const base64 = typeof btoa !== 'undefined'\n ? btoa(utf8)\n : Buffer.from(utf8, 'binary').toString('base64');\n return {\n fileId,\n dataURL: `data:image/svg+xml;base64,${base64}`,\n mimeType: 'image/svg+xml',\n width,\n height,\n };\n}\n\n// Async variant cho insert path: hash SVG → fileId rồi gọi svgToStampFile.\n// Identical SVG content → identical fileId (Excalidraw addFiles dedupe).\nexport async function createStampFile(svgString: string): Promise<StampFileResult> {\n const fileId = await hashSvgToFileId(svgString);\n return svgToStampFile(svgString, fileId);\n}\n","import type { BaseStampCustomData } from '../shared/types';\n\nexport interface GeometryCustomData extends BaseStampCustomData {\n kind: 'geometry';\n version: 1;\n jsonState: string;\n}\n\nexport function isGeometryCustomData(data: unknown): data is GeometryCustomData {\n if (!data || typeof data !== 'object') return false;\n const d = data as Partial<GeometryCustomData>;\n return d.kind === 'geometry' && d.version === 1 && typeof d.jsonState === 'string';\n}\n","'use client';\nimport * as React from 'react';\n\nexport interface TabSpec<K extends string = string> {\n key: K;\n label: React.ReactNode;\n testId?: string;\n}\n\nexport interface LeftPanelShellProps<K extends string = string> {\n title: string;\n icon: React.ReactNode;\n onClose: () => void;\n isDark?: boolean;\n tabs?: readonly TabSpec<K>[];\n activeTab?: K;\n onTabChange?: (k: K) => void;\n /** data-testid trên <aside> root. Mặc định \"left-panel\". */\n testId?: string;\n children: React.ReactNode;\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n );\n}\n\nexport function LeftPanelShell<K extends string>(props: LeftPanelShellProps<K>): React.ReactElement {\n const { title, icon, onClose, isDark, tabs, activeTab, onTabChange, testId, children } = props;\n const showTabs = !!tabs && tabs.length >= 2;\n\n return (\n <aside\n role=\"complementary\"\n aria-label={title}\n data-testid={testId ?? 'left-panel'}\n data-stamp-area=\"true\"\n className={[\n isDark ? 'theme--dark ' : '',\n 'absolute left-0 top-0 z-30 flex h-full w-60 flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200',\n ].join('')}\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{icon}</span>\n {title}\n </h3>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <CloseIcon />\n </button>\n </header>\n\n {showTabs && (\n <div role=\"tablist\" className=\"flex gap-1 rounded-md bg-slate-100 p-0.5 mx-3 mt-3\">\n {tabs!.map((t) => (\n <TabPill\n key={t.key}\n active={t.key === activeTab}\n onClick={() => onTabChange?.(t.key)}\n testId={t.testId}\n >\n {t.label}\n </TabPill>\n ))}\n </div>\n )}\n\n <div\n {...(showTabs ? { role: 'tabpanel' } : {})}\n className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-3\"\n >\n {children}\n </div>\n </aside>\n );\n}\n\nexport function TabPill(props: {\n active: boolean;\n onClick: () => void;\n testId?: string;\n children: React.ReactNode;\n}): React.ReactElement {\n const { active, onClick, testId, children } = props;\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={onClick}\n data-testid={testId}\n className={[\n 'flex-1 rounded px-2 py-1 text-[11px] font-medium transition',\n active\n ? 'bg-white text-slate-900 shadow-sm ring-1 ring-slate-200'\n : 'text-slate-500 hover:text-slate-800',\n ].join(' ')}\n >\n {children}\n </button>\n );\n}\n\nexport function Section(props: { label: string; children: React.ReactNode }): React.ReactElement {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {props.label}\n </h4>\n {props.children}\n </section>\n );\n}\n","// src/core/scene/ui/kindMeta.ts\nexport interface KindUiMeta {\n displayName: string;\n icon: string;\n /** Fallback color khi obj.attrs.color không có. Phải khớp default ở renderer. */\n defaultColor: string;\n}\n\n// Default colors:\n// - Points: blue (#1e40af)\n// - Curves / shapes: dark slate (#0f172a)\n// - 3D planes / spheres: light blue (#60a5fa)\nconst POINT_COLOR = '#1e40af';\nconst CURVE_COLOR = '#0f172a';\nconst PLANE_COLOR = '#60a5fa';\n\nexport const KIND_UI_META: Readonly<Record<string, KindUiMeta>> = {\n // 2D\n point: { displayName: 'Điểm', icon: '·', defaultColor: POINT_COLOR },\n segment: { displayName: 'Đoạn thẳng', icon: '—', defaultColor: CURVE_COLOR },\n line: { displayName: 'Đường thẳng', icon: '/', defaultColor: CURVE_COLOR },\n ray: { displayName: 'Tia', icon: '→', defaultColor: CURVE_COLOR },\n vector: { displayName: 'Vector', icon: '↗', defaultColor: CURVE_COLOR },\n circle: { displayName: 'Đường tròn', icon: '○', defaultColor: CURVE_COLOR },\n polygon: { displayName: 'Đa giác', icon: '◇', defaultColor: CURVE_COLOR },\n intersection: { displayName: 'Giao điểm', icon: '✕', defaultColor: POINT_COLOR },\n angle: { displayName: 'Góc', icon: '∠', defaultColor: '#16a34a' },\n distance: { displayName: 'Khoảng cách', icon: '↔', defaultColor: '#dc2626' },\n // 3D\n point3d: { displayName: 'Điểm', icon: '·', defaultColor: POINT_COLOR },\n segment3d: { displayName: 'Đoạn thẳng', icon: '—', defaultColor: CURVE_COLOR },\n line3d: { displayName: 'Đường thẳng', icon: '/', defaultColor: CURVE_COLOR },\n ray3d: { displayName: 'Tia', icon: '→', defaultColor: CURVE_COLOR },\n vector3d: { displayName: 'Vector', icon: '↗', defaultColor: CURVE_COLOR },\n plane3d: { displayName: 'Mặt phẳng', icon: '▱', defaultColor: PLANE_COLOR },\n polygon3d: { displayName: 'Đa giác', icon: '◇', defaultColor: CURVE_COLOR },\n sphere3d: { displayName: 'Mặt cầu', icon: '◯', defaultColor: PLANE_COLOR },\n polyhedron3d: { displayName: 'Đa diện', icon: '⬢', defaultColor: PLANE_COLOR },\n cylinder3d: { displayName: 'Hình trụ', icon: '⌭', defaultColor: PLANE_COLOR },\n cone3d: { displayName: 'Hình nón', icon: '▲', defaultColor: PLANE_COLOR },\n // Graph 2D\n function2d: { displayName: 'Hàm số', icon: 'ƒ', defaultColor: CURVE_COLOR },\n parameter: { displayName: 'Tham số', icon: 'α', defaultColor: '#7c3aed' },\n pointOnCurve: { displayName: 'Điểm trên đồ thị', icon: '◉', defaultColor: POINT_COLOR },\n tangent2d: { displayName: 'Tiếp tuyến', icon: '╱', defaultColor: CURVE_COLOR },\n extremum2d: { displayName: 'Cực trị', icon: '∧', defaultColor: POINT_COLOR },\n root2d: { displayName: 'Nghiệm', icon: '0', defaultColor: POINT_COLOR },\n slope2d: { displayName: 'Hệ số góc', icon: '△', defaultColor: '#dc2626' },\n};\n\nexport function getKindUiMeta(kind: string): KindUiMeta {\n return KIND_UI_META[kind] ?? { displayName: kind, icon: '?', defaultColor: '#888888' };\n}\n","'use client';\nimport * as React from 'react';\n\nexport interface ObjectRowMenuProps {\n locked: boolean;\n onToggleLocked: () => void;\n onRename: () => void;\n onChangeColor: () => void;\n onDelete: () => void;\n}\n\nexport function ObjectRowMenu(props: ObjectRowMenuProps): React.ReactElement {\n const { locked, onToggleLocked, onRename, onChangeColor, onDelete } = props;\n const [open, setOpen] = React.useState(false);\n\n return (\n <div className=\"relative inline-block\">\n <button\n type=\"button\"\n aria-label=\"Row menu\"\n onClick={(e) => { e.stopPropagation(); setOpen((v) => !v); }}\n className=\"rounded px-1.5 text-black\"\n >\n ⋮\n </button>\n {open ? (\n <div\n role=\"menu\"\n className=\"absolute right-0 z-10 mt-1 w-40 rounded-md border border-zinc-200 bg-white py-1 text-xs shadow-lg dark:border-zinc-700 dark:bg-zinc-900\"\n onClick={(e) => e.stopPropagation()}\n >\n <MenuItem onClick={() => { setOpen(false); onRename(); }}>Đổi tên</MenuItem>\n <MenuItem onClick={() => { setOpen(false); onChangeColor(); }}>Đổi màu</MenuItem>\n <MenuItem onClick={() => { setOpen(false); onToggleLocked(); }}>\n {locked ? 'Mở khoá' : 'Khoá'}\n </MenuItem>\n <MenuItem\n onClick={() => { setOpen(false); onDelete(); }}\n className=\"text-red-600 dark:text-red-400\"\n >\n Xoá\n </MenuItem>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction MenuItem({\n children,\n onClick,\n className,\n}: React.PropsWithChildren<{ onClick: () => void; className?: string }>) {\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n onClick={onClick}\n className={`block w-full px-3 py-1 text-left text-black ${className ?? ''}`}\n >\n {children}\n </button>\n );\n}\n","'use client';\nimport * as React from 'react';\nimport type { SceneObject, State } from '../types';\nimport { getKind } from '../registry';\nimport { getKindUiMeta } from './kindMeta';\nimport { ObjectRowMenu } from './ObjectRowMenu';\n\nexport interface ObjectRowProps {\n obj: SceneObject;\n state: State;\n selected: boolean;\n onSelect: (id: string) => void;\n onToggleVisible: (id: string) => void;\n onToggleLocked: (id: string) => void;\n onRename: (id: string) => void;\n onChangeColor: (id: string) => void;\n onDelete: (id: string) => void;\n}\n\nfunction formatMeasure(items: { label: string; value: number }[]): string {\n return items.map((it) => `${it.label} = ${it.value.toFixed(2)}`).join(', ');\n}\n\nexport function ObjectRow(props: ObjectRowProps): React.ReactElement {\n const { obj, state, selected, onSelect, onToggleVisible, onToggleLocked, onRename, onChangeColor, onDelete } = props;\n\n const meta = getKindUiMeta(obj.kind);\n\n let title = '';\n try {\n title = getKind(obj.kind).describe(obj, state);\n } catch {\n title = `${meta.displayName} ${obj.label}`;\n }\n\n let measureText: string | null = null;\n if (selected) {\n try {\n const m = getKind(obj.kind).measure?.(obj, state);\n if (m && m.length > 0) measureText = formatMeasure(m);\n } catch {\n measureText = null;\n }\n }\n\n const color = (obj.attrs as { color?: string }).color ?? meta.defaultColor;\n\n return (\n <li\n data-testid={`object-row-${obj.id}`}\n aria-selected={selected}\n onClick={() => onSelect(obj.id)}\n className={\n 'flex flex-col border-b border-zinc-100 cursor-pointer dark:border-zinc-800 ' +\n (selected ? 'bg-slate-200' : '')\n }\n >\n <div className=\"flex items-center gap-2 px-3 py-1.5 text-xs\">\n <button\n type=\"button\"\n aria-label=\"Toggle visibility\"\n aria-pressed={!obj.visible}\n onClick={(e) => { e.stopPropagation(); onToggleVisible(obj.id); }}\n className=\"h-4 w-4 shrink-0 rounded-full border-2 transition\"\n style={{\n backgroundColor: obj.visible ? color : 'transparent',\n borderColor: color,\n }}\n />\n <span className=\"flex-1 truncate text-black\">\n {title}\n </span>\n <ObjectRowMenu\n locked={obj.locked}\n onToggleLocked={() => onToggleLocked(obj.id)}\n onRename={() => onRename(obj.id)}\n onChangeColor={() => onChangeColor(obj.id)}\n onDelete={() => onDelete(obj.id)}\n />\n </div>\n {selected && measureText && (\n <div\n data-testid={`object-row-detail-${obj.id}`}\n className=\"pl-9 pr-3 pb-1.5 text-[11px] text-black\"\n >\n {measureText}\n </div>\n )}\n </li>\n );\n}\n","'use client';\nimport * as React from 'react';\nimport type { Store } from '../store';\nimport type { SceneObject } from '../types';\nimport { listObjects } from '../selectors';\nimport { ObjectRow } from './ObjectRow';\n\nexport interface ObjectListPanelProps {\n store: Store;\n selectedId?: string;\n /**\n * Called when user clicks a row. Receives the row id, or `null` when the\n * user clicks the already-selected row (toggle off — request to deselect).\n * Parent should treat `null` as \"clear selection\".\n */\n onSelect?: (id: string | null) => void;\n /**\n * Optional per-kind row renderer. Called with the SceneObject and default props\n * (selected, onClick). Return a ReactNode to override the default ObjectRow.\n * Return null/undefined to fall back to the default ObjectRow.\n */\n renderRow?: (\n obj: SceneObject,\n defaults: { selected: boolean; onClick: () => void },\n ) => React.ReactNode;\n}\n\nexport function ObjectListPanel(props: ObjectListPanelProps): React.ReactElement {\n const { store, selectedId, onSelect, renderRow } = props;\n // useSyncExternalStore expects subscribe to receive () => void callback,\n // but Store.subscribe takes (next, prev, action) => void. Wrap to adapt.\n const subscribe = React.useCallback(\n (cb: () => void) => store.subscribe(() => cb()),\n [store],\n );\n const state = React.useSyncExternalStore(subscribe, store.getState, store.getState);\n const objects = listObjects(state);\n\n function handleSelect(id: string) {\n // Toggle: click vào row đang selected → deselect (collapse detail + tắt highlight).\n onSelect?.(id === selectedId ? null : id);\n }\n\n function handleToggleVisible(id: string) {\n const obj = state.objects[id];\n if (!obj) return;\n store.dispatch({ type: 'UPDATE', payload: { id, patch: { visible: !obj.visible } } });\n }\n\n function handleToggleLocked(id: string) {\n const obj = state.objects[id];\n if (!obj) return;\n store.dispatch({ type: 'UPDATE', payload: { id, patch: { locked: !obj.locked } } });\n }\n\n function handleDelete(id: string) {\n store.dispatch({ type: 'DELETE', payload: { id } });\n }\n\n function noop() { /* rename + change color stubbed for Phase 3 */ }\n\n return (\n <ul\n data-testid=\"object-list-panel\"\n className=\"flex max-h-[calc(100vh-200px)] flex-col overflow-y-auto\"\n >\n {objects.length === 0 ? (\n <li className=\"px-3 py-4 text-center text-xs text-zinc-500\">Chưa có đối tượng nào</li>\n ) : (\n objects.map((obj) => {\n const selected = obj.id === selectedId;\n const onClick = () => handleSelect(obj.id);\n if (renderRow) {\n const custom = renderRow(obj, { selected, onClick });\n if (custom != null) {\n return <React.Fragment key={obj.id}>{custom}</React.Fragment>;\n }\n }\n return (\n <ObjectRow\n key={obj.id}\n obj={obj}\n state={state}\n selected={selected}\n onSelect={handleSelect}\n onToggleVisible={handleToggleVisible}\n onToggleLocked={handleToggleLocked}\n onRename={noop}\n onChangeColor={noop}\n onDelete={handleDelete}\n />\n );\n })\n )}\n </ul>\n );\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/AxisGridSection.tsx\n//\n// Section \"Bố cục\" / \"Góc nhìn\": 2 checkbox axis/grid + (optional) undo/redo\n// button ở mép phải. Render khi có ít nhất 1 trong (view, history).\n// Skip toàn bộ section khi cả 2 đều undefined.\n\nimport React from 'react';\nimport { Section } from '../../../core/scene/ui/LeftPanelShell';\nimport type {\n StampLeftPanelHistoryProps,\n StampLeftPanelViewProps,\n} from './types';\n\nexport interface AxisGridSectionProps {\n view?: StampLeftPanelViewProps;\n history?: StampLeftPanelHistoryProps;\n}\n\nfunction UndoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 10 L8 5 L8 8 L15 8 A5 5 0 0 1 20 13 L20 16\" />\n <path d=\"M3 10 L8 15 L8 12\" />\n </svg>\n );\n}\n\nfunction RedoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 10 L16 5 L16 8 L9 8 A5 5 0 0 0 4 13 L4 16\" />\n <path d=\"M21 10 L16 15 L16 12\" />\n </svg>\n );\n}\n\nexport function AxisGridSection(props: AxisGridSectionProps): React.ReactElement | null {\n const { view, history } = props;\n if (!view && !history) return null;\n\n const sectionLabel = view?.sectionLabel ?? 'Bố cục';\n const axisLabel = view?.axisLabel ?? 'Trục';\n const gridLabel = view?.gridLabel ?? 'Lưới';\n\n return (\n <Section label={sectionLabel}>\n <div className=\"flex items-center gap-3 text-[11px] text-slate-700\">\n {view && (\n <>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={view.showAxis}\n onChange={(e) => view.onShowAxisChange(e.target.checked)}\n data-testid=\"toggle-axis\"\n />\n {axisLabel}\n </label>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={view.showGrid}\n onChange={(e) => view.onShowGridChange(e.target.checked)}\n data-testid=\"toggle-grid\"\n />\n {gridLabel}\n </label>\n </>\n )}\n {history && (\n <div className=\"ml-auto flex items-center gap-0.5\">\n <button\n type=\"button\"\n onClick={history.onUndo}\n disabled={!history.canUndo}\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n aria-label=\"Hoàn tác\"\n data-testid=\"undo-btn\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <UndoIcon />\n </button>\n <button\n type=\"button\"\n onClick={history.onRedo}\n disabled={!history.canRedo}\n title=\"Làm lại (Ctrl/Cmd+Shift+Z)\"\n aria-label=\"Làm lại\"\n data-testid=\"redo-btn\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <RedoIcon />\n </button>\n </div>\n )}\n </div>\n </Section>\n );\n}\n","// src/stamps/shared/StampLeftPanel/types.ts\n//\n// Shared types cho StampLeftPanel template. Dùng generic TKey/TGroup để\n// preserve type safety tại call site (host của từng stamp truyền union type\n// riêng); internal cài theo string là OK.\n\nimport type { ReactNode } from 'react';\nimport type { Store } from '../../../core/scene/store';\nimport type { SceneObject } from '../../../core/scene/types';\n\nexport const TOOLTIP_DELAY_MS = 400;\nexport type HoverState = { label: string; hint?: string; x: number; y: number } | null;\n\n/** Tool descriptor unified cho 3 stamp editor. */\nexport interface StampToolDef<TKey extends string = string, TGroup extends string = string> {\n key: TKey;\n label: string;\n hint?: string;\n icon: ReactNode;\n group: TGroup;\n shortcut?: string;\n}\n\nexport interface StampLeftPanelTabs {\n /** Label tab \"Đối tượng\" (default \"📐 Đối tượng\"). */\n objectsLabel?: ReactNode;\n /** Label tab \"Công cụ\" (default \"🧰 Công cụ\"). */\n toolsLabel?: ReactNode;\n}\n\nexport interface StampLeftPanelViewProps {\n /** Section header label, default \"Bố cục\". */\n sectionLabel?: string;\n /** Checkbox label cho axis, default \"Trục\". */\n axisLabel?: string;\n /** Checkbox label cho grid, default \"Lưới\". */\n gridLabel?: string;\n showAxis: boolean;\n showGrid: boolean;\n onShowAxisChange: (b: boolean) => void;\n onShowGridChange: (b: boolean) => void;\n}\n\nexport interface StampLeftPanelHistoryProps {\n onUndo: () => void;\n canUndo: boolean;\n onRedo: () => void;\n canRedo: boolean;\n}\n\nexport interface StampLeftPanelChordProps<TGroup extends string = string> {\n /** Group đang được focus sau khi user bấm letter. null = không active. */\n activeGroup: TGroup | null;\n /** Mapping group → letter hint (vd \"P\" cho group \"point\"). */\n letterForGroup: (g: TGroup) => string;\n}\n\nexport interface StampLeftPanelObjectsProps {\n store: Store;\n selectedObjectId?: string;\n onObjectSelect?: (id: string | null) => void;\n /** Custom row render (vd graph-2d cần FunctionRow/ParameterRow). Trả null để fallback default ObjectRow. */\n renderRow?: (\n obj: SceneObject,\n defaults: { selected: boolean; onClick: () => void },\n ) => ReactNode | null;\n /** Optional buttons phía trên ObjectListPanel (vd graph-2d \"+Hàm\" \"+Tham số\"). */\n addButtons?: ReadonlyArray<{ label: string; testId?: string; onClick: () => void }>;\n}\n\nexport interface StampLeftPanelProps<\n TKey extends string = string,\n TGroup extends string = string,\n> {\n // Header\n title: string;\n icon: ReactNode;\n onClose: () => void;\n isDark?: boolean;\n /** data-testid trên <aside> root. Default \"stamp-left-panel\". */\n testId?: string;\n\n // Tools (required)\n tools: ReadonlyArray<StampToolDef<TKey, TGroup>>;\n groupOrder: ReadonlyArray<TGroup>;\n groupLabels: Record<TGroup, string>;\n activeTool: TKey;\n onToolChange: (k: TKey) => void;\n\n // Optional sections\n view?: StampLeftPanelViewProps;\n history?: StampLeftPanelHistoryProps;\n chord?: StampLeftPanelChordProps<TGroup>;\n objects?: StampLeftPanelObjectsProps;\n tabs?: StampLeftPanelTabs;\n\n // Mobile\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n}\n","// src/stamps/shared/StampLeftPanel/useToolHoverTooltip.ts\n//\n// Generic hover tooltip hook. Trả về { hover, portalReady, showHover, hideHover }\n// để consumer render tooltip qua createPortal. Delay 400ms tránh flash.\n//\n// Generic theo StampToolDef → 3 stamp dùng chung. Moved từ\n// geometry-2d/editor/LeftPanel/useToolHoverTooltip.ts (Phase 1.2).\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { TOOLTIP_DELAY_MS, type HoverState, type StampToolDef } from './types';\n\nexport function useToolHoverTooltip() {\n const [hover, setHover] = useState<HoverState>(null);\n const [portalReady, setPortalReady] = useState(false);\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n setPortalReady(true);\n return () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n };\n }, []);\n\n const showHover = useCallback((el: HTMLElement, t: StampToolDef) => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = setTimeout(() => {\n const r = el.getBoundingClientRect();\n setHover({ label: t.label, hint: t.hint, x: r.right, y: r.top + r.height / 2 });\n }, TOOLTIP_DELAY_MS);\n }, []);\n\n const hideHover = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n setHover(null);\n }, []);\n\n return { hover, portalReady, showHover, hideHover };\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/ToolGrid.tsx\n//\n// Tool button grid chord-aware. Render từng group thành section, mỗi section\n// có 4-col grid icon button. Khi chord.activeGroup set:\n// - section đó được highlight (ring emerald + bg)\n// - các section khác dimmed (opacity-55)\n// - mỗi button trong active group có number badge 1-9\n//\n// Port từ geometry-2d/editor/LeftPanel/Desktop.tsx:104-176 (baseline rich nhất).\n\nimport React, { useMemo } from 'react';\nimport type {\n StampLeftPanelChordProps,\n StampToolDef,\n} from './types';\nimport { useToolHoverTooltip } from './useToolHoverTooltip';\nimport { createPortal } from 'react-dom';\n\nexport interface ToolGridProps<TKey extends string, TGroup extends string> {\n tools: ReadonlyArray<StampToolDef<TKey, TGroup>>;\n groupOrder: ReadonlyArray<TGroup>;\n groupLabels: Record<TGroup, string>;\n activeTool: TKey;\n onToolChange: (k: TKey) => void;\n chord?: StampLeftPanelChordProps<TGroup>;\n}\n\nexport function ToolGrid<TKey extends string, TGroup extends string>(\n props: ToolGridProps<TKey, TGroup>,\n): React.ReactElement {\n const { tools, groupOrder, groupLabels, activeTool, onToolChange, chord } = props;\n const { hover, portalReady, showHover, hideHover } = useToolHoverTooltip();\n\n const grouped = useMemo(() => {\n const acc: Partial<Record<TGroup, StampToolDef<TKey, TGroup>[]>> = {};\n for (const t of tools) {\n (acc[t.group] ??= []).push(t);\n }\n return acc;\n }, [tools]);\n\n const groupKeys = useMemo(\n () => groupOrder.filter((g) => grouped[g]),\n [grouped, groupOrder],\n );\n\n const activeGroupTools = chord?.activeGroup ? grouped[chord.activeGroup] ?? null : null;\n\n return (\n <>\n {groupKeys.map((group) => {\n const isChordActive = chord?.activeGroup === group;\n const dimmed = chord?.activeGroup != null && !isChordActive;\n return (\n <section\n key={group}\n data-chord-group={group}\n data-chord-active={isChordActive ? 'true' : 'false'}\n className={[\n 'rounded-md transition',\n isChordActive ? 'bg-emerald-50 ring-1 ring-emerald-400 p-1' : 'p-0',\n dimmed ? 'opacity-55' : 'opacity-100',\n ].join(' ')}\n >\n <h4 className=\"mb-1.5 flex items-center justify-between text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n <span>{groupLabels[group]}</span>\n {chord && (\n <span\n data-testid={`chord-letter-${group}`}\n className={[\n 'font-mono text-[10px] leading-none transition',\n isChordActive ? 'text-emerald-700 font-bold' : 'text-slate-400',\n ].join(' ')}\n >\n {chord.letterForGroup(group)}\n </span>\n )}\n </h4>\n <div className=\"grid grid-cols-4 gap-1\">\n {grouped[group]!.map((t, i) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n title={t.label + (t.shortcut ? ` (${t.shortcut})` : '')}\n onClick={() => onToolChange(t.key)}\n onMouseEnter={(e) => showHover(e.currentTarget, t)}\n onMouseLeave={hideHover}\n onFocus={(e) => showHover(e.currentTarget, t)}\n onBlur={hideHover}\n className={[\n 'relative flex h-10 items-center justify-center rounded-md transition',\n active\n ? 'bg-emerald-600 text-white shadow-sm'\n : 'text-slate-700 hover:bg-slate-100 hover:text-slate-900',\n ].join(' ')}\n >\n {t.icon}\n {chord && (\n <span\n data-testid={`chord-num-${t.key}`}\n className={[\n 'pointer-events-none absolute bottom-0 right-0.5 font-mono text-[9px] leading-none transition',\n active\n ? 'text-white/70'\n : isChordActive\n ? 'text-emerald-700 font-bold'\n : 'text-slate-400',\n ].join(' ')}\n >\n {i + 1}\n </span>\n )}\n </button>\n );\n })}\n </div>\n </section>\n );\n })}\n\n {chord?.activeGroup && activeGroupTools && (\n <div\n data-testid=\"chord-hint\"\n className=\"mt-1 rounded border border-emerald-200 bg-emerald-50/60 px-2 py-1 text-[11px] leading-snug text-slate-600\"\n >\n <span className=\"font-mono font-semibold text-emerald-700\">\n {chord.letterForGroup(chord.activeGroup)}\n </span>\n <span className=\"mx-1 text-slate-400\">→</span>\n {activeGroupTools.map((t, i) => (\n <span key={t.key} className=\"mr-2 inline-block\">\n <span className=\"font-mono font-semibold text-emerald-700\">{i + 1}</span>\n <span className=\"ml-1\">{t.label}</span>\n </span>\n ))}\n <span className=\"text-slate-400\">Esc huỷ</span>\n </div>\n )}\n\n {portalReady && hover && typeof document !== 'undefined'\n ? createPortal(\n <div\n role=\"tooltip\"\n className=\"pointer-events-none fixed w-max max-w-[220px] rounded-md bg-slate-900 px-2 py-1 text-left text-[11px] leading-tight text-white shadow-lg\"\n style={{\n left: hover.x + 8,\n top: hover.y,\n transform: 'translate(0, -50%)',\n zIndex: 2147483600,\n }}\n >\n <span className=\"block font-medium\">{hover.label}</span>\n {hover.hint && <span className=\"mt-0.5 block text-slate-300\">{hover.hint}</span>}\n </div>,\n document.body,\n )\n : null}\n </>\n );\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/Desktop.tsx\n//\n// Desktop layout cho StampLeftPanel. Render:\n// 1. LeftPanelShell chrome + tabs (chỉ render tablist khi có objects)\n// 2. Tab \"tools\": <AxisGridSection> + <ToolGrid> chord-aware\n// 3. Tab \"objects\": optional add buttons + <ObjectListPanel> với custom renderRow\n\nimport React, { useEffect, useState } from 'react';\nimport { LeftPanelShell } from '../../../core/scene/ui/LeftPanelShell';\nimport { ObjectListPanel } from '../../../core/scene/ui/ObjectListPanel';\nimport { AxisGridSection } from './AxisGridSection';\nimport { ToolGrid } from './ToolGrid';\nimport type { StampLeftPanelProps } from './types';\n\nexport function StampLeftPanelDesktop<TKey extends string, TGroup extends string>(\n props: StampLeftPanelProps<TKey, TGroup>,\n): React.ReactElement {\n const {\n title,\n icon,\n onClose,\n isDark,\n testId,\n tools,\n groupOrder,\n groupLabels,\n activeTool,\n onToolChange,\n view,\n history,\n chord,\n objects,\n tabs,\n } = props;\n\n const [tab, setTab] = useState<'tools' | 'objects'>('tools');\n const hasObjects = !!objects;\n\n useEffect(() => {\n if (!hasObjects && tab === 'objects') setTab('tools');\n }, [hasObjects, tab]);\n\n const tabSpecs = hasObjects\n ? [\n { key: 'tools' as const, label: tabs?.toolsLabel ?? '🧰 Công cụ', testId: 'tab-tools' },\n { key: 'objects' as const, label: tabs?.objectsLabel ?? '📐 Đối tượng', testId: 'tab-objects' },\n ]\n : undefined;\n\n return (\n <LeftPanelShell\n title={title}\n icon={icon}\n onClose={onClose}\n isDark={isDark}\n testId={testId ?? 'stamp-left-panel'}\n tabs={tabSpecs}\n activeTab={hasObjects ? tab : undefined}\n onTabChange={hasObjects ? setTab : undefined}\n >\n {(!hasObjects || tab === 'tools') ? (\n <>\n <AxisGridSection view={view} history={history} />\n <ToolGrid\n tools={tools}\n groupOrder={groupOrder}\n groupLabels={groupLabels}\n activeTool={activeTool}\n onToolChange={onToolChange}\n chord={chord}\n />\n </>\n ) : (\n <section data-testid=\"objects-panel\" className=\"flex flex-col gap-2\">\n {objects!.addButtons && objects!.addButtons.length > 0 && (\n <div className=\"flex gap-1\">\n {objects!.addButtons.map((b) => (\n <button\n key={b.label}\n type=\"button\"\n data-testid={b.testId}\n onClick={b.onClick}\n className=\"flex-1 rounded border border-slate-300 bg-slate-50 px-2 py-1 text-[11px] font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n {b.label}\n </button>\n ))}\n </div>\n )}\n <ObjectListPanel\n store={objects!.store}\n selectedId={objects!.selectedObjectId}\n onSelect={objects!.onObjectSelect}\n renderRow={objects!.renderRow}\n />\n </section>\n )}\n </LeftPanelShell>\n );\n}\n","'use client';\n\nimport React from 'react';\n\n/**\n * Generic mobile tool drawer dùng chung cho geometry-2d + geometry-3d.\n *\n * Layout:\n * - Header: icon + title + close\n * - Sticky toolbar: chip switches (Trục/Lưới) + icon-actions (Reset, Undo)\n * - Body: section dọc, mỗi section là 1 nhóm tools, grid 3-col card có nhãn\n *\n * Style: soft-modern, emerald accent, khớp các class trong shared/stamp.css.\n */\n\nexport interface MobileChip {\n /** Label hiển thị + aria-label */\n label: string;\n icon: React.ReactNode;\n pressed: boolean;\n onToggle: (next: boolean) => void;\n /** data-testid optional (để test cũ chạy được) */\n testId?: string;\n}\n\nexport interface MobileActionButton {\n label: string;\n icon: React.ReactNode;\n onClick: () => void;\n disabled?: boolean;\n title?: string;\n /** data-testid optional (cho phép test target button cụ thể) */\n testId?: string;\n}\n\nexport interface MobileTool<TKey extends string> {\n key: TKey;\n label: string;\n icon: React.ReactNode;\n}\n\nexport interface MobileToolGroup<TKey extends string, TGroup extends string> {\n group: TGroup;\n groupLabel: string;\n tools: MobileTool<TKey>[];\n}\n\ninterface MobileToolDrawerProps<TKey extends string, TGroup extends string> {\n title: string;\n headerIcon: React.ReactNode;\n chips: MobileChip[];\n actions: MobileActionButton[];\n groups: MobileToolGroup<TKey, TGroup>[];\n activeTool: TKey;\n onToolSelect: (key: TKey) => void;\n drawerOpen: boolean;\n onDrawerClose: () => void;\n isDark?: boolean;\n /** data-testid trên <aside> — giữ để test cũ tìm được panel */\n testId?: string;\n /** Optional: thêm tab \"Đối tượng\" trong drawer body. */\n objectsTab?: {\n label: React.ReactNode;\n render: () => React.ReactNode;\n };\n}\n\nexport function MobileToolDrawer<TKey extends string, TGroup extends string>({\n title,\n headerIcon,\n chips,\n actions,\n groups,\n activeTool,\n onToolSelect,\n drawerOpen,\n onDrawerClose,\n isDark,\n testId,\n objectsTab,\n}: MobileToolDrawerProps<TKey, TGroup>) {\n const [mobileTab, setMobileTab] = React.useState<'tools' | 'objects'>('tools');\n const prevOpenRef = React.useRef(drawerOpen);\n React.useEffect(() => {\n if (!prevOpenRef.current && drawerOpen) setMobileTab('tools');\n prevOpenRef.current = drawerOpen;\n }, [drawerOpen]);\n\n return (\n <>\n {drawerOpen && (\n <div\n className=\"stamp-drawer-backdrop\"\n onPointerDown={onDrawerClose}\n aria-hidden=\"true\"\n />\n )}\n <aside\n role=\"complementary\"\n aria-label={title}\n aria-hidden={!drawerOpen ? 'true' : undefined}\n data-testid={testId}\n data-stamp-area=\"true\"\n data-mobile-drawer=\"true\"\n data-geo-mobile=\"true\"\n data-drawer-state={drawerOpen ? 'open' : 'closed'}\n className={[\n isDark ? 'theme--dark ' : '',\n 'stamp-drawer-mobile flex flex-col border-r border-slate-200 bg-white shadow-md',\n ].join('')}\n >\n {/* Header */}\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-4 py-3\">\n <h3 className=\"flex items-center gap-2 text-base font-semibold text-slate-800\">\n <span className=\"inline-flex h-7 w-7 items-center justify-center rounded-lg bg-emerald-50 text-emerald-700\">\n {headerIcon}\n </span>\n {title}\n </h3>\n <button\n type=\"button\"\n onClick={onDrawerClose}\n aria-label=\"Đóng ngăn công cụ\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n\n {/* Sticky toolbar: chips + actions */}\n <div className=\"sticky top-0 z-10 flex items-center gap-2 border-b border-slate-200 bg-white/95 px-3 py-2 backdrop-blur\">\n {chips.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n role=\"switch\"\n aria-pressed={c.pressed}\n aria-label={c.label}\n data-testid={c.testId}\n onClick={() => c.onToggle(!c.pressed)}\n className=\"geo-mobile-chip\"\n >\n {c.icon}\n {c.label}\n </button>\n ))}\n {actions.length > 0 && <div className=\"ml-auto flex items-center gap-1\">\n {actions.map((a) => (\n <button\n key={a.label}\n type=\"button\"\n onClick={a.onClick}\n disabled={a.disabled}\n aria-label={a.label}\n title={a.title ?? a.label}\n data-testid={a.testId}\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n {a.icon}\n </button>\n ))}\n </div>}\n </div>\n\n {/* Tab row (chỉ render khi objectsTab được cung cấp) */}\n {objectsTab && (\n <div role=\"tablist\" className=\"flex gap-1 rounded-md bg-slate-100 p-0.5 mx-3 mt-2\">\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mobileTab === 'tools'}\n onClick={() => setMobileTab('tools')}\n className={[\n 'flex-1 rounded px-2 py-1 text-[11px] font-medium transition',\n mobileTab === 'tools'\n ? 'bg-white text-slate-900 shadow-sm ring-1 ring-slate-200'\n : 'text-slate-500 hover:text-slate-800',\n ].join(' ')}\n >\n 🧰 Công cụ\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mobileTab === 'objects'}\n onClick={() => setMobileTab('objects')}\n className={[\n 'flex-1 rounded px-2 py-1 text-[11px] font-medium transition',\n mobileTab === 'objects'\n ? 'bg-white text-slate-900 shadow-sm ring-1 ring-slate-200'\n : 'text-slate-500 hover:text-slate-800',\n ].join(' ')}\n >\n {objectsTab.label}\n </button>\n </div>\n )}\n\n {/* Body: groups xếp dọc */}\n <div\n className=\"min-h-0 flex-1 overflow-y-auto\"\n style={{ paddingBottom: 'calc(0.75rem + env(safe-area-inset-bottom))' }}\n >\n {objectsTab && mobileTab === 'objects' ? (\n <div className=\"px-3 pt-3\">{objectsTab.render()}</div>\n ) : (\n groups.map((g) => (\n <section key={g.group} className=\"px-3 pt-3 pb-1\">\n <h4 className=\"mb-2 flex items-center gap-2 text-[11px] font-semibold uppercase tracking-wider text-slate-500\">\n <span className=\"h-1 w-1 rounded-full bg-emerald-500\" />\n {g.groupLabel}\n </h4>\n <div className=\"grid grid-cols-3 gap-2\">\n {g.tools.map((t) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n onClick={() => {\n onToolSelect(t.key);\n onDrawerClose();\n }}\n className={[\n 'flex flex-col items-center justify-center gap-1.5 rounded-2xl px-2 py-3 transition active:scale-95',\n active\n ? 'geo-mobile-tool-active'\n : 'bg-slate-50 text-slate-700 hover:bg-slate-100',\n ].join(' ')}\n >\n <span className=\"flex h-8 w-8 items-center justify-center\">{t.icon}</span>\n <span className=\"text-center text-[11px] font-medium leading-tight line-clamp-2\">\n {t.label}\n </span>\n </button>\n );\n })}\n </div>\n </section>\n ))\n )}\n </div>\n </aside>\n </>\n );\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/Mobile.tsx\n//\n// Mobile layout: wrap shared MobileToolDrawer với mapping:\n// chips = axis/grid (from view)\n// actions = undo/redo (from history)\n// groups = tools grouped by group\n// objects = objectsTab (objects.store + addButtons + custom renderRow)\n\nimport React, { useMemo } from 'react';\nimport { MobileToolDrawer, type MobileToolGroup } from '../MobileToolDrawer';\nimport { ObjectListPanel } from '../../../core/scene/ui/ObjectListPanel';\nimport type { StampLeftPanelProps } from './types';\n\nfunction AxisIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\" />\n <line x1=\"4\" y1=\"20\" x2=\"4\" y2=\"4\" />\n <polyline points=\"2 6 4 4 6 6\" />\n <polyline points=\"18 18 20 20 18 22\" />\n </svg>\n );\n}\n\nfunction GridIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\" />\n <line x1=\"4\" y1=\"10\" x2=\"20\" y2=\"10\" />\n <line x1=\"4\" y1=\"16\" x2=\"20\" y2=\"16\" />\n <line x1=\"10\" y1=\"4\" x2=\"10\" y2=\"20\" />\n <line x1=\"16\" y1=\"4\" x2=\"16\" y2=\"20\" />\n </svg>\n );\n}\n\nfunction UndoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 10 L8 5 L8 8 L15 8 A5 5 0 0 1 20 13 L20 16\" />\n <path d=\"M3 10 L8 15 L8 12\" />\n </svg>\n );\n}\n\nfunction RedoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 10 L16 5 L16 8 L9 8 A5 5 0 0 0 4 13 L4 16\" />\n <path d=\"M21 10 L16 15 L16 12\" />\n </svg>\n );\n}\n\nexport function StampLeftPanelMobile<TKey extends string, TGroup extends string>(\n props: StampLeftPanelProps<TKey, TGroup>,\n): React.ReactElement {\n const {\n title,\n icon,\n isDark,\n testId,\n tools,\n groupOrder,\n groupLabels,\n activeTool,\n onToolChange,\n view,\n history,\n objects,\n tabs,\n drawerOpen,\n onDrawerClose,\n } = props;\n\n const groups = useMemo<MobileToolGroup<TKey, TGroup>[]>(() => {\n const acc = new Map<TGroup, typeof tools[number][]>();\n for (const t of tools) {\n if (!acc.has(t.group)) acc.set(t.group, []);\n acc.get(t.group)!.push(t);\n }\n // Preserve groupOrder\n return groupOrder\n .filter((g) => acc.has(g))\n .map((group) => ({\n group,\n groupLabel: groupLabels[group],\n tools: acc.get(group)!.map((t) => ({ key: t.key, label: t.label, icon: t.icon })),\n }));\n }, [tools, groupOrder, groupLabels]);\n\n const chips = view\n ? [\n {\n label: view.axisLabel ?? 'Trục',\n icon: <AxisIcon />,\n pressed: view.showAxis,\n onToggle: view.onShowAxisChange,\n testId: 'toggle-axis',\n },\n {\n label: view.gridLabel ?? 'Lưới',\n icon: <GridIcon />,\n pressed: view.showGrid,\n onToggle: view.onShowGridChange,\n testId: 'toggle-grid',\n },\n ]\n : [];\n\n const actions = history\n ? [\n {\n label: 'Hoàn tác',\n title: 'Hoàn tác (Ctrl/Cmd+Z)',\n icon: <UndoIcon />,\n onClick: history.onUndo,\n disabled: !history.canUndo,\n testId: 'undo-btn',\n },\n {\n label: 'Làm lại',\n title: 'Làm lại (Ctrl/Cmd+Shift+Z)',\n icon: <RedoIcon />,\n onClick: history.onRedo,\n disabled: !history.canRedo,\n testId: 'redo-btn',\n },\n ]\n : [];\n\n return (\n <MobileToolDrawer\n title={title}\n headerIcon={icon}\n testId={testId ?? 'stamp-left-panel'}\n isDark={isDark}\n drawerOpen={!!drawerOpen}\n onDrawerClose={() => onDrawerClose?.()}\n chips={chips}\n actions={actions}\n groups={groups}\n activeTool={activeTool}\n onToolSelect={onToolChange}\n objectsTab={\n objects\n ? {\n label: tabs?.objectsLabel ?? '📐 Đối tượng',\n render: () => (\n <div className=\"flex flex-col gap-2 px-3\">\n {objects.addButtons && objects.addButtons.length > 0 && (\n <div className=\"flex gap-1 pt-3\">\n {objects.addButtons.map((b) => (\n <button\n key={b.label}\n type=\"button\"\n data-testid={b.testId}\n onClick={b.onClick}\n className=\"flex-1 rounded border border-slate-300 bg-slate-50 px-2 py-1 text-[11px] font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n {b.label}\n </button>\n ))}\n </div>\n )}\n <ObjectListPanel\n store={objects.store}\n selectedId={objects.selectedObjectId}\n onSelect={objects.onObjectSelect}\n renderRow={objects.renderRow}\n />\n </div>\n ),\n }\n : undefined\n }\n />\n );\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/index.tsx\n//\n// Public API. Dispatch isMobile → Desktop hoặc Mobile.\n//\n// Usage:\n//\n// <StampLeftPanel\n// title=\"Hình học\"\n// icon={<GeomIcon />}\n// tools={TOOLS} // ReadonlyArray<StampToolDef>\n// groupOrder={GROUP_ORDER}\n// groupLabels={GROUP_LABELS}\n// activeTool={tool}\n// onToolChange={setTool}\n// view={{ showAxis, showGrid, onShowAxisChange, onShowGridChange }} // optional\n// history={{ onUndo, canUndo, onRedo, canRedo }} // optional\n// chord={{ activeGroup, letterForGroup }} // optional\n// objects={{ store, addButtons, renderRow, ... }} // optional\n// isMobile={isMobile}\n// drawerOpen={drawerOpen}\n// onDrawerClose={...}\n// onClose={onClose}\n// isDark={isDark}\n// />\n\nimport React from 'react';\nimport { StampLeftPanelDesktop } from './Desktop';\nimport { StampLeftPanelMobile } from './Mobile';\nimport type { StampLeftPanelProps } from './types';\n\nexport function StampLeftPanel<TKey extends string, TGroup extends string>(\n props: StampLeftPanelProps<TKey, TGroup>,\n): React.ReactElement {\n if (props.isMobile) return <StampLeftPanelMobile {...props} />;\n return <StampLeftPanelDesktop {...props} />;\n}\n\nexport type {\n StampLeftPanelProps,\n StampToolDef,\n StampLeftPanelViewProps,\n StampLeftPanelHistoryProps,\n StampLeftPanelChordProps,\n StampLeftPanelObjectsProps,\n StampLeftPanelTabs,\n HoverState,\n} from './types';\nexport { TOOLTIP_DELAY_MS } from './types';\nexport { useToolHoverTooltip } from './useToolHoverTooltip';\n","// src/stamps/geometry-2d/editor/icons.tsx\nimport React from 'react';\n\nexport const GeometryIconHeader = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"4,20 20,20 12,5\" />\n <circle cx=\"4\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"20\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12\" cy=\"5\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n);\n\nexport function UndoIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 10 L8 5 L8 8 L15 8 A5 5 0 0 1 20 13 L20 16\" />\n <path d=\"M3 10 L8 15 L8 12\" />\n </svg>\n );\n}\n\nexport function RedoIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 10 L16 5 L16 8 L9 8 A5 5 0 0 0 4 13 L4 16\" />\n <path d=\"M21 10 L16 15 L16 12\" />\n </svg>\n );\n}\n\nexport function AxisIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\" />\n <line x1=\"4\" y1=\"20\" x2=\"4\" y2=\"4\" />\n <polyline points=\"2 6 4 4 6 6\" />\n <polyline points=\"18 18 20 20 18 22\" />\n </svg>\n );\n}\n\nexport function GridIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\" />\n <line x1=\"4\" y1=\"10\" x2=\"20\" y2=\"10\" />\n <line x1=\"4\" y1=\"16\" x2=\"20\" y2=\"16\" />\n <line x1=\"10\" y1=\"4\" x2=\"10\" y2=\"20\" />\n <line x1=\"16\" y1=\"4\" x2=\"16\" y2=\"20\" />\n </svg>\n );\n}\n","import React from 'react';\n\n/**\n * Static catalog của tất cả GeomTool — không phụ thuộc board state, chỉ là\n * metadata (key, label, hint, icon SVG, group, số click cần, accept types).\n *\n * Tách khỏi MiniBoard.tsx để (1) giảm size file component và (2) dễ\n * mở rộng tool mới mà không cần đụng vào board logic.\n */\n\n// Tool keys — match GeoGebra-style toolset\nexport type GeomTool =\n | 'move'\n | 'select'\n | 'point'\n | 'midpoint'\n | 'perpFoot'\n | 'intersect'\n | 'segment'\n | 'line'\n | 'ray'\n | 'vector'\n | 'perpendicular'\n | 'parallel'\n | 'perpBisector'\n | 'angleBisector'\n | 'polygon'\n | 'regularPolygon'\n | 'circleCenter'\n | 'semicircle'\n | 'arcCenter'\n | 'arc3'\n | 'sectorCenter'\n | 'circle3'\n | 'tangent'\n | 'centroid'\n | 'circumcenter'\n | 'incenter'\n | 'orthocenter'\n | 'angle'\n | 'distance'\n | 'area'\n | 'toggleLabel'\n | 'toggleVisible'\n | 'delete'\n | 'translate'\n | 'rotate'\n | 'reflectLine'\n | 'reflectPoint'\n | 'dilate';\n\nexport interface ToolDef {\n key: GeomTool;\n label: string;\n hint: string;\n icon: React.ReactNode;\n group:\n | 'move'\n | 'point'\n | 'line'\n | 'construct'\n | 'polygon'\n | 'circle'\n | 'triangle'\n | 'measure'\n | 'edit'\n | 'transform';\n /** Số click cần trước khi action fire. -1 = mở (polygon đóng bằng click lại điểm đầu). */\n needs: number;\n /** Loại object accept ở mỗi slot. 'any' = point hoặc non-point. 'lineOrCircle' = line hoặc circle (loại trừ point). 'pointOrLine' = point hoặc line/đoạn (loại trừ circle). */\n accepts?: Array<'point' | 'line' | 'circle' | 'any' | 'lineOrCircle' | 'pointOrLine'>;\n}\n\n// ============== Tool icons — inline SVG (GeoGebra-inspired, MIT-clean redraw) ==============\n//\n// Design system:\n// - Main strokes use currentColor → respect active state (white-on-emerald).\n// - 4 accent colors stay fixed across states:\n// point → blue dot (signature từ GeoGebra)\n// construct → red dashed/solid helper line (perpendicular, bisector, parallel, tangent)\n// fill → orange polygon/area fill (light)\n// arc → emerald arc cho measurement\n// - ViewBox 24×24, stroke 1.4–1.7, round caps cho cảm giác sketch-like.\nconst C_POINT = '#2563eb';\nconst C_CONSTRUCT = '#dc2626';\nconst C_FILL = '#f59e0b';\nconst C_ARC = '#059669';\n\nconst Icon = {\n // ===== Basic =====\n cursor: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M5 3 L5 18 L9.5 14 L12 20 L14 19.2 L11.5 13.5 L17.5 13.5 Z\"\n fill=\"currentColor\" fillOpacity=\"0.12\"\n stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinejoin=\"round\"\n />\n </svg>\n ),\n select: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\" strokeLinecap=\"round\">\n <rect x=\"2.5\" y=\"2.5\" width=\"14\" height=\"14\" rx=\"0.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeDasharray=\"2 1.8\"/>\n <path d=\"M10 10 L21 14.5 L14.5 16 L12.5 22 Z\" fill=\"currentColor\" fillOpacity=\"0.5\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n </svg>\n ),\n\n // ===== Point =====\n point: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"9.5\" cy=\"14\" r=\"3.2\" fill={C_POINT}/>\n <text x=\"13.5\" y=\"10.5\" fontSize=\"9.5\" fontFamily=\"serif\" fontStyle=\"italic\" fontWeight=\"600\" fill={C_POINT}>A</text>\n </svg>\n ),\n midpoint: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <circle cx=\"4\" cy=\"12\" r=\"1.8\" fill={C_POINT}/>\n <circle cx=\"20\" cy=\"12\" r=\"1.8\" fill={C_POINT}/>\n <circle cx=\"12\" cy=\"12\" r=\"2.6\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n perpFoot: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Base line ngang (input — currentColor) */}\n <line x1=\"2\" y1=\"17\" x2=\"22\" y2=\"17\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n {/* Vertical dashed line từ BLUE point xuống chân (construct/red) */}\n <line x1=\"9\" y1=\"5\" x2=\"9\" y2=\"17\" stroke={C_CONSTRUCT} strokeWidth=\"1.4\" strokeDasharray=\"2.5 2\"/>\n {/* Right-angle mark tại chân */}\n <rect x=\"9\" y=\"13.5\" width=\"3.5\" height=\"3.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1\"/>\n {/* BLUE point gốc */}\n <circle cx=\"9\" cy=\"5\" r=\"2\" fill={C_POINT}/>\n {/* RED point chân (output) */}\n <circle cx=\"9\" cy=\"17\" r=\"2.4\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n intersect: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <path d=\"M3 5 L21 19\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <path d=\"M21 5 L3 19\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <circle cx=\"12\" cy=\"12\" r=\"2.6\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n\n // ===== Line =====\n segment: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"5\" y1=\"18\" x2=\"19\" y2=\"6\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <circle cx=\"5\" cy=\"18\" r=\"2.2\" fill={C_POINT}/>\n <circle cx=\"19\" cy=\"6\" r=\"2.2\" fill={C_POINT}/>\n </svg>\n ),\n line: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"2\" y1=\"21\" x2=\"22\" y2=\"3\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <circle cx=\"8.5\" cy=\"15.5\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"15.5\" cy=\"8.5\" r=\"1.9\" fill={C_POINT}/>\n </svg>\n ),\n ray: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"5\" y1=\"19\" x2=\"22\" y2=\"2\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <circle cx=\"5\" cy=\"19\" r=\"2.2\" fill={C_POINT}/>\n <circle cx=\"12\" cy=\"12\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n vector: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"5\" y1=\"19\" x2=\"18\" y2=\"6\"/>\n <polyline points=\"13,5 19,5 19,11\"/>\n <circle cx=\"5\" cy=\"19\" r=\"2\" fill={C_POINT} stroke=\"none\"/>\n </svg>\n ),\n\n // ===== Construct =====\n perpendicular: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"2\" y1=\"17\" x2=\"22\" y2=\"17\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"17\" stroke={C_CONSTRUCT} strokeWidth=\"1.5\"/>\n <rect x=\"12\" y=\"13.5\" width=\"3.5\" height=\"3.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1\"/>\n <circle cx=\"12\" cy=\"17\" r=\"1.8\" fill={C_POINT}/>\n </svg>\n ),\n parallel: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Đường đen = đã có (input). Đường đỏ = đường song song mới dựng đi qua điểm xanh. */}\n <line x1=\"2\" y1=\"9\" x2=\"22\" y2=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"2\" y1=\"19\" x2=\"22\" y2=\"16\" stroke={C_CONSTRUCT} strokeWidth=\"1.5\"/>\n <circle cx=\"12\" cy=\"17.5\" r=\"1.9\" fill={C_POINT}/>\n </svg>\n ),\n perpBisector: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"4\" y1=\"16\" x2=\"20\" y2=\"16\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"22\" stroke={C_CONSTRUCT} strokeWidth=\"1.4\" strokeDasharray=\"2.5 2\"/>\n <circle cx=\"4\" cy=\"16\" r=\"2\" fill={C_POINT}/>\n <circle cx=\"20\" cy=\"16\" r=\"2\" fill={C_POINT}/>\n </svg>\n ),\n bisector: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"4\" y1=\"20\" x2=\"22\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"4\" y1=\"20\" x2=\"22\" y2=\"4\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"4\" y1=\"20\" x2=\"23\" y2=\"11\" stroke={C_CONSTRUCT} strokeWidth=\"1.4\" strokeDasharray=\"2.5 2\"/>\n </svg>\n ),\n\n // ===== Polygon =====\n polygon: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\">\n <polygon points=\"6,5 18,6 22,14 13,21 4,16\" fill={C_FILL} fillOpacity=\"0.28\" stroke={C_FILL} strokeWidth=\"1.5\"/>\n <circle cx=\"6\" cy=\"5\" r=\"1.5\" fill={C_POINT}/>\n <circle cx=\"18\" cy=\"6\" r=\"1.5\" fill={C_POINT}/>\n <circle cx=\"22\" cy=\"14\" r=\"1.5\" fill={C_POINT}/>\n <circle cx=\"13\" cy=\"21\" r=\"1.5\" fill={C_POINT}/>\n <circle cx=\"4\" cy=\"16\" r=\"1.5\" fill={C_POINT}/>\n </svg>\n ),\n regularPolygon: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\">\n <polygon points=\"12,3 20.5,8 20.5,16 12,21 3.5,16 3.5,8\" fill={C_FILL} fillOpacity=\"0.28\" stroke={C_FILL} strokeWidth=\"1.5\"/>\n <circle cx=\"12\" cy=\"3\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"20.5\" cy=\"8\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n\n // ===== Circle =====\n circleCenter: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"11\" cy=\"13\" r=\"8\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <circle cx=\"11\" cy=\"13\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"19\" cy=\"13\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n semicircle: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Nửa đường tròn emerald-arc, 2 endpoint blue ở đáy */}\n <path d=\"M 4 16 A 8 8 0 0 1 20 16\" stroke={C_ARC} strokeWidth=\"1.6\" fill=\"none\"/>\n <line x1=\"4\" y1=\"16\" x2=\"20\" y2=\"16\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeDasharray=\"2 1.6\"/>\n <circle cx=\"4\" cy=\"16\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"20\" cy=\"16\" r=\"1.9\" fill={C_POINT}/>\n </svg>\n ),\n arcCenter: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Tâm blue (lớn) + cung emerald + 2 đầu cung blue (nhỏ), 2 bán kính nét đứt */}\n <path d=\"M 6 6 A 9 9 0 0 1 18 18\" stroke={C_ARC} strokeWidth=\"1.7\" fill=\"none\"/>\n <line x1=\"12\" y1=\"12\" x2=\"6\" y2=\"6\" stroke=\"currentColor\" strokeWidth=\"1\" strokeDasharray=\"1.5 1.5\" opacity=\"0.5\"/>\n <line x1=\"12\" y1=\"12\" x2=\"18\" y2=\"18\" stroke=\"currentColor\" strokeWidth=\"1\" strokeDasharray=\"1.5 1.5\" opacity=\"0.5\"/>\n <circle cx=\"12\" cy=\"12\" r=\"2\" fill={C_POINT}/>\n <circle cx=\"6\" cy=\"6\" r=\"1.4\" fill={C_POINT}/>\n <circle cx=\"18\" cy=\"18\" r=\"1.4\" fill={C_POINT}/>\n </svg>\n ),\n arc3: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Circle arc đi qua 3 điểm: (4,17), (12,9), (20,17). Tâm (12,17), r=8. */}\n <path d=\"M 4 17 A 8 8 0 0 1 20 17\" stroke={C_ARC} strokeWidth=\"1.8\" fill=\"none\"/>\n <circle cx=\"4\" cy=\"17\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"12\" cy=\"9\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"20\" cy=\"17\" r=\"1.9\" fill={C_POINT}/>\n </svg>\n ),\n sectorCenter: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\">\n {/* Tâm blue + 2 bán kính + cung emerald + fill orange */}\n <path d=\"M 12 12 L 5 7 A 8.6 8.6 0 0 1 19 7 Z\"\n fill={C_FILL} fillOpacity=\"0.25\"\n stroke={C_ARC} strokeWidth=\"1.6\"/>\n <line x1=\"12\" y1=\"12\" x2=\"5\" y2=\"7\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n <line x1=\"12\" y1=\"12\" x2=\"19\" y2=\"7\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n <circle cx=\"12\" cy=\"12\" r=\"1.8\" fill={C_POINT}/>\n <circle cx=\"5\" cy=\"7\" r=\"1.4\" fill={C_POINT}/>\n <circle cx=\"19\" cy=\"7\" r=\"1.4\" fill={C_POINT}/>\n </svg>\n ),\n circle3: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"13\" r=\"8\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <circle cx=\"12\" cy=\"5\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"19\" cy=\"16\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"5\" cy=\"16\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n tangent: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Circle C=(10,13) r=5; external point P=(20,4); tangent points T1≈(14.5,15.2), T2≈(8.3,8.3) */}\n <circle cx=\"10\" cy=\"13\" r=\"5\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"20\" y1=\"4\" x2=\"14.5\" y2=\"15.2\" stroke={C_CONSTRUCT} strokeWidth=\"1.6\"/>\n <line x1=\"20\" y1=\"4\" x2=\"8.3\" y2=\"8.3\" stroke={C_CONSTRUCT} strokeWidth=\"1.6\"/>\n <circle cx=\"20\" cy=\"4\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"14.5\" cy=\"15.2\" r=\"1.4\" fill={C_CONSTRUCT}/>\n <circle cx=\"8.3\" cy=\"8.3\" r=\"1.4\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n\n // ===== Triangle centers =====\n centroid: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\">\n {/* Tam giác outline + fill orange nhạt */}\n <polygon points=\"4,20 20,20 12,4\" fill={C_FILL} fillOpacity=\"0.18\" stroke=\"currentColor\" strokeWidth=\"1.4\"/>\n {/* 3 medians: vertex → midpoint cạnh đối diện (xám dashed) */}\n <line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\" stroke=\"#94a3b8\" strokeWidth=\"1\" strokeDasharray=\"1.5 1.5\"/>\n <line x1=\"4\" y1=\"20\" x2=\"16\" y2=\"12\" stroke=\"#94a3b8\" strokeWidth=\"1\" strokeDasharray=\"1.5 1.5\"/>\n <line x1=\"20\" y1=\"20\" x2=\"8\" y2=\"12\" stroke=\"#94a3b8\" strokeWidth=\"1\" strokeDasharray=\"1.5 1.5\"/>\n {/* 3 đỉnh BLUE */}\n <circle cx=\"4\" cy=\"20\" r=\"1.5\" fill={C_POINT}/>\n <circle cx=\"20\" cy=\"20\" r=\"1.5\" fill={C_POINT}/>\n <circle cx=\"12\" cy=\"4\" r=\"1.5\" fill={C_POINT}/>\n {/* Trọng tâm RED tại giao 3 medians */}\n <circle cx=\"12\" cy=\"14.67\" r=\"2.4\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n circumcenter: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Đường tròn ngoại tiếp */}\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" strokeWidth=\"1.4\"/>\n {/* Tam giác nội tiếp */}\n <polygon points=\"12,3 21,16 3,16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n {/* 3 đỉnh BLUE */}\n <circle cx=\"12\" cy=\"3\" r=\"1.6\" fill={C_POINT}/>\n <circle cx=\"21\" cy=\"16\" r=\"1.6\" fill={C_POINT}/>\n <circle cx=\"3\" cy=\"16\" r=\"1.6\" fill={C_POINT}/>\n {/* Tâm ngoại tiếp RED */}\n <circle cx=\"12\" cy=\"12\" r=\"2.4\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n incenter: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Tam giác outline */}\n <polygon points=\"3,20 21,20 12,4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.4\"/>\n {/* Đường tròn nội tiếp */}\n <circle cx=\"12\" cy=\"14\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n {/* 3 đỉnh BLUE */}\n <circle cx=\"3\" cy=\"20\" r=\"1.6\" fill={C_POINT}/>\n <circle cx=\"21\" cy=\"20\" r=\"1.6\" fill={C_POINT}/>\n <circle cx=\"12\" cy=\"4\" r=\"1.6\" fill={C_POINT}/>\n {/* Tâm nội tiếp RED */}\n <circle cx=\"12\" cy=\"14\" r=\"2.2\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n orthocenter: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Tam giác outline */}\n <polygon points=\"3,20 21,20 8,5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.4\"/>\n {/* 2 altitudes (dashed red) — đủ giao điểm */}\n <line x1=\"8\" y1=\"5\" x2=\"8\" y2=\"20\" stroke={C_CONSTRUCT} strokeWidth=\"1.2\" strokeDasharray=\"2 1.6\"/>\n <line x1=\"3\" y1=\"20\" x2=\"14.5\" y2=\"11.5\" stroke={C_CONSTRUCT} strokeWidth=\"1.2\" strokeDasharray=\"2 1.6\"/>\n {/* 3 đỉnh BLUE */}\n <circle cx=\"3\" cy=\"20\" r=\"1.6\" fill={C_POINT}/>\n <circle cx=\"21\" cy=\"20\" r=\"1.6\" fill={C_POINT}/>\n <circle cx=\"8\" cy=\"5\" r=\"1.6\" fill={C_POINT}/>\n {/* Trực tâm RED — giao 2 altitudes */}\n <circle cx=\"8\" cy=\"14.5\" r=\"2.4\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n\n // ===== Measure =====\n angle: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"20\" x2=\"22\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"4\" y1=\"20\" x2=\"22\" y2=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <path d=\"M14 20 A 10 10 0 0 0 11 13.4\" stroke={C_ARC} strokeWidth=\"1.6\" fill=\"none\"/>\n <circle cx=\"4\" cy=\"20\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n distance: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <line x1=\"5\" y1=\"16\" x2=\"19\" y2=\"16\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\"/>\n <circle cx=\"5\" cy=\"16\" r=\"2\" fill={C_POINT}/>\n <circle cx=\"19\" cy=\"16\" r=\"2\" fill={C_POINT}/>\n <text x=\"8.5\" y=\"11\" fontSize=\"7\" fontFamily=\"serif\" fontStyle=\"italic\" fontWeight=\"600\" fill=\"currentColor\">cm</text>\n </svg>\n ),\n area: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\">\n <polygon points=\"4,10 14,3.5 21,12 16,21 5,18\" fill={C_FILL} fillOpacity=\"0.32\" stroke={C_FILL} strokeWidth=\"1.4\"/>\n <text x=\"1.5\" y=\"8\" fontSize=\"6.5\" fontFamily=\"serif\" fontStyle=\"italic\" fontWeight=\"600\" fill=\"currentColor\">cm²</text>\n </svg>\n ),\n\n // ===== Edit =====\n toggleLabel: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <text x=\"1.5\" y=\"19\" fontSize=\"15\" fontFamily=\"serif\" fontWeight=\"700\" fill=\"currentColor\">A</text>\n <text x=\"12\" y=\"19\" fontSize=\"15\" fontFamily=\"serif\" fontWeight=\"700\" fill=\"currentColor\" fillOpacity=\"0.35\">A</text>\n </svg>\n ),\n toggleVisible: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"8\" cy=\"12\" r=\"3.2\" fill={C_POINT}/>\n <circle cx=\"17\" cy=\"12\" r=\"3.2\" fill=\"none\" stroke={C_POINT} strokeWidth=\"1.6\"/>\n </svg>\n ),\n trash: (\n // Eraser hình bình hành — GeoGebra dùng eraser, không phải trash bin.\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\" strokeLinecap=\"round\">\n <path d=\"M14.5 3 L21 9.5 L11.5 19 L4 19 L4 11.5 Z\" fill=\"currentColor\" fillOpacity=\"0.14\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"9.5\" y1=\"8\" x2=\"16\" y2=\"14.5\" stroke=\"currentColor\" strokeWidth=\"1.4\"/>\n </svg>\n ),\n\n // ===== Transform =====\n // Style chung: BLUE = input (điểm gốc / tâm), RED = output (ảnh sau biến hình).\n // Mảnh, ít chi tiết — focus vào quan hệ điểm gốc ↔ ảnh.\n translate: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {/* Vector tịnh tiến rời (mũi tên đen) — START thẳng hàng dọc với chấm xanh (x=7), xuống dưới đáy icon, song song với gốc→ảnh */}\n <line x1=\"7\" y1=\"21\" x2=\"12.5\" y2=\"16.25\" stroke=\"currentColor\" strokeWidth=\"1.4\"/>\n <polyline points=\"11.94,17.85 12.5,16.25 10.83,16.57\" stroke=\"currentColor\" strokeWidth=\"1.4\" fill=\"none\"/>\n {/* Điểm gốc BLUE → mũi tên xám → ảnh RED (cùng hướng vector trên) */}\n <line x1=\"7\" y1=\"15\" x2=\"18\" y2=\"5.5\" stroke=\"#94a3b8\" strokeWidth=\"1.4\"/>\n <polyline points=\"15.54,5.97 18,5.5 17.18,7.86\" stroke=\"#94a3b8\" strokeWidth=\"1.4\" fill=\"none\"/>\n <circle cx=\"7\" cy=\"15\" r=\"2\" fill={C_POINT}/>\n <circle cx=\"18\" cy=\"5.5\" r=\"2\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n rotate: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {/* Tâm quay BLUE (lớn) ở dưới + 2 bán kính + cung α (centered tại vertex, bulge lên) + α + gốc BLUE → ảnh RED */}\n <line x1=\"12\" y1=\"18\" x2=\"20\" y2=\"6\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.55\"/>\n <line x1=\"12\" y1=\"18\" x2=\"4\" y2=\"9\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.55\"/>\n {/* Arc r=4 quanh vertex (12,18): start (14.22,14.67) → end (9.34,15.01), short arc bulge UP */}\n <path d=\"M 14.22 14.67 A 4 4 0 0 0 9.34 15.01\" stroke=\"currentColor\" strokeWidth=\"1.2\" fill=\"none\"/>\n <text x=\"10\" y=\"14\" fontSize=\"7\" fontFamily=\"serif\" fontStyle=\"italic\" fontWeight=\"700\" fill=\"currentColor\">α</text>\n <circle cx=\"12\" cy=\"18\" r=\"2.4\" fill={C_POINT} stroke=\"#fff\" strokeWidth=\"0.8\"/>\n <circle cx=\"20\" cy=\"6\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"4\" cy=\"9\" r=\"1.9\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n reflectLine: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Trục đối xứng (đường đen chéo) */}\n <line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n {/* Điểm gốc BLUE (phía trên trục) + ảnh RED (phía dưới trục, đối xứng) */}\n <circle cx=\"5\" cy=\"11\" r=\"2\" fill={C_POINT}/>\n <circle cx=\"13\" cy=\"19\" r=\"2\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n reflectPoint: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Điểm gốc BLUE + tâm BLUE (lớn hơn) + ảnh RED, thẳng hàng & cách đều */}\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\" stroke=\"currentColor\" strokeWidth=\"0.9\" strokeDasharray=\"1.5 1.5\" opacity=\"0.45\"/>\n <circle cx=\"5\" cy=\"19\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"12\" cy=\"12\" r=\"2.6\" fill={C_POINT} stroke=\"#fff\" strokeWidth=\"0.8\"/>\n <circle cx=\"19\" cy=\"5\" r=\"1.9\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n dilate: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Tâm vị tự BLUE + điểm gốc BLUE (gần tâm) + ảnh RED (xa hơn) — chừa chỗ cho k phía trên đường */}\n <line x1=\"3\" y1=\"20\" x2=\"21\" y2=\"4\" stroke=\"currentColor\" strokeWidth=\"0.9\" strokeDasharray=\"1.5 1.5\" opacity=\"0.5\"/>\n <circle cx=\"4\" cy=\"19\" r=\"2.2\" fill={C_POINT} stroke=\"#fff\" strokeWidth=\"0.8\"/>\n <circle cx=\"8\" cy=\"15.5\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"19\" cy=\"5.7\" r=\"1.9\" fill={C_CONSTRUCT}/>\n <text x=\"10.5\" y=\"10.5\" fontSize=\"8\" fontFamily=\"serif\" fontStyle=\"italic\" fontWeight=\"700\" fill=\"currentColor\">k</text>\n </svg>\n ),\n};\n\n// ============== Tool catalog ==============\nexport const TOOLS: ToolDef[] = [\n { key: 'move', label: 'Di chuyển', hint: 'Kéo điểm hoặc xoay nền', icon: Icon.cursor, group: 'move', needs: 0 },\n { key: 'select', label: 'Chọn', hint: 'Click để chọn 1 / Shift+click để bỏ thêm / Kéo nền để khoanh vùng / DEL để xoá', icon: Icon.select, group: 'move', needs: 0 },\n { key: 'point', label: 'Điểm mới', hint: 'Click để thêm điểm', icon: Icon.point, group: 'point', needs: 1 },\n { key: 'midpoint', label: 'Trung điểm', hint: 'Click 2 điểm có sẵn', icon: Icon.midpoint, group: 'point', needs: 2, accepts: ['point', 'point'] },\n { key: 'perpFoot', label: 'Chân đường vuông góc', hint: 'Click 1 điểm + 1 đường có sẵn', icon: Icon.perpFoot, group: 'point', needs: 2, accepts: ['point', 'line'] },\n { key: 'intersect', label: 'Giao điểm của 2 đối tượng', hint: 'Click 2 đường/đường tròn có sẵn', icon: Icon.intersect, group: 'point', needs: 2, accepts: ['lineOrCircle', 'lineOrCircle'] },\n { key: 'segment', label: 'Đoạn thẳng', hint: 'Click 2 điểm', icon: Icon.segment, group: 'line', needs: 2 },\n { key: 'line', label: 'Đường thẳng qua 2 điểm', hint: 'Click 2 điểm', icon: Icon.line, group: 'line', needs: 2 },\n { key: 'ray', label: 'Tia qua 2 điểm', hint: 'Click 2 điểm', icon: Icon.ray, group: 'line', needs: 2 },\n { key: 'vector', label: 'Vector', hint: 'Click 2 điểm', icon: Icon.vector, group: 'line', needs: 2 },\n { key: 'perpendicular', label: 'Đường vuông góc', hint: 'Click 1 điểm + 1 đường có sẵn', icon: Icon.perpendicular, group: 'construct', needs: 2, accepts: ['point', 'line'] },\n { key: 'parallel', label: 'Đường song song', hint: 'Click 1 điểm + 1 đường có sẵn', icon: Icon.parallel, group: 'construct', needs: 2, accepts: ['point', 'line'] },\n { key: 'perpBisector', label: 'Đường trung trực', hint: 'Click 2 điểm có sẵn', icon: Icon.perpBisector, group: 'construct', needs: 2, accepts: ['point', 'point'] },\n { key: 'angleBisector', label: 'Đường phân giác', hint: 'Click 3 điểm (đỉnh ở giữa) hoặc 2 đường/đoạn (sẽ tạo 2 tia phân giác)', icon: Icon.bisector, group: 'construct', needs: 3, accepts: ['pointOrLine', 'pointOrLine', 'pointOrLine'] },\n { key: 'polygon', label: 'Đa giác', hint: 'Click các điểm, click lại điểm đầu để đóng', icon: Icon.polygon, group: 'polygon', needs: -1 },\n { key: 'regularPolygon', label: 'Đa giác đều', hint: 'Click 2 điểm rồi nhập số cạnh', icon: Icon.regularPolygon, group: 'polygon', needs: 2, accepts: ['point', 'point'] },\n { key: 'circleCenter', label: 'Đường tròn (tâm + điểm)', hint: 'Click tâm rồi 1 điểm trên đường tròn', icon: Icon.circleCenter, group: 'circle', needs: 2 },\n { key: 'semicircle', label: 'Nửa đường tròn (đường kính)', hint: 'Click 2 điểm — bán nguyệt qua đường kính', icon: Icon.semicircle, group: 'circle', needs: 2 },\n { key: 'arcCenter', label: 'Cung tròn (tâm + 2 điểm)', hint: 'Click tâm O → A → B (cung từ A đến B)', icon: Icon.arcCenter, group: 'circle', needs: 3 },\n { key: 'arc3', label: 'Cung tròn qua 3 điểm', hint: 'Click 3 điểm trên cung', icon: Icon.arc3, group: 'circle', needs: 3 },\n { key: 'sectorCenter', label: 'Hình quạt (tâm + 2 điểm)', hint: 'Click tâm O → A → B (quạt OAB)', icon: Icon.sectorCenter, group: 'circle', needs: 3 },\n { key: 'circle3', label: 'Đường tròn qua 3 điểm', hint: 'Click 3 điểm', icon: Icon.circle3, group: 'circle', needs: 3 },\n { key: 'tangent', label: 'Tiếp tuyến', hint: 'Click 1 điểm + 1 đường tròn có sẵn', icon: Icon.tangent, group: 'circle', needs: 2, accepts: ['point', 'circle'] },\n { key: 'centroid', label: 'Trọng tâm tam giác', hint: 'Click 3 đỉnh tam giác', icon: Icon.centroid, group: 'triangle', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'circumcenter', label: 'Tâm đường tròn ngoại tiếp', hint: 'Click 3 đỉnh tam giác', icon: Icon.circumcenter, group: 'triangle', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'incenter', label: 'Tâm đường tròn nội tiếp', hint: 'Click 3 đỉnh tam giác', icon: Icon.incenter, group: 'triangle', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'orthocenter', label: 'Trực tâm tam giác', hint: 'Click 3 đỉnh tam giác', icon: Icon.orthocenter, group: 'triangle', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'angle', label: 'Góc', hint: 'Click 3 điểm có sẵn (đỉnh ở giữa)', icon: Icon.angle, group: 'measure', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'distance', label: 'Khoảng cách', hint: 'Click 2 điểm có sẵn', icon: Icon.distance, group: 'measure', needs: 2, accepts: ['point', 'point'] },\n { key: 'area', label: 'Diện tích', hint: 'Click các đỉnh, click lại điểm đầu để đóng', icon: Icon.area, group: 'measure', needs: -1 },\n { key: 'toggleLabel', label: 'Hiện/ẩn tên', hint: 'Click vào đối tượng', icon: Icon.toggleLabel, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'toggleVisible', label: 'Hiện/ẩn đối tượng', hint: 'Click vào đối tượng', icon: Icon.toggleVisible, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'delete', label: 'Xoá', hint: 'Click vào đối tượng', icon: Icon.trash, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'translate', label: 'Phép tịnh tiến', hint: 'Click object → 2 điểm tạo vector', icon: Icon.translate, group: 'transform', needs: 3, accepts: ['any', 'point', 'point'] },\n { key: 'rotate', label: 'Quay đối tượng', hint: 'Click object → tâm quay → nhập góc', icon: Icon.rotate, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n { key: 'reflectLine', label: 'Đối xứng qua đường thẳng', hint: 'Click object → đường thẳng', icon: Icon.reflectLine, group: 'transform', needs: 2, accepts: ['any', 'line'] },\n { key: 'reflectPoint', label: 'Đối xứng qua điểm', hint: 'Click object → tâm đối xứng', icon: Icon.reflectPoint, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n { key: 'dilate', label: 'Phép vị tự', hint: 'Click object → tâm → nhập tỷ số k', icon: Icon.dilate, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n];\n\nexport const GROUP_LABELS: Record<ToolDef['group'], string> = {\n move: 'Cơ bản',\n point: 'Điểm',\n line: 'Đường',\n construct: 'Dựng hình',\n polygon: 'Đa giác',\n circle: 'Đường tròn',\n triangle: 'Tam giác',\n measure: 'Đo lường',\n edit: 'Chỉnh sửa',\n transform: 'Phép biến hình',\n};\n\nexport type GeomGroup = ToolDef['group'];\n\n// Positional A..I — letter shortcut cho chord 2-phím.\n// Khớp đúng thứ tự hiển thị trong LeftPanel (derive từ TOOLS phía trên).\nexport const GROUP_ORDER: GeomGroup[] = [\n 'move',\n 'point',\n 'line',\n 'construct',\n 'polygon',\n 'circle',\n 'triangle',\n 'measure',\n 'edit',\n 'transform',\n];\n\nconst A_CODE = 'A'.charCodeAt(0);\n\nexport function letterForGroup(g: GeomGroup): string {\n const idx = GROUP_ORDER.indexOf(g);\n return idx >= 0 ? String.fromCharCode(A_CODE + idx) : '';\n}\n\nexport function groupForLetter(ch: string): GeomGroup | null {\n if (ch.length !== 1) return null;\n const upper = ch.toUpperCase();\n const idx = upper.charCodeAt(0) - A_CODE;\n if (idx < 0 || idx >= GROUP_ORDER.length) return null;\n return GROUP_ORDER[idx];\n}\n\n// ============== Object-type matching ==============\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\n/** Phân loại JSXGraph element type vào nhóm dùng cho accept-matching.\n *\n * Ưu tiên `elementClass` (numeric constant do JSXGraph set đúng cho mọi derived\n * element — intersection, reflection, glider, parallelpoint, mirrorpoint, ...\n * đều trả về OBJECT_CLASS_POINT). Nếu không có (test mocks), fallback sang\n * `elType` string với danh sách mở rộng các kiểu thường gặp.\n *\n * Constants từ JSXGraph: OBJECT_CLASS_POINT=1, OBJECT_CLASS_LINE=2, OBJECT_CLASS_CIRCLE=3.\n */\nexport function objKind(obj: JxgObj): 'point' | 'line' | 'circle' | 'other' {\n if (!obj) return 'other';\n const ec = typeof obj.elementClass === 'number' ? obj.elementClass : null;\n if (ec === 1) return 'point';\n if (ec === 2) return 'line';\n if (ec === 3) return 'circle';\n const e = (obj.elType || obj.type || '').toString().toLowerCase();\n if (\n e === 'point' || e === 'glider' || e === 'midpoint' ||\n e === 'intersection' || e === 'otherintersection' ||\n e === 'reflection' || e === 'mirrorpoint' || e === 'mirrorelement' ||\n e === 'orthogonalprojection' || e === 'parallelpoint'\n ) return 'point';\n if (\n e === 'line' || e === 'segment' || e === 'arrow' || e === 'axis' ||\n e === 'normal' || e === 'parallel' || e === 'perpendicular' ||\n e === 'tangent' || e === 'bisector' || e === 'perpendicularsegment'\n ) return 'line';\n if (e === 'circle' || e === 'circumcircle') return 'circle';\n return 'other';\n}\n\nexport function acceptMatches(\n tool: ToolDef,\n slot: number,\n kind: 'point' | 'line' | 'circle' | 'other',\n): boolean {\n if (!tool.accepts) return kind === 'point' || tool.key === 'point';\n const a = tool.accepts[slot];\n if (!a) return false;\n if (a === 'any') return kind !== 'other';\n if (a === 'lineOrCircle') return kind === 'line' || kind === 'circle';\n if (a === 'pointOrLine') return kind === 'point' || kind === 'line';\n return a === kind;\n}\n","import { objKind } from '../../tools';\nimport type { HandlerCtx } from '../ctx';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleMoveTool(ctx: HandlerCtx, e: any): void {\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n ctx.moveDownRef.current = { sx, sy };\n const cx = (e.clientX ?? e.touches?.[0]?.clientX ?? 0) as number;\n const cy = (e.clientY ?? e.touches?.[0]?.clientY ?? 0) as number;\n ctx.lastClickClientRef.current = { x: cx, y: cy };\n\n // Click-select trong move tool (chế độ cơ bản): cho phép chọn 1 / shift-add\n // mà không cần switch sang tool 'select'. Hành vi drag điểm + pan nền của\n // JSXGraph vẫn nguyên (selection chỉ là side-effect, không stopPropagation).\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y)\n .filter((o) => ctx.jxgIdToSceneId(o) != null);\n const obj = hits.find((o) => objKind(o) === 'point') ?? ctx.findNearestPointJxg(e, 12) ?? hits[0];\n if (obj) {\n const sid = ctx.jxgIdToSceneId(obj);\n if (sid) {\n const shift = !!(e.shiftKey || e.altKey);\n ctx.toggleSelect(sid, shift);\n }\n return;\n }\n // Empty space + không additive: clear selection (popover sẽ tự đóng qua\n // selectionTick effect ở MiniBoard).\n if (!(e.shiftKey || e.altKey)) ctx.clearSelection();\n}\n","import { objKind } from '../../tools';\nimport type { HandlerCtx } from '../ctx';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleSelectTool(ctx: HandlerCtx, e: any): void {\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n const cx = (e.clientX ?? e.touches?.[0]?.clientX ?? 0) as number;\n const cy = (e.clientY ?? e.touches?.[0]?.clientY ?? 0) as number;\n ctx.lastClickClientRef.current = { x: cx, y: cy };\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y)\n .filter((o) => ctx.jxgIdToSceneId(o) != null);\n // Ưu tiên điểm: exact hit → nearest-within-12px → mới đến hit khác (line/circle).\n const obj = hits.find((o) => objKind(o) === 'point') ?? ctx.findNearestPointJxg(e, 12) ?? hits[0];\n if (obj) {\n const sid = ctx.jxgIdToSceneId(obj);\n if (sid) {\n const shift = !!(e.shiftKey || e.altKey);\n ctx.toggleSelect(sid, shift);\n }\n ctx.moveDownRef.current = { sx, sy };\n ctx.marqueeRef.current = null;\n return;\n }\n // Empty space: start marquee.\n ctx.marqueeRef.current = { startSx: sx, startSy: sy };\n if (!(e.shiftKey || e.altKey)) ctx.clearSelection();\n}\n","const isDev = (() => {\n try {\n return typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production';\n } catch {\n return false;\n }\n})();\n\n/**\n * Wrap JSXGraph operations that can throw on stale/missing state.\n * In dev mode: log to console. In prod: silent swallow + return fallback.\n *\n * @param label Short tag for grep-ability (vd \"removeObject\", \"board.update\").\n * @param fn Operation to execute.\n * @param fallback Value to return if fn throws (default: undefined).\n */\nexport function safeJsx<T>(label: string, fn: () => T): T | undefined;\nexport function safeJsx<T>(label: string, fn: () => T, fallback: T): T;\nexport function safeJsx<T>(label: string, fn: () => T, fallback?: T): T | undefined {\n try {\n return fn();\n } catch (err) {\n if (isDev) {\n // eslint-disable-next-line no-console\n console.warn('[whiteboard:jsxgraph]', label, err);\n }\n return fallback;\n }\n}\n","import type { HandlerCtx } from './ctx';\n\nexport type SceneObj = {\n id: string;\n kind: string;\n label: string;\n visible: boolean;\n locked: boolean;\n layer: string;\n schemaVersion: number;\n attrs: Record<string, unknown>;\n};\n\nexport function freshId(ctx: HandlerCtx, prefix: string): string {\n const counter = ctx.store.getState().counter;\n // Loop until unique (counter is monotonic but ids may have been deleted/reused\n // in non-trivial scenarios; safer to probe).\n let n = counter + 1;\n let id = `${prefix}_${n}`;\n const objs = ctx.store.getState().objects;\n while (id in objs) {\n n += 1;\n id = `${prefix}_${n}`;\n }\n return id;\n}\n\nexport function mkSceneObj(\n id: string,\n kind: string,\n label: string,\n attrs: Record<string, unknown>,\n): SceneObj {\n return {\n id,\n kind,\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs,\n };\n}\n\n/** Tạo point free + dispatch ADD; trả về scene id mới. */\nexport function dispatchAddFreePoint(ctx: HandlerCtx, x: number, y: number): string {\n const id = freshId(ctx, 'p');\n const label = ctx.nextLabel('point');\n const obj = mkSceneObj(id, 'point', label, { constraint: { kind: 'free', x, y } });\n ctx.store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n\n/** Tạo intersection point + dispatch ADD; trả về scene id mới. */\nexport function dispatchAddIntersection(\n ctx: HandlerCtx,\n attrs: Record<string, unknown>,\n): string {\n const id = freshId(ctx, 'X');\n const label = ctx.nextLabel('intersection');\n const obj = mkSceneObj(id, 'intersection', label, attrs);\n ctx.store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import { objKind } from '../../tools';\nimport { safeJsx } from '../../../../shared/safeJsx';\nimport type { HandlerCtx } from '../ctx';\nimport { dispatchAddFreePoint, dispatchAddIntersection } from '../utils';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport function handlePointTool(\n ctx: HandlerCtx,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _e: any,\n x: number,\n y: number,\n hits: JxgObj[],\n): void {\n const curves = hits.filter((o) => objKind(o) === 'line' || objKind(o) === 'circle');\n if (curves.length >= 2) {\n const a = curves[0];\n const b = curves[1];\n const aId = ctx.jxgIdToSceneId(a);\n const bId = ctx.jxgIdToSceneId(b);\n if (aId && bId) {\n try {\n const aKind = objKind(a);\n const bKind = objKind(b);\n if (aKind === 'line' && bKind === 'line') {\n dispatchAddIntersection(ctx, { kind: 'lineLine', ref1: aId, ref2: bId });\n return;\n }\n // line-circle / circle-circle: pick branch nearest click.\n const tmp0 = ctx.boardRef.current.create('intersection', [a, b, 0], { visible: false, withLabel: false });\n const tmp1 = ctx.boardRef.current.create('intersection', [a, b, 1], { visible: false, withLabel: false });\n const d0 = Math.hypot((tmp0.X?.() ?? 0) - x, (tmp0.Y?.() ?? 0) - y);\n const d1 = Math.hypot((tmp1.X?.() ?? 0) - x, (tmp1.Y?.() ?? 0) - y);\n safeJsx('handlers.removeObject(intersect.tmp0)', () => ctx.boardRef.current.removeObject(tmp0));\n safeJsx('handlers.removeObject(intersect.tmp1)', () => ctx.boardRef.current.removeObject(tmp1));\n const branch: 0 | 1 = d0 <= d1 ? 0 : 1;\n const isLineCircle = (aKind === 'line' && bKind === 'circle') || (aKind === 'circle' && bKind === 'line');\n if (isLineCircle) {\n dispatchAddIntersection(ctx, { kind: 'lineCircle', ref1: aId, ref2: bId, branch });\n } else {\n dispatchAddIntersection(ctx, { kind: 'circleCircle', ref1: aId, ref2: bId, branch });\n }\n return;\n } catch {\n // fallback: tạo điểm tự do\n }\n }\n }\n dispatchAddFreePoint(ctx, x, y);\n}\n","import type { ToolDef, GeomTool } from '../../tools';\nimport type { HandlerCtx } from '../ctx';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport function handleSingleTargetTool(\n ctx: HandlerCtx,\n t: GeomTool,\n toolDef: ToolDef,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n e: any,\n bestHit: JxgObj | null,\n): boolean {\n if (!(toolDef.needs === 1 && toolDef.accepts)) return false;\n const hit = bestHit ?? ctx.findNearestPointJxg(e, 12);\n if (!hit) {\n ctx.flashWarn('Click vào một đối tượng để áp dụng');\n return true;\n }\n const sid = ctx.jxgIdToSceneId(hit);\n if (!sid) return true;\n if (t === 'delete') {\n ctx.store.dispatch({ type: 'DELETE', payload: { id: sid } });\n return true;\n }\n if (t === 'toggleLabel') {\n const obj = ctx.store.getState().objects[sid];\n if (!obj) return true;\n const cur = (obj.attrs as { showLabel?: boolean }).showLabel;\n const next = !(cur ?? false);\n ctx.store.dispatch({ type: 'UPDATE_ATTRS', payload: { id: sid, patch: { showLabel: next } } });\n return true;\n }\n if (t === 'toggleVisible') {\n const obj = ctx.store.getState().objects[sid];\n if (!obj) return true;\n ctx.store.dispatch({ type: 'UPDATE', payload: { id: sid, patch: { visible: !obj.visible } } });\n return true;\n }\n return true;\n}\n","import { objKind } from '../../tools';\nimport { safeJsx } from '../../../../shared/safeJsx';\nimport type { GeomTool, ToolDef } from '../../tools';\nimport type { HandlerCtx } from '../ctx';\nimport { dispatchAddFreePoint, freshId, mkSceneObj } from '../utils';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport function handlePolygonTool(\n ctx: HandlerCtx,\n t: GeomTool,\n toolDef: ToolDef,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n e: any,\n x: number,\n y: number,\n bestHit: JxgObj | null,\n): boolean {\n if (toolDef.needs !== -1) return false;\n const snappedPoint: JxgObj | null =\n bestHit && objKind(bestHit) === 'point' ? bestHit : ctx.findNearestPointJxg(e, 12);\n const snappedId = snappedPoint ? ctx.jxgIdToSceneId(snappedPoint) : null;\n // Close ring: click back on first pending point.\n if (\n ctx.pendingIdsRef.current.length >= 3 &&\n snappedId &&\n snappedId === ctx.pendingIdsRef.current[0]\n ) {\n ctx.clearPreviewSegs();\n const vertices = ctx.pendingIdsRef.current.slice();\n const isArea = t === 'area';\n const id = freshId(ctx, isArea ? 'area' : 'poly');\n const label = ctx.nextLabel('polygon');\n // Tool 'area' = polygon + showValue + fill phân biệt visual với polygon\n // thường. JSXGraph polygon.Area() live-update khi đỉnh di chuyển.\n const attrs: Record<string, unknown> = { vertices };\n if (isArea) {\n attrs.showValue = true;\n attrs.fillOpacity = 0.18;\n attrs.color = '#1d4ed8';\n }\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'polygon', label, attrs) },\n });\n ctx.clearPending();\n return true;\n }\n if (snappedId && ctx.pendingIdsRef.current.includes(snappedId)) {\n ctx.flashWarn('Đỉnh này đã có — click điểm khác hoặc click lại điểm đầu để đóng');\n return true;\n }\n // Otherwise pick (snap-to-existing or create) a new vertex.\n let pickId: string | null = snappedId;\n let pickJxg: JxgObj | null = snappedPoint;\n if (!pickId) {\n pickId = dispatchAddFreePoint(ctx, x, y);\n pickJxg = ctx.jxgFromSceneId(pickId);\n }\n // Live preview segment from previous vertex to new pick.\n if (ctx.pendingRef.current.length > 0 && ctx.boardRef.current && pickJxg) {\n const prev = ctx.pendingRef.current[ctx.pendingRef.current.length - 1];\n safeJsx('handlers.createPreviewSegment', () => {\n const seg = ctx.boardRef.current.create('segment', [prev, pickJxg], {\n strokeColor: '#3b82f6',\n strokeWidth: 1.5,\n strokeOpacity: 0.75,\n fixed: true,\n highlight: false,\n withLabel: false,\n });\n ctx.previewSegRef.current.push(seg);\n });\n }\n if (pickJxg) ctx.pendingRef.current.push(pickJxg);\n if (pickId) ctx.pendingIdsRef.current.push(pickId);\n ctx.setPendingCount(ctx.pendingIdsRef.current.length);\n return true;\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport type PointVsCircle = 'inside' | 'on' | 'outside';\n\n/**\n * Classify a JXG point's position relative to a JXG circle.\n *\n * Uses a relative epsilon (max(1e-9, 1e-6 * r)) for the on-circle check so\n * that user-snapped points (which may carry tiny floating-point error)\n * register as on the circle rather than just inside/outside.\n *\n * Defensive: if either argument is null/undefined, returns 'inside' so the\n * caller will refuse to draw rather than risk a wrong tangent.\n */\nexport function classifyPointVsCircle(point: JxgObj, circle: JxgObj): PointVsCircle {\n if (!point || !circle || !circle.center) return 'inside';\n const dx = point.X() - circle.center.X();\n const dy = point.Y() - circle.center.Y();\n const d = Math.hypot(dx, dy);\n const r = typeof circle.Radius === 'function' ? circle.Radius() : Number(circle.radius);\n if (!Number.isFinite(d) || !Number.isFinite(r)) return 'inside';\n const eps = Math.max(1e-9, 1e-6 * r);\n if (Math.abs(d - r) <= eps) return 'on';\n return d < r ? 'inside' : 'outside';\n}\n","import { objKind, type ToolDef } from '../tools';\nimport type { HandlerCtx } from './ctx';\nimport { dispatchAddIntersection, freshId, mkSceneObj } from './utils';\nimport { classifyPointVsCircle } from './classifyPointVsCircle';\n\n// ─── Finalize shape (dispatch ADD per tool) ──────────────────────────────────\n\n/**\n * Tìm scene id của pending pick theo `objKind`. Dùng cho tool order-flexible\n * (perpendicular, parallel, tangent): user có thể click điểm trước hay đường\n * trước, finalizeShape dò pendingRef theo kind để biết role.\n */\nfunction findPickIdByKind(ctx: HandlerCtx, kind: 'point' | 'line' | 'circle'): string | null {\n const picks = ctx.pendingRef.current;\n const ids = ctx.pendingIdsRef.current;\n for (let i = 0; i < picks.length; i += 1) {\n if (objKind(picks[i]) === kind && ids[i]) return ids[i];\n }\n return null;\n}\n\nexport function finalizeShape(ctx: HandlerCtx, toolDef: ToolDef): void {\n const ids = ctx.pendingIdsRef.current;\n const key = toolDef.key;\n switch (key) {\n case 'segment': {\n const id = freshId(ctx, 's');\n const label = ctx.nextLabel('segment');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'segment', label, { p1: ids[0], p2: ids[1] }) },\n });\n return;\n }\n case 'line': {\n const id = freshId(ctx, 'l');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, { p1: ids[0], p2: ids[1] }) },\n });\n return;\n }\n case 'perpendicular':\n case 'parallel': {\n const throughPoint = findPickIdByKind(ctx, 'point');\n const toLine = findPickIdByKind(ctx, 'line');\n if (!throughPoint || !toLine) return;\n const id = freshId(ctx, key === 'perpendicular' ? 'perp' : 'par');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, {\n construction: { kind: key, throughPoint, toLine },\n }) },\n });\n return;\n }\n case 'perpBisector': {\n const id = freshId(ctx, 'pb');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, {\n construction: { kind: 'perpBisector', p1: ids[0], p2: ids[1] },\n }) },\n });\n return;\n }\n case 'angleBisector': {\n const picks = ctx.pendingRef.current;\n // Mode 2-line: 2 picks đều là line/segment → tạo 2 scene line (2 tia\n // phân giác vuông góc với nhau qua giao điểm 2 đường).\n if (picks.length === 2 && objKind(picks[0]) === 'line' && objKind(picks[1]) === 'line') {\n for (const branch of [0, 1] as const) {\n const id = freshId(ctx, 'ab');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, {\n construction: { kind: 'angleBisectorLines', line1: ids[0], line2: ids[1], branch },\n }) },\n });\n }\n return;\n }\n // Mode 3-point: behavior cũ.\n const id = freshId(ctx, 'ab');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, {\n construction: { kind: 'angleBisector', p1: ids[0], vertex: ids[1], p2: ids[2] },\n }) },\n });\n return;\n }\n case 'tangent': {\n const throughId = findPickIdByKind(ctx, 'point');\n const circleId = findPickIdByKind(ctx, 'circle');\n if (!throughId || !circleId) return;\n // Lấy JXG object tương ứng để classify vị trí P vs đường tròn.\n // pendingRef + pendingIdsRef cùng index → match qua indexOf id.\n const picks = ctx.pendingRef.current;\n const ids = ctx.pendingIdsRef.current;\n const through = picks[ids.indexOf(throughId)];\n const circle = picks[ids.indexOf(circleId)];\n const pos = classifyPointVsCircle(through, circle);\n if (pos === 'inside') {\n ctx.toast?.('Điểm nằm trong đường tròn — không có tiếp tuyến', {\n variant: 'warning',\n id: 'tangent-invalid-inside',\n });\n return;\n }\n if (pos === 'on') {\n const id = freshId(ctx, 't');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, {\n construction: { kind: 'tangent', throughPoint: throughId, toCircle: circleId, branch: 'on' },\n }) },\n });\n return;\n }\n // outside → 2 scene element riêng, mỗi cái 1 nhánh tiếp tuyến.\n for (const branch of [0, 1] as const) {\n const id = freshId(ctx, 't');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, {\n construction: { kind: 'tangent', throughPoint: throughId, toCircle: circleId, branch },\n }) },\n });\n }\n return;\n }\n case 'ray': {\n const id = freshId(ctx, 'r');\n const label = ctx.nextLabel('ray');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'ray', label, { origin: ids[0], through: ids[1] }) },\n });\n return;\n }\n case 'vector': {\n const id = freshId(ctx, 'v');\n const label = ctx.nextLabel('vector');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'vector', label, { from: ids[0], to: ids[1] }) },\n });\n return;\n }\n case 'circleCenter': {\n const id = freshId(ctx, 'c');\n const label = ctx.nextLabel('circle');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: mkSceneObj(id, 'circle', label, {\n center: ids[0],\n surfacePoint: ids[1],\n }),\n },\n });\n return;\n }\n case 'circle3': {\n const id = freshId(ctx, 'cc');\n const label = ctx.nextLabel('circle');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: mkSceneObj(id, 'circle', label, {\n construction: { kind: 'circumscribed', p1: ids[0], p2: ids[1], p3: ids[2] },\n }),\n },\n });\n return;\n }\n case 'semicircle': {\n if (ids[0] === ids[1]) {\n ctx.toast?.('Cần 2 điểm phân biệt', { variant: 'warning', id: 'semicircle-dup' });\n return;\n }\n const id = freshId(ctx, 'arc');\n const label = ctx.nextLabel('arc');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: mkSceneObj(id, 'arc', label, {\n construction: { kind: 'semicircle', p1: ids[0], p2: ids[1] },\n }),\n },\n });\n return;\n }\n case 'arcCenter': {\n if (ids[0] === ids[1] || ids[0] === ids[2] || ids[1] === ids[2]) {\n ctx.toast?.('Cần 3 điểm phân biệt', { variant: 'warning', id: 'arc-center-dup' });\n return;\n }\n const id = freshId(ctx, 'arc');\n const label = ctx.nextLabel('arc');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: mkSceneObj(id, 'arc', label, {\n construction: { kind: 'byCenter', center: ids[0], p1: ids[1], p2: ids[2] },\n }),\n },\n });\n return;\n }\n case 'arc3': {\n if (ids[0] === ids[1] || ids[0] === ids[2] || ids[1] === ids[2]) {\n ctx.toast?.('Cần 3 điểm phân biệt', { variant: 'warning', id: 'arc3-dup' });\n return;\n }\n const picks = ctx.pendingRef.current;\n const ax = picks[0].X(), ay = picks[0].Y();\n const bx = picks[1].X(), by = picks[1].Y();\n const cx = picks[2].X(), cy = picks[2].Y();\n const cross = (bx - ax) * (cy - ay) - (by - ay) * (cx - ax);\n if (Math.abs(cross) < 1e-6) {\n ctx.toast?.('Không vẽ được cung qua 3 điểm thẳng hàng', {\n variant: 'warning', id: 'arc3-collinear',\n });\n return;\n }\n const id = freshId(ctx, 'arc');\n const label = ctx.nextLabel('arc');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: mkSceneObj(id, 'arc', label, {\n construction: { kind: 'by3Points', p1: ids[0], p2: ids[1], p3: ids[2] },\n }),\n },\n });\n return;\n }\n case 'sectorCenter': {\n if (ids[0] === ids[1] || ids[0] === ids[2] || ids[1] === ids[2]) {\n ctx.toast?.('Cần 3 điểm phân biệt', { variant: 'warning', id: 'sector-center-dup' });\n return;\n }\n const id = freshId(ctx, 'sec');\n const label = ctx.nextLabel('sector');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: mkSceneObj(id, 'sector', label, {\n construction: { kind: 'byCenter', center: ids[0], p1: ids[1], p2: ids[2] },\n }),\n },\n });\n return;\n }\n case 'midpoint': {\n const id = freshId(ctx, 'mp');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'midpoint', p1: ids[0], p2: ids[1] },\n }) },\n });\n return;\n }\n case 'perpFoot': {\n const fromPoint = findPickIdByKind(ctx, 'point');\n const onLine = findPickIdByKind(ctx, 'line');\n if (!fromPoint || !onLine) return;\n const id = freshId(ctx, 'pf');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'perpFoot', from: fromPoint, onLine },\n }) },\n });\n return;\n }\n case 'centroid': {\n const id = freshId(ctx, 'g');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'centroid', vertices: [ids[0], ids[1], ids[2]] },\n }) },\n });\n return;\n }\n case 'circumcenter': {\n const id = freshId(ctx, 'o');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'circumcenter', vertices: [ids[0], ids[1], ids[2]] },\n }) },\n });\n return;\n }\n case 'incenter': {\n const id = freshId(ctx, 'i');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'incenter', vertices: [ids[0], ids[1], ids[2]] },\n }) },\n });\n return;\n }\n case 'orthocenter': {\n const id = freshId(ctx, 'h');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'orthocenter', vertices: [ids[0], ids[1], ids[2]] },\n }) },\n });\n return;\n }\n case 'angle': {\n // ids = [p1, vertex, p2] — tool def 'accepts: [\"point\", \"point\", \"point\"]'\n // và LeftPanel hint \"Click 3 điểm có sẵn (đỉnh ở giữa)\". User click theo\n // thứ tự: cạnh-A, đỉnh, cạnh-B.\n const id = freshId(ctx, 'ang');\n const label = ctx.nextLabel('angle');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'angle', label, {\n p1: ids[0], vertex: ids[1], p2: ids[2],\n }) },\n });\n return;\n }\n case 'distance': {\n const id = freshId(ctx, 'd');\n const label = ctx.nextLabel('distance');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'distance', label, { p1: ids[0], p2: ids[1] }) },\n });\n return;\n }\n case 'intersect': {\n // ids[0], ids[1] là line hoặc circle theo accept 'lineOrCircle'.\n // Resolve kind từ pendingRef để biết lineLine / lineCircle / circleCircle.\n const picks = ctx.pendingRef.current;\n const pendIds = ctx.pendingIdsRef.current;\n const aIdx = pendIds.indexOf(ids[0]);\n const bIdx = pendIds.indexOf(ids[1]);\n if (aIdx < 0 || bIdx < 0) return;\n const aKind = objKind(picks[aIdx]);\n const bKind = objKind(picks[bIdx]);\n if (aKind === 'line' && bKind === 'line') {\n dispatchAddIntersection(ctx, { kind: 'lineLine', ref1: ids[0], ref2: ids[1] });\n return;\n }\n const isLineCircle =\n (aKind === 'line' && bKind === 'circle') || (aKind === 'circle' && bKind === 'line');\n const isCircleCircle = aKind === 'circle' && bKind === 'circle';\n if (!isLineCircle && !isCircleCircle) return;\n // 2 nhánh → tạo 2 scene intersection (giống GeoGebra \"Intersect Two Objects\").\n for (const branch of [0, 1] as const) {\n dispatchAddIntersection(ctx, {\n kind: isLineCircle ? 'lineCircle' : 'circleCircle',\n ref1: ids[0],\n ref2: ids[1],\n branch,\n });\n }\n return;\n }\n default:\n return;\n }\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type JxgObj = any;\n\nimport type { State, SceneObject } from '../../../core/scene';\n\n/**\n * Trả về danh sách id điểm \"định nghĩa\" object — dùng cho transform tools\n * (translate/rotate/reflect/dilate) cần biết các điểm gốc để clone.\n *\n * Signature: `(obj: SceneObject, state: State)`. `state` được pass để\n * forward-compatible với các kind phái sinh (vd: lookup dependentsOf cho\n * compound shapes); hiện tại chỉ đọc `obj.kind` + `obj.attrs`.\n */\nexport function getDefiningPoints(obj: SceneObject, _state: State): string[] {\n if (obj.kind === 'point' || obj.kind === 'intersection') return [obj.id];\n if (obj.kind === 'segment' || obj.kind === 'line') {\n const a = obj.attrs as { p1: string; p2: string };\n return [a.p1, a.p2];\n }\n if (obj.kind === 'ray') {\n const a = obj.attrs as { origin: string; through: string };\n return [a.origin, a.through];\n }\n if (obj.kind === 'vector') {\n const a = obj.attrs as { from: string; to: string };\n return [a.from, a.to];\n }\n if (obj.kind === 'circle') {\n const a = obj.attrs as { center: string; surfacePoint: string };\n return [a.center, a.surfacePoint];\n }\n if (obj.kind === 'polygon') {\n return [...(obj.attrs as { vertices: string[] }).vertices];\n }\n return [];\n}\n\nexport type TransformInput =\n | { kind: 'translate'; vectorPoints: [JxgObj, JxgObj] }\n | { kind: 'rotate'; center: JxgObj; angleDeg: number }\n | { kind: 'reflectLine'; line: JxgObj }\n | { kind: 'reflectPoint'; center: JxgObj }\n | { kind: 'dilate'; center: JxgObj; k: number };\n\nexport interface TransformSpec {\n params: unknown[];\n attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' };\n /**\n * Khi `chain` được set, finalizeTransformCreate dựng từng transform trong chain\n * (theo thứ tự) rồi pass mảng vào `board.create('point', [src, [t1, t2, t3]])`.\n * Dùng cho `dilate` (scale-quanh-điểm) vì JSXGraph 'scale' không nhận center.\n */\n chain?: Array<{ params: unknown[]; attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' } }>;\n}\n\nexport function buildTransformSpec(input: TransformInput): TransformSpec {\n switch (input.kind) {\n case 'translate': {\n // Literal dx/dy (không phải callback) để serialize qua JSON.stringify được.\n // Trade-off: transformed object không cập nhật khi user kéo điểm vector — chấp nhận.\n const [a, b] = input.vectorPoints;\n const dx = b.X() - a.X();\n const dy = b.Y() - a.Y();\n return { params: [dx, dy], attrs: { type: 'translate' } };\n }\n case 'rotate':\n return {\n params: [(input.angleDeg * Math.PI) / 180, input.center],\n attrs: { type: 'rotate' },\n };\n case 'reflectLine':\n return { params: [input.line], attrs: { type: 'reflect' } };\n case 'reflectPoint':\n // JSXGraph 'scale' chỉ nhận 2 tham số (sx, sy) và scale quanh gốc toạ độ —\n // tham số center thứ 3 bị lờ → trước đây sai. Đối xứng qua điểm = quay 180°\n // quanh điểm đó. Dùng 'rotate' (params [angle, center]) để chuẩn.\n return { params: [Math.PI, input.center], attrs: { type: 'rotate' } };\n case 'dilate':\n // JSXGraph 'scale' chỉ nhận đúng 2 tham số (sx, sy) và scale quanh gốc toạ độ —\n // tham số center thứ 3 làm constructor throw. Dilate quanh điểm c bằng tỷ số k\n // = compose 3 phép: T(-c) → S(k,k) → T(+c). Sinh ra chain (mảng spec) thay vì\n // 1 spec đơn; consumer (finalizeTransformCreate) tự nhận biết.\n return {\n params: [],\n attrs: { type: 'scale' },\n chain: [\n { params: [-input.center.X(), -input.center.Y()], attrs: { type: 'translate' as const } },\n { params: [input.k, input.k], attrs: { type: 'scale' as const } },\n { params: [input.center.X(), input.center.Y()], attrs: { type: 'translate' as const } },\n ],\n };\n }\n}\n","import type { TransformDef } from '../../../../core/scene/kinds/2d-constraint';\nimport { getDefiningPoints } from '../transforms';\nimport type { HandlerCtx, TransformToolKey } from './ctx';\nimport { freshId, mkSceneObj } from './utils';\n\nexport function finalizeTransform(\n ctx: HandlerCtx,\n tool: TransformToolKey,\n pendingIds: string[],\n value: number,\n): void {\n if (tool === 'regularPolygon') {\n const n = Math.max(3, Math.round(value));\n const id = freshId(ctx, 'rpoly');\n const label = ctx.nextLabel('polygon');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'polygon', label, {\n construction: { kind: 'regular', p1: pendingIds[0], p2: pendingIds[1], n },\n }) },\n });\n return;\n }\n\n // 5 transform tools: pendingIds[0] = source object.\n const sourceId = pendingIds[0];\n const state = ctx.store.getState();\n const source = state.objects[sourceId];\n if (!source) {\n ctx.flashWarn('Đối tượng nguồn không còn');\n return;\n }\n const defining = getDefiningPoints(source, state);\n if (defining.length === 0) {\n ctx.flashWarn('Không thể biến đổi đối tượng này');\n return;\n }\n\n let transformDef: TransformDef | null = null;\n if (tool === 'translate') {\n // pendingIds = [source, A, B]; vector = B − A. Đọc toạ độ live qua JxgObj.\n const a = ctx.jxgFromSceneId(pendingIds[1]);\n const b = ctx.jxgFromSceneId(pendingIds[2]);\n if (!a || !b || typeof a.X !== 'function' || typeof b.X !== 'function') {\n ctx.flashWarn('Không đọc được toạ độ vector');\n return;\n }\n transformDef = { kind: 'translate', dx: b.X() - a.X(), dy: b.Y() - a.Y() };\n } else if (tool === 'rotate') {\n transformDef = { kind: 'rotate', angleRad: (value * Math.PI) / 180, center: pendingIds[1] };\n } else if (tool === 'reflectLine') {\n transformDef = { kind: 'reflectLine', line: pendingIds[1] };\n } else if (tool === 'reflectPoint') {\n transformDef = { kind: 'reflectPoint', center: pendingIds[1] };\n } else if (tool === 'dilate') {\n transformDef = { kind: 'dilate', k: value, center: pendingIds[1] };\n }\n if (!transformDef) return;\n\n // Tạo N transformed point + collect ids. Dispatch tuần tự (không gom vào\n // transaction) vì freshId/nextLabel cần đọc state đã commit để cấp id+label\n // không trùng. Trade-off: undo sẽ tách thành N+1 step thay vì 1.\n const newPointIds: string[] = [];\n for (const defId of defining) {\n const newId = freshId(ctx, 'p');\n const newLabel = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(newId, 'point', newLabel, {\n constraint: { kind: 'transformed', source: defId, transform: transformDef! },\n color: '#0ea5e9',\n }) },\n });\n newPointIds.push(newId);\n }\n // Tạo wrapper cùng kind từ N point mới (point thì không cần wrapper).\n recreateFromTransformedPoints(ctx, source, newPointIds);\n}\n\n/**\n * Dựng object cùng kind với source từ N point đã transform. Tuân thủ schema\n * attrs của kind tương ứng. Không hỗ trợ kind 'point' (đã có sẵn point biến\n * hình), 'intersection' / 'angle' / 'distance' (measurement — không có ý\n * nghĩa biến hình), 'circle' với construction circumscribed.\n */\nfunction recreateFromTransformedPoints(\n ctx: HandlerCtx,\n source: { kind: string; attrs: Record<string, unknown> },\n pointIds: string[],\n): void {\n const k = source.kind;\n if (k === 'point' || k === 'intersection') return; // point đơn đã có sẵn\n\n if (k === 'segment' && pointIds.length === 2) {\n const id = freshId(ctx, 's');\n const label = ctx.nextLabel('segment');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'segment', label, { p1: pointIds[0], p2: pointIds[1], color: '#0ea5e9' }) },\n });\n return;\n }\n if (k === 'line' && pointIds.length === 2) {\n const id = freshId(ctx, 'l');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, { p1: pointIds[0], p2: pointIds[1], color: '#0ea5e9' }) },\n });\n return;\n }\n if (k === 'ray' && pointIds.length === 2) {\n const id = freshId(ctx, 'r');\n const label = ctx.nextLabel('ray');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'ray', label, { origin: pointIds[0], through: pointIds[1], color: '#0ea5e9' }) },\n });\n return;\n }\n if (k === 'vector' && pointIds.length === 2) {\n const id = freshId(ctx, 'v');\n const label = ctx.nextLabel('vector');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'vector', label, { from: pointIds[0], to: pointIds[1], color: '#0ea5e9' }) },\n });\n return;\n }\n if (k === 'circle' && pointIds.length === 2) {\n const id = freshId(ctx, 'c');\n const label = ctx.nextLabel('circle');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'circle', label, { center: pointIds[0], surfacePoint: pointIds[1], color: '#0ea5e9' }) },\n });\n return;\n }\n if (k === 'polygon' && pointIds.length >= 3) {\n const id = freshId(ctx, 'poly');\n const label = ctx.nextLabel('polygon');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'polygon', label, { vertices: pointIds, color: '#0ea5e9' }) },\n });\n return;\n }\n // Other kinds (angle/distance/derived line constructions) — biến hình không\n // có ý nghĩa định nghĩa. Bỏ qua.\n}\n","import { objKind, type ToolDef } from '../../tools';\nimport type { HandlerCtx } from '../ctx';\nimport { dispatchAddFreePoint } from '../utils';\nimport { finalizeShape } from '../finalizeShape';\nimport { finalizeTransform } from '../transform';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport function handleMultiClickTool(\n ctx: HandlerCtx,\n toolDef: ToolDef,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n e: any,\n x: number,\n y: number,\n hits: JxgObj[],\n bestHit: JxgObj | null,\n): void {\n let pick: JxgObj | null = null;\n let pickId: string | null = null;\n\n if (toolDef.accepts) {\n // --- Mode A: strict, order-flexible ---\n const usedKinds = ctx.pendingRef.current.map((p) => objKind(p));\n const remaining: Array<'point' | 'line' | 'circle' | 'any' | 'lineOrCircle' | 'pointOrLine'> = [...toolDef.accepts];\n for (const u of usedKinds) {\n if (u === 'other') continue;\n // 'lineOrCircle' slot có thể được lấp bởi line hoặc circle.\n // 'pointOrLine' slot có thể được lấp bởi point hoặc line.\n let i = remaining.indexOf(u);\n if (i < 0 && (u === 'line' || u === 'circle')) i = remaining.indexOf('lineOrCircle');\n if (i < 0 && (u === 'point' || u === 'line')) i = remaining.indexOf('pointOrLine');\n if (i >= 0) remaining.splice(i, 1);\n }\n const strictPoint = hits.find((o) => objKind(o) === 'point') ?? null;\n const lineHit = hits.find((o) => objKind(o) === 'line') ?? null;\n const circleHit = hits.find((o) => objKind(o) === 'circle') ?? null;\n if (remaining.includes('point') && strictPoint) pick = strictPoint;\n else if (remaining.includes('line') && lineHit) pick = lineHit;\n else if (remaining.includes('circle') && circleHit) pick = circleHit;\n else if (remaining.includes('lineOrCircle') && (lineHit || circleHit)) {\n pick = lineHit ?? circleHit;\n }\n else if (remaining.includes('pointOrLine') && (strictPoint || lineHit)) {\n pick = strictPoint ?? lineHit;\n }\n else if (remaining.includes('any') && (strictPoint || lineHit || circleHit)) {\n pick = strictPoint ?? lineHit ?? circleHit;\n } else if (remaining.includes('point') || remaining.includes('pointOrLine')) {\n const near = ctx.findNearestPointJxg(e, 12);\n if (near) {\n pick = near;\n } else {\n // Mode A tool nhận 'point' / 'pointOrLine' + click khu vực rỗng → tự tạo\n // free point tại vị trí click. Đỡ cho user phải đổi sang tool 'point'\n // rồi quay lại (tangent / perpendicular / parallel / angleBisector ...).\n // Các slot khác (line/circle) vẫn yêu cầu hit object có sẵn.\n //\n // angleBisector: nếu lần click đầu đã là line thì cấm tạo free-point\n // (mode 2-line đã chốt) — handled by mode-consistency check phía dưới.\n //\n // pickId set trực tiếp từ return value của dispatchAddFreePoint vì\n // reverse-map (jxgIdToSceneRef) được rebuild qua store subscribe →\n // chưa sync xong tại thời điểm này; gọi jxgIdToSceneId(pick) sẽ ra null.\n if (toolDef.key === 'angleBisector' && ctx.pendingRef.current.length > 0\n && objKind(ctx.pendingRef.current[0]) === 'line') {\n ctx.flashWarn('Đã chọn đường — click thêm 1 đường/đoạn nữa để tạo 2 tia phân giác');\n return;\n }\n pickId = dispatchAddFreePoint(ctx, x, y);\n pick = ctx.jxgFromSceneId(pickId);\n }\n }\n if (!pick) {\n const needs = remaining.map((k) =>\n k === 'point' ? 'một điểm'\n : k === 'line' ? 'một đường/đoạn'\n : k === 'circle' ? 'một đường tròn'\n : k === 'lineOrCircle' ? 'một đường hoặc đường tròn'\n : k === 'pointOrLine' ? 'một điểm hoặc đường/đoạn'\n : 'một đối tượng',\n );\n ctx.flashWarn(`Còn cần click vào ${needs.join(' + ')} có sẵn`);\n return;\n }\n if (ctx.pendingRef.current.includes(pick)) {\n ctx.flashWarn('Đã chọn đối tượng này — chọn đối tượng khác');\n return;\n }\n // angleBisector: ép tính nhất quán mode (3-point ↔ 2-line) — không trộn lẫn.\n if (toolDef.key === 'angleBisector' && ctx.pendingRef.current.length > 0) {\n const firstKind = objKind(ctx.pendingRef.current[0]);\n const newKind = objKind(pick);\n if (firstKind === 'line' && newKind !== 'line') {\n ctx.flashWarn('Đã chọn đường — chỉ click thêm 1 đường/đoạn nữa');\n return;\n }\n if (firstKind === 'point' && newKind !== 'point') {\n ctx.flashWarn('Đã chọn điểm — click thêm điểm (đỉnh ở giữa)');\n return;\n }\n }\n if (!pickId) pickId = ctx.jxgIdToSceneId(pick);\n } else {\n // --- Mode B: lenient, all slots want a point ---\n const snapped = bestHit && objKind(bestHit) === 'point' ? bestHit : ctx.findNearestPointJxg(e, 12);\n if (snapped && ctx.pendingRef.current.includes(snapped)) {\n ctx.flashWarn('Đã chọn điểm này — chọn điểm khác hoặc click chỗ trống');\n return;\n }\n if (snapped) {\n pick = snapped;\n pickId = ctx.jxgIdToSceneId(snapped);\n } else {\n pickId = dispatchAddFreePoint(ctx, x, y);\n pick = ctx.jxgFromSceneId(pickId);\n }\n }\n\n if (!pick) return;\n ctx.pendingRef.current.push(pick);\n if (pickId) ctx.pendingIdsRef.current.push(pickId);\n ctx.setPendingCount(ctx.pendingIdsRef.current.length);\n\n // angleBisector 2-line mode: finalize ngay khi đủ 2 đường (không chờ 3 picks).\n if (toolDef.key === 'angleBisector'\n && ctx.pendingIdsRef.current.length === 2\n && objKind(ctx.pendingRef.current[0]) === 'line') {\n finalizeShape(ctx, toolDef);\n ctx.clearPending();\n return;\n }\n\n if (ctx.pendingIdsRef.current.length >= toolDef.needs) {\n const tk = toolDef.key;\n // 3 popover transform tools cần numeric input (góc / tỷ số / số cạnh) trước\n // khi finalize → emit info để MiniBoard show TransformParamPopover.\n if (tk === 'rotate' || tk === 'dilate' || tk === 'regularPolygon') {\n const cx = ((e.clientX ?? 0) as number) + 8;\n const cy = ((e.clientY ?? 0) as number) + 8;\n ctx.pendingTransformRef.current = {\n tool: tk,\n pendingIds: ctx.pendingIdsRef.current.slice(),\n anchorScreen: { x: cx, y: cy },\n };\n ctx.emitTransform({ tool: tk, anchor: { x: cx, y: cy } });\n // Don't clearPending — wait for confirm/cancel from MiniBoard.\n return;\n }\n // 3 no-popover transform tools (translate/reflectLine/reflectPoint):\n // finalize ngay khi đủ pick — không cần numeric param.\n if (tk === 'translate' || tk === 'reflectLine' || tk === 'reflectPoint') {\n finalizeTransform(ctx, tk, ctx.pendingIdsRef.current.slice(), 0);\n ctx.clearPending();\n return;\n }\n\n // Non-transform multi-click tools: dispatch ADD for the shape directly.\n finalizeShape(ctx, toolDef);\n ctx.clearPending();\n } else {\n ctx.refreshPreview();\n }\n}\n","import { objKind, TOOLS } from '../../tools';\nimport type { HandlerCtx } from '../ctx';\nimport { handleMoveTool } from './move';\nimport { handleSelectTool } from './select';\nimport { handlePointTool } from './point';\nimport { handleSingleTargetTool } from './singleTarget';\nimport { handlePolygonTool } from './polygon';\nimport { handleMultiClickTool } from './multiClick';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleDown(ctx: HandlerCtx, e: any): void {\n if (!ctx.boardRef.current) return;\n const t = ctx.toolRef.current;\n\n if (t === 'move') return handleMoveTool(ctx, e);\n if (t === 'select') return handleSelectTool(ctx, e);\n\n const toolDef = TOOLS.find((td) => td.key === t);\n if (!toolDef) return;\n\n const coords = ctx.boardRef.current.getUsrCoordsOfMouse(e);\n const x = coords[0], y = coords[1];\n\n // Detect if click hits any existing object (snap target).\n // Filter hits không có scene id (vd auxiliary points của 'regularpolygon' do\n // JSXGraph tự sinh — không có id trong renderer.elements, không thể dùng làm\n // pick cho tool). Nếu không filter, aux point sẽ cướp click khỏi border/edge\n // bên cạnh, làm tool perp/parallel/... đứng yên không tiến tới needs.\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y)\n .filter((o) => ctx.jxgIdToSceneId(o) != null);\n const bestHit = hits.find((o) => objKind(o) === 'point') ?? hits[0] ?? null;\n\n if (t === 'point') return handlePointTool(ctx, e, x, y, hits);\n if (handleSingleTargetTool(ctx, t, toolDef, e, bestHit)) return;\n if (handlePolygonTool(ctx, t, toolDef, e, x, y, bestHit)) return;\n\n handleMultiClickTool(ctx, toolDef, e, x, y, hits, bestHit);\n}\n","import { safeJsx } from '../../../shared/safeJsx';\nimport type { HandlerCtx } from './ctx';\n\n// ─── board.on('move') ────────────────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleMove(ctx: HandlerCtx, e: any): void {\n // Marquee rectangle redraw while user drags with the select tool on empty space.\n if (ctx.toolRef.current === 'select' && ctx.marqueeRef.current) {\n const sc = ctx.screenCoordsOf(e);\n if (sc && ctx.boardRef.current) {\n const [sx, sy] = sc;\n const { startSx, startSy } = ctx.marqueeRef.current;\n const b = ctx.boardRef.current;\n const ux1 = b.screenCoords2userCoords?.([Math.min(startSx, sx), Math.min(startSy, sy)]) ?? null;\n const ux2 = b.screenCoords2userCoords?.([Math.max(startSx, sx), Math.max(startSy, sy)]) ?? null;\n const toUsr = (px: number, py: number): [number, number] => {\n const ox = b.origin?.scrCoords?.[1] ?? 0;\n const oy = b.origin?.scrCoords?.[2] ?? 0;\n const ux = (px - ox) / b.unitX;\n const uy = (oy - py) / b.unitY;\n return [ux, uy];\n };\n const [x1u, y1u] = ux1 && ux1.length >= 2 ? [ux1[0], ux1[1]] : toUsr(Math.min(startSx, sx), Math.min(startSy, sy));\n const [x2u, y2u] = ux2 && ux2.length >= 2 ? [ux2[0], ux2[1]] : toUsr(Math.max(startSx, sx), Math.max(startSy, sy));\n const rect = ctx.marqueeRef.current.rect;\n if (rect) {\n safeJsx('handlers.removeObject(marquee.prevRect)', () => ctx.boardRef.current.removeObject(rect));\n }\n safeJsx('handlers.createMarqueePolygon', () => {\n ctx.marqueeRef.current!.rect = ctx.boardRef.current.create('polygon', [\n [x1u, y1u], [x2u, y1u], [x2u, y2u], [x1u, y2u],\n ], {\n fillColor: '#06b6d4', fillOpacity: 0.08,\n borders: { strokeColor: '#06b6d4', strokeWidth: 1, dash: 2 },\n vertices: { visible: false },\n fixed: true, highlight: false, withLabel: false,\n });\n });\n }\n return;\n }\n const ph = ctx.phantomRef.current;\n if (!ph || !ctx.boardRef.current) return;\n if (ctx.previewRafRef.current != null) return;\n ctx.previewRafRef.current = requestAnimationFrame(() => {\n ctx.previewRafRef.current = null;\n if (!ctx.boardRef.current || !ctx.phantomRef.current) return;\n safeJsx('handlers.phantomMove', () => {\n const coords = ctx.boardRef.current.getUsrCoordsOfMouse(e);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const JXG: any = ctx.jxgRef.current;\n if (!JXG) return;\n ctx.phantomRef.current.setPositionDirectly(JXG.COORDS_BY_USER, [coords[0], coords[1]]);\n ctx.boardRef.current.update();\n });\n });\n}\n","// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nimport { objKind } from '../tools';\nimport { safeJsx } from '../../../shared/safeJsx';\nimport type { HandlerCtx } from './ctx';\n\n// ─── board.on('up') ───────────────────────────────────────────────────────────\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleUp(ctx: HandlerCtx, e: any): void {\n const t = ctx.toolRef.current;\n if (t === 'select') {\n const mq = ctx.marqueeRef.current;\n ctx.marqueeRef.current = null;\n ctx.moveDownRef.current = null;\n if (!mq) return;\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [ex, ey] = sc;\n if (mq.rect) { safeJsx('handlers.removeObject(marquee.rect)', () => ctx.boardRef.current?.removeObject(mq.rect)); }\n if (Math.hypot(ex - mq.startSx, ey - mq.startSy) < 4) return; // not a real drag\n const x1 = Math.min(mq.startSx, ex), x2 = Math.max(mq.startSx, ex);\n const y1 = Math.min(mq.startSy, ey), y2 = Math.max(mq.startSy, ey);\n const board = ctx.boardRef.current;\n if (!board) return;\n const list = (board.objectsList || []) as JxgObj[];\n for (const o of list) {\n if (o === ctx.axisObjsRef.current.x || o === ctx.axisObjsRef.current.y) continue;\n const kind = objKind(o);\n if (kind === 'point') {\n const pc = o.coords?.scrCoords;\n if (!pc) continue;\n if (pc[1] >= x1 && pc[1] <= x2 && pc[2] >= y1 && pc[2] <= y2) {\n const sid = ctx.jxgIdToSceneId(o);\n if (sid && !ctx.selectedSetRef.current.has(sid)) {\n ctx.selectedSetRef.current.add(sid);\n }\n }\n } else if (kind === 'line' || kind === 'circle') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const defs: any[] = [o.point1, o.point2, o.center, o.midpoint, o.point3].filter(Boolean);\n const anyInside = defs.some((p) => {\n const pc = p?.coords?.scrCoords;\n return pc && pc[1] >= x1 && pc[1] <= x2 && pc[2] >= y1 && pc[2] <= y2;\n });\n if (anyInside) {\n const sid = ctx.jxgIdToSceneId(o);\n if (sid && !ctx.selectedSetRef.current.has(sid)) {\n ctx.selectedSetRef.current.add(sid);\n }\n }\n }\n }\n ctx.setSelectionTick((tt) => tt + 1);\n safeJsx('handlers.board.update(marquee)', () => board.update());\n return;\n }\n if (t !== 'move') return;\n const start = ctx.moveDownRef.current;\n ctx.moveDownRef.current = null;\n if (!start) return;\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n const moved = Math.hypot(sx - start.sx, sy - start.sy);\n if (moved > 4) return; // drag, không phải click\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y)\n .filter((o) => ctx.jxgIdToSceneId(o) != null);\n const best: JxgObj | null =\n hits.find((o) => objKind(o) === 'point') ?? ctx.findNearestPointJxg(e, 12) ?? hits[0] ?? null;\n if (!best) {\n ctx.lastMoveClickRef.current = { id: null, time: 0 };\n return;\n }\n const bestId = ctx.jxgIdToSceneId(best);\n const now = Date.now();\n const isDouble =\n bestId !== null && ctx.lastMoveClickRef.current.id === bestId && (now - ctx.lastMoveClickRef.current.time) < 400;\n ctx.lastMoveClickRef.current = { id: bestId, time: now };\n if (!isDouble) return;\n const cx = (e.clientX ?? e.touches?.[0]?.clientX ?? 0) as number;\n const cy = (e.clientY ?? e.touches?.[0]?.clientY ?? 0) as number;\n if (!bestId) return;\n ctx.emitSelect({ id: bestId, anchorScreen: { x: cx + 8, y: cy + 8 } });\n}\n","export { handleDown } from './pointerDown';\nexport { handleMove } from './pointerMove';\nexport { handleUp } from './pointerUp';\nexport { finalizeTransform } from './transform';\nexport type { HandlerCtx, TransformToolKey } from './ctx';\n","// src/stamps/geometry-2d/editor/hitTest.ts\nimport type { State, SceneObject } from '../../../core/scene';\nimport { listObjects } from '../../../core/scene';\nimport { safeJsx } from '../../shared/safeJsx';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\n/**\n * Tìm point gần (x, y) nhất trong state, trong vòng tol.\n *\n * Sử dụng `pointCoord(id) => [x, y] | null` để hit-test theo toạ độ JSXGraph\n * thực tế (resolve qua JxgRenderer Map). Trả về `null` nếu không có point nào\n * trong vòng tol.\n */\nexport function findNearestPoint(\n state: State,\n pointCoord: (id: string) => [number, number] | null,\n x: number,\n y: number,\n tolPx: number,\n excludeIds: Set<string> = new Set(),\n): SceneObject | null {\n let best: SceneObject | null = null;\n let bestDistSq = tolPx * tolPx;\n for (const obj of listObjects(state)) {\n if (obj.kind !== 'point' && obj.kind !== 'intersection') continue;\n if (excludeIds.has(obj.id)) continue;\n const coord = pointCoord(obj.id);\n if (!coord) continue;\n const dx = coord[0] - x;\n const dy = coord[1] - y;\n const d2 = dx * dx + dy * dy;\n if (d2 < bestDistSq) {\n bestDistSq = d2;\n best = obj;\n }\n }\n return best;\n}\n\n/**\n * Lấy screen coords (x, y px) của event dưới cursor. Ưu tiên JSXGraph's\n * `getMousePosition`; fallback về container's getBoundingClientRect (cần cho\n * touch event hoặc khi board chưa cache mouse position).\n */\nexport function screenCoordsOf(\n board: JxgObj,\n container: HTMLElement | null,\n evt: JxgObj,\n): [number, number] | null {\n if (!board) return null;\n try {\n const mp = board.getMousePosition ? board.getMousePosition(evt) : null;\n if (mp && mp.length >= 2) return [mp[0], mp[1]];\n } catch { /* fall through to container rect */ }\n if (container) {\n const rect = container.getBoundingClientRect();\n const cx = evt.clientX ?? evt.touches?.[0]?.clientX ?? 0;\n const cy = evt.clientY ?? evt.touches?.[0]?.clientY ?? 0;\n return [cx - rect.left, cy - rect.top];\n }\n return null;\n}\n\n/**\n * List JSXGraph objects whose `hasPoint(sx, sy)` chứa cursor — đã loại\n * `excludes` (vd phantom + preview shape + preview segments).\n *\n * Phantom là invisible point JSXGraph kéo theo cursor để dựng live-preview;\n * nếu không loại trừ, click chỗ trống sẽ snap trúng phantom (cách click 0px)\n * → drawing \"đứng\" vì pendingRef nhét phantom (không có scene id), tool\n * không tiến tới được `needs` threshold. (Regression từ commit 95a6c13.)\n */\nexport function objectsAt(\n board: JxgObj,\n container: HTMLElement | null,\n evt: JxgObj,\n excludes: Iterable<JxgObj>,\n): JxgObj[] {\n const sc = screenCoordsOf(board, container, evt);\n if (!board || !sc) return [];\n const [sx, sy] = sc;\n const excludeSet = new Set<JxgObj>();\n for (const e of excludes) if (e) excludeSet.add(e);\n const out: JxgObj[] = [];\n safeJsx('hitTest.objectsAt', () => {\n for (const o of (board.objectsList || [])) {\n if (excludeSet.has(o)) continue;\n if (o && typeof o.hasPoint === 'function' && o.hasPoint(sx, sy)) out.push(o);\n }\n });\n return out;\n}\n\n/**\n * Tìm JSXGraph point gần cursor (trong `tolPx` pixels). Dùng `findNearestPoint`\n * với `pointCoord` đọc từ JSXGraph's `coords.scrCoords` qua resolver `jxgFromSceneId`.\n * Trả JSXGraph object (không phải scene id) để caller dùng làm pick.\n */\nexport function findNearestJxgPoint(\n board: JxgObj,\n container: HTMLElement | null,\n state: State,\n jxgFromSceneId: (id: string) => JxgObj | null,\n evt: JxgObj,\n tolPx = 12,\n): JxgObj | null {\n const sc = screenCoordsOf(board, container, evt);\n if (!board || !sc) return null;\n const [sx, sy] = sc;\n const pointCoord = (id: string): [number, number] | null => {\n const j = jxgFromSceneId(id);\n const sc2 = j?.coords?.scrCoords;\n return sc2 ? [sc2[1], sc2[2]] : null;\n };\n const result = findNearestPoint(state, pointCoord, sx, sy, tolPx);\n return result ? jxgFromSceneId(result.id) : null;\n}\n\n/**\n * Khi user click trúng label text của một element, JSXGraph trả về text obj\n * thay vì owner. Promote về owner để properties popover hiển thị đúng\n * properties của shape, không phải của text.\n */\nexport function promoteToLabelOwner(board: JxgObj, o: JxgObj): JxgObj {\n if (!o) return o;\n const t = (o.elType || o.type || '').toString().toLowerCase();\n if (t !== 'text' || !board) return o;\n const promoted = safeJsx<JxgObj | null>('hitTest.promoteToLabelOwner', () => {\n for (const c of (board.objectsList || [])) {\n if (c.label === o) return c;\n }\n return null;\n }, null);\n return promoted ?? o;\n}\n","import { useCallback, useRef, useState } from 'react';\n\nexport type ToolStateMachine<T extends string> = {\n tool: T;\n pendingIds: string[];\n toolRef: { readonly current: T };\n pendingIdsRef: { readonly current: string[] };\n setTool: (t: T) => void;\n pushPending: (id: string) => void;\n clearPending: () => void;\n};\n\n/**\n * Tool + pending ids state machine, generic theo tool union type.\n *\n * - `setTool` clears pending — chuyển tool đang xây thì huỷ build dở.\n * - Ref + state song song để handler stable-closure read được giá trị mới\n * mà UI vẫn re-render khi giá trị đổi.\n *\n * Shared cho geometry-2d (`GeomTool`) và graph-2d (`GraphTool`); thêm consumer\n * mới chỉ cần pass union literal type.\n */\nexport function useToolStateMachine<T extends string>(initial: T): ToolStateMachine<T> {\n const [tool, setToolState] = useState<T>(initial);\n const [pendingIds, setPendingIds] = useState<string[]>([]);\n const toolRef = useRef<T>(initial);\n const pendingIdsRef = useRef<string[]>([]);\n\n const setTool = useCallback((t: T) => {\n toolRef.current = t;\n pendingIdsRef.current = [];\n setToolState(t);\n setPendingIds([]);\n }, []);\n\n const pushPending = useCallback((id: string) => {\n pendingIdsRef.current = [...pendingIdsRef.current, id];\n setPendingIds(pendingIdsRef.current);\n }, []);\n\n const clearPending = useCallback(() => {\n pendingIdsRef.current = [];\n setPendingIds([]);\n }, []);\n\n return { tool, pendingIds, toolRef, pendingIdsRef, setTool, pushPending, clearPending };\n}\n","import { safeJsx } from './safeJsx';\n\n/**\n * Minimal JSXGraph board surface that wheel-zoom logic depends on.\n * Local shape to avoid importing the (untyped) jsxgraph default export here.\n */\nexport interface JxgBoardZoomable {\n zoomIn: (x?: number, y?: number) => void;\n zoomOut: (x?: number, y?: number) => void;\n // JSXGraph older versions may not expose this — wheel still works, just\n // without cursor-anchored zoom (falls back to board-center).\n getUsrCoordsOfMouse?: (e: WheelEvent) => unknown;\n}\n\n/**\n * Attach Excalidraw-style Ctrl/Cmd + wheel zoom to a container element.\n *\n * - Khi wheel kèm Ctrl/Cmd: preventDefault + zoom in/out với anchor tại\n * con trỏ (nếu board hỗ trợ `getUsrCoordsOfMouse`).\n * - Khi wheel không kèm modifier: bỏ qua → page scroll bình thường.\n *\n * Returns cleanup fn. Caller chịu trách nhiệm gọi trong cleanup của useEffect.\n *\n * @param target Container element (`HTMLDivElement` hoặc `SVGSVGElement`).\n * @param board JSXGraph board instance đã initBoard xong.\n * @param label Tag để log dev-mode khi safeJsx swallow lỗi (vd \"MiniBoard.2d\").\n */\nexport function attachJxgWheelZoom(\n target: HTMLElement,\n board: JxgBoardZoomable,\n label = 'wheelZoom',\n): () => void {\n const onWheel = (e: WheelEvent): void => {\n if (!e.ctrlKey && !e.metaKey) return;\n e.preventDefault();\n e.stopPropagation();\n let cx: number | undefined;\n let cy: number | undefined;\n safeJsx(`${label}.coords`, () => {\n const usr = board.getUsrCoordsOfMouse?.(e);\n if (Array.isArray(usr) && usr.length >= 2\n && Number.isFinite(usr[0]) && Number.isFinite(usr[1])) {\n cx = usr[0] as number;\n cy = usr[1] as number;\n }\n });\n if (e.deltaY < 0) safeJsx(`${label}.in`, () => board.zoomIn(cx, cy));\n else if (e.deltaY > 0) safeJsx(`${label}.out`, () => board.zoomOut(cx, cy));\n };\n target.addEventListener('wheel', onWheel, { passive: false });\n return () => { target.removeEventListener('wheel', onWheel); };\n}\n","import { safeJsx } from './safeJsx';\n\n/**\n * Toggles cho common JSXGraph options. Per-stamp callsite override mặc định\n * nếu cần preserve behavior cụ thể.\n *\n * Mặc định:\n * - text.display = 'internal' (true) — bắt buộc cho clone-SVG export.\n * - text.useASCII/MathJax/Katex = false (true) — JSXGraph default rendering,\n * không load extra text engine.\n * - label.display = 'internal' (true) — point label vào trong SVG.\n * - elements.highlight = false (FALSE mặc định) — opt-in vì graph-2d cần\n * JSXGraph's default hover-highlight để phân biệt object đang hover.\n */\nexport interface JxgInitDefaults {\n textDisplayInternal?: boolean;\n disableTextEngines?: boolean;\n labelDisplayInternal?: boolean;\n disableElementHighlight?: boolean;\n}\n\nexport interface InitJxgBoardConfig {\n /** Per-MiniBoard toggle cho common defaults. */\n defaults?: JxgInitDefaults;\n /** Options pass thẳng vào `JXG.JSXGraph.initBoard(target, opts)`. */\n boardOptions: Record<string, unknown>;\n /**\n * Hook để tweak options sau khi defaults được apply. Dùng cho per-stamp\n * customization (vd themeLabel color cho 2D, axesPosition cho 3D view3d).\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n extraOptionTweaks?: (opts: any) => void;\n /** Tag cho safeJsx log (vd \"MiniBoard.2d\"). Default: \"JxgBoard\". */\n label?: string;\n}\n\nexport interface InitJxgBoardResult {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n JXG: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n board: any;\n /** Gọi để free JSXGraph board (safe-wrapped). */\n cleanup: () => void;\n}\n\n/**\n * Async dynamic-import JSXGraph + apply common options + initBoard + trả\n * cleanup. Centralize boilerplate shared bởi 3 MiniBoard (2D/3D/graph-2d).\n *\n * Caller vẫn handle cancellation flag, refs, và post-init setup (renderer,\n * view3d, axes, etc.) ngoài helper này.\n *\n * @throws Nếu JSXGraph load hoặc initBoard throw. Caller nên try/catch nếu\n * cần tolerate mock environments.\n */\nexport async function initJxgBoard(\n target: string | HTMLElement,\n config: InitJxgBoardConfig,\n): Promise<InitJxgBoardResult> {\n const label = config.label ?? 'JxgBoard';\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const JXG = (await import('jsxgraph')).default as any;\n const {\n textDisplayInternal = true,\n disableTextEngines = true,\n labelDisplayInternal = true,\n disableElementHighlight = false,\n } = config.defaults ?? {};\n safeJsx(`${label}.applyOptions`, () => {\n const opts = JXG.Options;\n if (!opts) return;\n if (textDisplayInternal || disableTextEngines) {\n opts.text = opts.text ?? {};\n if (textDisplayInternal) opts.text.display = 'internal';\n if (disableTextEngines) {\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n }\n }\n if (labelDisplayInternal) {\n opts.label = opts.label ?? {};\n opts.label.display = 'internal';\n }\n if (disableElementHighlight) {\n opts.elements = opts.elements ?? {};\n opts.elements.highlight = false;\n }\n config.extraOptionTweaks?.(opts);\n });\n const board = JXG.JSXGraph.initBoard(target, config.boardOptions);\n const cleanup = (): void => {\n safeJsx(`${label}.freeBoard`, () => JXG.JSXGraph.freeBoard(board));\n };\n return { JXG, board, cleanup };\n}\n","import type { State } from '../../../core/scene';\nimport type { ObjectSnapshot } from './MiniBoard.types';\n\n/**\n * Build snapshot từ scene object để PropertiesPopover render. Trả null nếu\n * object kind không hỗ trợ properties panel (vd polygon, angle, …).\n *\n * Pure function — không touch board/JSXGraph state. Caller pass anchorScreen\n * (vị trí pixel mà popover sẽ hiển thị).\n */\nexport function buildObjectSnapshot(\n state: State,\n id: string,\n anchorScreen: { x: number; y: number },\n): ObjectSnapshot | null {\n const obj = state.objects[id];\n if (!obj) return null;\n const k = obj.kind;\n if (k !== 'point' && k !== 'line' && k !== 'circle' && k !== 'segment' && k !== 'ray' && k !== 'vector') {\n return null;\n }\n const a = obj.attrs as Record<string, unknown>;\n const jKind: 'point' | 'line' | 'circle' = k === 'point' ? 'point' : (k === 'circle' ? 'circle' : 'line');\n return {\n id,\n kind: jKind,\n name: obj.label,\n color: (a.color as string) ?? '#0f172a',\n width: (a.width as number) ?? 2,\n dash: (a.dash as number) ?? 0,\n face: (a.face as ObjectSnapshot['face']) ?? 'o',\n showLabel: (a.showLabel as boolean) ?? true,\n showValue: (a.showValue as boolean) ?? false,\n screenCoords: anchorScreen,\n };\n}\n","// Pure preview-shape factory cho 2D editor — không component state, không\n// React. Dùng bởi MiniBoard.tsx `refreshPreview` mỗi khi user thay đổi\n// pending picks. Mirror legacy live-preview (commit ce78521), tách khỏi\n// MiniBoard.tsx để giảm size component file.\n\nimport { safeJsx } from '../../shared/safeJsx';\nimport { objKind, type ToolDef } from './tools';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nconst PREVIEW_STYLE: Record<string, unknown> = {\n strokeColor: '#3b82f6',\n strokeWidth: 1.5,\n strokeOpacity: 0.65,\n dash: 2,\n fixed: true,\n highlight: false,\n withLabel: false,\n};\n\nconst CIRCLE_PREVIEW_STYLE: Record<string, unknown> = {\n ...PREVIEW_STYLE,\n fillColor: 'none',\n fillOpacity: 0,\n};\n\n/**\n * Build transient JSXGraph object để live-preview shape user đang dựng. Trả\n * `null` khi:\n * - Tool không phải shape-tool (vd select/move).\n * - Số pick chưa đủ cho preview cụ thể.\n * - Pick types không hợp lệ với tool (vd perpendicular cần line input).\n *\n * Tất cả create calls wrap trong safeJsx để swallow exception từ JSXGraph\n * khi state stale (vd board destroyed giữa chừng).\n */\nexport function buildPreviewShape(\n board: JxgObj,\n toolDef: ToolDef,\n picks: JxgObj[],\n phantom: JxgObj,\n): JxgObj {\n if (!board) return null;\n return safeJsx<JxgObj>('preview.buildPreviewShape', () => {\n switch (toolDef.key) {\n case 'segment':\n case 'midpoint':\n case 'distance':\n return board.create('segment', [picks[0], phantom], PREVIEW_STYLE);\n case 'line':\n return board.create('line', [picks[0], phantom], PREVIEW_STYLE);\n case 'ray':\n return board.create('line', [picks[0], phantom], {\n ...PREVIEW_STYLE,\n straightFirst: false,\n straightLast: true,\n });\n case 'vector':\n return board.create('arrow', [picks[0], phantom], PREVIEW_STYLE);\n case 'circleCenter':\n return board.create('circle', [picks[0], phantom], CIRCLE_PREVIEW_STYLE);\n case 'circle3':\n if (picks.length === 1) return board.create('circle', [picks[0], phantom], CIRCLE_PREVIEW_STYLE);\n if (picks.length === 2) {\n return board.create('circumcircle', [picks[0], picks[1], phantom], CIRCLE_PREVIEW_STYLE);\n }\n return null;\n case 'angle':\n if (picks.length === 1) return board.create('segment', [picks[0], phantom], PREVIEW_STYLE);\n if (picks.length === 2) {\n return board.create('angle', [picks[0], picks[1], phantom], {\n ...PREVIEW_STYLE,\n radius: 1,\n fillColor: '#22c55e',\n fillOpacity: 0.15,\n });\n }\n return null;\n case 'perpBisector':\n return board.create('segment', [picks[0], phantom], PREVIEW_STYLE);\n case 'angleBisector':\n if (picks.length === 1) return board.create('segment', [picks[0], phantom], PREVIEW_STYLE);\n if (picks.length === 2) return board.create('bisector', [picks[0], picks[1], phantom], PREVIEW_STYLE);\n return null;\n case 'perpendicular':\n case 'parallel':\n case 'tangent': {\n if (picks.length !== 1) return null;\n const k = objKind(picks[0]);\n if (k === 'line' && toolDef.key !== 'tangent') {\n return board.create(toolDef.key, [picks[0], phantom], PREVIEW_STYLE);\n }\n if (k === 'circle' && toolDef.key === 'tangent') {\n const glider = board.create('glider', [phantom.X(), phantom.Y(), picks[0]], {\n visible: false,\n withLabel: false,\n });\n return board.create('tangent', [glider], PREVIEW_STYLE);\n }\n return null;\n }\n default:\n return null;\n }\n }, null);\n}\n\n/**\n * Tạo phantom point (invisible, fixed) làm endpoint kéo theo cursor cho\n * live-preview. Trả `null` nếu board không sẵn sàng (mock/test path).\n */\nexport function createPhantomPoint(board: JxgObj): JxgObj {\n if (!board) return null;\n return safeJsx<JxgObj>('preview.createPhantomPoint', () => board.create('point', [0, 0], {\n visible: false,\n fixed: true,\n withLabel: false,\n name: '',\n }), null);\n}\n","import { safeJsx } from '../../shared/safeJsx';\nimport { buildPreviewShape, createPhantomPoint } from './preview';\nimport { TOOLS } from './tools';\nimport type { ToolStateMachine } from '../../shared/useToolStateMachine';\nimport type { GeomTool } from './tools';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport interface PreviewRefs {\n previewSegRef: { current: JxgObj[] };\n phantomRef: { current: JxgObj };\n previewShapeRef: { current: JxgObj };\n pendingRef: { current: JxgObj[] };\n}\n\n/**\n * Xoá tất cả preview segment objects (preview vertex-by-vertex của polygon\n * tool). Reset previewSegRef.current về mảng rỗng.\n */\nexport function clearPreviewSegs(\n board: JxgObj,\n previewSegRef: { current: JxgObj[] },\n): void {\n if (!board) return;\n for (const s of previewSegRef.current) {\n safeJsx('previewActions.removePreviewSeg', () => board.removeObject(s));\n }\n previewSegRef.current = [];\n}\n\n/**\n * Xoá phantom point + preview shape (cả 2 đều transient, không nằm trong\n * scene store). Phantom là invisible point JSXGraph theo cursor; preview\n * shape là live-preview của shape user đang dựng.\n */\nexport function removePhantom(\n board: JxgObj,\n refs: { previewShapeRef: { current: JxgObj }; phantomRef: { current: JxgObj } },\n): void {\n if (!board) return;\n if (refs.previewShapeRef.current) {\n safeJsx('previewActions.removePreviewShape', () => board.removeObject(refs.previewShapeRef.current));\n refs.previewShapeRef.current = null;\n }\n if (refs.phantomRef.current) {\n safeJsx('previewActions.removePhantom', () => board.removeObject(refs.phantomRef.current));\n refs.phantomRef.current = null;\n }\n}\n\n/**\n * Tear down old preview shape và build fresh từ current picks + phantom.\n * Phantom được tạo lazily — không spawn hidden point trước khi user có ít\n * nhất 1 real pick. Skip nếu tool variable-length (polygon: needs === -1)\n * vì handlers.ts emit per-vertex segments riêng qua previewSegRef.\n */\nexport function refreshPreviewShape(\n board: JxgObj,\n toolSM: ToolStateMachine<GeomTool>,\n refs: PreviewRefs,\n): void {\n if (!board) return;\n if (refs.previewShapeRef.current) {\n safeJsx('previewActions.removePreviewShape', () => board.removeObject(refs.previewShapeRef.current));\n refs.previewShapeRef.current = null;\n }\n const t = toolSM.toolRef.current;\n const toolDef = TOOLS.find((td) => td.key === t);\n if (!toolDef) return;\n const picks = refs.pendingRef.current;\n if (picks.length === 0 || toolDef.needs <= 0) return;\n if (picks.length >= toolDef.needs) return;\n if (!refs.phantomRef.current) {\n refs.phantomRef.current = createPhantomPoint(board);\n if (!refs.phantomRef.current) return;\n }\n refs.previewShapeRef.current = buildPreviewShape(board, toolDef, picks, refs.phantomRef.current);\n}\n","import type { Store } from '../../../core/scene/store';\n\nexport interface MutatePatch {\n attrs?: Record<string, unknown>;\n remove?: boolean;\n}\n\n/**\n * Áp patch từ PropertiesPopover lên scene store.\n *\n * PropertiesPopover phát attrs theo tên JSXGraph (strokeColor, strokeWidth,\n * withLabel, name, …). Scene attrs dùng tên ngắn gọn (color, width,\n * showLabel, …) và `label` là field top-level của SceneObject (không nằm\n * trong attrs). Map ở đây để popover khỏi cần biết shape của scene.\n *\n * - `remove: true` → dispatch DELETE.\n * - `attrs.name` (string) → dispatch UPDATE với `label` patch.\n * - JSXGraph attr names → scene names (strokeColor → color, strokeWidth →\n * width, withLabel → showLabel). `fillColor` cũng map sang `color` (fallback\n * khi popover không truyền strokeColor).\n */\nexport function applyMutatePatch(store: Store, id: string, patch: MutatePatch): void {\n if (patch.remove) {\n store.dispatch({ type: 'DELETE', payload: { id } });\n return;\n }\n if (!patch.attrs) return;\n const { name, withLabel, strokeColor, fillColor, strokeWidth, ...rest } = patch.attrs as {\n name?: unknown;\n withLabel?: unknown;\n strokeColor?: unknown;\n fillColor?: unknown;\n strokeWidth?: unknown;\n [k: string]: unknown;\n };\n if (typeof name === 'string') {\n store.dispatch({ type: 'UPDATE', payload: { id, patch: { label: name } } });\n }\n const mapped: Record<string, unknown> = { ...rest };\n // strokeColor / fillColor cùng đại diện cho cùng 1 thuộc tính `color` ở\n // scene. PropertiesPopover thường thêm sẵn `color` cùng strokeColor —\n // ưu tiên `color` (đã có trong rest); fallback strokeColor → fillColor.\n if (strokeColor !== undefined && mapped.color === undefined) mapped.color = strokeColor;\n if (fillColor !== undefined && mapped.color === undefined) mapped.color = fillColor;\n if (strokeWidth !== undefined && mapped.width === undefined) mapped.width = strokeWidth;\n if (withLabel !== undefined && mapped.showLabel === undefined) mapped.showLabel = withLabel;\n if (Object.keys(mapped).length > 0) {\n store.dispatch({ type: 'UPDATE_ATTRS', payload: { id, patch: mapped } });\n }\n}\n","import { listObjects } from '../../../core/scene';\nimport type { Store } from '../../../core/scene/store';\nimport type { JxgRenderer } from '../../../core/scene/render/JxgRenderer';\nimport { safeJsx } from '../../shared/safeJsx';\nimport { applyMutatePatch } from './attrMapping';\nimport { finalizeTransform, type HandlerCtx, type TransformToolKey } from './handlers';\nimport type {\n MiniBoardHandle,\n ObjectSnapshot,\n SelectionStateSnapshot,\n TransformPopoverInfo,\n} from './MiniBoard.types';\nimport { buildObjectSnapshot } from './snapshot';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\nexport interface BuildHandleDeps {\n // refs\n containerRef: { readonly current: HTMLDivElement | null };\n boardRef: { readonly current: JxgObj };\n rendererRef: { readonly current: JxgRenderer | null };\n selectSubsRef: { readonly current: Set<(snap: ObjectSnapshot) => void> };\n transformSubsRef: { readonly current: Set<(info: TransformPopoverInfo) => void> };\n selectionStateSubsRef: { readonly current: Set<(snap: SelectionStateSnapshot | null) => void> };\n selectedSetRef: { readonly current: Set<string> };\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pendingTransformRef: { current: any };\n ctxRef: { readonly current: HandlerCtx | null };\n // callbacks / values\n store: Store;\n clearPending: () => void;\n clearSelection: () => void;\n deleteSelection: () => void;\n emitTransform: (info: TransformPopoverInfo) => void;\n}\n\n/**\n * Build MiniBoardHandle object cho `useImperativeHandle`. Methods read refs\n * trực tiếp nên handle có thể tạo trước khi board boot xong; gọi method\n * trước onReady?.() có thể trả stale refs.\n *\n * Tách ra file riêng để giảm size MiniBoard.tsx — handle có 25+ methods,\n * chiếm ~60 dòng object literal.\n */\nexport function buildMiniBoardHandle(d: BuildHandleDeps): MiniBoardHandle {\n return {\n getContainer: () => d.containerRef.current,\n getBbox: () => d.boardRef.current?.getBoundingBox() ?? [-10, 10, 10, -10],\n getState: () => d.store.getState(),\n getStore: () => d.store,\n highlight: (id) => { d.rendererRef.current?.highlight(id); },\n snapshotObject: (id, anchorScreen) => buildObjectSnapshot(d.store.getState(), id, anchorScreen),\n mutateObject: (id, patch) => applyMutatePatch(d.store, id, patch),\n getAllPointNames: () => listObjects(d.store.getState())\n .filter((o) => o.kind === 'point' || o.kind === 'intersection')\n .map((o) => o.label),\n onSelect: (cb) => {\n d.selectSubsRef.current.add(cb);\n return () => { d.selectSubsRef.current.delete(cb); };\n },\n onTransformParam: (cb) => {\n d.transformSubsRef.current.add(cb);\n return () => { d.transformSubsRef.current.delete(cb); };\n },\n onSelectionState: (cb) => {\n d.selectionStateSubsRef.current.add(cb);\n return () => { d.selectionStateSubsRef.current.delete(cb); };\n },\n confirmTransformParam: (value: number) => {\n const info = d.pendingTransformRef.current as\n | { tool: TransformToolKey; pendingIds: string[]; anchorScreen: { x: number; y: number } }\n | null;\n if (info && d.ctxRef.current) {\n safeJsx('buildHandle.finalizeTransform', () =>\n finalizeTransform(d.ctxRef.current!, info.tool, info.pendingIds, value),\n );\n }\n d.pendingTransformRef.current = null;\n d.emitTransform(null);\n d.clearPending();\n },\n cancelTransformParam: () => {\n d.pendingTransformRef.current = null;\n d.emitTransform(null);\n d.clearPending();\n },\n getSelectionSize: () => d.selectedSetRef.current.size,\n clearSelection: d.clearSelection,\n deleteSelection: d.deleteSelection,\n };\n}\n","import type { JxgRenderer } from '../../../core/scene/render/JxgRenderer';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\n/**\n * Resolve scene id → JSXGraph object qua renderer's elements map.\n *\n * Synthetic \"<polyId>:border:<N>\" → polygon.borders[N]: cho phép preview\n * shape của tool perpendicular/parallel/tangent kéo theo cạnh đa giác làm\n * parent (border là sub-segment auto-tạo, không có scene id riêng).\n */\nexport function jxgFromSceneId(renderer: JxgRenderer | null, id: string): JxgObj {\n if (!renderer) return null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const elements = (renderer as any).elements as Map<string, JxgObj> | undefined;\n if (!elements) return null;\n const m = /^(.+):border:(\\d+)$/.exec(id);\n if (m) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const poly = elements.get(m[1]) as any;\n const idx = parseInt(m[2], 10);\n const borders = poly?.borders;\n if (Array.isArray(borders) && borders[idx]) return borders[idx];\n return null;\n }\n return elements.get(id) ?? null;\n}\n\n/**\n * Resolve JSXGraph object → scene id. Trước hết check reverse-map (cached),\n * sau đó dò polygon borders để trả synthetic \"<polyId>:border:<idx>\" cho\n * construct tools dùng cạnh đa giác như line input.\n */\nexport function jxgIdToSceneId(\n renderer: JxgRenderer | null,\n idMap: Map<string, string>,\n jxgObj: JxgObj,\n): string | null {\n if (!jxgObj?.id) return null;\n const direct = idMap.get(String(jxgObj.id));\n if (direct) return direct;\n if (!renderer) return null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const elements = (renderer as any).elements as Map<string, JxgObj> | undefined;\n if (!elements) return null;\n // Direct fallback: idMap rebuild qua store.subscribe có thể chạy TRƯỚC\n // JxgRenderer subscriber (cùng store, đăng ký theo order useEffect), nên\n // idMap luôn thiếu entry của object vừa được renderer tạo trong dispatch\n // hiện tại. Walk renderer.elements để bù.\n for (const [sid, el] of elements) {\n if (el === jxgObj) return sid;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const borders = (el as any)?.borders;\n if (Array.isArray(borders)) {\n const idx = borders.indexOf(jxgObj);\n if (idx >= 0) return `${sid}:border:${idx}`;\n }\n }\n return null;\n}\n","import { useEffect } from 'react';\nimport { safeJsx } from '../../shared/safeJsx';\nimport { themeAxis, themeGrid } from './theme';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\ninterface Params {\n boardRef: { readonly current: JxgObj };\n /** Refs giữ axis x/y JSXGraph objects để cleanup khi toggle off. */\n axisObjsRef: { current: { x?: JxgObj; y?: JxgObj } };\n isDarkRef: { readonly current: boolean };\n showAxis: boolean;\n showGrid: boolean;\n}\n\n/**\n * Sync hiển thị axis + grid khi user toggle qua LeftPanel.\n *\n * - Axis: tự tạo/xoá 2 axis object qua `boardRef.current.create('axis', ...)`.\n * - Grid: xoá grid cũ trong `board.objects` rồi tạo mới khi enable. Match\n * theme color (axis/grid) theo `isDarkRef.current`.\n *\n * Mỗi effect chạy độc lập theo `showAxis` / `showGrid` để switch nhanh\n * không re-do cả 2 mỗi lần toggle 1.\n */\nexport function useAxisGridSync({\n boardRef,\n axisObjsRef,\n isDarkRef,\n showAxis,\n showGrid,\n}: Params): void {\n useEffect(() => {\n const b = boardRef.current;\n if (!b) return;\n safeJsx('useAxisGridSync.toggleAxis', () => {\n if (axisObjsRef.current.x) {\n safeJsx('useAxisGridSync.removeAxisX', () => b.removeObject(axisObjsRef.current.x));\n axisObjsRef.current.x = undefined;\n }\n if (axisObjsRef.current.y) {\n safeJsx('useAxisGridSync.removeAxisY', () => b.removeObject(axisObjsRef.current.y));\n axisObjsRef.current.y = undefined;\n }\n if (showAxis) {\n axisObjsRef.current.x = b.create('axis', [[0, 0], [1, 0]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n axisObjsRef.current.y = b.create('axis', [[0, 0], [0, 1]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n }\n b.update();\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [showAxis]);\n\n useEffect(() => {\n const b = boardRef.current;\n if (!b) return;\n safeJsx('useAxisGridSync.toggleGrid', () => {\n for (const o of Object.values(b.objects || {}) as JxgObj[]) {\n if (o && (o.elType === 'grid' || o.type === 'grid' || (o.visProp && o.visProp.type === 'grid'))) {\n safeJsx('useAxisGridSync.removeGrid', () => b.removeObject(o));\n }\n }\n if (showGrid) b.create('grid', [], { strokeColor: themeGrid(isDarkRef.current), strokeOpacity: 1 });\n b.update();\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [showGrid]);\n}\n","import { useEffect } from 'react';\nimport type { Store } from '../../../core/scene/store';\n\ninterface Params {\n store: Store;\n /** Pending picks (chưa commit) — Esc xoá khi length > 0. */\n pendingIdsRef: { readonly current: string[] };\n /** Current selection ids — Esc/Delete/Backspace act on. */\n selectedSetRef: { readonly current: Set<string> };\n clearPending: () => void;\n clearSelection: () => void;\n deleteSelection: () => void;\n}\n\n/**\n * Capture-phase keyboard shortcuts cho 2D editor:\n *\n * - Ctrl/Cmd+Z → undo\n * - Ctrl/Cmd+Shift+Z / Ctrl/Cmd+Y → redo\n * - Esc → clear pending picks + clear selection\n * - Delete/Backspace → delete selection\n *\n * Capture phase + stopPropagation để win với Excalidraw's bubble handlers\n * (vốn nắm các phím tương tự). Ignore khi focus đang ở input/textarea/contentEditable.\n */\nexport function useEditorShortcuts({\n store,\n pendingIdsRef,\n selectedSetRef,\n clearPending,\n clearSelection,\n deleteSelection,\n}: Params): void {\n useEffect(() => {\n const onKey = (e: KeyboardEvent): void => {\n const ae = document.activeElement as HTMLElement | null;\n const inField = !!(ae && (ae.tagName === 'INPUT' || ae.tagName === 'TEXTAREA' || ae.isContentEditable));\n const lk = e.key.toLowerCase();\n if ((e.metaKey || e.ctrlKey) && lk === 'z' && !e.shiftKey) {\n if (inField) return;\n e.preventDefault(); e.stopPropagation(); store.undo(); return;\n }\n if ((e.metaKey || e.ctrlKey) && ((lk === 'z' && e.shiftKey) || (lk === 'y' && !e.shiftKey))) {\n if (inField) return;\n e.preventDefault(); e.stopPropagation(); store.redo(); return;\n }\n if (e.key === 'Escape' && !inField) {\n if (pendingIdsRef.current.length > 0) {\n e.preventDefault(); e.stopPropagation(); clearPending();\n }\n if (selectedSetRef.current.size > 0) {\n e.preventDefault(); e.stopPropagation(); clearSelection();\n }\n }\n if ((e.key === 'Delete' || e.key === 'Backspace') && !inField && selectedSetRef.current.size > 0) {\n e.preventDefault(); e.stopPropagation(); deleteSelection();\n }\n };\n window.addEventListener('keydown', onKey, { capture: true });\n return () => window.removeEventListener('keydown', onKey, { capture: true });\n }, [store, pendingIdsRef, selectedSetRef, clearPending, clearSelection, deleteSelection]);\n}\n","import { useEffect, useRef } from 'react';\nimport type { Store } from '../../../core/scene/store';\nimport type { JxgRenderer } from '../../../core/scene/render/JxgRenderer';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype JxgObj = any;\n\ninterface Params {\n store: Store;\n rendererRef: { readonly current: JxgRenderer | null };\n}\n\ninterface Result {\n /** Reverse map: JSXGraph internal id (string) → scene id. */\n jxgIdToSceneRef: { readonly current: Map<string, string> };\n}\n\n/**\n * Maintain a reverse lookup `JSXGraph internal id → scene id`, rebuilt every\n * time store dispatches. Cần thiết vì JSXGraph events nắm element ref nhưng\n * scene logic chỉ biết scene id; map này cho phép translate ngược.\n *\n * Renderer's `elements` map (scene-id → JxgObj) là source of truth — hook\n * subscribe store + rebuild map mỗi event.\n */\nexport function useJxgSceneIdMap({ store, rendererRef }: Params): Result {\n const jxgIdToSceneRef = useRef<Map<string, string>>(new Map());\n useEffect(() => {\n const rebuild = (): void => {\n const r = rendererRef.current;\n if (!r) return;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const elements: Map<string, JxgObj> | undefined = (r as any).elements;\n const next = new Map<string, string>();\n if (elements) {\n for (const [sid, jxg] of elements) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const jid = (jxg as any)?.id;\n if (jid) next.set(String(jid), sid);\n }\n }\n jxgIdToSceneRef.current = next;\n };\n rebuild();\n return store.subscribe(() => rebuild());\n }, [store, rendererRef]);\n return { jxgIdToSceneRef };\n}\n","'use client';\n/**\n * MiniBoard.tsx — JSXGraph mini-board cho geometry-2d editor.\n *\n * Sau Sub-PR 2.3.3 (Scene v2 Phase 2):\n * - Scene state qua `core/scene` Store + JxgRenderer (diff subscribe).\n * - Pointer handlers (handleDown/Up/Move) dispatch ADD/DELETE/UPDATE_ATTRS.\n * - Tool + pending picks qua `useToolStateMachine`.\n * - Selection = Set<sceneId> (UI state).\n * - Undo/Redo qua store (immer snapshot stack).\n *\n * EditorPanel/host/render.ts vẫn dùng API cũ — clean ở 2.3.4 / 2.3.7.\n */\n\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport {\n nextLabel as sceneNextLabel,\n type Store,\n} from '../../../core/scene';\nimport { JxgRenderer } from '../../../core/scene/render/JxgRenderer';\nimport { DEFAULT_VIEW_2D } from '../../../core/scene/types';\nimport { handleDown, handleMove, handleUp, type HandlerCtx } from './handlers';\nimport {\n findNearestJxgPoint,\n objectsAt as objectsAtImpl,\n promoteToLabelOwner,\n screenCoordsOf as screenCoordsOfImpl,\n} from './hitTest';\nimport { paletteFor, themeAxis, themeGrid, themeLabel } from './theme';\nimport { GROUP_LABELS, TOOLS, type GeomTool, type ToolDef } from './tools';\nimport { useToolStateMachine } from '../../shared/useToolStateMachine';\nimport { safeJsx } from '../../shared/safeJsx';\nimport { attachJxgWheelZoom } from '../../shared/attachJxgWheelZoom';\nimport { initJxgBoard } from '../../shared/initJxgBoard';\nimport { buildObjectSnapshot } from './snapshot';\nimport {\n clearPreviewSegs as clearPreviewSegsImpl,\n removePhantom as removePhantomImpl,\n refreshPreviewShape,\n} from './previewActions';\nimport { buildMiniBoardHandle } from './buildHandle';\nimport {\n jxgFromSceneId as jxgFromSceneIdImpl,\n jxgIdToSceneId as jxgIdToSceneIdImpl,\n} from './idResolvers';\nimport { useAxisGridSync } from './useAxisGridSync';\nimport { useEditorShortcuts } from './useEditorShortcuts';\nimport { useJxgSceneIdMap } from './useJxgSceneIdMap';\n\nimport type { MiniBoardHandle, ObjectSnapshot, SelectionStateSnapshot, TransformPopoverInfo } from './MiniBoard.types';\n\nexport { TOOLS, GROUP_LABELS };\nexport type { GeomTool, ToolDef };\nexport type { ObjectSnapshot, SelectionStateSnapshot, TransformPopoverInfo, MiniBoardHandle } from './MiniBoard.types';\n\ntype JxgObj = any;\n\ninterface Props {\n /** Signal \"board boot xong\" — parent gọi handle methods qua ref sau khi nhận. */\n onReady?: () => void;\n /** Scene store do Host tạo qua `useStampStore`. View info đọc từ `store.getState().meta.view`. */\n store: Store;\n /** Tool hiện tại — host owns state (Tier 2 F). */\n selectedTool: GeomTool;\n /** Hiển thị axis — host owns state (Tier 2 F). */\n showAxis: boolean;\n /** Hiển thị grid — host owns state (Tier 2 F). */\n showGrid: boolean;\n isDark?: boolean;\n /** Toast hook từ EditorPanel ToastProvider — handlers dùng cho invalid construction. */\n toast?: import('../../shared/Toast').ShowToastFn;\n}\n\nexport const MiniBoard2D = forwardRef<MiniBoardHandle, Props>(function MiniBoard2D(\n { onReady, store, selectedTool, showAxis, showGrid, isDark, toast },\n ref,\n) {\n const isDarkRef = useRef(!!isDark); isDarkRef.current = !!isDark;\n const containerId = useId().replace(/:/g, '_') + '_jxgmini';\n const containerRef = useRef<HTMLDivElement>(null);\n const boardRef = useRef<JxgObj>(null);\n const jxgRef = useRef<JxgObj>(null);\n const rendererRef = useRef<JxgRenderer | null>(null);\n const axisObjsRef = useRef<{ x?: JxgObj; y?: JxgObj }>({});\n\n const toolSM = useToolStateMachine<GeomTool>(selectedTool);\n\n // bbox init đọc 1 lần lúc mount từ store.meta.view; axis/grid drive bằng prop.\n const initialMeta = store.getState().meta;\n const initialView = initialMeta.domain === '2d' ? initialMeta.view : DEFAULT_VIEW_2D;\n const showAxisRef = useRef(showAxis); showAxisRef.current = showAxis;\n const showGridRef = useRef(showGrid); showGridRef.current = showGrid;\n\n const selectedSetRef = useRef<Set<string>>(new Set());\n const [selectionTick, setSelectionTick] = useState(0);\n\n // Sync selection halo overlay + emit selection state snapshot khi\n // selectedSetRef đổi. Dùng tick để notify (selectedSetRef là ref nên\n // React không track trực tiếp).\n useEffect(() => {\n const ids = [...selectedSetRef.current];\n rendererRef.current?.highlight(ids);\n const anchor = lastClickClientRef.current ?? { x: 0, y: 0 };\n const snap: SelectionStateSnapshot | null =\n ids.length === 0 ? null : { ids, anchor: { x: anchor.x + 8, y: anchor.y + 8 } };\n selectionStateSubsRef.current.forEach((cb) =>\n safeJsx('MiniBoard.emitSelectionState.cb', () => cb(snap)),\n );\n }, [selectionTick]);\n\n // Pending / preview / marquee state.\n const pendingRef = useRef<JxgObj[]>([]);\n const previewSegRef = useRef<JxgObj[]>([]);\n const phantomRef = useRef<JxgObj>(null);\n const previewShapeRef = useRef<JxgObj>(null);\n const previewRafRef = useRef<number | null>(null);\n const marqueeRef = useRef<{ startSx: number; startSy: number; rect?: JxgObj } | null>(null);\n const moveDownRef = useRef<{ sx: number; sy: number } | null>(null);\n const lastMoveClickRef = useRef<{ id: string | null; time: number }>({ id: null, time: 0 });\n const lastClickClientRef = useRef<{ x: number; y: number } | null>(null);\n const pendingTransformRef = useRef<any>(null);\n\n // Subscribers cho popover (select + transform). Store-level changes propagate\n // qua `useEditorState` ở EditorPanel level — MiniBoard không owns store\n // subscription nữa (Tier 2 F).\n const selectSubsRef = useRef<Set<(snap: ObjectSnapshot) => void>>(new Set());\n const transformSubsRef = useRef<Set<(info: TransformPopoverInfo) => void>>(new Set());\n const selectionStateSubsRef = useRef<Set<(snap: SelectionStateSnapshot | null) => void>>(new Set());\n\n const { jxgIdToSceneRef } = useJxgSceneIdMap({ store, rendererRef });\n\n const jxgFromSceneId = useCallback(\n (id: string) => jxgFromSceneIdImpl(rendererRef.current, id),\n [],\n );\n const jxgIdToSceneId = useCallback(\n (jxgObj: JxgObj) => jxgIdToSceneIdImpl(rendererRef.current, jxgIdToSceneRef.current, jxgObj),\n [jxgIdToSceneRef],\n );\n\n // ─── Hit-test helpers ──────────────────────────────────────────────────────\n // Mỗi callback wrap pure function ở hitTest.ts, gom refs vào tham số.\n const screenCoordsOf = useCallback(\n (evt: JxgObj) => screenCoordsOfImpl(boardRef.current, containerRef.current, evt),\n [],\n );\n const objectsAt = useCallback(\n (evt: JxgObj) => objectsAtImpl(boardRef.current, containerRef.current, evt, [\n phantomRef.current,\n previewShapeRef.current,\n ...previewSegRef.current,\n ]),\n [],\n );\n const findNearestPointJxg = useCallback(\n (evt: JxgObj, tolPx = 12) =>\n findNearestJxgPoint(boardRef.current, containerRef.current, store.getState(), jxgFromSceneId, evt, tolPx),\n [jxgFromSceneId, store],\n );\n const promoteLabel = useCallback(\n (o: JxgObj) => promoteToLabelOwner(boardRef.current, o),\n [],\n );\n\n // ─── Selection / pending / preview actions ─────────────────────────────────\n const toggleSelect = useCallback((id: string, additive: boolean) => {\n if (!additive) { selectedSetRef.current.clear(); selectedSetRef.current.add(id); }\n else if (selectedSetRef.current.has(id)) selectedSetRef.current.delete(id);\n else selectedSetRef.current.add(id);\n rendererRef.current?.highlight([...selectedSetRef.current]);\n setSelectionTick((t) => t + 1);\n }, []);\n const clearSelection = useCallback(() => {\n selectedSetRef.current.clear();\n rendererRef.current?.highlight(null);\n setSelectionTick((t) => t + 1);\n }, []);\n const deleteSelection = useCallback(() => {\n if (selectedSetRef.current.size === 0) return;\n store.transaction((dispatch) => {\n for (const id of selectedSetRef.current) dispatch({ type: 'DELETE', payload: { id } });\n });\n selectedSetRef.current.clear();\n rendererRef.current?.highlight(null);\n setSelectionTick((t) => t + 1);\n }, [store]);\n\n const clearPreviewSegs = useCallback(\n () => clearPreviewSegsImpl(boardRef.current, previewSegRef),\n [],\n );\n const removePhantom = useCallback(\n () => removePhantomImpl(boardRef.current, { previewShapeRef, phantomRef }),\n [],\n );\n const clearPending = useCallback(() => {\n removePhantom();\n clearPreviewSegs();\n pendingRef.current = [];\n toolSM.clearPending();\n }, [clearPreviewSegs, removePhantom, toolSM]);\n const refreshPreview = useCallback(\n () => refreshPreviewShape(boardRef.current, toolSM, {\n previewSegRef, phantomRef, previewShapeRef, pendingRef,\n }),\n [toolSM],\n );\n\n // ─── Warning flash ─────────────────────────────────────────────────────────\n const [, setWarn] = useState<string | null>(null);\n const warnTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const flashWarn = useCallback((msg: string) => {\n if (warnTimerRef.current) clearTimeout(warnTimerRef.current);\n setWarn(msg);\n warnTimerRef.current = setTimeout(() => setWarn(null), 1800);\n }, []);\n useEffect(() => () => { if (warnTimerRef.current) clearTimeout(warnTimerRef.current); }, []);\n\n const nextLabelFor = useCallback(\n (kind: string): string => sceneNextLabel(store.getState(), kind),\n [store],\n );\n\n // ─── Snapshot + emit helpers ───────────────────────────────────────────────\n const buildSnapshot = useCallback(\n (id: string, anchorScreen: { x: number; y: number }): ObjectSnapshot | null =>\n buildObjectSnapshot(store.getState(), id, anchorScreen),\n [store],\n );\n const emitSelect = useCallback((info: { id: string; anchorScreen: { x: number; y: number } }) => {\n const snap = buildSnapshot(info.id, info.anchorScreen);\n if (!snap) return;\n selectSubsRef.current.forEach((cb) => safeJsx('MiniBoard.emitSelect.cb', () => cb(snap)));\n }, [buildSnapshot]);\n const emitTransform = useCallback((info: TransformPopoverInfo) => {\n transformSubsRef.current.forEach((cb) => safeJsx('MiniBoard.emitTransform.cb', () => cb(info)));\n }, []);\n\n // ─── Handler context (read latest refs at call time) ───────────────────────\n const ctxRef = useRef<HandlerCtx | null>(null);\n ctxRef.current = {\n boardRef,\n toolRef: toolSM.toolRef as { current: GeomTool },\n pendingRef,\n pendingIdsRef: toolSM.pendingIdsRef as { current: string[] },\n previewSegRef,\n axisObjsRef,\n selectedSetRef,\n marqueeRef,\n moveDownRef,\n lastMoveClickRef,\n lastClickClientRef,\n pendingTransformRef,\n phantomRef,\n previewShapeRef,\n previewRafRef,\n jxgRef,\n store,\n jxgIdToSceneId,\n jxgFromSceneId,\n screenCoordsOf,\n objectsAt,\n promoteLabel,\n findNearestPointJxg,\n toggleSelect,\n clearSelection,\n nextLabel: nextLabelFor,\n clearPending,\n clearPreviewSegs,\n refreshPreview,\n flashWarn,\n toast,\n emitTransform: emitTransform as HandlerCtx['emitTransform'],\n emitSelect: emitSelect as HandlerCtx['emitSelect'],\n setPendingCount: () => { /* derived from toolSM */ },\n setSelectionTick: (fn) => setSelectionTick(fn),\n };\n\n useEditorShortcuts({\n store,\n pendingIdsRef: toolSM.pendingIdsRef,\n selectedSetRef,\n clearPending,\n clearSelection,\n deleteSelection,\n });\n useAxisGridSync({ boardRef, axisObjsRef, isDarkRef, showAxis, showGrid });\n\n const handleToolChange = useCallback((t: GeomTool) => {\n clearPending();\n toolSM.setTool(t);\n const b = boardRef.current;\n if (b) safeJsx('MiniBoard.setPanForTool', () => {\n if (b.attr?.pan) b.attr.pan.enabled = (t !== 'select');\n });\n }, [clearPending, toolSM]);\n\n // Tier 2 F — host owns `selectedTool`. Sync prop → internal toolSM khi đổi.\n useEffect(() => {\n if (toolSM.toolRef.current !== selectedTool) handleToolChange(selectedTool);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedTool]);\n\n // ─── Board init (async JSXGraph load) ───────────────────────────────────────\n useEffect(() => {\n if (typeof window === 'undefined' || !containerRef.current) return;\n let cancelled = false;\n let wheelCleanup: (() => void) | null = null;\n let freeBoard: (() => void) | null = null;\n void (async () => {\n const { JXG, board, cleanup } = await initJxgBoard(containerId, {\n label: 'MiniBoard.2d',\n defaults: { disableElementHighlight: true },\n boardOptions: {\n boundingbox: initialView.bbox as [number, number, number, number],\n axis: false, grid: false,\n showCopyright: false, showNavigation: true,\n keepAspectRatio: true,\n pan: { enabled: true, needShift: false },\n zoom: { wheel: false },\n precision: { hasPoint: 8, mouse: 4, touch: 16 },\n },\n extraOptionTweaks: (opts) => {\n // Apply theme label/text stroke color sau common defaults. Selection\n // highlight (đỏ) chủ động qua JxgRenderer.highlight() — đã disable\n // JSXGraph hover-highlight qua defaults.disableElementHighlight.\n if (opts.label) opts.label.strokeColor = themeLabel(isDarkRef.current);\n if (opts.text) opts.text.strokeColor = themeLabel(isDarkRef.current);\n },\n });\n if (cancelled || !containerRef.current) { cleanup(); return; }\n jxgRef.current = JXG;\n boardRef.current = board;\n freeBoard = cleanup;\n\n rendererRef.current = new JxgRenderer(store, board, {\n theme: paletteFor(isDarkRef.current),\n });\n\n // Ctrl/Cmd + wheel zoom (Excalidraw-style).\n if (containerRef.current) {\n wheelCleanup = attachJxgWheelZoom(containerRef.current, board, 'MiniBoard.2d');\n }\n\n if (showAxisRef.current) safeJsx('MiniBoard.initAxes', () => {\n axisObjsRef.current.x = board.create('axis', [[0, 0], [1, 0]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n axisObjsRef.current.y = board.create('axis', [[0, 0], [0, 1]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n });\n if (showGridRef.current) safeJsx('MiniBoard.initGrid', () =>\n board.create('grid', [], { strokeColor: themeGrid(isDarkRef.current), strokeOpacity: 1 }),\n );\n\n const fire = (h: (ctx: HandlerCtx, e: JxgObj) => void) =>\n (e: JxgObj) => { if (ctxRef.current) h(ctxRef.current, e); };\n board.on('down', fire(handleDown));\n board.on('up', fire(handleUp));\n board.on('move', fire(handleMove));\n\n // Hover cursor: pointer khi di chuột qua bất kỳ object có scene id (loại\n // phantom + preview transient). Apply mọi tool — drag (move), snap target\n // (drawing tools), click-to-select (select). Reset về '' khi rời object.\n board.on('move', (e: JxgObj) => {\n const container = containerRef.current;\n if (!container) return;\n const hits = objectsAtImpl(boardRef.current, container, e, [\n phantomRef.current,\n previewShapeRef.current,\n ...previewSegRef.current,\n ]);\n container.style.cursor = hits.length > 0 ? 'pointer' : '';\n });\n\n onReady?.();\n })();\n return () => {\n cancelled = true;\n if (wheelCleanup) { wheelCleanup(); wheelCleanup = null; }\n if (previewRafRef.current != null) { cancelAnimationFrame(previewRafRef.current); previewRafRef.current = null; }\n rendererRef.current?.dispose();\n rendererRef.current = null;\n if (freeBoard) { freeBoard(); freeBoard = null; }\n boardRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerId]);\n\n // Handle delivery qua ref. Methods đọc trực tiếp từ refs — handle có thể\n // tạo trước khi board boot xong; gọi method trước onReady?.() sẽ trả stale\n // refs. Object literal được build ở `buildHandle.ts` để giảm size file.\n useImperativeHandle(\n ref,\n () => buildMiniBoardHandle({\n containerRef, boardRef, rendererRef,\n selectSubsRef, transformSubsRef, selectionStateSubsRef,\n selectedSetRef, pendingTransformRef, ctxRef,\n store,\n clearPending, clearSelection, deleteSelection,\n emitTransform,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [store, clearSelection, deleteSelection, clearPending, emitTransform],\n );\n\n return (\n <div\n ref={containerRef}\n id={containerId}\n data-testid=\"jxgmini-container\"\n className=\"h-full min-h-0 bg-white\"\n style={{ touchAction: 'none' }}\n />\n );\n});\n","// 8 màu chính lấy từ Excalidraw DEFAULT_ELEMENT_STROKE_COLOR_PALETTE.\n// Nguồn: @excalidraw/excalidraw — packages/excalidraw/colors.ts (top row chuẩn).\n// Cần đồng bộ tay nếu Excalidraw đổi palette ở major bump.\nexport const STROKE_PALETTE = [\n '#1e1e1e', // black\n '#e03131', // red\n '#e8590c', // orange\n '#f08c00', // yellow\n '#2f9e44', // green\n '#1971c2', // blue\n '#9c36b5', // grape\n '#868e96', // gray\n] as const;\n\nexport type StrokeColor = (typeof STROKE_PALETTE)[number];\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nconst MOBILE_QUERY = '(max-width: 768px)';\nconst NO_HOVER_QUERY = '(hover: none)';\n\nexport interface MobileState {\n /** Viewport ≤ 768px — dùng để chuyển full-screen modal + drawer. */\n isMobile: boolean;\n /** Device không có hover (touch-only) — dùng để ẩn hover tooltips. */\n isTouchOnly: boolean;\n}\n\nfunction readMatch(query: string): boolean {\n if (typeof window === 'undefined' || !window.matchMedia) return false;\n try {\n return window.matchMedia(query).matches;\n } catch {\n return false;\n }\n}\n\n/**\n * SSR-safe mobile detection qua matchMedia. Trả về `{ isMobile, isTouchOnly }`.\n * Re-render khi viewport resize hoặc input modality đổi (e.g., gắn Bluetooth mouse).\n */\nexport function useIsMobile(): MobileState {\n const [state, setState] = useState<MobileState>(() => ({\n isMobile: readMatch(MOBILE_QUERY),\n isTouchOnly: readMatch(NO_HOVER_QUERY),\n }));\n\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mql = window.matchMedia(MOBILE_QUERY);\n const tql = window.matchMedia(NO_HOVER_QUERY);\n const update = () => {\n setState({ isMobile: mql.matches, isTouchOnly: tql.matches });\n };\n update();\n mql.addEventListener('change', update);\n tql.addEventListener('change', update);\n return () => {\n mql.removeEventListener('change', update);\n tql.removeEventListener('change', update);\n };\n }, []);\n\n return state;\n}\n","'use client';\nimport React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { STROKE_PALETTE } from '../../shared/excalidrawPalette';\nimport { useIsMobile } from '../../shared/useIsMobile';\n\nexport type ObjKind = 'point' | 'line' | 'circle';\nexport type PointFace = 'o' | 'circle' | 'cross' | 'plus';\n\nexport interface PropertyPatch {\n attrs?: Record<string, unknown>;\n remove?: boolean;\n /** Bật/tắt value-label động (độ dài segment / bán kính circle). */\n valueLabel?: boolean;\n}\n\ninterface CommonProps {\n anchor: { x: number; y: number };\n onClose: () => void;\n onMutate: (patch: PropertyPatch) => void;\n isDark?: boolean;\n /** Trả về danh sách tên point hiện có (để rename auto-disambiguate). */\n getAllNames?: () => string[];\n}\n\ninterface PointProps extends CommonProps {\n kind: 'point';\n currentName: string;\n currentColor: string;\n currentDash: number;\n currentWidth: number;\n currentFace: PointFace;\n /** Có đang hiện label tên không. */\n currentShowLabel?: boolean;\n}\n\ninterface LineOrCircleProps extends CommonProps {\n kind: 'line' | 'circle';\n currentName: string;\n currentColor: string;\n currentDash: number;\n currentWidth: number;\n /** Có đang hiện label tên không. */\n currentShowLabel?: boolean;\n /** Có đang hiện value-label động không. */\n currentShowValue?: boolean;\n}\n\ntype Props = PointProps | LineOrCircleProps;\n\nconst DASH_OPTIONS: Array<{ value: number; label: string }> = [\n { value: 0, label: 'Nét liền' },\n { value: 2, label: 'Nét đứt' },\n { value: 1, label: 'Nét chấm' },\n];\n\nconst WIDTH_OPTIONS = [1, 2, 3];\n\nconst FACE_OPTIONS: Array<{ value: PointFace; symbol: string }> = [\n { value: 'o', symbol: '●' },\n { value: 'circle', symbol: '◯' },\n { value: 'cross', symbol: '✕' },\n { value: 'plus', symbol: '✚' },\n];\n\n// Unicode subscript digits — dùng để tự đặt tên duy nhất khi user nhập trùng.\n// Lưu dưới dạng ký tự subscript thì JSXGraph SVG <text> render đúng \"B₂\"\n// như label một glyph, không cần MathJax/KaTeX.\nconst SUB_DIGITS = ['₀', '₁', '₂', '₃', '₄', '₅', '₆', '₇', '₈', '₉'];\nconst SUB_SET = new Set(SUB_DIGITS);\n\nfunction toSubscript(n: number): string {\n return String(n).split('').map((d) => SUB_DIGITS[+d] ?? d).join('');\n}\n\nfunction stripTrailingSubscript(s: string): string {\n let i = s.length;\n while (i > 0 && SUB_SET.has(s[i - 1])) i--;\n return s.slice(0, i);\n}\n\nfunction disambiguateName(name: string, existing: Set<string>): string {\n if (!name) return name;\n if (!existing.has(name)) return name;\n const base = stripTrailingSubscript(name) || name;\n for (let n = 2; n < 1000; n++) {\n const candidate = base + toSubscript(n);\n if (!existing.has(candidate)) return candidate;\n }\n return name;\n}\n\ntype Section = 'color' | 'style' | 'size' | 'name' | null;\n\n// Inline icons (small, monochrome) — match the visual weight of Excalidraw's\n// floating action bar in the screenshot. All 16px viewBox 24x24.\nconst Icons = {\n color: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M19 11 L11 3 L3 11 L11 19 Z\" />\n <path d=\"M19 11 L21 16 a2 2 0 1 1 -4 0 Z\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n style: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"5\" fill=\"currentColor\" /></svg>\n ),\n size: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\"><line x1=\"4\" y1=\"9\" x2=\"20\" y2=\"9\" strokeWidth=\"1\" /><line x1=\"4\" y1=\"13\" x2=\"20\" y2=\"13\" strokeWidth=\"2\" /><line x1=\"4\" y1=\"17\" x2=\"20\" y2=\"17\" strokeWidth=\"3.2\" /></svg>\n ),\n name: (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><text x=\"2\" y=\"17\" fontSize=\"14\" fontFamily=\"serif\" fontWeight=\"700\">A</text><text x=\"12\" y=\"17\" fontSize=\"11\" fontFamily=\"serif\" fontWeight=\"700\">a</text></svg>\n ),\n trash: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"3,6 5,6 21,6\" /><path d=\"M19 6 l-1 14 a 2 2 0 0 1 -2 2 H 8 a 2 2 0 0 1 -2 -2 l-1 -14\" /><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" /><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" /></svg>\n ),\n};\n\nexport const PropertiesPopover: React.FC<Props> = (props) => {\n const { anchor, onClose, onMutate, isDark, getAllNames } = props;\n const rootRef = useRef<HTMLDivElement>(null);\n const [section, setSection] = useState<Section>(null);\n const { isMobile } = useIsMobile();\n // Clamp anchor vào viewport sau khi render (measure actual rect).\n // Trên mobile, force bottom-center thay vì follow anchor (anchor có thể nằm\n // sát mép màn hình hoặc dưới ngón tay user → khó tap).\n const [clamped, setClamped] = useState<{ left: number; top: number } | null>(null);\n useLayoutEffect(() => {\n if (typeof window === 'undefined') return;\n const margin = 8;\n if (isMobile) {\n // Bottom-center, 12px above bottom safe area.\n const rect = rootRef.current?.getBoundingClientRect();\n const w = rect?.width ?? 280;\n const left = Math.max(margin, (window.innerWidth - w) / 2);\n const top = window.innerHeight - (rect?.height ?? 80) - margin - 12;\n setClamped({ left, top: Math.max(margin, top) });\n return;\n }\n const rect = rootRef.current?.getBoundingClientRect();\n const w = rect?.width ?? 280;\n const h = rect?.height ?? 80;\n const left = Math.max(margin, Math.min(anchor.x, window.innerWidth - w - margin));\n const top = Math.max(margin, Math.min(anchor.y, window.innerHeight - h - margin));\n setClamped({ left, top });\n }, [anchor.x, anchor.y, isMobile, section]);\n\n const initialName =\n props.kind === 'point' ? props.currentName : (props.kind === 'line' || props.kind === 'circle') ? props.currentName : '';\n const [name, setName] = useState<string>(initialName);\n // Khi popover mở lại trên đối tượng khác, đồng bộ name input.\n useEffect(() => {\n setName(initialName);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialName]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') { e.preventDefault(); onClose(); }\n };\n // PointerDown covers mouse + touch + pen — replaces legacy mousedown listener\n // which excluded touch/pen and broke click-outside trên mobile.\n const onPointerDown = (e: PointerEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) onClose();\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onPointerDown, { capture: true });\n return () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onPointerDown, { capture: true } as EventListenerOptions);\n };\n }, [onClose]);\n\n const pickColor = (c: string) => {\n onMutate({ attrs: { strokeColor: c, fillColor: props.kind === 'circle' ? 'none' : c, color: c } });\n };\n const pickDash = (d: number) => onMutate({ attrs: { dash: d } });\n const pickWidth = (w: number) => onMutate({ attrs: { strokeWidth: w } });\n const pickFace = (f: PointFace) => onMutate({ attrs: { face: f } });\n\n const currentName = (props.kind === 'point' || props.kind === 'line' || props.kind === 'circle') ? props.currentName : '';\n const commitName = () => {\n const trimmed = name.trim();\n if (trimmed === currentName) return;\n // Cho phép xoá tên (empty); chỉ disambiguate khi user nhập 1 cái gì đó.\n let final = trimmed;\n if (trimmed) {\n const others = new Set((getAllNames?.() ?? []).filter((n) => n !== currentName));\n final = disambiguateName(trimmed, others);\n }\n if (final !== name) setName(final);\n onMutate({ attrs: { name: final } });\n };\n\n const toggleShowLabel = (next: boolean) => onMutate({ attrs: { withLabel: next } });\n const toggleShowValue = (next: boolean) => onMutate({ valueLabel: next });\n\n const doDelete = () => { onMutate({ remove: true }); onClose(); };\n\n const toggleSection = (s: Section) => setSection((cur) => (cur === s ? null : s));\n\n const currentColor = props.currentColor;\n const currentDash = props.currentDash;\n const currentWidth = props.currentWidth;\n\n // Hooks must be called unconditionally — before any early return\n const colorIndicatorTint = useMemo(() => currentColor, [currentColor]);\n\n if (typeof document === 'undefined') return null;\n\n // Pill toolbar: row of icon buttons, separator before trash. Click một icon\n // để bung panel chi tiết bên dưới. Trash xoá ngay (không có panel).\n const PillBtn = ({ id, label, icon, active, onClick, indicatorColor }: {\n id: string; label: string; icon: React.ReactNode; active?: boolean;\n onClick: () => void; indicatorColor?: string;\n }) => (\n <button\n type=\"button\"\n data-section={id}\n data-pill-btn={id}\n aria-label={label}\n aria-pressed={!!active}\n onClick={onClick}\n className={`relative flex h-8 w-8 items-center justify-center rounded-md transition ${\n active ? 'bg-slate-200 text-slate-900' : 'text-slate-700 hover:bg-slate-100'\n }`}\n >\n {icon}\n {indicatorColor && (\n <span\n aria-hidden\n className=\"absolute bottom-0.5 left-1/2 -translate-x-1/2 h-1 w-4 rounded-full\"\n style={{ background: indicatorColor }}\n />\n )}\n </button>\n );\n\n const pos = clamped ?? { left: anchor.x, top: anchor.y };\n const node = (\n <div\n ref={rootRef}\n data-stamp-area=\"true\"\n className={`${isDark ? 'theme--dark ' : ''}fixed z-[2147483600] flex flex-col gap-1.5`}\n style={{ left: pos.left, top: pos.top }}\n role=\"dialog\"\n aria-label=\"Thuộc tính đối tượng\"\n >\n {/* Pill toolbar */}\n <div className=\"flex items-center gap-1 rounded-full border border-slate-300 bg-white px-1.5 py-1 shadow-lg ring-1 ring-black/5\">\n <PillBtn id=\"color\" label=\"Màu\" icon={Icons.color} active={section === 'color'} onClick={() => toggleSection('color')} indicatorColor={colorIndicatorTint} />\n <PillBtn id=\"style\" label=\"Kiểu\" icon={Icons.style} active={section === 'style'} onClick={() => toggleSection('style')} />\n <PillBtn id=\"size\" label=\"Độ dày\" icon={Icons.size} active={section === 'size'} onClick={() => toggleSection('size')} />\n <PillBtn id=\"name\" label=\"Tên\" icon={Icons.name} active={section === 'name'} onClick={() => toggleSection('name')} />\n <span aria-hidden className=\"mx-0.5 h-5 w-px bg-slate-200\" />\n <PillBtn id=\"delete\" label=\"Xoá\" icon={Icons.trash} onClick={doDelete} />\n </div>\n\n {/* Sub-panel — chỉ hiện khi user chọn 1 icon */}\n {section && (\n <div className=\"w-[220px] rounded-lg border border-slate-300 bg-white p-3 shadow-2xl ring-1 ring-black/5\">\n {section === 'color' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Màu</span>\n <div className=\"flex flex-wrap gap-1\">\n {STROKE_PALETTE.map((c) => (\n <button\n key={c}\n aria-label={`Màu ${c}`}\n onClick={() => pickColor(c)}\n className={`h-6 w-6 rounded border ${currentColor === c ? 'border-emerald-500 ring-2 ring-emerald-300' : 'border-slate-200'}`}\n style={{ background: c }}\n />\n ))}\n </div>\n </div>\n )}\n\n {section === 'style' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Kiểu</span>\n {props.kind === 'point' ? (\n <div className=\"flex gap-1\">\n {FACE_OPTIONS.map((f) => (\n <button\n key={f.value}\n aria-label={`Hình ${f.value}`}\n onClick={() => pickFace(f.value)}\n className={`h-7 w-7 rounded border text-sm ${(props as PointProps).currentFace === f.value ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n {f.symbol}\n </button>\n ))}\n </div>\n ) : (\n <div className=\"flex gap-1\">\n {DASH_OPTIONS.map((d) => (\n <button\n key={d.value}\n aria-label={`Kiểu ${d.label.toLowerCase()}`}\n onClick={() => pickDash(d.value)}\n className={`flex-1 rounded border px-1 py-1 text-[11px] ${currentDash === d.value ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n {d.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {section === 'size' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Độ dày</span>\n <div className=\"flex gap-1\">\n {WIDTH_OPTIONS.map((w) => (\n <button\n key={w}\n aria-label={`Độ dày ${w}`}\n onClick={() => pickWidth(w)}\n className={`flex-1 rounded border py-1 ${currentWidth === w ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n <span className=\"inline-block rounded bg-slate-800\" style={{ width: 30, height: w }} />\n </button>\n ))}\n </div>\n </div>\n )}\n\n {section === 'name' && (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Tên</span>\n <input\n value={name}\n onChange={(e) => setName(e.target.value)}\n onBlur={commitName}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); commitName(); } }}\n autoFocus\n placeholder={props.kind === 'point' ? 'A, B, …' : props.kind === 'line' ? 'a, b, f, …' : 'O, c, …'}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-sm text-slate-800\"\n />\n <span className=\"text-[10px] text-slate-400\">Trùng tên sẽ tự thêm chỉ số (B → B₂)</span>\n </div>\n\n <label className=\"flex items-center justify-between gap-2 text-[12px] text-slate-700\">\n <span>Hiển thị tên</span>\n <input\n type=\"checkbox\"\n checked={props.currentShowLabel !== false}\n onChange={(e) => toggleShowLabel(e.target.checked)}\n aria-label=\"Hiển thị tên\"\n />\n </label>\n\n {(props.kind === 'line' || props.kind === 'circle') && (\n <label className=\"flex items-center justify-between gap-2 text-[12px] text-slate-700\">\n <span>Hiển thị giá trị</span>\n <input\n type=\"checkbox\"\n checked={!!(props as LineOrCircleProps).currentShowValue}\n onChange={(e) => toggleShowValue(e.target.checked)}\n aria-label=\"Hiển thị giá trị\"\n />\n </label>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n\n return createPortal(node, document.body);\n};\n","'use client';\n/**\n * MultiPropertiesPopover — popover compact cho multi-select (≥2 đối tượng).\n *\n * Khác với PropertiesPopover (single-select): chỉ phơi ra các action chung\n * cho mọi kind — đổi màu + xóa. Các trường kind-specific (face, dash, name,\n * showValue) bị ẩn vì không có ngữ nghĩa nhất quán trên selection nhiều kind\n * khác nhau.\n *\n * EditorPanel gọi `onColor(c)` cho mỗi id selected; `onDelete()` xóa tất cả.\n */\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { STROKE_PALETTE } from '../../shared/excalidrawPalette';\nimport { useIsMobile } from '../../shared/useIsMobile';\n\ntype Section = 'color' | null;\n\nconst Icons = {\n color: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M19 11 L11 3 L3 11 L11 19 Z\" />\n <path d=\"M19 11 L21 16 a2 2 0 1 1 -4 0 Z\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n trash: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3,6 5,6 21,6\" />\n <path d=\"M19 6 l-1 14 a 2 2 0 0 1 -2 2 H 8 a 2 2 0 0 1 -2 -2 l-1 -14\" />\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" />\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" />\n </svg>\n ),\n};\n\nexport interface MultiPropertiesPopoverProps {\n anchor: { x: number; y: number };\n count: number;\n isDark?: boolean;\n onColor: (color: string) => void;\n onDelete: () => void;\n onClose: () => void;\n}\n\nexport const MultiPropertiesPopover: React.FC<MultiPropertiesPopoverProps> = (props) => {\n const { anchor, count, isDark, onColor, onDelete, onClose } = props;\n const rootRef = useRef<HTMLDivElement>(null);\n const [section, setSection] = useState<Section>(null);\n const { isMobile } = useIsMobile();\n const [clamped, setClamped] = useState<{ left: number; top: number } | null>(null);\n\n useLayoutEffect(() => {\n if (typeof window === 'undefined') return;\n const margin = 8;\n if (isMobile) {\n const rect = rootRef.current?.getBoundingClientRect();\n const w = rect?.width ?? 220;\n const left = Math.max(margin, (window.innerWidth - w) / 2);\n const top = window.innerHeight - (rect?.height ?? 80) - margin - 12;\n setClamped({ left, top: Math.max(margin, top) });\n return;\n }\n const rect = rootRef.current?.getBoundingClientRect();\n const w = rect?.width ?? 220;\n const h = rect?.height ?? 80;\n const left = Math.max(margin, Math.min(anchor.x, window.innerWidth - w - margin));\n const top = Math.max(margin, Math.min(anchor.y, window.innerHeight - h - margin));\n setClamped({ left, top });\n }, [anchor.x, anchor.y, isMobile, section]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') { e.preventDefault(); onClose(); }\n };\n const onPointerDown = (e: PointerEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) onClose();\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onPointerDown, { capture: true });\n return () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onPointerDown, { capture: true } as EventListenerOptions);\n };\n }, [onClose]);\n\n const toggleSection = (s: Section) => setSection((cur) => (cur === s ? null : s));\n const doDelete = () => { onDelete(); onClose(); };\n\n if (typeof document === 'undefined') return null;\n\n const PillBtn = ({ id, label, icon, active, onClick }: {\n id: string; label: string; icon: React.ReactNode; active?: boolean; onClick: () => void;\n }) => (\n <button\n type=\"button\"\n data-section={id}\n data-pill-btn={id}\n aria-label={label}\n aria-pressed={!!active}\n onClick={onClick}\n className={`relative flex h-8 w-8 items-center justify-center rounded-md transition ${\n active ? 'bg-slate-200 text-slate-900' : 'text-slate-700 hover:bg-slate-100'\n }`}\n >\n {icon}\n </button>\n );\n\n const pos = clamped ?? { left: anchor.x, top: anchor.y };\n const node = (\n <div\n ref={rootRef}\n data-stamp-area=\"true\"\n data-testid=\"multi-properties-popover\"\n className={`${isDark ? 'theme--dark ' : ''}fixed z-[2147483600] flex flex-col gap-1.5`}\n style={{ left: pos.left, top: pos.top }}\n role=\"dialog\"\n aria-label={`Thuộc tính (${count} đối tượng)`}\n >\n <div className=\"flex items-center gap-1 rounded-full border border-slate-300 bg-white px-1.5 py-1 shadow-lg ring-1 ring-black/5\">\n <span className=\"px-1 text-[11px] font-medium text-slate-500\">{count} đã chọn</span>\n <span aria-hidden className=\"mx-0.5 h-5 w-px bg-slate-200\" />\n <PillBtn id=\"color\" label=\"Đổi màu\" icon={Icons.color} active={section === 'color'} onClick={() => toggleSection('color')} />\n <span aria-hidden className=\"mx-0.5 h-5 w-px bg-slate-200\" />\n <PillBtn id=\"delete\" label=\"Xoá tất cả\" icon={Icons.trash} onClick={doDelete} />\n </div>\n\n {section === 'color' && (\n <div className=\"w-[220px] rounded-lg border border-slate-300 bg-white p-3 shadow-2xl ring-1 ring-black/5\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Màu (áp cho {count} đối tượng)</span>\n <div className=\"flex flex-wrap gap-1\">\n {STROKE_PALETTE.map((c) => (\n <button\n key={c}\n aria-label={`Màu ${c}`}\n onClick={() => onColor(c)}\n className=\"h-6 w-6 rounded border border-slate-200\"\n style={{ background: c }}\n />\n ))}\n </div>\n </div>\n </div>\n )}\n </div>\n );\n\n return createPortal(node, document.body);\n};\n","'use client';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport type ParamKind = 'rotate' | 'dilate' | 'regularPolygon';\n\ninterface Props {\n kind: ParamKind;\n anchor: { x: number; y: number };\n defaultValue: number;\n onConfirm: (value: number) => void;\n onCancel: () => void;\n isDark?: boolean;\n}\n\nconst LABELS: Record<ParamKind, { aria: string; label: string; step: number; min?: number }> = {\n rotate: { aria: 'Góc quay', label: 'Góc (°)', step: 15 },\n dilate: { aria: 'Tỷ số k', label: 'Tỷ số k', step: 0.5 },\n regularPolygon: { aria: 'Số cạnh đa giác đều', label: 'Số cạnh (n ≥ 3)', step: 1, min: 3 },\n};\n\nexport const TransformParamPopover: React.FC<Props> = ({ kind, anchor, defaultValue, onConfirm, onCancel, isDark }) => {\n const [value, setValue] = useState<number>(defaultValue);\n const inputRef = useRef<HTMLInputElement>(null);\n const meta = LABELS[kind];\n\n useEffect(() => { inputRef.current?.focus(); inputRef.current?.select(); }, []);\n\n const submit = () => {\n let v = Number.isFinite(value) ? value : defaultValue;\n if (kind === 'regularPolygon') {\n v = Math.max(3, Math.round(v));\n }\n onConfirm(v);\n };\n\n if (typeof document === 'undefined') return null;\n\n const node = (\n <div\n data-stamp-area=\"true\"\n className={`${isDark ? 'theme--dark ' : ''}fixed z-[2147483600] flex flex-col gap-2 rounded-lg border border-slate-300 bg-white p-3 shadow-2xl ring-1 ring-black/5`}\n style={{ left: anchor.x, top: anchor.y, minWidth: 180 }}\n role=\"dialog\"\n aria-label={meta.aria}\n >\n <label className=\"text-xs font-medium text-slate-700\">{meta.label}</label>\n <input\n ref={inputRef}\n type=\"number\"\n value={value}\n step={meta.step}\n min={meta.min}\n onChange={(e) => setValue(parseFloat(e.target.value))}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); submit(); }\n else if (e.key === 'Escape') { e.preventDefault(); onCancel(); }\n }}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-sm text-slate-800\"\n />\n <div className=\"flex justify-end gap-2\">\n <button\n onClick={onCancel}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-xs text-slate-700 hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={submit}\n className=\"rounded bg-emerald-600 px-2 py-1 text-xs font-medium text-white hover:bg-emerald-700\"\n >\n Áp dụng\n </button>\n </div>\n </div>\n );\n\n return createPortal(node, document.body);\n};\n","// src/stamps/shared/StampLeftPanel/constants.ts\n//\n// Desktop popover sizing chia sẻ giữa 3 stamp editor (geometry-2d, geometry-3d,\n// graph-2d). Trước đây mỗi EditorPanel hardcode size riêng (640×540 cho 2D/graph,\n// 800×600 cho 3D) → kích thước canvas nhỏ + không nhất quán. Gom vào constant\n// 880×700 + cap responsive để dùng được trên màn nhỏ.\n\n/** Tailwind class string áp cho outer popover của stamp editor (desktop). */\nexport const STAMP_PANEL_DESKTOP =\n 'h-[700px] w-[880px] max-h-[85vh] max-w-[calc(100vw-280px)]';\n","import React, {\n createContext,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from 'react';\nimport type { ShowToastFn, DismissToastFn, ToastItem, ToastOptions } from './types';\n\nexport interface ToastContextValue {\n items: ToastItem[];\n showToast: ShowToastFn;\n dismiss: DismissToastFn;\n}\n\nexport const ToastContext = createContext<ToastContextValue | null>(null);\n\ntype Action =\n | { type: 'PUSH'; item: ToastItem; maxVisible: number }\n | { type: 'REPLACE'; item: ToastItem }\n | { type: 'DISMISS'; id: string };\n\nfunction reducer(state: ToastItem[], action: Action): ToastItem[] {\n switch (action.type) {\n case 'PUSH': {\n const next = [...state, action.item];\n return next.length > action.maxVisible ? next.slice(next.length - action.maxVisible) : next;\n }\n case 'REPLACE':\n return state.map((it) => (it.id === action.item.id ? action.item : it));\n case 'DISMISS':\n return state.filter((it) => it.id !== action.id);\n }\n}\n\ninterface ToastProviderProps {\n children: React.ReactNode;\n /** Max simultaneously visible toasts. Default: 3. Pushing more drops oldest. */\n maxVisible?: number;\n}\n\nlet autoIdCounter = 0;\n\nexport function ToastProvider({ children, maxVisible = 3 }: ToastProviderProps) {\n const [items, dispatch] = useReducer(reducer, [] as ToastItem[]);\n const timersRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n const itemsRef = useRef(items);\n itemsRef.current = items;\n\n const clearTimer = useCallback((id: string) => {\n const t = timersRef.current.get(id);\n if (t) {\n clearTimeout(t);\n timersRef.current.delete(id);\n }\n }, []);\n\n const dismiss = useCallback<DismissToastFn>((id) => {\n clearTimer(id);\n dispatch({ type: 'DISMISS', id });\n }, [clearTimer]);\n\n const scheduleAutoDismiss = useCallback((id: string, duration: number) => {\n if (duration <= 0) return;\n const t = setTimeout(() => dismiss(id), duration);\n timersRef.current.set(id, t);\n }, [dismiss]);\n\n const showToast = useCallback<ShowToastFn>((message, opts: ToastOptions = {}) => {\n const variant = opts.variant ?? 'info';\n const duration = opts.duration ?? 3000;\n const id = opts.id ?? `toast-${++autoIdCounter}`;\n const item: ToastItem = { id, message, variant, duration };\n const existing = itemsRef.current.find((it) => it.id === id);\n if (existing) {\n clearTimer(id);\n dispatch({ type: 'REPLACE', item });\n } else {\n dispatch({ type: 'PUSH', item, maxVisible });\n }\n scheduleAutoDismiss(id, duration);\n }, [clearTimer, maxVisible, scheduleAutoDismiss]);\n\n useEffect(() => () => {\n timersRef.current.forEach((t) => clearTimeout(t));\n timersRef.current.clear();\n }, []);\n\n const value = useMemo(() => ({ items, showToast, dismiss }), [items, showToast, dismiss]);\n return <ToastContext.Provider value={value}>{children}</ToastContext.Provider>;\n}\n","import React from 'react';\nimport type { ToastVariant } from './types';\n\nconst VARIANT_CLASS: Record<ToastVariant, string> = {\n info: 'border-l-sky-500',\n warning: 'border-l-amber-500',\n error: 'border-l-rose-500',\n};\n\nconst VARIANT_ICON: Record<ToastVariant, React.ReactNode> = {\n info: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n ),\n warning: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n ),\n error: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n ),\n};\n\ninterface ToastProps {\n id: string;\n message: string;\n variant: ToastVariant;\n onDismiss: (id: string) => void;\n}\n\nexport function Toast({ id, message, variant, onDismiss }: ToastProps) {\n return (\n <div\n role=\"status\"\n className={[\n 'pointer-events-auto flex max-w-sm items-start gap-2 rounded-lg border-l-4 bg-white px-3 py-2 text-sm text-slate-800 shadow-md ring-1 ring-black/5',\n VARIANT_CLASS[variant],\n ].join(' ')}\n >\n <span className=\"mt-0.5 shrink-0 text-slate-500\">{VARIANT_ICON[variant]}</span>\n <span className=\"flex-1 leading-snug\">{message}</span>\n <button\n type=\"button\"\n aria-label=\"Đóng thông báo\"\n onClick={() => onDismiss(id)}\n className=\"-mr-1 ml-1 inline-flex h-5 w-5 shrink-0 items-center justify-center rounded text-slate-400 hover:bg-slate-100 hover:text-slate-700\"\n >\n ×\n </button>\n </div>\n );\n}\n","import { useContext } from 'react';\nimport { ToastContext } from './ToastProvider';\n\nexport function useToast() {\n const ctx = useContext(ToastContext);\n if (!ctx) {\n throw new Error('useToast must be used inside <ToastProvider>');\n }\n return ctx;\n}\n","import React from 'react';\nimport { Toast } from './Toast';\nimport { useToast } from './useToast';\n\n/**\n * Renders the active toast queue. Mount once near the root of each stamp\n * EditorPanel (inside ToastProvider). Positions itself absolutely at\n * bottom-center of the nearest positioned ancestor.\n */\nexport function ToastHost() {\n const { items, dismiss } = useToast();\n if (items.length === 0) return null;\n return (\n <div\n aria-live=\"polite\"\n className=\"pointer-events-none absolute inset-x-0 bottom-3 z-50 flex flex-col items-center gap-2\"\n >\n {items.map((it) => (\n <Toast key={it.id} id={it.id} message={it.message} variant={it.variant} onDismiss={dismiss} />\n ))}\n </div>\n );\n}\n","export { ToastProvider } from './ToastProvider';\nexport { ToastHost } from './ToastHost';\nexport { Toast } from './Toast';\nexport { useToast } from './useToast';\nexport type {\n ToastVariant,\n ToastOptions,\n ToastItem,\n ShowToastFn,\n DismissToastFn,\n} from './types';\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { State } from '../../../core/scene';\nimport type { GenerateGeometryFigure } from '../../shared/types';\n\nexport interface UseAiFigureResult {\n prompt: string;\n setPrompt: (value: string) => void;\n isLoading: boolean;\n error: string | null;\n submit: () => Promise<State | null>;\n}\n\nexport function useAiFigure(generator?: GenerateGeometryFigure): UseAiFigureResult {\n const [prompt, setPrompt] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const requestIdRef = useRef(0);\n\n useEffect(() => () => abortRef.current?.abort(), []);\n\n const submit = useCallback(async (): Promise<State | null> => {\n const problem = prompt.trim();\n if (!problem) {\n setError('Nhập đề bài cần dựng hình.');\n return null;\n }\n if (!generator) {\n setError('Tính năng dựng hình AI chưa được cấu hình.');\n return null;\n }\n\n abortRef.current?.abort();\n const controller = new AbortController();\n const requestId = ++requestIdRef.current;\n abortRef.current = controller;\n setIsLoading(true);\n setError(null);\n\n try {\n const generated = await generator(problem, { signal: controller.signal });\n if (controller.signal.aborted || requestId !== requestIdRef.current) return null;\n if (!generated.ok) {\n setError(generated.message);\n return null;\n }\n return generated.state;\n } catch (caught) {\n if (controller.signal.aborted || (caught instanceof DOMException && caught.name === 'AbortError')) {\n return null;\n }\n if (requestId === requestIdRef.current) {\n setError(caught instanceof Error && caught.message\n ? caught.message\n : 'Không thể dựng hình bằng AI.');\n }\n return null;\n } finally {\n if (requestId === requestIdRef.current) {\n abortRef.current = null;\n setIsLoading(false);\n }\n }\n }, [generator, prompt]);\n\n return { prompt, setPrompt, isLoading, error, submit };\n}\n","'use client';\n\nimport React, { useCallback } from 'react';\nimport type { State } from '../../../core/scene';\nimport type { GenerateGeometryFigure } from '../../shared/types';\nimport { useAiFigure } from './useAiFigure';\n\ninterface Props {\n generator: GenerateGeometryFigure;\n onGenerated: (state: State) => void;\n}\n\nexport function AiFigurePrompt({ generator, onGenerated }: Props) {\n const {\n prompt,\n setPrompt,\n isLoading,\n error,\n submit,\n } = useAiFigure(generator);\n\n const handleSubmit = useCallback(async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const generated = await submit();\n if (generated) onGenerated(generated);\n }, [onGenerated, submit]);\n\n return (\n <form\n data-testid=\"geometry-ai-form\"\n onSubmit={(event) => { void handleSubmit(event); }}\n className=\"border-b border-slate-200 bg-slate-50 px-3 py-2\"\n >\n <label htmlFor=\"geometry-ai-prompt\" className=\"mb-1 block text-xs font-medium text-slate-600\">\n Dựng hình bằng AI\n </label>\n <div className=\"flex items-start gap-2\">\n <textarea\n id=\"geometry-ai-prompt\"\n aria-label=\"Đề bài cho AI\"\n value={prompt}\n onChange={(event) => setPrompt(event.target.value)}\n disabled={isLoading}\n rows={2}\n placeholder=\"Ví dụ: Cho tam giác ABC, dựng đường cao AH.\"\n className=\"min-h-12 flex-1 resize-none rounded border border-slate-300 bg-white px-2 py-1.5 text-xs text-slate-800 outline-none focus:border-emerald-500 disabled:opacity-60\"\n />\n <button\n type=\"submit\"\n disabled={isLoading || !prompt.trim()}\n className=\"rounded bg-emerald-600 px-3 py-2 text-xs font-medium text-white transition hover:bg-emerald-700 disabled:opacity-50\"\n >\n {isLoading ? 'Đang dựng...' : 'Dựng bằng AI'}\n </button>\n </div>\n {error && (\n <p role=\"alert\" className=\"mt-1 text-xs text-red-600\">{error}</p>\n )}\n </form>\n );\n}\n","'use client';\nimport React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';\nimport { MiniBoard2D, type MiniBoardHandle, type GeomTool, type ObjectSnapshot, type SelectionStateSnapshot, type TransformPopoverInfo } from './MiniBoard';\nimport { serializeBoard } from '../serialize';\nimport { renderGeometrySvgFromState } from '../render';\nimport { PropertiesPopover } from './PropertiesPopover';\nimport { MultiPropertiesPopover } from './MultiPropertiesPopover';\nimport { TransformParamPopover } from './TransformParamPopover';\nimport { buildObjectSnapshot } from './snapshot';\nimport { UndoIcon, RedoIcon } from './icons';\nimport { useEditorState, type State, type Store } from '../../../core/scene';\nimport { STAMP_PANEL_DESKTOP } from '../../shared/StampLeftPanel/constants';\nimport { ToastProvider, ToastHost, useToast } from '../../shared/Toast';\nimport type { GenerateGeometryFigure } from '../../shared/types';\nimport { AiFigurePrompt } from './AiFigurePrompt';\n\ninterface Props {\n /** Scene store do Host tạo qua `useStampStore`. View info đã ở store.meta.view. */\n store: Store;\n onInsert: (jsonState: string, svgString: string) => void;\n onClose: () => void;\n /** Khi true, panel position offset left để chừa chỗ cho StampLeftPanel (240px). */\n withLeftPanel?: boolean;\n /** Controlled prop — host owns (Tier 2 F). */\n selectedTool: GeomTool;\n /** Controlled prop — host owns (Tier 2 F). */\n showAxis: boolean;\n /** Controlled prop — host owns (Tier 2 F). */\n showGrid: boolean;\n /** Notify host về canUndo/canRedo qua store subscribe (Tier 2 F). */\n onHistoryChange?: (canUndo: boolean, canRedo: boolean) => void;\n isDark?: boolean;\n /** Mobile mode: full-screen + hamburger header. */\n isMobile?: boolean;\n /** Click hamburger trên mobile để mở LeftPanel drawer. */\n onOpenDrawer?: () => void;\n /** Mobile header: undo/redo. Bypass LeftPanel để user truy cập nhanh. */\n onUndo?: () => void;\n onRedo?: () => void;\n canUndo?: boolean;\n canRedo?: boolean;\n /** Báo lên Host khi selection đổi qua action trong editor. */\n onSelectionChange?: (id: string | undefined) => void;\n /** Client-safe bridge to a server-side AI generation call. */\n generateGeometryFigure?: GenerateGeometryFigure;\n}\n\nexport interface GeometryEditorPanelHandle {\n /** Trigger Chèn programmatically (cho auto-insert khi click outside). */\n insert: () => boolean;\n /** Có nội dung để chèn không? */\n hasContent: () => boolean;\n /** Highlight object theo id từ bên ngoài (ObjectListPanel trong Host). */\n selectObject: (id: string | null) => void;\n}\n\nconst GeometryEditorPanelInner = forwardRef<GeometryEditorPanelHandle, Props>(\n function GeometryEditorPanelInner(\n {\n store,\n onInsert,\n onClose,\n withLeftPanel = false,\n selectedTool,\n showAxis,\n showGrid,\n onHistoryChange,\n isDark,\n isMobile = false,\n onOpenDrawer,\n onUndo,\n onRedo,\n canUndo,\n canRedo,\n onSelectionChange,\n generateGeometryFigure,\n },\n ref,\n ) {\n const { showToast } = useToast();\n const handleRef = useRef<MiniBoardHandle | null>(null);\n const [ready, setReady] = useState(false);\n const [hasContent, setHasContent] = useState(false);\n const [propsPopover, setPropsPopover] = useState<ObjectSnapshot | null>(null);\n /** Multi-select snapshot — render compact popover khi ids.length > 1. */\n const [multiSelection, setMultiSelection] = useState<SelectionStateSnapshot | null>(null);\n // Handlers emit cả 6 transform tool (rotate/dilate/regularPolygon/translate/\n // reflectLine/reflectPoint); TransformParamPopover chỉ render 3 tool có\n // numeric param — guard ở chỗ render.\n const [transformPopover, setTransformPopover] = useState<TransformPopoverInfo>(null);\n const onSelectionChangeRef = useRef(onSelectionChange);\n useEffect(() => { onSelectionChangeRef.current = onSelectionChange; }, [onSelectionChange]);\n\n // Tier 2 F — propagate canUndo/canRedo + keyboard shortcuts qua shared hook.\n useEditorState({ store, onHistoryChange });\n\n // hasContent: track store size để gate Insert button.\n useEffect(() => {\n const sync = () => setHasContent(Object.keys(store.getState().objects).length > 0);\n sync();\n return store.subscribe(sync);\n }, [store]);\n\n const handleReady = useCallback(() => {\n const h = handleRef.current;\n if (!h) return;\n setReady(true);\n h.onSelect((snap: ObjectSnapshot) => {\n setPropsPopover(snap);\n setMultiSelection(null);\n onSelectionChangeRef.current?.(snap.id);\n });\n h.onTransformParam((info) => setTransformPopover(info));\n // selection-state channel: fire mỗi khi selectedSetRef đổi (click,\n // shift-click, marquee, clearSelection). Derive popover từ size:\n // 0 → ẩn cả 2 popover\n // 1 → single PropertiesPopover (derive ObjectSnapshot từ store)\n // ≥2 → MultiPropertiesPopover (compact: color + delete)\n h.onSelectionState((snap) => {\n if (!snap || snap.ids.length === 0) {\n setPropsPopover(null);\n setMultiSelection(null);\n onSelectionChangeRef.current?.(undefined);\n return;\n }\n if (snap.ids.length === 1) {\n const id = snap.ids[0];\n const single = buildObjectSnapshot(store.getState(), id, snap.anchor);\n if (single) {\n setPropsPopover(single);\n setMultiSelection(null);\n onSelectionChangeRef.current?.(id);\n }\n return;\n }\n setMultiSelection(snap);\n setPropsPopover(null);\n onSelectionChangeRef.current?.(undefined);\n });\n }, [store]);\n\n const dismissPropsPopover = useCallback(() => {\n setPropsPopover(null);\n onSelectionChangeRef.current?.(undefined);\n }, []);\n\n const dismissMultiPopover = useCallback(() => {\n setMultiSelection(null);\n handleRef.current?.clearSelection();\n onSelectionChangeRef.current?.(undefined);\n }, []);\n\n const applyMultiColor = useCallback((color: string) => {\n const ids = multiSelection?.ids ?? [];\n const h = handleRef.current;\n if (!h) return;\n for (const id of ids) {\n h.mutateObject(id, { attrs: { strokeColor: color, color } });\n }\n }, [multiSelection]);\n\n const applyMultiDelete = useCallback(() => {\n const ids = multiSelection?.ids ?? [];\n const h = handleRef.current;\n if (!h) return;\n for (const id of ids) {\n h.mutateObject(id, { remove: true });\n }\n h.clearSelection();\n setMultiSelection(null);\n onSelectionChangeRef.current?.(undefined);\n }, [multiSelection]);\n\n // Build serialized state (format v2) — async vì SVG render offscreen\n // với light palette để Excalidraw filter tự đảo khi dark mode.\n const performInsert = useCallback((): boolean => {\n if (!handleRef.current) return false;\n const h = handleRef.current;\n const state = h.getState();\n if (Object.keys(state.objects).length === 0) return false;\n const bbox = h.getBbox();\n const jsonState = serializeBoard(state, { bbox, showAxis, showGrid });\n // Fire-and-forget. Caller (`tryInsert`) chỉ cần biết có nội dung không.\n void (async () => {\n try {\n const svgString = await renderGeometrySvgFromState(jsonState);\n onInsert(jsonState, svgString);\n } catch (err) {\n console.error('Geometry insert failed:', err);\n }\n })();\n return true;\n }, [onInsert, showAxis, showGrid]);\n\n const handleInsert = useCallback(() => {\n performInsert();\n }, [performInsert]);\n\n const loadAiFigure = useCallback((generated: State) => {\n handleRef.current?.clearSelection();\n setPropsPopover(null);\n setMultiSelection(null);\n setTransformPopover(null);\n onSelectionChangeRef.current?.(undefined);\n const current = store.getState();\n store.dispatch({\n type: 'LOAD',\n payload: { state: { ...generated, meta: current.meta } },\n });\n }, [store]);\n\n useImperativeHandle(ref, () => ({\n insert: performInsert,\n hasContent: () => Object.keys(handleRef.current?.getState().objects ?? {}).length > 0,\n selectObject: (id) => handleRef.current?.highlight(id),\n }), [performInsert]);\n\n const wrapperStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 40 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Dựng hình học\"\n data-testid=\"geometry-editor-panel\"\n data-stamp-area=\"true\"\n data-mobile-editor={isMobile ? 'true' : undefined}\n style={wrapperStyle}\n className={[\n isDark ? 'theme--dark ' : '',\n 'relative flex flex-col overflow-hidden bg-white',\n isMobile\n ? 'h-full w-full'\n : `${STAMP_PANEL_DESKTOP} rounded-lg border border-slate-300 shadow-2xl ring-1 ring-black/5`,\n ].join(' ')}\n >\n <header className=\"flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-emerald-600 to-teal-600 px-3 py-2 text-white\">\n {isMobile && (\n <button\n type=\"button\"\n onClick={onOpenDrawer}\n aria-label=\"Mở ngăn công cụ\"\n className=\"-ml-1 inline-flex h-10 w-10 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n </svg>\n </button>\n )}\n <h3 className=\"flex flex-1 items-center gap-2 text-sm font-semibold\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"3,18 12,3 21,18\" />\n <circle cx=\"12\" cy=\"3\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"3\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"21\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n Dựng hình học\n </h3>\n {isMobile && (\n <>\n <button\n type=\"button\"\n onClick={onUndo}\n disabled={!canUndo}\n aria-label=\"Hoàn tác\"\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n data-testid=\"undo-btn-mobile\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15 disabled:opacity-40\"\n >\n <UndoIcon />\n </button>\n <button\n type=\"button\"\n onClick={onRedo}\n disabled={!canRedo}\n aria-label=\"Làm lại\"\n title=\"Làm lại (Ctrl/Cmd+Shift+Z)\"\n data-testid=\"redo-btn-mobile\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15 disabled:opacity-40\"\n >\n <RedoIcon />\n </button>\n <button\n type=\"button\"\n onClick={handleInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"geometry-insert-btn-mobile\"\n className=\"rounded bg-white/15 px-3 py-1.5 text-xs font-semibold transition hover:bg-white/25 disabled:opacity-50\"\n >\n Chèn\n </button>\n </>\n )}\n <button onClick={onClose} aria-label=\"Đóng\" className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n {generateGeometryFigure && (\n <AiFigurePrompt generator={generateGeometryFigure} onGenerated={loadAiFigure} />\n )}\n <div className=\"flex min-h-0 flex-1\">\n <div className=\"flex-1\">\n <MiniBoard2D\n ref={handleRef}\n store={store}\n selectedTool={selectedTool}\n showAxis={showAxis}\n showGrid={showGrid}\n onReady={handleReady}\n isDark={isDark}\n toast={showToast}\n />\n </div>\n </div>\n {propsPopover && (\n propsPopover.kind === 'point' ? (\n <PropertiesPopover\n kind=\"point\"\n anchor={propsPopover.screenCoords}\n isDark={isDark}\n currentName={propsPopover.name}\n currentColor={propsPopover.color}\n currentDash={propsPopover.dash}\n currentWidth={propsPopover.width}\n currentFace={propsPopover.face}\n currentShowLabel={propsPopover.showLabel}\n getAllNames={() => handleRef.current?.getAllPointNames() ?? []}\n onClose={dismissPropsPopover}\n onMutate={(patch) => {\n handleRef.current?.mutateObject(propsPopover.id, patch);\n if (patch.remove) dismissPropsPopover();\n // Refresh snapshot để UI checkbox phản ánh state mới\n if (typeof patch.valueLabel === 'boolean' || patch.attrs) {\n setPropsPopover((cur) => cur ? { ...cur, showValue: patch.valueLabel ?? cur.showValue } : cur);\n }\n }}\n />\n ) : (\n <PropertiesPopover\n kind={propsPopover.kind}\n anchor={propsPopover.screenCoords}\n isDark={isDark}\n currentName={propsPopover.name}\n currentColor={propsPopover.color}\n currentDash={propsPopover.dash}\n currentWidth={propsPopover.width}\n currentShowLabel={propsPopover.showLabel}\n currentShowValue={propsPopover.showValue}\n getAllNames={() => handleRef.current?.getAllPointNames() ?? []}\n onClose={dismissPropsPopover}\n onMutate={(patch) => {\n handleRef.current?.mutateObject(propsPopover.id, patch);\n if (patch.remove) dismissPropsPopover();\n if (typeof patch.valueLabel === 'boolean') {\n setPropsPopover((cur) => cur ? { ...cur, showValue: patch.valueLabel ?? cur.showValue } : cur);\n }\n if (patch.attrs && 'withLabel' in patch.attrs) {\n setPropsPopover((cur) => cur ? { ...cur, showLabel: !!patch.attrs?.withLabel } : cur);\n }\n }}\n />\n )\n )}\n\n {multiSelection && multiSelection.ids.length > 1 && (\n <MultiPropertiesPopover\n anchor={multiSelection.anchor}\n count={multiSelection.ids.length}\n isDark={isDark}\n onColor={applyMultiColor}\n onDelete={applyMultiDelete}\n onClose={dismissMultiPopover}\n />\n )}\n\n {transformPopover && (transformPopover.tool === 'rotate' || transformPopover.tool === 'dilate' || transformPopover.tool === 'regularPolygon') && (\n <TransformParamPopover\n kind={transformPopover.tool}\n anchor={transformPopover.anchor}\n defaultValue={\n transformPopover.tool === 'rotate' ? 90\n : transformPopover.tool === 'dilate' ? 2\n : 6\n }\n isDark={isDark}\n onConfirm={(v) => { handleRef.current?.confirmTransformParam(v); setTransformPopover(null); }}\n onCancel={() => { handleRef.current?.cancelTransformParam(); setTransformPopover(null); }}\n />\n )}\n\n {!isMobile && (\n <footer className=\"flex items-center justify-between border-t border-slate-200 bg-slate-50 px-3 py-2\">\n <span className=\"text-xs text-slate-500\">Chọn công cụ bên trái, click trên bảng để dựng hình.</span>\n <div className=\"flex gap-2\">\n <button\n onClick={onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={handleInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"geometry-insert-btn\"\n className=\"rounded bg-emerald-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-emerald-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </footer>\n )}\n <ToastHost />\n </div>\n );\n },\n);\n\nexport const GeometryEditorPanel = forwardRef<GeometryEditorPanelHandle, Props>(\n function GeometryEditorPanel(props, ref) {\n return (\n <ToastProvider>\n <GeometryEditorPanelInner {...props} ref={ref} />\n </ToastProvider>\n );\n },\n);\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface UseChordShortcutArgs<G extends string> {\n groupOrder: readonly G[];\n tools: ReadonlyArray<{ key: string; group: G }>;\n onSelect: (toolKey: string) => void;\n enabled: boolean;\n}\n\ninterface UseChordShortcutResult<G extends string> {\n chordGroup: G | null;\n cancel: () => void;\n}\n\nconst A_CODE = 'a'.charCodeAt(0);\n\nfunction isFieldFocused(): boolean {\n const ae = (typeof document !== 'undefined'\n ? (document.activeElement as HTMLElement | null)\n : null);\n return !!(\n ae &&\n (ae.tagName === 'INPUT' ||\n ae.tagName === 'TEXTAREA' ||\n ae.isContentEditable)\n );\n}\n\nexport function useChordShortcut<G extends string>(\n args: UseChordShortcutArgs<G>,\n): UseChordShortcutResult<G> {\n const { groupOrder, tools, onSelect, enabled } = args;\n\n const [chordGroup, setChordGroup] = useState<G | null>(null);\n\n const groupOrderRef = useRef(groupOrder);\n const toolsRef = useRef(tools);\n const onSelectRef = useRef(onSelect);\n const chordGroupRef = useRef<G | null>(null);\n\n groupOrderRef.current = groupOrder;\n toolsRef.current = tools;\n onSelectRef.current = onSelect;\n // chordGroupRef được sync ngay trong handler (xem `setChord` dưới đây)\n // thay vì ghi từ render body — nếu ghi ở body sẽ bị React batch hoá khi\n // hai event xảy ra trong cùng một act() (event sau đọc giá trị cũ).\n\n const cancel = useCallback(() => {\n chordGroupRef.current = null;\n setChordGroup(null);\n }, []);\n\n useEffect(() => {\n if (!enabled) return;\n\n const setChord = (next: G | null) => {\n chordGroupRef.current = next;\n setChordGroup(next);\n };\n\n const onKey = (e: KeyboardEvent) => {\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (isFieldFocused()) return;\n\n const key = e.key;\n const lower = key.length === 1 ? key.toLowerCase() : key;\n\n if (key === 'Escape') {\n if (chordGroupRef.current !== null) {\n e.preventDefault();\n e.stopPropagation();\n setChord(null);\n }\n return;\n }\n\n if (lower.length === 1 && lower >= 'a' && lower <= 'z') {\n const idx = lower.charCodeAt(0) - A_CODE;\n if (idx < groupOrderRef.current.length) {\n e.preventDefault();\n e.stopPropagation();\n setChord(groupOrderRef.current[idx]);\n }\n return;\n }\n\n if (key >= '1' && key <= '9') {\n const active = chordGroupRef.current;\n if (active === null) return;\n const n = key.charCodeAt(0) - '1'.charCodeAt(0); // 0-indexed\n const toolsInGroup = toolsRef.current.filter(\n (t) => t.group === active,\n );\n e.preventDefault();\n e.stopPropagation();\n if (n < toolsInGroup.length) {\n onSelectRef.current(toolsInGroup[n].key);\n }\n setChord(null);\n return;\n }\n };\n\n window.addEventListener('keydown', onKey, { capture: true });\n return () => {\n window.removeEventListener('keydown', onKey, { capture: true });\n };\n }, [enabled]);\n\n return { chordGroup, cancel };\n}\n","import { createStampFile } from './svgToStampFile';\nimport type { ExcalidrawElement } from '../../types';\n\n// Excalidraw imperative API — không có public type chính xác. Giữ untyped ở\n// boundary và yêu cầu caller pass đúng instance.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ExApi = any;\n\nexport interface InsertStampImageOptions {\n /** SVG string sẵn sàng render (geometry export hoặc katex render). */\n svgString: string;\n /**\n * Factory tạo customData. Mỗi stamp tự define shape (kind, version, jsonState).\n * width/height của element đã được Excalidraw track riêng — không cần lưu\n * trong customData (drop tại Tier D cleanup v0.20).\n */\n makeCustomData: () => unknown;\n /** Nếu đang re-edit, id của element cũ — sẽ update thay vì tạo mới. */\n editingElementId?: string | null;\n /** Vị trí gốc (lúc tạo mới). Bỏ qua khi đang re-edit. */\n position?: { x?: number; y?: number };\n}\n\nexport interface InsertStampImageResult {\n fileId: string;\n width: number;\n height: number;\n /** Element id (mới hoặc cũ tuỳ flow). */\n elementId: string;\n}\n\n// Bỏ qua appState (selectedElementIds + croppingElementId) sau khi insert để\n// Excalidraw không tự động bật crop mode cho element vừa thêm → tránh trigger\n// crop intercept handler vô tận.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst clearAppStateAfterInsert = (): any => ({\n selectedElementIds: {},\n croppingElementId: null,\n});\n\nfunction buildStampImageElement(\n api: ExApi,\n fileId: string,\n width: number,\n height: number,\n customData: unknown,\n x?: number,\n y?: number,\n) {\n const appState =\n api?.getAppState() ?? { scrollX: 0, scrollY: 0, width: 800, height: 600, zoom: { value: 1 } };\n const cx =\n x ?? appState.scrollX + (appState.width ?? 800) / 2 / (appState.zoom?.value ?? 1) - width / 2;\n const cy =\n y ?? appState.scrollY + (appState.height ?? 600) / 2 / (appState.zoom?.value ?? 1) - height / 2;\n return {\n type: 'image' as const,\n id: 'stamp_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8),\n x: cx,\n y: cy,\n width,\n height,\n fileId,\n customData,\n angle: 0,\n strokeColor: 'transparent',\n backgroundColor: 'transparent',\n fillStyle: 'solid',\n strokeWidth: 1,\n strokeStyle: 'solid',\n roughness: 0,\n opacity: 100,\n groupIds: [],\n roundness: null,\n seed: Math.floor(Math.random() * 1e9),\n versionNonce: 0,\n version: 1,\n isDeleted: false,\n boundElements: null,\n updated: Date.now(),\n link: null,\n locked: false,\n status: 'saved',\n scale: [1, 1],\n };\n}\n\n/**\n * Chèn (hoặc thay thế) một stamp image vào Excalidraw scene.\n *\n * Flow:\n * 1. createStampFile(svg) → fileId + dataURL + kích thước\n * 2. api.addFiles([...]) — đăng ký SVG dưới fileId\n * 3. Nếu editingElementId → update element cũ (giữ position, đổi fileId+customData+size)\n * Còn lại → tạo image element mới ở giữa viewport (hoặc position truyền vào)\n *\n * Đoạn này trước đây nằm 2 chỗ (handleGeometryInsert + handleLatexInsert),\n * chỉ khác customData. Gộp lại để: thêm stamp type mới chỉ cần truyền\n * `makeCustomData`.\n */\nexport async function insertStampImage(\n api: ExApi,\n opts: InsertStampImageOptions,\n): Promise<InsertStampImageResult> {\n const { dataURL, fileId, width, height, mimeType } = await createStampFile(opts.svgString);\n api.addFiles([{ id: fileId, dataURL, mimeType, created: Date.now() }]);\n const customData = opts.makeCustomData();\n\n const elements = api.getSceneElements() as readonly ExcalidrawElement[];\n const editingId = opts.editingElementId ?? null;\n\n if (editingId) {\n const updated = elements.map((e) =>\n e.id === editingId ? { ...e, fileId, customData, width, height } : e,\n );\n api.updateScene({ elements: updated, appState: clearAppStateAfterInsert() });\n return { fileId, width, height, elementId: editingId };\n }\n\n const newElement = buildStampImageElement(\n api,\n fileId,\n width,\n height,\n customData,\n opts.position?.x,\n opts.position?.y,\n );\n api.updateScene({\n elements: [...elements, newElement],\n appState: clearAppStateAfterInsert(),\n });\n return { fileId, width, height, elementId: newElement.id };\n}\n","// Hook tạo + giữ scene store tại Host level cho mọi stamp interactive\n// (geometry-2d, geometry-3d, graph-2d).\n//\n// Trước đây mỗi stamp dùng pattern riêng:\n// - 3D: useRef + createStore(createEmptyState('3d')) inline tại host.\n// - 2D + graph-2d: useState<Store|null> + callback `onStoreReady` từ editor.\n//\n// Hook này hợp nhất về 1 mental model: store sống ở host, identity stable,\n// pre-load từ customData ngay frame đầu → bỏ ternary `store ? ... : undefined`\n// + bỏ flash 1 frame trên 2D + graph-2d.\n//\n// Roundtrip edit: khi double-click stamp existing element, `editingElement`\n// được pass vào, hook gọi `parseInitial(customData)` để extract State trước\n// khi createStore. Stamp tự define parseInitial vì format customData khác nhau.\n\nimport { useRef } from 'react';\nimport { createStore, createEmptyState, type Store } from '../../core/scene';\nimport type { State } from '../../core/scene/types';\nimport type { StampHostProps } from './types';\n\nexport type StampDomain = '2d' | '3d' | 'graph2d';\n\nexport type ParseInitialStateFn = (customData: unknown) => State | null;\n\nexport function useStampStore(\n domain: StampDomain,\n editingElement: StampHostProps['editingElement'],\n parseInitial: ParseInitialStateFn,\n): Store {\n const ref = useRef<Store | null>(null);\n if (!ref.current) {\n const initial = editingElement?.customData\n ? parseInitial(editingElement.customData) ?? createEmptyState(domain)\n : createEmptyState(domain);\n ref.current = createStore(initial);\n }\n return ref.current;\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { StampLeftPanel } from '../shared/StampLeftPanel';\nimport { GeometryIconHeader } from './editor/icons';\nimport {\n GeometryEditorPanel,\n type GeometryEditorPanelHandle,\n} from './editor/EditorPanel';\nimport type { GeomTool } from './editor/MiniBoard';\nimport { GROUP_ORDER, GROUP_LABELS, TOOLS, letterForGroup, type GeomGroup } from './editor/tools';\nimport { useChordShortcut } from '../shared/useChordShortcut';\nimport { insertStampImage } from '../shared/insertImage';\nimport { deserializeBoard } from './serialize';\nimport { isGeometryCustomData, type GeometryCustomData } from './types';\nimport { DEFAULT_VIEW_2D, type State } from '../../core/scene';\nimport type {\n StampHostProps,\n StampHostHandle,\n} from '../shared/types';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport { useStampStore } from '../shared/useStampStore';\n\nfunction parseInitialState(data: unknown): State | null {\n if (!isGeometryCustomData(data)) return null;\n return deserializeBoard(data.jsonState);\n}\n\nexport const GeometryStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function GeometryStampHost({ api, editingElement, onClose, isDark, generateGeometryFigure }, ref) {\n const panelRef = useRef<GeometryEditorPanelHandle | null>(null);\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n const sceneStore = useStampStore('2d', editingElement, parseInitialState);\n\n // Tier 2 F — host owns editor UI state.\n const initialMeta = sceneStore.getState().meta;\n const initialView = initialMeta.domain === '2d' ? initialMeta.view : DEFAULT_VIEW_2D;\n const [selectedTool, setSelectedTool] = useState<GeomTool>('move');\n const [showAxis, setShowAxis] = useState<boolean>(initialView.showAxis);\n const [showGrid, setShowGrid] = useState<boolean>(initialView.showGrid);\n const [canUndo, setCanUndo] = useState<boolean>(false);\n const [canRedo, setCanRedo] = useState<boolean>(false);\n const [selectedObjectId, setSelectedObjectId] = useState<string | undefined>(undefined);\n\n const handleHistoryChange = useCallback((u: boolean, r: boolean) => {\n setCanUndo(u);\n setCanRedo(r);\n }, []);\n\n const handleUndo = useCallback(() => sceneStore.undo(), [sceneStore]);\n const handleRedo = useCallback(() => sceneStore.redo(), [sceneStore]);\n\n const { chordGroup } = useChordShortcut({\n groupOrder: GROUP_ORDER,\n tools: TOOLS,\n onSelect: (key) => setSelectedTool(key as GeomTool),\n enabled: !isMobile,\n });\n\n const handleInsert = useCallback(\n async (jsonState: string, svgString: string) => {\n if (!api) return;\n try {\n await insertStampImage(api, {\n svgString,\n makeCustomData: (): GeometryCustomData => ({\n kind: 'geometry',\n version: 1,\n jsonState,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n } catch (err) {\n console.error('Geometry insert failed:', err);\n }\n onClose();\n },\n [api, editingElement?.id, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => panelRef.current?.insert() ?? false,\n hasContent: () => panelRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n return (\n <>\n <StampLeftPanel<GeomTool, GeomGroup>\n title=\"Hình học\"\n icon={GeometryIconHeader}\n onClose={onClose}\n isDark={isDark}\n testId=\"stamp-left-panel\"\n tools={TOOLS}\n groupOrder={GROUP_ORDER}\n groupLabels={GROUP_LABELS}\n activeTool={selectedTool}\n onToolChange={setSelectedTool}\n view={{\n showAxis,\n showGrid,\n onShowAxisChange: setShowAxis,\n onShowGridChange: setShowGrid,\n }}\n history={{\n onUndo: handleUndo,\n canUndo,\n onRedo: handleRedo,\n canRedo,\n }}\n chord={{ activeGroup: chordGroup, letterForGroup }}\n objects={{\n store: sceneStore,\n selectedObjectId,\n onObjectSelect: (id) => {\n setSelectedObjectId(id ?? undefined);\n panelRef.current?.selectObject(id);\n },\n }}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n />\n <GeometryEditorPanel\n ref={panelRef}\n store={sceneStore}\n onInsert={handleInsert}\n onClose={onClose}\n selectedTool={selectedTool}\n showAxis={showAxis}\n showGrid={showGrid}\n onHistoryChange={handleHistoryChange}\n withLeftPanel={!isMobile}\n isDark={isDark}\n isMobile={isMobile}\n onOpenDrawer={() => setDrawerOpen(true)}\n onUndo={handleUndo}\n onRedo={handleRedo}\n canUndo={canUndo}\n canRedo={canRedo}\n onSelectionChange={setSelectedObjectId}\n generateGeometryFigure={generateGeometryFigure}\n />\n </>\n );\n },\n);\n","'use client';\n\nimport { lazy, type ReactNode } from 'react';\nimport { renderGeometrySvgFromState } from './render';\nimport type {\n RestoredStampFile,\n StampType,\n} from '../shared/types';\nimport { svgToStampFile } from '../shared/svgToStampFile';\nimport {\n isGeometryCustomData,\n type GeometryCustomData,\n} from './types';\n\nexport type { GeometryCustomData };\n\nconst GeometryStampHost = lazy(() =>\n import('./host').then((m) => ({ default: m.GeometryStampHost })),\n);\n\nconst GeometryIcon: ReactNode = (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polygon points=\"4,20 20,20 12,5\" />\n <circle cx=\"4\" cy=\"20\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"20\" cy=\"20\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12\" cy=\"5\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n);\n\nexport const geometryStamp: StampType<GeometryCustomData> = {\n kind: 'geometry',\n shortcutKey: 'g',\n toolbarLabel: 'G',\n toolbarTitle: 'Chèn hình học (G)',\n toolbarIcon: GeometryIcon,\n toolbarTestId: 'stamp-toolbar-geometry',\n matchesCustomData: isGeometryCustomData,\n async renderSvgFromCustomData(data) {\n if (!isGeometryCustomData(data)) {\n throw new Error('geometryStamp.renderSvgFromCustomData: customData không phải geometry');\n }\n return renderGeometrySvgFromState(data.jsonState);\n },\n async restoreFileFromCustomData(element): Promise<RestoredStampFile | null> {\n const data = element.customData as GeometryCustomData | undefined;\n const fileId = (element as { fileId?: string | null }).fileId;\n if (!data || !fileId || !isGeometryCustomData(data)) return null;\n const svgString = await renderGeometrySvgFromState(data.jsonState);\n return svgToStampFile(svgString, fileId);\n },\n Host: GeometryStampHost,\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/scene/types.ts","../src/core/scene/registry.ts","../src/core/scene/reducer.ts","../src/core/scene/store.ts","../src/core/scene/selectors.ts","../src/core/scene/hooks/useEditorState.ts","../src/core/scene/hooks/index.ts","../src/core/scene/kinds/3d-constraint.ts","../src/core/scene/kinds/point3d.ts","../src/core/scene/kinds/labelOf.ts","../src/core/scene/kinds/segment3d.ts","../src/core/scene/kinds/line3d.ts","../src/core/scene/kinds/ray3d.ts","../src/core/scene/kinds/vector3d.ts","../src/core/scene/kinds/plane3d.ts","../src/core/scene/kinds/polygon3d.ts","../src/core/scene/kinds/sphere3d.ts","../src/core/scene/kinds/polyhedron3d.ts","../src/core/scene/kinds/cylinder3d.ts","../src/core/scene/kinds/cone3d.ts","../src/core/scene/kinds/2d-constraint.ts","../src/core/scene/kinds/point.ts","../src/core/scene/kinds/segment.ts","../src/core/scene/kinds/line.ts","../src/core/scene/kinds/ray.ts","../src/core/scene/kinds/vector.ts","../src/core/scene/kinds/circle.ts","../src/core/scene/kinds/arc.ts","../src/core/scene/kinds/sector.ts","../src/core/scene/kinds/polygon.ts","../src/core/scene/kinds/intersection.ts","../src/core/scene/kinds/angle.ts","../src/core/scene/kinds/distance.ts","../src/core/scene/expressions/parser.ts","../src/core/scene/kinds/function2d.ts","../src/core/scene/kinds/parameter.ts","../src/core/scene/kinds/pointOnCurve.ts","../src/core/scene/kinds/tangent2d.ts","../src/core/scene/expressions/evaluator.ts","../src/core/scene/kinds/extremum2d.ts","../src/core/scene/kinds/root2d.ts","../src/core/scene/kinds/slope2d.ts","../src/core/scene/kinds/index.ts","../src/core/scene/index.ts","../src/stamps/shared/serializeScene.ts","../src/stamps/geometry-2d/serialize.ts","../src/stamps/geometry-2d/editor/theme.ts","../src/core/scene/render/types2d.ts","../src/core/scene/render/JxgRenderer.ts","../src/stamps/shared/jxgOffscreenRender.ts","../src/stamps/geometry-2d/render.ts","../src/stamps/shared/svgToStampFile.ts","../src/stamps/geometry-2d/types.ts","../src/core/scene/ui/LeftPanelShell.tsx","../src/core/scene/ui/kindMeta.ts","../src/core/scene/ui/ObjectRowMenu.tsx","../src/core/scene/ui/ObjectRow.tsx","../src/core/scene/ui/ObjectListPanel.tsx","../src/stamps/shared/StampLeftPanel/AxisGridSection.tsx","../src/stamps/shared/StampLeftPanel/types.ts","../src/stamps/shared/StampLeftPanel/useToolHoverTooltip.ts","../src/stamps/shared/StampLeftPanel/ToolGrid.tsx","../src/stamps/shared/StampLeftPanel/Desktop.tsx","../src/stamps/shared/MobileToolDrawer.tsx","../src/stamps/shared/StampLeftPanel/Mobile.tsx","../src/stamps/shared/StampLeftPanel/index.tsx","../src/stamps/geometry-2d/editor/icons.tsx","../src/stamps/geometry-2d/editor/tools.tsx","../src/stamps/geometry-2d/editor/handlers/pointerDown/move.ts","../src/stamps/geometry-2d/editor/handlers/pointerDown/select.ts","../src/stamps/shared/safeJsx.ts","../src/stamps/geometry-2d/editor/handlers/utils.ts","../src/stamps/geometry-2d/editor/handlers/pointerDown/point.ts","../src/stamps/geometry-2d/editor/handlers/pointerDown/singleTarget.ts","../src/stamps/geometry-2d/editor/handlers/pointerDown/polygon.ts","../src/stamps/geometry-2d/editor/handlers/classifyPointVsCircle.ts","../src/stamps/geometry-2d/editor/handlers/finalizeShape.ts","../src/stamps/geometry-2d/editor/transforms.ts","../src/stamps/geometry-2d/editor/handlers/transform.ts","../src/stamps/geometry-2d/editor/handlers/pointerDown/multiClick.ts","../src/stamps/geometry-2d/editor/handlers/pointerDown/index.ts","../src/stamps/geometry-2d/editor/handlers/pointerMove.ts","../src/stamps/geometry-2d/editor/handlers/pointerUp.ts","../src/stamps/geometry-2d/editor/handlers/index.ts","../src/stamps/geometry-2d/editor/hitTest.ts","../src/stamps/shared/useToolStateMachine.ts","../src/stamps/shared/attachJxgWheelZoom.ts","../src/stamps/shared/initJxgBoard.ts","../src/stamps/geometry-2d/editor/snapshot.ts","../src/stamps/geometry-2d/editor/preview.ts","../src/stamps/geometry-2d/editor/previewActions.ts","../src/stamps/geometry-2d/editor/attrMapping.ts","../src/stamps/geometry-2d/editor/buildHandle.ts","../src/stamps/geometry-2d/editor/idResolvers.ts","../src/stamps/geometry-2d/editor/useAxisGridSync.ts","../src/stamps/geometry-2d/editor/useEditorShortcuts.ts","../src/stamps/geometry-2d/editor/useJxgSceneIdMap.ts","../src/stamps/geometry-2d/editor/MiniBoard.tsx","../src/stamps/shared/excalidrawPalette.ts","../src/stamps/shared/useIsMobile.ts","../src/stamps/geometry-2d/editor/PropertiesPopover.tsx","../src/stamps/geometry-2d/editor/MultiPropertiesPopover.tsx","../src/stamps/geometry-2d/editor/TransformParamPopover.tsx","../src/stamps/shared/StampLeftPanel/constants.ts","../src/stamps/shared/Toast/ToastProvider.tsx","../src/stamps/shared/Toast/Toast.tsx","../src/stamps/shared/Toast/useToast.ts","../src/stamps/shared/Toast/ToastHost.tsx","../src/stamps/shared/Toast/index.ts","../src/stamps/geometry-2d/editor/useAiFigure.ts","../src/stamps/geometry-2d/editor/AiFigurePrompt.tsx","../src/stamps/geometry-2d/editor/EditorPanel.tsx","../src/stamps/shared/useChordShortcut.ts","../src/stamps/shared/insertImage.ts","../src/stamps/shared/useStampStore.ts","../src/stamps/geometry-2d/host.tsx","../src/stamps/geometry-2d/index.tsx"],"names":["def","produce","React","CURVED_SEGMENTS","init_d_constraint","tangent","constructionRefs","A","B","init_types","jsx","jsxs","React2","React3","Fragment","useState","useRef","useEffect","useCallback","useMemo","createPortal","UndoIcon","RedoIcon","init_point","init_polygon","id","label","ids","sc","jxgFromSceneId","forwardRef","MiniBoard2D","useId","jxgIdToSceneId","screenCoordsOf","objectsAt","clearPreviewSegs","removePhantom","useImperativeHandle","useLayoutEffect","rect","w","left","top","Icons","useReducer","createContext","useContext","init_Toast","GeometryEditorPanelInner","GeometryEditorPanel","A_CODE","GeometryStampHost","lazy"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwHO,SAAS,iBAAiB,MAAA,EAAuB;AACtD,EAAA,MAAM,IAAA,GAAO,EAAE,OAAA,EAAS,IAAI,KAAA,EAAO,EAAC,EAAG,OAAA,EAAS,CAAA,EAAE;AAClD,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,IAAA;AACH,MAAA,OAAO,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,IAAA,EAAM,eAAA,EAAgB,EAAE;AAAA,IAC9E,KAAK,IAAA;AACH,MAAA,OAAO,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,IAAA,EAAM,eAAA,EAAgB,EAAE;AAAA,IAC9E,KAAK,SAAA;AACH,MAAA,OAAO,EAAE,GAAG,IAAA,EAAM,IAAA,EAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,OAAA,EAAS,CAAA,EAAG,IAAA,EAAM,oBAAA,EAAqB,EAAE;AAAA;AAE5F;AAlIA,IA8Fa,iBAMA,eAAA,EAMA,oBAAA;AA1Gb,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yBAAA,GAAA;AA8FO,IAAM,eAAA,GAA0B;AAAA,MACrC,IAAA,EAAM,CAAC,GAAA,EAAK,EAAA,EAAI,IAAI,GAAG,CAAA;AAAA,MACvB,QAAA,EAAU,KAAA;AAAA,MACV,QAAA,EAAU;AAAA,KACZ;AAEO,IAAM,eAAA,GAA0B;AAAA,MACrC,QAAQ,CAAC,EAAA,EAAI,GAAG,EAAA,EAAI,CAAA,EAAG,IAAI,CAAC,CAAA;AAAA,MAC5B,OAAA,EAAS,EAAA;AAAA,MACT,SAAA,EAAW;AAAA,KACb;AAEO,IAAM,oBAAA,GAAoC;AAAA,MAC/C,IAAA,EAAM,GAAA;AAAA,MAAK,IAAA,EAAM,EAAA;AAAA,MAAI,IAAA,EAAM,GAAA;AAAA,MAAK,IAAA,EAAM,EAAA;AAAA,MACtC,QAAA,EAAU,IAAA;AAAA,MAAM,QAAA,EAAU;AAAA,KAC5B;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACxGO,SAAS,aAA0CA,KAAAA,EAAuB;AAC/E,EAAA,IAAI,QAAA,CAAS,GAAA,CAAIA,KAAAA,CAAI,IAAI,CAAA,EAAG;AAC1B,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,cAAA,EAAiBA,KAAAA,CAAI,IAAI,CAAA,6GAAA,CAA0C,CAAA;AAAA,EAClF;AACA,EAAA,QAAA,CAAS,GAAA,CAAIA,KAAAA,CAAI,IAAA,EAAMA,KAAyB,CAAA;AAClD;AAEO,SAAS,QAAQ,IAAA,EAAuB;AAC7C,EAAA,MAAMA,KAAAA,GAAM,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AAC7B,EAAA,IAAI,CAACA,KAAAA,EAAK,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAI,CAAA,CAAE,CAAA;AACzD,EAAA,OAAOA,KAAAA;AACT;AAhBA,IAGM,QAAA;AAHN,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4BAAA,GAAA;AAGA,IAAM,QAAA,uBAAe,GAAA,EAAqB;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACE1C,SAAS,iBAAA,CAAkB,OAA6B,MAAA,EAA6B;AACnF,EAAA,MAAM,UAAA,mBAAa,IAAI,GAAA,CAAY,CAAC,MAAM,CAAC,CAAA;AAC3C,EAAA,IAAI,IAAA,GAAO,IAAA;AACX,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,IAAA,GAAO,KAAA;AACP,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,EAAoB;AAC/D,MAAA,IAAI,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,EAAG;AAC5B,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI;AAAE,QAAA,OAAA,GAAU,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAE,QAAA;AAAA,MAAU;AACvD,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,KAAc,CAAA;AACjD,MAAA,IAAI,KAAK,IAAA,CAAK,CAAA,CAAA,KAAK,WAAW,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG;AACrC,QAAA,UAAA,CAAW,GAAA,CAAI,IAAI,EAAE,CAAA;AACrB,QAAA,IAAA,GAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,UAAA;AACT;AAEO,SAAS,MAAA,CAAO,OAAqB,MAAA,EAAsB;AAChE,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,EAAE,GAAA,EAAI,GAAI,MAAA,CAAO,OAAA;AACvB,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,GAAA,CAAI,EAAE,CAAA,8BAAA,CAAc,CAAA;AAC9E,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAChC,MAAA,OAAA,CAAQ,QAAA,GAAW,IAAI,KAAc,CAAA;AACrC,MAAA,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,GAAI,GAAA;AACxB,MAAA,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA;AACvB,MAAA,KAAA,CAAM,OAAA,IAAW,CAAA;AACjB,MAAA;AAAA,IACF;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,EAAE,EAAA,EAAI,KAAA,EAAM,GAAI,MAAA,CAAO,OAAA;AAC7B,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA;AAC5B,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,MAAA,CAAO,MAAA,CAAO,KAAK,KAAK,CAAA;AACxB,MAAA;AAAA,IACF;AAAA,IACA,KAAK,cAAA,EAAgB;AACnB,MAAA,MAAM,EAAE,EAAA,EAAI,KAAA,EAAM,GAAI,MAAA,CAAO,OAAA;AAC7B,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA;AAC5B,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAChC,MAAA,MAAM,YAAY,EAAE,GAAI,GAAA,CAAI,KAAA,EAAkB,GAAG,KAAA,EAAM;AACvD,MAAA,OAAA,CAAQ,WAAW,SAAkB,CAAA;AACrC,MAAA,GAAA,CAAI,KAAA,GAAQ,SAAA;AACZ,MAAA;AAAA,IACF;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,EAAE,EAAA,EAAG,GAAI,MAAA,CAAO,OAAA;AACtB,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA,EAAG;AACxB,MAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,KAAA,EAAO,EAAE,CAAA;AAC5C,MAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,QAAA,OAAO,KAAA,CAAM,QAAQ,KAAK,CAAA;AAAA,MAC5B;AACA,MAAA,KAAA,CAAM,KAAA,GAAQ,MAAM,KAAA,CAAM,MAAA,CAAO,OAAK,CAAC,QAAA,CAAS,GAAA,CAAI,CAAC,CAAC,CAAA;AACtD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,OAAA,EAAS;AACZ,MAAA,KAAA,CAAM,UAAU,EAAC;AACjB,MAAA,KAAA,CAAM,QAAQ,EAAC;AACf,MAAA,KAAA,CAAM,OAAA,GAAU,CAAA;AAChB,MAAA;AAAA,IACF;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAA,CAAO,OAAA;AACzB,MAAA,KAAA,CAAM,OAAA,GAAU,EAAE,GAAG,KAAA,CAAM,OAAA,EAAQ;AACnC,MAAA,KAAA,CAAM,KAAA,GAAQ,CAAC,GAAG,KAAA,CAAM,KAAK,CAAA;AAC7B,MAAA,KAAA,CAAM,UAAU,KAAA,CAAM,OAAA;AAGtB,MAAA,KAAA,CAAM,IAAA,GAAO,EAAE,GAAG,KAAA,CAAM,IAAA,EAAK;AAC7B,MAAA;AAAA,IACF;AAAA,IACA,KAAK,aAAA,EAAe;AAClB,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS;AACxC,QAAA,MAAA,CAAO,OAAO,GAAG,CAAA;AAAA,MACnB;AACA,MAAA;AAAA,IACF;AAAA,IACA,KAAK,aAAA,EAAe;AAGlB,MAAA,IAAI,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,SAAA,EAAW;AACrC,MAAA,MAAA,CAAO,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,EAAM,MAAA,CAAO,QAAQ,KAAK,CAAA;AACnD,MAAA;AAAA,IACF;AAAA;AAEJ;AA7FA,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2BAAA,GAAA;AAGA,IAAA,aAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACuBO,SAAS,WAAA,CAAY,OAAA,EAAgB,OAAA,GAAwB,EAAC,EAAU;AAC7E,EAAA,MAAM,KAAA,GAAQ,QAAQ,YAAA,IAAgB,eAAA;AACtC,EAAA,IAAI,KAAA,GAAQ,OAAA;AACZ,EAAA,MAAM,OAAgB,EAAC;AACvB,EAAA,MAAM,SAAkB,EAAC;AACzB,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAmB;AACzC,EAAA,IAAI,WAAA,GAAc,KAAA;AAClB,EAAA,IAAI,cAAA,GAAiB,KAAA;AACrB,EAAA,IAAI,kBAAA,GAAsC,IAAA;AAE1C,EAAA,SAAS,MAAA,CAAO,MAAa,MAAA,EAAsB;AACjD,IAAA,SAAA,CAAU,QAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,KAAA,EAAO,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,EAC/C;AAEA,EAAA,SAAS,YAAY,IAAA,EAAmB;AACtC,IAAA,IAAI,cAAA,EAAgB;AACpB,IAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AACd,IAAA,IAAI,IAAA,CAAK,MAAA,GAAS,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACpC,IAAA,MAAA,CAAO,MAAA,GAAS,CAAA;AAAA,EAClB;AAEA,EAAA,SAAS,YAAY,MAAA,EAAsB;AACzC,IAAA,MAAM,IAAA,GAAO,KAAA;AACb,IAAA,KAAA,GAAQC,aAAA,CAAQ,OAAO,CAAA,KAAA,KAAS;AAAE,MAAA,MAAA,CAAO,OAAO,MAAM,CAAA;AAAA,IAAG,CAAC,CAAA;AAC1D,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,WAAA,CAAY,IAAI,CAAA;AAChB,MAAA,MAAA,CAAO,MAAM,MAAM,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,UAAU,MAAM,KAAA;AAAA,IAEhB,SAAS,MAAA,EAAgB;AACvB,MAAA,IAAI,WAAA,EAAa,MAAM,IAAI,KAAA,CAAM,gEAA8C,CAAA;AAC/E,MAAA,IAAI,kBAAA,EAAoB;AACtB,QAAA,kBAAA,CAAmB,KAAK,MAAM,CAAA;AAC9B,QAAA;AAAA,MACF;AACA,MAAA,WAAA,GAAc,IAAA;AACd,MAAA,IAAI;AAAE,QAAA,WAAA,CAAY,MAAM,CAAA;AAAA,MAAG,CAAA,SAAE;AAAU,QAAA,WAAA,GAAc,KAAA;AAAA,MAAO;AAAA,IAC9D,CAAA;AAAA,IAEA,UAAU,QAAA,EAAU;AAClB,MAAA,SAAA,CAAU,IAAI,QAAQ,CAAA;AACtB,MAAA,OAAO,MAAM;AAAE,QAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AAAA,MAAG,CAAA;AAAA,IAC7C,CAAA;AAAA,IAEA,IAAA,GAAO;AACL,MAAA,MAAM,IAAA,GAAO,KAAK,GAAA,EAAI;AACtB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,MAAA,MAAM,GAAA,GAAM,KAAA;AACZ,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA,MAAA,CAAO,KAAK,WAAW,CAAA;AAAA,IACzB,CAAA;AAAA,IAEA,IAAA,GAAO;AACL,MAAA,MAAM,IAAA,GAAO,OAAO,GAAA,EAAI;AACxB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AACf,MAAA,IAAI,IAAA,CAAK,MAAA,GAAS,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AACpC,MAAA,MAAM,GAAA,GAAM,KAAA;AACZ,MAAA,KAAA,GAAQ,IAAA;AACR,MAAA,MAAA,CAAO,KAAK,WAAW,CAAA;AAAA,IACzB,CAAA;AAAA,IAEA,OAAA,EAAS,MAAM,IAAA,CAAK,MAAA,GAAS,CAAA;AAAA,IAC7B,OAAA,EAAS,MAAM,MAAA,CAAO,MAAA,GAAS,CAAA;AAAA,IAE/B,YAAY,EAAA,EAAI;AACd,MAAA,IAAI,kBAAA,EAAoB,MAAM,IAAI,KAAA,CAAM,8DAA4C,CAAA;AACpF,MAAA,kBAAA,GAAqB,EAAC;AACtB,MAAA,IAAI;AAAE,QAAA,EAAA,CAAG,CAAC,CAAA,KAAM;AAAE,UAAA,kBAAA,CAAoB,KAAK,CAAC,CAAA;AAAA,QAAG,CAAC,CAAA;AAAA,MAAG,CAAA,SACnD;AACE,QAAA,MAAM,OAAA,GAAU,kBAAA;AAChB,QAAA,kBAAA,GAAqB,IAAA;AACrB,QAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,UAAA,WAAA,CAAY,EAAE,IAAA,EAAM,aAAA,EAAe,SAAS,EAAE,OAAA,IAAW,CAAA;AAAA,QAC3D;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IAEA,eAAe,EAAA,EAAI;AACjB,MAAA,MAAM,WAAA,GAAc,cAAA;AACpB,MAAA,cAAA,GAAiB,IAAA;AACjB,MAAA,IAAI;AAAE,QAAA,EAAA,EAAG;AAAA,MAAG,CAAA,SAAE;AAAU,QAAA,cAAA,GAAiB,WAAA;AAAA,MAAa;AAAA,IACxD;AAAA,GACF;AACF;AAnHA,IAqBM,iBAEA,WAAA,EACA,WAAA;AAxBN,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yBAAA,GAAA;AAEA,IAAA,YAAA,EAAA;AAmBA,IAAM,eAAA,GAAkB,GAAA;AAExB,IAAM,WAAA,GAAsB,EAAE,IAAA,EAAM,aAAA,EAAe,SAAS,EAAE,OAAA,EAAS,EAAC,EAAE,EAAE;AAC5E,IAAM,WAAA,GAAsB,EAAE,IAAA,EAAM,aAAA,EAAe,SAAS,EAAE,OAAA,EAAS,EAAC,EAAE,EAAE;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpBrE,SAAS,YAAY,KAAA,EAA6B;AACvD,EAAA,OAAO,KAAA,CAAM,KAAA,CACV,GAAA,CAAI,CAAA,EAAA,KAAM,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAC,CAAA,CAC3B,MAAA,CAAO,CAAC,CAAA,KAAwB,MAAM,MAAS,CAAA;AACpD;AAsCO,SAAS,SAAA,CAAU,OAAc,IAAA,EAAsB;AAC5D,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAI,CAAA,IAAK,CAAC,IAAI,CAAA;AACzC,EAAA,MAAM,OAAO,IAAI,GAAA;AAAA,IACf,WAAA,CAAY,KAAK,CAAA,CAAE,MAAA,CAAO,OAAK,KAAA,CAAM,QAAA,CAAS,CAAA,CAAE,IAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,KAAK;AAAA,GACzE;AACA,EAAA,KAAA,MAAW,CAAA,IAAK,UAAU,IAAI,CAAC,KAAK,GAAA,CAAI,CAAC,GAAG,OAAO,CAAA;AACnD,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,MAAA,MAAM,SAAA,GAAY,CAAA,EAAG,CAAC,CAAA,EAAG,GAAG,CAAA,CAAA;AAC5B,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,SAAS,GAAG,OAAO,SAAA;AAAA,IACnC;AACA,IAAA,GAAA,IAAO,CAAA;AAAA,EACT;AACF;AA5DA,IAiCM,QAAA,EAQA,YAAA;AAzCN,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6BAAA,GAAA;AAiCA,IAAM,QAAA,GAAW,4BAAA;AAQjB,IAAM,YAAA,GAAkD;AAAA,MACtD,KAAA,EAAO,CAAC,OAAA,EAAS,cAAc,CAAA;AAAA,MAC/B,YAAA,EAAc,CAAC,OAAA,EAAS,cAAc;AAAA,KACxC;AAAA,EAAA;AAAA,CAAA,CAAA;ACxBO,SAAS,eAAe,IAAA,EAAmC;AAChE,EAAA,MAAM,EAAE,KAAA,EAAO,YAAA,EAAc,eAAA,EAAiB,qBAAA,GAAwB,MAAK,GAAI,IAAA;AAE/E,EAAA,MAAM,kBAAA,GAA2BC,wBAAO,eAAe,CAAA;AACvD,EAAA,kBAAA,CAAmB,OAAA,GAAU,eAAA;AAE7B,EAAMA,2BAAU,MAAM;AACpB,IAAA,IAAI,cAAc,KAAA,EAAO;AACvB,MAAA,MAAM,SAAS,YAAA,CAAa,KAAA;AAC5B,MAAA,KAAA,CAAM,eAAe,MAAM;AACzB,QAAA,KAAA,CAAM,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,EAAE,KAAA,EAAO,MAAA,EAAO,EAAG,CAAA;AAAA,MAC7D,CAAC,CAAA;AAAA,IACH;AAAA,EAEF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAMA,2BAAU,MAAM;AACpB,IAAA,kBAAA,CAAmB,UAAU,KAAA,CAAM,OAAA,EAAQ,EAAG,KAAA,CAAM,SAAS,CAAA;AAC7D,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,CAAU,MAAM;AAClC,MAAA,kBAAA,CAAmB,UAAU,KAAA,CAAM,OAAA,EAAQ,EAAG,KAAA,CAAM,SAAS,CAAA;AAAA,IAC/D,CAAC,CAAA;AACD,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAMA,2BAAU,MAAM;AACpB,IAAA,IAAI,CAAC,qBAAA,EAAuB;AAC5B,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,MAAM,KAAK,QAAA,CAAS,aAAA;AACpB,MAAA,MAAM,OAAA,GAAU,CAAC,EACf,EAAA,KAAO,EAAA,CAAG,YAAY,OAAA,IAAW,EAAA,CAAG,OAAA,KAAY,UAAA,IAAc,EAAA,CAAG,iBAAA,CAAA,CAAA;AAEnE,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,IAAI,EAAE,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,CAAA,EAAU;AAC/B,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY;AAC9B,MAAA,IAAI,GAAA,KAAQ,GAAA,IAAO,CAAC,CAAA,CAAE,QAAA,EAAU;AAC9B,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,KAAA,CAAM,IAAA,EAAK;AAAA,MACb,CAAA,MAAA,IAAY,QAAQ,GAAA,IAAO,CAAA,CAAE,YAAc,GAAA,KAAQ,GAAA,IAAO,CAAC,CAAA,CAAE,QAAA,EAAW;AACtE,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,KAAA,CAAM,IAAA,EAAK;AAAA,MACb;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,iBAAiB,SAAA,EAAW,KAAA,EAAO,EAAE,OAAA,EAAS,MAAM,CAAA;AAC3D,IAAA,OAAO,MAAM,OAAO,mBAAA,CAAoB,SAAA,EAAW,OAAO,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,EAC7E,CAAA,EAAG,CAAC,KAAA,EAAO,qBAAqB,CAAC,CAAA;AACnC;AAnEA,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,wCAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AAGA,IAAA,mBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACSO,SAAS,eAAe,CAAA,EAA2B;AACxD,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,SAAA;AAAW,MAAA,OAAO,CAAC,EAAE,OAAO,CAAA;AAAA,IACjC,KAAK,QAAA;AAAU,MAAA,OAAO,CAAC,EAAE,MAAM,CAAA;AAAA,IAC/B,KAAK,WAAA;AAAa,MAAA,OAAO,CAAC,EAAE,SAAS,CAAA;AAAA,IACrC,KAAK,UAAA;AAAY,MAAA,OAAO,CAAC,EAAE,QAAQ,CAAA;AAAA,IACnC;AAAS,MAAA,OAAO,EAAC;AAAA;AAErB;AApBA,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uCAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAUM,GAAA;AAVN,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAA,iBAAA,EAAA;AAOA,IAAM,GAAA,GAA6B;AAAA,MACjC,IAAA,EAAM,SAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,CAAC,KAAK,CAAC,CAAA,CAAE,cAAc,CAAC,CAAA,CAAE,WAAW,IAAA,EAAM;AAC7C,UAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,QAChD;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAA,KAAM,cAAA,CAAe,EAAE,UAAU,CAAA;AAAA,MAC7C,OAAA,EAAS,CAAC,GAAA,KAAQ;AAChB,QAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,UAAA;AACpB,QAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACrB,UAAA,OAAO;AAAA,YACL,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,EAAE,CAAA,EAAE;AAAA,YACzB,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,EAAE,CAAA,EAAE;AAAA,YACzB,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,EAAE,CAAA;AAAE,WAC3B;AAAA,QACF;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AACzB,UAAA,OAAO;AAAA,YACL,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,EAAE,CAAA,EAAE;AAAA,YACzB,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,EAAE,CAAA,EAAE;AAAA,YACzB,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,CAAA;AAAE,WACzB;AAAA,QACF;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MACA,QAAA,EAAU,CAAC,GAAA,KAAQ;AACjB,QAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,UAAA;AACpB,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ,OAAO,CAAA,EAAG,IAAI,KAAK,CAAA,IAAA,EAAO,CAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,KAAK,CAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AACrG,QAAA,IAAI,EAAE,IAAA,KAAS,UAAA,SAAmB,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,IAAA,EAAO,CAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,EAAK,EAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,IAAA,CAAA;AACtF,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU,OAAO,GAAG,GAAA,CAAI,KAAK,CAAA,mBAAA,EAAc,CAAA,CAAE,IAAI,CAAA,IAAA,EAAO,CAAA,CAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AACrF,QAAA,IAAI,CAAA,CAAE,SAAS,SAAA,EAAW,OAAO,GAAG,GAAA,CAAI,KAAK,CAAA,kBAAA,EAAa,CAAA,CAAE,OAAO,CAAA,CAAA;AACnE,QAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU,OAAO,GAAG,GAAA,CAAI,KAAK,CAAA,8BAAA,EAAe,CAAA,CAAE,MAAM,CAAA,CAAA;AACnE,QAAA,IAAI,CAAA,CAAE,SAAS,WAAA,EAAa,OAAO,GAAG,GAAA,CAAI,KAAK,CAAA,yBAAA,EAAiB,CAAA,CAAE,SAAS,CAAA,CAAA;AAC3E,QAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY,OAAO,GAAG,GAAA,CAAI,KAAK,CAAA,2BAAA,EAAiB,CAAA,CAAE,QAAQ,CAAA,CAAA;AACzE,QAAA,OAAO,GAAA,CAAI,KAAA;AAAA,MACb,CAAA;AAAA,MACA,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAmB;AAC/B,QAAA,MAAM,OAAO,GAAA,CAAI,GAAA;AACjB,QAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,UAAA;AACpB,QAAA,MAAM,IAAA,GAAO;AAAA,UACX,MAAM,GAAA,CAAI,KAAA;AAAA,UACV,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,OAAO,GAAA,CAAI,MAAA;AAAA,UACX,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAChC,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAC9B,IAAA,EAAM;AAAA,SACR;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACrB,UAAA,OAAO,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,CAAC,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,IAAI,CAAA;AAAA,QACrD,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,UAAA,EAAY;AAChC,UAAA,OAAO,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,CAAC,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA,EAAG,CAAC,CAAA,EAAG,IAAI,CAAA;AAAA,QACnD,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU;AAC9B,UAAA,MAAM,MAAA,GACJ,EAAE,IAAA,KAAS,GAAA,GAAM,CAAC,CAAA,CAAE,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAC3B,CAAA,CAAE,SAAS,GAAA,GAAM,CAAC,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAC,IACV,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AAC7B,UAAA,OAAO,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,MAAA,EAAQ,IAAI,CAAA;AAAA,QAC5C,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,SAAA,EAAW;AAC/B,UAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,OAAO,CAAA;AACtC,UAAA,OAAO,IAAA,CAAK,OAAO,SAAA,EAAW;AAAA,YAC5B,MAAM,MAAM,CAAA,CAAE,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,EAAE,CAAC,CAAA;AAAA,YACzB,MAAM,MAAM,CAAA,CAAE,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,EAAE,CAAC,CAAA;AAAA,YACzB,MAAM,MAAM,CAAA,CAAE,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,EAAE,CAAC;AAAA,aACxB,IAAI,CAAA;AAAA,QACT,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU;AAC9B,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,MAAM,CAAA;AACpC,UAAA,OAAO,IAAA,CAAK,OAAO,SAAA,EAAW;AAAA,YAC5B,MAAM,IAAA,CAAK,CAAA,CAAE,CAAA,CAAE,CAAC,EAAE,CAAC,CAAA;AAAA,YACnB,MAAM,IAAA,CAAK,CAAA,CAAE,CAAA,CAAE,CAAC,EAAE,CAAC,CAAA;AAAA,YACnB,MAAM,IAAA,CAAK,CAAA,CAAE,CAAA,CAAE,CAAC,EAAE,CAAC;AAAA,aAClB,IAAI,CAAA;AAAA,QACT,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,WAAA,EAAa;AACjC,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,SAAS,CAAA;AACvC,UAAA,OAAO,IAAA,CAAK,OAAO,SAAA,EAAW;AAAA,YAC5B,MAAM,KAAK,CAAA,CAAE,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,EAAE,CAAC,CAAA;AAAA,YACxB,MAAM,KAAK,CAAA,CAAE,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,EAAE,CAAC,CAAA;AAAA,YACxB,MAAM,KAAK,CAAA,CAAE,CAAA,CAAE,GAAG,CAAA,CAAE,CAAC,EAAE,CAAC;AAAA,aACvB,IAAI,CAAA;AAAA,QACT,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,UAAA,EAAY;AAChC,UAAA,MAAM,GAAA,GAAM,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,QAAQ,CAAA;AACrC,UAAA,OAAO,IAAA,CAAK,OAAO,SAAA,EAAW;AAAA,YAC5B,MAAM,IAAI,CAAA,CAAE,CAAA,CAAE,OAAO,CAAA,CAAE,GAAG,EAAE,CAAC,CAAA;AAAA,YAC7B,MAAM,IAAI,CAAA,CAAE,CAAA,CAAE,OAAO,CAAA,CAAE,GAAG,EAAE,CAAC,CAAA;AAAA,YAC7B,MAAM,IAAI,CAAA,CAAE,CAAA,CAAE,OAAO,CAAA,CAAE,GAAG,EAAE,CAAC;AAAA,aAC5B,IAAI,CAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA,CAAK,OAAO,SAAA,EAAW,CAAC,GAAG,CAAA,EAAG,CAAC,GAAG,IAAI,CAAA;AAAA,MAC/C;AAAA,KACF;AAEA,IAAA,YAAA,CAAa,GAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC/FT,SAAS,OAAA,CAAQ,IAAY,KAAA,EAAkC;AACpE,EAAA,OAAO,KAAA,EAAO,OAAA,CAAQ,EAAE,CAAA,EAAG,KAAA,IAAS,EAAA;AACtC;AAVA,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAOMF,IAAAA;AAPN,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAA,YAAA,EAAA;AAIA,IAAMA,IAAAA,GAA+B;AAAA,MACnC,IAAA,EAAM,WAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,CAAC,GAAG,EAAA,IAAM,CAAC,GAAG,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,2CAA8B,CAAA;AAAA,MACtE,CAAA;AAAA,MACA,WAAW,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,EAAE,EAAE,CAAA;AAAA,MAC7B,OAAA,EAAS,CAAC,GAAA,EAAK,KAAA,KAAU;AACvB,QAAA,MAAM,EAAA,GAAK,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,EAAE,CAAA;AACrC,QAAA,MAAM,EAAA,GAAK,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,EAAE,CAAA;AACrC,QAAA,IAAI,CAAC,EAAA,IAAM,CAAC,EAAA,EAAI,OAAO,IAAA;AACvB,QAAA,MAAM,EAAA,GAAM,GAAG,KAAA,CAAgF,UAAA;AAC/F,QAAA,MAAM,EAAA,GAAM,GAAG,KAAA,CAAgF,UAAA;AAC/F,QAAA,IAAI,IAAI,IAAA,KAAS,MAAA,IAAU,EAAA,EAAI,IAAA,KAAS,QAAQ,OAAO,IAAA;AACvD,QAAA,MAAM,EAAA,GAAA,CAAM,EAAA,CAAG,CAAA,IAAK,CAAA,KAAM,GAAG,CAAA,IAAK,CAAA,CAAA;AAClC,QAAA,MAAM,EAAA,GAAA,CAAM,EAAA,CAAG,CAAA,IAAK,CAAA,KAAM,GAAG,CAAA,IAAK,CAAA,CAAA;AAClC,QAAA,MAAM,EAAA,GAAA,CAAM,EAAA,CAAG,CAAA,IAAK,CAAA,KAAM,GAAG,CAAA,IAAK,CAAA,CAAA;AAClC,QAAA,OAAO,CAAC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA;AAAA,MAC5D,CAAA;AAAA,MACA,UAAU,CAAC,GAAA,EAAK,KAAA,KAAU,CAAA,0BAAA,EAAc,QAAQ,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAC,CAAA,EAAG,OAAA,CAAQ,IAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAC,CAAA,CAAA;AAAA,MACnG,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AACpB,QAAA,MAAM,OAAO,GAAA,CAAI,GAAA;AACjB,QAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,EAAE,CAAA;AACtC,QAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,EAAE,CAAA;AACtC,QAAA,OAAO,KAAK,MAAA,CAAO,QAAA,EAAU,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG;AAAA,UACrC,aAAA,EAAe,KAAA;AAAA,UACf,YAAA,EAAc,KAAA;AAAA,UACd,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAChC,WAAA,EAAa,CAAA;AAAA,UACb,SAAS,GAAA,CAAI;AAAA,SACd,CAAA;AAAA,MACH;AAAA,KACF;AAEA,IAAA,YAAA,CAAaA,IAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC1ChB,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAA,YAAA,EAAA;AAIA,IAAA,YAAA,CAA0B;AAAA,MACxB,IAAA,EAAM,QAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AAAE,QAAA,IAAI,CAAC,GAAG,EAAA,IAAM,CAAC,GAAG,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,wBAAwB,CAAA;AAAA,MAAG,CAAA;AAAA,MACpF,WAAW,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,EAAE,EAAE,CAAA;AAAA,MAC7B,QAAA,EAAU,CAAC,GAAA,EAAK,KAAA,KAAU,wBAAS,GAAA,CAAI,KAAK,QAAQ,OAAA,CAAQ,GAAA,CAAI,MAAM,EAAA,EAAI,KAAK,CAAC,CAAA,EAAA,EAAK,OAAA,CAAQ,IAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAC,CAAA,CAAA;AAAA,MACjH,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AACpB,QAAA,MAAM,OAAO,GAAA,CAAI,GAAA;AACjB,QAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,EAAE,CAAA;AACtC,QAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,EAAE,CAAA;AACtC,QAAA,OAAO,KAAK,MAAA,CAAO,QAAA,EAAU,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG;AAAA,UACrC,aAAA,EAAe,IAAA;AAAA,UACf,YAAA,EAAc,IAAA;AAAA,UACd,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAChC,WAAA,EAAa,CAAA;AAAA,UACb,SAAS,GAAA,CAAI;AAAA,SACd,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC1BD,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAA,YAAA,EAAA;AAIA,IAAA,YAAA,CAAyB;AAAA,MACvB,IAAA,EAAM,OAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AAAE,QAAA,IAAI,CAAC,GAAG,MAAA,IAAU,CAAC,GAAG,OAAA,EAAS,MAAM,IAAI,KAAA,CAAM,gCAAgC,CAAA;AAAA,MAAG,CAAA;AAAA,MACrG,WAAW,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,MAAA,EAAQ,EAAE,OAAO,CAAA;AAAA,MACtC,QAAA,EAAU,CAAC,GAAA,EAAK,KAAA,KAAU,OAAO,GAAA,CAAI,KAAK,YAAO,OAAA,CAAQ,GAAA,CAAI,MAAM,MAAA,EAAQ,KAAK,CAAC,CAAA,KAAA,EAAQ,OAAA,CAAQ,IAAI,KAAA,CAAM,OAAA,EAAS,KAAK,CAAC,CAAA,CAAA;AAAA,MAC1H,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AACpB,QAAA,MAAM,OAAO,GAAA,CAAI,GAAA;AACjB,QAAA,MAAM,OAAA,GAAU,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,MAAM,CAAA;AAC/C,QAAA,MAAM,QAAA,GAAW,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,OAAO,CAAA;AACjD,QAAA,OAAO,KAAK,MAAA,CAAO,QAAA,EAAU,CAAC,OAAA,EAAS,QAAQ,CAAA,EAAG;AAAA,UAChD,aAAA,EAAe,KAAA;AAAA,UACf,YAAA,EAAc,IAAA;AAAA,UACd,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAChC,WAAA,EAAa,CAAA;AAAA,UACb,SAAS,GAAA,CAAI;AAAA,SACd,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC1BD,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAA,YAAA,EAAA;AAIA,IAAA,YAAA,CAA4B;AAAA,MAC1B,IAAA,EAAM,UAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AAAE,QAAA,IAAI,CAAC,GAAG,IAAA,IAAQ,CAAC,GAAG,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,4BAA4B,CAAA;AAAA,MAAG,CAAA;AAAA,MAC1F,WAAW,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,EAAE,EAAE,CAAA;AAAA,MAC/B,QAAA,EAAU,CAAC,GAAA,EAAK,KAAA,KAAU,kBAAU,GAAA,CAAI,KAAK,KAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,IAAA,EAAM,KAAK,CAAC,CAAA,QAAA,EAAM,OAAA,CAAQ,IAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAC,CAAA,CAAA;AAAA,MAClH,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AACpB,QAAA,MAAM,OAAO,GAAA,CAAI,GAAA;AACjB,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,IAAI,CAAA;AAC3C,QAAA,MAAM,GAAA,GAAM,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,EAAE,CAAA;AACvC,QAAA,OAAO,KAAK,MAAA,CAAO,QAAA,EAAU,CAAC,KAAA,EAAO,GAAG,CAAA,EAAG;AAAA,UACzC,aAAA,EAAe,KAAA;AAAA,UACf,YAAA,EAAc,KAAA;AAAA,UACd,SAAA,EAAW,EAAE,IAAA,EAAM,CAAA,EAAE;AAAA,UACrB,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAChC,WAAA,EAAa,CAAA;AAAA,UACb,SAAS,GAAA,CAAI;AAAA,SACd,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC3BD,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAA,YAAA,EAAA;AAIA,IAAA,YAAA,CAA2B;AAAA,MACzB,IAAA,EAAM,SAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AAAE,QAAA,IAAI,CAAC,CAAA,EAAG,EAAA,IAAM,CAAC,CAAA,EAAG,EAAA,IAAM,CAAC,CAAA,EAAG,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,oCAAqB,CAAA;AAAA,MAAG,CAAA;AAAA,MAC3F,SAAA,EAAW,CAAC,CAAA,KAAM,CAAC,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,EAAE,CAAA;AAAA,MACnC,QAAA,EAAU,CAAC,GAAA,EAAK,KAAA,KAAU,CAAA,SAAA,EAAO,GAAA,CAAI,KAAK,CAAA,KAAA,EAAQ,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAC,CAAA,EAAA,EAAK,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAC,CAAA,EAAA,EAAK,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAC,CAAA,CAAA;AAAA,MAChJ,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AACpB,QAAA,MAAM,OAAO,GAAA,CAAI,GAAA;AACjB,QAAA,OAAO,IAAA,CAAK,OAAO,SAAA,EAAW;AAAA,UAC5B,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AAAA,UAC3B,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AAAA,UAC3B,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,EAAE;AAAA,SAC7B,EAAG;AAAA,UACD,WAAA,EAAa,IAAA;AAAA,UACb,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAC9B,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAChC,SAAS,GAAA,CAAI;AAAA,SACd,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC3BD,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAKA,IAAA,YAAA,CAA6B;AAAA,MAC3B,IAAA,EAAM,WAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,CAAC,CAAA,EAAG,QAAA,IAAY,CAAA,CAAE,QAAA,CAAS,SAAS,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,sCAA4B,CAAA;AAAA,MACzF,CAAA;AAAA,MACA,WAAW,CAAC,CAAA,KAAM,CAAC,GAAG,EAAE,QAAQ,CAAA;AAAA,MAChC,QAAA,EAAU,CAAC,GAAA,KAAQ,CAAA,gBAAA,EAAW,GAAA,CAAI,KAAK,CAAA,EAAA,EAAK,GAAA,CAAI,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,gBAAA,CAAA;AAAA,MACrE,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AACpB,QAAA,MAAM,OAAO,GAAA,CAAI,GAAA;AACjB,QAAA,MAAM,IAAA,GAAO,IAAI,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAA,KAAM,GAAA,CAAI,UAAA,CAAW,EAAE,CAAC,CAAA;AAC5D,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa,CAAC,IAAI,CAAA,EAAG;AAAA,UACtC,WAAA,EAAa,GAAA;AAAA,UACb,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAC9B,SAAS,GAAA,CAAI;AAAA,SACd,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACxBD,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAA,YAAA,EAAA;AAIA,IAAA,YAAA,CAA4B;AAAA,MAC1B,IAAA,EAAM,UAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AAAE,QAAA,IAAI,CAAC,GAAG,MAAA,IAAU,CAAC,GAAG,YAAA,EAAc,MAAM,IAAI,KAAA,CAAM,wCAAwC,CAAA;AAAA,MAAG,CAAA;AAAA,MAClH,WAAW,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,MAAA,EAAQ,EAAE,YAAY,CAAA;AAAA,MAC3C,QAAA,EAAU,CAAC,GAAA,EAAK,KAAA,KAAU,CAAA,kBAAA,EAAW,GAAA,CAAI,KAAK,CAAA,QAAA,EAAQ,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAC,CAAA,CAAA;AAAA,MACtF,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AACpB,QAAA,MAAM,OAAO,GAAA,CAAI,GAAA;AACjB,QAAA,OAAO,IAAA,CAAK,OAAO,UAAA,EAAY;AAAA,UAC7B,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA;AAAA,UAC/B,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,KAAA,CAAM,YAAY;AAAA,SACvC,EAAG;AAAA,UACD,WAAA,EAAa,IAAA;AAAA,UACb,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAC9B,SAAS,GAAA,CAAI;AAAA,SACd,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACzBD,IAaM,YAAA;AAbN,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAYA,IAAM,YAAA,GAAiD;AAAA,MACrD,OAAA,EAAS,SAAA;AAAA,MACT,KAAA,EAAO,oBAAA;AAAA,MACP,WAAA,EAAa,mBAAA;AAAA,MACb,IAAA,EAAM;AAAA,KACR;AAEA,IAAA,YAAA,CAAgC;AAAA,MAC9B,IAAA,EAAM,cAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,CAAC,CAAA,EAAG,QAAA,IAAY,CAAA,CAAE,QAAA,CAAS,SAAS,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,yCAA+B,CAAA;AAC1F,QAAA,IAAI,CAAC,CAAA,EAAG,KAAA,IAAS,CAAA,CAAE,KAAA,CAAM,SAAS,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,sCAA4B,CAAA;AAAA,MACnF,CAAA;AAAA,MACA,WAAW,CAAC,CAAA,KAAM,CAAC,GAAG,EAAE,QAAQ,CAAA;AAAA,MAChC,QAAA,EAAU,CAAC,GAAA,KAAQ,CAAA,UAAA,EAAQ,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM,MAAM,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAK,CAAA,CAAA;AAAA,MACtE,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AACpB,QAAA,MAAM,OAAO,GAAA,CAAI,GAAA;AACjB,QAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAA,KAAM,GAAA,CAAI,UAAA,CAAW,EAAE,CAAC,CAAA;AAC7D,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,GAAA;AAAA,UAAI,CAAC,WAAA,EAAa,EAAA,KAC9C,IAAA,CAAK,OAAO,WAAA,EAAa,CAAC,WAAA,CAAY,GAAA,CAAI,CAAA,CAAA,KAAK,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA,EAAG;AAAA,YACzD,EAAA,EAAI,CAAA,EAAG,GAAA,CAAI,EAAE,CAAA,KAAA,EAAQ,YAAY,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AAAA,YAChD,WAAA,EAAa,IAAA;AAAA,YACb,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,YAC9B,WAAA,EAAa,SAAA;AAAA,YACb,WAAA,EAAa,GAAA;AAAA,YACb,SAAS,GAAA,CAAI;AAAA,WACd;AAAA,SACH;AACA,QAAA,OAAO,EAAE,KAAA,EAAM;AAAA,MACjB;AAAA,KACD,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC7CD,IAOM,eAAA;AAPN,IAAA,eAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAMA,IAAM,eAAA,GAAkB,EAAA;AAExB,IAAA,YAAA,CAA8B;AAAA,MAC5B,IAAA,EAAM,YAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,CAAC,GAAG,UAAA,IAAc,CAAC,GAAG,SAAA,EAAW,MAAM,IAAI,KAAA,CAAM,2CAA2C,CAAA;AAChG,QAAA,IAAI,EAAE,CAAA,CAAE,MAAA,GAAS,IAAI,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,MAC/D,CAAA;AAAA,MACA,WAAW,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,UAAA,EAAY,EAAE,SAAS,CAAA;AAAA,MAC5C,QAAA,EAAU,CAAC,GAAA,KAAQ,CAAA,SAAA,EAAO,GAAA,CAAI,KAAK,CAAA,GAAA,EAAM,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,MACpE,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AACpB,QAAA,MAAM,OAAO,GAAA,CAAI,GAAA;AACjB,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,UAAU,CAAA;AAC7C,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,SAAS,CAAA;AAC5C,QAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,MAAA;AAEpB,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,IAAI,IAAK,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,CAAA,IAAI,IAAK,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,KAAI,IAAK,CAAA;AAC5D,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,CAAA,IAAI,IAAK,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,CAAA,IAAI,IAAK,CAAA,EAAG,EAAA,GAAK,CAAA,CAAE,KAAI,IAAK,CAAA;AAE5D,QAAA,MAAM,WAAuC,EAAC;AAC9C,QAAA,MAAM,UAAsC,EAAC;AAC7C,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,eAAA,EAAiB,CAAA,EAAA,EAAK;AACxC,UAAA,MAAM,KAAA,GAAS,CAAA,GAAI,eAAA,GAAmB,IAAA,CAAK,EAAA,GAAK,CAAA;AAChD,UAAA,MAAM,EAAA,GAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC7B,UAAA,MAAM,EAAA,GAAK,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC7B,UAAA,QAAA,CAAS,KAAK,CAAC,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA,EAAI,EAAE,CAAC,CAAA;AACpC,UAAA,OAAA,CAAQ,KAAK,CAAC,EAAA,GAAK,IAAI,EAAA,GAAK,EAAA,EAAI,EAAE,CAAC,CAAA;AAAA,QACrC;AACA,QAAA,MAAM,QAAA,GAAW,CAAC,GAAG,QAAA,EAAU,GAAG,OAAO,CAAA;AACzC,QAAA,MAAM,QAAoB,EAAC;AAC3B,QAAA,KAAA,CAAM,KAAK,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAC,CAAA;AACpC,QAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM,eAAA,GAAkB,CAAC,CAAC,CAAA;AACrD,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,eAAA,EAAiB,CAAA,EAAA,EAAK;AACxC,UAAA,MAAM,IAAA,GAAA,CAAQ,IAAI,CAAA,IAAK,eAAA;AACvB,UAAA,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,IAAA,EAAM,kBAAkB,IAAA,EAAM,eAAA,GAAkB,CAAC,CAAC,CAAA;AAAA,QACnE;AACA,QAAA,MAAM,WAAsB,QAAA,CAAS,GAAA;AAAA,UAAI,CAAC,CAAA,EAAG,CAAA,KAC3C,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA,EAAG;AAAA,YACxB,EAAA,EAAI,CAAA,EAAG,GAAA,CAAI,EAAE,KAAK,CAAC,CAAA,CAAA;AAAA,YACnB,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,IAAA;AAAA,YACP,SAAA,EAAW;AAAA,WACZ;AAAA,SACH;AACA,QAAA,MAAM,WAAsB,KAAA,CAAM,GAAA;AAAA,UAAI,CAAC,IAAA,EAAM,EAAA,KAC3C,IAAA,CAAK,OAAO,WAAA,EAAa,CAAC,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,QAAA,CAAS,GAAG,CAAC,CAAC,CAAA,EAAG;AAAA,YACzD,EAAA,EAAI,CAAA,EAAG,GAAA,CAAI,EAAE,QAAQ,EAAE,CAAA,CAAA;AAAA,YACvB,WAAA,EAAa,IAAA;AAAA,YACb,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,YAC9B,WAAA,EAAa,SAAA;AAAA,YACb,WAAA,EAAa,GAAA;AAAA,YACb,SAAS,GAAA,CAAI;AAAA,WACd;AAAA,SACH;AACA,QAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,MAC7C;AAAA,KACD,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjED,IAOMG,gBAAAA;AAPN,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAMA,IAAMA,gBAAAA,GAAkB,EAAA;AAExB,IAAA,YAAA,CAA0B;AAAA,MACxB,IAAA,EAAM,QAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,CAAC,GAAG,UAAA,IAAc,CAAC,GAAG,IAAA,EAAM,MAAM,IAAI,KAAA,CAAM,kCAAkC,CAAA;AAClF,QAAA,IAAI,EAAE,CAAA,CAAE,MAAA,GAAS,IAAI,MAAM,IAAI,MAAM,oBAAoB,CAAA;AAAA,MAC3D,CAAA;AAAA,MACA,WAAW,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,UAAA,EAAY,EAAE,IAAI,CAAA;AAAA,MACvC,QAAA,EAAU,CAAC,GAAA,KAAQ,CAAA,OAAA,EAAO,GAAA,CAAI,KAAK,CAAA,GAAA,EAAM,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,MACpE,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AACpB,QAAA,MAAM,OAAO,GAAA,CAAI,GAAA;AACjB,QAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,UAAU,CAAA;AAChD,QAAA,MAAM,MAAA,GAAS,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,IAAI,CAAA;AAC5C,QAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,MAAA;AAEpB,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,IAAI,IAAK,CAAA,EAAG,EAAA,GAAK,IAAA,CAAK,CAAA,IAAI,IAAK,CAAA,EAAG,EAAA,GAAK,IAAA,CAAK,KAAI,IAAK,CAAA;AACrE,QAAA,MAAM,UAAA,GAAuC;AAAA,UAC3C,MAAA,CAAO,KAAI,IAAK,CAAA;AAAA,UAChB,MAAA,CAAO,KAAI,IAAK,CAAA;AAAA,UAChB,MAAA,CAAO,KAAI,IAAK;AAAA,SAClB;AAEA,QAAA,MAAM,WAAuC,EAAC;AAC9C,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,gBAAAA,EAAiB,CAAA,EAAA,EAAK;AACxC,UAAA,MAAM,KAAA,GAAS,CAAA,GAAIA,gBAAAA,GAAmB,IAAA,CAAK,EAAA,GAAK,CAAA;AAChD,UAAA,QAAA,CAAS,IAAA,CAAK,CAAC,EAAA,GAAK,CAAA,GAAI,KAAK,GAAA,CAAI,KAAK,CAAA,EAAG,EAAA,GAAK,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,QACxE;AACA,QAAA,MAAM,UAAU,QAAA,CAAS,MAAA;AACzB,QAAA,MAAM,QAAA,GAAW,CAAC,GAAG,QAAA,EAAU,UAAU,CAAA;AACzC,QAAA,MAAM,KAAA,GAAoB,CAAC,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,CAAC,CAAC,CAAA;AACpD,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,gBAAAA,EAAiB,CAAA,EAAA,EAAK;AACxC,UAAA,KAAA,CAAM,KAAK,CAAC,CAAA,EAAA,CAAI,IAAI,CAAA,IAAKA,gBAAAA,EAAiB,OAAO,CAAC,CAAA;AAAA,QACpD;AACA,QAAA,MAAM,WAAsB,QAAA,CAAS,GAAA;AAAA,UAAI,CAAC,CAAA,EAAG,CAAA,KAC3C,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA,EAAG;AAAA,YACxB,EAAA,EAAI,CAAA,EAAG,GAAA,CAAI,EAAE,KAAK,CAAC,CAAA,CAAA;AAAA,YACnB,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,IAAA;AAAA,YACP,SAAA,EAAW;AAAA,WACZ;AAAA,SACH;AACA,QAAA,MAAM,WAAsB,KAAA,CAAM,GAAA;AAAA,UAAI,CAAC,IAAA,EAAM,EAAA,KAC3C,IAAA,CAAK,OAAO,WAAA,EAAa,CAAC,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,QAAA,CAAS,GAAG,CAAC,CAAC,CAAA,EAAG;AAAA,YACzD,EAAA,EAAI,CAAA,EAAG,GAAA,CAAI,EAAE,QAAQ,EAAE,CAAA,CAAA;AAAA,YACvB,WAAA,EAAa,IAAA;AAAA,YACb,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,YAC9B,WAAA,EAAa,SAAA;AAAA,YACb,WAAA,EAAa,GAAA;AAAA,YACb,SAAS,GAAA,CAAI;AAAA,WACd;AAAA,SACH;AACA,QAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,MAC7C;AAAA,KACD,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC3CM,SAAS,cAAc,CAAA,EAA2B;AACvD,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,WAAA;AAAa,MAAA,OAAO,EAAC;AAAA,IAC1B,KAAK,QAAA;AAAA,IACL,KAAK,cAAA;AAAA,IACL,KAAK,QAAA;AACH,MAAA,OAAO,CAAC,EAAE,MAAM,CAAA;AAAA,IAClB,KAAK,aAAA;AACH,MAAA,OAAO,CAAC,EAAE,IAAI,CAAA;AAAA;AAEpB;AAiBO,SAAS,iBAAiB,CAAA,EAA2B;AAC1D,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,QAAA;AAAU,MAAA,OAAO,CAAC,EAAE,MAAM,CAAA;AAAA,IAC/B,KAAK,WAAA;AAAa,MAAA,OAAO,CAAC,EAAE,SAAS,CAAA;AAAA,IACrC,KAAK,UAAA;AAAY,MAAA,OAAO,CAAC,EAAE,QAAQ,CAAA;AAAA,IACnC,KAAK,WAAA;AAAa,MAAA,OAAO,CAAC,EAAE,SAAS,CAAA;AAAA,IACrC,KAAK,UAAA;AAAY,MAAA,OAAO,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,EAAE,CAAA;AAAA,IACnC,KAAK,aAAA;AAAe,MAAA,OAAO,CAAC,CAAA,CAAE,MAAA,EAAQ,GAAG,aAAA,CAAc,CAAA,CAAE,SAAS,CAAC,CAAA;AAAA,IACnE,KAAK,UAAA;AAAY,MAAA,OAAO,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAM,CAAA;AAAA,IACzC,KAAK,cAAA;AAAgB,MAAA,OAAO,CAAC,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IACxE,KAAK,UAAA;AAAY,MAAA,OAAO,CAAC,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IACpE,KAAK,UAAA;AAAY,MAAA,OAAO,CAAC,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IACpE,KAAK,aAAA;AAAe,MAAA,OAAO,CAAC,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IACvE;AAAS,MAAA,OAAO,EAAC;AAAA;AAErB;AA9DA,IAAAC,kBAAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uCAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACaA,SAAS,kBAAA,CAAmB,KAAA,EAAY,GAAA,EAAgB,CAAA,EAAwB;AAC9E,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,WAAA;AACH,MAAA,OAAO,CAAC,KAAA,CAAM,MAAA,CAAO,WAAA,EAAa,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,EAAE,CAAA,EAAG,EAAE,IAAA,EAAM,WAAA,EAAa,CAAC,CAAA;AAAA,IACxE,KAAK,QAAA,EAAU;AAEb,MAAA,MAAM,CAAA,GAAS,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,MAAM,CAAA;AACtC,MAAA,OAAO,CAAC,KAAA,CAAM,MAAA,CAAO,WAAA,EAAa,CAAC,CAAA,CAAE,QAAA,EAAU,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,QAAA,EAAU,CAAC,CAAA;AAAA,IACxE;AAAA,IACA,KAAK,cAAA,EAAgB;AAGnB,MAAA,MAAM,CAAA,GAAS,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,MAAM,CAAA;AACtC,MAAA,OAAO,CAAC,KAAA,CAAM,MAAA,CAAO,WAAA,EAAa,CAAC,IAAA,CAAK,EAAA,EAAI,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,QAAA,EAAU,CAAC,CAAA;AAAA,IACrE;AAAA,IACA,KAAK,aAAA,EAAe;AAElB,MAAA,MAAM,CAAA,GAAS,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,IAAI,CAAA;AACpC,MAAA,OAAO,CAAC,KAAA,CAAM,MAAA,CAAO,WAAA,EAAa,CAAC,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,SAAA,EAAW,CAAC,CAAA;AAAA,IAC7D;AAAA,IACA,KAAK,QAAA,EAAU;AAEb,MAAA,MAAM,CAAA,GAAS,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,MAAM,CAAA;AAEtC,MAAA,OAAO;AAAA,QACL,MAAM,MAAA,CAAO,WAAA,EAAa,CAAC,MAAM,CAAC,EAAE,CAAA,EAAE,EAAG,MAAM,CAAC,EAAE,CAAA,EAAG,GAAG,EAAE,IAAA,EAAM,aAAa,CAAA;AAAA,QAC7E,KAAA,CAAM,MAAA,CAAO,WAAA,EAAa,CAAC,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,QACvD,MAAM,MAAA,CAAO,WAAA,EAAa,CAAC,MAAM,EAAE,CAAA,EAAE,EAAG,MAAM,CAAA,CAAE,GAAG,CAAA,EAAG,EAAE,IAAA,EAAM,aAAa;AAAA,OAC7E;AAAA,IACF;AAAA;AAEJ;AA5CA,IAuDMJ,IAAAA;AAvDN,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAAI,kBAAAA,EAAAA;AAoDA,IAAMJ,IAAAA,GAA2B;AAAA,MAC/B,IAAA,EAAM,OAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,CAAC,KAAK,CAAC,CAAA,CAAE,cAAc,CAAC,CAAA,CAAE,WAAW,IAAA,EAAM;AAC7C,UAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,QAC9C;AACA,QAAA,MAAM,IAAI,CAAA,CAAE,UAAA;AACZ,QAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AACzB,UAAA,IAAI,CAAC,CAAA,CAAE,IAAA,IAAQ,CAAC,EAAE,MAAA,EAAQ;AACxB,YAAA,MAAM,IAAI,MAAM,sDAAyC,CAAA;AAAA,UAC3D;AAAA,QACF;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,cAAA,EAAgB;AAC7B,UAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACzD,YAAA,MAAM,IAAI,MAAM,yDAAiD,CAAA;AAAA,UACnE;AACA,UAAA,IAAI,CAAC,CAAA,CAAE,QAAA,CAAS,CAAC,KAAK,CAAC,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,IAAK,CAAC,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG;AACtD,YAAA,MAAM,IAAI,MAAM,qDAAgD,CAAA;AAAA,UAClE;AAAA,QACF;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AACzB,UAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACzD,YAAA,MAAM,IAAI,MAAM,qDAA6C,CAAA;AAAA,UAC/D;AACA,UAAA,IAAI,CAAC,CAAA,CAAE,QAAA,CAAS,CAAC,KAAK,CAAC,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,IAAK,CAAC,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG;AACtD,YAAA,MAAM,IAAI,MAAM,iDAA4C,CAAA;AAAA,UAC9D;AAAA,QACF;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AACzB,UAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACzD,YAAA,MAAM,IAAI,MAAM,qDAA6C,CAAA;AAAA,UAC/D;AACA,UAAA,IAAI,CAAC,CAAA,CAAE,QAAA,CAAS,CAAC,KAAK,CAAC,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,IAAK,CAAC,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG;AACtD,YAAA,MAAM,IAAI,MAAM,iDAA4C,CAAA;AAAA,UAC9D;AAAA,QACF;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,aAAA,EAAe;AAC5B,UAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACzD,YAAA,MAAM,IAAI,MAAM,wDAAgD,CAAA;AAAA,UAClE;AACA,UAAA,IAAI,CAAC,CAAA,CAAE,QAAA,CAAS,CAAC,KAAK,CAAC,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,IAAK,CAAC,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG;AACtD,YAAA,MAAM,IAAI,MAAM,oDAA+C,CAAA;AAAA,UACjE;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAA,KAAM,gBAAA,CAAiB,EAAE,UAAU,CAAA;AAAA,MAC/C,OAAA,EAAS,CAAC,GAAA,KAAQ;AAChB,QAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,UAAA;AACpB,QAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACrB,UAAA,OAAO;AAAA,YACL,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,EAAE,CAAA,EAAE;AAAA,YACzB,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,EAAE,CAAA;AAAE,WAC3B;AAAA,QACF;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAA;AAAA,MACA,QAAA,EAAU,CAAC,GAAA,EAAK,KAAA,KAAU;AACxB,QAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,UAAA;AACpB,QAAA,IAAI,EAAE,IAAA,KAAS,MAAA,EAAQ,OAAO,CAAA,eAAA,EAAQ,IAAI,KAAK,CAAA,CAAA;AAC/C,QAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU,OAAO,GAAG,GAAA,CAAI,KAAK,CAAA,mBAAA,EAAc,CAAA,CAAE,IAAI,CAAA,CAAA;AAChE,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU,OAAO,GAAG,GAAA,CAAI,KAAK,CAAA,8BAAA,EAAe,KAAA,EAAO,QAAQ,CAAA,CAAE,MAAM,CAAA,EAAG,KAAA,IAAS,EAAE,MAAM,CAAA,CAAA;AACtG,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,WAAA,EAAa,OAAO,GAAG,GAAA,CAAI,KAAK,CAAA,wBAAA,EAAc,KAAA,EAAO,QAAQ,CAAA,CAAE,SAAS,CAAA,EAAG,KAAA,IAAS,EAAE,SAAS,CAAA,CAAA;AAC9G,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,UAAA,EAAY,OAAO,GAAG,GAAA,CAAI,KAAK,CAAA,sCAAA,EAAoB,KAAA,EAAO,QAAQ,CAAA,CAAE,QAAQ,CAAA,EAAG,KAAA,IAAS,EAAE,QAAQ,CAAA,CAAA;AACjH,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,WAAA,EAAa,OAAO,GAAG,GAAA,CAAI,KAAK,CAAA,yBAAA,EAAiB,KAAA,EAAO,QAAQ,CAAA,CAAE,SAAS,CAAA,EAAG,KAAA,IAAS,EAAE,SAAS,CAAA,CAAA;AACjH,QAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AACzB,UAAA,MAAM,KAAK,KAAA,EAAO,OAAA,CAAQ,EAAE,EAAE,CAAA,EAAG,SAAS,CAAA,CAAE,EAAA;AAC5C,UAAA,MAAM,KAAK,KAAA,EAAO,OAAA,CAAQ,EAAE,EAAE,CAAA,EAAG,SAAS,CAAA,CAAE,EAAA;AAC5C,UAAA,OAAO,GAAG,GAAA,CAAI,KAAK,CAAA,wBAAA,EAAiB,EAAE,GAAG,EAAE,CAAA,CAAA;AAAA,QAC7C;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,aAAA,EAAe;AAC5B,UAAA,MAAM,IAAI,CAAA,CAAE,SAAA;AACZ,UAAA,MAAM,WAAW,CAAC,EAAA,KAAe,OAAO,OAAA,CAAQ,EAAE,GAAG,KAAA,IAAS,EAAA;AAC9D,UAAA,MAAM,EAAA,GACJ,CAAA,CAAE,IAAA,KAAS,WAAA,GAAc,CAAA,qBAAA,EAAc,CAAA,CAAE,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,GAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,GACxE,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,CAAA,KAAA,EAAA,CAAU,CAAA,CAAE,QAAA,GAAW,GAAA,GAAO,IAAA,CAAK,EAAA,EAAI,OAAA,CAAQ,CAAC,CAAC,cAAW,QAAA,CAAS,CAAA,CAAE,MAAM,CAAC,CAAA,CAAA,GACpG,CAAA,CAAE,IAAA,KAAS,aAAA,GAAgB,CAAA,4BAAA,EAAgB,QAAA,CAAS,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,GAC3D,CAAA,CAAE,IAAA,KAAS,iBAAiB,CAAA,2CAAA,EAAqB,QAAA,CAAS,CAAA,CAAE,MAAM,CAAC,CAAA,CAAA,GACnE,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,CAAA,kBAAA,EAAW,CAAA,CAAE,CAAC,CAAA,OAAA,EAAU,QAAA,CAAS,CAAA,CAAE,MAAM,CAAC,CAAA,CAAA,GAChE,EAAA;AACJ,UAAA,OAAO,CAAA,EAAG,IAAI,KAAK,CAAA,qBAAA,EAAc,SAAS,CAAA,CAAE,MAAM,CAAC,CAAA,EAAA,EAAK,EAAE,CAAA,CAAA,CAAA;AAAA,QAC5D;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AACzB,UAAA,MAAM,YAAY,KAAA,EAAO,OAAA,CAAQ,EAAE,IAAI,CAAA,EAAG,SAAS,CAAA,CAAE,IAAA;AACrD,UAAA,MAAM,YAAY,KAAA,EAAO,OAAA,CAAQ,EAAE,MAAM,CAAA,EAAG,SAAS,CAAA,CAAE,MAAA;AACvD,UAAA,OAAO,GAAG,GAAA,CAAI,KAAK,CAAA,0BAAA,EAAgB,SAAS,eAAU,SAAS,CAAA,CAAA;AAAA,QACjE;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,cAAA,EAAgB;AAC7B,UAAA,MAAM,MAAA,GAAS,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,KAAO,KAAA,EAAO,OAAA,CAAQ,EAAE,CAAA,EAAG,KAAA,IAAS,EAAE,CAAA,CAAE,KAAK,EAAE,CAAA;AAC9E,UAAA,OAAO,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,qCAAA,EAAsB,MAAM,CAAA,CAAA;AAAA,QACjD;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AACzB,UAAA,MAAM,MAAA,GAAS,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,KAAO,KAAA,EAAO,OAAA,CAAQ,EAAE,CAAA,EAAG,KAAA,IAAS,EAAE,CAAA,CAAE,KAAK,EAAE,CAAA;AAC9E,UAAA,OAAO,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,mCAAA,EAAoB,MAAM,CAAA,CAAA;AAAA,QAC/C;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AACzB,UAAA,MAAM,MAAA,GAAS,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,KAAO,KAAA,EAAO,OAAA,CAAQ,EAAE,CAAA,EAAG,KAAA,IAAS,EAAE,CAAA,CAAE,KAAK,EAAE,CAAA;AAC9E,UAAA,OAAO,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,2BAAA,EAAiB,MAAM,CAAA,CAAA;AAAA,QAC5C;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,aAAA,EAAe;AAC5B,UAAA,MAAM,MAAA,GAAS,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,CAAC,EAAA,KAAO,KAAA,EAAO,OAAA,CAAQ,EAAE,CAAA,EAAG,KAAA,IAAS,EAAE,CAAA,CAAE,KAAK,EAAE,CAAA;AAC9E,UAAA,OAAO,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,0BAAA,EAAgB,MAAM,CAAA,CAAA;AAAA,QAC3C;AACA,QAAA,OAAO,CAAA,eAAA,EAAQ,IAAI,KAAK,CAAA,CAAA;AAAA,MAC1B,CAAA;AAAA,MACA,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AACpB,QAAA,MAAM,QAAQ,GAAA,CAAI,GAAA;AAClB,QAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,UAAA;AACpB,QAAA,MAAM,IAAA,GAAgC;AAAA,UACpC,MAAM,GAAA,CAAI,KAAA;AAAA,UACV,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,SAAA,IAAa,IAAA;AAAA,UAClC,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,OAAO,GAAA,CAAI,MAAA;AAAA,UACX,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAChC,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAC9B,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,IAAA,IAAQ,GAAA;AAAA,UACxB,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,IAAA,IAAQ;AAAA,SAC1B;AACA,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ,OAAO,KAAA,CAAM,MAAA,CAAO,OAAA,EAAS,CAAC,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,GAAG,IAAI,CAAA;AACpE,QAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AACvB,UAAA,MAAM,MAAA,GAA2B,CAAA,CAAE,IAAA,KAAS,GAAA,GAAM,CAAC,CAAA,CAAE,CAAA,EAAG,CAAC,CAAA,GAAI,CAAC,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AACpE,UAAA,OAAO,KAAA,CAAM,MAAA,CAAO,OAAA,EAAS,MAAA,EAAQ,IAAI,CAAA;AAAA,QAC3C;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,QAAA,EAAU;AACvB,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,MAAM,CAAA;AACpC,UAAA,OAAO,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,CAAC,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA,EAAG,IAAI,CAAA,EAAG,IAAI,CAAA;AAAA,QACtD;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,WAAA,EAAa;AAC1B,UAAA,MAAM,GAAA,GAAM,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,SAAS,CAAA;AACtC,UAAA,OAAO,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,CAAC,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA,EAAG,GAAG,CAAA,EAAG,IAAI,CAAA;AAAA,QACrD;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AACzB,UAAA,MAAM,MAAA,GAAS,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,QAAQ,CAAA;AACxC,UAAA,OAAO,MAAM,MAAA,CAAO,QAAA,EAAU,CAAC,IAAA,CAAK,IAAI,CAAA,CAAE,KAAK,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,CAAE,KAAK,CAAA,EAAG,MAAM,GAAG,IAAI,CAAA;AAAA,QACpF;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,WAAA,EAAa;AAC1B,UAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,SAAS,CAAA;AACvC,UAAA,OAAO,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,CAAC,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA,EAAG,IAAI,CAAA,EAAG,IAAI,CAAA;AAAA,QACtD;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AACzB,UAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC9B,UAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC9B,UAAA,OAAO,MAAM,MAAA,CAAO,UAAA,EAAY,CAAC,EAAA,EAAI,EAAE,GAAG,IAAI,CAAA;AAAA,QAChD;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,aAAA,EAAe;AAE5B,UAAA,MAAM,GAAA,GAAW,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,MAAM,CAAA;AACxC,UAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,KAAA,EAAO,GAAA,EAAK,EAAE,SAAS,CAAA;AAC7D,UAAA,MAAM,SAAS,UAAA,CAAW,MAAA,KAAW,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA,GAAI,UAAA;AAGzD,UAAA,MAAM,EAAA,GAAU,MAAM,MAAA,CAAO,OAAA,EAAS,CAAC,GAAA,EAAK,MAAM,GAAG,IAAI,CAAA;AAEzD,UAAA,EAAA,CAAG,QAAA,GAAW,UAAA;AACd,UAAA,OAAO,EAAA;AAAA,QACT;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AAEzB,UAAA,MAAM,IAAA,GAAY,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,IAAI,CAAA;AAEvC,UAAA,MAAM,MAAA,GAAc,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,MAAM,CAAA;AAG3C,UAAA,OAAO,MAAM,MAAA,CAAO,oBAAA,EAAsB,CAAC,MAAA,EAAQ,IAAI,GAAG,IAAI,CAAA;AAAA,QAChE;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,cAAA,EAAgB;AAE7B,UAAA,MAAM,IAAS,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAE3C,UAAA,MAAM,IAAS,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAE3C,UAAA,MAAM,KAAU,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAE5C,UAAA,OAAO,KAAA,CAAM,OAAO,cAAA,EAAgB,CAAC,GAAG,CAAA,EAAG,EAAE,GAAG,IAAI,CAAA;AAAA,QACtD;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AAEzB,UAAA,MAAM,IAAS,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAE3C,UAAA,MAAM,IAAS,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAE3C,UAAA,MAAM,KAAU,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAC5C,UAAA,OAAO,KAAA,CAAM,OAAO,UAAA,EAAY,CAAC,GAAG,CAAA,EAAG,EAAE,GAAG,IAAI,CAAA;AAAA,QAClD;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AAEzB,UAAA,MAAM,IAAS,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAE3C,UAAA,MAAM,IAAS,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAE3C,UAAA,MAAM,KAAU,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAG5C,UAAA,OAAO,KAAA,CAAM,OAAO,OAAA,EAAS;AAAA,YAC3B,MAAA,CAAO,EAAE,CAAA,EAAE,GAAI,EAAE,CAAA,EAAE,GAAI,EAAA,CAAG,CAAA,EAAE,IAAK,CAAA;AAAA,YACjC,MAAA,CAAO,EAAE,CAAA,EAAE,GAAI,EAAE,CAAA,EAAE,GAAI,EAAA,CAAG,CAAA,EAAE,IAAK;AAAA,aAChC,IAAI,CAAA;AAAA,QACT;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,aAAA,EAAe;AAE5B,UAAA,MAAM,IAAS,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAE3C,UAAA,MAAM,IAAS,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAE3C,UAAA,MAAM,KAAU,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAC5C,UAAA,MAAM,IAAA,GAAO,EAAE,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,EAAA,EAAG;AAEvE,UAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,MAAA,EAAQ,CAAC,CAAA,EAAG,EAAE,GAAG,IAAI,CAAA;AACjD,UAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,eAAA,EAAiB,CAAC,MAAA,EAAQ,CAAC,GAAG,IAAI,CAAA;AAE5D,UAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,MAAA,EAAQ,CAAC,CAAA,EAAG,EAAE,GAAG,IAAI,CAAA;AACjD,UAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,eAAA,EAAiB,CAAC,MAAA,EAAQ,CAAC,GAAG,IAAI,CAAA;AAG5D,UAAA,MAAM,KAAA,GAAa,MAAM,MAAA,CAAO,cAAA,EAAgB,CAAC,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,EAAG,IAAI,CAAA;AACrE,UAAA,KAAA,CAAM,QAAA,GAAW,CAAC,MAAA,EAAQ,IAAA,EAAM,QAAQ,IAAI,CAAA;AAC5C,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,OAAO,MAAM,MAAA,CAAO,OAAA,EAAS,CAAC,CAAA,EAAG,CAAC,GAAG,IAAI,CAAA;AAAA,MAC3C,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,MAAA,EAAQ,CAAC,GAAA,EAAK,IAAA,EAAM,KAAK,QAAA,KAAa;AACpC,QAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,UAAA;AACpB,QAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,UAAA;AACxB,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,IAAA,CAAK,SAAS,MAAA,EAAQ;AAE7C,UAAA,MAAM,EAAA,GAAK,QAAA;AAGX,UAAA,IAAI,OAAO,EAAA,CAAG,mBAAA,KAAwB,UAAA,EAAY;AAChD,YAAA,IAAI;AAAE,cAAA,EAAA,CAAG,oBAAoB,CAAA,EAAG,CAAC,EAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,YAAG,CAAA,CAAA,MAAQ;AAAA,YAAe;AAAA,UACtE;AACA,UAAA,IAAI,OAAO,EAAA,CAAG,YAAA,KAAiB,UAAA,EAAY;AACzC,YAAA,IAAI;AACF,cAAA,EAAA,CAAG,YAAA,CAAa;AAAA,gBACd,MAAM,GAAA,CAAI,KAAA;AAAA,gBACV,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,SAAA,IAAa,IAAA;AAAA,gBAClC,SAAS,GAAA,CAAI,OAAA;AAAA,gBACb,OAAO,GAAA,CAAI,MAAA;AAAA,gBACX,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,gBAChC,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,gBAC9B,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,IAAA,IAAQ,GAAA;AAAA,gBACxB,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,IAAA,IAAQ;AAAA,eACzB,CAAA;AAAA,YACH,CAAA,CAAA,MAAQ;AAAA,YAAe;AAAA,UACzB;AAEA,UAAA;AAAA,QACF;AACA,QAAA,MAAM,IAAI,MAAM,gDAA2C,CAAA;AAAA,MAC7D;AAAA,KACF;AAEA,IAAA,YAAA,CAAaA,IAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC9ThB,IAeMA,IAAAA;AAfN,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAA,YAAA,EAAA;AAYA,IAAMA,IAAAA,GAA6B;AAAA,MACjC,IAAA,EAAM,SAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,CAAC,GAAG,EAAA,IAAM,CAAC,GAAG,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,yCAA4B,CAAA;AAAA,MACpE,CAAA;AAAA,MACA,WAAW,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,EAAE,EAAE,CAAA;AAAA,MAC7B,OAAA,EAAS,CAAC,GAAA,EAAK,KAAA,KAAU;AACvB,QAAA,MAAM,EAAA,GAAK,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,EAAE,CAAA;AACrC,QAAA,MAAM,EAAA,GAAK,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,MAAM,EAAE,CAAA;AACrC,QAAA,IAAI,CAAC,EAAA,IAAM,CAAC,EAAA,EAAI,OAAO,IAAA;AACvB,QAAA,MAAM,EAAA,GAAM,GAAG,KAAA,CAAoE,UAAA;AACnF,QAAA,MAAM,EAAA,GAAM,GAAG,KAAA,CAAoE,UAAA;AACnF,QAAA,IAAI,IAAI,IAAA,KAAS,MAAA,IAAU,EAAA,EAAI,IAAA,KAAS,QAAQ,OAAO,IAAA;AACvD,QAAA,MAAM,EAAA,GAAA,CAAM,EAAA,CAAG,CAAA,IAAK,CAAA,KAAM,GAAG,CAAA,IAAK,CAAA,CAAA;AAClC,QAAA,MAAM,EAAA,GAAA,CAAM,EAAA,CAAG,CAAA,IAAK,CAAA,KAAM,GAAG,CAAA,IAAK,CAAA,CAAA;AAClC,QAAA,OAAO,CAAC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,KAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA;AAAA,MACxD,CAAA;AAAA,MACA,UAAU,CAAC,GAAA,EAAK,KAAA,KAAU,CAAA,0BAAA,EAAc,QAAQ,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAC,CAAA,EAAG,OAAA,CAAQ,IAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAC,CAAA,CAAA;AAAA,MACnG,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AACpB,QAAA,MAAM,QAAQ,GAAA,CAAI,GAAA;AAClB,QAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,EAAE,CAAA;AACtC,QAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,EAAE,CAAA;AACtC,QAAA,OAAO,MAAM,MAAA,CAAO,SAAA,EAAW,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG;AAAA,UACvC,MAAM,GAAA,CAAI,KAAA;AAAA,UACV,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,SAAA,IAAa,KAAA;AAAA,UAClC,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAChC,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,CAAA;AAAA,UAChC,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,IAAA,IAAQ,CAAA;AAAA,UACxB,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,OAAO,GAAA,CAAI;AAAA,SACZ,CAAA;AAAA,MACH;AAAA,KACF;AAEA,IAAA,YAAA,CAAaA,IAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACbhB,SAAS,kBAAkB,EAAA,EAAoB;AAC7C,EAAA,MAAM,CAAA,GAAI,mBAAA,CAAoB,IAAA,CAAK,EAAE,CAAA;AACrC,EAAA,OAAO,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAI,EAAA;AACpB;AAEA,SAAS,iBAAiB,CAAA,EAA+B;AACvD,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,eAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,OAAO,CAAC,CAAA,CAAE,YAAA,EAAc,iBAAA,CAAkB,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,IACrD,KAAK,cAAA;AACH,MAAA,OAAO,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,EAAE,CAAA;AAAA,IACpB,KAAK,eAAA;AACH,MAAA,OAAO,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,MAAA,EAAQ,EAAE,EAAE,CAAA;AAAA,IAC9B,KAAK,oBAAA;AACH,MAAA,OAAO,CAAC,kBAAkB,CAAA,CAAE,KAAK,GAAG,iBAAA,CAAkB,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IAChE,KAAK,SAAA;AACH,MAAA,OAAO,CAAC,CAAA,CAAE,YAAA,EAAc,CAAA,CAAE,QAAQ,CAAA;AAAA;AAExC;AAzDA,IA2DMA,IAAAA;AA3DN,IAAA,SAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8BAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAA,YAAA,EAAA;AAwDA,IAAMA,IAAAA,GAA0B;AAAA,MAC9B,IAAA,EAAM,MAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,GAAG,YAAA,EAAc;AACrB,QAAA,IAAI,CAAC,GAAG,EAAA,IAAM,CAAC,GAAG,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,+DAA6C,CAAA;AAAA,MACrF,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAA,KAAO,CAAA,CAAE,YAAA,GAAe,gBAAA,CAAiB,CAAA,CAAE,YAAY,CAAA,GAAI,CAAC,CAAA,CAAE,EAAA,EAAK,EAAE,EAAG,CAAA;AAAA,MACpF,QAAA,EAAU,CAAC,GAAA,EAAK,KAAA,KAAU;AACxB,QAAA,MAAM,CAAA,GAAI,CAAC,EAAA,KAAe,OAAA,CAAQ,IAAI,KAAK,CAAA;AAC3C,QAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,YAAA;AACpB,QAAA,IAAI,CAAC,CAAA,EAAG,OAAO,CAAA,gCAAA,EAAe,EAAE,GAAA,CAAI,KAAA,CAAM,EAAG,CAAC,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,EAAG,CAAC,CAAA,CAAA;AACjE,QAAA,QAAQ,EAAE,IAAA;AAAM,UACd,KAAK,eAAA;AAAiB,YAAA,OAAO,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,QAAA,EAAM,CAAA,CAAE,CAAA,CAAE,MAAM,CAAC,CAAA,KAAA,EAAQ,CAAA,CAAE,CAAA,CAAE,YAAY,CAAC,CAAA,CAAA;AAAA,UACnF,KAAK,UAAA;AAAiB,YAAA,OAAO,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,QAAA,EAAM,CAAA,CAAE,CAAA,CAAE,MAAM,CAAC,CAAA,KAAA,EAAQ,CAAA,CAAE,CAAA,CAAE,YAAY,CAAC,CAAA,CAAA;AAAA,UACnF,KAAK,cAAA;AAAiB,YAAA,OAAO,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,kBAAA,EAAgB,CAAA,CAAE,CAAA,CAAE,EAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAA,CAAE,EAAE,CAAC,CAAA,CAAA;AAAA,UAC1E,KAAK,eAAA;AAAiB,YAAA,OAAO,GAAG,GAAA,CAAI,KAAK,CAAA,yBAAA,EAAmB,CAAA,CAAE,EAAE,EAAE,CAAC,CAAA,EAAG,CAAA,CAAE,EAAE,MAAM,CAAC,GAAG,CAAA,CAAE,CAAA,CAAE,EAAE,CAAC,CAAA,CAAA;AAAA,UAC3F,KAAK,oBAAA;AAAsB,YAAA,OAAO,GAAG,GAAA,CAAI,KAAK,qBAAe,CAAA,CAAE,CAAA,CAAE,KAAK,CAAC,CAAA,GAAA,EAAM,CAAA,CAAE,CAAA,CAAE,KAAK,CAAC,CAAA,EAAA,EAAK,EAAE,MAAA,KAAW,CAAA,GAAI,MAAM,GAAG,CAAA,CAAA,CAAA;AAAA,UACtH,KAAK,SAAA;AAAiB,YAAA,OAAO,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,uBAAA,EAAgB,CAAA,CAAE,CAAA,CAAE,QAAQ,CAAC,CAAA,KAAA,EAAQ,CAAA,CAAE,CAAA,CAAE,YAAY,CAAC,CAAA,CAAA;AAAA;AACjG,MACF,CAAA;AAAA,MACA,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AAEpB,QAAA,MAAM,QAAQ,GAAA,CAAI,GAAA;AAClB,QAAA,MAAM,QAAA,GAAoC;AAAA,UACxC,MAAM,GAAA,CAAI,KAAA;AAAA,UACV,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,SAAA,IAAa,KAAA;AAAA,UAClC,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAChC,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,CAAA;AAAA,UAChC,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,IAAA,IAAQ,CAAA;AAAA,UACxB,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,OAAO,GAAA,CAAI;AAAA,SACb;AACA,QAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,YAAA;AACpB,QAAA,IAAI,CAAC,CAAA,EAAG;AACN,UAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,EAAG,CAAA;AACvC,UAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,EAAG,CAAA;AACvC,UAAA,OAAO,MAAM,MAAA,CAAO,MAAA,EAAQ,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG;AAAA,YACpC,GAAG,QAAA;AAAA,YACH,aAAA,EAAe,IAAA;AAAA,YACf,YAAA,EAAc;AAAA,WACf,CAAA;AAAA,QACH;AACA,QAAA,QAAQ,EAAE,IAAA;AAAM,UACd,KAAK,eAAA,EAAiB;AACpB,YAAA,MAAM,OAAA,GAAU,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,YAAY,CAAA;AAC7C,YAAA,MAAM,MAAA,GAAS,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,MAAM,CAAA;AAEtC,YAAA,OAAO,MAAM,MAAA,CAAO,eAAA,EAAiB,CAAC,MAAA,EAAQ,OAAO,GAAG,QAAQ,CAAA;AAAA,UAClE;AAAA,UACA,KAAK,UAAA,EAAY;AACf,YAAA,MAAM,OAAA,GAAU,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,YAAY,CAAA;AAC7C,YAAA,MAAM,MAAA,GAAS,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,MAAM,CAAA;AACtC,YAAA,OAAO,MAAM,MAAA,CAAO,UAAA,EAAY,CAAC,MAAA,EAAQ,OAAO,GAAG,QAAQ,CAAA;AAAA,UAC7D;AAAA,UACA,KAAK,cAAA,EAAgB;AAInB,YAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC9B,YAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC9B,YAAA,MAAM,MAAM,KAAA,CAAM,MAAA,CAAO,YAAY,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG;AAAA,cAC7C,OAAA,EAAS,KAAA;AAAA,cAAO,SAAA,EAAW,KAAA;AAAA,cAAO,KAAA,EAAO,IAAA;AAAA,cAAM,IAAA,EAAM;AAAA,aACtD,CAAA;AACD,YAAA,MAAM,aAAa,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAC,EAAA,EAAI,EAAE,CAAA,EAAG;AAAA,cAChD,OAAA,EAAS,KAAA;AAAA,cAAO,SAAA,EAAW,KAAA;AAAA,cAAO,KAAA,EAAO,IAAA;AAAA,cAAM,IAAA,EAAM,EAAA;AAAA,cACrD,aAAA,EAAe,IAAA;AAAA,cAAM,YAAA,EAAc;AAAA,aACpC,CAAA;AACD,YAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,eAAA,EAAiB,CAAC,UAAA,EAAY,GAAG,GAAG,QAAQ,CAAA;AAC1E,YAAC,QAAA,CAAqC,QAAA,GAAW,CAAC,GAAA,EAAK,UAAU,CAAA;AACjE,YAAA,OAAO,QAAA;AAAA,UACT;AAAA,UACA,KAAK,eAAA,EAAiB;AACpB,YAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC9B,YAAA,MAAM,MAAA,GAAS,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,MAAM,CAAA;AACtC,YAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC9B,YAAA,OAAO,KAAA,CAAM,OAAO,UAAA,EAAY,CAAC,IAAI,MAAA,EAAQ,EAAE,GAAG,QAAQ,CAAA;AAAA,UAC5D;AAAA,UACA,KAAK,oBAAA,EAAsB;AAMzB,YAAA,MAAM,QAAA,GAAW,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,KAAK,CAAA;AAEvC,YAAA,MAAM,QAAA,GAAW,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,KAAK,CAAA;AACvC,YAAA,MAAM,OAAO,KAAA,CAAM,MAAA,CAAO,iBAAiB,CAAC,QAAA,EAAU,QAAQ,CAAA,EAAG;AAAA,cAC/D,KAAA,EAAO,EAAE,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,EAAA,EAAG;AAAA,cACjE,KAAA,EAAO,EAAE,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,EAAA;AAAG,aAClE,CAAA;AAED,YAAA,MAAM,WAAY,CAAA,CAAE,MAAA,KAAW,CAAA,GAAI,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAErD,YAAA,MAAM,QAAS,CAAA,CAAE,MAAA,KAAW,CAAA,GAAI,IAAA,CAAK,QAAQ,IAAA,CAAK,KAAA;AAClD,YAAA,QAAA,CAAS,YAAA,CAAa;AAAA,cACpB,GAAG,QAAA;AAAA,cACH,SAAS,GAAA,CAAI,OAAA;AAAA,cACb,OAAO,GAAA,CAAI;AAAA,aACZ,CAAA;AACD,YAAC,QAAA,CAAqC,QAAA,GAAW,CAAC,KAAK,CAAA;AACvD,YAAA,OAAO,QAAA;AAAA,UACT;AAAA,UACA,KAAK,SAAA,EAAW;AAEd,YAAA,MAAM,OAAA,GAAU,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,YAAY,CAAA;AAE7C,YAAA,MAAM,QAAA,GAAW,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,QAAQ,CAAA;AAC1C,YAAA,MAAM,MAAA,GAAS,EAAE,MAAA,IAAU,IAAA;AAE3B,YAAA,IAAI,WAAW,IAAA,EAAM;AAGnB,cAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,CAAC,OAAA,CAAQ,CAAA,EAAE,EAAG,OAAA,CAAQ,CAAA,EAAE,EAAG,QAAQ,CAAA,EAAG;AAAA,gBAC1E,OAAA,EAAS,KAAA;AAAA,gBAAO,SAAA,EAAW,KAAA;AAAA,gBAAO,KAAA,EAAO,IAAA;AAAA,gBAAM,IAAA,EAAM;AAAA,eACtD,CAAA;AACD,cAAA,MAAMK,WAAU,KAAA,CAAM,MAAA,CAAO,WAAW,CAAC,MAAM,GAAG,QAAQ,CAAA;AAC1D,cAACA,QAAAA,CAAoC,QAAA,GAAW,CAAC,MAAM,CAAA;AACvD,cAAA,OAAOA,QAAAA;AAAA,YACT;AAMA,YAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,YAAA,MAAM,MAAM,KAAA,CAAM,MAAA,CAAO,YAAY,CAAC,MAAA,EAAQ,OAAO,CAAA,EAAG;AAAA,cACtD,OAAA,EAAS,KAAA;AAAA,cAAO,SAAA,EAAW,KAAA;AAAA,cAAO,KAAA,EAAO,IAAA;AAAA,cAAM,IAAA,EAAM;AAAA,aACtD,CAAA;AACD,YAAA,MAAM,SAAS,KAAA,CAAM,MAAA,CAAO,UAAU,CAAC,GAAA,EAAK,OAAO,CAAA,EAAG;AAAA,cACpD,OAAA,EAAS,KAAA;AAAA,cAAO,SAAA,EAAW,KAAA;AAAA,cAAO,KAAA,EAAO,IAAA;AAAA,cACzC,aAAA,EAAe,CAAA;AAAA,cAAG,WAAA,EAAa;AAAA,aAChC,CAAA;AACD,YAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,cAAA,EAAgB,CAAC,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA,EAAG;AAAA,cACrE,OAAA,EAAS,KAAA;AAAA,cAAO,SAAA,EAAW,KAAA;AAAA,cAAO,KAAA,EAAO,IAAA;AAAA,cAAM,IAAA,EAAM;AAAA,aACtD,CAAA;AACD,YAAA,MAAM,UAAU,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAC,OAAA,EAAS,KAAK,CAAA,EAAG;AAAA,cACrD,GAAG,QAAA;AAAA,cAAU,aAAA,EAAe,IAAA;AAAA,cAAM,YAAA,EAAc;AAAA,aACjD,CAAA;AACD,YAAC,OAAA,CAAoC,QAAA,GAAW,CAAC,GAAA,EAAK,QAAQ,KAAK,CAAA;AACnE,YAAA,OAAO,OAAA;AAAA,UACT;AAAA;AACF,MACF;AAAA,KACF;AAEA,IAAA,YAAA,CAAaL,IAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC9MhB,IAaMA,IAAAA;AAbN,IAAA,QAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6BAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAA,YAAA,EAAA;AAUA,IAAMA,IAAAA,GAAyB;AAAA,MAC7B,IAAA,EAAM,KAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,CAAC,GAAG,MAAA,IAAU,CAAC,GAAG,OAAA,EAAS,MAAM,IAAI,KAAA,CAAM,8CAAiC,CAAA;AAAA,MAClF,CAAA;AAAA,MACA,WAAW,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,MAAA,EAAQ,EAAE,OAAO,CAAA;AAAA,MACtC,UAAU,CAAC,GAAA,EAAK,KAAA,KAAU,CAAA,IAAA,EAAO,QAAQ,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAC,CAAA,EAAG,OAAA,CAAQ,IAAI,KAAA,CAAM,OAAA,EAAS,KAAK,CAAC,CAAA,CAAA;AAAA,MACrG,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AACpB,QAAA,MAAM,QAAQ,GAAA,CAAI,GAAA;AAClB,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,MAAM,CAAA;AACzC,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,OAAO,CAAA;AAC1C,QAAA,OAAO,MAAM,MAAA,CAAO,MAAA,EAAQ,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG;AAAA,UAClC,MAAM,GAAA,CAAI,KAAA;AAAA,UACV,aAAA,EAAe,KAAA;AAAA,UACf,YAAA,EAAc,IAAA;AAAA,UACd,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAChC,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,CAAA;AAAA,UAChC,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,IAAA,IAAQ,CAAA;AAAA,UACxB,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,OAAO,GAAA,CAAI;AAAA,SACZ,CAAA;AAAA,MACH;AAAA,KACF;AAEA,IAAA,YAAA,CAAaA,IAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvChB,IAYMA,IAAAA;AAZN,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAA,YAAA,EAAA;AASA,IAAMA,IAAAA,GAA4B;AAAA,MAChC,IAAA,EAAM,QAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,CAAC,GAAG,IAAA,IAAQ,CAAC,GAAG,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,0CAA6B,CAAA;AAAA,MACvE,CAAA;AAAA,MACA,WAAW,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,EAAE,EAAE,CAAA;AAAA,MAC/B,UAAU,CAAC,GAAA,EAAK,KAAA,KAAU,CAAA,OAAA,EAAU,QAAQ,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,KAAK,CAAC,CAAA,EAAG,OAAA,CAAQ,IAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAC,CAAA,CAAA;AAAA,MACjG,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AACpB,QAAA,MAAM,QAAQ,GAAA,CAAI,GAAA;AAClB,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,IAAI,CAAA;AACvC,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,EAAE,CAAA;AACrC,QAAA,OAAO,MAAM,MAAA,CAAO,OAAA,EAAS,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG;AAAA,UACnC,MAAM,GAAA,CAAI,KAAA;AAAA,UACV,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAChC,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,CAAA;AAAA,UAChC,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,OAAO,GAAA,CAAI;AAAA,SACZ,CAAA;AAAA,MACH;AAAA,KACF;AAEA,IAAA,YAAA,CAAaA,IAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACVhB,SAASM,kBAAiB,CAAA,EAAiC;AACzD,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,eAAA;AAAiB,MAAA,OAAO,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,EAAE,EAAE,CAAA;AAAA;AAElD;AA7BA,IA+BMN,IAAAA;AA/BN,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAA,YAAA,EAAA;AA4BA,IAAMA,IAAAA,GAA4B;AAAA,MAChC,IAAA,EAAM,QAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,GAAG,YAAA,EAAc;AACrB,QAAA,IAAI,CAAC,CAAA,EAAG,MAAA,IAAU,CAAC,GAAG,YAAA,EAAc;AAClC,UAAA,MAAM,IAAI,MAAM,+EAA6D,CAAA;AAAA,QAC/E;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAA,KAAO,CAAA,CAAE,YAAA,GAAeM,iBAAAA,CAAiB,CAAA,CAAE,YAAY,CAAA,GAAI,CAAC,CAAA,CAAE,MAAA,EAAS,EAAE,YAAa,CAAA;AAAA,MAClG,OAAA,EAAS,CAAC,GAAA,EAAK,KAAA,KAAU;AAEvB,QAAA,IAAI,GAAA,CAAI,KAAA,CAAM,YAAA,EAAc,OAAO,IAAA;AACnC,QAAA,MAAM,MAAA,GAAS,IAAI,KAAA,CAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,GAAI,MAAA;AACpE,QAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAA,CAAM,YAAY,CAAA,GAAI,MAAA;AACjF,QAAA,IAAI,CAAC,MAAA,IAAU,CAAC,OAAA,EAAS,OAAO,IAAA;AAChC,QAAA,MAAM,EAAA,GAAM,OAAO,KAAA,CAAoE,UAAA;AACvF,QAAA,MAAM,EAAA,GAAM,QAAQ,KAAA,CAAoE,UAAA;AACxF,QAAA,IAAI,IAAI,IAAA,KAAS,MAAA,IAAU,EAAA,EAAI,IAAA,KAAS,QAAQ,OAAO,IAAA;AACvD,QAAA,MAAM,EAAA,GAAA,CAAM,EAAA,CAAG,CAAA,IAAK,CAAA,KAAM,GAAG,CAAA,IAAK,CAAA,CAAA;AAClC,QAAA,MAAM,EAAA,GAAA,CAAM,EAAA,CAAG,CAAA,IAAK,CAAA,KAAM,GAAG,CAAA,IAAK,CAAA,CAAA;AAClC,QAAA,OAAO,CAAC,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,KAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA;AAAA,MACnD,CAAA;AAAA,MACA,QAAA,EAAU,CAAC,GAAA,EAAK,KAAA,KAAU;AACxB,QAAA,MAAM,CAAA,GAAI,CAAC,EAAA,KAAe,OAAA,CAAQ,IAAI,KAAK,CAAA;AAC3C,QAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,YAAA;AACpB,QAAA,IAAI,CAAA,EAAG,SAAS,eAAA,EAAiB;AAC/B,UAAA,OAAO,CAAA,yCAAA,EAAqB,CAAA,CAAE,CAAA,CAAE,EAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAA,CAAE,EAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAA,CAAE,EAAE,CAAC,CAAA,CAAA;AAAA,QACzD;AACA,QAAA,OAAO,uCAAkB,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAO,CAAC,CAAA,gBAAA,EAAa,CAAA,CAAE,GAAA,CAAI,KAAA,CAAM,MAAO,CAAC,CAAA,EAAG,EAAE,GAAA,CAAI,KAAA,CAAM,YAAa,CAAC,CAAA,CAAA;AAAA,MAC7G,CAAA;AAAA,MACA,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AAEpB,QAAA,MAAM,QAAQ,GAAA,CAAI,GAAA;AAClB,QAAA,MAAM,QAAA,GAAoC;AAAA,UACxC,MAAM,GAAA,CAAI,KAAA;AAAA,UACV,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,SAAA,IAAa,KAAA;AAAA,UAClC,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAChC,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,CAAA;AAAA,UAChC,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,IAAA,IAAQ,CAAA;AAAA,UACxB,SAAA,EAAW,MAAA;AAAA,UACX,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,OAAO,GAAA,CAAI;AAAA,SACb;AACA,QAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,YAAA;AACpB,QAAA,IAAI,CAAA,EAAG,SAAS,eAAA,EAAiB;AAC/B,UAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC9B,UAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC9B,UAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC9B,UAAA,OAAO,KAAA,CAAM,OAAO,cAAA,EAAgB,CAAC,IAAI,EAAA,EAAI,EAAE,GAAG,QAAQ,CAAA;AAAA,QAC5D;AACA,QAAA,MAAM,MAAA,GAAS,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,MAAO,CAAA;AAC/C,QAAA,MAAM,OAAA,GAAU,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,YAAa,CAAA;AACtD,QAAA,OAAO,MAAM,MAAA,CAAO,QAAA,EAAU,CAAC,MAAA,EAAQ,OAAO,GAAG,QAAQ,CAAA;AAAA,MAC3D;AAAA,KACF;AAEA,IAAA,YAAA,CAAaN,IAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvEhB,SAASM,kBAAiB,CAAA,EAA8B;AACtD,EAAA,QAAQ,EAAE,IAAA;AAAM,IACd,KAAK,YAAA;AAAc,MAAA,OAAO,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,EAAE,CAAA;AAAA,IACrC,KAAK,UAAA;AAAc,MAAA,OAAO,CAAC,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,EAAA,EAAI,EAAE,EAAE,CAAA;AAAA,IAC/C,KAAK,WAAA;AAAc,MAAA,OAAO,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,EAAA,EAAI,EAAE,EAAE,CAAA;AAAA;AAE/C;AAxBA,IA0BMN,IAAAA;AA1BN,IAAA,QAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6BAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAA,YAAA,EAAA;AAuBA,IAAMA,IAAAA,GAAyB;AAAA,MAC7B,IAAA,EAAM,KAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,MAAM,IAAI,CAAA,EAAG,YAAA;AACb,QAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,MAAM,sCAA4B,CAAA;AACpD,QAAA,IAAI,CAAA,CAAE,SAAS,YAAA,EAAc;AAC3B,UAAA,IAAI,CAAC,EAAE,EAAA,IAAM,CAAC,EAAE,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,2CAAiC,CAAA;AAAA,QACvE,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,UAAA,EAAY;AAChC,UAAA,IAAI,CAAC,CAAA,CAAE,MAAA,IAAU,CAAC,CAAA,CAAE,EAAA,IAAM,CAAC,CAAA,CAAE,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,iDAAuC,CAAA;AAAA,QAC1F,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,WAAA,EAAa;AACjC,UAAA,IAAI,CAAC,CAAA,CAAE,EAAA,IAAM,CAAC,CAAA,CAAE,EAAA,IAAM,CAAC,CAAA,CAAE,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,8CAAoC,CAAA;AAAA,QACnF;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAA,KAAMM,iBAAAA,CAAiB,EAAE,YAAY,CAAA;AAAA,MACjD,QAAA,EAAU,CAAC,GAAA,EAAK,KAAA,KAAU;AACxB,QAAA,MAAM,CAAA,GAAI,CAAC,EAAA,KAAe,OAAA,CAAQ,IAAI,KAAK,CAAA;AAC3C,QAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,YAAA;AACpB,QAAA,QAAQ,EAAE,IAAA;AAAM,UACd,KAAK,YAAA;AAAc,YAAA,OAAO,CAAA,mEAAA,EAA6B,EAAE,CAAA,CAAE,EAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAA,CAAE,EAAE,CAAC,CAAA,CAAA;AAAA,UACxE,KAAK,UAAA;AAAc,YAAA,OAAO,CAAA,oBAAA,EAAiB,CAAA,CAAE,CAAA,CAAE,MAAM,CAAC,CAAA,SAAA,EAAO,CAAA,CAAE,CAAA,CAAE,EAAE,CAAC,CAAA,eAAA,EAAQ,CAAA,CAAE,CAAA,CAAE,EAAE,CAAC,CAAA,CAAA;AAAA,UACnF,KAAK,WAAA;AAAc,YAAA,OAAO,CAAA,iBAAA,EAAiB,CAAA,CAAE,CAAA,CAAE,EAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAA,CAAE,EAAE,CAAC,CAAA,EAAG,CAAA,CAAE,CAAA,CAAE,EAAE,CAAC,CAAA,CAAA;AAAA;AACxE,MACF,CAAA;AAAA,MACA,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AAEpB,QAAA,MAAM,QAAQ,GAAA,CAAI,GAAA;AAClB,QAAA,MAAM,QAAA,GAAoC;AAAA,UACxC,MAAM,GAAA,CAAI,KAAA;AAAA,UACV,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,SAAA,IAAa,KAAA;AAAA,UAClC,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAChC,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,CAAA;AAAA,UAChC,IAAA,EAAM,GAAA,CAAI,KAAA,CAAM,IAAA,IAAQ,CAAA;AAAA,UACxB,SAAA,EAAW,MAAA;AAAA,UACX,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,OAAO,GAAA,CAAI;AAAA,SACb;AACA,QAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,YAAA;AACpB,QAAA,IAAI,CAAA,CAAE,SAAS,YAAA,EAAc;AAC3B,UAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC9B,UAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC9B,UAAA,OAAO,MAAM,MAAA,CAAO,YAAA,EAAc,CAAC,EAAA,EAAI,EAAE,GAAG,QAAQ,CAAA;AAAA,QACtD;AACA,QAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AACzB,UAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,MAAM,CAAA;AACjC,UAAA,MAAMC,EAAAA,GAAI,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC7B,UAAA,MAAMC,EAAAA,GAAI,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC7B,UAAA,OAAO,KAAA,CAAM,OAAO,KAAA,EAAO,CAAC,GAAGD,EAAAA,EAAGC,EAAC,GAAG,QAAQ,CAAA;AAAA,QAChD;AAEA,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC7B,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC7B,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC7B,QAAA,OAAO,KAAA,CAAM,OAAO,iBAAA,EAAmB,CAAC,GAAG,CAAA,EAAG,CAAC,GAAG,QAAQ,CAAA;AAAA,MAC5D;AAAA,KACF;AAEA,IAAA,YAAA,CAAaR,IAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpFhB,IAiBMA,KAAAA;AAjBN,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAA,YAAA,EAAA;AAcA,IAAMA,KAAAA,GAA4B;AAAA,MAChC,IAAA,EAAM,QAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,MAAM,IAAI,CAAA,EAAG,YAAA;AACb,QAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,MAAM,yCAA+B,CAAA;AACvD,QAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AACzB,UAAA,IAAI,CAAC,EAAE,MAAA,IAAU,CAAC,EAAE,EAAA,IAAM,CAAC,EAAE,EAAA,EAAI;AAC/B,YAAA,MAAM,IAAI,MAAM,oDAA0C,CAAA;AAAA,UAC5D;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,QAAA,MAAM,IAAI,CAAA,CAAE,YAAA;AACZ,QAAA,OAAO,CAAC,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,EAAA,EAAI,EAAE,EAAE,CAAA;AAAA,MAC9B,CAAA;AAAA,MACA,QAAA,EAAU,CAAC,GAAA,EAAK,KAAA,KAAU;AACxB,QAAA,MAAM,CAAA,GAAI,CAAC,EAAA,KAAe,OAAA,CAAQ,IAAI,KAAK,CAAA;AAC3C,QAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,YAAA;AACpB,QAAA,OAAO,CAAA,yBAAA,EAAiB,CAAA,CAAE,CAAA,CAAE,MAAM,CAAC,CAAA,SAAA,EAAO,CAAA,CAAE,CAAA,CAAE,EAAE,CAAC,CAAA,eAAA,EAAQ,CAAA,CAAE,CAAA,CAAE,EAAE,CAAC,CAAA,CAAA;AAAA,MAClE,CAAA;AAAA,MACA,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AAEpB,QAAA,MAAM,QAAQ,GAAA,CAAI,GAAA;AAClB,QAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,YAAA;AACpB,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,MAAM,CAAA;AACjC,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC7B,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC7B,QAAA,OAAO,MAAM,MAAA,CAAO,QAAA,EAAU,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAG;AAAA,UACvC,MAAM,GAAA,CAAI,KAAA;AAAA,UACV,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,SAAA,IAAa,KAAA;AAAA,UAClC,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAChC,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,CAAA;AAAA,UAChC,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,SAAA,IAAa,SAAA;AAAA,UAClC,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,WAAA,IAAe,IAAA;AAAA,UACtC,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,OAAO,GAAA,CAAI;AAAA,SACZ,CAAA;AAAA,MACH;AAAA,KACF;AAEA,IAAA,YAAA,CAAaA,KAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACrDhB,SAAS,mBAAmB,CAAA,EAAmB;AAC7C,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,2BAAA;AACpB,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,kBAAA;AACpB,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,gCAAA;AACpB,EAAA,IAAI,CAAA,KAAM,GAAG,OAAO,gCAAA;AACpB,EAAA,OAAO,GAAG,CAAC,CAAA,sBAAA,CAAA;AACb;AAOA,SAAS,mBAAA,CAAoB,OAAA,EAAiB,OAAA,EAAiB,CAAA,EAAmB;AAChF,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA;AAC1B,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA;AAC1B,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,OAAA,CAAQ,WAAW,CAAA,EAAG;AAChD,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,UAAA,CAAW,CAAC,CAAA;AAC/B,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,UAAA,CAAW,CAAC,CAAA;AAC/B,IAAA,IAAI,EAAA,IAAM,CAAA,IAAK,EAAA,IAAM,CAAA,IAAK,EAAA,KAAO,KAAK,CAAA,IAAK,EAAA,GAAK,CAAA,GAAI,CAAA,IAAK,CAAA,EAAG;AAC1D,MAAA,IAAI,GAAA,GAAM,EAAA;AACV,MAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,CAAA,EAAG,KAAK,GAAA,IAAO,MAAA,CAAO,YAAA,CAAa,EAAA,GAAK,CAAC,CAAA;AAC7D,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAG,OAAO,CAAA,MAAA,CAAA;AAC7B;AAhCA,IAuDMA,KAAAA;AAvDN,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAA,YAAA,EAAA;AAoDA,IAAMA,KAAAA,GAA6B;AAAA,MACjC,IAAA,EAAM,SAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,GAAG,YAAA,EAAc;AACnB,UAAA,IAAI,CAAA,CAAE,YAAA,CAAa,IAAA,KAAS,SAAA,EAAW;AACrC,YAAA,IAAI,CAAC,CAAA,CAAE,YAAA,CAAa,MAAM,CAAC,CAAA,CAAE,aAAa,EAAA,EAAI;AAC5C,cAAA,MAAM,IAAI,MAAM,mDAAsC,CAAA;AAAA,YACxD;AACA,YAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,YAAA,CAAa,CAAC,CAAA,IAAK,CAAA,CAAE,YAAA,CAAa,CAAA,GAAI,CAAA,EAAG;AAC9D,cAAA,MAAM,IAAI,MAAM,+BAA0B,CAAA;AAAA,YAC5C;AAAA,UACF;AACA,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,CAAA,EAAG,QAAQ,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACxD,UAAA,MAAM,IAAI,MAAM,oDAA6B,CAAA;AAAA,QAC/C;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,QAAA,IAAI,CAAA,CAAE,YAAA,EAAc,IAAA,KAAS,SAAA,EAAW,OAAO,CAAC,CAAA,CAAE,YAAA,CAAa,EAAA,EAAI,CAAA,CAAE,YAAA,CAAa,EAAE,CAAA;AACpF,QAAA,OAAO,CAAC,GAAI,CAAA,CAAE,QAAA,IAAY,EAAG,CAAA;AAAA,MAC/B,CAAA;AAAA,MACA,QAAA,EAAU,CAAC,GAAA,EAAK,KAAA,KAAU;AACxB,QAAA,IAAI,GAAA,CAAI,KAAA,CAAM,YAAA,EAAc,IAAA,KAAS,SAAA,EAAW;AAC9C,UAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,YAAA;AACpB,UAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,OAAA,CAAQ,CAAA,CAAE,EAAA,EAAI,KAAK,CAAA,EAAG,OAAA,CAAQ,CAAA,CAAE,EAAA,EAAI,KAAK,CAAA,EAAG,EAAE,CAAC,CAAA;AAClF,UAAA,OAAO,GAAG,kBAAA,CAAmB,CAAA,CAAE,CAAC,CAAC,IAAI,MAAM,CAAA,CAAA;AAAA,QAC7C;AACA,QAAA,OAAO,oBAAY,GAAA,CAAI,KAAA,CAAM,QAAA,IAAY,IAAI,GAAA,CAAI,CAAC,EAAA,KAAO,OAAA,CAAQ,IAAI,KAAK,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA;AAAA,MACvF,CAAA;AAAA,MACA,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AACpB,QAAA,MAAM,QAAQ,GAAA,CAAI,GAAA;AAClB,QAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,QAAA,MAAM,SAAA,GAAY,GAAA,CAAI,KAAA,CAAM,SAAA,IAAa,KAAA;AAIzC,QAAA,IAAI,GAAA,CAAI,KAAA,CAAM,YAAA,EAAc,IAAA,KAAS,SAAA,EAAW;AAC9C,UAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,YAAA;AACpB,UAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC9B,UAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,CAAA,CAAE,EAAE,CAAA;AAC9B,UAAA,OAAO,KAAA,CAAM,OAAO,gBAAA,EAAkB,CAAC,IAAI,EAAA,EAAI,CAAA,CAAE,CAAC,CAAA,EAAG;AAAA,YACnD,IAAA,EAAM,KAAA;AAAA,YACN,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,SAAA,IAAa,KAAA;AAAA,YAClC,OAAA,EAAS;AAAA,cACP,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,cAChC,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS;AAAA,aAClC;AAAA,YACA,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,YAC9B,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,WAAA,IAAe,IAAA;AAAA,YACtC,SAAS,GAAA,CAAI,OAAA;AAAA,YACb,OAAO,GAAA,CAAI;AAAA,WACZ,CAAA;AAAA,QACH;AACA,QAAA,MAAM,KAAA,GAAA,CAAS,GAAA,CAAI,KAAA,CAAM,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAA,EAAA,KAAM,GAAA,CAAI,UAAA,CAAW,EAAE,CAAC,CAAA;AAKrE,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,SAAA,EAAW,KAAA,EAAO;AAAA,UAC1C,IAAA,EAAM,YAEF,WAAqB;AAEnB,YAAA,MAAM,IAAI,OAAO,IAAA,CAAK,SAAS,UAAA,GAAa,IAAA,CAAK,MAAK,GAAI,CAAA;AAC1D,YAAA,MAAM,SAAU,GAAA,CAAI,KAAA,CAAM,aAAa,IAAA,GAAQ,CAAA,EAAG,KAAK,CAAA,EAAA,CAAA,GAAO,EAAA;AAC9D,YAAA,OAAO,CAAA,EAAG,MAAM,CAAA,IAAA,EAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,UAC/C,CAAA,GACA,KAAA;AAAA,UACJ,SAAA,EAAW,SAAA,GAAY,IAAA,GAAQ,GAAA,CAAI,MAAM,SAAA,IAAa,KAAA;AAAA,UACtD,OAAA,EAAS;AAAA,YACP,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,YAChC,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS;AAAA,WAClC;AAAA,UACA,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAC9B,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,WAAA,IAAe,IAAA;AAAA,UACtC,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,OAAO,GAAA,CAAI;AAAA,SACZ,CAAA;AACD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACF;AAEA,IAAA,YAAA,CAAaA,KAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC5IhB,IASMA,KAAAA;AATN,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAQA,IAAMA,KAAAA,GAAkC;AAAA,MACtC,IAAA,EAAM,cAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,CAAC,KAAK,EAAE,MAAA,IAAU,IAAI,MAAM,IAAI,MAAM,uCAA6B,CAAA;AACvE,QAAA,IAAI,CAAC,EAAE,IAAA,IAAQ,CAAC,EAAE,IAAA,EAAM,MAAM,IAAI,KAAA,CAAM,kDAAqC,CAAA;AAC7E,QAAA,IAAI,CAAA,CAAE,SAAS,UAAA,EAAY;AAC3B,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,YAAA,IAAgB,CAAA,CAAE,SAAS,cAAA,EAAgB;AACxD,UAAA,IAAI,CAAA,CAAE,MAAA,KAAW,CAAA,IAAK,CAAA,CAAE,WAAW,CAAA,EAAG;AACpC,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,CAAA,CAAE,IAAI,CAAA,sCAAA,CAA2B,CAAA;AAAA,UACnE;AACA,UAAA;AAAA,QACF;AACA,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8CAAA,EAAqC,CAAA,CAAuB,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,MACrF,CAAA;AAAA,MACA,WAAW,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,EAAE,IAAI,CAAA;AAAA,MACjC,QAAA,EAAU,CAAC,GAAA,KAAQ;AACjB,QAAA,MAAM,IAAI,GAAA,CAAI,KAAA;AACd,QAAA,OAAO,CAAA,EAAG,IAAI,KAAK,CAAA,QAAA,EAAW,EAAE,IAAI,CAAA,QAAA,EAAM,EAAE,IAAI,CAAA,CAAA;AAAA,MAClD,CAAA;AAAA,MACA,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AACpB,QAAA,MAAM,QAAQ,GAAA,CAAI,GAAA;AAClB,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,IAAI,CAAA;AACvC,QAAA,MAAM,CAAA,GAAI,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,IAAI,CAAA;AACvC,QAAA,MAAM,IAAA,GAAgC;AAAA,UACpC,MAAM,GAAA,CAAI,KAAA;AAAA,UACV,SAAA,EAAW,IAAA;AAAA,UACX,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAChC,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAC9B,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,OAAO,GAAA,CAAI;AAAA,SACb;AACA,QAAA,IAAI,GAAA,CAAI,KAAA,CAAM,IAAA,KAAS,UAAA,EAAY;AACjC,UAAA,OAAO,KAAA,CAAM,OAAO,cAAA,EAAgB,CAAC,GAAG,CAAA,EAAG,CAAC,GAAG,IAAI,CAAA;AAAA,QACrD;AAEA,QAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,CAAM,MAAA,IAAU,CAAA;AACnC,QAAA,OAAO,KAAA,CAAM,OAAO,cAAA,EAAgB,CAAC,GAAG,CAAA,EAAG,MAAM,GAAG,IAAI,CAAA;AAAA,MAC1D;AAAA,KACF;AAEA,IAAA,YAAA,CAAaA,KAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACnDhB,IAsBMA,KAAAA;AAtBN,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAA,YAAA,EAAA;AAmBA,IAAMA,KAAAA,GAA2B;AAAA,MAC/B,IAAA,EAAM,OAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,CAAC,GAAG,EAAA,IAAM,CAAC,GAAG,MAAA,IAAU,CAAC,GAAG,EAAA,EAAI;AAClC,UAAA,MAAM,IAAI,MAAM,0CAAgC,CAAA;AAAA,QAClD;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAA,KAAM,CAAC,EAAE,EAAA,EAAI,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,EAAE,CAAA;AAAA,MACvC,QAAA,EAAU,CAAC,GAAA,EAAK,KAAA,KAAU,CAAA,OAAA,EAAO,QAAQ,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAC,CAAA,EAAG,QAAQ,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAC,CAAA,EAAG,QAAQ,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAC,CAAA,CAAA;AAAA,MAC/H,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AAEpB,QAAA,MAAM,QAAQ,GAAA,CAAI,GAAA;AAElB,QAAA,MAAM,EAAA,GAAU,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,EAAE,CAAA;AAE3C,QAAA,MAAM,EAAA,GAAU,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,MAAM,CAAA;AAE/C,QAAA,MAAM,EAAA,GAAU,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,EAAE,CAAA;AAI3C,QAAA,IAAI,OAAA,GAAU,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AACzB,QAAA,IAAI;AACF,UAAA,MAAM,EAAA,GAAK,EAAA,CAAG,CAAA,EAAE,GAAI,EAAA,CAAG,CAAA,EAAE,EAAG,EAAA,GAAK,EAAA,CAAG,CAAA,EAAE,GAAI,EAAA,CAAG,CAAA,EAAE;AAC/C,UAAA,MAAM,EAAA,GAAK,EAAA,CAAG,CAAA,EAAE,GAAI,EAAA,CAAG,CAAA,EAAE,EAAG,EAAA,GAAK,EAAA,CAAG,CAAA,EAAE,GAAI,EAAA,CAAG,CAAA,EAAE;AAC/C,UAAA,IAAI,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,GAAK,GAAG,OAAA,GAAU,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA;AAAA,QAClD,CAAA,CAAA,MAAQ;AAAA,QAAgC;AACxC,QAAA,OAAO,KAAA,CAAM,MAAA,CAAO,OAAA,EAAS,OAAA,EAAS;AAAA,UACpC,MAAM,GAAA,CAAI,KAAA;AAAA,UACV,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,SAAA,IAAa,IAAA;AAAA,UAClC,MAAA,EAAQ,GAAA,CAAI,KAAA,CAAM,MAAA,IAAU,CAAA;AAAA,UAC5B,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAC9B,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,WAAA,IAAe,IAAA;AAAA,UACtC,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAChC,WAAA,EAAa,GAAA;AAAA,UACb,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,OAAO,GAAA,CAAI;AAAA,SACZ,CAAA;AAAA,MACH;AAAA,KACF;AAEA,IAAA,YAAA,CAAaA,KAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjEhB,IAsBMA,KAAAA;AAtBN,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAA,YAAA,EAAA;AAmBA,IAAMA,KAAAA,GAA8B;AAAA,MAClC,IAAA,EAAM,UAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,CAAC,GAAG,EAAA,IAAM,CAAC,GAAG,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,0CAA6B,CAAA;AAAA,MACrE,CAAA;AAAA,MACA,WAAW,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,EAAE,EAAE,CAAA;AAAA,MAC7B,UAAU,CAAC,GAAA,EAAK,KAAA,KAAU,CAAA,oBAAA,EAAe,QAAQ,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAC,CAAA,EAAG,OAAA,CAAQ,IAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAC,CAAA,CAAA;AAAA,MACpG,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AAEpB,QAAA,MAAM,QAAQ,GAAA,CAAI,GAAA;AAElB,QAAA,MAAM,EAAA,GAAU,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,EAAE,CAAA;AAE3C,QAAA,MAAM,EAAA,GAAU,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,EAAE,CAAA;AAC3C,QAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,CAAM,MAAA,IAAU,MAAA;AACnC,QAAA,MAAM,SAAA,GAAY,GAAA,CAAI,KAAA,CAAM,SAAA,IAAa,CAAA;AACzC,QAAA,OAAO,KAAA,CAAM,OAAO,MAAA,EAAQ;AAAA,UAC1B,OAAO,EAAA,CAAG,CAAA,EAAE,GAAI,EAAA,CAAG,GAAE,IAAK,CAAA;AAAA,UAC1B,OAAO,EAAA,CAAG,CAAA,EAAE,GAAI,EAAA,CAAG,GAAE,IAAK,CAAA;AAAA,UAC1B,MAAM,GAAG,MAAM,CAAA,EAAG,KAAK,KAAA,CAAM,EAAA,CAAG,GAAE,GAAI,EAAA,CAAG,GAAE,EAAG,EAAA,CAAG,GAAE,GAAI,EAAA,CAAG,GAAG,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,SACnF,EAAG;AAAA,UACD,QAAA,EAAU,GAAA,CAAI,KAAA,CAAM,QAAA,IAAY,EAAA;AAAA,UAChC,WAAA,EAAa,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,SAAA;AAAA,UAChC,OAAA,EAAS,QAAA;AAAA,UACT,OAAA,EAAS,QAAA;AAAA,UACT,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAAA,KACF;AAEA,IAAA,YAAA,CAAaA,KAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC9BT,SAAS,SAAS,UAAA,EAAoC;AAC3D,EAAA,MAAM,OAAA,GAAU,WAAW,IAAA,EAAK;AAChC,EAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,+BAAA,EAAiB;AAC1D,EAAA,IAAI,SAAA,CAAU,KAAK,OAAO,CAAA,SAAU,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,yFAAA,EAAwD;AAGhH,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA;AAG1C,EAAA,IAAI,EAAA;AACJ,EAAA,YAAA,CAAa,SAAA,GAAY,CAAA;AACzB,EAAA,OAAA,CAAQ,EAAA,GAAK,YAAA,CAAa,IAAA,CAAK,MAAM,OAAO,IAAA,EAAM;AAChD,IAAA,MAAM,MAAA,GAAS,GAAG,CAAC,CAAA;AACnB,IAAA,IAAI,CAAE,iBAAA,CAAwC,QAAA,CAAS,MAAM,CAAA,EAAG;AAC9D,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,kCAAA,EAAqB,MAAM,CAAA,CAAA,EAAG;AAAA,IAC3D;AAAA,EACF;AAGA,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,IAAI,CAAA;AACJ,EAAA,KAAA,CAAM,SAAA,GAAY,CAAA;AAClB,EAAA,OAAA,CAAQ,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,MAAO,MAAM,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAEtD,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,IAAA,IAAI,OAAO,GAAA,EAAK;AAChB,IAAA,IAAK,iBAAA,CAAwC,QAAA,CAAS,EAAE,CAAA,EAAG;AAC3D,IAAA,IAAK,iBAAA,CAAwC,QAAA,CAAS,EAAE,CAAA,EAAG;AAE3D,IAAA,IAAI,CAAC,0BAAA,CAA2B,IAAA,CAAK,EAAE,CAAA,EAAG;AACxC,MAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO,CAAA,sCAAA,EAA4B,EAAE,CAAA,CAAA,EAAG;AAAA,IAC9D;AAAA,EACF;AAGA,EAAA,IAAI;AACF,IAAA,iBAAA,CAAkB,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,CAAE,MAAA;AAAA,MACxC,CAAC,EAAA,KAAO,EAAA,KAAO,GAAA,IAAO,CAAE,iBAAA,CAAwC,QAAA,CAAS,EAAE,CAAA,IAAK,CAAE,iBAAA,CAAwC,QAAA,CAAS,EAAE;AAAA,KACtI,CAAA;AAAA,EACH,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,OAAO,CAAA,wBAAA,EAAiB,GAAA,CAAc,OAAO,CAAA,CAAA,EAAG;AAAA,EACtE;AAEA,EAAA,OAAO,EAAE,IAAI,IAAA,EAAK;AACpB;AAOO,SAAS,OAAA,CACd,YACA,MAAA,EACkC;AAClC,EAAA,MAAM,CAAA,GAAI,SAAS,UAAU,CAAA;AAC7B,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,CAAA,CAAE,KAAA;AACpB,EAAA,MAAM,SAAS,UAAA,CAAW,IAAA,EAAK,CAAE,OAAA,CAAQ,OAAO,IAAI,CAAA;AAEpD,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,IAAI,CAAA;AACJ,EAAA,KAAA,CAAM,SAAA,GAAY,CAAA;AAClB,EAAA,OAAA,CAAQ,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,MAAO,MAAM,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAEtD,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,IAAA,IAAI,OAAO,GAAA,EAAK;AAChB,IAAA,IAAK,iBAAA,CAAwC,QAAA,CAAS,EAAE,CAAA,EAAG;AAC3D,IAAA,IAAK,iBAAA,CAAwC,QAAA,CAAS,EAAE,CAAA,EAAG;AAC3D,IAAA,UAAA,CAAW,KAAK,EAAE,CAAA;AAAA,EACpB;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,MAAA,EAAQ,UAAU,CAAA;AAEjD,IAAA,MAAM,KAAK,IAAI,QAAA,CAAS,GAAA,EAAK,GAAG,YAAY,IAAI,CAAA;AAIhD,IAAA,MAAM,IAAA,GAAO,WAAW,GAAA,CAAI,CAAC,SAAS,MAAA,CAAO,IAAI,KAAK,GAAG,CAAA;AACzD,IAAA,OAAO,CAAC,CAAA,KAAc,EAAA,CAAG,CAAA,EAAG,GAAG,IAAI,CAAA;AAAA,EACrC,SAAS,GAAA,EAAK;AACZ,IAAA,OAAO,CAAA,eAAA,EAAmB,IAAc,OAAO,CAAA,CAAA;AAAA,EACjD;AACF;AAEA,SAAS,iBAAA,CAAkB,QAAgB,WAAA,EAA+B;AAGxE,EAAA,IAAI,IAAA,GAAO,MAAA;AACX,EAAA,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,UAAU,CAAA;AACzC,EAAA,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,YAAY,CAAA;AAC5C,EAAA,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,WAAW,CAAA;AAC1C,EAAA,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB,UAAU,CAAA;AAC9C,EAAA,KAAA,MAAW,MAAM,iBAAA,EAAmB;AAClC,IAAA,IAAI,EAAA,KAAO,KAAA,IAAS,EAAA,KAAO,OAAA,EAAS;AACpC,IAAA,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,IAAI,MAAA,CAAO,CAAA,GAAA,EAAM,EAAE,CAAA,GAAA,CAAA,EAAO,GAAG,CAAA,EAAG,CAAA,KAAA,EAAQ,EAAE,CAAA,CAAE,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,yBAAyB,IAAI,CAAA,EAAA,CAAA;AACtC;AAGO,SAAS,gBAAgB,UAAA,EAA8B;AAC5D,EAAA,MAAM,CAAA,GAAI,SAAS,UAAU,CAAA;AAC7B,EAAA,IAAI,CAAC,CAAA,CAAE,EAAA,EAAI,OAAO,EAAC;AACnB,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,IAAI,CAAA;AACJ,EAAA,KAAA,CAAM,SAAA,GAAY,CAAA;AAClB,EAAA,OAAA,CAAQ,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA,MAAO,MAAM,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAC1D,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,IAAA,IAAI,OAAO,GAAA,EAAK;AAChB,IAAA,IAAK,iBAAA,CAAwC,QAAA,CAAS,EAAE,CAAA,EAAG;AAC3D,IAAA,IAAK,iBAAA,CAAwC,QAAA,CAAS,EAAE,CAAA,EAAG;AAC3D,IAAA,IAAI,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA,EAAG;AACxB,IAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AAAA,EACb;AACA,EAAA,OAAO,IAAI,IAAA,EAAK;AAClB;AA/IA,IAGa,iBAAA,EACA,iBAAA,EAUP,KAAA,EACA,SAAA,EAEA,SAAA,EAKA,YAAA;AAtBN,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sCAAA,GAAA;AAGO,IAAM,iBAAA,GAAoB,CAAC,IAAA,EAAM,GAAG,CAAA;AACpC,IAAM,iBAAA,GAAoB;AAAA,MAC/B,KAAA;AAAA,MAAO,KAAA;AAAA,MAAO,KAAA;AAAA,MACd,MAAA;AAAA,MAAQ,MAAA;AAAA,MAAQ,MAAA;AAAA,MAAQ,OAAA;AAAA,MACxB,MAAA;AAAA,MAAQ,MAAA;AAAA,MAAQ,MAAA;AAAA,MAChB,KAAA;AAAA,MAAO,KAAA;AAAA,MAAO,OAAA;AAAA,MAAS,IAAA;AAAA,MACvB,MAAA;AAAA,MAAQ,MAAA;AAAA,MAAQ,KAAA;AAAA,MAChB,OAAA;AAAA,MAAS,MAAA;AAAA,MAAQ,OAAA;AAAA,MACjB,KAAA;AAAA,MAAO,KAAA;AAAA,MAAO;AAAA,KAChB;AAEA,IAAM,KAAA,GAAQ,yBAAA;AACd,IAAM,SAAA,GAAY,4FAAA;AAElB,IAAM,SAAA,GAAY,yCAAA;AAKlB,IAAM,YAAA,GAAe,gCAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACtBrB,IAYMA,KAAAA;AAZN,IAAA,eAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAA,WAAA,EAAA;AASA,IAAMA,KAAAA,GAAgC;AAAA,MACpC,IAAA,EAAM,YAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,MAAM,sCAA4B,CAAA;AACpD,QAAA,IAAI,OAAO,EAAE,UAAA,KAAe,QAAA,IAAY,CAAC,CAAA,CAAE,UAAA,CAAW,MAAK,EAAG;AAC5D,UAAA,MAAM,IAAI,MAAM,kCAA6B,CAAA;AAAA,QAC/C;AACA,QAAA,MAAM,CAAA,GAAI,QAAA,CAAa,CAAA,CAAE,UAAU,CAAA;AACnC,QAAA,IAAI,CAAC,EAAE,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAoC,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AACxE,QAAA,IAAI,OAAO,CAAA,CAAE,KAAA,KAAU,UAAU,MAAM,IAAI,MAAM,sCAA4B,CAAA;AAC7E,QAAA,IAAI,OAAO,CAAA,CAAE,OAAA,KAAY,WAAW,MAAM,IAAI,MAAM,wCAA8B,CAAA;AAClF,QAAA,IAAI,EAAE,MAAA,EAAQ;AACZ,UAAA,IAAI,CAAA,CAAE,MAAA,CAAO,GAAA,IAAO,CAAA,CAAE,OAAO,GAAA,EAAK;AAChC,YAAA,MAAM,IAAI,MAAM,wCAAmC,CAAA;AAAA,UACrD;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAW,MAAM,EAAC;AAAA,MAClB,QAAA,EAAU,CAAC,GAAA,KAAQ,CAAA,EAAG,IAAI,KAAK,CAAA,MAAA,EAAS,GAAA,CAAI,KAAA,CAAM,UAAU,CAAA,CAAA;AAAA,MAC5D,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AAEpB,QAAA,MAAM,QAAQ,GAAA,CAAI,GAAA;AAClB,QAAA,IAAI,CAAC,GAAA,CAAI,OAAA,IAAW,CAAC,GAAA,CAAI,KAAA,CAAM,SAAS,OAAO,IAAA;AAC/C,QAAA,MAAM,EAAA,GAAK,QAAQ,GAAA,CAAI,KAAA,CAAM,YAAa,GAAA,CAAI,QAAA,IAAY,EAA6B,CAAA;AACvF,QAAA,IAAI,OAAO,EAAA,KAAO,UAAA,EAAY,OAAO,IAAA;AACrC,QAAA,MAAM,IAAA,GAAQ,IAAI,QAAA,CAAyD,IAAA;AAC3E,QAAA,MAAM,OAAO,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,GAAA,IAAO,MAAM,IAAA,IAAQ,GAAA;AACpD,QAAA,MAAM,OAAO,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,GAAA,IAAO,MAAM,IAAA,IAAQ,EAAA;AACpD,QAAA,OAAO,MAAM,MAAA,CAAO,eAAA,EAAiB,CAAC,EAAA,EAAI,IAAA,EAAM,IAAI,CAAA,EAAG;AAAA,UACrD,WAAA,EAAa,IAAI,KAAA,CAAM,KAAA;AAAA,UACvB,WAAA,EAAa,CAAA;AAAA,UACb,MAAM,GAAA,CAAI,KAAA;AAAA,UACV,SAAA,EAAW,KAAA;AAAA,UACX,SAAA,EAAW,KAAA;AAAA,UACX,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAAA,KACF;AAEA,IAAA,YAAA,CAAaA,KAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACrDhB,IAWMA,KAAAA;AAXN,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAUA,IAAMA,KAAAA,GAA+B;AAAA,MACnC,IAAA,EAAM,WAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,CAAC,CAAA,EAAG,MAAM,IAAI,MAAM,qCAA2B,CAAA;AACnD,QAAA,IAAI,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,IAAY,OAAO,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,OAAO,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AACzF,UAAA,MAAM,IAAI,MAAM,iDAAyC,CAAA;AAAA,QAC3D;AACA,QAAA,IAAI,EAAE,GAAA,IAAO,CAAA,CAAE,KAAK,MAAM,IAAI,MAAM,gCAA2B,CAAA;AAC/D,QAAA,IAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,GAAA,IAAO,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,sCAAmC,CAAA;AAC3F,QAAA,IAAI,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,QAAQ,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,+BAA0B,CAAA;AAAA,MAC3F,CAAA;AAAA,MACA,SAAA,EAAW,MAAM,EAAC;AAAA,MAClB,QAAA,EAAU,CAAC,GAAA,KAAQ,CAAA,EAAG,IAAI,KAAK,CAAA,GAAA,EAAM,GAAA,CAAI,KAAA,CAAM,KAAK,CAAA,CAAA;AAAA,MACpD,QAAQ,MAAM;AAAA;AAAA,KAChB;AAEA,IAAA,YAAA,CAAaA,KAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC7BhB,IASMA,KAAAA;AATN,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAQA,IAAMA,KAAAA,GAAkC;AAAA,MACtC,IAAA,EAAM,cAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,CAAC,KAAK,OAAO,CAAA,CAAE,eAAe,QAAA,IAAY,CAAC,EAAE,UAAA,EAAY;AAC3D,UAAA,MAAM,IAAI,MAAM,6CAAmC,CAAA;AAAA,QACrD;AACA,QAAA,IAAI,OAAO,EAAE,CAAA,KAAM,QAAA,IAAY,CAAC,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,CAAC,CAAA,EAAG;AACpD,UAAA,MAAM,IAAI,MAAM,+CAAuC,CAAA;AAAA,QACzD;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAA,KAAM,CAAC,EAAE,UAAU,CAAA;AAAA,MAC/B,UAAU,CAAC,GAAA,KAAQ,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA,SAAA,EAAS,GAAA,CAAI,KAAA,CAAM,UAAU,eAAU,GAAA,CAAI,KAAA,CAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,MAC5F,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AAEpB,QAAA,MAAM,QAAQ,GAAA,CAAI,GAAA;AAClB,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,UAAU,CAAA;AACjD,QAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,QAAA,OAAO,KAAA,CAAM,OAAO,QAAA,EAAU,CAAC,IAAI,KAAA,CAAM,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA,EAAG;AAAA,UACrD,MAAM,GAAA,CAAI,KAAA;AAAA,UACV,IAAA,EAAM,CAAA;AAAA,UACN,SAAA,EAAW,IAAI,KAAA,KAAU,EAAA;AAAA,UACzB,SAAA,EAAW,MAAA;AAAA,UACX,WAAA,EAAa;AAAA,SACd,CAAA;AAAA,MACH;AAAA,KACF;AAEA,IAAA,YAAA,CAAaA,KAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACtChB,IAQMA,KAAAA;AARN,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAOA,IAAMA,KAAAA,GAA+B;AAAA,MACnC,IAAA,EAAM,WAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,CAAC,KAAK,OAAO,CAAA,CAAE,YAAY,QAAA,IAAY,CAAC,EAAE,OAAA,EAAS;AACrD,UAAA,MAAM,IAAI,MAAM,uCAA6B,CAAA;AAAA,QAC/C;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAA,KAAM,CAAC,EAAE,OAAO,CAAA;AAAA,MAC5B,UAAU,CAAC,GAAA,KAAQ,CAAA,8BAAA,EAAkB,GAAA,CAAI,MAAM,OAAO,CAAA,CAAA;AAAA,MACtD,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AAEpB,QAAA,MAAM,QAAQ,GAAA,CAAI,GAAA;AAClB,QAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,OAAO,CAAA;AAC3C,QAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAChB,QAAA,OAAO,KAAA,CAAM,MAAA,CAAO,SAAA,EAAW,CAAC,EAAE,CAAA,EAAG;AAAA,UACnC,WAAA,EAAa,SAAA;AAAA,UACb,WAAA,EAAa,GAAA;AAAA,UACb,IAAA,EAAM,CAAA;AAAA,UACN,SAAA,EAAW;AAAA,SACZ,CAAA;AAAA,MACH;AAAA,KACF;AAEA,IAAA,YAAA,CAAaA,KAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvBT,SAAS,SAAA,CACd,EAAA,EACA,IAAA,EACA,IAAA,EACA,UAAU,eAAA,EACA;AACV,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,IAAK,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,IAAK,IAAA,IAAQ,IAAA,SAAa,EAAC;AAC9E,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,MAAM,IAAA,GAAA,CAAQ,OAAO,IAAA,IAAQ,OAAA;AAC7B,EAAA,IAAI,IAAA,GAAO,GAAG,IAAI,CAAA;AAClB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,EAAS,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,CAAA,GAAI,OAAO,CAAA,GAAI,IAAA;AACrB,IAAA,MAAM,IAAA,GAAO,GAAG,CAAC,CAAA;AACjB,IAAA,IAAI,CAAC,OAAO,QAAA,CAAS,IAAI,KAAK,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AACpD,MAAA,IAAA,GAAO,IAAA;AACP,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,GAAO,OAAO,CAAA,EAAG;AAEnB,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,EAAA,EAAI,CAAA,GAAI,MAAM,CAAC,CAAA;AACnC,MAAA,IAAI,OAAO,QAAA,CAAS,IAAI,CAAA,EAAG,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,IAC1C,CAAA,MAAA,IAAW,IAAA,KAAS,CAAA,IAAK,IAAA,KAAS,CAAA,EAAG;AAEnC,MAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,IACZ;AACA,IAAA,IAAA,GAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,MAAA,CAAO,EAAA,EAA2B,EAAA,EAAY,EAAA,EAAoB;AACzE,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,IAAA,MAAM,GAAA,GAAA,CAAO,KAAK,EAAA,IAAM,CAAA;AACxB,IAAA,MAAM,IAAA,GAAO,GAAG,GAAG,CAAA;AACnB,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AAC5B,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,GAAI,OAAO,OAAO,GAAA;AACnC,IAAA,MAAM,GAAA,GAAM,GAAG,EAAE,CAAA;AACjB,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,EAAG;AAC3B,IAAA,IAAI,GAAA,GAAM,IAAA,IAAQ,CAAA,EAAG,EAAA,GAAK,GAAA;AAAA,SACrB,EAAA,GAAK,GAAA;AAAA,EACZ;AACA,EAAA,OAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AACrB;AAcO,SAAS,WAAA,CACd,EAAA,EACA,IAAA,EACA,IAAA,EACA,UAAU,eAAA,EACE;AACZ,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,IAAK,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,IAAK,IAAA,IAAQ,IAAA,SAAa,EAAC;AAC9E,EAAA,MAAM,MAAkB,EAAC;AACzB,EAAA,MAAM,IAAA,GAAA,CAAQ,OAAO,IAAA,IAAQ,OAAA;AAE7B,EAAA,MAAM,KAAe,EAAC;AACtB,EAAA,MAAM,KAAe,EAAC;AACtB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,GAAU,GAAG,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,CAAA,GAAI,IAAA,GAAA,CAAQ,CAAA,GAAI,CAAA,IAAK,IAAA;AAC3B,IAAA,EAAA,CAAG,KAAK,CAAC,CAAA;AACT,IAAA,EAAA,CAAG,IAAA,CAAK,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,EACf;AAIA,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,EAAS,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,IAAI,EAAA,CAAG,CAAA,GAAI,CAAC,CAAA,GAAI,EAAA,CAAG,IAAI,CAAC,CAAA;AAC9B,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG;AACzB,IAAA,MAAM,OAAO,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA;AACtC,IAAA,IAAI,SAAS,CAAA,EAAG;AAChB,IAAA,IAAI,QAAA,KAAa,CAAA,IAAK,IAAA,KAAS,QAAA,EAAU;AACvC,MAAA,MAAM,IAAA,GAAsB,QAAA,GAAW,CAAA,GAAI,KAAA,GAAQ,KAAA;AAEnD,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAA,CAAO,WAAA,GAAc,KAAK,CAAC,CAAA;AAC7C,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,CAAG,IAAI,CAAA,EAAG,CAAA,EAAG,EAAA,CAAG,IAAI,CAAA,EAAG,IAAA,EAAM,CAAA;AAAA,IAC7C;AACA,IAAA,QAAA,GAAW,IAAA;AACX,IAAA,WAAA,GAAc,CAAA;AAAA,EAChB;AACA,EAAA,OAAO,GAAA;AACT;AAxGA,IAGM,eAAA;AAHN,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yCAAA,GAAA;AAGA,IAAM,eAAA,GAAkB,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACHxB,IAYMA,KAAAA;AAZN,IAAA,eAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAA,cAAA,EAAA;AACA,IAAA,WAAA,EAAA;AAQA,IAAMA,KAAAA,GAAgC;AAAA,MACpC,IAAA,EAAM,YAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,CAAC,KAAK,OAAO,CAAA,CAAE,eAAe,QAAA,IAAY,CAAC,EAAE,UAAA,EAAY;AAC3D,UAAA,MAAM,IAAI,MAAM,2CAAiC,CAAA;AAAA,QACnD;AACA,QAAA,IAAI,CAAC,EAAE,QAAA,IAAY,CAAA,CAAE,SAAS,GAAA,IAAO,CAAA,CAAE,SAAS,GAAA,EAAK;AACnD,UAAA,MAAM,IAAI,MAAM,0CAAqC,CAAA;AAAA,QACvD;AACA,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,KAAA,IAAS,CAAA,CAAE,SAAS,KAAA,EAAO;AACxC,UAAA,MAAM,IAAI,MAAM,wDAA2C,CAAA;AAAA,QAC7D;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAA,KAAM,CAAC,EAAE,UAAU,CAAA;AAAA,MAC/B,QAAA,EAAU,CAAC,GAAA,KAAQ,CAAA,EAAG,IAAI,KAAA,CAAM,IAAA,KAAS,KAAA,GAAQ,wBAAA,GAAY,oBAAU,CAAA,UAAA,EAAQ,IAAI,KAAA,CAAM,UAAU,CAAA,QAAA,EAAW,GAAA,CAAI,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAA,EAAK,GAAA,CAAI,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,CAAA,CAAA;AAAA,MAC/J,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AAEpB,QAAA,MAAM,QAAQ,GAAA,CAAI,GAAA;AAGlB,QAAA,MAAM,OAAQ,GAAA,CAAI,QAAA,CAAwD,aAAA,GAAgB,GAAA,CAAI,MAAM,UAAU,CAAA;AAC9G,QAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,QAAA,MAAM,KAAK,OAAA,CAAQ,IAAA,EAAO,GAAA,CAAI,QAAA,IAAY,EAA6B,CAAA;AACvE,QAAA,IAAI,OAAO,EAAA,KAAO,UAAA,EAAY,OAAO,IAAA;AACrC,QAAA,MAAM,UAAU,WAAA,CAAY,EAAA,EAAI,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,GAAA,CAAI,KAAA,CAAM,SAAS,GAAG,CAAA,CAAE,OAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,GAAA,CAAI,MAAM,IAAI,CAAA;AACvH,QAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,KAAA,CAAM,MAAA,CAAO,OAAA,EAAS,CAAC,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA,EAAG;AAAA,UAC1D,MAAM,GAAA,CAAI,KAAA;AAAA,UACV,IAAA,EAAM,CAAA;AAAA,UACN,SAAA,EAAW,SAAA;AAAA,UACX,WAAA,EAAa,SAAA;AAAA,UACb,SAAA,EAAW,IAAI,KAAA,KAAU;AAAA,SAC1B,CAAC,CAAA;AAAA,MACJ;AAAA,KACF;AAEA,IAAA,YAAA,CAAaA,KAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjDhB,IAWMA,KAAAA;AAXN,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAEA,IAAA,cAAA,EAAA;AACA,IAAA,WAAA,EAAA;AAOA,IAAMA,KAAAA,GAA4B;AAAA,MAChC,IAAA,EAAM,QAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,CAAC,KAAK,OAAO,CAAA,CAAE,eAAe,QAAA,IAAY,CAAC,EAAE,UAAA,EAAY;AAC3D,UAAA,MAAM,IAAI,MAAM,uCAA6B,CAAA;AAAA,QAC/C;AACA,QAAA,IAAI,CAAC,EAAE,QAAA,IAAY,CAAA,CAAE,SAAS,GAAA,IAAO,CAAA,CAAE,SAAS,GAAA,EAAK;AACnD,UAAA,MAAM,IAAI,MAAM,sCAAiC,CAAA;AAAA,QACnD;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAA,KAAM,CAAC,EAAE,UAAU,CAAA;AAAA,MAC/B,UAAU,CAAC,GAAA,KAAQ,CAAA,qBAAA,EAAc,GAAA,CAAI,MAAM,UAAU,CAAA,QAAA,EAAW,GAAA,CAAI,KAAA,CAAM,SAAS,GAAG,CAAA,EAAA,EAAK,GAAA,CAAI,KAAA,CAAM,SAAS,GAAG,CAAA,CAAA,CAAA;AAAA,MACjH,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AAEpB,QAAA,MAAM,QAAQ,GAAA,CAAI,GAAA;AAClB,QAAA,MAAM,OAAQ,GAAA,CAAI,QAAA,CAAwD,aAAA,GAAgB,GAAA,CAAI,MAAM,UAAU,CAAA;AAC9G,QAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,QAAA,MAAM,KAAK,OAAA,CAAQ,IAAA,EAAO,GAAA,CAAI,QAAA,IAAY,EAA6B,CAAA;AACvE,QAAA,IAAI,OAAO,EAAA,KAAO,UAAA,EAAY,OAAO,IAAA;AACrC,QAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,EAAA,EAAI,GAAA,CAAI,KAAA,CAAM,SAAS,GAAA,EAAK,GAAA,CAAI,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA;AAC1E,QAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,KAAA,CAAM,OAAO,OAAA,EAAS,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG;AAAA,UACpD,MAAM,GAAA,CAAI,KAAA;AAAA,UACV,IAAA,EAAM,CAAA;AAAA,UACN,SAAA,EAAW,SAAA;AAAA,UACX,WAAA,EAAa,SAAA;AAAA,UACb,SAAA,EAAW,IAAI,KAAA,KAAU;AAAA,SAC1B,CAAC,CAAA;AAAA,MACJ;AAAA,KACF;AAEA,IAAA,YAAA,CAAaA,KAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC3ChB,IAQMA,KAAAA;AARN,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AACA,IAAA,aAAA,EAAA;AAOA,IAAMA,KAAAA,GAA6B;AAAA,MACjC,IAAA,EAAM,SAAA;AAAA,MACN,aAAA,EAAe,CAAA;AAAA,MACf,SAAS,EAAC;AAAA,MACV,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,IAAI,CAAC,KAAK,OAAO,CAAA,CAAE,YAAY,QAAA,IAAY,CAAC,EAAE,OAAA,EAAS;AACrD,UAAA,MAAM,IAAI,MAAM,qCAA2B,CAAA;AAAA,QAC7C;AAAA,MACF,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,CAAA,KAAM,CAAC,EAAE,OAAO,CAAA;AAAA,MAC5B,UAAU,CAAC,GAAA,KAAQ,CAAA,eAAA,EAAa,GAAA,CAAI,MAAM,OAAO,CAAA,CAAA;AAAA,MACjD,MAAA,EAAQ,CAAC,GAAA,EAAK,GAAA,KAAQ;AAEpB,QAAA,MAAM,QAAQ,GAAA,CAAI,GAAA;AAClB,QAAA,MAAM,EAAA,GAAK,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,MAAM,OAAO,CAAA;AAC3C,QAAA,IAAI,CAAC,IAAI,OAAO,IAAA;AAChB,QAAA,OAAO,KAAA,CAAM,MAAA,CAAO,eAAA,EAAiB,CAAC,EAAE,CAAA,EAAG;AAAA,UACzC,MAAM,GAAA,CAAI,KAAA;AAAA,UACV,SAAA,EAAW,IAAA;AAAA,UACX,SAAA,EAAW,SAAA;AAAA,UACX,WAAA,EAAa,SAAA;AAAA,UACb,WAAA,EAAa;AAAA,SACd,CAAA;AAAA,MACH;AAAA,KACF;AAEA,IAAA,YAAA,CAAaA,KAAG,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AClChB,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AACA,IAAA,YAAA,EAAA;AACA,IAAA,cAAA,EAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAA,UAAA,EAAA;AACA,IAAA,aAAA,EAAA;AACA,IAAA,YAAA,EAAA;AACA,IAAA,cAAA,EAAA;AACA,IAAA,aAAA,EAAA;AACA,IAAA,iBAAA,EAAA;AACA,IAAA,eAAA,EAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAA,UAAA,EAAA;AACA,IAAA,YAAA,EAAA;AACA,IAAA,SAAA,EAAA;AACA,IAAA,QAAA,EAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAA,QAAA,EAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAA,YAAA,EAAA;AACA,IAAA,iBAAA,EAAA;AACA,IAAA,UAAA,EAAA;AACA,IAAA,aAAA,EAAA;AACA,IAAA,eAAA,EAAA;AACA,IAAA,cAAA,EAAA;AACA,IAAA,iBAAA,EAAA;AACA,IAAA,cAAA,EAAA;AACA,IAAA,eAAA,EAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAA,YAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC9BA,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yBAAA,GAAA;AAeA,IAAA,UAAA,EAAA;AAOA,IAAA,UAAA,EAAA;AAIA,IAAA,cAAA,EAAA;AAIA,IAAA,UAAA,EAAA;AAIA,IAAA,UAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACtBO,SAAS,eAAe,KAAA,EAAsB;AACnD,EAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAC7B;AAEA,SAAS,YAAA,CAAa,OAAgB,MAAA,EAAgC;AACpE,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,EAAA,MAAM,CAAA,GAAI,KAAA;AACV,EAAA,IAAI,CAAC,CAAA,CAAE,IAAA,IAAQ,OAAO,CAAA,CAAE,IAAA,KAAS,UAAU,OAAO,KAAA;AAClD,EAAA,IAAI,CAAA,CAAE,IAAA,CAAK,MAAA,KAAW,MAAA,EAAQ,OAAO,KAAA;AACrC,EAAA,IAAI,CAAC,EAAE,IAAA,CAAK,IAAA,IAAQ,OAAO,CAAA,CAAE,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU,OAAO,KAAA;AAC5D,EAAA,IAAI,CAAC,CAAA,CAAE,OAAA,IAAW,OAAO,CAAA,CAAE,OAAA,KAAY,UAAU,OAAO,KAAA;AACxD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,KAAK,GAAG,OAAO,KAAA;AACpC,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,gBAAA,CAAiB,QAAgB,GAAA,EAAoB;AACnE,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,gBAAA,CAAiB,MAAM,CAAA;AACxC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,IAAI,YAAA,CAAa,MAAA,EAAQ,MAAM,CAAA,EAAG,OAAO,MAAA;AAAA,EAC3C,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,iBAAiB,MAAM,CAAA;AAChC;AApCA,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qCAAA,GAAA;AAUA,IAAA,UAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACDO,SAAS,cAAA,CAAe,OAAc,IAAA,EAAsB;AACjE,EAAA,MAAM,QAAA,GAAkB;AAAA,IACtB,GAAG,KAAA;AAAA,IACH,IAAA,EAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,SAAS,KAAA,CAAM,IAAA,CAAK,SAAS,IAAA;AAAK,GAC1D;AACA,EAAA,OAAO,eAAe,QAAQ,CAAA;AAChC;AAEO,SAAS,iBAAiB,GAAA,EAAoB;AACnD,EAAA,OAAO,gBAAA,CAAiB,MAAM,GAAG,CAAA;AACnC;AAnBA,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qCAAA,GAAA;AAMA,IAAA,mBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACOO,SAAS,WAAW,MAAA,EAA0B;AACnD,EAAA,MAAM,MAAA,GAAS,YAAY,MAAM,CAAA;AACjC,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,IAAA,EAAM,SAAA;AAAA,IACN,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,IACtB,IAAA,EAAM,UAAU,MAAM,CAAA;AAAA,IACtB,KAAA,EAAO,WAAW,MAAM,CAAA;AAAA;AAAA,IAExB,SAAA,EAAW;AAAA,GACb;AACF;AAxBA,IAQa,WAAA,EACA,WACA,SAAA,EACA,UAAA;AAXb,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,wCAAA,GAAA;AAQO,IAAM,WAAA,GAAc,CAAC,IAAA,KAA2B,IAAA,GAAO,SAAA,GAAY,SAAA;AACnE,IAAM,SAAA,GAAY,CAAC,IAAA,KAA2B,IAAA,GAAO,SAAA,GAAY,SAAA;AACjE,IAAM,SAAA,GAAY,CAAC,IAAA,KAA2B,IAAA,GAAO,SAAA,GAAY,SAAA;AACjE,IAAM,UAAA,GAAa,CAAC,IAAA,KAA2B,IAAA,GAAO,SAAA,GAAY,SAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACXzE,IAYa,gBAAA;AAZb,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kCAAA,GAAA;AAYO,IAAM,gBAAA,GAA4B;AAAA,MACvC,MAAA,EAAQ,SAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,SAAA,EAAW;AAAA,KACb;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACnBA,IASa,WAAA;AATb,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sCAAA,GAAA;AAGA,IAAA,aAAA,EAAA;AACA,IAAA,YAAA,EAAA;AACA,IAAA,WAAA,EAAA;AAIO,IAAM,cAAN,MAAkB;AAAA,MAavB,WAAA,CAAY,KAAA,EAAc,KAAA,EAAgB,OAAA,GAA8B,EAAC,EAAG;AAT5E,QAAA,IAAA,CAAQ,QAAA,uBAAe,GAAA,EAAqB;AAE5C,QAAA,IAAA,CAAQ,QAAA,GAAW,KAAA;AAGnB;AAAA,QAAA,IAAA,CAAQ,WAAmC,EAAC;AAE5C;AAAA,QAAA,IAAA,CAAQ,eAAuC,EAAC;AAsNhD;AAAA;AAAA;AAAA,QAAA,IAAA,CAAQ,WAAA,uBAA+B,GAAA,EAAI;AAC3C,QAAA,IAAA,CAAQ,OAAA,uBAAsC,GAAA,EAAI;AApNhD,QAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,QAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,QAAA,IAAA,CAAK,KAAA,GAAQ,QAAQ,KAAA,IAAS,gBAAA;AAC9B,QAAA,IAAA,CAAK,WAAA,GAAc,KAAA,CAAM,SAAA,CAAU,CAAC,IAAA,EAAM,SAAS,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAI,CAAC,CAAA;AAE7E,QAAA,IAAA,CAAK,SAAA,CAAU,MAAA,EAAW,KAAA,CAAM,QAAA,EAAU,CAAA;AAAA,MAC5C;AAAA,MAEQ,GAAA,GAAiB;AACvB,QAAA,OAAO;AAAA,UACL,KAAK,IAAA,CAAK,KAAA;AAAA,UACV,UAAA,EAAY,CAAC,EAAA,KAAe;AAK1B,YAAA,MAAM,CAAA,GAAI,qBAAA,CAAsB,IAAA,CAAK,EAAE,CAAA;AACvC,YAAA,IAAI,CAAA,EAAG;AACL,cAAA,MAAM,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AACnC,cAAA,IAAI,CAAC,MAAM,MAAM,IAAI,MAAM,CAAA,oDAAA,EAAkD,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AACpF,cAAA,MAAM,UAAU,IAAA,CAAK,OAAA;AACrB,cAAA,MAAM,GAAA,GAAM,QAAA,CAAS,CAAA,CAAE,CAAC,GAAG,EAAE,CAAA;AAC7B,cAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,OAAO,KAAK,CAAC,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC5C,gBAAA,MAAM,IAAI,MAAM,CAAA,gCAAA,EAAmC,CAAA,CAAE,CAAC,CAAC,CAAA,wBAAA,EAAqB,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,cACpF;AACA,cAAA,OAAO,QAAQ,GAAG,CAAA;AAAA,YACpB;AACA,YAAA,MAAM,EAAA,GAAK,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC/B,YAAA,IAAI,CAAC,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,4CAAA,EAA0C,EAAE,CAAA,CAAA,CAAG,CAAA;AACxE,YAAA,OAAO,EAAA;AAAA,UACT,CAAA;AAAA,UACA,UAAU,EAAE,KAAA,EAAO,KAAK,KAAA,EAAO,aAAA,EAAe,KAAK,YAAA,EAAa;AAAA,UAChE,UAAU,IAAA,CAAK;AAAA,SACjB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMQ,iBAAiB,KAAA,EAAoB;AAC3C,QAAA,IAAI,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,SAAA,EAAW;AACrC,QAAA,MAAM,SAAiC,EAAC;AACxC,QAAA,MAAM,MAA8B,EAAC;AACrC,QAAA,KAAA,MAAW,EAAA,IAAM,MAAM,KAAA,EAAO;AAC5B,UAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA;AAC5B,UAAA,IAAI,GAAA,CAAI,SAAS,WAAA,EAAa;AAC5B,YAAA,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,GAAK,GAAA,CAAI,KAAA,CAA4B,KAAA;AAAA,UACvD,CAAA,MAAA,IAAW,GAAA,CAAI,IAAA,KAAS,YAAA,EAAc;AACpC,YAAA,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,GAAK,GAAA,CAAI,KAAA,CAAiC,UAAA;AAAA,UACtD;AAAA,QACF;AACA,QAAA,IAAA,CAAK,QAAA,GAAW,MAAA;AAChB,QAAA,IAAA,CAAK,YAAA,GAAe,GAAA;AAAA,MACtB;AAAA,MAEQ,OAAO,GAAA,EAAwB;AACrC,QAAA,IAAI;AACF,UAAA,MAAMA,KAAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC5B,UAAA,MAAM,KAAKA,KAAAA,CAAI,MAAA,CAAO,GAAA,EAAK,IAAA,CAAK,KAAK,CAAA;AACrC,UAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC5B,UAAA,IAAA,CAAK,uBAAA,CAAwB,KAAK,EAAE,CAAA;AAAA,QACtC,SAAS,GAAA,EAAK;AACZ,UAAA,OAAA,CAAQ,IAAA,CAAK,yDAAuC,GAAA,CAAI,IAAI,QAAQ,GAAA,CAAI,EAAE,MAAM,GAAG,CAAA;AAAA,QACrF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAYQ,uBAAA,CAAwB,KAAkB,EAAA,EAAmB;AACnE,QAAA,IAAI,GAAA,CAAI,SAAS,OAAA,EAAS;AAC1B,QAAA,MAAM,CAAA,GAAK,IAAI,KAAA,CAA6C,UAAA;AAC5D,QAAA,IAAI,CAAC,CAAA,IAAK,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ;AAE7B,QAAA,MAAM,KAAA,GAAQ,EAAA;AACd,QAAA,IAAI,OAAO,KAAA,CAAM,EAAA,KAAO,UAAA,EAAY;AACpC,QAAA,MAAM,UAAU,GAAA,CAAI,EAAA;AACpB,QAAA,KAAA,CAAM,EAAA,CAAG,MAAM,MAAM;AACnB,UAAA,IAAI,KAAK,QAAA,EAAU;AACnB,UAAA,IAAI,OAAO,KAAA,CAAM,CAAA,KAAM,cAAc,OAAO,KAAA,CAAM,MAAM,UAAA,EAAY;AACpE,UAAA,MAAM,CAAA,GAAI,MAAM,CAAA,EAAE;AAClB,UAAA,MAAM,CAAA,GAAI,MAAM,CAAA,EAAE;AAClB,UAAA,IAAI,CAAC,OAAO,QAAA,CAAS,CAAC,KAAK,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG;AAChD,UAAA,MAAM,MAAM,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS,CAAE,QAAQ,OAAO,CAAA;AACjD,UAAA,IAAI,CAAC,GAAA,EAAK;AACV,UAAA,MAAM,IAAA,GAAQ,IAAI,KAAA,CAAqE,UAAA;AACvF,UAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AACnC,UAAA,IAAI,IAAA,CAAK,CAAA,KAAM,CAAA,IAAK,IAAA,CAAK,MAAM,CAAA,EAAG;AAClC,UAAA,IAAA,CAAK,MAAM,QAAA,CAAS;AAAA,YAClB,IAAA,EAAM,cAAA;AAAA,YACN,OAAA,EAAS,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,EAAE,UAAA,EAAY,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,CAAA,IAAI;AAAE,WACvE,CAAA;AAAA,QACH,CAAC,CAAA;AAAA,MACH;AAAA,MAEQ,OAAO,EAAA,EAAkB;AAI/B,QAAA,IAAA,CAAK,WAAW,EAAE,CAAA;AAClB,QAAA,IAAA,CAAK,WAAA,CAAY,OAAO,EAAE,CAAA;AAC1B,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAC/B,QAAA,IAAI,CAAC,EAAA,EAAI;AACT,QAAA,IAAI;AACF,UAAA,MAAM,UAAW,EAAA,CAA+B,QAAA;AAIhD,UAAC,IAAA,CAAK,KAAA,CAAkD,YAAA,GAAe,EAAE,CAAA;AACzE,UAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,YAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,cAAA,IAAI;AACF,gBAAC,IAAA,CAAK,KAAA,CAAkD,YAAA,GAAe,CAAC,CAAA;AAAA,cAC1E,CAAA,CAAA,MAAQ;AAAA,cAAe;AAAA,YACzB;AAAA,UACF;AAAA,QACF,SAAS,GAAA,EAAK;AACZ,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,0DAAA,EAA2C,EAAE,CAAA,EAAA,CAAA,EAAM,GAAG,CAAA;AAAA,QACrE;AACA,QAAA,IAAA,CAAK,QAAA,CAAS,OAAO,EAAE,CAAA;AAAA,MACzB;AAAA,MAEQ,SAAA,CAAU,MAAyB,IAAA,EAAmB;AAC5D,QAAA,IAAI,KAAK,QAAA,EAAU;AAInB,QAAA,IAAA,CAAK,iBAAiB,IAAI,CAAA;AAE1B,QAAA,MAAM,QAAA,GAAW,IAAA,EAAM,OAAA,IAAW,EAAC;AACnC,QAAA,MAAM,WAAW,IAAA,CAAK,OAAA;AAGtB,QAAA,KAAA,MAAW,EAAA,IAAM,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,EAAG;AACtC,UAAA,IAAI,EAAE,EAAA,IAAM,QAAA,CAAA,EAAW,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,QACvC;AAGA,QAAA,KAAA,MAAW,EAAA,IAAM,KAAK,KAAA,EAAO;AAC3B,UAAA,MAAM,GAAA,GAAM,SAAS,EAAE,CAAA;AACvB,UAAA,MAAM,GAAA,GAAM,SAAS,EAAE,CAAA;AACvB,UAAA,IAAI,CAAC,GAAA,EAAK;AACR,YAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AACf,YAAA;AAAA,UACF;AACA,UAAA,IAAI,MAAA,CAAO,EAAA,CAAG,GAAA,EAAK,GAAG,CAAA,EAAG;AACzB,UAAA,MAAMA,KAAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAC5B,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AACrC,UAAA,IAAIA,KAAAA,CAAI,UAAU,QAAA,EAAU;AAC1B,YAAA,IAAI;AAAE,cAAAA,MAAI,MAAA,CAAO,GAAA,EAAK,KAAK,IAAA,CAAK,GAAA,IAAO,QAAQ,CAAA;AAAG,cAAA;AAAA,YAAU,SACrD,GAAA,EAAK;AAAE,cAAA,OAAA,CAAQ,IAAA,CAAK,4CAA4C,GAAG,CAAA;AAAA,YAAG;AAAA,UAC/E;AACA,UAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AACd,UAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,QACjB;AAIA,QAAA,IAAI,IAAA,CAAK,IAAA,CAAK,MAAA,KAAW,SAAA,IAAa,IAAA,EAAM;AAC1C,UAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,UAAA,KAAA,MAAW,EAAA,IAAM,KAAK,KAAA,EAAO;AAC3B,YAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAA;AAC3B,YAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAA;AAC3B,YAAA,IAAI,GAAA,CAAI,IAAA,KAAS,WAAA,IAAe,GAAA,EAAK,SAAS,WAAA,EAAa;AAC3D,YAAA,IAAK,GAAA,CAAI,KAAA,CAA4B,KAAA,KAAW,GAAA,CAAI,MAA4B,KAAA,EAAO;AACrF,cAAA,aAAA,CAAc,GAAA,CAAI,IAAI,KAAK,CAAA;AAAA,YAC7B;AAAA,UACF;AACA,UAAA,IAAI,aAAA,CAAc,OAAO,CAAA,EAAG;AAC1B,YAAA,KAAA,MAAW,EAAA,IAAM,KAAK,KAAA,EAAO;AAC3B,cAAA,MAAM,GAAA,GAAM,IAAA,CAAK,OAAA,CAAQ,EAAE,CAAA;AAC3B,cAAA,IAAI,GAAA,CAAI,SAAS,YAAA,EAAc;AAC/B,cAAA,MAAM,IAAA,GAAQ,IAAI,KAAA,CAAiC,UAAA;AACnD,cAAA,MAAM,IAAA,GAAO,gBAAgB,IAAI,CAAA;AACjC,cAAA,IAAI,IAAA,CAAK,KAAK,CAAC,CAAA,KAAM,cAAc,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG;AAC1C,gBAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AACd,gBAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,cACjB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MAEA,OAAA,GAAgB;AACd,QAAA,IAAI,KAAK,QAAA,EAAU;AACnB,QAAA,IAAA,CAAK,WAAA,EAAY;AACjB,QAAA,KAAA,MAAW,EAAA,IAAM,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,EAAE,CAAA;AACjE,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,MAClB;AAAA;AAAA,MAGA,WAAW,EAAA,EAAqB;AAC9B,QAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,IAAK,IAAA;AAAA,MAClC;AAAA;AAAA,MAGA,YAAA,GAAqC;AACnC,QAAA,OAAO,IAAA,CAAK,QAAA;AAAA,MACd;AAAA,MAQA,UAAU,GAAA,EAAqC;AAC7C,QAAA,IAAI,KAAK,QAAA,EAAU;AACnB,QAAA,MAAM,SAAS,IAAI,GAAA;AAAA,UACjB,GAAA,IAAO,IAAA,GAAO,EAAC,GAAI,KAAA,CAAM,QAAQ,GAAG,CAAA,GAAI,GAAA,GAAM,CAAC,GAAG;AAAA,SACpD;AAEA,QAAA,KAAA,MAAW,EAAA,IAAM,KAAK,WAAA,EAAa;AACjC,UAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAG,IAAA,CAAK,WAAW,EAAE,CAAA;AAAA,QACzC;AAEA,QAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,UAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,EAAG,IAAA,CAAK,QAAQ,EAAE,CAAA;AAAA,QACzE;AACA,QAAA,IAAA,CAAK,WAAA,GAAc,MAAA;AACnB,QAAA,IAAI;AACF,UAAC,IAAA,CAAK,MAAkC,MAAA,IAAS;AAAA,QACnD,CAAA,CAAA,MAAQ;AAAA,QAAe;AAAA,MACzB;AAAA,MAEQ,WAAW,EAAA,EAAkB;AACnC,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACjC,QAAA,IAAI,CAAC,KAAA,EAAO;AACZ,QAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AACnB,QAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,UAAA,IAAI;AAAE,YAAA,KAAA,CAAM,eAAe,CAAC,CAAA;AAAA,UAAG,CAAA,CAAA,MAAQ;AAAA,UAAe;AAAA,QACxD;AACA,QAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,MACxB;AAAA,MAEQ,QAAQ,EAAA,EAAkB;AAChC,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAa/B,QAAA,IAAI,CAAC,EAAA,EAAI;AACT,QAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AAGnB,QAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AAInB,QAAA,MAAM,UAAA,GAAa,SAAA;AACnB,QAAA,MAAM,QAAA,GAAW,SAAA;AACjB,QAAA,MAAM,QAAA,GAAW;AAAA,UACf,WAAA,EAAa,UAAA;AAAA,UACb,aAAA,EAAe,IAAA;AAAA,UACf,SAAA,EAAW,QAAA;AAAA,UACX,WAAA,EAAa,GAAA;AAAA,UACb,KAAA,EAAO,IAAA;AAAA,UACP,SAAA,EAAW,KAAA;AAAA,UACX,IAAA,EAAM,EAAA;AAAA,UACN,SAAA,EAAW,KAAA;AAAA,UACX,KAAA,EAAO,CAAA;AAAA,UACP,kBAAA,EAAoB;AAAA,SACtB;AACA,QAAA,MAAM,QAAmB,EAAC;AAC1B,QAAA,IAAI;AACF,UAAA,QAAQ,GAAG,MAAA;AAAQ,YACjB,KAAK,OAAA;AAAA,YACL,KAAK,QAAA;AAAA,YACL,KAAK,cAAA,EAAgB;AACnB,cAAA,MAAM,QAAA,GAAY,EAAA,CAAG,YAAA,GAAe,MAAM,CAAA,IAA4B,CAAA;AACtE,cAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,OAAA,EAAS;AAAA,gBACjC,MAAM,EAAA,CAAG,CAAA,IAAI,IAAK,CAAA;AAAA,gBAClB,MAAM,EAAA,CAAG,CAAA,IAAI,IAAK;AAAA,eACpB,EAAG;AAAA,gBACD,GAAG,QAAA;AAAA,gBACH,MAAM,QAAA,GAAW,CAAA;AAAA,gBACjB,IAAA,EAAM,GAAA;AAAA,gBACN,WAAA,EAAa,CAAA;AAAA,gBACb,aAAA,EAAe,IAAA;AAAA,gBACf,WAAA,EAAa;AAAA,eACd,CAAA;AACD,cAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,cAAA;AAAA,YACF;AAAA,YACA,KAAK,SAAA,EAAW;AACd,cAAA,IAAI,EAAA,CAAG,MAAA,IAAU,EAAA,CAAG,MAAA,EAAQ;AAC1B,gBAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,SAAA,EAAW,CAAC,EAAA,CAAG,MAAA,EAAQ,EAAA,CAAG,MAAM,CAAA,EAAG;AAAA,kBAC3D,GAAG,QAAA;AAAA,kBACH,WAAA,EAAa,CAAA;AAAA,kBACb,aAAA,EAAe,KAAA;AAAA,kBACf,YAAA,EAAc;AAAA,iBACf,CAAA;AACD,gBAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,cACjB;AACA,cAAA;AAAA,YACF;AAAA,YACA,KAAK,MAAA;AAAA,YACL,KAAK,OAAA;AAAA,YACL,KAAK,KAAA;AAAA,YACL,KAAK,QAAA;AAAA,YACL,KAAK,SAAA;AAAA,YACL,KAAK,QAAA;AAAA,YACL,KAAK,UAAA;AAAA,YACL,KAAK,eAAA;AAAA,YACL,KAAK,UAAA,EAAY;AACf,cAAA,IAAI,EAAA,CAAG,MAAA,IAAU,EAAA,CAAG,MAAA,EAAQ;AAC1B,gBAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,MAAA,EAAQ,CAAC,EAAA,CAAG,MAAA,EAAQ,EAAA,CAAG,MAAM,CAAA,EAAG;AAAA,kBACxD,GAAG,QAAA;AAAA,kBACH,WAAA,EAAa;AAAA,iBACd,CAAA;AACD,gBAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,cACjB;AACA,cAAA;AAAA,YACF;AAAA,YACA,KAAK,QAAA,EAAU;AACb,cAAA,IAAI,EAAA,CAAG,MAAA,IAAU,OAAO,EAAA,CAAG,WAAW,UAAA,EAAY;AAChD,gBAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,CAAC,EAAA,CAAG,MAAA,EAAQ,MAAM,EAAA,CAAG,MAAA,IAAS,IAAK,CAAC,CAAA,EAAG;AAAA,kBACzE,GAAG,QAAA;AAAA,kBACH,WAAA,EAAa,CAAA;AAAA,kBACb,WAAA,EAAa;AAAA,iBACd,CAAA;AACD,gBAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,cACjB;AACA,cAAA;AAAA,YACF;AAAA,YACA,KAAK,SAAA,EAAW;AACd,cAAA,IAAI,KAAA,CAAM,QAAQ,EAAA,CAAG,QAAQ,KAAK,EAAA,CAAG,QAAA,CAAS,UAAU,CAAA,EAAG;AAGzD,gBAAA,MAAM,IAAA,GAAO,EAAA,CAAG,QAAA,CAAS,MAAA,GAAS,CAAA;AAClC,gBAAA,MAAM,QAAQ,EAAA,CAAG,QAAA,CAAS,IAAI,CAAA,KAAM,GAAG,QAAA,CAAS,CAAC,CAAA,GAC7C,EAAA,CAAG,SAAS,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,GACzB,EAAA,CAAG,SAAS,KAAA,EAAM;AACtB,gBAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,SAAA,EAAW,KAAA,EAAO;AAAA,kBAC1C,GAAG,QAAA;AAAA,kBACH,WAAA,EAAa,GAAA;AAAA,kBACb,OAAA,EAAS;AAAA,oBACP,WAAA,EAAa,UAAA;AAAA,oBACb,WAAA,EAAa,CAAA;AAAA,oBACb,aAAA,EAAe,IAAA;AAAA,oBACf,SAAA,EAAW;AAAA;AACb,iBACD,CAAA;AACD,gBAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,cACjB;AACA,cAAA;AAAA,YACF;AAAA,YACA;AAEE,cAAA;AAAA;AACJ,QACF,SAAS,GAAA,EAAK;AACZ,UAAA,OAAA,CAAQ,IAAA,CAAK,uCAAuC,GAAG,CAAA;AAAA,QACzD;AACA,QAAA,IAAI,MAAM,MAAA,EAAQ,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,KAAK,CAAA;AAAA,MAC9C;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC9VA,eAAsB,oBACpB,IAAA,EACmC;AACnC,EAAA,MAAM,EAAE,MAAM,IAAA,EAAM,IAAA,GAAO,OAAO,IAAA,GAAO,KAAA,EAAO,eAAA,GAAkB,IAAA,EAAK,GAAI,IAAA;AAC3E,EAAA,MAAM,GAAA,GAAA,CAAkB,MAAM,OAAO,UAAU,CAAA,EAAG,OAAA;AAElD,EAAA,IAAI,KAAK,YAAA,EAAc;AACrB,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,aAAa,GAAG,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GACJ,gBAAA,GAAmB,IAAA,CAAK,GAAA,KAAQ,GAAA,GAAM,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAC7E,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA;AAC9C,EAAA,SAAA,CAAU,EAAA,GAAK,WAAA;AACf,EAAA,SAAA,CAAU,MAAM,OAAA,GACd,CAAA,mDAAA,EACS,KAAK,KAAK,CAAA,UAAA,EAAa,KAAK,MAAM,CAAA,yCAAA,CAAA;AAE7C,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,SAAS,CAAA;AAEnC,EAAA,IAAI,KAAA,GAAiB,IAAA;AACrB,EAAA,IAAI,UAAA,GAA6C,IAAA;AACjD,EAAA,IAAI;AACF,IAAA,KAAA,GAAQ,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,WAAA,EAAa;AAAA,MAC1C,WAAA,EAAa,IAAA;AAAA,MACb,IAAA;AAAA,MACA,IAAA;AAAA,MACA,eAAA;AAAA,MACA,aAAA,EAAe,KAAA;AAAA,MACf,cAAA,EAAgB;AAAA,KACjB,CAAA;AACD,IAAA,UAAA,GAAa,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,GAAG,CAAA;AACxC,IAAA,IAAI;AAEF,MAAC,OAAe,MAAA,IAAS;AAAA,IAC3B,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,aAAA,CAAc,KAAK,CAAA;AAC3C,IAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAC9E,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,CAAU,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,KAAA,CAAM,YAAA,CAAa,OAAO,CAAA,EAAG;AAChC,MAAA,KAAA,CAAM,YAAA,CAAa,SAAS,4BAA4B,CAAA;AAAA,IAC1D;AACA,IAAA,IAAI,IAAA,CAAK,cAAA,EAAgB,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAClD,IAAA,MAAM,SAAA,GAAY,IAAI,aAAA,EAAc,CAAE,kBAAkB,KAAK,CAAA;AAC7D,IAAA,OAAO,EAAE,SAAA,EAAW,KAAA,EAAO,KAAK,KAAA,EAAO,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,EAC7D,CAAA,SAAE;AACA,IAAA,IAAI;AACF,MAAA,UAAA,EAAY,OAAA,EAAQ;AAAA,IACtB,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAI;AACF,MAAA,IAAI,KAAA,EAAO,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,KAAK,CAAA;AAAA,IACzC,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,IAAI,SAAA,CAAU,UAAA,EAAY,SAAA,CAAU,UAAA,CAAW,YAAY,SAAS,CAAA;AAAA,EACtE;AACF;AA9GA,IAAA,uBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yCAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACsCO,SAAS,qBAAqB,IAAA,EAA2E;AAC9G,EAAA,MAAM,CAAC,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA,GAAI,IAAA;AACjC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,IAAI,CAAA;AAC9B,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,IAAI,CAAA;AAC9B,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,IAAK,CAAA,IAAK,KAAK,CAAA,EAAG;AAClE,IAAA,OAAO,EAAE,KAAA,EAAO,UAAA,EAAY,MAAA,EAAQ,UAAA,EAAW;AAAA,EACjD;AACA,EAAA,IAAI,QAAQ,CAAA,GAAI,eAAA;AAChB,EAAA,IAAI,SAAS,CAAA,GAAI,eAAA;AACjB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA;AACtC,EAAA,IAAI,UAAU,OAAA,EAAS;AACrB,IAAA,MAAM,QAAQ,OAAA,GAAU,OAAA;AACxB,IAAA,KAAA,IAAS,KAAA;AACT,IAAA,MAAA,IAAU,KAAA;AAAA,EACZ;AACA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA;AACtC,EAAA,IAAI,UAAU,OAAA,EAAS;AACrB,IAAA,MAAM,QAAQ,OAAA,GAAU,OAAA;AACxB,IAAA,KAAA,IAAS,KAAA;AACT,IAAA,MAAA,IAAU,KAAA;AAAA,EACZ;AACA,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAK,GAAG,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA,EAAE;AAChE;AAEA,eAAsB,2BAA2B,SAAA,EAAoC;AACnF,EAAA,MAAM,KAAA,GAAQ,iBAAiB,SAAS,CAAA;AACxC,EAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,WAAW,IAAA,GAAO,KAAA,CAAM,KAAK,IAAA,GAAO,eAAA;AAC5D,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAGlB,EAAA,MAAM,OAAA,GAAU,WAAW,KAAK,CAAA;AAChC,EAAA,MAAM,IAAA,GAAO,qBAAqB,IAAI,CAAA;AACtC,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,MAAM,mBAAA,CAAoB;AAAA,IAC9C,IAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAM,IAAA,CAAK,QAAA;AAAA,IACX,MAAM,IAAA,CAAK,QAAA;AAAA,IACX,eAAA,EAAiB,IAAA;AAAA,IACjB,YAAA,EAAc,CAAC,GAAA,KAAQ;AAErB,MAAA,MAAM,OAAQ,GAAA,CAAY,OAAA;AAC1B,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,IAAA,IAAQ,EAAC;AAC1B,MAAA,IAAA,CAAK,KAAK,OAAA,GAAU,UAAA;AACpB,MAAA,IAAA,CAAK,KAAK,cAAA,GAAiB,KAAA;AAC3B,MAAA,IAAA,CAAK,KAAK,UAAA,GAAa,KAAA;AACvB,MAAA,IAAA,CAAK,KAAK,QAAA,GAAW,KAAA;AACrB,MAAA,IAAA,CAAK,IAAA,CAAK,cAAc,OAAA,CAAQ,KAAA;AAChC,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAC5B,MAAA,IAAA,CAAK,MAAM,OAAA,GAAU,UAAA;AACrB,MAAA,IAAA,CAAK,KAAA,CAAM,cAAc,OAAA,CAAQ,KAAA;AACjC,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,IAAA,IAAQ,EAAC;AAC1B,MAAA,IAAA,CAAK,IAAA,CAAK,cAAc,OAAA,CAAQ,IAAA;AAChC,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,IAAA,IAAQ,EAAC;AAC1B,MAAA,IAAA,CAAK,IAAA,CAAK,cAAc,OAAA,CAAQ,IAAA;AAAA,IAClC,CAAA;AAAA,IACA,KAAA,EAAO,CAAC,KAAA,KAAU;AAChB,MAAA,MAAM,KAAA,GAAQ,YAAY,KAAK,CAAA;AAC/B,MAAA,OAAO,IAAI,WAAA,CAAY,KAAA,EAAO,KAAK,CAAA;AAAA,IACrC;AAAA,GACD,CAAA;AACD,EAAA,OAAO,SAAA;AACT;AApGA,IAgCM,eAAA,EACA,OAAA,EACA,OAAA,EACA,UAAA,EACA,UAAA;AApCN,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kCAAA,GAAA;AAAA,IAAA,cAAA,EAAA;AACA,IAAA,UAAA,EAAA;AACA,IAAA,UAAA,EAAA;AACA,IAAA,UAAA,EAAA;AACA,IAAA,gBAAA,EAAA;AACA,IAAA,uBAAA,EAAA;AA2BA,IAAM,eAAA,GAAkB,EAAA;AACxB,IAAM,OAAA,GAAU,GAAA;AAChB,IAAM,OAAA,GAAU,IAAA;AAChB,IAAM,UAAA,GAAa,GAAA;AACnB,IAAM,UAAA,GAAa,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACdnB,eAAe,gBAAgB,KAAA,EAAgC;AAC7D,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,MAAA,CAAO,MAAA,EAAQ;AAClD,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,EAAY,CAAE,OAAO,KAAK,CAAA;AAC1C,IAAA,MAAM,SAAS,MAAM,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,WAAW,GAAG,CAAA;AACxD,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,UAAA,CAAW,MAAM,CAAC,CAAA,CACrC,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CACX,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAC,CAAA,CAC1C,IAAA,CAAK,EAAE,CAAA;AAAA,EACZ;AAEA,EAAA,IAAI,EAAA,GAAK,UAAA;AACT,EAAA,IAAI,EAAA,GAAK,UAAA;AACT,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,CAAA,GAAI,KAAA,CAAM,UAAA,CAAW,CAAC,CAAA;AAC5B,IAAA,EAAA,IAAM,CAAA;AACN,IAAA,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAA,EAAI,QAAU,CAAA;AAC7B,IAAA,EAAA,IAAM,CAAA,GAAI,CAAA;AACV,IAAA,EAAA,GAAK,IAAA,CAAK,IAAA,CAAK,EAAA,EAAI,aAAA,GAAgB,UAAU,CAAA;AAAA,EAC/C;AACA,EAAA,OAAA,CACG,OAAO,CAAA,EAAG,QAAA,CAAS,EAAE,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAA,GAAA,CACtC,EAAA,KAAO,GAAG,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAE3C;AAEA,SAAS,QAAA,CAAS,KAAa,IAAA,EAAkC;AAC/D,EAAA,MAAM,KAAK,IAAI,MAAA,CAAO,CAAA,YAAA,EAAe,IAAI,wBAAwB,GAAG,CAAA;AACpE,EAAA,MAAM,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,EAAE,CAAA;AACtB,EAAA,IAAI,CAAA,EAAG,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,CAAA,CAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AACtD,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,KAAA,CAAM,wBAAwB,CAAA;AAC7C,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,CAAC,CAAA,CAAE,IAAA,GAAO,KAAA,CAAM,KAAK,CAAA,CAAE,GAAA,CAAI,UAAU,CAAA;AACtD,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,KAAS,OAAA,GAAU,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAC,CAAC,CAAA;AAAA,IACvE;AAAA,EACF;AACA,EAAA,OAAO,IAAA,KAAS,UAAU,aAAA,GAAgB,cAAA;AAC5C;AAEO,SAAS,aAAa,GAAA,EAAgD;AAC3E,EAAA,OAAO,EAAE,KAAA,EAAO,QAAA,CAAS,GAAA,EAAK,OAAO,GAAG,MAAA,EAAQ,QAAA,CAAS,GAAA,EAAK,QAAQ,CAAA,EAAE;AAC1E;AAEO,SAAS,cAAA,CAAe,WAAmB,MAAA,EAAiC;AACjF,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAO,GAAI,aAAa,SAAS,CAAA;AAChD,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,kBAAA,CAAmB,SAAS,CAAC,CAAA;AACnD,EAAA,MAAM,MAAA,GAAS,OAAO,IAAA,KAAS,WAAA,GAC3B,IAAA,CAAK,IAAI,CAAA,GACT,MAAA,CAAO,IAAA,CAAK,IAAA,EAAM,QAAQ,CAAA,CAAE,SAAS,QAAQ,CAAA;AACjD,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,OAAA,EAAS,6BAA6B,MAAM,CAAA,CAAA;AAAA,IAC5C,QAAA,EAAU,eAAA;AAAA,IACV,KAAA;AAAA,IACA;AAAA,GACF;AACF;AAIA,eAAsB,gBAAgB,SAAA,EAA6C;AACjF,EAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,SAAS,CAAA;AAC9C,EAAA,OAAO,cAAA,CAAe,WAAW,MAAM,CAAA;AACzC;AArFA,IAWM,aAAA,EACA,cAAA;AAZN,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qCAAA,GAAA;AAWA,IAAM,aAAA,GAAgB,GAAA;AACtB,IAAM,cAAA,GAAiB,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACJhB,SAAS,qBAAqB,IAAA,EAA2C;AAC9E,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,UAAU,OAAO,KAAA;AAC9C,EAAA,MAAM,CAAA,GAAI,IAAA;AACV,EAAA,OAAO,CAAA,CAAE,SAAS,UAAA,IAAc,CAAA,CAAE,YAAY,CAAA,IAAK,OAAO,EAAE,SAAA,KAAc,QAAA;AAC5E;AAZA,IAAAS,WAAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACsBA,SAAS,SAAA,GAAY;AACnB,EAAA,uCACG,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,SAAQ,WAAA,EAAY,IAAA,EAAK,QAAO,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAM,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,eAAY,MAAA,EAC3J,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAAC,MAAA,EAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,KAAI,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA;AAAA,oBACpCA,cAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK;AAAA,GAAA,EACtC,CAAA;AAEJ;AAEO,SAAS,eAAiC,KAAA,EAAmD;AAClG,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,MAAM,SAAA,EAAW,WAAA,EAAa,MAAA,EAAQ,QAAA,EAAS,GAAI,KAAA;AACzF,EAAA,MAAM,QAAA,GAAW,CAAC,CAAC,IAAA,IAAQ,KAAK,MAAA,IAAU,CAAA;AAE1C,EAAA,uBACEC,eAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,eAAA;AAAA,MACL,YAAA,EAAY,KAAA;AAAA,MACZ,eAAa,MAAA,IAAU,YAAA;AAAA,MACvB,iBAAA,EAAgB,MAAA;AAAA,MAChB,SAAA,EAAW;AAAA,QACT,SAAS,cAAA,GAAiB,EAAA;AAAA,QAC1B;AAAA,OACF,CAAE,KAAK,EAAE,CAAA;AAAA,MAET,QAAA,EAAA;AAAA,wBAAAA,eAAA,CAAC,QAAA,EAAA,EAAO,WAAU,+GAAA,EAChB,QAAA,EAAA;AAAA,0BAAAA,eAAA,CAAC,IAAA,EAAA,EAAG,WAAU,8DAAA,EACZ,QAAA,EAAA;AAAA,4BAAAD,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAA0B,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,YAC9C;AAAA,WAAA,EACH,CAAA;AAAA,0BACAA,cAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,OAAA,EAAS,OAAA;AAAA,cACT,YAAA,EAAW,cAAA;AAAA,cACX,SAAA,EAAU,+EAAA;AAAA,cAEV,yCAAC,SAAA,EAAA,EAAU;AAAA;AAAA;AACb,SAAA,EACF,CAAA;AAAA,QAEC,QAAA,oBACCA,cAAA,CAAC,KAAA,EAAA,EAAI,IAAA,EAAK,SAAA,EAAU,WAAU,oDAAA,EAC3B,QAAA,EAAA,IAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBACVA,cAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YAEC,MAAA,EAAQ,EAAE,GAAA,KAAQ,SAAA;AAAA,YAClB,OAAA,EAAS,MAAM,WAAA,GAAc,CAAA,CAAE,GAAG,CAAA;AAAA,YAClC,QAAQ,CAAA,CAAE,MAAA;AAAA,YAET,QAAA,EAAA,CAAA,CAAE;AAAA,WAAA;AAAA,UALE,CAAA,CAAE;AAAA,SAOV,CAAA,EACH,CAAA;AAAA,wBAGFA,cAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACE,GAAI,QAAA,GAAW,EAAE,IAAA,EAAM,UAAA,KAAe,EAAC;AAAA,YACxC,SAAA,EAAU,8CAAA;AAAA,YAET;AAAA;AAAA;AACH;AAAA;AAAA,GACF;AAEJ;AAEO,SAAS,QAAQ,KAAA,EAKD;AACrB,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,UAAS,GAAI,KAAA;AAC9C,EAAA,uBACEA,cAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,IAAA,EAAK,KAAA;AAAA,MACL,eAAA,EAAe,MAAA;AAAA,MACf,OAAA;AAAA,MACA,aAAA,EAAa,MAAA;AAAA,MACb,SAAA,EAAW;AAAA,QACT,6DAAA;AAAA,QACA,SACI,yDAAA,GACA;AAAA,OACN,CAAE,KAAK,GAAG,CAAA;AAAA,MAET;AAAA;AAAA,GACH;AAEJ;AAEO,SAAS,QAAQ,KAAA,EAAyE;AAC/F,EAAA,uCACG,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAAA,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0EAAA,EACX,QAAA,EAAA,KAAA,CAAM,KAAA,EACT,CAAA;AAAA,IACC,KAAA,CAAM;AAAA,GAAA,EACT,CAAA;AAEJ;AAzHA,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sCAAA,GAAA;AAAA,IAAA,YAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACkDO,SAAS,cAAc,IAAA,EAA0B;AACtD,EAAA,OAAO,YAAA,CAAa,IAAI,CAAA,IAAK,EAAE,aAAa,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,YAAA,EAAc,SAAA,EAAU;AACvF;AApDA,IAYM,WAAA,EACA,aACA,WAAA,EAEO,YAAA;AAhBb,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AAYA,IAAM,WAAA,GAAc,SAAA;AACpB,IAAM,WAAA,GAAc,SAAA;AACpB,IAAM,WAAA,GAAc,SAAA;AAEb,IAAM,YAAA,GAAqD;AAAA;AAAA,MAEhE,OAAc,EAAE,WAAA,EAAa,kBAAe,IAAA,EAAM,MAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACjF,SAAc,EAAE,WAAA,EAAa,6BAAe,IAAA,EAAM,QAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACjF,MAAc,EAAE,WAAA,EAAa,mCAAe,IAAA,EAAM,GAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACjF,KAAc,EAAE,WAAA,EAAa,OAAe,IAAA,EAAM,QAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACjF,QAAc,EAAE,WAAA,EAAa,UAAe,IAAA,EAAM,QAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACjF,QAAc,EAAE,WAAA,EAAa,gCAAe,IAAA,EAAM,QAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACjF,SAAc,EAAE,WAAA,EAAa,mBAAe,IAAA,EAAM,QAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACjF,cAAc,EAAE,WAAA,EAAa,uBAAe,IAAA,EAAM,QAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACjF,OAAc,EAAE,WAAA,EAAa,UAAe,IAAA,EAAM,QAAA,EAAK,cAAc,SAAA,EAAU;AAAA,MAC/E,UAAc,EAAE,WAAA,EAAa,uBAAe,IAAA,EAAM,QAAA,EAAK,cAAc,SAAA,EAAU;AAAA;AAAA,MAE/E,SAAc,EAAE,WAAA,EAAa,kBAAe,IAAA,EAAM,MAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACjF,WAAc,EAAE,WAAA,EAAa,6BAAe,IAAA,EAAM,QAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACjF,QAAc,EAAE,WAAA,EAAa,mCAAe,IAAA,EAAM,GAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACjF,OAAc,EAAE,WAAA,EAAa,OAAe,IAAA,EAAM,QAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACjF,UAAc,EAAE,WAAA,EAAa,UAAe,IAAA,EAAM,QAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACjF,SAAc,EAAE,WAAA,EAAa,uBAAe,IAAA,EAAM,QAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACjF,WAAc,EAAE,WAAA,EAAa,mBAAe,IAAA,EAAM,QAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACjF,UAAc,EAAE,WAAA,EAAa,qBAAe,IAAA,EAAM,QAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACjF,cAAc,EAAE,WAAA,EAAa,qBAAe,IAAA,EAAM,QAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACjF,YAAc,EAAE,WAAA,EAAa,oBAAe,IAAA,EAAM,QAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACjF,QAAc,EAAE,WAAA,EAAa,kBAAe,IAAA,EAAM,QAAA,EAAK,cAAc,WAAA,EAAY;AAAA;AAAA,MAEjF,YAAc,EAAE,WAAA,EAAa,kBAAoB,IAAA,EAAM,QAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACtF,WAAc,EAAE,WAAA,EAAa,gBAAoB,IAAA,EAAM,QAAA,EAAK,cAAc,SAAA,EAAU;AAAA,MACpF,cAAc,EAAE,WAAA,EAAa,gDAAoB,IAAA,EAAM,QAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACtF,WAAc,EAAE,WAAA,EAAa,wBAAoB,IAAA,EAAM,QAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACtF,YAAc,EAAE,WAAA,EAAa,qBAAoB,IAAA,EAAM,QAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACtF,QAAc,EAAE,WAAA,EAAa,eAAoB,IAAA,EAAM,GAAA,EAAK,cAAc,WAAA,EAAY;AAAA,MACtF,SAAc,EAAE,WAAA,EAAa,0BAAoB,IAAA,EAAM,QAAA,EAAK,cAAc,SAAA;AAAU,KACtF;AAAA,EAAA;AAAA,CAAA,CAAA;ACrCO,SAAS,cAAc,KAAA,EAA+C;AAC3E,EAAA,MAAM,EAAE,MAAA,EAAQ,cAAA,EAAgB,QAAA,EAAU,aAAA,EAAe,UAAS,GAAI,KAAA;AACtE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAUE,0BAAS,KAAK,CAAA;AAE5C,EAAA,uBACED,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,oBAAAD,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,UAAA;AAAA,QACX,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,UAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,UAAA,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,QAAG,CAAA;AAAA,QAC3D,SAAA,EAAU,2BAAA;AAAA,QACX,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,IACC,uBACCC,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,MAAA;AAAA,QACL,SAAA,EAAU,yIAAA;AAAA,QACV,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,EAAgB;AAAA,QAElC,QAAA,EAAA;AAAA,0BAAAD,cAAAA,CAAC,QAAA,EAAA,EAAS,OAAA,EAAS,MAAM;AAAE,YAAA,OAAA,CAAQ,KAAK,CAAA;AAAG,YAAA,QAAA,EAAS;AAAA,UAAG,GAAG,QAAA,EAAA,sBAAA,EAAO,CAAA;AAAA,0BACjEA,cAAAA,CAAC,QAAA,EAAA,EAAS,OAAA,EAAS,MAAM;AAAE,YAAA,OAAA,CAAQ,KAAK,CAAA;AAAG,YAAA,aAAA,EAAc;AAAA,UAAG,GAAG,QAAA,EAAA,sBAAA,EAAO,CAAA;AAAA,0BACtEA,cAAAA,CAAC,QAAA,EAAA,EAAS,OAAA,EAAS,MAAM;AAAE,YAAA,OAAA,CAAQ,KAAK,CAAA;AAAG,YAAA,cAAA,EAAe;AAAA,UAAG,CAAA,EAC1D,QAAA,EAAA,MAAA,GAAS,iBAAA,GAAY,SAAA,EACxB,CAAA;AAAA,0BACAA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,SAAS,MAAM;AAAE,gBAAA,OAAA,CAAQ,KAAK,CAAA;AAAG,gBAAA,QAAA,EAAS;AAAA,cAAG,CAAA;AAAA,cAC7C,SAAA,EAAU,gCAAA;AAAA,cACX,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,KACF,GACE;AAAA,GAAA,EACN,CAAA;AAEJ;AAEA,SAAS,QAAA,CAAS;AAAA,EAChB,QAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAAyE;AACvE,EAAA,uBACEA,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,IAAA,EAAK,UAAA;AAAA,MACL,OAAA;AAAA,MACA,SAAA,EAAW,CAAA,4CAAA,EAA+C,SAAA,IAAa,EAAE,CAAA,CAAA;AAAA,MAExE;AAAA;AAAA,GACH;AAEJ;AA/DA,IAAA,kBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qCAAA,GAAA;AAAA,IAAA,YAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACmBA,SAAS,cAAc,KAAA,EAAmD;AACxE,EAAA,OAAO,MAAM,GAAA,CAAI,CAAC,EAAA,KAAO,CAAA,EAAG,GAAG,KAAK,CAAA,GAAA,EAAM,EAAA,CAAG,KAAA,CAAM,QAAQ,CAAC,CAAC,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AAC5E;AAEO,SAAS,UAAU,KAAA,EAA2C;AACnE,EAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,iBAAiB,cAAA,EAAgB,QAAA,EAAU,aAAA,EAAe,QAAA,EAAS,GAAI,KAAA;AAE/G,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AAEnC,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,IAAI;AACF,IAAA,KAAA,GAAQ,QAAQ,GAAA,CAAI,IAAI,CAAA,CAAE,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,EAC/C,CAAA,CAAA,MAAQ;AACN,IAAA,KAAA,GAAQ,CAAA,EAAG,IAAA,CAAK,WAAW,CAAA,CAAA,EAAI,IAAI,KAAK,CAAA,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,WAAA,GAA6B,IAAA;AACjC,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,IAAI;AACF,MAAA,MAAM,IAAI,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,CAAE,OAAA,GAAU,KAAK,KAAK,CAAA;AAChD,MAAA,IAAI,KAAK,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG,WAAA,GAAc,cAAc,CAAC,CAAA;AAAA,IACtD,CAAA,CAAA,MAAQ;AACN,MAAA,WAAA,GAAc,IAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAS,GAAA,CAAI,KAAA,CAA6B,KAAA,IAAS,IAAA,CAAK,YAAA;AAE9D,EAAA,uBACEC,eAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAa,CAAA,WAAA,EAAc,GAAA,CAAI,EAAE,CAAA,CAAA;AAAA,MACjC,eAAA,EAAe,QAAA;AAAA,MACf,OAAA,EAAS,MAAM,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAAA,MAC9B,SAAA,EACE,6EAAA,IACC,QAAA,GAAW,cAAA,GAAiB,EAAA,CAAA;AAAA,MAG/B,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6CAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,YAAA,EAAW,mBAAA;AAAA,cACX,cAAA,EAAc,CAAC,GAAA,CAAI,OAAA;AAAA,cACnB,OAAA,EAAS,CAAC,CAAA,KAAM;AAAE,gBAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,gBAAA,eAAA,CAAgB,IAAI,EAAE,CAAA;AAAA,cAAG,CAAA;AAAA,cAChE,SAAA,EAAU,mDAAA;AAAA,cACV,KAAA,EAAO;AAAA,gBACL,eAAA,EAAiB,GAAA,CAAI,OAAA,GAAU,KAAA,GAAQ,aAAA;AAAA,gBACvC,WAAA,EAAa;AAAA;AACf;AAAA,WACF;AAAA,0BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BACb,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,0BACAA,cAAAA;AAAA,YAAC,aAAA;AAAA,YAAA;AAAA,cACC,QAAQ,GAAA,CAAI,MAAA;AAAA,cACZ,cAAA,EAAgB,MAAM,cAAA,CAAe,GAAA,CAAI,EAAE,CAAA;AAAA,cAC3C,QAAA,EAAU,MAAM,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA;AAAA,cAC/B,aAAA,EAAe,MAAM,aAAA,CAAc,GAAA,CAAI,EAAE,CAAA;AAAA,cACzC,QAAA,EAAU,MAAM,QAAA,CAAS,GAAA,CAAI,EAAE;AAAA;AAAA;AACjC,SAAA,EACF,CAAA;AAAA,QACC,QAAA,IAAY,+BACXA,cAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAa,CAAA,kBAAA,EAAqB,GAAA,CAAI,EAAE,CAAA,CAAA;AAAA,YACxC,SAAA,EAAU,yCAAA;AAAA,YAET,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,GAEJ;AAEJ;AA1FA,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AAAA,IAAA,YAAA;AAGA,IAAA,aAAA,EAAA;AACA,IAAA,aAAA,EAAA;AACA,IAAA,kBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACsBO,SAAS,gBAAgB,KAAA,EAAiD;AAC/E,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,WAAU,GAAI,KAAA;AAGnD,EAAA,MAAM,SAAA,GAAkBG,gBAAA,CAAA,WAAA;AAAA,IACtB,CAAC,EAAA,KAAmB,KAAA,CAAM,SAAA,CAAU,MAAM,IAAI,CAAA;AAAA,IAC9C,CAAC,KAAK;AAAA,GACR;AACA,EAAA,MAAM,QAAcA,gBAAA,CAAA,oBAAA,CAAqB,SAAA,EAAW,KAAA,CAAM,QAAA,EAAU,MAAM,QAAQ,CAAA;AAClF,EAAA,MAAM,OAAA,GAAU,YAAY,KAAK,CAAA;AAEjC,EAAA,SAAS,aAAa,EAAA,EAAY;AAEhC,IAAA,QAAA,GAAW,EAAA,KAAO,UAAA,GAAa,IAAA,GAAO,EAAE,CAAA;AAAA,EAC1C;AAEA,EAAA,SAAS,oBAAoB,EAAA,EAAY;AACvC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA;AAC5B,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,KAAA,CAAM,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,EAAE,EAAA,EAAI,KAAA,EAAO,EAAE,SAAS,CAAC,GAAA,CAAI,OAAA,EAAQ,IAAK,CAAA;AAAA,EACtF;AAEA,EAAA,SAAS,mBAAmB,EAAA,EAAY;AACtC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA;AAC5B,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,KAAA,CAAM,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,EAAE,EAAA,EAAI,KAAA,EAAO,EAAE,QAAQ,CAAC,GAAA,CAAI,MAAA,EAAO,IAAK,CAAA;AAAA,EACpF;AAEA,EAAA,SAAS,aAAa,EAAA,EAAY;AAChC,IAAA,KAAA,CAAM,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,EAAE,EAAA,IAAM,CAAA;AAAA,EACpD;AAEA,EAAA,SAAS,IAAA,GAAO;AAAA,EAAkD;AAElE,EAAA,uBACEH,cAAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,mBAAA;AAAA,MACZ,SAAA,EAAU,yDAAA;AAAA,MAET,QAAA,EAAA,OAAA,CAAQ,MAAA,KAAW,CAAA,mBAClBA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6CAAA,EAA8C,QAAA,EAAA,sDAAA,EAAqB,CAAA,GAEjF,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ;AACnB,QAAA,MAAM,QAAA,GAAW,IAAI,EAAA,KAAO,UAAA;AAC5B,QAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA;AACzC,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,SAAS,SAAA,CAAU,GAAA,EAAK,EAAE,QAAA,EAAU,SAAS,CAAA;AACnD,UAAA,IAAI,UAAU,IAAA,EAAM;AAClB,YAAA,uBAAOA,cAAAA,CAAOG,gBAAA,CAAA,QAAA,EAAN,EAA6B,QAAA,EAAA,MAAA,EAAA,EAAT,IAAI,EAAY,CAAA;AAAA,UAC9C;AAAA,QACF;AACA,QAAA,uBACEH,cAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YAEC,GAAA;AAAA,YACA,KAAA;AAAA,YACA,QAAA;AAAA,YACA,QAAA,EAAU,YAAA;AAAA,YACV,eAAA,EAAiB,mBAAA;AAAA,YACjB,cAAA,EAAgB,kBAAA;AAAA,YAChB,QAAA,EAAU,IAAA;AAAA,YACV,aAAA,EAAe,IAAA;AAAA,YACf,QAAA,EAAU;AAAA,WAAA;AAAA,UATL,GAAA,CAAI;AAAA,SAUX;AAAA,MAEJ,CAAC;AAAA;AAAA,GAEL;AAEJ;AAhGA,IAAA,oBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uCAAA,GAAA;AAAA,IAAA,YAAA;AAIA,IAAA,cAAA,EAAA;AACA,IAAA,cAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACcA,SAAS,QAAA,GAA+B;AACtC,EAAA,uBACEC,gBAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,SAAQ,WAAA,EAAY,IAAA,EAAK,QAAO,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAM,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,eAAY,MAAA,EAC3J,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+CAAA,EAAgD,CAAA;AAAA,oBACxDA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mBAAA,EAAoB;AAAA,GAAA,EAC9B,CAAA;AAEJ;AAEA,SAAS,QAAA,GAA+B;AACtC,EAAA,uBACEC,gBAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,SAAQ,WAAA,EAAY,IAAA,EAAK,QAAO,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAM,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,eAAY,MAAA,EAC3J,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+CAAA,EAAgD,CAAA;AAAA,oBACxDA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sBAAA,EAAuB;AAAA,GAAA,EACjC,CAAA;AAEJ;AAEO,SAAS,gBAAgB,KAAA,EAAwD;AACtF,EAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,KAAA;AAC1B,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,OAAA,EAAS,OAAO,IAAA;AAE9B,EAAA,MAAM,YAAA,GAAe,MAAM,YAAA,IAAgB,kBAAA;AAC3C,EAAA,MAAM,SAAA,GAAY,MAAM,SAAA,IAAa,WAAA;AACrC,EAAA,MAAM,SAAA,GAAY,MAAM,SAAA,IAAa,gBAAA;AAErC,EAAA,uBACEA,eAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,cACd,QAAA,kBAAAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oDAAA,EACZ,QAAA,EAAA;AAAA,IAAA,IAAA,oBACCA,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAH,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,8CAAA,EACf,QAAA,EAAA;AAAA,wBAAAD,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,UAAA;AAAA,YACL,SAAS,IAAA,CAAK,QAAA;AAAA,YACd,UAAU,CAAC,CAAA,KAAM,KAAK,gBAAA,CAAiB,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,YACvD,aAAA,EAAY;AAAA;AAAA,SACd;AAAA,QACC;AAAA,OAAA,EACH,CAAA;AAAA,sBACAC,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,8CAAA,EACf,QAAA,EAAA;AAAA,wBAAAD,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,UAAA;AAAA,YACL,SAAS,IAAA,CAAK,QAAA;AAAA,YACd,UAAU,CAAC,CAAA,KAAM,KAAK,gBAAA,CAAiB,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,YACvD,aAAA,EAAY;AAAA;AAAA,SACd;AAAA,QACC;AAAA,OAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,IAED,OAAA,oBACCC,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAS,OAAA,CAAQ,MAAA;AAAA,UACjB,QAAA,EAAU,CAAC,OAAA,CAAQ,OAAA;AAAA,UACnB,KAAA,EAAM,6BAAA;AAAA,UACN,YAAA,EAAW,gBAAA;AAAA,UACX,aAAA,EAAY,UAAA;AAAA,UACZ,SAAA,EAAU,yMAAA;AAAA,UAEV,QAAA,kBAAAA,eAAC,QAAA,EAAA,EAAS;AAAA;AAAA,OACZ;AAAA,sBACAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAS,OAAA,CAAQ,MAAA;AAAA,UACjB,QAAA,EAAU,CAAC,OAAA,CAAQ,OAAA;AAAA,UACnB,KAAA,EAAM,oCAAA;AAAA,UACN,YAAA,EAAW,iBAAA;AAAA,UACX,aAAA,EAAY,UAAA;AAAA,UACZ,SAAA,EAAU,yMAAA;AAAA,UAEV,QAAA,kBAAAA,eAAC,QAAA,EAAA,EAAS;AAAA;AAAA;AACZ,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA,EACF,CAAA;AAEJ;AAnGA,IAAA,oBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sDAAA,GAAA;AAAA,IAAA,YAAA;AAQA,IAAA,mBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACRA,IAUa,gBAAA;AAVb,IAAAD,WAAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2CAAA,GAAA;AAUO,IAAM,gBAAA,GAAmB,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACCzB,SAAS,mBAAA,GAAsB;AACpC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIM,eAAqB,IAAI,CAAA;AACnD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,KAAK,CAAA;AACpD,EAAA,MAAM,aAAA,GAAgBC,aAA6C,IAAI,CAAA;AAEvE,EAAAC,gBAAU,MAAM;AACd,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,aAAA,CAAc,OAAA,EAAS,YAAA,CAAa,aAAA,CAAc,OAAO,CAAA;AAAA,IAC/D,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAYC,iBAAAA,CAAY,CAAC,EAAA,EAAiB,CAAA,KAAoB;AAClE,IAAA,IAAI,aAAA,CAAc,OAAA,EAAS,YAAA,CAAa,aAAA,CAAc,OAAO,CAAA;AAC7D,IAAA,aAAA,CAAc,OAAA,GAAU,WAAW,MAAM;AACvC,MAAA,MAAM,CAAA,GAAI,GAAG,qBAAA,EAAsB;AACnC,MAAA,QAAA,CAAS,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,IAAA,EAAM,EAAE,IAAA,EAAM,CAAA,EAAG,CAAA,CAAE,KAAA,EAAO,GAAG,CAAA,CAAE,GAAA,GAAM,CAAA,CAAE,MAAA,GAAS,GAAG,CAAA;AAAA,IAChF,GAAG,gBAAgB,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAYA,kBAAY,MAAM;AAClC,IAAA,IAAI,cAAc,OAAA,EAAS;AACzB,MAAA,YAAA,CAAa,cAAc,OAAO,CAAA;AAClC,MAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AAAA,IAC1B;AACA,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,KAAA,EAAO,WAAA,EAAa,SAAA,EAAW,SAAA,EAAU;AACpD;AAxCA,IAAA,wBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yDAAA,GAAA;AASA,IAAAT,WAAAA,EAAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACmBO,SAAS,SACd,KAAA,EACoB;AACpB,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,aAAa,UAAA,EAAY,YAAA,EAAc,OAAM,GAAI,KAAA;AAC5E,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAa,SAAA,EAAW,SAAA,KAAc,mBAAA,EAAoB;AAEzE,EAAA,MAAM,OAAA,GAAUU,cAAQ,MAAM;AAlChC,IAAA,IAAA,EAAA;AAmCI,IAAA,MAAM,MAA6D,EAAC;AACpE,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,CAAC,SAAI,CAAA,CAAE,KAAA,CAAA,KAAN,UAAiB,EAAC,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,IAC9B;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,SAAA,GAAYA,aAAA;AAAA,IAChB,MAAM,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IACzC,CAAC,SAAS,UAAU;AAAA,GACtB;AAEA,EAAA,MAAM,mBAAmB,KAAA,EAAO,WAAA,GAAc,QAAQ,KAAA,CAAM,WAAW,KAAK,IAAA,GAAO,IAAA;AAEnF,EAAA,uBACER,eAAAA,CAAAG,mBAAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,SAAA,CAAU,GAAA,CAAI,CAAC,KAAA,KAAU;AACxB,MAAA,MAAM,aAAA,GAAgB,OAAO,WAAA,KAAgB,KAAA;AAC7C,MAAA,MAAM,MAAA,GAAS,KAAA,EAAO,WAAA,IAAe,IAAA,IAAQ,CAAC,aAAA;AAC9C,MAAA,uBACEH,eAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UAEC,kBAAA,EAAkB,KAAA;AAAA,UAClB,mBAAA,EAAmB,gBAAgB,MAAA,GAAS,OAAA;AAAA,UAC5C,SAAA,EAAW;AAAA,YACT,uBAAA;AAAA,YACA,gBAAgB,2CAAA,GAA8C,KAAA;AAAA,YAC9D,SAAS,YAAA,GAAe;AAAA,WAC1B,CAAE,KAAK,GAAG,CAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAA,eAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,4GAAA,EACZ,QAAA,EAAA;AAAA,8BAAAD,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,WAAA,CAAY,KAAK,CAAA,EAAE,CAAA;AAAA,cACzB,yBACCA,cAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,aAAA,EAAa,gBAAgB,KAAK,CAAA,CAAA;AAAA,kBAClC,SAAA,EAAW;AAAA,oBACT,+CAAA;AAAA,oBACA,gBAAgB,4BAAA,GAA+B;AAAA,mBACjD,CAAE,KAAK,GAAG,CAAA;AAAA,kBAET,QAAA,EAAA,KAAA,CAAM,eAAe,KAAK;AAAA;AAAA;AAC7B,aAAA,EAEJ,CAAA;AAAA,4BACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,KAAK,CAAA,CAAG,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AAC7B,cAAA,MAAM,MAAA,GAAS,eAAe,CAAA,CAAE,GAAA;AAChC,cAAA,uBACEC,eAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBAEC,IAAA,EAAK,QAAA;AAAA,kBACL,cAAY,CAAA,CAAE,KAAA;AAAA,kBACd,cAAA,EAAc,MAAA;AAAA,kBACd,aAAW,CAAA,CAAE,GAAA;AAAA,kBACb,KAAA,EAAO,EAAE,KAAA,IAAS,CAAA,CAAE,WAAW,CAAA,EAAA,EAAK,CAAA,CAAE,QAAQ,CAAA,CAAA,CAAA,GAAM,EAAA,CAAA;AAAA,kBACpD,OAAA,EAAS,MAAM,YAAA,CAAa,CAAA,CAAE,GAAG,CAAA;AAAA,kBACjC,cAAc,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,CAAE,eAAe,CAAC,CAAA;AAAA,kBACjD,YAAA,EAAc,SAAA;AAAA,kBACd,SAAS,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,CAAE,eAAe,CAAC,CAAA;AAAA,kBAC5C,MAAA,EAAQ,SAAA;AAAA,kBACR,SAAA,EAAW;AAAA,oBACT,sEAAA;AAAA,oBACA,SACI,qCAAA,GACA;AAAA,mBACN,CAAE,KAAK,GAAG,CAAA;AAAA,kBAET,QAAA,EAAA;AAAA,oBAAA,CAAA,CAAE,IAAA;AAAA,oBACF,yBACCD,cAAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACC,aAAA,EAAa,CAAA,UAAA,EAAa,CAAA,CAAE,GAAG,CAAA,CAAA;AAAA,wBAC/B,SAAA,EAAW;AAAA,0BACT,8FAAA;AAAA,0BACA,MAAA,GACI,eAAA,GACA,aAAA,GACE,4BAAA,GACA;AAAA,yBACR,CAAE,KAAK,GAAG,CAAA;AAAA,wBAET,QAAA,EAAA,CAAA,GAAI;AAAA;AAAA;AACP;AAAA,iBAAA;AAAA,gBAhCG,CAAA,CAAE;AAAA,eAkCT;AAAA,YAEJ,CAAC,CAAA,EACH;AAAA;AAAA,SAAA;AAAA,QAjEK;AAAA,OAkEP;AAAA,IAEJ,CAAC,CAAA;AAAA,IAEA,KAAA,EAAO,WAAA,IAAe,gBAAA,oBACrBC,eAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAY,YAAA;AAAA,QACZ,SAAA,EAAU,2GAAA;AAAA,QAEV,QAAA,EAAA;AAAA,0BAAAD,cAAAA,CAAC,UAAK,SAAA,EAAU,0CAAA,EACb,gBAAM,cAAA,CAAe,KAAA,CAAM,WAAW,CAAA,EACzC,CAAA;AAAA,0BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAsB,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,UACtC,gBAAA,CAAiB,IAAI,CAAC,CAAA,EAAG,sBACxBC,eAAAA,CAAC,MAAA,EAAA,EAAiB,SAAA,EAAU,mBAAA,EAC1B,QAAA,EAAA;AAAA,4BAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EAA4C,cAAI,CAAA,EAAE,CAAA;AAAA,4BAClEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,MAAA,EAAQ,YAAE,KAAA,EAAM;AAAA,WAAA,EAAA,EAFvB,CAAA,CAAE,GAGb,CACD,CAAA;AAAA,0BACDA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAiB,QAAA,EAAA,cAAA,EAAO;AAAA;AAAA;AAAA,KAC1C;AAAA,IAGD,WAAA,IAAe,KAAA,IAAS,OAAO,QAAA,KAAa,WAAA,GACzCU,qBAAA;AAAA,sBACET,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,SAAA;AAAA,UACL,SAAA,EAAU,0IAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,IAAA,EAAM,MAAM,CAAA,GAAI,CAAA;AAAA,YAChB,KAAK,KAAA,CAAM,CAAA;AAAA,YACX,SAAA,EAAW,oBAAA;AAAA,YACX,MAAA,EAAQ;AAAA,WACV;AAAA,UAEA,QAAA,EAAA;AAAA,4BAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EAAqB,gBAAM,KAAA,EAAM,CAAA;AAAA,YAChD,KAAA,CAAM,wBAAQA,cAAAA,CAAC,UAAK,SAAA,EAAU,6BAAA,EAA+B,gBAAM,IAAA,EAAK;AAAA;AAAA;AAAA,OAC3E;AAAA,MACA,QAAA,CAAS;AAAA,KACX,GACA;AAAA,GAAA,EACN,CAAA;AAEJ;AArKA,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+CAAA,GAAA;AAAA,IAAA,YAAA;AAgBA,IAAA,wBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACDO,SAAS,sBACd,KAAA,EACoB;AACpB,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIK,eAA8B,OAAO,CAAA;AAC3D,EAAA,MAAM,UAAA,GAAa,CAAC,CAAC,OAAA;AAErB,EAAAE,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,IAAc,GAAA,KAAQ,SAAA,SAAkB,OAAO,CAAA;AAAA,EACtD,CAAA,EAAG,CAAC,UAAA,EAAY,GAAG,CAAC,CAAA;AAEpB,EAAA,MAAM,WAAW,UAAA,GACb;AAAA,IACE,EAAE,KAAK,OAAA,EAAkB,KAAA,EAAO,MAAM,UAAA,IAAc,2BAAA,EAAc,QAAQ,WAAA,EAAY;AAAA,IACtF,EAAE,KAAK,SAAA,EAAoB,KAAA,EAAO,MAAM,YAAA,IAAgB,yCAAA,EAAgB,QAAQ,aAAA;AAAc,GAChG,GACA,MAAA;AAEJ,EAAA,uBACEP,cAAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAQ,MAAA,IAAU,kBAAA;AAAA,MAClB,IAAA,EAAM,QAAA;AAAA,MACN,SAAA,EAAW,aAAa,GAAA,GAAM,MAAA;AAAA,MAC9B,WAAA,EAAa,aAAa,MAAA,GAAS,MAAA;AAAA,MAEjC,WAAC,UAAA,IAAc,GAAA,KAAQ,0BACvBC,eAAAA,CAAAG,qBAAA,EACE,QAAA,EAAA;AAAA,wBAAAJ,cAAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAY,OAAA,EAAkB,CAAA;AAAA,wBAC/CA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,UAAA;AAAA,YACA,WAAA;AAAA,YACA,UAAA;AAAA,YACA,YAAA;AAAA,YACA;AAAA;AAAA;AACF,OAAA,EACF,oBAEAC,eAAAA,CAAC,aAAQ,aAAA,EAAY,eAAA,EAAgB,WAAU,qBAAA,EAC5C,QAAA,EAAA;AAAA,QAAA,OAAA,CAAS,UAAA,IAAc,OAAA,CAAS,UAAA,CAAW,MAAA,GAAS,qBACnDD,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cACZ,QAAA,EAAA,OAAA,CAAS,UAAA,CAAW,GAAA,CAAI,CAAC,sBACxBA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAK,QAAA;AAAA,YACL,eAAa,CAAA,CAAE,MAAA;AAAA,YACf,SAAS,CAAA,CAAE,OAAA;AAAA,YACX,SAAA,EAAU,mIAAA;AAAA,YAET,QAAA,EAAA,CAAA,CAAE;AAAA,WAAA;AAAA,UANE,CAAA,CAAE;AAAA,SAQV,CAAA,EACH,CAAA;AAAA,wBAEFA,cAAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,OAAO,OAAA,CAAS,KAAA;AAAA,YAChB,YAAY,OAAA,CAAS,gBAAA;AAAA,YACrB,UAAU,OAAA,CAAS,cAAA;AAAA,YACnB,WAAW,OAAA,CAAS;AAAA;AAAA;AACtB,OAAA,EACF;AAAA;AAAA,GAEJ;AAEJ;AApGA,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8CAAA,GAAA;AAAA,IAAA,YAAA;AASA,IAAA,mBAAA,EAAA;AACA,IAAA,oBAAA,EAAA;AACA,IAAA,oBAAA,EAAA;AACA,IAAA,aAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACuDO,SAAS,gBAAA,CAA6D;AAAA,EAC3E,KAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAwC;AACtC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIR,wBAAAA,CAAM,SAA8B,OAAO,CAAA;AAC7E,EAAA,MAAM,WAAA,GAAcA,wBAAAA,CAAM,MAAA,CAAO,UAAU,CAAA;AAC3C,EAAAA,wBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,CAAC,WAAA,CAAY,OAAA,IAAW,UAAA,eAAyB,OAAO,CAAA;AAC5D,IAAA,WAAA,CAAY,OAAA,GAAU,UAAA;AAAA,EACxB,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,uBACES,eAAAA,CAAAG,mBAAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,UAAA,oBACCJ,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,uBAAA;AAAA,QACV,aAAA,EAAe,aAAA;AAAA,QACf,aAAA,EAAY;AAAA;AAAA,KACd;AAAA,oBAEFC,eAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,eAAA;AAAA,QACL,YAAA,EAAY,KAAA;AAAA,QACZ,aAAA,EAAa,CAAC,UAAA,GAAa,MAAA,GAAS,MAAA;AAAA,QACpC,aAAA,EAAa,MAAA;AAAA,QACb,iBAAA,EAAgB,MAAA;AAAA,QAChB,oBAAA,EAAmB,MAAA;AAAA,QACnB,iBAAA,EAAgB,MAAA;AAAA,QAChB,mBAAA,EAAmB,aAAa,MAAA,GAAS,QAAA;AAAA,QACzC,SAAA,EAAW;AAAA,UACT,SAAS,cAAA,GAAiB,EAAA;AAAA,UAC1B;AAAA,SACF,CAAE,KAAK,EAAE,CAAA;AAAA,QAGT,QAAA,EAAA;AAAA,0BAAAA,eAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,+GAAA,EAChB,QAAA,EAAA;AAAA,4BAAAA,eAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gEAAA,EACZ,QAAA,EAAA;AAAA,8BAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2FAAA,EACb,QAAA,EAAA,UAAA,EACH,CAAA;AAAA,cACC;AAAA,aAAA,EACH,CAAA;AAAA,4BACAA,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,OAAA,EAAS,aAAA;AAAA,gBACT,YAAA,EAAW,wCAAA;AAAA,gBACX,SAAA,EAAU,gIAAA;AAAA,gBAEV,0BAAAC,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,KAAI,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EACrI,QAAA,EAAA;AAAA,kCAAAD,cAAAA,CAAC,UAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,kCACpCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK;AAAA,iBAAA,EACtC;AAAA;AAAA;AACF,WAAA,EACF,CAAA;AAAA,0BAGAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yGAAA,EACZ,QAAA,EAAA;AAAA,YAAA,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,qBACVA,eAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,IAAA,EAAK,QAAA;AAAA,gBACL,IAAA,EAAK,QAAA;AAAA,gBACL,gBAAc,CAAA,CAAE,OAAA;AAAA,gBAChB,cAAY,CAAA,CAAE,KAAA;AAAA,gBACd,eAAa,CAAA,CAAE,MAAA;AAAA,gBACf,SAAS,MAAM,CAAA,CAAE,QAAA,CAAS,CAAC,EAAE,OAAO,CAAA;AAAA,gBACpC,SAAA,EAAU,iBAAA;AAAA,gBAET,QAAA,EAAA;AAAA,kBAAA,CAAA,CAAE,IAAA;AAAA,kBACF,CAAA,CAAE;AAAA;AAAA,eAAA;AAAA,cAVE,CAAA,CAAE;AAAA,aAYV,CAAA;AAAA,YACA,OAAA,CAAQ,MAAA,GAAS,CAAA,oBAAKD,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACnC,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBACZA,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBAEC,IAAA,EAAK,QAAA;AAAA,gBACL,SAAS,CAAA,CAAE,OAAA;AAAA,gBACX,UAAU,CAAA,CAAE,QAAA;AAAA,gBACZ,cAAY,CAAA,CAAE,KAAA;AAAA,gBACd,KAAA,EAAO,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,KAAA;AAAA,gBACpB,eAAa,CAAA,CAAE,MAAA;AAAA,gBACf,SAAA,EAAU,kNAAA;AAAA,gBAET,QAAA,EAAA,CAAA,CAAE;AAAA,eAAA;AAAA,cATE,CAAA,CAAE;AAAA,aAWV,CAAA,EACH;AAAA,WAAA,EACF,CAAA;AAAA,UAGC,8BACCC,eAAAA,CAAC,SAAI,IAAA,EAAK,SAAA,EAAU,WAAU,oDAAA,EAC5B,QAAA,EAAA;AAAA,4BAAAD,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,IAAA,EAAK,KAAA;AAAA,gBACL,iBAAe,SAAA,KAAc,OAAA;AAAA,gBAC7B,OAAA,EAAS,MAAM,YAAA,CAAa,OAAO,CAAA;AAAA,gBACnC,SAAA,EAAW;AAAA,kBACT,6DAAA;AAAA,kBACA,SAAA,KAAc,UACV,yDAAA,GACA;AAAA,iBACN,CAAE,KAAK,GAAG,CAAA;AAAA,gBACX,QAAA,EAAA;AAAA;AAAA,aAED;AAAA,4BACAA,cAAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,IAAA,EAAK,KAAA;AAAA,gBACL,iBAAe,SAAA,KAAc,SAAA;AAAA,gBAC7B,OAAA,EAAS,MAAM,YAAA,CAAa,SAAS,CAAA;AAAA,gBACrC,SAAA,EAAW;AAAA,kBACT,6DAAA;AAAA,kBACA,SAAA,KAAc,YACV,yDAAA,GACA;AAAA,iBACN,CAAE,KAAK,GAAG,CAAA;AAAA,gBAET,QAAA,EAAA,UAAA,CAAW;AAAA;AAAA;AACd,WAAA,EACF,CAAA;AAAA,0BAIFA,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,gCAAA;AAAA,cACV,KAAA,EAAO,EAAE,aAAA,EAAe,6CAAA,EAA8C;AAAA,cAErE,QAAA,EAAA,UAAA,IAAc,cAAc,SAAA,mBAC3BA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAa,QAAA,EAAA,UAAA,CAAW,MAAA,IAAS,CAAA,GAEhD,MAAA,CAAO,IAAI,CAAC,CAAA,qBACVC,eAAAA,CAAC,SAAA,EAAA,EAAsB,WAAU,gBAAA,EAC/B,QAAA,EAAA;AAAA,gCAAAA,eAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gGAAA,EACZ,QAAA,EAAA;AAAA,kCAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAsC,CAAA;AAAA,kBACrD,CAAA,CAAE;AAAA,iBAAA,EACL,CAAA;AAAA,gCACAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BACZ,QAAA,EAAA,CAAA,CAAE,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM;AAClB,kBAAA,MAAM,MAAA,GAAS,eAAe,CAAA,CAAE,GAAA;AAChC,kBAAA,uBACEC,eAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBAEC,IAAA,EAAK,QAAA;AAAA,sBACL,cAAY,CAAA,CAAE,KAAA;AAAA,sBACd,cAAA,EAAc,MAAA;AAAA,sBACd,aAAW,CAAA,CAAE,GAAA;AAAA,sBACb,SAAS,MAAM;AACb,wBAAA,YAAA,CAAa,EAAE,GAAG,CAAA;AAClB,wBAAA,aAAA,EAAc;AAAA,sBAChB,CAAA;AAAA,sBACA,SAAA,EAAW;AAAA,wBACT,oGAAA;AAAA,wBACA,SACI,wBAAA,GACA;AAAA,uBACN,CAAE,KAAK,GAAG,CAAA;AAAA,sBAEV,QAAA,EAAA;AAAA,wCAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EAA4C,YAAE,IAAA,EAAK,CAAA;AAAA,wCACnEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gEAAA,EACb,YAAE,KAAA,EACL;AAAA;AAAA,qBAAA;AAAA,oBAnBK,CAAA,CAAE;AAAA,mBAoBT;AAAA,gBAEJ,CAAC,CAAA,EACH;AAAA,eAAA,EAAA,EAjCY,CAAA,CAAE,KAkChB,CACD;AAAA;AAAA;AAEL;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;AA3PA,IAAA,qBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,wCAAA,GAAA;AAAA,IAAA,YAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACcA,SAAS,QAAA,GAA+B;AACtC,EAAA,uBACEC,gBAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,SAAQ,WAAA,EAAY,IAAA,EAAK,QAAO,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAM,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,eAAY,MAAA,EAC3J,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,UAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACrCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,oBACnCA,cAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,aAAA,EAAc,CAAA;AAAA,oBAC/BA,cAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,mBAAA,EAAoB;AAAA,GAAA,EACvC,CAAA;AAEJ;AAEA,SAAS,QAAA,GAA+B;AACtC,EAAA,uBACEC,gBAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,SAAQ,WAAA,EAAY,IAAA,EAAK,QAAO,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAM,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,eAAY,MAAA,EAC3J,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,oBAChDA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACrCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACrCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACrCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,GAAA,EACvC,CAAA;AAEJ;AAEA,SAASW,SAAAA,GAA+B;AACtC,EAAA,uBACEV,gBAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,SAAQ,WAAA,EAAY,IAAA,EAAK,QAAO,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAM,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,eAAY,MAAA,EAC3J,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+CAAA,EAAgD,CAAA;AAAA,oBACxDA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mBAAA,EAAoB;AAAA,GAAA,EAC9B,CAAA;AAEJ;AAEA,SAASY,SAAAA,GAA+B;AACtC,EAAA,uBACEX,gBAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,SAAQ,WAAA,EAAY,IAAA,EAAK,QAAO,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAM,aAAA,EAAc,SAAQ,cAAA,EAAe,OAAA,EAAQ,eAAY,MAAA,EAC3J,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+CAAA,EAAgD,CAAA;AAAA,oBACxDA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sBAAA,EAAuB;AAAA,GAAA,EACjC,CAAA;AAEJ;AAEO,SAAS,qBACd,KAAA,EACoB;AACpB,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,MAAM,MAAA,GAASS,cAAyC,MAAM;AAC5D,IAAA,MAAM,GAAA,uBAAU,GAAA,EAAoC;AACpD,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,IAAI,CAAC,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA,EAAG,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,KAAA,EAAO,EAAE,CAAA;AAC1C,MAAA,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA,CAAG,KAAK,CAAC,CAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,UAAA,CACJ,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,CAAI,GAAA,CAAI,CAAC,CAAC,CAAA,CACxB,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACf,KAAA;AAAA,MACA,UAAA,EAAY,YAAY,KAAK,CAAA;AAAA,MAC7B,OAAO,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA,CAAG,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,GAAA,EAAK,CAAA,CAAE,KAAK,KAAA,EAAO,CAAA,CAAE,OAAO,IAAA,EAAM,CAAA,CAAE,MAAK,CAAE;AAAA,KAClF,CAAE,CAAA;AAAA,EACN,CAAA,EAAG,CAAC,KAAA,EAAO,UAAA,EAAY,WAAW,CAAC,CAAA;AAEnC,EAAA,MAAM,QAAQ,IAAA,GACV;AAAA,IACE;AAAA,MACE,KAAA,EAAO,KAAK,SAAA,IAAa,WAAA;AAAA,MACzB,IAAA,kBAAMT,cAAAA,CAAC,QAAA,EAAA,EAAS,CAAA;AAAA,MAChB,SAAS,IAAA,CAAK,QAAA;AAAA,MACd,UAAU,IAAA,CAAK,gBAAA;AAAA,MACf,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,KAAA,EAAO,KAAK,SAAA,IAAa,gBAAA;AAAA,MACzB,IAAA,kBAAMA,cAAAA,CAAC,QAAA,EAAA,EAAS,CAAA;AAAA,MAChB,SAAS,IAAA,CAAK,QAAA;AAAA,MACd,UAAU,IAAA,CAAK,gBAAA;AAAA,MACf,MAAA,EAAQ;AAAA;AACV,MAEF,EAAC;AAEL,EAAA,MAAM,UAAU,OAAA,GACZ;AAAA,IACE;AAAA,MACE,KAAA,EAAO,gBAAA;AAAA,MACP,KAAA,EAAO,6BAAA;AAAA,MACP,IAAA,kBAAMA,cAAAA,CAACW,SAAAA,EAAA,EAAS,CAAA;AAAA,MAChB,SAAS,OAAA,CAAQ,MAAA;AAAA,MACjB,QAAA,EAAU,CAAC,OAAA,CAAQ,OAAA;AAAA,MACnB,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,MACE,KAAA,EAAO,iBAAA;AAAA,MACP,KAAA,EAAO,oCAAA;AAAA,MACP,IAAA,kBAAMX,cAAAA,CAACY,SAAAA,EAAA,EAAS,CAAA;AAAA,MAChB,SAAS,OAAA,CAAQ,MAAA;AAAA,MACjB,QAAA,EAAU,CAAC,OAAA,CAAQ,OAAA;AAAA,MACnB,MAAA,EAAQ;AAAA;AACV,MAEF,EAAC;AAEL,EAAA,uBACEZ,cAAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,UAAA,EAAY,IAAA;AAAA,MACZ,QAAQ,MAAA,IAAU,kBAAA;AAAA,MAClB,MAAA;AAAA,MACA,UAAA,EAAY,CAAC,CAAC,UAAA;AAAA,MACd,aAAA,EAAe,MAAM,aAAA,IAAgB;AAAA,MACrC,KAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA,EAAc,YAAA;AAAA,MACd,YACE,OAAA,GACI;AAAA,QACE,KAAA,EAAO,MAAM,YAAA,IAAgB,yCAAA;AAAA,QAC7B,QAAQ,sBACNC,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0BAAA,EACZ,QAAA,EAAA;AAAA,UAAA,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,UAAA,CAAW,MAAA,GAAS,qBACjDD,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBACZ,QAAA,EAAA,OAAA,CAAQ,UAAA,CAAW,GAAA,CAAI,CAAC,sBACvBA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cAEC,IAAA,EAAK,QAAA;AAAA,cACL,eAAa,CAAA,CAAE,MAAA;AAAA,cACf,SAAS,CAAA,CAAE,OAAA;AAAA,cACX,SAAA,EAAU,mIAAA;AAAA,cAET,QAAA,EAAA,CAAA,CAAE;AAAA,aAAA;AAAA,YANE,CAAA,CAAE;AAAA,WAQV,CAAA,EACH,CAAA;AAAA,0BAEFA,cAAAA;AAAA,YAAC,eAAA;AAAA,YAAA;AAAA,cACC,OAAO,OAAA,CAAQ,KAAA;AAAA,cACf,YAAY,OAAA,CAAQ,gBAAA;AAAA,cACpB,UAAU,OAAA,CAAQ,cAAA;AAAA,cAClB,WAAW,OAAA,CAAQ;AAAA;AAAA;AACrB,SAAA,EACF;AAAA,OAEJ,GACA;AAAA;AAAA,GAER;AAEJ;AAnLA,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6CAAA,GAAA;AAAA,IAAA,YAAA;AAUA,IAAA,qBAAA,EAAA;AACA,IAAA,oBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACoBO,SAAS,eACd,KAAA,EACoB;AACpB,EAAA,IAAI,MAAM,QAAA,EAAU,uBAAOA,cAAAA,CAAC,oBAAA,EAAA,EAAsB,GAAG,KAAA,EAAO,CAAA;AAC5D,EAAA,uBAAOA,cAAAA,CAAC,qBAAA,EAAA,EAAuB,GAAG,KAAA,EAAO,CAAA;AAC3C;AApCA,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4CAAA,GAAA;AAAA,IAAA,YAAA;AA2BA,IAAA,YAAA,EAAA;AACA,IAAA,WAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;AC+WO,SAASW,SAAAA,GAA+B;AAC7C,EAAA,uBACEV,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,KAAI,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EACrI,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,eAAA,EAAgB,CAAA;AAAA,oBACjCA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kCAAA,EAAmC;AAAA,GAAA,EAC7C,CAAA;AAEJ;AAEO,SAASY,SAAAA,GAA+B;AAC7C,EAAA,uBACEX,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,KAAI,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EACrI,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,kBAAA,EAAmB,CAAA;AAAA,oBACpCA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oCAAA,EAAqC;AAAA,GAAA,EAC/C,CAAA;AAEJ;AA3ZA,IAUM,OAAA,EACA,WAAA,EACA,MAAA,EACA,KAAA,EAEO,IAAA,EAmXA,kBAAA;AAlYb,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yCAAA,GAAA;AAUA,IAAM,OAAA,GAAU,SAAA;AAChB,IAAM,WAAA,GAAc,SAAA;AACpB,IAAM,MAAA,GAAS,SAAA;AACf,IAAM,KAAA,GAAQ,SAAA;AAEP,IAAM,IAAA,GAAO;AAAA;AAAA,MAElB,MAAA,kBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,kBAAAA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,CAAA,EAAE,4DAAA;AAAA,UACF,IAAA,EAAK,cAAA;AAAA,UAAe,WAAA,EAAY,MAAA;AAAA,UAChC,MAAA,EAAO,cAAA;AAAA,UAAe,WAAA,EAAY,KAAA;AAAA,UAAM,cAAA,EAAe;AAAA;AAAA,OACzD,EACF,CAAA;AAAA,MAEF,MAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,cAAA,EAAe,OAAA,EAAQ,eAAc,OAAA,EAC/F,QAAA,EAAA;AAAA,wBAAAD,eAAC,MAAA,EAAA,EAAK,CAAA,EAAE,KAAA,EAAM,CAAA,EAAE,OAAM,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,IAAG,KAAA,EAAM,MAAA,EAAO,gBAAe,WAAA,EAAY,KAAA,EAAM,iBAAgB,OAAA,EAAO,CAAA;AAAA,wBACrHA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,qCAAA,EAAsC,IAAA,EAAK,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAK;AAAA,OAAA,EAC7H,CAAA;AAAA;AAAA,MAIF,KAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,YAAO,EAAA,EAAG,KAAA,EAAM,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC/CA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,MAAA,EAAO,GAAE,MAAA,EAAO,QAAA,EAAS,KAAA,EAAM,UAAA,EAAW,SAAQ,SAAA,EAAU,QAAA,EAAS,YAAW,KAAA,EAAM,IAAA,EAAM,SAAS,QAAA,EAAA,GAAA,EAAC;AAAA,OAAA,EAChH,CAAA;AAAA,MAEF,QAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,eAAc,OAAA,EACxE,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC5EA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC7CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC9CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,OAAA,EACpD,CAAA;AAAA,MAEF,QAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,eAAc,OAAA,EAExE,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAK,CAAA;AAAA,wBAE5EA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,MAAK,MAAA,EAAQ,WAAA,EAAa,WAAA,EAAY,KAAA,EAAM,iBAAgB,OAAA,EAAO,CAAA;AAAA,wBAEjGA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,GAAE,MAAA,EAAO,KAAA,EAAM,KAAA,EAAM,MAAA,EAAO,OAAM,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAAG,CAAA;AAAA,wBAE/FA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,CAAA,EAAE,GAAA,EAAI,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAE1CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,OAAA,EACnD,CAAA;AAAA,MAEF,SAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,eAAc,OAAA,EACxE,QAAA,EAAA;AAAA,wBAAAD,eAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAc,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC7DA,eAAC,MAAA,EAAA,EAAK,CAAA,EAAE,eAAc,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC7DA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,OAAA,EACpD,CAAA;AAAA;AAAA,MAIF,OAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,eAAc,OAAA,EACxE,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC3EA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC7CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,OAAA,EAC/C,CAAA;AAAA,MAEF,IAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,eAAc,OAAA,EACxE,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC3EA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,KAAA,EAAM,IAAG,MAAA,EAAO,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBACjDA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAA,EAAO,IAAG,KAAA,EAAM,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,OAAA,EACnD,CAAA;AAAA,MAEF,GAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAC/F,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC3EA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC7CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,OAAA,EAChD,CAAA;AAAA,MAEF,wBACEC,eAAAA,CAAC,SAAI,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,OAAM,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EACvI,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,UAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAG,CAAA;AAAA,wBACnCA,cAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,iBAAA,EAAiB,CAAA;AAAA,wBAClCA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,IAAA,EAAM,OAAA,EAAS,MAAA,EAAO,MAAA,EAAM;AAAA,OAAA,EAC3D,CAAA;AAAA;AAAA,MAIF,aAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,eAAc,OAAA,EACxE,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC5EA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,MAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,MAAA,EAAQ,WAAA,EAAa,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC3EA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,GAAE,MAAA,EAAO,KAAA,EAAM,KAAA,EAAM,MAAA,EAAO,OAAM,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,GAAA,EAAG,CAAA;AAAA,wBAChGA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,OAAA,EAChD,CAAA;AAAA,MAEF,QAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,eAAc,OAAA,EAExE,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC1EA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,KAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,MAAA,EAAQ,WAAA,EAAa,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC3EA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,MAAA,EAAO,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,OAAA,EAClD,CAAA;AAAA,MAEF,YAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,eAAc,OAAA,EACxE,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC5EA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,MAAK,MAAA,EAAQ,WAAA,EAAa,WAAA,EAAY,KAAA,EAAM,iBAAgB,OAAA,EAAO,CAAA;AAAA,wBACnGA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC3CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,IAAA,EAAM,OAAA,EAAQ;AAAA,OAAA,EAC9C,CAAA;AAAA,MAEF,QAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,eAAc,OAAA,EACxE,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC5EA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,KAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC3EA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,MAAK,MAAA,EAAQ,WAAA,EAAa,WAAA,EAAY,KAAA,EAAM,iBAAgB,OAAA,EAAO;AAAA,OAAA,EACrG,CAAA;AAAA;AAAA,MAIF,OAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,gBAAe,OAAA,EACzE,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,SAAA,EAAA,EAAQ,MAAA,EAAO,2BAAA,EAA4B,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAY,KAAA,EAAK,CAAA;AAAA,wBAC9GA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC5CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC7CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC9CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC9CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,OAAA,EAC/C,CAAA;AAAA,MAEF,cAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,gBAAe,OAAA,EACzE,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,SAAA,EAAA,EAAQ,MAAA,EAAO,wCAAA,EAAyC,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAY,KAAA,EAAK,CAAA;AAAA,wBAC3HA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC7CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAA,EAAO,IAAG,GAAA,EAAI,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,OAAA,EACjD,CAAA;AAAA;AAAA,MAIF,YAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAK,CAAA;AAAA,wBACrEA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC9CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,OAAA,EAChD,CAAA;AAAA,MAEF,UAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,eAAc,OAAA,EAExE,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,UAAK,CAAA,EAAE,0BAAA,EAA2B,QAAQ,KAAA,EAAO,WAAA,EAAY,KAAA,EAAM,IAAA,EAAK,MAAA,EAAM,CAAA;AAAA,wBAC/EA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,MAAK,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,iBAAgB,OAAA,EAAO,CAAA;AAAA,wBACpGA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC7CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,OAAA,EAChD,CAAA;AAAA,MAEF,SAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,eAAc,OAAA,EAExE,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,UAAK,CAAA,EAAE,yBAAA,EAA0B,QAAQ,KAAA,EAAO,WAAA,EAAY,KAAA,EAAM,IAAA,EAAK,MAAA,EAAM,CAAA;AAAA,wBAC9EA,cAAAA,CAAC,MAAA,EAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,MAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,QAAO,cAAA,EAAe,WAAA,EAAY,KAAI,eAAA,EAAgB,SAAA,EAAU,SAAQ,KAAA,EAAK,CAAA;AAAA,wBACjHA,cAAAA,CAAC,MAAA,EAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,QAAO,cAAA,EAAe,WAAA,EAAY,KAAI,eAAA,EAAgB,SAAA,EAAU,SAAQ,KAAA,EAAK,CAAA;AAAA,wBACnHA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC5CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC5CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,OAAA,EAChD,CAAA;AAAA,MAEF,IAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,eAAc,OAAA,EAExE,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,UAAK,CAAA,EAAE,0BAAA,EAA2B,QAAQ,KAAA,EAAO,WAAA,EAAY,KAAA,EAAM,IAAA,EAAK,MAAA,EAAM,CAAA;AAAA,wBAC/EA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC7CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC7CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,OAAA,EAChD,CAAA;AAAA,MAEF,YAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,gBAAe,OAAA,EAEzE,QAAA,EAAA;AAAA,wBAAAD,cAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YAAK,CAAA,EAAE,sCAAA;AAAA,YACF,IAAA,EAAM,MAAA;AAAA,YAAQ,WAAA,EAAY,MAAA;AAAA,YAC1B,MAAA,EAAQ,KAAA;AAAA,YAAO,WAAA,EAAY;AAAA;AAAA,SAAK;AAAA,wBACtCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC3EA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC5EA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC9CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC5CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,OAAA,EAC/C,CAAA;AAAA,MAEF,OAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAK,CAAA;AAAA,wBACrEA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC7CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC9CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,OAAA,EAC/C,CAAA;AAAA,MAEF,OAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,eAAc,OAAA,EAExE,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAK,CAAA;AAAA,wBACrEA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,MAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,MAAA,EAAO,EAAA,EAAG,MAAA,EAAO,MAAA,EAAQ,WAAA,EAAa,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC/EA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,MAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,KAAA,EAAM,EAAA,EAAG,KAAA,EAAM,MAAA,EAAQ,WAAA,EAAa,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC7EA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC7CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAA,EAAO,IAAG,MAAA,EAAO,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,WAAA,EAAY,CAAA;AAAA,wBACtDA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,KAAA,EAAM,IAAG,KAAA,EAAM,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,OAAA,EACtD,CAAA;AAAA;AAAA,MAIF,QAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,gBAAe,OAAA,EAEzE,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,SAAA,EAAA,EAAQ,MAAA,EAAO,iBAAA,EAAkB,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAK,CAAA;AAAA,wBAE1GA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,MAAK,MAAA,EAAO,SAAA,EAAU,WAAA,EAAY,GAAA,EAAI,iBAAgB,SAAA,EAAS,CAAA;AAAA,wBAChGA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,MAAK,MAAA,EAAO,SAAA,EAAU,WAAA,EAAY,GAAA,EAAI,iBAAgB,SAAA,EAAS,CAAA;AAAA,wBAChGA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAK,EAAA,EAAG,MAAK,MAAA,EAAO,SAAA,EAAU,WAAA,EAAY,GAAA,EAAI,iBAAgB,SAAA,EAAS,CAAA;AAAA,wBAEhGA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC9CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC9CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAE9CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,OAAA,EAAQ,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,OAAA,EACvD,CAAA;AAAA,MAEF,YAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAEnD,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAK,CAAA;AAAA,wBAErEA,cAAAA,CAAC,SAAA,EAAA,EAAQ,MAAA,EAAO,iBAAA,EAAkB,MAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAK,CAAA;AAAA,wBAErFA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC9CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC9CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAE9CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,OAAA,EACpD,CAAA;AAAA,MAEF,QAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAEnD,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,aAAQ,MAAA,EAAO,iBAAA,EAAkB,MAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAK,CAAA;AAAA,wBAErFA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAK,CAAA;AAAA,wBAEvEA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC9CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC9CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAE9CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,OAAA,EACpD,CAAA;AAAA,MAEF,WAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,eAAc,OAAA,EAExE,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,aAAQ,MAAA,EAAO,gBAAA,EAAiB,MAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAK,CAAA;AAAA,wBAEpFA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAK,EAAA,EAAG,GAAA,EAAO,EAAA,EAAG,MAAO,MAAA,EAAQ,WAAA,EAAa,WAAA,EAAY,KAAA,EAAM,iBAAgB,OAAA,EAAO,CAAA;AAAA,wBACvGA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,MAAA,EAAO,EAAA,EAAG,QAAO,MAAA,EAAQ,WAAA,EAAa,WAAA,EAAY,KAAA,EAAM,iBAAgB,OAAA,EAAO,CAAA;AAAA,wBAEvGA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAK,IAAG,IAAA,EAAM,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC/CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAM,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC/CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAK,IAAG,GAAA,EAAM,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAE/CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAK,IAAG,MAAA,EAAO,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,OAAA,EACtD,CAAA;AAAA;AAAA,MAIF,KAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAC/F,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC5EA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,KAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC3EA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,8BAAA,EAA+B,QAAQ,KAAA,EAAO,WAAA,EAAY,KAAA,EAAM,IAAA,EAAK,MAAA,EAAM,CAAA;AAAA,wBACnFA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ;AAAA,OAAA,EAC/C,CAAA;AAAA,MAEF,QAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,MAAK,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,eAAc,OAAA,EAAO,CAAA;AAAA,wBAClGA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC3CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC5CA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,KAAA,EAAM,GAAE,IAAA,EAAK,QAAA,EAAS,GAAA,EAAI,UAAA,EAAW,SAAQ,SAAA,EAAU,QAAA,EAAS,YAAW,KAAA,EAAM,IAAA,EAAK,gBAAe,QAAA,EAAA,IAAA,EAAE;AAAA,OAAA,EACjH,CAAA;AAAA,MAEF,IAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,gBAAe,OAAA,EACzE,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,SAAA,EAAA,EAAQ,MAAA,EAAO,8BAAA,EAA+B,IAAA,EAAM,MAAA,EAAQ,WAAA,EAAY,MAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAY,KAAA,EAAK,CAAA;AAAA,wBACjHA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,KAAA,EAAM,GAAE,GAAA,EAAI,QAAA,EAAS,KAAA,EAAM,UAAA,EAAW,SAAQ,SAAA,EAAU,QAAA,EAAS,YAAW,KAAA,EAAM,IAAA,EAAK,gBAAe,QAAA,EAAA,QAAA,EAAG;AAAA,OAAA,EACnH,CAAA;AAAA;AAAA,MAIF,WAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,KAAA,EAAM,GAAE,IAAA,EAAK,QAAA,EAAS,IAAA,EAAK,UAAA,EAAW,OAAA,EAAQ,UAAA,EAAW,KAAA,EAAM,IAAA,EAAK,gBAAe,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,wBAC5FA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,GAAE,IAAA,EAAK,QAAA,EAAS,IAAA,EAAK,UAAA,EAAW,SAAQ,UAAA,EAAW,KAAA,EAAM,MAAK,cAAA,EAAe,WAAA,EAAY,QAAO,QAAA,EAAA,GAAA,EAAC;AAAA,OAAA,EAChH,CAAA;AAAA,MAEF,aAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EACnD,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,YAAO,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC7CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,aAAY,KAAA,EAAK;AAAA,OAAA,EAChF,CAAA;AAAA,MAEF,KAAA;AAAA;AAAA,wBAEEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,cAAA,EAAe,OAAA,EAAQ,eAAc,OAAA,EAC/F,QAAA,EAAA;AAAA,0BAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0CAAA,EAA2C,IAAA,EAAK,cAAA,EAAe,WAAA,EAAY,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAK,CAAA;AAAA,0BACjIA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,OAAM,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAK;AAAA,SAAA,EACjF;AAAA,OAAA;AAAA;AAAA;AAAA;AAAA,MAMF,SAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAE/F,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,MAAA,EAAO,EAAA,EAAG,OAAA,EAAQ,MAAA,EAAO,cAAA,EAAe,aAAY,KAAA,EAAK,CAAA;AAAA,wBACjFA,cAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,oCAAA,EAAqC,QAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,IAAA,EAAK,MAAA,EAAM,CAAA;AAAA,wBAEzGA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,KAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,KAAA,EAAM,MAAA,EAAO,SAAA,EAAU,aAAY,KAAA,EAAK,CAAA;AAAA,wBACxEA,cAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,8BAAA,EAA+B,QAAO,SAAA,EAAU,WAAA,EAAY,KAAA,EAAM,IAAA,EAAK,MAAA,EAAM,CAAA;AAAA,wBAC9FA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC3CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,KAAA,EAAM,CAAA,EAAE,GAAA,EAAI,IAAA,EAAM,WAAA,EAAY;AAAA,OAAA,EACnD,CAAA;AAAA,MAEF,MAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAE/F,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,KAAI,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,SAAQ,MAAA,EAAM,CAAA;AAAA,wBACzFA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,KAAI,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,SAAQ,MAAA,EAAM,CAAA;AAAA,wBAExFA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,sCAAA,EAAuC,QAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,IAAA,EAAK,MAAA,EAAM,CAAA;AAAA,wBAClGA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,GAAE,IAAA,EAAK,QAAA,EAAS,GAAA,EAAI,UAAA,EAAW,SAAQ,SAAA,EAAU,QAAA,EAAS,YAAW,KAAA,EAAM,IAAA,EAAK,gBAAe,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,wBAC7GA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAS,MAAA,EAAO,MAAA,EAAO,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC9EA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC7CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,OAAA,EAClD,CAAA;AAAA,MAEF,WAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAEnD,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,KAAI,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,KAAA,EAAM,eAAc,OAAA,EAAO,CAAA;AAAA,wBAEjGA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC3CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,GAAA,EAAI,IAAA,EAAM,WAAA,EAAY;AAAA,OAAA,EAClD,CAAA;AAAA,MAEF,YAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAEnD,QAAA,EAAA;AAAA,wBAAAD,eAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,QAAO,cAAA,EAAe,WAAA,EAAY,OAAM,eAAA,EAAgB,SAAA,EAAU,SAAQ,MAAA,EAAM,CAAA;AAAA,wBACpHA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC7CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAS,MAAA,EAAO,MAAA,EAAO,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC9EA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AAAA,OAAA,EACnD,CAAA;AAAA,MAEF,MAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAEnD,QAAA,EAAA;AAAA,wBAAAD,eAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,QAAO,cAAA,EAAe,WAAA,EAAY,OAAM,eAAA,EAAgB,SAAA,EAAU,SAAQ,KAAA,EAAK,CAAA;AAAA,wBACnHA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,KAAI,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAS,MAAA,EAAO,MAAA,EAAO,aAAY,KAAA,EAAK,CAAA;AAAA,wBAC7EA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,MAAA,EAAO,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,OAAA,EAAQ,CAAA;AAAA,wBAC/CA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,KAAA,EAAM,CAAA,EAAE,KAAA,EAAM,IAAA,EAAM,WAAA,EAAY,CAAA;AAAA,wBACnDA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,MAAA,EAAO,GAAE,MAAA,EAAO,QAAA,EAAS,GAAA,EAAI,UAAA,EAAW,SAAQ,SAAA,EAAU,QAAA,EAAS,YAAW,KAAA,EAAM,IAAA,EAAK,gBAAe,QAAA,EAAA,GAAA,EAAC;AAAA,OAAA,EACnH;AAAA,KAEJ;AAEO,IAAM,qCACXC,eAAAA,CAAC,SAAI,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,OAAM,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EACvI,QAAA,EAAA;AAAA,sBAAAD,cAAAA,CAAC,SAAA,EAAA,EAAQ,MAAA,EAAO,iBAAA,EAAkB,CAAA;AAAA,sBAClCA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAK,cAAA,EAAe,MAAA,EAAO,MAAA,EAAO,CAAA;AAAA,sBACjEA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAK,cAAA,EAAe,MAAA,EAAO,MAAA,EAAO,CAAA;AAAA,sBAClEA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA,EAAE,KAAA,EAAM,IAAA,EAAK,cAAA,EAAe,MAAA,EAAO,MAAA,EAAO;AAAA,KAAA,EACnE,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AClPK,SAAS,eAAe,CAAA,EAAsB;AACnD,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA;AACjC,EAAA,OAAO,OAAO,CAAA,GAAI,MAAA,CAAO,YAAA,CAAa,MAAA,GAAS,GAAG,CAAA,GAAI,EAAA;AACxD;AAwBO,SAAS,QAAQ,GAAA,EAAoD;AAC1E,EAAA,IAAI,CAAC,KAAK,OAAO,OAAA;AACjB,EAAA,MAAM,KAAK,OAAO,GAAA,CAAI,YAAA,KAAiB,QAAA,GAAW,IAAI,YAAA,GAAe,IAAA;AACrE,EAAA,IAAI,EAAA,KAAO,GAAG,OAAO,OAAA;AACrB,EAAA,IAAI,EAAA,KAAO,GAAG,OAAO,MAAA;AACrB,EAAA,IAAI,EAAA,KAAO,GAAG,OAAO,QAAA;AACrB,EAAA,MAAM,CAAA,GAAA,CAAK,IAAI,MAAA,IAAU,GAAA,CAAI,QAAQ,EAAA,EAAI,QAAA,GAAW,WAAA,EAAY;AAChE,EAAA,IACE,CAAA,KAAM,WAAW,CAAA,KAAM,QAAA,IAAY,MAAM,UAAA,IACzC,CAAA,KAAM,kBAAkB,CAAA,KAAM,mBAAA,IAC9B,MAAM,YAAA,IAAgB,CAAA,KAAM,iBAAiB,CAAA,KAAM,eAAA,IACnD,MAAM,sBAAA,IAA0B,CAAA,KAAM,iBACtC,OAAO,OAAA;AACT,EAAA,IACE,CAAA,KAAM,UAAU,CAAA,KAAM,SAAA,IAAa,MAAM,OAAA,IAAW,CAAA,KAAM,UAC1D,CAAA,KAAM,QAAA,IAAY,MAAM,UAAA,IAAc,CAAA,KAAM,mBAC5C,CAAA,KAAM,SAAA,IAAa,MAAM,UAAA,IAAc,CAAA,KAAM,wBAC7C,OAAO,MAAA;AACT,EAAA,IAAI,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,cAAA,EAAgB,OAAO,QAAA;AACnD,EAAA,OAAO,OAAA;AACT;AArMA,IA6Ea,KAAA,EAyCA,cAiBA,WAAA,EAaP,MAAA;AApJN,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yCAAA,GAAA;AA0EA,IAAA,UAAA,EAAA;AAGO,IAAM,KAAA,GAAmB;AAAA,MAC9B,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,gBAAA,EAAa,IAAA,EAAM,+CAAA,EAA0B,IAAA,EAAM,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA,EAAE;AAAA,MAC9G,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,WAAA,EAAQ,IAAA,EAAM,mJAAA,EAAkF,IAAA,EAAM,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA,EAAE;AAAA,MACnK,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,yBAAA,EAAY,IAAA,EAAM,2CAAA,EAAsB,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,OAAO,CAAA,EAAE;AAAA,MAC1G,EAAE,GAAA,EAAK,UAAA,EAAY,OAAO,sBAAA,EAAc,IAAA,EAAM,yCAAuB,IAAA,EAAM,IAAA,CAAK,QAAA,EAAU,KAAA,EAAO,SAAS,KAAA,EAAO,CAAA,EAAG,SAAS,CAAC,OAAA,EAAS,OAAO,CAAA,EAAE;AAAA,MAChJ,EAAE,GAAA,EAAK,UAAA,EAAY,OAAO,8CAAA,EAAwB,IAAA,EAAM,kEAAiC,IAAA,EAAM,IAAA,CAAK,QAAA,EAAU,KAAA,EAAO,SAAS,KAAA,EAAO,CAAA,EAAG,SAAS,CAAC,OAAA,EAAS,MAAM,CAAA,EAAE;AAAA,MACnK,EAAE,GAAA,EAAK,WAAA,EAAa,OAAO,8DAAA,EAA6B,IAAA,EAAM,4EAAmC,IAAA,EAAM,IAAA,CAAK,SAAA,EAAW,KAAA,EAAO,SAAS,KAAA,EAAO,CAAA,EAAG,SAAS,CAAC,cAAA,EAAgB,cAAc,CAAA,EAAE;AAAA,MAC3L,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,2BAAA,EAAc,IAAA,EAAM,wBAAA,EAAgB,IAAA,EAAM,IAAA,CAAK,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA,EAAE;AAAA,MACzG,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,sDAAA,EAA0B,IAAA,EAAM,wBAAA,EAAgB,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA,EAAE;AAAA,MAC/G,EAAE,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,0BAAA,EAAkB,IAAA,EAAM,wBAAA,EAAgB,IAAA,EAAM,IAAA,CAAK,GAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA,EAAE;AAAA,MACrG,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,wBAAA,EAAgB,IAAA,EAAM,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,OAAO,CAAA,EAAE;AAAA,MACnG,EAAE,GAAA,EAAK,eAAA,EAAiB,OAAO,sCAAA,EAAmB,IAAA,EAAM,kEAAiC,IAAA,EAAM,IAAA,CAAK,aAAA,EAAe,KAAA,EAAO,aAAa,KAAA,EAAO,CAAA,EAAG,SAAS,CAAC,OAAA,EAAS,MAAM,CAAA,EAAE;AAAA,MAC5K,EAAE,GAAA,EAAK,UAAA,EAAY,OAAO,gCAAA,EAAmB,IAAA,EAAM,kEAAiC,IAAA,EAAM,IAAA,CAAK,QAAA,EAAU,KAAA,EAAO,aAAa,KAAA,EAAO,CAAA,EAAG,SAAS,CAAC,OAAA,EAAS,MAAM,CAAA,EAAE;AAAA,MAClK,EAAE,GAAA,EAAK,cAAA,EAAgB,OAAO,sCAAA,EAAoB,IAAA,EAAM,yCAAuB,IAAA,EAAM,IAAA,CAAK,YAAA,EAAc,KAAA,EAAO,aAAa,KAAA,EAAO,CAAA,EAAG,SAAS,CAAC,OAAA,EAAS,OAAO,CAAA,EAAE;AAAA,MAClK,EAAE,GAAA,EAAK,eAAA,EAAiB,OAAO,sCAAA,EAAmB,IAAA,EAAM,qJAAyE,IAAA,EAAM,IAAA,CAAK,UAAU,KAAA,EAAO,WAAA,EAAa,OAAO,CAAA,EAAG,OAAA,EAAS,CAAC,aAAA,EAAe,aAAA,EAAe,aAAa,CAAA,EAAE;AAAA,MAC3O,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,iBAAA,EAAW,IAAA,EAAM,oGAAA,EAA8C,IAAA,EAAM,IAAA,CAAK,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,OAAO,EAAA,EAAG;AAAA,MACxI,EAAE,GAAA,EAAK,gBAAA,EAAkB,OAAO,+BAAA,EAAe,IAAA,EAAM,+DAAiC,IAAA,EAAM,IAAA,CAAK,cAAA,EAAgB,KAAA,EAAO,WAAW,KAAA,EAAO,CAAA,EAAG,SAAS,CAAC,OAAA,EAAS,OAAO,CAAA,EAAE;AAAA,MACzK,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,wDAAA,EAA2B,IAAA,EAAM,6EAAA,EAAwC,IAAA,EAAM,IAAA,CAAK,YAAA,EAAc,KAAA,EAAO,QAAA,EAAU,OAAO,CAAA,EAAE;AAAA,MAC1J,EAAE,GAAA,EAAK,YAAA,EAAc,KAAA,EAAO,sEAAA,EAA+B,IAAA,EAAM,mFAAA,EAA4C,IAAA,EAAM,IAAA,CAAK,UAAA,EAAY,KAAA,EAAO,QAAA,EAAU,OAAO,CAAA,EAAE;AAAA,MAC9J,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,0CAAA,EAA4B,IAAA,EAAM,mEAAA,EAAyC,IAAA,EAAM,IAAA,CAAK,SAAA,EAAW,KAAA,EAAO,QAAA,EAAU,OAAO,CAAA,EAAE;AAAA,MACtJ,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,mCAAA,EAAwB,IAAA,EAAM,qCAAA,EAA0B,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,OAAO,CAAA,EAAE;AAAA,MACzH,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,+CAAA,EAA4B,IAAA,EAAM,kDAAA,EAAkC,IAAA,EAAM,IAAA,CAAK,YAAA,EAAc,KAAA,EAAO,QAAA,EAAU,OAAO,CAAA,EAAE;AAAA,MACrJ,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,mDAAA,EAAyB,IAAA,EAAM,wBAAA,EAAgB,IAAA,EAAM,IAAA,CAAK,OAAA,EAAS,KAAA,EAAO,QAAA,EAAU,OAAO,CAAA,EAAE;AAAA,MACtH,EAAE,GAAA,EAAK,SAAA,EAAW,OAAO,sBAAA,EAAc,IAAA,EAAM,0EAAsC,IAAA,EAAM,IAAA,CAAK,OAAA,EAAS,KAAA,EAAO,UAAU,KAAA,EAAO,CAAA,EAAG,SAAS,CAAC,OAAA,EAAS,QAAQ,CAAA,EAAE;AAAA,MAC/J,EAAE,GAAA,EAAK,UAAA,EAAgB,OAAO,+BAAA,EAAgC,IAAA,EAAM,sCAAyB,IAAA,EAAM,IAAA,CAAK,UAAc,KAAA,EAAO,UAAA,EAAY,OAAO,CAAA,EAAG,OAAA,EAAS,CAAC,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA,EAAE;AAAA,MACxL,EAAE,GAAA,EAAK,cAAA,EAAgB,OAAO,0DAAA,EAAgC,IAAA,EAAM,sCAAyB,IAAA,EAAM,IAAA,CAAK,cAAc,KAAA,EAAO,UAAA,EAAY,OAAO,CAAA,EAAG,OAAA,EAAS,CAAC,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA,EAAE;AAAA,MACxL,EAAE,GAAA,EAAK,UAAA,EAAgB,OAAO,wDAAA,EAAgC,IAAA,EAAM,sCAAyB,IAAA,EAAM,IAAA,CAAK,UAAc,KAAA,EAAO,UAAA,EAAY,OAAO,CAAA,EAAG,OAAA,EAAS,CAAC,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA,EAAE;AAAA,MACxL,EAAE,GAAA,EAAK,aAAA,EAAgB,OAAO,8BAAA,EAAgC,IAAA,EAAM,sCAAyB,IAAA,EAAM,IAAA,CAAK,aAAc,KAAA,EAAO,UAAA,EAAY,OAAO,CAAA,EAAG,OAAA,EAAS,CAAC,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA,EAAE;AAAA,MACxL,EAAE,GAAA,EAAK,OAAA,EAAS,OAAO,QAAA,EAAO,IAAA,EAAM,2EAAqC,IAAA,EAAM,IAAA,CAAK,OAAO,KAAA,EAAO,SAAA,EAAW,OAAO,CAAA,EAAG,OAAA,EAAS,CAAC,OAAA,EAAS,OAAA,EAAS,OAAO,CAAA,EAAE;AAAA,MAC5J,EAAE,GAAA,EAAK,UAAA,EAAY,OAAO,qBAAA,EAAe,IAAA,EAAM,yCAAuB,IAAA,EAAM,IAAA,CAAK,QAAA,EAAU,KAAA,EAAO,WAAW,KAAA,EAAO,CAAA,EAAG,SAAS,CAAC,OAAA,EAAS,OAAO,CAAA,EAAE;AAAA,MACnJ,EAAE,GAAA,EAAK,MAAA,EAAQ,KAAA,EAAO,mBAAA,EAAa,IAAA,EAAM,oGAAA,EAA8C,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,SAAA,EAAW,OAAO,EAAA,EAAG;AAAA,MACpI,EAAE,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,0BAAA,EAAe,MAAM,4CAAA,EAAuB,IAAA,EAAM,IAAA,CAAK,WAAA,EAAa,OAAO,MAAA,EAAQ,KAAA,EAAO,GAAG,OAAA,EAAS,CAAC,KAAK,CAAA,EAAE;AAAA,MAC3I,EAAE,GAAA,EAAK,eAAA,EAAiB,KAAA,EAAO,iDAAA,EAAqB,MAAM,4CAAA,EAAuB,IAAA,EAAM,IAAA,CAAK,aAAA,EAAe,OAAO,MAAA,EAAQ,KAAA,EAAO,GAAG,OAAA,EAAS,CAAC,KAAK,CAAA,EAAE;AAAA,MACrJ,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,QAAA,EAAO,MAAM,4CAAA,EAAuB,IAAA,EAAM,IAAA,CAAK,KAAA,EAAO,OAAO,MAAA,EAAQ,KAAA,EAAO,GAAG,OAAA,EAAS,CAAC,KAAK,CAAA,EAAE;AAAA,MACxH,EAAE,GAAA,EAAK,WAAA,EAAa,OAAO,6BAAA,EAAkB,IAAA,EAAM,wDAAoC,IAAA,EAAM,IAAA,CAAK,WAAW,KAAA,EAAO,WAAA,EAAa,OAAO,CAAA,EAAG,OAAA,EAAS,CAAC,KAAA,EAAO,OAAA,EAAS,OAAO,CAAA,EAAE;AAAA,MAC9K,EAAE,GAAA,EAAK,QAAA,EAAU,OAAO,oCAAA,EAAkB,IAAA,EAAM,2DAAsC,IAAA,EAAM,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,aAAa,KAAA,EAAO,CAAA,EAAG,SAAS,CAAC,KAAA,EAAO,OAAO,CAAA,EAAE;AAAA,MACjK,EAAE,GAAA,EAAK,aAAA,EAAe,OAAO,6DAAA,EAA4B,IAAA,EAAM,uDAA8B,IAAA,EAAM,IAAA,CAAK,WAAA,EAAa,KAAA,EAAO,aAAa,KAAA,EAAO,CAAA,EAAG,SAAS,CAAC,KAAA,EAAO,MAAM,CAAA,EAAE;AAAA,MAC5K,EAAE,GAAA,EAAK,cAAA,EAAgB,OAAO,4CAAA,EAAqB,IAAA,EAAM,sDAA+B,IAAA,EAAM,IAAA,CAAK,YAAA,EAAc,KAAA,EAAO,aAAa,KAAA,EAAO,CAAA,EAAG,SAAS,CAAC,KAAA,EAAO,OAAO,CAAA,EAAE;AAAA,MACzK,EAAE,GAAA,EAAK,QAAA,EAAU,OAAO,yBAAA,EAAc,IAAA,EAAM,iEAAqC,IAAA,EAAM,IAAA,CAAK,MAAA,EAAQ,KAAA,EAAO,aAAa,KAAA,EAAO,CAAA,EAAG,SAAS,CAAC,KAAA,EAAO,OAAO,CAAA;AAAE,KAC9J;AAEO,IAAM,YAAA,GAAiD;AAAA,MAC5D,IAAA,EAAM,kBAAA;AAAA,MACN,KAAA,EAAO,gBAAA;AAAA,MACP,IAAA,EAAM,sBAAA;AAAA,MACN,SAAA,EAAW,mBAAA;AAAA,MACX,OAAA,EAAS,iBAAA;AAAA,MACT,MAAA,EAAQ,8BAAA;AAAA,MACR,QAAA,EAAU,aAAA;AAAA,MACV,OAAA,EAAS,yBAAA;AAAA,MACT,IAAA,EAAM,qBAAA;AAAA,MACN,SAAA,EAAW;AAAA,KACb;AAMO,IAAM,WAAA,GAA2B;AAAA,MACtC,MAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAM,MAAA,GAAS,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AChJxB,SAAS,cAAA,CAAe,KAAiB,CAAA,EAAc;AAC5D,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,cAAA,CAAe,CAAC,CAAA;AAC/B,EAAA,IAAI,CAAC,EAAA,EAAI;AACT,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,EAAA;AACjB,EAAA,GAAA,CAAI,WAAA,CAAY,OAAA,GAAU,EAAE,EAAA,EAAI,EAAA,EAAG;AACnC,EAAA,MAAM,KAAM,CAAA,CAAE,OAAA,IAAW,EAAE,OAAA,GAAU,CAAC,GAAG,OAAA,IAAW,CAAA;AACpD,EAAA,MAAM,KAAM,CAAA,CAAE,OAAA,IAAW,EAAE,OAAA,GAAU,CAAC,GAAG,OAAA,IAAW,CAAA;AACpD,EAAA,GAAA,CAAI,mBAAmB,OAAA,GAAU,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAKhD,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,SAAA,CAAU,CAAC,CAAA,CACzB,GAAA,CAAI,GAAA,CAAI,YAAY,CAAA,CACpB,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,GAAA,CAAI,WAAA,CAAY,OAAA,CAAQ,CAAA,IAAK,CAAA,KAAM,GAAA,CAAI,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,CAChF,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,CAAI,cAAA,CAAe,CAAC,KAAK,IAAI,CAAA;AAC9C,EAAA,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,QAAQ,CAAC,CAAA,KAAM,OAAO,CAAA,IAAK,IAAI,mBAAA,CAAoB,CAAA,EAAG,EAAE,CAAA,IAAK,KAAK,CAAC,CAAA;AAChG,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,cAAA,CAAe,GAAG,CAAA;AAClC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,KAAA,GAAQ,CAAC,EAAE,CAAA,CAAE,YAAY,CAAA,CAAE,MAAA,CAAA;AACjC,MAAA,GAAA,CAAI,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA,IAC7B;AACA,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,EAAE,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,MAAA,CAAA,MAAa,cAAA,EAAe;AACpD;AAhCA,IAAA,SAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4DAAA,GAAA;AAAA,IAAA,UAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACIO,SAAS,gBAAA,CAAiB,KAAiB,CAAA,EAAc;AAC9D,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,cAAA,CAAe,CAAC,CAAA;AAC/B,EAAA,IAAI,CAAC,EAAA,EAAI;AACT,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,EAAA;AACjB,EAAA,MAAM,KAAM,CAAA,CAAE,OAAA,IAAW,EAAE,OAAA,GAAU,CAAC,GAAG,OAAA,IAAW,CAAA;AACpD,EAAA,MAAM,KAAM,CAAA,CAAE,OAAA,IAAW,EAAE,OAAA,GAAU,CAAC,GAAG,OAAA,IAAW,CAAA;AACpD,EAAA,GAAA,CAAI,mBAAmB,OAAA,GAAU,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAG;AAChD,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,SAAA,CAAU,CAAC,CAAA,CACzB,GAAA,CAAI,GAAA,CAAI,YAAY,CAAA,CACpB,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,GAAA,CAAI,WAAA,CAAY,OAAA,CAAQ,CAAA,IAAK,CAAA,KAAM,GAAA,CAAI,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,CAChF,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,CAAI,cAAA,CAAe,CAAC,KAAK,IAAI,CAAA;AAE9C,EAAA,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,QAAQ,CAAC,CAAA,KAAM,OAAO,CAAA,IAAK,IAAI,mBAAA,CAAoB,CAAA,EAAG,EAAE,CAAA,IAAK,KAAK,CAAC,CAAA;AAChG,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,cAAA,CAAe,GAAG,CAAA;AAClC,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,KAAA,GAAQ,CAAC,EAAE,CAAA,CAAE,YAAY,CAAA,CAAE,MAAA,CAAA;AACjC,MAAA,GAAA,CAAI,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA,IAC7B;AACA,IAAA,GAAA,CAAI,WAAA,CAAY,OAAA,GAAU,EAAE,EAAA,EAAI,EAAA,EAAG;AACnC,IAAA,GAAA,CAAI,WAAW,OAAA,GAAU,IAAA;AACzB,IAAA;AAAA,EACF;AAEA,EAAA,GAAA,CAAI,WAAW,OAAA,GAAU,EAAE,OAAA,EAAS,EAAA,EAAI,SAAS,EAAA,EAAG;AACpD,EAAA,IAAI,EAAE,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,MAAA,CAAA,MAAa,cAAA,EAAe;AACpD;AA9BA,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8DAAA,GAAA;AAAA,IAAA,UAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACkBO,SAAS,OAAA,CAAW,KAAA,EAAe,EAAA,EAAa,QAAA,EAA6B;AAClF,EAAA,IAAI;AACF,IAAA,OAAO,EAAA,EAAG;AAAA,EACZ,SAAS,GAAA,EAAK;AACZ,IAAA,IAAI,KAAA,EAAO;AAET,MAAA,OAAA,CAAQ,IAAA,CAAK,uBAAA,EAAyB,KAAA,EAAO,GAAG,CAAA;AAAA,IAClD;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AA5BA,IAAM,KAAA;AAAN,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8BAAA,GAAA;AAAA,IAAM,SAAS,MAAM;AACnB,MAAA,IAAI;AACF,QAAA,OAAO,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,KAAK,QAAA,KAAa,YAAA;AAAA,MACrE,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF,CAAA,GAAG;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACOI,SAAS,OAAA,CAAQ,KAAiB,MAAA,EAAwB;AAC/D,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,QAAA,EAAS,CAAE,OAAA;AAGrC,EAAA,IAAI,IAAI,OAAA,GAAU,CAAA;AAClB,EAAA,IAAI,EAAA,GAAK,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AACvB,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,CAAM,QAAA,EAAS,CAAE,OAAA;AAClC,EAAA,OAAO,MAAM,IAAA,EAAM;AACjB,IAAA,CAAA,IAAK,CAAA;AACL,IAAA,EAAA,GAAK,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAAA,EACrB;AACA,EAAA,OAAO,EAAA;AACT;AAEO,SAAS,UAAA,CACd,EAAA,EACA,IAAA,EACA,KAAA,EACA,KAAA,EACU;AACV,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA,EAAS,IAAA;AAAA,IACT,MAAA,EAAQ,KAAA;AAAA,IACR,KAAA,EAAO,SAAA;AAAA,IACP,aAAA,EAAe,CAAA;AAAA,IACf;AAAA,GACF;AACF;AAGO,SAAS,oBAAA,CAAqB,GAAA,EAAiB,CAAA,EAAW,CAAA,EAAmB;AAClF,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,OAAO,CAAA;AACnC,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,EAAA,EAAI,OAAA,EAAS,KAAA,EAAO,EAAE,UAAA,EAAY,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,CAAA,IAAK,CAAA;AACjF,EAAA,GAAA,CAAI,KAAA,CAAM,SAAS,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,EAAE,GAAA,EAAI,EAAG,CAAA;AACpD,EAAA,OAAO,EAAA;AACT;AAGO,SAAS,uBAAA,CACd,KACA,KAAA,EACQ;AACR,EAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,cAAc,CAAA;AAC1C,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,EAAA,EAAI,cAAA,EAAgB,OAAO,KAAK,CAAA;AACvD,EAAA,GAAA,CAAI,KAAA,CAAM,SAAS,EAAE,IAAA,EAAM,OAAO,OAAA,EAAS,EAAE,GAAA,EAAI,EAAG,CAAA;AACpD,EAAA,OAAO,EAAA;AACT;AAhEA,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iDAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACQO,SAAS,eAAA,CACd,GAAA,EAEA,EAAA,EACA,CAAA,EACA,GACA,IAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,MAAA,IAAU,OAAA,CAAQ,CAAC,CAAA,KAAM,QAAQ,CAAA;AAClF,EAAA,IAAI,MAAA,CAAO,UAAU,CAAA,EAAG;AACtB,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,cAAA,CAAe,CAAC,CAAA;AAChC,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,cAAA,CAAe,CAAC,CAAA;AAChC,IAAA,IAAI,OAAO,GAAA,EAAK;AACd,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,QAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,QAAA,IAAI,KAAA,KAAU,MAAA,IAAU,KAAA,KAAU,MAAA,EAAQ;AACxC,UAAA,uBAAA,CAAwB,GAAA,EAAK,EAAE,IAAA,EAAM,UAAA,EAAY,MAAM,GAAA,EAAK,IAAA,EAAM,KAAK,CAAA;AACvE,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,OAAO,GAAA,CAAI,QAAA,CAAS,OAAA,CAAQ,MAAA,CAAO,gBAAgB,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,GAAG,EAAE,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,OAAO,CAAA;AACxG,QAAA,MAAM,OAAO,GAAA,CAAI,QAAA,CAAS,OAAA,CAAQ,MAAA,CAAO,gBAAgB,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,GAAG,EAAE,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,OAAO,CAAA;AACxG,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAA,CAAO,IAAA,CAAK,CAAA,IAAI,IAAK,CAAA,IAAK,CAAA,EAAA,CAAI,IAAA,CAAK,CAAA,IAAI,IAAK,CAAA,IAAK,CAAC,CAAA;AAClE,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAA,CAAO,IAAA,CAAK,CAAA,IAAI,IAAK,CAAA,IAAK,CAAA,EAAA,CAAI,IAAA,CAAK,CAAA,IAAI,IAAK,CAAA,IAAK,CAAC,CAAA;AAClE,QAAA,OAAA,CAAQ,yCAAyC,MAAM,GAAA,CAAI,SAAS,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAC,CAAA;AAC9F,QAAA,OAAA,CAAQ,yCAAyC,MAAM,GAAA,CAAI,SAAS,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAC,CAAA;AAC9F,QAAA,MAAM,MAAA,GAAgB,EAAA,IAAM,EAAA,GAAK,CAAA,GAAI,CAAA;AACrC,QAAA,MAAM,eAAgB,KAAA,KAAU,MAAA,IAAU,UAAU,QAAA,IAAc,KAAA,KAAU,YAAY,KAAA,KAAU,MAAA;AAClG,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,uBAAA,CAAwB,GAAA,EAAK,EAAE,IAAA,EAAM,YAAA,EAAc,MAAM,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,MAAA,EAAQ,CAAA;AAAA,QACnF,CAAA,MAAO;AACL,UAAA,uBAAA,CAAwB,GAAA,EAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAM,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,MAAA,EAAQ,CAAA;AAAA,QACrF;AACA,QAAA;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,EAAA,oBAAA,CAAqB,GAAA,EAAK,GAAG,CAAC,CAAA;AAChC;AAnDA,IAAAa,WAAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6DAAA,GAAA;AAAA,IAAA,UAAA,EAAA;AACA,IAAA,YAAA,EAAA;AAEA,IAAA,UAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACGO,SAAS,sBAAA,CACd,GAAA,EACA,CAAA,EACA,OAAA,EAEA,GACA,OAAA,EACS;AACT,EAAA,IAAI,EAAE,OAAA,CAAQ,KAAA,KAAU,CAAA,IAAK,OAAA,CAAQ,UAAU,OAAO,KAAA;AACtD,EAAA,MAAM,GAAA,GAAM,OAAA,IAAW,GAAA,CAAI,mBAAA,CAAoB,GAAG,EAAE,CAAA;AACpD,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,GAAA,CAAI,UAAU,kFAAoC,CAAA;AAClD,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,cAAA,CAAe,GAAG,CAAA;AAClC,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,GAAA,CAAI,KAAA,CAAM,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,EAAE,EAAA,EAAI,GAAA,EAAI,EAAG,CAAA;AAC3D,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAM,aAAA,EAAe;AACvB,IAAA,MAAM,MAAM,GAAA,CAAI,KAAA,CAAM,QAAA,EAAS,CAAE,QAAQ,GAAG,CAAA;AAC5C,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,MAAM,GAAA,GAAO,IAAI,KAAA,CAAkC,SAAA;AACnD,IAAA,MAAM,IAAA,GAAO,EAAE,GAAA,IAAO,KAAA,CAAA;AACtB,IAAA,GAAA,CAAI,KAAA,CAAM,QAAA,CAAS,EAAE,IAAA,EAAM,gBAAgB,OAAA,EAAS,EAAE,EAAA,EAAI,GAAA,EAAK,OAAO,EAAE,SAAA,EAAW,IAAA,EAAK,IAAK,CAAA;AAC7F,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAM,eAAA,EAAiB;AACzB,IAAA,MAAM,MAAM,GAAA,CAAI,KAAA,CAAM,QAAA,EAAS,CAAE,QAAQ,GAAG,CAAA;AAC5C,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,IAAA,GAAA,CAAI,MAAM,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,EAAE,EAAA,EAAI,GAAA,EAAK,KAAA,EAAO,EAAE,OAAA,EAAS,CAAC,IAAI,OAAA,EAAQ,IAAK,CAAA;AAC7F,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAzCA,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oEAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACSO,SAAS,kBACd,GAAA,EACA,CAAA,EACA,SAEA,CAAA,EACA,CAAA,EACA,GACA,OAAA,EACS;AACT,EAAA,IAAI,OAAA,CAAQ,KAAA,KAAU,EAAA,EAAI,OAAO,KAAA;AACjC,EAAA,MAAM,YAAA,GACJ,OAAA,IAAW,OAAA,CAAQ,OAAO,CAAA,KAAM,UAAU,OAAA,GAAU,GAAA,CAAI,mBAAA,CAAoB,CAAA,EAAG,EAAE,CAAA;AACnF,EAAA,MAAM,SAAA,GAAY,YAAA,GAAe,GAAA,CAAI,cAAA,CAAe,YAAY,CAAA,GAAI,IAAA;AAEpE,EAAA,IACE,GAAA,CAAI,aAAA,CAAc,OAAA,CAAQ,MAAA,IAAU,CAAA,IACpC,SAAA,IACA,SAAA,KAAc,GAAA,CAAI,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAA,EACzC;AACA,IAAA,GAAA,CAAI,gBAAA,EAAiB;AACrB,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,aAAA,CAAc,OAAA,CAAQ,KAAA,EAAM;AACjD,IAAA,MAAM,SAAS,CAAA,KAAM,MAAA;AACrB,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,MAAA,GAAS,SAAS,MAAM,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,SAAS,CAAA;AAGrC,IAAA,MAAM,KAAA,GAAiC,EAAE,QAAA,EAAS;AAClD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,KAAA,CAAM,SAAA,GAAY,IAAA;AAClB,MAAA,KAAA,CAAM,WAAA,GAAc,IAAA;AACpB,MAAA,KAAA,CAAM,KAAA,GAAQ,SAAA;AAAA,IAChB;AACA,IAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,MACjB,IAAA,EAAM,KAAA;AAAA,MACN,OAAA,EAAS,EAAE,GAAA,EAAK,UAAA,CAAW,IAAI,SAAA,EAAW,KAAA,EAAO,KAAK,CAAA;AAAE,KACzD,CAAA;AACD,IAAA,GAAA,CAAI,YAAA,EAAa;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,aAAa,GAAA,CAAI,aAAA,CAAc,OAAA,CAAQ,QAAA,CAAS,SAAS,CAAA,EAAG;AAC9D,IAAA,GAAA,CAAI,UAAU,4JAAkE,CAAA;AAChF,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,GAAwB,SAAA;AAC5B,EAAA,IAAI,OAAA,GAAyB,YAAA;AAC7B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAA,GAAS,oBAAA,CAAqB,GAAA,EAAK,CAAA,EAAG,CAAC,CAAA;AACvC,IAAA,OAAA,GAAU,GAAA,CAAI,eAAe,MAAM,CAAA;AAAA,EACrC;AAEA,EAAA,IAAI,GAAA,CAAI,WAAW,OAAA,CAAQ,MAAA,GAAS,KAAK,GAAA,CAAI,QAAA,CAAS,WAAW,OAAA,EAAS;AACxE,IAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,OAAA,CAAQ,IAAI,UAAA,CAAW,OAAA,CAAQ,SAAS,CAAC,CAAA;AACrE,IAAA,OAAA,CAAQ,iCAAiC,MAAM;AAC7C,MAAA,MAAM,GAAA,GAAM,IAAI,QAAA,CAAS,OAAA,CAAQ,OAAO,SAAA,EAAW,CAAC,IAAA,EAAM,OAAO,CAAA,EAAG;AAAA,QAClE,WAAA,EAAa,SAAA;AAAA,QACb,WAAA,EAAa,GAAA;AAAA,QACb,aAAA,EAAe,IAAA;AAAA,QACf,KAAA,EAAO,IAAA;AAAA,QACP,SAAA,EAAW,KAAA;AAAA,QACX,SAAA,EAAW;AAAA,OACZ,CAAA;AACD,MAAA,GAAA,CAAI,aAAA,CAAc,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACH;AACA,EAAA,IAAI,OAAA,EAAS,GAAA,CAAI,UAAA,CAAW,OAAA,CAAQ,KAAK,OAAO,CAAA;AAChD,EAAA,IAAI,MAAA,EAAQ,GAAA,CAAI,aAAA,CAAc,OAAA,CAAQ,KAAK,MAAM,CAAA;AACjD,EAAA,GAAA,CAAI,eAAA,CAAgB,GAAA,CAAI,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AACpD,EAAA,OAAO,IAAA;AACT;AA/EA,IAAAC,aAAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+DAAA,GAAA;AAAA,IAAA,UAAA,EAAA;AACA,IAAA,YAAA,EAAA;AAGA,IAAA,UAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACWO,SAAS,qBAAA,CAAsB,OAAe,MAAA,EAA+B;AAClF,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,UAAU,CAAC,MAAA,CAAO,QAAQ,OAAO,QAAA;AAChD,EAAA,MAAM,KAAK,KAAA,CAAM,CAAA,EAAE,GAAI,MAAA,CAAO,OAAO,CAAA,EAAE;AACvC,EAAA,MAAM,KAAK,KAAA,CAAM,CAAA,EAAE,GAAI,MAAA,CAAO,OAAO,CAAA,EAAE;AACvC,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA;AAC3B,EAAA,MAAM,CAAA,GAAI,OAAO,MAAA,CAAO,MAAA,KAAW,UAAA,GAAa,OAAO,MAAA,EAAO,GAAI,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AACtF,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG,OAAO,QAAA;AACvD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,OAAO,CAAC,CAAA;AACnC,EAAA,IAAI,KAAK,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,IAAK,KAAK,OAAO,IAAA;AACnC,EAAA,OAAO,CAAA,GAAI,IAAI,QAAA,GAAW,SAAA;AAC5B;AAzBA,IAAA,0BAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iEAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACYA,SAAS,gBAAA,CAAiB,KAAiB,IAAA,EAAkD;AAC3F,EAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,OAAA;AAC7B,EAAA,MAAM,GAAA,GAAM,IAAI,aAAA,CAAc,OAAA;AAC9B,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA,EAAG;AACxC,IAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,CAAA,KAAM,IAAA,IAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,OAAO,GAAA,CAAI,CAAC,CAAA;AAAA,EACxD;AACA,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,aAAA,CAAc,KAAiB,OAAA,EAAwB;AACrE,EAAA,MAAM,GAAA,GAAM,IAAI,aAAA,CAAc,OAAA;AAC9B,EAAA,MAAM,MAAM,OAAA,CAAQ,GAAA;AACpB,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC3B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,SAAS,CAAA;AACrC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,SAAS,EAAE,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,WAAW,KAAA,EAAO,EAAE,EAAA,EAAI,GAAA,CAAI,CAAC,CAAA,EAAG,EAAA,EAAI,IAAI,CAAC,CAAA,EAAG,CAAA;AAAE,OAC9E,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC3B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,MAAM,CAAA;AAClC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,SAAS,EAAE,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,QAAQ,KAAA,EAAO,EAAE,EAAA,EAAI,GAAA,CAAI,CAAC,CAAA,EAAG,EAAA,EAAI,IAAI,CAAC,CAAA,EAAG,CAAA;AAAE,OAC3E,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,eAAA;AAAA,IACL,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,GAAA,EAAK,OAAO,CAAA;AAClD,MAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,GAAA,EAAK,MAAM,CAAA;AAC3C,MAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,MAAA,EAAQ;AAC9B,MAAA,MAAM,KAAK,OAAA,CAAQ,GAAA,EAAK,GAAA,KAAQ,eAAA,GAAkB,SAAS,KAAK,CAAA;AAChE,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,MAAM,CAAA;AAClC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,SAAS,EAAE,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,QAAQ,KAAA,EAAO;AAAA,UAC5C,YAAA,EAAc,EAAE,IAAA,EAAM,GAAA,EAAK,cAAc,MAAA;AAAO,SACjD,CAAA;AAAE,OACJ,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,cAAA,EAAgB;AACnB,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAA;AAC5B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,MAAM,CAAA;AAClC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,SAAS,EAAE,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,QAAQ,KAAA,EAAO;AAAA,UAC5C,YAAA,EAAc,EAAE,IAAA,EAAM,cAAA,EAAgB,EAAA,EAAI,GAAA,CAAI,CAAC,CAAA,EAAG,EAAA,EAAI,GAAA,CAAI,CAAC,CAAA;AAAE,SAC9D,CAAA;AAAE,OACJ,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,eAAA,EAAiB;AACpB,MAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,OAAA;AAG7B,MAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,OAAA,CAAQ,MAAM,CAAC,CAAC,CAAA,KAAM,MAAA,IAAU,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,MAAM,MAAA,EAAQ;AACtF,QAAA,KAAA,MAAW,MAAA,IAAU,CAAC,CAAA,EAAG,CAAC,CAAA,EAAY;AACpC,UAAA,MAAMC,GAAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAA;AAC5B,UAAA,MAAMC,MAAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,MAAM,CAAA;AAClC,UAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,YACjB,IAAA,EAAM,KAAA;AAAA,YACN,SAAS,EAAE,GAAA,EAAK,UAAA,CAAWD,GAAAA,EAAI,QAAQC,MAAAA,EAAO;AAAA,cAC5C,YAAA,EAAc,EAAE,IAAA,EAAM,oBAAA,EAAsB,KAAA,EAAO,GAAA,CAAI,CAAC,CAAA,EAAG,KAAA,EAAO,GAAA,CAAI,CAAC,CAAA,EAAG,MAAA;AAAO,aAClF,CAAA;AAAE,WACJ,CAAA;AAAA,QACH;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAA;AAC5B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,MAAM,CAAA;AAClC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,SAAS,EAAE,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,QAAQ,KAAA,EAAO;AAAA,UAC5C,YAAA,EAAc,EAAE,IAAA,EAAM,eAAA,EAAiB,IAAI,GAAA,CAAI,CAAC,CAAA,EAAG,MAAA,EAAQ,IAAI,CAAC,CAAA,EAAG,EAAA,EAAI,GAAA,CAAI,CAAC,CAAA;AAAE,SAC/E,CAAA;AAAE,OACJ,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,GAAA,EAAK,OAAO,CAAA;AAC/C,MAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,GAAA,EAAK,QAAQ,CAAA;AAC/C,MAAA,IAAI,CAAC,SAAA,IAAa,CAAC,QAAA,EAAU;AAG7B,MAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,OAAA;AAC7B,MAAA,MAAMC,IAAAA,GAAM,IAAI,aAAA,CAAc,OAAA;AAC9B,MAAA,MAAM,OAAA,GAAU,KAAA,CAAMA,IAAAA,CAAI,OAAA,CAAQ,SAAS,CAAC,CAAA;AAC5C,MAAA,MAAM,MAAA,GAAS,KAAA,CAAMA,IAAAA,CAAI,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC1C,MAAA,MAAM,GAAA,GAAM,qBAAA,CAAsB,OAAA,EAAS,MAAM,CAAA;AACjD,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,GAAA,CAAI,QAAQ,uGAAA,EAAmD;AAAA,UAC7D,OAAA,EAAS,SAAA;AAAA,UACT,EAAA,EAAI;AAAA,SACL,CAAA;AACD,QAAA;AAAA,MACF;AACA,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC3B,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,MAAM,CAAA;AAClC,QAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,UACjB,IAAA,EAAM,KAAA;AAAA,UACN,SAAS,EAAE,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,QAAQ,KAAA,EAAO;AAAA,YAC5C,YAAA,EAAc,EAAE,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,IAAA;AAAK,WAC5F,CAAA;AAAE,SACJ,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,KAAA,MAAW,MAAA,IAAU,CAAC,CAAA,EAAG,CAAC,CAAA,EAAY;AACpC,QAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC3B,QAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,MAAM,CAAA;AAClC,QAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,UACjB,IAAA,EAAM,KAAA;AAAA,UACN,SAAS,EAAE,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,QAAQ,KAAA,EAAO;AAAA,YAC5C,YAAA,EAAc,EAAE,IAAA,EAAM,SAAA,EAAW,cAAc,SAAA,EAAW,QAAA,EAAU,UAAU,MAAA;AAAO,WACtF,CAAA;AAAE,SACJ,CAAA;AAAA,MACH;AACA,MAAA;AAAA,IACF;AAAA,IACA,KAAK,KAAA,EAAO;AACV,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC3B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,KAAK,CAAA;AACjC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,SAAS,EAAE,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,OAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,OAAA,EAAS,IAAI,CAAC,CAAA,EAAG,CAAA;AAAE,OACnF,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC3B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,QAAQ,CAAA;AACpC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,SAAS,EAAE,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,UAAU,KAAA,EAAO,EAAE,IAAA,EAAM,GAAA,CAAI,CAAC,CAAA,EAAG,EAAA,EAAI,IAAI,CAAC,CAAA,EAAG,CAAA;AAAE,OAC/E,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,cAAA,EAAgB;AACnB,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC3B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,QAAQ,CAAA;AACpC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO;AAAA,YACnC,MAAA,EAAQ,IAAI,CAAC,CAAA;AAAA,YACb,YAAA,EAAc,IAAI,CAAC;AAAA,WACpB;AAAA;AACH,OACD,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,SAAA,EAAW;AACd,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAA;AAC5B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,QAAQ,CAAA;AACpC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO;AAAA,YACnC,YAAA,EAAc,EAAE,IAAA,EAAM,eAAA,EAAiB,IAAI,GAAA,CAAI,CAAC,CAAA,EAAG,EAAA,EAAI,IAAI,CAAC,CAAA,EAAG,EAAA,EAAI,GAAA,CAAI,CAAC,CAAA;AAAE,WAC3E;AAAA;AACH,OACD,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,YAAA,EAAc;AACjB,MAAA,IAAI,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,CAAI,CAAC,CAAA,EAAG;AACrB,QAAA,GAAA,CAAI,QAAQ,6CAAA,EAAwB,EAAE,SAAS,SAAA,EAAW,EAAA,EAAI,kBAAkB,CAAA;AAChF,QAAA;AAAA,MACF;AACA,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,KAAK,CAAA;AAC7B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,KAAK,CAAA;AACjC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO;AAAA,YAChC,YAAA,EAAc,EAAE,IAAA,EAAM,YAAA,EAAc,EAAA,EAAI,GAAA,CAAI,CAAC,CAAA,EAAG,EAAA,EAAI,GAAA,CAAI,CAAC,CAAA;AAAE,WAC5D;AAAA;AACH,OACD,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,WAAA,EAAa;AAChB,MAAA,IAAI,IAAI,CAAC,CAAA,KAAM,GAAA,CAAI,CAAC,KAAK,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,CAAI,CAAC,CAAA,IAAK,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,CAAI,CAAC,CAAA,EAAG;AAC/D,QAAA,GAAA,CAAI,QAAQ,6CAAA,EAAwB,EAAE,SAAS,SAAA,EAAW,EAAA,EAAI,kBAAkB,CAAA;AAChF,QAAA;AAAA,MACF;AACA,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,KAAK,CAAA;AAC7B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,KAAK,CAAA;AACjC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO;AAAA,YAChC,YAAA,EAAc,EAAE,IAAA,EAAM,UAAA,EAAY,QAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,EAAA,EAAI,IAAI,CAAC,CAAA,EAAG,EAAA,EAAI,GAAA,CAAI,CAAC,CAAA;AAAE,WAC1E;AAAA;AACH,OACD,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,IAAI,IAAI,CAAC,CAAA,KAAM,GAAA,CAAI,CAAC,KAAK,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,CAAI,CAAC,CAAA,IAAK,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,CAAI,CAAC,CAAA,EAAG;AAC/D,QAAA,GAAA,CAAI,QAAQ,6CAAA,EAAwB,EAAE,SAAS,SAAA,EAAW,EAAA,EAAI,YAAY,CAAA;AAC1E,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,OAAA;AAC7B,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,CAAC,CAAA,CAAE,CAAA,IAAK,EAAA,GAAK,KAAA,CAAM,CAAC,CAAA,CAAE,CAAA,EAAE;AACzC,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,CAAC,CAAA,CAAE,CAAA,IAAK,EAAA,GAAK,KAAA,CAAM,CAAC,CAAA,CAAE,CAAA,EAAE;AACzC,MAAA,MAAM,EAAA,GAAK,KAAA,CAAM,CAAC,CAAA,CAAE,CAAA,IAAK,EAAA,GAAK,KAAA,CAAM,CAAC,CAAA,CAAE,CAAA,EAAE;AACzC,MAAA,MAAM,SAAS,EAAA,GAAK,EAAA,KAAO,KAAK,EAAA,CAAA,GAAA,CAAO,EAAA,GAAK,OAAO,EAAA,GAAK,EAAA,CAAA;AACxD,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA,GAAI,IAAA,EAAM;AAC1B,QAAA,GAAA,CAAI,QAAQ,mFAAA,EAA4C;AAAA,UACtD,OAAA,EAAS,SAAA;AAAA,UAAW,EAAA,EAAI;AAAA,SACzB,CAAA;AACD,QAAA;AAAA,MACF;AACA,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,KAAK,CAAA;AAC7B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,KAAK,CAAA;AACjC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,KAAA,EAAO,KAAA,EAAO;AAAA,YAChC,YAAA,EAAc,EAAE,IAAA,EAAM,WAAA,EAAa,IAAI,GAAA,CAAI,CAAC,CAAA,EAAG,EAAA,EAAI,IAAI,CAAC,CAAA,EAAG,EAAA,EAAI,GAAA,CAAI,CAAC,CAAA;AAAE,WACvE;AAAA;AACH,OACD,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,cAAA,EAAgB;AACnB,MAAA,IAAI,IAAI,CAAC,CAAA,KAAM,GAAA,CAAI,CAAC,KAAK,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,CAAI,CAAC,CAAA,IAAK,GAAA,CAAI,CAAC,CAAA,KAAM,GAAA,CAAI,CAAC,CAAA,EAAG;AAC/D,QAAA,GAAA,CAAI,QAAQ,6CAAA,EAAwB,EAAE,SAAS,SAAA,EAAW,EAAA,EAAI,qBAAqB,CAAA;AACnF,QAAA;AAAA,MACF;AACA,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,KAAK,CAAA;AAC7B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,QAAQ,CAAA;AACpC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,OAAA,EAAS;AAAA,UACP,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO;AAAA,YACnC,YAAA,EAAc,EAAE,IAAA,EAAM,UAAA,EAAY,QAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,EAAA,EAAI,IAAI,CAAC,CAAA,EAAG,EAAA,EAAI,GAAA,CAAI,CAAC,CAAA;AAAE,WAC1E;AAAA;AACH,OACD,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAA;AAC5B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,OAAO,CAAA;AACnC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,SAAS,EAAE,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,SAAS,KAAA,EAAO;AAAA,UAC7C,UAAA,EAAY,EAAE,IAAA,EAAM,UAAA,EAAY,EAAA,EAAI,GAAA,CAAI,CAAC,CAAA,EAAG,EAAA,EAAI,GAAA,CAAI,CAAC,CAAA;AAAE,SACxD,CAAA;AAAE,OACJ,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,GAAA,EAAK,OAAO,CAAA;AAC/C,MAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,GAAA,EAAK,MAAM,CAAA;AAC3C,MAAA,IAAI,CAAC,SAAA,IAAa,CAAC,MAAA,EAAQ;AAC3B,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,IAAI,CAAA;AAC5B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,OAAO,CAAA;AACnC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,SAAS,EAAE,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,SAAS,KAAA,EAAO;AAAA,UAC7C,YAAY,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,WAAW,MAAA;AAAO,SACzD,CAAA;AAAE,OACJ,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC3B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,OAAO,CAAA;AACnC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,SAAS,EAAE,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,SAAS,KAAA,EAAO;AAAA,UAC7C,UAAA,EAAY,EAAE,IAAA,EAAM,UAAA,EAAY,UAAU,CAAC,GAAA,CAAI,CAAC,CAAA,EAAG,IAAI,CAAC,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC,CAAA;AAAE,SACpE,CAAA;AAAE,OACJ,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,cAAA,EAAgB;AACnB,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC3B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,OAAO,CAAA;AACnC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,SAAS,EAAE,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,SAAS,KAAA,EAAO;AAAA,UAC7C,UAAA,EAAY,EAAE,IAAA,EAAM,cAAA,EAAgB,UAAU,CAAC,GAAA,CAAI,CAAC,CAAA,EAAG,IAAI,CAAC,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC,CAAA;AAAE,SACxE,CAAA;AAAE,OACJ,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC3B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,OAAO,CAAA;AACnC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,SAAS,EAAE,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,SAAS,KAAA,EAAO;AAAA,UAC7C,UAAA,EAAY,EAAE,IAAA,EAAM,UAAA,EAAY,UAAU,CAAC,GAAA,CAAI,CAAC,CAAA,EAAG,IAAI,CAAC,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC,CAAA;AAAE,SACpE,CAAA;AAAE,OACJ,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,aAAA,EAAe;AAClB,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC3B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,OAAO,CAAA;AACnC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,SAAS,EAAE,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,SAAS,KAAA,EAAO;AAAA,UAC7C,UAAA,EAAY,EAAE,IAAA,EAAM,aAAA,EAAe,UAAU,CAAC,GAAA,CAAI,CAAC,CAAA,EAAG,IAAI,CAAC,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC,CAAA;AAAE,SACvE,CAAA;AAAE,OACJ,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,OAAA,EAAS;AAIZ,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,KAAK,CAAA;AAC7B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,OAAO,CAAA;AACnC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,SAAS,EAAE,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,SAAS,KAAA,EAAO;AAAA,UAC7C,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,UAAG,MAAA,EAAQ,IAAI,CAAC,CAAA;AAAA,UAAG,EAAA,EAAI,IAAI,CAAC;AAAA,SACtC,CAAA;AAAE,OACJ,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,UAAA,EAAY;AACf,MAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC3B,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,UAAU,CAAA;AACtC,MAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,QACjB,IAAA,EAAM,KAAA;AAAA,QACN,SAAS,EAAE,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,YAAY,KAAA,EAAO,EAAE,EAAA,EAAI,GAAA,CAAI,CAAC,CAAA,EAAG,EAAA,EAAI,IAAI,CAAC,CAAA,EAAG,CAAA;AAAE,OAC/E,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,WAAA,EAAa;AAGhB,MAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,OAAA;AAC7B,MAAA,MAAM,OAAA,GAAU,IAAI,aAAA,CAAc,OAAA;AAClC,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,CAAA;AACnC,MAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,CAAA;AACnC,MAAA,IAAI,IAAA,GAAO,CAAA,IAAK,IAAA,GAAO,CAAA,EAAG;AAC1B,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAC,CAAA;AACjC,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAC,CAAA;AACjC,MAAA,IAAI,KAAA,KAAU,MAAA,IAAU,KAAA,KAAU,MAAA,EAAQ;AACxC,QAAA,uBAAA,CAAwB,GAAA,EAAK,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,GAAA,CAAI,CAAC,CAAA,EAAG,IAAA,EAAM,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA;AAC7E,QAAA;AAAA,MACF;AACA,MAAA,MAAM,eACH,KAAA,KAAU,MAAA,IAAU,UAAU,QAAA,IAAc,KAAA,KAAU,YAAY,KAAA,KAAU,MAAA;AAC/E,MAAA,MAAM,cAAA,GAAiB,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,QAAA;AACvD,MAAA,IAAI,CAAC,YAAA,IAAgB,CAAC,cAAA,EAAgB;AAEtC,MAAA,KAAA,MAAW,MAAA,IAAU,CAAC,CAAA,EAAG,CAAC,CAAA,EAAY;AACpC,QAAA,uBAAA,CAAwB,GAAA,EAAK;AAAA,UAC3B,IAAA,EAAM,eAAe,YAAA,GAAe,cAAA;AAAA,UACpC,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,UACX,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,UACX;AAAA,SACD,CAAA;AAAA,MACH;AACA,MAAA;AAAA,IACF;AAAA,IACA;AACE,MAAA;AAAA;AAEN;AAnYA,IAAA,kBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yDAAA,GAAA;AAAA,IAAA,UAAA,EAAA;AAEA,IAAA,UAAA,EAAA;AACA,IAAA,0BAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACUO,SAAS,iBAAA,CAAkB,KAAkB,MAAA,EAAyB;AAC3E,EAAA,IAAI,GAAA,CAAI,SAAS,OAAA,IAAW,GAAA,CAAI,SAAS,cAAA,EAAgB,OAAO,CAAC,GAAA,CAAI,EAAE,CAAA;AACvE,EAAA,IAAI,GAAA,CAAI,IAAA,KAAS,SAAA,IAAa,GAAA,CAAI,SAAS,MAAA,EAAQ;AACjD,IAAA,MAAM,IAAI,GAAA,CAAI,KAAA;AACd,IAAA,OAAO,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,EAAE,CAAA;AAAA,EACpB;AACA,EAAA,IAAI,GAAA,CAAI,SAAS,KAAA,EAAO;AACtB,IAAA,MAAM,IAAI,GAAA,CAAI,KAAA;AACd,IAAA,OAAO,CAAC,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,OAAO,CAAA;AAAA,EAC7B;AACA,EAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACzB,IAAA,MAAM,IAAI,GAAA,CAAI,KAAA;AACd,IAAA,OAAO,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,EAAE,CAAA;AAAA,EACtB;AACA,EAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACzB,IAAA,MAAM,IAAI,GAAA,CAAI,KAAA;AACd,IAAA,OAAO,CAAC,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,YAAY,CAAA;AAAA,EAClC;AACA,EAAA,IAAI,GAAA,CAAI,SAAS,SAAA,EAAW;AAC1B,IAAA,OAAO,CAAC,GAAI,GAAA,CAAI,KAAA,CAAiC,QAAQ,CAAA;AAAA,EAC3D;AACA,EAAA,OAAO,EAAC;AACV;AAnCA,IAAA,eAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6CAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACKO,SAAS,iBAAA,CACd,GAAA,EACA,IAAA,EACA,UAAA,EACA,KAAA,EACM;AACN,EAAA,IAAI,SAAS,gBAAA,EAAkB;AAC7B,IAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,KAAA,CAAM,KAAK,CAAC,CAAA;AACvC,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,OAAO,CAAA;AAC/B,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,SAAS,CAAA;AACrC,IAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,MACjB,IAAA,EAAM,KAAA;AAAA,MACN,SAAS,EAAE,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,WAAW,KAAA,EAAO;AAAA,QAC/C,YAAA,EAAc,EAAE,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,UAAA,CAAW,CAAC,CAAA,EAAG,EAAA,EAAI,UAAA,CAAW,CAAC,CAAA,EAAG,CAAA;AAAE,OAC1E,CAAA;AAAE,KACJ,CAAA;AACD,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,WAAW,CAAC,CAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,QAAA,EAAS;AACjC,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA;AACrC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,GAAA,CAAI,UAAU,0DAA2B,CAAA;AACzC,IAAA;AAAA,EACF;AACA,EAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,MAAa,CAAA;AAChD,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,GAAA,CAAI,UAAU,gFAAkC,CAAA;AAChD,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,YAAA,GAAoC,IAAA;AACxC,EAAA,IAAI,SAAS,WAAA,EAAa;AAExB,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,cAAA,CAAe,UAAA,CAAW,CAAC,CAAC,CAAA;AAC1C,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,cAAA,CAAe,UAAA,CAAW,CAAC,CAAC,CAAA;AAC1C,IAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,IAAK,OAAO,CAAA,CAAE,CAAA,KAAM,UAAA,IAAc,OAAO,CAAA,CAAE,CAAA,KAAM,UAAA,EAAY;AACtE,MAAA,GAAA,CAAI,UAAU,yEAA8B,CAAA;AAC5C,MAAA;AAAA,IACF;AACA,IAAA,YAAA,GAAe,EAAE,IAAA,EAAM,WAAA,EAAa,EAAA,EAAI,CAAA,CAAE,GAAE,GAAI,CAAA,CAAE,CAAA,EAAE,EAAG,IAAI,CAAA,CAAE,CAAA,EAAE,GAAI,CAAA,CAAE,GAAE,EAAE;AAAA,EAC3E,CAAA,MAAA,IAAW,SAAS,QAAA,EAAU;AAC5B,IAAA,YAAA,GAAe,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAW,KAAA,GAAQ,IAAA,CAAK,EAAA,GAAM,GAAA,EAAK,MAAA,EAAQ,UAAA,CAAW,CAAC,CAAA,EAAE;AAAA,EAC5F,CAAA,MAAA,IAAW,SAAS,aAAA,EAAe;AACjC,IAAA,YAAA,GAAe,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,UAAA,CAAW,CAAC,CAAA,EAAE;AAAA,EAC5D,CAAA,MAAA,IAAW,SAAS,cAAA,EAAgB;AAClC,IAAA,YAAA,GAAe,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAA,EAAQ,UAAA,CAAW,CAAC,CAAA,EAAE;AAAA,EAC/D,CAAA,MAAA,IAAW,SAAS,QAAA,EAAU;AAC5B,IAAA,YAAA,GAAe,EAAE,MAAM,QAAA,EAAU,CAAA,EAAG,OAAO,MAAA,EAAQ,UAAA,CAAW,CAAC,CAAA,EAAE;AAAA,EACnE;AACA,EAAA,IAAI,CAAC,YAAA,EAAc;AAKnB,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC9B,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,SAAA,CAAU,OAAO,CAAA;AACtC,IAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,MACjB,IAAA,EAAM,KAAA;AAAA,MACN,SAAS,EAAE,GAAA,EAAK,UAAA,CAAW,KAAA,EAAO,SAAS,QAAA,EAAU;AAAA,QACnD,YAAY,EAAE,IAAA,EAAM,eAAe,MAAA,EAAQ,KAAA,EAAO,WAAW,YAAA,EAAc;AAAA,QAC3E,KAAA,EAAO;AAAA,OACR,CAAA;AAAE,KACJ,CAAA;AACD,IAAA,WAAA,CAAY,KAAK,KAAK,CAAA;AAAA,EACxB;AAEA,EAAA,6BAAA,CAA8B,GAAA,EAAK,QAAQ,WAAW,CAAA;AACxD;AAQA,SAAS,6BAAA,CACP,GAAA,EACA,MAAA,EACA,QAAA,EACM;AACN,EAAA,MAAM,IAAI,MAAA,CAAO,IAAA;AACjB,EAAA,IAAI,CAAA,KAAM,OAAA,IAAW,CAAA,KAAM,cAAA,EAAgB;AAE3C,EAAA,IAAI,CAAA,KAAM,SAAA,IAAa,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC5C,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,SAAS,CAAA;AACrC,IAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,MACjB,IAAA,EAAM,KAAA;AAAA,MACN,SAAS,EAAE,GAAA,EAAK,WAAW,EAAA,EAAI,SAAA,EAAW,OAAO,EAAE,EAAA,EAAI,SAAS,CAAC,CAAA,EAAG,IAAI,QAAA,CAAS,CAAC,GAAG,KAAA,EAAO,SAAA,EAAW,CAAA;AAAE,KAC1G,CAAA;AACD,IAAA;AAAA,EACF;AACA,EAAA,IAAI,CAAA,KAAM,MAAA,IAAU,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACzC,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,MAAM,CAAA;AAClC,IAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,MACjB,IAAA,EAAM,KAAA;AAAA,MACN,SAAS,EAAE,GAAA,EAAK,WAAW,EAAA,EAAI,MAAA,EAAQ,OAAO,EAAE,EAAA,EAAI,SAAS,CAAC,CAAA,EAAG,IAAI,QAAA,CAAS,CAAC,GAAG,KAAA,EAAO,SAAA,EAAW,CAAA;AAAE,KACvG,CAAA;AACD,IAAA;AAAA,EACF;AACA,EAAA,IAAI,CAAA,KAAM,KAAA,IAAS,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACxC,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,KAAK,CAAA;AACjC,IAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,MACjB,IAAA,EAAM,KAAA;AAAA,MACN,SAAS,EAAE,GAAA,EAAK,WAAW,EAAA,EAAI,KAAA,EAAO,OAAO,EAAE,MAAA,EAAQ,SAAS,CAAC,CAAA,EAAG,SAAS,QAAA,CAAS,CAAC,GAAG,KAAA,EAAO,SAAA,EAAW,CAAA;AAAE,KAC/G,CAAA;AACD,IAAA;AAAA,EACF;AACA,EAAA,IAAI,CAAA,KAAM,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC3C,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,QAAQ,CAAA;AACpC,IAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,MACjB,IAAA,EAAM,KAAA;AAAA,MACN,SAAS,EAAE,GAAA,EAAK,WAAW,EAAA,EAAI,QAAA,EAAU,OAAO,EAAE,IAAA,EAAM,SAAS,CAAC,CAAA,EAAG,IAAI,QAAA,CAAS,CAAC,GAAG,KAAA,EAAO,SAAA,EAAW,CAAA;AAAE,KAC3G,CAAA;AACD,IAAA;AAAA,EACF;AACA,EAAA,IAAI,CAAA,KAAM,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC3C,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,GAAG,CAAA;AAC3B,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,QAAQ,CAAA;AACpC,IAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,MACjB,IAAA,EAAM,KAAA;AAAA,MACN,SAAS,EAAE,GAAA,EAAK,WAAW,EAAA,EAAI,QAAA,EAAU,OAAO,EAAE,MAAA,EAAQ,SAAS,CAAC,CAAA,EAAG,cAAc,QAAA,CAAS,CAAC,GAAG,KAAA,EAAO,SAAA,EAAW,CAAA;AAAE,KACvH,CAAA;AACD,IAAA;AAAA,EACF;AACA,EAAA,IAAI,CAAA,KAAM,SAAA,IAAa,QAAA,CAAS,MAAA,IAAU,CAAA,EAAG;AAC3C,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,GAAA,EAAK,MAAM,CAAA;AAC9B,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,SAAA,CAAU,SAAS,CAAA;AACrC,IAAA,GAAA,CAAI,MAAM,QAAA,CAAS;AAAA,MACjB,IAAA,EAAM,KAAA;AAAA,MACN,OAAA,EAAS,EAAE,GAAA,EAAK,UAAA,CAAW,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,EAAE,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,SAAA,EAAW,CAAA;AAAE,KAC5F,CAAA;AACD,IAAA;AAAA,EACF;AAGF;AArJA,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qDAAA,GAAA;AACA,IAAA,eAAA,EAAA;AAEA,IAAA,UAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACMO,SAAS,qBACd,GAAA,EACA,OAAA,EAEA,GACA,CAAA,EACA,CAAA,EACA,MACA,OAAA,EACM;AACN,EAAA,IAAI,IAAA,GAAsB,IAAA;AAC1B,EAAA,IAAI,MAAA,GAAwB,IAAA;AAE5B,EAAA,IAAI,QAAQ,OAAA,EAAS;AAEnB,IAAA,MAAM,SAAA,GAAY,IAAI,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAC9D,IAAA,MAAM,SAAA,GAAyF,CAAC,GAAG,OAAA,CAAQ,OAAO,CAAA;AAClH,IAAA,KAAA,MAAW,KAAK,SAAA,EAAW;AACzB,MAAA,IAAI,MAAM,OAAA,EAAS;AAGnB,MAAA,IAAI,CAAA,GAAI,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAA;AAC3B,MAAA,IAAI,CAAA,GAAI,MAAM,CAAA,KAAM,MAAA,IAAU,MAAM,QAAA,CAAA,EAAW,CAAA,GAAI,SAAA,CAAU,OAAA,CAAQ,cAAc,CAAA;AACnF,MAAA,IAAI,CAAA,GAAI,MAAM,CAAA,KAAM,OAAA,IAAW,MAAM,MAAA,CAAA,EAAS,CAAA,GAAI,SAAA,CAAU,OAAA,CAAQ,aAAa,CAAA;AACjF,MAAA,IAAI,CAAA,IAAK,CAAA,EAAG,SAAA,CAAU,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IACnC;AACA,IAAA,MAAM,WAAA,GAAc,KAAK,IAAA,CAAK,CAAC,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,OAAO,CAAA,IAAK,IAAA;AAChE,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,CAAK,CAAC,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,MAAM,CAAA,IAAK,IAAA;AAC3D,IAAA,MAAM,SAAA,GAAY,KAAK,IAAA,CAAK,CAAC,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,QAAQ,CAAA,IAAK,IAAA;AAC/D,IAAA,IAAI,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,IAAK,aAAa,IAAA,GAAO,WAAA;AAAA,SAAA,IAC9C,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,IAAK,SAAS,IAAA,GAAO,OAAA;AAAA,SAAA,IAC9C,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,IAAK,WAAW,IAAA,GAAO,SAAA;AAAA,SAAA,IAClD,SAAA,CAAU,QAAA,CAAS,cAAc,CAAA,KAAM,WAAW,SAAA,CAAA,EAAY;AACrE,MAAA,IAAA,GAAO,OAAA,IAAW,SAAA;AAAA,IACpB,WACS,SAAA,CAAU,QAAA,CAAS,aAAa,CAAA,KAAM,eAAe,OAAA,CAAA,EAAU;AACtE,MAAA,IAAA,GAAO,WAAA,IAAe,OAAA;AAAA,IACxB,WACS,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,KAAM,WAAA,IAAe,WAAW,SAAA,CAAA,EAAY;AAC3E,MAAA,IAAA,GAAO,eAAe,OAAA,IAAW,SAAA;AAAA,IACnC,CAAA,MAAA,IAAW,UAAU,QAAA,CAAS,OAAO,KAAK,SAAA,CAAU,QAAA,CAAS,aAAa,CAAA,EAAG;AAC3E,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,mBAAA,CAAoB,CAAA,EAAG,EAAE,CAAA;AAC1C,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,GAAO,IAAA;AAAA,MACT,CAAA,MAAO;AAYL,QAAA,IAAI,OAAA,CAAQ,GAAA,KAAQ,eAAA,IAAmB,GAAA,CAAI,WAAW,OAAA,CAAQ,MAAA,GAAS,CAAA,IAChE,OAAA,CAAQ,IAAI,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,MAAM,MAAA,EAAQ;AACpD,UAAA,GAAA,CAAI,UAAU,2JAAoE,CAAA;AAClF,UAAA;AAAA,QACF;AACA,QAAA,MAAA,GAAS,oBAAA,CAAqB,GAAA,EAAK,CAAA,EAAG,CAAC,CAAA;AACvC,QAAA,IAAA,GAAO,GAAA,CAAI,eAAe,MAAM,CAAA;AAAA,MAClC;AAAA,IACF;AACA,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,QAAQ,SAAA,CAAU,GAAA;AAAA,QAAI,CAAC,CAAA,KAC3B,CAAA,KAAM,OAAA,GAAU,yBAAA,GACd,MAAM,MAAA,GAAS,8CAAA,GACf,CAAA,KAAM,QAAA,GAAW,0CACjB,CAAA,KAAM,cAAA,GAAiB,sEAAA,GACvB,CAAA,KAAM,gBAAgB,uEAAA,GACtB;AAAA,OACJ;AACA,MAAA,GAAA,CAAI,UAAU,CAAA,6BAAA,EAAqB,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA,eAAA,CAAS,CAAA;AAC7D,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,EAAG;AACzC,MAAA,GAAA,CAAI,UAAU,kHAA6C,CAAA;AAC3D,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,GAAA,KAAQ,eAAA,IAAmB,IAAI,UAAA,CAAW,OAAA,CAAQ,SAAS,CAAA,EAAG;AACxE,MAAA,MAAM,YAAY,OAAA,CAAQ,GAAA,CAAI,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA;AACnD,MAAA,MAAM,OAAA,GAAU,QAAQ,IAAI,CAAA;AAC5B,MAAA,IAAI,SAAA,KAAc,MAAA,IAAU,OAAA,KAAY,MAAA,EAAQ;AAC9C,QAAA,GAAA,CAAI,UAAU,wHAAiD,CAAA;AAC/D,QAAA;AAAA,MACF;AACA,MAAA,IAAI,SAAA,KAAc,OAAA,IAAW,OAAA,KAAY,OAAA,EAAS;AAChD,QAAA,GAAA,CAAI,UAAU,2GAA8C,CAAA;AAC5D,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAA,GAAS,GAAA,CAAI,eAAe,IAAI,CAAA;AAAA,EAC/C,CAAA,MAAO;AAEL,IAAA,MAAM,OAAA,GAAU,OAAA,IAAW,OAAA,CAAQ,OAAO,CAAA,KAAM,UAAU,OAAA,GAAU,GAAA,CAAI,mBAAA,CAAoB,CAAA,EAAG,EAAE,CAAA;AACjG,IAAA,IAAI,WAAW,GAAA,CAAI,UAAA,CAAW,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA,EAAG;AACvD,MAAA,GAAA,CAAI,UAAU,wHAAwD,CAAA;AACtE,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,GAAO,OAAA;AACP,MAAA,MAAA,GAAS,GAAA,CAAI,eAAe,OAAO,CAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,MAAA,GAAS,oBAAA,CAAqB,GAAA,EAAK,CAAA,EAAG,CAAC,CAAA;AACvC,MAAA,IAAA,GAAO,GAAA,CAAI,eAAe,MAAM,CAAA;AAAA,IAClC;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,IAAA,EAAM;AACX,EAAA,GAAA,CAAI,UAAA,CAAW,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAChC,EAAA,IAAI,MAAA,EAAQ,GAAA,CAAI,aAAA,CAAc,OAAA,CAAQ,KAAK,MAAM,CAAA;AACjD,EAAA,GAAA,CAAI,eAAA,CAAgB,GAAA,CAAI,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAGpD,EAAA,IAAI,OAAA,CAAQ,GAAA,KAAQ,eAAA,IACb,GAAA,CAAI,cAAc,OAAA,CAAQ,MAAA,KAAW,CAAA,IACrC,OAAA,CAAQ,IAAI,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,MAAM,MAAA,EAAQ;AACpD,IAAA,aAAA,CAAc,KAAK,OAAO,CAAA;AAC1B,IAAA,GAAA,CAAI,YAAA,EAAa;AACjB,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,aAAA,CAAc,OAAA,CAAQ,MAAA,IAAU,QAAQ,KAAA,EAAO;AACrD,IAAA,MAAM,KAAK,OAAA,CAAQ,GAAA;AAGnB,IAAA,IAAI,EAAA,KAAO,QAAA,IAAY,EAAA,KAAO,QAAA,IAAY,OAAO,gBAAA,EAAkB;AACjE,MAAA,MAAM,EAAA,GAAA,CAAO,CAAA,CAAE,OAAA,IAAW,CAAA,IAAgB,CAAA;AAC1C,MAAA,MAAM,EAAA,GAAA,CAAO,CAAA,CAAE,OAAA,IAAW,CAAA,IAAgB,CAAA;AAC1C,MAAA,GAAA,CAAI,oBAAoB,OAAA,GAAU;AAAA,QAChC,IAAA,EAAM,EAAA;AAAA,QACN,UAAA,EAAY,GAAA,CAAI,aAAA,CAAc,OAAA,CAAQ,KAAA,EAAM;AAAA,QAC5C,YAAA,EAAc,EAAE,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA;AAAG,OAC/B;AACA,MAAA,GAAA,CAAI,aAAA,CAAc,EAAE,IAAA,EAAM,EAAA,EAAI,MAAA,EAAQ,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAG,EAAG,CAAA;AAExD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,EAAA,KAAO,WAAA,IAAe,EAAA,KAAO,aAAA,IAAiB,OAAO,cAAA,EAAgB;AACvE,MAAA,iBAAA,CAAkB,KAAK,EAAA,EAAI,GAAA,CAAI,cAAc,OAAA,CAAQ,KAAA,IAAS,CAAC,CAAA;AAC/D,MAAA,GAAA,CAAI,YAAA,EAAa;AACjB,MAAA;AAAA,IACF;AAGA,IAAA,aAAA,CAAc,KAAK,OAAO,CAAA;AAC1B,IAAA,GAAA,CAAI,YAAA,EAAa;AAAA,EACnB,CAAA,MAAO;AACL,IAAA,GAAA,CAAI,cAAA,EAAe;AAAA,EACrB;AACF;AApKA,IAAA,eAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kEAAA,GAAA;AAAA,IAAA,UAAA,EAAA;AAEA,IAAA,UAAA,EAAA;AACA,IAAA,kBAAA,EAAA;AACA,IAAA,cAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACMO,SAAS,UAAA,CAAW,KAAiB,CAAA,EAAc;AACxD,EAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,OAAA,EAAS;AAC3B,EAAA,MAAM,CAAA,GAAI,IAAI,OAAA,CAAQ,OAAA;AAEtB,EAAA,IAAI,CAAA,KAAM,MAAA,EAAQ,OAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAC9C,EAAA,IAAI,CAAA,KAAM,QAAA,EAAU,OAAO,gBAAA,CAAiB,KAAK,CAAC,CAAA;AAElD,EAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,QAAQ,CAAC,CAAA;AAC/C,EAAA,IAAI,CAAC,OAAA,EAAS;AAEd,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,QAAA,CAAS,OAAA,CAAQ,oBAAoB,CAAC,CAAA;AACzD,EAAA,MAAM,IAAI,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,GAAI,OAAO,CAAC,CAAA;AAOjC,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,SAAA,CAAU,CAAC,CAAA,CACzB,GAAA,CAAI,GAAA,CAAI,YAAY,CAAA,CACpB,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,GAAA,CAAI,WAAA,CAAY,OAAA,CAAQ,CAAA,IAAK,CAAA,KAAM,GAAA,CAAI,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,CAChF,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,CAAI,cAAA,CAAe,CAAC,KAAK,IAAI,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,OAAO,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAEvE,EAAA,IAAI,CAAA,KAAM,SAAS,OAAO,eAAA,CAAgB,KAAK,CAAA,EAAG,CAAA,EAAG,GAAG,IAAI,CAAA;AAC5D,EAAA,IAAI,uBAAuB,GAAA,EAAK,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,EAAG;AACzD,EAAA,IAAI,iBAAA,CAAkB,KAAK,CAAA,EAAG,OAAA,EAAS,GAAG,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA,EAAG;AAE1D,EAAA,oBAAA,CAAqB,KAAK,OAAA,EAAS,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,MAAM,OAAO,CAAA;AAC3D;AAvCA,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6DAAA,GAAA;AAAA,IAAA,UAAA,EAAA;AAEA,IAAA,SAAA,EAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAAJ,WAAAA,EAAAA;AACA,IAAA,iBAAA,EAAA;AACA,IAAAC,aAAAA,EAAAA;AACA,IAAA,eAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACDO,SAAS,UAAA,CAAW,KAAiB,CAAA,EAAc;AAExD,EAAA,IAAI,IAAI,OAAA,CAAQ,OAAA,KAAY,QAAA,IAAY,GAAA,CAAI,WAAW,OAAA,EAAS;AAC9D,IAAA,MAAM,EAAA,GAAK,GAAA,CAAI,cAAA,CAAe,CAAC,CAAA;AAC/B,IAAA,IAAI,EAAA,IAAM,GAAA,CAAI,QAAA,CAAS,OAAA,EAAS;AAC9B,MAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,EAAA;AACjB,MAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,IAAI,UAAA,CAAW,OAAA;AAC5C,MAAA,MAAM,CAAA,GAAI,IAAI,QAAA,CAAS,OAAA;AACvB,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,uBAAA,GAA0B,CAAC,KAAK,GAAA,CAAI,OAAA,EAAS,EAAE,CAAA,EAAG,KAAK,GAAA,CAAI,OAAA,EAAS,EAAE,CAAC,CAAC,CAAA,IAAK,IAAA;AAC3F,MAAA,MAAM,GAAA,GAAM,CAAA,CAAE,uBAAA,GAA0B,CAAC,KAAK,GAAA,CAAI,OAAA,EAAS,EAAE,CAAA,EAAG,KAAK,GAAA,CAAI,OAAA,EAAS,EAAE,CAAC,CAAC,CAAA,IAAK,IAAA;AAC3F,MAAA,MAAM,KAAA,GAAQ,CAAC,EAAA,EAAY,EAAA,KAAiC;AAC1D,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,MAAA,EAAQ,SAAA,GAAY,CAAC,CAAA,IAAK,CAAA;AACvC,QAAA,MAAM,EAAA,GAAK,CAAA,CAAE,MAAA,EAAQ,SAAA,GAAY,CAAC,CAAA,IAAK,CAAA;AACvC,QAAA,MAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,CAAA,CAAE,KAAA;AACzB,QAAA,MAAM,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,CAAA,CAAE,KAAA;AACzB,QAAA,OAAO,CAAC,IAAI,EAAE,CAAA;AAAA,MAChB,CAAA;AACA,MAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,GAAA,IAAO,GAAA,CAAI,MAAA,IAAU,CAAA,GAAI,CAAC,GAAA,CAAI,CAAC,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,EAAE,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,EAAE,CAAC,CAAA;AACjH,MAAA,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,GAAA,IAAO,GAAA,CAAI,MAAA,IAAU,CAAA,GAAI,CAAC,GAAA,CAAI,CAAC,CAAA,EAAG,GAAA,CAAI,CAAC,CAAC,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,EAAE,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,EAAE,CAAC,CAAA;AACjH,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,OAAA,CAAQ,IAAA;AACpC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,OAAA,CAAQ,2CAA2C,MAAM,GAAA,CAAI,SAAS,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAC,CAAA;AAAA,MAClG;AACA,MAAA,OAAA,CAAQ,iCAAiC,MAAM;AAC7C,QAAA,GAAA,CAAI,WAAW,OAAA,CAAS,IAAA,GAAO,IAAI,QAAA,CAAS,OAAA,CAAQ,OAAO,SAAA,EAAW;AAAA,UACpE,CAAC,KAAK,GAAG,CAAA;AAAA,UAAG,CAAC,KAAK,GAAG,CAAA;AAAA,UAAG,CAAC,KAAK,GAAG,CAAA;AAAA,UAAG,CAAC,KAAK,GAAG;AAAA,SAC/C,EAAG;AAAA,UACD,SAAA,EAAW,SAAA;AAAA,UAAW,WAAA,EAAa,IAAA;AAAA,UACnC,SAAS,EAAE,WAAA,EAAa,WAAW,WAAA,EAAa,CAAA,EAAG,MAAM,CAAA,EAAE;AAAA,UAC3D,QAAA,EAAU,EAAE,OAAA,EAAS,KAAA,EAAM;AAAA,UAC3B,KAAA,EAAO,IAAA;AAAA,UAAM,SAAA,EAAW,KAAA;AAAA,UAAO,SAAA,EAAW;AAAA,SAC3C,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH;AACA,IAAA;AAAA,EACF;AACA,EAAA,MAAM,EAAA,GAAK,IAAI,UAAA,CAAW,OAAA;AAC1B,EAAA,IAAI,CAAC,EAAA,IAAM,CAAC,GAAA,CAAI,SAAS,OAAA,EAAS;AAClC,EAAA,IAAI,GAAA,CAAI,aAAA,CAAc,OAAA,IAAW,IAAA,EAAM;AACvC,EAAA,GAAA,CAAI,aAAA,CAAc,OAAA,GAAU,qBAAA,CAAsB,MAAM;AACtD,IAAA,GAAA,CAAI,cAAc,OAAA,GAAU,IAAA;AAC5B,IAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,WAAW,CAAC,GAAA,CAAI,WAAW,OAAA,EAAS;AACtD,IAAA,OAAA,CAAQ,wBAAwB,MAAM;AACpC,MAAA,MAAM,MAAA,GAAS,GAAA,CAAI,QAAA,CAAS,OAAA,CAAQ,oBAAoB,CAAC,CAAA;AAEzD,MAAA,MAAM,GAAA,GAAW,IAAI,MAAA,CAAO,OAAA;AAC5B,MAAA,IAAI,CAAC,GAAA,EAAK;AACV,MAAA,GAAA,CAAI,UAAA,CAAW,OAAA,CAAQ,mBAAA,CAAoB,GAAA,CAAI,cAAA,EAAgB,CAAC,MAAA,CAAO,CAAC,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AACrF,MAAA,GAAA,CAAI,QAAA,CAAS,QAAQ,MAAA,EAAO;AAAA,IAC9B,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAzDA,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uDAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACUO,SAAS,QAAA,CAAS,KAAiB,CAAA,EAAc;AACtD,EAAA,MAAM,CAAA,GAAI,IAAI,OAAA,CAAQ,OAAA;AACtB,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,MAAM,EAAA,GAAK,IAAI,UAAA,CAAW,OAAA;AAC1B,IAAA,GAAA,CAAI,WAAW,OAAA,GAAU,IAAA;AACzB,IAAA,GAAA,CAAI,YAAY,OAAA,GAAU,IAAA;AAC1B,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAMI,GAAAA,GAAK,GAAA,CAAI,cAAA,CAAe,CAAC,CAAA;AAC/B,IAAA,IAAI,CAACA,GAAAA,EAAI;AACT,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAIA,GAAAA;AACjB,IAAA,IAAI,GAAG,IAAA,EAAM;AAAE,MAAA,OAAA,CAAQ,qCAAA,EAAuC,MAAM,GAAA,CAAI,QAAA,CAAS,SAAS,YAAA,CAAa,EAAA,CAAG,IAAI,CAAC,CAAA;AAAA,IAAG;AAClH,IAAA,IAAI,IAAA,CAAK,MAAM,EAAA,GAAK,EAAA,CAAG,SAAS,EAAA,GAAK,EAAA,CAAG,OAAO,CAAA,GAAI,CAAA,EAAG;AACtD,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,OAAA,EAAS,EAAE,CAAA,EAAG,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,OAAA,EAAS,EAAE,CAAA;AACjE,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,OAAA,EAAS,EAAE,CAAA,EAAG,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,OAAA,EAAS,EAAE,CAAA;AACjE,IAAA,MAAM,KAAA,GAAQ,IAAI,QAAA,CAAS,OAAA;AAC3B,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,IAAA,GAAQ,KAAA,CAAM,WAAA,IAAe,EAAC;AACpC,IAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,MAAA,IAAI,CAAA,KAAM,IAAI,WAAA,CAAY,OAAA,CAAQ,KAAK,CAAA,KAAM,GAAA,CAAI,WAAA,CAAY,OAAA,CAAQ,CAAA,EAAG;AACxE,MAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AACtB,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,MAAM,EAAA,GAAK,EAAE,MAAA,EAAQ,SAAA;AACrB,QAAA,IAAI,CAAC,EAAA,EAAI;AACT,QAAA,IAAI,EAAA,CAAG,CAAC,CAAA,IAAK,EAAA,IAAM,GAAG,CAAC,CAAA,IAAK,EAAA,IAAM,EAAA,CAAG,CAAC,CAAA,IAAK,EAAA,IAAM,EAAA,CAAG,CAAC,KAAK,EAAA,EAAI;AAC5D,UAAA,MAAM,GAAA,GAAM,GAAA,CAAI,cAAA,CAAe,CAAC,CAAA;AAChC,UAAA,IAAI,OAAO,CAAC,GAAA,CAAI,eAAe,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AAC/C,YAAA,GAAA,CAAI,cAAA,CAAe,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAAA,UACpC;AAAA,QACF;AAAA,MACF,CAAA,MAAA,IAAW,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,QAAA,EAAU;AAE/C,QAAA,MAAM,IAAA,GAAc,CAAC,CAAA,CAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,MAAM,CAAA,CAAE,OAAO,OAAO,CAAA;AACvF,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM;AACjC,UAAA,MAAM,EAAA,GAAK,GAAG,MAAA,EAAQ,SAAA;AACtB,UAAA,OAAO,EAAA,IAAM,EAAA,CAAG,CAAC,CAAA,IAAK,MAAM,EAAA,CAAG,CAAC,CAAA,IAAK,EAAA,IAAM,GAAG,CAAC,CAAA,IAAK,EAAA,IAAM,EAAA,CAAG,CAAC,CAAA,IAAK,EAAA;AAAA,QACrE,CAAC,CAAA;AACD,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,GAAA,GAAM,GAAA,CAAI,cAAA,CAAe,CAAC,CAAA;AAChC,UAAA,IAAI,OAAO,CAAC,GAAA,CAAI,eAAe,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AAC/C,YAAA,GAAA,CAAI,cAAA,CAAe,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAAA,UACpC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,IAAA,GAAA,CAAI,gBAAA,CAAiB,CAAC,EAAA,KAAO,EAAA,GAAK,CAAC,CAAA;AACnC,IAAA,OAAA,CAAQ,gCAAA,EAAkC,MAAM,KAAA,CAAM,MAAA,EAAQ,CAAA;AAC9D,IAAA;AAAA,EACF;AACA,EAAA,IAAI,MAAM,MAAA,EAAQ;AAClB,EAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,CAAY,OAAA;AAC9B,EAAA,GAAA,CAAI,YAAY,OAAA,GAAU,IAAA;AAC1B,EAAA,IAAI,CAAC,KAAA,EAAO;AACZ,EAAA,MAAM,EAAA,GAAK,GAAA,CAAI,cAAA,CAAe,CAAC,CAAA;AAC/B,EAAA,IAAI,CAAC,EAAA,EAAI;AACT,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,EAAA;AACjB,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,EAAA,GAAK,MAAM,EAAA,EAAI,EAAA,GAAK,MAAM,EAAE,CAAA;AACrD,EAAA,IAAI,QAAQ,CAAA,EAAG;AACf,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,SAAA,CAAU,CAAC,CAAA,CACzB,GAAA,CAAI,GAAA,CAAI,YAAY,CAAA,CACpB,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,GAAA,CAAI,WAAA,CAAY,OAAA,CAAQ,CAAA,IAAK,CAAA,KAAM,GAAA,CAAI,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAA,CAChF,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,CAAI,cAAA,CAAe,CAAC,KAAK,IAAI,CAAA;AAC9C,EAAA,MAAM,OACJ,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,KAAM,QAAQ,CAAC,CAAA,KAAM,OAAO,CAAA,IAAK,IAAI,mBAAA,CAAoB,CAAA,EAAG,EAAE,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,IAAK,IAAA;AAC3F,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,GAAA,CAAI,iBAAiB,OAAA,GAAU,EAAE,EAAA,EAAI,IAAA,EAAM,MAAM,CAAA,EAAE;AACnD,IAAA;AAAA,EACF;AACA,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,cAAA,CAAe,IAAI,CAAA;AACtC,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,MAAM,QAAA,GACJ,MAAA,KAAW,IAAA,IAAQ,GAAA,CAAI,gBAAA,CAAiB,OAAA,CAAQ,EAAA,KAAO,MAAA,IAAW,GAAA,GAAM,GAAA,CAAI,gBAAA,CAAiB,OAAA,CAAQ,IAAA,GAAQ,GAAA;AAC/G,EAAA,GAAA,CAAI,iBAAiB,OAAA,GAAU,EAAE,EAAA,EAAI,MAAA,EAAQ,MAAM,GAAA,EAAI;AACvD,EAAA,IAAI,CAAC,QAAA,EAAU;AACf,EAAA,MAAM,KAAM,CAAA,CAAE,OAAA,IAAW,EAAE,OAAA,GAAU,CAAC,GAAG,OAAA,IAAW,CAAA;AACpD,EAAA,MAAM,KAAM,CAAA,CAAE,OAAA,IAAW,EAAE,OAAA,GAAU,CAAC,GAAG,OAAA,IAAW,CAAA;AACpD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACb,EAAA,GAAA,CAAI,UAAA,CAAW,EAAE,EAAA,EAAI,MAAA,EAAQ,YAAA,EAAc,EAAE,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,CAAA,EAAG,EAAA,GAAK,CAAA,IAAK,CAAA;AACvE;AAvFA,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qDAAA,GAAA;AAGA,IAAA,UAAA,EAAA;AACA,IAAA,YAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACJA,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iDAAA,GAAA;AAAA,IAAA,gBAAA,EAAA;AACA,IAAA,gBAAA,EAAA;AACA,IAAA,cAAA,EAAA;AACA,IAAA,cAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACYO,SAAS,gBAAA,CACd,OACA,UAAA,EACA,CAAA,EACA,GACA,KAAA,EACA,UAAA,mBAA0B,IAAI,GAAA,EAAI,EACd;AACpB,EAAA,IAAI,IAAA,GAA2B,IAAA;AAC/B,EAAA,IAAI,aAAa,KAAA,GAAQ,KAAA;AACzB,EAAA,KAAA,MAAW,GAAA,IAAO,WAAA,CAAY,KAAK,CAAA,EAAG;AACpC,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,OAAA,IAAW,GAAA,CAAI,SAAS,cAAA,EAAgB;AACzD,IAAA,IAAI,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,EAAG;AAC5B,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,EAAE,CAAA;AAC/B,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AACtB,IAAA,MAAM,EAAA,GAAK,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA;AACtB,IAAA,MAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA;AAC1B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,UAAA,GAAa,EAAA;AACb,MAAA,IAAA,GAAO,GAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAOO,SAAS,cAAA,CACd,KAAA,EACA,SAAA,EACA,GAAA,EACyB;AACzB,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,IAAI;AACF,IAAA,MAAM,KAAK,KAAA,CAAM,gBAAA,GAAmB,KAAA,CAAM,gBAAA,CAAiB,GAAG,CAAA,GAAI,IAAA;AAClE,IAAA,IAAI,EAAA,IAAM,EAAA,CAAG,MAAA,IAAU,CAAA,EAAG,OAAO,CAAC,EAAA,CAAG,CAAC,CAAA,EAAG,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,EAChD,CAAA,CAAA,MAAQ;AAAA,EAAuC;AAC/C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,IAAA,GAAO,UAAU,qBAAA,EAAsB;AAC7C,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA,IAAW,IAAI,OAAA,GAAU,CAAC,GAAG,OAAA,IAAW,CAAA;AACvD,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA,IAAW,IAAI,OAAA,GAAU,CAAC,GAAG,OAAA,IAAW,CAAA;AACvD,IAAA,OAAO,CAAC,EAAA,GAAK,IAAA,CAAK,IAAA,EAAM,EAAA,GAAK,KAAK,GAAG,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,IAAA;AACT;AAWO,SAAS,SAAA,CACd,KAAA,EACA,SAAA,EACA,GAAA,EACA,QAAA,EACU;AACV,EAAA,MAAM,EAAA,GAAK,cAAA,CAAe,KAAA,EAAO,SAAA,EAAW,GAAG,CAAA;AAC/C,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,EAAA,SAAW,EAAC;AAC3B,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,EAAA;AACjB,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU,IAAI,CAAA,EAAG,UAAA,CAAW,IAAI,CAAC,CAAA;AACjD,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,OAAA,CAAQ,qBAAqB,MAAM;AACjC,IAAA,KAAA,MAAW,CAAA,IAAM,KAAA,CAAM,WAAA,IAAe,EAAC,EAAI;AACzC,MAAA,IAAI,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAG;AACvB,MAAA,IAAI,CAAA,IAAK,OAAO,CAAA,CAAE,QAAA,KAAa,UAAA,IAAc,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,EAAE,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA;AAAA,IAC7E;AAAA,EACF,CAAC,CAAA;AACD,EAAA,OAAO,GAAA;AACT;AAOO,SAAS,oBACd,KAAA,EACA,SAAA,EACA,OACAC,eAAAA,EACA,GAAA,EACA,QAAQ,EAAA,EACO;AACf,EAAA,MAAM,EAAA,GAAK,cAAA,CAAe,KAAA,EAAO,SAAA,EAAW,GAAG,CAAA;AAC/C,EAAA,IAAI,CAAC,KAAA,IAAS,CAAC,EAAA,EAAI,OAAO,IAAA;AAC1B,EAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,EAAA;AACjB,EAAA,MAAM,UAAA,GAAa,CAAC,EAAA,KAAwC;AAC1D,IAAA,MAAM,CAAA,GAAIA,gBAAe,EAAE,CAAA;AAC3B,IAAA,MAAM,GAAA,GAAM,GAAG,MAAA,EAAQ,SAAA;AACvB,IAAA,OAAO,GAAA,GAAM,CAAC,GAAA,CAAI,CAAC,GAAG,GAAA,CAAI,CAAC,CAAC,CAAA,GAAI,IAAA;AAAA,EAClC,CAAA;AACA,EAAA,MAAM,SAAS,gBAAA,CAAiB,KAAA,EAAO,UAAA,EAAY,EAAA,EAAI,IAAI,KAAK,CAAA;AAChE,EAAA,OAAO,MAAA,GAASA,eAAAA,CAAe,MAAA,CAAO,EAAE,CAAA,GAAI,IAAA;AAC9C;AAOO,SAAS,mBAAA,CAAoB,OAAe,CAAA,EAAmB;AACpE,EAAA,IAAI,CAAC,GAAG,OAAO,CAAA;AACf,EAAA,MAAM,CAAA,GAAA,CAAK,EAAE,MAAA,IAAU,CAAA,CAAE,QAAQ,EAAA,EAAI,QAAA,GAAW,WAAA,EAAY;AAC5D,EAAA,IAAI,CAAA,KAAM,MAAA,IAAU,CAAC,KAAA,EAAO,OAAO,CAAA;AACnC,EAAA,MAAM,QAAA,GAAW,OAAA,CAAuB,6BAAA,EAA+B,MAAM;AAC3E,IAAA,KAAA,MAAW,CAAA,IAAM,KAAA,CAAM,WAAA,IAAe,EAAC,EAAI;AACzC,MAAA,IAAI,CAAA,CAAE,KAAA,KAAU,CAAA,EAAG,OAAO,CAAA;AAAA,IAC5B;AACA,IAAA,OAAO,IAAA;AAAA,EACT,GAAG,IAAI,CAAA;AACP,EAAA,OAAO,QAAA,IAAY,CAAA;AACrB;AAxIA,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0CAAA,GAAA;AAEA,IAAA,UAAA,EAAA;AACA,IAAA,YAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACmBO,SAAS,oBAAsC,OAAA,EAAiC;AACrF,EAAA,MAAM,CAAC,IAAA,EAAM,YAAY,CAAA,GAAId,eAAY,OAAO,CAAA;AAChD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,cAAAA,CAAmB,EAAE,CAAA;AACzD,EAAA,MAAM,OAAA,GAAUC,aAAU,OAAO,CAAA;AACjC,EAAA,MAAM,aAAA,GAAgBA,YAAAA,CAAiB,EAAE,CAAA;AAEzC,EAAA,MAAM,OAAA,GAAUE,iBAAAA,CAAY,CAAC,CAAA,KAAS;AACpC,IAAA,OAAA,CAAQ,OAAA,GAAU,CAAA;AAClB,IAAA,aAAA,CAAc,UAAU,EAAC;AACzB,IAAA,YAAA,CAAa,CAAC,CAAA;AACd,IAAA,aAAA,CAAc,EAAE,CAAA;AAAA,EAClB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAcA,iBAAAA,CAAY,CAAC,EAAA,KAAe;AAC9C,IAAA,aAAA,CAAc,OAAA,GAAU,CAAC,GAAG,aAAA,CAAc,SAAS,EAAE,CAAA;AACrD,IAAA,aAAA,CAAc,cAAc,OAAO,CAAA;AAAA,EACrC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACrC,IAAA,aAAA,CAAc,UAAU,EAAC;AACzB,IAAA,aAAA,CAAc,EAAE,CAAA;AAAA,EAClB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,SAAS,aAAA,EAAe,OAAA,EAAS,aAAa,YAAA,EAAa;AACxF;AA9CA,IAAA,wBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0CAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC2BO,SAAS,kBAAA,CACd,MAAA,EACA,KAAA,EACA,KAAA,GAAQ,WAAA,EACI;AACZ,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAwB;AACvC,IAAA,IAAI,CAAC,CAAA,CAAE,OAAA,IAAW,CAAC,EAAE,OAAA,EAAS;AAC9B,IAAA,CAAA,CAAE,cAAA,EAAe;AACjB,IAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,IAAA,IAAI,EAAA;AACJ,IAAA,IAAI,EAAA;AACJ,IAAA,OAAA,CAAQ,CAAA,EAAG,KAAK,CAAA,OAAA,CAAA,EAAW,MAAM;AAC/B,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,mBAAA,GAAsB,CAAC,CAAA;AACzC,MAAA,IAAI,MAAM,OAAA,CAAQ,GAAG,KAAK,GAAA,CAAI,MAAA,IAAU,KACjC,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAC,CAAA,IAAK,MAAA,CAAO,SAAS,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG;AACzD,QAAA,EAAA,GAAK,IAAI,CAAC,CAAA;AACV,QAAA,EAAA,GAAK,IAAI,CAAC,CAAA;AAAA,MACZ;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,KAAK,CAAA,GAAA,CAAA,EAAO,MAAM,KAAA,CAAM,MAAA,CAAO,EAAA,EAAI,EAAE,CAAC,CAAA;AAAA,SAAA,IAC1D,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG,OAAA,CAAQ,CAAA,EAAG,KAAK,CAAA,IAAA,CAAA,EAAQ,MAAM,KAAA,CAAM,OAAA,CAAQ,EAAA,EAAI,EAAE,CAAC,CAAA;AAAA,EAC5E,CAAA;AACA,EAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,OAAA,EAAS,OAAO,CAAA;AAC5D,EAAA,OAAO,MAAM;AAAE,IAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAAA,EAAG,CAAA;AAC/D;AAnDA,IAAA,uBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yCAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACuDA,eAAsB,YAAA,CACpB,QACA,MAAA,EAC6B;AAC7B,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,UAAA;AAE9B,EAAA,MAAM,GAAA,GAAA,CAAO,MAAM,OAAO,UAAU,CAAA,EAAG,OAAA;AACvC,EAAA,MAAM;AAAA,IACJ,mBAAA,GAAsB,IAAA;AAAA,IACtB,kBAAA,GAAqB,IAAA;AAAA,IACrB,oBAAA,GAAuB,IAAA;AAAA,IACvB,uBAAA,GAA0B;AAAA,GAC5B,GAAI,MAAA,CAAO,QAAA,IAAY,EAAC;AACxB,EAAA,OAAA,CAAQ,CAAA,EAAG,KAAK,CAAA,aAAA,CAAA,EAAiB,MAAM;AACrC,IAAA,MAAM,OAAO,GAAA,CAAI,OAAA;AACjB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAI,uBAAuB,kBAAA,EAAoB;AAC7C,MAAA,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,IAAA,IAAQ,EAAC;AAC1B,MAAA,IAAI,mBAAA,EAAqB,IAAA,CAAK,IAAA,CAAK,OAAA,GAAU,UAAA;AAC7C,MAAA,IAAI,kBAAA,EAAoB;AACtB,QAAA,IAAA,CAAK,KAAK,cAAA,GAAiB,KAAA;AAC3B,QAAA,IAAA,CAAK,KAAK,UAAA,GAAa,KAAA;AACvB,QAAA,IAAA,CAAK,KAAK,QAAA,GAAW,KAAA;AAAA,MACvB;AAAA,IACF;AACA,IAAA,IAAI,oBAAA,EAAsB;AACxB,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,EAAC;AAC5B,MAAA,IAAA,CAAK,MAAM,OAAA,GAAU,UAAA;AAAA,IACvB;AACA,IAAA,IAAI,uBAAA,EAAyB;AAC3B,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,EAAC;AAClC,MAAA,IAAA,CAAK,SAAS,SAAA,GAAY,KAAA;AAAA,IAC5B;AACA,IAAA,MAAA,CAAO,oBAAoB,IAAI,CAAA;AAAA,EACjC,CAAC,CAAA;AACD,EAAA,MAAM,QAAQ,GAAA,CAAI,QAAA,CAAS,SAAA,CAAU,MAAA,EAAQ,OAAO,YAAY,CAAA;AAChE,EAAA,MAAM,UAAU,MAAY;AAC1B,IAAA,OAAA,CAAQ,CAAA,EAAG,KAAK,CAAA,UAAA,CAAA,EAAc,MAAM,IAAI,QAAA,CAAS,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EACnE,CAAA;AACA,EAAA,OAAO,EAAE,GAAA,EAAK,KAAA,EAAO,OAAA,EAAQ;AAC/B;AA/FA,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mCAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACUO,SAAS,mBAAA,CACd,KAAA,EACA,EAAA,EACA,YAAA,EACuB;AACvB,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,EAAE,CAAA;AAC5B,EAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AACjB,EAAA,MAAM,IAAI,GAAA,CAAI,IAAA;AACd,EAAA,IAAI,CAAA,KAAM,OAAA,IAAW,CAAA,KAAM,MAAA,IAAU,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,SAAA,IAAa,CAAA,KAAM,KAAA,IAAS,CAAA,KAAM,QAAA,EAAU;AACvG,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,GAAA,CAAI,KAAA;AACd,EAAA,MAAM,QAAqC,CAAA,KAAM,OAAA,GAAU,OAAA,GAAW,CAAA,KAAM,WAAW,QAAA,GAAW,MAAA;AAClG,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,IAAA,EAAM,KAAA;AAAA,IACN,MAAM,GAAA,CAAI,KAAA;AAAA,IACV,KAAA,EAAQ,EAAE,KAAA,IAAoB,SAAA;AAAA,IAC9B,KAAA,EAAQ,EAAE,KAAA,IAAoB,CAAA;AAAA,IAC9B,IAAA,EAAO,EAAE,IAAA,IAAmB,CAAA;AAAA,IAC5B,IAAA,EAAO,EAAE,IAAA,IAAmC,GAAA;AAAA,IAC5C,SAAA,EAAY,EAAE,SAAA,IAAyB,IAAA;AAAA,IACvC,SAAA,EAAY,EAAE,SAAA,IAAyB,KAAA;AAAA,IACvC,YAAA,EAAc;AAAA,GAChB;AACF;AAnCA,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2CAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACqCO,SAAS,iBAAA,CACd,KAAA,EACA,OAAA,EACA,KAAA,EACA,OAAA,EACQ;AACR,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,OAAO,OAAA,CAAgB,6BAA6B,MAAM;AACxD,IAAA,QAAQ,QAAQ,GAAA;AAAK,MACnB,KAAK,SAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL,KAAK,UAAA;AACH,QAAA,OAAO,KAAA,CAAM,OAAO,SAAA,EAAW,CAAC,MAAM,CAAC,CAAA,EAAG,OAAO,CAAA,EAAG,aAAa,CAAA;AAAA,MACnE,KAAK,MAAA;AACH,QAAA,OAAO,KAAA,CAAM,OAAO,MAAA,EAAQ,CAAC,MAAM,CAAC,CAAA,EAAG,OAAO,CAAA,EAAG,aAAa,CAAA;AAAA,MAChE,KAAK,KAAA;AACH,QAAA,OAAO,KAAA,CAAM,OAAO,MAAA,EAAQ,CAAC,MAAM,CAAC,CAAA,EAAG,OAAO,CAAA,EAAG;AAAA,UAC/C,GAAG,aAAA;AAAA,UACH,aAAA,EAAe,KAAA;AAAA,UACf,YAAA,EAAc;AAAA,SACf,CAAA;AAAA,MACH,KAAK,QAAA;AACH,QAAA,OAAO,KAAA,CAAM,OAAO,OAAA,EAAS,CAAC,MAAM,CAAC,CAAA,EAAG,OAAO,CAAA,EAAG,aAAa,CAAA;AAAA,MACjE,KAAK,cAAA;AACH,QAAA,OAAO,KAAA,CAAM,OAAO,QAAA,EAAU,CAAC,MAAM,CAAC,CAAA,EAAG,OAAO,CAAA,EAAG,oBAAoB,CAAA;AAAA,MACzE,KAAK,SAAA;AACH,QAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,OAAO,GAAG,oBAAoB,CAAA;AAC/F,QAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,UAAA,OAAO,KAAA,CAAM,MAAA,CAAO,cAAA,EAAgB,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,EAAG,OAAO,CAAA,EAAG,oBAAoB,CAAA;AAAA,QACzF;AACA,QAAA,OAAO,IAAA;AAAA,MACT,KAAK,OAAA;AACH,QAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA,CAAM,MAAA,CAAO,SAAA,EAAW,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,OAAO,GAAG,aAAa,CAAA;AACzF,QAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,UAAA,OAAO,KAAA,CAAM,MAAA,CAAO,OAAA,EAAS,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA,EAAG,OAAO,CAAA,EAAG;AAAA,YAC1D,GAAG,aAAA;AAAA,YACH,MAAA,EAAQ,CAAA;AAAA,YACR,SAAA,EAAW,SAAA;AAAA,YACX,WAAA,EAAa;AAAA,WACd,CAAA;AAAA,QACH;AACA,QAAA,OAAO,IAAA;AAAA,MACT,KAAK,cAAA;AACH,QAAA,OAAO,KAAA,CAAM,OAAO,SAAA,EAAW,CAAC,MAAM,CAAC,CAAA,EAAG,OAAO,CAAA,EAAG,aAAa,CAAA;AAAA,MACnE,KAAK,eAAA;AACH,QAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA,CAAM,MAAA,CAAO,SAAA,EAAW,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,OAAO,GAAG,aAAa,CAAA;AACzF,QAAA,IAAI,MAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA,CAAM,OAAO,UAAA,EAAY,CAAC,KAAA,CAAM,CAAC,GAAG,KAAA,CAAM,CAAC,CAAA,EAAG,OAAO,GAAG,aAAa,CAAA;AACpG,QAAA,OAAO,IAAA;AAAA,MACT,KAAK,eAAA;AAAA,MACL,KAAK,UAAA;AAAA,MACL,KAAK,SAAA,EAAW;AACd,QAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,QAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,CAAA;AAC1B,QAAA,IAAI,CAAA,KAAM,MAAA,IAAU,OAAA,CAAQ,GAAA,KAAQ,SAAA,EAAW;AAC7C,UAAA,OAAO,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,GAAA,EAAK,CAAC,MAAM,CAAC,CAAA,EAAG,OAAO,CAAA,EAAG,aAAa,CAAA;AAAA,QACrE;AACA,QAAA,IAAI,CAAA,KAAM,QAAA,IAAY,OAAA,CAAQ,GAAA,KAAQ,SAAA,EAAW;AAC/C,UAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,QAAA,EAAU,CAAC,OAAA,CAAQ,CAAA,EAAE,EAAG,OAAA,CAAQ,CAAA,EAAE,EAAG,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG;AAAA,YAC1E,OAAA,EAAS,KAAA;AAAA,YACT,SAAA,EAAW;AAAA,WACZ,CAAA;AACD,UAAA,OAAO,MAAM,MAAA,CAAO,SAAA,EAAW,CAAC,MAAM,GAAG,aAAa,CAAA;AAAA,QACxD;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,MACA;AACE,QAAA,OAAO,IAAA;AAAA;AACX,EACF,GAAG,IAAI,CAAA;AACT;AAMO,SAAS,mBAAmB,KAAA,EAAuB;AACxD,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,OAAO,OAAA,CAAgB,8BAA8B,MAAM,KAAA,CAAM,OAAO,OAAA,EAAS,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG;AAAA,IACvF,OAAA,EAAS,KAAA;AAAA,IACT,KAAA,EAAO,IAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,IAAA,EAAM;AAAA,GACP,GAAG,IAAI,CAAA;AACV;AAxHA,IAWM,aAAA,EAUA,oBAAA;AArBN,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0CAAA,GAAA;AAKA,IAAA,YAAA,EAAA;AACA,IAAA,UAAA,EAAA;AAKA,IAAM,aAAA,GAAyC;AAAA,MAC7C,WAAA,EAAa,SAAA;AAAA,MACb,WAAA,EAAa,GAAA;AAAA,MACb,aAAA,EAAe,IAAA;AAAA,MACf,IAAA,EAAM,CAAA;AAAA,MACN,KAAA,EAAO,IAAA;AAAA,MACP,SAAA,EAAW,KAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAEA,IAAM,oBAAA,GAAgD;AAAA,MACpD,GAAG,aAAA;AAAA,MACH,SAAA,EAAW,MAAA;AAAA,MACX,WAAA,EAAa;AAAA,KACf;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACLO,SAAS,gBAAA,CACd,OACA,aAAA,EACM;AACN,EAAA,IAAI,CAAC,KAAA,EAAO;AACZ,EAAA,KAAA,MAAW,CAAA,IAAK,cAAc,OAAA,EAAS;AACrC,IAAA,OAAA,CAAQ,iCAAA,EAAmC,MAAM,KAAA,CAAM,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,EACxE;AACA,EAAA,aAAA,CAAc,UAAU,EAAC;AAC3B;AAOO,SAAS,aAAA,CACd,OACA,IAAA,EACM;AACN,EAAA,IAAI,CAAC,KAAA,EAAO;AACZ,EAAA,IAAI,IAAA,CAAK,gBAAgB,OAAA,EAAS;AAChC,IAAA,OAAA,CAAQ,qCAAqC,MAAM,KAAA,CAAM,aAAa,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAC,CAAA;AACnG,IAAA,IAAA,CAAK,gBAAgB,OAAA,GAAU,IAAA;AAAA,EACjC;AACA,EAAA,IAAI,IAAA,CAAK,WAAW,OAAA,EAAS;AAC3B,IAAA,OAAA,CAAQ,gCAAgC,MAAM,KAAA,CAAM,aAAa,IAAA,CAAK,UAAA,CAAW,OAAO,CAAC,CAAA;AACzF,IAAA,IAAA,CAAK,WAAW,OAAA,GAAU,IAAA;AAAA,EAC5B;AACF;AAQO,SAAS,mBAAA,CACd,KAAA,EACA,MAAA,EACA,IAAA,EACM;AACN,EAAA,IAAI,CAAC,KAAA,EAAO;AACZ,EAAA,IAAI,IAAA,CAAK,gBAAgB,OAAA,EAAS;AAChC,IAAA,OAAA,CAAQ,qCAAqC,MAAM,KAAA,CAAM,aAAa,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAC,CAAA;AACnG,IAAA,IAAA,CAAK,gBAAgB,OAAA,GAAU,IAAA;AAAA,EACjC;AACA,EAAA,MAAM,CAAA,GAAI,OAAO,OAAA,CAAQ,OAAA;AACzB,EAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,QAAQ,CAAC,CAAA;AAC/C,EAAA,IAAI,CAAC,OAAA,EAAS;AACd,EAAA,MAAM,KAAA,GAAQ,KAAK,UAAA,CAAW,OAAA;AAC9B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC9C,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,OAAA,CAAQ,KAAA,EAAO;AACnC,EAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS;AAC5B,IAAA,IAAA,CAAK,UAAA,CAAW,OAAA,GAAU,kBAAA,CAAmB,KAAK,CAAA;AAClD,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,OAAA,EAAS;AAAA,EAChC;AACA,EAAA,IAAA,CAAK,eAAA,CAAgB,UAAU,iBAAA,CAAkB,KAAA,EAAO,SAAS,KAAA,EAAO,IAAA,CAAK,WAAW,OAAO,CAAA;AACjG;AA9EA,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iDAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AACA,IAAA,YAAA,EAAA;AACA,IAAA,UAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACmBO,SAAS,gBAAA,CAAiB,KAAA,EAAc,EAAA,EAAY,KAAA,EAA0B;AACnF,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,KAAA,CAAM,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,EAAE,EAAA,IAAM,CAAA;AAClD,IAAA;AAAA,EACF;AACA,EAAA,IAAI,CAAC,MAAM,KAAA,EAAO;AAClB,EAAA,MAAM,EAAE,MAAM,SAAA,EAAW,WAAA,EAAa,WAAW,WAAA,EAAa,GAAG,IAAA,EAAK,GAAI,KAAA,CAAM,KAAA;AAQhF,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,KAAA,CAAM,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,EAAE,EAAA,EAAI,KAAA,EAAO,EAAE,KAAA,EAAO,IAAA,EAAK,IAAK,CAAA;AAAA,EAC5E;AACA,EAAA,MAAM,MAAA,GAAkC,EAAE,GAAG,IAAA,EAAK;AAIlD,EAAA,IAAI,gBAAgB,MAAA,IAAa,MAAA,CAAO,KAAA,KAAU,MAAA,SAAkB,KAAA,GAAQ,WAAA;AAC5E,EAAA,IAAI,cAAc,MAAA,IAAa,MAAA,CAAO,KAAA,KAAU,MAAA,SAAkB,KAAA,GAAQ,SAAA;AAC1E,EAAA,IAAI,gBAAgB,MAAA,IAAa,MAAA,CAAO,KAAA,KAAU,MAAA,SAAkB,KAAA,GAAQ,WAAA;AAC5E,EAAA,IAAI,cAAc,MAAA,IAAa,MAAA,CAAO,SAAA,KAAc,MAAA,SAAkB,SAAA,GAAY,SAAA;AAClF,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,CAAA,EAAG;AAClC,IAAA,KAAA,CAAM,QAAA,CAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,OAAA,EAAS,EAAE,EAAA,EAAI,KAAA,EAAO,MAAA,EAAO,EAAG,CAAA;AAAA,EACzE;AACF;AAjDA,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8CAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC6CO,SAAS,qBAAqB,CAAA,EAAqC;AACxE,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,MAAM,CAAA,CAAE,YAAA,CAAa,OAAA;AAAA,IACnC,OAAA,EAAS,MAAM,CAAA,CAAE,QAAA,CAAS,OAAA,EAAS,cAAA,EAAe,IAAK,CAAC,GAAA,EAAK,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA;AAAA,IACxE,QAAA,EAAU,MAAM,CAAA,CAAE,KAAA,CAAM,QAAA,EAAS;AAAA,IACjC,QAAA,EAAU,MAAM,CAAA,CAAE,KAAA;AAAA,IAClB,SAAA,EAAW,CAAC,EAAA,KAAO;AAAE,MAAA,CAAA,CAAE,WAAA,CAAY,OAAA,EAAS,SAAA,CAAU,EAAE,CAAA;AAAA,IAAG,CAAA;AAAA,IAC3D,cAAA,EAAgB,CAAC,EAAA,EAAI,YAAA,KAAiB,mBAAA,CAAoB,EAAE,KAAA,CAAM,QAAA,EAAS,EAAG,EAAA,EAAI,YAAY,CAAA;AAAA,IAC9F,YAAA,EAAc,CAAC,EAAA,EAAI,KAAA,KAAU,iBAAiB,CAAA,CAAE,KAAA,EAAO,IAAI,KAAK,CAAA;AAAA,IAChE,gBAAA,EAAkB,MAAM,WAAA,CAAY,CAAA,CAAE,MAAM,QAAA,EAAU,CAAA,CACnD,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,OAAA,IAAW,EAAE,IAAA,KAAS,cAAc,EAC7D,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA;AAAA,IACrB,QAAA,EAAU,CAAC,EAAA,KAAO;AAChB,MAAA,CAAA,CAAE,aAAA,CAAc,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAC9B,MAAA,OAAO,MAAM;AAAE,QAAA,CAAA,CAAE,aAAA,CAAc,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAA;AAAA,MAAG,CAAA;AAAA,IACrD,CAAA;AAAA,IACA,gBAAA,EAAkB,CAAC,EAAA,KAAO;AACxB,MAAA,CAAA,CAAE,gBAAA,CAAiB,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACjC,MAAA,OAAO,MAAM;AAAE,QAAA,CAAA,CAAE,gBAAA,CAAiB,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAA;AAAA,MAAG,CAAA;AAAA,IACxD,CAAA;AAAA,IACA,gBAAA,EAAkB,CAAC,EAAA,KAAO;AACxB,MAAA,CAAA,CAAE,qBAAA,CAAsB,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACtC,MAAA,OAAO,MAAM;AAAE,QAAA,CAAA,CAAE,qBAAA,CAAsB,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAA;AAAA,MAAG,CAAA;AAAA,IAC7D,CAAA;AAAA,IACA,qBAAA,EAAuB,CAAC,KAAA,KAAkB;AACxC,MAAA,MAAM,IAAA,GAAO,EAAE,mBAAA,CAAoB,OAAA;AAGnC,MAAA,IAAI,IAAA,IAAQ,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAC5B,QAAA,OAAA;AAAA,UAAQ,+BAAA;AAAA,UAAiC,MACvC,kBAAkB,CAAA,CAAE,MAAA,CAAO,SAAU,IAAA,CAAK,IAAA,EAAM,IAAA,CAAK,UAAA,EAAY,KAAK;AAAA,SACxE;AAAA,MACF;AACA,MAAA,CAAA,CAAE,oBAAoB,OAAA,GAAU,IAAA;AAChC,MAAA,CAAA,CAAE,cAAc,IAAI,CAAA;AACpB,MAAA,CAAA,CAAE,YAAA,EAAa;AAAA,IACjB,CAAA;AAAA,IACA,sBAAsB,MAAM;AAC1B,MAAA,CAAA,CAAE,oBAAoB,OAAA,GAAU,IAAA;AAChC,MAAA,CAAA,CAAE,cAAc,IAAI,CAAA;AACpB,MAAA,CAAA,CAAE,YAAA,EAAa;AAAA,IACjB,CAAA;AAAA,IACA,gBAAA,EAAkB,MAAM,CAAA,CAAE,cAAA,CAAe,OAAA,CAAQ,IAAA;AAAA,IACjD,gBAAgB,CAAA,CAAE,cAAA;AAAA,IAClB,iBAAiB,CAAA,CAAE;AAAA,GACrB;AACF;AA3FA,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8CAAA,GAAA;AAAA,IAAA,UAAA,EAAA;AAGA,IAAA,YAAA,EAAA;AACA,IAAA,gBAAA,EAAA;AACA,IAAA,aAAA,EAAA;AAOA,IAAA,aAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAO,SAAS,cAAA,CAAe,UAA8B,EAAA,EAAoB;AAC/E,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,WAAY,QAAA,CAAiB,QAAA;AACnC,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,EAAA,MAAM,CAAA,GAAI,qBAAA,CAAsB,IAAA,CAAK,EAAE,CAAA;AACvC,EAAA,IAAI,CAAA,EAAG;AAEL,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAC9B,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,CAAA,CAAE,CAAC,GAAG,EAAE,CAAA;AAC7B,IAAA,MAAM,UAAU,IAAA,EAAM,OAAA;AACtB,IAAA,IAAI,KAAA,CAAM,QAAQ,OAAO,CAAA,IAAK,QAAQ,GAAG,CAAA,EAAG,OAAO,OAAA,CAAQ,GAAG,CAAA;AAC9D,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,EAAE,CAAA,IAAK,IAAA;AAC7B;AAOO,SAAS,cAAA,CACd,QAAA,EACA,KAAA,EACA,MAAA,EACe;AACf,EAAA,IAAI,CAAC,MAAA,EAAQ,EAAA,EAAI,OAAO,IAAA;AACxB,EAAA,MAAM,SAAS,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,MAAA,CAAO,EAAE,CAAC,CAAA;AAC1C,EAAA,IAAI,QAAQ,OAAO,MAAA;AACnB,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,WAAY,QAAA,CAAiB,QAAA;AACnC,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAKtB,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,EAAE,CAAA,IAAK,QAAA,EAAU;AAChC,IAAA,IAAI,EAAA,KAAO,QAAQ,OAAO,GAAA;AAE1B,IAAA,MAAM,UAAW,EAAA,EAAY,OAAA;AAC7B,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA;AAClC,MAAA,IAAI,OAAO,CAAA,EAAG,OAAO,CAAA,EAAG,GAAG,WAAW,GAAG,CAAA,CAAA;AAAA,IAC3C;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AA5DA,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8CAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;AC0BO,SAAS,eAAA,CAAgB;AAAA,EAC9B,QAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAiB;AACf,EAAAD,gBAAU,MAAM;AACd,IAAA,MAAM,IAAI,QAAA,CAAS,OAAA;AACnB,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,OAAA,CAAQ,8BAA8B,MAAM;AAC1C,MAAA,IAAI,WAAA,CAAY,QAAQ,CAAA,EAAG;AACzB,QAAA,OAAA,CAAQ,+BAA+B,MAAM,CAAA,CAAE,aAAa,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,CAAA;AAClF,QAAA,WAAA,CAAY,QAAQ,CAAA,GAAI,KAAA,CAAA;AAAA,MAC1B;AACA,MAAA,IAAI,WAAA,CAAY,QAAQ,CAAA,EAAG;AACzB,QAAA,OAAA,CAAQ,+BAA+B,MAAM,CAAA,CAAE,aAAa,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,CAAA;AAClF,QAAA,WAAA,CAAY,QAAQ,CAAA,GAAI,KAAA,CAAA;AAAA,MAC1B;AACA,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,WAAA,CAAY,OAAA,CAAQ,CAAA,GAAI,CAAA,CAAE,MAAA,CAAO,MAAA,EAAQ,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,EAAG,EAAE,WAAA,EAAa,SAAA,CAAU,SAAA,CAAU,OAAO,CAAA,EAAG,IAAA,EAAM,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,CAAA;AACpI,QAAA,WAAA,CAAY,OAAA,CAAQ,CAAA,GAAI,CAAA,CAAE,MAAA,CAAO,MAAA,EAAQ,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,EAAG,EAAE,WAAA,EAAa,SAAA,CAAU,SAAA,CAAU,OAAO,CAAA,EAAG,IAAA,EAAM,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,CAAA;AAAA,MACtI;AACA,MAAA,CAAA,CAAE,MAAA,EAAO;AAAA,IACX,CAAC,CAAA;AAAA,EAEH,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAAA,gBAAU,MAAM;AACd,IAAA,MAAM,IAAI,QAAA,CAAS,OAAA;AACnB,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,OAAA,CAAQ,8BAA8B,MAAM;AAC1C,MAAA,KAAA,MAAW,KAAK,MAAA,CAAO,MAAA,CAAO,EAAE,OAAA,IAAW,EAAE,CAAA,EAAe;AAC1D,QAAA,IAAI,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,MAAA,IAAU,CAAA,CAAE,IAAA,KAAS,MAAA,IAAW,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,CAAQ,IAAA,KAAS,MAAA,CAAA,EAAU;AAC/F,UAAA,OAAA,CAAQ,4BAAA,EAA8B,MAAM,CAAA,CAAE,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,QAC/D;AAAA,MACF;AACA,MAAA,IAAI,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,MAAA,EAAQ,EAAC,EAAG,EAAE,WAAA,EAAa,SAAA,CAAU,SAAA,CAAU,OAAO,CAAA,EAAG,aAAA,EAAe,GAAG,CAAA;AAClG,MAAA,CAAA,CAAE,MAAA,EAAO;AAAA,IACX,CAAC,CAAA;AAAA,EAEH,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AACf;AApEA,IAAA,oBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kDAAA,GAAA;AACA,IAAA,YAAA,EAAA;AACA,IAAA,UAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACuBO,SAAS,kBAAA,CAAmB;AAAA,EACjC,KAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,EAAiB;AACf,EAAAA,gBAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAA2B;AACxC,MAAA,MAAM,KAAK,QAAA,CAAS,aAAA;AACpB,MAAA,MAAM,OAAA,GAAU,CAAC,EAAE,EAAA,KAAO,EAAA,CAAG,YAAY,OAAA,IAAW,EAAA,CAAG,OAAA,KAAY,UAAA,IAAc,EAAA,CAAG,iBAAA,CAAA,CAAA;AACpF,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY;AAC7B,MAAA,IAAA,CAAK,CAAA,CAAE,WAAW,CAAA,CAAE,OAAA,KAAY,OAAO,GAAA,IAAO,CAAC,EAAE,QAAA,EAAU;AACzD,QAAA,IAAI,OAAA,EAAS;AACb,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,QAAA,KAAA,CAAM,IAAA,EAAK;AAAG,QAAA;AAAA,MACzD;AACA,MAAA,IAAA,CAAK,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,MAAc,EAAA,KAAO,GAAA,IAAO,CAAA,CAAE,QAAA,IAAc,EAAA,KAAO,GAAA,IAAO,CAAC,CAAA,CAAE,QAAA,CAAA,EAAY;AAC3F,QAAA,IAAI,OAAA,EAAS;AACb,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,QAAA,KAAA,CAAM,IAAA,EAAK;AAAG,QAAA;AAAA,MACzD;AACA,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,CAAC,OAAA,EAAS;AAClC,QAAA,IAAI,aAAA,CAAc,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACpC,UAAA,CAAA,CAAE,cAAA,EAAe;AAAG,UAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,UAAA,YAAA,EAAa;AAAA,QACxD;AACA,QAAA,IAAI,cAAA,CAAe,OAAA,CAAQ,IAAA,GAAO,CAAA,EAAG;AACnC,UAAA,CAAA,CAAE,cAAA,EAAe;AAAG,UAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,UAAA,cAAA,EAAe;AAAA,QAC1D;AAAA,MACF;AACA,MAAA,IAAA,CAAK,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,CAAA,CAAE,GAAA,KAAQ,WAAA,KAAgB,CAAC,OAAA,IAAW,cAAA,CAAe,OAAA,CAAQ,IAAA,GAAO,CAAA,EAAG;AAChG,QAAA,CAAA,CAAE,cAAA,EAAe;AAAG,QAAA,CAAA,CAAE,eAAA,EAAgB;AAAG,QAAA,eAAA,EAAgB;AAAA,MAC3D;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,iBAAiB,SAAA,EAAW,KAAA,EAAO,EAAE,OAAA,EAAS,MAAM,CAAA;AAC3D,IAAA,OAAO,MAAM,OAAO,mBAAA,CAAoB,SAAA,EAAW,OAAO,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,EAC7E,CAAA,EAAG,CAAC,KAAA,EAAO,aAAA,EAAe,gBAAgB,YAAA,EAAc,cAAA,EAAgB,eAAe,CAAC,CAAA;AAC1F;AA7DA,IAAA,uBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qDAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACyBO,SAAS,gBAAA,CAAiB,EAAE,KAAA,EAAO,WAAA,EAAY,EAAmB;AACvE,EAAA,MAAM,eAAA,GAAkBD,YAAAA,iBAA4B,IAAI,GAAA,EAAK,CAAA;AAC7D,EAAAC,gBAAU,MAAM;AACd,IAAA,MAAM,UAAU,MAAY;AAC1B,MAAA,MAAM,IAAI,WAAA,CAAY,OAAA;AACtB,MAAA,IAAI,CAAC,CAAA,EAAG;AAER,MAAA,MAAM,WAA6C,CAAA,CAAU,QAAA;AAC7D,MAAA,MAAM,IAAA,uBAAW,GAAA,EAAoB;AACrC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,GAAG,CAAA,IAAK,QAAA,EAAU;AAEjC,UAAA,MAAM,MAAO,GAAA,EAAa,EAAA;AAC1B,UAAA,IAAI,KAAK,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,GAAG,GAAG,GAAG,CAAA;AAAA,QACpC;AAAA,MACF;AACA,MAAA,eAAA,CAAgB,OAAA,GAAU,IAAA;AAAA,IAC5B,CAAA;AACA,IAAA,OAAA,EAAQ;AACR,IAAA,OAAO,KAAA,CAAM,SAAA,CAAU,MAAM,OAAA,EAAS,CAAA;AAAA,EACxC,CAAA,EAAG,CAAC,KAAA,EAAO,WAAW,CAAC,CAAA;AACvB,EAAA,OAAO,EAAE,eAAA,EAAgB;AAC3B;AA/CA,IAAA,qBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mDAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACAA,IAiFa,WAAA;AAjFb,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6CAAA,GAAA;AAAA,IAAA,YAAA;AAuBA,IAAA,UAAA,EAAA;AAIA,IAAA,gBAAA,EAAA;AACA,IAAA,UAAA,EAAA;AACA,IAAA,aAAA,EAAA;AACA,IAAA,YAAA,EAAA;AAMA,IAAA,UAAA,EAAA;AAEA,IAAA,wBAAA,EAAA;AACA,IAAA,YAAA,EAAA;AACA,IAAA,uBAAA,EAAA;AACA,IAAA,iBAAA,EAAA;AACA,IAAA,aAAA,EAAA;AACA,IAAA,mBAAA,EAAA;AAKA,IAAA,gBAAA,EAAA;AACA,IAAA,gBAAA,EAAA;AAIA,IAAA,oBAAA,EAAA;AACA,IAAA,uBAAA,EAAA;AACA,IAAA,qBAAA,EAAA;AA0BO,IAAM,WAAA,GAAca,gBAAA,CAAmC,SAASC,YAAAA,CACrE,EAAE,OAAA,EAAS,KAAA,EAAO,YAAA,EAAc,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,KAAA,IAC5D,GAAA,EACA;AACA,MAAA,MAAM,SAAA,GAAYf,YAAAA,CAAO,CAAC,CAAC,MAAM,CAAA;AAAG,MAAA,SAAA,CAAU,OAAA,GAAU,CAAC,CAAC,MAAA;AAC1D,MAAA,MAAM,cAAcgB,WAAA,EAAM,CAAE,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,GAAI,UAAA;AACjD,MAAA,MAAM,YAAA,GAAehB,aAAuB,IAAI,CAAA;AAChD,MAAA,MAAM,QAAA,GAAWA,aAAe,IAAI,CAAA;AACpC,MAAA,MAAM,MAAA,GAASA,aAAe,IAAI,CAAA;AAClC,MAAA,MAAM,WAAA,GAAcA,aAA2B,IAAI,CAAA;AACnD,MAAA,MAAM,WAAA,GAAcA,YAAAA,CAAmC,EAAE,CAAA;AAEzD,MAAA,MAAM,MAAA,GAAS,oBAA8B,YAAY,CAAA;AAGzD,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,QAAA,EAAS,CAAE,IAAA;AACrC,MAAA,MAAM,WAAA,GAAc,WAAA,CAAY,MAAA,KAAW,IAAA,GAAO,YAAY,IAAA,GAAO,eAAA;AACrE,MAAA,MAAM,WAAA,GAAcA,aAAO,QAAQ,CAAA;AAAG,MAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAC5D,MAAA,MAAM,WAAA,GAAcA,aAAO,QAAQ,CAAA;AAAG,MAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAE5D,MAAA,MAAM,cAAA,GAAiBA,YAAAA,iBAAoB,IAAI,GAAA,EAAK,CAAA;AACpD,MAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAID,eAAS,CAAC,CAAA;AAKpD,MAAAE,gBAAU,MAAM;AACd,QAAA,MAAM,GAAA,GAAM,CAAC,GAAG,cAAA,CAAe,OAAO,CAAA;AACtC,QAAA,WAAA,CAAY,OAAA,EAAS,UAAU,GAAG,CAAA;AAClC,QAAA,MAAM,SAAS,kBAAA,CAAmB,OAAA,IAAW,EAAE,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAE;AAC1D,QAAA,MAAM,OACJ,GAAA,CAAI,MAAA,KAAW,CAAA,GAAI,IAAA,GAAO,EAAE,GAAA,EAAK,MAAA,EAAQ,EAAE,CAAA,EAAG,OAAO,CAAA,GAAI,CAAA,EAAG,GAAG,MAAA,CAAO,CAAA,GAAI,GAAE,EAAE;AAChF,QAAA,qBAAA,CAAsB,OAAA,CAAQ,OAAA;AAAA,UAAQ,CAAC,EAAA,KACrC,OAAA,CAAQ,mCAAmC,MAAM,EAAA,CAAG,IAAI,CAAC;AAAA,SAC3D;AAAA,MACF,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAGlB,MAAA,MAAM,UAAA,GAAaD,YAAAA,CAAiB,EAAE,CAAA;AACtC,MAAA,MAAM,aAAA,GAAgBA,YAAAA,CAAiB,EAAE,CAAA;AACzC,MAAA,MAAM,UAAA,GAAaA,aAAe,IAAI,CAAA;AACtC,MAAA,MAAM,eAAA,GAAkBA,aAAe,IAAI,CAAA;AAC3C,MAAA,MAAM,aAAA,GAAgBA,aAAsB,IAAI,CAAA;AAChD,MAAA,MAAM,UAAA,GAAaA,aAAmE,IAAI,CAAA;AAC1F,MAAA,MAAM,WAAA,GAAcA,aAA0C,IAAI,CAAA;AAClE,MAAA,MAAM,mBAAmBA,YAAAA,CAA4C,EAAE,IAAI,IAAA,EAAM,IAAA,EAAM,GAAG,CAAA;AAC1F,MAAA,MAAM,kBAAA,GAAqBA,aAAwC,IAAI,CAAA;AACvE,MAAA,MAAM,mBAAA,GAAsBA,aAAY,IAAI,CAAA;AAK5C,MAAA,MAAM,aAAA,GAAgBA,YAAAA,iBAA4C,IAAI,GAAA,EAAK,CAAA;AAC3E,MAAA,MAAM,gBAAA,GAAmBA,YAAAA,iBAAkD,IAAI,GAAA,EAAK,CAAA;AACpF,MAAA,MAAM,qBAAA,GAAwBA,YAAAA,iBAA2D,IAAI,GAAA,EAAK,CAAA;AAElG,MAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,iBAAiB,EAAE,KAAA,EAAO,aAAa,CAAA;AAEnE,MAAA,MAAMa,eAAAA,GAAiBX,iBAAAA;AAAA,QACrB,CAAC,EAAA,KAAe,cAAA,CAAmB,WAAA,CAAY,SAAS,EAAE,CAAA;AAAA,QAC1D;AAAC,OACH;AACA,MAAA,MAAMe,eAAAA,GAAiBf,iBAAAA;AAAA,QACrB,CAAC,MAAA,KAAmB,cAAA,CAAmB,YAAY,OAAA,EAAS,eAAA,CAAgB,SAAS,MAAM,CAAA;AAAA,QAC3F,CAAC,eAAe;AAAA,OAClB;AAIA,MAAA,MAAMgB,eAAAA,GAAiBhB,iBAAAA;AAAA,QACrB,CAAC,GAAA,KAAgB,cAAA,CAAmB,SAAS,OAAA,EAAS,YAAA,CAAa,SAAS,GAAG,CAAA;AAAA,QAC/E;AAAC,OACH;AACA,MAAA,MAAMiB,UAAAA,GAAYjB,iBAAAA;AAAA,QAChB,CAAC,GAAA,KAAgB,SAAA,CAAc,SAAS,OAAA,EAAS,YAAA,CAAa,SAAS,GAAA,EAAK;AAAA,UAC1E,UAAA,CAAW,OAAA;AAAA,UACX,eAAA,CAAgB,OAAA;AAAA,UAChB,GAAG,aAAA,CAAc;AAAA,SAClB,CAAA;AAAA,QACD;AAAC,OACH;AACA,MAAA,MAAM,mBAAA,GAAsBA,iBAAAA;AAAA,QAC1B,CAAC,GAAA,EAAa,KAAA,GAAQ,EAAA,KACpB,oBAAoB,QAAA,CAAS,OAAA,EAAS,YAAA,CAAa,OAAA,EAAS,KAAA,CAAM,QAAA,EAAS,EAAGW,eAAAA,EAAgB,KAAK,KAAK,CAAA;AAAA,QAC1G,CAACA,iBAAgB,KAAK;AAAA,OACxB;AACA,MAAA,MAAM,YAAA,GAAeX,iBAAAA;AAAA,QACnB,CAAC,CAAA,KAAc,mBAAA,CAAoB,QAAA,CAAS,SAAS,CAAC,CAAA;AAAA,QACtD;AAAC,OACH;AAGA,MAAA,MAAM,YAAA,GAAeA,iBAAAA,CAAY,CAAC,EAAA,EAAY,QAAA,KAAsB;AAClE,QAAA,IAAI,CAAC,QAAA,EAAU;AAAE,UAAA,cAAA,CAAe,QAAQ,KAAA,EAAM;AAAG,UAAA,cAAA,CAAe,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,QAAG,CAAA,MAAA,IACxE,eAAe,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,EAAG,cAAA,CAAe,OAAA,CAAQ,MAAA,CAAO,EAAE,CAAA;AAAA,aACpE,cAAA,CAAe,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAClC,QAAA,WAAA,CAAY,SAAS,SAAA,CAAU,CAAC,GAAG,cAAA,CAAe,OAAO,CAAC,CAAA;AAC1D,QAAA,gBAAA,CAAiB,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,MAC/B,CAAA,EAAG,EAAE,CAAA;AACL,MAAA,MAAM,cAAA,GAAiBA,kBAAY,MAAM;AACvC,QAAA,cAAA,CAAe,QAAQ,KAAA,EAAM;AAC7B,QAAA,WAAA,CAAY,OAAA,EAAS,UAAU,IAAI,CAAA;AACnC,QAAA,gBAAA,CAAiB,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,MAC/B,CAAA,EAAG,EAAE,CAAA;AACL,MAAA,MAAM,eAAA,GAAkBA,kBAAY,MAAM;AACxC,QAAA,IAAI,cAAA,CAAe,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG;AACvC,QAAA,KAAA,CAAM,WAAA,CAAY,CAAC,QAAA,KAAa;AAC9B,UAAA,KAAA,MAAW,EAAA,IAAM,cAAA,CAAe,OAAA,EAAS,QAAA,CAAS,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,EAAE,EAAA,EAAG,EAAG,CAAA;AAAA,QACvF,CAAC,CAAA;AACD,QAAA,cAAA,CAAe,QAAQ,KAAA,EAAM;AAC7B,QAAA,WAAA,CAAY,OAAA,EAAS,UAAU,IAAI,CAAA;AACnC,QAAA,gBAAA,CAAiB,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,MAC/B,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,MAAA,MAAMkB,iBAAAA,GAAmBlB,iBAAAA;AAAA,QACvB,MAAM,gBAAA,CAAqB,QAAA,CAAS,OAAA,EAAS,aAAa,CAAA;AAAA,QAC1D;AAAC,OACH;AACA,MAAA,MAAMmB,cAAAA,GAAgBnB,iBAAAA;AAAA,QACpB,MAAM,aAAA,CAAkB,QAAA,CAAS,SAAS,EAAE,eAAA,EAAiB,YAAY,CAAA;AAAA,QACzE;AAAC,OACH;AACA,MAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACrC,QAAAmB,cAAAA,EAAc;AACd,QAAAD,iBAAAA,EAAiB;AACjB,QAAA,UAAA,CAAW,UAAU,EAAC;AACtB,QAAA,MAAA,CAAO,YAAA,EAAa;AAAA,MACtB,CAAA,EAAG,CAACA,iBAAAA,EAAkBC,cAAAA,EAAe,MAAM,CAAC,CAAA;AAC5C,MAAA,MAAM,cAAA,GAAiBnB,iBAAAA;AAAA,QACrB,MAAM,mBAAA,CAAoB,QAAA,CAAS,OAAA,EAAS,MAAA,EAAQ;AAAA,UAClD,aAAA;AAAA,UAAe,UAAA;AAAA,UAAY,eAAA;AAAA,UAAiB;AAAA,SAC7C,CAAA;AAAA,QACD,CAAC,MAAM;AAAA,OACT;AAGA,MAAA,MAAM,GAAG,OAAO,CAAA,GAAIH,eAAwB,IAAI,CAAA;AAChD,MAAA,MAAM,YAAA,GAAeC,aAA6C,IAAI,CAAA;AACtE,MAAA,MAAM,SAAA,GAAYE,iBAAAA,CAAY,CAAC,GAAA,KAAgB;AAC7C,QAAA,IAAI,YAAA,CAAa,OAAA,EAAS,YAAA,CAAa,YAAA,CAAa,OAAO,CAAA;AAC3D,QAAA,OAAA,CAAQ,GAAG,CAAA;AACX,QAAA,YAAA,CAAa,UAAU,UAAA,CAAW,MAAM,OAAA,CAAQ,IAAI,GAAG,IAAI,CAAA;AAAA,MAC7D,CAAA,EAAG,EAAE,CAAA;AACL,MAAAD,eAAAA,CAAU,MAAM,MAAM;AAAE,QAAA,IAAI,YAAA,CAAa,OAAA,EAAS,YAAA,CAAa,YAAA,CAAa,OAAO,CAAA;AAAA,MAAG,CAAA,EAAG,EAAE,CAAA;AAE3F,MAAA,MAAM,YAAA,GAAeC,iBAAAA;AAAA,QACnB,CAAC,IAAA,KAAyB,SAAA,CAAe,KAAA,CAAM,QAAA,IAAY,IAAI,CAAA;AAAA,QAC/D,CAAC,KAAK;AAAA,OACR;AAGA,MAAA,MAAM,aAAA,GAAgBA,iBAAAA;AAAA,QACpB,CAAC,IAAY,YAAA,KACX,mBAAA,CAAoB,MAAM,QAAA,EAAS,EAAG,IAAI,YAAY,CAAA;AAAA,QACxD,CAAC,KAAK;AAAA,OACR;AACA,MAAA,MAAM,UAAA,GAAaA,iBAAAA,CAAY,CAAC,IAAA,KAAiE;AAC/F,QAAA,MAAM,IAAA,GAAO,aAAA,CAAc,IAAA,CAAK,EAAA,EAAI,KAAK,YAAY,CAAA;AACrD,QAAA,IAAI,CAAC,IAAA,EAAM;AACX,QAAA,aAAA,CAAc,OAAA,CAAQ,OAAA,CAAQ,CAAC,EAAA,KAAO,OAAA,CAAQ,2BAA2B,MAAM,EAAA,CAAG,IAAI,CAAC,CAAC,CAAA;AAAA,MAC1F,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAClB,MAAA,MAAM,aAAA,GAAgBA,iBAAAA,CAAY,CAAC,IAAA,KAA+B;AAChE,QAAA,gBAAA,CAAiB,OAAA,CAAQ,OAAA,CAAQ,CAAC,EAAA,KAAO,OAAA,CAAQ,8BAA8B,MAAM,EAAA,CAAG,IAAI,CAAC,CAAC,CAAA;AAAA,MAChG,CAAA,EAAG,EAAE,CAAA;AAGL,MAAA,MAAM,MAAA,GAASF,aAA0B,IAAI,CAAA;AAC7C,MAAA,MAAA,CAAO,OAAA,GAAU;AAAA,QACf,QAAA;AAAA,QACA,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,UAAA;AAAA,QACA,eAAe,MAAA,CAAO,aAAA;AAAA,QACtB,aAAA;AAAA,QACA,WAAA;AAAA,QACA,cAAA;AAAA,QACA,UAAA;AAAA,QACA,WAAA;AAAA,QACA,gBAAA;AAAA,QACA,kBAAA;AAAA,QACA,mBAAA;AAAA,QACA,UAAA;AAAA,QACA,eAAA;AAAA,QACA,aAAA;AAAA,QACA,MAAA;AAAA,QACA,KAAA;AAAA,QACA,cAAA,EAAAiB,eAAAA;AAAA,QACA,cAAA,EAAAJ,eAAAA;AAAA,QACA,cAAA,EAAAK,eAAAA;AAAA,QACA,SAAA,EAAAC,UAAAA;AAAA,QACA,YAAA;AAAA,QACA,mBAAA;AAAA,QACA,YAAA;AAAA,QACA,cAAA;AAAA,QACA,SAAA,EAAW,YAAA;AAAA,QACX,YAAA;AAAA,QACA,gBAAA,EAAAC,iBAAAA;AAAA,QACA,cAAA;AAAA,QACA,SAAA;AAAA,QACA,KAAA;AAAA,QACA,aAAA;AAAA,QACA,UAAA;AAAA,QACA,iBAAiB,MAAM;AAAA,QAA4B,CAAA;AAAA,QACnD,gBAAA,EAAkB,CAAC,EAAA,KAAO,gBAAA,CAAiB,EAAE;AAAA,OAC/C;AAEA,MAAA,kBAAA,CAAmB;AAAA,QACjB,KAAA;AAAA,QACA,eAAe,MAAA,CAAO,aAAA;AAAA,QACtB,cAAA;AAAA,QACA,YAAA;AAAA,QACA,cAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,eAAA,CAAgB,EAAE,QAAA,EAAU,WAAA,EAAa,SAAA,EAAW,QAAA,EAAU,UAAU,CAAA;AAExE,MAAA,MAAM,gBAAA,GAAmBlB,iBAAAA,CAAY,CAAC,CAAA,KAAgB;AACpD,QAAA,YAAA,EAAa;AACb,QAAA,MAAA,CAAO,QAAQ,CAAC,CAAA;AAChB,QAAA,MAAM,IAAI,QAAA,CAAS,OAAA;AACnB,QAAA,IAAI,CAAA,EAAG,OAAA,CAAQ,yBAAA,EAA2B,MAAM;AAC9C,UAAA,IAAI,EAAE,IAAA,EAAM,GAAA,IAAO,IAAA,CAAK,GAAA,CAAI,UAAW,CAAA,KAAM,QAAA;AAAA,QAC/C,CAAC,CAAA;AAAA,MACH,CAAA,EAAG,CAAC,YAAA,EAAc,MAAM,CAAC,CAAA;AAGzB,MAAAD,gBAAU,MAAM;AACd,QAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,OAAA,KAAY,YAAA,mBAA+B,YAAY,CAAA;AAAA,MAE5E,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAGjB,MAAAA,gBAAU,MAAM;AACd,QAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,aAAa,OAAA,EAAS;AAC5D,QAAA,IAAI,SAAA,GAAY,KAAA;AAChB,QAAA,IAAI,YAAA,GAAoC,IAAA;AACxC,QAAA,IAAI,SAAA,GAAiC,IAAA;AACrC,QAAA,KAAA,CAAM,YAAY;AAChB,UAAA,MAAM,EAAE,GAAA,EAAK,KAAA,EAAO,SAAQ,GAAI,MAAM,aAAa,WAAA,EAAa;AAAA,YAC9D,KAAA,EAAO,cAAA;AAAA,YACP,QAAA,EAAU,EAAE,uBAAA,EAAyB,IAAA,EAAK;AAAA,YAC1C,YAAA,EAAc;AAAA,cACZ,aAAa,WAAA,CAAY,IAAA;AAAA,cACzB,IAAA,EAAM,KAAA;AAAA,cAAO,IAAA,EAAM,KAAA;AAAA,cACnB,aAAA,EAAe,KAAA;AAAA,cAAO,cAAA,EAAgB,IAAA;AAAA,cACtC,eAAA,EAAiB,IAAA;AAAA,cACjB,GAAA,EAAK,EAAE,OAAA,EAAS,IAAA,EAAM,WAAW,KAAA,EAAM;AAAA,cACvC,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,EAAM;AAAA,cACrB,WAAW,EAAE,QAAA,EAAU,GAAG,KAAA,EAAO,CAAA,EAAG,OAAO,EAAA;AAAG,aAChD;AAAA,YACA,iBAAA,EAAmB,CAAC,IAAA,KAAS;AAI3B,cAAA,IAAI,KAAK,KAAA,EAAO,IAAA,CAAK,MAAM,WAAA,GAAc,UAAA,CAAW,UAAU,OAAO,CAAA;AACrE,cAAA,IAAI,KAAK,IAAA,EAAM,IAAA,CAAK,KAAK,WAAA,GAAc,UAAA,CAAW,UAAU,OAAO,CAAA;AAAA,YACrE;AAAA,WACD,CAAA;AACD,UAAA,IAAI,SAAA,IAAa,CAAC,YAAA,CAAa,OAAA,EAAS;AAAE,YAAA,OAAA,EAAQ;AAAG,YAAA;AAAA,UAAQ;AAC7D,UAAA,MAAA,CAAO,OAAA,GAAU,GAAA;AACjB,UAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AACnB,UAAA,SAAA,GAAY,OAAA;AAEZ,UAAA,WAAA,CAAY,OAAA,GAAU,IAAI,WAAA,CAAY,KAAA,EAAO,KAAA,EAAO;AAAA,YAClD,KAAA,EAAO,UAAA,CAAW,SAAA,CAAU,OAAO;AAAA,WACpC,CAAA;AAGD,UAAA,IAAI,aAAa,OAAA,EAAS;AACxB,YAAA,YAAA,GAAe,kBAAA,CAAmB,YAAA,CAAa,OAAA,EAAS,KAAA,EAAO,cAAc,CAAA;AAAA,UAC/E;AAEA,UAAA,IAAI,WAAA,CAAY,OAAA,EAAS,OAAA,CAAQ,oBAAA,EAAsB,MAAM;AAC3D,YAAA,WAAA,CAAY,OAAA,CAAQ,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,MAAA,EAAQ,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,EAAG,EAAE,WAAA,EAAa,SAAA,CAAU,SAAA,CAAU,OAAO,CAAA,EAAG,IAAA,EAAM,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,CAAA;AACxI,YAAA,WAAA,CAAY,OAAA,CAAQ,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,MAAA,EAAQ,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,EAAG,EAAE,WAAA,EAAa,SAAA,CAAU,SAAA,CAAU,OAAO,CAAA,EAAG,IAAA,EAAM,EAAA,EAAI,SAAA,EAAW,KAAA,EAAO,CAAA;AAAA,UAC1I,CAAC,CAAA;AACD,UAAA,IAAI,YAAY,OAAA,EAAS,OAAA;AAAA,YAAQ,oBAAA;AAAA,YAAsB,MACrD,KAAA,CAAM,MAAA,CAAO,MAAA,EAAQ,EAAC,EAAG,EAAE,WAAA,EAAa,SAAA,CAAU,SAAA,CAAU,OAAO,CAAA,EAAG,aAAA,EAAe,GAAG;AAAA,WAC1F;AAEA,UAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KACZ,CAAC,CAAA,KAAc;AAAE,YAAA,IAAI,MAAA,CAAO,OAAA,EAAS,CAAA,CAAE,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,UAAG,CAAA;AAC7D,UAAA,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,IAAA,CAAK,UAAU,CAAC,CAAA;AACjC,UAAA,KAAA,CAAM,EAAA,CAAG,IAAA,EAAM,IAAA,CAAK,QAAQ,CAAC,CAAA;AAC7B,UAAA,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,IAAA,CAAK,UAAU,CAAC,CAAA;AAKjC,UAAA,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,CAAC,CAAA,KAAc;AAC9B,YAAA,MAAM,YAAY,YAAA,CAAa,OAAA;AAC/B,YAAA,IAAI,CAAC,SAAA,EAAW;AAChB,YAAA,MAAM,IAAA,GAAO,SAAA,CAAc,QAAA,CAAS,OAAA,EAAS,WAAW,CAAA,EAAG;AAAA,cACzD,UAAA,CAAW,OAAA;AAAA,cACX,eAAA,CAAgB,OAAA;AAAA,cAChB,GAAG,aAAA,CAAc;AAAA,aAClB,CAAA;AACD,YAAA,SAAA,CAAU,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,IAAI,SAAA,GAAY,EAAA;AAAA,UACzD,CAAC,CAAA;AAED,UAAA,OAAA,IAAU;AAAA,QACZ,CAAA,GAAG;AACH,QAAA,OAAO,MAAM;AACX,UAAA,SAAA,GAAY,IAAA;AACZ,UAAA,IAAI,YAAA,EAAc;AAAE,YAAA,YAAA,EAAa;AAAG,YAAA,YAAA,GAAe,IAAA;AAAA,UAAM;AACzD,UAAA,IAAI,aAAA,CAAc,WAAW,IAAA,EAAM;AAAE,YAAA,oBAAA,CAAqB,cAAc,OAAO,CAAA;AAAG,YAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AAAA,UAAM;AAChH,UAAA,WAAA,CAAY,SAAS,OAAA,EAAQ;AAC7B,UAAA,WAAA,CAAY,OAAA,GAAU,IAAA;AACtB,UAAA,IAAI,SAAA,EAAW;AAAE,YAAA,SAAA,EAAU;AAAG,YAAA,SAAA,GAAY,IAAA;AAAA,UAAM;AAChD,UAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,QACrB,CAAA;AAAA,MAEF,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAKhB,MAAAqB,yBAAA;AAAA,QACE,GAAA;AAAA,QACA,MAAM,oBAAA,CAAqB;AAAA,UACzB,YAAA;AAAA,UAAc,QAAA;AAAA,UAAU,WAAA;AAAA,UACxB,aAAA;AAAA,UAAe,gBAAA;AAAA,UAAkB,qBAAA;AAAA,UACjC,cAAA;AAAA,UAAgB,mBAAA;AAAA,UAAqB,MAAA;AAAA,UACrC,KAAA;AAAA,UACA,YAAA;AAAA,UAAc,cAAA;AAAA,UAAgB,eAAA;AAAA,UAC9B;AAAA,SACD,CAAA;AAAA,QAED,CAAC,KAAA,EAAO,cAAA,EAAgB,eAAA,EAAiB,cAAc,aAAa;AAAA,OACtE;AAEA,MAAA,uBACE5B,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,YAAA;AAAA,UACL,EAAA,EAAI,WAAA;AAAA,UACJ,aAAA,EAAY,mBAAA;AAAA,UACZ,SAAA,EAAU,yBAAA;AAAA,UACV,KAAA,EAAO,EAAE,WAAA,EAAa,MAAA;AAAO;AAAA,OAC/B;AAAA,IAEJ,CAAC,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpaD,IAGa,cAAA;AAHb,IAAA,sBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,wCAAA,GAAA;AAGO,IAAM,cAAA,GAAiB;AAAA,MAC5B,SAAA;AAAA;AAAA,MACA,SAAA;AAAA;AAAA,MACA,SAAA;AAAA;AAAA,MACA,SAAA;AAAA;AAAA,MACA,SAAA;AAAA;AAAA,MACA,SAAA;AAAA;AAAA,MACA,SAAA;AAAA;AAAA,MACA;AAAA;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;ACEA,SAAS,UAAU,KAAA,EAAwB;AACzC,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,MAAA,CAAO,YAAY,OAAO,KAAA;AAChE,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA,CAAE,OAAA;AAAA,EAClC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAMO,SAAS,WAAA,GAA2B;AACzC,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIK,eAAsB,OAAO;AAAA,IACrD,QAAA,EAAU,UAAU,YAAY,CAAA;AAAA,IAChC,WAAA,EAAa,UAAU,cAAc;AAAA,GACvC,CAAE,CAAA;AAEF,EAAAE,gBAAU,MAAM;AACd,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,UAAA,EAAY;AACzD,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,YAAY,CAAA;AAC1C,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,cAAc,CAAA;AAC5C,IAAA,MAAM,SAAS,MAAM;AACnB,MAAA,QAAA,CAAS,EAAE,QAAA,EAAU,GAAA,CAAI,SAAS,WAAA,EAAa,GAAA,CAAI,SAAS,CAAA;AAAA,IAC9D,CAAA;AACA,IAAA,MAAA,EAAO;AACP,IAAA,GAAA,CAAI,gBAAA,CAAiB,UAAU,MAAM,CAAA;AACrC,IAAA,GAAA,CAAI,gBAAA,CAAiB,UAAU,MAAM,CAAA;AACrC,IAAA,OAAO,MAAM;AACX,MAAA,GAAA,CAAI,mBAAA,CAAoB,UAAU,MAAM,CAAA;AACxC,MAAA,GAAA,CAAI,mBAAA,CAAoB,UAAU,MAAM,CAAA;AAAA,IAC1C,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,KAAA;AACT;AAlDA,IAIM,YAAA,EACA,cAAA;AALN,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kCAAA,GAAA;AAAA,IAAA,YAAA;AAIA,IAAM,YAAA,GAAe,oBAAA;AACrB,IAAM,cAAA,GAAiB,eAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACkEvB,SAAS,YAAY,CAAA,EAAmB;AACtC,EAAA,OAAO,OAAO,CAAC,CAAA,CAAE,KAAA,CAAM,EAAE,EAAE,GAAA,CAAI,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,CAAC,CAAA,IAAK,CAAC,CAAA,CAAE,KAAK,EAAE,CAAA;AACpE;AAEA,SAAS,uBAAuB,CAAA,EAAmB;AACjD,EAAA,IAAI,IAAI,CAAA,CAAE,MAAA;AACV,EAAA,OAAO,CAAA,GAAI,KAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,GAAI,CAAC,CAAC,CAAA,EAAG,CAAA,EAAA;AACvC,EAAA,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACrB;AAEA,SAAS,gBAAA,CAAiB,MAAc,QAAA,EAA+B;AACrE,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,IAAI,GAAG,OAAO,IAAA;AAChC,EAAA,MAAM,IAAA,GAAO,sBAAA,CAAuB,IAAI,CAAA,IAAK,IAAA;AAC7C,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,EAAM,CAAA,EAAA,EAAK;AAC7B,IAAA,MAAM,SAAA,GAAY,IAAA,GAAO,WAAA,CAAY,CAAC,CAAA;AACtC,IAAA,IAAI,CAAC,QAAA,CAAS,GAAA,CAAI,SAAS,GAAG,OAAO,SAAA;AAAA,EACvC;AACA,EAAA,OAAO,IAAA;AACT;AA1FA,IAkDM,YAAA,EAMA,aAAA,EAEA,YAAA,EAUA,UAAA,EACA,SA2BA,KAAA,EAqBO,iBAAA;AArHb,IAAA,sBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qDAAA,GAAA;AAAA,IAAA,YAAA;AAGA,IAAA,sBAAA,EAAA;AACA,IAAA,gBAAA,EAAA;AA8CA,IAAM,YAAA,GAAwD;AAAA,MAC5D,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,kBAAA,EAAW;AAAA,MAC9B,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,sBAAA,EAAU;AAAA,MAC7B,EAAE,KAAA,EAAO,CAAA,EAAG,KAAA,EAAO,kBAAA;AAAW,KAChC;AAEA,IAAM,aAAA,GAAgB,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAE9B,IAAM,YAAA,GAA4D;AAAA,MAChE,EAAE,KAAA,EAAO,GAAA,EAAK,MAAA,EAAQ,QAAA,EAAI;AAAA,MAC1B,EAAE,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,QAAA,EAAI;AAAA,MAC/B,EAAE,KAAA,EAAO,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAI;AAAA,MAC9B,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,QAAA;AAAI,KAC/B;AAKA,IAAM,UAAA,GAAa,CAAC,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAG,CAAA;AACpE,IAAM,OAAA,GAAU,IAAI,GAAA,CAAI,UAAU,CAAA;AA2BlC,IAAM,KAAA,GAAQ;AAAA,MACZ,uBACEN,eAAAA,CAAC,SAAI,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,OAAM,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EACvI,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,6BAAA,EAA8B,CAAA;AAAA,wBACtCA,eAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mCAAkC,IAAA,EAAK,cAAA,EAAe,QAAO,MAAA,EAAO;AAAA,OAAA,EAC9E,CAAA;AAAA,MAEF,KAAA,kBACEA,cAAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,0BAAAA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAG,IAAA,EAAK,EAAA,EAAG,MAAK,CAAA,EAAE,GAAA,EAAI,IAAA,EAAK,cAAA,EAAe,CAAA,EAAE,CAAA;AAAA,MAEtG,sBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,MAAK,MAAA,EAAO,MAAA,EAAO,gBAAe,WAAA,EAAY,GAAA,EAAI,eAAc,OAAA,EAAQ,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,WAAA,EAAY,GAAA,EAAI,CAAA;AAAA,wBAAEA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,WAAA,EAAY,GAAA,EAAI,CAAA;AAAA,wBAAEA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,WAAA,EAAY,KAAA,EAAM;AAAA,OAAA,EAAE,CAAA;AAAA,MAE/R,IAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,cAAA,EAAe,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,GAAA,EAAI,CAAA,EAAE,IAAA,EAAK,QAAA,EAAS,IAAA,EAAK,UAAA,EAAW,OAAA,EAAQ,UAAA,EAAW,KAAA,EAAM,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,wBAAOA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,IAAA,EAAK,CAAA,EAAE,IAAA,EAAK,QAAA,EAAS,IAAA,EAAK,UAAA,EAAW,OAAA,EAAQ,UAAA,EAAW,OAAM,QAAA,EAAA,GAAA,EAAC;AAAA,OAAA,EAAO,CAAA;AAAA,MAEjO,uBACEC,eAAAA,CAAC,SAAI,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,OAAM,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EAAQ,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,cAAA,EAAe,CAAA;AAAA,wBAAEA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,6DAAA,EAA8D,CAAA;AAAA,wBAAEA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,wBAAEA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,OAAA,EAAE;AAAA,KAE/U;AAEO,IAAM,iBAAA,GAAqC,CAAC,KAAA,KAAU;AAC3D,MAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,MAAA,EAAQ,aAAY,GAAI,KAAA;AAC3D,MAAA,MAAM,OAAA,GAAUM,aAAuB,IAAI,CAAA;AAC3C,MAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAID,eAAkB,IAAI,CAAA;AACpD,MAAA,MAAM,EAAE,QAAA,EAAS,GAAI,WAAA,EAAY;AAIjC,MAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAA+C,IAAI,CAAA;AACjF,MAAAwB,qBAAA,CAAgB,MAAM;AACpB,QAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,QAAA,MAAM,MAAA,GAAS,CAAA;AACf,QAAA,IAAI,QAAA,EAAU;AAEZ,UAAA,MAAMC,KAAAA,GAAO,OAAA,CAAQ,OAAA,EAAS,qBAAA,EAAsB;AACpD,UAAA,MAAMC,EAAAA,GAAID,OAAM,KAAA,IAAS,GAAA;AACzB,UAAA,MAAME,QAAO,IAAA,CAAK,GAAA,CAAI,SAAS,MAAA,CAAO,UAAA,GAAaD,MAAK,CAAC,CAAA;AACzD,UAAA,MAAME,OAAM,MAAA,CAAO,WAAA,IAAeH,KAAAA,EAAM,MAAA,IAAU,MAAM,MAAA,GAAS,EAAA;AACjE,UAAA,UAAA,CAAW,EAAE,MAAAE,KAAAA,EAAM,GAAA,EAAK,KAAK,GAAA,CAAI,MAAA,EAAQC,IAAG,CAAA,EAAG,CAAA;AAC/C,UAAA;AAAA,QACF;AACA,QAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,EAAS,qBAAA,EAAsB;AACpD,QAAA,MAAM,CAAA,GAAI,MAAM,KAAA,IAAS,GAAA;AACzB,QAAA,MAAM,CAAA,GAAI,MAAM,MAAA,IAAU,EAAA;AAC1B,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,UAAA,GAAa,CAAA,GAAI,MAAM,CAAC,CAAA;AAChF,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,WAAA,GAAc,CAAA,GAAI,MAAM,CAAC,CAAA;AAChF,QAAA,UAAA,CAAW,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA;AAAA,MAC1B,CAAA,EAAG,CAAC,MAAA,CAAO,CAAA,EAAG,OAAO,CAAA,EAAG,QAAA,EAAU,OAAO,CAAC,CAAA;AAE1C,MAAA,MAAM,WAAA,GACJ,KAAA,CAAM,IAAA,KAAS,OAAA,GAAU,KAAA,CAAM,WAAA,GAAe,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,IAAA,KAAS,QAAA,GAAY,MAAM,WAAA,GAAc,EAAA;AACxH,MAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI5B,eAAiB,WAAW,CAAA;AAEpD,MAAAE,gBAAU,MAAM;AACd,QAAA,OAAA,CAAQ,WAAW,CAAA;AAAA,MAErB,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,MAAAA,gBAAU,MAAM;AACd,QAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,UAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AAAE,YAAA,CAAA,CAAE,cAAA,EAAe;AAAG,YAAA,OAAA,EAAQ;AAAA,UAAG;AAAA,QAC3D,CAAA;AAGA,QAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAoB;AACzC,UAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,EAAS,SAAS,CAAA,CAAE,MAAc,GAAG,OAAA,EAAQ;AAAA,QAC5D,CAAA;AACA,QAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,QAAA,QAAA,CAAS,iBAAiB,aAAA,EAAe,aAAA,EAAe,EAAE,OAAA,EAAS,MAAM,CAAA;AACzE,QAAA,OAAO,MAAM;AACX,UAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAC7C,UAAA,QAAA,CAAS,oBAAoB,aAAA,EAAe,aAAA,EAAe,EAAE,OAAA,EAAS,MAA8B,CAAA;AAAA,QACtG,CAAA;AAAA,MACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,MAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAc;AAC/B,QAAA,QAAA,CAAS,EAAE,KAAA,EAAO,EAAE,WAAA,EAAa,GAAG,SAAA,EAAW,KAAA,CAAM,IAAA,KAAS,QAAA,GAAW,MAAA,GAAS,CAAA,EAAG,KAAA,EAAO,CAAA,IAAK,CAAA;AAAA,MACnG,CAAA;AACA,MAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAc,QAAA,CAAS,EAAE,OAAO,EAAE,IAAA,EAAM,CAAA,EAAE,EAAG,CAAA;AAC/D,MAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAc,QAAA,CAAS,EAAE,OAAO,EAAE,WAAA,EAAa,CAAA,EAAE,EAAG,CAAA;AACvE,MAAA,MAAM,QAAA,GAAW,CAAC,CAAA,KAAiB,QAAA,CAAS,EAAE,OAAO,EAAE,IAAA,EAAM,CAAA,EAAE,EAAG,CAAA;AAElE,MAAA,MAAM,WAAA,GAAe,KAAA,CAAM,IAAA,KAAS,OAAA,IAAW,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,IAAA,KAAS,QAAA,GAAY,KAAA,CAAM,WAAA,GAAc,EAAA;AACvH,MAAA,MAAM,aAAa,MAAM;AACvB,QAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,QAAA,IAAI,YAAY,WAAA,EAAa;AAE7B,QAAA,IAAI,KAAA,GAAQ,OAAA;AACZ,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAA,CAAK,WAAA,IAAc,IAAK,EAAC,EAAG,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,KAAM,WAAW,CAAC,CAAA;AAC/E,UAAA,KAAA,GAAQ,gBAAA,CAAiB,SAAS,MAAM,CAAA;AAAA,QAC1C;AACA,QAAA,IAAI,KAAA,KAAU,IAAA,EAAM,OAAA,CAAQ,KAAK,CAAA;AACjC,QAAA,QAAA,CAAS,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,IAAS,CAAA;AAAA,MACrC,CAAA;AAEA,MAAA,MAAM,eAAA,GAAkB,CAAC,IAAA,KAAkB,QAAA,CAAS,EAAE,OAAO,EAAE,SAAA,EAAW,IAAA,EAAK,EAAG,CAAA;AAClF,MAAA,MAAM,kBAAkB,CAAC,IAAA,KAAkB,SAAS,EAAE,UAAA,EAAY,MAAM,CAAA;AAExE,MAAA,MAAM,WAAW,MAAM;AAAE,QAAA,QAAA,CAAS,EAAE,MAAA,EAAQ,IAAA,EAAM,CAAA;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAG,CAAA;AAEhE,MAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAe,UAAA,CAAW,CAAC,GAAA,KAAS,GAAA,KAAQ,CAAA,GAAI,IAAA,GAAO,CAAE,CAAA;AAEhF,MAAA,MAAM,eAAe,KAAA,CAAM,YAAA;AAC3B,MAAA,MAAM,cAAc,KAAA,CAAM,WAAA;AAC1B,MAAA,MAAM,eAAe,KAAA,CAAM,YAAA;AAG3B,MAAA,MAAM,qBAAqBE,aAAAA,CAAQ,MAAM,YAAA,EAAc,CAAC,YAAY,CAAC,CAAA;AAErE,MAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAI5C,MAAA,MAAM,OAAA,GAAU,CAAC,EAAE,EAAA,EAAI,KAAA,EAAO,MAAM,MAAA,EAAQ,OAAA,EAAS,cAAA,EAAe,qBAIlER,eAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,cAAA,EAAc,EAAA;AAAA,UACd,eAAA,EAAe,EAAA;AAAA,UACf,YAAA,EAAY,KAAA;AAAA,UACZ,cAAA,EAAc,CAAC,CAAC,MAAA;AAAA,UAChB,OAAA;AAAA,UACA,SAAA,EAAW,CAAA,wEAAA,EACT,MAAA,GAAS,6BAAA,GAAgC,mCAC3C,CAAA,CAAA;AAAA,UAEC,QAAA,EAAA;AAAA,YAAA,IAAA;AAAA,YACA,kCACCD,cAAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAW,IAAA;AAAA,gBACX,SAAA,EAAU,oEAAA;AAAA,gBACV,KAAA,EAAO,EAAE,UAAA,EAAY,cAAA;AAAe;AAAA;AACtC;AAAA;AAAA,OAEJ;AAGF,MAAA,MAAM,GAAA,GAAM,WAAW,EAAE,IAAA,EAAM,OAAO,CAAA,EAAG,GAAA,EAAK,OAAO,CAAA,EAAE;AACvD,MAAA,MAAM,uBACJC,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,OAAA;AAAA,UACL,iBAAA,EAAgB,MAAA;AAAA,UAChB,SAAA,EAAW,CAAA,EAAG,MAAA,GAAS,cAAA,GAAiB,EAAE,CAAA,0CAAA,CAAA;AAAA,UAC1C,OAAO,EAAE,IAAA,EAAM,IAAI,IAAA,EAAM,GAAA,EAAK,IAAI,GAAA,EAAI;AAAA,UACtC,IAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAW,kDAAA;AAAA,UAGX,QAAA,EAAA;AAAA,4BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iHAAA,EACb,QAAA,EAAA;AAAA,8BAAAD,eAAC,OAAA,EAAA,EAAQ,EAAA,EAAG,SAAQ,KAAA,EAAM,QAAA,EAAM,MAAM,KAAA,CAAM,KAAA,EAAO,MAAA,EAAQ,OAAA,KAAY,SAAS,OAAA,EAAS,MAAM,cAAc,OAAO,CAAA,EAAG,gBAAgB,kBAAA,EAAoB,CAAA;AAAA,8BAC3JA,cAAAA,CAAC,OAAA,EAAA,EAAQ,EAAA,EAAG,OAAA,EAAQ,OAAM,WAAA,EAAO,IAAA,EAAM,KAAA,CAAM,KAAA,EAAO,QAAQ,OAAA,KAAY,OAAA,EAAS,SAAS,MAAM,aAAA,CAAc,OAAO,CAAA,EAAG,CAAA;AAAA,8BACxHA,cAAAA,CAAC,OAAA,EAAA,EAAQ,EAAA,EAAG,MAAA,EAAO,OAAM,qBAAA,EAAS,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,QAAQ,OAAA,KAAY,MAAA,EAAQ,SAAS,MAAM,aAAA,CAAc,MAAM,CAAA,EAAG,CAAA;AAAA,8BACtHA,cAAAA,CAAC,OAAA,EAAA,EAAQ,EAAA,EAAG,MAAA,EAAO,OAAM,QAAA,EAAM,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,QAAQ,OAAA,KAAY,MAAA,EAAQ,SAAS,MAAM,aAAA,CAAc,MAAM,CAAA,EAAG,CAAA;AAAA,8BACnHA,cAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,WAAU,8BAAA,EAA+B,CAAA;AAAA,8BAC3DA,cAAAA,CAAC,OAAA,EAAA,EAAQ,EAAA,EAAG,QAAA,EAAS,KAAA,EAAM,QAAA,EAAM,IAAA,EAAM,KAAA,CAAM,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU;AAAA,aAAA,EACzE,CAAA;AAAA,YAGC,OAAA,oBACCC,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0FAAA,EACZ,QAAA,EAAA;AAAA,cAAA,OAAA,KAAY,OAAA,oBACXA,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACb,QAAA,EAAA;AAAA,gCAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAyC,QAAA,EAAA,QAAA,EAAG,CAAA;AAAA,gCAC5DA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBACZ,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,qBACnBA,cAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBAEC,YAAA,EAAY,UAAO,CAAC,CAAA,CAAA;AAAA,oBACpB,OAAA,EAAS,MAAM,SAAA,CAAU,CAAC,CAAA;AAAA,oBAC1B,SAAA,EAAW,CAAA,uBAAA,EAA0B,YAAA,KAAiB,CAAA,GAAI,+CAA+C,kBAAkB,CAAA,CAAA;AAAA,oBAC3H,KAAA,EAAO,EAAE,UAAA,EAAY,CAAA;AAAE,mBAAA;AAAA,kBAJlB;AAAA,iBAMR,CAAA,EACH;AAAA,eAAA,EACF,CAAA;AAAA,cAGD,YAAY,OAAA,oBACXC,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACb,QAAA,EAAA;AAAA,gCAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAyC,QAAA,EAAA,WAAA,EAAI,CAAA;AAAA,gBAC5D,KAAA,CAAM,IAAA,KAAS,OAAA,mBACdA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACZ,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,qBACjBA,cAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBAEC,YAAA,EAAY,CAAA,QAAA,EAAQ,CAAA,CAAE,KAAK,CAAA,CAAA;AAAA,oBAC3B,OAAA,EAAS,MAAM,QAAA,CAAS,CAAA,CAAE,KAAK,CAAA;AAAA,oBAC/B,WAAW,CAAA,+BAAA,EAAmC,KAAA,CAAqB,gBAAgB,CAAA,CAAE,KAAA,GAAQ,qCAAqC,2BAA2B,CAAA,CAAA;AAAA,oBAE5J,QAAA,EAAA,CAAA,CAAE;AAAA,mBAAA;AAAA,kBALE,CAAA,CAAE;AAAA,iBAOV,CAAA,EACH,CAAA,mBAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACZ,QAAA,EAAA,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,qBACjBA,cAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBAEC,YAAA,EAAY,CAAA,UAAA,EAAQ,CAAA,CAAE,KAAA,CAAM,aAAa,CAAA,CAAA;AAAA,oBACzC,OAAA,EAAS,MAAM,QAAA,CAAS,CAAA,CAAE,KAAK,CAAA;AAAA,oBAC/B,WAAW,CAAA,4CAAA,EAA+C,WAAA,KAAgB,CAAA,CAAE,KAAA,GAAQ,qCAAqC,2BAA2B,CAAA,CAAA;AAAA,oBAEnJ,QAAA,EAAA,CAAA,CAAE;AAAA,mBAAA;AAAA,kBALE,CAAA,CAAE;AAAA,iBAOV,CAAA,EACH;AAAA,eAAA,EAEJ,CAAA;AAAA,cAGD,YAAY,MAAA,oBACXC,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACb,QAAA,EAAA;AAAA,gCAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAyC,QAAA,EAAA,qBAAA,EAAM,CAAA;AAAA,gCAC/DA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cACZ,QAAA,EAAA,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,qBAClBA,cAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBAEC,YAAA,EAAY,uBAAU,CAAC,CAAA,CAAA;AAAA,oBACvB,OAAA,EAAS,MAAM,SAAA,CAAU,CAAC,CAAA;AAAA,oBAC1B,SAAA,EAAW,CAAA,2BAAA,EAA8B,YAAA,KAAiB,CAAA,GAAI,qCAAqC,2BAA2B,CAAA,CAAA;AAAA,oBAE9H,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mCAAA,EAAoC,KAAA,EAAO,EAAE,KAAA,EAAO,EAAA,EAAI,MAAA,EAAQ,CAAA,EAAE,EAAG;AAAA,mBAAA;AAAA,kBALhF;AAAA,iBAOR,CAAA,EACH;AAAA,eAAA,EACF,CAAA;AAAA,cAGD,YAAY,MAAA,oBACXC,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACb,QAAA,EAAA;AAAA,gCAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,kCAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAyC,QAAA,EAAA,QAAA,EAAG,CAAA;AAAA,kCAC5DA,cAAAA;AAAA,oBAAC,OAAA;AAAA,oBAAA;AAAA,sBACC,KAAA,EAAO,IAAA;AAAA,sBACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,sBACvC,MAAA,EAAQ,UAAA;AAAA,sBACR,SAAA,EAAW,CAAC,CAAA,KAAM;AAAE,wBAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AAAE,0BAAA,CAAA,CAAE,cAAA,EAAe;AAAG,0BAAA,UAAA,EAAW;AAAA,wBAAG;AAAA,sBAAE,CAAA;AAAA,sBACjF,SAAA,EAAS,IAAA;AAAA,sBACT,WAAA,EAAa,MAAM,IAAA,KAAS,OAAA,GAAU,iBAAY,KAAA,CAAM,IAAA,KAAS,SAAS,iBAAA,GAAe,cAAA;AAAA,sBACzF,SAAA,EAAU;AAAA;AAAA,mBACZ;AAAA,kCACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8BAA6B,QAAA,EAAA,6EAAA,EAAoC;AAAA,iBAAA,EACnF,CAAA;AAAA,gCAEAC,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,oEAAA,EACf,QAAA,EAAA;AAAA,kCAAAD,cAAAA,CAAC,UAAK,QAAA,EAAA,2BAAA,EAAY,CAAA;AAAA,kCAClBA,cAAAA;AAAA,oBAAC,OAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,UAAA;AAAA,sBACL,OAAA,EAAS,MAAM,gBAAA,KAAqB,KAAA;AAAA,sBACpC,UAAU,CAAC,CAAA,KAAM,eAAA,CAAgB,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,sBACjD,YAAA,EAAW;AAAA;AAAA;AACb,iBAAA,EACF,CAAA;AAAA,gBAAA,CAEE,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,IAAA,KAAS,6BACxCC,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,oEAAA,EACf,QAAA,EAAA;AAAA,kCAAAD,cAAAA,CAAC,UAAK,QAAA,EAAA,oCAAA,EAAgB,CAAA;AAAA,kCACtBA,cAAAA;AAAA,oBAAC,OAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,UAAA;AAAA,sBACL,OAAA,EAAS,CAAC,CAAE,KAAA,CAA4B,gBAAA;AAAA,sBACxC,UAAU,CAAC,CAAA,KAAM,eAAA,CAAgB,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,sBACjD,YAAA,EAAW;AAAA;AAAA;AACb,iBAAA,EACF;AAAA,eAAA,EAEJ;AAAA,aAAA,EAEJ;AAAA;AAAA;AAAA,OAEJ;AAGF,MAAA,OAAOU,qBAAAA,CAAa,IAAA,EAAM,QAAA,CAAS,IAAI,CAAA;AAAA,IACzC,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACrXA,IAkBMwB,MAAAA,EA0BO,sBAAA;AA5Cb,IAAA,2BAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0DAAA,GAAA;AAAA,IAAA,YAAA;AAaA,IAAA,sBAAA,EAAA;AACA,IAAA,gBAAA,EAAA;AAIA,IAAMA,MAAAA,GAAQ;AAAA,MACZ,uBACEjC,eAAAA,CAAC,SAAI,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,OAAM,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EACvI,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,6BAAA,EAA8B,CAAA;AAAA,wBACtCA,eAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mCAAkC,IAAA,EAAK,cAAA,EAAe,QAAO,MAAA,EAAO;AAAA,OAAA,EAC9E,CAAA;AAAA,MAEF,uBACEC,eAAAA,CAAC,SAAI,KAAA,EAAM,IAAA,EAAK,QAAO,IAAA,EAAK,OAAA,EAAQ,aAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,OAAM,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EACvI,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,cAAA,EAAe,CAAA;AAAA,wBAChCA,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,6DAAA,EAA8D,CAAA;AAAA,wBACtEA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,wBACtCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,OAAA,EACxC;AAAA,KAEJ;AAWO,IAAM,sBAAA,GAAgE,CAAC,KAAA,KAAU;AACtF,MAAA,MAAM,EAAE,MAAA,EAAQ,KAAA,EAAO,QAAQ,OAAA,EAAS,QAAA,EAAU,SAAQ,GAAI,KAAA;AAC9D,MAAA,MAAM,OAAA,GAAUM,aAAuB,IAAI,CAAA;AAC3C,MAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAID,eAAkB,IAAI,CAAA;AACpD,MAAA,MAAM,EAAE,QAAA,EAAS,GAAI,WAAA,EAAY;AACjC,MAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAA+C,IAAI,CAAA;AAEjF,MAAAwB,sBAAgB,MAAM;AACpB,QAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,QAAA,MAAM,MAAA,GAAS,CAAA;AACf,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAMC,KAAAA,GAAO,OAAA,CAAQ,OAAA,EAAS,qBAAA,EAAsB;AACpD,UAAA,MAAMC,EAAAA,GAAID,OAAM,KAAA,IAAS,GAAA;AACzB,UAAA,MAAME,QAAO,IAAA,CAAK,GAAA,CAAI,SAAS,MAAA,CAAO,UAAA,GAAaD,MAAK,CAAC,CAAA;AACzD,UAAA,MAAME,OAAM,MAAA,CAAO,WAAA,IAAeH,KAAAA,EAAM,MAAA,IAAU,MAAM,MAAA,GAAS,EAAA;AACjE,UAAA,UAAA,CAAW,EAAE,MAAAE,KAAAA,EAAM,GAAA,EAAK,KAAK,GAAA,CAAI,MAAA,EAAQC,IAAG,CAAA,EAAG,CAAA;AAC/C,UAAA;AAAA,QACF;AACA,QAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,OAAA,EAAS,qBAAA,EAAsB;AACpD,QAAA,MAAM,CAAA,GAAI,MAAM,KAAA,IAAS,GAAA;AACzB,QAAA,MAAM,CAAA,GAAI,MAAM,MAAA,IAAU,EAAA;AAC1B,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,UAAA,GAAa,CAAA,GAAI,MAAM,CAAC,CAAA;AAChF,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,WAAA,GAAc,CAAA,GAAI,MAAM,CAAC,CAAA;AAChF,QAAA,UAAA,CAAW,EAAE,IAAA,EAAM,GAAA,EAAK,CAAA;AAAA,MAC1B,CAAA,EAAG,CAAC,MAAA,CAAO,CAAA,EAAG,OAAO,CAAA,EAAG,QAAA,EAAU,OAAO,CAAC,CAAA;AAE1C,MAAA1B,gBAAU,MAAM;AACd,QAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,UAAA,IAAI,CAAA,CAAE,QAAQ,QAAA,EAAU;AAAE,YAAA,CAAA,CAAE,cAAA,EAAe;AAAG,YAAA,OAAA,EAAQ;AAAA,UAAG;AAAA,QAC3D,CAAA;AACA,QAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAoB;AACzC,UAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,EAAS,SAAS,CAAA,CAAE,MAAc,GAAG,OAAA,EAAQ;AAAA,QAC5D,CAAA;AACA,QAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,QAAA,QAAA,CAAS,iBAAiB,aAAA,EAAe,aAAA,EAAe,EAAE,OAAA,EAAS,MAAM,CAAA;AACzE,QAAA,OAAO,MAAM;AACX,UAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAC7C,UAAA,QAAA,CAAS,oBAAoB,aAAA,EAAe,aAAA,EAAe,EAAE,OAAA,EAAS,MAA8B,CAAA;AAAA,QACtG,CAAA;AAAA,MACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,MAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAe,UAAA,CAAW,CAAC,GAAA,KAAS,GAAA,KAAQ,CAAA,GAAI,IAAA,GAAO,CAAE,CAAA;AAChF,MAAA,MAAM,WAAW,MAAM;AAAE,QAAA,QAAA,EAAS;AAAG,QAAA,OAAA,EAAQ;AAAA,MAAG,CAAA;AAEhD,MAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAE5C,MAAA,MAAM,OAAA,GAAU,CAAC,EAAE,EAAA,EAAI,OAAO,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAQ,qBAGlDP,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,cAAA,EAAc,EAAA;AAAA,UACd,eAAA,EAAe,EAAA;AAAA,UACf,YAAA,EAAY,KAAA;AAAA,UACZ,cAAA,EAAc,CAAC,CAAC,MAAA;AAAA,UAChB,OAAA;AAAA,UACA,SAAA,EAAW,CAAA,wEAAA,EACT,MAAA,GAAS,6BAAA,GAAgC,mCAC3C,CAAA,CAAA;AAAA,UAEC,QAAA,EAAA;AAAA;AAAA,OACH;AAGF,MAAA,MAAM,GAAA,GAAM,WAAW,EAAE,IAAA,EAAM,OAAO,CAAA,EAAG,GAAA,EAAK,OAAO,CAAA,EAAE;AACvD,MAAA,MAAM,uBACJC,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,OAAA;AAAA,UACL,iBAAA,EAAgB,MAAA;AAAA,UAChB,aAAA,EAAY,0BAAA;AAAA,UACZ,SAAA,EAAW,CAAA,EAAG,MAAA,GAAS,cAAA,GAAiB,EAAE,CAAA,0CAAA,CAAA;AAAA,UAC1C,OAAO,EAAE,IAAA,EAAM,IAAI,IAAA,EAAM,GAAA,EAAK,IAAI,GAAA,EAAI;AAAA,UACtC,IAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAY,uBAAe,KAAK,CAAA,+BAAA,CAAA;AAAA,UAEhC,QAAA,EAAA;AAAA,4BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iHAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6CAAA,EAA+C,QAAA,EAAA;AAAA,gBAAA,KAAA;AAAA,gBAAM;AAAA,eAAA,EAAQ,CAAA;AAAA,8BAC7ED,cAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,WAAU,8BAAA,EAA+B,CAAA;AAAA,8BAC3DA,cAAAA,CAAC,OAAA,EAAA,EAAQ,EAAA,EAAG,OAAA,EAAQ,OAAM,sBAAA,EAAU,IAAA,EAAMkC,MAAAA,CAAM,KAAA,EAAO,QAAQ,OAAA,KAAY,OAAA,EAAS,SAAS,MAAM,aAAA,CAAc,OAAO,CAAA,EAAG,CAAA;AAAA,8BAC3HlC,cAAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAW,IAAA,EAAC,WAAU,8BAAA,EAA+B,CAAA;AAAA,8BAC3DA,cAAAA,CAAC,OAAA,EAAA,EAAQ,EAAA,EAAG,QAAA,EAAS,KAAA,EAAM,yBAAA,EAAa,IAAA,EAAMkC,MAAAA,CAAM,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU;AAAA,aAAA,EAChF,CAAA;AAAA,YAEC,OAAA,KAAY,OAAA,oBACXlC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0FAAA,EACb,QAAA,kBAAAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAyC,QAAA,EAAA;AAAA,gBAAA,oBAAA;AAAA,gBAAa,KAAA;AAAA,gBAAM;AAAA,eAAA,EAAW,CAAA;AAAA,8BACvFD,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBACZ,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,qBACnBA,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBAEC,YAAA,EAAY,UAAO,CAAC,CAAA,CAAA;AAAA,kBACpB,OAAA,EAAS,MAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,kBACxB,SAAA,EAAU,yCAAA;AAAA,kBACV,KAAA,EAAO,EAAE,UAAA,EAAY,CAAA;AAAE,iBAAA;AAAA,gBAJlB;AAAA,eAMR,CAAA,EACH;AAAA,aAAA,EACF,CAAA,EACF;AAAA;AAAA;AAAA,OAEJ;AAGF,MAAA,OAAOU,qBAAAA,CAAa,IAAA,EAAM,QAAA,CAAS,IAAI,CAAA;AAAA,IACzC,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACrJA,IAeM,MAAA,EAMO,qBAAA;AArBb,IAAA,0BAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yDAAA,GAAA;AAAA,IAAA,YAAA;AAeA,IAAM,MAAA,GAAyF;AAAA,MAC7F,QAAQ,EAAE,IAAA,EAAM,eAAY,KAAA,EAAO,eAAA,EAAW,MAAM,EAAA,EAAG;AAAA,MACvD,QAAQ,EAAE,IAAA,EAAM,qBAAW,KAAA,EAAO,mBAAA,EAAW,MAAM,GAAA,EAAI;AAAA,MACvD,cAAA,EAAgB,EAAE,IAAA,EAAM,iDAAA,EAAuB,OAAO,gCAAA,EAAmB,IAAA,EAAM,CAAA,EAAG,GAAA,EAAK,CAAA;AAAE,KAC3F;AAEO,IAAM,qBAAA,GAAyC,CAAC,EAAE,IAAA,EAAM,QAAQ,YAAA,EAAc,SAAA,EAAW,QAAA,EAAU,MAAA,EAAO,KAAM;AACrH,MAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIL,eAAiB,YAAY,CAAA;AACvD,MAAA,MAAM,QAAA,GAAWC,aAAyB,IAAI,CAAA;AAC9C,MAAA,MAAM,IAAA,GAAO,OAAO,IAAI,CAAA;AAExB,MAAAC,gBAAU,MAAM;AAAE,QAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAG,QAAA,QAAA,CAAS,SAAS,MAAA,EAAO;AAAA,MAAG,CAAA,EAAG,EAAE,CAAA;AAE9E,MAAA,MAAM,SAAS,MAAM;AACnB,QAAA,IAAI,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,KAAK,IAAI,KAAA,GAAQ,YAAA;AACzC,QAAA,IAAI,SAAS,gBAAA,EAAkB;AAC7B,UAAA,CAAA,GAAI,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,QAC/B;AACA,QAAA,SAAA,CAAU,CAAC,CAAA;AAAA,MACb,CAAA;AAEA,MAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAE5C,MAAA,MAAM,uBACJN,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,iBAAA,EAAgB,MAAA;AAAA,UAChB,SAAA,EAAW,CAAA,EAAG,MAAA,GAAS,cAAA,GAAiB,EAAE,CAAA,uHAAA,CAAA;AAAA,UAC1C,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,CAAO,GAAG,GAAA,EAAK,MAAA,CAAO,CAAA,EAAG,QAAA,EAAU,GAAA,EAAI;AAAA,UACtD,IAAA,EAAK,QAAA;AAAA,UACL,cAAY,IAAA,CAAK,IAAA;AAAA,UAEjB,QAAA,EAAA;AAAA,4BAAAD,cAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,oCAAA,EAAsC,eAAK,KAAA,EAAM,CAAA;AAAA,4BAClEA,cAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,GAAA,EAAK,QAAA;AAAA,gBACL,IAAA,EAAK,QAAA;AAAA,gBACL,KAAA;AAAA,gBACA,MAAM,IAAA,CAAK,IAAA;AAAA,gBACX,KAAK,IAAA,CAAK,GAAA;AAAA,gBACV,QAAA,EAAU,CAAC,CAAA,KAAM,QAAA,CAAS,WAAW,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,gBACpD,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,kBAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AAAE,oBAAA,CAAA,CAAE,cAAA,EAAe;AAAG,oBAAA,MAAA,EAAO;AAAA,kBAAG,CAAA,MAAA,IAC9C,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU;AAAE,oBAAA,CAAA,CAAE,cAAA,EAAe;AAAG,oBAAA,QAAA,EAAS;AAAA,kBAAG;AAAA,gBACjE,CAAA;AAAA,gBACA,SAAA,EAAU;AAAA;AAAA,aACZ;AAAA,4BACAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,8BAAAD,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,QAAA;AAAA,kBACT,SAAA,EAAU,8FAAA;AAAA,kBACX,QAAA,EAAA;AAAA;AAAA,eAED;AAAA,8BACAA,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,MAAA;AAAA,kBACT,SAAA,EAAU,sFAAA;AAAA,kBACX,QAAA,EAAA;AAAA;AAAA;AAED,aAAA,EACF;AAAA;AAAA;AAAA,OACF;AAGF,MAAA,OAAOU,qBAAAA,CAAa,IAAA,EAAM,QAAA,CAAS,IAAI,CAAA;AAAA,IACzC,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC9EA,IAQa,mBAAA;AARb,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+CAAA,GAAA;AAQO,IAAM,mBAAA,GACX,4DAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACcF,SAAS,OAAA,CAAQ,OAAoB,MAAA,EAA6B;AAChE,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,MAAA,EAAQ;AACX,MAAA,MAAM,IAAA,GAAO,CAAC,GAAG,KAAA,EAAO,OAAO,IAAI,CAAA;AACnC,MAAA,OAAO,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,UAAA,GAAa,IAAA,CAAK,MAAM,IAAA,CAAK,MAAA,GAAS,MAAA,CAAO,UAAU,CAAA,GAAI,IAAA;AAAA,IACzF;AAAA,IACA,KAAK,SAAA;AACH,MAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,EAAA,KAAQ,EAAA,CAAG,EAAA,KAAO,MAAA,CAAO,IAAA,CAAK,EAAA,GAAK,MAAA,CAAO,IAAA,GAAO,EAAG,CAAA;AAAA,IACxE,KAAK,SAAA;AACH,MAAA,OAAO,MAAM,MAAA,CAAO,CAAC,OAAO,EAAA,CAAG,EAAA,KAAO,OAAO,EAAE,CAAA;AAAA;AAErD;AAUO,SAAS,aAAA,CAAc,EAAE,QAAA,EAAU,UAAA,GAAa,GAAE,EAAuB;AAC9E,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAIyB,gBAAA,CAAW,OAAA,EAAS,EAAiB,CAAA;AAC/D,EAAA,MAAM,SAAA,GAAY7B,YAAAA,iBAAmD,IAAI,GAAA,EAAK,CAAA;AAC9E,EAAA,MAAM,QAAA,GAAWA,aAAO,KAAK,CAAA;AAC7B,EAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAEnB,EAAA,MAAM,UAAA,GAAaE,iBAAAA,CAAY,CAAC,EAAA,KAAe;AAC7C,IAAA,MAAM,CAAA,GAAI,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AAClC,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,YAAA,CAAa,CAAC,CAAA;AACd,MAAA,SAAA,CAAU,OAAA,CAAQ,OAAO,EAAE,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAUA,iBAAAA,CAA4B,CAAC,EAAA,KAAO;AAClD,IAAA,UAAA,CAAW,EAAE,CAAA;AACb,IAAA,QAAA,CAAS,EAAE,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,MAAM,mBAAA,GAAsBA,iBAAAA,CAAY,CAAC,EAAA,EAAY,QAAA,KAAqB;AACxE,IAAA,IAAI,YAAY,CAAA,EAAG;AACnB,IAAA,MAAM,IAAI,UAAA,CAAW,MAAM,OAAA,CAAQ,EAAE,GAAG,QAAQ,CAAA;AAChD,IAAA,SAAA,CAAU,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,CAAC,CAAA;AAAA,EAC7B,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,YAAYA,iBAAAA,CAAyB,CAAC,OAAA,EAAS,IAAA,GAAqB,EAAC,KAAM;AAC/E,IAAA,MAAM,OAAA,GAAU,KAAK,OAAA,IAAW,MAAA;AAChC,IAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,GAAA;AAClC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,EAAA,IAAM,CAAA,MAAA,EAAS,EAAE,aAAa,CAAA,CAAA;AAC9C,IAAA,MAAM,IAAA,GAAkB,EAAE,EAAA,EAAI,OAAA,EAAS,SAAS,QAAA,EAAS;AACzD,IAAA,MAAM,QAAA,GAAW,SAAS,OAAA,CAAQ,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,OAAO,EAAE,CAAA;AAC3D,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,UAAA,CAAW,EAAE,CAAA;AACb,MAAA,QAAA,CAAS,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,IACpC,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM,YAAY,CAAA;AAAA,IAC7C;AACA,IAAA,mBAAA,CAAoB,IAAI,QAAQ,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,UAAA,EAAY,UAAA,EAAY,mBAAmB,CAAC,CAAA;AAEhD,EAAAD,eAAAA,CAAU,MAAM,MAAM;AACpB,IAAA,SAAA,CAAU,QAAQ,OAAA,CAAQ,CAAC,CAAA,KAAM,YAAA,CAAa,CAAC,CAAC,CAAA;AAChD,IAAA,SAAA,CAAU,QAAQ,KAAA,EAAM;AAAA,EAC1B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQE,aAAAA,CAAQ,OAAO,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAQ,CAAA,EAAI,CAAC,KAAA,EAAO,SAAA,EAAW,OAAO,CAAC,CAAA;AACxF,EAAA,uBAAOT,cAAAA,CAAC,YAAA,CAAa,QAAA,EAAb,EAAsB,OAAe,QAAA,EAAS,CAAA;AACxD;AA3FA,IAgBa,YAAA,EA0BT,aAAA;AA1CJ,IAAA,kBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2CAAA,GAAA;AAgBO,IAAM,YAAA,GAAeoC,oBAAwC,IAAI,CAAA;AA0BxE,IAAI,aAAA,GAAgB,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACFb,SAAS,MAAM,EAAE,EAAA,EAAI,OAAA,EAAS,OAAA,EAAS,WAAU,EAAe;AACrE,EAAA,uBACEnC,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAW;AAAA,QACT,mJAAA;AAAA,QACA,cAAc,OAAO;AAAA,OACvB,CAAE,KAAK,GAAG,CAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAD,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gCAAA,EAAkC,QAAA,EAAA,YAAA,CAAa,OAAO,CAAA,EAAE,CAAA;AAAA,wBACxEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAuB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,wBAC/CA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAW,8BAAA;AAAA,YACX,OAAA,EAAS,MAAM,SAAA,CAAU,EAAE,CAAA;AAAA,YAC3B,SAAA,EAAU,oIAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,GACF;AAEJ;AA7DA,IAGM,aAAA,EAMA,YAAA;AATN,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mCAAA,GAAA;AAGA,IAAM,aAAA,GAA8C;AAAA,MAClD,IAAA,EAAM,kBAAA;AAAA,MACN,OAAA,EAAS,oBAAA;AAAA,MACT,KAAA,EAAO;AAAA,KACT;AAEA,IAAM,YAAA,GAAsD;AAAA,MAC1D,IAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,MAAK,MAAA,EAAO,MAAA,EAAO,gBAAe,WAAA,EAAY,GAAA,EAAI,eAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,aAAA,EAAW,IAAA,EACxJ,QAAA,EAAA;AAAA,wBAAAD,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,wBAC9BA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,wBACrCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,OAAA,EAAQ,EAAA,EAAG,IAAA,EAAK;AAAA,OAAA,EAC3C,CAAA;AAAA,MAEF,OAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,MAAK,MAAA,EAAO,MAAA,EAAO,gBAAe,WAAA,EAAY,GAAA,EAAI,eAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,aAAA,EAAW,IAAA,EACxJ,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,0FAAA,EAA2F,CAAA;AAAA,wBACnGA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,wBACrCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,OAAA,EAAQ,EAAA,EAAG,IAAA,EAAK;AAAA,OAAA,EAC3C,CAAA;AAAA,MAEF,KAAA,kBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,MAAK,MAAA,EAAO,MAAA,EAAO,gBAAe,WAAA,EAAY,GAAA,EAAI,eAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,aAAA,EAAW,IAAA,EACxJ,QAAA,EAAA;AAAA,wBAAAD,eAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI,CAAA;AAAA,wBAC9BA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,wBACpCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,OAAA,EACtC;AAAA,KAEJ;AAAA,EAAA;AAAA,CAAA,CAAA;AC5BO,SAAS,QAAA,GAAW;AACzB,EAAA,MAAM,GAAA,GAAMqC,iBAAW,YAAY,CAAA;AACnC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,GAAA;AACT;AATA,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qCAAA,GAAA;AACA,IAAA,kBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACQO,SAAS,SAAA,GAAY;AAC1B,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAQ,GAAI,QAAA,EAAS;AACpC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,EAAA,uBACErC,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAU,uFAAA;AAAA,MAET,QAAA,EAAA,KAAA,CAAM,IAAI,CAAC,EAAA,qBACVA,cAAAA,CAAC,KAAA,EAAA,EAAkB,IAAI,EAAA,CAAG,EAAA,EAAI,SAAS,EAAA,CAAG,OAAA,EAAS,SAAS,EAAA,CAAG,OAAA,EAAS,WAAW,OAAA,EAAA,EAAvE,EAAA,CAAG,EAA6E,CAC7F;AAAA;AAAA,GACH;AAEJ;AAtBA,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uCAAA,GAAA;AACA,IAAA,UAAA,EAAA;AACA,IAAA,aAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACFA,IAAAsC,WAAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kCAAA,GAAA;AAAA,IAAA,kBAAA,EAAA;AACA,IAAA,cAAA,EAAA;AAEA,IAAA,aAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACWO,SAAS,YAAY,SAAA,EAAuD;AACjF,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIjC,eAAS,EAAE,CAAA;AACvC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,QAAA,GAAWC,aAA+B,IAAI,CAAA;AACpD,EAAA,MAAM,YAAA,GAAeA,aAAO,CAAC,CAAA;AAE7B,EAAAC,eAAAA,CAAU,MAAM,MAAM,QAAA,CAAS,SAAS,KAAA,EAAM,EAAG,EAAE,CAAA;AAEnD,EAAA,MAAM,MAAA,GAASC,kBAAY,YAAmC;AAC5D,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,EAAK;AAC5B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,QAAA,CAAS,2DAA4B,CAAA;AACrC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,QAAA,CAAS,wFAA4C,CAAA;AACrD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AACxB,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,SAAA,GAAY,EAAE,YAAA,CAAa,OAAA;AACjC,IAAA,QAAA,CAAS,OAAA,GAAU,UAAA;AACnB,IAAA,YAAA,CAAa,IAAI,CAAA;AACjB,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,MAAM,SAAA,CAAU,OAAA,EAAS,EAAE,MAAA,EAAQ,UAAA,CAAW,QAAQ,CAAA;AACxE,MAAA,IAAI,WAAW,MAAA,CAAO,OAAA,IAAW,SAAA,KAAc,YAAA,CAAa,SAAS,OAAO,IAAA;AAC5E,MAAA,IAAI,CAAC,UAAU,EAAA,EAAI;AACjB,QAAA,QAAA,CAAS,UAAU,OAAO,CAAA;AAC1B,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,OAAO,SAAA,CAAU,KAAA;AAAA,IACnB,SAAS,MAAA,EAAQ;AACf,MAAA,IAAI,WAAW,MAAA,CAAO,OAAA,IAAY,kBAAkB,YAAA,IAAgB,MAAA,CAAO,SAAS,YAAA,EAAe;AACjG,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,IAAI,SAAA,KAAc,aAAa,OAAA,EAAS;AACtC,QAAA,QAAA,CAAS,kBAAkB,KAAA,IAAS,MAAA,CAAO,OAAA,GACvC,MAAA,CAAO,UACP,mDAA8B,CAAA;AAAA,MACpC;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,SAAE;AACA,MAAA,IAAI,SAAA,KAAc,aAAa,OAAA,EAAS;AACtC,QAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,SAAA,EAAW,MAAM,CAAC,CAAA;AAEtB,EAAA,OAAO,EAAE,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,OAAO,MAAA,EAAO;AACvD;AApEA,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8CAAA,GAAA;AAAA,IAAA,YAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACYO,SAAS,cAAA,CAAe,EAAE,SAAA,EAAW,WAAA,EAAY,EAAU;AAChE,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF,GAAI,YAAY,SAAS,CAAA;AAEzB,EAAA,MAAM,YAAA,GAAeA,iBAAAA,CAAY,OAAO,KAAA,KAA4C;AAClF,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,EAAO;AAC/B,IAAA,IAAI,SAAA,cAAuB,SAAS,CAAA;AAAA,EACtC,CAAA,EAAG,CAAC,WAAA,EAAa,MAAM,CAAC,CAAA;AAExB,EAAA,uBACEP,eAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,kBAAA;AAAA,MACZ,QAAA,EAAU,CAAC,KAAA,KAAU;AAAE,QAAA,KAAK,aAAa,KAAK,CAAA;AAAA,MAAG,CAAA;AAAA,MACjD,SAAA,EAAU,iDAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAD,eAAC,OAAA,EAAA,EAAM,OAAA,EAAQ,oBAAA,EAAqB,SAAA,EAAU,iDAAgD,QAAA,EAAA,gCAAA,EAE9F,CAAA;AAAA,wBACAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wBAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,cAAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAG,oBAAA;AAAA,cACH,YAAA,EAAW,4BAAA;AAAA,cACX,KAAA,EAAO,MAAA;AAAA,cACP,UAAU,CAAC,KAAA,KAAU,SAAA,CAAU,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,cACjD,QAAA,EAAU,SAAA;AAAA,cACV,IAAA,EAAM,CAAA;AAAA,cACN,WAAA,EAAY,4EAAA;AAAA,cACZ,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACAA,cAAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,QAAA,EAAU,SAAA,IAAa,CAAC,MAAA,CAAO,IAAA,EAAK;AAAA,cACpC,SAAA,EAAU,qHAAA;AAAA,cAET,sBAAY,wBAAA,GAAiB;AAAA;AAAA;AAChC,SAAA,EACF,CAAA;AAAA,QACC,KAAA,oBACCA,cAAAA,CAAC,GAAA,EAAA,EAAE,MAAK,OAAA,EAAQ,SAAA,EAAU,6BAA6B,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,GAEjE;AAEJ;AA5DA,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kDAAA,GAAA;AAAA,IAAA,YAAA;AAKA,IAAA,gBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACLA,IAwDM,wBAAA,EAuXO,mBAAA;AA/ab,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+CAAA,GAAA;AAAA,IAAA,YAAA;AAEA,IAAA,cAAA,EAAA;AACA,IAAA,cAAA,EAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAA,sBAAA,EAAA;AACA,IAAA,2BAAA,EAAA;AACA,IAAA,0BAAA,EAAA;AACA,IAAA,aAAA,EAAA;AACA,IAAA,UAAA,EAAA;AACA,IAAA,UAAA,EAAA;AACA,IAAA,cAAA,EAAA;AACA,IAAAsC,WAAAA,EAAAA;AAEA,IAAA,mBAAA,EAAA;AA0CA,IAAM,wBAAA,GAA2BlB,gBAAAA;AAAA,MAC/B,SAASmB,yBAAAA,CACP;AAAA,QACE,KAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA,aAAA,GAAgB,KAAA;AAAA,QAChB,YAAA;AAAA,QACA,QAAA;AAAA,QACA,QAAA;AAAA,QACA,eAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA,GAAW,KAAA;AAAA,QACX,YAAA;AAAA,QACA,MAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAA;AAAA,QACA,iBAAA;AAAA,QACA;AAAA,SAEF,GAAA,EACA;AACA,QAAA,MAAM,EAAE,SAAA,EAAU,GAAI,QAAA,EAAS;AAC/B,QAAA,MAAM,SAAA,GAAYjC,aAA+B,IAAI,CAAA;AACrD,QAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAID,eAAS,KAAK,CAAA;AACxC,QAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,QAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAgC,IAAI,CAAA;AAE5E,QAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAwC,IAAI,CAAA;AAIxF,QAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAA+B,IAAI,CAAA;AACnF,QAAA,MAAM,oBAAA,GAAuBC,aAAO,iBAAiB,CAAA;AACrD,QAAAC,gBAAU,MAAM;AAAE,UAAA,oBAAA,CAAqB,OAAA,GAAU,iBAAA;AAAA,QAAmB,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAG1F,QAAA,cAAA,CAAe,EAAE,KAAA,EAAO,eAAA,EAAiB,CAAA;AAGzC,QAAAA,gBAAU,MAAM;AACd,UAAA,MAAM,IAAA,GAAO,MAAM,aAAA,CAAc,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,QAAA,EAAS,CAAE,OAAO,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AACjF,UAAA,IAAA,EAAK;AACL,UAAA,OAAO,KAAA,CAAM,UAAU,IAAI,CAAA;AAAA,QAC7B,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,QAAA,MAAM,WAAA,GAAcC,kBAAY,MAAM;AACpC,UAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,UAAA,IAAI,CAAC,CAAA,EAAG;AACR,UAAA,QAAA,CAAS,IAAI,CAAA;AACb,UAAA,CAAA,CAAE,QAAA,CAAS,CAAC,IAAA,KAAyB;AACnC,YAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,YAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,YAAA,oBAAA,CAAqB,OAAA,GAAU,KAAK,EAAE,CAAA;AAAA,UACxC,CAAC,CAAA;AACD,UAAA,CAAA,CAAE,gBAAA,CAAiB,CAAC,IAAA,KAAS,mBAAA,CAAoB,IAAI,CAAC,CAAA;AAMtD,UAAA,CAAA,CAAE,gBAAA,CAAiB,CAAC,IAAA,KAAS;AAC3B,YAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,GAAA,CAAI,WAAW,CAAA,EAAG;AAClC,cAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,cAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,cAAA,oBAAA,CAAqB,UAAU,MAAS,CAAA;AACxC,cAAA;AAAA,YACF;AACA,YAAA,IAAI,IAAA,CAAK,GAAA,CAAI,MAAA,KAAW,CAAA,EAAG;AACzB,cAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AACrB,cAAA,MAAM,SAAS,mBAAA,CAAoB,KAAA,CAAM,UAAS,EAAG,EAAA,EAAI,KAAK,MAAM,CAAA;AACpE,cAAA,IAAI,MAAA,EAAQ;AACV,gBAAA,eAAA,CAAgB,MAAM,CAAA;AACtB,gBAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,gBAAA,oBAAA,CAAqB,UAAU,EAAE,CAAA;AAAA,cACnC;AACA,cAAA;AAAA,YACF;AACA,YAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,YAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,YAAA,oBAAA,CAAqB,UAAU,MAAS,CAAA;AAAA,UAC1C,CAAC,CAAA;AAAA,QACH,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,QAAA,MAAM,mBAAA,GAAsBA,kBAAY,MAAM;AAC5C,UAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,UAAA,oBAAA,CAAqB,UAAU,MAAS,CAAA;AAAA,QAC1C,CAAA,EAAG,EAAE,CAAA;AAEL,QAAA,MAAM,mBAAA,GAAsBA,kBAAY,MAAM;AAC5C,UAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,UAAA,SAAA,CAAU,SAAS,cAAA,EAAe;AAClC,UAAA,oBAAA,CAAqB,UAAU,MAAS,CAAA;AAAA,QAC1C,CAAA,EAAG,EAAE,CAAA;AAEL,QAAA,MAAM,eAAA,GAAkBA,iBAAAA,CAAY,CAAC,KAAA,KAAkB;AACrD,UAAA,MAAM,GAAA,GAAM,cAAA,EAAgB,GAAA,IAAO,EAAC;AACpC,UAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,UAAA,IAAI,CAAC,CAAA,EAAG;AACR,UAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,YAAA,CAAA,CAAE,YAAA,CAAa,IAAI,EAAE,KAAA,EAAO,EAAE,WAAA,EAAa,KAAA,EAAO,KAAA,EAAM,EAAG,CAAA;AAAA,UAC7D;AAAA,QACF,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,QAAA,MAAM,gBAAA,GAAmBA,kBAAY,MAAM;AACzC,UAAA,MAAM,GAAA,GAAM,cAAA,EAAgB,GAAA,IAAO,EAAC;AACpC,UAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,UAAA,IAAI,CAAC,CAAA,EAAG;AACR,UAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,YAAA,CAAA,CAAE,YAAA,CAAa,EAAA,EAAI,EAAE,MAAA,EAAQ,MAAM,CAAA;AAAA,UACrC;AACA,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,UAAA,oBAAA,CAAqB,UAAU,MAAS,CAAA;AAAA,QAC1C,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAInB,QAAA,MAAM,aAAA,GAAgBA,kBAAY,MAAe;AAC/C,UAAA,IAAI,CAAC,SAAA,CAAU,OAAA,EAAS,OAAO,KAAA;AAC/B,UAAA,MAAM,IAAI,SAAA,CAAU,OAAA;AACpB,UAAA,MAAM,KAAA,GAAQ,EAAE,QAAA,EAAS;AACzB,UAAA,IAAI,OAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,CAAE,MAAA,KAAW,GAAG,OAAO,KAAA;AACpD,UAAA,MAAM,IAAA,GAAO,EAAE,OAAA,EAAQ;AACvB,UAAA,MAAM,YAAY,cAAA,CAAe,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,CAAA;AAEpE,UAAA,KAAA,CAAM,YAAY;AAChB,YAAA,IAAI;AACF,cAAA,MAAM,SAAA,GAAY,MAAM,0BAAA,CAA2B,SAAS,CAAA;AAC5D,cAAA,QAAA,CAAS,WAAW,SAAS,CAAA;AAAA,YAC/B,SAAS,GAAA,EAAK;AACZ,cAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,GAAG,CAAA;AAAA,YAC9C;AAAA,UACF,CAAA,GAAG;AACH,UAAA,OAAO,IAAA;AAAA,QACT,CAAA,EAAG,CAAC,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAC,CAAA;AAEjC,QAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACrC,UAAA,aAAA,EAAc;AAAA,QAChB,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,QAAA,MAAM,YAAA,GAAeA,iBAAAA,CAAY,CAAC,SAAA,KAAqB;AACrD,UAAA,SAAA,CAAU,SAAS,cAAA,EAAe;AAClC,UAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,UAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,UAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,UAAA,oBAAA,CAAqB,UAAU,MAAS,CAAA;AACxC,UAAA,MAAM,OAAA,GAAU,MAAM,QAAA,EAAS;AAC/B,UAAA,KAAA,CAAM,QAAA,CAAS;AAAA,YACb,IAAA,EAAM,MAAA;AAAA,YACN,OAAA,EAAS,EAAE,KAAA,EAAO,EAAE,GAAG,SAAA,EAAW,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK;AAAE,WACxD,CAAA;AAAA,QACH,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,QAAAoB,yBAAAA,CAAoB,KAAK,OAAO;AAAA,UAC9B,MAAA,EAAQ,aAAA;AAAA,UACR,UAAA,EAAY,MAAM,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,QAAA,EAAS,CAAE,OAAA,IAAW,EAAE,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA,UACpF,cAAc,CAAC,EAAA,KAAO,SAAA,CAAU,OAAA,EAAS,UAAU,EAAE;AAAA,SACvD,CAAA,EAAI,CAAC,aAAa,CAAC,CAAA;AAEnB,QAAA,MAAM,YAAA,GAAoC,WACtC,EAAE,QAAA,EAAU,SAAS,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,EAAA,EAAG,GAC1C;AAAA,UACE,QAAA,EAAU,UAAA;AAAA,UACV,GAAA,EAAK,KAAA;AAAA,UACL,IAAA,EAAM,gBAAgB,mBAAA,GAAsB,KAAA;AAAA,UAC5C,SAAA,EAAW,uBAAA;AAAA,UACX,MAAA,EAAQ;AAAA,SACV;AAEJ,QAAA,uBACE3B,eAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,YAAA,EAAW,4BAAA;AAAA,YACX,aAAA,EAAY,uBAAA;AAAA,YACZ,iBAAA,EAAgB,MAAA;AAAA,YAChB,oBAAA,EAAoB,WAAW,MAAA,GAAS,MAAA;AAAA,YACxC,KAAA,EAAO,YAAA;AAAA,YACP,SAAA,EAAW;AAAA,cACT,SAAS,cAAA,GAAiB,EAAA;AAAA,cAC1B,iDAAA;AAAA,cACA,QAAA,GACI,eAAA,GACA,CAAA,EAAG,mBAAmB,CAAA,kEAAA;AAAA,aAC5B,CAAE,KAAK,GAAG,CAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAA,eAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,sHAAA,EACf,QAAA,EAAA;AAAA,gBAAA,QAAA,oBACCD,cAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAS,YAAA;AAAA,oBACT,YAAA,EAAW,mCAAA;AAAA,oBACX,SAAA,EAAU,8FAAA;AAAA,oBAEV,0BAAAC,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,KAAI,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EACrI,QAAA,EAAA;AAAA,sCAAAD,cAAAA,CAAC,UAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA;AAAA,sCACnCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,sCACrCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,qBAAA,EACvC;AAAA;AAAA,iBACF;AAAA,gCAEFC,eAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,sDAAA,EACZ,QAAA,EAAA;AAAA,kCAAAA,gBAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,QAAO,cAAA,EAAe,WAAA,EAAY,KAAI,aAAA,EAAc,OAAA,EAAQ,gBAAe,OAAA,EACrI,QAAA,EAAA;AAAA,oCAAAD,cAAAA,CAAC,SAAA,EAAA,EAAQ,MAAA,EAAO,iBAAA,EAAkB,CAAA;AAAA,oCAClCA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,CAAA,EAAE,KAAA,EAAM,IAAA,EAAK,cAAA,EAAe,CAAA;AAAA,oCACnDA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAK,cAAA,EAAe,CAAA;AAAA,oCACnDA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAK,cAAA,EAAe;AAAA,mBAAA,EACtD,CAAA;AAAA,kBAAM;AAAA,iBAAA,EAER,CAAA;AAAA,gBACC,QAAA,oBACCC,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,kCAAAJ,cAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,OAAA,EAAS,MAAA;AAAA,sBACT,UAAU,CAAC,OAAA;AAAA,sBACX,YAAA,EAAW,gBAAA;AAAA,sBACX,KAAA,EAAM,6BAAA;AAAA,sBACN,aAAA,EAAY,iBAAA;AAAA,sBACZ,SAAA,EAAU,0GAAA;AAAA,sBAEV,QAAA,kBAAAA,cAAAA,CAACW,SAAAA,EAAA,EAAS;AAAA;AAAA,mBACZ;AAAA,kCACAX,cAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,OAAA,EAAS,MAAA;AAAA,sBACT,UAAU,CAAC,OAAA;AAAA,sBACX,YAAA,EAAW,iBAAA;AAAA,sBACX,KAAA,EAAM,oCAAA;AAAA,sBACN,aAAA,EAAY,iBAAA;AAAA,sBACZ,SAAA,EAAU,0GAAA;AAAA,sBAEV,QAAA,kBAAAA,cAAAA,CAACY,SAAAA,EAAA,EAAS;AAAA;AAAA,mBACZ;AAAA,kCACAZ,cAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,IAAA,EAAK,QAAA;AAAA,sBACL,OAAA,EAAS,YAAA;AAAA,sBACT,QAAA,EAAU,CAAC,KAAA,IAAS,CAAC,UAAA;AAAA,sBACrB,KAAA,EAAO,CAAC,UAAA,GAAa,4FAAA,GAA4C,MAAA;AAAA,sBACjE,aAAA,EAAY,4BAAA;AAAA,sBACZ,SAAA,EAAU,wGAAA;AAAA,sBACX,QAAA,EAAA;AAAA;AAAA;AAED,iBAAA,EACF,CAAA;AAAA,gCAEFA,cAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,OAAA,EAAS,YAAA,EAAW,cAAA,EAAO,SAAA,EAAU,sFAAA,EACpD,QAAA,kBAAAC,eAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,aAAA,EAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EACrI,QAAA,EAAA;AAAA,kCAAAD,cAAAA,CAAC,UAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,kCACpCA,cAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK;AAAA,iBAAA,EACtC,CAAA,EACF;AAAA,eAAA,EACF,CAAA;AAAA,cACC,0CACCA,cAAAA,CAAC,kBAAe,SAAA,EAAW,sBAAA,EAAwB,aAAa,YAAA,EAAc,CAAA;AAAA,8BAEhFA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,0BAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,gBAAC,WAAA;AAAA,gBAAA;AAAA,kBACC,GAAA,EAAK,SAAA;AAAA,kBACL,KAAA;AAAA,kBACA,YAAA;AAAA,kBACA,QAAA;AAAA,kBACA,QAAA;AAAA,kBACA,OAAA,EAAS,WAAA;AAAA,kBACT,MAAA;AAAA,kBACA,KAAA,EAAO;AAAA;AAAA,iBAEX,CAAA,EACF,CAAA;AAAA,cACC,YAAA,KACC,YAAA,CAAa,IAAA,KAAS,OAAA,mBACpBA,cAAAA;AAAA,gBAAC,iBAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,OAAA;AAAA,kBACL,QAAQ,YAAA,CAAa,YAAA;AAAA,kBACrB,MAAA;AAAA,kBACA,aAAa,YAAA,CAAa,IAAA;AAAA,kBAC1B,cAAc,YAAA,CAAa,KAAA;AAAA,kBAC3B,aAAa,YAAA,CAAa,IAAA;AAAA,kBAC1B,cAAc,YAAA,CAAa,KAAA;AAAA,kBAC3B,aAAa,YAAA,CAAa,IAAA;AAAA,kBAC1B,kBAAkB,YAAA,CAAa,SAAA;AAAA,kBAC/B,aAAa,MAAM,SAAA,CAAU,OAAA,EAAS,gBAAA,MAAsB,EAAC;AAAA,kBAC7D,OAAA,EAAS,mBAAA;AAAA,kBACT,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,oBAAA,SAAA,CAAU,OAAA,EAAS,YAAA,CAAa,YAAA,CAAa,EAAA,EAAI,KAAK,CAAA;AACtD,oBAAA,IAAI,KAAA,CAAM,QAAQ,mBAAA,EAAoB;AAEtC,oBAAA,IAAI,OAAO,KAAA,CAAM,UAAA,KAAe,SAAA,IAAa,MAAM,KAAA,EAAO;AACxD,sBAAA,eAAA,CAAgB,CAAC,GAAA,KAAQ,GAAA,GAAM,EAAE,GAAG,GAAA,EAAK,SAAA,EAAW,KAAA,CAAM,UAAA,IAAc,GAAA,CAAI,SAAA,EAAU,GAAI,GAAG,CAAA;AAAA,oBAC/F;AAAA,kBACF;AAAA;AAAA,kCAGFA,cAAAA;AAAA,gBAAC,iBAAA;AAAA,gBAAA;AAAA,kBACC,MAAM,YAAA,CAAa,IAAA;AAAA,kBACnB,QAAQ,YAAA,CAAa,YAAA;AAAA,kBACrB,MAAA;AAAA,kBACA,aAAa,YAAA,CAAa,IAAA;AAAA,kBAC1B,cAAc,YAAA,CAAa,KAAA;AAAA,kBAC3B,aAAa,YAAA,CAAa,IAAA;AAAA,kBAC1B,cAAc,YAAA,CAAa,KAAA;AAAA,kBAC3B,kBAAkB,YAAA,CAAa,SAAA;AAAA,kBAC/B,kBAAkB,YAAA,CAAa,SAAA;AAAA,kBAC/B,aAAa,MAAM,SAAA,CAAU,OAAA,EAAS,gBAAA,MAAsB,EAAC;AAAA,kBAC7D,OAAA,EAAS,mBAAA;AAAA,kBACT,QAAA,EAAU,CAAC,KAAA,KAAU;AACnB,oBAAA,SAAA,CAAU,OAAA,EAAS,YAAA,CAAa,YAAA,CAAa,EAAA,EAAI,KAAK,CAAA;AACtD,oBAAA,IAAI,KAAA,CAAM,QAAQ,mBAAA,EAAoB;AACtC,oBAAA,IAAI,OAAO,KAAA,CAAM,UAAA,KAAe,SAAA,EAAW;AACzC,sBAAA,eAAA,CAAgB,CAAC,GAAA,KAAQ,GAAA,GAAM,EAAE,GAAG,GAAA,EAAK,SAAA,EAAW,KAAA,CAAM,UAAA,IAAc,GAAA,CAAI,SAAA,EAAU,GAAI,GAAG,CAAA;AAAA,oBAC/F;AACA,oBAAA,IAAI,KAAA,CAAM,KAAA,IAAS,WAAA,IAAe,KAAA,CAAM,KAAA,EAAO;AAC7C,sBAAA,eAAA,CAAgB,CAAC,GAAA,KAAQ,GAAA,GAAM,EAAE,GAAG,GAAA,EAAK,SAAA,EAAW,CAAC,CAAC,KAAA,CAAM,KAAA,EAAO,SAAA,KAAc,GAAG,CAAA;AAAA,oBACtF;AAAA,kBACF;AAAA;AAAA,eACF,CAAA;AAAA,cAIH,cAAA,IAAkB,cAAA,CAAe,GAAA,CAAI,MAAA,GAAS,qBAC7CA,cAAAA;AAAA,gBAAC,sBAAA;AAAA,gBAAA;AAAA,kBACC,QAAQ,cAAA,CAAe,MAAA;AAAA,kBACvB,KAAA,EAAO,eAAe,GAAA,CAAI,MAAA;AAAA,kBAC1B,MAAA;AAAA,kBACA,OAAA,EAAS,eAAA;AAAA,kBACT,QAAA,EAAU,gBAAA;AAAA,kBACV,OAAA,EAAS;AAAA;AAAA,eACX;AAAA,cAGD,gBAAA,KAAqB,gBAAA,CAAiB,IAAA,KAAS,QAAA,IAAY,gBAAA,CAAiB,SAAS,QAAA,IAAY,gBAAA,CAAiB,IAAA,KAAS,gBAAA,CAAA,oBAC1HA,cAAAA;AAAA,gBAAC,qBAAA;AAAA,gBAAA;AAAA,kBACC,MAAM,gBAAA,CAAiB,IAAA;AAAA,kBACvB,QAAQ,gBAAA,CAAiB,MAAA;AAAA,kBACzB,YAAA,EACE,iBAAiB,IAAA,KAAS,QAAA,GAAW,KACjC,gBAAA,CAAiB,IAAA,KAAS,WAAW,CAAA,GACrC,CAAA;AAAA,kBAEN,MAAA;AAAA,kBACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAAE,oBAAA,SAAA,CAAU,OAAA,EAAS,sBAAsB,CAAC,CAAA;AAAG,oBAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,kBAAG,CAAA;AAAA,kBAC5F,UAAU,MAAM;AAAE,oBAAA,SAAA,CAAU,SAAS,oBAAA,EAAqB;AAAG,oBAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,kBAAG;AAAA;AAAA,eAC1F;AAAA,cAGD,CAAC,QAAA,oBACAC,eAAAA,CAAC,QAAA,EAAA,EAAO,WAAU,mFAAA,EAChB,QAAA,EAAA;AAAA,gCAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wBAAA,EAAyB,QAAA,EAAA,mGAAA,EAAoD,CAAA;AAAA,gCAC7FC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,kCAAAD,cAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,OAAA,EAAS,OAAA;AAAA,sBACT,SAAA,EAAU,qHAAA;AAAA,sBACX,QAAA,EAAA;AAAA;AAAA,mBAED;AAAA,kCACAA,cAAAA;AAAA,oBAAC,QAAA;AAAA,oBAAA;AAAA,sBACC,OAAA,EAAS,YAAA;AAAA,sBACT,QAAA,EAAU,CAAC,KAAA,IAAS,CAAC,UAAA;AAAA,sBACrB,KAAA,EAAO,CAAC,UAAA,GAAa,4FAAA,GAA4C,MAAA;AAAA,sBACjE,aAAA,EAAY,qBAAA;AAAA,sBACZ,SAAA,EAAU,qHAAA;AAAA,sBACX,QAAA,EAAA;AAAA;AAAA;AAED,iBAAA,EACF;AAAA,eAAA,EACF,CAAA;AAAA,8BAEFA,eAAC,SAAA,EAAA,EAAU;AAAA;AAAA;AAAA,SACb;AAAA,MAEJ;AAAA,KACF;AAEO,IAAM,mBAAA,GAAsBoB,gBAAAA;AAAA,MACjC,SAASoB,oBAAAA,CAAoB,KAAA,EAAO,GAAA,EAAK;AACvC,QAAA,uBACExC,eAAC,aAAA,EAAA,EACC,QAAA,kBAAAA,eAAC,wBAAA,EAAA,EAA0B,GAAG,KAAA,EAAO,GAAA,EAAU,CAAA,EACjD,CAAA;AAAA,MAEJ;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;ACvaA,SAAS,cAAA,GAA0B;AACjC,EAAA,MAAM,EAAA,GAAM,OAAO,QAAA,KAAa,WAAA,GAC3B,SAAS,aAAA,GACV,IAAA;AACJ,EAAA,OAAO,CAAC,EACN,EAAA,KACC,EAAA,CAAG,YAAY,OAAA,IACd,EAAA,CAAG,OAAA,KAAY,UAAA,IACf,EAAA,CAAG,iBAAA,CAAA,CAAA;AAET;AAEO,SAAS,iBACd,IAAA,EAC2B;AAC3B,EAAA,MAAM,EAAE,UAAA,EAAY,KAAA,EAAO,QAAA,EAAU,SAAQ,GAAI,IAAA;AAEjD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIK,eAAmB,IAAI,CAAA;AAE3D,EAAA,MAAM,aAAA,GAAgBC,aAAO,UAAU,CAAA;AACvC,EAAA,MAAM,QAAA,GAAWA,aAAO,KAAK,CAAA;AAC7B,EAAA,MAAM,WAAA,GAAcA,aAAO,QAAQ,CAAA;AACnC,EAAA,MAAM,aAAA,GAAgBA,aAAiB,IAAI,CAAA;AAE3C,EAAA,aAAA,CAAc,OAAA,GAAU,UAAA;AACxB,EAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AACnB,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAKtB,EAAA,MAAM,MAAA,GAASE,kBAAY,MAAM;AAC/B,IAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AACxB,IAAA,aAAA,CAAc,IAAI,CAAA;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAD,gBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAAmB;AACnC,MAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AACxB,MAAA,aAAA,CAAc,IAAI,CAAA;AAAA,IACpB,CAAA;AAEA,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAI,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,IAAW,EAAE,MAAA,EAAQ;AACxC,MAAA,IAAI,gBAAe,EAAG;AAEtB,MAAA,MAAM,MAAM,CAAA,CAAE,GAAA;AACd,MAAA,MAAM,QAAQ,GAAA,CAAI,MAAA,KAAW,CAAA,GAAI,GAAA,CAAI,aAAY,GAAI,GAAA;AAErD,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,IAAI,aAAA,CAAc,YAAY,IAAA,EAAM;AAClC,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,UAAA,QAAA,CAAS,IAAI,CAAA;AAAA,QACf;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,MAAM,MAAA,KAAW,CAAA,IAAK,KAAA,IAAS,GAAA,IAAO,SAAS,GAAA,EAAK;AACtD,QAAA,MAAM,GAAA,GAAM,KAAA,CAAM,UAAA,CAAW,CAAC,CAAA,GAAIkC,OAAAA;AAClC,QAAA,IAAI,GAAA,GAAM,aAAA,CAAc,OAAA,CAAQ,MAAA,EAAQ;AACtC,UAAA,CAAA,CAAE,cAAA,EAAe;AACjB,UAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,UAAA,QAAA,CAAS,aAAA,CAAc,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,QACrC;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,GAAA,IAAO,GAAA,IAAO,GAAA,IAAO,GAAA,EAAK;AAC5B,QAAA,MAAM,SAAS,aAAA,CAAc,OAAA;AAC7B,QAAA,IAAI,WAAW,IAAA,EAAM;AACrB,QAAA,MAAM,IAAI,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA,GAAI,GAAA,CAAI,WAAW,CAAC,CAAA;AAC9C,QAAA,MAAM,YAAA,GAAe,SAAS,OAAA,CAAQ,MAAA;AAAA,UACpC,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU;AAAA,SACrB;AACA,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,QAAA,IAAI,CAAA,GAAI,aAAa,MAAA,EAAQ;AAC3B,UAAA,WAAA,CAAY,OAAA,CAAQ,YAAA,CAAa,CAAC,CAAA,CAAE,GAAG,CAAA;AAAA,QACzC;AACA,QAAA,QAAA,CAAS,IAAI,CAAA;AACb,QAAA;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,MAAA,CAAO,iBAAiB,SAAA,EAAW,KAAA,EAAO,EAAE,OAAA,EAAS,MAAM,CAAA;AAC3D,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,oBAAoB,SAAA,EAAW,KAAA,EAAO,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,IAChE,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,EAAE,YAAY,MAAA,EAAO;AAC9B;AA9GA,IAcMA,OAAAA;AAdN,IAAA,qBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uCAAA,GAAA;AAcA,IAAMA,OAAAA,GAAS,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC0B/B,SAAS,uBACP,GAAA,EACA,MAAA,EACA,OACA,MAAA,EACA,UAAA,EACA,GACA,CAAA,EACA;AACA,EAAA,MAAM,WACJ,GAAA,EAAK,WAAA,EAAY,IAAK,EAAE,SAAS,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,KAAA,EAAO,KAAK,MAAA,EAAQ,GAAA,EAAK,MAAM,EAAE,KAAA,EAAO,GAAE,EAAE;AAC9F,EAAA,MAAM,EAAA,GACJ,CAAA,IAAK,QAAA,CAAS,OAAA,GAAA,CAAW,QAAA,CAAS,KAAA,IAAS,GAAA,IAAO,CAAA,IAAK,QAAA,CAAS,IAAA,EAAM,KAAA,IAAS,CAAA,CAAA,GAAK,KAAA,GAAQ,CAAA;AAC9F,EAAA,MAAM,EAAA,GACJ,CAAA,IAAK,QAAA,CAAS,OAAA,GAAA,CAAW,QAAA,CAAS,MAAA,IAAU,GAAA,IAAO,CAAA,IAAK,QAAA,CAAS,IAAA,EAAM,KAAA,IAAS,CAAA,CAAA,GAAK,MAAA,GAAS,CAAA;AAChG,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,EAAA,EAAI,QAAA,GAAW,IAAA,CAAK,GAAA,KAAQ,GAAA,GAAM,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,IACvE,CAAA,EAAG,EAAA;AAAA,IACH,CAAA,EAAG,EAAA;AAAA,IACH,KAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA,EAAO,CAAA;AAAA,IACP,WAAA,EAAa,aAAA;AAAA,IACb,eAAA,EAAiB,aAAA;AAAA,IACjB,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,CAAA;AAAA,IACb,WAAA,EAAa,OAAA;AAAA,IACb,SAAA,EAAW,CAAA;AAAA,IACX,OAAA,EAAS,GAAA;AAAA,IACT,UAAU,EAAC;AAAA,IACX,SAAA,EAAW,IAAA;AAAA,IACX,MAAM,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,GAAG,CAAA;AAAA,IACpC,YAAA,EAAc,CAAA;AAAA,IACd,OAAA,EAAS,CAAA;AAAA,IACT,SAAA,EAAW,KAAA;AAAA,IACX,aAAA,EAAe,IAAA;AAAA,IACf,OAAA,EAAS,KAAK,GAAA,EAAI;AAAA,IAClB,IAAA,EAAM,IAAA;AAAA,IACN,MAAA,EAAQ,KAAA;AAAA,IACR,MAAA,EAAQ,OAAA;AAAA,IACR,KAAA,EAAO,CAAC,CAAA,EAAG,CAAC;AAAA,GACd;AACF;AAeA,eAAsB,gBAAA,CACpB,KACA,IAAA,EACiC;AACjC,EAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,UAAS,GAAI,MAAM,eAAA,CAAgB,IAAA,CAAK,SAAS,CAAA;AACzF,EAAA,GAAA,CAAI,QAAA,CAAS,CAAC,EAAE,EAAA,EAAI,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,IAAA,CAAK,GAAA,EAAI,EAAG,CAAC,CAAA;AACrE,EAAA,MAAM,UAAA,GAAa,KAAK,cAAA,EAAe;AAEvC,EAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,EAAiB;AACtC,EAAA,MAAM,SAAA,GAAY,KAAK,gBAAA,IAAoB,IAAA;AAE3C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,UAAU,QAAA,CAAS,GAAA;AAAA,MAAI,CAAC,CAAA,KAC5B,CAAA,CAAE,EAAA,KAAO,SAAA,GAAY,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,UAAA,EAAY,KAAA,EAAO,MAAA,EAAO,GAAI;AAAA,KACrE;AACA,IAAA,GAAA,CAAI,YAAY,EAAE,QAAA,EAAU,SAAS,QAAA,EAAU,wBAAA,IAA4B,CAAA;AAC3E,IAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,WAAW,SAAA,EAAU;AAAA,EACvD;AAEA,EAAA,MAAM,UAAA,GAAa,sBAAA;AAAA,IACjB,GAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAK,QAAA,EAAU,CAAA;AAAA,IACf,KAAK,QAAA,EAAU;AAAA,GACjB;AACA,EAAA,GAAA,CAAI,WAAA,CAAY;AAAA,IACd,QAAA,EAAU,CAAC,GAAG,QAAA,EAAU,UAAU,CAAA;AAAA,IAClC,UAAU,wBAAA;AAAyB,GACpC,CAAA;AACD,EAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,SAAA,EAAW,WAAW,EAAA,EAAG;AAC3D;AArIA,IAmCM,wBAAA;AAnCN,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kCAAA,GAAA;AAAA,IAAA,mBAAA,EAAA;AAmCA,IAAM,2BAA2B,OAAY;AAAA,MAC3C,oBAAoB,EAAC;AAAA,MACrB,iBAAA,EAAmB;AAAA,KACrB,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACdO,SAAS,aAAA,CACd,MAAA,EACA,cAAA,EACA,YAAA,EACO;AACP,EAAA,MAAM,GAAA,GAAMnC,aAAqB,IAAI,CAAA;AACrC,EAAA,IAAI,CAAC,IAAI,OAAA,EAAS;AAChB,IAAA,MAAM,OAAA,GAAU,cAAA,EAAgB,UAAA,GAC5B,YAAA,CAAa,cAAA,CAAe,UAAU,CAAA,IAAK,gBAAA,CAAiB,MAAM,CAAA,GAClE,gBAAA,CAAiB,MAAM,CAAA;AAC3B,IAAA,GAAA,CAAI,OAAA,GAAU,YAAY,OAAO,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,GAAA,CAAI,OAAA;AACb;AArCA,IAAA,kBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AAgBA,IAAA,UAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AChBA,IAAA,YAAA,GAAA,EAAA;AAAA,QAAA,CAAA,YAAA,EAAA;AAAA,EAAA,iBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AA6BA,SAAS,kBAAkB,IAAA,EAA6B;AACtD,EAAA,IAAI,CAAC,oBAAA,CAAqB,IAAI,CAAA,EAAG,OAAO,IAAA;AACxC,EAAA,OAAO,gBAAA,CAAiB,KAAK,SAAS,CAAA;AACxC;AAhCA,IAkCa,iBAAA;AAlCb,IAAA,SAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AAAA,IAAA,YAAA;AASA,IAAA,mBAAA,EAAA;AACA,IAAA,UAAA,EAAA;AACA,IAAA,gBAAA,EAAA;AAKA,IAAA,UAAA,EAAA;AACA,IAAA,qBAAA,EAAA;AACA,IAAA,gBAAA,EAAA;AACA,IAAA,cAAA,EAAA;AACA,IAAAP,WAAAA,EAAAA;AACA,IAAA,UAAA,EAAA;AAKA,IAAA,gBAAA,EAAA;AACA,IAAA,kBAAA,EAAA;AAOO,IAAM,iBAAA,GAAoBqB,gBAAAA;AAAA,MAC/B,SAASsB,mBAAkB,EAAE,GAAA,EAAK,gBAAgB,OAAA,EAAS,MAAA,EAAQ,sBAAA,EAAuB,EAAG,GAAA,EAAK;AAChG,QAAA,MAAM,QAAA,GAAWpC,aAAyC,IAAI,CAAA;AAC9D,QAAA,MAAM,EAAE,QAAA,EAAS,GAAI,WAAA,EAAY;AACjC,QAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAID,eAAS,KAAK,CAAA;AAClD,QAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,EAAM,cAAA,EAAgB,iBAAiB,CAAA;AAGxE,QAAA,MAAM,WAAA,GAAc,UAAA,CAAW,QAAA,EAAS,CAAE,IAAA;AAC1C,QAAA,MAAM,WAAA,GAAc,WAAA,CAAY,MAAA,KAAW,IAAA,GAAO,YAAY,IAAA,GAAO,eAAA;AACrE,QAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAmB,MAAM,CAAA;AACjE,QAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAAA,CAAkB,YAAY,QAAQ,CAAA;AACtE,QAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAAA,CAAkB,YAAY,QAAQ,CAAA;AACtE,QAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAkB,KAAK,CAAA;AACrD,QAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAkB,KAAK,CAAA;AACrD,QAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAA6B,MAAS,CAAA;AAEtF,QAAA,MAAM,mBAAA,GAAsBG,iBAAAA,CAAY,CAAC,CAAA,EAAY,CAAA,KAAe;AAClE,UAAA,UAAA,CAAW,CAAC,CAAA;AACZ,UAAA,UAAA,CAAW,CAAC,CAAA;AAAA,QACd,CAAA,EAAG,EAAE,CAAA;AAEL,QAAA,MAAM,UAAA,GAAaA,kBAAY,MAAM,UAAA,CAAW,MAAK,EAAG,CAAC,UAAU,CAAC,CAAA;AACpE,QAAA,MAAM,UAAA,GAAaA,kBAAY,MAAM,UAAA,CAAW,MAAK,EAAG,CAAC,UAAU,CAAC,CAAA;AAEpE,QAAA,MAAM,EAAE,UAAA,EAAW,GAAI,gBAAA,CAAiB;AAAA,UACtC,UAAA,EAAY,WAAA;AAAA,UACZ,KAAA,EAAO,KAAA;AAAA,UACP,QAAA,EAAU,CAAC,GAAA,KAAQ,eAAA,CAAgB,GAAe,CAAA;AAAA,UAClD,SAAS,CAAC;AAAA,SACX,CAAA;AAED,QAAA,MAAM,YAAA,GAAeA,iBAAAA;AAAA,UACnB,OAAO,WAAmB,SAAA,KAAsB;AAC9C,YAAA,IAAI,CAAC,GAAA,EAAK;AACV,YAAA,IAAI;AACF,cAAA,MAAM,iBAAiB,GAAA,EAAK;AAAA,gBAC1B,SAAA;AAAA,gBACA,gBAAgB,OAA2B;AAAA,kBACzC,IAAA,EAAM,UAAA;AAAA,kBACN,OAAA,EAAS,CAAA;AAAA,kBACT;AAAA,iBACF,CAAA;AAAA,gBACA,gBAAA,EAAkB,gBAAgB,EAAA,IAAM;AAAA,eACzC,CAAA;AAAA,YACH,SAAS,GAAA,EAAK;AACZ,cAAA,OAAA,CAAQ,KAAA,CAAM,2BAA2B,GAAG,CAAA;AAAA,YAC9C;AACA,YAAA,OAAA,EAAQ;AAAA,UACV,CAAA;AAAA,UACA,CAAC,GAAA,EAAK,cAAA,EAAgB,EAAA,EAAI,OAAO;AAAA,SACnC;AAEA,QAAAoB,yBAAAA;AAAA,UACE,GAAA;AAAA,UACA,OAAO;AAAA,YACL,SAAA,EAAW,MAAM,QAAA,CAAS,OAAA,EAAS,QAAO,IAAK,KAAA;AAAA,YAC/C,UAAA,EAAY,MAAM,QAAA,CAAS,OAAA,EAAS,YAAW,IAAK;AAAA,WACtD,CAAA;AAAA,UACA;AAAC,SACH;AAEA,QAAA,uBACE3B,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAJ,cAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,kBAAA;AAAA,cACN,IAAA,EAAM,kBAAA;AAAA,cACN,OAAA;AAAA,cACA,MAAA;AAAA,cACA,MAAA,EAAO,kBAAA;AAAA,cACP,KAAA,EAAO,KAAA;AAAA,cACP,UAAA,EAAY,WAAA;AAAA,cACZ,WAAA,EAAa,YAAA;AAAA,cACb,UAAA,EAAY,YAAA;AAAA,cACZ,YAAA,EAAc,eAAA;AAAA,cACd,IAAA,EAAM;AAAA,gBACJ,QAAA;AAAA,gBACA,QAAA;AAAA,gBACA,gBAAA,EAAkB,WAAA;AAAA,gBAClB,gBAAA,EAAkB;AAAA,eACpB;AAAA,cACA,OAAA,EAAS;AAAA,gBACP,MAAA,EAAQ,UAAA;AAAA,gBACR,OAAA;AAAA,gBACA,MAAA,EAAQ,UAAA;AAAA,gBACR;AAAA,eACF;AAAA,cACA,KAAA,EAAO,EAAE,WAAA,EAAa,UAAA,EAAY,cAAA,EAAe;AAAA,cACjD,OAAA,EAAS;AAAA,gBACP,KAAA,EAAO,UAAA;AAAA,gBACP,gBAAA;AAAA,gBACA,cAAA,EAAgB,CAAC,EAAA,KAAO;AACtB,kBAAA,mBAAA,CAAoB,MAAM,MAAS,CAAA;AACnC,kBAAA,QAAA,CAAS,OAAA,EAAS,aAAa,EAAE,CAAA;AAAA,gBACnC;AAAA,eACF;AAAA,cACA,QAAA;AAAA,cACA,UAAA;AAAA,cACA,aAAA,EAAe,MAAM,aAAA,CAAc,KAAK;AAAA;AAAA,WAC1C;AAAA,0BACAA,cAAAA;AAAA,YAAC,mBAAA;AAAA,YAAA;AAAA,cACC,GAAA,EAAK,QAAA;AAAA,cACL,KAAA,EAAO,UAAA;AAAA,cACP,QAAA,EAAU,YAAA;AAAA,cACV,OAAA;AAAA,cACA,YAAA;AAAA,cACA,QAAA;AAAA,cACA,QAAA;AAAA,cACA,eAAA,EAAiB,mBAAA;AAAA,cACjB,eAAe,CAAC,QAAA;AAAA,cAChB,MAAA;AAAA,cACA,QAAA;AAAA,cACA,YAAA,EAAc,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,cACtC,MAAA,EAAQ,UAAA;AAAA,cACR,MAAA,EAAQ,UAAA;AAAA,cACR,OAAA;AAAA,cACA,OAAA;AAAA,cACA,iBAAA,EAAmB,mBAAA;AAAA,cACnB;AAAA;AAAA;AACF,SAAA,EACF,CAAA;AAAA,MAEJ;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC1JA,WAAA,EAAA;AAKA,mBAAA,EAAA;AACAD,WAAAA,EAAAA;AAOA,IAAM2C,kBAAAA,GAAoBC,UAAA;AAAA,EAAK,MAC7B,0DAAiB,IAAA,CAAK,CAAC,OAAO,EAAE,OAAA,EAAS,CAAA,CAAE,iBAAA,EAAkB,CAAE;AACjE,CAAA;AAEA,IAAM,YAAA,mBACJ1C,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,MAAK,MAAA,EAAO,MAAA,EAAO,gBAAe,WAAA,EAAY,KAAA,EAAM,eAAc,OAAA,EAAQ,cAAA,EAAe,OAAA,EAAQ,aAAA,EAAY,MAAA,EAC3J,QAAA,EAAA;AAAA,kBAAAD,cAAAA,CAAC,SAAA,EAAA,EAAQ,MAAA,EAAO,iBAAA,EAAkB,CAAA;AAAA,kBAClCA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAK,cAAA,EAAe,MAAA,EAAO,MAAA,EAAO,CAAA;AAAA,kBACjEA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA,EAAE,KAAA,EAAM,IAAA,EAAK,cAAA,EAAe,MAAA,EAAO,MAAA,EAAO,CAAA;AAAA,kBAClEA,cAAAA,CAAC,QAAA,EAAA,EAAO,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,CAAA,EAAE,KAAA,EAAM,IAAA,EAAK,cAAA,EAAe,MAAA,EAAO,MAAA,EAAO;AAAA,CAAA,EACnE,CAAA;AAGK,IAAM,aAAA,GAA+C;AAAA,EAC1D,IAAA,EAAM,UAAA;AAAA,EACN,WAAA,EAAa,GAAA;AAAA,EACb,YAAA,EAAc,GAAA;AAAA,EACd,YAAA,EAAc,8BAAA;AAAA,EACd,WAAA,EAAa,YAAA;AAAA,EACb,aAAA,EAAe,wBAAA;AAAA,EACf,iBAAA,EAAmB,oBAAA;AAAA,EACnB,MAAM,wBAAwB,IAAA,EAAM;AAClC,IAAA,IAAI,CAAC,oBAAA,CAAqB,IAAI,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,MAAM,+EAAuE,CAAA;AAAA,IACzF;AACA,IAAA,OAAO,0BAAA,CAA2B,KAAK,SAAS,CAAA;AAAA,EAClD,CAAA;AAAA,EACA,MAAM,0BAA0B,OAAA,EAA4C;AAC1E,IAAA,MAAM,OAAO,OAAA,CAAQ,UAAA;AACrB,IAAA,MAAM,SAAU,OAAA,CAAuC,MAAA;AACvD,IAAA,IAAI,CAAC,QAAQ,CAAC,MAAA,IAAU,CAAC,oBAAA,CAAqB,IAAI,GAAG,OAAO,IAAA;AAC5D,IAAA,MAAM,SAAA,GAAY,MAAM,0BAAA,CAA2B,IAAA,CAAK,SAAS,CAAA;AACjE,IAAA,OAAO,cAAA,CAAe,WAAW,MAAM,CAAA;AAAA,EACzC,CAAA;AAAA,EACA,IAAA,EAAM0C;AACR","file":"geometry-2d.js","sourcesContent":["// src/core/scene/types.ts\n\nexport type SceneObject<A = Record<string, unknown>> = {\n id: string;\n kind: string;\n label: string;\n visible: boolean;\n locked: boolean;\n layer: string;\n schemaVersion: number;\n attrs: A;\n};\n\n// View per domain — narrow theo `state.meta.domain`.\nexport type View2D = {\n readonly bbox: readonly [number, number, number, number]; // [xmin, ymax, xmax, ymin]\n readonly showAxis: boolean;\n readonly showGrid: boolean;\n};\n\nexport type View3D = {\n readonly bbox3D: readonly [number, number, number, number, number, number]; // [xmin, xmax, ymin, ymax, zmin, zmax]\n readonly azimuth: number;\n readonly elevation: number;\n};\n\nexport type ViewGraph2D = {\n readonly xMin: number;\n readonly xMax: number;\n readonly yMin: number;\n readonly yMax: number;\n readonly showAxis: boolean;\n readonly showGrid: boolean;\n};\n\n// Union of all view shapes — narrow qua state.meta.domain.\nexport type SceneView = View2D | View3D | ViewGraph2D;\n\n// Discriminated union: domain narrow → view shape narrow.\nexport type StateMeta =\n | { readonly domain: '2d'; readonly version: number; readonly view: View2D }\n | { readonly domain: '3d'; readonly version: number; readonly view: View3D }\n | { readonly domain: 'graph2d'; readonly version: number; readonly view: ViewGraph2D };\n\nexport type Domain = StateMeta['domain'];\n\n// Backward-compat alias: UPDATE_VIEW patch dùng graph-2d shape (chỉ graph-2d\n// dispatch action này hiện tại).\nexport type ViewSettings = ViewGraph2D;\n\nexport type State = {\n readonly objects: Readonly<Record<string, SceneObject>>;\n readonly order: readonly string[];\n readonly counter: number;\n readonly meta: StateMeta;\n};\n\nexport type Action =\n | { type: 'ADD'; payload: { obj: SceneObject } }\n | { type: 'UPDATE'; payload: { id: string; patch: Partial<Omit<SceneObject, 'id' | 'kind' | 'attrs'>> } }\n | { type: 'UPDATE_ATTRS'; payload: { id: string; patch: Record<string, unknown> } }\n | { type: 'DELETE'; payload: { id: string } }\n | { type: 'RESET' }\n | { type: 'LOAD'; payload: { state: State } }\n | { type: 'TRANSACTION'; payload: { actions: Action[] } }\n | { type: 'UPDATE_VIEW'; payload: { patch: Partial<ViewSettings> } };\n\nexport type RenderCtx = {\n jxg: unknown;\n resolveRef: (id: string) => unknown;\n defaults: Readonly<Record<string, unknown>>;\n /** Map tham số (parameter.label → parameter.value). Chỉ graph2d dùng. */\n paramMap?: Readonly<Record<string, number>>;\n};\n\nexport type KindDef<A = Record<string, unknown>> = {\n type: string;\n schemaVersion: number;\n migrate: Record<number, (prev: any) => any>;\n validate?: (attrs: A) => void;\n dependsOn: (attrs: A) => string[];\n describe: (obj: SceneObject<A>, state?: State) => string;\n measure?: (obj: SceneObject<A>, state: State) =>\n | { label: string; value: number }[]\n | null;\n render: (obj: SceneObject<A>, ctx: RenderCtx) => unknown;\n update?: (\n obj: SceneObject<A>,\n prev: SceneObject<A>,\n ctx: RenderCtx,\n existing: unknown,\n ) => void;\n};\n\nexport const DEFAULT_VIEW_2D: View2D = {\n bbox: [-10, 10, 10, -10],\n showAxis: false,\n showGrid: false,\n};\n\nexport const DEFAULT_VIEW_3D: View3D = {\n bbox3D: [-5, 5, -5, 5, -5, 5],\n azimuth: 60,\n elevation: 30,\n};\n\nexport const DEFAULT_VIEW_GRAPH2D: ViewGraph2D = {\n xMin: -10, xMax: 10, yMin: -10, yMax: 10,\n showAxis: true, showGrid: true,\n};\n\n// EMPTY_STATE giữ shape '3d' (legacy default). Dùng `createEmptyState(domain)`\n// khi cần state cụ thể cho domain — đảm bảo meta.view khớp domain.\nexport const EMPTY_STATE: State = {\n objects: {},\n order: [],\n counter: 0,\n meta: { domain: '3d', version: 1, view: DEFAULT_VIEW_3D },\n};\n\nexport function createEmptyState(domain: Domain): State {\n const base = { objects: {}, order: [], counter: 0 } as const;\n switch (domain) {\n case '2d':\n return { ...base, meta: { domain: '2d', version: 1, view: DEFAULT_VIEW_2D } };\n case '3d':\n return { ...base, meta: { domain: '3d', version: 1, view: DEFAULT_VIEW_3D } };\n case 'graph2d':\n return { ...base, meta: { domain: 'graph2d', version: 1, view: DEFAULT_VIEW_GRAPH2D } };\n }\n}\n","// src/core/scene/registry.ts\nimport type { KindDef } from './types';\n\nconst registry = new Map<string, KindDef>();\n\nexport function registerKind<A = Record<string, unknown>>(def: KindDef<A>): void {\n if (registry.has(def.type)) {\n console.warn(`[scene] kind \"${def.type}\" đã được đăng ký — ghi đè định nghĩa cũ`);\n }\n registry.set(def.type, def as unknown as KindDef);\n}\n\nexport function getKind(type: string): KindDef {\n const def = registry.get(type);\n if (!def) throw new Error(`[scene] unknown kind: ${type}`);\n return def;\n}\n\nexport function listKinds(): KindDef[] {\n return Array.from(registry.values());\n}\n\n// Chỉ dùng cho test — reset registry giữa các test case.\nexport function __clearRegistryForTests(): void {\n registry.clear();\n}\n","// src/core/scene/reducer.ts\nimport type { Draft } from 'immer';\nimport type { Action, State, SceneObject } from './types';\nimport { getKind } from './registry';\n\nfunction collectDependents(state: Draft<State> | State, rootId: string): Set<string> {\n const dependents = new Set<string>([rootId]);\n let grew = true;\n while (grew) {\n grew = false;\n for (const obj of Object.values(state.objects) as SceneObject[]) {\n if (dependents.has(obj.id)) continue;\n let kindDef;\n try { kindDef = getKind(obj.kind); } catch { continue; }\n const refs = kindDef.dependsOn(obj.attrs as never);\n if (refs.some(r => dependents.has(r))) {\n dependents.add(obj.id);\n grew = true;\n }\n }\n }\n return dependents;\n}\n\nexport function reduce(draft: Draft<State>, action: Action): void {\n switch (action.type) {\n case 'ADD': {\n const { obj } = action.payload;\n if (draft.objects[obj.id]) throw new Error(`[scene] id \"${obj.id}\" đã tồn tại`);\n const kindDef = getKind(obj.kind);\n kindDef.validate?.(obj.attrs as never);\n draft.objects[obj.id] = obj;\n draft.order.push(obj.id);\n draft.counter += 1;\n return;\n }\n case 'UPDATE': {\n const { id, patch } = action.payload;\n const obj = draft.objects[id];\n if (!obj) return;\n Object.assign(obj, patch);\n return;\n }\n case 'UPDATE_ATTRS': {\n const { id, patch } = action.payload;\n const obj = draft.objects[id];\n if (!obj) return;\n const kindDef = getKind(obj.kind);\n const nextAttrs = { ...(obj.attrs as object), ...patch };\n kindDef.validate?.(nextAttrs as never);\n obj.attrs = nextAttrs;\n return;\n }\n case 'DELETE': {\n const { id } = action.payload;\n if (!draft.objects[id]) return;\n const toDelete = collectDependents(draft, id);\n for (const delId of toDelete) {\n delete draft.objects[delId];\n }\n draft.order = draft.order.filter(x => !toDelete.has(x));\n return;\n }\n case 'RESET': {\n draft.objects = {};\n draft.order = [];\n draft.counter = 0;\n return;\n }\n case 'LOAD': {\n const { state } = action.payload;\n draft.objects = { ...state.objects };\n draft.order = [...state.order];\n draft.counter = state.counter;\n // Cast qua Draft<State['meta']> — immer chấp nhận structurally\n // identical shape, chỉ stricter readonly.\n draft.meta = { ...state.meta } as typeof draft.meta;\n return;\n }\n case 'TRANSACTION': {\n for (const sub of action.payload.actions) {\n reduce(draft, sub);\n }\n return;\n }\n case 'UPDATE_VIEW': {\n // Action payload typed cho graph-2d ViewSettings. Bỏ qua nếu domain\n // khác (view shape không tương thích — 2d dùng bbox, 3d dùng bbox3D).\n if (draft.meta.domain !== 'graph2d') return;\n Object.assign(draft.meta.view, action.payload.patch);\n return;\n }\n }\n}\n","// src/core/scene/store.ts\nimport { produce } from 'immer';\nimport { reduce } from './reducer';\nimport type { Action, State } from './types';\n\nexport type StoreListener = (next: State, prev: State, action: Action) => void;\n\nexport interface Store {\n getState(): State;\n dispatch(action: Action): void;\n subscribe(listener: StoreListener): () => void;\n undo(): void;\n redo(): void;\n canUndo(): boolean;\n canRedo(): boolean;\n transaction(fn: (dispatch: (a: Action) => void) => void): void;\n withoutHistory(fn: () => void): void;\n}\n\nexport type StoreOptions = { historyLimit?: number };\n\nconst HISTORY_DEFAULT = 100;\n\nconst UNDO_ACTION: Action = { type: 'TRANSACTION', payload: { actions: [] } };\nconst REDO_ACTION: Action = { type: 'TRANSACTION', payload: { actions: [] } };\n\nexport function createStore(initial: State, options: StoreOptions = {}): Store {\n const limit = options.historyLimit ?? HISTORY_DEFAULT;\n let state = initial;\n const past: State[] = [];\n const future: State[] = [];\n const listeners = new Set<StoreListener>();\n let dispatching = false;\n let suspendHistory = false;\n let transactionActions: Action[] | null = null;\n\n function notify(prev: State, action: Action): void {\n listeners.forEach(l => l(state, prev, action));\n }\n\n function pushHistory(prev: State): void {\n if (suspendHistory) return;\n past.push(prev);\n if (past.length > limit) past.shift();\n future.length = 0;\n }\n\n function applyAction(action: Action): void {\n const prev = state;\n state = produce(state, draft => { reduce(draft, action); });\n if (state !== prev) {\n pushHistory(prev);\n notify(prev, action);\n }\n }\n\n return {\n getState: () => state,\n\n dispatch(action: Action) {\n if (dispatching) throw new Error('[scene] không được dispatch trong subscriber');\n if (transactionActions) {\n transactionActions.push(action);\n return;\n }\n dispatching = true;\n try { applyAction(action); } finally { dispatching = false; }\n },\n\n subscribe(listener) {\n listeners.add(listener);\n return () => { listeners.delete(listener); };\n },\n\n undo() {\n const prev = past.pop();\n if (!prev) return;\n future.push(state);\n const old = state;\n state = prev;\n notify(old, UNDO_ACTION);\n },\n\n redo() {\n const next = future.pop();\n if (!next) return;\n past.push(state);\n if (past.length > limit) past.shift();\n const old = state;\n state = next;\n notify(old, REDO_ACTION);\n },\n\n canUndo: () => past.length > 0,\n canRedo: () => future.length > 0,\n\n transaction(fn) {\n if (transactionActions) throw new Error('[scene] transaction lồng nhau không hỗ trợ');\n transactionActions = [];\n try { fn((a) => { transactionActions!.push(a); }); }\n finally {\n const actions = transactionActions;\n transactionActions = null;\n if (actions.length > 0) {\n applyAction({ type: 'TRANSACTION', payload: { actions } });\n }\n }\n },\n\n withoutHistory(fn) {\n const prevSuspend = suspendHistory;\n suspendHistory = true;\n try { fn(); } finally { suspendHistory = prevSuspend; }\n },\n };\n}\n","// src/core/scene/selectors.ts\nimport type { State, SceneObject } from './types';\nimport { getKind } from './registry';\n\nexport function listObjects(state: State): SceneObject[] {\n return state.order\n .map(id => state.objects[id])\n .filter((o): o is SceneObject => o !== undefined);\n}\n\nexport function byKind(state: State, kind: string): SceneObject[] {\n return listObjects(state).filter(o => o.kind === kind);\n}\n\nexport function dependentsOf(state: State, rootId: string): Set<string> {\n const result = new Set<string>([rootId]);\n let grew = true;\n while (grew) {\n grew = false;\n for (const obj of Object.values(state.objects)) {\n if (result.has(obj.id)) continue;\n let def;\n try { def = getKind(obj.kind); } catch { continue; }\n const refs = def.dependsOn(obj.attrs as never);\n if (refs.some(r => result.has(r))) {\n result.add(obj.id);\n grew = true;\n }\n }\n }\n return result;\n}\n\nconst ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\n/**\n * Nhóm các kind chia chung namespace label. User nhìn point free, intersection,\n * midpoint đều là \"điểm\" có tên 1 chữ cái — không được trùng tên dù khác kind\n * trong scene store. Ví dụ tam giác ABC + giao điểm 2 đường: giao điểm phải là\n * D (không phải A trùng đỉnh tam giác).\n */\nconst LABEL_GROUPS: Record<string, readonly string[]> = {\n point: ['point', 'intersection'],\n intersection: ['point', 'intersection'],\n};\n\nexport function nextLabel(state: State, kind: string): string {\n const kinds = LABEL_GROUPS[kind] ?? [kind];\n const used = new Set(\n listObjects(state).filter(o => kinds.includes(o.kind)).map(o => o.label),\n );\n for (const c of ALPHABET) if (!used.has(c)) return c;\n let idx = 1;\n while (true) {\n for (const c of ALPHABET) {\n const candidate = `${c}${idx}`;\n if (!used.has(candidate)) return candidate;\n }\n idx += 1;\n }\n}\n","// src/core/scene/hooks/useEditorState.ts\nimport * as React from 'react';\nimport type { Store } from '../store';\nimport type { State } from '../types';\n\nexport interface UseEditorStateOptions {\n /** Store sẵn có (host owns). */\n store: Store;\n /** Serialized scene để LOAD lúc mount. Null/undefined = bỏ qua. */\n initialState?: { state: State } | null;\n /** Notify host mỗi khi store fire (canUndo/canRedo có thể đổi). */\n onHistoryChange?: (canUndo: boolean, canRedo: boolean) => void;\n /** Bind Ctrl/Cmd+Z, Cmd+Shift+Z, Ctrl+Y. Default true. */\n bindKeyboardShortcuts?: boolean;\n}\n\n// Side effects chung cho stamp editor panel mà host owns store:\n// - LOAD initial state một lần (trong withoutHistory để không bẩn undo stack).\n// - Propagate canUndo/canRedo lên host qua callback.\n// - Bind global keyboard shortcuts cho undo/redo.\nexport function useEditorState(opts: UseEditorStateOptions): void {\n const { store, initialState, onHistoryChange, bindKeyboardShortcuts = true } = opts;\n\n const onHistoryChangeRef = React.useRef(onHistoryChange);\n onHistoryChangeRef.current = onHistoryChange;\n\n React.useEffect(() => {\n if (initialState?.state) {\n const loaded = initialState.state;\n store.withoutHistory(() => {\n store.dispatch({ type: 'LOAD', payload: { state: loaded } });\n });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n React.useEffect(() => {\n onHistoryChangeRef.current?.(store.canUndo(), store.canRedo());\n const unsub = store.subscribe(() => {\n onHistoryChangeRef.current?.(store.canUndo(), store.canRedo());\n });\n return unsub;\n }, [store]);\n\n React.useEffect(() => {\n if (!bindKeyboardShortcuts) return;\n const onKey = (e: KeyboardEvent) => {\n const ae = document.activeElement as HTMLElement | null;\n const inField = !!(\n ae && (ae.tagName === 'INPUT' || ae.tagName === 'TEXTAREA' || ae.isContentEditable)\n );\n if (inField) return;\n if (!(e.metaKey || e.ctrlKey)) return;\n const key = e.key.toLowerCase();\n if (key === 'z' && !e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n store.undo();\n } else if ((key === 'z' && e.shiftKey) || (key === 'y' && !e.shiftKey)) {\n e.preventDefault();\n e.stopPropagation();\n store.redo();\n }\n };\n window.addEventListener('keydown', onKey, { capture: true });\n return () => window.removeEventListener('keydown', onKey, { capture: true });\n }, [store, bindKeyboardShortcuts]);\n}\n","// src/core/scene/hooks/index.ts\nexport { useSceneStore } from './useSceneStore';\nexport type { SceneStoreApi } from './useSceneStore';\nexport { useEditorState } from './useEditorState';\nexport type { UseEditorStateOptions } from './useEditorState';\n","// src/core/scene/kinds/3d-constraint.ts\nexport type Vec3 = [number, number, number];\n\nexport type Constraint3D =\n | { kind: 'free'; x: number; y: number; z: number }\n | { kind: 'onGround'; x: number; y: number }\n | { kind: 'onAxis'; axis: 'x' | 'y' | 'z'; t: number }\n | { kind: 'onPlane'; planeId: string; u: number; v: number }\n | { kind: 'onLine'; lineId: string; t: number }\n | { kind: 'onPolygon'; polygonId: string; u: number; v: number }\n | { kind: 'onSphere'; sphereId: string; theta: number; phi: number };\n\nexport function constraintRefs(c: Constraint3D): string[] {\n switch (c.kind) {\n case 'onPlane': return [c.planeId];\n case 'onLine': return [c.lineId];\n case 'onPolygon': return [c.polygonId];\n case 'onSphere': return [c.sphereId];\n default: return [];\n }\n}\n","// src/core/scene/kinds/point3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef, RenderCtx, SceneObject } from '../types';\nimport { type Constraint3D, constraintRefs } from './3d-constraint';\n\nexport type Point3DAttrs = {\n constraint: Constraint3D;\n color?: string;\n};\n\nconst def: KindDef<Point3DAttrs> = {\n type: 'point3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a || !a.constraint || !a.constraint.kind) {\n throw new Error('point3d: constraint required');\n }\n },\n dependsOn: (a) => constraintRefs(a.constraint),\n measure: (obj) => {\n const c = obj.attrs.constraint;\n if (c.kind === 'free') {\n return [\n { label: 'x', value: c.x },\n { label: 'y', value: c.y },\n { label: 'z', value: c.z },\n ];\n }\n if (c.kind === 'onGround') {\n return [\n { label: 'x', value: c.x },\n { label: 'y', value: c.y },\n { label: 'z', value: 0 },\n ];\n }\n return null;\n },\n describe: (obj) => {\n const c = obj.attrs.constraint;\n if (c.kind === 'free') return `${obj.label} = (${c.x.toFixed(2)}, ${c.y.toFixed(2)}, ${c.z.toFixed(2)})`;\n if (c.kind === 'onGround') return `${obj.label} = (${c.x.toFixed(2)}, ${c.y.toFixed(2)}, 0)`;\n if (c.kind === 'onAxis') return `${obj.label} trên trục ${c.axis} (t=${c.t.toFixed(2)})`;\n if (c.kind === 'onPlane') return `${obj.label} trên mặt ${c.planeId}`;\n if (c.kind === 'onLine') return `${obj.label} trên đường ${c.lineId}`;\n if (c.kind === 'onPolygon') return `${obj.label} trên đa giác ${c.polygonId}`;\n if (c.kind === 'onSphere') return `${obj.label} trên mặt cầu ${c.sphereId}`;\n return obj.label;\n },\n render: (obj, ctx: RenderCtx) => {\n const view = ctx.jxg as any;\n const c = obj.attrs.constraint;\n const opts = {\n name: obj.label,\n visible: obj.visible,\n fixed: obj.locked,\n strokeColor: obj.attrs.color ?? '#1e40af',\n fillColor: obj.attrs.color ?? '#1e40af',\n size: 4,\n };\n if (c.kind === 'free') {\n return view.create('point3d', [c.x, c.y, c.z], opts);\n } else if (c.kind === 'onGround') {\n return view.create('point3d', [c.x, c.y, 0], opts);\n } else if (c.kind === 'onAxis') {\n const coords =\n c.axis === 'x' ? [c.t, 0, 0] :\n c.axis === 'y' ? [0, c.t, 0] :\n [0, 0, c.t];\n return view.create('point3d', coords, opts);\n } else if (c.kind === 'onPlane') {\n const plane = ctx.resolveRef(c.planeId) as any;\n return view.create('point3d', [\n () => plane.F(c.u, c.v)[0],\n () => plane.F(c.u, c.v)[1],\n () => plane.F(c.u, c.v)[2],\n ], opts);\n } else if (c.kind === 'onLine') {\n const line = ctx.resolveRef(c.lineId) as any;\n return view.create('point3d', [\n () => line.F(c.t)[0],\n () => line.F(c.t)[1],\n () => line.F(c.t)[2],\n ], opts);\n } else if (c.kind === 'onPolygon') {\n const poly = ctx.resolveRef(c.polygonId) as any;\n return view.create('point3d', [\n () => poly.F(c.u, c.v)[0],\n () => poly.F(c.u, c.v)[1],\n () => poly.F(c.u, c.v)[2],\n ], opts);\n } else if (c.kind === 'onSphere') {\n const sph = ctx.resolveRef(c.sphereId) as any;\n return view.create('point3d', [\n () => sph.F(c.theta, c.phi)[0],\n () => sph.F(c.theta, c.phi)[1],\n () => sph.F(c.theta, c.phi)[2],\n ], opts);\n }\n return view.create('point3d', [0, 0, 0], opts);\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/labelOf.ts\nimport type { State } from '../types';\n\n/**\n * Resolve một object id sang label hiển thị. Dùng trong describe() để show\n * tên đẹp (\"AB\") thay vì internal id (\"p_1p_2\"). Fallback về id nếu không\n * tìm thấy (vd state chưa truyền vào, hoặc ref chỉ tới object đã bị xoá).\n */\nexport function labelOf(id: string, state: State | undefined): string {\n return state?.objects[id]?.label ?? id;\n}\n","// src/core/scene/kinds/segment3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\nexport type Segment3DAttrs = { p1: string; p2: string; color?: string };\n\nconst def: KindDef<Segment3DAttrs> = {\n type: 'segment3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a?.p1 || !a?.p2) throw new Error('segment3d: p1 và p2 bắt buộc');\n },\n dependsOn: (a) => [a.p1, a.p2],\n measure: (obj, state) => {\n const p1 = state.objects[obj.attrs.p1];\n const p2 = state.objects[obj.attrs.p2];\n if (!p1 || !p2) return null;\n const c1 = (p1.attrs as { constraint?: { kind: string; x?: number; y?: number; z?: number } }).constraint;\n const c2 = (p2.attrs as { constraint?: { kind: string; x?: number; y?: number; z?: number } }).constraint;\n if (c1?.kind !== 'free' || c2?.kind !== 'free') return null;\n const dx = (c2.x ?? 0) - (c1.x ?? 0);\n const dy = (c2.y ?? 0) - (c1.y ?? 0);\n const dz = (c2.z ?? 0) - (c1.z ?? 0);\n return [{ label: 'length', value: Math.hypot(dx, dy, dz) }];\n },\n describe: (obj, state) => `Đoạn thẳng ${labelOf(obj.attrs.p1, state)}${labelOf(obj.attrs.p2, state)}`,\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n const pA = ctx.resolveRef(obj.attrs.p1);\n const pB = ctx.resolveRef(obj.attrs.p2);\n return view.create('line3d', [pA, pB], {\n straightFirst: false,\n straightLast: false,\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: 2,\n visible: obj.visible,\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/line3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\nexport type Line3DAttrs = { p1: string; p2: string; color?: string };\n\nregisterKind<Line3DAttrs>({\n type: 'line3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => { if (!a?.p1 || !a?.p2) throw new Error('line3d: p1/p2 required'); },\n dependsOn: (a) => [a.p1, a.p2],\n describe: (obj, state) => `Đường ${obj.label} qua ${labelOf(obj.attrs.p1, state)}, ${labelOf(obj.attrs.p2, state)}`,\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n const pA = ctx.resolveRef(obj.attrs.p1);\n const pB = ctx.resolveRef(obj.attrs.p2);\n return view.create('line3d', [pA, pB], {\n straightFirst: true,\n straightLast: true,\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: 2,\n visible: obj.visible,\n });\n },\n});\n","// src/core/scene/kinds/ray3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\nexport type Ray3DAttrs = { origin: string; through: string; color?: string };\n\nregisterKind<Ray3DAttrs>({\n type: 'ray3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => { if (!a?.origin || !a?.through) throw new Error('ray3d: origin/through required'); },\n dependsOn: (a) => [a.origin, a.through],\n describe: (obj, state) => `Tia ${obj.label} từ ${labelOf(obj.attrs.origin, state)} qua ${labelOf(obj.attrs.through, state)}`,\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n const pOrigin = ctx.resolveRef(obj.attrs.origin);\n const pThrough = ctx.resolveRef(obj.attrs.through);\n return view.create('line3d', [pOrigin, pThrough], {\n straightFirst: false,\n straightLast: true,\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: 2,\n visible: obj.visible,\n });\n },\n});\n","// src/core/scene/kinds/vector3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\nexport type Vector3DAttrs = { from: string; to: string; color?: string };\n\nregisterKind<Vector3DAttrs>({\n type: 'vector3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => { if (!a?.from || !a?.to) throw new Error('vector3d: from/to required'); },\n dependsOn: (a) => [a.from, a.to],\n describe: (obj, state) => `Véc-tơ ${obj.label}: ${labelOf(obj.attrs.from, state)} → ${labelOf(obj.attrs.to, state)}`,\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n const pFrom = ctx.resolveRef(obj.attrs.from);\n const pTo = ctx.resolveRef(obj.attrs.to);\n return view.create('line3d', [pFrom, pTo], {\n straightFirst: false,\n straightLast: false,\n lastArrow: { type: 1 },\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: 2,\n visible: obj.visible,\n });\n },\n});\n","// src/core/scene/kinds/plane3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\nexport type Plane3DAttrs = { p1: string; p2: string; p3: string; color?: string };\n\nregisterKind<Plane3DAttrs>({\n type: 'plane3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => { if (!a?.p1 || !a?.p2 || !a?.p3) throw new Error('plane3d: cần 3 điểm'); },\n dependsOn: (a) => [a.p1, a.p2, a.p3],\n describe: (obj, state) => `Mặt ${obj.label} qua ${labelOf(obj.attrs.p1, state)}, ${labelOf(obj.attrs.p2, state)}, ${labelOf(obj.attrs.p3, state)}`,\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n return view.create('plane3d', [\n ctx.resolveRef(obj.attrs.p1),\n ctx.resolveRef(obj.attrs.p2),\n ctx.resolveRef(obj.attrs.p3),\n ], {\n fillOpacity: 0.15,\n fillColor: obj.attrs.color ?? '#60a5fa',\n strokeColor: obj.attrs.color ?? '#60a5fa',\n visible: obj.visible,\n });\n },\n});\n","// src/core/scene/kinds/polygon3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\n\nexport type Polygon3DAttrs = { vertices: string[]; color?: string };\n\nregisterKind<Polygon3DAttrs>({\n type: 'polygon3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a?.vertices || a.vertices.length < 3) throw new Error('polygon3d: cần ≥3 vertices');\n },\n dependsOn: (a) => [...a.vertices],\n describe: (obj) => `Đa giác ${obj.label} (${obj.attrs.vertices.length} đỉnh)`,\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n const refs = obj.attrs.vertices.map(id => ctx.resolveRef(id));\n return view.create('polygon3d', [refs], {\n fillOpacity: 0.3,\n fillColor: obj.attrs.color ?? '#60a5fa',\n visible: obj.visible,\n });\n },\n});\n","// src/core/scene/kinds/sphere3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\nexport type Sphere3DAttrs = { center: string; surfacePoint: string; color?: string };\n\nregisterKind<Sphere3DAttrs>({\n type: 'sphere3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => { if (!a?.center || !a?.surfacePoint) throw new Error('sphere3d: center/surfacePoint required'); },\n dependsOn: (a) => [a.center, a.surfacePoint],\n describe: (obj, state) => `Mặt cầu ${obj.label} tâm ${labelOf(obj.attrs.center, state)}`,\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n return view.create('sphere3d', [\n ctx.resolveRef(obj.attrs.center),\n ctx.resolveRef(obj.attrs.surfacePoint),\n ], {\n fillOpacity: 0.25,\n fillColor: obj.attrs.color ?? '#60a5fa',\n visible: obj.visible,\n });\n },\n});\n","// src/core/scene/kinds/polyhedron3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\n\nexport type PolyhedronFlavor = 'pyramid' | 'prism' | 'tetrahedron' | 'cube';\n\nexport type Polyhedron3DAttrs = {\n flavor: PolyhedronFlavor;\n vertices: string[];\n faces: number[][];\n color?: string;\n};\n\nconst FLAVOR_LABEL: Record<PolyhedronFlavor, string> = {\n pyramid: 'chóp',\n prism: 'lăng trụ',\n tetrahedron: 'tứ diện',\n cube: 'lập phương',\n};\n\nregisterKind<Polyhedron3DAttrs>({\n type: 'polyhedron3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a?.vertices || a.vertices.length < 4) throw new Error('polyhedron3d: cần ≥4 vertices');\n if (!a?.faces || a.faces.length < 4) throw new Error('polyhedron3d: cần ≥4 faces');\n },\n dependsOn: (a) => [...a.vertices],\n describe: (obj) => `Khối ${FLAVOR_LABEL[obj.attrs.flavor]} ${obj.label}`,\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n const verts = obj.attrs.vertices.map(id => ctx.resolveRef(id));\n const faces = obj.attrs.faces.map((faceIndices, fi) =>\n view.create('polygon3d', [faceIndices.map(i => verts[i])], {\n id: `${obj.id}.face${faceIndices.join('-')}.${fi}`,\n fillOpacity: 0.25,\n fillColor: obj.attrs.color ?? '#fbbf24',\n strokeColor: '#0066cc',\n strokeWidth: 1.5,\n visible: obj.visible,\n })\n );\n return { faces };\n },\n});\n","// src/core/scene/kinds/cylinder3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\n\nexport type Cylinder3DAttrs = { baseCenter: string; topCenter: string; radius: number; color?: string };\n\n// Faceted cylinder: 16 segments, copied from old JxgRenderer faceted.ts approach.\nconst CURVED_SEGMENTS = 16;\n\nregisterKind<Cylinder3DAttrs>({\n type: 'cylinder3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a?.baseCenter || !a?.topCenter) throw new Error('cylinder3d: baseCenter/topCenter required');\n if (!(a.radius > 0)) throw new Error('cylinder3d: radius > 0');\n },\n dependsOn: (a) => [a.baseCenter, a.topCenter],\n describe: (obj) => `Trụ ${obj.label} R=${obj.attrs.radius.toFixed(2)}`,\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n const a = ctx.resolveRef(obj.attrs.baseCenter) as any;\n const b = ctx.resolveRef(obj.attrs.topCenter) as any;\n const r = obj.attrs.radius;\n // Read world coords from JSXGraph point3d objects at render time.\n const ax = a.X?.() ?? 0, ay = a.Y?.() ?? 0, az = a.Z?.() ?? 0;\n const bx = b.X?.() ?? 0, by = b.Y?.() ?? 0, bz = b.Z?.() ?? 0;\n // Build faceted cylinder vertices.\n const baseRing: [number, number, number][] = [];\n const topRing: [number, number, number][] = [];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const theta = (i / CURVED_SEGMENTS) * Math.PI * 2;\n const dx = r * Math.cos(theta);\n const dy = r * Math.sin(theta);\n baseRing.push([ax + dx, ay + dy, az]);\n topRing.push([bx + dx, by + dy, bz]);\n }\n const vertices = [...baseRing, ...topRing];\n const faces: number[][] = [];\n faces.push(baseRing.map((_, i) => i));\n faces.push(topRing.map((_, i) => CURVED_SEGMENTS + i));\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const next = (i + 1) % CURVED_SEGMENTS;\n faces.push([i, next, CURVED_SEGMENTS + next, CURVED_SEGMENTS + i]);\n }\n const vertJxgs: unknown[] = vertices.map((v, i) =>\n view.create('point3d', v, {\n id: `${obj.id}.v${i}`,\n visible: false,\n fixed: true,\n withLabel: false,\n })\n );\n const faceJxgs: unknown[] = faces.map((face, fi) =>\n view.create('polygon3d', [face.map(idx => vertJxgs[idx])], {\n id: `${obj.id}.face${fi}`,\n fillOpacity: 0.25,\n fillColor: obj.attrs.color ?? '#f97316',\n strokeColor: '#0066cc',\n strokeWidth: 1.5,\n visible: obj.visible,\n })\n );\n return { _verts: vertJxgs, faces: faceJxgs };\n },\n});\n","// src/core/scene/kinds/cone3d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\n\nexport type Cone3DAttrs = { baseCenter: string; apex: string; radius: number; color?: string };\n\n// Faceted cone: 16 segments, copied from old JxgRenderer faceted.ts approach.\nconst CURVED_SEGMENTS = 16;\n\nregisterKind<Cone3DAttrs>({\n type: 'cone3d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a?.baseCenter || !a?.apex) throw new Error('cone3d: baseCenter/apex required');\n if (!(a.radius > 0)) throw new Error('cone3d: radius > 0');\n },\n dependsOn: (a) => [a.baseCenter, a.apex],\n describe: (obj) => `Nón ${obj.label} R=${obj.attrs.radius.toFixed(2)}`,\n render: (obj, ctx) => {\n const view = ctx.jxg as any;\n const base = ctx.resolveRef(obj.attrs.baseCenter) as any;\n const apexPt = ctx.resolveRef(obj.attrs.apex) as any;\n const r = obj.attrs.radius;\n // Read world coords from JSXGraph point3d objects at render time.\n const bx = base.X?.() ?? 0, by = base.Y?.() ?? 0, bz = base.Z?.() ?? 0;\n const apexCoords: [number, number, number] = [\n apexPt.X?.() ?? 0,\n apexPt.Y?.() ?? 0,\n apexPt.Z?.() ?? 0,\n ];\n // Build faceted cone vertices.\n const baseRing: [number, number, number][] = [];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n const theta = (i / CURVED_SEGMENTS) * Math.PI * 2;\n baseRing.push([bx + r * Math.cos(theta), by + r * Math.sin(theta), bz]);\n }\n const apexIdx = baseRing.length;\n const vertices = [...baseRing, apexCoords];\n const faces: number[][] = [baseRing.map((_, i) => i)];\n for (let i = 0; i < CURVED_SEGMENTS; i++) {\n faces.push([i, (i + 1) % CURVED_SEGMENTS, apexIdx]);\n }\n const vertJxgs: unknown[] = vertices.map((v, i) =>\n view.create('point3d', v, {\n id: `${obj.id}.v${i}`,\n visible: false,\n fixed: true,\n withLabel: false,\n })\n );\n const faceJxgs: unknown[] = faces.map((face, fi) =>\n view.create('polygon3d', [face.map(idx => vertJxgs[idx])], {\n id: `${obj.id}.face${fi}`,\n fillOpacity: 0.25,\n fillColor: obj.attrs.color ?? '#f59e0b',\n strokeColor: '#0066cc',\n strokeWidth: 1.5,\n visible: obj.visible,\n })\n );\n return { _verts: vertJxgs, faces: faceJxgs };\n },\n});\n","// src/core/scene/kinds/2d-constraint.ts\nexport type Vec2 = [number, number];\n\n/**\n * Phép biến hình áp dụng lên một điểm. Tham số là id điểm/đường gốc, không phải\n * giá trị toạ độ — để dependency graph cập nhật đúng khi user kéo gốc.\n *\n * - translate: dx/dy là số literal (frozen). Trade-off để serialize đơn giản\n * qua JSON; transformed object không tự cập nhật khi user kéo điểm vector.\n * - reflectPoint = rotate π quanh center — biểu diễn riêng để render trực tiếp.\n * - dilate quanh center: implement bằng chain T(-c) → S(k) → T(+c) ở render-time\n * (JSXGraph 'scale' không nhận center).\n */\nexport type TransformDef =\n | { kind: 'translate'; dx: number; dy: number }\n | { kind: 'rotate'; angleRad: number; center: string }\n | { kind: 'reflectLine'; line: string }\n | { kind: 'reflectPoint'; center: string }\n | { kind: 'dilate'; k: number; center: string };\n\nexport function transformRefs(t: TransformDef): string[] {\n switch (t.kind) {\n case 'translate': return [];\n case 'rotate':\n case 'reflectPoint':\n case 'dilate':\n return [t.center];\n case 'reflectLine':\n return [t.line];\n }\n}\n\nexport type Constraint2D =\n | { kind: 'free'; x: number; y: number }\n | { kind: 'onAxis'; axis: 'x' | 'y'; t: number }\n | { kind: 'onLine'; lineId: string; t: number }\n | { kind: 'onSegment'; segmentId: string; t: number }\n | { kind: 'onCircle'; circleId: string; theta: number }\n | { kind: 'onPolygon'; polygonId: string; u: number; v: number }\n | { kind: 'midpoint'; p1: string; p2: string }\n | { kind: 'transformed'; source: string; transform: TransformDef }\n | { kind: 'perpFoot'; from: string; onLine: string }\n | { kind: 'circumcenter'; vertices: [string, string, string] }\n | { kind: 'incenter'; vertices: [string, string, string] }\n | { kind: 'centroid'; vertices: [string, string, string] }\n | { kind: 'orthocenter'; vertices: [string, string, string] };\n\nexport function constraintRefs2D(c: Constraint2D): string[] {\n switch (c.kind) {\n case 'onLine': return [c.lineId];\n case 'onSegment': return [c.segmentId];\n case 'onCircle': return [c.circleId];\n case 'onPolygon': return [c.polygonId];\n case 'midpoint': return [c.p1, c.p2];\n case 'transformed': return [c.source, ...transformRefs(c.transform)];\n case 'perpFoot': return [c.from, c.onLine];\n case 'circumcenter': return [c.vertices[0], c.vertices[1], c.vertices[2]];\n case 'incenter': return [c.vertices[0], c.vertices[1], c.vertices[2]];\n case 'centroid': return [c.vertices[0], c.vertices[1], c.vertices[2]];\n case 'orthocenter': return [c.vertices[0], c.vertices[1], c.vertices[2]];\n default: return [];\n }\n}\n","// src/core/scene/kinds/point.ts\nimport { registerKind } from '../registry';\nimport type { KindDef, RenderCtx } from '../types';\nimport { type Constraint2D, type TransformDef, constraintRefs2D } from './2d-constraint';\n\n/**\n * Build mảng JSXGraph 'transform' elements cho TransformDef. Dilate → chain\n * 3 transform (T(-c) → S(k) → T(+c)) vì JSXGraph 'scale' không nhận center.\n *\n * Center là pointId; resolve qua ctx + dùng function-based để dilate cập nhật\n * live khi user kéo center.\n */\n \nfunction buildJxgTransforms(board: any, ctx: RenderCtx, t: TransformDef): any[] {\n switch (t.kind) {\n case 'translate':\n return [board.create('transform', [t.dx, t.dy], { type: 'translate' })];\n case 'rotate': {\n \n const c: any = ctx.resolveRef(t.center);\n return [board.create('transform', [t.angleRad, c], { type: 'rotate' })];\n }\n case 'reflectPoint': {\n // Đối xứng qua điểm = quay π quanh điểm đó.\n \n const c: any = ctx.resolveRef(t.center);\n return [board.create('transform', [Math.PI, c], { type: 'rotate' })];\n }\n case 'reflectLine': {\n \n const l: any = ctx.resolveRef(t.line);\n return [board.create('transform', [l], { type: 'reflect' })];\n }\n case 'dilate': {\n \n const c: any = ctx.resolveRef(t.center);\n // Function-based để chain cập nhật khi user kéo center.\n return [\n board.create('transform', [() => -c.X(), () => -c.Y()], { type: 'translate' }),\n board.create('transform', [t.k, t.k], { type: 'scale' }),\n board.create('transform', [() => c.X(), () => c.Y()], { type: 'translate' }),\n ];\n }\n }\n}\n\nexport type PointAttrs = {\n constraint: Constraint2D;\n color?: string;\n showLabel?: boolean;\n showValue?: boolean;\n face?: 'o' | 'circle' | 'cross' | 'plus';\n size?: number;\n};\n\nconst def: KindDef<PointAttrs> = {\n type: 'point',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a || !a.constraint || !a.constraint.kind) {\n throw new Error('point: constraint required');\n }\n const c = a.constraint;\n if (c.kind === 'perpFoot') {\n if (!c.from || !c.onLine) {\n throw new Error('point.perpFoot: from và onLine bắt buộc');\n }\n }\n if (c.kind === 'circumcenter') {\n if (!Array.isArray(c.vertices) || c.vertices.length !== 3) {\n throw new Error('point.circumcenter: vertices phải là tuple 3 id');\n }\n if (!c.vertices[0] || !c.vertices[1] || !c.vertices[2]) {\n throw new Error('point.circumcenter: 3 vertex id phải non-empty');\n }\n }\n if (c.kind === 'incenter') {\n if (!Array.isArray(c.vertices) || c.vertices.length !== 3) {\n throw new Error('point.incenter: vertices phải là tuple 3 id');\n }\n if (!c.vertices[0] || !c.vertices[1] || !c.vertices[2]) {\n throw new Error('point.incenter: 3 vertex id phải non-empty');\n }\n }\n if (c.kind === 'centroid') {\n if (!Array.isArray(c.vertices) || c.vertices.length !== 3) {\n throw new Error('point.centroid: vertices phải là tuple 3 id');\n }\n if (!c.vertices[0] || !c.vertices[1] || !c.vertices[2]) {\n throw new Error('point.centroid: 3 vertex id phải non-empty');\n }\n }\n if (c.kind === 'orthocenter') {\n if (!Array.isArray(c.vertices) || c.vertices.length !== 3) {\n throw new Error('point.orthocenter: vertices phải là tuple 3 id');\n }\n if (!c.vertices[0] || !c.vertices[1] || !c.vertices[2]) {\n throw new Error('point.orthocenter: 3 vertex id phải non-empty');\n }\n }\n },\n dependsOn: (a) => constraintRefs2D(a.constraint),\n measure: (obj) => {\n const c = obj.attrs.constraint;\n if (c.kind === 'free') {\n return [\n { label: 'x', value: c.x },\n { label: 'y', value: c.y },\n ];\n }\n return null;\n },\n describe: (obj, state) => {\n const c = obj.attrs.constraint;\n if (c.kind === 'free') return `Điểm ${obj.label}`;\n if (c.kind === 'onAxis') return `${obj.label} trên trục ${c.axis}`;\n if (c.kind === 'onLine') return `${obj.label} trên đường ${state?.objects[c.lineId]?.label ?? c.lineId}`;\n if (c.kind === 'onSegment') return `${obj.label} trên đoạn ${state?.objects[c.segmentId]?.label ?? c.segmentId}`;\n if (c.kind === 'onCircle') return `${obj.label} trên đường tròn ${state?.objects[c.circleId]?.label ?? c.circleId}`;\n if (c.kind === 'onPolygon') return `${obj.label} trên đa giác ${state?.objects[c.polygonId]?.label ?? c.polygonId}`;\n if (c.kind === 'midpoint') {\n const l1 = state?.objects[c.p1]?.label ?? c.p1;\n const l2 = state?.objects[c.p2]?.label ?? c.p2;\n return `${obj.label} = trung điểm ${l1}${l2}`;\n }\n if (c.kind === 'transformed') {\n const t = c.transform;\n const labelRef = (id: string) => state?.objects[id]?.label ?? id;\n const op =\n t.kind === 'translate' ? `tịnh tiến (${t.dx.toFixed(2)}, ${t.dy.toFixed(2)})`\n : t.kind === 'rotate' ? `quay ${((t.angleRad * 180) / Math.PI).toFixed(0)}° quanh ${labelRef(t.center)}`\n : t.kind === 'reflectLine' ? `đối xứng qua ${labelRef(t.line)}`\n : t.kind === 'reflectPoint' ? `đối xứng qua điểm ${labelRef(t.center)}`\n : t.kind === 'dilate' ? `vị tự k=${t.k} quanh ${labelRef(t.center)}`\n : '';\n return `${obj.label} = ảnh của ${labelRef(c.source)} (${op})`;\n }\n if (c.kind === 'perpFoot') {\n const fromLabel = state?.objects[c.from]?.label ?? c.from;\n const lineLabel = state?.objects[c.onLine]?.label ?? c.onLine;\n return `${obj.label} = chân ⟂ từ ${fromLabel} xuống ${lineLabel}`;\n }\n if (c.kind === 'circumcenter') {\n const labels = c.vertices.map((id) => state?.objects[id]?.label ?? id).join('');\n return `${obj.label} = tâm ngoại tiếp Δ${labels}`;\n }\n if (c.kind === 'incenter') {\n const labels = c.vertices.map((id) => state?.objects[id]?.label ?? id).join('');\n return `${obj.label} = tâm nội tiếp Δ${labels}`;\n }\n if (c.kind === 'centroid') {\n const labels = c.vertices.map((id) => state?.objects[id]?.label ?? id).join('');\n return `${obj.label} = trọng tâm Δ${labels}`;\n }\n if (c.kind === 'orthocenter') {\n const labels = c.vertices.map((id) => state?.objects[id]?.label ?? id).join('');\n return `${obj.label} = trực tâm Δ${labels}`;\n }\n return `Điểm ${obj.label}`;\n },\n render: (obj, ctx) => {\n const board = ctx.jxg as any;\n const c = obj.attrs.constraint;\n const opts: Record<string, unknown> = {\n name: obj.label,\n withLabel: obj.attrs.showLabel ?? true,\n visible: obj.visible,\n fixed: obj.locked,\n strokeColor: obj.attrs.color ?? '#1e40af',\n fillColor: obj.attrs.color ?? '#1e40af',\n face: obj.attrs.face ?? 'o',\n size: obj.attrs.size ?? 4,\n };\n if (c.kind === 'free') return board.create('point', [c.x, c.y], opts);\n if (c.kind === 'onAxis') {\n const coords: [number, number] = c.axis === 'x' ? [c.t, 0] : [0, c.t];\n return board.create('point', coords, opts);\n }\n if (c.kind === 'onLine') {\n const line = ctx.resolveRef(c.lineId) as any;\n return board.create('glider', [c.t, c.t, line], opts);\n }\n if (c.kind === 'onSegment') {\n const seg = ctx.resolveRef(c.segmentId) as any;\n return board.create('glider', [c.t, c.t, seg], opts);\n }\n if (c.kind === 'onCircle') {\n const circle = ctx.resolveRef(c.circleId) as any;\n return board.create('glider', [Math.cos(c.theta), Math.sin(c.theta), circle], opts);\n }\n if (c.kind === 'onPolygon') {\n const poly = ctx.resolveRef(c.polygonId) as any;\n return board.create('glider', [c.u, c.v, poly], opts);\n }\n if (c.kind === 'midpoint') {\n const p1 = ctx.resolveRef(c.p1) as any;\n const p2 = ctx.resolveRef(c.p2) as any;\n return board.create('midpoint', [p1, p2], opts);\n }\n if (c.kind === 'transformed') {\n \n const src: any = ctx.resolveRef(c.source);\n const transforms = buildJxgTransforms(board, ctx, c.transform);\n const parent = transforms.length === 1 ? transforms[0] : transforms;\n // JSXGraph: create('point', [src, transformParent]) — src first.\n \n const pt: any = board.create('point', [src, parent], opts);\n // Renderer dọn _helpers khi remove element (xem JxgRenderer.remove).\n pt._helpers = transforms;\n return pt;\n }\n if (c.kind === 'perpFoot') {\n \n const from: any = ctx.resolveRef(c.from);\n \n const onLine: any = ctx.resolveRef(c.onLine);\n // JSXGraph 'perpendicularpoint': create('perpendicularpoint', [line, point])\n // → trả về chân vuông góc của point xuống line.\n return board.create('perpendicularpoint', [onLine, from], opts);\n }\n if (c.kind === 'circumcenter') {\n \n const a: any = ctx.resolveRef(c.vertices[0]);\n \n const b: any = ctx.resolveRef(c.vertices[1]);\n \n const c3: any = ctx.resolveRef(c.vertices[2]);\n // JSXGraph 'circumcenter': create('circumcenter', [A, B, C])\n return board.create('circumcenter', [a, b, c3], opts);\n }\n if (c.kind === 'incenter') {\n \n const a: any = ctx.resolveRef(c.vertices[0]);\n \n const b: any = ctx.resolveRef(c.vertices[1]);\n \n const c3: any = ctx.resolveRef(c.vertices[2]);\n return board.create('incenter', [a, b, c3], opts);\n }\n if (c.kind === 'centroid') {\n \n const a: any = ctx.resolveRef(c.vertices[0]);\n \n const b: any = ctx.resolveRef(c.vertices[1]);\n \n const c3: any = ctx.resolveRef(c.vertices[2]);\n // JSXGraph function-based point: parents = [() => x, () => y]\n // Function được gọi lại mỗi frame → live update khi user kéo vertex.\n return board.create('point', [\n () => (a.X() + b.X() + c3.X()) / 3,\n () => (a.Y() + b.Y() + c3.Y()) / 3,\n ], opts);\n }\n if (c.kind === 'orthocenter') {\n \n const a: any = ctx.resolveRef(c.vertices[0]);\n \n const b: any = ctx.resolveRef(c.vertices[1]);\n \n const c3: any = ctx.resolveRef(c.vertices[2]);\n const hide = { visible: false, withLabel: false, fixed: true, name: '' };\n // Altitude A→BC: line BC + perpendicular từ A xuống BC.\n const lineBC = board.create('line', [b, c3], hide);\n const altA = board.create('perpendicular', [lineBC, a], hide);\n // Altitude B→AC: line AC + perpendicular từ B xuống AC.\n const lineAC = board.create('line', [a, c3], hide);\n const altB = board.create('perpendicular', [lineAC, b], hide);\n // Trực tâm = giao 2 altitude (branch 0 — chỉ có 1 giao điểm).\n \n const ortho: any = board.create('intersection', [altA, altB, 0], opts);\n ortho._helpers = [lineBC, altA, lineAC, altB];\n return ortho;\n }\n return board.create('point', [0, 0], opts);\n },\n /**\n * Free → Free update giữ nguyên JxgObj identity (gọi setPositionDirectly +\n * setAttribute) để các object phụ thuộc (line/segment/...) không bị stale\n * parent ref. Đổi constraint kind → throw để renderer fallback recreate.\n *\n * Đây cũng là endpoint cho drag-sync dispatch trong JxgRenderer: khi user\n * kéo điểm, listener dispatch UPDATE_ATTRS → update hook chạy, vị trí đã\n * đúng sẵn nên setPositionDirectly là no-op nhưng vẫn cần để sync các attrs\n * khác (label/color/...).\n */\n update: (obj, prev, ctx, existing) => {\n const c = obj.attrs.constraint;\n const oldC = prev.attrs.constraint;\n if (c.kind === 'free' && oldC.kind === 'free') {\n \n const el = existing as any;\n // JXG.COORDS_BY_USER = 1 (hardcoded constant — JSXGraph không export\n // qua module API, lấy qua window.JXG sẽ phải gánh thêm phụ thuộc).\n if (typeof el.setPositionDirectly === 'function') {\n try { el.setPositionDirectly(1, [c.x, c.y]); } catch { /* ignore */ }\n }\n if (typeof el.setAttribute === 'function') {\n try {\n el.setAttribute({\n name: obj.label,\n withLabel: obj.attrs.showLabel ?? true,\n visible: obj.visible,\n fixed: obj.locked,\n strokeColor: obj.attrs.color ?? '#1e40af',\n fillColor: obj.attrs.color ?? '#1e40af',\n face: obj.attrs.face ?? 'o',\n size: obj.attrs.size ?? 4,\n });\n } catch { /* ignore */ }\n }\n void ctx;\n return;\n }\n throw new Error('point: constraint kind changed — recreate');\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/segment.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\nexport type SegmentAttrs = {\n p1: string;\n p2: string;\n color?: string;\n width?: number;\n dash?: number;\n showLabel?: boolean;\n showValue?: boolean;\n};\n\nconst def: KindDef<SegmentAttrs> = {\n type: 'segment',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a?.p1 || !a?.p2) throw new Error('segment: p1 và p2 bắt buộc');\n },\n dependsOn: (a) => [a.p1, a.p2],\n measure: (obj, state) => {\n const p1 = state.objects[obj.attrs.p1];\n const p2 = state.objects[obj.attrs.p2];\n if (!p1 || !p2) return null;\n const c1 = (p1.attrs as { constraint?: { kind: string; x?: number; y?: number } }).constraint;\n const c2 = (p2.attrs as { constraint?: { kind: string; x?: number; y?: number } }).constraint;\n if (c1?.kind !== 'free' || c2?.kind !== 'free') return null;\n const dx = (c2.x ?? 0) - (c1.x ?? 0);\n const dy = (c2.y ?? 0) - (c1.y ?? 0);\n return [{ label: 'length', value: Math.hypot(dx, dy) }];\n },\n describe: (obj, state) => `Đoạn thẳng ${labelOf(obj.attrs.p1, state)}${labelOf(obj.attrs.p2, state)}`,\n render: (obj, ctx) => {\n const board = ctx.jxg as any;\n const p1 = ctx.resolveRef(obj.attrs.p1);\n const p2 = ctx.resolveRef(obj.attrs.p2);\n return board.create('segment', [p1, p2], {\n name: obj.label,\n withLabel: obj.attrs.showLabel ?? false,\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: obj.attrs.width ?? 2,\n dash: obj.attrs.dash ?? 0,\n visible: obj.visible,\n fixed: obj.locked,\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/line.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\n/**\n * Cách dựng đường thẳng phái sinh. Khi `construction` có mặt, `p1`/`p2` ở\n * trên LineAttrs bị bỏ qua — renderer dùng nhánh tương ứng (perpendicular /\n * parallel / perpBisector / angleBisector / tangent).\n *\n * Lưu ý: tangent dựng qua một glider ẩn nằm trên đường tròn gần `throughPoint`;\n * glider được lưu tại property `_helpers` của element trả về để renderer dọn\n * dẹp khi đường tangent bị xoá.\n */\nexport type LineConstruction =\n | { kind: 'perpendicular'; throughPoint: string; toLine: string }\n | { kind: 'parallel'; throughPoint: string; toLine: string }\n | { kind: 'perpBisector'; p1: string; p2: string }\n | { kind: 'angleBisector'; p1: string; vertex: string; p2: string }\n | { kind: 'angleBisectorLines'; line1: string; line2: string; branch: 0 | 1 }\n | { kind: 'tangent'; throughPoint: string; toCircle: string; branch?: 0 | 1 | 'on' };\n\nexport type LineAttrs = {\n /** Hai-điểm fallback — bắt buộc khi không có `construction`. */\n p1?: string;\n p2?: string;\n construction?: LineConstruction;\n color?: string;\n width?: number;\n dash?: number;\n showLabel?: boolean;\n};\n\n// Polygon edges là sub-segment do JSXGraph tự tạo bên trong polygon — không có\n// scene id riêng. Synthetic id \"<polyId>:border:<i>\" cho phép construct tools\n// (perpendicular, parallel) tham chiếu cạnh đa giác như một line, nhưng\n// dependency graph cần biết line phụ thuộc vào polygon thật (để DELETE polygon\n// cascade xoá line). Strip suffix về polyId ở đây.\nfunction stripBorderSuffix(id: string): string {\n const m = /^(.+):border:\\d+$/.exec(id);\n return m ? m[1] : id;\n}\n\nfunction constructionRefs(c: LineConstruction): string[] {\n switch (c.kind) {\n case 'perpendicular':\n case 'parallel':\n return [c.throughPoint, stripBorderSuffix(c.toLine)];\n case 'perpBisector':\n return [c.p1, c.p2];\n case 'angleBisector':\n return [c.p1, c.vertex, c.p2];\n case 'angleBisectorLines':\n return [stripBorderSuffix(c.line1), stripBorderSuffix(c.line2)];\n case 'tangent':\n return [c.throughPoint, c.toCircle];\n }\n}\n\nconst def: KindDef<LineAttrs> = {\n type: 'line',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (a?.construction) return;\n if (!a?.p1 || !a?.p2) throw new Error('line: p1 và p2 bắt buộc (hoặc construction)');\n },\n dependsOn: (a) => (a.construction ? constructionRefs(a.construction) : [a.p1!, a.p2!]),\n describe: (obj, state) => {\n const L = (id: string) => labelOf(id, state);\n const c = obj.attrs.construction;\n if (!c) return `Đường thẳng ${L(obj.attrs.p1!)}${L(obj.attrs.p2!)}`;\n switch (c.kind) {\n case 'perpendicular': return `${obj.label} ⟂ ${L(c.toLine)} qua ${L(c.throughPoint)}`;\n case 'parallel': return `${obj.label} ∥ ${L(c.toLine)} qua ${L(c.throughPoint)}`;\n case 'perpBisector': return `${obj.label}: trung trực ${L(c.p1)}${L(c.p2)}`;\n case 'angleBisector': return `${obj.label}: phân giác góc ${L(c.p1)}${L(c.vertex)}${L(c.p2)}`;\n case 'angleBisectorLines': return `${obj.label}: phân giác ${L(c.line1)} & ${L(c.line2)} (${c.branch === 0 ? '1' : '2'})`;\n case 'tangent': return `${obj.label}: tiếp tuyến ${L(c.toCircle)} qua ${L(c.throughPoint)}`;\n }\n },\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n const baseOpts: Record<string, unknown> = {\n name: obj.label,\n withLabel: obj.attrs.showLabel ?? false,\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: obj.attrs.width ?? 2,\n dash: obj.attrs.dash ?? 0,\n visible: obj.visible,\n fixed: obj.locked,\n };\n const c = obj.attrs.construction;\n if (!c) {\n const p1 = ctx.resolveRef(obj.attrs.p1!);\n const p2 = ctx.resolveRef(obj.attrs.p2!);\n return board.create('line', [p1, p2], {\n ...baseOpts,\n straightFirst: true,\n straightLast: true,\n });\n }\n switch (c.kind) {\n case 'perpendicular': {\n const through = ctx.resolveRef(c.throughPoint);\n const toLine = ctx.resolveRef(c.toLine);\n // JSXGraph: create('perpendicular', [line, point]) → line qua point ⟂ line\n return board.create('perpendicular', [toLine, through], baseOpts);\n }\n case 'parallel': {\n const through = ctx.resolveRef(c.throughPoint);\n const toLine = ctx.resolveRef(c.toLine);\n return board.create('parallel', [toLine, through], baseOpts);\n }\n case 'perpBisector': {\n // JSXGraph 1.12 không có element 'perpendicularbisector' — compose từ\n // midpoint + helper line + perpendicular. Helper objects được lưu vào\n // `_helpers` để JxgRenderer.remove() dọn dẹp khi line bị xoá.\n const p1 = ctx.resolveRef(c.p1);\n const p2 = ctx.resolveRef(c.p2);\n const mid = board.create('midpoint', [p1, p2], {\n visible: false, withLabel: false, fixed: true, name: '',\n });\n const helperLine = board.create('line', [p1, p2], {\n visible: false, withLabel: false, fixed: true, name: '',\n straightFirst: true, straightLast: true,\n });\n const bisector = board.create('perpendicular', [helperLine, mid], baseOpts);\n (bisector as Record<string, unknown>)._helpers = [mid, helperLine];\n return bisector;\n }\n case 'angleBisector': {\n const p1 = ctx.resolveRef(c.p1);\n const vertex = ctx.resolveRef(c.vertex);\n const p2 = ctx.resolveRef(c.p2);\n return board.create('bisector', [p1, vertex, p2], baseOpts);\n }\n case 'angleBisectorLines': {\n // JSXGraph 'bisectorlines' tạo 2 đường phân giác vuông góc của góc giữa\n // 2 đường thẳng (qua giao điểm). Composition trả về có .line1 và .line2.\n // Mỗi scene entry chỉ hiển thị 1 nhánh (branch 0/1) — nhánh còn lại lưu\n // trong _helpers để JxgRenderer dọn dẹp khi entry bị xoá.\n \n const line1Jxg = ctx.resolveRef(c.line1) as any;\n \n const line2Jxg = ctx.resolveRef(c.line2) as any;\n const comp = board.create('bisectorlines', [line1Jxg, line2Jxg], {\n line1: { visible: false, withLabel: false, fixed: true, name: '' },\n line2: { visible: false, withLabel: false, fixed: true, name: '' },\n });\n \n const selected = (c.branch === 0 ? comp.line1 : comp.line2) as any;\n \n const other = (c.branch === 0 ? comp.line2 : comp.line1) as any;\n selected.setAttribute({\n ...baseOpts,\n visible: obj.visible,\n fixed: obj.locked,\n });\n (selected as Record<string, unknown>)._helpers = [other];\n return selected;\n }\n case 'tangent': {\n \n const through = ctx.resolveRef(c.throughPoint) as any;\n \n const toCircle = ctx.resolveRef(c.toCircle) as any;\n const branch = c.branch ?? 'on';\n\n if (branch === 'on') {\n // P trên đường tròn (hoặc legacy data trước khi có branch): glider\n // tại P + JXG tangent element. Backward-compat với data cũ.\n const glider = board.create('glider', [through.X(), through.Y(), toCircle], {\n visible: false, withLabel: false, fixed: true, name: '',\n });\n const tangent = board.create('tangent', [glider], baseOpts);\n (tangent as Record<string, unknown>)._helpers = [glider];\n return tangent;\n }\n\n // branch 0 | 1: dựng qua Thales-circle intersection.\n // M = midpoint(O, P). Auxiliary circle tâm M qua O và P → 2 giao\n // điểm với đường tròn gốc là 2 tiếp điểm T (∠OTP = 90°).\n // Tangent line = line(P, T_branch).\n const center = toCircle.center;\n const mid = board.create('midpoint', [center, through], {\n visible: false, withLabel: false, fixed: true, name: '',\n });\n const thales = board.create('circle', [mid, through], {\n visible: false, withLabel: false, fixed: true,\n strokeOpacity: 0, fillOpacity: 0,\n });\n const touch = board.create('intersection', [thales, toCircle, branch], {\n visible: false, withLabel: false, fixed: true, name: '',\n });\n const tangent = board.create('line', [through, touch], {\n ...baseOpts, straightFirst: true, straightLast: true,\n });\n (tangent as Record<string, unknown>)._helpers = [mid, thales, touch];\n return tangent;\n }\n }\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/ray.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\nexport type RayAttrs = {\n origin: string;\n through: string;\n color?: string;\n width?: number;\n dash?: number;\n};\n\nconst def: KindDef<RayAttrs> = {\n type: 'ray',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a?.origin || !a?.through) throw new Error('ray: origin và through bắt buộc');\n },\n dependsOn: (a) => [a.origin, a.through],\n describe: (obj, state) => `Tia ${labelOf(obj.attrs.origin, state)}${labelOf(obj.attrs.through, state)}`,\n render: (obj, ctx) => {\n const board = ctx.jxg as any;\n const o = ctx.resolveRef(obj.attrs.origin);\n const t = ctx.resolveRef(obj.attrs.through);\n return board.create('line', [o, t], {\n name: obj.label,\n straightFirst: false,\n straightLast: true,\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: obj.attrs.width ?? 2,\n dash: obj.attrs.dash ?? 0,\n visible: obj.visible,\n fixed: obj.locked,\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/vector.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\nexport type VectorAttrs = {\n from: string;\n to: string;\n color?: string;\n width?: number;\n};\n\nconst def: KindDef<VectorAttrs> = {\n type: 'vector',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a?.from || !a?.to) throw new Error('vector: from và to bắt buộc');\n },\n dependsOn: (a) => [a.from, a.to],\n describe: (obj, state) => `Vector ${labelOf(obj.attrs.from, state)}${labelOf(obj.attrs.to, state)}`,\n render: (obj, ctx) => {\n const board = ctx.jxg as any;\n const f = ctx.resolveRef(obj.attrs.from);\n const t = ctx.resolveRef(obj.attrs.to);\n return board.create('arrow', [f, t], {\n name: obj.label,\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: obj.attrs.width ?? 2,\n visible: obj.visible,\n fixed: obj.locked,\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/circle.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\n/**\n * Cách dựng đường tròn phái sinh. Khi `construction` có mặt, `center`/\n * `surfacePoint` bị bỏ qua — renderer dùng JSXGraph `circumcircle` để dựng\n * đường tròn ngoại tiếp 3 điểm.\n */\nexport type CircleConstruction =\n | { kind: 'circumscribed'; p1: string; p2: string; p3: string };\n\nexport type CircleAttrs = {\n /** Hai-điểm fallback — bắt buộc khi không có `construction`. */\n center?: string;\n surfacePoint?: string;\n construction?: CircleConstruction;\n color?: string;\n width?: number;\n dash?: number;\n showLabel?: boolean;\n showValue?: boolean;\n};\n\nfunction constructionRefs(c: CircleConstruction): string[] {\n switch (c.kind) {\n case 'circumscribed': return [c.p1, c.p2, c.p3];\n }\n}\n\nconst def: KindDef<CircleAttrs> = {\n type: 'circle',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (a?.construction) return;\n if (!a?.center || !a?.surfacePoint) {\n throw new Error('circle: center và surfacePoint bắt buộc (hoặc construction)');\n }\n },\n dependsOn: (a) => (a.construction ? constructionRefs(a.construction) : [a.center!, a.surfacePoint!]),\n measure: (obj, state) => {\n // Circumscribed circles need full geometric derivation — skip for now.\n if (obj.attrs.construction) return null;\n const center = obj.attrs.center ? state.objects[obj.attrs.center] : undefined;\n const surface = obj.attrs.surfacePoint ? state.objects[obj.attrs.surfacePoint] : undefined;\n if (!center || !surface) return null;\n const c1 = (center.attrs as { constraint?: { kind: string; x?: number; y?: number } }).constraint;\n const c2 = (surface.attrs as { constraint?: { kind: string; x?: number; y?: number } }).constraint;\n if (c1?.kind !== 'free' || c2?.kind !== 'free') return null;\n const dx = (c2.x ?? 0) - (c1.x ?? 0);\n const dy = (c2.y ?? 0) - (c1.y ?? 0);\n return [{ label: 'r', value: Math.hypot(dx, dy) }];\n },\n describe: (obj, state) => {\n const L = (id: string) => labelOf(id, state);\n const c = obj.attrs.construction;\n if (c?.kind === 'circumscribed') {\n return `Đường tròn đi qua ${L(c.p1)}${L(c.p2)}${L(c.p3)}`;\n }\n return `Đường tròn tâm ${L(obj.attrs.center!)} bán kính ${L(obj.attrs.center!)}${L(obj.attrs.surfacePoint!)}`;\n },\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n const baseOpts: Record<string, unknown> = {\n name: obj.label,\n withLabel: obj.attrs.showLabel ?? false,\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: obj.attrs.width ?? 2,\n dash: obj.attrs.dash ?? 0,\n fillColor: 'none',\n visible: obj.visible,\n fixed: obj.locked,\n };\n const c = obj.attrs.construction;\n if (c?.kind === 'circumscribed') {\n const p1 = ctx.resolveRef(c.p1);\n const p2 = ctx.resolveRef(c.p2);\n const p3 = ctx.resolveRef(c.p3);\n return board.create('circumcircle', [p1, p2, p3], baseOpts);\n }\n const center = ctx.resolveRef(obj.attrs.center!);\n const surface = ctx.resolveRef(obj.attrs.surfacePoint!);\n return board.create('circle', [center, surface], baseOpts);\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/arc.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\nexport type ArcConstruction =\n | { kind: 'semicircle'; p1: string; p2: string }\n | { kind: 'byCenter'; center: string; p1: string; p2: string }\n | { kind: 'by3Points'; p1: string; p2: string; p3: string };\n\nexport type ArcAttrs = {\n construction: ArcConstruction;\n color?: string;\n width?: number;\n dash?: number;\n showLabel?: boolean;\n};\n\nfunction constructionRefs(c: ArcConstruction): string[] {\n switch (c.kind) {\n case 'semicircle': return [c.p1, c.p2];\n case 'byCenter': return [c.center, c.p1, c.p2];\n case 'by3Points': return [c.p1, c.p2, c.p3];\n }\n}\n\nconst def: KindDef<ArcAttrs> = {\n type: 'arc',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n const c = a?.construction;\n if (!c) throw new Error('arc: construction bắt buộc');\n if (c.kind === 'semicircle') {\n if (!c.p1 || !c.p2) throw new Error('arc.semicircle: p1, p2 bắt buộc');\n } else if (c.kind === 'byCenter') {\n if (!c.center || !c.p1 || !c.p2) throw new Error('arc.byCenter: center, p1, p2 bắt buộc');\n } else if (c.kind === 'by3Points') {\n if (!c.p1 || !c.p2 || !c.p3) throw new Error('arc.by3Points: p1, p2, p3 bắt buộc');\n }\n },\n dependsOn: (a) => constructionRefs(a.construction),\n describe: (obj, state) => {\n const L = (id: string) => labelOf(id, state);\n const c = obj.attrs.construction;\n switch (c.kind) {\n case 'semicircle': return `Nửa đường tròn đường kính ${L(c.p1)}${L(c.p2)}`;\n case 'byCenter': return `Cung tròn tâm ${L(c.center)} từ ${L(c.p1)} đến ${L(c.p2)}`;\n case 'by3Points': return `Cung tròn qua ${L(c.p1)}${L(c.p2)}${L(c.p3)}`;\n }\n },\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n const baseOpts: Record<string, unknown> = {\n name: obj.label,\n withLabel: obj.attrs.showLabel ?? false,\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: obj.attrs.width ?? 2,\n dash: obj.attrs.dash ?? 0,\n fillColor: 'none',\n visible: obj.visible,\n fixed: obj.locked,\n };\n const c = obj.attrs.construction;\n if (c.kind === 'semicircle') {\n const p1 = ctx.resolveRef(c.p1);\n const p2 = ctx.resolveRef(c.p2);\n return board.create('semicircle', [p1, p2], baseOpts);\n }\n if (c.kind === 'byCenter') {\n const O = ctx.resolveRef(c.center);\n const A = ctx.resolveRef(c.p1);\n const B = ctx.resolveRef(c.p2);\n return board.create('arc', [O, A, B], baseOpts);\n }\n // by3Points\n const A = ctx.resolveRef(c.p1);\n const B = ctx.resolveRef(c.p2);\n const C = ctx.resolveRef(c.p3);\n return board.create('circumcirclearc', [A, B, C], baseOpts);\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/sector.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\nexport type SectorConstruction =\n | { kind: 'byCenter'; center: string; p1: string; p2: string };\n\nexport type SectorAttrs = {\n construction: SectorConstruction;\n color?: string;\n width?: number;\n fillColor?: string;\n fillOpacity?: number;\n showLabel?: boolean;\n};\n\nconst def: KindDef<SectorAttrs> = {\n type: 'sector',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n const c = a?.construction;\n if (!c) throw new Error('sector: construction bắt buộc');\n if (c.kind === 'byCenter') {\n if (!c.center || !c.p1 || !c.p2) {\n throw new Error('sector.byCenter: center, p1, p2 bắt buộc');\n }\n }\n },\n dependsOn: (a) => {\n const c = a.construction;\n return [c.center, c.p1, c.p2];\n },\n describe: (obj, state) => {\n const L = (id: string) => labelOf(id, state);\n const c = obj.attrs.construction;\n return `Hình quạt tâm ${L(c.center)} từ ${L(c.p1)} đến ${L(c.p2)}`;\n },\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n const c = obj.attrs.construction;\n const O = ctx.resolveRef(c.center);\n const A = ctx.resolveRef(c.p1);\n const B = ctx.resolveRef(c.p2);\n return board.create('sector', [O, A, B], {\n name: obj.label,\n withLabel: obj.attrs.showLabel ?? false,\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: obj.attrs.width ?? 2,\n fillColor: obj.attrs.fillColor ?? '#f59e0b',\n fillOpacity: obj.attrs.fillOpacity ?? 0.18,\n visible: obj.visible,\n fixed: obj.locked,\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/polygon.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\n/** Tên tiếng Việt cho đa giác đều theo số cạnh. */\nfunction regularPolygonName(n: number): string {\n if (n === 3) return 'Tam giác đều';\n if (n === 4) return 'Hình vuông';\n if (n === 5) return 'Ngũ giác đều';\n if (n === 6) return 'Lục giác đều';\n return `${n}-giác đều`;\n}\n\n/**\n * Sinh nhãn đỉnh dạng \"ABCDE...\" khi p1/p2 là 2 chữ cái in hoa liên tiếp.\n * Vd p1=A, p2=B, n=4 → \"ABCD\". Vd p1=C, p2=D, n=3 → \"CDE\".\n * Fallback \"p1Label · p2Label…\" khi không suy ra được dãy chữ.\n */\nfunction regularVertexLabels(p1Label: string, p2Label: string, n: number): string {\n const A = 'A'.charCodeAt(0);\n const Z = 'Z'.charCodeAt(0);\n if (p1Label.length === 1 && p2Label.length === 1) {\n const c1 = p1Label.charCodeAt(0);\n const c2 = p2Label.charCodeAt(0);\n if (c1 >= A && c1 <= Z && c2 === c1 + 1 && c1 + n - 1 <= Z) {\n let out = '';\n for (let i = 0; i < n; i++) out += String.fromCharCode(c1 + i);\n return out;\n }\n }\n return `${p1Label}${p2Label}…`;\n}\n\n/**\n * Cách dựng đa giác phái sinh. Khi `construction` có mặt, `vertices` bị bỏ qua\n * — renderer dùng nhánh tương ứng.\n *\n * - regular: đa giác đều n cạnh dựng từ 2 đỉnh kề (p1, p2 = vertex0, vertex1).\n * JSXGraph 'regularpolygon' tự sinh n-2 đỉnh còn lại.\n */\nexport type PolygonConstruction =\n | { kind: 'regular'; p1: string; p2: string; n: number };\n\nexport type PolygonAttrs = {\n /** Danh sách đỉnh — bắt buộc khi không có `construction`. */\n vertices?: string[];\n construction?: PolygonConstruction;\n color?: string;\n fillOpacity?: number;\n width?: number;\n showLabel?: boolean;\n showValue?: boolean; // hiển thị diện tích\n};\n\nconst def: KindDef<PolygonAttrs> = {\n type: 'polygon',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (a?.construction) {\n if (a.construction.kind === 'regular') {\n if (!a.construction.p1 || !a.construction.p2) {\n throw new Error('polygon (regular): p1 và p2 bắt buộc');\n }\n if (!Number.isFinite(a.construction.n) || a.construction.n < 3) {\n throw new Error('polygon (regular): n ≥ 3');\n }\n }\n return;\n }\n if (!Array.isArray(a?.vertices) || a.vertices.length < 3) {\n throw new Error('polygon: cần ít nhất 3 đỉnh');\n }\n },\n dependsOn: (a) => {\n if (a.construction?.kind === 'regular') return [a.construction.p1, a.construction.p2];\n return [...(a.vertices ?? [])];\n },\n describe: (obj, state) => {\n if (obj.attrs.construction?.kind === 'regular') {\n const c = obj.attrs.construction;\n const labels = regularVertexLabels(labelOf(c.p1, state), labelOf(c.p2, state), c.n);\n return `${regularPolygonName(c.n)} ${labels}`;\n }\n return `Đa giác ${(obj.attrs.vertices ?? []).map((id) => labelOf(id, state)).join('')}`;\n },\n render: (obj, ctx) => {\n const board = ctx.jxg as any;\n const label = obj.label;\n const showValue = obj.attrs.showValue ?? false;\n // Construction 'regular': dùng JSXGraph 'regularpolygon' với 2 đỉnh kề + n.\n // showValue không support cho regular (JSXGraph 'regularpolygon' không expose\n // Area() — nếu cần, user có thể đo qua tool 'area' riêng).\n if (obj.attrs.construction?.kind === 'regular') {\n const c = obj.attrs.construction;\n const p1 = ctx.resolveRef(c.p1);\n const p2 = ctx.resolveRef(c.p2);\n return board.create('regularpolygon', [p1, p2, c.n], {\n name: label,\n withLabel: obj.attrs.showLabel ?? false,\n borders: {\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: obj.attrs.width ?? 2,\n },\n fillColor: obj.attrs.color ?? '#60a5fa',\n fillOpacity: obj.attrs.fillOpacity ?? 0.15,\n visible: obj.visible,\n fixed: obj.locked,\n });\n }\n const verts = (obj.attrs.vertices ?? []).map(id => ctx.resolveRef(id));\n // showValue=true: hiển thị label dạng \"ABC: S = 8.50\" với diện tích live.\n // showLabel=false + showValue=true: chỉ số diện tích. JSXGraph polygon's\n // Area() trả về |∮ x dy| theo đỉnh hiện tại → live update khi kéo đỉnh.\n \n const poly = board.create('polygon', verts, {\n name: showValue\n \n ? function (this: any) {\n // `this` là polygon element; gọi Area() để lấy giá trị live.\n const a = typeof this.Area === 'function' ? this.Area() : 0;\n const prefix = (obj.attrs.showLabel ?? true) ? `${label}: ` : '';\n return `${prefix}S = ${Math.abs(a).toFixed(2)}`;\n }\n : label,\n withLabel: showValue ? true : (obj.attrs.showLabel ?? false),\n borders: {\n strokeColor: obj.attrs.color ?? '#0f172a',\n strokeWidth: obj.attrs.width ?? 2,\n },\n fillColor: obj.attrs.color ?? '#60a5fa',\n fillOpacity: obj.attrs.fillOpacity ?? 0.15,\n visible: obj.visible,\n fixed: obj.locked,\n });\n return poly;\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/intersection.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\n\nexport type IntersectionAttrs =\n | { kind: 'lineLine'; ref1: string; ref2: string; color?: string }\n | { kind: 'lineCircle'; ref1: string; ref2: string; branch: 0 | 1; color?: string }\n | { kind: 'circleCircle'; ref1: string; ref2: string; branch: 0 | 1; color?: string };\n\nconst def: KindDef<IntersectionAttrs> = {\n type: 'intersection',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a || !('kind' in a)) throw new Error('intersection: kind bắt buộc');\n if (!a.ref1 || !a.ref2) throw new Error('intersection: ref1 và ref2 bắt buộc');\n if (a.kind === 'lineLine') return;\n if (a.kind === 'lineCircle' || a.kind === 'circleCircle') {\n if (a.branch !== 0 && a.branch !== 1) {\n throw new Error(`intersection.${a.kind}: branch phải là 0 hoặc 1`);\n }\n return;\n }\n throw new Error(`intersection: kind không hợp lệ \"${(a as { kind: string }).kind}\"`);\n },\n dependsOn: (a) => [a.ref1, a.ref2],\n describe: (obj) => {\n const a = obj.attrs;\n return `${obj.label} = giao ${a.ref1} ∩ ${a.ref2}`;\n },\n render: (obj, ctx) => {\n const board = ctx.jxg as any;\n const a = ctx.resolveRef(obj.attrs.ref1);\n const b = ctx.resolveRef(obj.attrs.ref2);\n const opts: Record<string, unknown> = {\n name: obj.label,\n withLabel: true,\n strokeColor: obj.attrs.color ?? '#dc2626',\n fillColor: obj.attrs.color ?? '#dc2626',\n visible: obj.visible,\n fixed: obj.locked,\n };\n if (obj.attrs.kind === 'lineLine') {\n return board.create('intersection', [a, b, 0], opts);\n }\n // lineCircle hoặc circleCircle: branch 0/1\n const branch = obj.attrs.branch ?? 0;\n return board.create('intersection', [a, b, branch], opts);\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/angle.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\n/**\n * Angle measurement: cung tròn + label giá trị tại đỉnh.\n *\n * JSXGraph vẽ cung từ p1 → p2 theo chiều dương (CCW). Nếu cross(p1−v, p2−v) < 0\n * thì cung CCW > 180° (reflex) — đổi vai trò p1/p2 ở render-time để luôn hiển\n * thị góc nhọn/tù thay vì góc phản.\n */\nexport type AngleAttrs = {\n p1: string;\n vertex: string;\n p2: string;\n color?: string;\n fillOpacity?: number;\n radius?: number;\n showLabel?: boolean;\n};\n\nconst def: KindDef<AngleAttrs> = {\n type: 'angle',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a?.p1 || !a?.vertex || !a?.p2) {\n throw new Error('angle: p1, vertex, p2 bắt buộc');\n }\n },\n dependsOn: (a) => [a.p1, a.vertex, a.p2],\n describe: (obj, state) => `Góc ${labelOf(obj.attrs.p1, state)}${labelOf(obj.attrs.vertex, state)}${labelOf(obj.attrs.p2, state)}`,\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n \n const pa: any = ctx.resolveRef(obj.attrs.p1);\n \n const pv: any = ctx.resolveRef(obj.attrs.vertex);\n \n const pc: any = ctx.resolveRef(obj.attrs.p2);\n // Cross-product check: reorder để tránh cung reflex (> 180°). Chỉ check\n // một lần tại render-time (không live) — user có thể di chuyển điểm sau\n // và làm cung lật reflex; chấp nhận trade-off vì re-order live phức tạp.\n let parents = [pa, pv, pc];\n try {\n const ax = pa.X() - pv.X(), ay = pa.Y() - pv.Y();\n const cx = pc.X() - pv.X(), cy = pc.Y() - pv.Y();\n if (ax * cy - ay * cx < 0) parents = [pc, pv, pa];\n } catch { /* fallback giữ thứ tự gốc */ }\n return board.create('angle', parents, {\n name: obj.label,\n withLabel: obj.attrs.showLabel ?? true,\n radius: obj.attrs.radius ?? 1,\n fillColor: obj.attrs.color ?? '#22c55e',\n fillOpacity: obj.attrs.fillOpacity ?? 0.25,\n strokeColor: obj.attrs.color ?? '#16a34a',\n strokeWidth: 1.5,\n visible: obj.visible,\n fixed: obj.locked,\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/distance.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { labelOf } from './labelOf';\n\n/**\n * Distance measurement: text \"d = X.XX\" hiển thị tại trung điểm p1-p2.\n *\n * Dùng function-based coords + content cho JSXGraph text → live update khi\n * user kéo p1/p2 (khác commit cũ pre-scene-v2 vốn freeze value lúc create).\n */\nexport type DistanceAttrs = {\n p1: string;\n p2: string;\n color?: string;\n fontSize?: number;\n /** Tiền tố hiển thị, mặc định 'd = '. Để '' nếu chỉ muốn số. */\n prefix?: string;\n /** Số chữ số sau dấu phẩy, mặc định 2. */\n precision?: number;\n};\n\nconst def: KindDef<DistanceAttrs> = {\n type: 'distance',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a?.p1 || !a?.p2) throw new Error('distance: p1 và p2 bắt buộc');\n },\n dependsOn: (a) => [a.p1, a.p2],\n describe: (obj, state) => `Khoảng cách ${labelOf(obj.attrs.p1, state)}${labelOf(obj.attrs.p2, state)}`,\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n \n const p1: any = ctx.resolveRef(obj.attrs.p1);\n \n const p2: any = ctx.resolveRef(obj.attrs.p2);\n const prefix = obj.attrs.prefix ?? 'd = ';\n const precision = obj.attrs.precision ?? 2;\n return board.create('text', [\n () => (p1.X() + p2.X()) / 2,\n () => (p1.Y() + p2.Y()) / 2,\n () => `${prefix}${Math.hypot(p1.X() - p2.X(), p1.Y() - p2.Y()).toFixed(precision)}`,\n ], {\n fontSize: obj.attrs.fontSize ?? 14,\n strokeColor: obj.attrs.color ?? '#dc2626',\n anchorX: 'middle',\n anchorY: 'middle',\n visible: obj.visible,\n fixed: true,\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/expressions/parser.ts\n// Pure expression parser cho function2d kind. Không import JSXGraph/React.\n\nexport const ALLOWED_CONSTANTS = ['pi', 'e'] as const;\nexport const ALLOWED_FUNCTIONS = [\n 'sin', 'cos', 'tan',\n 'asin', 'acos', 'atan', 'atan2',\n 'sinh', 'cosh', 'tanh',\n 'exp', 'log', 'log10', 'ln',\n 'sqrt', 'cbrt', 'abs',\n 'floor', 'ceil', 'round',\n 'min', 'max', 'pow',\n] as const;\n\nconst ID_RE = /[A-Za-z_][A-Za-z0-9_]*/g;\nconst UNSAFE_RE = /[=;{}]|\\beval\\b|\\bnew\\b|\\breturn\\b|\\bthis\\b|\\bwindow\\b|\\bdocument\\b|\\bglobal\\b|\\bprocess\\b/;\n\nconst NUMBER_RE = /^[+-]?(\\d+\\.?\\d*|\\.\\d+)([eE][+-]?\\d+)?$/;\n\nexport type ValidateResult = { ok: true } | { ok: false; error: string };\n\n// Detect identifiers used as function calls (followed by '(')\nconst FUNC_CALL_RE = /([A-Za-z_][A-Za-z0-9_]*)\\s*\\(/g;\n\n/** Kiểm tra expression có hợp lệ không. */\nexport function validate(expression: string): ValidateResult {\n const trimmed = expression.trim();\n if (!trimmed) return { ok: false, error: 'Biểu thức rỗng' };\n if (UNSAFE_RE.test(trimmed)) return { ok: false, error: 'Biểu thức chứa toán tử hoặc identifier không cho phép' };\n\n // Replace ^ với ** (JS không có ^)\n const jsExpr = trimmed.replace(/\\^/g, '**');\n\n // Check function call identifiers — must be in ALLOWED_FUNCTIONS\n let fm: RegExpExecArray | null;\n FUNC_CALL_RE.lastIndex = 0;\n while ((fm = FUNC_CALL_RE.exec(jsExpr)) !== null) {\n const fnName = fm[1];\n if (!(ALLOWED_FUNCTIONS as readonly string[]).includes(fnName)) {\n return { ok: false, error: `Hàm không hợp lệ: ${fnName}` };\n }\n }\n\n // Check identifiers\n const ids = new Set<string>();\n let m: RegExpExecArray | null;\n ID_RE.lastIndex = 0;\n while ((m = ID_RE.exec(jsExpr)) !== null) ids.add(m[0]);\n\n for (const id of ids) {\n if (id === 'x') continue;\n if ((ALLOWED_CONSTANTS as readonly string[]).includes(id)) continue;\n if ((ALLOWED_FUNCTIONS as readonly string[]).includes(id)) continue;\n // Remaining identifiers treat as parameter — OK at validate time.\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(id)) {\n return { ok: false, error: `Identifier không hợp lệ: ${id}` };\n }\n }\n\n // Try syntactic compile (with dummy params) to catch syntax errors.\n try {\n buildFunctionBody(jsExpr, Array.from(ids).filter(\n (id) => id !== 'x' && !(ALLOWED_CONSTANTS as readonly string[]).includes(id) && !(ALLOWED_FUNCTIONS as readonly string[]).includes(id),\n ));\n } catch (err) {\n return { ok: false, error: `Cú pháp lỗi: ${(err as Error).message}` };\n }\n\n return { ok: true };\n}\n\n/**\n * Compile expression thành function (x: number) => number.\n * - `params` map từ identifier → value để inline vào closure.\n * - Trả string error nếu invalid.\n */\nexport function compile(\n expression: string,\n params: Record<string, number>,\n): ((x: number) => number) | string {\n const v = validate(expression);\n if (!v.ok) return v.error;\n const jsExpr = expression.trim().replace(/\\^/g, '**');\n\n const ids = new Set<string>();\n let m: RegExpExecArray | null;\n ID_RE.lastIndex = 0;\n while ((m = ID_RE.exec(jsExpr)) !== null) ids.add(m[0]);\n\n const paramNames: string[] = [];\n for (const id of ids) {\n if (id === 'x') continue;\n if ((ALLOWED_CONSTANTS as readonly string[]).includes(id)) continue;\n if ((ALLOWED_FUNCTIONS as readonly string[]).includes(id)) continue;\n paramNames.push(id);\n }\n\n try {\n const body = buildFunctionBody(jsExpr, paramNames);\n \n const fn = new Function('x', ...paramNames, body) as (\n x: number,\n ...args: number[]\n ) => number;\n const args = paramNames.map((name) => params[name] ?? NaN);\n return (x: number) => fn(x, ...args);\n } catch (err) {\n return `Compile error: ${(err as Error).message}`;\n }\n}\n\nfunction buildFunctionBody(jsExpr: string, _paramNames: string[]): string {\n // Inline Math constants and functions.\n // sin → Math.sin, pi → Math.PI, e → Math.E, ln → Math.log.\n let body = jsExpr;\n body = body.replace(/\\bln\\b/g, 'Math.log');\n body = body.replace(/\\blog\\b/g, 'Math.log10');\n body = body.replace(/\\bpi\\b/g, '(Math.PI)');\n body = body.replace(/\\be\\b(?!\\w)/g, '(Math.E)');\n for (const fn of ALLOWED_FUNCTIONS) {\n if (fn === 'log' || fn === 'log10') continue; // already handled\n body = body.replace(new RegExp(`\\\\b${fn}\\\\b`, 'g'), `Math.${fn}`);\n }\n return `\"use strict\"; return (${body});`;\n}\n\n/** Liệt kê free identifiers (≠ x, ≠ allowed const/func). */\nexport function collectFreeVars(expression: string): string[] {\n const v = validate(expression);\n if (!v.ok) return [];\n const ids = new Set<string>();\n let m: RegExpExecArray | null;\n ID_RE.lastIndex = 0;\n while ((m = ID_RE.exec(expression)) !== null) ids.add(m[0]);\n const out: string[] = [];\n for (const id of ids) {\n if (id === 'x') continue;\n if ((ALLOWED_CONSTANTS as readonly string[]).includes(id)) continue;\n if ((ALLOWED_FUNCTIONS as readonly string[]).includes(id)) continue;\n if (NUMBER_RE.test(id)) continue;\n out.push(id);\n }\n return out.sort();\n}\n","// src/core/scene/kinds/function2d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { validate as validateExpr, compile } from '../expressions/parser';\n\nexport interface Function2DAttrs {\n expression: string;\n color: string;\n visible: boolean;\n domain?: { min: number; max: number };\n}\n\nconst def: KindDef<Function2DAttrs> = {\n type: 'function2d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a) throw new Error('function2d: attrs bắt buộc');\n if (typeof a.expression !== 'string' || !a.expression.trim()) {\n throw new Error('function2d: expression rỗng');\n }\n const v = validateExpr(a.expression);\n if (!v.ok) throw new Error(`function2d: expression invalid — ${v.error}`);\n if (typeof a.color !== 'string') throw new Error('function2d: color bắt buộc');\n if (typeof a.visible !== 'boolean') throw new Error('function2d: visible bắt buộc');\n if (a.domain) {\n if (a.domain.min >= a.domain.max) {\n throw new Error('function2d: domain min phải < max');\n }\n }\n },\n dependsOn: () => [],\n describe: (obj) => `${obj.label}(x) = ${obj.attrs.expression}`,\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n if (!obj.visible || !obj.attrs.visible) return null;\n const fn = compile(obj.attrs.expression, (ctx.paramMap ?? {}) as Record<string, number>);\n if (typeof fn !== 'function') return null;\n const view = (ctx.defaults as { view?: { xMin?: number; xMax?: number } }).view;\n const xMin = obj.attrs.domain?.min ?? view?.xMin ?? -10;\n const xMax = obj.attrs.domain?.max ?? view?.xMax ?? 10;\n return board.create('functiongraph', [fn, xMin, xMax], {\n strokeColor: obj.attrs.color,\n strokeWidth: 2,\n name: obj.label,\n withLabel: false,\n highlight: false,\n fixed: true,\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/parameter.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\n\nexport interface ParameterAttrs {\n value: number;\n min: number;\n max: number;\n step: number;\n}\n\nconst def: KindDef<ParameterAttrs> = {\n type: 'parameter',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a) throw new Error('parameter: attrs bắt buộc');\n if (typeof a.value !== 'number' || typeof a.min !== 'number' || typeof a.max !== 'number') {\n throw new Error('parameter: value/min/max phải là number');\n }\n if (a.min >= a.max) throw new Error('parameter: min phải < max');\n if (a.value < a.min || a.value > a.max) throw new Error('parameter: value ngoài [min, max]');\n if (typeof a.step !== 'number' || a.step <= 0) throw new Error('parameter: step phải > 0');\n },\n dependsOn: () => [],\n describe: (obj) => `${obj.label} = ${obj.attrs.value}`,\n render: () => null, // Không render lên board\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/pointOnCurve.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\n\nexport interface PointOnCurveAttrs {\n functionId: string;\n x: number;\n}\n\nconst def: KindDef<PointOnCurveAttrs> = {\n type: 'pointOnCurve',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a || typeof a.functionId !== 'string' || !a.functionId) {\n throw new Error('pointOnCurve: functionId bắt buộc');\n }\n if (typeof a.x !== 'number' || !Number.isFinite(a.x)) {\n throw new Error('pointOnCurve: x phải là finite number');\n }\n },\n dependsOn: (a) => [a.functionId],\n describe: (obj) => `${obj.label} trên ${obj.attrs.functionId} tại x=${obj.attrs.x.toFixed(3)}`,\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n const curve = ctx.resolveRef(obj.attrs.functionId);\n if (!curve) return null;\n return board.create('glider', [obj.attrs.x, 0, curve], {\n name: obj.label,\n size: 3,\n withLabel: obj.label !== '',\n fillColor: '#000',\n strokeColor: '#000',\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/tangent2d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\n\nexport interface Tangent2DAttrs {\n pointId: string;\n}\n\nconst def: KindDef<Tangent2DAttrs> = {\n type: 'tangent2d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a || typeof a.pointId !== 'string' || !a.pointId) {\n throw new Error('tangent2d: pointId bắt buộc');\n }\n },\n dependsOn: (a) => [a.pointId],\n describe: (obj) => `Tiếp tuyến tại ${obj.attrs.pointId}`,\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n const pt = ctx.resolveRef(obj.attrs.pointId);\n if (!pt) return null;\n return board.create('tangent', [pt], {\n strokeColor: '#65a30d',\n strokeWidth: 1.5,\n dash: 2,\n withLabel: false,\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/expressions/evaluator.ts\n// Numerical root + extrema scanning. Pure module.\n\nconst DEFAULT_SAMPLES = 1000;\n\n/**\n * Quét nghiệm trong [xMin, xMax] bằng sign-change detection + bisection.\n * - Lấy DEFAULT_SAMPLES sample.\n * - Mỗi sub-interval đổi dấu → bisect 30 step.\n */\nexport function scanRoots(\n fn: (x: number) => number,\n xMin: number,\n xMax: number,\n samples = DEFAULT_SAMPLES,\n): number[] {\n if (!Number.isFinite(xMin) || !Number.isFinite(xMax) || xMin >= xMax) return [];\n const out: number[] = [];\n const step = (xMax - xMin) / samples;\n let prev = fn(xMin);\n for (let i = 1; i <= samples; i++) {\n const x = xMin + i * step;\n const curr = fn(x);\n if (!Number.isFinite(prev) || !Number.isFinite(curr)) {\n prev = curr;\n continue;\n }\n // Sign change: strictly opposite signs (not both zero, not just touching zero)\n if (prev * curr < 0) {\n // Bisect\n const root = bisect(fn, x - step, x);\n if (Number.isFinite(root)) out.push(root);\n } else if (prev !== 0 && curr === 0) {\n // Exact root at x\n out.push(x);\n }\n prev = curr;\n }\n return out;\n}\n\nfunction bisect(fn: (x: number) => number, lo: number, hi: number): number {\n for (let i = 0; i < 50; i++) {\n const mid = (lo + hi) / 2;\n const fmid = fn(mid);\n if (!Number.isFinite(fmid)) break;\n if (Math.abs(fmid) < 1e-10) return mid;\n const flo = fn(lo);\n if (!Number.isFinite(flo)) break;\n if (flo * fmid <= 0) hi = mid;\n else lo = mid;\n }\n return (lo + hi) / 2;\n}\n\nexport interface Extremum {\n x: number;\n y: number;\n type: 'max' | 'min';\n}\n\n/**\n * Quét cực trị bằng sample derivative sign-change.\n * - Lấy DEFAULT_SAMPLES sample y = fn(x).\n * - Derivative xấp xỉ Δy / Δx.\n * - Đổi dấu derivative + → - = max, - → + = min.\n */\nexport function scanExtrema(\n fn: (x: number) => number,\n xMin: number,\n xMax: number,\n samples = DEFAULT_SAMPLES,\n): Extremum[] {\n if (!Number.isFinite(xMin) || !Number.isFinite(xMax) || xMin >= xMax) return [];\n const out: Extremum[] = [];\n const step = (xMax - xMin) / samples;\n // xs[0..samples+1] with xs[1..samples] covering [xMin..xMax], xs[0] and xs[samples+1] are guards\n const xs: number[] = [];\n const ys: number[] = [];\n for (let i = 0; i <= samples + 1; i++) {\n const x = xMin + (i - 1) * step;\n xs.push(x);\n ys.push(fn(x));\n }\n // xs[i] for i=1..samples corresponds to xMin + (i-1)*step\n // We check derivative sign change: d = ys[i+1] - ys[i-1]\n // When sign changes, extremum is at xs[i] = xMin + (i-1)*step\n let prevSign = 0;\n let prevSignIdx = 1;\n for (let i = 1; i <= samples; i++) {\n const d = ys[i + 1] - ys[i - 1];\n if (!Number.isFinite(d)) continue;\n const sign = d > 0 ? 1 : d < 0 ? -1 : 0;\n if (sign === 0) continue;\n if (prevSign !== 0 && sign !== prevSign) {\n const type: 'max' | 'min' = prevSign > 0 ? 'max' : 'min';\n // Extremum is between prevSignIdx and i — use midpoint\n const midI = Math.round((prevSignIdx + i) / 2);\n out.push({ x: xs[midI], y: ys[midI], type });\n }\n prevSign = sign;\n prevSignIdx = i;\n }\n return out;\n}\n","// src/core/scene/kinds/extremum2d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { scanExtrema } from '../expressions/evaluator';\nimport { compile } from '../expressions/parser';\n\nexport interface Extremum2DAttrs {\n functionId: string;\n interval: { min: number; max: number };\n mode: 'max' | 'min';\n}\n\nconst def: KindDef<Extremum2DAttrs> = {\n type: 'extremum2d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a || typeof a.functionId !== 'string' || !a.functionId) {\n throw new Error('extremum2d: functionId bắt buộc');\n }\n if (!a.interval || a.interval.min >= a.interval.max) {\n throw new Error('extremum2d: interval min phải < max');\n }\n if (a.mode !== 'max' && a.mode !== 'min') {\n throw new Error('extremum2d: mode phải là \"max\" hoặc \"min\"');\n }\n },\n dependsOn: (a) => [a.functionId],\n describe: (obj) => `${obj.attrs.mode === 'max' ? 'Cực đại' : 'Cực tiểu'} của ${obj.attrs.functionId} trong [${obj.attrs.interval.min}, ${obj.attrs.interval.max}]`,\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n // Need expression from function — look up via state if needed.\n // Simplified: use compiled-from-attrs cached in ctx.defaults._functionExpr (renderer populates).\n const expr = (ctx.defaults as { _functionExpr?: Record<string, string> })._functionExpr?.[obj.attrs.functionId];\n if (!expr) return null;\n const fn = compile(expr, (ctx.paramMap ?? {}) as Record<string, number>);\n if (typeof fn !== 'function') return null;\n const extrema = scanExtrema(fn, obj.attrs.interval.min, obj.attrs.interval.max).filter((e) => e.type === obj.attrs.mode);\n return extrema.map((e) => board.create('point', [e.x, e.y], {\n name: obj.label,\n size: 3,\n fillColor: '#dc2626',\n strokeColor: '#dc2626',\n withLabel: obj.label !== '',\n }));\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/root2d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\nimport { scanRoots } from '../expressions/evaluator';\nimport { compile } from '../expressions/parser';\n\nexport interface Root2DAttrs {\n functionId: string;\n interval: { min: number; max: number };\n}\n\nconst def: KindDef<Root2DAttrs> = {\n type: 'root2d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a || typeof a.functionId !== 'string' || !a.functionId) {\n throw new Error('root2d: functionId bắt buộc');\n }\n if (!a.interval || a.interval.min >= a.interval.max) {\n throw new Error('root2d: interval min phải < max');\n }\n },\n dependsOn: (a) => [a.functionId],\n describe: (obj) => `Nghiệm của ${obj.attrs.functionId} trong [${obj.attrs.interval.min}, ${obj.attrs.interval.max}]`,\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n const expr = (ctx.defaults as { _functionExpr?: Record<string, string> })._functionExpr?.[obj.attrs.functionId];\n if (!expr) return null;\n const fn = compile(expr, (ctx.paramMap ?? {}) as Record<string, number>);\n if (typeof fn !== 'function') return null;\n const roots = scanRoots(fn, obj.attrs.interval.min, obj.attrs.interval.max);\n return roots.map((x) => board.create('point', [x, 0], {\n name: obj.label,\n size: 3,\n fillColor: '#dc2626',\n strokeColor: '#dc2626',\n withLabel: obj.label !== '',\n }));\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/slope2d.ts\nimport { registerKind } from '../registry';\nimport type { KindDef } from '../types';\n\nexport interface Slope2DAttrs {\n pointId: string;\n}\n\nconst def: KindDef<Slope2DAttrs> = {\n type: 'slope2d',\n schemaVersion: 1,\n migrate: {},\n validate: (a) => {\n if (!a || typeof a.pointId !== 'string' || !a.pointId) {\n throw new Error('slope2d: pointId bắt buộc');\n }\n },\n dependsOn: (a) => [a.pointId],\n describe: (obj) => `Slope tại ${obj.attrs.pointId}`,\n render: (obj, ctx) => {\n \n const board = ctx.jxg as any;\n const pt = ctx.resolveRef(obj.attrs.pointId);\n if (!pt) return null;\n return board.create('slopetriangle', [pt], {\n name: obj.label,\n withLabel: true,\n fillColor: '#9333ea',\n strokeColor: '#9333ea',\n fillOpacity: 0.2,\n });\n },\n};\n\nregisterKind(def);\n","// src/core/scene/kinds/index.ts\nimport './point3d';\nimport './segment3d';\nimport './line3d';\nimport './ray3d';\nimport './vector3d';\nimport './plane3d';\nimport './polygon3d';\nimport './sphere3d';\nimport './polyhedron3d';\nimport './cylinder3d';\nimport './cone3d';\nimport './point';\nimport './segment';\nimport './line';\nimport './ray';\nimport './vector';\nimport './circle';\nimport './arc';\nimport './sector';\nimport './polygon';\nimport './intersection';\nimport './angle';\nimport './distance';\nimport './function2d';\nimport './parameter';\nimport './pointOnCurve';\nimport './tangent2d';\nimport './extremum2d';\nimport './root2d';\nimport './slope2d';\nexport {};\n","// src/core/scene/index.ts\nexport type {\n SceneObject,\n State,\n StateMeta,\n Domain,\n SceneView,\n View2D,\n View3D,\n ViewGraph2D,\n ViewSettings,\n Action,\n KindDef,\n RenderCtx,\n} from './types';\nexport {\n EMPTY_STATE,\n DEFAULT_VIEW_2D,\n DEFAULT_VIEW_3D,\n DEFAULT_VIEW_GRAPH2D,\n createEmptyState,\n} from './types';\nexport { createStore } from './store';\nexport type { Store, StoreListener, StoreOptions } from './store';\nexport { reduce } from './reducer';\nexport { registerKind, getKind, listKinds } from './registry';\nexport { listObjects, byKind, dependentsOf, nextLabel } from './selectors';\nexport { migrateState } from './migrations/runMigrations';\nexport { registerStateMigration, CURRENT_STATE_VERSION } from './migrations/state';\n\nexport { useSceneStore, useEditorState } from './hooks';\nexport type { SceneStoreApi, UseEditorStateOptions } from './hooks';\n\n// IMPORTANT: import kinds barrel để side-effect register chạy.\nimport './kinds';\n","// Shared serialize/deserialize cho scene State của stamp interactive\n// (geometry-2d, geometry-3d, graph-2d). Sau Tier D PR 3, customData chỉ\n// store JSON.stringify(state) — không còn envelope `{version, bbox, state}`.\n//\n// View info (bbox/axis/grid/azimuth/elevation) nằm trong `state.meta.view`\n// (discriminated union theo domain). createEmptyState set default view.\n//\n// Note: v0.20 KHÔNG support backward-compat envelope cũ. Data sessionStorage\n// cũ sẽ fallback về empty state khi parse fail (per user spec).\n\nimport { createEmptyState, type Domain, type State } from '../../core/scene';\n\nexport function serializeScene(state: State): string {\n return JSON.stringify(state);\n}\n\nfunction isValidState(value: unknown, domain: Domain): value is State {\n if (!value || typeof value !== 'object') return false;\n const v = value as Partial<State>;\n if (!v.meta || typeof v.meta !== 'object') return false;\n if (v.meta.domain !== domain) return false;\n if (!v.meta.view || typeof v.meta.view !== 'object') return false;\n if (!v.objects || typeof v.objects !== 'object') return false;\n if (!Array.isArray(v.order)) return false;\n return true;\n}\n\nexport function deserializeScene(domain: Domain, raw: string): State {\n if (!raw) return createEmptyState(domain);\n try {\n const parsed = JSON.parse(raw);\n if (isValidState(parsed, domain)) return parsed;\n } catch {\n /* swallow — fallback empty state */\n }\n return createEmptyState(domain);\n}\n","// src/stamps/geometry-2d/serialize.ts\n//\n// Sau Tier D PR 3: customData.jsonState chỉ chứa `JSON.stringify(state)`\n// (không còn envelope `{version, bbox, state, showAxis, showGrid}`).\n// View info (bbox/axis/grid) nằm trong `state.meta.view` (View2D shape).\n\nimport { serializeScene, deserializeScene } from '../shared/serializeScene';\nimport type { State, View2D } from '../../core/scene';\n\nexport function serializeBoard(state: State, view: View2D): string {\n const withView: State = {\n ...state,\n meta: { domain: '2d', version: state.meta.version, view },\n };\n return serializeScene(withView);\n}\n\nexport function deserializeBoard(raw: string): State {\n return deserializeScene('2d', raw);\n}\n","// Theme-aware palette cho geometry stamps.\n//\n// Dùng `Theme2D` từ `core/scene/render/types2d` (cùng abstraction graph-2d).\n// JxgRenderer nhận theme qua constructor options và phân phối qua RenderCtx\n// đến mỗi kind handler — không cần sentinel string trong attrs nữa.\n\nimport { type Theme2D } from '../../../core/scene/render/types2d';\n\nexport const themeStroke = (dark: boolean): string => (dark ? '#e2e8f0' : '#0f172a');\nexport const themeAxis = (dark: boolean): string => (dark ? '#cbd5e1' : '#94a3b8');\nexport const themeGrid = (dark: boolean): string => (dark ? '#475569' : '#e2e8f0');\nexport const themeLabel = (dark: boolean): string => (dark ? '#e2e8f0' : '#000000');\n\nexport function paletteFor(isDark: boolean): Theme2D {\n const stroke = themeStroke(isDark);\n return {\n stroke,\n fill: '#60a5fa',\n axis: themeAxis(isDark),\n grid: themeGrid(isDark),\n label: themeLabel(isDark),\n // Geometry-2d điểm fill = stroke color (đồng bộ chấm điểm với nét vẽ).\n pointFill: stroke,\n };\n}\n","// src/core/scene/render/types2d.ts\nimport type { RenderCtx } from '../types';\n\nexport type Theme2D = {\n stroke: string;\n fill: string;\n label: string;\n axis: string;\n grid: string;\n pointFill: string;\n};\n\nexport const DEFAULT_THEME_2D: Theme2D = {\n stroke: '#0f172a',\n fill: '#60a5fa',\n label: '#0f172a',\n axis: '#94a3b8',\n grid: '#e2e8f0',\n pointFill: '#1e40af',\n};\n\nexport type RenderCtx2D = RenderCtx & {\n theme: Theme2D;\n};\n","// src/core/scene/render/JxgRenderer.ts\nimport type { Store } from '../store';\nimport type { State, SceneObject, RenderCtx } from '../types';\nimport { getKind } from '../registry';\nimport { DEFAULT_THEME_2D, type Theme2D } from './types2d';\nimport { collectFreeVars } from '../expressions/parser';\n\nexport type JxgRendererOptions = { theme?: Theme2D };\n\nexport class JxgRenderer {\n private board: unknown;\n private store: Store;\n private theme: Theme2D;\n private elements = new Map<string, unknown>();\n private unsubscribe: () => void;\n private disposed = false;\n\n /** Chỉ dùng cho domain='graph2d': parameter.label → parameter.value */\n private paramMap: Record<string, number> = {};\n /** Chỉ dùng cho domain='graph2d': function2d.id → expression string */\n private functionExpr: Record<string, string> = {};\n\n constructor(store: Store, board: unknown, options: JxgRendererOptions = {}) {\n this.store = store;\n this.board = board;\n this.theme = options.theme ?? DEFAULT_THEME_2D;\n this.unsubscribe = store.subscribe((next, prev) => this.applyDiff(prev, next));\n // Render state hiện tại (vd LOAD chạy trước khi subscribe).\n this.applyDiff(undefined, store.getState());\n }\n\n private ctx(): RenderCtx {\n return {\n jxg: this.board,\n resolveRef: (id: string) => {\n // Synthetic \"<polyId>:border:<N>\" → polygon.borders[N]. Polygon edges\n // là sub-segment do JSXGraph auto-tạo bên trong polygon; chúng không\n // có scene id riêng. Synthetic id cho phép construct tools (vd\n // perpendicular qua một cạnh đa giác) tham chiếu cạnh như một line.\n const m = /^(.+):border:(\\d+)$/.exec(id);\n if (m) {\n const poly = this.elements.get(m[1]) as { borders?: unknown[] } | undefined;\n if (!poly) throw new Error(`[scene/2d] resolveRef: chưa render polygon id=\"${m[1]}\"`);\n const borders = poly.borders;\n const idx = parseInt(m[2], 10);\n if (!Array.isArray(borders) || !borders[idx]) {\n throw new Error(`[scene/2d] resolveRef: polygon \"${m[1]}\" không có border[${idx}]`);\n }\n return borders[idx];\n }\n const el = this.elements.get(id);\n if (!el) throw new Error(`[scene/2d] resolveRef: chưa render id=\"${id}\"`);\n return el;\n },\n defaults: { theme: this.theme, _functionExpr: this.functionExpr },\n paramMap: this.paramMap,\n };\n }\n\n /**\n * Rebuild `paramMap` và `functionExpr` từ state hiện tại.\n * Chỉ chạy khi domain='graph2d'. Chi phí thấp vì parameters thường ≤ 8.\n */\n private rebuildGraphMaps(state: State): void {\n if (state.meta.domain !== 'graph2d') return;\n const params: Record<string, number> = {};\n const fns: Record<string, string> = {};\n for (const id of state.order) {\n const obj = state.objects[id];\n if (obj.kind === 'parameter') {\n params[obj.label] = (obj.attrs as { value: number }).value;\n } else if (obj.kind === 'function2d') {\n fns[obj.id] = (obj.attrs as { expression: string }).expression;\n }\n }\n this.paramMap = params;\n this.functionExpr = fns;\n }\n\n private create(obj: SceneObject): void {\n try {\n const def = getKind(obj.kind);\n const el = def.render(obj, this.ctx());\n this.elements.set(obj.id, el);\n this.attachFreePointDragSync(obj, el);\n } catch (err) {\n console.warn(`[scene/render/2d] không render được ${obj.kind} id=\"${obj.id}\":`, err);\n }\n }\n\n /**\n * Đồng bộ toạ độ live của free point về scene.constraint khi user kéo bằng\n * tay (Move tool / mobile drag). JSXGraph mutate obj.X()/Y() ngay nhưng\n * constraint vẫn giữ giá trị lúc tạo → serialize sẽ ra SVG y hệt cũ →\n * fileId SHA-256 trùng → Excalidraw bỏ qua refresh. (Regression từ\n * commit f41f366 sau scene v2 port.)\n *\n * Chỉ áp dụng cho free point — glider/intersection/midpoint không drag được\n * trực tiếp (toạ độ derived từ ref khác).\n */\n private attachFreePointDragSync(obj: SceneObject, el: unknown): void {\n if (obj.kind !== 'point') return;\n const c = (obj.attrs as { constraint?: { kind?: string } }).constraint;\n if (!c || c.kind !== 'free') return;\n \n const point = el as any;\n if (typeof point.on !== 'function') return;\n const sceneId = obj.id;\n point.on('up', () => {\n if (this.disposed) return;\n if (typeof point.X !== 'function' || typeof point.Y !== 'function') return;\n const x = point.X();\n const y = point.Y();\n if (!Number.isFinite(x) || !Number.isFinite(y)) return;\n const cur = this.store.getState().objects[sceneId];\n if (!cur) return;\n const curC = (cur.attrs as { constraint?: { kind?: string; x?: number; y?: number } }).constraint;\n if (!curC || curC.kind !== 'free') return;\n if (curC.x === x && curC.y === y) return;\n this.store.dispatch({\n type: 'UPDATE_ATTRS',\n payload: { id: sceneId, patch: { constraint: { kind: 'free', x, y } } },\n });\n });\n }\n\n private remove(id: string): void {\n // Selection halo (nếu có) phải bị xoá TRƯỚC element gốc — halo tham chiếu\n // tới point1/point2/center/vertices của element gốc qua lambda; xoá element\n // gốc trước sẽ làm halo dangling.\n this.removeHalo(id);\n this.selectedIds.delete(id);\n const el = this.elements.get(id);\n if (!el) return;\n try {\n const helpers = (el as Record<string, unknown>)._helpers;\n // Element chính bị remove trước, sau đó helpers (glider phụ trợ cho\n // tangent ...). Helpers thường là parent của element chính — nếu xoá\n // parent trước, JSXGraph có thể phàn nàn dangling reference.\n (this.board as { removeObject?: (e: unknown) => void }).removeObject?.(el);\n if (Array.isArray(helpers)) {\n for (const h of helpers) {\n try {\n (this.board as { removeObject?: (e: unknown) => void }).removeObject?.(h);\n } catch { /* ignore */ }\n }\n }\n } catch (err) {\n console.warn(`[scene/render/2d] không remove được id=\"${id}\":`, err);\n }\n this.elements.delete(id);\n }\n\n private applyDiff(prev: State | undefined, next: State): void {\n if (this.disposed) return;\n\n // Rebuild paramMap + functionExpr TRƯỚC khi diff, để ctx() có đúng\n // paramMap khi render lần đầu tiên.\n this.rebuildGraphMaps(next);\n\n const prevObjs = prev?.objects ?? {};\n const nextObjs = next.objects;\n\n // Xoá ids biến mất.\n for (const id of Object.keys(prevObjs)) {\n if (!(id in nextObjs)) this.remove(id);\n }\n\n // Thêm/cập nhật theo state.order — đảm bảo refs có trước.\n for (const id of next.order) {\n const cur = nextObjs[id];\n const old = prevObjs[id] as SceneObject | undefined;\n if (!old) {\n this.create(cur);\n continue;\n }\n if (Object.is(old, cur)) continue;\n const def = getKind(cur.kind);\n const existing = this.elements.get(id);\n if (def.update && existing) {\n try { def.update(cur, old, this.ctx(), existing); continue; }\n catch (err) { console.warn(`[scene/render/2d] update fail, recreate:`, err); }\n }\n this.remove(id);\n this.create(cur);\n }\n\n // Sau diff bình thường: nếu domain='graph2d', detect parameter value changes\n // và force re-render các function2d phụ thuộc.\n if (next.meta.domain === 'graph2d' && prev) {\n const changedParams = new Set<string>();\n for (const id of next.order) {\n const cur = next.objects[id];\n const old = prev.objects[id] as SceneObject | undefined;\n if (cur.kind !== 'parameter' || old?.kind !== 'parameter') continue;\n if ((cur.attrs as { value: number }).value !== (old.attrs as { value: number }).value) {\n changedParams.add(cur.label);\n }\n }\n if (changedParams.size > 0) {\n for (const id of next.order) {\n const obj = next.objects[id];\n if (obj.kind !== 'function2d') continue;\n const expr = (obj.attrs as { expression: string }).expression;\n const refs = collectFreeVars(expr);\n if (refs.some((r) => changedParams.has(r))) {\n this.remove(id);\n this.create(obj);\n }\n }\n }\n }\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.unsubscribe();\n for (const id of Array.from(this.elements.keys())) this.remove(id);\n this.disposed = true;\n }\n\n /** Return the rendered JSXGraph element for a scene id, or null if not found. */\n getElement(id: string): unknown {\n return this.elements.get(id) ?? null;\n }\n\n /** Return a read-only view of the scene id → JSXGraph element map (for hit-test). */\n listElements(): Map<string, unknown> {\n return this.elements;\n }\n\n // Selection halo overlay model: thay vì đổi màu element gốc thành đỏ, tạo\n // một halo element gray phía sau (lower layer) → giữ nguyên màu gốc. Hỗ\n // trợ multi-select cho cả canvas click-selection lẫn ObjectListPanel.\n private selectedIds: Set<string> = new Set();\n private haloMap: Map<string, unknown[]> = new Map();\n\n highlight(ids: string | string[] | null): void {\n if (this.disposed) return;\n const newIds = new Set<string>(\n ids == null ? [] : Array.isArray(ids) ? ids : [ids],\n );\n // Remove halos cho ids đã bị bỏ chọn.\n for (const id of this.selectedIds) {\n if (!newIds.has(id)) this.removeHalo(id);\n }\n // Add halos cho ids mới chọn.\n for (const id of newIds) {\n if (!this.selectedIds.has(id) && this.elements.has(id)) this.addHalo(id);\n }\n this.selectedIds = newIds;\n try {\n (this.board as { update?: () => void }).update?.();\n } catch { /* ignore */ }\n }\n\n private removeHalo(id: string): void {\n const halos = this.haloMap.get(id);\n if (!halos) return;\n const board = this.board as { removeObject?: (e: unknown) => void };\n for (const h of halos) {\n try { board.removeObject?.(h); } catch { /* ignore */ }\n }\n this.haloMap.delete(id);\n }\n\n private addHalo(id: string): void {\n const el = this.elements.get(id) as\n | {\n elType?: string;\n getAttribute?: (k: string) => unknown;\n X?: () => number;\n Y?: () => number;\n point1?: unknown;\n point2?: unknown;\n center?: unknown;\n Radius?: () => number;\n vertices?: unknown[];\n }\n | undefined;\n if (!el) return;\n const board = this.board as {\n create?: (kind: string, parents: unknown[], attrs?: unknown) => unknown;\n };\n if (!board.create) return;\n\n // Selection palette — gray fill + darker gray border (xem\n // tham chiếu /tmp/ss.png).\n const SEL_STROKE = '#475569'; // slate-600\n const SEL_FILL = '#cbd5e1'; // slate-300\n const haloBase = {\n strokeColor: SEL_STROKE,\n strokeOpacity: 0.55,\n fillColor: SEL_FILL,\n fillOpacity: 0.3,\n fixed: true,\n withLabel: false,\n name: '',\n highlight: false,\n layer: 4,\n needsRegularUpdate: true,\n };\n const halos: unknown[] = [];\n try {\n switch (el.elType) {\n case 'point':\n case 'glider':\n case 'intersection': {\n const baseSize = (el.getAttribute?.('size') as number | undefined) ?? 4;\n const halo = board.create('point', [\n () => el.X?.() ?? 0,\n () => el.Y?.() ?? 0,\n ], {\n ...haloBase,\n size: baseSize + 6,\n face: 'o',\n strokeWidth: 2,\n strokeOpacity: 0.75,\n fillOpacity: 0.25,\n });\n halos.push(halo);\n break;\n }\n case 'segment': {\n if (el.point1 && el.point2) {\n const halo = board.create('segment', [el.point1, el.point2], {\n ...haloBase,\n strokeWidth: 9,\n straightFirst: false,\n straightLast: false,\n });\n halos.push(halo);\n }\n break;\n }\n case 'line':\n case 'arrow':\n case 'ray':\n case 'vector':\n case 'tangent':\n case 'normal':\n case 'parallel':\n case 'perpendicular':\n case 'bisector': {\n if (el.point1 && el.point2) {\n const halo = board.create('line', [el.point1, el.point2], {\n ...haloBase,\n strokeWidth: 9,\n });\n halos.push(halo);\n }\n break;\n }\n case 'circle': {\n if (el.center && typeof el.Radius === 'function') {\n const halo = board.create('circle', [el.center, () => el.Radius?.() ?? 0], {\n ...haloBase,\n strokeWidth: 9,\n fillOpacity: 0,\n });\n halos.push(halo);\n }\n break;\n }\n case 'polygon': {\n if (Array.isArray(el.vertices) && el.vertices.length >= 3) {\n // JSXGraph polygon.vertices có thể append vertex đầu lặp lại ở\n // cuối để đóng path — trim cho an toàn.\n const last = el.vertices.length - 1;\n const verts = el.vertices[last] === el.vertices[0]\n ? el.vertices.slice(0, last)\n : el.vertices.slice();\n const halo = board.create('polygon', verts, {\n ...haloBase,\n fillOpacity: 0.2,\n borders: {\n strokeColor: SEL_STROKE,\n strokeWidth: 7,\n strokeOpacity: 0.55,\n highlight: false,\n },\n });\n halos.push(halo);\n }\n break;\n }\n default:\n // Các kind khác (curve, arc, sector, angle, ...) — chưa hỗ trợ halo.\n break;\n }\n } catch (err) {\n console.warn('[scene/render/2d] halo create fail:', err);\n }\n if (halos.length) this.haloMap.set(id, halos);\n }\n}\n","/**\n * Shared offscreen JSXGraph render pipeline.\n *\n * Each JSXGraph stamp (geometry-2d, geometry-3d, graph-2d) needs the same\n * boilerplate to dump SVG offscreen: lazy import JSXGraph, create a hidden\n * DIV with explicit pixel dimensions, initBoard, attach a scene-store renderer\n * (or create a view3d), force update, clone the SVG node, add xmlns, serialize,\n * then tear everything down. This helper owns that lifecycle so each stamp\n * only writes the unique part — what to render — inside `setup`.\n *\n * Intrinsic SVG resolution matters: Excalidraw loads stamp SVGs via <img> then\n * drawImage onto canvas. The browser rasterizes SVG at its intrinsic\n * width/height, so dims passed here should be generous enough that the bitmap\n * downscales (sharp) instead of upscales (blurry) when the user zooms or views\n * on a retina display.\n */\n \ntype JxgModule = any;\n\nexport interface JxgOffscreenRenderOpts {\n /** JSXGraph bounding box: [xmin, ymax, xmax, ymin]. */\n bbox: [number, number, number, number];\n /** Offscreen container size in CSS pixels. Becomes SVG intrinsic size. */\n dims: { width: number; height: number };\n axis?: boolean;\n grid?: boolean;\n keepAspectRatio?: boolean;\n /** Mutate JXG.Options before initBoard (e.g. text.display='internal', palette). */\n applyOptions?: (JXG: JxgModule) => void;\n /**\n * Build the scene on the board. Return a disposable (typically the\n * `JxgRenderer` or `JxgRenderer3D` instance) — its `dispose()` is invoked\n * during teardown before `freeBoard`.\n */\n setup: (board: unknown, JXG: JxgModule) => { dispose: () => void } | Promise<{ dispose: () => void }>;\n /** Optional mutation on the cloned <svg> before serialization. */\n postProcessSvg?: (clone: SVGElement) => void;\n}\n\nexport interface JxgOffscreenRenderResult {\n svgString: string;\n width: number;\n height: number;\n}\n\nexport async function renderJsxgOffscreen(\n opts: JxgOffscreenRenderOpts,\n): Promise<JxgOffscreenRenderResult> {\n const { bbox, dims, axis = false, grid = false, keepAspectRatio = true } = opts;\n const JXG: JxgModule = (await import('jsxgraph')).default;\n\n if (opts.applyOptions) {\n try {\n opts.applyOptions(JXG);\n } catch {\n /* swallow option-apply errors */\n }\n }\n\n const containerId =\n 'jxg_offscreen_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8);\n const container = document.createElement('div');\n container.id = containerId;\n container.style.cssText =\n `position:absolute;top:-99999px;left:-99999px;` +\n `width:${dims.width}px;height:${dims.height}px;` +\n `visibility:hidden;pointer-events:none;`;\n document.body.appendChild(container);\n\n let board: unknown = null;\n let disposable: { dispose: () => void } | null = null;\n try {\n board = JXG.JSXGraph.initBoard(containerId, {\n boundingbox: bbox,\n axis,\n grid,\n keepAspectRatio,\n showCopyright: false,\n showNavigation: false,\n });\n disposable = await opts.setup(board, JXG);\n try {\n \n (board as any)?.update?.();\n } catch {\n /* ignore — board may already be in valid state */\n }\n\n const svgEl = container.querySelector('svg');\n if (!svgEl) throw new Error('renderJsxgOffscreen: no SVG produced by JSXGraph');\n const clone = svgEl.cloneNode(true) as SVGElement;\n if (!clone.getAttribute('xmlns')) {\n clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n }\n if (opts.postProcessSvg) opts.postProcessSvg(clone);\n const svgString = new XMLSerializer().serializeToString(clone);\n return { svgString, width: dims.width, height: dims.height };\n } finally {\n try {\n disposable?.dispose();\n } catch {\n /* ignore */\n }\n try {\n if (board) JXG.JSXGraph.freeBoard(board);\n } catch {\n /* ignore */\n }\n if (container.parentNode) container.parentNode.removeChild(container);\n }\n}\n","import { deserializeBoard } from './serialize';\nimport { paletteFor } from './editor/theme';\nimport { createStore } from '../../core/scene';\nimport { DEFAULT_VIEW_2D } from '../../core/scene/types';\nimport { JxgRenderer } from '../../core/scene/render/JxgRenderer';\nimport { renderJsxgOffscreen } from '../shared/jxgOffscreenRender';\n\n/**\n * Re-render geometry SVG từ jsonState đã serialize. Dùng cho:\n * 1. Restore math-stamp file sau khi reload page (Excalidraw mất binary files).\n * 2. Generate SVG lúc INSERT (thay vì clone DOM với màu theo theme editor).\n *\n * LƯU Ý quan trọng — luôn dùng LIGHT palette (nét đậm). Excalidraw apply CSS\n * `filter: invert(93%) hue-rotate(180deg)` lên canvas trong dark mode → nét\n * đậm tự đảo thành sáng. Nếu ta bake nét sáng vào SVG cho dark mode, filter\n * sẽ đảo thành đậm → chìm vào nền tối. Giải pháp: luôn dùng nét đậm + để\n * Excalidraw tự lo invert.\n *\n * Implementation: tạo 1 div ẩn (off-screen, real dimensions để JSXGraph render\n * chuẩn), initBoard, replay creation log từ jsonState, dump SVG, dọn dẹp.\n *\n * Container dimensions phải MATCH aspect ratio của bbox (đã được editor lưu\n * sau khi JSXGraph adjust với keepAspectRatio:true). Trước đây hardcode\n * 400×300 + keepAspectRatio:false làm shape bị kéo dãn (circle thành ellipse,\n * góc vuông lệch) khi bbox không 4:3 → ảnh hiển thị khác với editor lúc\n * double-click. Fix: tính container W/H từ bbox + keepAspectRatio:true để\n * SVG output khớp với view trong editor.\n *\n * Lý do JXG.Options.text.display = 'internal': JSXGraph mặc định render\n * label bằng HTML <div> overlay → clone SVG export sẽ thiếu label.\n */\n\nconst PIXELS_PER_UNIT = 20;\nconst MIN_DIM = 100;\nconst MAX_DIM = 1200;\nconst FALLBACK_W = 400;\nconst FALLBACK_H = 300;\n\nexport function containerDimsForBbox(bbox: [number, number, number, number]): { width: number; height: number } {\n const [xmin, ymax, xmax, ymin] = bbox;\n const w = Math.abs(xmax - xmin);\n const h = Math.abs(ymax - ymin);\n if (!Number.isFinite(w) || !Number.isFinite(h) || w <= 0 || h <= 0) {\n return { width: FALLBACK_W, height: FALLBACK_H };\n }\n let width = w * PIXELS_PER_UNIT;\n let height = h * PIXELS_PER_UNIT;\n const maxAxis = Math.max(width, height);\n if (maxAxis > MAX_DIM) {\n const ratio = MAX_DIM / maxAxis;\n width *= ratio;\n height *= ratio;\n }\n const minAxis = Math.min(width, height);\n if (minAxis < MIN_DIM) {\n const ratio = MIN_DIM / minAxis;\n width *= ratio;\n height *= ratio;\n }\n return { width: Math.round(width), height: Math.round(height) };\n}\n\nexport async function renderGeometrySvgFromState(jsonState: string): Promise<string> {\n const state = deserializeBoard(jsonState);\n const view = state.meta.domain === '2d' ? state.meta.view : DEFAULT_VIEW_2D;\n const bbox = view.bbox as [number, number, number, number];\n // Stamps inserted vào Excalidraw canvas → luôn dùng light palette.\n // Excalidraw's THEME_FILTER tự đảo nét trong dark mode.\n const palette = paletteFor(false);\n const dims = containerDimsForBbox(bbox);\n const { svgString } = await renderJsxgOffscreen({\n bbox,\n dims,\n axis: view.showAxis,\n grid: view.showGrid,\n keepAspectRatio: true,\n applyOptions: (JXG) => {\n \n const opts = (JXG as any).Options;\n if (!opts) return;\n opts.text = opts.text || {};\n opts.text.display = 'internal';\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n opts.text.strokeColor = palette.label;\n opts.label = opts.label || {};\n opts.label.display = 'internal';\n opts.label.strokeColor = palette.label;\n opts.axis = opts.axis || {};\n opts.axis.strokeColor = palette.axis;\n opts.grid = opts.grid || {};\n opts.grid.strokeColor = palette.grid;\n },\n setup: (board) => {\n const store = createStore(state);\n return new JxgRenderer(store, board);\n },\n });\n return svgString;\n}\n","// SVG inline base64 helper dùng chung cho 3 stamp (geometry-2d, geometry-3d,\n// graph-2d):\n//\n// - `svgToStampFile(svg, fileId)` — sync, dùng cho `restoreFileFromCustomData`\n// khi caller đã có fileId từ element.\n// - `createStampFile(svg)` — async, dùng cho insert path khi cần generate\n// fileId mới từ hash SVG content.\n//\n// Output luôn là SVG inline base64 — Excalidraw render native + tự đảo màu\n// trong dark mode qua CSS filter. KHÔNG raster sang PNG.\n\nconst DEFAULT_WIDTH = 200;\nconst DEFAULT_HEIGHT = 100;\n\nexport interface StampFileResult {\n fileId: string;\n dataURL: string;\n mimeType: 'image/svg+xml';\n width: number;\n height: number;\n}\n\nasync function hashSvgToFileId(input: string): Promise<string> {\n if (typeof crypto !== 'undefined' && crypto.subtle) {\n const buf = new TextEncoder().encode(input);\n const digest = await crypto.subtle.digest('SHA-256', buf);\n return Array.from(new Uint8Array(digest))\n .slice(0, 16)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n }\n // Double-hash FNV-1a (32-bit chained) → 16 hex chars. Fallback Node/jsdom.\n let h1 = 0x811c9dc5;\n let h2 = 0xcbf29ce4;\n for (let i = 0; i < input.length; i++) {\n const c = input.charCodeAt(i);\n h1 ^= c;\n h1 = Math.imul(h1, 0x01000193);\n h2 ^= c + i;\n h2 = Math.imul(h2, 0x100000001b3 & 0xffffffff);\n }\n return (\n (h1 >>> 0).toString(16).padStart(8, '0') +\n (h2 >>> 0).toString(16).padStart(8, '0')\n );\n}\n\nfunction parseDim(svg: string, attr: 'width' | 'height'): number {\n const re = new RegExp(`<svg[^>]*\\\\s${attr}=\"(\\\\d+(?:\\\\.\\\\d+)?)`, 'i');\n const m = svg.match(re);\n if (m) return Math.max(1, Math.round(parseFloat(m[1])));\n const vb = svg.match(/viewBox=\"([\\d.\\s-]+)\"/i);\n if (vb) {\n const parts = vb[1].trim().split(/\\s+/).map(parseFloat);\n if (parts.length === 4) {\n return Math.max(1, Math.round(attr === 'width' ? parts[2] : parts[3]));\n }\n }\n return attr === 'width' ? DEFAULT_WIDTH : DEFAULT_HEIGHT;\n}\n\nexport function parseSvgDims(svg: string): { width: number; height: number } {\n return { width: parseDim(svg, 'width'), height: parseDim(svg, 'height') };\n}\n\nexport function svgToStampFile(svgString: string, fileId: string): StampFileResult {\n const { width, height } = parseSvgDims(svgString);\n const utf8 = unescape(encodeURIComponent(svgString));\n const base64 = typeof btoa !== 'undefined'\n ? btoa(utf8)\n : Buffer.from(utf8, 'binary').toString('base64');\n return {\n fileId,\n dataURL: `data:image/svg+xml;base64,${base64}`,\n mimeType: 'image/svg+xml',\n width,\n height,\n };\n}\n\n// Async variant cho insert path: hash SVG → fileId rồi gọi svgToStampFile.\n// Identical SVG content → identical fileId (Excalidraw addFiles dedupe).\nexport async function createStampFile(svgString: string): Promise<StampFileResult> {\n const fileId = await hashSvgToFileId(svgString);\n return svgToStampFile(svgString, fileId);\n}\n","import type { BaseStampCustomData } from '../shared/types';\n\nexport interface GeometryCustomData extends BaseStampCustomData {\n kind: 'geometry';\n version: 1;\n jsonState: string;\n}\n\nexport function isGeometryCustomData(data: unknown): data is GeometryCustomData {\n if (!data || typeof data !== 'object') return false;\n const d = data as Partial<GeometryCustomData>;\n return d.kind === 'geometry' && d.version === 1 && typeof d.jsonState === 'string';\n}\n","'use client';\nimport * as React from 'react';\n\nexport interface TabSpec<K extends string = string> {\n key: K;\n label: React.ReactNode;\n testId?: string;\n}\n\nexport interface LeftPanelShellProps<K extends string = string> {\n title: string;\n icon: React.ReactNode;\n onClose: () => void;\n isDark?: boolean;\n tabs?: readonly TabSpec<K>[];\n activeTab?: K;\n onTabChange?: (k: K) => void;\n /** data-testid trên <aside> root. Mặc định \"left-panel\". */\n testId?: string;\n children: React.ReactNode;\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n );\n}\n\nexport function LeftPanelShell<K extends string>(props: LeftPanelShellProps<K>): React.ReactElement {\n const { title, icon, onClose, isDark, tabs, activeTab, onTabChange, testId, children } = props;\n const showTabs = !!tabs && tabs.length >= 2;\n\n return (\n <aside\n role=\"complementary\"\n aria-label={title}\n data-testid={testId ?? 'left-panel'}\n data-stamp-area=\"true\"\n className={[\n isDark ? 'theme--dark ' : '',\n 'absolute left-0 top-0 z-30 flex h-full w-60 flex-col border-r border-slate-200 bg-white shadow-md animate-in slide-in-from-left duration-200',\n ].join('')}\n >\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-3 py-2\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold text-slate-800\">\n <span className=\"text-base leading-none\">{icon}</span>\n {title}\n </h3>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label=\"Đóng\"\n className=\"rounded p-1 text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <CloseIcon />\n </button>\n </header>\n\n {showTabs && (\n <div role=\"tablist\" className=\"flex gap-1 rounded-md bg-slate-100 p-0.5 mx-3 mt-3\">\n {tabs!.map((t) => (\n <TabPill\n key={t.key}\n active={t.key === activeTab}\n onClick={() => onTabChange?.(t.key)}\n testId={t.testId}\n >\n {t.label}\n </TabPill>\n ))}\n </div>\n )}\n\n <div\n {...(showTabs ? { role: 'tabpanel' } : {})}\n className=\"min-h-0 flex-1 overflow-y-auto p-3 space-y-3\"\n >\n {children}\n </div>\n </aside>\n );\n}\n\nexport function TabPill(props: {\n active: boolean;\n onClick: () => void;\n testId?: string;\n children: React.ReactNode;\n}): React.ReactElement {\n const { active, onClick, testId, children } = props;\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={onClick}\n data-testid={testId}\n className={[\n 'flex-1 rounded px-2 py-1 text-[11px] font-medium transition',\n active\n ? 'bg-white text-slate-900 shadow-sm ring-1 ring-slate-200'\n : 'text-slate-500 hover:text-slate-800',\n ].join(' ')}\n >\n {children}\n </button>\n );\n}\n\nexport function Section(props: { label: string; children: React.ReactNode }): React.ReactElement {\n return (\n <section>\n <h4 className=\"mb-1.5 text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n {props.label}\n </h4>\n {props.children}\n </section>\n );\n}\n","// src/core/scene/ui/kindMeta.ts\nexport interface KindUiMeta {\n displayName: string;\n icon: string;\n /** Fallback color khi obj.attrs.color không có. Phải khớp default ở renderer. */\n defaultColor: string;\n}\n\n// Default colors:\n// - Points: blue (#1e40af)\n// - Curves / shapes: dark slate (#0f172a)\n// - 3D planes / spheres: light blue (#60a5fa)\nconst POINT_COLOR = '#1e40af';\nconst CURVE_COLOR = '#0f172a';\nconst PLANE_COLOR = '#60a5fa';\n\nexport const KIND_UI_META: Readonly<Record<string, KindUiMeta>> = {\n // 2D\n point: { displayName: 'Điểm', icon: '·', defaultColor: POINT_COLOR },\n segment: { displayName: 'Đoạn thẳng', icon: '—', defaultColor: CURVE_COLOR },\n line: { displayName: 'Đường thẳng', icon: '/', defaultColor: CURVE_COLOR },\n ray: { displayName: 'Tia', icon: '→', defaultColor: CURVE_COLOR },\n vector: { displayName: 'Vector', icon: '↗', defaultColor: CURVE_COLOR },\n circle: { displayName: 'Đường tròn', icon: '○', defaultColor: CURVE_COLOR },\n polygon: { displayName: 'Đa giác', icon: '◇', defaultColor: CURVE_COLOR },\n intersection: { displayName: 'Giao điểm', icon: '✕', defaultColor: POINT_COLOR },\n angle: { displayName: 'Góc', icon: '∠', defaultColor: '#16a34a' },\n distance: { displayName: 'Khoảng cách', icon: '↔', defaultColor: '#dc2626' },\n // 3D\n point3d: { displayName: 'Điểm', icon: '·', defaultColor: POINT_COLOR },\n segment3d: { displayName: 'Đoạn thẳng', icon: '—', defaultColor: CURVE_COLOR },\n line3d: { displayName: 'Đường thẳng', icon: '/', defaultColor: CURVE_COLOR },\n ray3d: { displayName: 'Tia', icon: '→', defaultColor: CURVE_COLOR },\n vector3d: { displayName: 'Vector', icon: '↗', defaultColor: CURVE_COLOR },\n plane3d: { displayName: 'Mặt phẳng', icon: '▱', defaultColor: PLANE_COLOR },\n polygon3d: { displayName: 'Đa giác', icon: '◇', defaultColor: CURVE_COLOR },\n sphere3d: { displayName: 'Mặt cầu', icon: '◯', defaultColor: PLANE_COLOR },\n polyhedron3d: { displayName: 'Đa diện', icon: '⬢', defaultColor: PLANE_COLOR },\n cylinder3d: { displayName: 'Hình trụ', icon: '⌭', defaultColor: PLANE_COLOR },\n cone3d: { displayName: 'Hình nón', icon: '▲', defaultColor: PLANE_COLOR },\n // Graph 2D\n function2d: { displayName: 'Hàm số', icon: 'ƒ', defaultColor: CURVE_COLOR },\n parameter: { displayName: 'Tham số', icon: 'α', defaultColor: '#7c3aed' },\n pointOnCurve: { displayName: 'Điểm trên đồ thị', icon: '◉', defaultColor: POINT_COLOR },\n tangent2d: { displayName: 'Tiếp tuyến', icon: '╱', defaultColor: CURVE_COLOR },\n extremum2d: { displayName: 'Cực trị', icon: '∧', defaultColor: POINT_COLOR },\n root2d: { displayName: 'Nghiệm', icon: '0', defaultColor: POINT_COLOR },\n slope2d: { displayName: 'Hệ số góc', icon: '△', defaultColor: '#dc2626' },\n};\n\nexport function getKindUiMeta(kind: string): KindUiMeta {\n return KIND_UI_META[kind] ?? { displayName: kind, icon: '?', defaultColor: '#888888' };\n}\n","'use client';\nimport * as React from 'react';\n\nexport interface ObjectRowMenuProps {\n locked: boolean;\n onToggleLocked: () => void;\n onRename: () => void;\n onChangeColor: () => void;\n onDelete: () => void;\n}\n\nexport function ObjectRowMenu(props: ObjectRowMenuProps): React.ReactElement {\n const { locked, onToggleLocked, onRename, onChangeColor, onDelete } = props;\n const [open, setOpen] = React.useState(false);\n\n return (\n <div className=\"relative inline-block\">\n <button\n type=\"button\"\n aria-label=\"Row menu\"\n onClick={(e) => { e.stopPropagation(); setOpen((v) => !v); }}\n className=\"rounded px-1.5 text-black\"\n >\n ⋮\n </button>\n {open ? (\n <div\n role=\"menu\"\n className=\"absolute right-0 z-10 mt-1 w-40 rounded-md border border-zinc-200 bg-white py-1 text-xs shadow-lg dark:border-zinc-700 dark:bg-zinc-900\"\n onClick={(e) => e.stopPropagation()}\n >\n <MenuItem onClick={() => { setOpen(false); onRename(); }}>Đổi tên</MenuItem>\n <MenuItem onClick={() => { setOpen(false); onChangeColor(); }}>Đổi màu</MenuItem>\n <MenuItem onClick={() => { setOpen(false); onToggleLocked(); }}>\n {locked ? 'Mở khoá' : 'Khoá'}\n </MenuItem>\n <MenuItem\n onClick={() => { setOpen(false); onDelete(); }}\n className=\"text-red-600 dark:text-red-400\"\n >\n Xoá\n </MenuItem>\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction MenuItem({\n children,\n onClick,\n className,\n}: React.PropsWithChildren<{ onClick: () => void; className?: string }>) {\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n onClick={onClick}\n className={`block w-full px-3 py-1 text-left text-black ${className ?? ''}`}\n >\n {children}\n </button>\n );\n}\n","'use client';\nimport * as React from 'react';\nimport type { SceneObject, State } from '../types';\nimport { getKind } from '../registry';\nimport { getKindUiMeta } from './kindMeta';\nimport { ObjectRowMenu } from './ObjectRowMenu';\n\nexport interface ObjectRowProps {\n obj: SceneObject;\n state: State;\n selected: boolean;\n onSelect: (id: string) => void;\n onToggleVisible: (id: string) => void;\n onToggleLocked: (id: string) => void;\n onRename: (id: string) => void;\n onChangeColor: (id: string) => void;\n onDelete: (id: string) => void;\n}\n\nfunction formatMeasure(items: { label: string; value: number }[]): string {\n return items.map((it) => `${it.label} = ${it.value.toFixed(2)}`).join(', ');\n}\n\nexport function ObjectRow(props: ObjectRowProps): React.ReactElement {\n const { obj, state, selected, onSelect, onToggleVisible, onToggleLocked, onRename, onChangeColor, onDelete } = props;\n\n const meta = getKindUiMeta(obj.kind);\n\n let title = '';\n try {\n title = getKind(obj.kind).describe(obj, state);\n } catch {\n title = `${meta.displayName} ${obj.label}`;\n }\n\n let measureText: string | null = null;\n if (selected) {\n try {\n const m = getKind(obj.kind).measure?.(obj, state);\n if (m && m.length > 0) measureText = formatMeasure(m);\n } catch {\n measureText = null;\n }\n }\n\n const color = (obj.attrs as { color?: string }).color ?? meta.defaultColor;\n\n return (\n <li\n data-testid={`object-row-${obj.id}`}\n aria-selected={selected}\n onClick={() => onSelect(obj.id)}\n className={\n 'flex flex-col border-b border-zinc-100 cursor-pointer dark:border-zinc-800 ' +\n (selected ? 'bg-slate-200' : '')\n }\n >\n <div className=\"flex items-center gap-2 px-3 py-1.5 text-xs\">\n <button\n type=\"button\"\n aria-label=\"Toggle visibility\"\n aria-pressed={!obj.visible}\n onClick={(e) => { e.stopPropagation(); onToggleVisible(obj.id); }}\n className=\"h-4 w-4 shrink-0 rounded-full border-2 transition\"\n style={{\n backgroundColor: obj.visible ? color : 'transparent',\n borderColor: color,\n }}\n />\n <span className=\"flex-1 truncate text-black\">\n {title}\n </span>\n <ObjectRowMenu\n locked={obj.locked}\n onToggleLocked={() => onToggleLocked(obj.id)}\n onRename={() => onRename(obj.id)}\n onChangeColor={() => onChangeColor(obj.id)}\n onDelete={() => onDelete(obj.id)}\n />\n </div>\n {selected && measureText && (\n <div\n data-testid={`object-row-detail-${obj.id}`}\n className=\"pl-9 pr-3 pb-1.5 text-[11px] text-black\"\n >\n {measureText}\n </div>\n )}\n </li>\n );\n}\n","'use client';\nimport * as React from 'react';\nimport type { Store } from '../store';\nimport type { SceneObject } from '../types';\nimport { listObjects } from '../selectors';\nimport { ObjectRow } from './ObjectRow';\n\nexport interface ObjectListPanelProps {\n store: Store;\n selectedId?: string;\n /**\n * Called when user clicks a row. Receives the row id, or `null` when the\n * user clicks the already-selected row (toggle off — request to deselect).\n * Parent should treat `null` as \"clear selection\".\n */\n onSelect?: (id: string | null) => void;\n /**\n * Optional per-kind row renderer. Called with the SceneObject and default props\n * (selected, onClick). Return a ReactNode to override the default ObjectRow.\n * Return null/undefined to fall back to the default ObjectRow.\n */\n renderRow?: (\n obj: SceneObject,\n defaults: { selected: boolean; onClick: () => void },\n ) => React.ReactNode;\n}\n\nexport function ObjectListPanel(props: ObjectListPanelProps): React.ReactElement {\n const { store, selectedId, onSelect, renderRow } = props;\n // useSyncExternalStore expects subscribe to receive () => void callback,\n // but Store.subscribe takes (next, prev, action) => void. Wrap to adapt.\n const subscribe = React.useCallback(\n (cb: () => void) => store.subscribe(() => cb()),\n [store],\n );\n const state = React.useSyncExternalStore(subscribe, store.getState, store.getState);\n const objects = listObjects(state);\n\n function handleSelect(id: string) {\n // Toggle: click vào row đang selected → deselect (collapse detail + tắt highlight).\n onSelect?.(id === selectedId ? null : id);\n }\n\n function handleToggleVisible(id: string) {\n const obj = state.objects[id];\n if (!obj) return;\n store.dispatch({ type: 'UPDATE', payload: { id, patch: { visible: !obj.visible } } });\n }\n\n function handleToggleLocked(id: string) {\n const obj = state.objects[id];\n if (!obj) return;\n store.dispatch({ type: 'UPDATE', payload: { id, patch: { locked: !obj.locked } } });\n }\n\n function handleDelete(id: string) {\n store.dispatch({ type: 'DELETE', payload: { id } });\n }\n\n function noop() { /* rename + change color stubbed for Phase 3 */ }\n\n return (\n <ul\n data-testid=\"object-list-panel\"\n className=\"flex max-h-[calc(100vh-200px)] flex-col overflow-y-auto\"\n >\n {objects.length === 0 ? (\n <li className=\"px-3 py-4 text-center text-xs text-zinc-500\">Chưa có đối tượng nào</li>\n ) : (\n objects.map((obj) => {\n const selected = obj.id === selectedId;\n const onClick = () => handleSelect(obj.id);\n if (renderRow) {\n const custom = renderRow(obj, { selected, onClick });\n if (custom != null) {\n return <React.Fragment key={obj.id}>{custom}</React.Fragment>;\n }\n }\n return (\n <ObjectRow\n key={obj.id}\n obj={obj}\n state={state}\n selected={selected}\n onSelect={handleSelect}\n onToggleVisible={handleToggleVisible}\n onToggleLocked={handleToggleLocked}\n onRename={noop}\n onChangeColor={noop}\n onDelete={handleDelete}\n />\n );\n })\n )}\n </ul>\n );\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/AxisGridSection.tsx\n//\n// Section \"Bố cục\" / \"Góc nhìn\": 2 checkbox axis/grid + (optional) undo/redo\n// button ở mép phải. Render khi có ít nhất 1 trong (view, history).\n// Skip toàn bộ section khi cả 2 đều undefined.\n\nimport React from 'react';\nimport { Section } from '../../../core/scene/ui/LeftPanelShell';\nimport type {\n StampLeftPanelHistoryProps,\n StampLeftPanelViewProps,\n} from './types';\n\nexport interface AxisGridSectionProps {\n view?: StampLeftPanelViewProps;\n history?: StampLeftPanelHistoryProps;\n}\n\nfunction UndoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 10 L8 5 L8 8 L15 8 A5 5 0 0 1 20 13 L20 16\" />\n <path d=\"M3 10 L8 15 L8 12\" />\n </svg>\n );\n}\n\nfunction RedoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 10 L16 5 L16 8 L9 8 A5 5 0 0 0 4 13 L4 16\" />\n <path d=\"M21 10 L16 15 L16 12\" />\n </svg>\n );\n}\n\nexport function AxisGridSection(props: AxisGridSectionProps): React.ReactElement | null {\n const { view, history } = props;\n if (!view && !history) return null;\n\n const sectionLabel = view?.sectionLabel ?? 'Bố cục';\n const axisLabel = view?.axisLabel ?? 'Trục';\n const gridLabel = view?.gridLabel ?? 'Lưới';\n\n return (\n <Section label={sectionLabel}>\n <div className=\"flex items-center gap-3 text-[11px] text-slate-700\">\n {view && (\n <>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={view.showAxis}\n onChange={(e) => view.onShowAxisChange(e.target.checked)}\n data-testid=\"toggle-axis\"\n />\n {axisLabel}\n </label>\n <label className=\"inline-flex select-none items-center gap-1.5\">\n <input\n type=\"checkbox\"\n checked={view.showGrid}\n onChange={(e) => view.onShowGridChange(e.target.checked)}\n data-testid=\"toggle-grid\"\n />\n {gridLabel}\n </label>\n </>\n )}\n {history && (\n <div className=\"ml-auto flex items-center gap-0.5\">\n <button\n type=\"button\"\n onClick={history.onUndo}\n disabled={!history.canUndo}\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n aria-label=\"Hoàn tác\"\n data-testid=\"undo-btn\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <UndoIcon />\n </button>\n <button\n type=\"button\"\n onClick={history.onRedo}\n disabled={!history.canRedo}\n title=\"Làm lại (Ctrl/Cmd+Shift+Z)\"\n aria-label=\"Làm lại\"\n data-testid=\"redo-btn\"\n className=\"inline-flex items-center justify-center rounded p-1 text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n <RedoIcon />\n </button>\n </div>\n )}\n </div>\n </Section>\n );\n}\n","// src/stamps/shared/StampLeftPanel/types.ts\n//\n// Shared types cho StampLeftPanel template. Dùng generic TKey/TGroup để\n// preserve type safety tại call site (host của từng stamp truyền union type\n// riêng); internal cài theo string là OK.\n\nimport type { ReactNode } from 'react';\nimport type { Store } from '../../../core/scene/store';\nimport type { SceneObject } from '../../../core/scene/types';\n\nexport const TOOLTIP_DELAY_MS = 400;\nexport type HoverState = { label: string; hint?: string; x: number; y: number } | null;\n\n/** Tool descriptor unified cho 3 stamp editor. */\nexport interface StampToolDef<TKey extends string = string, TGroup extends string = string> {\n key: TKey;\n label: string;\n hint?: string;\n icon: ReactNode;\n group: TGroup;\n shortcut?: string;\n}\n\nexport interface StampLeftPanelTabs {\n /** Label tab \"Đối tượng\" (default \"📐 Đối tượng\"). */\n objectsLabel?: ReactNode;\n /** Label tab \"Công cụ\" (default \"🧰 Công cụ\"). */\n toolsLabel?: ReactNode;\n}\n\nexport interface StampLeftPanelViewProps {\n /** Section header label, default \"Bố cục\". */\n sectionLabel?: string;\n /** Checkbox label cho axis, default \"Trục\". */\n axisLabel?: string;\n /** Checkbox label cho grid, default \"Lưới\". */\n gridLabel?: string;\n showAxis: boolean;\n showGrid: boolean;\n onShowAxisChange: (b: boolean) => void;\n onShowGridChange: (b: boolean) => void;\n}\n\nexport interface StampLeftPanelHistoryProps {\n onUndo: () => void;\n canUndo: boolean;\n onRedo: () => void;\n canRedo: boolean;\n}\n\nexport interface StampLeftPanelChordProps<TGroup extends string = string> {\n /** Group đang được focus sau khi user bấm letter. null = không active. */\n activeGroup: TGroup | null;\n /** Mapping group → letter hint (vd \"P\" cho group \"point\"). */\n letterForGroup: (g: TGroup) => string;\n}\n\nexport interface StampLeftPanelObjectsProps {\n store: Store;\n selectedObjectId?: string;\n onObjectSelect?: (id: string | null) => void;\n /** Custom row render (vd graph-2d cần FunctionRow/ParameterRow). Trả null để fallback default ObjectRow. */\n renderRow?: (\n obj: SceneObject,\n defaults: { selected: boolean; onClick: () => void },\n ) => ReactNode | null;\n /** Optional buttons phía trên ObjectListPanel (vd graph-2d \"+Hàm\" \"+Tham số\"). */\n addButtons?: ReadonlyArray<{ label: string; testId?: string; onClick: () => void }>;\n}\n\nexport interface StampLeftPanelProps<\n TKey extends string = string,\n TGroup extends string = string,\n> {\n // Header\n title: string;\n icon: ReactNode;\n onClose: () => void;\n isDark?: boolean;\n /** data-testid trên <aside> root. Default \"stamp-left-panel\". */\n testId?: string;\n\n // Tools (required)\n tools: ReadonlyArray<StampToolDef<TKey, TGroup>>;\n groupOrder: ReadonlyArray<TGroup>;\n groupLabels: Record<TGroup, string>;\n activeTool: TKey;\n onToolChange: (k: TKey) => void;\n\n // Optional sections\n view?: StampLeftPanelViewProps;\n history?: StampLeftPanelHistoryProps;\n chord?: StampLeftPanelChordProps<TGroup>;\n objects?: StampLeftPanelObjectsProps;\n tabs?: StampLeftPanelTabs;\n\n // Mobile\n isMobile?: boolean;\n drawerOpen?: boolean;\n onDrawerClose?: () => void;\n}\n","// src/stamps/shared/StampLeftPanel/useToolHoverTooltip.ts\n//\n// Generic hover tooltip hook. Trả về { hover, portalReady, showHover, hideHover }\n// để consumer render tooltip qua createPortal. Delay 400ms tránh flash.\n//\n// Generic theo StampToolDef → 3 stamp dùng chung. Moved từ\n// geometry-2d/editor/LeftPanel/useToolHoverTooltip.ts (Phase 1.2).\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { TOOLTIP_DELAY_MS, type HoverState, type StampToolDef } from './types';\n\nexport function useToolHoverTooltip() {\n const [hover, setHover] = useState<HoverState>(null);\n const [portalReady, setPortalReady] = useState(false);\n const hoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n setPortalReady(true);\n return () => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n };\n }, []);\n\n const showHover = useCallback((el: HTMLElement, t: StampToolDef) => {\n if (hoverTimerRef.current) clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = setTimeout(() => {\n const r = el.getBoundingClientRect();\n setHover({ label: t.label, hint: t.hint, x: r.right, y: r.top + r.height / 2 });\n }, TOOLTIP_DELAY_MS);\n }, []);\n\n const hideHover = useCallback(() => {\n if (hoverTimerRef.current) {\n clearTimeout(hoverTimerRef.current);\n hoverTimerRef.current = null;\n }\n setHover(null);\n }, []);\n\n return { hover, portalReady, showHover, hideHover };\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/ToolGrid.tsx\n//\n// Tool button grid chord-aware. Render từng group thành section, mỗi section\n// có 4-col grid icon button. Khi chord.activeGroup set:\n// - section đó được highlight (ring emerald + bg)\n// - các section khác dimmed (opacity-55)\n// - mỗi button trong active group có number badge 1-9\n//\n// Port từ geometry-2d/editor/LeftPanel/Desktop.tsx:104-176 (baseline rich nhất).\n\nimport React, { useMemo } from 'react';\nimport type {\n StampLeftPanelChordProps,\n StampToolDef,\n} from './types';\nimport { useToolHoverTooltip } from './useToolHoverTooltip';\nimport { createPortal } from 'react-dom';\n\nexport interface ToolGridProps<TKey extends string, TGroup extends string> {\n tools: ReadonlyArray<StampToolDef<TKey, TGroup>>;\n groupOrder: ReadonlyArray<TGroup>;\n groupLabels: Record<TGroup, string>;\n activeTool: TKey;\n onToolChange: (k: TKey) => void;\n chord?: StampLeftPanelChordProps<TGroup>;\n}\n\nexport function ToolGrid<TKey extends string, TGroup extends string>(\n props: ToolGridProps<TKey, TGroup>,\n): React.ReactElement {\n const { tools, groupOrder, groupLabels, activeTool, onToolChange, chord } = props;\n const { hover, portalReady, showHover, hideHover } = useToolHoverTooltip();\n\n const grouped = useMemo(() => {\n const acc: Partial<Record<TGroup, StampToolDef<TKey, TGroup>[]>> = {};\n for (const t of tools) {\n (acc[t.group] ??= []).push(t);\n }\n return acc;\n }, [tools]);\n\n const groupKeys = useMemo(\n () => groupOrder.filter((g) => grouped[g]),\n [grouped, groupOrder],\n );\n\n const activeGroupTools = chord?.activeGroup ? grouped[chord.activeGroup] ?? null : null;\n\n return (\n <>\n {groupKeys.map((group) => {\n const isChordActive = chord?.activeGroup === group;\n const dimmed = chord?.activeGroup != null && !isChordActive;\n return (\n <section\n key={group}\n data-chord-group={group}\n data-chord-active={isChordActive ? 'true' : 'false'}\n className={[\n 'rounded-md transition',\n isChordActive ? 'bg-emerald-50 ring-1 ring-emerald-400 p-1' : 'p-0',\n dimmed ? 'opacity-55' : 'opacity-100',\n ].join(' ')}\n >\n <h4 className=\"mb-1.5 flex items-center justify-between text-[10px] font-semibold uppercase tracking-wider text-slate-500\">\n <span>{groupLabels[group]}</span>\n {chord && (\n <span\n data-testid={`chord-letter-${group}`}\n className={[\n 'font-mono text-[10px] leading-none transition',\n isChordActive ? 'text-emerald-700 font-bold' : 'text-slate-400',\n ].join(' ')}\n >\n {chord.letterForGroup(group)}\n </span>\n )}\n </h4>\n <div className=\"grid grid-cols-4 gap-1\">\n {grouped[group]!.map((t, i) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n title={t.label + (t.shortcut ? ` (${t.shortcut})` : '')}\n onClick={() => onToolChange(t.key)}\n onMouseEnter={(e) => showHover(e.currentTarget, t)}\n onMouseLeave={hideHover}\n onFocus={(e) => showHover(e.currentTarget, t)}\n onBlur={hideHover}\n className={[\n 'relative flex h-10 items-center justify-center rounded-md transition',\n active\n ? 'bg-emerald-600 text-white shadow-sm'\n : 'text-slate-700 hover:bg-slate-100 hover:text-slate-900',\n ].join(' ')}\n >\n {t.icon}\n {chord && (\n <span\n data-testid={`chord-num-${t.key}`}\n className={[\n 'pointer-events-none absolute bottom-0 right-0.5 font-mono text-[9px] leading-none transition',\n active\n ? 'text-white/70'\n : isChordActive\n ? 'text-emerald-700 font-bold'\n : 'text-slate-400',\n ].join(' ')}\n >\n {i + 1}\n </span>\n )}\n </button>\n );\n })}\n </div>\n </section>\n );\n })}\n\n {chord?.activeGroup && activeGroupTools && (\n <div\n data-testid=\"chord-hint\"\n className=\"mt-1 rounded border border-emerald-200 bg-emerald-50/60 px-2 py-1 text-[11px] leading-snug text-slate-600\"\n >\n <span className=\"font-mono font-semibold text-emerald-700\">\n {chord.letterForGroup(chord.activeGroup)}\n </span>\n <span className=\"mx-1 text-slate-400\">→</span>\n {activeGroupTools.map((t, i) => (\n <span key={t.key} className=\"mr-2 inline-block\">\n <span className=\"font-mono font-semibold text-emerald-700\">{i + 1}</span>\n <span className=\"ml-1\">{t.label}</span>\n </span>\n ))}\n <span className=\"text-slate-400\">Esc huỷ</span>\n </div>\n )}\n\n {portalReady && hover && typeof document !== 'undefined'\n ? createPortal(\n <div\n role=\"tooltip\"\n className=\"pointer-events-none fixed w-max max-w-[220px] rounded-md bg-slate-900 px-2 py-1 text-left text-[11px] leading-tight text-white shadow-lg\"\n style={{\n left: hover.x + 8,\n top: hover.y,\n transform: 'translate(0, -50%)',\n zIndex: 2147483600,\n }}\n >\n <span className=\"block font-medium\">{hover.label}</span>\n {hover.hint && <span className=\"mt-0.5 block text-slate-300\">{hover.hint}</span>}\n </div>,\n document.body,\n )\n : null}\n </>\n );\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/Desktop.tsx\n//\n// Desktop layout cho StampLeftPanel. Render:\n// 1. LeftPanelShell chrome + tabs (chỉ render tablist khi có objects)\n// 2. Tab \"tools\": <AxisGridSection> + <ToolGrid> chord-aware\n// 3. Tab \"objects\": optional add buttons + <ObjectListPanel> với custom renderRow\n\nimport React, { useEffect, useState } from 'react';\nimport { LeftPanelShell } from '../../../core/scene/ui/LeftPanelShell';\nimport { ObjectListPanel } from '../../../core/scene/ui/ObjectListPanel';\nimport { AxisGridSection } from './AxisGridSection';\nimport { ToolGrid } from './ToolGrid';\nimport type { StampLeftPanelProps } from './types';\n\nexport function StampLeftPanelDesktop<TKey extends string, TGroup extends string>(\n props: StampLeftPanelProps<TKey, TGroup>,\n): React.ReactElement {\n const {\n title,\n icon,\n onClose,\n isDark,\n testId,\n tools,\n groupOrder,\n groupLabels,\n activeTool,\n onToolChange,\n view,\n history,\n chord,\n objects,\n tabs,\n } = props;\n\n const [tab, setTab] = useState<'tools' | 'objects'>('tools');\n const hasObjects = !!objects;\n\n useEffect(() => {\n if (!hasObjects && tab === 'objects') setTab('tools');\n }, [hasObjects, tab]);\n\n const tabSpecs = hasObjects\n ? [\n { key: 'tools' as const, label: tabs?.toolsLabel ?? '🧰 Công cụ', testId: 'tab-tools' },\n { key: 'objects' as const, label: tabs?.objectsLabel ?? '📐 Đối tượng', testId: 'tab-objects' },\n ]\n : undefined;\n\n return (\n <LeftPanelShell\n title={title}\n icon={icon}\n onClose={onClose}\n isDark={isDark}\n testId={testId ?? 'stamp-left-panel'}\n tabs={tabSpecs}\n activeTab={hasObjects ? tab : undefined}\n onTabChange={hasObjects ? setTab : undefined}\n >\n {(!hasObjects || tab === 'tools') ? (\n <>\n <AxisGridSection view={view} history={history} />\n <ToolGrid\n tools={tools}\n groupOrder={groupOrder}\n groupLabels={groupLabels}\n activeTool={activeTool}\n onToolChange={onToolChange}\n chord={chord}\n />\n </>\n ) : (\n <section data-testid=\"objects-panel\" className=\"flex flex-col gap-2\">\n {objects!.addButtons && objects!.addButtons.length > 0 && (\n <div className=\"flex gap-1\">\n {objects!.addButtons.map((b) => (\n <button\n key={b.label}\n type=\"button\"\n data-testid={b.testId}\n onClick={b.onClick}\n className=\"flex-1 rounded border border-slate-300 bg-slate-50 px-2 py-1 text-[11px] font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n {b.label}\n </button>\n ))}\n </div>\n )}\n <ObjectListPanel\n store={objects!.store}\n selectedId={objects!.selectedObjectId}\n onSelect={objects!.onObjectSelect}\n renderRow={objects!.renderRow}\n />\n </section>\n )}\n </LeftPanelShell>\n );\n}\n","'use client';\n\nimport React from 'react';\n\n/**\n * Generic mobile tool drawer dùng chung cho geometry-2d + geometry-3d.\n *\n * Layout:\n * - Header: icon + title + close\n * - Sticky toolbar: chip switches (Trục/Lưới) + icon-actions (Reset, Undo)\n * - Body: section dọc, mỗi section là 1 nhóm tools, grid 3-col card có nhãn\n *\n * Style: soft-modern, emerald accent, khớp các class trong shared/stamp.css.\n */\n\nexport interface MobileChip {\n /** Label hiển thị + aria-label */\n label: string;\n icon: React.ReactNode;\n pressed: boolean;\n onToggle: (next: boolean) => void;\n /** data-testid optional (để test cũ chạy được) */\n testId?: string;\n}\n\nexport interface MobileActionButton {\n label: string;\n icon: React.ReactNode;\n onClick: () => void;\n disabled?: boolean;\n title?: string;\n /** data-testid optional (cho phép test target button cụ thể) */\n testId?: string;\n}\n\nexport interface MobileTool<TKey extends string> {\n key: TKey;\n label: string;\n icon: React.ReactNode;\n}\n\nexport interface MobileToolGroup<TKey extends string, TGroup extends string> {\n group: TGroup;\n groupLabel: string;\n tools: MobileTool<TKey>[];\n}\n\ninterface MobileToolDrawerProps<TKey extends string, TGroup extends string> {\n title: string;\n headerIcon: React.ReactNode;\n chips: MobileChip[];\n actions: MobileActionButton[];\n groups: MobileToolGroup<TKey, TGroup>[];\n activeTool: TKey;\n onToolSelect: (key: TKey) => void;\n drawerOpen: boolean;\n onDrawerClose: () => void;\n isDark?: boolean;\n /** data-testid trên <aside> — giữ để test cũ tìm được panel */\n testId?: string;\n /** Optional: thêm tab \"Đối tượng\" trong drawer body. */\n objectsTab?: {\n label: React.ReactNode;\n render: () => React.ReactNode;\n };\n}\n\nexport function MobileToolDrawer<TKey extends string, TGroup extends string>({\n title,\n headerIcon,\n chips,\n actions,\n groups,\n activeTool,\n onToolSelect,\n drawerOpen,\n onDrawerClose,\n isDark,\n testId,\n objectsTab,\n}: MobileToolDrawerProps<TKey, TGroup>) {\n const [mobileTab, setMobileTab] = React.useState<'tools' | 'objects'>('tools');\n const prevOpenRef = React.useRef(drawerOpen);\n React.useEffect(() => {\n if (!prevOpenRef.current && drawerOpen) setMobileTab('tools');\n prevOpenRef.current = drawerOpen;\n }, [drawerOpen]);\n\n return (\n <>\n {drawerOpen && (\n <div\n className=\"stamp-drawer-backdrop\"\n onPointerDown={onDrawerClose}\n aria-hidden=\"true\"\n />\n )}\n <aside\n role=\"complementary\"\n aria-label={title}\n aria-hidden={!drawerOpen ? 'true' : undefined}\n data-testid={testId}\n data-stamp-area=\"true\"\n data-mobile-drawer=\"true\"\n data-geo-mobile=\"true\"\n data-drawer-state={drawerOpen ? 'open' : 'closed'}\n className={[\n isDark ? 'theme--dark ' : '',\n 'stamp-drawer-mobile flex flex-col border-r border-slate-200 bg-white shadow-md',\n ].join('')}\n >\n {/* Header */}\n <header className=\"flex items-center justify-between border-b border-slate-200 bg-gradient-to-r from-slate-50 to-white px-4 py-3\">\n <h3 className=\"flex items-center gap-2 text-base font-semibold text-slate-800\">\n <span className=\"inline-flex h-7 w-7 items-center justify-center rounded-lg bg-emerald-50 text-emerald-700\">\n {headerIcon}\n </span>\n {title}\n </h3>\n <button\n type=\"button\"\n onClick={onDrawerClose}\n aria-label=\"Đóng ngăn công cụ\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-500 transition hover:bg-slate-100 hover:text-slate-800\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n\n {/* Sticky toolbar: chips + actions */}\n <div className=\"sticky top-0 z-10 flex items-center gap-2 border-b border-slate-200 bg-white/95 px-3 py-2 backdrop-blur\">\n {chips.map((c) => (\n <button\n key={c.label}\n type=\"button\"\n role=\"switch\"\n aria-pressed={c.pressed}\n aria-label={c.label}\n data-testid={c.testId}\n onClick={() => c.onToggle(!c.pressed)}\n className=\"geo-mobile-chip\"\n >\n {c.icon}\n {c.label}\n </button>\n ))}\n {actions.length > 0 && <div className=\"ml-auto flex items-center gap-1\">\n {actions.map((a) => (\n <button\n key={a.label}\n type=\"button\"\n onClick={a.onClick}\n disabled={a.disabled}\n aria-label={a.label}\n title={a.title ?? a.label}\n data-testid={a.testId}\n className=\"inline-flex h-9 w-9 items-center justify-center rounded-full text-slate-600 transition hover:bg-slate-100 hover:text-slate-900 disabled:cursor-not-allowed disabled:text-slate-300 disabled:hover:bg-transparent\"\n >\n {a.icon}\n </button>\n ))}\n </div>}\n </div>\n\n {/* Tab row (chỉ render khi objectsTab được cung cấp) */}\n {objectsTab && (\n <div role=\"tablist\" className=\"flex gap-1 rounded-md bg-slate-100 p-0.5 mx-3 mt-2\">\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mobileTab === 'tools'}\n onClick={() => setMobileTab('tools')}\n className={[\n 'flex-1 rounded px-2 py-1 text-[11px] font-medium transition',\n mobileTab === 'tools'\n ? 'bg-white text-slate-900 shadow-sm ring-1 ring-slate-200'\n : 'text-slate-500 hover:text-slate-800',\n ].join(' ')}\n >\n 🧰 Công cụ\n </button>\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={mobileTab === 'objects'}\n onClick={() => setMobileTab('objects')}\n className={[\n 'flex-1 rounded px-2 py-1 text-[11px] font-medium transition',\n mobileTab === 'objects'\n ? 'bg-white text-slate-900 shadow-sm ring-1 ring-slate-200'\n : 'text-slate-500 hover:text-slate-800',\n ].join(' ')}\n >\n {objectsTab.label}\n </button>\n </div>\n )}\n\n {/* Body: groups xếp dọc */}\n <div\n className=\"min-h-0 flex-1 overflow-y-auto\"\n style={{ paddingBottom: 'calc(0.75rem + env(safe-area-inset-bottom))' }}\n >\n {objectsTab && mobileTab === 'objects' ? (\n <div className=\"px-3 pt-3\">{objectsTab.render()}</div>\n ) : (\n groups.map((g) => (\n <section key={g.group} className=\"px-3 pt-3 pb-1\">\n <h4 className=\"mb-2 flex items-center gap-2 text-[11px] font-semibold uppercase tracking-wider text-slate-500\">\n <span className=\"h-1 w-1 rounded-full bg-emerald-500\" />\n {g.groupLabel}\n </h4>\n <div className=\"grid grid-cols-3 gap-2\">\n {g.tools.map((t) => {\n const active = activeTool === t.key;\n return (\n <button\n key={t.key}\n type=\"button\"\n aria-label={t.label}\n aria-pressed={active}\n data-tool={t.key}\n onClick={() => {\n onToolSelect(t.key);\n onDrawerClose();\n }}\n className={[\n 'flex flex-col items-center justify-center gap-1.5 rounded-2xl px-2 py-3 transition active:scale-95',\n active\n ? 'geo-mobile-tool-active'\n : 'bg-slate-50 text-slate-700 hover:bg-slate-100',\n ].join(' ')}\n >\n <span className=\"flex h-8 w-8 items-center justify-center\">{t.icon}</span>\n <span className=\"text-center text-[11px] font-medium leading-tight line-clamp-2\">\n {t.label}\n </span>\n </button>\n );\n })}\n </div>\n </section>\n ))\n )}\n </div>\n </aside>\n </>\n );\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/Mobile.tsx\n//\n// Mobile layout: wrap shared MobileToolDrawer với mapping:\n// chips = axis/grid (from view)\n// actions = undo/redo (from history)\n// groups = tools grouped by group\n// objects = objectsTab (objects.store + addButtons + custom renderRow)\n\nimport React, { useMemo } from 'react';\nimport { MobileToolDrawer, type MobileToolGroup } from '../MobileToolDrawer';\nimport { ObjectListPanel } from '../../../core/scene/ui/ObjectListPanel';\nimport type { StampLeftPanelProps } from './types';\n\nfunction AxisIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\" />\n <line x1=\"4\" y1=\"20\" x2=\"4\" y2=\"4\" />\n <polyline points=\"2 6 4 4 6 6\" />\n <polyline points=\"18 18 20 20 18 22\" />\n </svg>\n );\n}\n\nfunction GridIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\" />\n <line x1=\"4\" y1=\"10\" x2=\"20\" y2=\"10\" />\n <line x1=\"4\" y1=\"16\" x2=\"20\" y2=\"16\" />\n <line x1=\"10\" y1=\"4\" x2=\"10\" y2=\"20\" />\n <line x1=\"16\" y1=\"4\" x2=\"16\" y2=\"20\" />\n </svg>\n );\n}\n\nfunction UndoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 10 L8 5 L8 8 L15 8 A5 5 0 0 1 20 13 L20 16\" />\n <path d=\"M3 10 L8 15 L8 12\" />\n </svg>\n );\n}\n\nfunction RedoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 10 L16 5 L16 8 L9 8 A5 5 0 0 0 4 13 L4 16\" />\n <path d=\"M21 10 L16 15 L16 12\" />\n </svg>\n );\n}\n\nexport function StampLeftPanelMobile<TKey extends string, TGroup extends string>(\n props: StampLeftPanelProps<TKey, TGroup>,\n): React.ReactElement {\n const {\n title,\n icon,\n isDark,\n testId,\n tools,\n groupOrder,\n groupLabels,\n activeTool,\n onToolChange,\n view,\n history,\n objects,\n tabs,\n drawerOpen,\n onDrawerClose,\n } = props;\n\n const groups = useMemo<MobileToolGroup<TKey, TGroup>[]>(() => {\n const acc = new Map<TGroup, typeof tools[number][]>();\n for (const t of tools) {\n if (!acc.has(t.group)) acc.set(t.group, []);\n acc.get(t.group)!.push(t);\n }\n // Preserve groupOrder\n return groupOrder\n .filter((g) => acc.has(g))\n .map((group) => ({\n group,\n groupLabel: groupLabels[group],\n tools: acc.get(group)!.map((t) => ({ key: t.key, label: t.label, icon: t.icon })),\n }));\n }, [tools, groupOrder, groupLabels]);\n\n const chips = view\n ? [\n {\n label: view.axisLabel ?? 'Trục',\n icon: <AxisIcon />,\n pressed: view.showAxis,\n onToggle: view.onShowAxisChange,\n testId: 'toggle-axis',\n },\n {\n label: view.gridLabel ?? 'Lưới',\n icon: <GridIcon />,\n pressed: view.showGrid,\n onToggle: view.onShowGridChange,\n testId: 'toggle-grid',\n },\n ]\n : [];\n\n const actions = history\n ? [\n {\n label: 'Hoàn tác',\n title: 'Hoàn tác (Ctrl/Cmd+Z)',\n icon: <UndoIcon />,\n onClick: history.onUndo,\n disabled: !history.canUndo,\n testId: 'undo-btn',\n },\n {\n label: 'Làm lại',\n title: 'Làm lại (Ctrl/Cmd+Shift+Z)',\n icon: <RedoIcon />,\n onClick: history.onRedo,\n disabled: !history.canRedo,\n testId: 'redo-btn',\n },\n ]\n : [];\n\n return (\n <MobileToolDrawer\n title={title}\n headerIcon={icon}\n testId={testId ?? 'stamp-left-panel'}\n isDark={isDark}\n drawerOpen={!!drawerOpen}\n onDrawerClose={() => onDrawerClose?.()}\n chips={chips}\n actions={actions}\n groups={groups}\n activeTool={activeTool}\n onToolSelect={onToolChange}\n objectsTab={\n objects\n ? {\n label: tabs?.objectsLabel ?? '📐 Đối tượng',\n render: () => (\n <div className=\"flex flex-col gap-2 px-3\">\n {objects.addButtons && objects.addButtons.length > 0 && (\n <div className=\"flex gap-1 pt-3\">\n {objects.addButtons.map((b) => (\n <button\n key={b.label}\n type=\"button\"\n data-testid={b.testId}\n onClick={b.onClick}\n className=\"flex-1 rounded border border-slate-300 bg-slate-50 px-2 py-1 text-[11px] font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n {b.label}\n </button>\n ))}\n </div>\n )}\n <ObjectListPanel\n store={objects.store}\n selectedId={objects.selectedObjectId}\n onSelect={objects.onObjectSelect}\n renderRow={objects.renderRow}\n />\n </div>\n ),\n }\n : undefined\n }\n />\n );\n}\n","'use client';\n// src/stamps/shared/StampLeftPanel/index.tsx\n//\n// Public API. Dispatch isMobile → Desktop hoặc Mobile.\n//\n// Usage:\n//\n// <StampLeftPanel\n// title=\"Hình học\"\n// icon={<GeomIcon />}\n// tools={TOOLS} // ReadonlyArray<StampToolDef>\n// groupOrder={GROUP_ORDER}\n// groupLabels={GROUP_LABELS}\n// activeTool={tool}\n// onToolChange={setTool}\n// view={{ showAxis, showGrid, onShowAxisChange, onShowGridChange }} // optional\n// history={{ onUndo, canUndo, onRedo, canRedo }} // optional\n// chord={{ activeGroup, letterForGroup }} // optional\n// objects={{ store, addButtons, renderRow, ... }} // optional\n// isMobile={isMobile}\n// drawerOpen={drawerOpen}\n// onDrawerClose={...}\n// onClose={onClose}\n// isDark={isDark}\n// />\n\nimport React from 'react';\nimport { StampLeftPanelDesktop } from './Desktop';\nimport { StampLeftPanelMobile } from './Mobile';\nimport type { StampLeftPanelProps } from './types';\n\nexport function StampLeftPanel<TKey extends string, TGroup extends string>(\n props: StampLeftPanelProps<TKey, TGroup>,\n): React.ReactElement {\n if (props.isMobile) return <StampLeftPanelMobile {...props} />;\n return <StampLeftPanelDesktop {...props} />;\n}\n\nexport type {\n StampLeftPanelProps,\n StampToolDef,\n StampLeftPanelViewProps,\n StampLeftPanelHistoryProps,\n StampLeftPanelChordProps,\n StampLeftPanelObjectsProps,\n StampLeftPanelTabs,\n HoverState,\n} from './types';\nexport { TOOLTIP_DELAY_MS } from './types';\nexport { useToolHoverTooltip } from './useToolHoverTooltip';\n","import React from 'react';\n\n// Design system:\n// - Main strokes use currentColor → respect active state (white-on-emerald).\n// - 4 accent colors stay fixed across states:\n// point → blue dot (signature từ GeoGebra)\n// construct → red dashed/solid helper line (perpendicular, bisector, parallel, tangent)\n// fill → orange polygon/area fill (light)\n// arc → emerald arc cho measurement\n// - ViewBox 24×24, stroke 1.4–1.7, round caps cho cảm giác sketch-like.\nconst C_POINT = '#2563eb';\nconst C_CONSTRUCT = '#dc2626';\nconst C_FILL = '#f59e0b';\nconst C_ARC = '#059669';\n\nexport const Icon = {\n // ===== Basic =====\n cursor: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <path\n d=\"M5 3 L5 18 L9.5 14 L12 20 L14 19.2 L11.5 13.5 L17.5 13.5 Z\"\n fill=\"currentColor\" fillOpacity=\"0.12\"\n stroke=\"currentColor\" strokeWidth=\"1.4\" strokeLinejoin=\"round\"\n />\n </svg>\n ),\n select: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\" strokeLinecap=\"round\">\n <rect x=\"2.5\" y=\"2.5\" width=\"14\" height=\"14\" rx=\"0.5\" stroke=\"currentColor\" strokeWidth=\"1.4\" strokeDasharray=\"2 1.8\"/>\n <path d=\"M10 10 L21 14.5 L14.5 16 L12.5 22 Z\" fill=\"currentColor\" fillOpacity=\"0.5\" stroke=\"currentColor\" strokeWidth=\"1.2\"/>\n </svg>\n ),\n\n // ===== Point =====\n point: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"9.5\" cy=\"14\" r=\"3.2\" fill={C_POINT}/>\n <text x=\"13.5\" y=\"10.5\" fontSize=\"9.5\" fontFamily=\"serif\" fontStyle=\"italic\" fontWeight=\"600\" fill={C_POINT}>A</text>\n </svg>\n ),\n midpoint: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <circle cx=\"4\" cy=\"12\" r=\"1.8\" fill={C_POINT}/>\n <circle cx=\"20\" cy=\"12\" r=\"1.8\" fill={C_POINT}/>\n <circle cx=\"12\" cy=\"12\" r=\"2.6\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n perpFoot: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Base line ngang (input — currentColor) */}\n <line x1=\"2\" y1=\"17\" x2=\"22\" y2=\"17\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n {/* Vertical dashed line từ BLUE point xuống chân (construct/red) */}\n <line x1=\"9\" y1=\"5\" x2=\"9\" y2=\"17\" stroke={C_CONSTRUCT} strokeWidth=\"1.4\" strokeDasharray=\"2.5 2\"/>\n {/* Right-angle mark tại chân */}\n <rect x=\"9\" y=\"13.5\" width=\"3.5\" height=\"3.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1\"/>\n {/* BLUE point gốc */}\n <circle cx=\"9\" cy=\"5\" r=\"2\" fill={C_POINT}/>\n {/* RED point chân (output) */}\n <circle cx=\"9\" cy=\"17\" r=\"2.4\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n intersect: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <path d=\"M3 5 L21 19\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <path d=\"M21 5 L3 19\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <circle cx=\"12\" cy=\"12\" r=\"2.6\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n\n // ===== Line =====\n segment: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"5\" y1=\"18\" x2=\"19\" y2=\"6\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <circle cx=\"5\" cy=\"18\" r=\"2.2\" fill={C_POINT}/>\n <circle cx=\"19\" cy=\"6\" r=\"2.2\" fill={C_POINT}/>\n </svg>\n ),\n line: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"2\" y1=\"21\" x2=\"22\" y2=\"3\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <circle cx=\"8.5\" cy=\"15.5\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"15.5\" cy=\"8.5\" r=\"1.9\" fill={C_POINT}/>\n </svg>\n ),\n ray: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"5\" y1=\"19\" x2=\"22\" y2=\"2\" stroke=\"currentColor\" strokeWidth=\"1.6\"/>\n <circle cx=\"5\" cy=\"19\" r=\"2.2\" fill={C_POINT}/>\n <circle cx=\"12\" cy=\"12\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n vector: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"5\" y1=\"19\" x2=\"18\" y2=\"6\"/>\n <polyline points=\"13,5 19,5 19,11\"/>\n <circle cx=\"5\" cy=\"19\" r=\"2\" fill={C_POINT} stroke=\"none\"/>\n </svg>\n ),\n\n // ===== Construct =====\n perpendicular: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"2\" y1=\"17\" x2=\"22\" y2=\"17\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"17\" stroke={C_CONSTRUCT} strokeWidth=\"1.5\"/>\n <rect x=\"12\" y=\"13.5\" width=\"3.5\" height=\"3.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1\"/>\n <circle cx=\"12\" cy=\"17\" r=\"1.8\" fill={C_POINT}/>\n </svg>\n ),\n parallel: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Đường đen = đã có (input). Đường đỏ = đường song song mới dựng đi qua điểm xanh. */}\n <line x1=\"2\" y1=\"9\" x2=\"22\" y2=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"2\" y1=\"19\" x2=\"22\" y2=\"16\" stroke={C_CONSTRUCT} strokeWidth=\"1.5\"/>\n <circle cx=\"12\" cy=\"17.5\" r=\"1.9\" fill={C_POINT}/>\n </svg>\n ),\n perpBisector: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"4\" y1=\"16\" x2=\"20\" y2=\"16\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"22\" stroke={C_CONSTRUCT} strokeWidth=\"1.4\" strokeDasharray=\"2.5 2\"/>\n <circle cx=\"4\" cy=\"16\" r=\"2\" fill={C_POINT}/>\n <circle cx=\"20\" cy=\"16\" r=\"2\" fill={C_POINT}/>\n </svg>\n ),\n bisector: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n <line x1=\"4\" y1=\"20\" x2=\"22\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"4\" y1=\"20\" x2=\"22\" y2=\"4\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"4\" y1=\"20\" x2=\"23\" y2=\"11\" stroke={C_CONSTRUCT} strokeWidth=\"1.4\" strokeDasharray=\"2.5 2\"/>\n </svg>\n ),\n\n // ===== Polygon =====\n polygon: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\">\n <polygon points=\"6,5 18,6 22,14 13,21 4,16\" fill={C_FILL} fillOpacity=\"0.28\" stroke={C_FILL} strokeWidth=\"1.5\"/>\n <circle cx=\"6\" cy=\"5\" r=\"1.5\" fill={C_POINT}/>\n <circle cx=\"18\" cy=\"6\" r=\"1.5\" fill={C_POINT}/>\n <circle cx=\"22\" cy=\"14\" r=\"1.5\" fill={C_POINT}/>\n <circle cx=\"13\" cy=\"21\" r=\"1.5\" fill={C_POINT}/>\n <circle cx=\"4\" cy=\"16\" r=\"1.5\" fill={C_POINT}/>\n </svg>\n ),\n regularPolygon: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\">\n <polygon points=\"12,3 20.5,8 20.5,16 12,21 3.5,16 3.5,8\" fill={C_FILL} fillOpacity=\"0.28\" stroke={C_FILL} strokeWidth=\"1.5\"/>\n <circle cx=\"12\" cy=\"3\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"20.5\" cy=\"8\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n\n // ===== Circle =====\n circleCenter: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"11\" cy=\"13\" r=\"8\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <circle cx=\"11\" cy=\"13\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"19\" cy=\"13\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n semicircle: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Nửa đường tròn emerald-arc, 2 endpoint blue ở đáy */}\n <path d=\"M 4 16 A 8 8 0 0 1 20 16\" stroke={C_ARC} strokeWidth=\"1.6\" fill=\"none\"/>\n <line x1=\"4\" y1=\"16\" x2=\"20\" y2=\"16\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeDasharray=\"2 1.6\"/>\n <circle cx=\"4\" cy=\"16\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"20\" cy=\"16\" r=\"1.9\" fill={C_POINT}/>\n </svg>\n ),\n arcCenter: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Tâm blue (lớn) + cung emerald + 2 đầu cung blue (nhỏ), 2 bán kính nét đứt */}\n <path d=\"M 6 6 A 9 9 0 0 1 18 18\" stroke={C_ARC} strokeWidth=\"1.7\" fill=\"none\"/>\n <line x1=\"12\" y1=\"12\" x2=\"6\" y2=\"6\" stroke=\"currentColor\" strokeWidth=\"1\" strokeDasharray=\"1.5 1.5\" opacity=\"0.5\"/>\n <line x1=\"12\" y1=\"12\" x2=\"18\" y2=\"18\" stroke=\"currentColor\" strokeWidth=\"1\" strokeDasharray=\"1.5 1.5\" opacity=\"0.5\"/>\n <circle cx=\"12\" cy=\"12\" r=\"2\" fill={C_POINT}/>\n <circle cx=\"6\" cy=\"6\" r=\"1.4\" fill={C_POINT}/>\n <circle cx=\"18\" cy=\"18\" r=\"1.4\" fill={C_POINT}/>\n </svg>\n ),\n arc3: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Circle arc đi qua 3 điểm: (4,17), (12,9), (20,17). Tâm (12,17), r=8. */}\n <path d=\"M 4 17 A 8 8 0 0 1 20 17\" stroke={C_ARC} strokeWidth=\"1.8\" fill=\"none\"/>\n <circle cx=\"4\" cy=\"17\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"12\" cy=\"9\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"20\" cy=\"17\" r=\"1.9\" fill={C_POINT}/>\n </svg>\n ),\n sectorCenter: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\">\n {/* Tâm blue + 2 bán kính + cung emerald + fill orange */}\n <path d=\"M 12 12 L 5 7 A 8.6 8.6 0 0 1 19 7 Z\"\n fill={C_FILL} fillOpacity=\"0.25\"\n stroke={C_ARC} strokeWidth=\"1.6\"/>\n <line x1=\"12\" y1=\"12\" x2=\"5\" y2=\"7\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n <line x1=\"12\" y1=\"12\" x2=\"19\" y2=\"7\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n <circle cx=\"12\" cy=\"12\" r=\"1.8\" fill={C_POINT}/>\n <circle cx=\"5\" cy=\"7\" r=\"1.4\" fill={C_POINT}/>\n <circle cx=\"19\" cy=\"7\" r=\"1.4\" fill={C_POINT}/>\n </svg>\n ),\n circle3: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"12\" cy=\"13\" r=\"8\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <circle cx=\"12\" cy=\"5\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"19\" cy=\"16\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"5\" cy=\"16\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n tangent: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Circle C=(10,13) r=5; external point P=(20,4); tangent points T1≈(14.5,15.2), T2≈(8.3,8.3) */}\n <circle cx=\"10\" cy=\"13\" r=\"5\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"20\" y1=\"4\" x2=\"14.5\" y2=\"15.2\" stroke={C_CONSTRUCT} strokeWidth=\"1.6\"/>\n <line x1=\"20\" y1=\"4\" x2=\"8.3\" y2=\"8.3\" stroke={C_CONSTRUCT} strokeWidth=\"1.6\"/>\n <circle cx=\"20\" cy=\"4\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"14.5\" cy=\"15.2\" r=\"1.4\" fill={C_CONSTRUCT}/>\n <circle cx=\"8.3\" cy=\"8.3\" r=\"1.4\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n\n // ===== Triangle centers =====\n centroid: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\">\n {/* Tam giác outline + fill orange nhạt */}\n <polygon points=\"4,20 20,20 12,4\" fill={C_FILL} fillOpacity=\"0.18\" stroke=\"currentColor\" strokeWidth=\"1.4\"/>\n {/* 3 medians: vertex → midpoint cạnh đối diện (xám dashed) */}\n <line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\" stroke=\"#94a3b8\" strokeWidth=\"1\" strokeDasharray=\"1.5 1.5\"/>\n <line x1=\"4\" y1=\"20\" x2=\"16\" y2=\"12\" stroke=\"#94a3b8\" strokeWidth=\"1\" strokeDasharray=\"1.5 1.5\"/>\n <line x1=\"20\" y1=\"20\" x2=\"8\" y2=\"12\" stroke=\"#94a3b8\" strokeWidth=\"1\" strokeDasharray=\"1.5 1.5\"/>\n {/* 3 đỉnh BLUE */}\n <circle cx=\"4\" cy=\"20\" r=\"1.5\" fill={C_POINT}/>\n <circle cx=\"20\" cy=\"20\" r=\"1.5\" fill={C_POINT}/>\n <circle cx=\"12\" cy=\"4\" r=\"1.5\" fill={C_POINT}/>\n {/* Trọng tâm RED tại giao 3 medians */}\n <circle cx=\"12\" cy=\"14.67\" r=\"2.4\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n circumcenter: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Đường tròn ngoại tiếp */}\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" strokeWidth=\"1.4\"/>\n {/* Tam giác nội tiếp */}\n <polygon points=\"12,3 21,16 3,16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n {/* 3 đỉnh BLUE */}\n <circle cx=\"12\" cy=\"3\" r=\"1.6\" fill={C_POINT}/>\n <circle cx=\"21\" cy=\"16\" r=\"1.6\" fill={C_POINT}/>\n <circle cx=\"3\" cy=\"16\" r=\"1.6\" fill={C_POINT}/>\n {/* Tâm ngoại tiếp RED */}\n <circle cx=\"12\" cy=\"12\" r=\"2.4\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n incenter: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Tam giác outline */}\n <polygon points=\"3,20 21,20 12,4\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.4\"/>\n {/* Đường tròn nội tiếp */}\n <circle cx=\"12\" cy=\"14\" r=\"4.5\" stroke=\"currentColor\" strokeWidth=\"1.3\"/>\n {/* 3 đỉnh BLUE */}\n <circle cx=\"3\" cy=\"20\" r=\"1.6\" fill={C_POINT}/>\n <circle cx=\"21\" cy=\"20\" r=\"1.6\" fill={C_POINT}/>\n <circle cx=\"12\" cy=\"4\" r=\"1.6\" fill={C_POINT}/>\n {/* Tâm nội tiếp RED */}\n <circle cx=\"12\" cy=\"14\" r=\"2.2\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n orthocenter: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\">\n {/* Tam giác outline */}\n <polygon points=\"3,20 21,20 8,5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.4\"/>\n {/* 2 altitudes (dashed red) — đủ giao điểm */}\n <line x1=\"8\" y1=\"5\" x2=\"8\" y2=\"20\" stroke={C_CONSTRUCT} strokeWidth=\"1.2\" strokeDasharray=\"2 1.6\"/>\n <line x1=\"3\" y1=\"20\" x2=\"14.5\" y2=\"11.5\" stroke={C_CONSTRUCT} strokeWidth=\"1.2\" strokeDasharray=\"2 1.6\"/>\n {/* 3 đỉnh BLUE */}\n <circle cx=\"3\" cy=\"20\" r=\"1.6\" fill={C_POINT}/>\n <circle cx=\"21\" cy=\"20\" r=\"1.6\" fill={C_POINT}/>\n <circle cx=\"8\" cy=\"5\" r=\"1.6\" fill={C_POINT}/>\n {/* Trực tâm RED — giao 2 altitudes */}\n <circle cx=\"8\" cy=\"14.5\" r=\"2.4\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n\n // ===== Measure =====\n angle: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"20\" x2=\"22\" y2=\"20\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"4\" y1=\"20\" x2=\"22\" y2=\"6\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <path d=\"M14 20 A 10 10 0 0 0 11 13.4\" stroke={C_ARC} strokeWidth=\"1.6\" fill=\"none\"/>\n <circle cx=\"4\" cy=\"20\" r=\"1.7\" fill={C_POINT}/>\n </svg>\n ),\n distance: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <line x1=\"5\" y1=\"16\" x2=\"19\" y2=\"16\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\"/>\n <circle cx=\"5\" cy=\"16\" r=\"2\" fill={C_POINT}/>\n <circle cx=\"19\" cy=\"16\" r=\"2\" fill={C_POINT}/>\n <text x=\"8.5\" y=\"11\" fontSize=\"7\" fontFamily=\"serif\" fontStyle=\"italic\" fontWeight=\"600\" fill=\"currentColor\">cm</text>\n </svg>\n ),\n area: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\">\n <polygon points=\"4,10 14,3.5 21,12 16,21 5,18\" fill={C_FILL} fillOpacity=\"0.32\" stroke={C_FILL} strokeWidth=\"1.4\"/>\n <text x=\"1.5\" y=\"8\" fontSize=\"6.5\" fontFamily=\"serif\" fontStyle=\"italic\" fontWeight=\"600\" fill=\"currentColor\">cm²</text>\n </svg>\n ),\n\n // ===== Edit =====\n toggleLabel: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <text x=\"1.5\" y=\"19\" fontSize=\"15\" fontFamily=\"serif\" fontWeight=\"700\" fill=\"currentColor\">A</text>\n <text x=\"12\" y=\"19\" fontSize=\"15\" fontFamily=\"serif\" fontWeight=\"700\" fill=\"currentColor\" fillOpacity=\"0.35\">A</text>\n </svg>\n ),\n toggleVisible: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n <circle cx=\"8\" cy=\"12\" r=\"3.2\" fill={C_POINT}/>\n <circle cx=\"17\" cy=\"12\" r=\"3.2\" fill=\"none\" stroke={C_POINT} strokeWidth=\"1.6\"/>\n </svg>\n ),\n trash: (\n // Eraser hình bình hành — GeoGebra dùng eraser, không phải trash bin.\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinejoin=\"round\" strokeLinecap=\"round\">\n <path d=\"M14.5 3 L21 9.5 L11.5 19 L4 19 L4 11.5 Z\" fill=\"currentColor\" fillOpacity=\"0.14\" stroke=\"currentColor\" strokeWidth=\"1.5\"/>\n <line x1=\"9.5\" y1=\"8\" x2=\"16\" y2=\"14.5\" stroke=\"currentColor\" strokeWidth=\"1.4\"/>\n </svg>\n ),\n\n // ===== Transform =====\n // Style chung: BLUE = input (điểm gốc / tâm), RED = output (ảnh sau biến hình).\n // Mảnh, ít chi tiết — focus vào quan hệ điểm gốc ↔ ảnh.\n translate: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {/* Vector tịnh tiến rời (mũi tên đen) — START thẳng hàng dọc với chấm xanh (x=7), xuống dưới đáy icon, song song với gốc→ảnh */}\n <line x1=\"7\" y1=\"21\" x2=\"12.5\" y2=\"16.25\" stroke=\"currentColor\" strokeWidth=\"1.4\"/>\n <polyline points=\"11.94,17.85 12.5,16.25 10.83,16.57\" stroke=\"currentColor\" strokeWidth=\"1.4\" fill=\"none\"/>\n {/* Điểm gốc BLUE → mũi tên xám → ảnh RED (cùng hướng vector trên) */}\n <line x1=\"7\" y1=\"15\" x2=\"18\" y2=\"5.5\" stroke=\"#94a3b8\" strokeWidth=\"1.4\"/>\n <polyline points=\"15.54,5.97 18,5.5 17.18,7.86\" stroke=\"#94a3b8\" strokeWidth=\"1.4\" fill=\"none\"/>\n <circle cx=\"7\" cy=\"15\" r=\"2\" fill={C_POINT}/>\n <circle cx=\"18\" cy=\"5.5\" r=\"2\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n rotate: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n {/* Tâm quay BLUE (lớn) ở dưới + 2 bán kính + cung α (centered tại vertex, bulge lên) + α + gốc BLUE → ảnh RED */}\n <line x1=\"12\" y1=\"18\" x2=\"20\" y2=\"6\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.55\"/>\n <line x1=\"12\" y1=\"18\" x2=\"4\" y2=\"9\" stroke=\"currentColor\" strokeWidth=\"1\" opacity=\"0.55\"/>\n {/* Arc r=4 quanh vertex (12,18): start (14.22,14.67) → end (9.34,15.01), short arc bulge UP */}\n <path d=\"M 14.22 14.67 A 4 4 0 0 0 9.34 15.01\" stroke=\"currentColor\" strokeWidth=\"1.2\" fill=\"none\"/>\n <text x=\"10\" y=\"14\" fontSize=\"7\" fontFamily=\"serif\" fontStyle=\"italic\" fontWeight=\"700\" fill=\"currentColor\">α</text>\n <circle cx=\"12\" cy=\"18\" r=\"2.4\" fill={C_POINT} stroke=\"#fff\" strokeWidth=\"0.8\"/>\n <circle cx=\"20\" cy=\"6\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"4\" cy=\"9\" r=\"1.9\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n reflectLine: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Trục đối xứng (đường đen chéo) */}\n <line x1=\"3\" y1=\"21\" x2=\"21\" y2=\"3\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\"/>\n {/* Điểm gốc BLUE (phía trên trục) + ảnh RED (phía dưới trục, đối xứng) */}\n <circle cx=\"5\" cy=\"11\" r=\"2\" fill={C_POINT}/>\n <circle cx=\"13\" cy=\"19\" r=\"2\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n reflectPoint: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Điểm gốc BLUE + tâm BLUE (lớn hơn) + ảnh RED, thẳng hàng & cách đều */}\n <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"4\" stroke=\"currentColor\" strokeWidth=\"0.9\" strokeDasharray=\"1.5 1.5\" opacity=\"0.45\"/>\n <circle cx=\"5\" cy=\"19\" r=\"1.9\" fill={C_POINT}/>\n <circle cx=\"12\" cy=\"12\" r=\"2.6\" fill={C_POINT} stroke=\"#fff\" strokeWidth=\"0.8\"/>\n <circle cx=\"19\" cy=\"5\" r=\"1.9\" fill={C_CONSTRUCT}/>\n </svg>\n ),\n dilate: (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\">\n {/* Tâm vị tự BLUE + điểm gốc BLUE (gần tâm) + ảnh RED (xa hơn) — chừa chỗ cho k phía trên đường */}\n <line x1=\"3\" y1=\"20\" x2=\"21\" y2=\"4\" stroke=\"currentColor\" strokeWidth=\"0.9\" strokeDasharray=\"1.5 1.5\" opacity=\"0.5\"/>\n <circle cx=\"4\" cy=\"19\" r=\"2.2\" fill={C_POINT} stroke=\"#fff\" strokeWidth=\"0.8\"/>\n <circle cx=\"8\" cy=\"15.5\" r=\"1.7\" fill={C_POINT}/>\n <circle cx=\"19\" cy=\"5.7\" r=\"1.9\" fill={C_CONSTRUCT}/>\n <text x=\"10.5\" y=\"10.5\" fontSize=\"8\" fontFamily=\"serif\" fontStyle=\"italic\" fontWeight=\"700\" fill=\"currentColor\">k</text>\n </svg>\n ),\n};\n\nexport const GeometryIconHeader = (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"4,20 20,20 12,5\" />\n <circle cx=\"4\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"20\" cy=\"20\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12\" cy=\"5\" r=\"1.5\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n);\n\nexport function UndoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3 7 3 13 9 13\" />\n <path d=\"M3.51 13a9 9 0 1 0 2.13-9.36L3 7\" />\n </svg>\n );\n}\n\nexport function RedoIcon(): React.ReactElement {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"21 7 21 13 15 13\" />\n <path d=\"M20.49 13a9 9 0 1 1-2.12-9.36L21 7\" />\n </svg>\n );\n}\n","import React from 'react';\n\n/**\n * Static catalog của tất cả GeomTool — không phụ thuộc board state, chỉ là\n * metadata (key, label, hint, icon SVG, group, số click cần, accept types).\n *\n * Tách khỏi MiniBoard.tsx để (1) giảm size file component và (2) dễ\n * mở rộng tool mới mà không cần đụng vào board logic.\n */\n\n// Tool keys — match GeoGebra-style toolset\nexport type GeomTool =\n | 'move'\n | 'select'\n | 'point'\n | 'midpoint'\n | 'perpFoot'\n | 'intersect'\n | 'segment'\n | 'line'\n | 'ray'\n | 'vector'\n | 'perpendicular'\n | 'parallel'\n | 'perpBisector'\n | 'angleBisector'\n | 'polygon'\n | 'regularPolygon'\n | 'circleCenter'\n | 'semicircle'\n | 'arcCenter'\n | 'arc3'\n | 'sectorCenter'\n | 'circle3'\n | 'tangent'\n | 'centroid'\n | 'circumcenter'\n | 'incenter'\n | 'orthocenter'\n | 'angle'\n | 'distance'\n | 'area'\n | 'toggleLabel'\n | 'toggleVisible'\n | 'delete'\n | 'translate'\n | 'rotate'\n | 'reflectLine'\n | 'reflectPoint'\n | 'dilate';\n\nexport interface ToolDef {\n key: GeomTool;\n label: string;\n hint: string;\n icon: React.ReactNode;\n group:\n | 'move'\n | 'point'\n | 'line'\n | 'construct'\n | 'polygon'\n | 'circle'\n | 'triangle'\n | 'measure'\n | 'edit'\n | 'transform';\n /** Số click cần trước khi action fire. -1 = mở (polygon đóng bằng click lại điểm đầu). */\n needs: number;\n /** Loại object accept ở mỗi slot. 'any' = point hoặc non-point. 'lineOrCircle' = line hoặc circle (loại trừ point). 'pointOrLine' = point hoặc line/đoạn (loại trừ circle). */\n accepts?: Array<'point' | 'line' | 'circle' | 'any' | 'lineOrCircle' | 'pointOrLine'>;\n}\n\n// ============== Tool icons — imported from icons.tsx ==============\nimport { Icon } from './icons';\n\n// ============== Tool catalog ==============\nexport const TOOLS: ToolDef[] = [\n { key: 'move', label: 'Di chuyển', hint: 'Kéo điểm hoặc xoay nền', icon: Icon.cursor, group: 'move', needs: 0 },\n { key: 'select', label: 'Chọn', hint: 'Click để chọn 1 / Shift+click để bỏ thêm / Kéo nền để khoanh vùng / DEL để xoá', icon: Icon.select, group: 'move', needs: 0 },\n { key: 'point', label: 'Điểm mới', hint: 'Click để thêm điểm', icon: Icon.point, group: 'point', needs: 1 },\n { key: 'midpoint', label: 'Trung điểm', hint: 'Click 2 điểm có sẵn', icon: Icon.midpoint, group: 'point', needs: 2, accepts: ['point', 'point'] },\n { key: 'perpFoot', label: 'Chân đường vuông góc', hint: 'Click 1 điểm + 1 đường có sẵn', icon: Icon.perpFoot, group: 'point', needs: 2, accepts: ['point', 'line'] },\n { key: 'intersect', label: 'Giao điểm của 2 đối tượng', hint: 'Click 2 đường/đường tròn có sẵn', icon: Icon.intersect, group: 'point', needs: 2, accepts: ['lineOrCircle', 'lineOrCircle'] },\n { key: 'segment', label: 'Đoạn thẳng', hint: 'Click 2 điểm', icon: Icon.segment, group: 'line', needs: 2 },\n { key: 'line', label: 'Đường thẳng qua 2 điểm', hint: 'Click 2 điểm', icon: Icon.line, group: 'line', needs: 2 },\n { key: 'ray', label: 'Tia qua 2 điểm', hint: 'Click 2 điểm', icon: Icon.ray, group: 'line', needs: 2 },\n { key: 'vector', label: 'Vector', hint: 'Click 2 điểm', icon: Icon.vector, group: 'line', needs: 2 },\n { key: 'perpendicular', label: 'Đường vuông góc', hint: 'Click 1 điểm + 1 đường có sẵn', icon: Icon.perpendicular, group: 'construct', needs: 2, accepts: ['point', 'line'] },\n { key: 'parallel', label: 'Đường song song', hint: 'Click 1 điểm + 1 đường có sẵn', icon: Icon.parallel, group: 'construct', needs: 2, accepts: ['point', 'line'] },\n { key: 'perpBisector', label: 'Đường trung trực', hint: 'Click 2 điểm có sẵn', icon: Icon.perpBisector, group: 'construct', needs: 2, accepts: ['point', 'point'] },\n { key: 'angleBisector', label: 'Đường phân giác', hint: 'Click 3 điểm (đỉnh ở giữa) hoặc 2 đường/đoạn (sẽ tạo 2 tia phân giác)', icon: Icon.bisector, group: 'construct', needs: 3, accepts: ['pointOrLine', 'pointOrLine', 'pointOrLine'] },\n { key: 'polygon', label: 'Đa giác', hint: 'Click các điểm, click lại điểm đầu để đóng', icon: Icon.polygon, group: 'polygon', needs: -1 },\n { key: 'regularPolygon', label: 'Đa giác đều', hint: 'Click 2 điểm rồi nhập số cạnh', icon: Icon.regularPolygon, group: 'polygon', needs: 2, accepts: ['point', 'point'] },\n { key: 'circleCenter', label: 'Đường tròn (tâm + điểm)', hint: 'Click tâm rồi 1 điểm trên đường tròn', icon: Icon.circleCenter, group: 'circle', needs: 2 },\n { key: 'semicircle', label: 'Nửa đường tròn (đường kính)', hint: 'Click 2 điểm — bán nguyệt qua đường kính', icon: Icon.semicircle, group: 'circle', needs: 2 },\n { key: 'arcCenter', label: 'Cung tròn (tâm + 2 điểm)', hint: 'Click tâm O → A → B (cung từ A đến B)', icon: Icon.arcCenter, group: 'circle', needs: 3 },\n { key: 'arc3', label: 'Cung tròn qua 3 điểm', hint: 'Click 3 điểm trên cung', icon: Icon.arc3, group: 'circle', needs: 3 },\n { key: 'sectorCenter', label: 'Hình quạt (tâm + 2 điểm)', hint: 'Click tâm O → A → B (quạt OAB)', icon: Icon.sectorCenter, group: 'circle', needs: 3 },\n { key: 'circle3', label: 'Đường tròn qua 3 điểm', hint: 'Click 3 điểm', icon: Icon.circle3, group: 'circle', needs: 3 },\n { key: 'tangent', label: 'Tiếp tuyến', hint: 'Click 1 điểm + 1 đường tròn có sẵn', icon: Icon.tangent, group: 'circle', needs: 2, accepts: ['point', 'circle'] },\n { key: 'centroid', label: 'Trọng tâm tam giác', hint: 'Click 3 đỉnh tam giác', icon: Icon.centroid, group: 'triangle', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'circumcenter', label: 'Tâm đường tròn ngoại tiếp', hint: 'Click 3 đỉnh tam giác', icon: Icon.circumcenter, group: 'triangle', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'incenter', label: 'Tâm đường tròn nội tiếp', hint: 'Click 3 đỉnh tam giác', icon: Icon.incenter, group: 'triangle', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'orthocenter', label: 'Trực tâm tam giác', hint: 'Click 3 đỉnh tam giác', icon: Icon.orthocenter, group: 'triangle', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'angle', label: 'Góc', hint: 'Click 3 điểm có sẵn (đỉnh ở giữa)', icon: Icon.angle, group: 'measure', needs: 3, accepts: ['point', 'point', 'point'] },\n { key: 'distance', label: 'Khoảng cách', hint: 'Click 2 điểm có sẵn', icon: Icon.distance, group: 'measure', needs: 2, accepts: ['point', 'point'] },\n { key: 'area', label: 'Diện tích', hint: 'Click các đỉnh, click lại điểm đầu để đóng', icon: Icon.area, group: 'measure', needs: -1 },\n { key: 'toggleLabel', label: 'Hiện/ẩn tên', hint: 'Click vào đối tượng', icon: Icon.toggleLabel, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'toggleVisible', label: 'Hiện/ẩn đối tượng', hint: 'Click vào đối tượng', icon: Icon.toggleVisible, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'delete', label: 'Xoá', hint: 'Click vào đối tượng', icon: Icon.trash, group: 'edit', needs: 1, accepts: ['any'] },\n { key: 'translate', label: 'Phép tịnh tiến', hint: 'Click object → 2 điểm tạo vector', icon: Icon.translate, group: 'transform', needs: 3, accepts: ['any', 'point', 'point'] },\n { key: 'rotate', label: 'Quay đối tượng', hint: 'Click object → tâm quay → nhập góc', icon: Icon.rotate, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n { key: 'reflectLine', label: 'Đối xứng qua đường thẳng', hint: 'Click object → đường thẳng', icon: Icon.reflectLine, group: 'transform', needs: 2, accepts: ['any', 'line'] },\n { key: 'reflectPoint', label: 'Đối xứng qua điểm', hint: 'Click object → tâm đối xứng', icon: Icon.reflectPoint, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n { key: 'dilate', label: 'Phép vị tự', hint: 'Click object → tâm → nhập tỷ số k', icon: Icon.dilate, group: 'transform', needs: 2, accepts: ['any', 'point'] },\n];\n\nexport const GROUP_LABELS: Record<ToolDef['group'], string> = {\n move: 'Cơ bản',\n point: 'Điểm',\n line: 'Đường',\n construct: 'Dựng hình',\n polygon: 'Đa giác',\n circle: 'Đường tròn',\n triangle: 'Tam giác',\n measure: 'Đo lường',\n edit: 'Chỉnh sửa',\n transform: 'Phép biến hình',\n};\n\nexport type GeomGroup = ToolDef['group'];\n\n// Positional A..I — letter shortcut cho chord 2-phím.\n// Khớp đúng thứ tự hiển thị trong LeftPanel (derive từ TOOLS phía trên).\nexport const GROUP_ORDER: GeomGroup[] = [\n 'move',\n 'point',\n 'line',\n 'construct',\n 'polygon',\n 'circle',\n 'triangle',\n 'measure',\n 'edit',\n 'transform',\n];\n\nconst A_CODE = 'A'.charCodeAt(0);\n\nexport function letterForGroup(g: GeomGroup): string {\n const idx = GROUP_ORDER.indexOf(g);\n return idx >= 0 ? String.fromCharCode(A_CODE + idx) : '';\n}\n\nexport function groupForLetter(ch: string): GeomGroup | null {\n if (ch.length !== 1) return null;\n const upper = ch.toUpperCase();\n const idx = upper.charCodeAt(0) - A_CODE;\n if (idx < 0 || idx >= GROUP_ORDER.length) return null;\n return GROUP_ORDER[idx];\n}\n\n// ============== Object-type matching ==============\n\n \ntype JxgObj = any;\n\n/** Phân loại JSXGraph element type vào nhóm dùng cho accept-matching.\n *\n * Ưu tiên `elementClass` (numeric constant do JSXGraph set đúng cho mọi derived\n * element — intersection, reflection, glider, parallelpoint, mirrorpoint, ...\n * đều trả về OBJECT_CLASS_POINT). Nếu không có (test mocks), fallback sang\n * `elType` string với danh sách mở rộng các kiểu thường gặp.\n *\n * Constants từ JSXGraph: OBJECT_CLASS_POINT=1, OBJECT_CLASS_LINE=2, OBJECT_CLASS_CIRCLE=3.\n */\nexport function objKind(obj: JxgObj): 'point' | 'line' | 'circle' | 'other' {\n if (!obj) return 'other';\n const ec = typeof obj.elementClass === 'number' ? obj.elementClass : null;\n if (ec === 1) return 'point';\n if (ec === 2) return 'line';\n if (ec === 3) return 'circle';\n const e = (obj.elType || obj.type || '').toString().toLowerCase();\n if (\n e === 'point' || e === 'glider' || e === 'midpoint' ||\n e === 'intersection' || e === 'otherintersection' ||\n e === 'reflection' || e === 'mirrorpoint' || e === 'mirrorelement' ||\n e === 'orthogonalprojection' || e === 'parallelpoint'\n ) return 'point';\n if (\n e === 'line' || e === 'segment' || e === 'arrow' || e === 'axis' ||\n e === 'normal' || e === 'parallel' || e === 'perpendicular' ||\n e === 'tangent' || e === 'bisector' || e === 'perpendicularsegment'\n ) return 'line';\n if (e === 'circle' || e === 'circumcircle') return 'circle';\n return 'other';\n}\n\nexport function acceptMatches(\n tool: ToolDef,\n slot: number,\n kind: 'point' | 'line' | 'circle' | 'other',\n): boolean {\n if (!tool.accepts) return kind === 'point' || tool.key === 'point';\n const a = tool.accepts[slot];\n if (!a) return false;\n if (a === 'any') return kind !== 'other';\n if (a === 'lineOrCircle') return kind === 'line' || kind === 'circle';\n if (a === 'pointOrLine') return kind === 'point' || kind === 'line';\n return a === kind;\n}\n","import { objKind } from '../../tools';\nimport type { HandlerCtx } from '../ctx';\n\n \nexport function handleMoveTool(ctx: HandlerCtx, e: any): void {\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n ctx.moveDownRef.current = { sx, sy };\n const cx = (e.clientX ?? e.touches?.[0]?.clientX ?? 0) as number;\n const cy = (e.clientY ?? e.touches?.[0]?.clientY ?? 0) as number;\n ctx.lastClickClientRef.current = { x: cx, y: cy };\n\n // Click-select trong move tool (chế độ cơ bản): cho phép chọn 1 / shift-add\n // mà không cần switch sang tool 'select'. Hành vi drag điểm + pan nền của\n // JSXGraph vẫn nguyên (selection chỉ là side-effect, không stopPropagation).\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y)\n .filter((o) => ctx.jxgIdToSceneId(o) != null);\n const obj = hits.find((o) => objKind(o) === 'point') ?? ctx.findNearestPointJxg(e, 12) ?? hits[0];\n if (obj) {\n const sid = ctx.jxgIdToSceneId(obj);\n if (sid) {\n const shift = !!(e.shiftKey || e.altKey);\n ctx.toggleSelect(sid, shift);\n }\n return;\n }\n // Empty space + không additive: clear selection (popover sẽ tự đóng qua\n // selectionTick effect ở MiniBoard).\n if (!(e.shiftKey || e.altKey)) ctx.clearSelection();\n}\n","import { objKind } from '../../tools';\nimport type { HandlerCtx } from '../ctx';\n\n \nexport function handleSelectTool(ctx: HandlerCtx, e: any): void {\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n const cx = (e.clientX ?? e.touches?.[0]?.clientX ?? 0) as number;\n const cy = (e.clientY ?? e.touches?.[0]?.clientY ?? 0) as number;\n ctx.lastClickClientRef.current = { x: cx, y: cy };\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y)\n .filter((o) => ctx.jxgIdToSceneId(o) != null);\n // Ưu tiên điểm: exact hit → nearest-within-12px → mới đến hit khác (line/circle).\n const obj = hits.find((o) => objKind(o) === 'point') ?? ctx.findNearestPointJxg(e, 12) ?? hits[0];\n if (obj) {\n const sid = ctx.jxgIdToSceneId(obj);\n if (sid) {\n const shift = !!(e.shiftKey || e.altKey);\n ctx.toggleSelect(sid, shift);\n }\n ctx.moveDownRef.current = { sx, sy };\n ctx.marqueeRef.current = null;\n return;\n }\n // Empty space: start marquee.\n ctx.marqueeRef.current = { startSx: sx, startSy: sy };\n if (!(e.shiftKey || e.altKey)) ctx.clearSelection();\n}\n","const isDev = (() => {\n try {\n return typeof process !== 'undefined' && process.env?.NODE_ENV !== 'production';\n } catch {\n return false;\n }\n})();\n\n/**\n * Wrap JSXGraph operations that can throw on stale/missing state.\n * In dev mode: log to console. In prod: silent swallow + return fallback.\n *\n * @param label Short tag for grep-ability (vd \"removeObject\", \"board.update\").\n * @param fn Operation to execute.\n * @param fallback Value to return if fn throws (default: undefined).\n */\nexport function safeJsx<T>(label: string, fn: () => T): T | undefined;\nexport function safeJsx<T>(label: string, fn: () => T, fallback: T): T;\nexport function safeJsx<T>(label: string, fn: () => T, fallback?: T): T | undefined {\n try {\n return fn();\n } catch (err) {\n if (isDev) {\n \n console.warn('[whiteboard:jsxgraph]', label, err);\n }\n return fallback;\n }\n}\n","import type { HandlerCtx } from './ctx';\n\nexport type SceneObj = {\n id: string;\n kind: string;\n label: string;\n visible: boolean;\n locked: boolean;\n layer: string;\n schemaVersion: number;\n attrs: Record<string, unknown>;\n};\n\nexport function freshId(ctx: HandlerCtx, prefix: string): string {\n const counter = ctx.store.getState().counter;\n // Loop until unique (counter is monotonic but ids may have been deleted/reused\n // in non-trivial scenarios; safer to probe).\n let n = counter + 1;\n let id = `${prefix}_${n}`;\n const objs = ctx.store.getState().objects;\n while (id in objs) {\n n += 1;\n id = `${prefix}_${n}`;\n }\n return id;\n}\n\nexport function mkSceneObj(\n id: string,\n kind: string,\n label: string,\n attrs: Record<string, unknown>,\n): SceneObj {\n return {\n id,\n kind,\n label,\n visible: true,\n locked: false,\n layer: 'default',\n schemaVersion: 1,\n attrs,\n };\n}\n\n/** Tạo point free + dispatch ADD; trả về scene id mới. */\nexport function dispatchAddFreePoint(ctx: HandlerCtx, x: number, y: number): string {\n const id = freshId(ctx, 'p');\n const label = ctx.nextLabel('point');\n const obj = mkSceneObj(id, 'point', label, { constraint: { kind: 'free', x, y } });\n ctx.store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n\n/** Tạo intersection point + dispatch ADD; trả về scene id mới. */\nexport function dispatchAddIntersection(\n ctx: HandlerCtx,\n attrs: Record<string, unknown>,\n): string {\n const id = freshId(ctx, 'X');\n const label = ctx.nextLabel('intersection');\n const obj = mkSceneObj(id, 'intersection', label, attrs);\n ctx.store.dispatch({ type: 'ADD', payload: { obj } });\n return id;\n}\n","import { objKind } from '../../tools';\nimport { safeJsx } from '../../../../shared/safeJsx';\nimport type { HandlerCtx } from '../ctx';\nimport { dispatchAddFreePoint, dispatchAddIntersection } from '../utils';\n\n \ntype JxgObj = any;\n\nexport function handlePointTool(\n ctx: HandlerCtx,\n \n _e: any,\n x: number,\n y: number,\n hits: JxgObj[],\n): void {\n const curves = hits.filter((o) => objKind(o) === 'line' || objKind(o) === 'circle');\n if (curves.length >= 2) {\n const a = curves[0];\n const b = curves[1];\n const aId = ctx.jxgIdToSceneId(a);\n const bId = ctx.jxgIdToSceneId(b);\n if (aId && bId) {\n try {\n const aKind = objKind(a);\n const bKind = objKind(b);\n if (aKind === 'line' && bKind === 'line') {\n dispatchAddIntersection(ctx, { kind: 'lineLine', ref1: aId, ref2: bId });\n return;\n }\n // line-circle / circle-circle: pick branch nearest click.\n const tmp0 = ctx.boardRef.current.create('intersection', [a, b, 0], { visible: false, withLabel: false });\n const tmp1 = ctx.boardRef.current.create('intersection', [a, b, 1], { visible: false, withLabel: false });\n const d0 = Math.hypot((tmp0.X?.() ?? 0) - x, (tmp0.Y?.() ?? 0) - y);\n const d1 = Math.hypot((tmp1.X?.() ?? 0) - x, (tmp1.Y?.() ?? 0) - y);\n safeJsx('handlers.removeObject(intersect.tmp0)', () => ctx.boardRef.current.removeObject(tmp0));\n safeJsx('handlers.removeObject(intersect.tmp1)', () => ctx.boardRef.current.removeObject(tmp1));\n const branch: 0 | 1 = d0 <= d1 ? 0 : 1;\n const isLineCircle = (aKind === 'line' && bKind === 'circle') || (aKind === 'circle' && bKind === 'line');\n if (isLineCircle) {\n dispatchAddIntersection(ctx, { kind: 'lineCircle', ref1: aId, ref2: bId, branch });\n } else {\n dispatchAddIntersection(ctx, { kind: 'circleCircle', ref1: aId, ref2: bId, branch });\n }\n return;\n } catch {\n // fallback: tạo điểm tự do\n }\n }\n }\n dispatchAddFreePoint(ctx, x, y);\n}\n","import type { ToolDef, GeomTool } from '../../tools';\nimport type { HandlerCtx } from '../ctx';\n\n \ntype JxgObj = any;\n\nexport function handleSingleTargetTool(\n ctx: HandlerCtx,\n t: GeomTool,\n toolDef: ToolDef,\n \n e: any,\n bestHit: JxgObj | null,\n): boolean {\n if (!(toolDef.needs === 1 && toolDef.accepts)) return false;\n const hit = bestHit ?? ctx.findNearestPointJxg(e, 12);\n if (!hit) {\n ctx.flashWarn('Click vào một đối tượng để áp dụng');\n return true;\n }\n const sid = ctx.jxgIdToSceneId(hit);\n if (!sid) return true;\n if (t === 'delete') {\n ctx.store.dispatch({ type: 'DELETE', payload: { id: sid } });\n return true;\n }\n if (t === 'toggleLabel') {\n const obj = ctx.store.getState().objects[sid];\n if (!obj) return true;\n const cur = (obj.attrs as { showLabel?: boolean }).showLabel;\n const next = !(cur ?? false);\n ctx.store.dispatch({ type: 'UPDATE_ATTRS', payload: { id: sid, patch: { showLabel: next } } });\n return true;\n }\n if (t === 'toggleVisible') {\n const obj = ctx.store.getState().objects[sid];\n if (!obj) return true;\n ctx.store.dispatch({ type: 'UPDATE', payload: { id: sid, patch: { visible: !obj.visible } } });\n return true;\n }\n return true;\n}\n","import { objKind } from '../../tools';\nimport { safeJsx } from '../../../../shared/safeJsx';\nimport type { GeomTool, ToolDef } from '../../tools';\nimport type { HandlerCtx } from '../ctx';\nimport { dispatchAddFreePoint, freshId, mkSceneObj } from '../utils';\n\n \ntype JxgObj = any;\n\nexport function handlePolygonTool(\n ctx: HandlerCtx,\n t: GeomTool,\n toolDef: ToolDef,\n \n e: any,\n x: number,\n y: number,\n bestHit: JxgObj | null,\n): boolean {\n if (toolDef.needs !== -1) return false;\n const snappedPoint: JxgObj | null =\n bestHit && objKind(bestHit) === 'point' ? bestHit : ctx.findNearestPointJxg(e, 12);\n const snappedId = snappedPoint ? ctx.jxgIdToSceneId(snappedPoint) : null;\n // Close ring: click back on first pending point.\n if (\n ctx.pendingIdsRef.current.length >= 3 &&\n snappedId &&\n snappedId === ctx.pendingIdsRef.current[0]\n ) {\n ctx.clearPreviewSegs();\n const vertices = ctx.pendingIdsRef.current.slice();\n const isArea = t === 'area';\n const id = freshId(ctx, isArea ? 'area' : 'poly');\n const label = ctx.nextLabel('polygon');\n // Tool 'area' = polygon + showValue + fill phân biệt visual với polygon\n // thường. JSXGraph polygon.Area() live-update khi đỉnh di chuyển.\n const attrs: Record<string, unknown> = { vertices };\n if (isArea) {\n attrs.showValue = true;\n attrs.fillOpacity = 0.18;\n attrs.color = '#1d4ed8';\n }\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'polygon', label, attrs) },\n });\n ctx.clearPending();\n return true;\n }\n if (snappedId && ctx.pendingIdsRef.current.includes(snappedId)) {\n ctx.flashWarn('Đỉnh này đã có — click điểm khác hoặc click lại điểm đầu để đóng');\n return true;\n }\n // Otherwise pick (snap-to-existing or create) a new vertex.\n let pickId: string | null = snappedId;\n let pickJxg: JxgObj | null = snappedPoint;\n if (!pickId) {\n pickId = dispatchAddFreePoint(ctx, x, y);\n pickJxg = ctx.jxgFromSceneId(pickId);\n }\n // Live preview segment from previous vertex to new pick.\n if (ctx.pendingRef.current.length > 0 && ctx.boardRef.current && pickJxg) {\n const prev = ctx.pendingRef.current[ctx.pendingRef.current.length - 1];\n safeJsx('handlers.createPreviewSegment', () => {\n const seg = ctx.boardRef.current.create('segment', [prev, pickJxg], {\n strokeColor: '#3b82f6',\n strokeWidth: 1.5,\n strokeOpacity: 0.75,\n fixed: true,\n highlight: false,\n withLabel: false,\n });\n ctx.previewSegRef.current.push(seg);\n });\n }\n if (pickJxg) ctx.pendingRef.current.push(pickJxg);\n if (pickId) ctx.pendingIdsRef.current.push(pickId);\n ctx.setPendingCount(ctx.pendingIdsRef.current.length);\n return true;\n}\n"," \ntype JxgObj = any;\n\nexport type PointVsCircle = 'inside' | 'on' | 'outside';\n\n/**\n * Classify a JXG point's position relative to a JXG circle.\n *\n * Uses a relative epsilon (max(1e-9, 1e-6 * r)) for the on-circle check so\n * that user-snapped points (which may carry tiny floating-point error)\n * register as on the circle rather than just inside/outside.\n *\n * Defensive: if either argument is null/undefined, returns 'inside' so the\n * caller will refuse to draw rather than risk a wrong tangent.\n */\nexport function classifyPointVsCircle(point: JxgObj, circle: JxgObj): PointVsCircle {\n if (!point || !circle || !circle.center) return 'inside';\n const dx = point.X() - circle.center.X();\n const dy = point.Y() - circle.center.Y();\n const d = Math.hypot(dx, dy);\n const r = typeof circle.Radius === 'function' ? circle.Radius() : Number(circle.radius);\n if (!Number.isFinite(d) || !Number.isFinite(r)) return 'inside';\n const eps = Math.max(1e-9, 1e-6 * r);\n if (Math.abs(d - r) <= eps) return 'on';\n return d < r ? 'inside' : 'outside';\n}\n","import { objKind, type ToolDef } from '../tools';\nimport type { HandlerCtx } from './ctx';\nimport { dispatchAddIntersection, freshId, mkSceneObj } from './utils';\nimport { classifyPointVsCircle } from './classifyPointVsCircle';\n\n// ─── Finalize shape (dispatch ADD per tool) ──────────────────────────────────\n\n/**\n * Tìm scene id của pending pick theo `objKind`. Dùng cho tool order-flexible\n * (perpendicular, parallel, tangent): user có thể click điểm trước hay đường\n * trước, finalizeShape dò pendingRef theo kind để biết role.\n */\nfunction findPickIdByKind(ctx: HandlerCtx, kind: 'point' | 'line' | 'circle'): string | null {\n const picks = ctx.pendingRef.current;\n const ids = ctx.pendingIdsRef.current;\n for (let i = 0; i < picks.length; i += 1) {\n if (objKind(picks[i]) === kind && ids[i]) return ids[i];\n }\n return null;\n}\n\nexport function finalizeShape(ctx: HandlerCtx, toolDef: ToolDef): void {\n const ids = ctx.pendingIdsRef.current;\n const key = toolDef.key;\n switch (key) {\n case 'segment': {\n const id = freshId(ctx, 's');\n const label = ctx.nextLabel('segment');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'segment', label, { p1: ids[0], p2: ids[1] }) },\n });\n return;\n }\n case 'line': {\n const id = freshId(ctx, 'l');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, { p1: ids[0], p2: ids[1] }) },\n });\n return;\n }\n case 'perpendicular':\n case 'parallel': {\n const throughPoint = findPickIdByKind(ctx, 'point');\n const toLine = findPickIdByKind(ctx, 'line');\n if (!throughPoint || !toLine) return;\n const id = freshId(ctx, key === 'perpendicular' ? 'perp' : 'par');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, {\n construction: { kind: key, throughPoint, toLine },\n }) },\n });\n return;\n }\n case 'perpBisector': {\n const id = freshId(ctx, 'pb');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, {\n construction: { kind: 'perpBisector', p1: ids[0], p2: ids[1] },\n }) },\n });\n return;\n }\n case 'angleBisector': {\n const picks = ctx.pendingRef.current;\n // Mode 2-line: 2 picks đều là line/segment → tạo 2 scene line (2 tia\n // phân giác vuông góc với nhau qua giao điểm 2 đường).\n if (picks.length === 2 && objKind(picks[0]) === 'line' && objKind(picks[1]) === 'line') {\n for (const branch of [0, 1] as const) {\n const id = freshId(ctx, 'ab');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, {\n construction: { kind: 'angleBisectorLines', line1: ids[0], line2: ids[1], branch },\n }) },\n });\n }\n return;\n }\n // Mode 3-point: behavior cũ.\n const id = freshId(ctx, 'ab');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, {\n construction: { kind: 'angleBisector', p1: ids[0], vertex: ids[1], p2: ids[2] },\n }) },\n });\n return;\n }\n case 'tangent': {\n const throughId = findPickIdByKind(ctx, 'point');\n const circleId = findPickIdByKind(ctx, 'circle');\n if (!throughId || !circleId) return;\n // Lấy JXG object tương ứng để classify vị trí P vs đường tròn.\n // pendingRef + pendingIdsRef cùng index → match qua indexOf id.\n const picks = ctx.pendingRef.current;\n const ids = ctx.pendingIdsRef.current;\n const through = picks[ids.indexOf(throughId)];\n const circle = picks[ids.indexOf(circleId)];\n const pos = classifyPointVsCircle(through, circle);\n if (pos === 'inside') {\n ctx.toast?.('Điểm nằm trong đường tròn — không có tiếp tuyến', {\n variant: 'warning',\n id: 'tangent-invalid-inside',\n });\n return;\n }\n if (pos === 'on') {\n const id = freshId(ctx, 't');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, {\n construction: { kind: 'tangent', throughPoint: throughId, toCircle: circleId, branch: 'on' },\n }) },\n });\n return;\n }\n // outside → 2 scene element riêng, mỗi cái 1 nhánh tiếp tuyến.\n for (const branch of [0, 1] as const) {\n const id = freshId(ctx, 't');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, {\n construction: { kind: 'tangent', throughPoint: throughId, toCircle: circleId, branch },\n }) },\n });\n }\n return;\n }\n case 'ray': {\n const id = freshId(ctx, 'r');\n const label = ctx.nextLabel('ray');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'ray', label, { origin: ids[0], through: ids[1] }) },\n });\n return;\n }\n case 'vector': {\n const id = freshId(ctx, 'v');\n const label = ctx.nextLabel('vector');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'vector', label, { from: ids[0], to: ids[1] }) },\n });\n return;\n }\n case 'circleCenter': {\n const id = freshId(ctx, 'c');\n const label = ctx.nextLabel('circle');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: mkSceneObj(id, 'circle', label, {\n center: ids[0],\n surfacePoint: ids[1],\n }),\n },\n });\n return;\n }\n case 'circle3': {\n const id = freshId(ctx, 'cc');\n const label = ctx.nextLabel('circle');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: mkSceneObj(id, 'circle', label, {\n construction: { kind: 'circumscribed', p1: ids[0], p2: ids[1], p3: ids[2] },\n }),\n },\n });\n return;\n }\n case 'semicircle': {\n if (ids[0] === ids[1]) {\n ctx.toast?.('Cần 2 điểm phân biệt', { variant: 'warning', id: 'semicircle-dup' });\n return;\n }\n const id = freshId(ctx, 'arc');\n const label = ctx.nextLabel('arc');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: mkSceneObj(id, 'arc', label, {\n construction: { kind: 'semicircle', p1: ids[0], p2: ids[1] },\n }),\n },\n });\n return;\n }\n case 'arcCenter': {\n if (ids[0] === ids[1] || ids[0] === ids[2] || ids[1] === ids[2]) {\n ctx.toast?.('Cần 3 điểm phân biệt', { variant: 'warning', id: 'arc-center-dup' });\n return;\n }\n const id = freshId(ctx, 'arc');\n const label = ctx.nextLabel('arc');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: mkSceneObj(id, 'arc', label, {\n construction: { kind: 'byCenter', center: ids[0], p1: ids[1], p2: ids[2] },\n }),\n },\n });\n return;\n }\n case 'arc3': {\n if (ids[0] === ids[1] || ids[0] === ids[2] || ids[1] === ids[2]) {\n ctx.toast?.('Cần 3 điểm phân biệt', { variant: 'warning', id: 'arc3-dup' });\n return;\n }\n const picks = ctx.pendingRef.current;\n const ax = picks[0].X(), ay = picks[0].Y();\n const bx = picks[1].X(), by = picks[1].Y();\n const cx = picks[2].X(), cy = picks[2].Y();\n const cross = (bx - ax) * (cy - ay) - (by - ay) * (cx - ax);\n if (Math.abs(cross) < 1e-6) {\n ctx.toast?.('Không vẽ được cung qua 3 điểm thẳng hàng', {\n variant: 'warning', id: 'arc3-collinear',\n });\n return;\n }\n const id = freshId(ctx, 'arc');\n const label = ctx.nextLabel('arc');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: mkSceneObj(id, 'arc', label, {\n construction: { kind: 'by3Points', p1: ids[0], p2: ids[1], p3: ids[2] },\n }),\n },\n });\n return;\n }\n case 'sectorCenter': {\n if (ids[0] === ids[1] || ids[0] === ids[2] || ids[1] === ids[2]) {\n ctx.toast?.('Cần 3 điểm phân biệt', { variant: 'warning', id: 'sector-center-dup' });\n return;\n }\n const id = freshId(ctx, 'sec');\n const label = ctx.nextLabel('sector');\n ctx.store.dispatch({\n type: 'ADD',\n payload: {\n obj: mkSceneObj(id, 'sector', label, {\n construction: { kind: 'byCenter', center: ids[0], p1: ids[1], p2: ids[2] },\n }),\n },\n });\n return;\n }\n case 'midpoint': {\n const id = freshId(ctx, 'mp');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'midpoint', p1: ids[0], p2: ids[1] },\n }) },\n });\n return;\n }\n case 'perpFoot': {\n const fromPoint = findPickIdByKind(ctx, 'point');\n const onLine = findPickIdByKind(ctx, 'line');\n if (!fromPoint || !onLine) return;\n const id = freshId(ctx, 'pf');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'perpFoot', from: fromPoint, onLine },\n }) },\n });\n return;\n }\n case 'centroid': {\n const id = freshId(ctx, 'g');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'centroid', vertices: [ids[0], ids[1], ids[2]] },\n }) },\n });\n return;\n }\n case 'circumcenter': {\n const id = freshId(ctx, 'o');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'circumcenter', vertices: [ids[0], ids[1], ids[2]] },\n }) },\n });\n return;\n }\n case 'incenter': {\n const id = freshId(ctx, 'i');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'incenter', vertices: [ids[0], ids[1], ids[2]] },\n }) },\n });\n return;\n }\n case 'orthocenter': {\n const id = freshId(ctx, 'h');\n const label = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'point', label, {\n constraint: { kind: 'orthocenter', vertices: [ids[0], ids[1], ids[2]] },\n }) },\n });\n return;\n }\n case 'angle': {\n // ids = [p1, vertex, p2] — tool def 'accepts: [\"point\", \"point\", \"point\"]'\n // và LeftPanel hint \"Click 3 điểm có sẵn (đỉnh ở giữa)\". User click theo\n // thứ tự: cạnh-A, đỉnh, cạnh-B.\n const id = freshId(ctx, 'ang');\n const label = ctx.nextLabel('angle');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'angle', label, {\n p1: ids[0], vertex: ids[1], p2: ids[2],\n }) },\n });\n return;\n }\n case 'distance': {\n const id = freshId(ctx, 'd');\n const label = ctx.nextLabel('distance');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'distance', label, { p1: ids[0], p2: ids[1] }) },\n });\n return;\n }\n case 'intersect': {\n // ids[0], ids[1] là line hoặc circle theo accept 'lineOrCircle'.\n // Resolve kind từ pendingRef để biết lineLine / lineCircle / circleCircle.\n const picks = ctx.pendingRef.current;\n const pendIds = ctx.pendingIdsRef.current;\n const aIdx = pendIds.indexOf(ids[0]);\n const bIdx = pendIds.indexOf(ids[1]);\n if (aIdx < 0 || bIdx < 0) return;\n const aKind = objKind(picks[aIdx]);\n const bKind = objKind(picks[bIdx]);\n if (aKind === 'line' && bKind === 'line') {\n dispatchAddIntersection(ctx, { kind: 'lineLine', ref1: ids[0], ref2: ids[1] });\n return;\n }\n const isLineCircle =\n (aKind === 'line' && bKind === 'circle') || (aKind === 'circle' && bKind === 'line');\n const isCircleCircle = aKind === 'circle' && bKind === 'circle';\n if (!isLineCircle && !isCircleCircle) return;\n // 2 nhánh → tạo 2 scene intersection (giống GeoGebra \"Intersect Two Objects\").\n for (const branch of [0, 1] as const) {\n dispatchAddIntersection(ctx, {\n kind: isLineCircle ? 'lineCircle' : 'circleCircle',\n ref1: ids[0],\n ref2: ids[1],\n branch,\n });\n }\n return;\n }\n default:\n return;\n }\n}\n"," \nexport type JxgObj = any;\n\nimport type { State, SceneObject } from '../../../core/scene';\n\n/**\n * Trả về danh sách id điểm \"định nghĩa\" object — dùng cho transform tools\n * (translate/rotate/reflect/dilate) cần biết các điểm gốc để clone.\n *\n * Signature: `(obj: SceneObject, state: State)`. `state` được pass để\n * forward-compatible với các kind phái sinh (vd: lookup dependentsOf cho\n * compound shapes); hiện tại chỉ đọc `obj.kind` + `obj.attrs`.\n */\nexport function getDefiningPoints(obj: SceneObject, _state: State): string[] {\n if (obj.kind === 'point' || obj.kind === 'intersection') return [obj.id];\n if (obj.kind === 'segment' || obj.kind === 'line') {\n const a = obj.attrs as { p1: string; p2: string };\n return [a.p1, a.p2];\n }\n if (obj.kind === 'ray') {\n const a = obj.attrs as { origin: string; through: string };\n return [a.origin, a.through];\n }\n if (obj.kind === 'vector') {\n const a = obj.attrs as { from: string; to: string };\n return [a.from, a.to];\n }\n if (obj.kind === 'circle') {\n const a = obj.attrs as { center: string; surfacePoint: string };\n return [a.center, a.surfacePoint];\n }\n if (obj.kind === 'polygon') {\n return [...(obj.attrs as { vertices: string[] }).vertices];\n }\n return [];\n}\n\nexport type TransformInput =\n | { kind: 'translate'; vectorPoints: [JxgObj, JxgObj] }\n | { kind: 'rotate'; center: JxgObj; angleDeg: number }\n | { kind: 'reflectLine'; line: JxgObj }\n | { kind: 'reflectPoint'; center: JxgObj }\n | { kind: 'dilate'; center: JxgObj; k: number };\n\nexport interface TransformSpec {\n params: unknown[];\n attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' };\n /**\n * Khi `chain` được set, finalizeTransformCreate dựng từng transform trong chain\n * (theo thứ tự) rồi pass mảng vào `board.create('point', [src, [t1, t2, t3]])`.\n * Dùng cho `dilate` (scale-quanh-điểm) vì JSXGraph 'scale' không nhận center.\n */\n chain?: Array<{ params: unknown[]; attrs: { type: 'translate' | 'rotate' | 'reflect' | 'scale' } }>;\n}\n\nexport function buildTransformSpec(input: TransformInput): TransformSpec {\n switch (input.kind) {\n case 'translate': {\n // Literal dx/dy (không phải callback) để serialize qua JSON.stringify được.\n // Trade-off: transformed object không cập nhật khi user kéo điểm vector — chấp nhận.\n const [a, b] = input.vectorPoints;\n const dx = b.X() - a.X();\n const dy = b.Y() - a.Y();\n return { params: [dx, dy], attrs: { type: 'translate' } };\n }\n case 'rotate':\n return {\n params: [(input.angleDeg * Math.PI) / 180, input.center],\n attrs: { type: 'rotate' },\n };\n case 'reflectLine':\n return { params: [input.line], attrs: { type: 'reflect' } };\n case 'reflectPoint':\n // JSXGraph 'scale' chỉ nhận 2 tham số (sx, sy) và scale quanh gốc toạ độ —\n // tham số center thứ 3 bị lờ → trước đây sai. Đối xứng qua điểm = quay 180°\n // quanh điểm đó. Dùng 'rotate' (params [angle, center]) để chuẩn.\n return { params: [Math.PI, input.center], attrs: { type: 'rotate' } };\n case 'dilate':\n // JSXGraph 'scale' chỉ nhận đúng 2 tham số (sx, sy) và scale quanh gốc toạ độ —\n // tham số center thứ 3 làm constructor throw. Dilate quanh điểm c bằng tỷ số k\n // = compose 3 phép: T(-c) → S(k,k) → T(+c). Sinh ra chain (mảng spec) thay vì\n // 1 spec đơn; consumer (finalizeTransformCreate) tự nhận biết.\n return {\n params: [],\n attrs: { type: 'scale' },\n chain: [\n { params: [-input.center.X(), -input.center.Y()], attrs: { type: 'translate' as const } },\n { params: [input.k, input.k], attrs: { type: 'scale' as const } },\n { params: [input.center.X(), input.center.Y()], attrs: { type: 'translate' as const } },\n ],\n };\n }\n}\n","import type { TransformDef } from '../../../../core/scene/kinds/2d-constraint';\nimport { getDefiningPoints } from '../transforms';\nimport type { HandlerCtx, TransformToolKey } from './ctx';\nimport { freshId, mkSceneObj } from './utils';\n\nexport function finalizeTransform(\n ctx: HandlerCtx,\n tool: TransformToolKey,\n pendingIds: string[],\n value: number,\n): void {\n if (tool === 'regularPolygon') {\n const n = Math.max(3, Math.round(value));\n const id = freshId(ctx, 'rpoly');\n const label = ctx.nextLabel('polygon');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'polygon', label, {\n construction: { kind: 'regular', p1: pendingIds[0], p2: pendingIds[1], n },\n }) },\n });\n return;\n }\n\n // 5 transform tools: pendingIds[0] = source object.\n const sourceId = pendingIds[0];\n const state = ctx.store.getState();\n const source = state.objects[sourceId];\n if (!source) {\n ctx.flashWarn('Đối tượng nguồn không còn');\n return;\n }\n const defining = getDefiningPoints(source, state);\n if (defining.length === 0) {\n ctx.flashWarn('Không thể biến đổi đối tượng này');\n return;\n }\n\n let transformDef: TransformDef | null = null;\n if (tool === 'translate') {\n // pendingIds = [source, A, B]; vector = B − A. Đọc toạ độ live qua JxgObj.\n const a = ctx.jxgFromSceneId(pendingIds[1]);\n const b = ctx.jxgFromSceneId(pendingIds[2]);\n if (!a || !b || typeof a.X !== 'function' || typeof b.X !== 'function') {\n ctx.flashWarn('Không đọc được toạ độ vector');\n return;\n }\n transformDef = { kind: 'translate', dx: b.X() - a.X(), dy: b.Y() - a.Y() };\n } else if (tool === 'rotate') {\n transformDef = { kind: 'rotate', angleRad: (value * Math.PI) / 180, center: pendingIds[1] };\n } else if (tool === 'reflectLine') {\n transformDef = { kind: 'reflectLine', line: pendingIds[1] };\n } else if (tool === 'reflectPoint') {\n transformDef = { kind: 'reflectPoint', center: pendingIds[1] };\n } else if (tool === 'dilate') {\n transformDef = { kind: 'dilate', k: value, center: pendingIds[1] };\n }\n if (!transformDef) return;\n\n // Tạo N transformed point + collect ids. Dispatch tuần tự (không gom vào\n // transaction) vì freshId/nextLabel cần đọc state đã commit để cấp id+label\n // không trùng. Trade-off: undo sẽ tách thành N+1 step thay vì 1.\n const newPointIds: string[] = [];\n for (const defId of defining) {\n const newId = freshId(ctx, 'p');\n const newLabel = ctx.nextLabel('point');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(newId, 'point', newLabel, {\n constraint: { kind: 'transformed', source: defId, transform: transformDef! },\n color: '#0ea5e9',\n }) },\n });\n newPointIds.push(newId);\n }\n // Tạo wrapper cùng kind từ N point mới (point thì không cần wrapper).\n recreateFromTransformedPoints(ctx, source, newPointIds);\n}\n\n/**\n * Dựng object cùng kind với source từ N point đã transform. Tuân thủ schema\n * attrs của kind tương ứng. Không hỗ trợ kind 'point' (đã có sẵn point biến\n * hình), 'intersection' / 'angle' / 'distance' (measurement — không có ý\n * nghĩa biến hình), 'circle' với construction circumscribed.\n */\nfunction recreateFromTransformedPoints(\n ctx: HandlerCtx,\n source: { kind: string; attrs: Record<string, unknown> },\n pointIds: string[],\n): void {\n const k = source.kind;\n if (k === 'point' || k === 'intersection') return; // point đơn đã có sẵn\n\n if (k === 'segment' && pointIds.length === 2) {\n const id = freshId(ctx, 's');\n const label = ctx.nextLabel('segment');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'segment', label, { p1: pointIds[0], p2: pointIds[1], color: '#0ea5e9' }) },\n });\n return;\n }\n if (k === 'line' && pointIds.length === 2) {\n const id = freshId(ctx, 'l');\n const label = ctx.nextLabel('line');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'line', label, { p1: pointIds[0], p2: pointIds[1], color: '#0ea5e9' }) },\n });\n return;\n }\n if (k === 'ray' && pointIds.length === 2) {\n const id = freshId(ctx, 'r');\n const label = ctx.nextLabel('ray');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'ray', label, { origin: pointIds[0], through: pointIds[1], color: '#0ea5e9' }) },\n });\n return;\n }\n if (k === 'vector' && pointIds.length === 2) {\n const id = freshId(ctx, 'v');\n const label = ctx.nextLabel('vector');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'vector', label, { from: pointIds[0], to: pointIds[1], color: '#0ea5e9' }) },\n });\n return;\n }\n if (k === 'circle' && pointIds.length === 2) {\n const id = freshId(ctx, 'c');\n const label = ctx.nextLabel('circle');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'circle', label, { center: pointIds[0], surfacePoint: pointIds[1], color: '#0ea5e9' }) },\n });\n return;\n }\n if (k === 'polygon' && pointIds.length >= 3) {\n const id = freshId(ctx, 'poly');\n const label = ctx.nextLabel('polygon');\n ctx.store.dispatch({\n type: 'ADD',\n payload: { obj: mkSceneObj(id, 'polygon', label, { vertices: pointIds, color: '#0ea5e9' }) },\n });\n return;\n }\n // Other kinds (angle/distance/derived line constructions) — biến hình không\n // có ý nghĩa định nghĩa. Bỏ qua.\n}\n","import { objKind, type ToolDef } from '../../tools';\nimport type { HandlerCtx } from '../ctx';\nimport { dispatchAddFreePoint } from '../utils';\nimport { finalizeShape } from '../finalizeShape';\nimport { finalizeTransform } from '../transform';\n\n \ntype JxgObj = any;\n\nexport function handleMultiClickTool(\n ctx: HandlerCtx,\n toolDef: ToolDef,\n \n e: any,\n x: number,\n y: number,\n hits: JxgObj[],\n bestHit: JxgObj | null,\n): void {\n let pick: JxgObj | null = null;\n let pickId: string | null = null;\n\n if (toolDef.accepts) {\n // --- Mode A: strict, order-flexible ---\n const usedKinds = ctx.pendingRef.current.map((p) => objKind(p));\n const remaining: Array<'point' | 'line' | 'circle' | 'any' | 'lineOrCircle' | 'pointOrLine'> = [...toolDef.accepts];\n for (const u of usedKinds) {\n if (u === 'other') continue;\n // 'lineOrCircle' slot có thể được lấp bởi line hoặc circle.\n // 'pointOrLine' slot có thể được lấp bởi point hoặc line.\n let i = remaining.indexOf(u);\n if (i < 0 && (u === 'line' || u === 'circle')) i = remaining.indexOf('lineOrCircle');\n if (i < 0 && (u === 'point' || u === 'line')) i = remaining.indexOf('pointOrLine');\n if (i >= 0) remaining.splice(i, 1);\n }\n const strictPoint = hits.find((o) => objKind(o) === 'point') ?? null;\n const lineHit = hits.find((o) => objKind(o) === 'line') ?? null;\n const circleHit = hits.find((o) => objKind(o) === 'circle') ?? null;\n if (remaining.includes('point') && strictPoint) pick = strictPoint;\n else if (remaining.includes('line') && lineHit) pick = lineHit;\n else if (remaining.includes('circle') && circleHit) pick = circleHit;\n else if (remaining.includes('lineOrCircle') && (lineHit || circleHit)) {\n pick = lineHit ?? circleHit;\n }\n else if (remaining.includes('pointOrLine') && (strictPoint || lineHit)) {\n pick = strictPoint ?? lineHit;\n }\n else if (remaining.includes('any') && (strictPoint || lineHit || circleHit)) {\n pick = strictPoint ?? lineHit ?? circleHit;\n } else if (remaining.includes('point') || remaining.includes('pointOrLine')) {\n const near = ctx.findNearestPointJxg(e, 12);\n if (near) {\n pick = near;\n } else {\n // Mode A tool nhận 'point' / 'pointOrLine' + click khu vực rỗng → tự tạo\n // free point tại vị trí click. Đỡ cho user phải đổi sang tool 'point'\n // rồi quay lại (tangent / perpendicular / parallel / angleBisector ...).\n // Các slot khác (line/circle) vẫn yêu cầu hit object có sẵn.\n //\n // angleBisector: nếu lần click đầu đã là line thì cấm tạo free-point\n // (mode 2-line đã chốt) — handled by mode-consistency check phía dưới.\n //\n // pickId set trực tiếp từ return value của dispatchAddFreePoint vì\n // reverse-map (jxgIdToSceneRef) được rebuild qua store subscribe →\n // chưa sync xong tại thời điểm này; gọi jxgIdToSceneId(pick) sẽ ra null.\n if (toolDef.key === 'angleBisector' && ctx.pendingRef.current.length > 0\n && objKind(ctx.pendingRef.current[0]) === 'line') {\n ctx.flashWarn('Đã chọn đường — click thêm 1 đường/đoạn nữa để tạo 2 tia phân giác');\n return;\n }\n pickId = dispatchAddFreePoint(ctx, x, y);\n pick = ctx.jxgFromSceneId(pickId);\n }\n }\n if (!pick) {\n const needs = remaining.map((k) =>\n k === 'point' ? 'một điểm'\n : k === 'line' ? 'một đường/đoạn'\n : k === 'circle' ? 'một đường tròn'\n : k === 'lineOrCircle' ? 'một đường hoặc đường tròn'\n : k === 'pointOrLine' ? 'một điểm hoặc đường/đoạn'\n : 'một đối tượng',\n );\n ctx.flashWarn(`Còn cần click vào ${needs.join(' + ')} có sẵn`);\n return;\n }\n if (ctx.pendingRef.current.includes(pick)) {\n ctx.flashWarn('Đã chọn đối tượng này — chọn đối tượng khác');\n return;\n }\n // angleBisector: ép tính nhất quán mode (3-point ↔ 2-line) — không trộn lẫn.\n if (toolDef.key === 'angleBisector' && ctx.pendingRef.current.length > 0) {\n const firstKind = objKind(ctx.pendingRef.current[0]);\n const newKind = objKind(pick);\n if (firstKind === 'line' && newKind !== 'line') {\n ctx.flashWarn('Đã chọn đường — chỉ click thêm 1 đường/đoạn nữa');\n return;\n }\n if (firstKind === 'point' && newKind !== 'point') {\n ctx.flashWarn('Đã chọn điểm — click thêm điểm (đỉnh ở giữa)');\n return;\n }\n }\n if (!pickId) pickId = ctx.jxgIdToSceneId(pick);\n } else {\n // --- Mode B: lenient, all slots want a point ---\n const snapped = bestHit && objKind(bestHit) === 'point' ? bestHit : ctx.findNearestPointJxg(e, 12);\n if (snapped && ctx.pendingRef.current.includes(snapped)) {\n ctx.flashWarn('Đã chọn điểm này — chọn điểm khác hoặc click chỗ trống');\n return;\n }\n if (snapped) {\n pick = snapped;\n pickId = ctx.jxgIdToSceneId(snapped);\n } else {\n pickId = dispatchAddFreePoint(ctx, x, y);\n pick = ctx.jxgFromSceneId(pickId);\n }\n }\n\n if (!pick) return;\n ctx.pendingRef.current.push(pick);\n if (pickId) ctx.pendingIdsRef.current.push(pickId);\n ctx.setPendingCount(ctx.pendingIdsRef.current.length);\n\n // angleBisector 2-line mode: finalize ngay khi đủ 2 đường (không chờ 3 picks).\n if (toolDef.key === 'angleBisector'\n && ctx.pendingIdsRef.current.length === 2\n && objKind(ctx.pendingRef.current[0]) === 'line') {\n finalizeShape(ctx, toolDef);\n ctx.clearPending();\n return;\n }\n\n if (ctx.pendingIdsRef.current.length >= toolDef.needs) {\n const tk = toolDef.key;\n // 3 popover transform tools cần numeric input (góc / tỷ số / số cạnh) trước\n // khi finalize → emit info để MiniBoard show TransformParamPopover.\n if (tk === 'rotate' || tk === 'dilate' || tk === 'regularPolygon') {\n const cx = ((e.clientX ?? 0) as number) + 8;\n const cy = ((e.clientY ?? 0) as number) + 8;\n ctx.pendingTransformRef.current = {\n tool: tk,\n pendingIds: ctx.pendingIdsRef.current.slice(),\n anchorScreen: { x: cx, y: cy },\n };\n ctx.emitTransform({ tool: tk, anchor: { x: cx, y: cy } });\n // Don't clearPending — wait for confirm/cancel from MiniBoard.\n return;\n }\n // 3 no-popover transform tools (translate/reflectLine/reflectPoint):\n // finalize ngay khi đủ pick — không cần numeric param.\n if (tk === 'translate' || tk === 'reflectLine' || tk === 'reflectPoint') {\n finalizeTransform(ctx, tk, ctx.pendingIdsRef.current.slice(), 0);\n ctx.clearPending();\n return;\n }\n\n // Non-transform multi-click tools: dispatch ADD for the shape directly.\n finalizeShape(ctx, toolDef);\n ctx.clearPending();\n } else {\n ctx.refreshPreview();\n }\n}\n","import { objKind, TOOLS } from '../../tools';\nimport type { HandlerCtx } from '../ctx';\nimport { handleMoveTool } from './move';\nimport { handleSelectTool } from './select';\nimport { handlePointTool } from './point';\nimport { handleSingleTargetTool } from './singleTarget';\nimport { handlePolygonTool } from './polygon';\nimport { handleMultiClickTool } from './multiClick';\n\n \nexport function handleDown(ctx: HandlerCtx, e: any): void {\n if (!ctx.boardRef.current) return;\n const t = ctx.toolRef.current;\n\n if (t === 'move') return handleMoveTool(ctx, e);\n if (t === 'select') return handleSelectTool(ctx, e);\n\n const toolDef = TOOLS.find((td) => td.key === t);\n if (!toolDef) return;\n\n const coords = ctx.boardRef.current.getUsrCoordsOfMouse(e);\n const x = coords[0], y = coords[1];\n\n // Detect if click hits any existing object (snap target).\n // Filter hits không có scene id (vd auxiliary points của 'regularpolygon' do\n // JSXGraph tự sinh — không có id trong renderer.elements, không thể dùng làm\n // pick cho tool). Nếu không filter, aux point sẽ cướp click khỏi border/edge\n // bên cạnh, làm tool perp/parallel/... đứng yên không tiến tới needs.\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y)\n .filter((o) => ctx.jxgIdToSceneId(o) != null);\n const bestHit = hits.find((o) => objKind(o) === 'point') ?? hits[0] ?? null;\n\n if (t === 'point') return handlePointTool(ctx, e, x, y, hits);\n if (handleSingleTargetTool(ctx, t, toolDef, e, bestHit)) return;\n if (handlePolygonTool(ctx, t, toolDef, e, x, y, bestHit)) return;\n\n handleMultiClickTool(ctx, toolDef, e, x, y, hits, bestHit);\n}\n","import { safeJsx } from '../../../shared/safeJsx';\nimport type { HandlerCtx } from './ctx';\n\n// ─── board.on('move') ────────────────────────────────────────────────────────\n\n \nexport function handleMove(ctx: HandlerCtx, e: any): void {\n // Marquee rectangle redraw while user drags with the select tool on empty space.\n if (ctx.toolRef.current === 'select' && ctx.marqueeRef.current) {\n const sc = ctx.screenCoordsOf(e);\n if (sc && ctx.boardRef.current) {\n const [sx, sy] = sc;\n const { startSx, startSy } = ctx.marqueeRef.current;\n const b = ctx.boardRef.current;\n const ux1 = b.screenCoords2userCoords?.([Math.min(startSx, sx), Math.min(startSy, sy)]) ?? null;\n const ux2 = b.screenCoords2userCoords?.([Math.max(startSx, sx), Math.max(startSy, sy)]) ?? null;\n const toUsr = (px: number, py: number): [number, number] => {\n const ox = b.origin?.scrCoords?.[1] ?? 0;\n const oy = b.origin?.scrCoords?.[2] ?? 0;\n const ux = (px - ox) / b.unitX;\n const uy = (oy - py) / b.unitY;\n return [ux, uy];\n };\n const [x1u, y1u] = ux1 && ux1.length >= 2 ? [ux1[0], ux1[1]] : toUsr(Math.min(startSx, sx), Math.min(startSy, sy));\n const [x2u, y2u] = ux2 && ux2.length >= 2 ? [ux2[0], ux2[1]] : toUsr(Math.max(startSx, sx), Math.max(startSy, sy));\n const rect = ctx.marqueeRef.current.rect;\n if (rect) {\n safeJsx('handlers.removeObject(marquee.prevRect)', () => ctx.boardRef.current.removeObject(rect));\n }\n safeJsx('handlers.createMarqueePolygon', () => {\n ctx.marqueeRef.current!.rect = ctx.boardRef.current.create('polygon', [\n [x1u, y1u], [x2u, y1u], [x2u, y2u], [x1u, y2u],\n ], {\n fillColor: '#06b6d4', fillOpacity: 0.08,\n borders: { strokeColor: '#06b6d4', strokeWidth: 1, dash: 2 },\n vertices: { visible: false },\n fixed: true, highlight: false, withLabel: false,\n });\n });\n }\n return;\n }\n const ph = ctx.phantomRef.current;\n if (!ph || !ctx.boardRef.current) return;\n if (ctx.previewRafRef.current != null) return;\n ctx.previewRafRef.current = requestAnimationFrame(() => {\n ctx.previewRafRef.current = null;\n if (!ctx.boardRef.current || !ctx.phantomRef.current) return;\n safeJsx('handlers.phantomMove', () => {\n const coords = ctx.boardRef.current.getUsrCoordsOfMouse(e);\n \n const JXG: any = ctx.jxgRef.current;\n if (!JXG) return;\n ctx.phantomRef.current.setPositionDirectly(JXG.COORDS_BY_USER, [coords[0], coords[1]]);\n ctx.boardRef.current.update();\n });\n });\n}\n"," \ntype JxgObj = any;\n\nimport { objKind } from '../tools';\nimport { safeJsx } from '../../../shared/safeJsx';\nimport type { HandlerCtx } from './ctx';\n\n// ─── board.on('up') ───────────────────────────────────────────────────────────\n\n \nexport function handleUp(ctx: HandlerCtx, e: any): void {\n const t = ctx.toolRef.current;\n if (t === 'select') {\n const mq = ctx.marqueeRef.current;\n ctx.marqueeRef.current = null;\n ctx.moveDownRef.current = null;\n if (!mq) return;\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [ex, ey] = sc;\n if (mq.rect) { safeJsx('handlers.removeObject(marquee.rect)', () => ctx.boardRef.current?.removeObject(mq.rect)); }\n if (Math.hypot(ex - mq.startSx, ey - mq.startSy) < 4) return; // not a real drag\n const x1 = Math.min(mq.startSx, ex), x2 = Math.max(mq.startSx, ex);\n const y1 = Math.min(mq.startSy, ey), y2 = Math.max(mq.startSy, ey);\n const board = ctx.boardRef.current;\n if (!board) return;\n const list = (board.objectsList || []) as JxgObj[];\n for (const o of list) {\n if (o === ctx.axisObjsRef.current.x || o === ctx.axisObjsRef.current.y) continue;\n const kind = objKind(o);\n if (kind === 'point') {\n const pc = o.coords?.scrCoords;\n if (!pc) continue;\n if (pc[1] >= x1 && pc[1] <= x2 && pc[2] >= y1 && pc[2] <= y2) {\n const sid = ctx.jxgIdToSceneId(o);\n if (sid && !ctx.selectedSetRef.current.has(sid)) {\n ctx.selectedSetRef.current.add(sid);\n }\n }\n } else if (kind === 'line' || kind === 'circle') {\n \n const defs: any[] = [o.point1, o.point2, o.center, o.midpoint, o.point3].filter(Boolean);\n const anyInside = defs.some((p) => {\n const pc = p?.coords?.scrCoords;\n return pc && pc[1] >= x1 && pc[1] <= x2 && pc[2] >= y1 && pc[2] <= y2;\n });\n if (anyInside) {\n const sid = ctx.jxgIdToSceneId(o);\n if (sid && !ctx.selectedSetRef.current.has(sid)) {\n ctx.selectedSetRef.current.add(sid);\n }\n }\n }\n }\n ctx.setSelectionTick((tt) => tt + 1);\n safeJsx('handlers.board.update(marquee)', () => board.update());\n return;\n }\n if (t !== 'move') return;\n const start = ctx.moveDownRef.current;\n ctx.moveDownRef.current = null;\n if (!start) return;\n const sc = ctx.screenCoordsOf(e);\n if (!sc) return;\n const [sx, sy] = sc;\n const moved = Math.hypot(sx - start.sx, sy - start.sy);\n if (moved > 4) return; // drag, không phải click\n const hits = ctx.objectsAt(e)\n .map(ctx.promoteLabel)\n .filter((o) => o !== ctx.axisObjsRef.current.x && o !== ctx.axisObjsRef.current.y)\n .filter((o) => ctx.jxgIdToSceneId(o) != null);\n const best: JxgObj | null =\n hits.find((o) => objKind(o) === 'point') ?? ctx.findNearestPointJxg(e, 12) ?? hits[0] ?? null;\n if (!best) {\n ctx.lastMoveClickRef.current = { id: null, time: 0 };\n return;\n }\n const bestId = ctx.jxgIdToSceneId(best);\n const now = Date.now();\n const isDouble =\n bestId !== null && ctx.lastMoveClickRef.current.id === bestId && (now - ctx.lastMoveClickRef.current.time) < 400;\n ctx.lastMoveClickRef.current = { id: bestId, time: now };\n if (!isDouble) return;\n const cx = (e.clientX ?? e.touches?.[0]?.clientX ?? 0) as number;\n const cy = (e.clientY ?? e.touches?.[0]?.clientY ?? 0) as number;\n if (!bestId) return;\n ctx.emitSelect({ id: bestId, anchorScreen: { x: cx + 8, y: cy + 8 } });\n}\n","export { handleDown } from './pointerDown';\nexport { handleMove } from './pointerMove';\nexport { handleUp } from './pointerUp';\nexport { finalizeTransform } from './transform';\nexport type { HandlerCtx, TransformToolKey } from './ctx';\n","// src/stamps/geometry-2d/editor/hitTest.ts\nimport type { State, SceneObject } from '../../../core/scene';\nimport { listObjects } from '../../../core/scene';\nimport { safeJsx } from '../../shared/safeJsx';\n\n \ntype JxgObj = any;\n\n/**\n * Tìm point gần (x, y) nhất trong state, trong vòng tol.\n *\n * Sử dụng `pointCoord(id) => [x, y] | null` để hit-test theo toạ độ JSXGraph\n * thực tế (resolve qua JxgRenderer Map). Trả về `null` nếu không có point nào\n * trong vòng tol.\n */\nexport function findNearestPoint(\n state: State,\n pointCoord: (id: string) => [number, number] | null,\n x: number,\n y: number,\n tolPx: number,\n excludeIds: Set<string> = new Set(),\n): SceneObject | null {\n let best: SceneObject | null = null;\n let bestDistSq = tolPx * tolPx;\n for (const obj of listObjects(state)) {\n if (obj.kind !== 'point' && obj.kind !== 'intersection') continue;\n if (excludeIds.has(obj.id)) continue;\n const coord = pointCoord(obj.id);\n if (!coord) continue;\n const dx = coord[0] - x;\n const dy = coord[1] - y;\n const d2 = dx * dx + dy * dy;\n if (d2 < bestDistSq) {\n bestDistSq = d2;\n best = obj;\n }\n }\n return best;\n}\n\n/**\n * Lấy screen coords (x, y px) của event dưới cursor. Ưu tiên JSXGraph's\n * `getMousePosition`; fallback về container's getBoundingClientRect (cần cho\n * touch event hoặc khi board chưa cache mouse position).\n */\nexport function screenCoordsOf(\n board: JxgObj,\n container: HTMLElement | null,\n evt: JxgObj,\n): [number, number] | null {\n if (!board) return null;\n try {\n const mp = board.getMousePosition ? board.getMousePosition(evt) : null;\n if (mp && mp.length >= 2) return [mp[0], mp[1]];\n } catch { /* fall through to container rect */ }\n if (container) {\n const rect = container.getBoundingClientRect();\n const cx = evt.clientX ?? evt.touches?.[0]?.clientX ?? 0;\n const cy = evt.clientY ?? evt.touches?.[0]?.clientY ?? 0;\n return [cx - rect.left, cy - rect.top];\n }\n return null;\n}\n\n/**\n * List JSXGraph objects whose `hasPoint(sx, sy)` chứa cursor — đã loại\n * `excludes` (vd phantom + preview shape + preview segments).\n *\n * Phantom là invisible point JSXGraph kéo theo cursor để dựng live-preview;\n * nếu không loại trừ, click chỗ trống sẽ snap trúng phantom (cách click 0px)\n * → drawing \"đứng\" vì pendingRef nhét phantom (không có scene id), tool\n * không tiến tới được `needs` threshold. (Regression từ commit 95a6c13.)\n */\nexport function objectsAt(\n board: JxgObj,\n container: HTMLElement | null,\n evt: JxgObj,\n excludes: Iterable<JxgObj>,\n): JxgObj[] {\n const sc = screenCoordsOf(board, container, evt);\n if (!board || !sc) return [];\n const [sx, sy] = sc;\n const excludeSet = new Set<JxgObj>();\n for (const e of excludes) if (e) excludeSet.add(e);\n const out: JxgObj[] = [];\n safeJsx('hitTest.objectsAt', () => {\n for (const o of (board.objectsList || [])) {\n if (excludeSet.has(o)) continue;\n if (o && typeof o.hasPoint === 'function' && o.hasPoint(sx, sy)) out.push(o);\n }\n });\n return out;\n}\n\n/**\n * Tìm JSXGraph point gần cursor (trong `tolPx` pixels). Dùng `findNearestPoint`\n * với `pointCoord` đọc từ JSXGraph's `coords.scrCoords` qua resolver `jxgFromSceneId`.\n * Trả JSXGraph object (không phải scene id) để caller dùng làm pick.\n */\nexport function findNearestJxgPoint(\n board: JxgObj,\n container: HTMLElement | null,\n state: State,\n jxgFromSceneId: (id: string) => JxgObj | null,\n evt: JxgObj,\n tolPx = 12,\n): JxgObj | null {\n const sc = screenCoordsOf(board, container, evt);\n if (!board || !sc) return null;\n const [sx, sy] = sc;\n const pointCoord = (id: string): [number, number] | null => {\n const j = jxgFromSceneId(id);\n const sc2 = j?.coords?.scrCoords;\n return sc2 ? [sc2[1], sc2[2]] : null;\n };\n const result = findNearestPoint(state, pointCoord, sx, sy, tolPx);\n return result ? jxgFromSceneId(result.id) : null;\n}\n\n/**\n * Khi user click trúng label text của một element, JSXGraph trả về text obj\n * thay vì owner. Promote về owner để properties popover hiển thị đúng\n * properties của shape, không phải của text.\n */\nexport function promoteToLabelOwner(board: JxgObj, o: JxgObj): JxgObj {\n if (!o) return o;\n const t = (o.elType || o.type || '').toString().toLowerCase();\n if (t !== 'text' || !board) return o;\n const promoted = safeJsx<JxgObj | null>('hitTest.promoteToLabelOwner', () => {\n for (const c of (board.objectsList || [])) {\n if (c.label === o) return c;\n }\n return null;\n }, null);\n return promoted ?? o;\n}\n","import { useCallback, useRef, useState } from 'react';\n\nexport type ToolStateMachine<T extends string> = {\n tool: T;\n pendingIds: string[];\n toolRef: { readonly current: T };\n pendingIdsRef: { readonly current: string[] };\n setTool: (t: T) => void;\n pushPending: (id: string) => void;\n clearPending: () => void;\n};\n\n/**\n * Tool + pending ids state machine, generic theo tool union type.\n *\n * - `setTool` clears pending — chuyển tool đang xây thì huỷ build dở.\n * - Ref + state song song để handler stable-closure read được giá trị mới\n * mà UI vẫn re-render khi giá trị đổi.\n *\n * Shared cho geometry-2d (`GeomTool`) và graph-2d (`GraphTool`); thêm consumer\n * mới chỉ cần pass union literal type.\n */\nexport function useToolStateMachine<T extends string>(initial: T): ToolStateMachine<T> {\n const [tool, setToolState] = useState<T>(initial);\n const [pendingIds, setPendingIds] = useState<string[]>([]);\n const toolRef = useRef<T>(initial);\n const pendingIdsRef = useRef<string[]>([]);\n\n const setTool = useCallback((t: T) => {\n toolRef.current = t;\n pendingIdsRef.current = [];\n setToolState(t);\n setPendingIds([]);\n }, []);\n\n const pushPending = useCallback((id: string) => {\n pendingIdsRef.current = [...pendingIdsRef.current, id];\n setPendingIds(pendingIdsRef.current);\n }, []);\n\n const clearPending = useCallback(() => {\n pendingIdsRef.current = [];\n setPendingIds([]);\n }, []);\n\n return { tool, pendingIds, toolRef, pendingIdsRef, setTool, pushPending, clearPending };\n}\n","import { safeJsx } from './safeJsx';\n\n/**\n * Minimal JSXGraph board surface that wheel-zoom logic depends on.\n * Local shape to avoid importing the (untyped) jsxgraph default export here.\n */\nexport interface JxgBoardZoomable {\n zoomIn: (x?: number, y?: number) => void;\n zoomOut: (x?: number, y?: number) => void;\n // JSXGraph older versions may not expose this — wheel still works, just\n // without cursor-anchored zoom (falls back to board-center).\n getUsrCoordsOfMouse?: (e: WheelEvent) => unknown;\n}\n\n/**\n * Attach Excalidraw-style Ctrl/Cmd + wheel zoom to a container element.\n *\n * - Khi wheel kèm Ctrl/Cmd: preventDefault + zoom in/out với anchor tại\n * con trỏ (nếu board hỗ trợ `getUsrCoordsOfMouse`).\n * - Khi wheel không kèm modifier: bỏ qua → page scroll bình thường.\n *\n * Returns cleanup fn. Caller chịu trách nhiệm gọi trong cleanup của useEffect.\n *\n * @param target Container element (`HTMLDivElement` hoặc `SVGSVGElement`).\n * @param board JSXGraph board instance đã initBoard xong.\n * @param label Tag để log dev-mode khi safeJsx swallow lỗi (vd \"MiniBoard.2d\").\n */\nexport function attachJxgWheelZoom(\n target: HTMLElement,\n board: JxgBoardZoomable,\n label = 'wheelZoom',\n): () => void {\n const onWheel = (e: WheelEvent): void => {\n if (!e.ctrlKey && !e.metaKey) return;\n e.preventDefault();\n e.stopPropagation();\n let cx: number | undefined;\n let cy: number | undefined;\n safeJsx(`${label}.coords`, () => {\n const usr = board.getUsrCoordsOfMouse?.(e);\n if (Array.isArray(usr) && usr.length >= 2\n && Number.isFinite(usr[0]) && Number.isFinite(usr[1])) {\n cx = usr[0] as number;\n cy = usr[1] as number;\n }\n });\n if (e.deltaY < 0) safeJsx(`${label}.in`, () => board.zoomIn(cx, cy));\n else if (e.deltaY > 0) safeJsx(`${label}.out`, () => board.zoomOut(cx, cy));\n };\n target.addEventListener('wheel', onWheel, { passive: false });\n return () => { target.removeEventListener('wheel', onWheel); };\n}\n","import { safeJsx } from './safeJsx';\n\n/**\n * Toggles cho common JSXGraph options. Per-stamp callsite override mặc định\n * nếu cần preserve behavior cụ thể.\n *\n * Mặc định:\n * - text.display = 'internal' (true) — bắt buộc cho clone-SVG export.\n * - text.useASCII/MathJax/Katex = false (true) — JSXGraph default rendering,\n * không load extra text engine.\n * - label.display = 'internal' (true) — point label vào trong SVG.\n * - elements.highlight = false (FALSE mặc định) — opt-in vì graph-2d cần\n * JSXGraph's default hover-highlight để phân biệt object đang hover.\n */\nexport interface JxgInitDefaults {\n textDisplayInternal?: boolean;\n disableTextEngines?: boolean;\n labelDisplayInternal?: boolean;\n disableElementHighlight?: boolean;\n}\n\nexport interface InitJxgBoardConfig {\n /** Per-MiniBoard toggle cho common defaults. */\n defaults?: JxgInitDefaults;\n /** Options pass thẳng vào `JXG.JSXGraph.initBoard(target, opts)`. */\n boardOptions: Record<string, unknown>;\n /**\n * Hook để tweak options sau khi defaults được apply. Dùng cho per-stamp\n * customization (vd themeLabel color cho 2D, axesPosition cho 3D view3d).\n */\n \n extraOptionTweaks?: (opts: any) => void;\n /** Tag cho safeJsx log (vd \"MiniBoard.2d\"). Default: \"JxgBoard\". */\n label?: string;\n}\n\nexport interface InitJxgBoardResult {\n \n JXG: any;\n \n board: any;\n /** Gọi để free JSXGraph board (safe-wrapped). */\n cleanup: () => void;\n}\n\n/**\n * Async dynamic-import JSXGraph + apply common options + initBoard + trả\n * cleanup. Centralize boilerplate shared bởi 3 MiniBoard (2D/3D/graph-2d).\n *\n * Caller vẫn handle cancellation flag, refs, và post-init setup (renderer,\n * view3d, axes, etc.) ngoài helper này.\n *\n * @throws Nếu JSXGraph load hoặc initBoard throw. Caller nên try/catch nếu\n * cần tolerate mock environments.\n */\nexport async function initJxgBoard(\n target: string | HTMLElement,\n config: InitJxgBoardConfig,\n): Promise<InitJxgBoardResult> {\n const label = config.label ?? 'JxgBoard';\n \n const JXG = (await import('jsxgraph')).default as any;\n const {\n textDisplayInternal = true,\n disableTextEngines = true,\n labelDisplayInternal = true,\n disableElementHighlight = false,\n } = config.defaults ?? {};\n safeJsx(`${label}.applyOptions`, () => {\n const opts = JXG.Options;\n if (!opts) return;\n if (textDisplayInternal || disableTextEngines) {\n opts.text = opts.text ?? {};\n if (textDisplayInternal) opts.text.display = 'internal';\n if (disableTextEngines) {\n opts.text.useASCIIMathML = false;\n opts.text.useMathJax = false;\n opts.text.useKatex = false;\n }\n }\n if (labelDisplayInternal) {\n opts.label = opts.label ?? {};\n opts.label.display = 'internal';\n }\n if (disableElementHighlight) {\n opts.elements = opts.elements ?? {};\n opts.elements.highlight = false;\n }\n config.extraOptionTweaks?.(opts);\n });\n const board = JXG.JSXGraph.initBoard(target, config.boardOptions);\n const cleanup = (): void => {\n safeJsx(`${label}.freeBoard`, () => JXG.JSXGraph.freeBoard(board));\n };\n return { JXG, board, cleanup };\n}\n","import type { State } from '../../../core/scene';\nimport type { ObjectSnapshot } from './MiniBoard.types';\n\n/**\n * Build snapshot từ scene object để PropertiesPopover render. Trả null nếu\n * object kind không hỗ trợ properties panel (vd polygon, angle, …).\n *\n * Pure function — không touch board/JSXGraph state. Caller pass anchorScreen\n * (vị trí pixel mà popover sẽ hiển thị).\n */\nexport function buildObjectSnapshot(\n state: State,\n id: string,\n anchorScreen: { x: number; y: number },\n): ObjectSnapshot | null {\n const obj = state.objects[id];\n if (!obj) return null;\n const k = obj.kind;\n if (k !== 'point' && k !== 'line' && k !== 'circle' && k !== 'segment' && k !== 'ray' && k !== 'vector') {\n return null;\n }\n const a = obj.attrs as Record<string, unknown>;\n const jKind: 'point' | 'line' | 'circle' = k === 'point' ? 'point' : (k === 'circle' ? 'circle' : 'line');\n return {\n id,\n kind: jKind,\n name: obj.label,\n color: (a.color as string) ?? '#0f172a',\n width: (a.width as number) ?? 2,\n dash: (a.dash as number) ?? 0,\n face: (a.face as ObjectSnapshot['face']) ?? 'o',\n showLabel: (a.showLabel as boolean) ?? true,\n showValue: (a.showValue as boolean) ?? false,\n screenCoords: anchorScreen,\n };\n}\n","// Pure preview-shape factory cho 2D editor — không component state, không\n// React. Dùng bởi MiniBoard.tsx `refreshPreview` mỗi khi user thay đổi\n// pending picks. Mirror legacy live-preview (commit ce78521), tách khỏi\n// MiniBoard.tsx để giảm size component file.\n\nimport { safeJsx } from '../../shared/safeJsx';\nimport { objKind, type ToolDef } from './tools';\n\n \ntype JxgObj = any;\n\nconst PREVIEW_STYLE: Record<string, unknown> = {\n strokeColor: '#3b82f6',\n strokeWidth: 1.5,\n strokeOpacity: 0.65,\n dash: 2,\n fixed: true,\n highlight: false,\n withLabel: false,\n};\n\nconst CIRCLE_PREVIEW_STYLE: Record<string, unknown> = {\n ...PREVIEW_STYLE,\n fillColor: 'none',\n fillOpacity: 0,\n};\n\n/**\n * Build transient JSXGraph object để live-preview shape user đang dựng. Trả\n * `null` khi:\n * - Tool không phải shape-tool (vd select/move).\n * - Số pick chưa đủ cho preview cụ thể.\n * - Pick types không hợp lệ với tool (vd perpendicular cần line input).\n *\n * Tất cả create calls wrap trong safeJsx để swallow exception từ JSXGraph\n * khi state stale (vd board destroyed giữa chừng).\n */\nexport function buildPreviewShape(\n board: JxgObj,\n toolDef: ToolDef,\n picks: JxgObj[],\n phantom: JxgObj,\n): JxgObj {\n if (!board) return null;\n return safeJsx<JxgObj>('preview.buildPreviewShape', () => {\n switch (toolDef.key) {\n case 'segment':\n case 'midpoint':\n case 'distance':\n return board.create('segment', [picks[0], phantom], PREVIEW_STYLE);\n case 'line':\n return board.create('line', [picks[0], phantom], PREVIEW_STYLE);\n case 'ray':\n return board.create('line', [picks[0], phantom], {\n ...PREVIEW_STYLE,\n straightFirst: false,\n straightLast: true,\n });\n case 'vector':\n return board.create('arrow', [picks[0], phantom], PREVIEW_STYLE);\n case 'circleCenter':\n return board.create('circle', [picks[0], phantom], CIRCLE_PREVIEW_STYLE);\n case 'circle3':\n if (picks.length === 1) return board.create('circle', [picks[0], phantom], CIRCLE_PREVIEW_STYLE);\n if (picks.length === 2) {\n return board.create('circumcircle', [picks[0], picks[1], phantom], CIRCLE_PREVIEW_STYLE);\n }\n return null;\n case 'angle':\n if (picks.length === 1) return board.create('segment', [picks[0], phantom], PREVIEW_STYLE);\n if (picks.length === 2) {\n return board.create('angle', [picks[0], picks[1], phantom], {\n ...PREVIEW_STYLE,\n radius: 1,\n fillColor: '#22c55e',\n fillOpacity: 0.15,\n });\n }\n return null;\n case 'perpBisector':\n return board.create('segment', [picks[0], phantom], PREVIEW_STYLE);\n case 'angleBisector':\n if (picks.length === 1) return board.create('segment', [picks[0], phantom], PREVIEW_STYLE);\n if (picks.length === 2) return board.create('bisector', [picks[0], picks[1], phantom], PREVIEW_STYLE);\n return null;\n case 'perpendicular':\n case 'parallel':\n case 'tangent': {\n if (picks.length !== 1) return null;\n const k = objKind(picks[0]);\n if (k === 'line' && toolDef.key !== 'tangent') {\n return board.create(toolDef.key, [picks[0], phantom], PREVIEW_STYLE);\n }\n if (k === 'circle' && toolDef.key === 'tangent') {\n const glider = board.create('glider', [phantom.X(), phantom.Y(), picks[0]], {\n visible: false,\n withLabel: false,\n });\n return board.create('tangent', [glider], PREVIEW_STYLE);\n }\n return null;\n }\n default:\n return null;\n }\n }, null);\n}\n\n/**\n * Tạo phantom point (invisible, fixed) làm endpoint kéo theo cursor cho\n * live-preview. Trả `null` nếu board không sẵn sàng (mock/test path).\n */\nexport function createPhantomPoint(board: JxgObj): JxgObj {\n if (!board) return null;\n return safeJsx<JxgObj>('preview.createPhantomPoint', () => board.create('point', [0, 0], {\n visible: false,\n fixed: true,\n withLabel: false,\n name: '',\n }), null);\n}\n","import { safeJsx } from '../../shared/safeJsx';\nimport { buildPreviewShape, createPhantomPoint } from './preview';\nimport { TOOLS } from './tools';\nimport type { ToolStateMachine } from '../../shared/useToolStateMachine';\nimport type { GeomTool } from './tools';\n\n \ntype JxgObj = any;\n\nexport interface PreviewRefs {\n previewSegRef: { current: JxgObj[] };\n phantomRef: { current: JxgObj };\n previewShapeRef: { current: JxgObj };\n pendingRef: { current: JxgObj[] };\n}\n\n/**\n * Xoá tất cả preview segment objects (preview vertex-by-vertex của polygon\n * tool). Reset previewSegRef.current về mảng rỗng.\n */\nexport function clearPreviewSegs(\n board: JxgObj,\n previewSegRef: { current: JxgObj[] },\n): void {\n if (!board) return;\n for (const s of previewSegRef.current) {\n safeJsx('previewActions.removePreviewSeg', () => board.removeObject(s));\n }\n previewSegRef.current = [];\n}\n\n/**\n * Xoá phantom point + preview shape (cả 2 đều transient, không nằm trong\n * scene store). Phantom là invisible point JSXGraph theo cursor; preview\n * shape là live-preview của shape user đang dựng.\n */\nexport function removePhantom(\n board: JxgObj,\n refs: { previewShapeRef: { current: JxgObj }; phantomRef: { current: JxgObj } },\n): void {\n if (!board) return;\n if (refs.previewShapeRef.current) {\n safeJsx('previewActions.removePreviewShape', () => board.removeObject(refs.previewShapeRef.current));\n refs.previewShapeRef.current = null;\n }\n if (refs.phantomRef.current) {\n safeJsx('previewActions.removePhantom', () => board.removeObject(refs.phantomRef.current));\n refs.phantomRef.current = null;\n }\n}\n\n/**\n * Tear down old preview shape và build fresh từ current picks + phantom.\n * Phantom được tạo lazily — không spawn hidden point trước khi user có ít\n * nhất 1 real pick. Skip nếu tool variable-length (polygon: needs === -1)\n * vì handlers.ts emit per-vertex segments riêng qua previewSegRef.\n */\nexport function refreshPreviewShape(\n board: JxgObj,\n toolSM: ToolStateMachine<GeomTool>,\n refs: PreviewRefs,\n): void {\n if (!board) return;\n if (refs.previewShapeRef.current) {\n safeJsx('previewActions.removePreviewShape', () => board.removeObject(refs.previewShapeRef.current));\n refs.previewShapeRef.current = null;\n }\n const t = toolSM.toolRef.current;\n const toolDef = TOOLS.find((td) => td.key === t);\n if (!toolDef) return;\n const picks = refs.pendingRef.current;\n if (picks.length === 0 || toolDef.needs <= 0) return;\n if (picks.length >= toolDef.needs) return;\n if (!refs.phantomRef.current) {\n refs.phantomRef.current = createPhantomPoint(board);\n if (!refs.phantomRef.current) return;\n }\n refs.previewShapeRef.current = buildPreviewShape(board, toolDef, picks, refs.phantomRef.current);\n}\n","import type { Store } from '../../../core/scene/store';\n\nexport interface MutatePatch {\n attrs?: Record<string, unknown>;\n remove?: boolean;\n}\n\n/**\n * Áp patch từ PropertiesPopover lên scene store.\n *\n * PropertiesPopover phát attrs theo tên JSXGraph (strokeColor, strokeWidth,\n * withLabel, name, …). Scene attrs dùng tên ngắn gọn (color, width,\n * showLabel, …) và `label` là field top-level của SceneObject (không nằm\n * trong attrs). Map ở đây để popover khỏi cần biết shape của scene.\n *\n * - `remove: true` → dispatch DELETE.\n * - `attrs.name` (string) → dispatch UPDATE với `label` patch.\n * - JSXGraph attr names → scene names (strokeColor → color, strokeWidth →\n * width, withLabel → showLabel). `fillColor` cũng map sang `color` (fallback\n * khi popover không truyền strokeColor).\n */\nexport function applyMutatePatch(store: Store, id: string, patch: MutatePatch): void {\n if (patch.remove) {\n store.dispatch({ type: 'DELETE', payload: { id } });\n return;\n }\n if (!patch.attrs) return;\n const { name, withLabel, strokeColor, fillColor, strokeWidth, ...rest } = patch.attrs as {\n name?: unknown;\n withLabel?: unknown;\n strokeColor?: unknown;\n fillColor?: unknown;\n strokeWidth?: unknown;\n [k: string]: unknown;\n };\n if (typeof name === 'string') {\n store.dispatch({ type: 'UPDATE', payload: { id, patch: { label: name } } });\n }\n const mapped: Record<string, unknown> = { ...rest };\n // strokeColor / fillColor cùng đại diện cho cùng 1 thuộc tính `color` ở\n // scene. PropertiesPopover thường thêm sẵn `color` cùng strokeColor —\n // ưu tiên `color` (đã có trong rest); fallback strokeColor → fillColor.\n if (strokeColor !== undefined && mapped.color === undefined) mapped.color = strokeColor;\n if (fillColor !== undefined && mapped.color === undefined) mapped.color = fillColor;\n if (strokeWidth !== undefined && mapped.width === undefined) mapped.width = strokeWidth;\n if (withLabel !== undefined && mapped.showLabel === undefined) mapped.showLabel = withLabel;\n if (Object.keys(mapped).length > 0) {\n store.dispatch({ type: 'UPDATE_ATTRS', payload: { id, patch: mapped } });\n }\n}\n","import { listObjects } from '../../../core/scene';\nimport type { Store } from '../../../core/scene/store';\nimport type { JxgRenderer } from '../../../core/scene/render/JxgRenderer';\nimport { safeJsx } from '../../shared/safeJsx';\nimport { applyMutatePatch } from './attrMapping';\nimport { finalizeTransform, type HandlerCtx, type TransformToolKey } from './handlers';\nimport type {\n MiniBoardHandle,\n ObjectSnapshot,\n SelectionStateSnapshot,\n TransformPopoverInfo,\n} from './MiniBoard.types';\nimport { buildObjectSnapshot } from './snapshot';\n\n \ntype JxgObj = any;\n\nexport interface BuildHandleDeps {\n // refs\n containerRef: { readonly current: HTMLDivElement | null };\n boardRef: { readonly current: JxgObj };\n rendererRef: { readonly current: JxgRenderer | null };\n selectSubsRef: { readonly current: Set<(snap: ObjectSnapshot) => void> };\n transformSubsRef: { readonly current: Set<(info: TransformPopoverInfo) => void> };\n selectionStateSubsRef: { readonly current: Set<(snap: SelectionStateSnapshot | null) => void> };\n selectedSetRef: { readonly current: Set<string> };\n \n pendingTransformRef: { current: any };\n ctxRef: { readonly current: HandlerCtx | null };\n // callbacks / values\n store: Store;\n clearPending: () => void;\n clearSelection: () => void;\n deleteSelection: () => void;\n emitTransform: (info: TransformPopoverInfo) => void;\n}\n\n/**\n * Build MiniBoardHandle object cho `useImperativeHandle`. Methods read refs\n * trực tiếp nên handle có thể tạo trước khi board boot xong; gọi method\n * trước onReady?.() có thể trả stale refs.\n *\n * Tách ra file riêng để giảm size MiniBoard.tsx — handle có 25+ methods,\n * chiếm ~60 dòng object literal.\n */\nexport function buildMiniBoardHandle(d: BuildHandleDeps): MiniBoardHandle {\n return {\n getContainer: () => d.containerRef.current,\n getBbox: () => d.boardRef.current?.getBoundingBox() ?? [-10, 10, 10, -10],\n getState: () => d.store.getState(),\n getStore: () => d.store,\n highlight: (id) => { d.rendererRef.current?.highlight(id); },\n snapshotObject: (id, anchorScreen) => buildObjectSnapshot(d.store.getState(), id, anchorScreen),\n mutateObject: (id, patch) => applyMutatePatch(d.store, id, patch),\n getAllPointNames: () => listObjects(d.store.getState())\n .filter((o) => o.kind === 'point' || o.kind === 'intersection')\n .map((o) => o.label),\n onSelect: (cb) => {\n d.selectSubsRef.current.add(cb);\n return () => { d.selectSubsRef.current.delete(cb); };\n },\n onTransformParam: (cb) => {\n d.transformSubsRef.current.add(cb);\n return () => { d.transformSubsRef.current.delete(cb); };\n },\n onSelectionState: (cb) => {\n d.selectionStateSubsRef.current.add(cb);\n return () => { d.selectionStateSubsRef.current.delete(cb); };\n },\n confirmTransformParam: (value: number) => {\n const info = d.pendingTransformRef.current as\n | { tool: TransformToolKey; pendingIds: string[]; anchorScreen: { x: number; y: number } }\n | null;\n if (info && d.ctxRef.current) {\n safeJsx('buildHandle.finalizeTransform', () =>\n finalizeTransform(d.ctxRef.current!, info.tool, info.pendingIds, value),\n );\n }\n d.pendingTransformRef.current = null;\n d.emitTransform(null);\n d.clearPending();\n },\n cancelTransformParam: () => {\n d.pendingTransformRef.current = null;\n d.emitTransform(null);\n d.clearPending();\n },\n getSelectionSize: () => d.selectedSetRef.current.size,\n clearSelection: d.clearSelection,\n deleteSelection: d.deleteSelection,\n };\n}\n","import type { JxgRenderer } from '../../../core/scene/render/JxgRenderer';\n\n \ntype JxgObj = any;\n\n/**\n * Resolve scene id → JSXGraph object qua renderer's elements map.\n *\n * Synthetic \"<polyId>:border:<N>\" → polygon.borders[N]: cho phép preview\n * shape của tool perpendicular/parallel/tangent kéo theo cạnh đa giác làm\n * parent (border là sub-segment auto-tạo, không có scene id riêng).\n */\nexport function jxgFromSceneId(renderer: JxgRenderer | null, id: string): JxgObj {\n if (!renderer) return null;\n \n const elements = (renderer as any).elements as Map<string, JxgObj> | undefined;\n if (!elements) return null;\n const m = /^(.+):border:(\\d+)$/.exec(id);\n if (m) {\n \n const poly = elements.get(m[1]) as any;\n const idx = parseInt(m[2], 10);\n const borders = poly?.borders;\n if (Array.isArray(borders) && borders[idx]) return borders[idx];\n return null;\n }\n return elements.get(id) ?? null;\n}\n\n/**\n * Resolve JSXGraph object → scene id. Trước hết check reverse-map (cached),\n * sau đó dò polygon borders để trả synthetic \"<polyId>:border:<idx>\" cho\n * construct tools dùng cạnh đa giác như line input.\n */\nexport function jxgIdToSceneId(\n renderer: JxgRenderer | null,\n idMap: Map<string, string>,\n jxgObj: JxgObj,\n): string | null {\n if (!jxgObj?.id) return null;\n const direct = idMap.get(String(jxgObj.id));\n if (direct) return direct;\n if (!renderer) return null;\n \n const elements = (renderer as any).elements as Map<string, JxgObj> | undefined;\n if (!elements) return null;\n // Direct fallback: idMap rebuild qua store.subscribe có thể chạy TRƯỚC\n // JxgRenderer subscriber (cùng store, đăng ký theo order useEffect), nên\n // idMap luôn thiếu entry của object vừa được renderer tạo trong dispatch\n // hiện tại. Walk renderer.elements để bù.\n for (const [sid, el] of elements) {\n if (el === jxgObj) return sid;\n \n const borders = (el as any)?.borders;\n if (Array.isArray(borders)) {\n const idx = borders.indexOf(jxgObj);\n if (idx >= 0) return `${sid}:border:${idx}`;\n }\n }\n return null;\n}\n","import { useEffect } from 'react';\nimport { safeJsx } from '../../shared/safeJsx';\nimport { themeAxis, themeGrid } from './theme';\n\n \ntype JxgObj = any;\n\ninterface Params {\n boardRef: { readonly current: JxgObj };\n /** Refs giữ axis x/y JSXGraph objects để cleanup khi toggle off. */\n axisObjsRef: { current: { x?: JxgObj; y?: JxgObj } };\n isDarkRef: { readonly current: boolean };\n showAxis: boolean;\n showGrid: boolean;\n}\n\n/**\n * Sync hiển thị axis + grid khi user toggle qua LeftPanel.\n *\n * - Axis: tự tạo/xoá 2 axis object qua `boardRef.current.create('axis', ...)`.\n * - Grid: xoá grid cũ trong `board.objects` rồi tạo mới khi enable. Match\n * theme color (axis/grid) theo `isDarkRef.current`.\n *\n * Mỗi effect chạy độc lập theo `showAxis` / `showGrid` để switch nhanh\n * không re-do cả 2 mỗi lần toggle 1.\n */\nexport function useAxisGridSync({\n boardRef,\n axisObjsRef,\n isDarkRef,\n showAxis,\n showGrid,\n}: Params): void {\n useEffect(() => {\n const b = boardRef.current;\n if (!b) return;\n safeJsx('useAxisGridSync.toggleAxis', () => {\n if (axisObjsRef.current.x) {\n safeJsx('useAxisGridSync.removeAxisX', () => b.removeObject(axisObjsRef.current.x));\n axisObjsRef.current.x = undefined;\n }\n if (axisObjsRef.current.y) {\n safeJsx('useAxisGridSync.removeAxisY', () => b.removeObject(axisObjsRef.current.y));\n axisObjsRef.current.y = undefined;\n }\n if (showAxis) {\n axisObjsRef.current.x = b.create('axis', [[0, 0], [1, 0]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n axisObjsRef.current.y = b.create('axis', [[0, 0], [0, 1]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n }\n b.update();\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [showAxis]);\n\n useEffect(() => {\n const b = boardRef.current;\n if (!b) return;\n safeJsx('useAxisGridSync.toggleGrid', () => {\n for (const o of Object.values(b.objects || {}) as JxgObj[]) {\n if (o && (o.elType === 'grid' || o.type === 'grid' || (o.visProp && o.visProp.type === 'grid'))) {\n safeJsx('useAxisGridSync.removeGrid', () => b.removeObject(o));\n }\n }\n if (showGrid) b.create('grid', [], { strokeColor: themeGrid(isDarkRef.current), strokeOpacity: 1 });\n b.update();\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [showGrid]);\n}\n","import { useEffect } from 'react';\nimport type { Store } from '../../../core/scene/store';\n\ninterface Params {\n store: Store;\n /** Pending picks (chưa commit) — Esc xoá khi length > 0. */\n pendingIdsRef: { readonly current: string[] };\n /** Current selection ids — Esc/Delete/Backspace act on. */\n selectedSetRef: { readonly current: Set<string> };\n clearPending: () => void;\n clearSelection: () => void;\n deleteSelection: () => void;\n}\n\n/**\n * Capture-phase keyboard shortcuts cho 2D editor:\n *\n * - Ctrl/Cmd+Z → undo\n * - Ctrl/Cmd+Shift+Z / Ctrl/Cmd+Y → redo\n * - Esc → clear pending picks + clear selection\n * - Delete/Backspace → delete selection\n *\n * Capture phase + stopPropagation để win với Excalidraw's bubble handlers\n * (vốn nắm các phím tương tự). Ignore khi focus đang ở input/textarea/contentEditable.\n */\nexport function useEditorShortcuts({\n store,\n pendingIdsRef,\n selectedSetRef,\n clearPending,\n clearSelection,\n deleteSelection,\n}: Params): void {\n useEffect(() => {\n const onKey = (e: KeyboardEvent): void => {\n const ae = document.activeElement as HTMLElement | null;\n const inField = !!(ae && (ae.tagName === 'INPUT' || ae.tagName === 'TEXTAREA' || ae.isContentEditable));\n const lk = e.key.toLowerCase();\n if ((e.metaKey || e.ctrlKey) && lk === 'z' && !e.shiftKey) {\n if (inField) return;\n e.preventDefault(); e.stopPropagation(); store.undo(); return;\n }\n if ((e.metaKey || e.ctrlKey) && ((lk === 'z' && e.shiftKey) || (lk === 'y' && !e.shiftKey))) {\n if (inField) return;\n e.preventDefault(); e.stopPropagation(); store.redo(); return;\n }\n if (e.key === 'Escape' && !inField) {\n if (pendingIdsRef.current.length > 0) {\n e.preventDefault(); e.stopPropagation(); clearPending();\n }\n if (selectedSetRef.current.size > 0) {\n e.preventDefault(); e.stopPropagation(); clearSelection();\n }\n }\n if ((e.key === 'Delete' || e.key === 'Backspace') && !inField && selectedSetRef.current.size > 0) {\n e.preventDefault(); e.stopPropagation(); deleteSelection();\n }\n };\n window.addEventListener('keydown', onKey, { capture: true });\n return () => window.removeEventListener('keydown', onKey, { capture: true });\n }, [store, pendingIdsRef, selectedSetRef, clearPending, clearSelection, deleteSelection]);\n}\n","import { useEffect, useRef } from 'react';\nimport type { Store } from '../../../core/scene/store';\nimport type { JxgRenderer } from '../../../core/scene/render/JxgRenderer';\n\n \ntype JxgObj = any;\n\ninterface Params {\n store: Store;\n rendererRef: { readonly current: JxgRenderer | null };\n}\n\ninterface Result {\n /** Reverse map: JSXGraph internal id (string) → scene id. */\n jxgIdToSceneRef: { readonly current: Map<string, string> };\n}\n\n/**\n * Maintain a reverse lookup `JSXGraph internal id → scene id`, rebuilt every\n * time store dispatches. Cần thiết vì JSXGraph events nắm element ref nhưng\n * scene logic chỉ biết scene id; map này cho phép translate ngược.\n *\n * Renderer's `elements` map (scene-id → JxgObj) là source of truth — hook\n * subscribe store + rebuild map mỗi event.\n */\nexport function useJxgSceneIdMap({ store, rendererRef }: Params): Result {\n const jxgIdToSceneRef = useRef<Map<string, string>>(new Map());\n useEffect(() => {\n const rebuild = (): void => {\n const r = rendererRef.current;\n if (!r) return;\n \n const elements: Map<string, JxgObj> | undefined = (r as any).elements;\n const next = new Map<string, string>();\n if (elements) {\n for (const [sid, jxg] of elements) {\n \n const jid = (jxg as any)?.id;\n if (jid) next.set(String(jid), sid);\n }\n }\n jxgIdToSceneRef.current = next;\n };\n rebuild();\n return store.subscribe(() => rebuild());\n }, [store, rendererRef]);\n return { jxgIdToSceneRef };\n}\n","'use client';\n/**\n * MiniBoard.tsx — JSXGraph mini-board cho geometry-2d editor.\n *\n * Sau Sub-PR 2.3.3 (Scene v2 Phase 2):\n * - Scene state qua `core/scene` Store + JxgRenderer (diff subscribe).\n * - Pointer handlers (handleDown/Up/Move) dispatch ADD/DELETE/UPDATE_ATTRS.\n * - Tool + pending picks qua `useToolStateMachine`.\n * - Selection = Set<sceneId> (UI state).\n * - Undo/Redo qua store (immer snapshot stack).\n *\n * EditorPanel/host/render.ts vẫn dùng API cũ — clean ở 2.3.4 / 2.3.7.\n */\n\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport {\n nextLabel as sceneNextLabel,\n type Store,\n} from '../../../core/scene';\nimport { JxgRenderer } from '../../../core/scene/render/JxgRenderer';\nimport { DEFAULT_VIEW_2D } from '../../../core/scene/types';\nimport { handleDown, handleMove, handleUp, type HandlerCtx } from './handlers';\nimport {\n findNearestJxgPoint,\n objectsAt as objectsAtImpl,\n promoteToLabelOwner,\n screenCoordsOf as screenCoordsOfImpl,\n} from './hitTest';\nimport { paletteFor, themeAxis, themeGrid, themeLabel } from './theme';\nimport { GROUP_LABELS, TOOLS, type GeomTool, type ToolDef } from './tools';\nimport { useToolStateMachine } from '../../shared/useToolStateMachine';\nimport { safeJsx } from '../../shared/safeJsx';\nimport { attachJxgWheelZoom } from '../../shared/attachJxgWheelZoom';\nimport { initJxgBoard } from '../../shared/initJxgBoard';\nimport { buildObjectSnapshot } from './snapshot';\nimport {\n clearPreviewSegs as clearPreviewSegsImpl,\n removePhantom as removePhantomImpl,\n refreshPreviewShape,\n} from './previewActions';\nimport { buildMiniBoardHandle } from './buildHandle';\nimport {\n jxgFromSceneId as jxgFromSceneIdImpl,\n jxgIdToSceneId as jxgIdToSceneIdImpl,\n} from './idResolvers';\nimport { useAxisGridSync } from './useAxisGridSync';\nimport { useEditorShortcuts } from './useEditorShortcuts';\nimport { useJxgSceneIdMap } from './useJxgSceneIdMap';\n\nimport type { MiniBoardHandle, ObjectSnapshot, SelectionStateSnapshot, TransformPopoverInfo } from './MiniBoard.types';\n\nexport { TOOLS, GROUP_LABELS };\nexport type { GeomTool, ToolDef };\nexport type { ObjectSnapshot, SelectionStateSnapshot, TransformPopoverInfo, MiniBoardHandle } from './MiniBoard.types';\n\ntype JxgObj = any;\n\ninterface Props {\n /** Signal \"board boot xong\" — parent gọi handle methods qua ref sau khi nhận. */\n onReady?: () => void;\n /** Scene store do Host tạo qua `useStampStore`. View info đọc từ `store.getState().meta.view`. */\n store: Store;\n /** Tool hiện tại — host owns state (Tier 2 F). */\n selectedTool: GeomTool;\n /** Hiển thị axis — host owns state (Tier 2 F). */\n showAxis: boolean;\n /** Hiển thị grid — host owns state (Tier 2 F). */\n showGrid: boolean;\n isDark?: boolean;\n /** Toast hook từ EditorPanel ToastProvider — handlers dùng cho invalid construction. */\n toast?: import('../../shared/Toast').ShowToastFn;\n}\n\nexport const MiniBoard2D = forwardRef<MiniBoardHandle, Props>(function MiniBoard2D(\n { onReady, store, selectedTool, showAxis, showGrid, isDark, toast },\n ref,\n) {\n const isDarkRef = useRef(!!isDark); isDarkRef.current = !!isDark;\n const containerId = useId().replace(/:/g, '_') + '_jxgmini';\n const containerRef = useRef<HTMLDivElement>(null);\n const boardRef = useRef<JxgObj>(null);\n const jxgRef = useRef<JxgObj>(null);\n const rendererRef = useRef<JxgRenderer | null>(null);\n const axisObjsRef = useRef<{ x?: JxgObj; y?: JxgObj }>({});\n\n const toolSM = useToolStateMachine<GeomTool>(selectedTool);\n\n // bbox init đọc 1 lần lúc mount từ store.meta.view; axis/grid drive bằng prop.\n const initialMeta = store.getState().meta;\n const initialView = initialMeta.domain === '2d' ? initialMeta.view : DEFAULT_VIEW_2D;\n const showAxisRef = useRef(showAxis); showAxisRef.current = showAxis;\n const showGridRef = useRef(showGrid); showGridRef.current = showGrid;\n\n const selectedSetRef = useRef<Set<string>>(new Set());\n const [selectionTick, setSelectionTick] = useState(0);\n\n // Sync selection halo overlay + emit selection state snapshot khi\n // selectedSetRef đổi. Dùng tick để notify (selectedSetRef là ref nên\n // React không track trực tiếp).\n useEffect(() => {\n const ids = [...selectedSetRef.current];\n rendererRef.current?.highlight(ids);\n const anchor = lastClickClientRef.current ?? { x: 0, y: 0 };\n const snap: SelectionStateSnapshot | null =\n ids.length === 0 ? null : { ids, anchor: { x: anchor.x + 8, y: anchor.y + 8 } };\n selectionStateSubsRef.current.forEach((cb) =>\n safeJsx('MiniBoard.emitSelectionState.cb', () => cb(snap)),\n );\n }, [selectionTick]);\n\n // Pending / preview / marquee state.\n const pendingRef = useRef<JxgObj[]>([]);\n const previewSegRef = useRef<JxgObj[]>([]);\n const phantomRef = useRef<JxgObj>(null);\n const previewShapeRef = useRef<JxgObj>(null);\n const previewRafRef = useRef<number | null>(null);\n const marqueeRef = useRef<{ startSx: number; startSy: number; rect?: JxgObj } | null>(null);\n const moveDownRef = useRef<{ sx: number; sy: number } | null>(null);\n const lastMoveClickRef = useRef<{ id: string | null; time: number }>({ id: null, time: 0 });\n const lastClickClientRef = useRef<{ x: number; y: number } | null>(null);\n const pendingTransformRef = useRef<any>(null);\n\n // Subscribers cho popover (select + transform). Store-level changes propagate\n // qua `useEditorState` ở EditorPanel level — MiniBoard không owns store\n // subscription nữa (Tier 2 F).\n const selectSubsRef = useRef<Set<(snap: ObjectSnapshot) => void>>(new Set());\n const transformSubsRef = useRef<Set<(info: TransformPopoverInfo) => void>>(new Set());\n const selectionStateSubsRef = useRef<Set<(snap: SelectionStateSnapshot | null) => void>>(new Set());\n\n const { jxgIdToSceneRef } = useJxgSceneIdMap({ store, rendererRef });\n\n const jxgFromSceneId = useCallback(\n (id: string) => jxgFromSceneIdImpl(rendererRef.current, id),\n [],\n );\n const jxgIdToSceneId = useCallback(\n (jxgObj: JxgObj) => jxgIdToSceneIdImpl(rendererRef.current, jxgIdToSceneRef.current, jxgObj),\n [jxgIdToSceneRef],\n );\n\n // ─── Hit-test helpers ──────────────────────────────────────────────────────\n // Mỗi callback wrap pure function ở hitTest.ts, gom refs vào tham số.\n const screenCoordsOf = useCallback(\n (evt: JxgObj) => screenCoordsOfImpl(boardRef.current, containerRef.current, evt),\n [],\n );\n const objectsAt = useCallback(\n (evt: JxgObj) => objectsAtImpl(boardRef.current, containerRef.current, evt, [\n phantomRef.current,\n previewShapeRef.current,\n ...previewSegRef.current,\n ]),\n [],\n );\n const findNearestPointJxg = useCallback(\n (evt: JxgObj, tolPx = 12) =>\n findNearestJxgPoint(boardRef.current, containerRef.current, store.getState(), jxgFromSceneId, evt, tolPx),\n [jxgFromSceneId, store],\n );\n const promoteLabel = useCallback(\n (o: JxgObj) => promoteToLabelOwner(boardRef.current, o),\n [],\n );\n\n // ─── Selection / pending / preview actions ─────────────────────────────────\n const toggleSelect = useCallback((id: string, additive: boolean) => {\n if (!additive) { selectedSetRef.current.clear(); selectedSetRef.current.add(id); }\n else if (selectedSetRef.current.has(id)) selectedSetRef.current.delete(id);\n else selectedSetRef.current.add(id);\n rendererRef.current?.highlight([...selectedSetRef.current]);\n setSelectionTick((t) => t + 1);\n }, []);\n const clearSelection = useCallback(() => {\n selectedSetRef.current.clear();\n rendererRef.current?.highlight(null);\n setSelectionTick((t) => t + 1);\n }, []);\n const deleteSelection = useCallback(() => {\n if (selectedSetRef.current.size === 0) return;\n store.transaction((dispatch) => {\n for (const id of selectedSetRef.current) dispatch({ type: 'DELETE', payload: { id } });\n });\n selectedSetRef.current.clear();\n rendererRef.current?.highlight(null);\n setSelectionTick((t) => t + 1);\n }, [store]);\n\n const clearPreviewSegs = useCallback(\n () => clearPreviewSegsImpl(boardRef.current, previewSegRef),\n [],\n );\n const removePhantom = useCallback(\n () => removePhantomImpl(boardRef.current, { previewShapeRef, phantomRef }),\n [],\n );\n const clearPending = useCallback(() => {\n removePhantom();\n clearPreviewSegs();\n pendingRef.current = [];\n toolSM.clearPending();\n }, [clearPreviewSegs, removePhantom, toolSM]);\n const refreshPreview = useCallback(\n () => refreshPreviewShape(boardRef.current, toolSM, {\n previewSegRef, phantomRef, previewShapeRef, pendingRef,\n }),\n [toolSM],\n );\n\n // ─── Warning flash ─────────────────────────────────────────────────────────\n const [, setWarn] = useState<string | null>(null);\n const warnTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const flashWarn = useCallback((msg: string) => {\n if (warnTimerRef.current) clearTimeout(warnTimerRef.current);\n setWarn(msg);\n warnTimerRef.current = setTimeout(() => setWarn(null), 1800);\n }, []);\n useEffect(() => () => { if (warnTimerRef.current) clearTimeout(warnTimerRef.current); }, []);\n\n const nextLabelFor = useCallback(\n (kind: string): string => sceneNextLabel(store.getState(), kind),\n [store],\n );\n\n // ─── Snapshot + emit helpers ───────────────────────────────────────────────\n const buildSnapshot = useCallback(\n (id: string, anchorScreen: { x: number; y: number }): ObjectSnapshot | null =>\n buildObjectSnapshot(store.getState(), id, anchorScreen),\n [store],\n );\n const emitSelect = useCallback((info: { id: string; anchorScreen: { x: number; y: number } }) => {\n const snap = buildSnapshot(info.id, info.anchorScreen);\n if (!snap) return;\n selectSubsRef.current.forEach((cb) => safeJsx('MiniBoard.emitSelect.cb', () => cb(snap)));\n }, [buildSnapshot]);\n const emitTransform = useCallback((info: TransformPopoverInfo) => {\n transformSubsRef.current.forEach((cb) => safeJsx('MiniBoard.emitTransform.cb', () => cb(info)));\n }, []);\n\n // ─── Handler context (read latest refs at call time) ───────────────────────\n const ctxRef = useRef<HandlerCtx | null>(null);\n ctxRef.current = {\n boardRef,\n toolRef: toolSM.toolRef as { current: GeomTool },\n pendingRef,\n pendingIdsRef: toolSM.pendingIdsRef as { current: string[] },\n previewSegRef,\n axisObjsRef,\n selectedSetRef,\n marqueeRef,\n moveDownRef,\n lastMoveClickRef,\n lastClickClientRef,\n pendingTransformRef,\n phantomRef,\n previewShapeRef,\n previewRafRef,\n jxgRef,\n store,\n jxgIdToSceneId,\n jxgFromSceneId,\n screenCoordsOf,\n objectsAt,\n promoteLabel,\n findNearestPointJxg,\n toggleSelect,\n clearSelection,\n nextLabel: nextLabelFor,\n clearPending,\n clearPreviewSegs,\n refreshPreview,\n flashWarn,\n toast,\n emitTransform: emitTransform as HandlerCtx['emitTransform'],\n emitSelect: emitSelect as HandlerCtx['emitSelect'],\n setPendingCount: () => { /* derived from toolSM */ },\n setSelectionTick: (fn) => setSelectionTick(fn),\n };\n\n useEditorShortcuts({\n store,\n pendingIdsRef: toolSM.pendingIdsRef,\n selectedSetRef,\n clearPending,\n clearSelection,\n deleteSelection,\n });\n useAxisGridSync({ boardRef, axisObjsRef, isDarkRef, showAxis, showGrid });\n\n const handleToolChange = useCallback((t: GeomTool) => {\n clearPending();\n toolSM.setTool(t);\n const b = boardRef.current;\n if (b) safeJsx('MiniBoard.setPanForTool', () => {\n if (b.attr?.pan) b.attr.pan.enabled = (t !== 'select');\n });\n }, [clearPending, toolSM]);\n\n // Tier 2 F — host owns `selectedTool`. Sync prop → internal toolSM khi đổi.\n useEffect(() => {\n if (toolSM.toolRef.current !== selectedTool) handleToolChange(selectedTool);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [selectedTool]);\n\n // ─── Board init (async JSXGraph load) ───────────────────────────────────────\n useEffect(() => {\n if (typeof window === 'undefined' || !containerRef.current) return;\n let cancelled = false;\n let wheelCleanup: (() => void) | null = null;\n let freeBoard: (() => void) | null = null;\n void (async () => {\n const { JXG, board, cleanup } = await initJxgBoard(containerId, {\n label: 'MiniBoard.2d',\n defaults: { disableElementHighlight: true },\n boardOptions: {\n boundingbox: initialView.bbox as [number, number, number, number],\n axis: false, grid: false,\n showCopyright: false, showNavigation: true,\n keepAspectRatio: true,\n pan: { enabled: true, needShift: false },\n zoom: { wheel: false },\n precision: { hasPoint: 8, mouse: 4, touch: 16 },\n },\n extraOptionTweaks: (opts) => {\n // Apply theme label/text stroke color sau common defaults. Selection\n // highlight (đỏ) chủ động qua JxgRenderer.highlight() — đã disable\n // JSXGraph hover-highlight qua defaults.disableElementHighlight.\n if (opts.label) opts.label.strokeColor = themeLabel(isDarkRef.current);\n if (opts.text) opts.text.strokeColor = themeLabel(isDarkRef.current);\n },\n });\n if (cancelled || !containerRef.current) { cleanup(); return; }\n jxgRef.current = JXG;\n boardRef.current = board;\n freeBoard = cleanup;\n\n rendererRef.current = new JxgRenderer(store, board, {\n theme: paletteFor(isDarkRef.current),\n });\n\n // Ctrl/Cmd + wheel zoom (Excalidraw-style).\n if (containerRef.current) {\n wheelCleanup = attachJxgWheelZoom(containerRef.current, board, 'MiniBoard.2d');\n }\n\n if (showAxisRef.current) safeJsx('MiniBoard.initAxes', () => {\n axisObjsRef.current.x = board.create('axis', [[0, 0], [1, 0]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n axisObjsRef.current.y = board.create('axis', [[0, 0], [0, 1]], { strokeColor: themeAxis(isDarkRef.current), name: '', withLabel: false });\n });\n if (showGridRef.current) safeJsx('MiniBoard.initGrid', () =>\n board.create('grid', [], { strokeColor: themeGrid(isDarkRef.current), strokeOpacity: 1 }),\n );\n\n const fire = (h: (ctx: HandlerCtx, e: JxgObj) => void) =>\n (e: JxgObj) => { if (ctxRef.current) h(ctxRef.current, e); };\n board.on('down', fire(handleDown));\n board.on('up', fire(handleUp));\n board.on('move', fire(handleMove));\n\n // Hover cursor: pointer khi di chuột qua bất kỳ object có scene id (loại\n // phantom + preview transient). Apply mọi tool — drag (move), snap target\n // (drawing tools), click-to-select (select). Reset về '' khi rời object.\n board.on('move', (e: JxgObj) => {\n const container = containerRef.current;\n if (!container) return;\n const hits = objectsAtImpl(boardRef.current, container, e, [\n phantomRef.current,\n previewShapeRef.current,\n ...previewSegRef.current,\n ]);\n container.style.cursor = hits.length > 0 ? 'pointer' : '';\n });\n\n onReady?.();\n })();\n return () => {\n cancelled = true;\n if (wheelCleanup) { wheelCleanup(); wheelCleanup = null; }\n if (previewRafRef.current != null) { cancelAnimationFrame(previewRafRef.current); previewRafRef.current = null; }\n rendererRef.current?.dispose();\n rendererRef.current = null;\n if (freeBoard) { freeBoard(); freeBoard = null; }\n boardRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerId]);\n\n // Handle delivery qua ref. Methods đọc trực tiếp từ refs — handle có thể\n // tạo trước khi board boot xong; gọi method trước onReady?.() sẽ trả stale\n // refs. Object literal được build ở `buildHandle.ts` để giảm size file.\n useImperativeHandle(\n ref,\n () => buildMiniBoardHandle({\n containerRef, boardRef, rendererRef,\n selectSubsRef, transformSubsRef, selectionStateSubsRef,\n selectedSetRef, pendingTransformRef, ctxRef,\n store,\n clearPending, clearSelection, deleteSelection,\n emitTransform,\n }),\n \n [store, clearSelection, deleteSelection, clearPending, emitTransform],\n );\n\n return (\n <div\n ref={containerRef}\n id={containerId}\n data-testid=\"jxgmini-container\"\n className=\"h-full min-h-0 bg-white\"\n style={{ touchAction: 'none' }}\n />\n );\n});\n","// 8 màu chính lấy từ Excalidraw DEFAULT_ELEMENT_STROKE_COLOR_PALETTE.\n// Nguồn: @excalidraw/excalidraw — packages/excalidraw/colors.ts (top row chuẩn).\n// Cần đồng bộ tay nếu Excalidraw đổi palette ở major bump.\nexport const STROKE_PALETTE = [\n '#1e1e1e', // black\n '#e03131', // red\n '#e8590c', // orange\n '#f08c00', // yellow\n '#2f9e44', // green\n '#1971c2', // blue\n '#9c36b5', // grape\n '#868e96', // gray\n] as const;\n\nexport type StrokeColor = (typeof STROKE_PALETTE)[number];\n","'use client';\n\nimport { useEffect, useState } from 'react';\n\nconst MOBILE_QUERY = '(max-width: 768px)';\nconst NO_HOVER_QUERY = '(hover: none)';\n\nexport interface MobileState {\n /** Viewport ≤ 768px — dùng để chuyển full-screen modal + drawer. */\n isMobile: boolean;\n /** Device không có hover (touch-only) — dùng để ẩn hover tooltips. */\n isTouchOnly: boolean;\n}\n\nfunction readMatch(query: string): boolean {\n if (typeof window === 'undefined' || !window.matchMedia) return false;\n try {\n return window.matchMedia(query).matches;\n } catch {\n return false;\n }\n}\n\n/**\n * SSR-safe mobile detection qua matchMedia. Trả về `{ isMobile, isTouchOnly }`.\n * Re-render khi viewport resize hoặc input modality đổi (e.g., gắn Bluetooth mouse).\n */\nexport function useIsMobile(): MobileState {\n const [state, setState] = useState<MobileState>(() => ({\n isMobile: readMatch(MOBILE_QUERY),\n isTouchOnly: readMatch(NO_HOVER_QUERY),\n }));\n\n useEffect(() => {\n if (typeof window === 'undefined' || !window.matchMedia) return;\n const mql = window.matchMedia(MOBILE_QUERY);\n const tql = window.matchMedia(NO_HOVER_QUERY);\n const update = () => {\n setState({ isMobile: mql.matches, isTouchOnly: tql.matches });\n };\n update();\n mql.addEventListener('change', update);\n tql.addEventListener('change', update);\n return () => {\n mql.removeEventListener('change', update);\n tql.removeEventListener('change', update);\n };\n }, []);\n\n return state;\n}\n","'use client';\nimport React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { STROKE_PALETTE } from '../../shared/excalidrawPalette';\nimport { useIsMobile } from '../../shared/useIsMobile';\n\nexport type ObjKind = 'point' | 'line' | 'circle';\nexport type PointFace = 'o' | 'circle' | 'cross' | 'plus';\n\nexport interface PropertyPatch {\n attrs?: Record<string, unknown>;\n remove?: boolean;\n /** Bật/tắt value-label động (độ dài segment / bán kính circle). */\n valueLabel?: boolean;\n}\n\ninterface CommonProps {\n anchor: { x: number; y: number };\n onClose: () => void;\n onMutate: (patch: PropertyPatch) => void;\n isDark?: boolean;\n /** Trả về danh sách tên point hiện có (để rename auto-disambiguate). */\n getAllNames?: () => string[];\n}\n\ninterface PointProps extends CommonProps {\n kind: 'point';\n currentName: string;\n currentColor: string;\n currentDash: number;\n currentWidth: number;\n currentFace: PointFace;\n /** Có đang hiện label tên không. */\n currentShowLabel?: boolean;\n}\n\ninterface LineOrCircleProps extends CommonProps {\n kind: 'line' | 'circle';\n currentName: string;\n currentColor: string;\n currentDash: number;\n currentWidth: number;\n /** Có đang hiện label tên không. */\n currentShowLabel?: boolean;\n /** Có đang hiện value-label động không. */\n currentShowValue?: boolean;\n}\n\ntype Props = PointProps | LineOrCircleProps;\n\nconst DASH_OPTIONS: Array<{ value: number; label: string }> = [\n { value: 0, label: 'Nét liền' },\n { value: 2, label: 'Nét đứt' },\n { value: 1, label: 'Nét chấm' },\n];\n\nconst WIDTH_OPTIONS = [1, 2, 3];\n\nconst FACE_OPTIONS: Array<{ value: PointFace; symbol: string }> = [\n { value: 'o', symbol: '●' },\n { value: 'circle', symbol: '◯' },\n { value: 'cross', symbol: '✕' },\n { value: 'plus', symbol: '✚' },\n];\n\n// Unicode subscript digits — dùng để tự đặt tên duy nhất khi user nhập trùng.\n// Lưu dưới dạng ký tự subscript thì JSXGraph SVG <text> render đúng \"B₂\"\n// như label một glyph, không cần MathJax/KaTeX.\nconst SUB_DIGITS = ['₀', '₁', '₂', '₃', '₄', '₅', '₆', '₇', '₈', '₉'];\nconst SUB_SET = new Set(SUB_DIGITS);\n\nfunction toSubscript(n: number): string {\n return String(n).split('').map((d) => SUB_DIGITS[+d] ?? d).join('');\n}\n\nfunction stripTrailingSubscript(s: string): string {\n let i = s.length;\n while (i > 0 && SUB_SET.has(s[i - 1])) i--;\n return s.slice(0, i);\n}\n\nfunction disambiguateName(name: string, existing: Set<string>): string {\n if (!name) return name;\n if (!existing.has(name)) return name;\n const base = stripTrailingSubscript(name) || name;\n for (let n = 2; n < 1000; n++) {\n const candidate = base + toSubscript(n);\n if (!existing.has(candidate)) return candidate;\n }\n return name;\n}\n\ntype Section = 'color' | 'style' | 'size' | 'name' | null;\n\n// Inline icons (small, monochrome) — match the visual weight of Excalidraw's\n// floating action bar in the screenshot. All 16px viewBox 24x24.\nconst Icons = {\n color: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M19 11 L11 3 L3 11 L11 19 Z\" />\n <path d=\"M19 11 L21 16 a2 2 0 1 1 -4 0 Z\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n style: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"5\" fill=\"currentColor\" /></svg>\n ),\n size: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\"><line x1=\"4\" y1=\"9\" x2=\"20\" y2=\"9\" strokeWidth=\"1\" /><line x1=\"4\" y1=\"13\" x2=\"20\" y2=\"13\" strokeWidth=\"2\" /><line x1=\"4\" y1=\"17\" x2=\"20\" y2=\"17\" strokeWidth=\"3.2\" /></svg>\n ),\n name: (\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><text x=\"2\" y=\"17\" fontSize=\"14\" fontFamily=\"serif\" fontWeight=\"700\">A</text><text x=\"12\" y=\"17\" fontSize=\"11\" fontFamily=\"serif\" fontWeight=\"700\">a</text></svg>\n ),\n trash: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"3,6 5,6 21,6\" /><path d=\"M19 6 l-1 14 a 2 2 0 0 1 -2 2 H 8 a 2 2 0 0 1 -2 -2 l-1 -14\" /><line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" /><line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" /></svg>\n ),\n};\n\nexport const PropertiesPopover: React.FC<Props> = (props) => {\n const { anchor, onClose, onMutate, isDark, getAllNames } = props;\n const rootRef = useRef<HTMLDivElement>(null);\n const [section, setSection] = useState<Section>(null);\n const { isMobile } = useIsMobile();\n // Clamp anchor vào viewport sau khi render (measure actual rect).\n // Trên mobile, force bottom-center thay vì follow anchor (anchor có thể nằm\n // sát mép màn hình hoặc dưới ngón tay user → khó tap).\n const [clamped, setClamped] = useState<{ left: number; top: number } | null>(null);\n useLayoutEffect(() => {\n if (typeof window === 'undefined') return;\n const margin = 8;\n if (isMobile) {\n // Bottom-center, 12px above bottom safe area.\n const rect = rootRef.current?.getBoundingClientRect();\n const w = rect?.width ?? 280;\n const left = Math.max(margin, (window.innerWidth - w) / 2);\n const top = window.innerHeight - (rect?.height ?? 80) - margin - 12;\n setClamped({ left, top: Math.max(margin, top) });\n return;\n }\n const rect = rootRef.current?.getBoundingClientRect();\n const w = rect?.width ?? 280;\n const h = rect?.height ?? 80;\n const left = Math.max(margin, Math.min(anchor.x, window.innerWidth - w - margin));\n const top = Math.max(margin, Math.min(anchor.y, window.innerHeight - h - margin));\n setClamped({ left, top });\n }, [anchor.x, anchor.y, isMobile, section]);\n\n const initialName =\n props.kind === 'point' ? props.currentName : (props.kind === 'line' || props.kind === 'circle') ? props.currentName : '';\n const [name, setName] = useState<string>(initialName);\n // Khi popover mở lại trên đối tượng khác, đồng bộ name input.\n useEffect(() => {\n setName(initialName);\n \n }, [initialName]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') { e.preventDefault(); onClose(); }\n };\n // PointerDown covers mouse + touch + pen — replaces legacy mousedown listener\n // which excluded touch/pen and broke click-outside trên mobile.\n const onPointerDown = (e: PointerEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) onClose();\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onPointerDown, { capture: true });\n return () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onPointerDown, { capture: true } as EventListenerOptions);\n };\n }, [onClose]);\n\n const pickColor = (c: string) => {\n onMutate({ attrs: { strokeColor: c, fillColor: props.kind === 'circle' ? 'none' : c, color: c } });\n };\n const pickDash = (d: number) => onMutate({ attrs: { dash: d } });\n const pickWidth = (w: number) => onMutate({ attrs: { strokeWidth: w } });\n const pickFace = (f: PointFace) => onMutate({ attrs: { face: f } });\n\n const currentName = (props.kind === 'point' || props.kind === 'line' || props.kind === 'circle') ? props.currentName : '';\n const commitName = () => {\n const trimmed = name.trim();\n if (trimmed === currentName) return;\n // Cho phép xoá tên (empty); chỉ disambiguate khi user nhập 1 cái gì đó.\n let final = trimmed;\n if (trimmed) {\n const others = new Set((getAllNames?.() ?? []).filter((n) => n !== currentName));\n final = disambiguateName(trimmed, others);\n }\n if (final !== name) setName(final);\n onMutate({ attrs: { name: final } });\n };\n\n const toggleShowLabel = (next: boolean) => onMutate({ attrs: { withLabel: next } });\n const toggleShowValue = (next: boolean) => onMutate({ valueLabel: next });\n\n const doDelete = () => { onMutate({ remove: true }); onClose(); };\n\n const toggleSection = (s: Section) => setSection((cur) => (cur === s ? null : s));\n\n const currentColor = props.currentColor;\n const currentDash = props.currentDash;\n const currentWidth = props.currentWidth;\n\n // Hooks must be called unconditionally — before any early return\n const colorIndicatorTint = useMemo(() => currentColor, [currentColor]);\n\n if (typeof document === 'undefined') return null;\n\n // Pill toolbar: row of icon buttons, separator before trash. Click một icon\n // để bung panel chi tiết bên dưới. Trash xoá ngay (không có panel).\n const PillBtn = ({ id, label, icon, active, onClick, indicatorColor }: {\n id: string; label: string; icon: React.ReactNode; active?: boolean;\n onClick: () => void; indicatorColor?: string;\n }) => (\n <button\n type=\"button\"\n data-section={id}\n data-pill-btn={id}\n aria-label={label}\n aria-pressed={!!active}\n onClick={onClick}\n className={`relative flex h-8 w-8 items-center justify-center rounded-md transition ${\n active ? 'bg-slate-200 text-slate-900' : 'text-slate-700 hover:bg-slate-100'\n }`}\n >\n {icon}\n {indicatorColor && (\n <span\n aria-hidden\n className=\"absolute bottom-0.5 left-1/2 -translate-x-1/2 h-1 w-4 rounded-full\"\n style={{ background: indicatorColor }}\n />\n )}\n </button>\n );\n\n const pos = clamped ?? { left: anchor.x, top: anchor.y };\n const node = (\n <div\n ref={rootRef}\n data-stamp-area=\"true\"\n className={`${isDark ? 'theme--dark ' : ''}fixed z-[2147483600] flex flex-col gap-1.5`}\n style={{ left: pos.left, top: pos.top }}\n role=\"dialog\"\n aria-label=\"Thuộc tính đối tượng\"\n >\n {/* Pill toolbar */}\n <div className=\"flex items-center gap-1 rounded-full border border-slate-300 bg-white px-1.5 py-1 shadow-lg ring-1 ring-black/5\">\n <PillBtn id=\"color\" label=\"Màu\" icon={Icons.color} active={section === 'color'} onClick={() => toggleSection('color')} indicatorColor={colorIndicatorTint} />\n <PillBtn id=\"style\" label=\"Kiểu\" icon={Icons.style} active={section === 'style'} onClick={() => toggleSection('style')} />\n <PillBtn id=\"size\" label=\"Độ dày\" icon={Icons.size} active={section === 'size'} onClick={() => toggleSection('size')} />\n <PillBtn id=\"name\" label=\"Tên\" icon={Icons.name} active={section === 'name'} onClick={() => toggleSection('name')} />\n <span aria-hidden className=\"mx-0.5 h-5 w-px bg-slate-200\" />\n <PillBtn id=\"delete\" label=\"Xoá\" icon={Icons.trash} onClick={doDelete} />\n </div>\n\n {/* Sub-panel — chỉ hiện khi user chọn 1 icon */}\n {section && (\n <div className=\"w-[220px] rounded-lg border border-slate-300 bg-white p-3 shadow-2xl ring-1 ring-black/5\">\n {section === 'color' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Màu</span>\n <div className=\"flex flex-wrap gap-1\">\n {STROKE_PALETTE.map((c) => (\n <button\n key={c}\n aria-label={`Màu ${c}`}\n onClick={() => pickColor(c)}\n className={`h-6 w-6 rounded border ${currentColor === c ? 'border-emerald-500 ring-2 ring-emerald-300' : 'border-slate-200'}`}\n style={{ background: c }}\n />\n ))}\n </div>\n </div>\n )}\n\n {section === 'style' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Kiểu</span>\n {props.kind === 'point' ? (\n <div className=\"flex gap-1\">\n {FACE_OPTIONS.map((f) => (\n <button\n key={f.value}\n aria-label={`Hình ${f.value}`}\n onClick={() => pickFace(f.value)}\n className={`h-7 w-7 rounded border text-sm ${(props as PointProps).currentFace === f.value ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n {f.symbol}\n </button>\n ))}\n </div>\n ) : (\n <div className=\"flex gap-1\">\n {DASH_OPTIONS.map((d) => (\n <button\n key={d.value}\n aria-label={`Kiểu ${d.label.toLowerCase()}`}\n onClick={() => pickDash(d.value)}\n className={`flex-1 rounded border px-1 py-1 text-[11px] ${currentDash === d.value ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n {d.label}\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {section === 'size' && (\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Độ dày</span>\n <div className=\"flex gap-1\">\n {WIDTH_OPTIONS.map((w) => (\n <button\n key={w}\n aria-label={`Độ dày ${w}`}\n onClick={() => pickWidth(w)}\n className={`flex-1 rounded border py-1 ${currentWidth === w ? 'border-emerald-500 bg-emerald-50' : 'border-slate-300 bg-white'}`}\n >\n <span className=\"inline-block rounded bg-slate-800\" style={{ width: 30, height: w }} />\n </button>\n ))}\n </div>\n </div>\n )}\n\n {section === 'name' && (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Tên</span>\n <input\n value={name}\n onChange={(e) => setName(e.target.value)}\n onBlur={commitName}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); commitName(); } }}\n autoFocus\n placeholder={props.kind === 'point' ? 'A, B, …' : props.kind === 'line' ? 'a, b, f, …' : 'O, c, …'}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-sm text-slate-800\"\n />\n <span className=\"text-[10px] text-slate-400\">Trùng tên sẽ tự thêm chỉ số (B → B₂)</span>\n </div>\n\n <label className=\"flex items-center justify-between gap-2 text-[12px] text-slate-700\">\n <span>Hiển thị tên</span>\n <input\n type=\"checkbox\"\n checked={props.currentShowLabel !== false}\n onChange={(e) => toggleShowLabel(e.target.checked)}\n aria-label=\"Hiển thị tên\"\n />\n </label>\n\n {(props.kind === 'line' || props.kind === 'circle') && (\n <label className=\"flex items-center justify-between gap-2 text-[12px] text-slate-700\">\n <span>Hiển thị giá trị</span>\n <input\n type=\"checkbox\"\n checked={!!(props as LineOrCircleProps).currentShowValue}\n onChange={(e) => toggleShowValue(e.target.checked)}\n aria-label=\"Hiển thị giá trị\"\n />\n </label>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n\n return createPortal(node, document.body);\n};\n","'use client';\n/**\n * MultiPropertiesPopover — popover compact cho multi-select (≥2 đối tượng).\n *\n * Khác với PropertiesPopover (single-select): chỉ phơi ra các action chung\n * cho mọi kind — đổi màu + xóa. Các trường kind-specific (face, dash, name,\n * showValue) bị ẩn vì không có ngữ nghĩa nhất quán trên selection nhiều kind\n * khác nhau.\n *\n * EditorPanel gọi `onColor(c)` cho mỗi id selected; `onDelete()` xóa tất cả.\n */\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { STROKE_PALETTE } from '../../shared/excalidrawPalette';\nimport { useIsMobile } from '../../shared/useIsMobile';\n\ntype Section = 'color' | null;\n\nconst Icons = {\n color: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M19 11 L11 3 L3 11 L11 19 Z\" />\n <path d=\"M19 11 L21 16 a2 2 0 1 1 -4 0 Z\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n ),\n trash: (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"3,6 5,6 21,6\" />\n <path d=\"M19 6 l-1 14 a 2 2 0 0 1 -2 2 H 8 a 2 2 0 0 1 -2 -2 l-1 -14\" />\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" />\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" />\n </svg>\n ),\n};\n\nexport interface MultiPropertiesPopoverProps {\n anchor: { x: number; y: number };\n count: number;\n isDark?: boolean;\n onColor: (color: string) => void;\n onDelete: () => void;\n onClose: () => void;\n}\n\nexport const MultiPropertiesPopover: React.FC<MultiPropertiesPopoverProps> = (props) => {\n const { anchor, count, isDark, onColor, onDelete, onClose } = props;\n const rootRef = useRef<HTMLDivElement>(null);\n const [section, setSection] = useState<Section>(null);\n const { isMobile } = useIsMobile();\n const [clamped, setClamped] = useState<{ left: number; top: number } | null>(null);\n\n useLayoutEffect(() => {\n if (typeof window === 'undefined') return;\n const margin = 8;\n if (isMobile) {\n const rect = rootRef.current?.getBoundingClientRect();\n const w = rect?.width ?? 220;\n const left = Math.max(margin, (window.innerWidth - w) / 2);\n const top = window.innerHeight - (rect?.height ?? 80) - margin - 12;\n setClamped({ left, top: Math.max(margin, top) });\n return;\n }\n const rect = rootRef.current?.getBoundingClientRect();\n const w = rect?.width ?? 220;\n const h = rect?.height ?? 80;\n const left = Math.max(margin, Math.min(anchor.x, window.innerWidth - w - margin));\n const top = Math.max(margin, Math.min(anchor.y, window.innerHeight - h - margin));\n setClamped({ left, top });\n }, [anchor.x, anchor.y, isMobile, section]);\n\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') { e.preventDefault(); onClose(); }\n };\n const onPointerDown = (e: PointerEvent) => {\n if (!rootRef.current?.contains(e.target as Node)) onClose();\n };\n document.addEventListener('keydown', onKey);\n document.addEventListener('pointerdown', onPointerDown, { capture: true });\n return () => {\n document.removeEventListener('keydown', onKey);\n document.removeEventListener('pointerdown', onPointerDown, { capture: true } as EventListenerOptions);\n };\n }, [onClose]);\n\n const toggleSection = (s: Section) => setSection((cur) => (cur === s ? null : s));\n const doDelete = () => { onDelete(); onClose(); };\n\n if (typeof document === 'undefined') return null;\n\n const PillBtn = ({ id, label, icon, active, onClick }: {\n id: string; label: string; icon: React.ReactNode; active?: boolean; onClick: () => void;\n }) => (\n <button\n type=\"button\"\n data-section={id}\n data-pill-btn={id}\n aria-label={label}\n aria-pressed={!!active}\n onClick={onClick}\n className={`relative flex h-8 w-8 items-center justify-center rounded-md transition ${\n active ? 'bg-slate-200 text-slate-900' : 'text-slate-700 hover:bg-slate-100'\n }`}\n >\n {icon}\n </button>\n );\n\n const pos = clamped ?? { left: anchor.x, top: anchor.y };\n const node = (\n <div\n ref={rootRef}\n data-stamp-area=\"true\"\n data-testid=\"multi-properties-popover\"\n className={`${isDark ? 'theme--dark ' : ''}fixed z-[2147483600] flex flex-col gap-1.5`}\n style={{ left: pos.left, top: pos.top }}\n role=\"dialog\"\n aria-label={`Thuộc tính (${count} đối tượng)`}\n >\n <div className=\"flex items-center gap-1 rounded-full border border-slate-300 bg-white px-1.5 py-1 shadow-lg ring-1 ring-black/5\">\n <span className=\"px-1 text-[11px] font-medium text-slate-500\">{count} đã chọn</span>\n <span aria-hidden className=\"mx-0.5 h-5 w-px bg-slate-200\" />\n <PillBtn id=\"color\" label=\"Đổi màu\" icon={Icons.color} active={section === 'color'} onClick={() => toggleSection('color')} />\n <span aria-hidden className=\"mx-0.5 h-5 w-px bg-slate-200\" />\n <PillBtn id=\"delete\" label=\"Xoá tất cả\" icon={Icons.trash} onClick={doDelete} />\n </div>\n\n {section === 'color' && (\n <div className=\"w-[220px] rounded-lg border border-slate-300 bg-white p-3 shadow-2xl ring-1 ring-black/5\">\n <div className=\"flex flex-col gap-1\">\n <span className=\"text-[11px] font-medium text-slate-500\">Màu (áp cho {count} đối tượng)</span>\n <div className=\"flex flex-wrap gap-1\">\n {STROKE_PALETTE.map((c) => (\n <button\n key={c}\n aria-label={`Màu ${c}`}\n onClick={() => onColor(c)}\n className=\"h-6 w-6 rounded border border-slate-200\"\n style={{ background: c }}\n />\n ))}\n </div>\n </div>\n </div>\n )}\n </div>\n );\n\n return createPortal(node, document.body);\n};\n","'use client';\nimport React, { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport type ParamKind = 'rotate' | 'dilate' | 'regularPolygon';\n\ninterface Props {\n kind: ParamKind;\n anchor: { x: number; y: number };\n defaultValue: number;\n onConfirm: (value: number) => void;\n onCancel: () => void;\n isDark?: boolean;\n}\n\nconst LABELS: Record<ParamKind, { aria: string; label: string; step: number; min?: number }> = {\n rotate: { aria: 'Góc quay', label: 'Góc (°)', step: 15 },\n dilate: { aria: 'Tỷ số k', label: 'Tỷ số k', step: 0.5 },\n regularPolygon: { aria: 'Số cạnh đa giác đều', label: 'Số cạnh (n ≥ 3)', step: 1, min: 3 },\n};\n\nexport const TransformParamPopover: React.FC<Props> = ({ kind, anchor, defaultValue, onConfirm, onCancel, isDark }) => {\n const [value, setValue] = useState<number>(defaultValue);\n const inputRef = useRef<HTMLInputElement>(null);\n const meta = LABELS[kind];\n\n useEffect(() => { inputRef.current?.focus(); inputRef.current?.select(); }, []);\n\n const submit = () => {\n let v = Number.isFinite(value) ? value : defaultValue;\n if (kind === 'regularPolygon') {\n v = Math.max(3, Math.round(v));\n }\n onConfirm(v);\n };\n\n if (typeof document === 'undefined') return null;\n\n const node = (\n <div\n data-stamp-area=\"true\"\n className={`${isDark ? 'theme--dark ' : ''}fixed z-[2147483600] flex flex-col gap-2 rounded-lg border border-slate-300 bg-white p-3 shadow-2xl ring-1 ring-black/5`}\n style={{ left: anchor.x, top: anchor.y, minWidth: 180 }}\n role=\"dialog\"\n aria-label={meta.aria}\n >\n <label className=\"text-xs font-medium text-slate-700\">{meta.label}</label>\n <input\n ref={inputRef}\n type=\"number\"\n value={value}\n step={meta.step}\n min={meta.min}\n onChange={(e) => setValue(parseFloat(e.target.value))}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); submit(); }\n else if (e.key === 'Escape') { e.preventDefault(); onCancel(); }\n }}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-sm text-slate-800\"\n />\n <div className=\"flex justify-end gap-2\">\n <button\n onClick={onCancel}\n className=\"rounded border border-slate-300 bg-white px-2 py-1 text-xs text-slate-700 hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={submit}\n className=\"rounded bg-emerald-600 px-2 py-1 text-xs font-medium text-white hover:bg-emerald-700\"\n >\n Áp dụng\n </button>\n </div>\n </div>\n );\n\n return createPortal(node, document.body);\n};\n","// src/stamps/shared/StampLeftPanel/constants.ts\n//\n// Desktop popover sizing chia sẻ giữa 3 stamp editor (geometry-2d, geometry-3d,\n// graph-2d). Trước đây mỗi EditorPanel hardcode size riêng (640×540 cho 2D/graph,\n// 800×600 cho 3D) → kích thước canvas nhỏ + không nhất quán. Gom vào constant\n// 880×700 + cap responsive để dùng được trên màn nhỏ.\n\n/** Tailwind class string áp cho outer popover của stamp editor (desktop). */\nexport const STAMP_PANEL_DESKTOP =\n 'h-[700px] w-[880px] max-h-[85vh] max-w-[calc(100vw-280px)]';\n","import React, {\n createContext,\n useCallback,\n useEffect,\n useMemo,\n useReducer,\n useRef,\n} from 'react';\nimport type { ShowToastFn, DismissToastFn, ToastItem, ToastOptions } from './types';\n\nexport interface ToastContextValue {\n items: ToastItem[];\n showToast: ShowToastFn;\n dismiss: DismissToastFn;\n}\n\nexport const ToastContext = createContext<ToastContextValue | null>(null);\n\ntype Action =\n | { type: 'PUSH'; item: ToastItem; maxVisible: number }\n | { type: 'REPLACE'; item: ToastItem }\n | { type: 'DISMISS'; id: string };\n\nfunction reducer(state: ToastItem[], action: Action): ToastItem[] {\n switch (action.type) {\n case 'PUSH': {\n const next = [...state, action.item];\n return next.length > action.maxVisible ? next.slice(next.length - action.maxVisible) : next;\n }\n case 'REPLACE':\n return state.map((it) => (it.id === action.item.id ? action.item : it));\n case 'DISMISS':\n return state.filter((it) => it.id !== action.id);\n }\n}\n\ninterface ToastProviderProps {\n children: React.ReactNode;\n /** Max simultaneously visible toasts. Default: 3. Pushing more drops oldest. */\n maxVisible?: number;\n}\n\nlet autoIdCounter = 0;\n\nexport function ToastProvider({ children, maxVisible = 3 }: ToastProviderProps) {\n const [items, dispatch] = useReducer(reducer, [] as ToastItem[]);\n const timersRef = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map());\n const itemsRef = useRef(items);\n itemsRef.current = items;\n\n const clearTimer = useCallback((id: string) => {\n const t = timersRef.current.get(id);\n if (t) {\n clearTimeout(t);\n timersRef.current.delete(id);\n }\n }, []);\n\n const dismiss = useCallback<DismissToastFn>((id) => {\n clearTimer(id);\n dispatch({ type: 'DISMISS', id });\n }, [clearTimer]);\n\n const scheduleAutoDismiss = useCallback((id: string, duration: number) => {\n if (duration <= 0) return;\n const t = setTimeout(() => dismiss(id), duration);\n timersRef.current.set(id, t);\n }, [dismiss]);\n\n const showToast = useCallback<ShowToastFn>((message, opts: ToastOptions = {}) => {\n const variant = opts.variant ?? 'info';\n const duration = opts.duration ?? 3000;\n const id = opts.id ?? `toast-${++autoIdCounter}`;\n const item: ToastItem = { id, message, variant, duration };\n const existing = itemsRef.current.find((it) => it.id === id);\n if (existing) {\n clearTimer(id);\n dispatch({ type: 'REPLACE', item });\n } else {\n dispatch({ type: 'PUSH', item, maxVisible });\n }\n scheduleAutoDismiss(id, duration);\n }, [clearTimer, maxVisible, scheduleAutoDismiss]);\n\n useEffect(() => () => {\n timersRef.current.forEach((t) => clearTimeout(t));\n timersRef.current.clear();\n }, []);\n\n const value = useMemo(() => ({ items, showToast, dismiss }), [items, showToast, dismiss]);\n return <ToastContext.Provider value={value}>{children}</ToastContext.Provider>;\n}\n","import React from 'react';\nimport type { ToastVariant } from './types';\n\nconst VARIANT_CLASS: Record<ToastVariant, string> = {\n info: 'border-l-sky-500',\n warning: 'border-l-amber-500',\n error: 'border-l-rose-500',\n};\n\nconst VARIANT_ICON: Record<ToastVariant, React.ReactNode> = {\n info: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n ),\n warning: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n ),\n error: (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n ),\n};\n\ninterface ToastProps {\n id: string;\n message: string;\n variant: ToastVariant;\n onDismiss: (id: string) => void;\n}\n\nexport function Toast({ id, message, variant, onDismiss }: ToastProps) {\n return (\n <div\n role=\"status\"\n className={[\n 'pointer-events-auto flex max-w-sm items-start gap-2 rounded-lg border-l-4 bg-white px-3 py-2 text-sm text-slate-800 shadow-md ring-1 ring-black/5',\n VARIANT_CLASS[variant],\n ].join(' ')}\n >\n <span className=\"mt-0.5 shrink-0 text-slate-500\">{VARIANT_ICON[variant]}</span>\n <span className=\"flex-1 leading-snug\">{message}</span>\n <button\n type=\"button\"\n aria-label=\"Đóng thông báo\"\n onClick={() => onDismiss(id)}\n className=\"-mr-1 ml-1 inline-flex h-5 w-5 shrink-0 items-center justify-center rounded text-slate-400 hover:bg-slate-100 hover:text-slate-700\"\n >\n ×\n </button>\n </div>\n );\n}\n","import { useContext } from 'react';\nimport { ToastContext } from './ToastProvider';\n\nexport function useToast() {\n const ctx = useContext(ToastContext);\n if (!ctx) {\n throw new Error('useToast must be used inside <ToastProvider>');\n }\n return ctx;\n}\n","import React from 'react';\nimport { Toast } from './Toast';\nimport { useToast } from './useToast';\n\n/**\n * Renders the active toast queue. Mount once near the root of each stamp\n * EditorPanel (inside ToastProvider). Positions itself absolutely at\n * bottom-center of the nearest positioned ancestor.\n */\nexport function ToastHost() {\n const { items, dismiss } = useToast();\n if (items.length === 0) return null;\n return (\n <div\n aria-live=\"polite\"\n className=\"pointer-events-none absolute inset-x-0 bottom-3 z-50 flex flex-col items-center gap-2\"\n >\n {items.map((it) => (\n <Toast key={it.id} id={it.id} message={it.message} variant={it.variant} onDismiss={dismiss} />\n ))}\n </div>\n );\n}\n","export { ToastProvider } from './ToastProvider';\nexport { ToastHost } from './ToastHost';\nexport { Toast } from './Toast';\nexport { useToast } from './useToast';\nexport type {\n ToastVariant,\n ToastOptions,\n ToastItem,\n ShowToastFn,\n DismissToastFn,\n} from './types';\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { State } from '../../../core/scene';\nimport type { GenerateGeometryFigure } from '../../shared/types';\n\nexport interface UseAiFigureResult {\n prompt: string;\n setPrompt: (value: string) => void;\n isLoading: boolean;\n error: string | null;\n submit: () => Promise<State | null>;\n}\n\nexport function useAiFigure(generator?: GenerateGeometryFigure): UseAiFigureResult {\n const [prompt, setPrompt] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const requestIdRef = useRef(0);\n\n useEffect(() => () => abortRef.current?.abort(), []);\n\n const submit = useCallback(async (): Promise<State | null> => {\n const problem = prompt.trim();\n if (!problem) {\n setError('Nhập đề bài cần dựng hình.');\n return null;\n }\n if (!generator) {\n setError('Tính năng dựng hình AI chưa được cấu hình.');\n return null;\n }\n\n abortRef.current?.abort();\n const controller = new AbortController();\n const requestId = ++requestIdRef.current;\n abortRef.current = controller;\n setIsLoading(true);\n setError(null);\n\n try {\n const generated = await generator(problem, { signal: controller.signal });\n if (controller.signal.aborted || requestId !== requestIdRef.current) return null;\n if (!generated.ok) {\n setError(generated.message);\n return null;\n }\n return generated.state;\n } catch (caught) {\n if (controller.signal.aborted || (caught instanceof DOMException && caught.name === 'AbortError')) {\n return null;\n }\n if (requestId === requestIdRef.current) {\n setError(caught instanceof Error && caught.message\n ? caught.message\n : 'Không thể dựng hình bằng AI.');\n }\n return null;\n } finally {\n if (requestId === requestIdRef.current) {\n abortRef.current = null;\n setIsLoading(false);\n }\n }\n }, [generator, prompt]);\n\n return { prompt, setPrompt, isLoading, error, submit };\n}\n","'use client';\n\nimport React, { useCallback } from 'react';\nimport type { State } from '../../../core/scene';\nimport type { GenerateGeometryFigure } from '../../shared/types';\nimport { useAiFigure } from './useAiFigure';\n\ninterface Props {\n generator: GenerateGeometryFigure;\n onGenerated: (state: State) => void;\n}\n\nexport function AiFigurePrompt({ generator, onGenerated }: Props) {\n const {\n prompt,\n setPrompt,\n isLoading,\n error,\n submit,\n } = useAiFigure(generator);\n\n const handleSubmit = useCallback(async (event: React.FormEvent<HTMLFormElement>) => {\n event.preventDefault();\n const generated = await submit();\n if (generated) onGenerated(generated);\n }, [onGenerated, submit]);\n\n return (\n <form\n data-testid=\"geometry-ai-form\"\n onSubmit={(event) => { void handleSubmit(event); }}\n className=\"border-b border-slate-200 bg-slate-50 px-3 py-2\"\n >\n <label htmlFor=\"geometry-ai-prompt\" className=\"mb-1 block text-xs font-medium text-slate-600\">\n Dựng hình bằng AI\n </label>\n <div className=\"flex items-start gap-2\">\n <textarea\n id=\"geometry-ai-prompt\"\n aria-label=\"Đề bài cho AI\"\n value={prompt}\n onChange={(event) => setPrompt(event.target.value)}\n disabled={isLoading}\n rows={2}\n placeholder=\"Ví dụ: Cho tam giác ABC, dựng đường cao AH.\"\n className=\"min-h-12 flex-1 resize-none rounded border border-slate-300 bg-white px-2 py-1.5 text-xs text-slate-800 outline-none focus:border-emerald-500 disabled:opacity-60\"\n />\n <button\n type=\"submit\"\n disabled={isLoading || !prompt.trim()}\n className=\"rounded bg-emerald-600 px-3 py-2 text-xs font-medium text-white transition hover:bg-emerald-700 disabled:opacity-50\"\n >\n {isLoading ? 'Đang dựng...' : 'Dựng bằng AI'}\n </button>\n </div>\n {error && (\n <p role=\"alert\" className=\"mt-1 text-xs text-red-600\">{error}</p>\n )}\n </form>\n );\n}\n","'use client';\nimport React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';\nimport { MiniBoard2D, type MiniBoardHandle, type GeomTool, type ObjectSnapshot, type SelectionStateSnapshot, type TransformPopoverInfo } from './MiniBoard';\nimport { serializeBoard } from '../serialize';\nimport { renderGeometrySvgFromState } from '../render';\nimport { PropertiesPopover } from './PropertiesPopover';\nimport { MultiPropertiesPopover } from './MultiPropertiesPopover';\nimport { TransformParamPopover } from './TransformParamPopover';\nimport { buildObjectSnapshot } from './snapshot';\nimport { UndoIcon, RedoIcon } from './icons';\nimport { useEditorState, type State, type Store } from '../../../core/scene';\nimport { STAMP_PANEL_DESKTOP } from '../../shared/StampLeftPanel/constants';\nimport { ToastProvider, ToastHost, useToast } from '../../shared/Toast';\nimport type { GenerateGeometryFigure } from '../../shared/types';\nimport { AiFigurePrompt } from './AiFigurePrompt';\n\ninterface Props {\n /** Scene store do Host tạo qua `useStampStore`. View info đã ở store.meta.view. */\n store: Store;\n onInsert: (jsonState: string, svgString: string) => void;\n onClose: () => void;\n /** Khi true, panel position offset left để chừa chỗ cho StampLeftPanel (240px). */\n withLeftPanel?: boolean;\n /** Controlled prop — host owns (Tier 2 F). */\n selectedTool: GeomTool;\n /** Controlled prop — host owns (Tier 2 F). */\n showAxis: boolean;\n /** Controlled prop — host owns (Tier 2 F). */\n showGrid: boolean;\n /** Notify host về canUndo/canRedo qua store subscribe (Tier 2 F). */\n onHistoryChange?: (canUndo: boolean, canRedo: boolean) => void;\n isDark?: boolean;\n /** Mobile mode: full-screen + hamburger header. */\n isMobile?: boolean;\n /** Click hamburger trên mobile để mở LeftPanel drawer. */\n onOpenDrawer?: () => void;\n /** Mobile header: undo/redo. Bypass LeftPanel để user truy cập nhanh. */\n onUndo?: () => void;\n onRedo?: () => void;\n canUndo?: boolean;\n canRedo?: boolean;\n /** Báo lên Host khi selection đổi qua action trong editor. */\n onSelectionChange?: (id: string | undefined) => void;\n /** Client-safe bridge to a server-side AI generation call. */\n generateGeometryFigure?: GenerateGeometryFigure;\n}\n\nexport interface GeometryEditorPanelHandle {\n /** Trigger Chèn programmatically (cho auto-insert khi click outside). */\n insert: () => boolean;\n /** Có nội dung để chèn không? */\n hasContent: () => boolean;\n /** Highlight object theo id từ bên ngoài (ObjectListPanel trong Host). */\n selectObject: (id: string | null) => void;\n}\n\nconst GeometryEditorPanelInner = forwardRef<GeometryEditorPanelHandle, Props>(\n function GeometryEditorPanelInner(\n {\n store,\n onInsert,\n onClose,\n withLeftPanel = false,\n selectedTool,\n showAxis,\n showGrid,\n onHistoryChange,\n isDark,\n isMobile = false,\n onOpenDrawer,\n onUndo,\n onRedo,\n canUndo,\n canRedo,\n onSelectionChange,\n generateGeometryFigure,\n },\n ref,\n ) {\n const { showToast } = useToast();\n const handleRef = useRef<MiniBoardHandle | null>(null);\n const [ready, setReady] = useState(false);\n const [hasContent, setHasContent] = useState(false);\n const [propsPopover, setPropsPopover] = useState<ObjectSnapshot | null>(null);\n /** Multi-select snapshot — render compact popover khi ids.length > 1. */\n const [multiSelection, setMultiSelection] = useState<SelectionStateSnapshot | null>(null);\n // Handlers emit cả 6 transform tool (rotate/dilate/regularPolygon/translate/\n // reflectLine/reflectPoint); TransformParamPopover chỉ render 3 tool có\n // numeric param — guard ở chỗ render.\n const [transformPopover, setTransformPopover] = useState<TransformPopoverInfo>(null);\n const onSelectionChangeRef = useRef(onSelectionChange);\n useEffect(() => { onSelectionChangeRef.current = onSelectionChange; }, [onSelectionChange]);\n\n // Tier 2 F — propagate canUndo/canRedo + keyboard shortcuts qua shared hook.\n useEditorState({ store, onHistoryChange });\n\n // hasContent: track store size để gate Insert button.\n useEffect(() => {\n const sync = () => setHasContent(Object.keys(store.getState().objects).length > 0);\n sync();\n return store.subscribe(sync);\n }, [store]);\n\n const handleReady = useCallback(() => {\n const h = handleRef.current;\n if (!h) return;\n setReady(true);\n h.onSelect((snap: ObjectSnapshot) => {\n setPropsPopover(snap);\n setMultiSelection(null);\n onSelectionChangeRef.current?.(snap.id);\n });\n h.onTransformParam((info) => setTransformPopover(info));\n // selection-state channel: fire mỗi khi selectedSetRef đổi (click,\n // shift-click, marquee, clearSelection). Derive popover từ size:\n // 0 → ẩn cả 2 popover\n // 1 → single PropertiesPopover (derive ObjectSnapshot từ store)\n // ≥2 → MultiPropertiesPopover (compact: color + delete)\n h.onSelectionState((snap) => {\n if (!snap || snap.ids.length === 0) {\n setPropsPopover(null);\n setMultiSelection(null);\n onSelectionChangeRef.current?.(undefined);\n return;\n }\n if (snap.ids.length === 1) {\n const id = snap.ids[0];\n const single = buildObjectSnapshot(store.getState(), id, snap.anchor);\n if (single) {\n setPropsPopover(single);\n setMultiSelection(null);\n onSelectionChangeRef.current?.(id);\n }\n return;\n }\n setMultiSelection(snap);\n setPropsPopover(null);\n onSelectionChangeRef.current?.(undefined);\n });\n }, [store]);\n\n const dismissPropsPopover = useCallback(() => {\n setPropsPopover(null);\n onSelectionChangeRef.current?.(undefined);\n }, []);\n\n const dismissMultiPopover = useCallback(() => {\n setMultiSelection(null);\n handleRef.current?.clearSelection();\n onSelectionChangeRef.current?.(undefined);\n }, []);\n\n const applyMultiColor = useCallback((color: string) => {\n const ids = multiSelection?.ids ?? [];\n const h = handleRef.current;\n if (!h) return;\n for (const id of ids) {\n h.mutateObject(id, { attrs: { strokeColor: color, color } });\n }\n }, [multiSelection]);\n\n const applyMultiDelete = useCallback(() => {\n const ids = multiSelection?.ids ?? [];\n const h = handleRef.current;\n if (!h) return;\n for (const id of ids) {\n h.mutateObject(id, { remove: true });\n }\n h.clearSelection();\n setMultiSelection(null);\n onSelectionChangeRef.current?.(undefined);\n }, [multiSelection]);\n\n // Build serialized state (format v2) — async vì SVG render offscreen\n // với light palette để Excalidraw filter tự đảo khi dark mode.\n const performInsert = useCallback((): boolean => {\n if (!handleRef.current) return false;\n const h = handleRef.current;\n const state = h.getState();\n if (Object.keys(state.objects).length === 0) return false;\n const bbox = h.getBbox();\n const jsonState = serializeBoard(state, { bbox, showAxis, showGrid });\n // Fire-and-forget. Caller (`tryInsert`) chỉ cần biết có nội dung không.\n void (async () => {\n try {\n const svgString = await renderGeometrySvgFromState(jsonState);\n onInsert(jsonState, svgString);\n } catch (err) {\n console.error('Geometry insert failed:', err);\n }\n })();\n return true;\n }, [onInsert, showAxis, showGrid]);\n\n const handleInsert = useCallback(() => {\n performInsert();\n }, [performInsert]);\n\n const loadAiFigure = useCallback((generated: State) => {\n handleRef.current?.clearSelection();\n setPropsPopover(null);\n setMultiSelection(null);\n setTransformPopover(null);\n onSelectionChangeRef.current?.(undefined);\n const current = store.getState();\n store.dispatch({\n type: 'LOAD',\n payload: { state: { ...generated, meta: current.meta } },\n });\n }, [store]);\n\n useImperativeHandle(ref, () => ({\n insert: performInsert,\n hasContent: () => Object.keys(handleRef.current?.getState().objects ?? {}).length > 0,\n selectObject: (id) => handleRef.current?.highlight(id),\n }), [performInsert]);\n\n const wrapperStyle: React.CSSProperties = isMobile\n ? { position: 'fixed', inset: 0, zIndex: 40 }\n : {\n position: 'absolute',\n top: '50%',\n left: withLeftPanel ? 'calc(50% + 120px)' : '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 40,\n };\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Dựng hình học\"\n data-testid=\"geometry-editor-panel\"\n data-stamp-area=\"true\"\n data-mobile-editor={isMobile ? 'true' : undefined}\n style={wrapperStyle}\n className={[\n isDark ? 'theme--dark ' : '',\n 'relative flex flex-col overflow-hidden bg-white',\n isMobile\n ? 'h-full w-full'\n : `${STAMP_PANEL_DESKTOP} rounded-lg border border-slate-300 shadow-2xl ring-1 ring-black/5`,\n ].join(' ')}\n >\n <header className=\"flex items-center gap-2 border-b border-slate-200 bg-gradient-to-r from-emerald-600 to-teal-600 px-3 py-2 text-white\">\n {isMobile && (\n <button\n type=\"button\"\n onClick={onOpenDrawer}\n aria-label=\"Mở ngăn công cụ\"\n className=\"-ml-1 inline-flex h-10 w-10 items-center justify-center rounded transition hover:bg-white/15\"\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\" />\n </svg>\n </button>\n )}\n <h3 className=\"flex flex-1 items-center gap-2 text-sm font-semibold\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polygon points=\"3,18 12,3 21,18\" />\n <circle cx=\"12\" cy=\"3\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"3\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n <circle cx=\"21\" cy=\"18\" r=\"1.5\" fill=\"currentColor\" />\n </svg>\n Dựng hình học\n </h3>\n {isMobile && (\n <>\n <button\n type=\"button\"\n onClick={onUndo}\n disabled={!canUndo}\n aria-label=\"Hoàn tác\"\n title=\"Hoàn tác (Ctrl/Cmd+Z)\"\n data-testid=\"undo-btn-mobile\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15 disabled:opacity-40\"\n >\n <UndoIcon />\n </button>\n <button\n type=\"button\"\n onClick={onRedo}\n disabled={!canRedo}\n aria-label=\"Làm lại\"\n title=\"Làm lại (Ctrl/Cmd+Shift+Z)\"\n data-testid=\"redo-btn-mobile\"\n className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15 disabled:opacity-40\"\n >\n <RedoIcon />\n </button>\n <button\n type=\"button\"\n onClick={handleInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"geometry-insert-btn-mobile\"\n className=\"rounded bg-white/15 px-3 py-1.5 text-xs font-semibold transition hover:bg-white/25 disabled:opacity-50\"\n >\n Chèn\n </button>\n </>\n )}\n <button onClick={onClose} aria-label=\"Đóng\" className=\"inline-flex h-9 w-9 items-center justify-center rounded transition hover:bg-white/15\">\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n </svg>\n </button>\n </header>\n {generateGeometryFigure && (\n <AiFigurePrompt generator={generateGeometryFigure} onGenerated={loadAiFigure} />\n )}\n <div className=\"flex min-h-0 flex-1\">\n <div className=\"flex-1\">\n <MiniBoard2D\n ref={handleRef}\n store={store}\n selectedTool={selectedTool}\n showAxis={showAxis}\n showGrid={showGrid}\n onReady={handleReady}\n isDark={isDark}\n toast={showToast}\n />\n </div>\n </div>\n {propsPopover && (\n propsPopover.kind === 'point' ? (\n <PropertiesPopover\n kind=\"point\"\n anchor={propsPopover.screenCoords}\n isDark={isDark}\n currentName={propsPopover.name}\n currentColor={propsPopover.color}\n currentDash={propsPopover.dash}\n currentWidth={propsPopover.width}\n currentFace={propsPopover.face}\n currentShowLabel={propsPopover.showLabel}\n getAllNames={() => handleRef.current?.getAllPointNames() ?? []}\n onClose={dismissPropsPopover}\n onMutate={(patch) => {\n handleRef.current?.mutateObject(propsPopover.id, patch);\n if (patch.remove) dismissPropsPopover();\n // Refresh snapshot để UI checkbox phản ánh state mới\n if (typeof patch.valueLabel === 'boolean' || patch.attrs) {\n setPropsPopover((cur) => cur ? { ...cur, showValue: patch.valueLabel ?? cur.showValue } : cur);\n }\n }}\n />\n ) : (\n <PropertiesPopover\n kind={propsPopover.kind}\n anchor={propsPopover.screenCoords}\n isDark={isDark}\n currentName={propsPopover.name}\n currentColor={propsPopover.color}\n currentDash={propsPopover.dash}\n currentWidth={propsPopover.width}\n currentShowLabel={propsPopover.showLabel}\n currentShowValue={propsPopover.showValue}\n getAllNames={() => handleRef.current?.getAllPointNames() ?? []}\n onClose={dismissPropsPopover}\n onMutate={(patch) => {\n handleRef.current?.mutateObject(propsPopover.id, patch);\n if (patch.remove) dismissPropsPopover();\n if (typeof patch.valueLabel === 'boolean') {\n setPropsPopover((cur) => cur ? { ...cur, showValue: patch.valueLabel ?? cur.showValue } : cur);\n }\n if (patch.attrs && 'withLabel' in patch.attrs) {\n setPropsPopover((cur) => cur ? { ...cur, showLabel: !!patch.attrs?.withLabel } : cur);\n }\n }}\n />\n )\n )}\n\n {multiSelection && multiSelection.ids.length > 1 && (\n <MultiPropertiesPopover\n anchor={multiSelection.anchor}\n count={multiSelection.ids.length}\n isDark={isDark}\n onColor={applyMultiColor}\n onDelete={applyMultiDelete}\n onClose={dismissMultiPopover}\n />\n )}\n\n {transformPopover && (transformPopover.tool === 'rotate' || transformPopover.tool === 'dilate' || transformPopover.tool === 'regularPolygon') && (\n <TransformParamPopover\n kind={transformPopover.tool}\n anchor={transformPopover.anchor}\n defaultValue={\n transformPopover.tool === 'rotate' ? 90\n : transformPopover.tool === 'dilate' ? 2\n : 6\n }\n isDark={isDark}\n onConfirm={(v) => { handleRef.current?.confirmTransformParam(v); setTransformPopover(null); }}\n onCancel={() => { handleRef.current?.cancelTransformParam(); setTransformPopover(null); }}\n />\n )}\n\n {!isMobile && (\n <footer className=\"flex items-center justify-between border-t border-slate-200 bg-slate-50 px-3 py-2\">\n <span className=\"text-xs text-slate-500\">Chọn công cụ bên trái, click trên bảng để dựng hình.</span>\n <div className=\"flex gap-2\">\n <button\n onClick={onClose}\n className=\"rounded border border-slate-300 bg-white px-3 py-1 text-xs font-medium text-slate-700 transition hover:bg-slate-100\"\n >\n Huỷ\n </button>\n <button\n onClick={handleInsert}\n disabled={!ready || !hasContent}\n title={!hasContent ? 'Vẽ ít nhất một đối tượng trước khi chèn' : undefined}\n data-testid=\"geometry-insert-btn\"\n className=\"rounded bg-emerald-600 px-3 py-1 text-xs font-medium text-white transition hover:bg-emerald-700 disabled:opacity-50\"\n >\n Chèn\n </button>\n </div>\n </footer>\n )}\n <ToastHost />\n </div>\n );\n },\n);\n\nexport const GeometryEditorPanel = forwardRef<GeometryEditorPanelHandle, Props>(\n function GeometryEditorPanel(props, ref) {\n return (\n <ToastProvider>\n <GeometryEditorPanelInner {...props} ref={ref} />\n </ToastProvider>\n );\n },\n);\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\ninterface UseChordShortcutArgs<G extends string> {\n groupOrder: readonly G[];\n tools: ReadonlyArray<{ key: string; group: G }>;\n onSelect: (toolKey: string) => void;\n enabled: boolean;\n}\n\ninterface UseChordShortcutResult<G extends string> {\n chordGroup: G | null;\n cancel: () => void;\n}\n\nconst A_CODE = 'a'.charCodeAt(0);\n\nfunction isFieldFocused(): boolean {\n const ae = (typeof document !== 'undefined'\n ? (document.activeElement as HTMLElement | null)\n : null);\n return !!(\n ae &&\n (ae.tagName === 'INPUT' ||\n ae.tagName === 'TEXTAREA' ||\n ae.isContentEditable)\n );\n}\n\nexport function useChordShortcut<G extends string>(\n args: UseChordShortcutArgs<G>,\n): UseChordShortcutResult<G> {\n const { groupOrder, tools, onSelect, enabled } = args;\n\n const [chordGroup, setChordGroup] = useState<G | null>(null);\n\n const groupOrderRef = useRef(groupOrder);\n const toolsRef = useRef(tools);\n const onSelectRef = useRef(onSelect);\n const chordGroupRef = useRef<G | null>(null);\n\n groupOrderRef.current = groupOrder;\n toolsRef.current = tools;\n onSelectRef.current = onSelect;\n // chordGroupRef được sync ngay trong handler (xem `setChord` dưới đây)\n // thay vì ghi từ render body — nếu ghi ở body sẽ bị React batch hoá khi\n // hai event xảy ra trong cùng một act() (event sau đọc giá trị cũ).\n\n const cancel = useCallback(() => {\n chordGroupRef.current = null;\n setChordGroup(null);\n }, []);\n\n useEffect(() => {\n if (!enabled) return;\n\n const setChord = (next: G | null) => {\n chordGroupRef.current = next;\n setChordGroup(next);\n };\n\n const onKey = (e: KeyboardEvent) => {\n if (e.metaKey || e.ctrlKey || e.altKey) return;\n if (isFieldFocused()) return;\n\n const key = e.key;\n const lower = key.length === 1 ? key.toLowerCase() : key;\n\n if (key === 'Escape') {\n if (chordGroupRef.current !== null) {\n e.preventDefault();\n e.stopPropagation();\n setChord(null);\n }\n return;\n }\n\n if (lower.length === 1 && lower >= 'a' && lower <= 'z') {\n const idx = lower.charCodeAt(0) - A_CODE;\n if (idx < groupOrderRef.current.length) {\n e.preventDefault();\n e.stopPropagation();\n setChord(groupOrderRef.current[idx]);\n }\n return;\n }\n\n if (key >= '1' && key <= '9') {\n const active = chordGroupRef.current;\n if (active === null) return;\n const n = key.charCodeAt(0) - '1'.charCodeAt(0); // 0-indexed\n const toolsInGroup = toolsRef.current.filter(\n (t) => t.group === active,\n );\n e.preventDefault();\n e.stopPropagation();\n if (n < toolsInGroup.length) {\n onSelectRef.current(toolsInGroup[n].key);\n }\n setChord(null);\n return;\n }\n };\n\n window.addEventListener('keydown', onKey, { capture: true });\n return () => {\n window.removeEventListener('keydown', onKey, { capture: true });\n };\n }, [enabled]);\n\n return { chordGroup, cancel };\n}\n","import { createStampFile } from './svgToStampFile';\nimport type { ExcalidrawElement } from '../../types';\n\n// Excalidraw imperative API — không có public type chính xác. Giữ untyped ở\n// boundary và yêu cầu caller pass đúng instance.\n \ntype ExApi = any;\n\nexport interface InsertStampImageOptions {\n /** SVG string sẵn sàng render (geometry export hoặc katex render). */\n svgString: string;\n /**\n * Factory tạo customData. Mỗi stamp tự define shape (kind, version, jsonState).\n * width/height của element đã được Excalidraw track riêng — không cần lưu\n * trong customData (drop tại Tier D cleanup v0.20).\n */\n makeCustomData: () => unknown;\n /** Nếu đang re-edit, id của element cũ — sẽ update thay vì tạo mới. */\n editingElementId?: string | null;\n /** Vị trí gốc (lúc tạo mới). Bỏ qua khi đang re-edit. */\n position?: { x?: number; y?: number };\n}\n\nexport interface InsertStampImageResult {\n fileId: string;\n width: number;\n height: number;\n /** Element id (mới hoặc cũ tuỳ flow). */\n elementId: string;\n}\n\n// Bỏ qua appState (selectedElementIds + croppingElementId) sau khi insert để\n// Excalidraw không tự động bật crop mode cho element vừa thêm → tránh trigger\n// crop intercept handler vô tận.\n \nconst clearAppStateAfterInsert = (): any => ({\n selectedElementIds: {},\n croppingElementId: null,\n});\n\nfunction buildStampImageElement(\n api: ExApi,\n fileId: string,\n width: number,\n height: number,\n customData: unknown,\n x?: number,\n y?: number,\n) {\n const appState =\n api?.getAppState() ?? { scrollX: 0, scrollY: 0, width: 800, height: 600, zoom: { value: 1 } };\n const cx =\n x ?? appState.scrollX + (appState.width ?? 800) / 2 / (appState.zoom?.value ?? 1) - width / 2;\n const cy =\n y ?? appState.scrollY + (appState.height ?? 600) / 2 / (appState.zoom?.value ?? 1) - height / 2;\n return {\n type: 'image' as const,\n id: 'stamp_' + Date.now() + '_' + Math.random().toString(36).slice(2, 8),\n x: cx,\n y: cy,\n width,\n height,\n fileId,\n customData,\n angle: 0,\n strokeColor: 'transparent',\n backgroundColor: 'transparent',\n fillStyle: 'solid',\n strokeWidth: 1,\n strokeStyle: 'solid',\n roughness: 0,\n opacity: 100,\n groupIds: [],\n roundness: null,\n seed: Math.floor(Math.random() * 1e9),\n versionNonce: 0,\n version: 1,\n isDeleted: false,\n boundElements: null,\n updated: Date.now(),\n link: null,\n locked: false,\n status: 'saved',\n scale: [1, 1],\n };\n}\n\n/**\n * Chèn (hoặc thay thế) một stamp image vào Excalidraw scene.\n *\n * Flow:\n * 1. createStampFile(svg) → fileId + dataURL + kích thước\n * 2. api.addFiles([...]) — đăng ký SVG dưới fileId\n * 3. Nếu editingElementId → update element cũ (giữ position, đổi fileId+customData+size)\n * Còn lại → tạo image element mới ở giữa viewport (hoặc position truyền vào)\n *\n * Đoạn này trước đây nằm 2 chỗ (handleGeometryInsert + handleLatexInsert),\n * chỉ khác customData. Gộp lại để: thêm stamp type mới chỉ cần truyền\n * `makeCustomData`.\n */\nexport async function insertStampImage(\n api: ExApi,\n opts: InsertStampImageOptions,\n): Promise<InsertStampImageResult> {\n const { dataURL, fileId, width, height, mimeType } = await createStampFile(opts.svgString);\n api.addFiles([{ id: fileId, dataURL, mimeType, created: Date.now() }]);\n const customData = opts.makeCustomData();\n\n const elements = api.getSceneElements() as readonly ExcalidrawElement[];\n const editingId = opts.editingElementId ?? null;\n\n if (editingId) {\n const updated = elements.map((e) =>\n e.id === editingId ? { ...e, fileId, customData, width, height } : e,\n );\n api.updateScene({ elements: updated, appState: clearAppStateAfterInsert() });\n return { fileId, width, height, elementId: editingId };\n }\n\n const newElement = buildStampImageElement(\n api,\n fileId,\n width,\n height,\n customData,\n opts.position?.x,\n opts.position?.y,\n );\n api.updateScene({\n elements: [...elements, newElement],\n appState: clearAppStateAfterInsert(),\n });\n return { fileId, width, height, elementId: newElement.id };\n}\n","// Hook tạo + giữ scene store tại Host level cho mọi stamp interactive\n// (geometry-2d, geometry-3d, graph-2d).\n//\n// Trước đây mỗi stamp dùng pattern riêng:\n// - 3D: useRef + createStore(createEmptyState('3d')) inline tại host.\n// - 2D + graph-2d: useState<Store|null> + callback `onStoreReady` từ editor.\n//\n// Hook này hợp nhất về 1 mental model: store sống ở host, identity stable,\n// pre-load từ customData ngay frame đầu → bỏ ternary `store ? ... : undefined`\n// + bỏ flash 1 frame trên 2D + graph-2d.\n//\n// Roundtrip edit: khi double-click stamp existing element, `editingElement`\n// được pass vào, hook gọi `parseInitial(customData)` để extract State trước\n// khi createStore. Stamp tự define parseInitial vì format customData khác nhau.\n\nimport { useRef } from 'react';\nimport { createStore, createEmptyState, type Store } from '../../core/scene';\nimport type { State } from '../../core/scene/types';\nimport type { StampHostProps } from './types';\n\nexport type StampDomain = '2d' | '3d' | 'graph2d';\n\nexport type ParseInitialStateFn = (customData: unknown) => State | null;\n\nexport function useStampStore(\n domain: StampDomain,\n editingElement: StampHostProps['editingElement'],\n parseInitial: ParseInitialStateFn,\n): Store {\n const ref = useRef<Store | null>(null);\n if (!ref.current) {\n const initial = editingElement?.customData\n ? parseInitial(editingElement.customData) ?? createEmptyState(domain)\n : createEmptyState(domain);\n ref.current = createStore(initial);\n }\n return ref.current;\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport { StampLeftPanel } from '../shared/StampLeftPanel';\nimport { GeometryIconHeader } from './editor/icons';\nimport {\n GeometryEditorPanel,\n type GeometryEditorPanelHandle,\n} from './editor/EditorPanel';\nimport type { GeomTool } from './editor/MiniBoard';\nimport { GROUP_ORDER, GROUP_LABELS, TOOLS, letterForGroup, type GeomGroup } from './editor/tools';\nimport { useChordShortcut } from '../shared/useChordShortcut';\nimport { insertStampImage } from '../shared/insertImage';\nimport { deserializeBoard } from './serialize';\nimport { isGeometryCustomData, type GeometryCustomData } from './types';\nimport { DEFAULT_VIEW_2D, type State } from '../../core/scene';\nimport type {\n StampHostProps,\n StampHostHandle,\n} from '../shared/types';\nimport { useIsMobile } from '../shared/useIsMobile';\nimport { useStampStore } from '../shared/useStampStore';\n\nfunction parseInitialState(data: unknown): State | null {\n if (!isGeometryCustomData(data)) return null;\n return deserializeBoard(data.jsonState);\n}\n\nexport const GeometryStampHost = forwardRef<StampHostHandle, StampHostProps>(\n function GeometryStampHost({ api, editingElement, onClose, isDark, generateGeometryFigure }, ref) {\n const panelRef = useRef<GeometryEditorPanelHandle | null>(null);\n const { isMobile } = useIsMobile();\n const [drawerOpen, setDrawerOpen] = useState(false);\n const sceneStore = useStampStore('2d', editingElement, parseInitialState);\n\n // Tier 2 F — host owns editor UI state.\n const initialMeta = sceneStore.getState().meta;\n const initialView = initialMeta.domain === '2d' ? initialMeta.view : DEFAULT_VIEW_2D;\n const [selectedTool, setSelectedTool] = useState<GeomTool>('move');\n const [showAxis, setShowAxis] = useState<boolean>(initialView.showAxis);\n const [showGrid, setShowGrid] = useState<boolean>(initialView.showGrid);\n const [canUndo, setCanUndo] = useState<boolean>(false);\n const [canRedo, setCanRedo] = useState<boolean>(false);\n const [selectedObjectId, setSelectedObjectId] = useState<string | undefined>(undefined);\n\n const handleHistoryChange = useCallback((u: boolean, r: boolean) => {\n setCanUndo(u);\n setCanRedo(r);\n }, []);\n\n const handleUndo = useCallback(() => sceneStore.undo(), [sceneStore]);\n const handleRedo = useCallback(() => sceneStore.redo(), [sceneStore]);\n\n const { chordGroup } = useChordShortcut({\n groupOrder: GROUP_ORDER,\n tools: TOOLS,\n onSelect: (key) => setSelectedTool(key as GeomTool),\n enabled: !isMobile,\n });\n\n const handleInsert = useCallback(\n async (jsonState: string, svgString: string) => {\n if (!api) return;\n try {\n await insertStampImage(api, {\n svgString,\n makeCustomData: (): GeometryCustomData => ({\n kind: 'geometry',\n version: 1,\n jsonState,\n }),\n editingElementId: editingElement?.id ?? null,\n });\n } catch (err) {\n console.error('Geometry insert failed:', err);\n }\n onClose();\n },\n [api, editingElement?.id, onClose],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n tryInsert: () => panelRef.current?.insert() ?? false,\n hasContent: () => panelRef.current?.hasContent() ?? false,\n }),\n [],\n );\n\n return (\n <>\n <StampLeftPanel<GeomTool, GeomGroup>\n title=\"Hình học\"\n icon={GeometryIconHeader}\n onClose={onClose}\n isDark={isDark}\n testId=\"stamp-left-panel\"\n tools={TOOLS}\n groupOrder={GROUP_ORDER}\n groupLabels={GROUP_LABELS}\n activeTool={selectedTool}\n onToolChange={setSelectedTool}\n view={{\n showAxis,\n showGrid,\n onShowAxisChange: setShowAxis,\n onShowGridChange: setShowGrid,\n }}\n history={{\n onUndo: handleUndo,\n canUndo,\n onRedo: handleRedo,\n canRedo,\n }}\n chord={{ activeGroup: chordGroup, letterForGroup }}\n objects={{\n store: sceneStore,\n selectedObjectId,\n onObjectSelect: (id) => {\n setSelectedObjectId(id ?? undefined);\n panelRef.current?.selectObject(id);\n },\n }}\n isMobile={isMobile}\n drawerOpen={drawerOpen}\n onDrawerClose={() => setDrawerOpen(false)}\n />\n <GeometryEditorPanel\n ref={panelRef}\n store={sceneStore}\n onInsert={handleInsert}\n onClose={onClose}\n selectedTool={selectedTool}\n showAxis={showAxis}\n showGrid={showGrid}\n onHistoryChange={handleHistoryChange}\n withLeftPanel={!isMobile}\n isDark={isDark}\n isMobile={isMobile}\n onOpenDrawer={() => setDrawerOpen(true)}\n onUndo={handleUndo}\n onRedo={handleRedo}\n canUndo={canUndo}\n canRedo={canRedo}\n onSelectionChange={setSelectedObjectId}\n generateGeometryFigure={generateGeometryFigure}\n />\n </>\n );\n },\n);\n","'use client';\n\nimport { lazy, type ReactNode } from 'react';\nimport { renderGeometrySvgFromState } from './render';\nimport type {\n RestoredStampFile,\n StampType,\n} from '../shared/types';\nimport { svgToStampFile } from '../shared/svgToStampFile';\nimport {\n isGeometryCustomData,\n type GeometryCustomData,\n} from './types';\n\nexport type { GeometryCustomData };\n\nconst GeometryStampHost = lazy(() =>\n import('./host').then((m) => ({ default: m.GeometryStampHost })),\n);\n\nconst GeometryIcon: ReactNode = (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <polygon points=\"4,20 20,20 12,5\" />\n <circle cx=\"4\" cy=\"20\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"20\" cy=\"20\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"12\" cy=\"5\" r=\"1.4\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n);\n\nexport const geometryStamp: StampType<GeometryCustomData> = {\n kind: 'geometry',\n shortcutKey: 'g',\n toolbarLabel: 'G',\n toolbarTitle: 'Chèn hình học (G)',\n toolbarIcon: GeometryIcon,\n toolbarTestId: 'stamp-toolbar-geometry',\n matchesCustomData: isGeometryCustomData,\n async renderSvgFromCustomData(data) {\n if (!isGeometryCustomData(data)) {\n throw new Error('geometryStamp.renderSvgFromCustomData: customData không phải geometry');\n }\n return renderGeometrySvgFromState(data.jsonState);\n },\n async restoreFileFromCustomData(element): Promise<RestoredStampFile | null> {\n const data = element.customData as GeometryCustomData | undefined;\n const fileId = (element as { fileId?: string | null }).fileId;\n if (!data || !fileId || !isGeometryCustomData(data)) return null;\n const svgString = await renderGeometrySvgFromState(data.jsonState);\n return svgToStampFile(svgString, fileId);\n },\n Host: GeometryStampHost,\n};\n"]}
|