jch-config-editor 0.1.12 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"config-editor.es.js","sources":["../node_modules/.pnpm/@babel+runtime@7.28.6/node_modules/@babel/runtime/helpers/interopRequireDefault.js","../node_modules/.pnpm/@rc-component+pagination@1.2.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@rc-component/pagination/lib/locale/zh_CN.js","../node_modules/.pnpm/@rc-component+picker@1.9.0_dayjs@1.11.19_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@rc-component/picker/lib/locale/common.js","../node_modules/.pnpm/@rc-component+picker@1.9.0_dayjs@1.11.19_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@rc-component/picker/lib/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/lib/time-picker/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/lib/date-picker/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/lib/calendar/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/lib/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/locale/zh_CN.js","../node_modules/.pnpm/zustand@5.0.11_@types+react@19.2.14_immer@11.1.4_react@19.2.4/node_modules/zustand/esm/middleware/immer.mjs","../src/store/editorStore.ts","../src/utils/initData.ts","../src/components/MaterialPanel/index.tsx","../src/components/NodeRenderer/index.tsx","../src/components/ColorPicker/index.tsx","../src/components/Canvas/index.tsx","../src/components/PropertyPanel/editors/TextMaterialEditor.tsx","../src/components/PropertyPanel/editors/ImageMaterialEditor.tsx","../src/components/PropertyPanel/editors/LineMaterialEditor.tsx","../src/components/PropertyPanel/editors/MaterialPropertyEditor.tsx","../src/components/PropertyPanel/editors/GroupNodeStatusEditor.tsx","../src/components/PropertyPanel/index.tsx","../src/components/ConfigEditor/index.tsx"],"sourcesContent":["function _interopRequireDefault(e) {\n return e && e.__esModule ? e : {\n \"default\": e\n };\n}\nmodule.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nconst locale = {\n // Options\n items_per_page: '条/页',\n jump_to: '跳至',\n jump_to_confirm: '确定',\n page: '页',\n // Pagination\n prev_page: '上一页',\n next_page: '下一页',\n prev_5: '向前 5 页',\n next_5: '向后 5 页',\n prev_3: '向前 3 页',\n next_3: '向后 3 页',\n page_size: '页码'\n};\nvar _default = exports.default = locale;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.commonLocale = void 0;\nvar commonLocale = exports.commonLocale = {\n yearFormat: 'YYYY',\n dayFormat: 'D',\n cellMeridiemFormat: 'A',\n monthBeforeYear: true\n};","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _common = require(\"./common\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nvar locale = _objectSpread(_objectSpread({}, _common.commonLocale), {}, {\n locale: 'zh_CN',\n today: '今天',\n now: '此刻',\n backToToday: '返回今天',\n ok: '确定',\n timeSelect: '选择时间',\n dateSelect: '选择日期',\n weekSelect: '选择周',\n clear: '清除',\n week: '周',\n month: '月',\n year: '年',\n previousMonth: '上个月 (翻页上键)',\n nextMonth: '下个月 (翻页下键)',\n monthSelect: '选择月份',\n yearSelect: '选择年份',\n decadeSelect: '选择年代',\n previousYear: '上一年 (Control键加左方向键)',\n nextYear: '下一年 (Control键加右方向键)',\n previousDecade: '上一年代',\n nextDecade: '下一年代',\n previousCentury: '上一世纪',\n nextCentury: '下一世纪',\n yearFormat: 'YYYY年',\n cellDateFormat: 'D',\n monthBeforeYear: false\n});\nvar _default = exports.default = locale;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nconst locale = {\n placeholder: '请选择时间',\n rangePlaceholder: ['开始时间', '结束时间']\n};\nvar _default = exports.default = locale;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\").default;\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _zh_CN = _interopRequireDefault(require(\"@rc-component/picker/locale/zh_CN\"));\nvar _zh_CN2 = _interopRequireDefault(require(\"../../time-picker/locale/zh_CN\"));\n// 统一合并为完整的 Locale\nconst locale = {\n lang: {\n placeholder: '请选择日期',\n yearPlaceholder: '请选择年份',\n quarterPlaceholder: '请选择季度',\n monthPlaceholder: '请选择月份',\n weekPlaceholder: '请选择周',\n rangePlaceholder: ['开始日期', '结束日期'],\n rangeYearPlaceholder: ['开始年份', '结束年份'],\n rangeMonthPlaceholder: ['开始月份', '结束月份'],\n rangeQuarterPlaceholder: ['开始季度', '结束季度'],\n rangeWeekPlaceholder: ['开始周', '结束周'],\n ..._zh_CN.default\n },\n timePickerLocale: {\n ..._zh_CN2.default\n }\n};\n// should add whitespace between char in Button\nlocale.lang.ok = '确定';\n// All settings at:\n// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json\nvar _default = exports.default = locale;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\").default;\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _zh_CN = _interopRequireDefault(require(\"../../date-picker/locale/zh_CN\"));\nvar _default = exports.default = _zh_CN.default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\").default;\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _zh_CN = _interopRequireDefault(require(\"@rc-component/pagination/lib/locale/zh_CN\"));\nvar _zh_CN2 = _interopRequireDefault(require(\"../calendar/locale/zh_CN\"));\nvar _zh_CN3 = _interopRequireDefault(require(\"../date-picker/locale/zh_CN\"));\nvar _zh_CN4 = _interopRequireDefault(require(\"../time-picker/locale/zh_CN\"));\nconst typeTemplate = '${label}不是一个有效的${type}';\nconst localeValues = {\n locale: 'zh-cn',\n Pagination: _zh_CN.default,\n DatePicker: _zh_CN3.default,\n TimePicker: _zh_CN4.default,\n Calendar: _zh_CN2.default,\n // locales for all components\n global: {\n placeholder: '请选择',\n close: '关闭',\n sortable: '可排序'\n },\n Table: {\n filterTitle: '筛选',\n filterConfirm: '确定',\n filterReset: '重置',\n filterEmptyText: '无筛选项',\n filterCheckAll: '全选',\n filterSearchPlaceholder: '在筛选项中搜索',\n emptyText: '暂无数据',\n selectAll: '全选当页',\n selectInvert: '反选当页',\n selectNone: '清空所有',\n selectionAll: '全选所有',\n sortTitle: '排序',\n expand: '展开行',\n collapse: '关闭行',\n triggerDesc: '点击降序',\n triggerAsc: '点击升序',\n cancelSort: '取消排序'\n },\n Modal: {\n okText: '确定',\n cancelText: '取消',\n justOkText: '知道了'\n },\n Tour: {\n Next: '下一步',\n Previous: '上一步',\n Finish: '结束导览'\n },\n Popconfirm: {\n cancelText: '取消',\n okText: '确定'\n },\n Transfer: {\n titles: ['', ''],\n searchPlaceholder: '请输入搜索内容',\n itemUnit: '项',\n itemsUnit: '项',\n remove: '删除',\n selectCurrent: '全选当页',\n removeCurrent: '删除当页',\n selectAll: '全选所有',\n deselectAll: '取消全选',\n removeAll: '删除全部',\n selectInvert: '反选当页'\n },\n Upload: {\n uploading: '文件上传中',\n removeFile: '删除文件',\n uploadError: '上传错误',\n previewFile: '预览文件',\n downloadFile: '下载文件'\n },\n Empty: {\n description: '暂无数据'\n },\n Icon: {\n icon: '图标'\n },\n Text: {\n edit: '编辑',\n copy: '复制',\n copied: '复制成功',\n expand: '展开',\n collapse: '收起'\n },\n Form: {\n optional: '(可选)',\n defaultValidateMessages: {\n default: '字段验证错误${label}',\n required: '请输入${label}',\n enum: '${label}必须是其中一个[${enum}]',\n whitespace: '${label}不能为空字符',\n date: {\n format: '${label}日期格式无效',\n parse: '${label}不能转换为日期',\n invalid: '${label}是一个无效日期'\n },\n types: {\n string: typeTemplate,\n method: typeTemplate,\n array: typeTemplate,\n object: typeTemplate,\n number: typeTemplate,\n date: typeTemplate,\n boolean: typeTemplate,\n integer: typeTemplate,\n float: typeTemplate,\n regexp: typeTemplate,\n email: typeTemplate,\n url: typeTemplate,\n hex: typeTemplate\n },\n string: {\n len: '${label}须为${len}个字符',\n min: '${label}最少${min}个字符',\n max: '${label}最多${max}个字符',\n range: '${label}须在${min}-${max}字符之间'\n },\n number: {\n len: '${label}必须等于${len}',\n min: '${label}最小值为${min}',\n max: '${label}最大值为${max}',\n range: '${label}须在${min}-${max}之间'\n },\n array: {\n len: '须为${len}个${label}',\n min: '最少${min}个${label}',\n max: '最多${max}个${label}',\n range: '${label}数量须在${min}-${max}之间'\n },\n pattern: {\n mismatch: '${label}与模式不匹配${pattern}'\n }\n }\n },\n QRCode: {\n expired: '二维码过期',\n refresh: '点击刷新',\n scanned: '已扫描'\n },\n ColorPicker: {\n presetEmpty: '暂无',\n transparent: '无色',\n singleColor: '单色',\n gradientColor: '渐变色'\n }\n};\nvar _default = exports.default = localeValues;","module.exports = require('../lib/locale/zh_CN');","import { produce } from 'immer';\n\nconst immerImpl = (initializer) => (set, get, store) => {\n store.setState = (updater, replace, ...args) => {\n const nextState = typeof updater === \"function\" ? produce(updater) : updater;\n return set(nextState, replace, ...args);\n };\n return initializer(store.setState, get, store);\n};\nconst immer = immerImpl;\n\nexport { immer };\n","import { create } from 'zustand';\nimport { immer } from 'zustand/middleware/immer';\nimport { nanoid } from 'nanoid';\n// @ts-ignore - 导入 csstype 用于类型推断\nimport type {} from 'csstype';\nimport type { \n EditorState, \n Node, \n Material,\n NodeStatus,\n EditorEvent, \n EventType,\n SchemeJSON,\n NodeStyle,\n ContentInfo,\n ControlInfo,\n CanvasConfig\n} from '../types';\n\n// 初始状态\nconst initialState: EditorState = {\n nodes: [],\n materials: [],\n selectedNodeId: null,\n selectedStatusId: null,\n canvas: {\n width: 1920,\n height: 1080,\n background: '#ffffff',\n showGrid: true,\n },\n viewport: {\n scale: 1,\n positionX: 0,\n positionY: 0,\n },\n history: {\n past: [],\n future: [],\n },\n mode: 'select',\n lineDrawing: {\n isDrawing: false,\n material: null,\n startPoint: null,\n endPoint: null,\n },\n};\n\n// 创建事件\nconst createEvent = (type: EventType, targetId?: string, payload?: any): EditorEvent => ({\n id: nanoid(),\n type,\n targetId,\n payload,\n timestamp: Date.now(),\n});\n\n// Store 接口\ninterface EditorStore extends EditorState {\n // 节点操作\n addNode: (node: Omit<Node, 'id'> & { id?: string }, autoSelect?: boolean) => void;\n updateNode: (id: string, updates: Partial<Node>) => void;\n updateNodeStyle: (id: string, style: Partial<NodeStyle>) => void;\n updateNodeContent: (id: string, content: Partial<ContentInfo>) => void;\n updateNodeControl: (id: string, control: Partial<ControlInfo>) => void;\n removeNode: (id: string) => void;\n selectNode: (id: string | null) => void;\n \n // 状态操作(新架构)\n addStatus: (nodeId: string, status: Omit<NodeStatus, 'id'>) => void;\n removeStatus: (nodeId: string, statusId: string) => void;\n updateStatus: (nodeId: string, statusId: string, updates: Partial<NodeStatus>) => void;\n selectStatus: (statusId: string | null) => void;\n evaluateCurrentStatus: (nodeId: string, data: any) => string | undefined;\n \n // 物料库操作\n addMaterial: (material: Omit<Material, 'id'>) => void;\n updateMaterial: (id: string, updates: Partial<Material>) => void;\n removeMaterial: (id: string) => void;\n \n // 视口操作\n setViewport: (viewport: Partial<EditorState['viewport']>) => void;\n \n // 画布配置操作\n setCanvasConfig: (config: Partial<CanvasConfig>) => void;\n \n // 模式切换\n setMode: (mode: EditorState['mode']) => void;\n \n // 线条绘制操作\n startLineDrawing: (material: Material) => void;\n updateLineDrawing: (endPoint: { x: number; y: number }) => void;\n endLineDrawing: () => void;\n cancelLineDrawing: () => void;\n \n // 历史操作\n undo: () => void;\n redo: () => void;\n \n // 导入导出\n exportScheme: () => SchemeJSON;\n importScheme: (scheme: SchemeJSON) => void;\n \n // 事件记录\n recordEvent: (event: EditorEvent) => void;\n}\n\nexport const useEditorStore = create<EditorStore>()(\n immer((set, get) => ({\n ...initialState,\n // ========== 节点操作 ==========\n addNode: (node, autoSelect = true) => {\n set((state) => {\n // 如果传入的节点已有 id,则保留;否则生成新 id\n const newNode = {\n ...node,\n id: node.id || nanoid(),\n } as Node;\n state.nodes.push(newNode);\n if (autoSelect) {\n state.selectedNodeId = newNode.id;\n state.history.past.push(createEvent('NODE_SELECT', newNode.id));\n }\n });\n },\n\n updateNode: (id, updates) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === id);\n if (node) {\n Object.assign(node, updates);\n state.history.past.push(createEvent('PROPERTY_CHANGE', id, updates));\n }\n });\n },\n\n updateNodeStyle: (id, style) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === id);\n if (node) {\n Object.assign(node.normalStyle, style);\n state.history.past.push(createEvent('PROPERTY_CHANGE', id, { normalStyle: style }));\n }\n });\n },\n\n updateNodeContent: (id, content) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === id);\n if (node) {\n // 创建新的 contentInfo 对象以确保引用变化\n node.contentInfo = { ...node.contentInfo, ...content };\n state.history.past.push(createEvent('PROPERTY_CHANGE', id, { contentInfo: content }));\n }\n });\n },\n\n updateNodeControl: (id, control) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === id);\n if (node) {\n Object.assign(node.controlInfo, control);\n state.history.past.push(createEvent('PROPERTY_CHANGE', id, { controlInfo: control }));\n }\n });\n },\n\n removeNode: (id) => {\n set((state) => {\n const index = state.nodes.findIndex((n) => n.id === id);\n if (index !== -1) {\n state.nodes.splice(index, 1);\n if (state.selectedNodeId === id) {\n state.selectedNodeId = null;\n state.selectedStatusId = null;\n }\n state.history.past.push(createEvent('NODE_DELETE', id));\n }\n });\n },\n\n selectNode: (id) => {\n set((state) => {\n state.selectedNodeId = id;\n state.selectedStatusId = null;\n if (id) {\n state.history.past.push(createEvent('NODE_SELECT', id));\n }\n });\n },\n\n // ========== 状态操作 ==========\n addStatus: (nodeId, status) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === nodeId);\n if (!node) return;\n\n const newStatus: NodeStatus = {\n ...status,\n id: nanoid(),\n };\n\n node.contentInfo.statusList.push(newStatus);\n state.history.past.push(createEvent('MATERIAL_STATUS_CHANGE', nodeId, { statusId: newStatus.id }));\n });\n },\n\n removeStatus: (nodeId, statusId) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === nodeId);\n if (!node) return;\n\n const index = node.contentInfo.statusList.findIndex((s) => s.id === statusId);\n if (index !== -1) {\n node.contentInfo.statusList.splice(index, 1);\n if (node.contentInfo.currentStatusId === statusId) {\n node.contentInfo.currentStatusId = undefined;\n }\n if (state.selectedStatusId === statusId) {\n state.selectedStatusId = null;\n }\n }\n });\n },\n\n updateStatus: (nodeId, statusId, updates) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === nodeId);\n if (!node) return;\n\n const status = node.contentInfo.statusList.find((s) => s.id === statusId);\n if (status) {\n Object.assign(status, updates);\n }\n });\n },\n\n selectStatus: (statusId) => {\n set((state) => {\n state.selectedStatusId = statusId;\n });\n },\n\n evaluateCurrentStatus: (nodeId, data) => {\n const state = get();\n const node = state.nodes.find((n) => n.id === nodeId);\n if (!node) return undefined;\n\n for (const status of node.contentInfo.statusList) {\n try {\n const fn = new Function('data', 'bindCodes', 'status', status.expression);\n const result = fn(data, status.bindCodes, status);\n if (result === true) {\n return status.id;\n }\n } catch (error) {\n console.warn('状态表达式执行失败:', status.name, error);\n }\n }\n\n return undefined;\n },\n\n // ========== 物料库操作 ==========\n addMaterial: (material) => {\n set((state) => {\n const newMaterial = {\n ...material,\n id: nanoid(),\n };\n state.materials.push(newMaterial as Material);\n state.history.past.push(createEvent('MATERIAL_ADD', newMaterial.id));\n });\n },\n\n updateMaterial: (id, updates) => {\n set((state) => {\n const material = state.materials.find((m) => m.id === id);\n if (material) {\n Object.assign(material, updates);\n }\n });\n },\n\n removeMaterial: (id) => {\n set((state) => {\n const index = state.materials.findIndex((m) => m.id === id);\n if (index !== -1) {\n state.materials.splice(index, 1);\n }\n });\n },\n\n // ========== 视口操作 ==========\n setViewport: (viewport) => {\n set((state) => {\n Object.assign(state.viewport, viewport);\n });\n },\n\n // ========== 画布配置操作 ==========\n setCanvasConfig: (config) => {\n set((state) => {\n state.canvas = { ...state.canvas, ...config };\n });\n },\n\n // ========== 模式切换 ==========\n setMode: (mode) => {\n set((state) => {\n state.mode = mode;\n });\n },\n\n // ========== 线条绘制操作 ==========\n startLineDrawing: (material) => {\n set((state) => {\n state.mode = 'line-draw';\n state.lineDrawing = {\n isDrawing: true,\n material,\n startPoint: null,\n endPoint: null,\n };\n });\n },\n\n updateLineDrawing: (endPoint) => {\n set((state) => {\n if (state.lineDrawing.isDrawing) {\n state.lineDrawing.endPoint = endPoint;\n }\n });\n },\n\n endLineDrawing: () => {\n set((state) => {\n state.mode = 'select';\n state.lineDrawing = {\n isDrawing: false,\n material: null,\n startPoint: null,\n endPoint: null,\n };\n });\n },\n\n cancelLineDrawing: () => {\n set((state) => {\n state.mode = 'select';\n state.lineDrawing = {\n isDrawing: false,\n material: null,\n startPoint: null,\n endPoint: null,\n };\n });\n },\n\n // ========== 历史操作 ==========\n undo: () => {\n set((state) => {\n const lastEvent = state.history.past.pop();\n if (lastEvent) {\n state.history.future.push(lastEvent);\n }\n });\n },\n\n redo: () => {\n set((state) => {\n const nextEvent = state.history.future.pop();\n if (nextEvent) {\n state.history.past.push(nextEvent);\n }\n });\n },\n\n recordEvent: (event) => {\n set((state) => {\n state.history.past.push(event);\n state.history.future = [];\n });\n },\n\n // ========== 导入导出 ==========\n exportScheme: () => {\n const state = get();\n return {\n version: '1.1.0',\n nodes: state.nodes,\n materials: state.materials,\n viewport: state.viewport,\n metadata: {\n name: '未命名组态',\n description: '',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n },\n };\n },\n\n importScheme: (scheme) => {\n set((state) => {\n state.nodes = scheme.nodes || [];\n state.materials = scheme.materials || [];\n state.viewport = scheme.viewport || initialState.viewport;\n state.selectedNodeId = null;\n state.selectedStatusId = null;\n state.history = { past: [], future: [] };\n });\n },\n }))\n);\n","import type { Material, Node, NodeStatus } from '../types';\nimport { nanoid } from 'nanoid';\n\n// 初始化物料库数据\nexport const initMaterials: Material[] = [\n // 基础形状\n {\n id: nanoid(),\n name: '矩形',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"60\"><rect width=\"100\" height=\"60\" fill=\"#1890ff\" rx=\"4\"/></svg>`)}`,\n },\n {\n id: nanoid(),\n name: '圆形',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\"><circle cx=\"40\" cy=\"40\" r=\"38\" fill=\"#52c41a\"/></svg>`)}`,\n },\n {\n id: nanoid(),\n name: '圆角矩形',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"60\"><rect width=\"100\" height=\"60\" fill=\"#faad14\" rx=\"20\"/></svg>`)}`,\n },\n \n // 设备图标\n {\n id: nanoid(),\n name: '阀门',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"60\" height=\"60\"><path d=\"M10 20 L30 10 L50 20 L50 40 L30 50 L10 40 Z\" fill=\"#bfbfbf\" stroke=\"#595959\" stroke-width=\"2\"/><circle cx=\"30\" cy=\"30\" r=\"8\" fill=\"#1890ff\"/></svg>`)}`,\n },\n {\n id: nanoid(),\n name: '泵',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"60\" height=\"60\"><circle cx=\"30\" cy=\"35\" r=\"20\" fill=\"#bfbfbf\" stroke=\"#595959\" stroke-width=\"2\"/><rect x=\"25\" y=\"5\" width=\"10\" height=\"15\" fill=\"#595959\"/><path d=\"M30 20 L30 35 M20 30 Q30 45 40 30\" stroke=\"#595959\" stroke-width=\"2\" fill=\"none\"/></svg>`)}`,\n },\n {\n id: nanoid(),\n name: '罐体',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"60\" height=\"80\"><ellipse cx=\"30\" cy=\"10\" rx=\"25\" ry=\"10\" fill=\"#d9d9d9\" stroke=\"#595959\" stroke-width=\"2\"/><rect x=\"5\" y=\"10\" width=\"50\" height=\"60\" fill=\"#f0f0f0\" stroke=\"#595959\" stroke-width=\"2\"/><ellipse cx=\"30\" cy=\"70\" rx=\"25\" ry=\"10\" fill=\"#d9d9d9\" stroke=\"#595959\" stroke-width=\"2\"/></svg>`)}`,\n },\n \n // 文本\n {\n id: nanoid(),\n name: '文本标签',\n type: 'TEXT',\n content: {\n label: '标签',\n value: '值',\n labelStyle: {\n fontSize: 14,\n fontWeight: 'bold',\n color: '#262626',\n textAlign: 'left',\n },\n valueStyle: {\n fontSize: 14,\n fontWeight: 'normal',\n color: '#1890ff',\n textAlign: 'left',\n },\n },\n },\n \n // 线条 - 通用线条物料,通过属性配置实现不同线型\n {\n id: nanoid(),\n name: '线条',\n type: 'LINE',\n config: {\n thickness: 2,\n lineWeight: 2,\n color: '#262626',\n lineType: 'solid',\n },\n },\n];\n\n// 创建默认状态\nexport const createDefaultStatus = (material: Material): NodeStatus => ({\n id: nanoid(),\n name: '默认状态',\n expression: 'return true;',\n material: { ...material, id: nanoid() },\n bindCodes: [],\n});\n\n// 创建默认节点\nexport const createDefaultNode = (\n x: number,\n y: number,\n material?: Material\n): Node => {\n // 如果是群组物料,创建群组节点\n if (material?.type === 'CUSTOM' && material.config?.nodes) {\n const children = material.config.nodes.map((childNode: Node) => ({\n ...childNode,\n id: nanoid(), // 重新生成子节点ID\n }));\n \n // 计算群组边界\n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n \n children.forEach((child: Node) => {\n const cx = child.normalStyle.x || 0;\n const cy = child.normalStyle.y || 0;\n const cw = child.normalStyle.width || 0;\n const ch = child.normalStyle.height || 0;\n minX = Math.min(minX, cx);\n minY = Math.min(minY, cy);\n maxX = Math.max(maxX, cx + cw);\n maxY = Math.max(maxY, cy + ch);\n });\n \n // 调整子节点位置为相对坐标,并移除 scale 避免双重缩放\n const relativeChildren = children.map((child: Node) => ({\n ...child,\n normalStyle: {\n ...child.normalStyle,\n x: (child.normalStyle.x || 0) - minX,\n y: (child.normalStyle.y || 0) - minY,\n scale: undefined, // 移除 scale,由父级容器统一控制\n },\n }));\n \n return {\n id: nanoid(),\n name: material.name || '群组节点',\n type: 'group',\n normalStyle: {\n width: maxX - minX,\n height: maxY - minY,\n x,\n y,\n // 不设置背景和边框,由 NodeRenderer 控制\n },\n contentInfo: {\n statusList: [],\n currentStatusId: undefined,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n },\n children: relativeChildren,\n } as Node;\n }\n\n // 普通节点\n return {\n id: nanoid(),\n name: '新节点',\n type: 'normal',\n normalStyle: {\n width: 120,\n height: 100,\n x,\n y,\n background: 'transparent',\n padding: 8,\n },\n contentInfo: {\n statusList: material ? [createDefaultStatus(material)] : [],\n currentStatusId: undefined,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n },\n };\n};\n","import React, { useEffect, useState } from \"react\";\nimport { Collapse, Upload, Button, List, Empty, Typography, Image, Tag } from \"antd\";\nimport { UploadOutlined, DeleteOutlined, EditOutlined } from \"@ant-design/icons\";\nimport { useEditorStore } from \"../../store/editorStore\";\nimport { initMaterials } from \"../../utils/initData\";\nimport type { Material } from \"../../types\";\n\nconst { Panel } = Collapse;\nconst { Text } = Typography;\n\nexport const MaterialPanel: React.FC = () => {\n const {\n materials,\n addMaterial,\n removeMaterial,\n selectedStatusId,\n selectStatus,\n mode,\n lineDrawing,\n startLineDrawing,\n cancelLineDrawing,\n } = useEditorStore();\n const [activeKeys, setActiveKeys] = useState<string[]>([\n \"basic\",\n \"device\",\n \"text\",\n \"line\",\n ]);\n\n // 初始化默认物料\n // useEffect(() => {\n // if (materials.length === 0) {\n // initMaterials.forEach((m) => addMaterial(m));\n // }\n // }, []);\n\n // 处理 SVG 上传\n const handleUpload = (file: File) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n const src = e.target?.result as string;\n addMaterial({\n name: file.name.replace(\".svg\", \"\"),\n type: \"IMAGE\",\n src,\n } as Material);\n };\n reader.readAsDataURL(file);\n return false;\n };\n\n // 按类型分组物料\n const groupedMaterials = {\n basic: materials.filter((m) =>\n [\"矩形\", \"圆形\", \"圆角矩形\"].includes(m.name),\n ),\n device: materials.filter(\n (m) =>\n [\"阀门\", \"泵\", \"罐体\"].includes(m.name) ||\n (m.type === \"IMAGE\" &&\n ![\"矩形\", \"圆形\", \"圆角矩形\"].includes(m.name) &&\n m.name !== \"自定义\"),\n ),\n text: materials.filter((m) => m.type === \"TEXT\"),\n line: materials.filter((m) => m.type === \"LINE\"),\n group: materials.filter((m) => m.type === \"CUSTOM\" && m.config?.nodes),\n custom: materials.filter(\n (m) =>\n (m.type === \"CUSTOM\" && !m.config?.nodes) ||\n (m.type === \"IMAGE\" &&\n ![\"矩形\", \"圆形\", \"圆角矩形\", \"阀门\", \"泵\", \"罐体\"].includes(m.name)),\n ),\n };\n\n // 处理拖拽开始\n const handleDragStart = (e: React.DragEvent, material: Material) => {\n e.dataTransfer.effectAllowed = \"copy\";\n e.dataTransfer.setData(\"application/json\", JSON.stringify(material));\n const dragImage = e.currentTarget.querySelector(\n \".material-preview\",\n ) as HTMLElement;\n if (dragImage) {\n e.dataTransfer.setDragImage(dragImage, 20, 20);\n }\n };\n\n // 处理线条物料点击(进入绘制模式)\n const handleLineMaterialClick = (material: Material) => {\n if (material.type === \"LINE\") {\n startLineDrawing(material);\n }\n };\n\n // 渲染物料项\n const renderMaterialItem = (material: Material, isLineMode: boolean = false) => {\n // 物料库中的物料不再被\"选中\",而是用于拖拽创建节点或在属性面板中选择绑定到状态\n const isSelected = false;\n // 确保 isLineMode 是布尔值\n const isLineMaterial = isLineMode === true;\n // 只有当前物料是正在绘制的那条线时才显示\"绘制中\"\n const isDrawingLine = mode === \"line-draw\" && isLineMaterial && lineDrawing.material?.id === material.id;\n\n return (\n <List.Item\n key={material.id}\n draggable={!isLineMaterial}\n onDragStart={(e) => handleDragStart(e, material)}\n onClick={() => isLineMaterial && handleLineMaterialClick(material)}\n className={`\n rounded-lg transition-all duration-200 select-none\n ${isLineMaterial ? \"cursor-pointer\" : \"cursor-move\"}\n ${isSelected ? \"bg-blue-100 ring-2 ring-blue-400\" : \"hover:bg-gray-100\"}\n ${isDrawingLine ? \"bg-blue-50 ring-2 ring-blue-400\" : \"\"}\n `}\n actions={[\n isLineMaterial ? (\n <Button\n key=\"draw\"\n type=\"text\"\n size=\"small\"\n icon={<EditOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n handleLineMaterialClick(material);\n }}\n >\n 绘制\n </Button>\n ) : null,\n <Button\n key=\"delete\"\n type=\"text\"\n size=\"small\"\n danger\n icon={<DeleteOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n removeMaterial(material.id);\n }}\n />,\n ].filter(Boolean)}>\n <div className={`flex items-center gap-3 w-full py-2 ${isLineMaterial ? \"\" : \"pointer-events-none\"}`}>\n <div className=\"material-preview w-12 h-12 flex items-center justify-center bg-white rounded border border-gray-200\">\n {material.type === \"IMAGE\" && (material as any).src ? (\n <Image\n src={(material as any).src}\n alt={material.name}\n width={40}\n height={40}\n preview={false}\n />\n ) : material.type === \"TEXT\" ? (\n <span className=\"text-xs text-gray-500\">T</span>\n ) : material.type === \"LINE\" ? (\n <div className=\"w-8 h-0.5 bg-gray-400\" />\n ) : material.type === \"CUSTOM\" && material.config?.nodes ? (\n <span className=\"text-xs text-blue-500 font-bold\">G</span>\n ) : (\n <span className=\"text-xs text-gray-500\">?</span>\n )}\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <Text strong className=\"block truncate\">\n {material.name}\n </Text>\n <div className=\"flex items-center gap-1\">\n <Text type=\"secondary\" className=\"text-xs\">\n {material.type}\n </Text>\n {isDrawingLine && (\n <Tag color=\"blue\" className=\"text-xs\">\n 绘制中\n </Tag>\n )}\n </div>\n </div>\n </div>\n </List.Item>\n );\n };\n\n return (\n <div className=\"h-full flex flex-col bg-white border-r border-gray-200\">\n <div className=\"p-4 border-b border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-800\">物料库</h3>\n <Text type=\"secondary\" className=\"text-sm\">\n 拖拽物料到画布创建节点\n </Text>\n </div>\n\n <div className=\"p-3 border-b border-gray-200\">\n <Upload\n accept=\".svg\"\n beforeUpload={handleUpload}\n showUploadList={false}>\n <Button icon={<UploadOutlined />} block type=\"dashed\">\n 上传 SVG\n </Button>\n </Upload>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-2\">\n <Collapse\n activeKey={activeKeys}\n onChange={(keys) => setActiveKeys(keys as string[])}\n ghost\n expandIconPosition=\"end\">\n <Panel header=\"基础形状\" key=\"basic\">\n <List\n dataSource={groupedMaterials.basic}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n\n <Panel header=\"设备图标\" key=\"device\">\n <List\n dataSource={groupedMaterials.device}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n\n <Panel header=\"文本\" key=\"text\">\n <List\n dataSource={groupedMaterials.text}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n\n <Panel \n header={\n <div className=\"flex items-center justify-between\">\n <span>线条</span>\n {mode === \"line-draw\" && (\n <Tag color=\"blue\" className=\"text-xs\">\n 绘制模式\n </Tag>\n )}\n </div>\n } \n key=\"line\">\n <List\n dataSource={groupedMaterials.line}\n renderItem={(item) => renderMaterialItem(item, true)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n {mode === \"line-draw\" && (\n <div className=\"mt-2 p-2 bg-blue-50 rounded text-xs text-blue-600\">\n <div>点击线条物料开始绘制</div>\n <div>点击画布确定起点和终点</div>\n </div>\n )}\n </Panel>\n\n {groupedMaterials.group.length > 0 && (\n <Panel header=\"群组\" key=\"group\">\n <List\n dataSource={groupedMaterials.group}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n )}\n\n {groupedMaterials.custom.length > 0 && (\n <Panel header=\"自定义\" key=\"custom\">\n <List\n dataSource={groupedMaterials.custom}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n )}\n </Collapse>\n </div>\n\n <div className=\"p-3 border-t border-gray-200 bg-gray-50\">\n <Text type=\"secondary\" className=\"text-xs\">\n {mode === \"line-draw\" ? (\n <>\n 💡 提示:点击绘制线段,可连续绘制多段线,双击结束绘制,ESC 取消\n </>\n ) : (\n <>\n 💡 提示:拖拽物料到画布创建节点,点击线条物料进入绘制模式\n </>\n )}\n </Text>\n </div>\n </div>\n );\n};\n","import React, { useMemo, useState, useCallback, useRef, useEffect } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport type { Node, Material, NodeStatus, LineMaterial } from \"../../types\";\nimport { Image, Typography } from \"antd\";\n\nconst { Text } = Typography;\n\ninterface NodeRendererProps {\n node: Node;\n isSelected?: boolean;\n onClick?: (e: React.MouseEvent) => void;\n onMouseDown?: (e: React.MouseEvent) => void;\n // 外部数据,用于状态表达式计算\n data?: any;\n // 更新节点回调\n onUpdateNode?: (nodeId: string, updates: Partial<Node>) => void;\n // 当前缩放比例\n scale?: number;\n}\n\n// 执行状态表达式\nconst evaluateStatusExpression = (status: NodeStatus, data?: any): boolean => {\n try {\n //生成函数所需要的参数列表\n const params =\n data && Array.isArray(data)\n ? data.map((d: any, index: number) => d.paramsName)\n : [\"A\"]; //大写英文字符\n const fn = new Function(...params, status.expression);\n const result = fn(...data.map((d: any) => d.value));\n console.log(\n `Evaluating status [${status.name}] with data:`,\n data,\n \"Result:\",\n result,\n );\n return result === true;\n } catch (error) {\n console.warn(`状态表达式执行失败 [${status.name}]:`, error);\n return false;\n }\n};\n\n// 找到第一个满足条件的状态\nconst findActiveStatus = (\n statusList: NodeStatus[],\n data?: any,\n): NodeStatus | undefined => {\n for (const status of statusList) {\n console.log(status, \"status\");\n let bindData: Record<string, any>[] = [];\n if (Array.isArray(data)) {\n console.log(status.bindCodes, \"bindCodes\");\n bindData = data.filter((d: any) =>\n status.bindCodes?.includes(d.paramsCode),\n );\n } else {\n bindData = data;\n }\n if (evaluateStatusExpression(status, bindData)) {\n return status;\n }\n }\n return undefined;\n};\n\n// 从数据中获取字段值\nconst getDataValue = (\n data: any,\n valueSourceCode?: string,\n): { value: any; unit?: string } => {\n if (!valueSourceCode || !data) {\n return { value: undefined };\n }\n\n // 数据是数组格式:查找 paramsCode 匹配的项\n if (Array.isArray(data)) {\n const dataItem = data.find((d) => d.paramsCode === valueSourceCode);\n if (dataItem) {\n return {\n value: dataItem.value,\n unit: dataItem.unit,\n };\n }\n }\n // 数据是对象格式:直接取字段\n else if (typeof data === \"object\" && valueSourceCode in data) {\n return {\n value: data[valueSourceCode],\n unit: data.unit,\n };\n }\n\n return { value: undefined };\n};\n\n// 格式化数值,根据小数位配置\nconst formatValue = (value: any, decimals?: number): string => {\n if (value === undefined || value === null || value === \"\") return \"\";\n\n // -1 表示不格式化\n if (decimals === -1) return String(value);\n\n // 检查是否为有效数值\n const num = Number(value);\n if (isNaN(num)) return String(value);\n\n // 格式化小数位\n return num.toFixed(decimals ?? 2);\n};\n\n// 渲染物料\nconst renderMaterial = (material: Material, data?: any, isSelected?: boolean, node?: Node) => {\n switch (material.type) {\n case \"IMAGE\":\n const imageMaterial = material as any;\n const bgColor = imageMaterial.backgroundColor;\n const fillColor = imageMaterial.fillColor;\n\n // 如果是基本形状且有填充颜色,动态生成 SVG\n let src = imageMaterial.src;\n if (fillColor && src && src.includes('data:image/svg+xml')) {\n if (material.name === '矩形') {\n src = `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"60\"><rect width=\"100\" height=\"60\" fill=\"${fillColor}\" rx=\"4\"/></svg>`)}`;\n } else if (material.name === '圆形') {\n src = `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\"><circle cx=\"40\" cy=\"40\" r=\"38\" fill=\"${fillColor}\"/></svg>`)}`;\n } else if (material.name === '圆角矩形') {\n src = `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"60\"><rect width=\"100\" height=\"60\" fill=\"${fillColor}\" rx=\"20\"/></svg>`)}`;\n }\n }\n\n return (\n <div\n className=\"w-full h-full flex items-center justify-center overflow-hidden\"\n style={{ backgroundColor: bgColor }}\n >\n {src ? (\n <img\n src={src}\n alt={material.name}\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"contain\",\n }}\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center\">\n <span className=\"text-gray-400 text-xs\">无图片</span>\n </div>\n )}\n </div>\n );\n\n case \"TEXT\":\n const textMaterial = material as any;\n const {\n label,\n value: configValue,\n valueSourceCode,\n unit: configUnit,\n decimals,\n labelStyle,\n valueStyle,\n customStyle,\n } = textMaterial.content || {};\n\n // 如果有 valueSourceCode,从数据中获取值\n const { value: dataValue, unit: dataUnit } = valueSourceCode\n ? getDataValue(data, valueSourceCode)\n : { value: undefined, unit: undefined };\n\n // 优先使用数据中的值,否则使用配置的默认值\n const rawValue = dataValue !== undefined ? dataValue : configValue;\n // 格式化数值\n const displayValue = formatValue(rawValue, decimals);\n // 优先使用配置的单位,否则使用数据中的单位\n const displayUnit = configUnit || dataUnit || \"\";\n\n return (\n <div\n className=\"w-full h-full flex flex-col justify-center gap-1\"\n style={{ ...customStyle }}>\n {label && (\n <Text\n style={{\n fontSize: 14,\n fontWeight: \"bold\",\n color: \"#262626\",\n textAlign: \"left\",\n ...labelStyle,\n }}>\n {label}\n </Text>\n )}\n {displayValue && (\n <Text\n style={{\n fontSize: 14,\n color: \"#1890ff\",\n textAlign: \"left\",\n ...valueStyle,\n }}>\n {displayValue}\n {displayUnit ? ` ${displayUnit}` : \"\"}\n </Text>\n )}\n </div>\n );\n\n case \"LINE\":\n const lineMaterial = material as any;\n const {\n thickness = 2,\n color = \"#d9d9d9\",\n dashed = false,\n lineType = dashed ? \"dashed\" : \"solid\",\n lineWeight = thickness,\n // 起点和终点的相对坐标\n startX = 0,\n startY = 0,\n endX = 100,\n endY = 0,\n } = lineMaterial.config || {};\n\n // 根据线型计算 dash array\n const getDashArray = (type: string): string => {\n const baseWeight = Math.max(lineWeight, 1);\n switch (type) {\n case \"solid\":\n return \"\";\n case \"dashed\":\n return `${baseWeight * 8},${baseWeight * 4}`;\n case \"center\":\n return `${baseWeight * 12},${baseWeight * 3},${baseWeight * 2},${baseWeight * 3}`;\n case \"phantom\":\n return `${baseWeight * 12},${baseWeight * 3},${baseWeight * 2},${baseWeight * 3},${baseWeight * 2},${baseWeight * 3}`;\n case \"dot\":\n return `${baseWeight},${baseWeight * 3}`;\n case \"dash-dot\":\n return `${baseWeight * 8},${baseWeight * 3},${baseWeight},${baseWeight * 3}`;\n default:\n return \"\";\n }\n };\n\n const dashArray = getDashArray(lineType);\n\n // 选中时高亮颜色\n const strokeColor = isSelected ? \"#1890ff\" : color;\n\n // 直接使用保存的相对坐标画线\n // 这和预览线的逻辑一模一样:从起点画到终点\n return (\n <div className=\"w-full h-full relative\" style={{ overflow: \"visible\" }}>\n <svg\n className=\"absolute top-0 left-0\"\n width=\"100%\"\n height=\"100%\"\n style={{ overflow: \"visible\", pointerEvents: \"none\" }}>\n {/* 看不见的宽线用于捕获点击事件 */}\n <line\n x1={startX}\n y1={startY}\n x2={endX}\n y2={endY}\n stroke=\"transparent\"\n strokeWidth={Math.max(lineWeight, 10)}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ pointerEvents: \"stroke\", cursor: \"pointer\" }}\n />\n {/* 实际显示的线 */}\n <line\n x1={startX}\n y1={startY}\n x2={endX}\n y2={endY}\n stroke={strokeColor}\n strokeWidth={lineWeight}\n strokeDasharray={dashArray}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ pointerEvents: \"none\" }}\n />\n </svg>\n </div>\n );\n\n case \"CUSTOM\":\n const customMaterial = material as any;\n if (customMaterial.render) {\n return customMaterial.render({});\n }\n return (\n <div className=\"w-full h-full flex items-center justify-center bg-gray-100\">\n <span className=\"text-gray-400 text-xs\">自定义组件</span>\n </div>\n );\n\n default:\n return (\n <div className=\"w-full h-full flex items-center justify-center bg-gray-100\">\n <span className=\"text-gray-400 text-xs\">未知类型</span>\n </div>\n );\n }\n};\n\nconst NodeRendererComponent: React.FC<NodeRendererProps> = ({\n node,\n isSelected = false,\n onClick,\n onMouseDown,\n data,\n onUpdateNode,\n scale: canvasScale = 1,\n}) => {\n const { normalStyle, contentInfo, controlInfo } = node;\n const { statusList } = contentInfo;\n const { isClickable, isDraggable, isResizable } = controlInfo;\n\n // 使用 ref 存储 onClick,避免 memo 导致的旧闭包问题\n const onClickRef = useRef(onClick);\n onClickRef.current = onClick;\n\n // 线条端点拖拽状态\n const [draggingPoint, setDraggingPoint] = useState<'start' | 'end' | null>(null);\n const dragOriginRef = useRef<{\n mouseX: number;\n mouseY: number;\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n nodeX: number;\n nodeY: number;\n } | null>(null);\n // 端点拖拽过程中的最终计算结果,仅在 mouseup 时同步到 store\n const dragResultRef = useRef<{\n nodeX: number; nodeY: number;\n width: number; height: number;\n startX: number; startY: number;\n endX: number; endY: number;\n } | null>(null);\n // 缩放拖拽过程中的最终计算结果\n const resizeResultRef = useRef<{\n x: number; y: number;\n width: number; height: number;\n } | null>(null);\n const nodeRef = useRef<HTMLDivElement>(null);\n\n // 缩放拖拽状态\n const [resizing, setResizing] = useState<{\n corner: 'nw' | 'ne' | 'sw' | 'se';\n startX: number;\n startY: number;\n startWidth: number;\n startHeight: number;\n startNodeX: number;\n startNodeY: number;\n } | null>(null);\n\n // 旋转拖拽状态\n const [rotating, setRotating] = useState<{\n startX: number;\n startY: number;\n startAngle: number;\n centerX: number;\n centerY: number;\n } | null>(null);\n // 旋转过程中的实时角度(ref),防止 React 重渲染覆盖 DOM 操作的角度\n const rotatingAngleRef = useRef<number | null>(null);\n\n // 计算当前应该显示的状态(完全由表达式决定)\n const currentStatus = useMemo(() => {\n if (statusList.length === 0) return undefined;\n\n // 执行状态表达式,找到第一个返回 true 的状态\n const activeStatus = findActiveStatus(statusList, data);\n if (activeStatus) return activeStatus;\n\n // 如果没有状态满足条件,返回第一个状态作为默认\n return statusList[0];\n }, [statusList, data]);\n\n // 获取当前状态绑定的物料\n const currentMaterial = currentStatus?.material;\n\n // 判断当前物料是否是线条\n const isLine = currentMaterial?.type === 'LINE';\n\n // 获取线条配置\n const lineConfig = isLine ? (currentMaterial as LineMaterial).config : null;\n\n // 计算缩放比例\n const nodeScale = normalStyle.scale ?? 1;\n const scaledWidth = (normalStyle.width || 100) * nodeScale;\n const scaledHeight = (normalStyle.height || 100) * nodeScale;\n\n // 通过 DOM 测量推算画布实际缩放比,避免依赖可能不同步的 prop\n const getEffectiveCanvasScale = useCallback(() => {\n const canvasEl = nodeRef.current?.closest('[data-canvas=\"true\"]') as HTMLElement;\n if (!canvasEl) return canvasScale;\n const canvasRect = canvasEl.getBoundingClientRect();\n const logicalWidth = parseFloat(canvasEl.style.width);\n if (!logicalWidth) return canvasScale;\n return canvasRect.width / logicalWidth;\n }, [canvasScale]);\n\n // 处理端点拖拽开始:记录初始鼠标位置和线条配置快照\n const handlePointMouseDown = useCallback((e: React.MouseEvent, point: 'start' | 'end') => {\n e.stopPropagation();\n e.preventDefault();\n dragOriginRef.current = {\n mouseX: e.clientX,\n mouseY: e.clientY,\n startX: lineConfig?.startX || 0,\n startY: lineConfig?.startY || 0,\n endX: lineConfig?.endX || 0,\n endY: lineConfig?.endY || 0,\n nodeX: normalStyle.x || 0,\n nodeY: normalStyle.y || 0,\n };\n setDraggingPoint(point);\n }, [lineConfig, normalStyle.x, normalStyle.y]);\n\n // 处理端点拖拽:拖拽中仅操作 DOM,mouseup 时一次性同步到 store\n useEffect(() => {\n if (!draggingPoint || !isLine || !lineConfig || !onUpdateNode) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const origin = dragOriginRef.current;\n if (!origin || !nodeRef.current) return;\n\n const effectiveScale = getEffectiveCanvasScale();\n const totalDx = (e.clientX - origin.mouseX) / effectiveScale;\n const totalDy = (e.clientY - origin.mouseY) / effectiveScale;\n\n let newStartX = origin.startX;\n let newStartY = origin.startY;\n let newEndX = origin.endX;\n let newEndY = origin.endY;\n let newNodeX = origin.nodeX;\n let newNodeY = origin.nodeY;\n\n if (draggingPoint === 'start') {\n newStartX = origin.startX + totalDx;\n newStartY = origin.startY + totalDy;\n if (newStartX < 0) {\n newNodeX = origin.nodeX + newStartX;\n newEndX = origin.endX - newStartX;\n newStartX = 0;\n }\n if (newStartY < 0) {\n newNodeY = origin.nodeY + newStartY;\n newEndY = origin.endY - newStartY;\n newStartY = 0;\n }\n } else {\n newEndX = origin.endX + totalDx;\n newEndY = origin.endY + totalDy;\n if (newEndX < 0) {\n newNodeX = origin.nodeX + newEndX;\n newStartX = origin.startX - newEndX;\n newEndX = 0;\n }\n if (newEndY < 0) {\n newNodeY = origin.nodeY + newEndY;\n newStartY = origin.startY - newEndY;\n newEndY = 0;\n }\n }\n\n const minNodeSize = Math.max((lineConfig.lineWeight || 2) * 2, 4);\n const maxX = Math.max(newStartX, newEndX);\n const maxY = Math.max(newStartY, newEndY);\n const newWidth = Math.max(maxX, minNodeSize);\n const newHeight = Math.max(maxY, minNodeSize);\n\n // 存储计算结果供 mouseup 同步\n dragResultRef.current = {\n nodeX: newNodeX, nodeY: newNodeY,\n width: newWidth, height: newHeight,\n startX: newStartX, startY: newStartY,\n endX: newEndX, endY: newEndY,\n };\n\n // 直接操作 DOM —— 不触发 React 渲染\n const el = nodeRef.current;\n el.style.left = `${newNodeX}px`;\n el.style.top = `${newNodeY}px`;\n el.style.width = `${newWidth}px`;\n el.style.height = `${newHeight}px`;\n\n // 更新 SVG 线条坐标\n const lines = el.querySelectorAll('svg line');\n lines.forEach(line => {\n line.setAttribute('x1', String(newStartX));\n line.setAttribute('y1', String(newStartY));\n line.setAttribute('x2', String(newEndX));\n line.setAttribute('y2', String(newEndY));\n });\n\n // 更新端点手柄位置\n const startHandle = el.querySelector('[data-handle=\"start\"]') as HTMLElement;\n const endHandle = el.querySelector('[data-handle=\"end\"]') as HTMLElement;\n if (startHandle) {\n startHandle.style.left = `${newStartX - 6}px`;\n startHandle.style.top = `${newStartY - 6}px`;\n }\n if (endHandle) {\n endHandle.style.left = `${newEndX - 6}px`;\n endHandle.style.top = `${newEndY - 6}px`;\n }\n };\n\n const handleMouseUp = () => {\n const result = dragResultRef.current;\n if (result) {\n onUpdateNode(node.id, {\n normalStyle: {\n ...normalStyle,\n x: result.nodeX,\n y: result.nodeY,\n width: result.width,\n height: result.height,\n },\n contentInfo: {\n ...contentInfo,\n statusList: statusList.map(s => ({\n ...s,\n material: s.material.type === 'LINE' ? {\n ...s.material,\n config: {\n ...lineConfig,\n startX: result.startX,\n startY: result.startY,\n endX: result.endX,\n endY: result.endY,\n },\n } : s.material,\n })),\n },\n });\n }\n setDraggingPoint(null);\n dragOriginRef.current = null;\n dragResultRef.current = null;\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [draggingPoint, isLine, lineConfig, node.id, normalStyle, contentInfo, statusList, onUpdateNode, getEffectiveCanvasScale]);\n\n // 处理缩放拖拽:拖拽中仅操作 DOM,mouseup 时一次性同步到 store\n useEffect(() => {\n if (!resizing || !onUpdateNode) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!nodeRef.current) return;\n const effectiveScale = getEffectiveCanvasScale();\n const dx = (e.clientX - resizing.startX) / effectiveScale;\n const dy = (e.clientY - resizing.startY) / effectiveScale;\n\n let newWidth = resizing.startWidth;\n let newHeight = resizing.startHeight;\n let newX = resizing.startNodeX;\n let newY = resizing.startNodeY;\n\n switch (resizing.corner) {\n case 'se':\n newWidth = Math.max(20, resizing.startWidth + dx);\n newHeight = Math.max(20, resizing.startHeight + dy);\n break;\n case 'sw':\n newWidth = Math.max(20, resizing.startWidth - dx);\n newHeight = Math.max(20, resizing.startHeight + dy);\n newX = resizing.startNodeX + (resizing.startWidth - newWidth);\n break;\n case 'ne':\n newWidth = Math.max(20, resizing.startWidth + dx);\n newHeight = Math.max(20, resizing.startHeight - dy);\n newY = resizing.startNodeY + (resizing.startHeight - newHeight);\n break;\n case 'nw':\n newWidth = Math.max(20, resizing.startWidth - dx);\n newHeight = Math.max(20, resizing.startHeight - dy);\n newX = resizing.startNodeX + (resizing.startWidth - newWidth);\n newY = resizing.startNodeY + (resizing.startHeight - newHeight);\n break;\n }\n\n resizeResultRef.current = { x: newX, y: newY, width: newWidth, height: newHeight };\n\n const el = nodeRef.current;\n el.style.left = `${newX}px`;\n el.style.top = `${newY}px`;\n el.style.width = `${newWidth}px`;\n el.style.height = `${newHeight}px`;\n };\n\n const handleMouseUp = () => {\n const result = resizeResultRef.current;\n if (result) {\n onUpdateNode(node.id, {\n normalStyle: {\n ...normalStyle,\n x: result.x,\n y: result.y,\n width: result.width,\n height: result.height,\n },\n });\n }\n setResizing(null);\n resizeResultRef.current = null;\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [resizing, onUpdateNode, node.id, normalStyle, getEffectiveCanvasScale]);\n\n // 处理缩放开始\n const handleResizeStart = useCallback((e: React.MouseEvent, corner: 'nw' | 'ne' | 'sw' | 'se') => {\n e.stopPropagation();\n e.preventDefault();\n setResizing({\n corner,\n startX: e.clientX,\n startY: e.clientY,\n startWidth: normalStyle.width || 100,\n startHeight: normalStyle.height || 100,\n startNodeX: normalStyle.x || 0,\n startNodeY: normalStyle.y || 0,\n });\n }, [normalStyle.width, normalStyle.height, normalStyle.x, normalStyle.y]);\n\n // 处理旋转开始\n const handleRotateStart = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n\n // 计算节点中心点(屏幕坐标)\n const rect = nodeRef.current?.getBoundingClientRect();\n if (!rect) return;\n\n setRotating({\n startX: e.clientX,\n startY: e.clientY,\n startAngle: normalStyle.rotate || 0,\n centerX: rect.left + rect.width / 2,\n centerY: rect.top + rect.height / 2,\n });\n }, [normalStyle.rotate]);\n\n // 处理旋转拖拽:仅通过直接 DOM 操作 + ref 更新角度,不触发 React 渲染\n useEffect(() => {\n if (!rotating) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const dx = e.clientX - rotating.centerX;\n const dy = e.clientY - rotating.centerY;\n const angle = Math.atan2(dy, dx) * (180 / Math.PI);\n\n let newAngle = (angle + 90) % 360;\n if (newAngle < 0) newAngle += 360;\n\n // 同步更新 ref 和 DOM,确保 React 重渲染时 containerStyle 与 DOM 一致\n rotatingAngleRef.current = newAngle;\n if (nodeRef.current) {\n const extra = normalStyle.transform || '';\n nodeRef.current.style.transform = `rotate(${newAngle}deg) ${extra}`.trim();\n }\n };\n\n const handleMouseUp = () => {\n const finalAngle = rotatingAngleRef.current ?? rotating.startAngle;\n rotatingAngleRef.current = null;\n\n if (onUpdateNode) {\n onUpdateNode(node.id, {\n normalStyle: {\n ...normalStyle,\n rotate: Math.round(finalAngle),\n },\n });\n }\n setRotating(null);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [rotating, onUpdateNode, node.id, normalStyle]);\n\n // 判断是否为群组节点\n const isGroup = node.type === 'group';\n\n // 样式计算\n const containerStyle: CSSProperties = {\n position: \"absolute\",\n left: normalStyle.x || 0,\n top: normalStyle.y || 0,\n width: scaledWidth,\n height: scaledHeight,\n // 群组节点不显示背景和边框,只作为容器\n background: isGroup ? 'transparent' : (normalStyle.background || \"transparent\"),\n backgroundImage: isGroup ? undefined : (normalStyle.backgroundImage\n ? `url(${normalStyle.backgroundImage})`\n : undefined),\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n padding: Array.isArray(normalStyle.padding)\n ? normalStyle.padding.join(\"px \") + \"px\"\n : normalStyle.padding,\n margin: Array.isArray(normalStyle.margin)\n ? normalStyle.margin.join(\"px \") + \"px\"\n : normalStyle.margin,\n borderRadius: isGroup ? undefined : normalStyle.borderRadius,\n // 线条物料选中时不显示边框,而是通过高亮线条颜色来表示\n // 群组节点选中时显示边框,平时不显示\n border: isSelected && !isLine\n ? \"2px solid #1890ff\"\n : isLine\n ? \"none\"\n : isGroup\n ? \"none\"\n : normalStyle.border || \"1px dashed transparent\",\n // 线条节点需要捕获点击事件,但由内部 SVG 的透明线处理具体点击区域\n pointerEvents: \"auto\",\n opacity: normalStyle.opacity ?? 1,\n transform: `rotate(${rotatingAngleRef.current ?? (normalStyle.rotate || 0)}deg) ${normalStyle.transform || ''}`.trim(),\n transformOrigin: 'center center',\n zIndex: isSelected ? 1000 : (normalStyle.zIndex ?? 1),\n cursor: isDraggable && !draggingPoint ? \"move\" : isClickable ? \"pointer\" : \"default\",\n boxSizing: \"border-box\",\n // 选中、线条和群组节点使用 visible overflow,避免裁剪手柄\n overflow: isSelected || isLine || isGroup ? \"visible\" : \"hidden\",\n };\n\n // 获取线条端点位置用于显示拖拽手柄\n const startPointPos = lineConfig ? { x: lineConfig.startX || 0, y: lineConfig.startY || 0 } : { x: 0, y: 0 };\n const endPointPos = lineConfig ? { x: lineConfig.endX || 0, y: lineConfig.endY || 0 } : { x: 0, y: 0 };\n\n return (\n <div\n ref={nodeRef}\n data-node-id={node.id}\n style={containerStyle}\n onClick={(e) => {\n console.log('NodeRenderer onClick', node.id, 'isClickable:', isClickable);\n // 使用 ref 获取最新函数\n const latestOnClick = onClickRef.current;\n if (isClickable && latestOnClick && !draggingPoint && !resizing && !rotating) {\n e.stopPropagation();\n latestOnClick(e);\n }\n // 如果没有 onClick 处理器,不阻止传播,让父节点(如 group)处理\n }}\n onMouseDown={(e) => {\n if (isDraggable && onMouseDown && !draggingPoint) {\n onMouseDown(e);\n }\n }}>\n {/* 选中时的调整手柄 */}\n {isSelected && !isLine && !isGroup && (\n <>\n {/* 四角手柄 - 支持拖拽缩放 */}\n <div\n className=\"absolute top-0 left-0 w-3 h-3 bg-blue-500 border-2 border-white rounded-full\"\n style={{ zIndex: 9999, pointerEvents: 'auto', cursor: 'nw-resize', marginTop: '-6px', marginLeft: '-6px' }}\n onMouseDown={(e) => handleResizeStart(e, 'nw')}\n title=\"拖拽调整大小\"\n />\n <div\n className=\"absolute top-0 right-0 w-3 h-3 bg-blue-500 border-2 border-white rounded-full\"\n style={{ zIndex: 9999, pointerEvents: 'auto', cursor: 'ne-resize', marginTop: '-6px', marginRight: '-6px' }}\n onMouseDown={(e) => handleResizeStart(e, 'ne')}\n title=\"拖拽调整大小\"\n />\n <div\n className=\"absolute bottom-0 left-0 w-3 h-3 bg-blue-500 border-2 border-white rounded-full\"\n style={{ zIndex: 9999, pointerEvents: 'auto', cursor: 'sw-resize', marginBottom: '-6px', marginLeft: '-6px' }}\n onMouseDown={(e) => handleResizeStart(e, 'sw')}\n title=\"拖拽调整大小\"\n />\n <div\n className=\"absolute bottom-0 right-0 w-3 h-3 bg-blue-500 border-2 border-white rounded-full\"\n style={{ zIndex: 9999, pointerEvents: 'auto', cursor: 'se-resize', marginBottom: '-6px', marginRight: '-6px' }}\n onMouseDown={(e) => handleResizeStart(e, 'se')}\n title=\"拖拽调整大小\"\n />\n\n {/* 旋转手柄 */}\n <div\n className=\"absolute top-0 left-1/2 w-4 h-4 bg-green-500 border-2 border-white rounded-full\"\n style={{ zIndex: 9999, pointerEvents: 'auto', cursor: 'grab', marginTop: '-20px', transform: 'translateX(-50%)', boxShadow: '0 0 4px rgba(0,0,0,0.3)' }}\n onMouseDown={(e) => handleRotateStart(e)}\n title=\"拖拽旋转\"\n />\n {/* 旋转连接线 */}\n <div\n className=\"absolute top-0 left-1/2 w-0.5 h-3 bg-green-500\"\n style={{ zIndex: 9998, pointerEvents: 'none', marginTop: '-14px', transform: 'translateX(-50%)' }}\n />\n\n {/* 节点名称和当前状态标签 */}\n <div className=\"absolute -top-6 left-0 bg-blue-500 text-white text-xs px-2 py-0.5 rounded whitespace-nowrap\">\n {node.name} {currentStatus ? `(${currentStatus.name})` : \"\"}\n </div>\n </>\n )}\n\n {/* 线条端点拖拽手柄 */}\n {isSelected && isLine && lineConfig && onUpdateNode && (\n <>\n {/* 起点拖拽手柄 */}\n <div\n data-handle=\"start\"\n className=\"absolute w-3 h-3 bg-blue-500 border-2 border-white rounded-full cursor-move z-50\"\n style={{\n left: startPointPos.x - 6,\n top: startPointPos.y - 6,\n boxShadow: '0 0 4px rgba(0,0,0,0.3)',\n }}\n onMouseDown={(e) => handlePointMouseDown(e, 'start')}\n title=\"拖拽调整起点\"\n />\n {/* 终点拖拽手柄 */}\n <div\n data-handle=\"end\"\n className=\"absolute w-3 h-3 bg-blue-500 border-2 border-white rounded-full cursor-move z-50\"\n style={{\n left: endPointPos.x - 6,\n top: endPointPos.y - 6,\n boxShadow: '0 0 4px rgba(0,0,0,0.3)',\n }}\n onMouseDown={(e) => handlePointMouseDown(e, 'end')}\n title=\"拖拽调整终点\"\n />\n\n {/* 节点名称 */}\n <div className=\"absolute -top-6 left-0 bg-blue-500 text-white text-xs px-2 py-0.5 rounded whitespace-nowrap\">\n {node.name}\n </div>\n </>\n )}\n\n {/* 渲染当前状态绑定的物料 */}\n <div className=\"w-full h-full relative\">\n {currentMaterial ? (\n <div className=\"w-full h-full\">\n {renderMaterial(currentMaterial, data, isSelected, node)}\n </div>\n ) : !isGroup ? (\n // 只有非群组节点才显示\"无状态\"\n <div className=\"w-full h-full flex items-center justify-center text-gray-300 text-xs\">\n 无状态\n </div>\n ) : null}\n </div>\n\n {/* 渲染群组节点的子节点 */}\n {node.type === 'group' && node.children && (\n <div className=\"absolute inset-0 pointer-events-none\">\n {node.children.map(childNode => (\n <div key={childNode.id} className=\"pointer-events-auto\">\n <NodeRenderer\n node={childNode}\n isSelected={false}\n data={data}\n onUpdateNode={onUpdateNode}\n scale={canvasScale}\n />\n </div>\n ))}\n </div>\n )}\n </div>\n )\n};\n\n// 使用 React.memo 避免不必要的重渲染,提高拖拽性能\n// 注意:只在节点位置、选中状态、缩放比例、状态内容变化时才重渲染\n// 忽略 data、onClick、onMouseDown、onUpdateNode 等频繁变化的 props\nexport const NodeRenderer = React.memo(NodeRendererComponent, (prevProps, nextProps) => {\n const nodeA = prevProps.node;\n const nodeB = nextProps.node;\n\n // 比较节点位置和尺寸\n const nodeStyleEqual =\n nodeA.id === nodeB.id &&\n nodeA.normalStyle.x === nodeB.normalStyle.x &&\n nodeA.normalStyle.y === nodeB.normalStyle.y &&\n nodeA.normalStyle.width === nodeB.normalStyle.width &&\n nodeA.normalStyle.height === nodeB.normalStyle.height;\n\n // 比较节点内容引用(contentInfo 对象在更新时会创建新引用)\n const contentEqual = nodeA.contentInfo === nodeB.contentInfo;\n\n // 比较其他关键 props\n const otherPropsEqual =\n prevProps.isSelected === nextProps.isSelected &&\n prevProps.scale === nextProps.scale;\n\n return nodeStyleEqual && contentEqual && otherPropsEqual;\n});\n","import React, { useState, useRef, useEffect } from 'react';\n\ninterface ColorPickerProps {\n value?: string;\n onChange?: (color: { toHexString: () => string }) => void;\n onChangeComplete?: (color: { toHexString: () => string }) => void;\n}\n\nconst presetColors = [\n '#1890ff', '#52c41a', '#faad14', '#f5222d',\n '#722ed1', '#eb2f96', '#13c2c2', '#fa8c16',\n '#595959', '#262626', '#8c8c8c', '#d9d9d9',\n '#ffffff', '#000000', '#ff4d4f', '#73d13d',\n];\n\nexport const ColorPicker: React.FC<ColorPickerProps> = ({ \n value = '#1890ff', \n onChange,\n onChangeComplete \n}) => {\n const [visible, setVisible] = useState(false);\n const [innerValue, setInnerValue] = useState(value);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setInnerValue(value);\n }, [value]);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (popoverRef.current && !popoverRef.current.contains(e.target as Node)) {\n setVisible(false);\n onChangeComplete?.({ toHexString: () => innerValue });\n }\n };\n if (visible) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [visible, onChangeComplete, innerValue]);\n\n const handleColorChange = (color: string) => {\n setInnerValue(color);\n onChange?.({ toHexString: () => color });\n };\n\n return (\n <div ref={popoverRef} style={{ position: 'relative', display: 'inline-block' }}>\n <div\n onClick={() => setVisible(!visible)}\n style={{\n width: 28,\n height: 28,\n backgroundColor: innerValue,\n border: '1px solid #d9d9d9',\n borderRadius: 4,\n cursor: 'pointer',\n }}\n />\n {visible && (\n <div\n style={{\n position: 'absolute',\n top: 32,\n left: 0,\n zIndex: 1000,\n background: '#fff',\n padding: 8,\n borderRadius: 4,\n boxShadow: '0 2px 8px rgba(0,0,0,0.15)',\n border: '1px solid #f0f0f0',\n }}\n >\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(8, 1fr)', gap: 4 }}>\n {presetColors.map((color) => (\n <div\n key={color}\n onClick={() => {\n handleColorChange(color);\n setVisible(false);\n onChangeComplete?.({ toHexString: () => color });\n }}\n style={{\n width: 20,\n height: 20,\n backgroundColor: color,\n border: innerValue === color ? '2px solid #1890ff' : '1px solid #d9d9d9',\n borderRadius: 2,\n cursor: 'pointer',\n }}\n />\n ))}\n </div>\n <input\n type=\"color\"\n value={innerValue}\n onChange={(e) => handleColorChange(e.target.value)}\n onBlur={() => onChangeComplete?.({ toHexString: () => innerValue })}\n style={{ \n width: '100%', \n marginTop: 8,\n height: 28,\n border: '1px solid #d9d9d9',\n borderRadius: 4,\n }}\n />\n </div>\n )}\n </div>\n );\n};\n","import React, { useRef, useCallback, useState, useEffect, useMemo } from \"react\";\nimport {\n TransformWrapper,\n TransformComponent,\n type ReactZoomPanPinchRef,\n} from \"react-zoom-pan-pinch\";\nimport { Button, Space, Tooltip, Modal, Form, Input, InputNumber, Switch, Upload, message } from \"antd\";\nimport {\n ZoomInOutlined,\n ZoomOutOutlined,\n UndoOutlined,\n RedoOutlined,\n SelectOutlined,\n DragOutlined,\n EyeOutlined,\n DeleteOutlined,\n ExperimentOutlined,\n GroupOutlined,\n VerticalAlignTopOutlined,\n VerticalAlignBottomOutlined,\n AlignLeftOutlined,\n AlignRightOutlined,\n EditOutlined,\n SettingOutlined,\n CopyOutlined,\n UngroupOutlined,\n ColumnWidthOutlined,\n ColumnHeightOutlined,\n UploadOutlined,\n CloseOutlined,\n} from \"@ant-design/icons\";\nimport { useEditorStore } from \"../../store/editorStore\";\nimport { NodeRenderer } from \"../NodeRenderer\";\nimport { ColorPicker } from '../ColorPicker';\nimport { createDefaultNode, createDefaultStatus } from \"../../utils/initData\";\nimport type { Node, NormalNode, Material, LineMaterial, GroupNode } from \"../../types\";\nimport { nanoid } from \"nanoid\";\n\nconst { TextArea } = Input;\n\ninterface CanvasProps {\n defaultTestData?: any;\n}\n\nexport const Canvas: React.FC<CanvasProps> = ({ defaultTestData }) => {\n const transformRef = useRef<ReactZoomPanPinchRef>(null);\n const canvasRef = useRef<HTMLDivElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n const {\n nodes,\n selectedNodeId,\n mode,\n lineDrawing,\n viewport,\n canvas,\n setViewport,\n setCanvasConfig,\n addNode,\n selectNode,\n updateNode,\n removeNode,\n undo,\n redo,\n setMode,\n startLineDrawing,\n endLineDrawing,\n cancelLineDrawing,\n } = useEditorStore();\n // console.log('mode', mode);\n const [isDragOver, setIsDragOver] = useState(false);\n const [, forceUpdate] = useState({});\n const modeRef = useRef(mode);\n useEffect(() => {\n modeRef.current = mode;\n }, [mode]);\n // 拖拽状态\n const isDraggingRef = useRef(false);\n const dragStartRef = useRef({ x: 0, y: 0 });\n const dragOffsetRef = useRef({ x: 0, y: 0, newX: 0, newY: 0 });\n const draggingNodeRef = useRef<Node | null>(null);\n\n // 线条绘制状态\n const [linePreview, setLinePreview] = useState<{\n start: { x: number; y: number } | null;\n end: { x: number; y: number } | null;\n isDrawing: boolean;\n }>({ start: null, end: null, isDrawing: false });\n\n // 框选状态\n const [selectionBox, setSelectionBox] = useState<{\n start: { x: number; y: number } | null;\n end: { x: number; y: number } | null;\n }>({ start: null, end: null });\n const [selectedNodeIds, setSelectedNodeIds] = useState<string[]>([]);\n\n // 框选模式辅助:用于判断是否在框选过程中\n const isBoxSelectingRef = useRef(false);\n\n // 数据模拟\n const [dataModalVisible, setDataModalVisible] = useState(false);\n const [dataInput, setDataInput] = useState(\n JSON.stringify(defaultTestData, null, 2)\n );\n\n // 画布配置弹窗\n const [canvasConfigVisible, setCanvasConfigVisible] = useState(false);\n\n // 空格键临时拖拽模式\n const [isSpacePressed, setIsSpacePressed] = useState(false);\n\n // 坐标转换:屏幕坐标 → 画布逻辑坐标\n // 通过 DOM 实际尺寸推算有效缩放比,避免依赖可能不同步的 ref state\n const getCanvasPosition = useCallback((clientX: number, clientY: number) => {\n if (!canvasRef.current) return { x: 0, y: 0 };\n\n const canvasRect = canvasRef.current.getBoundingClientRect();\n\n const mouseXInCanvas = clientX - canvasRect.left;\n const mouseYInCanvas = clientY - canvasRect.top;\n\n const effectiveScaleX = canvasRect.width / canvas.width;\n const effectiveScaleY = canvasRect.height / canvas.height;\n\n const x = mouseXInCanvas / effectiveScaleX;\n const y = mouseYInCanvas / effectiveScaleY;\n return { x: Math.round(x), y: Math.round(y) };\n }, [canvas.width, canvas.height]);\n\n // 坐标转换(仅用于框选)- 复用同样的 DOM 推算逻辑\n const getBoxSelectionPosition = useCallback((clientX: number, clientY: number) => {\n return getCanvasPosition(clientX, clientY);\n }, [getCanvasPosition]);\n\n // 创建线条节点\n const createLineNode = useCallback(\n (start: { x: number; y: number }, end: { x: number; y: number }, continueDrawing: boolean = true) => {\n if (!lineDrawing.material) return;\n\n const material = lineDrawing.material as LineMaterial;\n const config = material.config || {};\n const lineWeight = config.lineWeight || config.thickness || 2;\n\n const x = Math.min(start.x, end.x);\n const y = Math.min(start.y, end.y);\n\n const relativeStartX = Math.round(start.x - x);\n const relativeStartY = Math.round(start.y - y);\n const relativeEndX = Math.round(end.x - x);\n const relativeEndY = Math.round(end.y - y);\n\n const minNodeSize = Math.max(lineWeight * 2, 4);\n const nodeWidth = Math.max(Math.abs(start.x - end.x), minNodeSize);\n const nodeHeight = Math.max(Math.abs(start.y - end.y), minNodeSize);\n\n const lineMaterial: LineMaterial = {\n ...material,\n id: nanoid(),\n config: {\n color: config.color,\n lineWeight,\n thickness: lineWeight,\n lineType: config.lineType,\n startX: relativeStartX,\n startY: relativeStartY,\n endX: relativeEndX,\n endY: relativeEndY,\n },\n };\n\n const newNode: Node = {\n id: nanoid(),\n name: `${material.name}_${Date.now()}`,\n type: 'normal',\n normalStyle: {\n width: nodeWidth,\n height: nodeHeight,\n x,\n y,\n background: 'transparent',\n },\n contentInfo: {\n statusList: [createDefaultStatus(lineMaterial)],\n currentStatusId: undefined,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n },\n };\n\n addNode(newNode, false);\n\n if (continueDrawing) {\n const nextStart = { x: end.x, y: end.y };\n setLinePreview({\n start: nextStart,\n end: { ...nextStart },\n isDrawing: true,\n });\n } else {\n setLinePreview({ start: null, end: null, isDrawing: false });\n endLineDrawing();\n }\n },\n [lineDrawing.material, addNode, endLineDrawing]\n );\n\n // 视口变换\n const handleTransform = useCallback(() => {\n const state = transformRef.current?.state;\n if (state) {\n setViewport({\n scale: state.scale,\n positionX: state.positionX,\n positionY: state.positionY,\n });\n }\n }, [setViewport]);\n\n // 画布点击\n const handleCanvasClick = useCallback(\n (e: React.MouseEvent) => {\n if (isDraggingRef.current) return;\n // 框选模式下点击画布不清空选择\n if (mode === 'box-select') return;\n if (\n e.target === canvasRef.current ||\n (e.target as HTMLElement).dataset?.canvas === \"true\"\n ) {\n selectNode(null);\n setSelectedNodeIds([]);\n }\n },\n [selectNode, mode]\n );\n\n // 画布鼠标按下(线条绘制/框选)\n const handleCanvasMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (e.button !== 0) return;\n\n // 线条绘制模式\n if (mode === \"line-draw\" && lineDrawing.material) {\n e.stopPropagation();\n const pos = getCanvasPosition(e.clientX, e.clientY);\n if (!linePreview.isDrawing) {\n setLinePreview({ start: pos, end: pos, isDrawing: true });\n } else if (linePreview.start) {\n createLineNode(linePreview.start, pos, true);\n }\n return;\n }\n\n // 框选模式(空格键按下时进入拖拽模式,不执行框选)\n if (mode === 'box-select' && !isSpacePressed) {\n const pos = getBoxSelectionPosition(e.clientX, e.clientY);\n setSelectionBox({ start: pos, end: pos });\n setSelectedNodeIds([]);\n e.preventDefault();\n e.stopPropagation();\n }\n },\n [mode, lineDrawing.material, linePreview.isDrawing, linePreview.start, isSpacePressed, createLineNode, getCanvasPosition, getBoxSelectionPosition]\n );\n\n // 画布双击(结束线条绘制)\n const handleCanvasDoubleClick = useCallback(\n (e: React.MouseEvent) => {\n if (mode !== \"line-draw\" || !lineDrawing.material) return;\n if (linePreview.isDrawing && linePreview.start) {\n const pos = getCanvasPosition(e.clientX, e.clientY);\n createLineNode(linePreview.start, pos, false);\n }\n },\n [mode, lineDrawing.material, linePreview.isDrawing, linePreview.start, createLineNode, getCanvasPosition]\n );\n\n // 拖拽悬停\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"copy\";\n setIsDragOver(true);\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n }, []);\n\n // 放置物料\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n if (!canvasRef.current || mode !== \"select\") return;\n\n try {\n const data = e.dataTransfer.getData(\"application/json\");\n if (!data) return;\n const material = JSON.parse(data);\n const pos = getCanvasPosition(e.clientX, e.clientY);\n const x = pos.x - 50;\n const y = pos.y - 50;\n const newNode = createDefaultNode(x, y, material);\n addNode(newNode);\n } catch (error) {\n console.error(\"Failed to parse dropped material:\", error);\n }\n },\n [mode, addNode, getCanvasPosition]\n );\n\n // 节点拖拽开始\n const handleNodeMouseDown = useCallback(\n (e: React.MouseEvent, node: Node) => {\n // 选择模式或框选模式下都可以拖拽\n if ((mode !== \"select\" && mode !== \"box-select\") || !node.controlInfo.isDraggable) return;\n e.stopPropagation();\n selectNode(node.id);\n isDraggingRef.current = true;\n dragStartRef.current = { x: e.clientX, y: e.clientY };\n dragOffsetRef.current = {\n x: node.normalStyle.x || 0,\n y: node.normalStyle.y || 0,\n newX: node.normalStyle.x || 0,\n newY: node.normalStyle.y || 0,\n };\n draggingNodeRef.current = node;\n e.preventDefault();\n },\n [mode, selectNode]\n );\n\n // 鼠标事件\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n // 拖拽\n if (isDraggingRef.current && selectedNodeId && draggingNodeRef.current) {\n if (!canvasRef.current) return;\n const canvasRect = canvasRef.current.getBoundingClientRect();\n const effectiveScaleX = canvasRect.width / canvas.width;\n const effectiveScaleY = canvasRect.height / canvas.height;\n const screenDx = e.clientX - dragStartRef.current.x;\n const screenDy = e.clientY - dragStartRef.current.y;\n const canvasDx = screenDx / effectiveScaleX;\n const canvasDy = screenDy / effectiveScaleY;\n const newX = dragOffsetRef.current.x + canvasDx;\n const newY = dragOffsetRef.current.y + canvasDy;\n const nodeEl = document.querySelector(\n `[data-node-id=\"${selectedNodeId}\"]`\n ) as HTMLElement;\n if (nodeEl) {\n nodeEl.style.left = `${newX}px`;\n nodeEl.style.top = `${newY}px`;\n }\n dragOffsetRef.current.newX = newX;\n dragOffsetRef.current.newY = newY;\n }\n // 框选\n if (mode === 'box-select' && selectionBox.start) {\n const pos = getBoxSelectionPosition(e.clientX, e.clientY);\n setSelectionBox((prev) => ({ ...prev, end: pos }));\n }\n // 线条预览\n if (mode === \"line-draw\" && linePreview.isDrawing) {\n const pos = getCanvasPosition(e.clientX, e.clientY);\n setLinePreview((prev) => ({ ...prev, end: pos }));\n }\n };\n\n const handleMouseUp = () => {\n if (isDraggingRef.current && selectedNodeId && draggingNodeRef.current) {\n const store = useEditorStore.getState();\n const newX = dragOffsetRef.current.newX ?? dragOffsetRef.current.x;\n const newY = dragOffsetRef.current.newY ?? dragOffsetRef.current.y;\n store.updateNode(selectedNodeId, {\n normalStyle: {\n ...draggingNodeRef.current.normalStyle,\n x: newX,\n y: newY,\n },\n });\n }\n isDraggingRef.current = false;\n draggingNodeRef.current = null;\n forceUpdate({});\n // 框选结束,计算选中的节点\n if (mode === 'box-select' && selectionBox.start && selectionBox.end) {\n const minX = Math.min(selectionBox.start.x, selectionBox.end.x);\n const maxX = Math.max(selectionBox.start.x, selectionBox.end.x);\n const minY = Math.min(selectionBox.start.y, selectionBox.end.y);\n const maxY = Math.max(selectionBox.start.y, selectionBox.end.y);\n\n const selectedIds = nodes\n .filter((node) => {\n const nodeX = node.normalStyle.x || 0;\n const nodeY = node.normalStyle.y || 0;\n const nodeW = node.normalStyle.width || 0;\n const nodeH = node.normalStyle.height || 0;\n const centerX = nodeX + nodeW / 2;\n const centerY = nodeY + nodeH / 2;\n return centerX >= minX && centerX <= maxX && centerY >= minY && centerY <= maxY;\n })\n .map((node) => node.id);\n\n setSelectedNodeIds(selectedIds);\n setSelectionBox({ start: null, end: null });\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && mode === \"line-draw\") {\n setLinePreview({ start: null, end: null, isDrawing: false });\n cancelLineDrawing();\n }\n if (e.key === \"Delete\") {\n if (selectedNodeId) removeNode(selectedNodeId);\n else if (selectedNodeIds.length > 0) {\n selectedNodeIds.forEach((id) => removeNode(id));\n setSelectedNodeIds([]);\n }\n }\n if (e.ctrlKey && e.key === \"z\") {\n e.preventDefault();\n undo();\n }\n if (e.ctrlKey && e.key === \"y\") {\n e.preventDefault();\n redo();\n }\n // 空格键按下:进入临时拖拽模式(所有模式都支持)\n if (e.key === \" \" && !isSpacePressed) {\n e.preventDefault();\n setIsSpacePressed(true);\n }\n };\n\n const handleKeyUp = (e: KeyboardEvent) => {\n // 空格键松开:退出临时拖拽模式\n if (e.key === \" \" && isSpacePressed) {\n setIsSpacePressed(false);\n }\n };\n\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n window.addEventListener(\"keydown\", handleKeyDown);\n window.addEventListener(\"keyup\", handleKeyUp);\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n window.removeEventListener(\"keydown\", handleKeyDown);\n window.removeEventListener(\"keyup\", handleKeyUp);\n };\n }, [\n selectedNodeId,\n\n selectionBox,\n mode,\n linePreview.isDrawing,\n selectedNodeIds,\n nodes,\n canvas.width,\n canvas.height,\n removeNode,\n undo,\n isSpacePressed,\n redo,\n cancelLineDrawing,\n getCanvasPosition,\n getBoxSelectionPosition,\n setSelectedNodeIds,\n ]);\n\n // 复制节点\n const handleCopyNodes = useCallback(() => {\n // 确定要复制的节点列表\n const nodesToCopy = selectedNodeIds.length > 0\n ? selectedNodeIds.map((id) => nodes.find((n) => n.id === id)).filter(Boolean) as Node[]\n : selectedNodeId\n ? [nodes.find((n) => n.id === selectedNodeId)].filter(Boolean) as Node[]\n : [];\n\n if (nodesToCopy.length === 0) return;\n\n // 复制每个节点,并向右下方偏移20px\n const newNodeIds: string[] = [];\n nodesToCopy.forEach((node) => {\n const newNode = {\n ...node,\n id: nanoid(),\n name: `${node.name}_副本`,\n normalStyle: {\n ...node.normalStyle,\n x: (node.normalStyle.x || 0) + 20,\n y: (node.normalStyle.y || 0) + 20,\n },\n };\n addNode(newNode);\n newNodeIds.push(newNode.id);\n });\n\n // 选中新复制的节点\n if (newNodeIds.length === 1) {\n selectNode(newNodeIds[0]);\n } else {\n setSelectedNodeIds(newNodeIds);\n }\n }, [selectedNodeId, selectedNodeIds, nodes, addNode, selectNode, setSelectedNodeIds]);\n\n // 组合选中的节点\n const handleGroupNodes = useCallback(() => {\n if (selectedNodeIds.length < 2) return;\n const selectedNodes: Node[] = [];\n for (let i = 0; i < selectedNodeIds.length; i++) {\n const id = selectedNodeIds[i];\n const node = nodes.find((n) => n.id === id);\n if (!node) continue;\n if (node?.type === \"group\") {\n //拆分放入\n const children = node.children;\n // 将子节点从相对坐标转换为绝对坐标\n children.forEach((child) => selectedNodes.push({\n ...child,\n normalStyle: {\n ...child.normalStyle,\n x: (node.normalStyle.x || 0) + (child.normalStyle.x || 0),\n y: (node.normalStyle.y || 0) + (child.normalStyle.y || 0),\n },\n }));\n // 删除群组节点\n removeNode(id);\n continue;\n }\n selectedNodes.push(node);\n }\n if (selectedNodes.length < 2) return;\n\n // 计算边界框\n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n\n selectedNodes.forEach((node) => {\n const x = node.normalStyle.x || 0;\n const y = node.normalStyle.y || 0;\n const w = node.normalStyle.width || 0;\n const h = node.normalStyle.height || 0;\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x + w);\n maxY = Math.max(maxY, y + h);\n });\n\n // 调整子节点位置为相对坐标\n const children = selectedNodes.map((node) => ({\n ...node,\n normalStyle: {\n ...node.normalStyle,\n x: (node.normalStyle.x || 0) - minX,\n y: (node.normalStyle.y || 0) - minY,\n },\n }));\n\n // 创建群组节点\n const groupNode: GroupNode = {\n id: nanoid(),\n name: `群组_${Date.now()}`,\n type: \"group\",\n normalStyle: {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n background: \"transparent\",\n },\n contentInfo: {\n statusList: [],\n currentStatusId: undefined,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n },\n children,\n };\n\n // 删除原子节点并添加群组节点\n selectedNodeIds.forEach((id) => removeNode(id));\n addNode(groupNode);\n setSelectedNodeIds([]);\n selectNode(groupNode.id);\n }, [selectedNodeIds, nodes, removeNode, addNode, selectNode]);\n\n // 解除组合\n const handleUngroupNodes = useCallback(() => {\n // 获取选中的群组节点\n const groupNodesToUngroup = selectedNodeIds.length > 0\n ? selectedNodeIds\n .map((id) => nodes.find((n) => n.id === id))\n .filter((n): n is GroupNode => !!n && n.type === \"group\")\n : selectedNodeId\n ? [nodes.find((n) => n.id === selectedNodeId)].filter((n): n is GroupNode => !!n && n.type === \"group\")\n : [];\n\n if (groupNodesToUngroup.length === 0) return;\n\n // 解除每个群组节点\n groupNodesToUngroup.forEach((groupNode) => {\n if (!groupNode.children || groupNode.children.length === 0) return;\n\n // 将子节点从相对坐标转换为绝对坐标\n const absoluteChildren = groupNode.children.map((child) => ({\n ...child,\n normalStyle: {\n ...child.normalStyle,\n x: (groupNode.normalStyle.x || 0) + (child.normalStyle.x || 0),\n y: (groupNode.normalStyle.y || 0) + (child.normalStyle.y || 0),\n },\n }));\n\n // 删除群组节点并添加子节点\n removeNode(groupNode.id);\n absoluteChildren.forEach((child) => addNode(child));\n });\n\n // 清空选中状态\n setSelectedNodeIds([]);\n selectNode(null);\n }, [selectedNodeId, selectedNodeIds, nodes, removeNode, addNode, selectNode, setSelectedNodeIds]);\n\n // 分布节点\n const handleDistributeNodes = useCallback(\n (direction: \"horizontal\" | \"vertical\") => {\n if (selectedNodeIds.length < 2) return;\n\n const selectedNodes = selectedNodeIds\n .map((id) => nodes.find((n) => n.id === id))\n .filter((n): n is Node => !!n && n.type !== \"group\");\n\n if (selectedNodes.length < 2) return;\n\n // 计算边界\n let minX = Infinity, maxX = -Infinity;\n let minY = Infinity, maxY = -Infinity;\n\n selectedNodes.forEach((node) => {\n const x = node.normalStyle.x || 0;\n const y = node.normalStyle.y || 0;\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n\n // 按坐标排序,便于均匀分布\n const sortedNodes = [...selectedNodes].sort((a, b) => {\n if (direction === \"horizontal\") {\n return (a.normalStyle.x || 0) - (b.normalStyle.x || 0);\n } else {\n return (a.normalStyle.y || 0) - (b.normalStyle.y || 0);\n }\n });\n\n // 计算间隔\n const count = sortedNodes.length;\n if (direction === \"horizontal\") {\n const totalWidth = maxX - minX;\n const step = totalWidth / (count - 1);\n sortedNodes.forEach((node, index) => {\n const newX = minX + step * index;\n updateNode(node.id, {\n normalStyle: { ...node.normalStyle, x: newX },\n });\n });\n } else {\n const totalHeight = maxY - minY;\n const step = totalHeight / (count - 1);\n sortedNodes.forEach((node, index) => {\n const newY = minY + step * index;\n updateNode(node.id, {\n normalStyle: { ...node.normalStyle, y: newY },\n });\n });\n }\n },\n [selectedNodeIds, nodes, updateNode]\n );\n\n // 对齐节点\n const handleAlignNodes = useCallback(\n (direction: \"left\" | \"right\" | \"top\" | \"bottom\") => {\n if (selectedNodeIds.length < 2) return;\n const store = useEditorStore.getState();\n const selectedNodes = selectedNodeIds\n .map((id) => nodes.find((n) => n.id === id))\n .filter((n): n is Node => !!n && n.type !== \"group\");\n if (selectedNodes.length < 2) return;\n\n let alignValue = 0;\n switch (direction) {\n case \"left\":\n alignValue = Math.min(...selectedNodes.map((n) => n.normalStyle.x || 0));\n break;\n case \"right\":\n alignValue = Math.max(\n ...selectedNodes.map((n) => (n.normalStyle.x || 0) + (n.normalStyle.width || 0))\n );\n break;\n case \"top\":\n alignValue = Math.min(...selectedNodes.map((n) => n.normalStyle.y || 0));\n break;\n case \"bottom\":\n alignValue = Math.max(\n ...selectedNodes.map((n) => (n.normalStyle.y || 0) + (n.normalStyle.height || 0))\n );\n break;\n }\n\n selectedNodes.forEach((node) => {\n let newX = node.normalStyle.x || 0;\n let newY = node.normalStyle.y || 0;\n switch (direction) {\n case \"left\":\n newX = alignValue;\n break;\n case \"right\":\n newX = alignValue - (node.normalStyle.width || 0);\n break;\n case \"top\":\n newY = alignValue;\n break;\n case \"bottom\":\n newY = alignValue - (node.normalStyle.height || 0);\n break;\n }\n store.updateNode(node.id, {\n normalStyle: { ...node.normalStyle, x: newX, y: newY },\n });\n });\n },\n [selectedNodeIds, nodes]\n );\n\n // 工具栏按钮\n const toolbarButtons = [\n {\n icon: <SelectOutlined />,\n title: \"选择模式\",\n active: mode === \"select\",\n onClick: () => {\n setMode(\"select\");\n },\n },\n {\n icon: <GroupOutlined />,\n title: \"框选模式\",\n active: mode === \"box-select\",\n onClick: () => {\n setMode(\"box-select\");\n setSelectedNodeIds([]);\n },\n },\n {\n icon: <DragOutlined />,\n title: \"拖拽模式\",\n active: mode === \"drag\",\n onClick: () => {\n setMode(\"drag\");\n },\n },\n {\n icon: <EditOutlined />,\n title: \"线条绘制\",\n active: mode === \"line-draw\",\n onClick: () => {\n setMode(\"line-draw\");\n },\n },\n {\n icon: <EyeOutlined />,\n title: \"预览模式\",\n active: mode === \"preview\",\n onClick: () => {\n setMode(\"preview\");\n },\n },\n ];\n\n const actionButtons = useMemo(\n () => [\n { icon: <UndoOutlined />, title: \"撤销 (Ctrl+Z)\", onClick: undo },\n { icon: <RedoOutlined />, title: \"重做 (Ctrl+Y)\", onClick: redo },\n {\n icon: <CopyOutlined />,\n title: \"复制节点\",\n disabled: !selectedNodeId && selectedNodeIds.length === 0,\n onClick: handleCopyNodes,\n },\n {\n icon: <GroupOutlined />,\n title: \"组合选中节点\",\n disabled: selectedNodeIds.length < 2,\n onClick: handleGroupNodes,\n },\n {\n icon: <UngroupOutlined />,\n title: \"解除组合\",\n disabled: !selectedNodeId && selectedNodeIds.length === 0,\n onClick: handleUngroupNodes,\n },\n {\n icon: <AlignLeftOutlined />,\n title: \"左对齐\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleAlignNodes(\"left\"),\n },\n {\n icon: <AlignRightOutlined />,\n title: \"右对齐\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleAlignNodes(\"right\"),\n },\n {\n icon: <VerticalAlignTopOutlined />,\n title: \"上对齐\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleAlignNodes(\"top\"),\n },\n {\n icon: <VerticalAlignBottomOutlined />,\n title: \"下对齐\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleAlignNodes(\"bottom\"),\n },\n {\n icon: <ColumnWidthOutlined />,\n title: \"水平分布\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleDistributeNodes(\"horizontal\"),\n },\n {\n icon: <ColumnHeightOutlined />,\n title: \"垂直分布\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleDistributeNodes(\"vertical\"),\n },\n {\n icon: <SettingOutlined />,\n title: \"画布配置\",\n onClick: () => setCanvasConfigVisible(true),\n },\n {\n icon: <ExperimentOutlined />,\n title: \"数据模拟\",\n type: \"primary\" as const,\n onClick: () => setDataModalVisible(true),\n },\n {\n icon: <DeleteOutlined />,\n title: \"删除选中 (Delete)\",\n disabled: !selectedNodeId && selectedNodeIds.length === 0,\n onClick: () => {\n if (selectedNodeId) removeNode(selectedNodeId);\n else if (selectedNodeIds.length > 0) {\n selectedNodeIds.forEach((id) => removeNode(id));\n setSelectedNodeIds([]);\n }\n },\n },\n ],\n [\n undo,\n redo,\n mode,\n setMode,\n setSelectedNodeIds,\n selectedNodeIds,\n handleGroupNodes,\n handleUngroupNodes,\n handleCopyNodes,\n handleAlignNodes,\n handleDistributeNodes,\n setCanvasConfigVisible,\n setDataModalVisible,\n selectedNodeId,\n removeNode,\n ]\n );\n\n //框选模式下增加键盘监听平移\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n if (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\" || e.key === \"ArrowUp\" || e.key === \"ArrowDown\") {\n const selectedNodes = selectedNodeIds.map((id) => nodes.find((n) => n.id === id));\n selectedNodes.forEach((node) => {\n if (node) {\n updateNode(node.id, {\n normalStyle: {\n ...node.normalStyle,\n x: (node.normalStyle.x || 0) - 2 * (e.key === \"ArrowLeft\" ? 1 : e.key === \"ArrowRight\" ? -1 : 0),\n y: (node.normalStyle.y || 0) - 2 * (e.key === \"ArrowUp\" ? 1 : e.key === \"ArrowDown\" ? -1 : 0),\n },\n });\n }\n });\n }\n },\n [selectedNodeIds, nodes, updateNode]\n );\n useEffect(() => {\n if (mode === \"box-select\") {\n document.addEventListener(\"keydown\", handleKeyDown);\n }\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [mode, handleKeyDown]);\n\n return (\n <div className=\"flex-1 flex flex-col h-full bg-gray-100\">\n {/* 工具栏 */}\n <div className=\"h-12 bg-white border-b border-gray-200 flex items-center justify-between px-4\">\n <Space>\n {toolbarButtons.map((btn) => (\n <Tooltip key={btn.title} title={btn.title}>\n <Button\n type={btn.active ? \"primary\" : \"default\"}\n icon={btn.icon}\n onClick={btn.onClick}\n />\n </Tooltip>\n ))}\n </Space>\n <Space>\n {actionButtons.map((btn) => (\n <Tooltip key={btn.title} title={btn.title}>\n <Button\n type={(btn as any).active ? \"primary\" : btn.type || \"default\"}\n icon={btn.icon}\n onClick={btn.onClick}\n disabled={btn.disabled}\n />\n </Tooltip>\n ))}\n </Space>\n </div>\n\n {/* 画布 */}\n <div ref={wrapperRef} className=\"flex-1 relative\">\n <TransformWrapper\n ref={transformRef}\n initialScale={1}\n initialPositionX={0}\n initialPositionY={0}\n minScale={0.5}\n maxScale={5}\n onTransformed={handleTransform}\n limitToBounds={false}\n centerZoomedOut={false}\n panning={{ disabled: !isSpacePressed && (mode === 'select' || mode === 'line-draw' || mode === 'box-select'), velocityDisabled: true }}\n wheel={{ disabled: false, step: 0.1 }}\n pinch={{ disabled: false }}\n doubleClick={{ disabled: true }}\n >\n {({ zoomIn, zoomOut, resetTransform }) => (\n <>\n {/* 缩放控制 */}\n <div className=\"absolute bottom-4 right-4 z-10 bg-white rounded-lg shadow-lg p-2\">\n <Space direction=\"vertical\">\n <Tooltip title=\"放大\">\n <Button icon={<ZoomInOutlined />} onClick={() => zoomIn()} />\n </Tooltip>\n <Tooltip title=\"缩小\">\n <Button icon={<ZoomOutOutlined />} onClick={() => zoomOut()} />\n </Tooltip>\n <Tooltip title=\"重置视图\">\n <Button onClick={() => resetTransform()}>100%</Button>\n </Tooltip>\n <div className=\"text-center text-xs text-gray-500\">\n {Math.round(viewport.scale * 100)}%\n </div>\n </Space>\n </div>\n\n <TransformComponent\n wrapperStyle={{ width: \"100%\", height: \"100%\", position: \"relative\" }}\n contentStyle={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <div\n ref={canvasRef}\n data-canvas=\"true\"\n className={`relative ${isDragOver ? \"ring-4 ring-blue-400 ring-opacity-50\" : \"\"\n } ${mode === \"line-draw\" ? \"cursor-crosshair\" : \"\"} ${isSpacePressed ? \"cursor-grab\" : \"\"}`}\n style={{\n width: canvas.width,\n height: canvas.height,\n flexShrink: 0,\n backgroundColor: canvas.background,\n backgroundImage: canvas.backgroundImage ? `url(${canvas.backgroundImage})` : undefined,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }}\n onClick={handleCanvasClick}\n onMouseDown={handleCanvasMouseDown}\n onDoubleClick={handleCanvasDoubleClick}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {/* 网格背景 */}\n {canvas.showGrid !== false && (\n <svg className=\"absolute top-0 left-0 pointer-events-none\" width={canvas.width} height={canvas.height}>\n <defs>\n <pattern id=\"grid\" width=\"20\" height=\"20\" patternUnits=\"userSpaceOnUse\">\n <path d=\"M 20 0 L 0 0 0 20\" fill=\"none\" stroke=\"#f0f0f0\" strokeWidth=\"1\" />\n </pattern>\n </defs>\n <rect width=\"100%\" height=\"100%\" fill=\"url(#grid)\" />\n </svg>\n )}\n\n {/* 节点 */}\n {nodes.map((node) => (\n <NodeRenderer\n key={`${node.id}`}\n node={node}\n isSelected={\n selectedNodeId === node.id || selectedNodeIds.includes(node.id)\n }\n data={defaultTestData}\n onClick={() => {\n console.log('Node onClick:', node.id, 'mode:', modeRef.current);\n // 绘制模式下不触发节点选中\n if (modeRef.current === \"line-draw\") return;\n selectNode(node.id);\n }}\n onMouseDown={(e) => handleNodeMouseDown(e, node)}\n onUpdateNode={(nodeId, updates) => updateNode(nodeId, updates)}\n scale={viewport.scale}\n />\n ))}\n\n {/* 线条预览 */}\n {mode === \"line-draw\" && linePreview.isDrawing && linePreview.start && linePreview.end && (\n <svg className=\"absolute top-0 left-0 pointer-events-none\" width={canvas.width} height={canvas.height}>\n <line\n x1={linePreview.start.x}\n y1={linePreview.start.y}\n x2={linePreview.end.x}\n y2={linePreview.end.y}\n stroke=\"#1890ff\"\n strokeWidth=\"2\"\n strokeDasharray=\"5,5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n\n {/* 框选框 */}\n {mode === 'box-select' && selectionBox.start && selectionBox.end && (\n <div\n className=\"absolute border-2 border-blue-500 bg-blue-500/10 pointer-events-none\"\n style={{\n left: Math.min(selectionBox.start.x, selectionBox.end.x),\n top: Math.min(selectionBox.start.y, selectionBox.end.y),\n width: Math.abs(selectionBox.end.x - selectionBox.start.x),\n height: Math.abs(selectionBox.end.y - selectionBox.start.y),\n zIndex: 9999,\n }}\n />\n )}\n </div>\n </TransformComponent>\n </>\n )}\n </TransformWrapper>\n </div>\n\n {/* 数据模拟弹窗 */}\n <Modal\n title=\"数据模拟\"\n open={dataModalVisible}\n onCancel={() => setDataModalVisible(false)}\n footer={null}\n >\n <Form layout=\"vertical\">\n <Form.Item label=\"测试数据 (JSON)\">\n <TextArea\n value={dataInput}\n onChange={(e) => setDataInput(e.target.value)}\n rows={10}\n placeholder=\"输入 JSON 格式的测试数据\"\n />\n </Form.Item>\n </Form>\n </Modal>\n\n {/* 画布配置弹窗 */}\n <Modal\n title=\"画布配置\"\n open={canvasConfigVisible}\n onCancel={() => setCanvasConfigVisible(false)}\n footer={null}\n >\n <Form layout=\"vertical\">\n <Form.Item label=\"宽度\">\n <InputNumber\n value={canvas.width}\n onChange={(v) => setCanvasConfig({ width: v || 1920 })}\n min={100}\n max={5000}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"高度\">\n <InputNumber\n value={canvas.height}\n onChange={(v) => setCanvasConfig({ height: v || 1080 })}\n min={100}\n max={5000}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"显示网格\">\n <Switch\n checked={canvas.showGrid !== false}\n onChange={(checked) => setCanvasConfig({ showGrid: checked })}\n />\n </Form.Item>\n <Form.Item label=\"背景色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={canvas.background || '#ffffff'}\n onChange={(color) => setCanvasConfig({ background: color.toHexString() })}\n />\n <Input\n value={canvas.background}\n onChange={(e) => setCanvasConfig({ background: e.target.value })}\n placeholder=\"#ffffff\"\n />\n </div>\n </Form.Item>\n <Form.Item label=\"背景图片\">\n <div className=\"flex items-center gap-2\">\n <Upload\n accept=\"image/*\"\n showUploadList={false}\n beforeUpload={(file) => {\n const isImage = file.type.startsWith('image/');\n if (!isImage) {\n message.error('只能上传图片文件!');\n return false;\n }\n const reader = new FileReader();\n reader.onload = (e) => {\n const base64 = e.target?.result as string;\n setCanvasConfig({ backgroundImage: base64 });\n message.success('背景图片上传成功');\n };\n reader.readAsDataURL(file);\n return false; // 阻止自动上传\n }}\n >\n <Button icon={<UploadOutlined />}>上传图片</Button>\n </Upload>\n <Input\n value={canvas.backgroundImage}\n onChange={(e) => setCanvasConfig({ backgroundImage: e.target.value })}\n placeholder=\"输入图片 URL 或上传图片\"\n style={{ flex: 1 }}\n />\n {canvas.backgroundImage && (\n <Button\n icon={<CloseOutlined />}\n onClick={() => setCanvasConfig({ backgroundImage: undefined })}\n danger\n size=\"small\"\n />\n )}\n </div>\n {canvas.backgroundImage && (\n <div className=\"mt-2 p-2 border rounded\" style={{ maxWidth: '100%' }}>\n <img\n src={canvas.backgroundImage}\n alt=\"背景预览\"\n style={{ maxWidth: '100%', maxHeight: 120, objectFit: 'contain' }}\n />\n </div>\n )}\n </Form.Item>\n </Form>\n </Modal>\n </div>\n );\n};\n\nexport default Canvas;\n","import React, { useEffect, useState } from \"react\";\nimport { Form, Input, InputNumber, Select, Divider, Space, Tag } from \"antd\";\nimport { ColorPicker } from '../../ColorPicker';\nimport type { Material, TextMaterial } from \"../../../types\";\nimport type { DataOption } from \"../types\";\n\nconst { Option } = Select;\n\ninterface TextMaterialEditorProps {\n material: Material;\n onSave: (updates: Partial<Material>) => void;\n bindCodes?: string[];\n dataOptions?: DataOption[];\n}\n\nexport const TextMaterialEditor: React.FC<TextMaterialEditorProps> = ({\n material,\n onSave,\n bindCodes = [],\n dataOptions = [],\n}) => {\n const textMaterial = material as TextMaterial;\n const content = textMaterial.content || {};\n\n const [formData, setFormData] = useState({\n label: content.label || \"\",\n value: content.value || \"\",\n valueSourceCode: content.valueSourceCode || \"\",\n unit: content.unit || \"\",\n decimals: content.decimals ?? 2,\n labelFontSize: content.labelStyle?.fontSize || 14,\n labelFontWeight: content.labelStyle?.fontWeight || \"bold\",\n labelColor: content.labelStyle?.color || \"#262626\",\n valueFontSize: content.valueStyle?.fontSize || 14,\n valueFontWeight: content.valueStyle?.fontWeight || \"normal\",\n valueColor: content.valueStyle?.color || \"#1890ff\",\n });\n\n useEffect(() => {\n setFormData({\n label: content.label || \"\",\n value: content.value || \"\",\n valueSourceCode: content.valueSourceCode || \"\",\n unit: content.unit || \"\",\n decimals: content.decimals ?? 2,\n labelFontSize: content.labelStyle?.fontSize || 14,\n labelFontWeight: content.labelStyle?.fontWeight || \"bold\",\n labelColor: content.labelStyle?.color || \"#262626\",\n valueFontSize: content.valueStyle?.fontSize || 14,\n valueFontWeight: content.valueStyle?.fontWeight || \"normal\",\n valueColor: content.valueStyle?.color || \"#1890ff\",\n });\n }, [material.id]);\n\n const handleChange = (field: string, value: unknown) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n };\n\n const handleValueSourceChange = (code: string) => {\n const selectedOption = dataOptions.find((opt) => opt.paramsCode === code);\n const autoUnit = selectedOption?.unit || \"\";\n\n setFormData((prev) => ({\n ...prev,\n valueSourceCode: code,\n unit: autoUnit,\n value: String(selectedOption?.value || \"\"),\n }));\n\n setTimeout(() => {\n onSave({\n content: {\n ...content,\n valueSourceCode: code,\n value: String(selectedOption?.value || \"\"),\n unit: autoUnit,\n },\n } as Partial<Material>);\n }, 0);\n };\n\n const handleSave = () => {\n onSave({\n content: {\n ...content,\n label: formData.label,\n value: formData.value,\n valueSourceCode: formData.valueSourceCode,\n unit: formData.unit,\n decimals: formData.decimals,\n labelStyle: {\n fontSize: formData.labelFontSize,\n fontWeight: formData.labelFontWeight,\n color: formData.labelColor,\n },\n valueStyle: {\n fontSize: formData.valueFontSize,\n fontWeight: formData.valueFontWeight,\n color: formData.valueColor,\n },\n },\n } as Partial<Material>);\n };\n\n const boundDataOptions = dataOptions.filter((opt) =>\n bindCodes.includes(opt.paramsCode),\n );\n\n return (\n <div className=\"space-y-4\">\n <Divider style={{ marginTop: 0 }}>文本内容</Divider>\n\n <Form layout=\"vertical\">\n <Form.Item label=\"标签文本 (label)\">\n <Input\n value={formData.label}\n onChange={(e) => handleChange(\"label\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"输入标签文本\"\n />\n </Form.Item>\n\n <Form.Item\n label=\"值来源\"\n help=\"从绑定的数据中选择字段,优先级高于手动输入的值\">\n <Select\n value={formData.valueSourceCode || undefined}\n onChange={handleValueSourceChange}\n placeholder=\"选择数据字段(可选)\"\n allowClear\n style={{ width: \"100%\" }}\n fieldNames={{\n value: \"paramsCode\",\n label: \"paramsName\",\n }}\n options={boundDataOptions}\n />\n </Form.Item>\n\n <Form.Item\n label={formData.valueSourceCode ? \"默认值(备用)\" : \"值文本\"}\n help={\n formData.valueSourceCode\n ? \"已绑定数据源,实际值将来自数据字段,此处仅设置无数据时的备用显示\"\n : \"手动输入显示的值\"\n }>\n <Input\n value={formData.value}\n onChange={(e) => handleChange(\"value\", e.target.value)}\n onBlur={handleSave}\n placeholder={\n formData.valueSourceCode\n ? \"数据字段无值时显示此备用值\"\n : \"输入值文本\"\n }\n disabled={!!formData.valueSourceCode}\n variant={formData.valueSourceCode ? \"filled\" : undefined}\n />\n </Form.Item>\n\n <Form.Item label=\"单位\" help=\"优先从绑定数据自动获取,也可手动输入\">\n <Input\n value={formData.unit}\n onChange={(e) => handleChange(\"unit\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"单位(如°C、%、MPa等)\"\n suffix={\n formData.valueSourceCode && boundDataOptions.length > 0 ? (\n <Tag color=\"blue\" style={{ marginRight: -8 }}>\n 自动\n </Tag>\n ) : null\n }\n />\n </Form.Item>\n\n <Form.Item\n label=\"保留小数位\"\n help=\"数值格式化时保留的小数位数,-1表示不格式化\">\n <InputNumber\n value={formData.decimals}\n onChange={(v) => handleChange(\"decimals\", v ?? 2)}\n onBlur={handleSave}\n min={-1}\n max={10}\n style={{ width: \"100%\" }}\n />\n </Form.Item>\n </Form>\n\n <Divider>标签样式</Divider>\n\n <Form layout=\"vertical\">\n <Space>\n <Form.Item label=\"字体大小\">\n <InputNumber\n value={formData.labelFontSize}\n onChange={(v) => handleChange(\"labelFontSize\", v || 14)}\n onBlur={handleSave}\n min={8}\n max={72}\n />\n </Form.Item>\n\n <Form.Item label=\"字体粗细\">\n <Select\n value={formData.labelFontWeight}\n onChange={(v) => {\n handleChange(\"labelFontWeight\", v);\n setTimeout(handleSave, 0);\n }}\n style={{ width: 100 }}>\n <Option value=\"normal\">正常</Option>\n <Option value=\"bold\">粗体</Option>\n </Select>\n </Form.Item>\n </Space>\n\n <Form.Item label=\"文字颜色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.labelColor || '#262626'}\n onChange={(color) => {\n handleChange(\"labelColor\", color.toHexString());\n }}\n onChangeComplete={(color) => {\n onSave({\n content: {\n ...content,\n label: formData.label,\n value: formData.value,\n valueSourceCode: formData.valueSourceCode,\n unit: formData.unit,\n decimals: formData.decimals,\n labelStyle: {\n fontSize: formData.labelFontSize,\n fontWeight: formData.labelFontWeight,\n color: color.toHexString(),\n },\n valueStyle: {\n fontSize: formData.valueFontSize,\n fontWeight: formData.valueFontWeight,\n color: formData.valueColor,\n },\n },\n } as Partial<Material>);\n }}\n />\n <Input\n value={formData.labelColor}\n onChange={(e) => handleChange(\"labelColor\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"#262626\"\n style={{ width: 100 }}\n />\n </div>\n </Form.Item>\n </Form>\n\n <Divider>值样式</Divider>\n\n <Form layout=\"vertical\">\n <Space>\n <Form.Item label=\"字体大小\">\n <InputNumber\n value={formData.valueFontSize}\n onChange={(v) => handleChange(\"valueFontSize\", v || 14)}\n onBlur={handleSave}\n min={8}\n max={72}\n />\n </Form.Item>\n\n <Form.Item label=\"字体粗细\">\n <Select\n value={formData.valueFontWeight}\n onChange={(v) => {\n handleChange(\"valueFontWeight\", v);\n setTimeout(handleSave, 0);\n }}\n style={{ width: 100 }}>\n <Option value=\"normal\">正常</Option>\n <Option value=\"bold\">粗体</Option>\n </Select>\n </Form.Item>\n </Space>\n\n <Form.Item label=\"文字颜色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.valueColor || '#1890ff'}\n onChange={(color) => {\n handleChange(\"valueColor\", color.toHexString());\n }}\n onChangeComplete={(color) => {\n onSave({\n content: {\n ...content,\n label: formData.label,\n value: formData.value,\n valueSourceCode: formData.valueSourceCode,\n unit: formData.unit,\n decimals: formData.decimals,\n labelStyle: {\n fontSize: formData.labelFontSize,\n fontWeight: formData.labelFontWeight,\n color: formData.labelColor,\n },\n valueStyle: {\n fontSize: formData.valueFontSize,\n fontWeight: formData.valueFontWeight,\n color: color.toHexString(),\n },\n },\n } as Partial<Material>);\n }}\n />\n <Input\n value={formData.valueColor}\n onChange={(e) => handleChange(\"valueColor\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"#1890ff\"\n style={{ width: 100 }}\n />\n </div>\n </Form.Item>\n </Form>\n </div>\n );\n};\n\nexport default TextMaterialEditor;\n","import React, { useEffect, useState } from \"react\";\nimport { Form, Input, Divider } from \"antd\";\nimport { ColorPicker } from '../../ColorPicker';\nimport type { Material, ImageMaterial } from \"../../../types\";\n\ninterface ImageMaterialEditorProps {\n material: Material;\n onSave: (updates: Partial<Material>) => void;\n}\n\nexport const ImageMaterialEditor: React.FC<ImageMaterialEditorProps> = ({\n material,\n onSave,\n}) => {\n const imageMaterial = material as ImageMaterial;\n\n const [formData, setFormData] = useState({\n name: material.name,\n src: imageMaterial.src || \"\",\n backgroundColor: imageMaterial.backgroundColor || \"\",\n fillColor: imageMaterial.fillColor || \"\",\n });\n\n useEffect(() => {\n setFormData({\n name: material.name,\n src: imageMaterial.src || \"\",\n backgroundColor: imageMaterial.backgroundColor || \"\",\n fillColor: imageMaterial.fillColor || \"\",\n });\n }, [material.id]);\n\n const handleChange = (field: string, value: string) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n };\n\n const handleSave = () => {\n onSave({\n name: formData.name,\n src: formData.src,\n backgroundColor: formData.backgroundColor,\n } as Partial<Material>);\n };\n\n return (\n <div className=\"space-y-4\">\n <Divider style={{ marginTop: 0 }}>图片属性</Divider>\n\n <Form layout=\"vertical\">\n <Form.Item label=\"图片名称\">\n <Input\n value={formData.name}\n onChange={(e) => handleChange(\"name\", e.target.value)}\n onBlur={handleSave}\n />\n </Form.Item>\n\n <Form.Item label=\"图片地址 (src)\">\n <Input.TextArea\n value={formData.src}\n onChange={(e) => handleChange(\"src\", e.target.value)}\n onBlur={handleSave}\n rows={4}\n placeholder=\"输入图片 URL 或 Data URI\"\n />\n </Form.Item>\n\n <Form.Item label=\"填充颜色(基本形状)\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.fillColor || '#1890ff'}\n onChange={(color) => {\n const newColor = color.toHexString();\n handleChange(\"fillColor\", newColor);\n // 立即保存到 store\n onSave({\n name: formData.name,\n src: formData.src,\n backgroundColor: formData.backgroundColor,\n fillColor: newColor,\n } as Partial<Material>);\n }}\n />\n <Input\n value={formData.fillColor}\n onChange={(e) => handleChange(\"fillColor\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"#1890ff\"\n />\n </div>\n </Form.Item>\n\n <Form.Item label=\"背景颜色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.backgroundColor || '#1890ff'}\n onChange={(color) => {\n const newColor = color.toHexString();\n handleChange(\"backgroundColor\", newColor);\n // 立即保存到 store\n onSave({\n name: formData.name,\n src: formData.src,\n backgroundColor: newColor,\n fillColor: formData.fillColor,\n } as Partial<Material>);\n }}\n />\n <Input\n value={formData.backgroundColor}\n onChange={(e) => handleChange(\"backgroundColor\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"#1890ff\"\n />\n </div>\n </Form.Item>\n </Form>\n </div>\n );\n};\n\nexport default ImageMaterialEditor;\n","import React, { useEffect, useState } from \"react\";\nimport { Form, InputNumber, Select, Divider, Button, Space, Input } from \"antd\";\nimport { ColorPicker } from '../../ColorPicker';\nimport type { Material, LineMaterial } from \"../../../types\";\n\nconst { Option } = Select;\n\ninterface LineMaterialEditorProps {\n material: Material;\n onSave: (updates: Partial<Material>) => void;\n}\n\nexport const LineMaterialEditor: React.FC<LineMaterialEditorProps> = ({\n material,\n onSave,\n}) => {\n const lineConfig = (material as LineMaterial).config || {};\n\n const [formData, setFormData] = useState({\n lineWeight: lineConfig.lineWeight || lineConfig.thickness || 2,\n color: lineConfig.color || \"#262626\",\n lineType: lineConfig.lineType || \"solid\",\n startX: lineConfig.startX ?? 0,\n startY: lineConfig.startY ?? 0,\n endX: lineConfig.endX ?? 100,\n endY: lineConfig.endY ?? 0,\n });\n\n useEffect(() => {\n setFormData({\n lineWeight: lineConfig.lineWeight || lineConfig.thickness || 2,\n color: lineConfig.color || \"#262626\",\n lineType: lineConfig.lineType || \"solid\",\n startX: lineConfig.startX ?? 0,\n startY: lineConfig.startY ?? 0,\n endX: lineConfig.endX ?? 100,\n endY: lineConfig.endY ?? 0,\n });\n }, [material.id]);\n\n const handleSaveWithValues = (newValues: Partial<typeof formData>) => {\n const newFormData = { ...formData, ...newValues };\n setFormData(newFormData);\n \n onSave({\n config: {\n ...lineConfig,\n thickness: newFormData.lineWeight,\n lineWeight: newFormData.lineWeight,\n color: newFormData.color,\n lineType: newFormData.lineType,\n startX: newFormData.startX,\n startY: newFormData.startY,\n endX: newFormData.endX,\n endY: newFormData.endY,\n },\n } as Partial<Material>);\n };\n\n const lineTypeOptions = [\n { value: \"solid\", label: \"实线\", desc: \"连续实线\" },\n { value: \"dashed\", label: \"虚线\", desc: \"长划间隔\" },\n { value: \"center\", label: \"点画线(中心线)\", desc: \"长点-短点交替\" },\n { value: \"phantom\", label: \"假想线\", desc: \"长划-双点交替\" },\n { value: \"dot\", label: \"点线\", desc: \"密集点状\" },\n { value: \"dash-dot\", label: \"画点线\", desc: \"长划-点交替\" },\n ];\n\n return (\n <div className=\"space-y-4\">\n <Divider style={{ marginTop: 0 }}>起止位置(相对节点)</Divider>\n \n <Form layout=\"vertical\">\n <div className=\"grid grid-cols-2 gap-2\">\n <Form.Item label=\"起点 X\" className=\"mb-2\">\n <InputNumber\n value={formData.startX}\n onChange={(v) => handleSaveWithValues({ startX: v ?? 0 })}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"起点 Y\" className=\"mb-2\">\n <InputNumber\n value={formData.startY}\n onChange={(v) => handleSaveWithValues({ startY: v ?? 0 })}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"终点 X\" className=\"mb-2\">\n <InputNumber\n value={formData.endX}\n onChange={(v) => handleSaveWithValues({ endX: v ?? 100 })}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"终点 Y\" className=\"mb-2\">\n <InputNumber\n value={formData.endY}\n onChange={(v) => handleSaveWithValues({ endY: v ?? 0 })}\n style={{ width: '100%' }}\n />\n </Form.Item>\n </div>\n \n <Form.Item label=\"快速对齐\" className=\"mt-4\">\n <Space>\n <Button \n size=\"small\" \n onClick={() => {\n // 使用 lineConfig 中的最新值,确保同步\n const currentStartY = lineConfig.startY ?? formData.startY;\n handleSaveWithValues({ endY: currentStartY });\n }}\n title=\"将线条变为水平线\">\n 水平\n </Button>\n <Button \n size=\"small\" \n onClick={() => {\n // 使用 lineConfig 中的最新值,确保同步\n const currentStartX = lineConfig.startX ?? formData.startX;\n handleSaveWithValues({ endX: currentStartX });\n }}\n title=\"将线条变为垂直线\">\n 垂直\n </Button>\n <Button \n size=\"small\"\n onClick={() => {\n // 使用 lineConfig 中的最新值,确保同步\n const currentStartX = lineConfig.startX ?? formData.startX;\n const currentStartY = lineConfig.startY ?? formData.startY;\n const currentEndX = lineConfig.endX ?? formData.endX;\n const currentEndY = lineConfig.endY ?? formData.endY;\n handleSaveWithValues({ \n startX: currentEndX,\n startY: currentEndY,\n endX: currentStartX,\n endY: currentStartY,\n });\n }}\n title=\"交换起点和终点\">\n 反向\n </Button>\n </Space>\n </Form.Item>\n </Form>\n\n <Divider>线条属性</Divider>\n\n <Form layout=\"vertical\">\n <Form.Item label=\"线型\" help=\"选择线条样式\">\n <Select\n value={formData.lineType}\n onChange={(v) => handleSaveWithValues({ lineType: v })}>\n {lineTypeOptions.map((opt) => (\n <Option key={opt.value} value={opt.value}>\n <div className=\"flex flex-col\">\n <span>{opt.label}</span>\n <span className=\"text-xs text-gray-400\">{opt.desc}</span>\n </div>\n </Option>\n ))}\n </Select>\n </Form.Item>\n\n <Form.Item label=\"线宽(像素)\">\n <InputNumber\n value={formData.lineWeight}\n onChange={(v) => handleSaveWithValues({ lineWeight: v || 2 })}\n min={1}\n max={20}\n style={{ width: 120 }}\n />\n </Form.Item>\n\n <Form.Item label=\"颜色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.color || '#d9d9d9'}\n onChange={(color) => handleSaveWithValues({ color: color.toHexString() })}\n />\n <Input\n value={formData.color}\n onChange={(e) => handleSaveWithValues({ color: e.target.value })}\n placeholder=\"#d9d9d9\"\n style={{ width: 100 }}\n />\n </div>\n </Form.Item>\n </Form>\n </div>\n );\n};\n\nexport default LineMaterialEditor;\n","import React from \"react\";\nimport { TextMaterialEditor } from \"./TextMaterialEditor\";\nimport { ImageMaterialEditor } from \"./ImageMaterialEditor\";\nimport { LineMaterialEditor } from \"./LineMaterialEditor\";\nimport type { Material } from \"../../../types\";\nimport type { DataOption } from \"../types\";\n\ninterface MaterialPropertyEditorProps {\n material: Material;\n onSave: (updates: Partial<Material>) => void;\n bindCodes?: string[];\n dataOptions?: DataOption[];\n}\n\nexport const MaterialPropertyEditor: React.FC<MaterialPropertyEditorProps> = ({\n material,\n onSave,\n bindCodes,\n dataOptions,\n}) => {\n switch (material.type) {\n case \"TEXT\":\n return (\n <TextMaterialEditor\n material={material}\n onSave={onSave}\n bindCodes={bindCodes}\n dataOptions={dataOptions}\n />\n );\n case \"IMAGE\":\n return <ImageMaterialEditor material={material} onSave={onSave} />;\n case \"LINE\":\n return <LineMaterialEditor material={material} onSave={onSave} />;\n default:\n return (\n <div className=\"text-center text-gray-400 py-8\">\n 暂不支持编辑此类型的物料\n </div>\n );\n }\n};\n\nexport default MaterialPropertyEditor;\n","import React from \"react\";\nimport { Collapse, Button, Form, Input, Select, Tag, Space, Divider } from \"antd\";\nimport { PlusOutlined, DeleteOutlined, ArrowUpOutlined, ArrowDownOutlined } from \"@ant-design/icons\";\nimport { nanoid } from \"nanoid\";\nimport type { Material, NodeStatus, Node, GroupNode } from \"../../../types\";\nimport type { DataOption } from \"../types\";\nimport { MaterialPropertyEditor } from \"./MaterialPropertyEditor\";\n\nconst { Panel } = Collapse;\nconst { TextArea } = Input;\n\ninterface GroupNodeStatusEditorProps {\n node: GroupNode;\n updateNode: (nodeId: string, updates: Partial<Node>) => void;\n materials: Material[];\n bindCodes?: string[];\n dataOptions?: DataOption[];\n}\n\nexport const GroupNodeStatusEditor: React.FC<GroupNodeStatusEditorProps> = ({\n node,\n updateNode,\n materials,\n}) => {\n // 获取可用的物料列表(排除群组类型)\n const availableMaterials = materials.filter(m => m.type !== 'CUSTOM' || !m.config?.nodes);\n\n // 更新子节点的状态列表\n const handleUpdateChildStatusList = (childId: string, newStatusList: NodeStatus[]) => {\n const newChildren = node.children?.map(child => {\n if (child.id === childId) {\n return {\n ...child,\n contentInfo: {\n ...child.contentInfo,\n statusList: newStatusList,\n },\n };\n }\n return child;\n });\n\n updateNode(node.id, {\n children: newChildren,\n } as Partial<Node>);\n };\n\n // 添加状态到子节点\n const handleAddChildStatus = (childId: string) => {\n const child = node.children?.find(c => c.id === childId);\n if (!child) return;\n\n const newStatus: NodeStatus = {\n id: nanoid(),\n name: `状态${child.contentInfo.statusList.length + 1}`,\n expression: child.contentInfo.statusList.length === 0 ? 'return true;' : 'return false;',\n material: { ...availableMaterials[0], id: nanoid() } as Material,\n bindCodes: [],\n };\n\n handleUpdateChildStatusList(childId, [...child.contentInfo.statusList, newStatus]);\n };\n\n // 删除子节点的状态\n const handleDeleteChildStatus = (childId: string, statusId: string) => {\n const child = node.children?.find(c => c.id === childId);\n if (!child) return;\n\n const newStatusList = child.contentInfo.statusList.filter(s => s.id !== statusId);\n handleUpdateChildStatusList(childId, newStatusList);\n };\n\n // 更新子节点的某个状态\n const handleUpdateChildStatus = (childId: string, statusId: string, updates: Partial<NodeStatus>) => {\n const child = node.children?.find(c => c.id === childId);\n if (!child) return;\n\n const newStatusList = child.contentInfo.statusList.map(s => {\n if (s.id === statusId) {\n return { ...s, ...updates } as NodeStatus;\n }\n return s;\n });\n\n handleUpdateChildStatusList(childId, newStatusList);\n };\n\n // 移动子节点状态\n const handleMoveChildStatus = (childId: string, statusId: string, direction: 'up' | 'down') => {\n const child = node.children?.find(c => c.id === childId);\n if (!child) return;\n\n const index = child.contentInfo.statusList.findIndex(s => s.id === statusId);\n if (index === -1) return;\n\n const newStatusList = [...child.contentInfo.statusList];\n if (direction === 'up' && index > 0) {\n [newStatusList[index], newStatusList[index - 1]] = [newStatusList[index - 1], newStatusList[index]];\n } else if (direction === 'down' && index < newStatusList.length - 1) {\n [newStatusList[index], newStatusList[index + 1]] = [newStatusList[index + 1], newStatusList[index]];\n }\n\n handleUpdateChildStatusList(childId, newStatusList);\n };\n\n // 更换子节点状态的物料\n const handleChangeChildStatusMaterial = (childId: string, statusId: string, materialId: string) => {\n const selectedMaterial = materials.find(m => m.id === materialId);\n if (!selectedMaterial) return;\n\n handleUpdateChildStatus(childId, statusId, {\n material: { ...selectedMaterial, id: nanoid() },\n });\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"p-3 bg-blue-50 border border-blue-200 rounded-lg mb-4\">\n <div className=\"text-sm text-blue-700\">\n <strong>群组节点</strong>:为每个子节点配置多个状态和绑定\n </div>\n </div>\n\n <Collapse ghost>\n {node.children?.map((child, childIndex) => (\n <Panel\n key={child.id}\n header={\n <div className=\"flex items-center justify-between w-full pr-4\">\n <span className=\"font-medium text-sm\">子节点 {childIndex + 1}</span>\n <Tag color=\"blue\" style={{ fontSize: '12px', padding: '0 4px' }}>\n {child.contentInfo.statusList.length} 个状态\n </Tag>\n </div>\n }>\n <div className=\"space-y-3\">\n {/* 添加状态按钮 */}\n <div className=\"flex justify-between items-center mb-3\">\n <span className=\"text-sm text-gray-600\">状态列表</span>\n <Button\n type=\"primary\"\n size=\"small\"\n icon={<PlusOutlined />}\n onClick={() => handleAddChildStatus(child.id)}\n >\n 添加状态\n </Button>\n </div>\n\n {child.contentInfo.statusList.length === 0 ? (\n <div className=\"text-center text-gray-400 py-4 bg-gray-50 rounded-lg\">\n 暂无状态,点击上方按钮添加\n </div>\n ) : (\n <Collapse ghost>\n {child.contentInfo.statusList.map((status, statusIndex) => (\n <Panel\n key={status.id}\n header={\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-gray-400 w-5\">{statusIndex + 1}</span>\n <span className=\"font-medium\">{status.name}</span>\n <Tag color=\"default\" className=\"text-xs\">{status.material.type}</Tag>\n </div>\n }\n extra={\n <Space size=\"small\" onClick={(e) => e.stopPropagation()}>\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ArrowUpOutlined />}\n disabled={statusIndex === 0}\n onClick={(e) => {\n e.stopPropagation();\n handleMoveChildStatus(child.id, status.id, 'up');\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ArrowDownOutlined />}\n disabled={statusIndex === child.contentInfo.statusList.length - 1}\n onClick={(e) => {\n e.stopPropagation();\n handleMoveChildStatus(child.id, status.id, 'down');\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n danger\n icon={<DeleteOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n handleDeleteChildStatus(child.id, status.id);\n }}\n />\n </Space>\n }\n >\n <Form layout=\"vertical\">\n {/* 状态名称 */}\n <Form.Item label=\"状态名称\">\n <Input\n value={status.name}\n onChange={(e) => handleUpdateChildStatus(child.id, status.id, { name: e.target.value })}\n placeholder=\"输入状态名称\"\n />\n </Form.Item>\n\n {/* 执行表达式 */}\n <Form.Item\n label=\"执行表达式\"\n help=\"返回 true 时激活此状态,可使用 data 变量访问绑定数据\"\n >\n <TextArea\n value={status.expression}\n onChange={(e) => handleUpdateChildStatus(child.id, status.id, { expression: e.target.value })}\n rows={3}\n placeholder=\"return true;\"\n />\n </Form.Item>\n\n {/* 绑定数据源 */}\n <Form.Item label=\"绑定数据源 (bindCodes)\">\n <Select\n mode=\"tags\"\n value={status.bindCodes || []}\n onChange={(value) => handleUpdateChildStatus(child.id, status.id, { bindCodes: value })}\n placeholder=\"输入数据源 code\"\n tokenSeparators={[\",\", \" \"]}\n />\n </Form.Item>\n\n {/* 更换物料 */}\n <Form.Item label=\"更换物料\">\n <div className=\"flex items-center gap-2\">\n <Tag color=\"blue\">{status.material.name}</Tag>\n <Tag color=\"default\">{status.material.type}</Tag>\n <Select\n placeholder=\"选择新物料\"\n style={{ width: 150 }}\n value={undefined}\n onChange={(value) => value && handleChangeChildStatusMaterial(child.id, status.id, value)}\n options={availableMaterials.map(m => ({\n value: m.id,\n label: `${m.name} (${m.type})`,\n }))}\n />\n </div>\n </Form.Item>\n\n {/* 物料属性编辑 */}\n <Divider style={{ margin: '12px 0' }} />\n <div className=\"bg-gray-50 rounded-lg p-3 border border-gray-200\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium\">物料属性</span>\n <Tag>{status.material.name}</Tag>\n </div>\n <MaterialPropertyEditor\n material={status.material}\n onSave={(updates) => {\n const newMaterial = { ...status.material, ...updates } as Material;\n handleUpdateChildStatus(child.id, status.id, { material: newMaterial });\n }}\n />\n </div>\n </Form>\n </Panel>\n ))}\n </Collapse>\n )}\n </div>\n </Panel>\n ))}\n </Collapse>\n </div>\n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport {\n Form,\n Input,\n InputNumber,\n Select,\n Switch,\n Collapse,\n Button,\n Empty,\n Tabs,\n Space,\n Tag,\n Modal,\n Divider,\n} from \"antd\";\nimport {\n PlusOutlined,\n DeleteOutlined,\n ArrowUpOutlined,\n ArrowDownOutlined,\n CopyOutlined,\n EditOutlined,\n} from \"@ant-design/icons\";\nimport { useEditorStore } from \"../../store/editorStore\";\nimport type { Material, NodeStatus, Node } from \"../../types\";\nimport { nanoid } from \"nanoid\";\nimport { MaterialPropertyEditor, GroupNodeStatusEditor } from \"./editors\";\nimport type { DataOption } from \"./types\";\n\nconst { Panel } = Collapse;\nconst { TabPane } = Tabs;\nconst { TextArea } = Input;\n\ninterface PropertyPanelProps {\n defaultTestData?: DataOption[];\n}\n\nexport const PropertyPanel: React.FC<PropertyPanelProps> = ({\n defaultTestData,\n}) => {\n const {\n nodes,\n selectedNodeId,\n updateNode,\n updateNodeStyle,\n updateNodeControl,\n updateNodeContent,\n materials,\n selectedStatusId,\n selectStatus,\n } = useEditorStore();\n\n const [form] = Form.useForm();\n const [activeTab, setActiveTab] = useState(\"basic\");\n const [materialModalVisible, setMaterialModalVisible] = useState(false);\n const [editingStatusId, setEditingStatusId] = useState<string | null>(null);\n const [editingExpressions, setEditingExpressions] = useState<\n Record<string, string>\n >({});\n\n const selectedNode = React.useMemo(() => {\n return nodes.find((n) => n.id === selectedNodeId);\n }, [nodes, selectedNodeId]);\n\n const currentStatusList = selectedNode?.contentInfo.statusList || [];\n\n const handleValuesChange = (changedValues: Record<string, unknown>) => {\n if (!selectedNodeId) return;\n\n if (changedValues.normalStyle) {\n updateNodeStyle(selectedNodeId, changedValues.normalStyle as Record<string, unknown>);\n }\n\n if (changedValues.name !== undefined) {\n updateNode(selectedNodeId, { name: changedValues.name as string });\n }\n\n if (changedValues.controlInfo) {\n updateNodeControl(selectedNodeId, changedValues.controlInfo as Record<string, unknown>);\n }\n };\n console.log(selectedNodeId, 'selectedNodeId', selectedNode);\n\n useEffect(() => {\n if (!selectedNode) return;\n\n if (selectedNode) {\n form.setFieldsValue({\n name: selectedNode.name,\n normalStyle: {\n width: 100,\n height: 100,\n x: 0,\n y: 0,\n padding: 8,\n background: \"transparent\",\n borderRadius: 0,\n opacity: 1,\n ...selectedNode.normalStyle,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n ...selectedNode.controlInfo,\n },\n });\n selectStatus(null);\n }\n }, [selectedNode, selectStatus, form]);\n\n const handleAddStatus = () => {\n if (!selectedNodeId || !selectedNode) return;\n setEditingStatusId(\"new\");\n setMaterialModalVisible(true);\n };\n\n const handleSelectMaterialForStatus = (material: Material) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatus: NodeStatus = {\n id: nanoid(),\n name: `${material.name}_状态${currentStatusList.length + 1}`,\n expression: currentStatusList.length === 0 ? \"return true;\" : \"return false;\",\n material: { ...material, id: nanoid() },\n bindCodes: [],\n };\n\n if (editingStatusId === \"new\") {\n const newStatusList = [...currentStatusList, newStatus];\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n } else if (editingStatusId) {\n const newStatusList = currentStatusList.map((s) => {\n if (s.id === editingStatusId) {\n return { ...s, material: { ...material, id: nanoid() } };\n }\n return s;\n });\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n }\n\n setMaterialModalVisible(false);\n setEditingStatusId(null);\n };\n\n const handleDeleteStatus = (statusId: string) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatusList =\n selectedNode.contentInfo.statusList?.filter((s) => s.id !== statusId) || [];\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n\n if (selectedStatusId === statusId) {\n selectStatus(null);\n }\n };\n\n const handleUpdateStatus = (statusId: string, updates: Partial<NodeStatus>) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatusList =\n selectedNode.contentInfo.statusList?.map((s) => {\n if (s.id === statusId) {\n return { ...s, ...updates };\n }\n return s;\n }) || [];\n\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n };\n\n const handleCopyStatus = (status: NodeStatus) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatus: NodeStatus = {\n ...status,\n id: nanoid(),\n name: `${status.name}_复制`,\n expression: \"return false;\",\n };\n\n const newStatusList = [...currentStatusList, newStatus];\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n };\n\n const handleMoveStatus = (statusId: string, direction: \"up\" | \"down\") => {\n if (!selectedNodeId || !selectedNode) return;\n\n const index = currentStatusList.findIndex((s) => s.id === statusId);\n if (index === -1) return;\n\n const newStatusList = [...currentStatusList];\n if (direction === \"up\" && index > 0) {\n [newStatusList[index], newStatusList[index - 1]] = [\n newStatusList[index - 1],\n newStatusList[index],\n ];\n } else if (direction === \"down\" && index < newStatusList.length - 1) {\n [newStatusList[index], newStatusList[index + 1]] = [\n newStatusList[index + 1],\n newStatusList[index],\n ];\n }\n\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n };\n\n const handleChangeStatusMaterial = (statusId: string) => {\n setEditingStatusId(statusId);\n setMaterialModalVisible(true);\n };\n\n const handleUpdateStatusMaterial = (statusId: string, updates: Partial<Material>) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatusList = currentStatusList.map((s) => {\n if (s.id === statusId) {\n return {\n ...s,\n material: { ...s.material, ...updates } as Material,\n };\n }\n return s;\n });\n\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n };\n\n if (!selectedNode) {\n return (\n <div className=\"h-full flex items-center justify-center bg-white border-l border-gray-200\">\n <Empty description=\"请选择一个节点\" />\n </div>\n );\n }\n\n return (\n <div className=\"h-full flex flex-col bg-white border-l border-gray-200\">\n <div className=\"p-4 border-b border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-800\">属性面板</h3>\n <p className=\"text-sm text-gray-500\">编辑选中节点的属性</p>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-4\">\n <Tabs activeKey={activeTab} onChange={setActiveTab}>\n <TabPane tab=\"基础\" key=\"basic\">\n <Form\n form={form}\n layout=\"vertical\"\n onValuesChange={handleValuesChange}\n initialValues={{ name: selectedNode.name }}\n >\n <Form.Item label=\"节点名称\" name=\"name\">\n <Input placeholder=\"输入节点名称\" />\n </Form.Item>\n\n <Collapse ghost defaultActiveKey={[\"position\", \"size\", \"style\"]}>\n <Panel header=\"位置\" key=\"position\">\n <Space>\n <Form.Item label=\"X\" name={[\"normalStyle\", \"x\"]}>\n <InputNumber />\n </Form.Item>\n <Form.Item label=\"Y\" name={[\"normalStyle\", \"y\"]}>\n <InputNumber />\n </Form.Item>\n </Space>\n </Panel>\n\n <Panel header=\"尺寸\" key=\"size\">\n <Space>\n <Form.Item label=\"宽度\" name={[\"normalStyle\", \"width\"]}>\n <InputNumber min={10} />\n </Form.Item>\n <Form.Item label=\"高度\" name={[\"normalStyle\", \"height\"]}>\n <InputNumber min={10} />\n </Form.Item>\n </Space>\n </Panel>\n\n <Panel header=\"样式\" key=\"style\">\n <Form.Item label=\"背景色\" name={[\"normalStyle\", \"background\"]}>\n <Input placeholder=\"transparent, #fff, url(...)\" />\n </Form.Item>\n\n <Form.Item label=\"内边距\" name={[\"normalStyle\", \"padding\"]}>\n <InputNumber min={0} />\n </Form.Item>\n\n <Form.Item label=\"圆角\" name={[\"normalStyle\", \"borderRadius\"]}>\n <InputNumber min={0} />\n </Form.Item>\n\n <Form.Item\n label=\"缩放比例\"\n name={[\"normalStyle\", \"scale\"]}\n help=\"等比缩放节点的宽高\"\n >\n <InputNumber min={0.1} max={5} step={0.1} />\n </Form.Item>\n\n <Form.Item\n label=\"旋转角度\"\n name={[\"normalStyle\", \"rotate\"]}\n help=\"顺时针旋转角度(度)\"\n >\n <InputNumber min={0} max={360} step={1} />\n </Form.Item>\n\n <Form.Item label=\"透明度\" name={[\"normalStyle\", \"opacity\"]}>\n <InputNumber min={0} max={1} step={0.1} />\n </Form.Item>\n\n <Form.Item label=\"层级\" name={[\"normalStyle\", \"zIndex\"]}>\n <InputNumber />\n </Form.Item>\n </Panel>\n </Collapse>\n </Form>\n </TabPane>\n\n <TabPane tab=\"状态\" key=\"status\">\n {selectedNode.type === \"group\" && selectedNode.children ? (\n <GroupNodeStatusEditor\n node={selectedNode}\n updateNode={updateNode}\n materials={materials}\n />\n ) : (\n <div className=\"mb-4\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"font-medium\">\n 状态列表\n <Tag color=\"blue\" className=\"ml-2\">\n {currentStatusList.length}\n </Tag>\n </span>\n <Button\n type=\"primary\"\n size=\"small\"\n icon={<PlusOutlined />}\n onClick={handleAddStatus}\n >\n 添加状态\n </Button>\n </div>\n\n <p className=\"text-xs text-gray-500 mb-3\">\n 节点根据状态表达式计算结果显示对应物料,第一个返回 true 的状态为当前状态\n </p>\n\n {currentStatusList.length > 0 && (\n <div className=\"mb-4 p-3 bg-blue-50 border border-blue-200 rounded-lg\">\n <div className=\"flex items-center justify-between\">\n <div>\n <span className=\"text-sm text-gray-600\">当前状态:</span>\n <span className=\"ml-2 text-sm font-medium text-blue-600\">\n 由表达式自动计算\n </span>\n </div>\n </div>\n </div>\n )}\n\n {currentStatusList.length === 0 ? (\n <div className=\"text-center text-gray-400 py-4 bg-gray-50 rounded-lg\">\n 暂无状态,点击上方按钮添加\n </div>\n ) : (\n <Collapse ghost defaultActiveKey={currentStatusList[0]?.id + selectedNodeId}>\n {currentStatusList.map((status, index) => (\n <Panel\n key={status.id + selectedNodeId}\n header={\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-gray-400 w-5\">{index + 1}</span>\n <span className=\"font-medium\">{status.name}</span>\n <Tag color=\"default\" className=\"text-xs\">\n {status.material.type}\n </Tag>\n </div>\n }\n extra={\n <Space size=\"small\" onClick={(e) => e.stopPropagation()}>\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ArrowUpOutlined />}\n disabled={index === 0}\n onClick={(e) => {\n e.stopPropagation();\n handleMoveStatus(status.id, \"up\");\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ArrowDownOutlined />}\n disabled={index === currentStatusList.length - 1}\n onClick={(e) => {\n e.stopPropagation();\n handleMoveStatus(status.id, \"down\");\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n icon={<CopyOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n handleCopyStatus(status);\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n danger\n icon={<DeleteOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n handleDeleteStatus(status.id);\n }}\n />\n </Space>\n }\n >\n <Form layout=\"vertical\">\n <Form.Item label=\"状态名称\">\n <Input\n value={status.name}\n onChange={(e) =>\n handleUpdateStatus(status.id, { name: e.target.value })\n }\n placeholder=\"输入状态名称\"\n />\n </Form.Item>\n\n <Form.Item\n label=\"执行表达式\"\n help=\"返回 true 时激活此状态,可使用 data 变量访问绑定数据\"\n >\n <TextArea\n value={editingExpressions[status.id] ?? status.expression}\n onChange={(e) =>\n setEditingExpressions((prev) => ({\n ...prev,\n [status.id]: e.target.value,\n }))\n }\n onBlur={(e) => {\n handleUpdateStatus(status.id, { expression: e.target.value });\n setEditingExpressions((prev) => {\n const newState = { ...prev };\n delete newState[status.id];\n return newState;\n });\n }}\n rows={3}\n placeholder=\"return true;\"\n />\n </Form.Item>\n\n <Form.Item label=\"绑定数据源 (bindCodes)\">\n <Select\n mode=\"tags\"\n value={status.bindCodes || []}\n onChange={(value) =>\n handleUpdateStatus(status.id, { bindCodes: value })\n }\n placeholder=\"输入数据源 code\"\n tokenSeparators={[\",\", \" \"]}\n />\n </Form.Item>\n\n <Form.Item label=\"绑定物料\">\n <div className=\"flex items-center gap-2\">\n <Tag color=\"blue\">{status.material.name}</Tag>\n <Tag color=\"default\">{status.material.type}</Tag>\n <Button\n type=\"link\"\n size=\"small\"\n icon={<EditOutlined />}\n onClick={() => handleChangeStatusMaterial(status.id)}\n >\n 更换物料\n </Button>\n </div>\n </Form.Item>\n\n {/* 状态物料属性编辑 */}\n <Divider style={{ margin: \"12px 0\" }} />\n <div className=\"bg-gray-50 rounded-lg p-3 border border-gray-200\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium\">物料属性</span>\n <Tag>{status.material.name}</Tag>\n </div>\n <MaterialPropertyEditor\n material={status.material}\n onSave={(updates) =>\n handleUpdateStatusMaterial(status.id, updates)\n }\n bindCodes={status.bindCodes || []}\n dataOptions={defaultTestData || []}\n />\n </div>\n </Form>\n </Panel>\n ))}\n </Collapse>\n )}\n </div>\n )}\n </TabPane>\n\n <TabPane tab=\"控制\" key=\"control\">\n <Form\n form={form}\n layout=\"vertical\"\n onValuesChange={handleValuesChange}\n >\n <Form.Item\n label=\"可拖拽\"\n name={[\"controlInfo\", \"isDraggable\"]}\n valuePropName=\"checked\"\n >\n <Switch />\n </Form.Item>\n\n <Form.Item\n label=\"可点击\"\n name={[\"controlInfo\", \"isClickable\"]}\n valuePropName=\"checked\"\n >\n <Switch />\n </Form.Item>\n\n <Form.Item\n label=\"可调整大小\"\n name={[\"controlInfo\", \"isResizable\"]}\n valuePropName=\"checked\"\n >\n <Switch />\n </Form.Item>\n\n <Form.Item\n label=\"可选中\"\n name={[\"controlInfo\", \"isSelectable\"]}\n valuePropName=\"checked\"\n >\n <Switch />\n </Form.Item>\n </Form>\n </TabPane>\n\n </Tabs>\n </div>\n\n <div className=\"p-3 border-t border-gray-200 bg-gray-50\">\n <div className=\"text-xs text-gray-500\">\n <div>节点 ID: {selectedNode.id.slice(0, 8)}...</div>\n <div>状态数: {currentStatusList.length}</div>\n </div>\n </div>\n\n <Modal\n title=\"选择物料\"\n open={materialModalVisible}\n onCancel={() => {\n setMaterialModalVisible(false);\n setEditingStatusId(null);\n }}\n footer={null}\n width={600}\n >\n <div className=\"max-h-[400px] overflow-y-auto\">\n <Collapse ghost defaultActiveKey={[\"basic\", \"device\", \"text\", \"line\"]}>\n <Panel header=\"基础形状\" key=\"basic\">\n <div className=\"grid grid-cols-4 gap-2\">\n {materials\n .filter((m) => [\"矩形\", \"圆形\", \"圆角矩形\"].includes(m.name))\n .map((material) => (\n <MaterialCard\n key={material.id}\n material={material}\n onClick={() => handleSelectMaterialForStatus(material)}\n />\n ))}\n </div>\n </Panel>\n\n <Panel header=\"设备图标\" key=\"device\">\n <div className=\"grid grid-cols-4 gap-2\">\n {materials\n .filter(\n (m) =>\n [\"阀门\", \"泵\", \"罐体\"].includes(m.name) ||\n (m.type === \"IMAGE\" &&\n ![\"矩形\", \"圆形\", \"圆角矩形\"].includes(m.name))\n )\n .map((material) => (\n <MaterialCard\n key={material.id}\n material={material}\n onClick={() => handleSelectMaterialForStatus(material)}\n />\n ))}\n </div>\n </Panel>\n\n <Panel header=\"文本\" key=\"text\">\n <div className=\"grid grid-cols-4 gap-2\">\n {materials\n .filter((m) => m.type === \"TEXT\")\n .map((material) => (\n <div\n key={material.id}\n className=\"border rounded-lg p-2 cursor-pointer hover:border-blue-500 hover:bg-blue-50 transition-all text-center\"\n onClick={() => handleSelectMaterialForStatus(material)}\n >\n <div className=\"w-12 h-12 mx-auto mb-1 flex items-center justify-center bg-gray-100 rounded\">\n <span className=\"text-lg font-bold text-gray-500\">T</span>\n </div>\n <span className=\"text-xs\">{material.name}</span>\n </div>\n ))}\n </div>\n </Panel>\n\n <Panel header=\"线条\" key=\"line\">\n <div className=\"grid grid-cols-4 gap-2\">\n {materials\n .filter((m) => m.type === \"LINE\")\n .map((material) => (\n <div\n key={material.id}\n className=\"border rounded-lg p-2 cursor-pointer hover:border-blue-500 hover:bg-blue-50 transition-all text-center\"\n onClick={() => handleSelectMaterialForStatus(material)}\n >\n <div className=\"w-12 h-12 mx-auto mb-1 flex items-center justify-center bg-gray-100 rounded\">\n <div className=\"w-8 h-0.5 bg-gray-400\" />\n </div>\n <span className=\"text-xs\">{material.name}</span>\n </div>\n ))}\n </div>\n </Panel>\n </Collapse>\n </div>\n </Modal>\n </div>\n );\n};\n\n// 物料卡片组件\ninterface MaterialCardProps {\n material: Material;\n onClick: () => void;\n}\n\nconst MaterialCard: React.FC<MaterialCardProps> = ({ material, onClick }) => {\n // 安全地获取图片 URL,只处理 IMAGE 类型\n const src = material.type === 'IMAGE' ? (material as Extract<Material, { type: 'IMAGE' }>).src : undefined;\n\n return (\n <div\n className=\"border rounded-lg p-2 cursor-pointer hover:border-blue-500 hover:bg-blue-50 transition-all text-center\"\n onClick={onClick}\n >\n <div className=\"w-12 h-12 mx-auto mb-1 flex items-center justify-center\">\n {src ? (\n <img src={src} alt={material.name} className=\"w-10 h-10 object-contain\" />\n ) : (\n <span className=\"text-xs\">{material.name[0]}</span>\n )}\n </div>\n <span className=\"text-xs\">{material.name}</span>\n </div>\n );\n};\n\nexport default PropertyPanel;\n","import React, { useEffect, useCallback } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport {\n Layout,\n Button,\n Space,\n Tooltip,\n Modal,\n message,\n ConfigProvider,\n} from \"antd\";\nimport { DownloadOutlined, UploadOutlined } from \"@ant-design/icons\";\nimport zhCN from \"antd/locale/zh_CN\";\nimport { MaterialPanel } from \"../MaterialPanel\";\nimport { Canvas } from \"../Canvas\";\nimport { PropertyPanel } from \"../PropertyPanel\";\nimport { useEditorStore } from \"../../store/editorStore\";\nimport { initMaterials } from \"../../utils/initData\";\nimport type { SchemeJSON } from \"../../types\";\nimport styles from \"../../styles/ConfigEditor.module.css\";\n\nconst { Header, Sider, Content } = Layout;\n\nexport interface ConfigEditorProps {\n /** 初始 scheme 数据 */\n initialScheme?: SchemeJSON;\n /** scheme 变化回调 */\n onChange?: (scheme: SchemeJSON) => void;\n /** 是否只读模式 */\n readonly?: boolean;\n /** 自定义头部内容 */\n headerExtra?: React.ReactNode;\n /** 样式类名 */\n className?: string;\n /** 内联样式 */\n style?: CSSProperties;\n /** 画布默认宽度 */\n defaultCanvasWidth?: number;\n /** 画布默认高度 */\n defaultCanvasHeight?: number;\n /** 是否显示头部 */\n showHeader?: boolean;\n /** 是否显示物料面板 */\n showMaterialPanel?: boolean;\n /** 是否显示属性面板 */\n showPropertyPanel?: boolean;\n /** 自定义物料列表 */\n customMaterials?: any[];\n /** 实时数据 */\n defaultTestData?: any[];\n}\n\nexport const ConfigEditor: React.FC<ConfigEditorProps> = ({\n initialScheme,\n onChange,\n readonly = false,\n headerExtra,\n className = \"\",\n style,\n showHeader = true,\n showMaterialPanel = true,\n showPropertyPanel = true,\n customMaterials,\n}) => {\n const [importModalVisible, setImportModalVisible] = React.useState(false);\n const [jsonInput, setJsonInput] = React.useState(\"\");\n const [defaultTestData, setDefaultTestData] = React.useState([\n {\n paramsCode: \"001\",\n paramsName: \"通频速度有效值\",\n value: 25,\n paramsUnit: \"mm/s\",\n },\n {\n paramsCode: \"002\",\n paramsName: \"通频加速度有效值\",\n value: 1.5,\n paramsUnit: \"m/s²\",\n },\n ]);\n const { exportScheme, importScheme, nodes, materials, addMaterial } =\n useEditorStore();\n const internalRef = React.useRef<any>(null);\n const initializedRef = React.useRef(false);\n // useEffect(() => {\n // if (internalRef.current) {\n // clearInterval(internalRef.current);\n // }\n // internalRef.current = setInterval(() => {\n // setDefaultTestData([\n // {\n // paramsCode: \"001\",\n // paramsName: \"通频速度有效值\",\n // value: 25 + Math.random() * 5 * (Math.random() > 0.5 ? 1 : -1),\n // paramsUnit: \"mm/s\",\n // },\n // {\n // paramsCode: \"002\",\n // paramsName: \"通频加速度有效值\",\n // value: 1.5 + Math.random() * 0.5 * (Math.random() > 0.5 ? 1 : -1),\n // paramsUnit: \"m/s²\",\n // },\n // ]);\n // }, 1000);\n // return () => {\n // if (internalRef.current) {\n // clearInterval(internalRef.current);\n // }\n // };\n // }, []);\n // 初始化\n useEffect(() => {\n // 防止 React 18 严格模式下重复执行\n if (initializedRef.current) return;\n initializedRef.current = true;\n\n // 加载默认物料\n if (materials.length === 0) {\n initMaterials.forEach((m) => addMaterial(m));\n }\n\n // 加载自定义物料\n if (customMaterials && customMaterials.length > 0) {\n customMaterials.forEach((m) => addMaterial(m));\n }\n\n // 加载初始 scheme\n if (initialScheme) {\n importScheme(initialScheme);\n }\n }, []);\n\n // 监听变化并回调\n useEffect(() => {\n if (onChange) {\n const scheme = exportScheme();\n onChange(scheme);\n }\n }, [nodes, onChange]);\n\n // 导出 JSON\n const handleExport = useCallback(() => {\n const scheme = exportScheme();\n const dataStr = JSON.stringify(scheme, null, 2);\n const dataUri =\n \"data:application/json;charset=utf-8,\" + encodeURIComponent(dataStr);\n\n const exportFileDefaultName = `scheme_${Date.now()}.json`;\n\n const linkElement = document.createElement(\"a\");\n linkElement.setAttribute(\"href\", dataUri);\n linkElement.setAttribute(\"download\", exportFileDefaultName);\n linkElement.click();\n\n message.success(\"导出成功!\");\n }, [exportScheme]);\n\n // 导入 JSON\n const handleImport = useCallback(() => {\n try {\n const scheme: SchemeJSON = JSON.parse(jsonInput);\n importScheme(scheme);\n setImportModalVisible(false);\n setJsonInput(\"\");\n message.success(\"导入成功!\");\n } catch (error) {\n message.error(\"JSON 格式错误,请检查输入\");\n }\n }, [jsonInput, importScheme]);\n\n // 处理文件导入\n const handleFileImport = useCallback(\n (file: File) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n try {\n const content = e.target?.result as string;\n const scheme: SchemeJSON = JSON.parse(content);\n importScheme(scheme);\n message.success(\"导入成功!\");\n setImportModalVisible(false);\n } catch (error) {\n message.error(\"文件格式错误\");\n }\n };\n reader.readAsText(file);\n return false;\n },\n [importScheme],\n );\n\n // 导出 scheme 方法(供外部 ref 调用)\n const getScheme = useCallback(() => {\n return exportScheme();\n }, [exportScheme]);\n\n // 暴露给父组件\n React.useImperativeHandle(\n (React as any).useRef?.(),\n () => ({\n getScheme,\n exportScheme,\n importScheme,\n }),\n [getScheme, exportScheme, importScheme],\n );\n\n // console.log(\"defaultTestData\", defaultTestData);\n\n return (\n <ConfigProvider locale={zhCN}>\n <div className={styles.configEditor} style={style}>\n <Layout\n className={`h-full w-full overflow-hidden ${className}`}>\n {/* 顶部导航 */}\n {showHeader && (\n <Header className=\"bg-white border-b border-gray-200 px-4 flex items-center justify-between flex-shrink-0\">\n <div className=\"flex items-center gap-4\">\n <div className=\"text-xl font-bold text-blue-600\">组态编辑器</div>\n <div className=\"text-sm text-gray-500\">{nodes.length} 个节点</div>\n </div>\n\n <Space>\n {headerExtra}\n {!readonly && (\n <>\n <Tooltip title=\"导出 JSON\">\n <Button icon={<DownloadOutlined />} onClick={handleExport}>\n 导出\n </Button>\n </Tooltip>\n\n <Tooltip title=\"导入 JSON\">\n <Button\n icon={<UploadOutlined />}\n onClick={() => setImportModalVisible(true)}>\n 导入\n </Button>\n </Tooltip>\n </>\n )}\n </Space>\n </Header>\n )}\n\n {/* 主体内容 */}\n <Layout>\n {/* 左侧物料面板 */}\n {showMaterialPanel && !readonly && (\n <Sider width={280} className=\"bg-white\" theme=\"light\">\n <MaterialPanel />\n </Sider>\n )}\n\n {/* 中间画布 */}\n <Content className=\"bg-gray-100 relative\">\n <Canvas defaultTestData={defaultTestData} />\n </Content>\n\n {/* 右侧属性面板 */}\n {showPropertyPanel && !readonly && (\n <Sider width={360} className=\"bg-white\" theme=\"light\">\n <PropertyPanel defaultTestData={defaultTestData} />\n </Sider>\n )}\n </Layout>\n\n {/* 导入弹窗 */}\n <Modal\n title=\"导入组态方案\"\n open={importModalVisible}\n onOk={handleImport}\n onCancel={() => {\n setImportModalVisible(false);\n setJsonInput(\"\");\n }}\n width={600}>\n <div className=\"space-y-4\">\n <div>\n <p className=\"mb-2\">选择 JSON 文件导入:</p>\n <input\n type=\"file\"\n accept=\".json\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) handleFileImport(file);\n }}\n className=\"block w-full text-sm text-gray-500\n file:mr-4 file:py-2 file:px-4\n file:rounded-full file:border-0\n file:text-sm file:font-semibold\n file:bg-blue-50 file:text-blue-700\n hover:file:bg-blue-100\"\n />\n </div>\n\n <div className=\"text-center text-gray-400\">或</div>\n\n <div>\n <p className=\"mb-2\">粘贴 JSON 内容:</p>\n <textarea\n value={jsonInput}\n onChange={(e) => setJsonInput(e.target.value)}\n placeholder=\"粘贴 JSON 内容...\"\n className=\"w-full h-48 p-3 border border-gray-300 rounded-lg font-mono text-sm resize-none focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n </div>\n </Modal>\n </Layout>\n </div>\n </ConfigProvider>\n );\n};\n\nexport default ConfigEditor;\n"],"names":["_interopRequireDefault","e","module","zh_CN","locale","common","_common","require$$0","_typeof","o","ownKeys","r","t","_objectSpread","_defineProperty","obj","key","value","_toPropertyKey","i","_toPrimitive","_zh_CN","require$$1","_zh_CN2","_zh_CN3","_zh_CN4","typeTemplate","localeValues","immerImpl","initializer","set","get","store","updater","replace","args","nextState","produce","immer","initialState","createEvent","type","targetId","payload","nanoid","useEditorStore","create","node","autoSelect","state","newNode","id","updates","n","style","content","control","index","nodeId","status","newStatus","statusId","s","data","error","material","newMaterial","m","viewport","config","mode","endPoint","lastEvent","nextEvent","event","scheme","initMaterials","createDefaultStatus","createDefaultNode","x","y","children","childNode","minX","minY","maxX","maxY","child","cx","cy","cw","ch","relativeChildren","Panel","Collapse","Text","Typography","MaterialPanel","materials","addMaterial","removeMaterial","selectedStatusId","selectStatus","lineDrawing","startLineDrawing","cancelLineDrawing","activeKeys","setActiveKeys","useState","handleUpload","file","reader","src","groupedMaterials","handleDragStart","dragImage","handleLineMaterialClick","renderMaterialItem","isLineMode","isLineMaterial","isDrawingLine","jsx","List","Button","EditOutlined","DeleteOutlined","Image","jsxs","Tag","Upload","UploadOutlined","keys","item","Empty","Fragment","evaluateStatusExpression","params","d","result","findActiveStatus","statusList","bindData","getDataValue","valueSourceCode","dataItem","formatValue","decimals","num","renderMaterial","isSelected","imageMaterial","bgColor","fillColor","textMaterial","label","configValue","configUnit","labelStyle","valueStyle","customStyle","dataValue","dataUnit","displayValue","displayUnit","lineMaterial","thickness","color","dashed","lineType","lineWeight","startX","startY","endX","endY","dashArray","baseWeight","strokeColor","customMaterial","NodeRendererComponent","onClick","onMouseDown","onUpdateNode","canvasScale","normalStyle","contentInfo","controlInfo","isClickable","isDraggable","isResizable","onClickRef","useRef","draggingPoint","setDraggingPoint","dragOriginRef","dragResultRef","resizeResultRef","nodeRef","resizing","setResizing","rotating","setRotating","rotatingAngleRef","currentStatus","useMemo","activeStatus","currentMaterial","isLine","lineConfig","nodeScale","scaledWidth","scaledHeight","getEffectiveCanvasScale","useCallback","canvasEl","canvasRect","logicalWidth","handlePointMouseDown","point","useEffect","handleMouseMove","origin","effectiveScale","totalDx","totalDy","newStartX","newStartY","newEndX","newEndY","newNodeX","newNodeY","minNodeSize","newWidth","newHeight","el","line","startHandle","endHandle","handleMouseUp","dx","dy","newX","newY","handleResizeStart","corner","handleRotateStart","rect","newAngle","extra","finalAngle","isGroup","containerStyle","startPointPos","endPointPos","latestOnClick","NodeRenderer","React","prevProps","nextProps","nodeA","nodeB","nodeStyleEqual","contentEqual","otherPropsEqual","presetColors","ColorPicker","onChange","onChangeComplete","visible","setVisible","innerValue","setInnerValue","popoverRef","handleClickOutside","handleColorChange","TextArea","Input","Canvas","defaultTestData","transformRef","canvasRef","wrapperRef","nodes","selectedNodeId","canvas","setViewport","setCanvasConfig","addNode","selectNode","updateNode","removeNode","undo","redo","setMode","endLineDrawing","isDragOver","setIsDragOver","forceUpdate","modeRef","isDraggingRef","dragStartRef","dragOffsetRef","draggingNodeRef","linePreview","setLinePreview","selectionBox","setSelectionBox","selectedNodeIds","setSelectedNodeIds","dataModalVisible","setDataModalVisible","dataInput","setDataInput","canvasConfigVisible","setCanvasConfigVisible","isSpacePressed","setIsSpacePressed","getCanvasPosition","clientX","clientY","mouseXInCanvas","mouseYInCanvas","effectiveScaleX","effectiveScaleY","getBoxSelectionPosition","createLineNode","start","end","continueDrawing","relativeStartX","relativeStartY","relativeEndX","relativeEndY","nodeWidth","nodeHeight","nextStart","handleTransform","handleCanvasClick","handleCanvasMouseDown","pos","handleCanvasDoubleClick","handleDragOver","handleDragLeave","handleDrop","handleNodeMouseDown","screenDx","screenDy","canvasDx","canvasDy","nodeEl","prev","selectedIds","nodeX","nodeY","nodeW","nodeH","centerX","centerY","handleKeyDown","handleKeyUp","handleCopyNodes","nodesToCopy","newNodeIds","handleGroupNodes","selectedNodes","w","h","groupNode","handleUngroupNodes","groupNodesToUngroup","absoluteChildren","handleDistributeNodes","direction","sortedNodes","a","b","count","step","handleAlignNodes","alignValue","toolbarButtons","SelectOutlined","GroupOutlined","DragOutlined","EyeOutlined","actionButtons","UndoOutlined","RedoOutlined","CopyOutlined","UngroupOutlined","AlignLeftOutlined","AlignRightOutlined","VerticalAlignTopOutlined","VerticalAlignBottomOutlined","ColumnWidthOutlined","ColumnHeightOutlined","SettingOutlined","ExperimentOutlined","Space","btn","Tooltip","TransformWrapper","zoomIn","zoomOut","resetTransform","ZoomInOutlined","ZoomOutOutlined","TransformComponent","Modal","Form","InputNumber","v","Switch","checked","message","base64","CloseOutlined","Option","Select","TextMaterialEditor","onSave","bindCodes","dataOptions","formData","setFormData","handleChange","field","handleValueSourceChange","code","selectedOption","opt","autoUnit","handleSave","boundDataOptions","Divider","ImageMaterialEditor","newColor","LineMaterialEditor","handleSaveWithValues","newValues","newFormData","lineTypeOptions","currentStartY","currentStartX","currentEndX","currentEndY","MaterialPropertyEditor","GroupNodeStatusEditor","availableMaterials","handleUpdateChildStatusList","childId","newStatusList","newChildren","handleAddChildStatus","c","handleDeleteChildStatus","handleUpdateChildStatus","handleMoveChildStatus","handleChangeChildStatusMaterial","materialId","selectedMaterial","childIndex","PlusOutlined","statusIndex","ArrowUpOutlined","ArrowDownOutlined","TabPane","Tabs","PropertyPanel","updateNodeStyle","updateNodeControl","updateNodeContent","form","activeTab","setActiveTab","materialModalVisible","setMaterialModalVisible","editingStatusId","setEditingStatusId","editingExpressions","setEditingExpressions","selectedNode","currentStatusList","handleValuesChange","changedValues","handleAddStatus","handleSelectMaterialForStatus","handleDeleteStatus","handleUpdateStatus","handleCopyStatus","handleMoveStatus","handleChangeStatusMaterial","handleUpdateStatusMaterial","newState","MaterialCard","Header","Sider","Content","Layout","ConfigEditor","initialScheme","readonly","headerExtra","className","showHeader","showMaterialPanel","showPropertyPanel","customMaterials","importModalVisible","setImportModalVisible","jsonInput","setJsonInput","setDefaultTestData","exportScheme","importScheme","initializedRef","handleExport","dataStr","dataUri","exportFileDefaultName","linkElement","handleImport","handleFileImport","getScheme","ConfigProvider","zhCN","styles","DownloadOutlined"],"mappings":";;;;;;;;;;;;;;AAAA,aAASA,EAAuBC,GAAG;AACjC,aAAOA,KAAKA,EAAE,aAAaA,IAAI;AAAA,QAC7B,SAAWA;AAAA;IAEf;AACA,IAAAC,EAAA,UAAiBF,GAAwBE,EAAA,QAAA,aAA4B,IAAMA,EAAO,QAAQ,UAAaA,EAAO;AAAA;;;;;UCH9G,OAAO,eAAeC,IAAS,cAAc;AAAA,IAC3C,OAAO;AAAA,EACT,CAAC,GACDA,GAAA,UAAkB;AAClB,QAAMC,IAAS;AAAA;AAAA,IAEb,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA;AAAA,IAEN,WAAW;AAAA,IACX,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,WAAW;AAAA;AAEED,SAAAA,GAAA,UAAkBC;;;;wBCnBjC,OAAO,eAAeC,IAAS,cAAc;AAAA,IAC3C,OAAO;AAAA,EACT,CAAC,GACDA,GAAA,eAAuB,QACJA,GAAA,eAAuB;AAAA,IACxC,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,oBAAoB;AAAA,IACpB,iBAAiB;AAAA;;;;;UCRnB,OAAO,eAAeF,IAAS,cAAc;AAAA,IAC3C,OAAO;AAAA,EACT,CAAC,GACDA,GAAA,UAAkB;AAClB,MAAIG,IAAUC,GAAA;AACd,WAASC,EAAQC,GAAG;AAAE;AAA2B,WAAOD,IAAwB,OAAO,UAArB,cAA2C,OAAO,OAAO,YAA1B,WAAqC,SAAUC,GAAG;AAAE,aAAO,OAAOA;AAAA,QAAO,SAAUA,GAAG;AAAE,aAAOA,KAAmB,OAAO,UAArB,cAA+BA,EAAE,gBAAgB,UAAUA,MAAM,OAAO,YAAY,WAAW,OAAOA;AAAA,IAAE,GAAID,EAAQC,CAAC;AAAA,EAAE;AAC5T,WAASC,EAAQT,GAAGU,GAAG;AAAE,QAAIC,IAAI,OAAO,KAAKX,CAAC;AAAG,QAAI,OAAO,uBAAuB;AAAE,UAAIQ,IAAI,OAAO,sBAAsBR,CAAC;AAAG,MAAAU,MAAMF,IAAIA,EAAE,OAAO,SAAUE,GAAG;AAAE,eAAO,OAAO,yBAAyBV,GAAGU,CAAC,EAAE;AAAA,MAAW,CAAE,IAAIC,EAAE,KAAK,MAAMA,GAAGH,CAAC;AAAA;AAAK,WAAOG;AAAA,EAAE;AAC7P,WAASC,EAAcZ,GAAG;AAAE,aAASU,IAAI,GAAGA,IAAI,UAAU,QAAQA,KAAK;AAAE,UAAIC,IAAY,UAAUD,CAAC,KAAnB,OAAuB,UAAUA,CAAC,IAAI,CAAA;AAAI,MAAAA,IAAI,IAAID,EAAQ,OAAOE,CAAC,GAAG,EAAE,EAAE,QAAQ,SAAUD,GAAG;AAAE,QAAAG,EAAgBb,GAAGU,GAAGC,EAAED,CAAC,CAAC;AAAA,MAAE,CAAE,IAAI,OAAO,4BAA4B,OAAO,iBAAiBV,GAAG,OAAO,0BAA0BW,CAAC,CAAC,IAAIF,EAAQ,OAAOE,CAAC,CAAC,EAAE,QAAQ,SAAUD,GAAG;AAAE,eAAO,eAAeV,GAAGU,GAAG,OAAO,yBAAyBC,GAAGD,CAAC,CAAC;AAAA,MAAE,CAAE;AAAA,IAAE;AAAG,WAAOV;AAAA,EAAE;AACrb,WAASa,EAAgBC,GAAKC,GAAKC,GAAO;AAAE,WAAAD,IAAME,EAAeF,CAAG,GAAOA,KAAOD,IAAO,OAAO,eAAeA,GAAKC,GAAK,EAAE,OAAOC,GAAO,YAAY,IAAM,cAAc,IAAM,UAAU,GAAI,CAAE,IAAYF,EAAIC,CAAG,IAAIC,GAAgBF;AAAA,EAAI;AAC1O,WAASG,EAAeN,GAAG;AAAE,QAAIO,IAAIC,EAAaR,GAAG,QAAQ;AAAG,WAAmBJ,EAAQW,CAAC,KAArB,WAAyBA,IAAI,OAAOA,CAAC;AAAA,EAAE;AAC9G,WAASC,EAAaR,GAAGD,GAAG;AAAE,QAAgBH,EAAQI,CAAC,KAArB,YAA0B,CAACA,EAAG,QAAOA;AAAG,QAAIX,IAAIW,EAAE,OAAO,WAAW;AAAG,QAAeX,MAAX,QAAc;AAAE,UAAIkB,IAAIlB,EAAE,KAAKW,GAAGD,CAAc;AAAG,UAAgBH,EAAQW,CAAC,KAArB,SAAwB,QAAOA;AAAG,YAAM,IAAI,UAAU,8CAA8C;AAAA,IAAE;AAAG,YAAqBR,MAAb,WAAiB,SAAS,QAAQC,CAAC;AAAA,EAAE;AAC1T,MAAIR,IAASS,EAAcA,EAAc,CAAA,GAAIP,EAAQ,YAAY,GAAG,IAAI;AAAA,IACtE,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,KAAK;AAAA,IACL,aAAa;AAAA,IACb,IAAI;AAAA,IACJ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,eAAe;AAAA,IACf,WAAW;AAAA,IACX,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,cAAc;AAAA,IACd,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,EACnB,CAAC;AACcH,SAAAA,GAAA,UAAkBC;;;;;UCvCjC,OAAO,eAAeD,IAAS,cAAc;AAAA,IAC3C,OAAO;AAAA,EACT,CAAC,GACDA,GAAA,UAAkB;AAClB,QAAMC,IAAS;AAAA,IACb,aAAa;AAAA,IACb,kBAAkB,CAAC,QAAQ,MAAM;AAAA;AAEpBD,SAAAA,GAAA,UAAkBC;;;;;;ACRjC,MAAIJ,IAAyBO,GAAA,EAAwD;AACrF,SAAO,eAAeJ,IAAS,cAAc;AAAA,IAC3C,OAAO;AAAA,EACT,CAAC,GACDA,GAAA,UAAkB;AAClB,MAAIkB,IAASrB,EAAuBsB,IAA4C,GAC5EC,IAAUvB,sBAAgE;AAE9E,QAAMI,IAAS;AAAA,IACb,MAAM;AAAA,MACJ,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,MACpB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,kBAAkB,CAAC,QAAQ,MAAM;AAAA,MACjC,sBAAsB,CAAC,QAAQ,MAAM;AAAA,MACrC,uBAAuB,CAAC,QAAQ,MAAM;AAAA,MACtC,yBAAyB,CAAC,QAAQ,MAAM;AAAA,MACxC,sBAAsB,CAAC,OAAO,KAAK;AAAA,MACnC,GAAGiB,EAAO;AAAA;IAEZ,kBAAkB;AAAA,MAChB,GAAGE,EAAQ;AAAA,IACf;AAAA;AAGA,SAAAnB,EAAO,KAAK,KAAK,MAGFD,GAAA,UAAkBC;;;;;;AC9BjC,MAAIJ,IAAyBO,GAAA,EAAwD;AACrF,SAAO,eAAeJ,IAAS,cAAc;AAAA,IAC3C,OAAO;AAAA,EACT,CAAC,GACDA,GAAA,UAAkB;AAClB,MAAIkB,IAASrB,sBAAgE;AAC9DG,SAAAA,GAAA,UAAkBkB,EAAO;;;;;;ACNxC,MAAIrB,IAAyBO,GAAA,EAAwD;AACrF,SAAO,eAAeJ,IAAS,cAAc;AAAA,IAC3C,OAAO;AAAA,EACT,CAAC,GACDA,GAAA,UAAkB;AAClB,MAAIkB,IAASrB,EAAuBsB,IAAoD,GACpFC,IAAUvB,sBAA0D,GACpEwB,IAAUxB,sBAA6D,GACvEyB,IAAUzB,sBAA6D;AAC3E,QAAM0B,IAAe,0BACfC,IAAe;AAAA,IACnB,QAAQ;AAAA,IACR,YAAYN,EAAO;AAAA,IACnB,YAAYG,EAAQ;AAAA,IACpB,YAAYC,EAAQ;AAAA,IACpB,UAAUF,EAAQ;AAAA;AAAA,IAElB,QAAQ;AAAA,MACN,aAAa;AAAA,MACb,OAAO;AAAA,MACP,UAAU;AAAA;IAEZ,OAAO;AAAA,MACL,aAAa;AAAA,MACb,eAAe;AAAA,MACf,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,yBAAyB;AAAA,MACzB,WAAW;AAAA,MACX,WAAW;AAAA,MACX,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,YAAY;AAAA;IAEd,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,YAAY;AAAA;IAEd,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA;IAEV,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,QAAQ;AAAA;IAEV,UAAU;AAAA,MACR,QAAQ,CAAC,IAAI,EAAE;AAAA,MACf,mBAAmB;AAAA,MACnB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,eAAe;AAAA,MACf,WAAW;AAAA,MACX,aAAa;AAAA,MACb,WAAW;AAAA,MACX,cAAc;AAAA;IAEhB,QAAQ;AAAA,MACN,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,aAAa;AAAA,MACb,cAAc;AAAA;IAEhB,OAAO;AAAA,MACL,aAAa;AAAA;IAEf,MAAM;AAAA,MACJ,MAAM;AAAA;IAER,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA;IAEZ,MAAM;AAAA,MACJ,UAAU;AAAA,MACV,yBAAyB;AAAA,QACvB,SAAS;AAAA,QACT,UAAU;AAAA,QACV,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,MAAM;AAAA,UACJ,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,SAAS;AAAA;QAEX,OAAO;AAAA,UACL,QAAQG;AAAA,UACR,QAAQA;AAAA,UACR,OAAOA;AAAA,UACP,QAAQA;AAAA,UACR,QAAQA;AAAA,UACR,MAAMA;AAAA,UACN,SAASA;AAAA,UACT,SAASA;AAAA,UACT,OAAOA;AAAA,UACP,QAAQA;AAAA,UACR,OAAOA;AAAA,UACP,KAAKA;AAAA,UACL,KAAKA;AAAA;QAEP,QAAQ;AAAA,UACN,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,OAAO;AAAA;QAET,QAAQ;AAAA,UACN,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,OAAO;AAAA;QAET,OAAO;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,OAAO;AAAA;QAET,SAAS;AAAA,UACP,UAAU;AAAA,QAClB;AAAA,MACA;AAAA;IAEE,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA;IAEX,aAAa;AAAA,MACX,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb,eAAe;AAAA,IACnB;AAAA;AAEevB,SAAAA,GAAA,UAAkBwB;;;;wBCxJjCxB,KAAiBI,gBAAAA,GAAA;;;mCCEXqB,KAAY,CAACC,MAAgB,CAACC,GAAKC,GAAKC,OAC5CA,EAAM,WAAW,CAACC,GAASC,MAAYC,MAAS;AAC9C,QAAMC,IAAY,OAAOH,KAAY,aAAaI,GAAQJ,CAAO,IAAIA;AACrE,SAAOH,EAAIM,GAAWF,GAAS,GAAGC,CAAI;AACxC,GACON,EAAYG,EAAM,UAAUD,GAAKC,CAAK,IAEzCM,KAAQV,ICWRW,KAA4B;AAAA,EAChC,OAAO,CAAA;AAAA,EACP,WAAW,CAAA;AAAA,EACX,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,EAAA;AAAA,EAEZ,UAAU;AAAA,IACR,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,EAAA;AAAA,EAEb,SAAS;AAAA,IACP,MAAM,CAAA;AAAA,IACN,QAAQ,CAAA;AAAA,EAAC;AAAA,EAEX,MAAM;AAAA,EACN,aAAa;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU;AAAA,EAAA;AAEd,GAGMC,KAAc,CAACC,GAAiBC,GAAmBC,OAAgC;AAAA,EACvF,IAAIC,EAAA;AAAA,EACJ,MAAAH;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAW,KAAK,IAAA;AAClB,IAoDaE,KAAiBC,GAAA;AAAA,EAC5BR,GAAM,CAACR,GAAKC,OAAS;AAAA,IACnB,GAAGQ;AAAA;AAAA,IAEH,SAAS,CAACQ,GAAMC,IAAa,OAAS;AACpC,MAAAlB,EAAI,CAACmB,MAAU;AAEb,cAAMC,IAAU;AAAA,UACd,GAAGH;AAAA,UACH,IAAIA,EAAK,MAAMH,EAAA;AAAA,QAAO;AAExB,QAAAK,EAAM,MAAM,KAAKC,CAAO,GACpBF,MACFC,EAAM,iBAAiBC,EAAQ,IAC/BD,EAAM,QAAQ,KAAK,KAAKT,GAAY,eAAeU,EAAQ,EAAE,CAAC;AAAA,MAElE,CAAC;AAAA,IACH;AAAA,IAEA,YAAY,CAACC,GAAIC,MAAY;AAC3B,MAAAtB,EAAI,CAACmB,MAAU;AACb,cAAMF,IAAOE,EAAM,MAAM,KAAK,CAACI,MAAMA,EAAE,OAAOF,CAAE;AAChD,QAAIJ,MACF,OAAO,OAAOA,GAAMK,CAAO,GAC3BH,EAAM,QAAQ,KAAK,KAAKT,GAAY,mBAAmBW,GAAIC,CAAO,CAAC;AAAA,MAEvE,CAAC;AAAA,IACH;AAAA,IAEA,iBAAiB,CAACD,GAAIG,MAAU;AAC9B,MAAAxB,EAAI,CAACmB,MAAU;AACb,cAAMF,IAAOE,EAAM,MAAM,KAAK,CAACI,MAAMA,EAAE,OAAOF,CAAE;AAChD,QAAIJ,MACF,OAAO,OAAOA,EAAK,aAAaO,CAAK,GACrCL,EAAM,QAAQ,KAAK,KAAKT,GAAY,mBAAmBW,GAAI,EAAE,aAAaG,EAAA,CAAO,CAAC;AAAA,MAEtF,CAAC;AAAA,IACH;AAAA,IAEA,mBAAmB,CAACH,GAAII,MAAY;AAClC,MAAAzB,EAAI,CAACmB,MAAU;AACb,cAAMF,IAAOE,EAAM,MAAM,KAAK,CAACI,MAAMA,EAAE,OAAOF,CAAE;AAChD,QAAIJ,MAEFA,EAAK,cAAc,EAAE,GAAGA,EAAK,aAAa,GAAGQ,EAAA,GAC7CN,EAAM,QAAQ,KAAK,KAAKT,GAAY,mBAAmBW,GAAI,EAAE,aAAaI,EAAA,CAAS,CAAC;AAAA,MAExF,CAAC;AAAA,IACH;AAAA,IAEA,mBAAmB,CAACJ,GAAIK,MAAY;AAClC,MAAA1B,EAAI,CAACmB,MAAU;AACb,cAAMF,IAAOE,EAAM,MAAM,KAAK,CAACI,MAAMA,EAAE,OAAOF,CAAE;AAChD,QAAIJ,MACF,OAAO,OAAOA,EAAK,aAAaS,CAAO,GACvCP,EAAM,QAAQ,KAAK,KAAKT,GAAY,mBAAmBW,GAAI,EAAE,aAAaK,EAAA,CAAS,CAAC;AAAA,MAExF,CAAC;AAAA,IACH;AAAA,IAEA,YAAY,CAACL,MAAO;AAClB,MAAArB,EAAI,CAACmB,MAAU;AACb,cAAMQ,IAAQR,EAAM,MAAM,UAAU,CAAC,MAAM,EAAE,OAAOE,CAAE;AACtD,QAAIM,MAAU,OACZR,EAAM,MAAM,OAAOQ,GAAO,CAAC,GACvBR,EAAM,mBAAmBE,MAC3BF,EAAM,iBAAiB,MACvBA,EAAM,mBAAmB,OAE3BA,EAAM,QAAQ,KAAK,KAAKT,GAAY,eAAeW,CAAE,CAAC;AAAA,MAE1D,CAAC;AAAA,IACH;AAAA,IAEA,YAAY,CAACA,MAAO;AAClB,MAAArB,EAAI,CAACmB,MAAU;AACb,QAAAA,EAAM,iBAAiBE,GACvBF,EAAM,mBAAmB,MACrBE,KACFF,EAAM,QAAQ,KAAK,KAAKT,GAAY,eAAeW,CAAE,CAAC;AAAA,MAE1D,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,WAAW,CAACO,GAAQC,MAAW;AAC7B,MAAA7B,EAAI,CAACmB,MAAU;AACb,cAAMF,IAAOE,EAAM,MAAM,KAAK,CAACI,MAAMA,EAAE,OAAOK,CAAM;AACpD,YAAI,CAACX,EAAM;AAEX,cAAMa,IAAwB;AAAA,UAC5B,GAAGD;AAAA,UACH,IAAIf,EAAA;AAAA,QAAO;AAGb,QAAAG,EAAK,YAAY,WAAW,KAAKa,CAAS,GAC1CX,EAAM,QAAQ,KAAK,KAAKT,GAAY,0BAA0BkB,GAAQ,EAAE,UAAUE,EAAU,GAAA,CAAI,CAAC;AAAA,MACnG,CAAC;AAAA,IACH;AAAA,IAEA,cAAc,CAACF,GAAQG,MAAa;AAClC,MAAA/B,EAAI,CAACmB,MAAU;AACb,cAAMF,IAAOE,EAAM,MAAM,KAAK,CAACI,MAAMA,EAAE,OAAOK,CAAM;AACpD,YAAI,CAACX,EAAM;AAEX,cAAMU,IAAQV,EAAK,YAAY,WAAW,UAAU,CAACe,MAAMA,EAAE,OAAOD,CAAQ;AAC5E,QAAIJ,MAAU,OACZV,EAAK,YAAY,WAAW,OAAOU,GAAO,CAAC,GACvCV,EAAK,YAAY,oBAAoBc,MACvCd,EAAK,YAAY,kBAAkB,SAEjCE,EAAM,qBAAqBY,MAC7BZ,EAAM,mBAAmB;AAAA,MAG/B,CAAC;AAAA,IACH;AAAA,IAEA,cAAc,CAACS,GAAQG,GAAUT,MAAY;AAC3C,MAAAtB,EAAI,CAACmB,MAAU;AACb,cAAMF,IAAOE,EAAM,MAAM,KAAK,CAACI,MAAMA,EAAE,OAAOK,CAAM;AACpD,YAAI,CAACX,EAAM;AAEX,cAAMY,IAASZ,EAAK,YAAY,WAAW,KAAK,CAACe,MAAMA,EAAE,OAAOD,CAAQ;AACxE,QAAIF,KACF,OAAO,OAAOA,GAAQP,CAAO;AAAA,MAEjC,CAAC;AAAA,IACH;AAAA,IAEA,cAAc,CAACS,MAAa;AAC1B,MAAA/B,EAAI,CAACmB,MAAU;AACb,QAAAA,EAAM,mBAAmBY;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,IAEA,uBAAuB,CAACH,GAAQK,MAAS;AAEvC,YAAMhB,IADQhB,EAAA,EACK,MAAM,KAAK,CAACsB,MAAMA,EAAE,OAAOK,CAAM;AACpD,UAAKX;AAEL,mBAAWY,KAAUZ,EAAK,YAAY;AACpC,cAAI;AAGF,gBAFW,IAAI,SAAS,QAAQ,aAAa,UAAUY,EAAO,UAAU,EACtDI,GAAMJ,EAAO,WAAWA,CAAM,MACjC;AACb,qBAAOA,EAAO;AAAA,UAElB,SAASK,GAAO;AACd,oBAAQ,KAAK,cAAcL,EAAO,MAAMK,CAAK;AAAA,UAC/C;AAAA,IAIJ;AAAA;AAAA,IAGA,aAAa,CAACC,MAAa;AACzB,MAAAnC,EAAI,CAACmB,MAAU;AACb,cAAMiB,IAAc;AAAA,UAClB,GAAGD;AAAA,UACH,IAAIrB,EAAA;AAAA,QAAO;AAEb,QAAAK,EAAM,UAAU,KAAKiB,CAAuB,GAC5CjB,EAAM,QAAQ,KAAK,KAAKT,GAAY,gBAAgB0B,EAAY,EAAE,CAAC;AAAA,MACrE,CAAC;AAAA,IACH;AAAA,IAEA,gBAAgB,CAACf,GAAIC,MAAY;AAC/B,MAAAtB,EAAI,CAACmB,MAAU;AACb,cAAMgB,IAAWhB,EAAM,UAAU,KAAK,CAACkB,MAAMA,EAAE,OAAOhB,CAAE;AACxD,QAAIc,KACF,OAAO,OAAOA,GAAUb,CAAO;AAAA,MAEnC,CAAC;AAAA,IACH;AAAA,IAEA,gBAAgB,CAACD,MAAO;AACtB,MAAArB,EAAI,CAACmB,MAAU;AACb,cAAMQ,IAAQR,EAAM,UAAU,UAAU,CAACkB,MAAMA,EAAE,OAAOhB,CAAE;AAC1D,QAAIM,MAAU,MACZR,EAAM,UAAU,OAAOQ,GAAO,CAAC;AAAA,MAEnC,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,aAAa,CAACW,MAAa;AACzB,MAAAtC,EAAI,CAACmB,MAAU;AACb,eAAO,OAAOA,EAAM,UAAUmB,CAAQ;AAAA,MACxC,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,iBAAiB,CAACC,MAAW;AAC3B,MAAAvC,EAAI,CAACmB,MAAU;AACb,QAAAA,EAAM,SAAS,EAAE,GAAGA,EAAM,QAAQ,GAAGoB,EAAA;AAAA,MACvC,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,SAAS,CAACC,MAAS;AACjB,MAAAxC,EAAI,CAACmB,MAAU;AACb,QAAAA,EAAM,OAAOqB;AAAA,MACf,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,kBAAkB,CAACL,MAAa;AAC9B,MAAAnC,EAAI,CAACmB,MAAU;AACb,QAAAA,EAAM,OAAO,aACbA,EAAM,cAAc;AAAA,UAClB,WAAW;AAAA,UACX,UAAAgB;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,QAAA;AAAA,MAEd,CAAC;AAAA,IACH;AAAA,IAEA,mBAAmB,CAACM,MAAa;AAC/B,MAAAzC,EAAI,CAACmB,MAAU;AACb,QAAIA,EAAM,YAAY,cACpBA,EAAM,YAAY,WAAWsB;AAAA,MAEjC,CAAC;AAAA,IACH;AAAA,IAEA,gBAAgB,MAAM;AACpB,MAAAzC,EAAI,CAACmB,MAAU;AACb,QAAAA,EAAM,OAAO,UACbA,EAAM,cAAc;AAAA,UAClB,WAAW;AAAA,UACX,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,UAAU;AAAA,QAAA;AAAA,MAEd,CAAC;AAAA,IACH;AAAA,IAEA,mBAAmB,MAAM;AACvB,MAAAnB,EAAI,CAACmB,MAAU;AACb,QAAAA,EAAM,OAAO,UACbA,EAAM,cAAc;AAAA,UAClB,WAAW;AAAA,UACX,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,UAAU;AAAA,QAAA;AAAA,MAEd,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,MAAM;AACV,MAAAnB,EAAI,CAACmB,MAAU;AACb,cAAMuB,IAAYvB,EAAM,QAAQ,KAAK,IAAA;AACrC,QAAIuB,KACFvB,EAAM,QAAQ,OAAO,KAAKuB,CAAS;AAAA,MAEvC,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,MAAM;AACV,MAAA1C,EAAI,CAACmB,MAAU;AACb,cAAMwB,IAAYxB,EAAM,QAAQ,OAAO,IAAA;AACvC,QAAIwB,KACFxB,EAAM,QAAQ,KAAK,KAAKwB,CAAS;AAAA,MAErC,CAAC;AAAA,IACH;AAAA,IAEA,aAAa,CAACC,MAAU;AACtB,MAAA5C,EAAI,CAACmB,MAAU;AACb,QAAAA,EAAM,QAAQ,KAAK,KAAKyB,CAAK,GAC7BzB,EAAM,QAAQ,SAAS,CAAA;AAAA,MACzB,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,cAAc,MAAM;AAClB,YAAMA,IAAQlB,EAAA;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAOkB,EAAM;AAAA,QACb,WAAWA,EAAM;AAAA,QACjB,UAAUA,EAAM;AAAA,QAChB,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,UACtB,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,QAAY;AAAA,MACpC;AAAA,IAEJ;AAAA,IAEA,cAAc,CAAC0B,MAAW;AACxB,MAAA7C,EAAI,CAACmB,MAAU;AACb,QAAAA,EAAM,QAAQ0B,EAAO,SAAS,CAAA,GAC9B1B,EAAM,YAAY0B,EAAO,aAAa,CAAA,GACtC1B,EAAM,WAAW0B,EAAO,YAAYpC,GAAa,UACjDU,EAAM,iBAAiB,MACvBA,EAAM,mBAAmB,MACzBA,EAAM,UAAU,EAAE,MAAM,CAAA,GAAI,QAAQ,CAAA,EAAC;AAAA,MACvC,CAAC;AAAA,IACH;AAAA,EAAA,EACA;AACJ,GC1Za2B,KAA4B;AAAA;AAAA,EAEvC;AAAA,IACE,IAAIhC,EAAA;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK,sBAAsB,mBAAmB,6HAA6H,CAAC;AAAA,EAAA;AAAA,EAE9K;AAAA,IACE,IAAIA,EAAA;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK,sBAAsB,mBAAmB,sHAAsH,CAAC;AAAA,EAAA;AAAA,EAEvK;AAAA,IACE,IAAIA,EAAA;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK,sBAAsB,mBAAmB,8HAA8H,CAAC;AAAA,EAAA;AAAA;AAAA,EAI/K;AAAA,IACE,IAAIA,EAAA;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK,sBAAsB,mBAAmB,6NAA6N,CAAC;AAAA,EAAA;AAAA,EAE9Q;AAAA,IACE,IAAIA,EAAA;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK,sBAAsB,mBAAmB,6SAA6S,CAAC;AAAA,EAAA;AAAA,EAE9V;AAAA,IACE,IAAIA,EAAA;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK,sBAAsB,mBAAmB,yVAAyV,CAAC;AAAA,EAAA;AAAA;AAAA,EAI1Y;AAAA,IACE,IAAIA,EAAA;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,YAAY;AAAA,QACV,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,WAAW;AAAA,MAAA;AAAA,MAEb,YAAY;AAAA,QACV,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,WAAW;AAAA,MAAA;AAAA,IACb;AAAA,EACF;AAAA;AAAA,EAIF;AAAA,IACE,IAAIA,EAAA;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,UAAU;AAAA,IAAA;AAAA,EACZ;AAEJ,GAGaiC,KAAsB,CAACZ,OAAoC;AAAA,EACtE,IAAIrB,EAAA;AAAA,EACJ,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,UAAU,EAAE,GAAGqB,GAAU,IAAIrB,IAAO;AAAA,EACpC,WAAW,CAAA;AACb,IAGakC,KAAoB,CAC/BC,GACAC,GACAf,MACS;AAET,MAAIA,GAAU,SAAS,YAAYA,EAAS,QAAQ,OAAO;AACzD,UAAMgB,IAAWhB,EAAS,OAAO,MAAM,IAAI,CAACiB,OAAqB;AAAA,MAC/D,GAAGA;AAAA,MACH,IAAItC,EAAA;AAAA;AAAA,IAAO,EACX;AAGF,QAAIuC,IAAO,OAAUC,IAAO,OACxBC,IAAO,QAAWC,IAAO;AAE7B,IAAAL,EAAS,QAAQ,CAACM,MAAgB;AAChC,YAAMC,IAAKD,EAAM,YAAY,KAAK,GAC5BE,IAAKF,EAAM,YAAY,KAAK,GAC5BG,IAAKH,EAAM,YAAY,SAAS,GAChCI,IAAKJ,EAAM,YAAY,UAAU;AACvC,MAAAJ,IAAO,KAAK,IAAIA,GAAMK,CAAE,GACxBJ,IAAO,KAAK,IAAIA,GAAMK,CAAE,GACxBJ,IAAO,KAAK,IAAIA,GAAMG,IAAKE,CAAE,GAC7BJ,IAAO,KAAK,IAAIA,GAAMG,IAAKE,CAAE;AAAA,IAC/B,CAAC;AAGD,UAAMC,IAAmBX,EAAS,IAAI,CAACM,OAAiB;AAAA,MACtD,GAAGA;AAAA,MACH,aAAa;AAAA,QACX,GAAGA,EAAM;AAAA,QACT,IAAIA,EAAM,YAAY,KAAK,KAAKJ;AAAA,QAChC,IAAII,EAAM,YAAY,KAAK,KAAKH;AAAA,QAChC,OAAO;AAAA;AAAA,MAAA;AAAA,IACT,EACA;AAEF,WAAO;AAAA,MACL,IAAIxC,EAAA;AAAA,MACJ,MAAMqB,EAAS,QAAQ;AAAA,MACvB,MAAM;AAAA,MACN,aAAa;AAAA,QACX,OAAOoB,IAAOF;AAAA,QACd,QAAQG,IAAOF;AAAA,QACf,GAAAL;AAAA,QACA,GAAAC;AAAA;AAAA,MAAA;AAAA,MAGF,aAAa;AAAA,QACX,YAAY,CAAA;AAAA,QACZ,iBAAiB;AAAA,MAAA;AAAA,MAEnB,aAAa;AAAA,QACX,aAAa;AAAA,QACb,aAAa;AAAA,QACb,aAAa;AAAA,QACb,cAAc;AAAA,MAAA;AAAA,MAEhB,UAAUY;AAAA,IAAA;AAAA,EAEd;AAGA,SAAO;AAAA,IACL,IAAIhD,EAAA;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,MACX,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,GAAAmC;AAAA,MACA,GAAAC;AAAA,MACA,YAAY;AAAA,MACZ,SAAS;AAAA,IAAA;AAAA,IAEX,aAAa;AAAA,MACX,YAAYf,IAAW,CAACY,GAAoBZ,CAAQ,CAAC,IAAI,CAAA;AAAA,MACzD,iBAAiB;AAAA,IAAA;AAAA,IAEnB,aAAa;AAAA,MACX,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb,cAAc;AAAA,IAAA;AAAA,EAChB;AAEJ,GC5KM,EAAA,OAAE4B,OAAUC,IACZ,EAAA,MAAEC,OAASC,IAEJC,KAA0B,MAAM;AAC3C,QAAM;AAAA,IACJ,WAAAC;AAAA,IACA,aAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,MAAAhC;AAAA,IACA,aAAAiC;AAAA,IACA,kBAAAC;AAAA,IACA,mBAAAC;AAAA,EAAA,IACE5D,GAAA,GACE,CAAC6D,GAAYC,CAAa,IAAIC,EAAmB;AAAA,IACrD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD,GAUKC,IAAe,CAACC,MAAe;AACnC,UAAMC,IAAS,IAAI,WAAA;AACnB,WAAAA,EAAO,SAAS,CAAC9G,MAAM;AACrB,YAAM+G,IAAM/G,EAAE,QAAQ;AACtB,MAAAkG,EAAY;AAAA,QACV,MAAMW,EAAK,KAAK,QAAQ,QAAQ,EAAE;AAAA,QAClC,MAAM;AAAA,QACN,KAAAE;AAAA,MAAA,CACW;AAAA,IACf,GACAD,EAAO,cAAcD,CAAI,GAClB;AAAA,EACT,GAGMG,IAAmB;AAAA,IACvB,OAAOf,EAAU;AAAA,MAAO,CAAC/B,MACvB,CAAC,MAAM,MAAM,MAAM,EAAE,SAASA,EAAE,IAAI;AAAA,IAAA;AAAA,IAEtC,QAAQ+B,EAAU;AAAA,MAChB,CAAC/B,MACC,CAAC,MAAM,KAAK,IAAI,EAAE,SAASA,EAAE,IAAI,KAChCA,EAAE,SAAS,WACV,CAAC,CAAC,MAAM,MAAM,MAAM,EAAE,SAASA,EAAE,IAAI,KACrCA,EAAE,SAAS;AAAA,IAAA;AAAA,IAEjB,MAAM+B,EAAU,OAAO,CAAC/B,MAAMA,EAAE,SAAS,MAAM;AAAA,IAC/C,MAAM+B,EAAU,OAAO,CAAC/B,MAAMA,EAAE,SAAS,MAAM;AAAA,IAC/C,OAAO+B,EAAU,OAAO,CAAC/B,MAAMA,EAAE,SAAS,YAAYA,EAAE,QAAQ,KAAK;AAAA,IACrE,QAAQ+B,EAAU;AAAA,MAChB,CAAC/B,MACEA,EAAE,SAAS,YAAY,CAACA,EAAE,QAAQ,SAClCA,EAAE,SAAS,WACV,CAAC,CAAC,MAAM,MAAM,QAAQ,MAAM,KAAK,IAAI,EAAE,SAASA,EAAE,IAAI;AAAA,IAAA;AAAA,EAC5D,GAII+C,IAAkB,CAACjH,GAAoBgE,MAAuB;AAClE,IAAAhE,EAAE,aAAa,gBAAgB,QAC/BA,EAAE,aAAa,QAAQ,oBAAoB,KAAK,UAAUgE,CAAQ,CAAC;AACnE,UAAMkD,IAAYlH,EAAE,cAAc;AAAA,MAChC;AAAA,IAAA;AAEF,IAAIkH,KACFlH,EAAE,aAAa,aAAakH,GAAW,IAAI,EAAE;AAAA,EAEjD,GAGMC,IAA0B,CAACnD,MAAuB;AACtD,IAAIA,EAAS,SAAS,UACpBuC,EAAiBvC,CAAQ;AAAA,EAE7B,GAGMoD,IAAqB,CAACpD,GAAoBqD,IAAsB,OAAU;AAI9E,UAAMC,IAAiBD,MAAe,IAEhCE,IAAgBlD,MAAS,eAAeiD,KAAkBhB,EAAY,UAAU,OAAOtC,EAAS;AAEtG,WACE,gBAAAwD;AAAA,MAACC,GAAK;AAAA,MAAL;AAAA,QAEC,WAAW,CAACH;AAAA,QACZ,aAAa,CAACtH,MAAMiH,EAAgBjH,GAAGgE,CAAQ;AAAA,QAC/C,SAAS,MAAMsD,KAAkBH,EAAwBnD,CAAQ;AAAA,QACjE,WAAW;AAAA;AAAA,YAEPsD,IAAiB,mBAAmB,aAAa;AAAA;AAAA,YAEjDC,IAAgB,oCAAoC,EAAE;AAAA;AAAA,QAE1D,SAAS;AAAA,UACPD,IACE,gBAAAE;AAAA,YAACE;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,wBAAOC,IAAA,EAAa;AAAA,cACpB,SAAS,CAAC3H,MAAM;AACd,gBAAAA,EAAE,gBAAA,GACFmH,EAAwBnD,CAAQ;AAAA,cAClC;AAAA,cACD,UAAA;AAAA,YAAA;AAAA,YARK;AAAA,UAAA,IAWJ;AAAA,UACJ,gBAAAwD;AAAA,YAACE;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,QAAM;AAAA,cACN,wBAAOE,IAAA,EAAe;AAAA,cACtB,SAAS,CAAC5H,MAAM;AACd,gBAAAA,EAAE,gBAAA,GACFmG,EAAenC,EAAS,EAAE;AAAA,cAC5B;AAAA,YAAA;AAAA,YARI;AAAA,UAAA;AAAA,QASN,EACA,OAAO,OAAO;AAAA,QAChB,4BAAC,OAAA,EAAI,WAAW,uCAAuCsD,IAAiB,KAAK,qBAAqB,IAChG,UAAA;AAAA,UAAA,gBAAAE,EAAC,SAAI,WAAU,uGACZ,YAAS,SAAS,WAAYxD,EAAiB,MAC9C,gBAAAwD;AAAA,YAACK;AAAA,YAAA;AAAA,cACC,KAAM7D,EAAiB;AAAA,cACvB,KAAKA,EAAS;AAAA,cACd,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,SAAS;AAAA,YAAA;AAAA,UAAA,IAETA,EAAS,SAAS,2BACnB,QAAA,EAAK,WAAU,yBAAwB,UAAA,IAAA,CAAC,IACvCA,EAAS,SAAS,SACpB,gBAAAwD,EAAC,SAAI,WAAU,wBAAA,CAAwB,IACrCxD,EAAS,SAAS,YAAYA,EAAS,QAAQ,0BAChD,QAAA,EAAK,WAAU,mCAAkC,UAAA,KAAC,IAEnD,gBAAAwD,EAAC,QAAA,EAAK,WAAU,yBAAwB,eAAC,GAE7C;AAAA,UAEA,gBAAAM,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,YAAA,gBAAAN,EAAC1B,MAAK,QAAM,IAAC,WAAU,kBACpB,YAAS,MACZ;AAAA,YACA,gBAAAgC,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,cAAA,gBAAAN,EAAC1B,MAAK,MAAK,aAAY,WAAU,WAC9B,YAAS,MACZ;AAAA,cACCyB,KACC,gBAAAC,EAACO,IAAA,EAAI,OAAM,QAAO,WAAU,WAAU,UAAA,MAAA,CAEtC;AAAA,YAAA,EAAA,CAEJ;AAAA,UAAA,EAAA,CACF;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,MAzEK/D,EAAS;AAAA,IAAA;AAAA,EA4EpB;AAEA,SACE,gBAAA8D,EAAC,OAAA,EAAI,WAAU,0DACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,MAAA,gBAAAN,EAAC,MAAA,EAAG,WAAU,uCAAsC,UAAA,OAAG;AAAA,wBACtD1B,IAAA,EAAK,MAAK,aAAY,WAAU,WAAU,UAAA,cAAA,CAE3C;AAAA,IAAA,GACF;AAAA,IAEA,gBAAA0B,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA,gBAAAA;AAAA,MAACQ;AAAA,MAAA;AAAA,QACC,QAAO;AAAA,QACP,cAAcpB;AAAA,QACd,gBAAgB;AAAA,QAChB,UAAA,gBAAAY,EAACE,GAAA,EAAO,MAAM,gBAAAF,EAACS,IAAA,CAAA,CAAe,GAAI,OAAK,IAAC,MAAK,UAAS,UAAA,SAAA,CAEtD;AAAA,MAAA;AAAA,IAAA,GAEJ;AAAA,IAEA,gBAAAT,EAAC,OAAA,EAAI,WAAU,8BACb,UAAA,gBAAAM;AAAA,MAACjC;AAAA,MAAA;AAAA,QACC,WAAWY;AAAA,QACX,UAAU,CAACyB,MAASxB,EAAcwB,CAAgB;AAAA,QAClD,OAAK;AAAA,QACL,oBAAmB;AAAA,QACnB,UAAA;AAAA,UAAA,gBAAAV,EAAC5B,IAAA,EAAM,QAAO,QACZ,UAAA,gBAAA4B;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,YAAYT,EAAiB;AAAA,cAC7B,YAAY,CAACmB,MAASf,EAAmBe,GAAM,EAAK;AAAA,cACpD,QAAQ;AAAA,gBACN,WACE,gBAAAX;AAAA,kBAACY;AAAA,kBAAA;AAAA,oBACC,aAAY;AAAA,oBACZ,OAAOA,GAAM;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACf;AAAA,YAEJ;AAAA,UAAA,KAXqB,OAazB;AAAA,UAEA,gBAAAZ,EAAC5B,IAAA,EAAM,QAAO,QACZ,UAAA,gBAAA4B;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,YAAYT,EAAiB;AAAA,cAC7B,YAAY,CAACmB,MAASf,EAAmBe,GAAM,EAAK;AAAA,cACpD,QAAQ;AAAA,gBACN,WACE,gBAAAX;AAAA,kBAACY;AAAA,kBAAA;AAAA,oBACC,aAAY;AAAA,oBACZ,OAAOA,GAAM;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACf;AAAA,YAEJ;AAAA,UAAA,KAXqB,QAazB;AAAA,UAEA,gBAAAZ,EAAC5B,IAAA,EAAM,QAAO,MACZ,UAAA,gBAAA4B;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,YAAYT,EAAiB;AAAA,cAC7B,YAAY,CAACmB,MAASf,EAAmBe,GAAM,EAAK;AAAA,cACpD,QAAQ;AAAA,gBACN,WACE,gBAAAX;AAAA,kBAACY;AAAA,kBAAA;AAAA,oBACC,aAAY;AAAA,oBACZ,OAAOA,GAAM;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACf;AAAA,YAEJ;AAAA,UAAA,KAXmB,MAavB;AAAA,UAEA,gBAAAN;AAAA,YAAClC;AAAAA,YAAA;AAAA,cACC,QACE,gBAAAkC,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,gBAAA,gBAAAN,EAAC,UAAK,UAAA,KAAA,CAAE;AAAA,gBACPnD,MAAS,eACR,gBAAAmD,EAACO,IAAA,EAAI,OAAM,QAAO,WAAU,WAAU,UAAA,OAAA,CAEtC;AAAA,cAAA,GAEJ;AAAA,cAGF,UAAA;AAAA,gBAAA,gBAAAP;AAAA,kBAACC;AAAA,kBAAA;AAAA,oBACC,YAAYT,EAAiB;AAAA,oBAC7B,YAAY,CAACmB,MAASf,EAAmBe,GAAM,EAAI;AAAA,oBACnD,QAAQ;AAAA,sBACN,WACE,gBAAAX;AAAA,wBAACY;AAAA,wBAAA;AAAA,0BACC,aAAY;AAAA,0BACZ,OAAOA,GAAM;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBACf;AAAA,kBAEJ;AAAA,gBAAA;AAAA,gBAED/D,MAAS,eACR,gBAAAyD,EAAC,OAAA,EAAI,WAAU,qDACb,UAAA;AAAA,kBAAA,gBAAAN,EAAC,SAAI,UAAA,aAAA,CAAU;AAAA,kBACf,gBAAAA,EAAC,SAAI,UAAA,cAAA,CAAW;AAAA,gBAAA,EAAA,CAClB;AAAA,cAAA;AAAA,YAAA;AAAA,YAjBE;AAAA,UAAA;AAAA,UAqBLR,EAAiB,MAAM,SAAS,KAC/B,gBAAAQ,EAAC5B,IAAA,EAAM,QAAO,MACZ,UAAA,gBAAA4B;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,YAAYT,EAAiB;AAAA,cAC7B,YAAY,CAACmB,MAASf,EAAmBe,GAAM,EAAK;AAAA,cACpD,QAAQ;AAAA,gBACN,WACE,gBAAAX;AAAA,kBAACY;AAAA,kBAAA;AAAA,oBACC,aAAY;AAAA,oBACZ,OAAOA,GAAM;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACf;AAAA,YAEJ;AAAA,UAAA,KAXmB,OAavB;AAAA,UAGDpB,EAAiB,OAAO,SAAS,KAChC,gBAAAQ,EAAC5B,IAAA,EAAM,QAAO,OACZ,UAAA,gBAAA4B;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,YAAYT,EAAiB;AAAA,cAC7B,YAAY,CAACmB,MAASf,EAAmBe,GAAM,EAAK;AAAA,cACpD,QAAQ;AAAA,gBACN,WACE,gBAAAX;AAAA,kBAACY;AAAA,kBAAA;AAAA,oBACC,aAAY;AAAA,oBACZ,OAAOA,GAAM;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACf;AAAA,YAEJ;AAAA,UAAA,KAXoB,QAaxB;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAGN;AAAA,sBAEC,OAAA,EAAI,WAAU,2CACb,UAAA,gBAAAZ,EAAC1B,IAAA,EAAK,MAAK,aAAY,WAAU,WAC9B,UAAAzB,MAAS,cACR,gBAAAmD,EAAAa,IAAA,EAAE,UAAA,sCAAA,CAEF,IAEA,gBAAAb,EAAAa,IAAA,EAAE,UAAA,iCAAA,CAEF,GAEJ,EAAA,CACF;AAAA,EAAA,GACF;AAEJ,GC3UM,EAAE,MAAAvC,OAASC,IAgBXuC,KAA2B,CAAC5E,GAAoBI,MAAwB;AAC5E,MAAI;AAEF,UAAMyE,IACJzE,KAAQ,MAAM,QAAQA,CAAI,IACtBA,EAAK,IAAI,CAAC0E,GAAQhF,MAAkBgF,EAAE,UAAU,IAChD,CAAC,GAAG,GAEJC,IADK,IAAI,SAAS,GAAGF,GAAQ7E,EAAO,UAAU,EAClC,GAAGI,EAAK,IAAI,CAAC0E,MAAWA,EAAE,KAAK,CAAC;AAClD,mBAAQ;AAAA,MACN,sBAAsB9E,EAAO,IAAI;AAAA,MACjCI;AAAA,MACA;AAAA,MACA2E;AAAA,IAAA,GAEKA,MAAW;AAAA,EACpB,SAAS1E,GAAO;AACd,mBAAQ,KAAK,cAAcL,EAAO,IAAI,MAAMK,CAAK,GAC1C;AAAA,EACT;AACF,GAGM2E,KAAmB,CACvBC,GACA7E,MAC2B;AAC3B,aAAWJ,KAAUiF,GAAY;AAC/B,YAAQ,IAAIjF,GAAQ,QAAQ;AAC5B,QAAIkF,IAAkC,CAAA;AAStC,QARI,MAAM,QAAQ9E,CAAI,KACpB,QAAQ,IAAIJ,EAAO,WAAW,WAAW,GACzCkF,IAAW9E,EAAK;AAAA,MAAO,CAAC0E,MACtB9E,EAAO,WAAW,SAAS8E,EAAE,UAAU;AAAA,IAAA,KAGzCI,IAAW9E,GAETwE,GAAyB5E,GAAQkF,CAAQ;AAC3C,aAAOlF;AAAA,EAEX;AAEF,GAGMmF,KAAe,CACnB/E,GACAgF,MACkC;AAClC,MAAI,CAACA,KAAmB,CAAChF;AACvB,WAAO,EAAE,OAAO,OAAA;AAIlB,MAAI,MAAM,QAAQA,CAAI,GAAG;AACvB,UAAMiF,IAAWjF,EAAK,KAAK,CAAC0E,MAAMA,EAAE,eAAeM,CAAe;AAClE,QAAIC;AACF,aAAO;AAAA,QACL,OAAOA,EAAS;AAAA,QAChB,MAAMA,EAAS;AAAA,MAAA;AAAA,EAGrB,WAES,OAAOjF,KAAS,YAAYgF,KAAmBhF;AACtD,WAAO;AAAA,MACL,OAAOA,EAAKgF,CAAe;AAAA,MAC3B,MAAMhF,EAAK;AAAA,IAAA;AAIf,SAAO,EAAE,OAAO,OAAA;AAClB,GAGMkF,KAAc,CAAChI,GAAYiI,MAA8B;AAC7D,MAA2BjI,KAAU,QAAQA,MAAU,GAAI,QAAO;AAGlE,MAAIiI,MAAa,GAAI,QAAO,OAAOjI,CAAK;AAGxC,QAAMkI,IAAM,OAAOlI,CAAK;AACxB,SAAI,MAAMkI,CAAG,IAAU,OAAOlI,CAAK,IAG5BkI,EAAI,QAAQD,KAAY,CAAC;AAClC,GAGME,KAAiB,CAACnF,GAAoBF,GAAYsF,GAAsBtG,MAAgB;AAC5F,UAAQkB,EAAS,MAAA;AAAA,IACf,KAAK;AACH,YAAMqF,IAAgBrF,GAChBsF,IAAUD,EAAc,iBACxBE,IAAYF,EAAc;AAGhC,UAAItC,IAAMsC,EAAc;AACxB,aAAIE,KAAaxC,KAAOA,EAAI,SAAS,oBAAoB,MACnD/C,EAAS,SAAS,OACpB+C,IAAM,sBAAsB,mBAAmB,uGAAuGwC,CAAS,kBAAkB,CAAC,KACzKvF,EAAS,SAAS,OAC3B+C,IAAM,sBAAsB,mBAAmB,uGAAuGwC,CAAS,WAAW,CAAC,KAClKvF,EAAS,SAAS,WAC3B+C,IAAM,sBAAsB,mBAAmB,uGAAuGwC,CAAS,mBAAmB,CAAC,MAKrL,gBAAA/B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,iBAAiB8B,EAAA;AAAA,UAEzB,UAAAvC,IACC,gBAAAS;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAAT;AAAA,cACA,KAAK/C,EAAS;AAAA,cACd,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,WAAW;AAAA,cAAA;AAAA,YACb;AAAA,UAAA,IAGF,gBAAAwD,EAAC,OAAA,EAAI,WAAU,kDACb,4BAAC,QAAA,EAAK,WAAU,yBAAwB,UAAA,MAAA,CAAG,EAAA,CAC7C;AAAA,QAAA;AAAA,MAAA;AAAA,IAKR,KAAK;AACH,YAAMgC,IAAexF,GACf;AAAA,QACJ,OAAAyF;AAAA,QACA,OAAOC;AAAA,QACP,iBAAAZ;AAAA,QACA,MAAMa;AAAA,QACN,UAAAV;AAAA,QACA,YAAAW;AAAA,QACA,YAAAC;AAAA,QACA,aAAAC;AAAA,MAAA,IACEN,EAAa,WAAW,CAAA,GAGtB,EAAE,OAAOO,GAAW,MAAMC,MAAalB,IACzCD,GAAa/E,GAAMgF,CAAe,IAClC,EAAE,OAAO,QAAW,MAAM,OAAA,GAKxBmB,IAAejB,GAFJe,MAAc,SAAYA,IAAYL,GAEZT,CAAQ,GAE7CiB,IAAcP,KAAcK,KAAY;AAE9C,aACE,gBAAAlC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,GAAGgC,EAAA;AAAA,UACX,UAAA;AAAA,YAAAL,KACC,gBAAAjC;AAAA,cAAC1B;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,OAAO;AAAA,kBACP,WAAW;AAAA,kBACX,GAAG8D;AAAA,gBAAA;AAAA,gBAEJ,UAAAH;AAAA,cAAA;AAAA,YAAA;AAAA,YAGJQ,KACC,gBAAAnC;AAAA,cAAChC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,WAAW;AAAA,kBACX,GAAG+D;AAAA,gBAAA;AAAA,gBAEJ,UAAA;AAAA,kBAAAI;AAAA,kBACAC,IAAc,IAAIA,CAAW,KAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UACrC;AAAA,QAAA;AAAA,MAAA;AAAA,IAKR,KAAK;AACH,YAAMC,KAAenG,GACf;AAAA,QACJ,WAAAoG,KAAY;AAAA,QACZ,OAAAC,KAAQ;AAAA,QACR,QAAAC,KAAS;AAAA,QACT,UAAAC,IAAWD,KAAS,WAAW;AAAA,QAC/B,YAAAE,IAAaJ;AAAA;AAAA,QAEb,QAAAK,IAAS;AAAA,QACT,QAAAC,IAAS;AAAA,QACT,MAAAC,IAAO;AAAA,QACP,MAAAC,IAAO;AAAA,MAAA,IACLT,GAAa,UAAU,CAAA,GAuBrBU,KApBe,CAACrI,OAAyB;AAC7C,cAAMsI,IAAa,KAAK,IAAIN,GAAY,CAAC;AACzC,gBAAQhI,IAAA;AAAA,UACN,KAAK;AACH,mBAAO;AAAA,UACT,KAAK;AACH,mBAAO,GAAGsI,IAAa,CAAC,IAAIA,IAAa,CAAC;AAAA,UAC5C,KAAK;AACH,mBAAO,GAAGA,IAAa,EAAE,IAAIA,IAAa,CAAC,IAAIA,IAAa,CAAC,IAAIA,IAAa,CAAC;AAAA,UACjF,KAAK;AACH,mBAAO,GAAGA,IAAa,EAAE,IAAIA,IAAa,CAAC,IAAIA,IAAa,CAAC,IAAIA,IAAa,CAAC,IAAIA,IAAa,CAAC,IAAIA,IAAa,CAAC;AAAA,UACrH,KAAK;AACH,mBAAO,GAAGA,CAAU,IAAIA,IAAa,CAAC;AAAA,UACxC,KAAK;AACH,mBAAO,GAAGA,IAAa,CAAC,IAAIA,IAAa,CAAC,IAAIA,CAAU,IAAIA,IAAa,CAAC;AAAA,UAC5E;AACE,mBAAO;AAAA,QAAA;AAAA,MAEb,GAE+BP,CAAQ,GAGjCQ,IAAc3B,IAAa,YAAYiB;AAI7C,aACE,gBAAA7C,EAAC,SAAI,WAAU,0BAAyB,OAAO,EAAE,UAAU,aACzD,UAAA,gBAAAM;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAM;AAAA,UACN,QAAO;AAAA,UACP,OAAO,EAAE,UAAU,WAAW,eAAe,OAAA;AAAA,UAE7C,UAAA;AAAA,YAAA,gBAAAN;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,IAAIiD;AAAA,gBACJ,IAAIC;AAAA,gBACJ,IAAIC;AAAA,gBACJ,IAAIC;AAAA,gBACJ,QAAO;AAAA,gBACP,aAAa,KAAK,IAAIJ,GAAY,EAAE;AAAA,gBACpC,eAAc;AAAA,gBACd,gBAAe;AAAA,gBACf,OAAO,EAAE,eAAe,UAAU,QAAQ,UAAA;AAAA,cAAU;AAAA,YAAA;AAAA,YAGtD,gBAAAhD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,IAAIiD;AAAA,gBACJ,IAAIC;AAAA,gBACJ,IAAIC;AAAA,gBACJ,IAAIC;AAAA,gBACJ,QAAQG;AAAA,gBACR,aAAaP;AAAA,gBACb,iBAAiBK;AAAA,gBACjB,eAAc;AAAA,gBACd,gBAAe;AAAA,gBACf,OAAO,EAAE,eAAe,OAAA;AAAA,cAAO;AAAA,YAAA;AAAA,UACjC;AAAA,QAAA;AAAA,MAAA,GAEJ;AAAA,IAGJ,KAAK;AACH,YAAMG,KAAiBhH;AACvB,aAAIgH,GAAe,SACVA,GAAe,OAAO,EAAE,IAG/B,gBAAAxD,EAAC,SAAI,WAAU,8DACb,4BAAC,QAAA,EAAK,WAAU,yBAAwB,UAAA,QAAA,CAAK,EAAA,CAC/C;AAAA,IAGJ;AACE,aACE,gBAAAA,EAAC,SAAI,WAAU,8DACb,4BAAC,QAAA,EAAK,WAAU,yBAAwB,UAAA,OAAA,CAAI,EAAA,CAC9C;AAAA,EAAA;AAGR,GAEMyD,KAAqD,CAAC;AAAA,EAC1D,MAAAnI;AAAA,EACA,YAAAsG,IAAa;AAAA,EACb,SAAA8B;AAAA,EACA,aAAAC;AAAA,EACA,MAAArH;AAAA,EACA,cAAAsH;AAAA,EACA,OAAOC,IAAc;AACvB,MAAM;AACJ,QAAM,EAAE,aAAAC,GAAa,aAAAC,GAAa,aAAAC,EAAA,IAAgB1I,GAC5C,EAAE,YAAA6F,MAAe4C,GACjB,EAAE,aAAAE,GAAa,aAAAC,GAAa,aAAAC,EAAA,IAAgBH,GAG5CI,IAAaC,GAAOX,CAAO;AACjC,EAAAU,EAAW,UAAUV;AAGrB,QAAM,CAACY,GAAeC,CAAgB,IAAIpF,EAAiC,IAAI,GACzEqF,IAAgBH,GASZ,IAAI,GAERI,IAAgBJ,GAKZ,IAAI,GAERK,IAAkBL,GAGd,IAAI,GACRM,IAAUN,GAAuB,IAAI,GAGrC,CAACO,GAAUC,EAAW,IAAI1F,EAQtB,IAAI,GAGR,CAAC2F,IAAUC,EAAW,IAAI5F,EAMtB,IAAI,GAER6F,KAAmBX,GAAsB,IAAI,GAG7CY,IAAgBC,GAAQ,MAAM;AAClC,QAAI/D,EAAW,WAAW,EAAG;AAG7B,UAAMgE,IAAejE,GAAiBC,GAAY7E,CAAI;AACtD,WAAI6I,KAGGhE,EAAW,CAAC;AAAA,EACrB,GAAG,CAACA,GAAY7E,CAAI,CAAC,GAGf8I,IAAkBH,GAAe,UAGjCI,IAASD,GAAiB,SAAS,QAGnCE,IAAaD,IAAUD,EAAiC,SAAS,MAGjEG,IAAYzB,EAAY,SAAS,GACjC0B,KAAe1B,EAAY,SAAS,OAAOyB,GAC3CE,KAAgB3B,EAAY,UAAU,OAAOyB,GAG7CG,IAA0BC,EAAY,MAAM;AAChD,UAAMC,IAAWjB,EAAQ,SAAS,QAAQ,sBAAsB;AAChE,QAAI,CAACiB,EAAU,QAAO/B;AACtB,UAAMgC,IAAaD,EAAS,sBAAA,GACtBE,IAAe,WAAWF,EAAS,MAAM,KAAK;AACpD,WAAKE,IACED,EAAW,QAAQC,IADAjC;AAAA,EAE5B,GAAG,CAACA,CAAW,CAAC,GAGVkC,IAAuBJ,EAAY,CAACnN,GAAqBwN,MAA2B;AACxF,IAAAxN,EAAE,gBAAA,GACFA,EAAE,eAAA,GACFgM,EAAc,UAAU;AAAA,MACtB,QAAQhM,EAAE;AAAA,MACV,QAAQA,EAAE;AAAA,MACV,QAAQ8M,GAAY,UAAU;AAAA,MAC9B,QAAQA,GAAY,UAAU;AAAA,MAC9B,MAAMA,GAAY,QAAQ;AAAA,MAC1B,MAAMA,GAAY,QAAQ;AAAA,MAC1B,OAAOxB,EAAY,KAAK;AAAA,MACxB,OAAOA,EAAY,KAAK;AAAA,IAAA,GAE1BS,EAAiByB,CAAK;AAAA,EACxB,GAAG,CAACV,GAAYxB,EAAY,GAAGA,EAAY,CAAC,CAAC;AAG7C,EAAAmC,GAAU,MAAM;AACd,QAAI,CAAC3B,KAAiB,CAACe,KAAU,CAACC,KAAc,CAAC1B,EAAc;AAE/D,UAAMsC,IAAkB,CAAC1N,MAAkB;AACzC,YAAM2N,IAAS3B,EAAc;AAC7B,UAAI,CAAC2B,KAAU,CAACxB,EAAQ,QAAS;AAEjC,YAAMyB,KAAiBV,EAAA,GACjBW,MAAW7N,EAAE,UAAU2N,EAAO,UAAUC,IACxCE,MAAW9N,EAAE,UAAU2N,EAAO,UAAUC;AAE9C,UAAIG,IAAYJ,EAAO,QACnBK,KAAYL,EAAO,QACnBM,KAAUN,EAAO,MACjBO,KAAUP,EAAO,MACjBQ,KAAWR,EAAO,OAClBS,KAAWT,EAAO;AAEtB,MAAI7B,MAAkB,WACpBiC,IAAYJ,EAAO,SAASE,IAC5BG,KAAYL,EAAO,SAASG,IACxBC,IAAY,MACdI,KAAWR,EAAO,QAAQI,GAC1BE,KAAUN,EAAO,OAAOI,GACxBA,IAAY,IAEVC,KAAY,MACdI,KAAWT,EAAO,QAAQK,IAC1BE,KAAUP,EAAO,OAAOK,IACxBA,KAAY,OAGdC,KAAUN,EAAO,OAAOE,IACxBK,KAAUP,EAAO,OAAOG,IACpBG,KAAU,MACZE,KAAWR,EAAO,QAAQM,IAC1BF,IAAYJ,EAAO,SAASM,IAC5BA,KAAU,IAERC,KAAU,MACZE,KAAWT,EAAO,QAAQO,IAC1BF,KAAYL,EAAO,SAASO,IAC5BA,KAAU;AAId,YAAMG,KAAc,KAAK,KAAKvB,EAAW,cAAc,KAAK,GAAG,CAAC,GAC1D1H,KAAO,KAAK,IAAI2I,GAAWE,EAAO,GAClC5I,KAAO,KAAK,IAAI2I,IAAWE,EAAO,GAClCI,KAAW,KAAK,IAAIlJ,IAAMiJ,EAAW,GACrCE,KAAY,KAAK,IAAIlJ,IAAMgJ,EAAW;AAG5C,MAAApC,EAAc,UAAU;AAAA,QACtB,OAAOkC;AAAA,QAAU,OAAOC;AAAA,QACxB,OAAOE;AAAA,QAAU,QAAQC;AAAA,QACzB,QAAQR;AAAA,QAAW,QAAQC;AAAA,QAC3B,MAAMC;AAAA,QAAS,MAAMC;AAAA,MAAA;AAIvB,YAAMM,KAAKrC,EAAQ;AACnB,MAAAqC,GAAG,MAAM,OAAO,GAAGL,EAAQ,MAC3BK,GAAG,MAAM,MAAM,GAAGJ,EAAQ,MAC1BI,GAAG,MAAM,QAAQ,GAAGF,EAAQ,MAC5BE,GAAG,MAAM,SAAS,GAAGD,EAAS,MAGhBC,GAAG,iBAAiB,UAAU,EACtC,QAAQ,CAAAC,MAAQ;AACpB,QAAAA,EAAK,aAAa,MAAM,OAAOV,CAAS,CAAC,GACzCU,EAAK,aAAa,MAAM,OAAOT,EAAS,CAAC,GACzCS,EAAK,aAAa,MAAM,OAAOR,EAAO,CAAC,GACvCQ,EAAK,aAAa,MAAM,OAAOP,EAAO,CAAC;AAAA,MACzC,CAAC;AAGD,YAAMQ,KAAcF,GAAG,cAAc,uBAAuB,GACtDG,KAAYH,GAAG,cAAc,qBAAqB;AACxD,MAAIE,OACFA,GAAY,MAAM,OAAO,GAAGX,IAAY,CAAC,MACzCW,GAAY,MAAM,MAAM,GAAGV,KAAY,CAAC,OAEtCW,OACFA,GAAU,MAAM,OAAO,GAAGV,KAAU,CAAC,MACrCU,GAAU,MAAM,MAAM,GAAGT,KAAU,CAAC;AAAA,IAExC,GAEMU,IAAgB,MAAM;AAC1B,YAAMnG,IAASwD,EAAc;AAC7B,MAAIxD,KACF2C,EAAatI,EAAK,IAAI;AAAA,QACpB,aAAa;AAAA,UACX,GAAGwI;AAAA,UACH,GAAG7C,EAAO;AAAA,UACV,GAAGA,EAAO;AAAA,UACV,OAAOA,EAAO;AAAA,UACd,QAAQA,EAAO;AAAA,QAAA;AAAA,QAEjB,aAAa;AAAA,UACX,GAAG8C;AAAA,UACH,YAAY5C,EAAW,IAAI,CAAA9E,OAAM;AAAA,YAC/B,GAAGA;AAAA,YACH,UAAUA,EAAE,SAAS,SAAS,SAAS;AAAA,cACrC,GAAGA,EAAE;AAAA,cACL,QAAQ;AAAA,gBACN,GAAGiJ;AAAA,gBACH,QAAQrE,EAAO;AAAA,gBACf,QAAQA,EAAO;AAAA,gBACf,MAAMA,EAAO;AAAA,gBACb,MAAMA,EAAO;AAAA,cAAA;AAAA,YACf,IACE5E,EAAE;AAAA,UAAA,EACN;AAAA,QAAA;AAAA,MACJ,CACD,GAEHkI,EAAiB,IAAI,GACrBC,EAAc,UAAU,MACxBC,EAAc,UAAU;AAAA,IAC1B;AAEA,kBAAO,iBAAiB,aAAayB,CAAe,GACpD,OAAO,iBAAiB,WAAWkB,CAAa,GAEzC,MAAM;AACX,aAAO,oBAAoB,aAAalB,CAAe,GACvD,OAAO,oBAAoB,WAAWkB,CAAa;AAAA,IACrD;AAAA,EACF,GAAG,CAAC9C,GAAee,GAAQC,GAAYhK,EAAK,IAAIwI,GAAaC,GAAa5C,GAAYyC,GAAc8B,CAAuB,CAAC,GAG5HO,GAAU,MAAM;AACd,QAAI,CAACrB,KAAY,CAAChB,EAAc;AAEhC,UAAMsC,IAAkB,CAAC1N,MAAkB;AACzC,UAAI,CAACmM,EAAQ,QAAS;AACtB,YAAMyB,IAAiBV,EAAA,GACjB2B,MAAM7O,EAAE,UAAUoM,EAAS,UAAUwB,GACrCkB,MAAM9O,EAAE,UAAUoM,EAAS,UAAUwB;AAE3C,UAAIU,KAAWlC,EAAS,YACpBmC,IAAYnC,EAAS,aACrB2C,KAAO3C,EAAS,YAChB4C,KAAO5C,EAAS;AAEpB,cAAQA,EAAS,QAAA;AAAA,QACf,KAAK;AACH,UAAAkC,KAAW,KAAK,IAAI,IAAIlC,EAAS,aAAayC,EAAE,GAChDN,IAAY,KAAK,IAAI,IAAInC,EAAS,cAAc0C,EAAE;AAClD;AAAA,QACF,KAAK;AACH,UAAAR,KAAW,KAAK,IAAI,IAAIlC,EAAS,aAAayC,EAAE,GAChDN,IAAY,KAAK,IAAI,IAAInC,EAAS,cAAc0C,EAAE,GAClDC,KAAO3C,EAAS,cAAcA,EAAS,aAAakC;AACpD;AAAA,QACF,KAAK;AACH,UAAAA,KAAW,KAAK,IAAI,IAAIlC,EAAS,aAAayC,EAAE,GAChDN,IAAY,KAAK,IAAI,IAAInC,EAAS,cAAc0C,EAAE,GAClDE,KAAO5C,EAAS,cAAcA,EAAS,cAAcmC;AACrD;AAAA,QACF,KAAK;AACH,UAAAD,KAAW,KAAK,IAAI,IAAIlC,EAAS,aAAayC,EAAE,GAChDN,IAAY,KAAK,IAAI,IAAInC,EAAS,cAAc0C,EAAE,GAClDC,KAAO3C,EAAS,cAAcA,EAAS,aAAakC,KACpDU,KAAO5C,EAAS,cAAcA,EAAS,cAAcmC;AACrD;AAAA,MAAA;AAGJ,MAAArC,EAAgB,UAAU,EAAE,GAAG6C,IAAM,GAAGC,IAAM,OAAOV,IAAU,QAAQC,EAAA;AAEvE,YAAMC,KAAKrC,EAAQ;AACnB,MAAAqC,GAAG,MAAM,OAAO,GAAGO,EAAI,MACvBP,GAAG,MAAM,MAAM,GAAGQ,EAAI,MACtBR,GAAG,MAAM,QAAQ,GAAGF,EAAQ,MAC5BE,GAAG,MAAM,SAAS,GAAGD,CAAS;AAAA,IAChC,GAEMK,IAAgB,MAAM;AAC1B,YAAMnG,IAASyD,EAAgB;AAC/B,MAAIzD,KACF2C,EAAatI,EAAK,IAAI;AAAA,QACpB,aAAa;AAAA,UACX,GAAGwI;AAAA,UACH,GAAG7C,EAAO;AAAA,UACV,GAAGA,EAAO;AAAA,UACV,OAAOA,EAAO;AAAA,UACd,QAAQA,EAAO;AAAA,QAAA;AAAA,MACjB,CACD,GAEH4D,GAAY,IAAI,GAChBH,EAAgB,UAAU;AAAA,IAC5B;AAEA,kBAAO,iBAAiB,aAAawB,CAAe,GACpD,OAAO,iBAAiB,WAAWkB,CAAa,GAEzC,MAAM;AACX,aAAO,oBAAoB,aAAalB,CAAe,GACvD,OAAO,oBAAoB,WAAWkB,CAAa;AAAA,IACrD;AAAA,EACF,GAAG,CAACxC,GAAUhB,GAActI,EAAK,IAAIwI,GAAa4B,CAAuB,CAAC;AAG1E,QAAM+B,KAAoB9B,EAAY,CAACnN,GAAqBkP,MAAsC;AAChG,IAAAlP,EAAE,gBAAA,GACFA,EAAE,eAAA,GACFqM,GAAY;AAAA,MACV,QAAA6C;AAAA,MACA,QAAQlP,EAAE;AAAA,MACV,QAAQA,EAAE;AAAA,MACV,YAAYsL,EAAY,SAAS;AAAA,MACjC,aAAaA,EAAY,UAAU;AAAA,MACnC,YAAYA,EAAY,KAAK;AAAA,MAC7B,YAAYA,EAAY,KAAK;AAAA,IAAA,CAC9B;AAAA,EACH,GAAG,CAACA,EAAY,OAAOA,EAAY,QAAQA,EAAY,GAAGA,EAAY,CAAC,CAAC,GAGlE6D,KAAoBhC,EAAY,CAACnN,MAAwB;AAC7D,IAAAA,EAAE,gBAAA,GACFA,EAAE,eAAA;AAGF,UAAMoP,IAAOjD,EAAQ,SAAS,sBAAA;AAC9B,IAAKiD,KAEL7C,GAAY;AAAA,MACV,QAAQvM,EAAE;AAAA,MACV,QAAQA,EAAE;AAAA,MACV,YAAYsL,EAAY,UAAU;AAAA,MAClC,SAAS8D,EAAK,OAAOA,EAAK,QAAQ;AAAA,MAClC,SAASA,EAAK,MAAMA,EAAK,SAAS;AAAA,IAAA,CACnC;AAAA,EACH,GAAG,CAAC9D,EAAY,MAAM,CAAC;AAGvB,EAAAmC,GAAU,MAAM;AACd,QAAI,CAACnB,GAAU;AAEf,UAAMoB,IAAkB,CAAC1N,MAAkB;AACzC,YAAM6O,IAAK7O,EAAE,UAAUsM,GAAS,SAC1BwC,KAAK9O,EAAE,UAAUsM,GAAS;AAGhC,UAAI+C,MAFU,KAAK,MAAMP,IAAID,CAAE,KAAK,MAAM,KAAK,MAEvB,MAAM;AAK9B,UAJIQ,KAAW,MAAGA,MAAY,MAG9B7C,GAAiB,UAAU6C,IACvBlD,EAAQ,SAAS;AACnB,cAAMmD,IAAQhE,EAAY,aAAa;AACvC,QAAAa,EAAQ,QAAQ,MAAM,YAAY,UAAUkD,EAAQ,QAAQC,CAAK,GAAG,KAAA;AAAA,MACtE;AAAA,IACF,GAEMV,IAAgB,MAAM;AAC1B,YAAMW,IAAa/C,GAAiB,WAAWF,GAAS;AACxD,MAAAE,GAAiB,UAAU,MAEvBpB,KACFA,EAAatI,EAAK,IAAI;AAAA,QACpB,aAAa;AAAA,UACX,GAAGwI;AAAA,UACH,QAAQ,KAAK,MAAMiE,CAAU;AAAA,QAAA;AAAA,MAC/B,CACD,GAEHhD,GAAY,IAAI;AAAA,IAClB;AAEA,kBAAO,iBAAiB,aAAamB,CAAe,GACpD,OAAO,iBAAiB,WAAWkB,CAAa,GAEzC,MAAM;AACX,aAAO,oBAAoB,aAAalB,CAAe,GACvD,OAAO,oBAAoB,WAAWkB,CAAa;AAAA,IACrD;AAAA,EACF,GAAG,CAACtC,IAAUlB,GAActI,EAAK,IAAIwI,CAAW,CAAC;AAGjD,QAAMkE,IAAU1M,EAAK,SAAS,SAGxB2M,KAAgC;AAAA,IACpC,UAAU;AAAA,IACV,MAAMnE,EAAY,KAAK;AAAA,IACvB,KAAKA,EAAY,KAAK;AAAA,IACtB,OAAO0B;AAAA,IACP,QAAQC;AAAA;AAAA,IAER,YAAYuC,IAAU,gBAAiBlE,EAAY,cAAc;AAAA,IACjE,iBAAiBkE,IAAU,SAAalE,EAAY,kBAChD,OAAOA,EAAY,eAAe,MAClC;AAAA,IACJ,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,SAAS,MAAM,QAAQA,EAAY,OAAO,IACtCA,EAAY,QAAQ,KAAK,KAAK,IAAI,OAClCA,EAAY;AAAA,IAChB,QAAQ,MAAM,QAAQA,EAAY,MAAM,IACpCA,EAAY,OAAO,KAAK,KAAK,IAAI,OACjCA,EAAY;AAAA,IAChB,cAAckE,IAAU,SAAYlE,EAAY;AAAA;AAAA;AAAA,IAGhD,QAAQlC,KAAc,CAACyD,IACnB,sBACAA,KAEE2C,IADA,SAGElE,EAAY,UAAU;AAAA;AAAA,IAE9B,eAAe;AAAA,IACf,SAASA,EAAY,WAAW;AAAA,IAChC,WAAW,UAAUkB,GAAiB,YAAYlB,EAAY,UAAU,EAAE,QAAQA,EAAY,aAAa,EAAE,GAAG,KAAA;AAAA,IAChH,iBAAiB;AAAA,IACjB,QAAQlC,IAAa,MAAQkC,EAAY,UAAU;AAAA,IACnD,QAAQI,KAAe,CAACI,IAAgB,SAASL,IAAc,YAAY;AAAA,IAC3E,WAAW;AAAA;AAAA,IAEX,UAAUrC,KAAcyD,KAAU2C,IAAU,YAAY;AAAA,EAAA,GAIpDE,KAAgB5C,IAAa,EAAE,GAAGA,EAAW,UAAU,GAAG,GAAGA,EAAW,UAAU,MAAM,EAAE,GAAG,GAAG,GAAG,EAAA,GACnG6C,KAAc7C,IAAa,EAAE,GAAGA,EAAW,QAAQ,GAAG,GAAGA,EAAW,QAAQ,MAAM,EAAE,GAAG,GAAG,GAAG,EAAA;AAEnG,SACE,gBAAAhF;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKqE;AAAA,MACL,gBAAcrJ,EAAK;AAAA,MACnB,OAAO2M;AAAA,MACP,SAAS,CAACzP,MAAM;AACd,gBAAQ,IAAI,wBAAwB8C,EAAK,IAAI,gBAAgB2I,CAAW;AAExE,cAAMmE,IAAgBhE,EAAW;AACjC,QAAIH,KAAemE,KAAiB,CAAC9D,KAAiB,CAACM,KAAY,CAACE,OAClEtM,EAAE,gBAAA,GACF4P,EAAc5P,CAAC;AAAA,MAGnB;AAAA,MACA,aAAa,CAACA,MAAM;AAClB,QAAI0L,KAAeP,KAAe,CAACW,KACjCX,EAAYnL,CAAC;AAAA,MAEjB;AAAA,MAEC,UAAA;AAAA,QAAAoJ,KAAc,CAACyD,KAAU,CAAC2C,KACzB,gBAAA1H,EAAAO,IAAA,EAEE,UAAA;AAAA,UAAA,gBAAAb;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,QAAQ,MAAM,eAAe,QAAQ,QAAQ,aAAa,WAAW,QAAQ,YAAY,OAAA;AAAA,cAClG,aAAa,CAACxH,MAAMiP,GAAkBjP,GAAG,IAAI;AAAA,cAC7C,OAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAER,gBAAAwH;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,QAAQ,MAAM,eAAe,QAAQ,QAAQ,aAAa,WAAW,QAAQ,aAAa,OAAA;AAAA,cACnG,aAAa,CAACxH,MAAMiP,GAAkBjP,GAAG,IAAI;AAAA,cAC7C,OAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAER,gBAAAwH;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,QAAQ,MAAM,eAAe,QAAQ,QAAQ,aAAa,cAAc,QAAQ,YAAY,OAAA;AAAA,cACrG,aAAa,CAACxH,MAAMiP,GAAkBjP,GAAG,IAAI;AAAA,cAC7C,OAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAER,gBAAAwH;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,QAAQ,MAAM,eAAe,QAAQ,QAAQ,aAAa,cAAc,QAAQ,aAAa,OAAA;AAAA,cACtG,aAAa,CAACxH,MAAMiP,GAAkBjP,GAAG,IAAI;AAAA,cAC7C,OAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAIR,gBAAAwH;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,QAAQ,MAAM,eAAe,QAAQ,QAAQ,QAAQ,WAAW,SAAS,WAAW,oBAAoB,WAAW,0BAAA;AAAA,cAC5H,aAAa,CAACxH,MAAMmP,GAAkBnP,CAAC;AAAA,cACvC,OAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAGR,gBAAAwH;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,QAAQ,MAAM,eAAe,QAAQ,WAAW,SAAS,WAAW,mBAAA;AAAA,YAAmB;AAAA,UAAA;AAAA,UAIlG,gBAAAM,EAAC,OAAA,EAAI,WAAU,+FACZ,UAAA;AAAA,YAAAhF,EAAK;AAAA,YAAK;AAAA,YAAE2J,IAAgB,IAAIA,EAAc,IAAI,MAAM;AAAA,UAAA,EAAA,CAC3D;AAAA,QAAA,GACF;AAAA,QAIDrD,KAAcyD,KAAUC,KAAc1B,KACrC,gBAAAtD,EAAAO,IAAA,EAEE,UAAA;AAAA,UAAA,gBAAAb;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,MAAMkI,GAAc,IAAI;AAAA,gBACxB,KAAKA,GAAc,IAAI;AAAA,gBACvB,WAAW;AAAA,cAAA;AAAA,cAEb,aAAa,CAAC1P,MAAMuN,EAAqBvN,GAAG,OAAO;AAAA,cACnD,OAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAGR,gBAAAwH;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,MAAMmI,GAAY,IAAI;AAAA,gBACtB,KAAKA,GAAY,IAAI;AAAA,gBACrB,WAAW;AAAA,cAAA;AAAA,cAEb,aAAa,CAAC3P,MAAMuN,EAAqBvN,GAAG,KAAK;AAAA,cACjD,OAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAIR,gBAAAwH,EAAC,OAAA,EAAI,WAAU,+FACZ,YAAK,KAAA,CACR;AAAA,QAAA,GACF;AAAA,0BAID,OAAA,EAAI,WAAU,0BACZ,UAAAoF,sBACE,OAAA,EAAI,WAAU,iBACZ,UAAAzD,GAAeyD,GAAiB9I,GAAMsF,CAAgB,EAAA,CACzD,IACGoG,IAKD;AAAA;AAAA,UAHF,gBAAAhI,EAAC,OAAA,EAAI,WAAU,wEAAuE,UAAA,MAAA,CAEtF;AAAA,WAEJ;AAAA,QAGC1E,EAAK,SAAS,WAAWA,EAAK,8BAC5B,OAAA,EAAI,WAAU,wCACZ,UAAAA,EAAK,SAAS,IAAI,CAAAmC,MACjB,gBAAAuC,EAAC,OAAA,EAAuB,WAAU,uBAChC,UAAA,gBAAAA;AAAA,UAACqI;AAAA,UAAA;AAAA,YACC,MAAM5K;AAAA,YACN,YAAY;AAAA,YACZ,MAAAnB;AAAA,YACA,cAAAsH;AAAA,YACA,OAAOC;AAAA,UAAA;AAAA,QAAA,KANDpG,EAAU,EAQpB,CACD,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR,GAKa4K,KAAeC,GAAM,KAAK7E,IAAuB,CAAC8E,GAAWC,MAAc;AACtF,QAAMC,IAAQF,EAAU,MAClBG,IAAQF,EAAU,MAGlBG,IACJF,EAAM,OAAOC,EAAM,MACnBD,EAAM,YAAY,MAAMC,EAAM,YAAY,KAC1CD,EAAM,YAAY,MAAMC,EAAM,YAAY,KAC1CD,EAAM,YAAY,UAAUC,EAAM,YAAY,SAC9CD,EAAM,YAAY,WAAWC,EAAM,YAAY,QAG3CE,IAAeH,EAAM,gBAAgBC,EAAM,aAG3CG,IACJN,EAAU,eAAeC,EAAU,cACnCD,EAAU,UAAUC,EAAU;AAEhC,SAAOG,KAAkBC,KAAgBC;AAC3C,CAAC,GCj5BKC,KAAe;AAAA,EACnB;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EACjC;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EACjC;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EACjC;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AACnC,GAEaC,KAA0C,CAAC;AAAA,EACtD,OAAAvP,IAAQ;AAAA,EACR,UAAAwP;AAAA,EACA,kBAAAC;AACF,MAAM;AACJ,QAAM,CAACC,GAASC,CAAU,IAAIhK,EAAS,EAAK,GACtC,CAACiK,GAAYC,CAAa,IAAIlK,EAAS3F,CAAK,GAC5C8P,IAAajF,GAAuB,IAAI;AAE9C,EAAA4B,GAAU,MAAM;AACd,IAAAoD,EAAc7P,CAAK;AAAA,EACrB,GAAG,CAACA,CAAK,CAAC,GAEVyM,GAAU,MAAM;AACd,UAAMsD,IAAqB,CAAC/Q,MAAkB;AAC5C,MAAI8Q,EAAW,WAAW,CAACA,EAAW,QAAQ,SAAS9Q,EAAE,MAAc,MACrE2Q,EAAW,EAAK,GAChBF,IAAmB,EAAE,aAAa,MAAMG,GAAY;AAAA,IAExD;AACA,WAAIF,KACF,SAAS,iBAAiB,aAAaK,CAAkB,GAEpD,MAAM,SAAS,oBAAoB,aAAaA,CAAkB;AAAA,EAC3E,GAAG,CAACL,GAASD,GAAkBG,CAAU,CAAC;AAE1C,QAAMI,IAAoB,CAAC3G,MAAkB;AAC3C,IAAAwG,EAAcxG,CAAK,GACnBmG,IAAW,EAAE,aAAa,MAAMnG,GAAO;AAAA,EACzC;AAEA,SACE,gBAAAvC,EAAC,OAAA,EAAI,KAAKgJ,GAAY,OAAO,EAAE,UAAU,YAAY,SAAS,eAAA,GAC5D,UAAA;AAAA,IAAA,gBAAAtJ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS,MAAMmJ,EAAW,CAACD,CAAO;AAAA,QAClC,OAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,iBAAiBE;AAAA,UACjB,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,QAAQ;AAAA,QAAA;AAAA,MACV;AAAA,IAAA;AAAA,IAEDF,KACC,gBAAA5I;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,KAAK;AAAA,UACL,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,cAAc;AAAA,UACd,WAAW;AAAA,UACX,QAAQ;AAAA,QAAA;AAAA,QAGV,UAAA;AAAA,UAAA,gBAAAN,EAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,qBAAqB,kBAAkB,KAAK,EAAA,GACxE,UAAA8I,GAAa,IAAI,CAACjG,MACjB,gBAAA7C;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,SAAS,MAAM;AACb,gBAAAwJ,EAAkB3G,CAAK,GACvBsG,EAAW,EAAK,GAChBF,IAAmB,EAAE,aAAa,MAAMpG,GAAO;AAAA,cACjD;AAAA,cACA,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,iBAAiBA;AAAA,gBACjB,QAAQuG,MAAevG,IAAQ,sBAAsB;AAAA,gBACrD,cAAc;AAAA,gBACd,QAAQ;AAAA,cAAA;AAAA,YACV;AAAA,YAbKA;AAAA,UAAA,CAeR,GACH;AAAA,UACA,gBAAA7C;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAOoJ;AAAA,cACP,UAAU,CAAC5Q,MAAMgR,EAAkBhR,EAAE,OAAO,KAAK;AAAA,cACjD,QAAQ,MAAMyQ,IAAmB,EAAE,aAAa,MAAMG,GAAY;AAAA,cAClE,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,WAAW;AAAA,gBACX,QAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,cAAc;AAAA,cAAA;AAAA,YAChB;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GAEJ;AAEJ,GCxEM,EAAA,UAAEK,OAAaC,IAMRC,KAAgC,CAAC,EAAE,iBAAAC,QAAsB;AACpE,QAAMC,IAAexF,GAA6B,IAAI,GAChDyF,IAAYzF,GAAuB,IAAI,GACvC0F,IAAa1F,GAAuB,IAAI,GAExC;AAAA,IACJ,OAAA2F;AAAA,IACA,gBAAAC;AAAA,IACA,MAAApN;AAAA,IACA,aAAAiC;AAAA,IACA,UAAAnC;AAAA,IACA,QAAAuN;AAAA,IACA,aAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,SAAAC;AAAA,IACA,YAAAC;AAAA,IACA,YAAAC;AAAA,IACA,YAAAC;AAAA,IACA,MAAAC;AAAA,IACA,MAAAC;AAAA,IACA,SAAAC;AAAA,IACA,kBAAA5L;AAAA,IACA,gBAAA6L;AAAA,IACA,mBAAA5L;AAAA,EAAA,IACE5D,GAAA,GAEE,CAACyP,IAAYC,EAAa,IAAI3L,EAAS,EAAK,GAC5C,GAAG4L,EAAW,IAAI5L,EAAS,EAAE,GAC7B6L,KAAU3G,GAAOxH,CAAI;AAC3B,EAAAoJ,GAAU,MAAM;AACd,IAAA+E,GAAQ,UAAUnO;AAAA,EACpB,GAAG,CAACA,CAAI,CAAC;AAET,QAAMoO,IAAgB5G,GAAO,EAAK,GAC5B6G,IAAe7G,GAAO,EAAE,GAAG,GAAG,GAAG,GAAG,GACpC8G,IAAgB9G,GAAO,EAAE,GAAG,GAAG,GAAG,GAAG,MAAM,GAAG,MAAM,EAAA,CAAG,GACvD+G,IAAkB/G,GAAoB,IAAI,GAG1C,CAACgH,GAAaC,CAAc,IAAInM,EAInC,EAAE,OAAO,MAAM,KAAK,MAAM,WAAW,GAAA,CAAO,GAGzC,CAACoM,GAAcC,CAAe,IAAIrM,EAGrC,EAAE,OAAO,MAAM,KAAK,MAAM,GACvB,CAACsM,GAAiBC,EAAkB,IAAIvM,EAAmB,CAAA,CAAE;AAGzC,EAAAkF,GAAO,EAAK;AAGtC,QAAM,CAACsH,IAAkBC,CAAmB,IAAIzM,EAAS,EAAK,GACxD,CAAC0M,IAAWC,EAAY,IAAI3M;AAAA,IAChC,KAAK,UAAUyK,GAAiB,MAAM,CAAC;AAAA,EAAA,GAInC,CAACmC,IAAqBC,CAAsB,IAAI7M,EAAS,EAAK,GAG9D,CAAC8M,GAAgBC,CAAiB,IAAI/M,EAAS,EAAK,GAIpDgN,IAAoBxG,EAAY,CAACyG,GAAiBC,MAAoB;AAC1E,QAAI,CAACvC,EAAU,QAAS,QAAO,EAAE,GAAG,GAAG,GAAG,EAAA;AAE1C,UAAMjE,IAAaiE,EAAU,QAAQ,sBAAA,GAE/BwC,IAAiBF,IAAUvG,EAAW,MACtC0G,IAAiBF,IAAUxG,EAAW,KAEtC2G,IAAkB3G,EAAW,QAAQqE,EAAO,OAC5CuC,IAAkB5G,EAAW,SAASqE,EAAO,QAE7C5M,IAAIgP,IAAiBE,GACrBjP,IAAIgP,IAAiBE;AAC3B,WAAO,EAAE,GAAG,KAAK,MAAMnP,CAAC,GAAG,GAAG,KAAK,MAAMC,CAAC,EAAA;AAAA,EAC5C,GAAG,CAAC2M,EAAO,OAAOA,EAAO,MAAM,CAAC,GAG1BwC,KAA0B/G,EAAY,CAACyG,GAAiBC,MACrDF,EAAkBC,GAASC,CAAO,GACxC,CAACF,CAAiB,CAAC,GAGhBQ,KAAiBhH;AAAA,IACrB,CAACiH,GAAiCC,GAA+BC,IAA2B,OAAS;AACnG,UAAI,CAAChO,EAAY,SAAU;AAE3B,YAAMtC,IAAWsC,EAAY,UACvBlC,IAASJ,EAAS,UAAU,CAAA,GAC5BwG,IAAapG,EAAO,cAAcA,EAAO,aAAa,GAEtDU,IAAI,KAAK,IAAIsP,EAAM,GAAGC,EAAI,CAAC,GAC3BtP,IAAI,KAAK,IAAIqP,EAAM,GAAGC,EAAI,CAAC,GAE3BE,IAAiB,KAAK,MAAMH,EAAM,IAAItP,CAAC,GACvC0P,IAAiB,KAAK,MAAMJ,EAAM,IAAIrP,CAAC,GACvC0P,KAAe,KAAK,MAAMJ,EAAI,IAAIvP,CAAC,GACnC4P,KAAe,KAAK,MAAML,EAAI,IAAItP,CAAC,GAEnCsJ,KAAc,KAAK,IAAI7D,IAAa,GAAG,CAAC,GACxCmK,KAAY,KAAK,IAAI,KAAK,IAAIP,EAAM,IAAIC,EAAI,CAAC,GAAGhG,EAAW,GAC3DuG,KAAa,KAAK,IAAI,KAAK,IAAIR,EAAM,IAAIC,EAAI,CAAC,GAAGhG,EAAW,GAE5DlE,KAA6B;AAAA,QACjC,GAAGnG;AAAA,QACH,IAAIrB,EAAA;AAAA,QACJ,QAAQ;AAAA,UACN,OAAOyB,EAAO;AAAA,UACd,YAAAoG;AAAA,UACA,WAAWA;AAAA,UACX,UAAUpG,EAAO;AAAA,UACjB,QAAQmQ;AAAA,UACR,QAAQC;AAAA,UACR,MAAMC;AAAA,UACN,MAAMC;AAAA,QAAA;AAAA,MACR,GAGIzR,KAAgB;AAAA,QACpB,IAAIN,EAAA;AAAA,QACJ,MAAM,GAAGqB,EAAS,IAAI,IAAI,KAAK,KAAK;AAAA,QACpC,MAAM;AAAA,QACN,aAAa;AAAA,UACX,OAAO2Q;AAAA,UACP,QAAQC;AAAA,UACR,GAAA9P;AAAA,UACA,GAAAC;AAAA,UACA,YAAY;AAAA,QAAA;AAAA,QAEd,aAAa;AAAA,UACX,YAAY,CAACH,GAAoBuF,EAAY,CAAC;AAAA,UAC9C,iBAAiB;AAAA,QAAA;AAAA,QAEnB,aAAa;AAAA,UACX,aAAa;AAAA,UACb,aAAa;AAAA,UACb,aAAa;AAAA,UACb,cAAc;AAAA,QAAA;AAAA,MAChB;AAKF,UAFA0H,EAAQ5O,IAAS,EAAK,GAElBqR,GAAiB;AACnB,cAAMO,KAAY,EAAE,GAAGR,EAAI,GAAG,GAAGA,EAAI,EAAA;AACrC,QAAAvB,EAAe;AAAA,UACb,OAAO+B;AAAA,UACP,KAAK,EAAE,GAAGA,GAAA;AAAA,UACV,WAAW;AAAA,QAAA,CACZ;AAAA,MACH;AACE,QAAA/B,EAAe,EAAE,OAAO,MAAM,KAAK,MAAM,WAAW,IAAO,GAC3DV,EAAA;AAAA,IAEJ;AAAA,IACA,CAAC9L,EAAY,UAAUuL,GAASO,CAAc;AAAA,EAAA,GAI1C0C,KAAkB3H,EAAY,MAAM;AACxC,UAAMnK,IAAQqO,EAAa,SAAS;AACpC,IAAIrO,KACF2O,EAAY;AAAA,MACV,OAAO3O,EAAM;AAAA,MACb,WAAWA,EAAM;AAAA,MACjB,WAAWA,EAAM;AAAA,IAAA,CAClB;AAAA,EAEL,GAAG,CAAC2O,CAAW,CAAC,GAGVoD,IAAoB5H;AAAA,IACxB,CAACnN,MAAwB;AACvB,MAAIyS,EAAc,WAEdpO,MAAS,iBAEXrE,EAAE,WAAWsR,EAAU,WACtBtR,EAAE,OAAuB,SAAS,WAAW,YAE9C8R,EAAW,IAAI,GACfoB,GAAmB,CAAA,CAAE;AAAA,IAEzB;AAAA,IACA,CAACpB,GAAYzN,CAAI;AAAA,EAAA,GAIb2Q,KAAwB7H;AAAA,IAC5B,CAACnN,MAAwB;AACvB,UAAIA,EAAE,WAAW,GAGjB;AAAA,YAAIqE,MAAS,eAAeiC,EAAY,UAAU;AAChD,UAAAtG,EAAE,gBAAA;AACF,gBAAMiV,IAAMtB,EAAkB3T,EAAE,SAASA,EAAE,OAAO;AAClD,UAAK6S,EAAY,YAENA,EAAY,SACrBsB,GAAetB,EAAY,OAAOoC,GAAK,EAAI,IAF3CnC,EAAe,EAAE,OAAOmC,GAAK,KAAKA,GAAK,WAAW,IAAM;AAI1D;AAAA,QACF;AAGA,YAAI5Q,MAAS,gBAAgB,CAACoP,GAAgB;AAC5C,gBAAMwB,IAAMf,GAAwBlU,EAAE,SAASA,EAAE,OAAO;AACxD,UAAAgT,EAAgB,EAAE,OAAOiC,GAAK,KAAKA,GAAK,GACxC/B,GAAmB,CAAA,CAAE,GACrBlT,EAAE,eAAA,GACFA,EAAE,gBAAA;AAAA,QACJ;AAAA;AAAA,IACF;AAAA,IACA,CAACqE,GAAMiC,EAAY,UAAUuM,EAAY,WAAWA,EAAY,OAAOY,GAAgBU,IAAgBR,GAAmBO,EAAuB;AAAA,EAAA,GAI7IgB,KAA0B/H;AAAA,IAC9B,CAACnN,MAAwB;AACvB,UAAI,EAAAqE,MAAS,eAAe,CAACiC,EAAY,aACrCuM,EAAY,aAAaA,EAAY,OAAO;AAC9C,cAAMoC,IAAMtB,EAAkB3T,EAAE,SAASA,EAAE,OAAO;AAClD,QAAAmU,GAAetB,EAAY,OAAOoC,GAAK,EAAK;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,CAAC5Q,GAAMiC,EAAY,UAAUuM,EAAY,WAAWA,EAAY,OAAOsB,IAAgBR,CAAiB;AAAA,EAAA,GAIpGwB,KAAiBhI,EAAY,CAACnN,MAAuB;AACzD,IAAAA,EAAE,eAAA,GACFA,EAAE,aAAa,aAAa,QAC5BsS,GAAc,EAAI;AAAA,EACpB,GAAG,CAAA,CAAE,GAEC8C,KAAkBjI,EAAY,CAACnN,MAAuB;AAC1D,IAAAA,EAAE,eAAA,GACFsS,GAAc,EAAK;AAAA,EACrB,GAAG,CAAA,CAAE,GAGC+C,KAAalI;AAAA,IACjB,CAACnN,MAAuB;AAGtB,UAFAA,EAAE,eAAA,GACFsS,GAAc,EAAK,GACf,GAAChB,EAAU,WAAWjN,MAAS;AAEnC,YAAI;AACF,gBAAMP,IAAO9D,EAAE,aAAa,QAAQ,kBAAkB;AACtD,cAAI,CAAC8D,EAAM;AACX,gBAAME,IAAW,KAAK,MAAMF,CAAI,GAC1BmR,IAAMtB,EAAkB3T,EAAE,SAASA,EAAE,OAAO,GAC5C,IAAIiV,EAAI,IAAI,IACZlQ,IAAIkQ,EAAI,IAAI,IACZhS,IAAU4B,GAAkB,GAAGE,GAAGf,CAAQ;AAChD,UAAA6N,EAAQ5O,CAAO;AAAA,QACjB,SAASc,GAAO;AACd,kBAAQ,MAAM,qCAAqCA,CAAK;AAAA,QAC1D;AAAA,IACF;AAAA,IACA,CAACM,GAAMwN,GAAS8B,CAAiB;AAAA,EAAA,GAI7B2B,KAAsBnI;AAAA,IAC1B,CAACnN,GAAqB8C,MAAe;AAEnC,MAAKuB,MAAS,YAAYA,MAAS,gBAAiB,CAACvB,EAAK,YAAY,gBACtE9C,EAAE,gBAAA,GACF8R,EAAWhP,EAAK,EAAE,GAClB2P,EAAc,UAAU,IACxBC,EAAa,UAAU,EAAE,GAAG1S,EAAE,SAAS,GAAGA,EAAE,QAAA,GAC5C2S,EAAc,UAAU;AAAA,QACtB,GAAG7P,EAAK,YAAY,KAAK;AAAA,QACzB,GAAGA,EAAK,YAAY,KAAK;AAAA,QACzB,MAAMA,EAAK,YAAY,KAAK;AAAA,QAC5B,MAAMA,EAAK,YAAY,KAAK;AAAA,MAAA,GAE9B8P,EAAgB,UAAU9P,GAC1B9C,EAAE,eAAA;AAAA,IACJ;AAAA,IACA,CAACqE,GAAMyN,CAAU;AAAA,EAAA;AAInB,EAAArE,GAAU,MAAM;AACd,UAAMC,IAAkB,CAAC1N,MAAkB;AAEzC,UAAIyS,EAAc,WAAWhB,KAAkBmB,EAAgB,SAAS;AACtE,YAAI,CAACtB,EAAU,QAAS;AACxB,cAAMjE,IAAaiE,EAAU,QAAQ,sBAAA,GAC/B0C,IAAkB3G,EAAW,QAAQqE,EAAO,OAC5CuC,IAAkB5G,EAAW,SAASqE,EAAO,QAC7C6D,IAAWvV,EAAE,UAAU0S,EAAa,QAAQ,GAC5C8C,IAAWxV,EAAE,UAAU0S,EAAa,QAAQ,GAC5C+C,KAAWF,IAAWvB,GACtB0B,KAAWF,IAAWvB,GACtBlF,KAAO4D,EAAc,QAAQ,IAAI8C,IACjCzG,KAAO2D,EAAc,QAAQ,IAAI+C,IACjCC,KAAS,SAAS;AAAA,UACtB,kBAAkBlE,CAAc;AAAA,QAAA;AAElC,QAAIkE,OACFA,GAAO,MAAM,OAAO,GAAG5G,EAAI,MAC3B4G,GAAO,MAAM,MAAM,GAAG3G,EAAI,OAE5B2D,EAAc,QAAQ,OAAO5D,IAC7B4D,EAAc,QAAQ,OAAO3D;AAAA,MAC/B;AAEA,UAAI3K,MAAS,gBAAgB0O,EAAa,OAAO;AAC/C,cAAMkC,IAAMf,GAAwBlU,EAAE,SAASA,EAAE,OAAO;AACxD,QAAAgT,EAAgB,CAAC4C,OAAU,EAAE,GAAGA,GAAM,KAAKX,IAAM;AAAA,MACnD;AAEA,UAAI5Q,MAAS,eAAewO,EAAY,WAAW;AACjD,cAAMoC,IAAMtB,EAAkB3T,EAAE,SAASA,EAAE,OAAO;AAClD,QAAA8S,EAAe,CAAC8C,OAAU,EAAE,GAAGA,GAAM,KAAKX,IAAM;AAAA,MAClD;AAAA,IACF,GAEMrG,IAAgB,MAAM;AAC1B,UAAI6D,EAAc,WAAWhB,KAAkBmB,EAAgB,SAAS;AACtE,cAAM7Q,IAAQa,GAAe,SAAA,GACvBmM,IAAO4D,EAAc,QAAQ,QAAQA,EAAc,QAAQ,GAC3D3D,IAAO2D,EAAc,QAAQ,QAAQA,EAAc,QAAQ;AACjE,QAAA5Q,EAAM,WAAW0P,GAAgB;AAAA,UAC/B,aAAa;AAAA,YACX,GAAGmB,EAAgB,QAAQ;AAAA,YAC3B,GAAG7D;AAAA,YACH,GAAGC;AAAA,UAAA;AAAA,QACL,CACD;AAAA,MACH;AAKA,UAJAyD,EAAc,UAAU,IACxBG,EAAgB,UAAU,MAC1BL,GAAY,CAAA,CAAE,GAEVlO,MAAS,gBAAgB0O,EAAa,SAASA,EAAa,KAAK;AACnE,cAAM7N,IAAO,KAAK,IAAI6N,EAAa,MAAM,GAAGA,EAAa,IAAI,CAAC,GACxD3N,IAAO,KAAK,IAAI2N,EAAa,MAAM,GAAGA,EAAa,IAAI,CAAC,GACxD5N,IAAO,KAAK,IAAI4N,EAAa,MAAM,GAAGA,EAAa,IAAI,CAAC,GACxD1N,IAAO,KAAK,IAAI0N,EAAa,MAAM,GAAGA,EAAa,IAAI,CAAC,GAExD8C,IAAcrE,EACjB,OAAO,CAAC1O,MAAS;AAChB,gBAAMgT,KAAQhT,EAAK,YAAY,KAAK,GAC9BiT,KAAQjT,EAAK,YAAY,KAAK,GAC9BkT,KAAQlT,EAAK,YAAY,SAAS,GAClCmT,KAAQnT,EAAK,YAAY,UAAU,GACnCoT,KAAUJ,KAAQE,KAAQ,GAC1BG,KAAUJ,KAAQE,KAAQ;AAChC,iBAAOC,MAAWhR,KAAQgR,MAAW9Q,KAAQ+Q,MAAWhR,KAAQgR,MAAW9Q;AAAA,QAC7E,CAAC,EACA,IAAI,CAACvC,MAASA,EAAK,EAAE;AAExB,QAAAoQ,GAAmB2C,CAAW,GAC9B7C,EAAgB,EAAE,OAAO,MAAM,KAAK,MAAM;AAAA,MAC5C;AAAA,IACF,GAEMoD,IAAgB,CAACpW,MAAqB;AAC1C,MAAIA,EAAE,QAAQ,YAAYqE,MAAS,gBACjCyO,EAAe,EAAE,OAAO,MAAM,KAAK,MAAM,WAAW,IAAO,GAC3DtM,EAAA,IAEExG,EAAE,QAAQ,aACRyR,MAA2BA,CAAc,IACpCwB,EAAgB,SAAS,MAChCA,EAAgB,QAAQ,CAAC/P,MAAO8O,EAAW9O,CAAE,CAAC,GAC9CgQ,GAAmB,CAAA,CAAE,KAGrBlT,EAAE,WAAWA,EAAE,QAAQ,QACzBA,EAAE,eAAA,GACFiS,EAAA,IAEEjS,EAAE,WAAWA,EAAE,QAAQ,QACzBA,EAAE,eAAA,GACFkS,EAAA,IAGElS,EAAE,QAAQ,OAAO,CAACyT,MACpBzT,EAAE,eAAA,GACF0T,EAAkB,EAAI;AAAA,IAE1B,GAEM2C,IAAc,CAACrW,MAAqB;AAExC,MAAIA,EAAE,QAAQ,OAAOyT,KACnBC,EAAkB,EAAK;AAAA,IAE3B;AAEA,kBAAO,iBAAiB,aAAahG,CAAe,GACpD,OAAO,iBAAiB,WAAWkB,CAAa,GAChD,OAAO,iBAAiB,WAAWwH,CAAa,GAChD,OAAO,iBAAiB,SAASC,CAAW,GACrC,MAAM;AACX,aAAO,oBAAoB,aAAa3I,CAAe,GACvD,OAAO,oBAAoB,WAAWkB,CAAa,GACnD,OAAO,oBAAoB,WAAWwH,CAAa,GACnD,OAAO,oBAAoB,SAASC,CAAW;AAAA,IACjD;AAAA,EACF,GAAG;AAAA,IACD5E;AAAA,IAEAsB;AAAA,IACA1O;AAAA,IACAwO,EAAY;AAAA,IACZI;AAAA,IACAzB;AAAA,IACAE,EAAO;AAAA,IACPA,EAAO;AAAA,IACPM;AAAA,IACAC;AAAA,IACAwB;AAAA,IACAvB;AAAA,IACA1L;AAAA,IACAmN;AAAA,IACAO;AAAA,IACAhB;AAAA,EAAA,CACD;AAGD,QAAMoD,KAAkBnJ,EAAY,MAAM;AAExC,UAAMoJ,IAActD,EAAgB,SAAS,IACzCA,EAAgB,IAAI,CAAC/P,MAAOsO,EAAM,KAAK,CAACpO,MAAMA,EAAE,OAAOF,CAAE,CAAC,EAAE,OAAO,OAAO,IAC1EuO,IACE,CAACD,EAAM,KAAK,CAACpO,MAAMA,EAAE,OAAOqO,CAAc,CAAC,EAAE,OAAO,OAAO,IAC3D,CAAA;AAEN,QAAI8E,EAAY,WAAW,EAAG;AAG9B,UAAMC,IAAuB,CAAA;AAC7B,IAAAD,EAAY,QAAQ,CAACzT,MAAS;AAC5B,YAAMG,IAAU;AAAA,QACd,GAAGH;AAAA,QACH,IAAIH,EAAA;AAAA,QACJ,MAAM,GAAGG,EAAK,IAAI;AAAA,QAClB,aAAa;AAAA,UACX,GAAGA,EAAK;AAAA,UACR,IAAIA,EAAK,YAAY,KAAK,KAAK;AAAA,UAC/B,IAAIA,EAAK,YAAY,KAAK,KAAK;AAAA,QAAA;AAAA,MACjC;AAEF,MAAA+O,EAAQ5O,CAAO,GACfuT,EAAW,KAAKvT,EAAQ,EAAE;AAAA,IAC5B,CAAC,GAGGuT,EAAW,WAAW,IACxB1E,EAAW0E,EAAW,CAAC,CAAC,IAExBtD,GAAmBsD,CAAU;AAAA,EAEjC,GAAG,CAAC/E,GAAgBwB,GAAiBzB,GAAOK,GAASC,GAAYoB,EAAkB,CAAC,GAG9EuD,KAAmBtJ,EAAY,MAAM;AACzC,QAAI8F,EAAgB,SAAS,EAAG;AAChC,UAAMyD,IAAwB,CAAA;AAC9B,aAASxV,IAAI,GAAGA,IAAI+R,EAAgB,QAAQ/R,KAAK;AAC/C,YAAMgC,IAAK+P,EAAgB/R,CAAC,GACtB4B,IAAO0O,EAAM,KAAK,CAACpO,OAAMA,GAAE,OAAOF,CAAE;AAC1C,UAAKJ,GACL;AAAA,YAAIA,GAAM,SAAS,SAAS;AAI1BkC,UAFiBlC,EAAK,SAEb,QAAQ,CAACwC,OAAUoR,EAAc,KAAK;AAAA,YAC7C,GAAGpR;AAAA,YACH,aAAa;AAAA,cACX,GAAGA,GAAM;AAAA,cACT,IAAIxC,EAAK,YAAY,KAAK,MAAMwC,GAAM,YAAY,KAAK;AAAA,cACvD,IAAIxC,EAAK,YAAY,KAAK,MAAMwC,GAAM,YAAY,KAAK;AAAA,YAAA;AAAA,UACzD,CACD,CAAC,GAEF0M,EAAW9O,CAAE;AACb;AAAA,QACF;AACA,QAAAwT,EAAc,KAAK5T,CAAI;AAAA;AAAA,IACzB;AACA,QAAI4T,EAAc,SAAS,EAAG;AAG9B,QAAIxR,IAAO,OAAUC,IAAO,OACxBC,IAAO,QAAWC,IAAO;AAE7B,IAAAqR,EAAc,QAAQ,CAAC5T,MAAS;AAC9B,YAAMgC,IAAIhC,EAAK,YAAY,KAAK,GAC1BiC,IAAIjC,EAAK,YAAY,KAAK,GAC1B6T,KAAI7T,EAAK,YAAY,SAAS,GAC9B8T,KAAI9T,EAAK,YAAY,UAAU;AACrC,MAAAoC,IAAO,KAAK,IAAIA,GAAMJ,CAAC,GACvBK,IAAO,KAAK,IAAIA,GAAMJ,CAAC,GACvBK,IAAO,KAAK,IAAIA,GAAMN,IAAI6R,EAAC,GAC3BtR,IAAO,KAAK,IAAIA,GAAMN,IAAI6R,EAAC;AAAA,IAC7B,CAAC;AAGD,UAAM5R,IAAW0R,EAAc,IAAI,CAAC5T,OAAU;AAAA,MAC5C,GAAGA;AAAA,MACH,aAAa;AAAA,QACX,GAAGA,EAAK;AAAA,QACR,IAAIA,EAAK,YAAY,KAAK,KAAKoC;AAAA,QAC/B,IAAIpC,EAAK,YAAY,KAAK,KAAKqC;AAAA,MAAA;AAAA,IACjC,EACA,GAGI0R,IAAuB;AAAA,MAC3B,IAAIlU,EAAA;AAAA,MACJ,MAAM,MAAM,KAAK,IAAA,CAAK;AAAA,MACtB,MAAM;AAAA,MACN,aAAa;AAAA,QACX,GAAGuC;AAAA,QACH,GAAGC;AAAA,QACH,OAAOC,IAAOF;AAAA,QACd,QAAQG,IAAOF;AAAA,QACf,YAAY;AAAA,MAAA;AAAA,MAEd,aAAa;AAAA,QACX,YAAY,CAAA;AAAA,QACZ,iBAAiB;AAAA,MAAA;AAAA,MAEnB,aAAa;AAAA,QACX,aAAa;AAAA,QACb,aAAa;AAAA,QACb,aAAa;AAAA,QACb,cAAc;AAAA,MAAA;AAAA,MAEhB,UAAAH;AAAA,IAAA;AAIF,IAAAiO,EAAgB,QAAQ,CAAC/P,MAAO8O,EAAW9O,CAAE,CAAC,GAC9C2O,EAAQgF,CAAS,GACjB3D,GAAmB,CAAA,CAAE,GACrBpB,EAAW+E,EAAU,EAAE;AAAA,EACzB,GAAG,CAAC5D,GAAiBzB,GAAOQ,GAAYH,GAASC,CAAU,CAAC,GAGtDgF,KAAqB3J,EAAY,MAAM;AAE3C,UAAM4J,IAAsB9D,EAAgB,SAAS,IACjDA,EACC,IAAI,CAAC/P,MAAOsO,EAAM,KAAK,CAACpO,MAAMA,EAAE,OAAOF,CAAE,CAAC,EAC1C,OAAO,CAACE,MAAsB,CAAC,CAACA,KAAKA,EAAE,SAAS,OAAO,IACxDqO,IACE,CAACD,EAAM,KAAK,CAACpO,MAAMA,EAAE,OAAOqO,CAAc,CAAC,EAAE,OAAO,CAACrO,MAAsB,CAAC,CAACA,KAAKA,EAAE,SAAS,OAAO,IACpG,CAAA;AAEN,IAAI2T,EAAoB,WAAW,MAGnCA,EAAoB,QAAQ,CAACF,MAAc;AACzC,UAAI,CAACA,EAAU,YAAYA,EAAU,SAAS,WAAW,EAAG;AAG5D,YAAMG,IAAmBH,EAAU,SAAS,IAAI,CAACvR,OAAW;AAAA,QAC1D,GAAGA;AAAA,QACH,aAAa;AAAA,UACX,GAAGA,EAAM;AAAA,UACT,IAAIuR,EAAU,YAAY,KAAK,MAAMvR,EAAM,YAAY,KAAK;AAAA,UAC5D,IAAIuR,EAAU,YAAY,KAAK,MAAMvR,EAAM,YAAY,KAAK;AAAA,QAAA;AAAA,MAC9D,EACA;AAGF,MAAA0M,EAAW6E,EAAU,EAAE,GACvBG,EAAiB,QAAQ,CAAC1R,MAAUuM,EAAQvM,CAAK,CAAC;AAAA,IACpD,CAAC,GAGD4N,GAAmB,CAAA,CAAE,GACrBpB,EAAW,IAAI;AAAA,EACjB,GAAG,CAACL,GAAgBwB,GAAiBzB,GAAOQ,GAAYH,GAASC,GAAYoB,EAAkB,CAAC,GAG1F+D,KAAwB9J;AAAA,IAC5B,CAAC+J,MAAyC;AACxC,UAAIjE,EAAgB,SAAS,EAAG;AAEhC,YAAMyD,IAAgBzD,EACnB,IAAI,CAAC/P,MAAOsO,EAAM,KAAK,CAACpO,MAAMA,EAAE,OAAOF,CAAE,CAAC,EAC1C,OAAO,CAACE,MAAiB,CAAC,CAACA,KAAKA,EAAE,SAAS,OAAO;AAErD,UAAIsT,EAAc,SAAS,EAAG;AAG9B,UAAIxR,IAAO,OAAUE,IAAO,QACxBD,IAAO,OAAUE,IAAO;AAE5B,MAAAqR,EAAc,QAAQ,CAAC5T,MAAS;AAC9B,cAAMgC,IAAIhC,EAAK,YAAY,KAAK,GAC1BiC,KAAIjC,EAAK,YAAY,KAAK;AAChC,QAAAoC,IAAO,KAAK,IAAIA,GAAMJ,CAAC,GACvBM,IAAO,KAAK,IAAIA,GAAMN,CAAC,GACvBK,IAAO,KAAK,IAAIA,GAAMJ,EAAC,GACvBM,IAAO,KAAK,IAAIA,GAAMN,EAAC;AAAA,MACzB,CAAC;AAGD,YAAMoS,IAAc,CAAC,GAAGT,CAAa,EAAE,KAAK,CAACU,GAAGC,MAC1CH,MAAc,gBACRE,EAAE,YAAY,KAAK,MAAMC,EAAE,YAAY,KAAK,MAE5CD,EAAE,YAAY,KAAK,MAAMC,EAAE,YAAY,KAAK,EAEvD,GAGKC,IAAQH,EAAY;AAC1B,UAAID,MAAc,cAAc;AAE9B,cAAMK,KADanS,IAAOF,MACCoS,IAAQ;AACnC,QAAAH,EAAY,QAAQ,CAACrU,IAAMU,OAAU;AACnC,gBAAMuL,KAAO7J,IAAOqS,IAAO/T;AAC3B,UAAAuO,EAAWjP,GAAK,IAAI;AAAA,YAClB,aAAa,EAAE,GAAGA,GAAK,aAAa,GAAGiM,GAAA;AAAA,UAAK,CAC7C;AAAA,QACH,CAAC;AAAA,MACH,OAAO;AAEL,cAAMwI,KADclS,IAAOF,MACCmS,IAAQ;AACpC,QAAAH,EAAY,QAAQ,CAACrU,IAAMU,OAAU;AACnC,gBAAMwL,KAAO7J,IAAOoS,IAAO/T;AAC3B,UAAAuO,EAAWjP,GAAK,IAAI;AAAA,YAClB,aAAa,EAAE,GAAGA,GAAK,aAAa,GAAGkM,GAAA;AAAA,UAAK,CAC7C;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAACiE,GAAiBzB,GAAOO,CAAU;AAAA,EAAA,GAI/ByF,KAAmBrK;AAAA,IACvB,CAAC+J,MAAmD;AAClD,UAAIjE,EAAgB,SAAS,EAAG;AAChC,YAAMlR,IAAQa,GAAe,SAAA,GACvB8T,IAAgBzD,EACnB,IAAI,CAAC/P,MAAOsO,EAAM,KAAK,CAACpO,MAAMA,EAAE,OAAOF,CAAE,CAAC,EAC1C,OAAO,CAACE,MAAiB,CAAC,CAACA,KAAKA,EAAE,SAAS,OAAO;AACrD,UAAIsT,EAAc,SAAS,EAAG;AAE9B,UAAIe,IAAa;AACjB,cAAQP,GAAA;AAAA,QACN,KAAK;AACH,UAAAO,IAAa,KAAK,IAAI,GAAGf,EAAc,IAAI,CAACtT,MAAMA,EAAE,YAAY,KAAK,CAAC,CAAC;AACvE;AAAA,QACF,KAAK;AACH,UAAAqU,IAAa,KAAK;AAAA,YAChB,GAAGf,EAAc,IAAI,CAACtT,OAAOA,EAAE,YAAY,KAAK,MAAMA,EAAE,YAAY,SAAS,EAAE;AAAA,UAAA;AAEjF;AAAA,QACF,KAAK;AACH,UAAAqU,IAAa,KAAK,IAAI,GAAGf,EAAc,IAAI,CAACtT,MAAMA,EAAE,YAAY,KAAK,CAAC,CAAC;AACvE;AAAA,QACF,KAAK;AACH,UAAAqU,IAAa,KAAK;AAAA,YAChB,GAAGf,EAAc,IAAI,CAACtT,OAAOA,EAAE,YAAY,KAAK,MAAMA,EAAE,YAAY,UAAU,EAAE;AAAA,UAAA;AAElF;AAAA,MAAA;AAGJ,MAAAsT,EAAc,QAAQ,CAAC5T,MAAS;AAC9B,YAAIiM,IAAOjM,EAAK,YAAY,KAAK,GAC7BkM,IAAOlM,EAAK,YAAY,KAAK;AACjC,gBAAQoU,GAAA;AAAA,UACN,KAAK;AACH,YAAAnI,IAAO0I;AACP;AAAA,UACF,KAAK;AACH,YAAA1I,IAAO0I,KAAc3U,EAAK,YAAY,SAAS;AAC/C;AAAA,UACF,KAAK;AACH,YAAAkM,IAAOyI;AACP;AAAA,UACF,KAAK;AACH,YAAAzI,IAAOyI,KAAc3U,EAAK,YAAY,UAAU;AAChD;AAAA,QAAA;AAEJ,QAAAf,EAAM,WAAWe,EAAK,IAAI;AAAA,UACxB,aAAa,EAAE,GAAGA,EAAK,aAAa,GAAGiM,GAAM,GAAGC,EAAA;AAAA,QAAK,CACtD;AAAA,MACH,CAAC;AAAA,IACH;AAAA,IACA,CAACiE,GAAiBzB,CAAK;AAAA,EAAA,GAInBkG,KAAiB;AAAA,IACrB;AAAA,MACE,wBAAOC,IAAA,EAAe;AAAA,MACtB,OAAO;AAAA,MACP,QAAQtT,MAAS;AAAA,MACjB,SAAS,MAAM;AACb,QAAA8N,EAAQ,QAAQ;AAAA,MAClB;AAAA,IAAA;AAAA,IAEF;AAAA,MACE,wBAAOyF,IAAA,EAAc;AAAA,MACrB,OAAO;AAAA,MACP,QAAQvT,MAAS;AAAA,MACjB,SAAS,MAAM;AACb,QAAA8N,EAAQ,YAAY,GACpBe,GAAmB,CAAA,CAAE;AAAA,MACvB;AAAA,IAAA;AAAA,IAEF;AAAA,MACE,wBAAO2E,IAAA,EAAa;AAAA,MACpB,OAAO;AAAA,MACP,QAAQxT,MAAS;AAAA,MACjB,SAAS,MAAM;AACb,QAAA8N,EAAQ,MAAM;AAAA,MAChB;AAAA,IAAA;AAAA,IAEF;AAAA,MACE,wBAAOxK,IAAA,EAAa;AAAA,MACpB,OAAO;AAAA,MACP,QAAQtD,MAAS;AAAA,MACjB,SAAS,MAAM;AACb,QAAA8N,EAAQ,WAAW;AAAA,MACrB;AAAA,IAAA;AAAA,IAEF;AAAA,MACE,wBAAO2F,IAAA,EAAY;AAAA,MACnB,OAAO;AAAA,MACP,QAAQzT,MAAS;AAAA,MACjB,SAAS,MAAM;AACb,QAAA8N,EAAQ,SAAS;AAAA,MACnB;AAAA,IAAA;AAAA,EACF,GAGI4F,KAAgBrL;AAAA,IACpB,MAAM;AAAA,MACJ,EAAE,MAAM,gBAAAlF,EAACwQ,IAAA,CAAA,CAAa,GAAI,OAAO,eAAe,SAAS/F,EAAA;AAAA,MACzD,EAAE,MAAM,gBAAAzK,EAACyQ,IAAA,CAAA,CAAa,GAAI,OAAO,eAAe,SAAS/F,EAAA;AAAA,MACzD;AAAA,QACE,wBAAOgG,IAAA,EAAa;AAAA,QACpB,OAAO;AAAA,QACP,UAAU,CAACzG,KAAkBwB,EAAgB,WAAW;AAAA,QACxD,SAASqD;AAAA,MAAA;AAAA,MAEX;AAAA,QACE,wBAAOsB,IAAA,EAAc;AAAA,QACrB,OAAO;AAAA,QACP,UAAU3E,EAAgB,SAAS;AAAA,QACnC,SAASwD;AAAA,MAAA;AAAA,MAEX;AAAA,QACE,wBAAO0B,IAAA,EAAgB;AAAA,QACvB,OAAO;AAAA,QACP,UAAU,CAAC1G,KAAkBwB,EAAgB,WAAW;AAAA,QACxD,SAAS6D;AAAA,MAAA;AAAA,MAEX;AAAA,QACE,wBAAOsB,IAAA,EAAkB;AAAA,QACzB,OAAO;AAAA,QACP,UAAUnF,EAAgB,SAAS;AAAA,QACnC,SAAS,MAAMuE,GAAiB,MAAM;AAAA,MAAA;AAAA,MAExC;AAAA,QACE,wBAAOa,IAAA,EAAmB;AAAA,QAC1B,OAAO;AAAA,QACP,UAAUpF,EAAgB,SAAS;AAAA,QACnC,SAAS,MAAMuE,GAAiB,OAAO;AAAA,MAAA;AAAA,MAEzC;AAAA,QACE,wBAAOc,IAAA,EAAyB;AAAA,QAChC,OAAO;AAAA,QACP,UAAUrF,EAAgB,SAAS;AAAA,QACnC,SAAS,MAAMuE,GAAiB,KAAK;AAAA,MAAA;AAAA,MAEvC;AAAA,QACE,wBAAOe,IAAA,EAA4B;AAAA,QACnC,OAAO;AAAA,QACP,UAAUtF,EAAgB,SAAS;AAAA,QACnC,SAAS,MAAMuE,GAAiB,QAAQ;AAAA,MAAA;AAAA,MAE1C;AAAA,QACE,wBAAOgB,IAAA,EAAoB;AAAA,QAC3B,OAAO;AAAA,QACP,UAAUvF,EAAgB,SAAS;AAAA,QACnC,SAAS,MAAMgE,GAAsB,YAAY;AAAA,MAAA;AAAA,MAEnD;AAAA,QACE,wBAAOwB,IAAA,EAAqB;AAAA,QAC5B,OAAO;AAAA,QACP,UAAUxF,EAAgB,SAAS;AAAA,QACnC,SAAS,MAAMgE,GAAsB,UAAU;AAAA,MAAA;AAAA,MAEjD;AAAA,QACE,wBAAOyB,IAAA,EAAgB;AAAA,QACvB,OAAO;AAAA,QACP,SAAS,MAAMlF,EAAuB,EAAI;AAAA,MAAA;AAAA,MAE5C;AAAA,QACE,wBAAOmF,IAAA,EAAmB;AAAA,QAC1B,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,MAAMvF,EAAoB,EAAI;AAAA,MAAA;AAAA,MAEzC;AAAA,QACE,wBAAOxL,IAAA,EAAe;AAAA,QACtB,OAAO;AAAA,QACP,UAAU,CAAC6J,KAAkBwB,EAAgB,WAAW;AAAA,QACxD,SAAS,MAAM;AACb,UAAIxB,MAA2BA,CAAc,IACpCwB,EAAgB,SAAS,MAChCA,EAAgB,QAAQ,CAAC/P,MAAO8O,EAAW9O,CAAE,CAAC,GAC9CgQ,GAAmB,CAAA,CAAE;AAAA,QAEzB;AAAA,MAAA;AAAA,IACF;AAAA,IAEF;AAAA,MACEjB;AAAA,MACAC;AAAA,MACA7N;AAAA,MACA8N;AAAA,MACAe;AAAA,MACAD;AAAA,MACAwD;AAAA,MACAK;AAAA,MACAR;AAAA,MACAkB;AAAA,MACAP;AAAA,MACAzD;AAAA,MACAJ;AAAA,MACA3B;AAAA,MACAO;AAAA,IAAA;AAAA,EACF,GAIIoE,KAAgBjJ;AAAA,IAAY,CAACnN,MAAqB;AACtD,OAAIA,EAAE,QAAQ,eAAeA,EAAE,QAAQ,gBAAgBA,EAAE,QAAQ,aAAaA,EAAE,QAAQ,gBAChEiT,EAAgB,IAAI,CAAC/P,MAAOsO,EAAM,KAAK,CAACpO,MAAMA,EAAE,OAAOF,CAAE,CAAC,EAClE,QAAQ,CAACJ,MAAS;AAC9B,QAAIA,KACFiP,EAAWjP,EAAK,IAAI;AAAA,UAClB,aAAa;AAAA,YACX,GAAGA,EAAK;AAAA,YACR,IAAIA,EAAK,YAAY,KAAK,KAAK,KAAK9C,EAAE,QAAQ,cAAc,IAAIA,EAAE,QAAQ,eAAe,KAAK;AAAA,YAC9F,IAAI8C,EAAK,YAAY,KAAK,KAAK,KAAK9C,EAAE,QAAQ,YAAY,IAAIA,EAAE,QAAQ,cAAc,KAAK;AAAA,UAAA;AAAA,QAC7F,CACD;AAAA,MAEL,CAAC;AAAA,IAEL;AAAA,IACE,CAACiT,GAAiBzB,GAAOO,CAAU;AAAA,EAAA;AAErC,SAAAtE,GAAU,OACJpJ,MAAS,gBACX,SAAS,iBAAiB,WAAW+R,EAAa,GAE7C,MAAM;AACX,aAAS,oBAAoB,WAAWA,EAAa;AAAA,EACvD,IACC,CAAC/R,GAAM+R,EAAa,CAAC,GAGtB,gBAAAtO,EAAC,OAAA,EAAI,WAAU,2CAEb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,iFACb,UAAA;AAAA,MAAA,gBAAAN,EAACoR,IAAA,EACE,aAAe,IAAI,CAACC,MACnB,gBAAArR,EAACsR,IAAA,EAAwB,OAAOD,EAAI,OAClC,UAAA,gBAAArR;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,MAAMmR,EAAI,SAAS,YAAY;AAAA,UAC/B,MAAMA,EAAI;AAAA,UACV,SAASA,EAAI;AAAA,QAAA;AAAA,MAAA,EACf,GALYA,EAAI,KAMlB,CACD,GACH;AAAA,MACA,gBAAArR,EAACoR,IAAA,EACE,UAAAb,GAAc,IAAI,CAACc,MAClB,gBAAArR,EAACsR,IAAA,EAAwB,OAAOD,EAAI,OAClC,UAAA,gBAAArR;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,MAAOmR,EAAY,SAAS,YAAYA,EAAI,QAAQ;AAAA,UACpD,MAAMA,EAAI;AAAA,UACV,SAASA,EAAI;AAAA,UACb,UAAUA,EAAI;AAAA,QAAA;AAAA,MAAA,KALJA,EAAI,KAOlB,CACD,EAAA,CACH;AAAA,IAAA,GACF;AAAA,IAGA,gBAAArR,EAAC,OAAA,EAAI,KAAK+J,GAAY,WAAU,mBAC9B,UAAA,gBAAA/J;AAAA,MAACuR;AAAA,MAAA;AAAA,QACC,KAAK1H;AAAA,QACL,cAAc;AAAA,QACd,kBAAkB;AAAA,QAClB,kBAAkB;AAAA,QAClB,UAAU;AAAA,QACV,UAAU;AAAA,QACV,eAAeyD;AAAA,QACf,eAAe;AAAA,QACf,iBAAiB;AAAA,QACjB,SAAS,EAAE,UAAU,CAACrB,MAAmBpP,MAAS,YAAYA,MAAS,eAAeA,MAAS,eAAe,kBAAkB,GAAA;AAAA,QAChI,OAAO,EAAE,UAAU,IAAO,MAAM,IAAA;AAAA,QAChC,OAAO,EAAE,UAAU,GAAA;AAAA,QACnB,aAAa,EAAE,UAAU,GAAA;AAAA,QAExB,WAAC,EAAE,QAAA2U,GAAQ,SAAAC,GAAS,gBAAAC,EAAA,MACnB,gBAAApR,EAAAO,IAAA,EAEE,UAAA;AAAA,UAAA,gBAAAb,EAAC,SAAI,WAAU,oEACb,UAAA,gBAAAM,EAAC8Q,IAAA,EAAM,WAAU,YACf,UAAA;AAAA,YAAA,gBAAApR,EAACsR,IAAA,EAAQ,OAAM,MACb,UAAA,gBAAAtR,EAACE,GAAA,EAAO,MAAM,gBAAAF,EAAC2R,IAAA,EAAe,GAAI,SAAS,MAAMH,EAAA,GAAU,GAC7D;AAAA,YACA,gBAAAxR,EAACsR,IAAA,EAAQ,OAAM,MACb,4BAACpR,GAAA,EAAO,MAAM,gBAAAF,EAAC4R,IAAA,EAAgB,GAAI,SAAS,MAAMH,EAAA,GAAW,GAC/D;AAAA,YACA,gBAAAzR,EAACsR,IAAA,EAAQ,OAAM,QACb,UAAA,gBAAAtR,EAACE,GAAA,EAAO,SAAS,MAAMwR,EAAA,GAAkB,UAAA,OAAA,CAAI,EAAA,CAC/C;AAAA,YACA,gBAAApR,EAAC,OAAA,EAAI,WAAU,qCACZ,UAAA;AAAA,cAAA,KAAK,MAAM3D,EAAS,QAAQ,GAAG;AAAA,cAAE;AAAA,YAAA,EAAA,CACpC;AAAA,UAAA,EAAA,CACF,EAAA,CACF;AAAA,UAEA,gBAAAqD;AAAA,YAAC6R;AAAA,YAAA;AAAA,cACC,cAAc,EAAE,OAAO,QAAQ,QAAQ,QAAQ,UAAU,WAAA;AAAA,cACzD,cAAc;AAAA,gBACZ,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,gBAAgB;AAAA,cAAA;AAAA,cAGlB,UAAA,gBAAAvR;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,KAAKwJ;AAAA,kBACL,eAAY;AAAA,kBACZ,WAAW,YAAYe,KAAa,yCAAyC,EAC3E,IAAIhO,MAAS,cAAc,qBAAqB,EAAE,IAAIoP,IAAiB,gBAAgB,EAAE;AAAA,kBAC3F,OAAO;AAAA,oBACL,OAAO/B,EAAO;AAAA,oBACd,QAAQA,EAAO;AAAA,oBACf,YAAY;AAAA,oBACZ,iBAAiBA,EAAO;AAAA,oBACxB,iBAAiBA,EAAO,kBAAkB,OAAOA,EAAO,eAAe,MAAM;AAAA,oBAC7E,gBAAgB;AAAA,oBAChB,oBAAoB;AAAA,kBAAA;AAAA,kBAEtB,SAASqD;AAAA,kBACT,aAAaC;AAAA,kBACb,eAAeE;AAAA,kBACf,YAAYC;AAAA,kBACZ,aAAaC;AAAA,kBACb,QAAQC;AAAA,kBAGP,UAAA;AAAA,oBAAA3D,EAAO,aAAa,MACnB,gBAAA5J,EAAC,OAAA,EAAI,WAAU,6CAA4C,OAAO4J,EAAO,OAAO,QAAQA,EAAO,QAC7F,UAAA;AAAA,sBAAA,gBAAAlK,EAAC,QAAA,EACC,4BAAC,WAAA,EAAQ,IAAG,QAAO,OAAM,MAAK,QAAO,MAAK,cAAa,kBACrD,4BAAC,QAAA,EAAK,GAAE,qBAAoB,MAAK,QAAO,QAAO,WAAU,aAAY,IAAA,CAAI,EAAA,CAC3E,EAAA,CACF;AAAA,wCACC,QAAA,EAAK,OAAM,QAAO,QAAO,QAAO,MAAK,aAAA,CAAa;AAAA,oBAAA,GACrD;AAAA,oBAIDgK,EAAM,IAAI,CAAC1O,MACV,gBAAA0E;AAAA,sBAACqI;AAAA,sBAAA;AAAA,wBAEC,MAAA/M;AAAA,wBACA,YACE2O,MAAmB3O,EAAK,MAAMmQ,EAAgB,SAASnQ,EAAK,EAAE;AAAA,wBAEhE,MAAMsO;AAAA,wBACN,SAAS,MAAM;AAGb,0BAFA,QAAQ,IAAI,iBAAiBtO,EAAK,IAAI,SAAS0P,GAAQ,OAAO,GAE1DA,GAAQ,YAAY,eACxBV,EAAWhP,EAAK,EAAE;AAAA,wBACpB;AAAA,wBACA,aAAa,CAAC9C,MAAMsV,GAAoBtV,GAAG8C,CAAI;AAAA,wBAC/C,cAAc,CAACW,GAAQN,MAAY4O,EAAWtO,GAAQN,CAAO;AAAA,wBAC7D,OAAOgB,EAAS;AAAA,sBAAA;AAAA,sBAdX,GAAGrB,EAAK,EAAE;AAAA,oBAAA,CAgBlB;AAAA,oBAGAuB,MAAS,eAAewO,EAAY,aAAaA,EAAY,SAASA,EAAY,OACjF,gBAAArL,EAAC,OAAA,EAAI,WAAU,6CAA4C,OAAOkK,EAAO,OAAO,QAAQA,EAAO,QAC7F,UAAA,gBAAAlK;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,IAAIqL,EAAY,MAAM;AAAA,wBACtB,IAAIA,EAAY,MAAM;AAAA,wBACtB,IAAIA,EAAY,IAAI;AAAA,wBACpB,IAAIA,EAAY,IAAI;AAAA,wBACpB,QAAO;AAAA,wBACP,aAAY;AAAA,wBACZ,iBAAgB;AAAA,wBAChB,eAAc;AAAA,wBACd,gBAAe;AAAA,sBAAA;AAAA,oBAAA,GAEnB;AAAA,oBAIDxO,MAAS,gBAAgB0O,EAAa,SAASA,EAAa,OAC3D,gBAAAvL;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,WAAU;AAAA,wBACV,OAAO;AAAA,0BACL,MAAM,KAAK,IAAIuL,EAAa,MAAM,GAAGA,EAAa,IAAI,CAAC;AAAA,0BACvD,KAAK,KAAK,IAAIA,EAAa,MAAM,GAAGA,EAAa,IAAI,CAAC;AAAA,0BACtD,OAAO,KAAK,IAAIA,EAAa,IAAI,IAAIA,EAAa,MAAM,CAAC;AAAA,0BACzD,QAAQ,KAAK,IAAIA,EAAa,IAAI,IAAIA,EAAa,MAAM,CAAC;AAAA,0BAC1D,QAAQ;AAAA,wBAAA;AAAA,sBACV;AAAA,oBAAA;AAAA,kBACF;AAAA,gBAAA;AAAA,cAAA;AAAA,YAEJ;AAAA,UAAA;AAAA,QACF,EAAA,CACF;AAAA,MAAA;AAAA,IAAA,GAGN;AAAA,IAGA,gBAAAvL;AAAA,MAAC8R;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,MAAMnG;AAAA,QACN,UAAU,MAAMC,EAAoB,EAAK;AAAA,QACzC,QAAQ;AAAA,QAER,UAAA,gBAAA5L,EAAC+R,KAAK,QAAO,YACX,4BAACA,EAAK,MAAL,EAAU,OAAM,eACf,UAAA,gBAAA/R;AAAA,UAACyJ;AAAAA,UAAA;AAAA,YACC,OAAOoC;AAAA,YACP,UAAU,CAACrT,MAAMsT,GAAatT,EAAE,OAAO,KAAK;AAAA,YAC5C,MAAM;AAAA,YACN,aAAY;AAAA,UAAA;AAAA,QAAA,GAEhB,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,IAIF,gBAAAwH;AAAA,MAAC8R;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,MAAM/F;AAAA,QACN,UAAU,MAAMC,EAAuB,EAAK;AAAA,QAC5C,QAAQ;AAAA,QAER,UAAA,gBAAA1L,EAACyR,GAAA,EAAK,QAAO,YACX,UAAA;AAAA,UAAA,gBAAA/R,EAAC+R,EAAK,MAAL,EAAU,OAAM,MACf,UAAA,gBAAA/R;AAAA,YAACgS;AAAA,YAAA;AAAA,cACC,OAAO9H,EAAO;AAAA,cACd,UAAU,CAAC+H,MAAM7H,EAAgB,EAAE,OAAO6H,KAAK,MAAM;AAAA,cACrD,KAAK;AAAA,cACL,KAAK;AAAA,cACL,OAAO,EAAE,OAAO,OAAA;AAAA,YAAO;AAAA,UAAA,GAE3B;AAAA,UACA,gBAAAjS,EAAC+R,EAAK,MAAL,EAAU,OAAM,MACf,UAAA,gBAAA/R;AAAA,YAACgS;AAAA,YAAA;AAAA,cACC,OAAO9H,EAAO;AAAA,cACd,UAAU,CAAC+H,MAAM7H,EAAgB,EAAE,QAAQ6H,KAAK,MAAM;AAAA,cACtD,KAAK;AAAA,cACL,KAAK;AAAA,cACL,OAAO,EAAE,OAAO,OAAA;AAAA,YAAO;AAAA,UAAA,GAE3B;AAAA,UACA,gBAAAjS,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAA/R;AAAA,YAACkS;AAAA,YAAA;AAAA,cACC,SAAShI,EAAO,aAAa;AAAA,cAC7B,UAAU,CAACiI,MAAY/H,EAAgB,EAAE,UAAU+H,GAAS;AAAA,YAAA;AAAA,UAAA,GAEhE;AAAA,UACA,gBAAAnS,EAAC+R,EAAK,MAAL,EAAU,OAAM,OACf,UAAA,gBAAAzR,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,YAAA,gBAAAN;AAAA,cAAC+I;AAAA,cAAA;AAAA,gBACC,OAAOmB,EAAO,cAAc;AAAA,gBAC5B,UAAU,CAACrH,MAAUuH,EAAgB,EAAE,YAAYvH,EAAM,cAAY,CAAG;AAAA,cAAA;AAAA,YAAA;AAAA,YAE1E,gBAAA7C;AAAA,cAAC0J;AAAA,cAAA;AAAA,gBACC,OAAOQ,EAAO;AAAA,gBACd,UAAU,CAAC1R,MAAM4R,EAAgB,EAAE,YAAY5R,EAAE,OAAO,OAAO;AAAA,gBAC/D,aAAY;AAAA,cAAA;AAAA,YAAA;AAAA,UACd,EAAA,CACF,EAAA,CACF;AAAA,UACA,gBAAA8H,EAACyR,EAAK,MAAL,EAAU,OAAM,QACf,UAAA;AAAA,YAAA,gBAAAzR,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,cAAA,gBAAAN;AAAA,gBAACQ;AAAA,gBAAA;AAAA,kBACC,QAAO;AAAA,kBACP,gBAAgB;AAAA,kBAChB,cAAc,CAACnB,MAAS;AAEtB,wBAAI,CADYA,EAAK,KAAK,WAAW,QAAQ;AAE3C,6BAAA+S,GAAQ,MAAM,WAAW,GAClB;AAET,0BAAM9S,IAAS,IAAI,WAAA;AACnB,2BAAAA,EAAO,SAAS,CAAC9G,MAAM;AACrB,4BAAM6Z,IAAS7Z,EAAE,QAAQ;AACzB,sBAAA4R,EAAgB,EAAE,iBAAiBiI,GAAQ,GAC3CD,GAAQ,QAAQ,UAAU;AAAA,oBAC5B,GACA9S,EAAO,cAAcD,CAAI,GAClB;AAAA,kBACT;AAAA,kBAEA,4BAACa,GAAA,EAAO,MAAM,gBAAAF,EAACS,IAAA,CAAA,CAAe,GAAI,UAAA,OAAA,CAAI;AAAA,gBAAA;AAAA,cAAA;AAAA,cAExC,gBAAAT;AAAA,gBAAC0J;AAAA,gBAAA;AAAA,kBACC,OAAOQ,EAAO;AAAA,kBACd,UAAU,CAAC1R,MAAM4R,EAAgB,EAAE,iBAAiB5R,EAAE,OAAO,OAAO;AAAA,kBACpE,aAAY;AAAA,kBACZ,OAAO,EAAE,MAAM,EAAA;AAAA,gBAAE;AAAA,cAAA;AAAA,cAElB0R,EAAO,mBACN,gBAAAlK;AAAA,gBAACE;AAAA,gBAAA;AAAA,kBACC,wBAAOoS,IAAA,EAAc;AAAA,kBACrB,SAAS,MAAMlI,EAAgB,EAAE,iBAAiB,QAAW;AAAA,kBAC7D,QAAM;AAAA,kBACN,MAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,YACP,GAEJ;AAAA,YACCF,EAAO,mBACN,gBAAAlK,EAAC,OAAA,EAAI,WAAU,2BAA0B,OAAO,EAAE,UAAU,OAAA,GAC1D,UAAA,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,KAAKkK,EAAO;AAAA,gBACZ,KAAI;AAAA,gBACJ,OAAO,EAAE,UAAU,QAAQ,WAAW,KAAK,WAAW,UAAA;AAAA,cAAU;AAAA,YAAA,EAClE,CACF;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ,GC/qCM,EAAA,QAAEqI,OAAWC,IASNC,KAAwD,CAAC;AAAA,EACpE,UAAAjW;AAAA,EACA,QAAAkW;AAAA,EACA,WAAAC,IAAY,CAAA;AAAA,EACZ,aAAAC,IAAc,CAAA;AAChB,MAAM;AAEJ,QAAM9W,IADeU,EACQ,WAAW,CAAA,GAElC,CAACqW,GAAUC,CAAW,IAAI3T,EAAS;AAAA,IACvC,OAAOrD,EAAQ,SAAS;AAAA,IACxB,OAAOA,EAAQ,SAAS;AAAA,IACxB,iBAAiBA,EAAQ,mBAAmB;AAAA,IAC5C,MAAMA,EAAQ,QAAQ;AAAA,IACtB,UAAUA,EAAQ,YAAY;AAAA,IAC9B,eAAeA,EAAQ,YAAY,YAAY;AAAA,IAC/C,iBAAiBA,EAAQ,YAAY,cAAc;AAAA,IACnD,YAAYA,EAAQ,YAAY,SAAS;AAAA,IACzC,eAAeA,EAAQ,YAAY,YAAY;AAAA,IAC/C,iBAAiBA,EAAQ,YAAY,cAAc;AAAA,IACnD,YAAYA,EAAQ,YAAY,SAAS;AAAA,EAAA,CAC1C;AAED,EAAAmK,GAAU,MAAM;AACd,IAAA6M,EAAY;AAAA,MACV,OAAOhX,EAAQ,SAAS;AAAA,MACxB,OAAOA,EAAQ,SAAS;AAAA,MACxB,iBAAiBA,EAAQ,mBAAmB;AAAA,MAC5C,MAAMA,EAAQ,QAAQ;AAAA,MACtB,UAAUA,EAAQ,YAAY;AAAA,MAC9B,eAAeA,EAAQ,YAAY,YAAY;AAAA,MAC/C,iBAAiBA,EAAQ,YAAY,cAAc;AAAA,MACnD,YAAYA,EAAQ,YAAY,SAAS;AAAA,MACzC,eAAeA,EAAQ,YAAY,YAAY;AAAA,MAC/C,iBAAiBA,EAAQ,YAAY,cAAc;AAAA,MACnD,YAAYA,EAAQ,YAAY,SAAS;AAAA,IAAA,CAC1C;AAAA,EACH,GAAG,CAACU,EAAS,EAAE,CAAC;AAEhB,QAAMuW,IAAe,CAACC,GAAexZ,MAAmB;AACtD,IAAAsZ,EAAY,CAAC1E,OAAU,EAAE,GAAGA,GAAM,CAAC4E,CAAK,GAAGxZ,EAAA,EAAQ;AAAA,EACrD,GAEMyZ,IAA0B,CAACC,MAAiB;AAChD,UAAMC,IAAiBP,EAAY,KAAK,CAACQ,MAAQA,EAAI,eAAeF,CAAI,GAClEG,IAAWF,GAAgB,QAAQ;AAEzC,IAAAL,EAAY,CAAC1E,OAAU;AAAA,MACrB,GAAGA;AAAA,MACH,iBAAiB8E;AAAA,MACjB,MAAMG;AAAA,MACN,OAAO,OAAOF,GAAgB,SAAS,EAAE;AAAA,IAAA,EACzC,GAEF,WAAW,MAAM;AACf,MAAAT,EAAO;AAAA,QACL,SAAS;AAAA,UACP,GAAG5W;AAAA,UACH,iBAAiBoX;AAAA,UACjB,OAAO,OAAOC,GAAgB,SAAS,EAAE;AAAA,UACzC,MAAME;AAAA,QAAA;AAAA,MACR,CACoB;AAAA,IACxB,GAAG,CAAC;AAAA,EACN,GAEMC,IAAa,MAAM;AACvB,IAAAZ,EAAO;AAAA,MACL,SAAS;AAAA,QACP,GAAG5W;AAAA,QACH,OAAO+W,EAAS;AAAA,QAChB,OAAOA,EAAS;AAAA,QAChB,iBAAiBA,EAAS;AAAA,QAC1B,MAAMA,EAAS;AAAA,QACf,UAAUA,EAAS;AAAA,QACnB,YAAY;AAAA,UACV,UAAUA,EAAS;AAAA,UACnB,YAAYA,EAAS;AAAA,UACrB,OAAOA,EAAS;AAAA,QAAA;AAAA,QAElB,YAAY;AAAA,UACV,UAAUA,EAAS;AAAA,UACnB,YAAYA,EAAS;AAAA,UACrB,OAAOA,EAAS;AAAA,QAAA;AAAA,MAClB;AAAA,IACF,CACoB;AAAA,EACxB,GAEMU,IAAmBX,EAAY;AAAA,IAAO,CAACQ,MAC3CT,EAAU,SAASS,EAAI,UAAU;AAAA,EAAA;AAGnC,SACE,gBAAA9S,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAN,EAACwT,MAAQ,OAAO,EAAE,WAAW,EAAA,GAAK,UAAA,QAAI;AAAA,IAEtC,gBAAAlT,EAACyR,GAAA,EAAK,QAAO,YACX,UAAA;AAAA,MAAA,gBAAA/R,EAAC+R,EAAK,MAAL,EAAU,OAAM,gBACf,UAAA,gBAAA/R;AAAA,QAAC0J;AAAA,QAAA;AAAA,UACC,OAAOmJ,EAAS;AAAA,UAChB,UAAU,CAACra,MAAMua,EAAa,SAASva,EAAE,OAAO,KAAK;AAAA,UACrD,QAAQ8a;AAAA,UACR,aAAY;AAAA,QAAA;AAAA,MAAA,GAEhB;AAAA,MAEA,gBAAAtT;AAAA,QAAC+R,EAAK;AAAA,QAAL;AAAA,UACC,OAAM;AAAA,UACN,MAAK;AAAA,UACL,UAAA,gBAAA/R;AAAA,YAACwS;AAAA,YAAA;AAAA,cACC,OAAOK,EAAS,mBAAmB;AAAA,cACnC,UAAUI;AAAA,cACV,aAAY;AAAA,cACZ,YAAU;AAAA,cACV,OAAO,EAAE,OAAO,OAAA;AAAA,cAChB,YAAY;AAAA,gBACV,OAAO;AAAA,gBACP,OAAO;AAAA,cAAA;AAAA,cAET,SAASM;AAAA,YAAA;AAAA,UAAA;AAAA,QACX;AAAA,MAAA;AAAA,MAGF,gBAAAvT;AAAA,QAAC+R,EAAK;AAAA,QAAL;AAAA,UACC,OAAOc,EAAS,kBAAkB,YAAY;AAAA,UAC9C,MACEA,EAAS,kBACL,qCACA;AAAA,UAEN,UAAA,gBAAA7S;AAAA,YAAC0J;AAAA,YAAA;AAAA,cACC,OAAOmJ,EAAS;AAAA,cAChB,UAAU,CAACra,MAAMua,EAAa,SAASva,EAAE,OAAO,KAAK;AAAA,cACrD,QAAQ8a;AAAA,cACR,aACET,EAAS,kBACL,kBACA;AAAA,cAEN,UAAU,CAAC,CAACA,EAAS;AAAA,cACrB,SAASA,EAAS,kBAAkB,WAAW;AAAA,YAAA;AAAA,UAAA;AAAA,QACjD;AAAA,MAAA;AAAA,wBAGDd,EAAK,MAAL,EAAU,OAAM,MAAK,MAAK,sBACzB,UAAA,gBAAA/R;AAAA,QAAC0J;AAAA,QAAA;AAAA,UACC,OAAOmJ,EAAS;AAAA,UAChB,UAAU,CAACra,MAAMua,EAAa,QAAQva,EAAE,OAAO,KAAK;AAAA,UACpD,QAAQ8a;AAAA,UACR,aAAY;AAAA,UACZ,QACET,EAAS,mBAAmBU,EAAiB,SAAS,IACpD,gBAAAvT,EAACO,IAAA,EAAI,OAAM,QAAO,OAAO,EAAE,aAAa,GAAA,GAAM,gBAE9C,IACE;AAAA,QAAA;AAAA,MAAA,GAGV;AAAA,MAEA,gBAAAP;AAAA,QAAC+R,EAAK;AAAA,QAAL;AAAA,UACC,OAAM;AAAA,UACN,MAAK;AAAA,UACL,UAAA,gBAAA/R;AAAA,YAACgS;AAAA,YAAA;AAAA,cACC,OAAOa,EAAS;AAAA,cAChB,UAAU,CAACZ,MAAMc,EAAa,YAAYd,KAAK,CAAC;AAAA,cAChD,QAAQqB;AAAA,cACR,KAAK;AAAA,cACL,KAAK;AAAA,cACL,OAAO,EAAE,OAAO,OAAA;AAAA,YAAO;AAAA,UAAA;AAAA,QACzB;AAAA,MAAA;AAAA,IACF,GACF;AAAA,IAEA,gBAAAtT,EAACwT,MAAQ,UAAA,OAAA,CAAI;AAAA,IAEb,gBAAAlT,EAACyR,GAAA,EAAK,QAAO,YACX,UAAA;AAAA,MAAA,gBAAAzR,EAAC8Q,IAAA,EACC,UAAA;AAAA,QAAA,gBAAApR,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAA/R;AAAA,UAACgS;AAAA,UAAA;AAAA,YACC,OAAOa,EAAS;AAAA,YAChB,UAAU,CAACZ,MAAMc,EAAa,iBAAiBd,KAAK,EAAE;AAAA,YACtD,QAAQqB;AAAA,YACR,KAAK;AAAA,YACL,KAAK;AAAA,UAAA;AAAA,QAAA,GAET;AAAA,QAEA,gBAAAtT,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAAzR;AAAA,UAACkS;AAAA,UAAA;AAAA,YACC,OAAOK,EAAS;AAAA,YAChB,UAAU,CAACZ,MAAM;AACf,cAAAc,EAAa,mBAAmBd,CAAC,GACjC,WAAWqB,GAAY,CAAC;AAAA,YAC1B;AAAA,YACA,OAAO,EAAE,OAAO,IAAA;AAAA,YAChB,UAAA;AAAA,cAAA,gBAAAtT,EAACuS,IAAA,EAAO,OAAM,UAAS,UAAA,MAAE;AAAA,cACzB,gBAAAvS,EAACuS,IAAA,EAAO,OAAM,QAAO,UAAA,KAAA,CAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,EACzB,CACF;AAAA,MAAA,GACF;AAAA,MAEA,gBAAAvS,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAAzR,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAAC+I;AAAA,UAAA;AAAA,YACC,OAAO8J,EAAS,cAAc;AAAA,YAC9B,UAAU,CAAChQ,MAAU;AACnB,cAAAkQ,EAAa,cAAclQ,EAAM,aAAa;AAAA,YAChD;AAAA,YACA,kBAAkB,CAACA,MAAU;AAC3B,cAAA6P,EAAO;AAAA,gBACL,SAAS;AAAA,kBACP,GAAG5W;AAAA,kBACH,OAAO+W,EAAS;AAAA,kBAChB,OAAOA,EAAS;AAAA,kBAChB,iBAAiBA,EAAS;AAAA,kBAC1B,MAAMA,EAAS;AAAA,kBACf,UAAUA,EAAS;AAAA,kBACnB,YAAY;AAAA,oBACV,UAAUA,EAAS;AAAA,oBACnB,YAAYA,EAAS;AAAA,oBACrB,OAAOhQ,EAAM,YAAA;AAAA,kBAAY;AAAA,kBAE3B,YAAY;AAAA,oBACV,UAAUgQ,EAAS;AAAA,oBACnB,YAAYA,EAAS;AAAA,oBACrB,OAAOA,EAAS;AAAA,kBAAA;AAAA,gBAClB;AAAA,cACF,CACoB;AAAA,YACxB;AAAA,UAAA;AAAA,QAAA;AAAA,QAEF,gBAAA7S;AAAA,UAAC0J;AAAA,UAAA;AAAA,YACC,OAAOmJ,EAAS;AAAA,YAChB,UAAU,CAACra,MAAMua,EAAa,cAAcva,EAAE,OAAO,KAAK;AAAA,YAC1D,QAAQ8a;AAAA,YACR,aAAY;AAAA,YACZ,OAAO,EAAE,OAAO,IAAA;AAAA,UAAI;AAAA,QAAA;AAAA,MACtB,EAAA,CACF,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAEA,gBAAAtT,EAACwT,MAAQ,UAAA,MAAA,CAAG;AAAA,IAEZ,gBAAAlT,EAACyR,GAAA,EAAK,QAAO,YACX,UAAA;AAAA,MAAA,gBAAAzR,EAAC8Q,IAAA,EACC,UAAA;AAAA,QAAA,gBAAApR,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAA/R;AAAA,UAACgS;AAAA,UAAA;AAAA,YACC,OAAOa,EAAS;AAAA,YAChB,UAAU,CAACZ,MAAMc,EAAa,iBAAiBd,KAAK,EAAE;AAAA,YACtD,QAAQqB;AAAA,YACR,KAAK;AAAA,YACL,KAAK;AAAA,UAAA;AAAA,QAAA,GAET;AAAA,QAEA,gBAAAtT,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAAzR;AAAA,UAACkS;AAAA,UAAA;AAAA,YACC,OAAOK,EAAS;AAAA,YAChB,UAAU,CAACZ,MAAM;AACf,cAAAc,EAAa,mBAAmBd,CAAC,GACjC,WAAWqB,GAAY,CAAC;AAAA,YAC1B;AAAA,YACA,OAAO,EAAE,OAAO,IAAA;AAAA,YAChB,UAAA;AAAA,cAAA,gBAAAtT,EAACuS,IAAA,EAAO,OAAM,UAAS,UAAA,MAAE;AAAA,cACzB,gBAAAvS,EAACuS,IAAA,EAAO,OAAM,QAAO,UAAA,KAAA,CAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,EACzB,CACF;AAAA,MAAA,GACF;AAAA,MAEA,gBAAAvS,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAAzR,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAAC+I;AAAA,UAAA;AAAA,YACC,OAAO8J,EAAS,cAAc;AAAA,YAC9B,UAAU,CAAChQ,MAAU;AACnB,cAAAkQ,EAAa,cAAclQ,EAAM,aAAa;AAAA,YAChD;AAAA,YACA,kBAAkB,CAACA,MAAU;AAC3B,cAAA6P,EAAO;AAAA,gBACL,SAAS;AAAA,kBACP,GAAG5W;AAAA,kBACH,OAAO+W,EAAS;AAAA,kBAChB,OAAOA,EAAS;AAAA,kBAChB,iBAAiBA,EAAS;AAAA,kBAC1B,MAAMA,EAAS;AAAA,kBACf,UAAUA,EAAS;AAAA,kBACnB,YAAY;AAAA,oBACV,UAAUA,EAAS;AAAA,oBACnB,YAAYA,EAAS;AAAA,oBACrB,OAAOA,EAAS;AAAA,kBAAA;AAAA,kBAElB,YAAY;AAAA,oBACV,UAAUA,EAAS;AAAA,oBACnB,YAAYA,EAAS;AAAA,oBACrB,OAAOhQ,EAAM,YAAA;AAAA,kBAAY;AAAA,gBAC3B;AAAA,cACF,CACoB;AAAA,YACxB;AAAA,UAAA;AAAA,QAAA;AAAA,QAEF,gBAAA7C;AAAA,UAAC0J;AAAA,UAAA;AAAA,YACC,OAAOmJ,EAAS;AAAA,YAChB,UAAU,CAACra,MAAMua,EAAa,cAAcva,EAAE,OAAO,KAAK;AAAA,YAC1D,QAAQ8a;AAAA,YACR,aAAY;AAAA,YACZ,OAAO,EAAE,OAAO,IAAA;AAAA,UAAI;AAAA,QAAA;AAAA,MACtB,EAAA,CACF,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ,GC/TaG,KAA0D,CAAC;AAAA,EACtE,UAAAjX;AAAA,EACA,QAAAkW;AACF,MAAM;AACJ,QAAM7Q,IAAgBrF,GAEhB,CAACqW,GAAUC,CAAW,IAAI3T,EAAS;AAAA,IACvC,MAAM3C,EAAS;AAAA,IACf,KAAKqF,EAAc,OAAO;AAAA,IAC1B,iBAAiBA,EAAc,mBAAmB;AAAA,IAClD,WAAWA,EAAc,aAAa;AAAA,EAAA,CACvC;AAED,EAAAoE,GAAU,MAAM;AACd,IAAA6M,EAAY;AAAA,MACV,MAAMtW,EAAS;AAAA,MACf,KAAKqF,EAAc,OAAO;AAAA,MAC1B,iBAAiBA,EAAc,mBAAmB;AAAA,MAClD,WAAWA,EAAc,aAAa;AAAA,IAAA,CACvC;AAAA,EACH,GAAG,CAACrF,EAAS,EAAE,CAAC;AAEhB,QAAMuW,IAAe,CAACC,GAAexZ,MAAkB;AACrD,IAAAsZ,EAAY,CAAC1E,OAAU,EAAE,GAAGA,GAAM,CAAC4E,CAAK,GAAGxZ,EAAA,EAAQ;AAAA,EACrD,GAEM8Z,IAAa,MAAM;AACvB,IAAAZ,EAAO;AAAA,MACL,MAAMG,EAAS;AAAA,MACf,KAAKA,EAAS;AAAA,MACd,iBAAiBA,EAAS;AAAA,IAAA,CACN;AAAA,EACxB;AAEA,SACE,gBAAAvS,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAN,EAACwT,MAAQ,OAAO,EAAE,WAAW,EAAA,GAAK,UAAA,QAAI;AAAA,IAEtC,gBAAAlT,EAACyR,GAAA,EAAK,QAAO,YACX,UAAA;AAAA,MAAA,gBAAA/R,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAA/R;AAAA,QAAC0J;AAAA,QAAA;AAAA,UACC,OAAOmJ,EAAS;AAAA,UAChB,UAAU,CAACra,MAAMua,EAAa,QAAQva,EAAE,OAAO,KAAK;AAAA,UACpD,QAAQ8a;AAAA,QAAA;AAAA,MAAA,GAEZ;AAAA,MAEA,gBAAAtT,EAAC+R,EAAK,MAAL,EAAU,OAAM,cACf,UAAA,gBAAA/R;AAAA,QAAC0J,GAAM;AAAA,QAAN;AAAA,UACC,OAAOmJ,EAAS;AAAA,UAChB,UAAU,CAACra,MAAMua,EAAa,OAAOva,EAAE,OAAO,KAAK;AAAA,UACnD,QAAQ8a;AAAA,UACR,MAAM;AAAA,UACN,aAAY;AAAA,QAAA;AAAA,MAAA,GAEhB;AAAA,MAEA,gBAAAtT,EAAC+R,EAAK,MAAL,EAAU,OAAM,cACf,UAAA,gBAAAzR,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAAC+I;AAAA,UAAA;AAAA,YACC,OAAO8J,EAAS,aAAa;AAAA,YAC7B,UAAU,CAAChQ,MAAU;AACnB,oBAAM6Q,IAAW7Q,EAAM,YAAA;AACvB,cAAAkQ,EAAa,aAAaW,CAAQ,GAElChB,EAAO;AAAA,gBACL,MAAMG,EAAS;AAAA,gBACf,KAAKA,EAAS;AAAA,gBACd,iBAAiBA,EAAS;AAAA,gBAC1B,WAAWa;AAAA,cAAA,CACS;AAAA,YACxB;AAAA,UAAA;AAAA,QAAA;AAAA,QAEF,gBAAA1T;AAAA,UAAC0J;AAAA,UAAA;AAAA,YACC,OAAOmJ,EAAS;AAAA,YAChB,UAAU,CAACra,MAAMua,EAAa,aAAava,EAAE,OAAO,KAAK;AAAA,YACzD,QAAQ8a;AAAA,YACR,aAAY;AAAA,UAAA;AAAA,QAAA;AAAA,MACd,EAAA,CACF,EAAA,CACF;AAAA,MAEA,gBAAAtT,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAAzR,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAAC+I;AAAA,UAAA;AAAA,YACC,OAAO8J,EAAS,mBAAmB;AAAA,YACnC,UAAU,CAAChQ,MAAU;AACnB,oBAAM6Q,IAAW7Q,EAAM,YAAA;AACvB,cAAAkQ,EAAa,mBAAmBW,CAAQ,GAExChB,EAAO;AAAA,gBACL,MAAMG,EAAS;AAAA,gBACf,KAAKA,EAAS;AAAA,gBACd,iBAAiBa;AAAA,gBACjB,WAAWb,EAAS;AAAA,cAAA,CACA;AAAA,YACxB;AAAA,UAAA;AAAA,QAAA;AAAA,QAEF,gBAAA7S;AAAA,UAAC0J;AAAA,UAAA;AAAA,YACC,OAAOmJ,EAAS;AAAA,YAChB,UAAU,CAACra,MAAMua,EAAa,mBAAmBva,EAAE,OAAO,KAAK;AAAA,YAC/D,QAAQ8a;AAAA,YACR,aAAY;AAAA,UAAA;AAAA,QAAA;AAAA,MACd,EAAA,CACF,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ,GClHM,EAAE,QAAAf,OAAWC,IAONmB,KAAwD,CAAC;AAAA,EACpE,UAAAnX;AAAA,EACA,QAAAkW;AACF,MAAM;AACJ,QAAMpN,IAAc9I,EAA0B,UAAU,CAAA,GAElD,CAACqW,GAAUC,CAAW,IAAI3T,EAAS;AAAA,IACvC,YAAYmG,EAAW,cAAcA,EAAW,aAAa;AAAA,IAC7D,OAAOA,EAAW,SAAS;AAAA,IAC3B,UAAUA,EAAW,YAAY;AAAA,IACjC,QAAQA,EAAW,UAAU;AAAA,IAC7B,QAAQA,EAAW,UAAU;AAAA,IAC7B,MAAMA,EAAW,QAAQ;AAAA,IACzB,MAAMA,EAAW,QAAQ;AAAA,EAAA,CAC1B;AAED,EAAAW,GAAU,MAAM;AACd,IAAA6M,EAAY;AAAA,MACV,YAAYxN,EAAW,cAAcA,EAAW,aAAa;AAAA,MAC7D,OAAOA,EAAW,SAAS;AAAA,MAC3B,UAAUA,EAAW,YAAY;AAAA,MACjC,QAAQA,EAAW,UAAU;AAAA,MAC7B,QAAQA,EAAW,UAAU;AAAA,MAC7B,MAAMA,EAAW,QAAQ;AAAA,MACzB,MAAMA,EAAW,QAAQ;AAAA,IAAA,CAC1B;AAAA,EACH,GAAG,CAAC9I,EAAS,EAAE,CAAC;AAEhB,QAAMoX,IAAuB,CAACC,MAAwC;AACpE,UAAMC,IAAc,EAAE,GAAGjB,GAAU,GAAGgB,EAAA;AACtC,IAAAf,EAAYgB,CAAW,GAEvBpB,EAAO;AAAA,MACL,QAAQ;AAAA,QACN,GAAGpN;AAAA,QACH,WAAWwO,EAAY;AAAA,QACvB,YAAYA,EAAY;AAAA,QACxB,OAAOA,EAAY;AAAA,QACnB,UAAUA,EAAY;AAAA,QACtB,QAAQA,EAAY;AAAA,QACpB,QAAQA,EAAY;AAAA,QACpB,MAAMA,EAAY;AAAA,QAClB,MAAMA,EAAY;AAAA,MAAA;AAAA,IACpB,CACoB;AAAA,EACxB,GAEMC,IAAkB;AAAA,IACtB,EAAE,OAAO,SAAS,OAAO,MAAM,MAAM,OAAA;AAAA,IACrC,EAAE,OAAO,UAAU,OAAO,MAAM,MAAM,OAAA;AAAA,IACtC,EAAE,OAAO,UAAU,OAAO,YAAY,MAAM,UAAA;AAAA,IAC5C,EAAE,OAAO,WAAW,OAAO,OAAO,MAAM,UAAA;AAAA,IACxC,EAAE,OAAO,OAAO,OAAO,MAAM,MAAM,OAAA;AAAA,IACnC,EAAE,OAAO,YAAY,OAAO,OAAO,MAAM,SAAA;AAAA,EAAS;AAGpD,SACE,gBAAAzT,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAN,EAACwT,MAAQ,OAAO,EAAE,WAAW,EAAA,GAAK,UAAA,cAAU;AAAA,IAE5C,gBAAAlT,EAACyR,GAAA,EAAK,QAAO,YACX,UAAA;AAAA,MAAA,gBAAAzR,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,QAAA,gBAAAN,EAAC+R,EAAK,MAAL,EAAU,OAAM,QAAO,WAAU,QAChC,UAAA,gBAAA/R;AAAA,UAACgS;AAAA,UAAA;AAAA,YACC,OAAOa,EAAS;AAAA,YAChB,UAAU,CAACZ,MAAM2B,EAAqB,EAAE,QAAQ3B,KAAK,GAAG;AAAA,YACxD,OAAO,EAAE,OAAO,OAAA;AAAA,UAAO;AAAA,QAAA,GAE3B;AAAA,0BACCF,EAAK,MAAL,EAAU,OAAM,QAAO,WAAU,QAChC,UAAA,gBAAA/R;AAAA,UAACgS;AAAA,UAAA;AAAA,YACC,OAAOa,EAAS;AAAA,YAChB,UAAU,CAACZ,MAAM2B,EAAqB,EAAE,QAAQ3B,KAAK,GAAG;AAAA,YACxD,OAAO,EAAE,OAAO,OAAA;AAAA,UAAO;AAAA,QAAA,GAE3B;AAAA,0BACCF,EAAK,MAAL,EAAU,OAAM,QAAO,WAAU,QAChC,UAAA,gBAAA/R;AAAA,UAACgS;AAAA,UAAA;AAAA,YACC,OAAOa,EAAS;AAAA,YAChB,UAAU,CAACZ,MAAM2B,EAAqB,EAAE,MAAM3B,KAAK,KAAK;AAAA,YACxD,OAAO,EAAE,OAAO,OAAA;AAAA,UAAO;AAAA,QAAA,GAE3B;AAAA,0BACCF,EAAK,MAAL,EAAU,OAAM,QAAO,WAAU,QAChC,UAAA,gBAAA/R;AAAA,UAACgS;AAAA,UAAA;AAAA,YACC,OAAOa,EAAS;AAAA,YAChB,UAAU,CAACZ,MAAM2B,EAAqB,EAAE,MAAM3B,KAAK,GAAG;AAAA,YACtD,OAAO,EAAE,OAAO,OAAA;AAAA,UAAO;AAAA,QAAA,EACzB,CACF;AAAA,MAAA,GACF;AAAA,MAEA,gBAAAjS,EAAC+R,EAAK,MAAL,EAAU,OAAM,QAAO,WAAU,QAChC,UAAA,gBAAAzR,EAAC8Q,IAAA,EACC,UAAA;AAAA,QAAA,gBAAApR;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM;AAEb,oBAAM8T,IAAgB1O,EAAW,UAAUuN,EAAS;AACpD,cAAAe,EAAqB,EAAE,MAAMI,GAAe;AAAA,YAC9C;AAAA,YACA,OAAM;AAAA,YAAW,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGnB,gBAAAhU;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM;AAEb,oBAAM+T,IAAgB3O,EAAW,UAAUuN,EAAS;AACpD,cAAAe,EAAqB,EAAE,MAAMK,GAAe;AAAA,YAC9C;AAAA,YACA,OAAM;AAAA,YAAW,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGnB,gBAAAjU;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM;AAEb,oBAAM+T,IAAgB3O,EAAW,UAAUuN,EAAS,QAC9CmB,IAAgB1O,EAAW,UAAUuN,EAAS,QAC9CqB,IAAc5O,EAAW,QAAQuN,EAAS,MAC1CsB,IAAc7O,EAAW,QAAQuN,EAAS;AAChD,cAAAe,EAAqB;AAAA,gBACnB,QAAQM;AAAA,gBACR,QAAQC;AAAA,gBACR,MAAMF;AAAA,gBACN,MAAMD;AAAA,cAAA,CACP;AAAA,YACH;AAAA,YACA,OAAM;AAAA,YAAU,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAElB,EAAA,CACF,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAEA,gBAAAhU,EAACwT,MAAQ,UAAA,OAAA,CAAI;AAAA,IAEb,gBAAAlT,EAACyR,GAAA,EAAK,QAAO,YACX,UAAA;AAAA,MAAA,gBAAA/R,EAAC+R,EAAK,MAAL,EAAU,OAAM,MAAK,MAAK,UACzB,UAAA,gBAAA/R;AAAA,QAACwS;AAAA,QAAA;AAAA,UACC,OAAOK,EAAS;AAAA,UAChB,UAAU,CAACZ,MAAM2B,EAAqB,EAAE,UAAU3B,GAAG;AAAA,UACpD,UAAA8B,EAAgB,IAAI,CAACX,MACpB,gBAAApT,EAACuS,IAAA,EAAuB,OAAOa,EAAI,OACjC,UAAA,gBAAA9S,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,YAAA,gBAAAN,EAAC,QAAA,EAAM,YAAI,MAAA,CAAM;AAAA,YACjB,gBAAAA,EAAC,QAAA,EAAK,WAAU,yBAAyB,YAAI,KAAA,CAAK;AAAA,UAAA,GACpD,EAAA,GAJWoT,EAAI,KAKjB,CACD;AAAA,QAAA;AAAA,MAAA,GAEL;AAAA,MAEA,gBAAApT,EAAC+R,EAAK,MAAL,EAAU,OAAM,UACf,UAAA,gBAAA/R;AAAA,QAACgS;AAAA,QAAA;AAAA,UACC,OAAOa,EAAS;AAAA,UAChB,UAAU,CAACZ,MAAM2B,EAAqB,EAAE,YAAY3B,KAAK,GAAG;AAAA,UAC5D,KAAK;AAAA,UACL,KAAK;AAAA,UACL,OAAO,EAAE,OAAO,IAAA;AAAA,QAAI;AAAA,MAAA,GAExB;AAAA,MAEA,gBAAAjS,EAAC+R,EAAK,MAAL,EAAU,OAAM,MACf,UAAA,gBAAAzR,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAAC+I;AAAA,UAAA;AAAA,YACC,OAAO8J,EAAS,SAAS;AAAA,YACzB,UAAU,CAAChQ,MAAU+Q,EAAqB,EAAE,OAAO/Q,EAAM,cAAY,CAAG;AAAA,UAAA;AAAA,QAAA;AAAA,QAE1E,gBAAA7C;AAAA,UAAC0J;AAAA,UAAA;AAAA,YACC,OAAOmJ,EAAS;AAAA,YAChB,UAAU,CAACra,MAAMob,EAAqB,EAAE,OAAOpb,EAAE,OAAO,OAAO;AAAA,YAC/D,aAAY;AAAA,YACZ,OAAO,EAAE,OAAO,IAAA;AAAA,UAAI;AAAA,QAAA;AAAA,MACtB,EAAA,CACF,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ,GCnLa4b,KAAgE,CAAC;AAAA,EAC5E,UAAA5X;AAAA,EACA,QAAAkW;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC;AACF,MAAM;AACJ,UAAQpW,EAAS,MAAA;AAAA,IACf,KAAK;AACH,aACE,gBAAAwD;AAAA,QAACyS;AAAA,QAAA;AAAA,UACC,UAAAjW;AAAA,UACA,QAAAkW;AAAA,UACA,WAAAC;AAAA,UACA,aAAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IAGN,KAAK;AACH,aAAO,gBAAA5S,EAACyT,IAAA,EAAoB,UAAAjX,GAAoB,QAAAkW,EAAA,CAAgB;AAAA,IAClE,KAAK;AACH,aAAO,gBAAA1S,EAAC2T,IAAA,EAAmB,UAAAnX,GAAoB,QAAAkW,EAAA,CAAgB;AAAA,IACjE;AACE,aACE,gBAAA1S,EAAC,OAAA,EAAI,WAAU,kCAAiC,UAAA,gBAEhD;AAAA,EAAA;AAGR,GCjCM,EAAA,OAAE5B,OAAUC,IACZ,EAAA,UAAEoL,OAAaC,IAUR2K,KAA8D,CAAC;AAAA,EAC1E,MAAA/Y;AAAA,EACA,YAAAiP;AAAA,EACA,WAAA9L;AACF,MAAM;AAEJ,QAAM6V,IAAqB7V,EAAU,OAAO,CAAA,MAAK,EAAE,SAAS,YAAY,CAAC,EAAE,QAAQ,KAAK,GAGlF8V,IAA8B,CAACC,GAAiBC,MAAgC;AACpF,UAAMC,IAAcpZ,EAAK,UAAU,IAAI,CAAAwC,MACjCA,EAAM,OAAO0W,IACR;AAAA,MACL,GAAG1W;AAAA,MACH,aAAa;AAAA,QACX,GAAGA,EAAM;AAAA,QACT,YAAY2W;AAAA,MAAA;AAAA,IACd,IAGG3W,CACR;AAED,IAAAyM,EAAWjP,EAAK,IAAI;AAAA,MAClB,UAAUoZ;AAAA,IAAA,CACM;AAAA,EACpB,GAGMC,IAAuB,CAACH,MAAoB;AAChD,UAAM1W,IAAQxC,EAAK,UAAU,KAAK,CAAAsZ,MAAKA,EAAE,OAAOJ,CAAO;AACvD,QAAI,CAAC1W,EAAO;AAEZ,UAAM3B,IAAwB;AAAA,MAC5B,IAAIhB,EAAA;AAAA,MACJ,MAAM,KAAK2C,EAAM,YAAY,WAAW,SAAS,CAAC;AAAA,MAClD,YAAYA,EAAM,YAAY,WAAW,WAAW,IAAI,iBAAiB;AAAA,MACzE,UAAU,EAAE,GAAGwW,EAAmB,CAAC,GAAG,IAAInZ,IAAO;AAAA,MACjD,WAAW,CAAA;AAAA,IAAC;AAGd,IAAAoZ,EAA4BC,GAAS,CAAC,GAAG1W,EAAM,YAAY,YAAY3B,CAAS,CAAC;AAAA,EACnF,GAGM0Y,IAA0B,CAACL,GAAiBpY,MAAqB;AACrE,UAAM0B,IAAQxC,EAAK,UAAU,KAAK,CAAAsZ,MAAKA,EAAE,OAAOJ,CAAO;AACvD,QAAI,CAAC1W,EAAO;AAEZ,UAAM2W,IAAgB3W,EAAM,YAAY,WAAW,OAAO,CAAAzB,MAAKA,EAAE,OAAOD,CAAQ;AAChF,IAAAmY,EAA4BC,GAASC,CAAa;AAAA,EACpD,GAGMK,IAA0B,CAACN,GAAiBpY,GAAkBT,MAAiC;AACnG,UAAMmC,IAAQxC,EAAK,UAAU,KAAK,CAAAsZ,MAAKA,EAAE,OAAOJ,CAAO;AACvD,QAAI,CAAC1W,EAAO;AAEZ,UAAM2W,IAAgB3W,EAAM,YAAY,WAAW,IAAI,CAAAzB,MACjDA,EAAE,OAAOD,IACJ,EAAE,GAAGC,GAAG,GAAGV,EAAA,IAEbU,CACR;AAED,IAAAkY,EAA4BC,GAASC,CAAa;AAAA,EACpD,GAGMM,IAAwB,CAACP,GAAiBpY,GAAkBsT,MAA6B;AAC7F,UAAM5R,IAAQxC,EAAK,UAAU,KAAK,CAAAsZ,MAAKA,EAAE,OAAOJ,CAAO;AACvD,QAAI,CAAC1W,EAAO;AAEZ,UAAM9B,IAAQ8B,EAAM,YAAY,WAAW,UAAU,CAAAzB,MAAKA,EAAE,OAAOD,CAAQ;AAC3E,QAAIJ,MAAU,GAAI;AAElB,UAAMyY,IAAgB,CAAC,GAAG3W,EAAM,YAAY,UAAU;AACtD,IAAI4R,MAAc,QAAQ1T,IAAQ,IAChC,CAACyY,EAAczY,CAAK,GAAGyY,EAAczY,IAAQ,CAAC,CAAC,IAAI,CAACyY,EAAczY,IAAQ,CAAC,GAAGyY,EAAczY,CAAK,CAAC,IACzF0T,MAAc,UAAU1T,IAAQyY,EAAc,SAAS,MAChE,CAACA,EAAczY,CAAK,GAAGyY,EAAczY,IAAQ,CAAC,CAAC,IAAI,CAACyY,EAAczY,IAAQ,CAAC,GAAGyY,EAAczY,CAAK,CAAC,IAGpGuY,EAA4BC,GAASC,CAAa;AAAA,EACpD,GAGMO,IAAkC,CAACR,GAAiBpY,GAAkB6Y,MAAuB;AACjG,UAAMC,IAAmBzW,EAAU,KAAK,CAAA/B,MAAKA,EAAE,OAAOuY,CAAU;AAChE,IAAKC,KAELJ,EAAwBN,GAASpY,GAAU;AAAA,MACzC,UAAU,EAAE,GAAG8Y,GAAkB,IAAI/Z,IAAO;AAAA,IAAE,CAC/C;AAAA,EACH;AAEA,SACE,gBAAAmF,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAN,EAAC,SAAI,WAAU,yDACb,UAAA,gBAAAM,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,MAAA,gBAAAN,EAAC,YAAO,UAAA,OAAA,CAAI;AAAA,MAAS;AAAA,IAAA,EAAA,CACvB,EAAA,CACF;AAAA,IAEA,gBAAAA,EAAC3B,MAAS,OAAK,IACZ,YAAK,UAAU,IAAI,CAACP,GAAOqX,MAC1B,gBAAAnV;AAAA,MAAC5B;AAAAA,MAAA;AAAA,QAEC,QACE,gBAAAkC,EAAC,OAAA,EAAI,WAAU,iDACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,uBAAsB,UAAA;AAAA,YAAA;AAAA,YAAK6U,IAAa;AAAA,UAAA,GAAE;AAAA,UAC1D,gBAAA7U,EAACC,IAAA,EAAI,OAAM,QAAO,OAAO,EAAE,UAAU,QAAQ,SAAS,QAAA,GACnD,UAAA;AAAA,YAAAzC,EAAM,YAAY,WAAW;AAAA,YAAO;AAAA,UAAA,EAAA,CACvC;AAAA,QAAA,GACF;AAAA,QAEF,UAAA,gBAAAwC,EAAC,OAAA,EAAI,WAAU,aAEb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,YAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,yBAAwB,UAAA,QAAI;AAAA,YAC5C,gBAAAA;AAAA,cAACE;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,wBAAOkV,IAAA,EAAa;AAAA,gBACpB,SAAS,MAAMT,EAAqB7W,EAAM,EAAE;AAAA,gBAC7C,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAED,GACF;AAAA,UAECA,EAAM,YAAY,WAAW,WAAW,IACvC,gBAAAkC,EAAC,OAAA,EAAI,WAAU,wDAAuD,UAAA,gBAAA,CAEtE,IAEA,gBAAAA,EAAC3B,IAAA,EAAS,OAAK,IACZ,UAAAP,EAAM,YAAY,WAAW,IAAI,CAAC5B,GAAQmZ,MACzC,gBAAArV;AAAA,YAAC5B;AAAAA,YAAA;AAAA,cAEC,QACE,gBAAAkC,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,gBAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,6BAA6B,UAAAqV,IAAc,GAAE;AAAA,gBAC7D,gBAAArV,EAAC,QAAA,EAAK,WAAU,eAAe,YAAO,MAAK;AAAA,gBAC3C,gBAAAA,EAACO,MAAI,OAAM,WAAU,WAAU,WAAW,UAAArE,EAAO,SAAS,KAAA,CAAK;AAAA,cAAA,GACjE;AAAA,cAEF,OACE,gBAAAoE,EAAC8Q,IAAA,EAAM,MAAK,SAAQ,SAAS,CAAC5Y,MAAMA,EAAE,gBAAA,GACpC,UAAA;AAAA,gBAAA,gBAAAwH;AAAA,kBAACE;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,wBAAOoV,IAAA,EAAgB;AAAA,oBACvB,UAAUD,MAAgB;AAAA,oBAC1B,SAAS,CAAC7c,MAAM;AACd,sBAAAA,EAAE,gBAAA,GACFuc,EAAsBjX,EAAM,IAAI5B,EAAO,IAAI,IAAI;AAAA,oBACjD;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEF,gBAAA8D;AAAA,kBAACE;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,wBAAOqV,IAAA,EAAkB;AAAA,oBACzB,UAAUF,MAAgBvX,EAAM,YAAY,WAAW,SAAS;AAAA,oBAChE,SAAS,CAACtF,MAAM;AACd,sBAAAA,EAAE,gBAAA,GACFuc,EAAsBjX,EAAM,IAAI5B,EAAO,IAAI,MAAM;AAAA,oBACnD;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEF,gBAAA8D;AAAA,kBAACE;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,QAAM;AAAA,oBACN,wBAAOE,IAAA,EAAe;AAAA,oBACtB,SAAS,CAAC5H,MAAM;AACd,sBAAAA,EAAE,gBAAA,GACFqc,EAAwB/W,EAAM,IAAI5B,EAAO,EAAE;AAAA,oBAC7C;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACF,GACF;AAAA,cAGF,UAAA,gBAAAoE,EAACyR,GAAA,EAAK,QAAO,YAEX,UAAA;AAAA,gBAAA,gBAAA/R,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAA/R;AAAA,kBAAC0J;AAAA,kBAAA;AAAA,oBACC,OAAOxN,EAAO;AAAA,oBACd,UAAU,CAAC1D,MAAMsc,EAAwBhX,EAAM,IAAI5B,EAAO,IAAI,EAAE,MAAM1D,EAAE,OAAO,OAAO;AAAA,oBACtF,aAAY;AAAA,kBAAA;AAAA,gBAAA,GAEhB;AAAA,gBAGA,gBAAAwH;AAAA,kBAAC+R,EAAK;AAAA,kBAAL;AAAA,oBACC,OAAM;AAAA,oBACN,MAAK;AAAA,oBAEL,UAAA,gBAAA/R;AAAA,sBAACyJ;AAAAA,sBAAA;AAAA,wBACC,OAAOvN,EAAO;AAAA,wBACd,UAAU,CAAC1D,MAAMsc,EAAwBhX,EAAM,IAAI5B,EAAO,IAAI,EAAE,YAAY1D,EAAE,OAAO,OAAO;AAAA,wBAC5F,MAAM;AAAA,wBACN,aAAY;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBACd;AAAA,gBAAA;AAAA,gBAIF,gBAAAwH,EAAC+R,EAAK,MAAL,EAAU,OAAM,qBACf,UAAA,gBAAA/R;AAAA,kBAACwS;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAOtW,EAAO,aAAa,CAAA;AAAA,oBAC3B,UAAU,CAAC1C,MAAUsb,EAAwBhX,EAAM,IAAI5B,EAAO,IAAI,EAAE,WAAW1C,GAAO;AAAA,oBACtF,aAAY;AAAA,oBACZ,iBAAiB,CAAC,KAAK,GAAG;AAAA,kBAAA;AAAA,gBAAA,GAE9B;AAAA,gBAGA,gBAAAwG,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAAzR,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,kBAAA,gBAAAN,EAACO,IAAA,EAAI,OAAM,QAAQ,UAAArE,EAAO,SAAS,MAAK;AAAA,oCACvCqE,IAAA,EAAI,OAAM,WAAW,UAAArE,EAAO,SAAS,MAAK;AAAA,kBAC3C,gBAAA8D;AAAA,oBAACwS;AAAA,oBAAA;AAAA,sBACC,aAAY;AAAA,sBACZ,OAAO,EAAE,OAAO,IAAA;AAAA,sBAChB,OAAO;AAAA,sBACP,UAAU,CAAChZ,MAAUA,KAASwb,EAAgClX,EAAM,IAAI5B,EAAO,IAAI1C,CAAK;AAAA,sBACxF,SAAS8a,EAAmB,IAAI,CAAA5X,OAAM;AAAA,wBACpC,OAAOA,EAAE;AAAA,wBACT,OAAO,GAAGA,EAAE,IAAI,KAAKA,EAAE,IAAI;AAAA,sBAAA,EAC3B;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACJ,EAAA,CACF,EAAA,CACF;AAAA,kCAGC8W,IAAA,EAAQ,OAAO,EAAE,QAAQ,YAAY;AAAA,gBACtC,gBAAAlT,EAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,kBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,oBAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,uBAAsB,UAAA,QAAI;AAAA,oBAC1C,gBAAAA,EAACO,IAAA,EAAK,UAAArE,EAAO,SAAS,KAAA,CAAK;AAAA,kBAAA,GAC7B;AAAA,kBACA,gBAAA8D;AAAA,oBAACoU;AAAA,oBAAA;AAAA,sBACC,UAAUlY,EAAO;AAAA,sBACjB,QAAQ,CAACP,MAAY;AACnB,8BAAMc,IAAc,EAAE,GAAGP,EAAO,UAAU,GAAGP,EAAA;AAC7C,wBAAAmZ,EAAwBhX,EAAM,IAAI5B,EAAO,IAAI,EAAE,UAAUO,GAAa;AAAA,sBACxE;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACF,EAAA,CACF;AAAA,cAAA,EAAA,CACF;AAAA,YAAA;AAAA,YA9GKP,EAAO;AAAA,UAAA,CAgHf,EAAA,CACH;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA;AAAA,MAlJK4B,EAAM;AAAA,IAAA,CAoJd,EAAA,CACH;AAAA,EAAA,GACF;AAEJ,GCxPM,EAAE,OAAAM,OAAUC,IACZ,EAAE,SAAAmX,OAAYC,IACd,EAAE,UAAAhM,OAAaC,IAMRgM,KAA8C,CAAC;AAAA,EAC1D,iBAAA9L;AACF,MAAM;AACJ,QAAM;AAAA,IACJ,OAAAI;AAAA,IACA,gBAAAC;AAAA,IACA,YAAAM;AAAA,IACA,iBAAAoL;AAAA,IACA,mBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,WAAApX;AAAA,IACA,kBAAAG;AAAA,IACA,cAAAC;AAAA,EAAA,IACEzD,GAAA,GAEE,CAAC0a,CAAI,IAAI/D,EAAK,QAAA,GACd,CAACgE,GAAWC,CAAY,IAAI7W,EAAS,OAAO,GAC5C,CAAC8W,GAAsBC,CAAuB,IAAI/W,EAAS,EAAK,GAChE,CAACgX,GAAiBC,CAAkB,IAAIjX,EAAwB,IAAI,GACpE,CAACkX,GAAoBC,CAAqB,IAAInX,EAElD,CAAA,CAAE,GAEEoX,IAAejO,GAAM,QAAQ,MAC1B0B,EAAM,KAAK,CAACpO,MAAMA,EAAE,OAAOqO,CAAc,GAC/C,CAACD,GAAOC,CAAc,CAAC,GAEpBuM,IAAoBD,GAAc,YAAY,cAAc,CAAA,GAE5DE,IAAqB,CAACC,MAA2C;AACrE,IAAKzM,MAEDyM,EAAc,eAChBf,EAAgB1L,GAAgByM,EAAc,WAAsC,GAGlFA,EAAc,SAAS,UACzBnM,EAAWN,GAAgB,EAAE,MAAMyM,EAAc,MAAgB,GAG/DA,EAAc,eAChBd,EAAkB3L,GAAgByM,EAAc,WAAsC;AAAA,EAE1F;AACA,UAAQ,IAAIzM,GAAgB,kBAAkBsM,CAAY,GAE1DtQ,GAAU,MAAM;AACd,IAAKsQ,KAEDA,MACFT,EAAK,eAAe;AAAA,MAClB,MAAMS,EAAa;AAAA,MACnB,aAAa;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,GAAG;AAAA,QACH,GAAG;AAAA,QACH,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,SAAS;AAAA,QACT,GAAGA,EAAa;AAAA,MAAA;AAAA,MAElB,aAAa;AAAA,QACX,aAAa;AAAA,QACb,aAAa;AAAA,QACb,aAAa;AAAA,QACb,cAAc;AAAA,QACd,GAAGA,EAAa;AAAA,MAAA;AAAA,IAClB,CACD,GACD1X,EAAa,IAAI;AAAA,EAErB,GAAG,CAAC0X,GAAc1X,GAAciX,CAAI,CAAC;AAErC,QAAMa,KAAkB,MAAM;AAC5B,IAAI,CAAC1M,KAAkB,CAACsM,MACxBH,EAAmB,KAAK,GACxBF,EAAwB,EAAI;AAAA,EAC9B,GAEMU,KAAgC,CAACpa,MAAuB;AAC5D,QAAI,CAACyN,KAAkB,CAACsM,EAAc;AAEtC,UAAMpa,IAAwB;AAAA,MAC5B,IAAIhB,EAAA;AAAA,MACJ,MAAM,GAAGqB,EAAS,IAAI,MAAMga,EAAkB,SAAS,CAAC;AAAA,MACxD,YAAYA,EAAkB,WAAW,IAAI,iBAAiB;AAAA,MAC9D,UAAU,EAAE,GAAGha,GAAU,IAAIrB,IAAO;AAAA,MACpC,WAAW,CAAA;AAAA,IAAC;AAGd,QAAIgb,MAAoB,OAAO;AAC7B,YAAM1B,IAAgB,CAAC,GAAG+B,GAAmBra,CAAS;AACtD,MAAA0Z,EAAkB5L,GAAgB,EAAE,YAAYwK,EAAA,CAAe;AAAA,IACjE,WAAW0B,GAAiB;AAC1B,YAAM1B,IAAgB+B,EAAkB,IAAI,CAACna,MACvCA,EAAE,OAAO8Z,IACJ,EAAE,GAAG9Z,GAAG,UAAU,EAAE,GAAGG,GAAU,IAAIrB,EAAA,IAAS,IAEhDkB,CACR;AACD,MAAAwZ,EAAkB5L,GAAgB,EAAE,YAAYwK,EAAA,CAAe;AAAA,IACjE;AAEA,IAAAyB,EAAwB,EAAK,GAC7BE,EAAmB,IAAI;AAAA,EACzB,GAEMS,KAAqB,CAACza,MAAqB;AAC/C,QAAI,CAAC6N,KAAkB,CAACsM,EAAc;AAEtC,UAAM9B,IACJ8B,EAAa,YAAY,YAAY,OAAO,CAACla,MAAMA,EAAE,OAAOD,CAAQ,KAAK,CAAA;AAC3E,IAAAyZ,EAAkB5L,GAAgB,EAAE,YAAYwK,EAAA,CAAe,GAE3D7V,MAAqBxC,KACvByC,EAAa,IAAI;AAAA,EAErB,GAEMiY,KAAqB,CAAC1a,GAAkBT,MAAiC;AAC7E,QAAI,CAACsO,KAAkB,CAACsM,EAAc;AAEtC,UAAM9B,IACJ8B,EAAa,YAAY,YAAY,IAAI,CAACla,MACpCA,EAAE,OAAOD,IACJ,EAAE,GAAGC,GAAG,GAAGV,EAAA,IAEbU,CACR,KAAK,CAAA;AAER,IAAAwZ,EAAkB5L,GAAgB,EAAE,YAAYwK,EAAA,CAAe;AAAA,EACjE,GAEMsC,IAAmB,CAAC7a,MAAuB;AAC/C,QAAI,CAAC+N,KAAkB,CAACsM,EAAc;AAEtC,UAAMpa,IAAwB;AAAA,MAC5B,GAAGD;AAAA,MACH,IAAIf,EAAA;AAAA,MACJ,MAAM,GAAGe,EAAO,IAAI;AAAA,MACpB,YAAY;AAAA,IAAA,GAGRuY,IAAgB,CAAC,GAAG+B,GAAmBra,CAAS;AACtD,IAAA0Z,EAAkB5L,GAAgB,EAAE,YAAYwK,EAAA,CAAe;AAAA,EACjE,GAEMuC,IAAmB,CAAC5a,GAAkBsT,MAA6B;AACvE,QAAI,CAACzF,KAAkB,CAACsM,EAAc;AAEtC,UAAMva,IAAQwa,EAAkB,UAAU,CAACna,MAAMA,EAAE,OAAOD,CAAQ;AAClE,QAAIJ,MAAU,GAAI;AAElB,UAAMyY,IAAgB,CAAC,GAAG+B,CAAiB;AAC3C,IAAI9G,MAAc,QAAQ1T,IAAQ,IAChC,CAACyY,EAAczY,CAAK,GAAGyY,EAAczY,IAAQ,CAAC,CAAC,IAAI;AAAA,MACjDyY,EAAczY,IAAQ,CAAC;AAAA,MACvByY,EAAczY,CAAK;AAAA,IAAA,IAEZ0T,MAAc,UAAU1T,IAAQyY,EAAc,SAAS,MAChE,CAACA,EAAczY,CAAK,GAAGyY,EAAczY,IAAQ,CAAC,CAAC,IAAI;AAAA,MACjDyY,EAAczY,IAAQ,CAAC;AAAA,MACvByY,EAAczY,CAAK;AAAA,IAAA,IAIvB6Z,EAAkB5L,GAAgB,EAAE,YAAYwK,EAAA,CAAe;AAAA,EACjE,GAEMwC,IAA6B,CAAC7a,MAAqB;AACvD,IAAAga,EAAmBha,CAAQ,GAC3B8Z,EAAwB,EAAI;AAAA,EAC9B,GAEMgB,IAA6B,CAAC9a,GAAkBT,MAA+B;AACnF,QAAI,CAACsO,KAAkB,CAACsM,EAAc;AAEtC,UAAM9B,IAAgB+B,EAAkB,IAAI,CAACna,MACvCA,EAAE,OAAOD,IACJ;AAAA,MACL,GAAGC;AAAA,MACH,UAAU,EAAE,GAAGA,EAAE,UAAU,GAAGV,EAAA;AAAA,IAAQ,IAGnCU,CACR;AAED,IAAAwZ,EAAkB5L,GAAgB,EAAE,YAAYwK,EAAA,CAAe;AAAA,EACjE;AAEA,SAAK8B,IASH,gBAAAjW,EAAC,OAAA,EAAI,WAAU,0DACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,MAAA,gBAAAN,EAAC,MAAA,EAAG,WAAU,uCAAsC,UAAA,QAAI;AAAA,MACxD,gBAAAA,EAAC,KAAA,EAAE,WAAU,yBAAwB,UAAA,YAAA,CAAS;AAAA,IAAA,GAChD;AAAA,IAEA,gBAAAA,EAAC,SAAI,WAAU,8BACb,4BAACyV,IAAA,EAAK,WAAWM,GAAW,UAAUC,GACpC,UAAA;AAAA,MAAA,gBAAAhW,EAACwV,IAAA,EAAQ,KAAI,MACX,UAAA,gBAAAlV;AAAA,QAACyR;AAAA,QAAA;AAAA,UACC,MAAA+D;AAAA,UACA,QAAO;AAAA,UACP,gBAAgBW;AAAA,UAChB,eAAe,EAAE,MAAMF,EAAa,KAAA;AAAA,UAEpC,UAAA;AAAA,YAAA,gBAAAvW,EAAC+R,EAAK,MAAL,EAAU,OAAM,QAAO,MAAK,QAC3B,UAAA,gBAAA/R,EAAC0J,IAAA,EAAM,aAAY,SAAA,CAAS,EAAA,CAC9B;AAAA,YAEA,gBAAApJ,EAACjC,MAAS,OAAK,IAAC,kBAAkB,CAAC,YAAY,QAAQ,OAAO,GAC5D,UAAA;AAAA,cAAA,gBAAA2B,EAAC5B,IAAA,EAAM,QAAO,MACZ,UAAA,gBAAAkC,EAAC8Q,IAAA,EACC,UAAA;AAAA,gBAAA,gBAAApR,EAAC+R,EAAK,MAAL,EAAU,OAAM,KAAI,MAAM,CAAC,eAAe,GAAG,GAC5C,UAAA,gBAAA/R,EAACgS,IAAA,CAAA,CAAY,EAAA,CACf;AAAA,gBACA,gBAAAhS,EAAC+R,EAAK,MAAL,EAAU,OAAM,KAAI,MAAM,CAAC,eAAe,GAAG,GAC5C,UAAA,gBAAA/R,EAACgS,MAAY,EAAA,CACf;AAAA,cAAA,EAAA,CACF,KARqB,UASvB;AAAA,cAEA,gBAAAhS,EAAC5B,IAAA,EAAM,QAAO,MACZ,4BAACgT,IAAA,EACC,UAAA;AAAA,gBAAA,gBAAApR,EAAC+R,EAAK,MAAL,EAAU,OAAM,MAAK,MAAM,CAAC,eAAe,OAAO,GACjD,UAAA,gBAAA/R,EAACgS,IAAA,EAAY,KAAK,IAAI,GACxB;AAAA,gBACA,gBAAAhS,EAAC+R,EAAK,MAAL,EAAU,OAAM,MAAK,MAAM,CAAC,eAAe,QAAQ,GAClD,UAAA,gBAAA/R,EAACgS,IAAA,EAAY,KAAK,IAAI,EAAA,CACxB;AAAA,cAAA,EAAA,CACF,KARqB,MASvB;AAAA,cAEA,gBAAA1R,EAAClC,IAAA,EAAM,QAAO,MACZ,UAAA;AAAA,gBAAA,gBAAA4B,EAAC+R,EAAK,MAAL,EAAU,OAAM,OAAM,MAAM,CAAC,eAAe,YAAY,GACvD,UAAA,gBAAA/R,EAAC0J,IAAA,EAAM,aAAY,+BAA8B,GACnD;AAAA,gBAEA,gBAAA1J,EAAC+R,EAAK,MAAL,EAAU,OAAM,OAAM,MAAM,CAAC,eAAe,SAAS,GACpD,UAAA,gBAAA/R,EAACgS,IAAA,EAAY,KAAK,GAAG,GACvB;AAAA,gBAEA,gBAAAhS,EAAC+R,EAAK,MAAL,EAAU,OAAM,MAAK,MAAM,CAAC,eAAe,cAAc,GACxD,UAAA,gBAAA/R,EAACgS,IAAA,EAAY,KAAK,GAAG,GACvB;AAAA,gBAEA,gBAAAhS;AAAA,kBAAC+R,EAAK;AAAA,kBAAL;AAAA,oBACC,OAAM;AAAA,oBACN,MAAM,CAAC,eAAe,OAAO;AAAA,oBAC7B,MAAK;AAAA,oBAEL,4BAACC,IAAA,EAAY,KAAK,KAAK,KAAK,GAAG,MAAM,IAAA,CAAK;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAG5C,gBAAAhS;AAAA,kBAAC+R,EAAK;AAAA,kBAAL;AAAA,oBACC,OAAM;AAAA,oBACN,MAAM,CAAC,eAAe,QAAQ;AAAA,oBAC9B,MAAK;AAAA,oBAEL,4BAACC,IAAA,EAAY,KAAK,GAAG,KAAK,KAAK,MAAM,EAAA,CAAG;AAAA,kBAAA;AAAA,gBAAA;AAAA,kCAGzCD,EAAK,MAAL,EAAU,OAAM,OAAM,MAAM,CAAC,eAAe,SAAS,GACpD,UAAA,gBAAA/R,EAACgS,MAAY,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK,GAC1C;AAAA,gBAEA,gBAAAhS,EAAC+R,EAAK,MAAL,EAAU,OAAM,MAAK,MAAM,CAAC,eAAe,QAAQ,GAClD,UAAA,gBAAA/R,EAACgS,MAAY,EAAA,CACf;AAAA,cAAA,EAAA,GAnCqB,OAoCvB;AAAA,YAAA,EAAA,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,KAvEkB,OAyEtB;AAAA,MAEA,gBAAAhS,EAACwV,MAAQ,KAAI,MACV,YAAa,SAAS,WAAWe,EAAa,WAC7C,gBAAAvW;AAAA,QAACqU;AAAA,QAAA;AAAA,UACC,MAAMkC;AAAA,UACN,YAAAhM;AAAA,UACA,WAAA9L;AAAA,QAAA;AAAA,MAAA,IAGF,gBAAA6B,EAAC,OAAA,EAAI,WAAU,QACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,eAAc,UAAA;AAAA,YAAA;AAAA,8BAE3BC,IAAA,EAAI,OAAM,QAAO,WAAU,QACzB,YAAkB,OAAA,CACrB;AAAA,UAAA,GACF;AAAA,UACA,gBAAAP;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,wBAAOkV,IAAA,EAAa;AAAA,cACpB,SAASuB;AAAA,cACV,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED,GACF;AAAA,QAEA,gBAAA3W,EAAC,KAAA,EAAE,WAAU,8BAA6B,UAAA,2CAE1C;AAAA,QAECwW,EAAkB,SAAS,KAC1B,gBAAAxW,EAAC,OAAA,EAAI,WAAU,yDACb,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA,gBAAAM,EAAC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,yBAAwB,UAAA,SAAK;AAAA,UAC7C,gBAAAA,EAAC,QAAA,EAAK,WAAU,0CAAyC,UAAA,WAAA,CAEzD;AAAA,QAAA,EAAA,CACF,GACF,GACF;AAAA,QAGDwW,EAAkB,WAAW,IAC5B,gBAAAxW,EAAC,SAAI,WAAU,wDAAuD,UAAA,gBAAA,CAEtE,IAEA,gBAAAA,EAAC3B,IAAA,EAAS,OAAK,IAAC,kBAAkBmY,EAAkB,CAAC,GAAG,KAAKvM,GAC1D,UAAAuM,EAAkB,IAAI,CAACta,GAAQF,MAC9B,gBAAAgE;AAAA,UAAC5B;AAAA,UAAA;AAAA,YAEC,QACE,gBAAAkC,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,cAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,6BAA6B,UAAAhE,IAAQ,GAAE;AAAA,cACvD,gBAAAgE,EAAC,QAAA,EAAK,WAAU,eAAe,YAAO,MAAK;AAAA,cAC3C,gBAAAA,EAACO,MAAI,OAAM,WAAU,WAAU,WAC5B,UAAArE,EAAO,SAAS,KAAA,CACnB;AAAA,YAAA,GACF;AAAA,YAEF,OACE,gBAAAoE,EAAC8Q,IAAA,EAAM,MAAK,SAAQ,SAAS,CAAC5Y,MAAMA,EAAE,gBAAA,GACpC,UAAA;AAAA,cAAA,gBAAAwH;AAAA,gBAACE;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,wBAAOoV,IAAA,EAAgB;AAAA,kBACvB,UAAUtZ,MAAU;AAAA,kBACpB,SAAS,CAACxD,MAAM;AACd,oBAAAA,EAAE,gBAAA,GACFwe,EAAiB9a,EAAO,IAAI,IAAI;AAAA,kBAClC;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEF,gBAAA8D;AAAA,gBAACE;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,wBAAOqV,IAAA,EAAkB;AAAA,kBACzB,UAAUvZ,MAAUwa,EAAkB,SAAS;AAAA,kBAC/C,SAAS,CAAChe,MAAM;AACd,oBAAAA,EAAE,gBAAA,GACFwe,EAAiB9a,EAAO,IAAI,MAAM;AAAA,kBACpC;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEF,gBAAA8D;AAAA,gBAACE;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,wBAAOwQ,IAAA,EAAa;AAAA,kBACpB,SAAS,CAAClY,MAAM;AACd,oBAAAA,EAAE,gBAAA,GACFue,EAAiB7a,CAAM;AAAA,kBACzB;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEF,gBAAA8D;AAAA,gBAACE;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,QAAM;AAAA,kBACN,wBAAOE,IAAA,EAAe;AAAA,kBACtB,SAAS,CAAC5H,MAAM;AACd,oBAAAA,EAAE,gBAAA,GACFqe,GAAmB3a,EAAO,EAAE;AAAA,kBAC9B;AAAA,gBAAA;AAAA,cAAA;AAAA,YACF,GACF;AAAA,YAGF,UAAA,gBAAAoE,EAACyR,GAAA,EAAK,QAAO,YACX,UAAA;AAAA,cAAA,gBAAA/R,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAA/R;AAAA,gBAAC0J;AAAA,gBAAA;AAAA,kBACC,OAAOxN,EAAO;AAAA,kBACd,UAAU,CAAC1D,MACTse,GAAmB5a,EAAO,IAAI,EAAE,MAAM1D,EAAE,OAAO,OAAO;AAAA,kBAExD,aAAY;AAAA,gBAAA;AAAA,cAAA,GAEhB;AAAA,cAEA,gBAAAwH;AAAA,gBAAC+R,EAAK;AAAA,gBAAL;AAAA,kBACC,OAAM;AAAA,kBACN,MAAK;AAAA,kBAEL,UAAA,gBAAA/R;AAAA,oBAACyJ;AAAA,oBAAA;AAAA,sBACC,OAAO4M,EAAmBna,EAAO,EAAE,KAAKA,EAAO;AAAA,sBAC/C,UAAU,CAAC1D,MACT8d,EAAsB,CAAClI,OAAU;AAAA,wBAC/B,GAAGA;AAAA,wBACH,CAAClS,EAAO,EAAE,GAAG1D,EAAE,OAAO;AAAA,sBAAA,EACtB;AAAA,sBAEJ,QAAQ,CAACA,MAAM;AACb,wBAAAse,GAAmB5a,EAAO,IAAI,EAAE,YAAY1D,EAAE,OAAO,OAAO,GAC5D8d,EAAsB,CAAClI,MAAS;AAC9B,gCAAM+I,IAAW,EAAE,GAAG/I,EAAA;AACtB,wCAAO+I,EAASjb,EAAO,EAAE,GAClBib;AAAA,wBACT,CAAC;AAAA,sBACH;AAAA,sBACA,MAAM;AAAA,sBACN,aAAY;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACd;AAAA,cAAA;AAAA,cAGF,gBAAAnX,EAAC+R,EAAK,MAAL,EAAU,OAAM,qBACf,UAAA,gBAAA/R;AAAA,gBAACwS;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAOtW,EAAO,aAAa,CAAA;AAAA,kBAC3B,UAAU,CAAC1C,MACTsd,GAAmB5a,EAAO,IAAI,EAAE,WAAW1C,GAAO;AAAA,kBAEpD,aAAY;AAAA,kBACZ,iBAAiB,CAAC,KAAK,GAAG;AAAA,gBAAA;AAAA,cAAA,GAE9B;AAAA,cAEA,gBAAAwG,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAAzR,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,gBAAA,gBAAAN,EAACO,IAAA,EAAI,OAAM,QAAQ,UAAArE,EAAO,SAAS,MAAK;AAAA,kCACvCqE,IAAA,EAAI,OAAM,WAAW,UAAArE,EAAO,SAAS,MAAK;AAAA,gBAC3C,gBAAA8D;AAAA,kBAACE;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,wBAAOC,IAAA,EAAa;AAAA,oBACpB,SAAS,MAAM8W,EAA2B/a,EAAO,EAAE;AAAA,oBACpD,UAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAED,EAAA,CACF,EAAA,CACF;AAAA,gCAGCsX,IAAA,EAAQ,OAAO,EAAE,QAAQ,YAAY;AAAA,cACtC,gBAAAlT,EAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,gBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,kBAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,uBAAsB,UAAA,QAAI;AAAA,kBAC1C,gBAAAA,EAACO,IAAA,EAAK,UAAArE,EAAO,SAAS,KAAA,CAAK;AAAA,gBAAA,GAC7B;AAAA,gBACA,gBAAA8D;AAAA,kBAACoU;AAAA,kBAAA;AAAA,oBACC,UAAUlY,EAAO;AAAA,oBACjB,QAAQ,CAACP,MACPub,EAA2Bhb,EAAO,IAAIP,CAAO;AAAA,oBAE/C,WAAWO,EAAO,aAAa,CAAA;AAAA,oBAC/B,aAAa0N,KAAmB,CAAA;AAAA,kBAAC;AAAA,gBAAA;AAAA,cACnC,EAAA,CACF;AAAA,YAAA,EAAA,CACF;AAAA,UAAA;AAAA,UArIK1N,EAAO,KAAK+N;AAAA,QAAA,CAuIpB,EAAA,CACH;AAAA,MAAA,EAAA,CAEJ,KA7LkB,QA+LtB;AAAA,MAEA,gBAAAjK,EAACwV,IAAA,EAAQ,KAAI,MACX,UAAA,gBAAAlV;AAAA,QAACyR;AAAA,QAAA;AAAA,UACC,MAAA+D;AAAA,UACA,QAAO;AAAA,UACP,gBAAgBW;AAAA,UAEhB,UAAA;AAAA,YAAA,gBAAAzW;AAAA,cAAC+R,EAAK;AAAA,cAAL;AAAA,gBACC,OAAM;AAAA,gBACN,MAAM,CAAC,eAAe,aAAa;AAAA,gBACnC,eAAc;AAAA,gBAEd,4BAACG,IAAA,CAAA,CAAO;AAAA,cAAA;AAAA,YAAA;AAAA,YAGV,gBAAAlS;AAAA,cAAC+R,EAAK;AAAA,cAAL;AAAA,gBACC,OAAM;AAAA,gBACN,MAAM,CAAC,eAAe,aAAa;AAAA,gBACnC,eAAc;AAAA,gBAEd,4BAACG,IAAA,CAAA,CAAO;AAAA,cAAA;AAAA,YAAA;AAAA,YAGV,gBAAAlS;AAAA,cAAC+R,EAAK;AAAA,cAAL;AAAA,gBACC,OAAM;AAAA,gBACN,MAAM,CAAC,eAAe,aAAa;AAAA,gBACnC,eAAc;AAAA,gBAEd,4BAACG,IAAA,CAAA,CAAO;AAAA,cAAA;AAAA,YAAA;AAAA,YAGV,gBAAAlS;AAAA,cAAC+R,EAAK;AAAA,cAAL;AAAA,gBACC,OAAM;AAAA,gBACN,MAAM,CAAC,eAAe,cAAc;AAAA,gBACpC,eAAc;AAAA,gBAEd,4BAACG,IAAA,CAAA,CAAO;AAAA,cAAA;AAAA,YAAA;AAAA,UACV;AAAA,QAAA;AAAA,MAAA,KApCkB,SAsCtB;AAAA,IAAA,EAAA,CAEF,EAAA,CACF;AAAA,sBAEC,OAAA,EAAI,WAAU,2CACb,UAAA,gBAAA5R,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,UAAA;AAAA,QAAA;AAAA,QAAQiW,EAAa,GAAG,MAAM,GAAG,CAAC;AAAA,QAAE;AAAA,MAAA,GAAG;AAAA,wBAC3C,OAAA,EAAI,UAAA;AAAA,QAAA;AAAA,QAAMC,EAAkB;AAAA,MAAA,EAAA,CAAO;AAAA,IAAA,EAAA,CACtC,EAAA,CACF;AAAA,IAEA,gBAAAxW;AAAA,MAAC8R;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,MAAMmE;AAAA,QACN,UAAU,MAAM;AACd,UAAAC,EAAwB,EAAK,GAC7BE,EAAmB,IAAI;AAAA,QACzB;AAAA,QACA,QAAQ;AAAA,QACR,OAAO;AAAA,QAEP,UAAA,gBAAApW,EAAC,OAAA,EAAI,WAAU,iCACb,4BAAC3B,IAAA,EAAS,OAAK,IAAC,kBAAkB,CAAC,SAAS,UAAU,QAAQ,MAAM,GAClE,UAAA;AAAA,UAAA,gBAAA2B,EAAC5B,IAAA,EAAM,QAAO,QACZ,UAAA,gBAAA4B,EAAC,SAAI,WAAU,0BACZ,UAAAvB,EACE,OAAO,CAAC/B,MAAM,CAAC,MAAM,MAAM,MAAM,EAAE,SAASA,EAAE,IAAI,CAAC,EACnD,IAAI,CAACF,MACJ,gBAAAwD;AAAA,YAACoX;AAAA,YAAA;AAAA,cAEC,UAAA5a;AAAA,cACA,SAAS,MAAMoa,GAA8Bpa,CAAQ;AAAA,YAAA;AAAA,YAFhDA,EAAS;AAAA,UAAA,CAIjB,EAAA,CACL,EAAA,GAXuB,OAYzB;AAAA,UAEA,gBAAAwD,EAAC5B,MAAM,QAAO,QACZ,4BAAC,OAAA,EAAI,WAAU,0BACZ,UAAAK,EACE;AAAA,YACC,CAAC/B,MACC,CAAC,MAAM,KAAK,IAAI,EAAE,SAASA,EAAE,IAAI,KAChCA,EAAE,SAAS,WACV,CAAC,CAAC,MAAM,MAAM,MAAM,EAAE,SAASA,EAAE,IAAI;AAAA,UAAA,EAE1C,IAAI,CAACF,MACJ,gBAAAwD;AAAA,YAACoX;AAAA,YAAA;AAAA,cAEC,UAAA5a;AAAA,cACA,SAAS,MAAMoa,GAA8Bpa,CAAQ;AAAA,YAAA;AAAA,YAFhDA,EAAS;AAAA,UAAA,CAIjB,EAAA,CACL,EAAA,GAhBuB,QAiBzB;AAAA,4BAEC4B,IAAA,EAAM,QAAO,MACZ,UAAA,gBAAA4B,EAAC,OAAA,EAAI,WAAU,0BACZ,UAAAvB,EACE,OAAO,CAAC/B,MAAMA,EAAE,SAAS,MAAM,EAC/B,IAAI,CAACF,MACJ,gBAAA8D;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,WAAU;AAAA,cACV,SAAS,MAAMsW,GAA8Bpa,CAAQ;AAAA,cAErD,UAAA;AAAA,gBAAA,gBAAAwD,EAAC,OAAA,EAAI,WAAU,+EACb,UAAA,gBAAAA,EAAC,UAAK,WAAU,mCAAkC,eAAC,EAAA,CACrD;AAAA,gBACA,gBAAAA,EAAC,QAAA,EAAK,WAAU,WAAW,YAAS,KAAA,CAAK;AAAA,cAAA;AAAA,YAAA;AAAA,YAPpCxD,EAAS;AAAA,UAAA,CASjB,EAAA,CACL,EAAA,GAhBqB,MAiBvB;AAAA,4BAEC4B,IAAA,EAAM,QAAO,MACZ,UAAA,gBAAA4B,EAAC,OAAA,EAAI,WAAU,0BACZ,UAAAvB,EACE,OAAO,CAAC/B,MAAMA,EAAE,SAAS,MAAM,EAC/B,IAAI,CAACF,MACJ,gBAAA8D;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,WAAU;AAAA,cACV,SAAS,MAAMsW,GAA8Bpa,CAAQ;AAAA,cAErD,UAAA;AAAA,gBAAA,gBAAAwD,EAAC,SAAI,WAAU,+EACb,4BAAC,OAAA,EAAI,WAAU,yBAAwB,EAAA,CACzC;AAAA,gBACA,gBAAAA,EAAC,QAAA,EAAK,WAAU,WAAW,YAAS,KAAA,CAAK;AAAA,cAAA;AAAA,YAAA;AAAA,YAPpCxD,EAAS;AAAA,UAAA,CASjB,EAAA,CACL,EAAA,GAhBqB,MAiBvB;AAAA,QAAA,EAAA,CACF,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF,IAlaE,gBAAAwD,EAAC,SAAI,WAAU,6EACb,4BAACY,IAAA,EAAM,aAAY,WAAU,EAAA,CAC/B;AAkaN,GAQMwW,KAA4C,CAAC,EAAE,UAAA5a,GAAU,SAAAkH,QAAc;AAE3E,QAAMnE,IAAM/C,EAAS,SAAS,UAAWA,EAAkD,MAAM;AAEjG,SACE,gBAAA8D;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAAoD;AAAA,MAEA,UAAA;AAAA,QAAA,gBAAA1D,EAAC,OAAA,EAAI,WAAU,2DACZ,UAAAT,sBACE,OAAA,EAAI,KAAAA,GAAU,KAAK/C,EAAS,MAAM,WAAU,2BAAA,CAA2B,sBAEvE,QAAA,EAAK,WAAU,WAAW,UAAAA,EAAS,KAAK,CAAC,EAAA,CAAE,EAAA,CAEhD;AAAA,QACA,gBAAAwD,EAAC,QAAA,EAAK,WAAU,WAAW,YAAS,KAAA,CAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG/C;;GClpBM,EAAE,QAAAqX,IAAQ,OAAAC,IAAO,SAAAC,GAAA,IAAYC,IA+BtBC,KAA4C,CAAC;AAAA,EACxD,eAAAC;AAAA,EACA,UAAA1O;AAAA,EACA,UAAA2O,IAAW;AAAA,EACX,aAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,OAAAhc;AAAA,EACA,YAAAic,IAAa;AAAA,EACb,mBAAAC,IAAoB;AAAA,EACpB,mBAAAC,IAAoB;AAAA,EACpB,iBAAAC;AACF,MAAM;AACJ,QAAM,CAACC,GAAoBC,CAAqB,IAAI7P,GAAM,SAAS,EAAK,GAClE,CAAC8P,GAAWC,CAAY,IAAI/P,GAAM,SAAS,EAAE,GAC7C,CAACsB,GAAiB0O,CAAkB,IAAIhQ,GAAM,SAAS;AAAA,IAC3D;AAAA,MACE,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,YAAY;AAAA,IAAA;AAAA,IAEd;AAAA,MACE,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,YAAY;AAAA,IAAA;AAAA,EACd,CACD,GACK,EAAE,cAAAiQ,GAAc,cAAAC,GAAc,OAAAxO,GAAO,WAAAvL,GAAW,aAAAC,EAAA,IACpDtD,GAAA;AACkB,EAAAkN,GAAM,OAAY,IAAI;AAC1C,QAAMmQ,IAAiBnQ,GAAM,OAAO,EAAK;AA4BzC,EAAArC,GAAU,MAAM;AAEd,IAAIwS,EAAe,YACnBA,EAAe,UAAU,IAGrBha,EAAU,WAAW,KACvBtB,GAAc,QAAQ,CAACT,MAAMgC,EAAYhC,CAAC,CAAC,GAIzCub,KAAmBA,EAAgB,SAAS,KAC9CA,EAAgB,QAAQ,CAACvb,MAAMgC,EAAYhC,CAAC,CAAC,GAI3Cgb,KACFc,EAAad,CAAa;AAAA,EAE9B,GAAG,CAAA,CAAE,GAGLzR,GAAU,MAAM;AACd,QAAI+C,GAAU;AACZ,YAAM9L,IAASqb,EAAA;AACf,MAAAvP,EAAS9L,CAAM;AAAA,IACjB;AAAA,EACF,GAAG,CAAC8M,GAAOhB,CAAQ,CAAC;AAGpB,QAAM0P,KAAe/S,EAAY,MAAM;AACrC,UAAMzI,IAASqb,EAAA,GACTI,IAAU,KAAK,UAAUzb,GAAQ,MAAM,CAAC,GACxC0b,IACJ,yCAAyC,mBAAmBD,CAAO,GAE/DE,IAAwB,UAAU,KAAK,IAAA,CAAK,SAE5CC,IAAc,SAAS,cAAc,GAAG;AAC9C,IAAAA,EAAY,aAAa,QAAQF,CAAO,GACxCE,EAAY,aAAa,YAAYD,CAAqB,GAC1DC,EAAY,MAAA,GAEZ1G,GAAQ,QAAQ,OAAO;AAAA,EACzB,GAAG,CAACmG,CAAY,CAAC,GAGXQ,KAAepT,EAAY,MAAM;AACrC,QAAI;AACF,YAAMzI,IAAqB,KAAK,MAAMkb,CAAS;AAC/C,MAAAI,EAAatb,CAAM,GACnBib,EAAsB,EAAK,GAC3BE,EAAa,EAAE,GACfjG,GAAQ,QAAQ,OAAO;AAAA,IACzB,QAAgB;AACd,MAAAA,GAAQ,MAAM,iBAAiB;AAAA,IACjC;AAAA,EACF,GAAG,CAACgG,GAAWI,CAAY,CAAC,GAGtBQ,KAAmBrT;AAAA,IACvB,CAACtG,MAAe;AACd,YAAMC,IAAS,IAAI,WAAA;AACnB,aAAAA,EAAO,SAAS,CAAC9G,MAAM;AACrB,YAAI;AACF,gBAAMsD,IAAUtD,EAAE,QAAQ,QACpB0E,IAAqB,KAAK,MAAMpB,CAAO;AAC7C,UAAA0c,EAAatb,CAAM,GACnBkV,GAAQ,QAAQ,OAAO,GACvB+F,EAAsB,EAAK;AAAA,QAC7B,QAAgB;AACd,UAAA/F,GAAQ,MAAM,QAAQ;AAAA,QACxB;AAAA,MACF,GACA9S,EAAO,WAAWD,CAAI,GACf;AAAA,IACT;AAAA,IACA,CAACmZ,CAAY;AAAA,EAAA,GAITS,KAAYtT,EAAY,MACrB4S,EAAA,GACN,CAACA,CAAY,CAAC;AAGjB,SAAAjQ,GAAM;AAAA,IACHA,GAAc,SAAA;AAAA,IACf,OAAO;AAAA,MACL,WAAA2Q;AAAA,MACA,cAAAV;AAAA,MACA,cAAAC;AAAA,IAAA;AAAA,IAEF,CAACS,IAAWV,GAAcC,CAAY;AAAA,EAAA,GAMtC,gBAAAxY,EAACkZ,MAAe,QAAQC,IACtB,4BAAC,OAAA,EAAI,WAAWC,GAAO,cAAc,OAAAvd,GACnC,UAAA,gBAAAyE;AAAA,IAACkX;AAAA,IAAA;AAAA,MACC,WAAW,iCAAiCK,CAAS;AAAA,MAEpD,UAAA;AAAA,QAAAC,KACC,gBAAAxX,EAAC+W,IAAA,EAAO,WAAU,0FAChB,UAAA;AAAA,UAAA,gBAAA/W,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,YAAA,gBAAAN,EAAC,OAAA,EAAI,WAAU,mCAAkC,UAAA,SAAK;AAAA,YACtD,gBAAAM,EAAC,OAAA,EAAI,WAAU,yBAAyB,UAAA;AAAA,cAAA0J,EAAM;AAAA,cAAO;AAAA,YAAA,EAAA,CAAI;AAAA,UAAA,GAC3D;AAAA,4BAECoH,IAAA,EACE,UAAA;AAAA,YAAAwG;AAAA,YACA,CAACD,KACA,gBAAArX,EAAAO,IAAA,EACE,UAAA;AAAA,cAAA,gBAAAb,EAACsR,IAAA,EAAQ,OAAM,WACb,UAAA,gBAAAtR,EAACE,GAAA,EAAO,MAAM,gBAAAF,EAACqZ,IAAA,CAAA,CAAiB,GAAI,SAASX,IAAc,UAAA,KAAA,CAE3D,GACF;AAAA,cAEA,gBAAA1Y,EAACsR,IAAA,EAAQ,OAAM,WACb,UAAA,gBAAAtR;AAAA,gBAACE;AAAA,gBAAA;AAAA,kBACC,wBAAOO,IAAA,EAAe;AAAA,kBACtB,SAAS,MAAM0X,EAAsB,EAAI;AAAA,kBAAG,UAAA;AAAA,gBAAA;AAAA,cAAA,EAE9C,CACF;AAAA,YAAA,EAAA,CACF;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA,GACF;AAAA,0BAIDX,IAAA,EAEE,UAAA;AAAA,UAAAO,KAAqB,CAACJ,KACrB,gBAAA3X,EAACsX,IAAA,EAAM,OAAO,KAAK,WAAU,YAAW,OAAM,SAC5C,UAAA,gBAAAtX,EAACxB,IAAA,CAAA,CAAc,GACjB;AAAA,4BAID+Y,IAAA,EAAQ,WAAU,wBACjB,UAAA,gBAAAvX,EAAC2J,IAAA,EAAO,iBAAAC,GAAkC,GAC5C;AAAA,UAGCoO,KAAqB,CAACL,KACrB,gBAAA3X,EAACsX,MAAM,OAAO,KAAK,WAAU,YAAW,OAAM,SAC5C,UAAA,gBAAAtX,EAAC0V,IAAA,EAAc,iBAAA9L,GAAkC,EAAA,CACnD;AAAA,QAAA,GAEJ;AAAA,QAGA,gBAAA5J;AAAA,UAAC8R;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,MAAMoG;AAAA,YACN,MAAMa;AAAA,YACN,UAAU,MAAM;AACd,cAAAZ,EAAsB,EAAK,GAC3BE,EAAa,EAAE;AAAA,YACjB;AAAA,YACA,OAAO;AAAA,YACP,UAAA,gBAAA/X,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,cAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,gBAAA,gBAAAN,EAAC,KAAA,EAAE,WAAU,QAAO,UAAA,iBAAa;AAAA,gBACjC,gBAAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,QAAO;AAAA,oBACP,UAAU,CAACxH,MAAM;AACf,4BAAM6G,IAAO7G,EAAE,OAAO,QAAQ,CAAC;AAC/B,sBAAI6G,QAAuBA,CAAI;AAAA,oBACjC;AAAA,oBACA,WAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAMZ,GACF;AAAA,cAEA,gBAAAW,EAAC,OAAA,EAAI,WAAU,6BAA4B,UAAA,KAAC;AAAA,gCAE3C,OAAA,EACC,UAAA;AAAA,gBAAA,gBAAAA,EAAC,KAAA,EAAE,WAAU,QAAO,UAAA,eAAW;AAAA,gBAC/B,gBAAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAOoY;AAAA,oBACP,UAAU,CAAC5f,MAAM6f,EAAa7f,EAAE,OAAO,KAAK;AAAA,oBAC5C,aAAY;AAAA,oBACZ,WAAU;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACZ,EAAA,CACF;AAAA,YAAA,EAAA,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA,GAEJ,EAAA,CACF;AAEJ;","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9]}
1
+ {"version":3,"file":"config-editor.es.js","sources":["../node_modules/.pnpm/@babel+runtime@7.28.6/node_modules/@babel/runtime/helpers/interopRequireDefault.js","../node_modules/.pnpm/@rc-component+pagination@1.2.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@rc-component/pagination/lib/locale/zh_CN.js","../node_modules/.pnpm/@rc-component+picker@1.9.0_dayjs@1.11.19_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@rc-component/picker/lib/locale/common.js","../node_modules/.pnpm/@rc-component+picker@1.9.0_dayjs@1.11.19_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@rc-component/picker/lib/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/lib/time-picker/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/lib/date-picker/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/lib/calendar/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/lib/locale/zh_CN.js","../node_modules/.pnpm/antd@6.3.2_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/antd/locale/zh_CN.js","../node_modules/.pnpm/zustand@5.0.11_@types+react@19.2.14_immer@11.1.4_react@19.2.4/node_modules/zustand/esm/middleware/immer.mjs","../src/store/editorStore.ts","../src/utils/initData.ts","../src/components/MaterialPanel/index.tsx","../src/components/NodeRenderer/index.tsx","../src/components/ColorPicker/index.tsx","../src/components/Canvas/index.tsx","../src/components/PropertyPanel/editors/TextMaterialEditor.tsx","../src/components/PropertyPanel/editors/ImageMaterialEditor.tsx","../src/components/PropertyPanel/editors/LineMaterialEditor.tsx","../src/components/PropertyPanel/editors/MaterialPropertyEditor.tsx","../src/components/PropertyPanel/editors/GroupNodeStatusEditor.tsx","../src/components/PropertyPanel/index.tsx","../src/components/ConfigEditor/index.tsx"],"sourcesContent":["function _interopRequireDefault(e) {\n return e && e.__esModule ? e : {\n \"default\": e\n };\n}\nmodule.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nconst locale = {\n // Options\n items_per_page: '条/页',\n jump_to: '跳至',\n jump_to_confirm: '确定',\n page: '页',\n // Pagination\n prev_page: '上一页',\n next_page: '下一页',\n prev_5: '向前 5 页',\n next_5: '向后 5 页',\n prev_3: '向前 3 页',\n next_3: '向后 3 页',\n page_size: '页码'\n};\nvar _default = exports.default = locale;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.commonLocale = void 0;\nvar commonLocale = exports.commonLocale = {\n yearFormat: 'YYYY',\n dayFormat: 'D',\n cellMeridiemFormat: 'A',\n monthBeforeYear: true\n};","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _common = require(\"./common\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nvar locale = _objectSpread(_objectSpread({}, _common.commonLocale), {}, {\n locale: 'zh_CN',\n today: '今天',\n now: '此刻',\n backToToday: '返回今天',\n ok: '确定',\n timeSelect: '选择时间',\n dateSelect: '选择日期',\n weekSelect: '选择周',\n clear: '清除',\n week: '周',\n month: '月',\n year: '年',\n previousMonth: '上个月 (翻页上键)',\n nextMonth: '下个月 (翻页下键)',\n monthSelect: '选择月份',\n yearSelect: '选择年份',\n decadeSelect: '选择年代',\n previousYear: '上一年 (Control键加左方向键)',\n nextYear: '下一年 (Control键加右方向键)',\n previousDecade: '上一年代',\n nextDecade: '下一年代',\n previousCentury: '上一世纪',\n nextCentury: '下一世纪',\n yearFormat: 'YYYY年',\n cellDateFormat: 'D',\n monthBeforeYear: false\n});\nvar _default = exports.default = locale;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nconst locale = {\n placeholder: '请选择时间',\n rangePlaceholder: ['开始时间', '结束时间']\n};\nvar _default = exports.default = locale;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\").default;\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _zh_CN = _interopRequireDefault(require(\"@rc-component/picker/locale/zh_CN\"));\nvar _zh_CN2 = _interopRequireDefault(require(\"../../time-picker/locale/zh_CN\"));\n// 统一合并为完整的 Locale\nconst locale = {\n lang: {\n placeholder: '请选择日期',\n yearPlaceholder: '请选择年份',\n quarterPlaceholder: '请选择季度',\n monthPlaceholder: '请选择月份',\n weekPlaceholder: '请选择周',\n rangePlaceholder: ['开始日期', '结束日期'],\n rangeYearPlaceholder: ['开始年份', '结束年份'],\n rangeMonthPlaceholder: ['开始月份', '结束月份'],\n rangeQuarterPlaceholder: ['开始季度', '结束季度'],\n rangeWeekPlaceholder: ['开始周', '结束周'],\n ..._zh_CN.default\n },\n timePickerLocale: {\n ..._zh_CN2.default\n }\n};\n// should add whitespace between char in Button\nlocale.lang.ok = '确定';\n// All settings at:\n// https://github.com/ant-design/ant-design/blob/master/components/date-picker/locale/example.json\nvar _default = exports.default = locale;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\").default;\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _zh_CN = _interopRequireDefault(require(\"../../date-picker/locale/zh_CN\"));\nvar _default = exports.default = _zh_CN.default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\").default;\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\nvar _zh_CN = _interopRequireDefault(require(\"@rc-component/pagination/lib/locale/zh_CN\"));\nvar _zh_CN2 = _interopRequireDefault(require(\"../calendar/locale/zh_CN\"));\nvar _zh_CN3 = _interopRequireDefault(require(\"../date-picker/locale/zh_CN\"));\nvar _zh_CN4 = _interopRequireDefault(require(\"../time-picker/locale/zh_CN\"));\nconst typeTemplate = '${label}不是一个有效的${type}';\nconst localeValues = {\n locale: 'zh-cn',\n Pagination: _zh_CN.default,\n DatePicker: _zh_CN3.default,\n TimePicker: _zh_CN4.default,\n Calendar: _zh_CN2.default,\n // locales for all components\n global: {\n placeholder: '请选择',\n close: '关闭',\n sortable: '可排序'\n },\n Table: {\n filterTitle: '筛选',\n filterConfirm: '确定',\n filterReset: '重置',\n filterEmptyText: '无筛选项',\n filterCheckAll: '全选',\n filterSearchPlaceholder: '在筛选项中搜索',\n emptyText: '暂无数据',\n selectAll: '全选当页',\n selectInvert: '反选当页',\n selectNone: '清空所有',\n selectionAll: '全选所有',\n sortTitle: '排序',\n expand: '展开行',\n collapse: '关闭行',\n triggerDesc: '点击降序',\n triggerAsc: '点击升序',\n cancelSort: '取消排序'\n },\n Modal: {\n okText: '确定',\n cancelText: '取消',\n justOkText: '知道了'\n },\n Tour: {\n Next: '下一步',\n Previous: '上一步',\n Finish: '结束导览'\n },\n Popconfirm: {\n cancelText: '取消',\n okText: '确定'\n },\n Transfer: {\n titles: ['', ''],\n searchPlaceholder: '请输入搜索内容',\n itemUnit: '项',\n itemsUnit: '项',\n remove: '删除',\n selectCurrent: '全选当页',\n removeCurrent: '删除当页',\n selectAll: '全选所有',\n deselectAll: '取消全选',\n removeAll: '删除全部',\n selectInvert: '反选当页'\n },\n Upload: {\n uploading: '文件上传中',\n removeFile: '删除文件',\n uploadError: '上传错误',\n previewFile: '预览文件',\n downloadFile: '下载文件'\n },\n Empty: {\n description: '暂无数据'\n },\n Icon: {\n icon: '图标'\n },\n Text: {\n edit: '编辑',\n copy: '复制',\n copied: '复制成功',\n expand: '展开',\n collapse: '收起'\n },\n Form: {\n optional: '(可选)',\n defaultValidateMessages: {\n default: '字段验证错误${label}',\n required: '请输入${label}',\n enum: '${label}必须是其中一个[${enum}]',\n whitespace: '${label}不能为空字符',\n date: {\n format: '${label}日期格式无效',\n parse: '${label}不能转换为日期',\n invalid: '${label}是一个无效日期'\n },\n types: {\n string: typeTemplate,\n method: typeTemplate,\n array: typeTemplate,\n object: typeTemplate,\n number: typeTemplate,\n date: typeTemplate,\n boolean: typeTemplate,\n integer: typeTemplate,\n float: typeTemplate,\n regexp: typeTemplate,\n email: typeTemplate,\n url: typeTemplate,\n hex: typeTemplate\n },\n string: {\n len: '${label}须为${len}个字符',\n min: '${label}最少${min}个字符',\n max: '${label}最多${max}个字符',\n range: '${label}须在${min}-${max}字符之间'\n },\n number: {\n len: '${label}必须等于${len}',\n min: '${label}最小值为${min}',\n max: '${label}最大值为${max}',\n range: '${label}须在${min}-${max}之间'\n },\n array: {\n len: '须为${len}个${label}',\n min: '最少${min}个${label}',\n max: '最多${max}个${label}',\n range: '${label}数量须在${min}-${max}之间'\n },\n pattern: {\n mismatch: '${label}与模式不匹配${pattern}'\n }\n }\n },\n QRCode: {\n expired: '二维码过期',\n refresh: '点击刷新',\n scanned: '已扫描'\n },\n ColorPicker: {\n presetEmpty: '暂无',\n transparent: '无色',\n singleColor: '单色',\n gradientColor: '渐变色'\n }\n};\nvar _default = exports.default = localeValues;","module.exports = require('../lib/locale/zh_CN');","import { produce } from 'immer';\n\nconst immerImpl = (initializer) => (set, get, store) => {\n store.setState = (updater, replace, ...args) => {\n const nextState = typeof updater === \"function\" ? produce(updater) : updater;\n return set(nextState, replace, ...args);\n };\n return initializer(store.setState, get, store);\n};\nconst immer = immerImpl;\n\nexport { immer };\n","import { create } from 'zustand';\nimport { immer } from 'zustand/middleware/immer';\nimport { nanoid } from 'nanoid';\n// @ts-ignore - 导入 csstype 用于类型推断\nimport type {} from 'csstype';\nimport type { \n EditorState, \n Node, \n Material,\n NodeStatus,\n EditorEvent, \n EventType,\n SchemeJSON,\n NodeStyle,\n ContentInfo,\n ControlInfo,\n CanvasConfig\n} from '../types';\n\n// 初始状态\nconst initialState: EditorState = {\n nodes: [],\n materials: [],\n selectedNodeId: null,\n selectedStatusId: null,\n canvas: {\n width: 1920,\n height: 1080,\n background: '#ffffff',\n showGrid: true,\n },\n viewport: {\n scale: 1,\n positionX: 0,\n positionY: 0,\n },\n history: {\n past: [],\n future: [],\n },\n mode: 'select',\n lineDrawing: {\n isDrawing: false,\n material: null,\n startPoint: null,\n endPoint: null,\n },\n};\n\n// 创建事件\nconst createEvent = (type: EventType, targetId?: string, payload?: any): EditorEvent => ({\n id: nanoid(),\n type,\n targetId,\n payload,\n timestamp: Date.now(),\n});\n\n// Store 接口\ninterface EditorStore extends EditorState {\n // 节点操作\n addNode: (node: Omit<Node, 'id'> & { id?: string }, autoSelect?: boolean) => void;\n updateNode: (id: string, updates: Partial<Node>) => void;\n updateNodeStyle: (id: string, style: Partial<NodeStyle>) => void;\n updateNodeContent: (id: string, content: Partial<ContentInfo>) => void;\n updateNodeControl: (id: string, control: Partial<ControlInfo>) => void;\n removeNode: (id: string) => void;\n selectNode: (id: string | null) => void;\n \n // 状态操作(新架构)\n addStatus: (nodeId: string, status: Omit<NodeStatus, 'id'>) => void;\n removeStatus: (nodeId: string, statusId: string) => void;\n updateStatus: (nodeId: string, statusId: string, updates: Partial<NodeStatus>) => void;\n selectStatus: (statusId: string | null) => void;\n evaluateCurrentStatus: (nodeId: string, data: any) => string | undefined;\n \n // 物料库操作\n addMaterial: (material: Omit<Material, 'id'>) => void;\n updateMaterial: (id: string, updates: Partial<Material>) => void;\n removeMaterial: (id: string) => void;\n \n // 视口操作\n setViewport: (viewport: Partial<EditorState['viewport']>) => void;\n \n // 画布配置操作\n setCanvasConfig: (config: Partial<CanvasConfig>) => void;\n \n // 模式切换\n setMode: (mode: EditorState['mode']) => void;\n \n // 线条绘制操作\n startLineDrawing: (material: Material) => void;\n updateLineDrawing: (endPoint: { x: number; y: number }) => void;\n endLineDrawing: () => void;\n cancelLineDrawing: () => void;\n \n // 历史操作\n undo: () => void;\n redo: () => void;\n \n // 导入导出\n exportScheme: () => SchemeJSON;\n importScheme: (scheme: SchemeJSON) => void;\n \n // 事件记录\n recordEvent: (event: EditorEvent) => void;\n}\n\nexport const useEditorStore = create<EditorStore>()(\n immer((set, get) => ({\n ...initialState,\n // ========== 节点操作 ==========\n addNode: (node, autoSelect = true) => {\n set((state) => {\n // 如果传入的节点已有 id,则保留;否则生成新 id\n const newNode = {\n ...node,\n id: node.id || nanoid(),\n } as Node;\n state.nodes.push(newNode);\n if (autoSelect) {\n state.selectedNodeId = newNode.id;\n state.history.past.push(createEvent('NODE_SELECT', newNode.id));\n }\n });\n },\n\n updateNode: (id, updates) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === id);\n if (node) {\n Object.assign(node, updates);\n state.history.past.push(createEvent('PROPERTY_CHANGE', id, updates));\n }\n });\n },\n\n updateNodeStyle: (id, style) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === id);\n if (node) {\n Object.assign(node.normalStyle, style);\n state.history.past.push(createEvent('PROPERTY_CHANGE', id, { normalStyle: style }));\n }\n });\n },\n\n updateNodeContent: (id, content) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === id);\n if (node) {\n // 创建新的 contentInfo 对象以确保引用变化\n node.contentInfo = { ...node.contentInfo, ...content };\n state.history.past.push(createEvent('PROPERTY_CHANGE', id, { contentInfo: content }));\n }\n });\n },\n\n updateNodeControl: (id, control) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === id);\n if (node) {\n Object.assign(node.controlInfo, control);\n state.history.past.push(createEvent('PROPERTY_CHANGE', id, { controlInfo: control }));\n }\n });\n },\n\n removeNode: (id) => {\n set((state) => {\n const index = state.nodes.findIndex((n) => n.id === id);\n if (index !== -1) {\n state.nodes.splice(index, 1);\n if (state.selectedNodeId === id) {\n state.selectedNodeId = null;\n state.selectedStatusId = null;\n }\n state.history.past.push(createEvent('NODE_DELETE', id));\n }\n });\n },\n\n selectNode: (id) => {\n set((state) => {\n state.selectedNodeId = id;\n state.selectedStatusId = null;\n if (id) {\n state.history.past.push(createEvent('NODE_SELECT', id));\n }\n });\n },\n\n // ========== 状态操作 ==========\n addStatus: (nodeId, status) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === nodeId);\n if (!node) return;\n\n const newStatus: NodeStatus = {\n ...status,\n id: nanoid(),\n };\n\n node.contentInfo.statusList.push(newStatus);\n state.history.past.push(createEvent('MATERIAL_STATUS_CHANGE', nodeId, { statusId: newStatus.id }));\n });\n },\n\n removeStatus: (nodeId, statusId) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === nodeId);\n if (!node) return;\n\n const index = node.contentInfo.statusList.findIndex((s) => s.id === statusId);\n if (index !== -1) {\n node.contentInfo.statusList.splice(index, 1);\n if (node.contentInfo.currentStatusId === statusId) {\n node.contentInfo.currentStatusId = undefined;\n }\n if (state.selectedStatusId === statusId) {\n state.selectedStatusId = null;\n }\n }\n });\n },\n\n updateStatus: (nodeId, statusId, updates) => {\n set((state) => {\n const node = state.nodes.find((n) => n.id === nodeId);\n if (!node) return;\n\n const status = node.contentInfo.statusList.find((s) => s.id === statusId);\n if (status) {\n Object.assign(status, updates);\n }\n });\n },\n\n selectStatus: (statusId) => {\n set((state) => {\n state.selectedStatusId = statusId;\n });\n },\n\n evaluateCurrentStatus: (nodeId, data) => {\n const state = get();\n const node = state.nodes.find((n) => n.id === nodeId);\n if (!node) return undefined;\n\n for (const status of node.contentInfo.statusList) {\n try {\n const fn = new Function('data', 'bindCodes', 'status', status.expression);\n const result = fn(data, status.bindCodes, status);\n if (result === true) {\n return status.id;\n }\n } catch (error) {\n console.warn('状态表达式执行失败:', status.name, error);\n }\n }\n\n return undefined;\n },\n\n // ========== 物料库操作 ==========\n addMaterial: (material) => {\n set((state) => {\n const newMaterial = {\n ...material,\n id: nanoid(),\n };\n state.materials.push(newMaterial as Material);\n state.history.past.push(createEvent('MATERIAL_ADD', newMaterial.id));\n });\n },\n\n updateMaterial: (id, updates) => {\n set((state) => {\n const material = state.materials.find((m) => m.id === id);\n if (material) {\n Object.assign(material, updates);\n }\n });\n },\n\n removeMaterial: (id) => {\n set((state) => {\n const index = state.materials.findIndex((m) => m.id === id);\n if (index !== -1) {\n state.materials.splice(index, 1);\n }\n });\n },\n\n // ========== 视口操作 ==========\n setViewport: (viewport) => {\n set((state) => {\n Object.assign(state.viewport, viewport);\n });\n },\n\n // ========== 画布配置操作 ==========\n setCanvasConfig: (config) => {\n set((state) => {\n state.canvas = { ...state.canvas, ...config };\n });\n },\n\n // ========== 模式切换 ==========\n setMode: (mode) => {\n set((state) => {\n state.mode = mode;\n });\n },\n\n // ========== 线条绘制操作 ==========\n startLineDrawing: (material) => {\n set((state) => {\n state.mode = 'line-draw';\n state.lineDrawing = {\n isDrawing: true,\n material,\n startPoint: null,\n endPoint: null,\n };\n });\n },\n\n updateLineDrawing: (endPoint) => {\n set((state) => {\n if (state.lineDrawing.isDrawing) {\n state.lineDrawing.endPoint = endPoint;\n }\n });\n },\n\n endLineDrawing: () => {\n set((state) => {\n state.mode = 'select';\n state.lineDrawing = {\n isDrawing: false,\n material: null,\n startPoint: null,\n endPoint: null,\n };\n });\n },\n\n cancelLineDrawing: () => {\n set((state) => {\n state.mode = 'select';\n state.lineDrawing = {\n isDrawing: false,\n material: null,\n startPoint: null,\n endPoint: null,\n };\n });\n },\n\n // ========== 历史操作 ==========\n undo: () => {\n set((state) => {\n const lastEvent = state.history.past.pop();\n if (lastEvent) {\n state.history.future.push(lastEvent);\n }\n });\n },\n\n redo: () => {\n set((state) => {\n const nextEvent = state.history.future.pop();\n if (nextEvent) {\n state.history.past.push(nextEvent);\n }\n });\n },\n\n recordEvent: (event) => {\n set((state) => {\n state.history.past.push(event);\n state.history.future = [];\n });\n },\n\n // ========== 导入导出 ==========\n exportScheme: () => {\n const state = get();\n return {\n version: '1.1.0',\n nodes: state.nodes,\n materials: state.materials,\n viewport: state.viewport,\n metadata: {\n name: '未命名组态',\n description: '',\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n },\n };\n },\n\n importScheme: (scheme) => {\n set((state) => {\n state.nodes = scheme.nodes || [];\n state.materials = scheme.materials || [];\n state.viewport = scheme.viewport || initialState.viewport;\n state.selectedNodeId = null;\n state.selectedStatusId = null;\n state.history = { past: [], future: [] };\n });\n },\n }))\n);\n","import type { Material, Node, NodeStatus } from '../types';\nimport { nanoid } from 'nanoid';\n\n// 初始化物料库数据\nexport const initMaterials: Material[] = [\n // 基础形状\n {\n id: nanoid(),\n name: '矩形',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"60\"><rect width=\"100\" height=\"60\" fill=\"#1890ff\" rx=\"4\"/></svg>`)}`,\n },\n {\n id: nanoid(),\n name: '圆形',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\"><circle cx=\"40\" cy=\"40\" r=\"38\" fill=\"#52c41a\"/></svg>`)}`,\n },\n {\n id: nanoid(),\n name: '圆角矩形',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"60\"><rect width=\"100\" height=\"60\" fill=\"#faad14\" rx=\"20\"/></svg>`)}`,\n },\n \n // 设备图标\n {\n id: nanoid(),\n name: '阀门',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"60\" height=\"60\"><path d=\"M10 20 L30 10 L50 20 L50 40 L30 50 L10 40 Z\" fill=\"#bfbfbf\" stroke=\"#595959\" stroke-width=\"2\"/><circle cx=\"30\" cy=\"30\" r=\"8\" fill=\"#1890ff\"/></svg>`)}`,\n },\n {\n id: nanoid(),\n name: '泵',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"60\" height=\"60\"><circle cx=\"30\" cy=\"35\" r=\"20\" fill=\"#bfbfbf\" stroke=\"#595959\" stroke-width=\"2\"/><rect x=\"25\" y=\"5\" width=\"10\" height=\"15\" fill=\"#595959\"/><path d=\"M30 20 L30 35 M20 30 Q30 45 40 30\" stroke=\"#595959\" stroke-width=\"2\" fill=\"none\"/></svg>`)}`,\n },\n {\n id: nanoid(),\n name: '罐体',\n type: 'IMAGE',\n src: `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"60\" height=\"80\"><ellipse cx=\"30\" cy=\"10\" rx=\"25\" ry=\"10\" fill=\"#d9d9d9\" stroke=\"#595959\" stroke-width=\"2\"/><rect x=\"5\" y=\"10\" width=\"50\" height=\"60\" fill=\"#f0f0f0\" stroke=\"#595959\" stroke-width=\"2\"/><ellipse cx=\"30\" cy=\"70\" rx=\"25\" ry=\"10\" fill=\"#d9d9d9\" stroke=\"#595959\" stroke-width=\"2\"/></svg>`)}`,\n },\n \n // 文本\n {\n id: nanoid(),\n name: '文本标签',\n type: 'TEXT',\n content: {\n label: '标签',\n value: '值',\n labelStyle: {\n fontSize: 14,\n fontWeight: 'bold',\n color: '#262626',\n textAlign: 'left',\n },\n valueStyle: {\n fontSize: 14,\n fontWeight: 'normal',\n color: '#1890ff',\n textAlign: 'left',\n },\n },\n },\n \n // 线条 - 通用线条物料,通过属性配置实现不同线型\n {\n id: nanoid(),\n name: '线条',\n type: 'LINE',\n config: {\n thickness: 2,\n lineWeight: 2,\n color: '#262626',\n lineType: 'solid',\n },\n },\n];\n\n// 创建默认状态\nexport const createDefaultStatus = (material: Material): NodeStatus => ({\n id: nanoid(),\n name: '默认状态',\n expression: 'return true;',\n material: { ...material, id: nanoid() },\n bindCodes: [],\n});\n\n// 创建默认节点\nexport const createDefaultNode = (\n x: number,\n y: number,\n material?: Material\n): Node => {\n // 如果是群组物料,创建群组节点\n if (material?.type === 'CUSTOM' && material.config?.nodes) {\n const children = material.config.nodes.map((childNode: Node) => ({\n ...childNode,\n id: nanoid(), // 重新生成子节点ID\n }));\n \n // 计算群组边界\n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n \n children.forEach((child: Node) => {\n const cx = child.normalStyle.x || 0;\n const cy = child.normalStyle.y || 0;\n const cw = child.normalStyle.width || 0;\n const ch = child.normalStyle.height || 0;\n minX = Math.min(minX, cx);\n minY = Math.min(minY, cy);\n maxX = Math.max(maxX, cx + cw);\n maxY = Math.max(maxY, cy + ch);\n });\n \n // 调整子节点位置为相对坐标,并移除 scale 避免双重缩放\n const relativeChildren = children.map((child: Node) => ({\n ...child,\n normalStyle: {\n ...child.normalStyle,\n x: (child.normalStyle.x || 0) - minX,\n y: (child.normalStyle.y || 0) - minY,\n scale: undefined, // 移除 scale,由父级容器统一控制\n },\n }));\n \n return {\n id: nanoid(),\n name: material.name || '群组节点',\n type: 'group',\n normalStyle: {\n width: maxX - minX,\n height: maxY - minY,\n x,\n y,\n // 不设置背景和边框,由 NodeRenderer 控制\n },\n contentInfo: {\n statusList: [],\n currentStatusId: undefined,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n },\n children: relativeChildren,\n } as Node;\n }\n\n // 普通节点\n return {\n id: nanoid(),\n name: '新节点',\n type: 'normal',\n normalStyle: {\n width: 120,\n height: 100,\n x,\n y,\n background: 'transparent',\n padding: 8,\n },\n contentInfo: {\n statusList: material ? [createDefaultStatus(material)] : [],\n currentStatusId: undefined,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n },\n };\n};\n","import React, { useEffect, useState } from \"react\";\nimport { Collapse, Upload, Button, List, Empty, Typography, Image, Tag } from \"antd\";\nimport { UploadOutlined, DeleteOutlined, EditOutlined } from \"@ant-design/icons\";\nimport { useEditorStore } from \"../../store/editorStore\";\nimport { initMaterials } from \"../../utils/initData\";\nimport type { Material } from \"../../types\";\n\nconst { Panel } = Collapse;\nconst { Text } = Typography;\n\nexport const MaterialPanel: React.FC = () => {\n const {\n materials,\n addMaterial,\n removeMaterial,\n selectedStatusId,\n selectStatus,\n mode,\n lineDrawing,\n startLineDrawing,\n cancelLineDrawing,\n } = useEditorStore();\n const [activeKeys, setActiveKeys] = useState<string[]>([\n \"basic\",\n \"device\",\n \"text\",\n \"line\",\n ]);\n\n // 初始化默认物料\n // useEffect(() => {\n // if (materials.length === 0) {\n // initMaterials.forEach((m) => addMaterial(m));\n // }\n // }, []);\n\n // 处理 SVG 上传\n const handleUpload = (file: File) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n const src = e.target?.result as string;\n addMaterial({\n name: file.name.replace(\".svg\", \"\"),\n type: \"IMAGE\",\n src,\n } as Material);\n };\n reader.readAsDataURL(file);\n return false;\n };\n\n // 按类型分组物料\n const groupedMaterials = {\n basic: materials.filter((m) =>\n [\"矩形\", \"圆形\", \"圆角矩形\"].includes(m.name),\n ),\n device: materials.filter(\n (m) =>\n [\"阀门\", \"泵\", \"罐体\"].includes(m.name) ||\n (m.type === \"IMAGE\" &&\n ![\"矩形\", \"圆形\", \"圆角矩形\"].includes(m.name) &&\n m.name !== \"自定义\"),\n ),\n text: materials.filter((m) => m.type === \"TEXT\"),\n line: materials.filter((m) => m.type === \"LINE\"),\n group: materials.filter((m) => m.type === \"CUSTOM\" && m.config?.nodes),\n custom: materials.filter(\n (m) =>\n (m.type === \"CUSTOM\" && !m.config?.nodes) ||\n (m.type === \"IMAGE\" &&\n ![\"矩形\", \"圆形\", \"圆角矩形\", \"阀门\", \"泵\", \"罐体\"].includes(m.name)),\n ),\n };\n\n // 处理拖拽开始\n const handleDragStart = (e: React.DragEvent, material: Material) => {\n e.dataTransfer.effectAllowed = \"copy\";\n e.dataTransfer.setData(\"application/json\", JSON.stringify(material));\n const dragImage = e.currentTarget.querySelector(\n \".material-preview\",\n ) as HTMLElement;\n if (dragImage) {\n e.dataTransfer.setDragImage(dragImage, 20, 20);\n }\n };\n\n // 处理线条物料点击(进入绘制模式)\n const handleLineMaterialClick = (material: Material) => {\n if (material.type === \"LINE\") {\n startLineDrawing(material);\n }\n };\n\n // 渲染物料项\n const renderMaterialItem = (material: Material, isLineMode: boolean = false) => {\n // 物料库中的物料不再被\"选中\",而是用于拖拽创建节点或在属性面板中选择绑定到状态\n const isSelected = false;\n // 确保 isLineMode 是布尔值\n const isLineMaterial = isLineMode === true;\n // 只有当前物料是正在绘制的那条线时才显示\"绘制中\"\n const isDrawingLine = mode === \"line-draw\" && isLineMaterial && lineDrawing.material?.id === material.id;\n\n return (\n <List.Item\n key={material.id}\n draggable={!isLineMaterial}\n onDragStart={(e) => handleDragStart(e, material)}\n onClick={() => isLineMaterial && handleLineMaterialClick(material)}\n className={`\n rounded-lg transition-all duration-200 select-none\n ${isLineMaterial ? \"cursor-pointer\" : \"cursor-move\"}\n ${isSelected ? \"bg-blue-100 ring-2 ring-blue-400\" : \"hover:bg-gray-100\"}\n ${isDrawingLine ? \"bg-blue-50 ring-2 ring-blue-400\" : \"\"}\n `}\n actions={[\n isLineMaterial ? (\n <Button\n key=\"draw\"\n type=\"text\"\n size=\"small\"\n icon={<EditOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n handleLineMaterialClick(material);\n }}\n >\n 绘制\n </Button>\n ) : null,\n <Button\n key=\"delete\"\n type=\"text\"\n size=\"small\"\n danger\n icon={<DeleteOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n removeMaterial(material.id);\n }}\n />,\n ].filter(Boolean)}>\n <div className={`flex items-center gap-3 w-full py-2 ${isLineMaterial ? \"\" : \"pointer-events-none\"}`}>\n <div className=\"material-preview w-12 h-12 flex items-center justify-center bg-white rounded border border-gray-200\">\n {material.type === \"IMAGE\" && (material as any).src ? (\n <Image\n src={(material as any).src}\n alt={material.name}\n width={40}\n height={40}\n preview={false}\n />\n ) : material.type === \"TEXT\" ? (\n <span className=\"text-xs text-gray-500\">T</span>\n ) : material.type === \"LINE\" ? (\n <div className=\"w-8 h-0.5 bg-gray-400\" />\n ) : material.type === \"CUSTOM\" && material.config?.nodes ? (\n <span className=\"text-xs text-blue-500 font-bold\">G</span>\n ) : (\n <span className=\"text-xs text-gray-500\">?</span>\n )}\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <Text strong className=\"block truncate\">\n {material.name}\n </Text>\n <div className=\"flex items-center gap-1\">\n <Text type=\"secondary\" className=\"text-xs\">\n {material.type}\n </Text>\n {isDrawingLine && (\n <Tag color=\"blue\" className=\"text-xs\">\n 绘制中\n </Tag>\n )}\n </div>\n </div>\n </div>\n </List.Item>\n );\n };\n\n return (\n <div className=\"h-full flex flex-col bg-white border-r border-gray-200\">\n <div className=\"p-4 border-b border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-800\">物料库</h3>\n <Text type=\"secondary\" className=\"text-sm\">\n 拖拽物料到画布创建节点\n </Text>\n </div>\n\n <div className=\"p-3 border-b border-gray-200\">\n <Upload\n accept=\".svg\"\n beforeUpload={handleUpload}\n showUploadList={false}>\n <Button icon={<UploadOutlined />} block type=\"dashed\">\n 上传 SVG\n </Button>\n </Upload>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-2\">\n <Collapse\n activeKey={activeKeys}\n onChange={(keys) => setActiveKeys(keys as string[])}\n ghost\n expandIconPosition=\"end\">\n <Panel header=\"基础形状\" key=\"basic\">\n <List\n dataSource={groupedMaterials.basic}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n\n <Panel header=\"设备图标\" key=\"device\">\n <List\n dataSource={groupedMaterials.device}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n\n <Panel header=\"文本\" key=\"text\">\n <List\n dataSource={groupedMaterials.text}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n\n <Panel \n header={\n <div className=\"flex items-center justify-between\">\n <span>线条</span>\n {mode === \"line-draw\" && (\n <Tag color=\"blue\" className=\"text-xs\">\n 绘制模式\n </Tag>\n )}\n </div>\n } \n key=\"line\">\n <List\n dataSource={groupedMaterials.line}\n renderItem={(item) => renderMaterialItem(item, true)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n {mode === \"line-draw\" && (\n <div className=\"mt-2 p-2 bg-blue-50 rounded text-xs text-blue-600\">\n <div>点击线条物料开始绘制</div>\n <div>点击画布确定起点和终点</div>\n </div>\n )}\n </Panel>\n\n {groupedMaterials.group.length > 0 && (\n <Panel header=\"群组\" key=\"group\">\n <List\n dataSource={groupedMaterials.group}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n )}\n\n {groupedMaterials.custom.length > 0 && (\n <Panel header=\"自定义\" key=\"custom\">\n <List\n dataSource={groupedMaterials.custom}\n renderItem={(item) => renderMaterialItem(item, false)}\n locale={{\n emptyText: (\n <Empty\n description=\"暂无物料\"\n image={Empty.PRESENTED_IMAGE_SIMPLE}\n />\n ),\n }}\n />\n </Panel>\n )}\n </Collapse>\n </div>\n\n <div className=\"p-3 border-t border-gray-200 bg-gray-50\">\n <Text type=\"secondary\" className=\"text-xs\">\n {mode === \"line-draw\" ? (\n <>\n 💡 提示:点击绘制线段,可连续绘制多段线,双击结束绘制,ESC 取消\n </>\n ) : (\n <>\n 💡 提示:拖拽物料到画布创建节点,点击线条物料进入绘制模式\n </>\n )}\n </Text>\n </div>\n </div>\n );\n};\n","import React, { useMemo, useState, useCallback, useRef, useEffect } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport type { Node, Material, NodeStatus, LineMaterial } from \"../../types\";\nimport { Image, Typography } from \"antd\";\n\nconst { Text } = Typography;\n\ninterface NodeRendererProps {\n node: Node;\n isSelected?: boolean;\n onClick?: (e: React.MouseEvent) => void;\n onMouseDown?: (e: React.MouseEvent) => void;\n // 外部数据,用于状态表达式计算\n data?: any;\n // 更新节点回调\n onUpdateNode?: (nodeId: string, updates: Partial<Node>) => void;\n // 当前缩放比例\n scale?: number;\n}\n\n// 执行状态表达式\nconst evaluateStatusExpression = (status: NodeStatus, data?: any): boolean => {\n try {\n //生成函数所需要的参数列表\n const params =\n data && Array.isArray(data)\n ? data.map((d: any, index: number) => d.paramsName)\n : [\"A\"]; //大写英文字符\n const fn = new Function(...params, status.expression);\n const result = fn(...data.map((d: any) => d.value));\n console.log(\n `Evaluating status [${status.name}] with data:`,\n data,\n \"Result:\",\n result,\n );\n return result === true;\n } catch (error) {\n console.warn(`状态表达式执行失败 [${status.name}]:`, error);\n return false;\n }\n};\n\n// 找到第一个满足条件的状态\nconst findActiveStatus = (\n statusList: NodeStatus[],\n data?: any,\n): NodeStatus | undefined => {\n for (const status of statusList) {\n console.log(status, \"status\");\n let bindData: Record<string, any>[] = [];\n if (Array.isArray(data)) {\n console.log(status.bindCodes, \"bindCodes\");\n bindData = data.filter((d: any) =>\n status.bindCodes?.includes(d.paramsCode),\n );\n } else {\n bindData = data;\n }\n if (evaluateStatusExpression(status, bindData)) {\n return status;\n }\n }\n return undefined;\n};\n\n// 从数据中获取字段值\nconst getDataValue = (\n data: any,\n valueSourceCode?: string,\n): { value: any; unit?: string } => {\n if (!valueSourceCode || !data) {\n return { value: undefined };\n }\n\n // 数据是数组格式:查找 paramsCode 匹配的项\n if (Array.isArray(data)) {\n const dataItem = data.find((d) => d.paramsCode === valueSourceCode);\n if (dataItem) {\n return {\n value: dataItem.value,\n unit: dataItem.unit,\n };\n }\n }\n // 数据是对象格式:直接取字段\n else if (typeof data === \"object\" && valueSourceCode in data) {\n return {\n value: data[valueSourceCode],\n unit: data.unit,\n };\n }\n\n return { value: undefined };\n};\n\n// 格式化数值,根据小数位配置\nconst formatValue = (value: any, decimals?: number): string => {\n if (value === undefined || value === null || value === \"\") return \"\";\n\n // -1 表示不格式化\n if (decimals === -1) return String(value);\n\n // 检查是否为有效数值\n const num = Number(value);\n if (isNaN(num)) return String(value);\n\n // 格式化小数位\n return num.toFixed(decimals ?? 2);\n};\n\n// 渲染物料\nconst renderMaterial = (material: Material, data?: any, isSelected?: boolean, node?: Node) => {\n switch (material.type) {\n case \"IMAGE\":\n const imageMaterial = material as any;\n const bgColor = imageMaterial.backgroundColor;\n const fillColor = imageMaterial.fillColor;\n\n // 如果是基本形状且有填充颜色,动态生成 SVG\n let src = imageMaterial.src;\n if (fillColor && src && src.includes('data:image/svg+xml')) {\n if (material.name === '矩形') {\n src = `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"60\"><rect width=\"100\" height=\"60\" fill=\"${fillColor}\" rx=\"4\"/></svg>`)}`;\n } else if (material.name === '圆形') {\n src = `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"80\" height=\"80\"><circle cx=\"40\" cy=\"40\" r=\"38\" fill=\"${fillColor}\"/></svg>`)}`;\n } else if (material.name === '圆角矩形') {\n src = `data:image/svg+xml,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100\" height=\"60\"><rect width=\"100\" height=\"60\" fill=\"${fillColor}\" rx=\"20\"/></svg>`)}`;\n }\n }\n\n return (\n <div\n className=\"w-full h-full flex items-center justify-center overflow-hidden\"\n style={{ backgroundColor: bgColor }}\n >\n {src ? (\n <img\n src={src}\n alt={material.name}\n style={{\n width: \"100%\",\n height: \"100%\",\n objectFit: \"contain\",\n }}\n />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center\">\n <span className=\"text-gray-400 text-xs\">无图片</span>\n </div>\n )}\n </div>\n );\n\n case \"TEXT\":\n const textMaterial = material as any;\n const {\n label,\n value: configValue,\n valueSourceCode,\n unit: configUnit,\n decimals,\n labelStyle,\n valueStyle,\n customStyle,\n } = textMaterial.content || {};\n\n // 如果有 valueSourceCode,从数据中获取值\n const { value: dataValue, unit: dataUnit } = valueSourceCode\n ? getDataValue(data, valueSourceCode)\n : { value: undefined, unit: undefined };\n\n // 优先使用数据中的值,否则使用配置的默认值\n const rawValue = dataValue !== undefined ? dataValue : configValue;\n // 格式化数值\n const displayValue = formatValue(rawValue, decimals);\n // 优先使用配置的单位,否则使用数据中的单位\n const displayUnit = configUnit || dataUnit || \"\";\n\n return (\n <div\n className=\"w-full h-full flex flex-col justify-center gap-1\"\n style={{ ...customStyle }}>\n {label && (\n <Text\n style={{\n fontSize: 14,\n fontWeight: \"bold\",\n color: \"#262626\",\n textAlign: \"left\",\n ...labelStyle,\n }}>\n {label}\n </Text>\n )}\n {displayValue && (\n <Text\n style={{\n fontSize: 14,\n color: \"#1890ff\",\n textAlign: \"left\",\n ...valueStyle,\n }}>\n {displayValue}\n {displayUnit ? ` ${displayUnit}` : \"\"}\n </Text>\n )}\n </div>\n );\n\n case \"LINE\":\n const lineMaterial = material as any;\n const {\n thickness = 2,\n color = \"#d9d9d9\",\n dashed = false,\n lineType = dashed ? \"dashed\" : \"solid\",\n lineWeight = thickness,\n // 起点和终点的相对坐标\n startX = 0,\n startY = 0,\n endX = 100,\n endY = 0,\n } = lineMaterial.config || {};\n\n // 根据线型计算 dash array\n const getDashArray = (type: string): string => {\n const baseWeight = Math.max(lineWeight, 1);\n switch (type) {\n case \"solid\":\n return \"\";\n case \"dashed\":\n return `${baseWeight * 8},${baseWeight * 4}`;\n case \"center\":\n return `${baseWeight * 12},${baseWeight * 3},${baseWeight * 2},${baseWeight * 3}`;\n case \"phantom\":\n return `${baseWeight * 12},${baseWeight * 3},${baseWeight * 2},${baseWeight * 3},${baseWeight * 2},${baseWeight * 3}`;\n case \"dot\":\n return `${baseWeight},${baseWeight * 3}`;\n case \"dash-dot\":\n return `${baseWeight * 8},${baseWeight * 3},${baseWeight},${baseWeight * 3}`;\n default:\n return \"\";\n }\n };\n\n const dashArray = getDashArray(lineType);\n\n // 选中时高亮颜色\n const strokeColor = isSelected ? \"#1890ff\" : color;\n\n // 直接使用保存的相对坐标画线\n // 这和预览线的逻辑一模一样:从起点画到终点\n return (\n <div className=\"w-full h-full relative\" style={{ overflow: \"visible\" }}>\n <svg\n className=\"absolute top-0 left-0\"\n width=\"100%\"\n height=\"100%\"\n style={{ overflow: \"visible\", pointerEvents: \"none\" }}>\n {/* 看不见的宽线用于捕获点击事件 */}\n <line\n x1={startX}\n y1={startY}\n x2={endX}\n y2={endY}\n stroke=\"transparent\"\n strokeWidth={Math.max(lineWeight, 10)}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ pointerEvents: \"stroke\", cursor: \"pointer\" }}\n />\n {/* 实际显示的线 */}\n <line\n x1={startX}\n y1={startY}\n x2={endX}\n y2={endY}\n stroke={strokeColor}\n strokeWidth={lineWeight}\n strokeDasharray={dashArray}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={{ pointerEvents: \"none\" }}\n />\n </svg>\n </div>\n );\n\n case \"CUSTOM\":\n const customMaterial = material as any;\n if (customMaterial.render) {\n return customMaterial.render({});\n }\n return (\n <div className=\"w-full h-full flex items-center justify-center bg-gray-100\">\n <span className=\"text-gray-400 text-xs\">自定义组件</span>\n </div>\n );\n\n default:\n return (\n <div className=\"w-full h-full flex items-center justify-center bg-gray-100\">\n <span className=\"text-gray-400 text-xs\">未知类型</span>\n </div>\n );\n }\n};\n\nconst NodeRendererComponent: React.FC<NodeRendererProps> = ({\n node,\n isSelected = false,\n onClick,\n onMouseDown,\n data,\n onUpdateNode,\n scale: canvasScale = 1,\n}) => {\n const { normalStyle, contentInfo, controlInfo } = node;\n const { statusList } = contentInfo;\n const { isClickable, isDraggable, isResizable } = controlInfo;\n\n // 使用 ref 存储 onClick,避免 memo 导致的旧闭包问题\n const onClickRef = useRef(onClick);\n useEffect(() => {\n onClickRef.current = onClick;\n }, [onClick]);\n\n // 线条端点拖拽状态\n const [draggingPoint, setDraggingPoint] = useState<'start' | 'end' | null>(null);\n const dragOriginRef = useRef<{\n mouseX: number;\n mouseY: number;\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n nodeX: number;\n nodeY: number;\n } | null>(null);\n // 端点拖拽过程中的最终计算结果,仅在 mouseup 时同步到 store\n const dragResultRef = useRef<{\n nodeX: number; nodeY: number;\n width: number; height: number;\n startX: number; startY: number;\n endX: number; endY: number;\n } | null>(null);\n // 缩放拖拽过程中的最终计算结果\n const resizeResultRef = useRef<{\n x: number; y: number;\n width: number; height: number;\n } | null>(null);\n const nodeRef = useRef<HTMLDivElement>(null);\n\n // 缩放拖拽状态\n const [resizing, setResizing] = useState<{\n corner: 'nw' | 'ne' | 'sw' | 'se';\n startX: number;\n startY: number;\n startWidth: number;\n startHeight: number;\n startNodeX: number;\n startNodeY: number;\n } | null>(null);\n\n // 旋转拖拽状态\n const [rotating, setRotating] = useState<{\n startX: number;\n startY: number;\n startAngle: number;\n centerX: number;\n centerY: number;\n } | null>(null);\n // 旋转过程中的实时角度(ref),防止 React 重渲染覆盖 DOM 操作的角度\n const rotatingAngleRef = useRef<number | null>(null);\n\n // 计算当前应该显示的状态(完全由表达式决定)\n const currentStatus = useMemo(() => {\n if (statusList.length === 0) return undefined;\n\n // 执行状态表达式,找到第一个返回 true 的状态\n const activeStatus = findActiveStatus(statusList, data);\n if (activeStatus) return activeStatus;\n\n // 如果没有状态满足条件,返回第一个状态作为默认\n return statusList[0];\n }, [statusList, data]);\n\n // 获取当前状态绑定的物料\n const currentMaterial = currentStatus?.material;\n\n // 判断当前物料是否是线条\n const isLine = currentMaterial?.type === 'LINE';\n\n // 获取线条配置\n const lineConfig = isLine ? (currentMaterial as LineMaterial).config : null;\n\n // 计算缩放比例\n const nodeScale = normalStyle.scale ?? 1;\n const scaledWidth = (normalStyle.width || 100) * nodeScale;\n const scaledHeight = (normalStyle.height || 100) * nodeScale;\n\n // 通过 DOM 测量推算画布实际缩放比,避免依赖可能不同步的 prop\n const getEffectiveCanvasScale = useCallback(() => {\n const canvasEl = nodeRef.current?.closest('[data-canvas=\"true\"]') as HTMLElement;\n if (!canvasEl) return canvasScale;\n const canvasRect = canvasEl.getBoundingClientRect();\n const logicalWidth = parseFloat(canvasEl.style.width);\n if (!logicalWidth) return canvasScale;\n return canvasRect.width / logicalWidth;\n }, [canvasScale]);\n\n // 处理端点拖拽开始:记录初始鼠标位置和线条配置快照\n const handlePointMouseDown = useCallback((e: React.MouseEvent, point: 'start' | 'end') => {\n e.stopPropagation();\n e.preventDefault();\n dragOriginRef.current = {\n mouseX: e.clientX,\n mouseY: e.clientY,\n startX: lineConfig?.startX || 0,\n startY: lineConfig?.startY || 0,\n endX: lineConfig?.endX || 0,\n endY: lineConfig?.endY || 0,\n nodeX: normalStyle.x || 0,\n nodeY: normalStyle.y || 0,\n };\n setDraggingPoint(point);\n }, [lineConfig, normalStyle.x, normalStyle.y]);\n\n // 处理端点拖拽:拖拽中仅操作 DOM,mouseup 时一次性同步到 store\n useEffect(() => {\n if (!draggingPoint || !isLine || !lineConfig || !onUpdateNode) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const origin = dragOriginRef.current;\n if (!origin || !nodeRef.current) return;\n\n const effectiveScale = getEffectiveCanvasScale();\n const totalDx = (e.clientX - origin.mouseX) / effectiveScale;\n const totalDy = (e.clientY - origin.mouseY) / effectiveScale;\n\n let newStartX = origin.startX;\n let newStartY = origin.startY;\n let newEndX = origin.endX;\n let newEndY = origin.endY;\n let newNodeX = origin.nodeX;\n let newNodeY = origin.nodeY;\n\n if (draggingPoint === 'start') {\n newStartX = origin.startX + totalDx;\n newStartY = origin.startY + totalDy;\n if (newStartX < 0) {\n newNodeX = origin.nodeX + newStartX;\n newEndX = origin.endX - newStartX;\n newStartX = 0;\n }\n if (newStartY < 0) {\n newNodeY = origin.nodeY + newStartY;\n newEndY = origin.endY - newStartY;\n newStartY = 0;\n }\n } else {\n newEndX = origin.endX + totalDx;\n newEndY = origin.endY + totalDy;\n if (newEndX < 0) {\n newNodeX = origin.nodeX + newEndX;\n newStartX = origin.startX - newEndX;\n newEndX = 0;\n }\n if (newEndY < 0) {\n newNodeY = origin.nodeY + newEndY;\n newStartY = origin.startY - newEndY;\n newEndY = 0;\n }\n }\n\n const minNodeSize = Math.max((lineConfig.lineWeight || 2) * 2, 4);\n const maxX = Math.max(newStartX, newEndX);\n const maxY = Math.max(newStartY, newEndY);\n const newWidth = Math.max(maxX, minNodeSize);\n const newHeight = Math.max(maxY, minNodeSize);\n\n // 存储计算结果供 mouseup 同步\n dragResultRef.current = {\n nodeX: newNodeX, nodeY: newNodeY,\n width: newWidth, height: newHeight,\n startX: newStartX, startY: newStartY,\n endX: newEndX, endY: newEndY,\n };\n\n // 直接操作 DOM —— 不触发 React 渲染\n const el = nodeRef.current;\n el.style.left = `${newNodeX}px`;\n el.style.top = `${newNodeY}px`;\n el.style.width = `${newWidth}px`;\n el.style.height = `${newHeight}px`;\n\n // 更新 SVG 线条坐标\n const lines = el.querySelectorAll('svg line');\n lines.forEach(line => {\n line.setAttribute('x1', String(newStartX));\n line.setAttribute('y1', String(newStartY));\n line.setAttribute('x2', String(newEndX));\n line.setAttribute('y2', String(newEndY));\n });\n\n // 更新端点手柄位置\n const startHandle = el.querySelector('[data-handle=\"start\"]') as HTMLElement;\n const endHandle = el.querySelector('[data-handle=\"end\"]') as HTMLElement;\n if (startHandle) {\n startHandle.style.left = `${newStartX - 6}px`;\n startHandle.style.top = `${newStartY - 6}px`;\n }\n if (endHandle) {\n endHandle.style.left = `${newEndX - 6}px`;\n endHandle.style.top = `${newEndY - 6}px`;\n }\n };\n\n const handleMouseUp = () => {\n const result = dragResultRef.current;\n if (result) {\n onUpdateNode(node.id, {\n normalStyle: {\n ...normalStyle,\n x: result.nodeX,\n y: result.nodeY,\n width: result.width,\n height: result.height,\n },\n contentInfo: {\n ...contentInfo,\n statusList: statusList.map(s => ({\n ...s,\n material: s.material.type === 'LINE' ? {\n ...s.material,\n config: {\n ...lineConfig,\n startX: result.startX,\n startY: result.startY,\n endX: result.endX,\n endY: result.endY,\n },\n } : s.material,\n })),\n },\n });\n }\n setDraggingPoint(null);\n dragOriginRef.current = null;\n dragResultRef.current = null;\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [draggingPoint, isLine, lineConfig, node.id, normalStyle, contentInfo, statusList, onUpdateNode, getEffectiveCanvasScale]);\n\n // 处理缩放拖拽:拖拽中仅操作 DOM,mouseup 时一次性同步到 store\n useEffect(() => {\n if (!resizing || !onUpdateNode) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!nodeRef.current) return;\n const effectiveScale = getEffectiveCanvasScale();\n const dx = (e.clientX - resizing.startX) / effectiveScale;\n const dy = (e.clientY - resizing.startY) / effectiveScale;\n\n let newWidth = resizing.startWidth;\n let newHeight = resizing.startHeight;\n let newX = resizing.startNodeX;\n let newY = resizing.startNodeY;\n\n switch (resizing.corner) {\n case 'se':\n newWidth = Math.max(20, resizing.startWidth + dx);\n newHeight = Math.max(20, resizing.startHeight + dy);\n break;\n case 'sw':\n newWidth = Math.max(20, resizing.startWidth - dx);\n newHeight = Math.max(20, resizing.startHeight + dy);\n newX = resizing.startNodeX + (resizing.startWidth - newWidth);\n break;\n case 'ne':\n newWidth = Math.max(20, resizing.startWidth + dx);\n newHeight = Math.max(20, resizing.startHeight - dy);\n newY = resizing.startNodeY + (resizing.startHeight - newHeight);\n break;\n case 'nw':\n newWidth = Math.max(20, resizing.startWidth - dx);\n newHeight = Math.max(20, resizing.startHeight - dy);\n newX = resizing.startNodeX + (resizing.startWidth - newWidth);\n newY = resizing.startNodeY + (resizing.startHeight - newHeight);\n break;\n }\n\n resizeResultRef.current = { x: newX, y: newY, width: newWidth, height: newHeight };\n\n const el = nodeRef.current;\n el.style.left = `${newX}px`;\n el.style.top = `${newY}px`;\n el.style.width = `${newWidth}px`;\n el.style.height = `${newHeight}px`;\n };\n\n const handleMouseUp = () => {\n const result = resizeResultRef.current;\n if (result) {\n onUpdateNode(node.id, {\n normalStyle: {\n ...normalStyle,\n x: result.x,\n y: result.y,\n width: result.width,\n height: result.height,\n },\n });\n }\n setResizing(null);\n resizeResultRef.current = null;\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [resizing, onUpdateNode, node.id, normalStyle, getEffectiveCanvasScale]);\n\n // 处理缩放开始\n const handleResizeStart = useCallback((e: React.MouseEvent, corner: 'nw' | 'ne' | 'sw' | 'se') => {\n e.stopPropagation();\n e.preventDefault();\n setResizing({\n corner,\n startX: e.clientX,\n startY: e.clientY,\n startWidth: normalStyle.width || 100,\n startHeight: normalStyle.height || 100,\n startNodeX: normalStyle.x || 0,\n startNodeY: normalStyle.y || 0,\n });\n }, [normalStyle.width, normalStyle.height, normalStyle.x, normalStyle.y]);\n\n // 处理旋转开始\n const handleRotateStart = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n\n // 计算节点中心点(屏幕坐标)\n const rect = nodeRef.current?.getBoundingClientRect();\n if (!rect) return;\n\n setRotating({\n startX: e.clientX,\n startY: e.clientY,\n startAngle: normalStyle.rotate || 0,\n centerX: rect.left + rect.width / 2,\n centerY: rect.top + rect.height / 2,\n });\n }, [normalStyle.rotate]);\n\n // 处理旋转拖拽:仅通过直接 DOM 操作 + ref 更新角度,不触发 React 渲染\n useEffect(() => {\n if (!rotating) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const dx = e.clientX - rotating.centerX;\n const dy = e.clientY - rotating.centerY;\n const angle = Math.atan2(dy, dx) * (180 / Math.PI);\n\n let newAngle = (angle + 90) % 360;\n if (newAngle < 0) newAngle += 360;\n\n // 同步更新 ref 和 DOM,确保 React 重渲染时 containerStyle 与 DOM 一致\n rotatingAngleRef.current = newAngle;\n if (nodeRef.current) {\n const extra = normalStyle.transform || '';\n nodeRef.current.style.transform = `rotate(${newAngle}deg) ${extra}`.trim();\n }\n };\n\n const handleMouseUp = () => {\n const finalAngle = rotatingAngleRef.current ?? rotating.startAngle;\n rotatingAngleRef.current = null;\n\n if (onUpdateNode) {\n onUpdateNode(node.id, {\n normalStyle: {\n ...normalStyle,\n rotate: Math.round(finalAngle),\n },\n });\n }\n setRotating(null);\n };\n\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [rotating, onUpdateNode, node.id, normalStyle]);\n\n // 判断是否为群组节点\n const isGroup = node.type === 'group';\n\n // 样式计算\n const containerStyle: CSSProperties = {\n position: \"absolute\",\n left: normalStyle.x || 0,\n top: normalStyle.y || 0,\n width: scaledWidth,\n height: scaledHeight,\n // 群组节点不显示背景和边框,只作为容器\n background: isGroup ? 'transparent' : (normalStyle.background || \"transparent\"),\n backgroundImage: isGroup ? undefined : (normalStyle.backgroundImage\n ? `url(${normalStyle.backgroundImage})`\n : undefined),\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n padding: Array.isArray(normalStyle.padding)\n ? normalStyle.padding.join(\"px \") + \"px\"\n : normalStyle.padding,\n margin: Array.isArray(normalStyle.margin)\n ? normalStyle.margin.join(\"px \") + \"px\"\n : normalStyle.margin,\n borderRadius: isGroup ? undefined : normalStyle.borderRadius,\n // 线条物料选中时不显示边框,而是通过高亮线条颜色来表示\n // 群组节点选中时显示边框,平时不显示\n border: isSelected && !isLine\n ? \"2px solid #1890ff\"\n : isLine\n ? \"none\"\n : isGroup\n ? \"none\"\n : normalStyle.border || \"1px dashed transparent\",\n // 线条节点需要捕获点击事件,但由内部 SVG 的透明线处理具体点击区域\n pointerEvents: \"auto\",\n opacity: normalStyle.opacity ?? 1,\n transform: `rotate(${rotatingAngleRef.current ?? (normalStyle.rotate || 0)}deg) ${normalStyle.transform || ''}`.trim(),\n transformOrigin: 'center center',\n zIndex: isSelected ? 1000 : (normalStyle.zIndex ?? 1),\n cursor: isDraggable && !draggingPoint ? \"move\" : isClickable ? \"pointer\" : \"default\",\n boxSizing: \"border-box\",\n // 选中、线条和群组节点使用 visible overflow,避免裁剪手柄\n overflow: isSelected || isLine || isGroup ? \"visible\" : \"hidden\",\n };\n\n // 获取线条端点位置用于显示拖拽手柄\n const startPointPos = lineConfig ? { x: lineConfig.startX || 0, y: lineConfig.startY || 0 } : { x: 0, y: 0 };\n const endPointPos = lineConfig ? { x: lineConfig.endX || 0, y: lineConfig.endY || 0 } : { x: 0, y: 0 };\n\n return (\n <div\n ref={nodeRef}\n data-node-id={node.id}\n style={containerStyle}\n onClick={(e) => {\n console.log('NodeRenderer onClick', node.id, 'isClickable:', isClickable);\n // 使用 ref 获取最新函数\n const latestOnClick = onClickRef.current;\n if (isClickable && latestOnClick && !draggingPoint && !resizing && !rotating) {\n e.stopPropagation();\n latestOnClick(e);\n }\n // 如果没有 onClick 处理器,不阻止传播,让父节点(如 group)处理\n }}\n onMouseDown={(e) => {\n if (isDraggable && onMouseDown && !draggingPoint) {\n onMouseDown(e);\n }\n }}>\n {/* 选中时的调整手柄 */}\n {isSelected && !isLine && !isGroup && (\n <>\n {/* 四角手柄 - 支持拖拽缩放 */}\n <div\n className=\"absolute top-0 left-0 w-3 h-3 bg-blue-500 border-2 border-white rounded-full\"\n style={{ zIndex: 9999, pointerEvents: 'auto', cursor: 'nw-resize', marginTop: '-6px', marginLeft: '-6px' }}\n onMouseDown={(e) => handleResizeStart(e, 'nw')}\n title=\"拖拽调整大小\"\n />\n <div\n className=\"absolute top-0 right-0 w-3 h-3 bg-blue-500 border-2 border-white rounded-full\"\n style={{ zIndex: 9999, pointerEvents: 'auto', cursor: 'ne-resize', marginTop: '-6px', marginRight: '-6px' }}\n onMouseDown={(e) => handleResizeStart(e, 'ne')}\n title=\"拖拽调整大小\"\n />\n <div\n className=\"absolute bottom-0 left-0 w-3 h-3 bg-blue-500 border-2 border-white rounded-full\"\n style={{ zIndex: 9999, pointerEvents: 'auto', cursor: 'sw-resize', marginBottom: '-6px', marginLeft: '-6px' }}\n onMouseDown={(e) => handleResizeStart(e, 'sw')}\n title=\"拖拽调整大小\"\n />\n <div\n className=\"absolute bottom-0 right-0 w-3 h-3 bg-blue-500 border-2 border-white rounded-full\"\n style={{ zIndex: 9999, pointerEvents: 'auto', cursor: 'se-resize', marginBottom: '-6px', marginRight: '-6px' }}\n onMouseDown={(e) => handleResizeStart(e, 'se')}\n title=\"拖拽调整大小\"\n />\n\n {/* 旋转手柄 */}\n <div\n className=\"absolute top-0 left-1/2 w-4 h-4 bg-green-500 border-2 border-white rounded-full\"\n style={{ zIndex: 9999, pointerEvents: 'auto', cursor: 'grab', marginTop: '-20px', transform: 'translateX(-50%)', boxShadow: '0 0 4px rgba(0,0,0,0.3)' }}\n onMouseDown={(e) => handleRotateStart(e)}\n title=\"拖拽旋转\"\n />\n {/* 旋转连接线 */}\n <div\n className=\"absolute top-0 left-1/2 w-0.5 h-3 bg-green-500\"\n style={{ zIndex: 9998, pointerEvents: 'none', marginTop: '-14px', transform: 'translateX(-50%)' }}\n />\n\n {/* 节点名称和当前状态标签 */}\n <div className=\"absolute -top-6 left-0 bg-blue-500 text-white text-xs px-2 py-0.5 rounded whitespace-nowrap\">\n {node.name} {currentStatus ? `(${currentStatus.name})` : \"\"}\n </div>\n </>\n )}\n\n {/* 线条端点拖拽手柄 */}\n {isSelected && isLine && lineConfig && onUpdateNode && (\n <>\n {/* 起点拖拽手柄 */}\n <div\n data-handle=\"start\"\n className=\"absolute w-3 h-3 bg-blue-500 border-2 border-white rounded-full cursor-move z-50\"\n style={{\n left: startPointPos.x - 6,\n top: startPointPos.y - 6,\n boxShadow: '0 0 4px rgba(0,0,0,0.3)',\n }}\n onMouseDown={(e) => handlePointMouseDown(e, 'start')}\n title=\"拖拽调整起点\"\n />\n {/* 终点拖拽手柄 */}\n <div\n data-handle=\"end\"\n className=\"absolute w-3 h-3 bg-blue-500 border-2 border-white rounded-full cursor-move z-50\"\n style={{\n left: endPointPos.x - 6,\n top: endPointPos.y - 6,\n boxShadow: '0 0 4px rgba(0,0,0,0.3)',\n }}\n onMouseDown={(e) => handlePointMouseDown(e, 'end')}\n title=\"拖拽调整终点\"\n />\n\n {/* 节点名称 */}\n <div className=\"absolute -top-6 left-0 bg-blue-500 text-white text-xs px-2 py-0.5 rounded whitespace-nowrap\">\n {node.name}\n </div>\n </>\n )}\n\n {/* 渲染当前状态绑定的物料 */}\n <div className=\"w-full h-full relative\">\n {currentMaterial ? (\n <div className=\"w-full h-full\">\n {renderMaterial(currentMaterial, data, isSelected, node)}\n </div>\n ) : !isGroup ? (\n // 只有非群组节点才显示\"无状态\"\n <div className=\"w-full h-full flex items-center justify-center text-gray-300 text-xs\">\n 无状态\n </div>\n ) : null}\n </div>\n\n {/* 渲染群组节点的子节点 */}\n {node.type === 'group' && node.children && (\n <div className=\"absolute inset-0 pointer-events-none\">\n {node.children.map(childNode => (\n <div key={childNode.id} className=\"pointer-events-auto\">\n <NodeRenderer\n node={childNode}\n isSelected={false}\n data={data}\n onUpdateNode={onUpdateNode}\n scale={canvasScale}\n />\n </div>\n ))}\n </div>\n )}\n </div>\n )\n};\n\n// 使用 React.memo 避免不必要的重渲染,提高拖拽性能\n// 注意:只在节点位置、选中状态、缩放比例、状态内容变化时才重渲染\n// 忽略 data、onClick、onMouseDown、onUpdateNode 等频繁变化的 props\nexport const NodeRenderer = React.memo(NodeRendererComponent, (prevProps, nextProps) => {\n const nodeA = prevProps.node;\n const nodeB = nextProps.node;\n\n // 比较节点位置和尺寸\n const nodeStyleEqual =\n nodeA.id === nodeB.id &&\n nodeA.normalStyle.x === nodeB.normalStyle.x &&\n nodeA.normalStyle.y === nodeB.normalStyle.y &&\n nodeA.normalStyle.width === nodeB.normalStyle.width &&\n nodeA.normalStyle.height === nodeB.normalStyle.height;\n\n // 比较节点内容引用(contentInfo 对象在更新时会创建新引用)\n const contentEqual = nodeA.contentInfo === nodeB.contentInfo;\n\n // 比较其他关键 props\n const otherPropsEqual =\n prevProps.isSelected === nextProps.isSelected &&\n prevProps.scale === nextProps.scale;\n\n return nodeStyleEqual && contentEqual && otherPropsEqual;\n});\n","import React, { useState, useRef, useEffect } from 'react';\n\ninterface ColorPickerProps {\n value?: string;\n onChange?: (color: { toHexString: () => string }) => void;\n onChangeComplete?: (color: { toHexString: () => string }) => void;\n}\n\nconst presetColors = [\n '#1890ff', '#52c41a', '#faad14', '#f5222d',\n '#722ed1', '#eb2f96', '#13c2c2', '#fa8c16',\n '#595959', '#262626', '#8c8c8c', '#d9d9d9',\n '#ffffff', '#000000', '#ff4d4f', '#73d13d',\n];\n\nexport const ColorPicker: React.FC<ColorPickerProps> = ({ \n value = '#1890ff', \n onChange,\n onChangeComplete \n}) => {\n const [visible, setVisible] = useState(false);\n const [innerValue, setInnerValue] = useState(value);\n const popoverRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n setInnerValue(value);\n }, [value]);\n\n useEffect(() => {\n const handleClickOutside = (e: MouseEvent) => {\n if (popoverRef.current && !popoverRef.current.contains(e.target as Node)) {\n setVisible(false);\n onChangeComplete?.({ toHexString: () => innerValue });\n }\n };\n if (visible) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [visible, onChangeComplete, innerValue]);\n\n const handleColorChange = (color: string) => {\n setInnerValue(color);\n onChange?.({ toHexString: () => color });\n };\n\n return (\n <div ref={popoverRef} style={{ position: 'relative', display: 'inline-block' }}>\n <div\n onClick={() => setVisible(!visible)}\n style={{\n width: 28,\n height: 28,\n backgroundColor: innerValue,\n border: '1px solid #d9d9d9',\n borderRadius: 4,\n cursor: 'pointer',\n }}\n />\n {visible && (\n <div\n style={{\n position: 'absolute',\n top: 32,\n left: 0,\n zIndex: 1000,\n background: '#fff',\n padding: 8,\n borderRadius: 4,\n boxShadow: '0 2px 8px rgba(0,0,0,0.15)',\n border: '1px solid #f0f0f0',\n }}\n >\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(8, 1fr)', gap: 4 }}>\n {presetColors.map((color) => (\n <div\n key={color}\n onClick={() => {\n handleColorChange(color);\n setVisible(false);\n onChangeComplete?.({ toHexString: () => color });\n }}\n style={{\n width: 20,\n height: 20,\n backgroundColor: color,\n border: innerValue === color ? '2px solid #1890ff' : '1px solid #d9d9d9',\n borderRadius: 2,\n cursor: 'pointer',\n }}\n />\n ))}\n </div>\n <input\n type=\"color\"\n value={innerValue}\n onChange={(e) => handleColorChange(e.target.value)}\n onBlur={() => onChangeComplete?.({ toHexString: () => innerValue })}\n style={{ \n width: '100%', \n marginTop: 8,\n height: 28,\n border: '1px solid #d9d9d9',\n borderRadius: 4,\n }}\n />\n </div>\n )}\n </div>\n );\n};\n","import React, { useRef, useCallback, useState, useEffect, useMemo } from \"react\";\nimport {\n TransformWrapper,\n TransformComponent,\n type ReactZoomPanPinchRef,\n} from \"react-zoom-pan-pinch\";\nimport { Button, Space, Tooltip, Modal, Form, Input, InputNumber, Switch, Upload, message } from \"antd\";\nimport {\n ZoomInOutlined,\n ZoomOutOutlined,\n UndoOutlined,\n RedoOutlined,\n SelectOutlined,\n DragOutlined,\n EyeOutlined,\n DeleteOutlined,\n ExperimentOutlined,\n GroupOutlined,\n VerticalAlignTopOutlined,\n VerticalAlignBottomOutlined,\n AlignLeftOutlined,\n AlignRightOutlined,\n EditOutlined,\n SettingOutlined,\n CopyOutlined,\n UngroupOutlined,\n ColumnWidthOutlined,\n ColumnHeightOutlined,\n UploadOutlined,\n CloseOutlined,\n} from \"@ant-design/icons\";\nimport { useEditorStore } from \"../../store/editorStore\";\nimport { NodeRenderer } from \"../NodeRenderer\";\nimport { ColorPicker } from '../ColorPicker';\nimport { createDefaultNode, createDefaultStatus } from \"../../utils/initData\";\nimport type { Node, NormalNode, Material, LineMaterial, GroupNode } from \"../../types\";\nimport { nanoid } from \"nanoid\";\n\nconst { TextArea } = Input;\n\ninterface CanvasProps {\n defaultTestData?: any;\n}\n\nexport const Canvas: React.FC<CanvasProps> = ({ defaultTestData }) => {\n const transformRef = useRef<ReactZoomPanPinchRef>(null);\n const canvasRef = useRef<HTMLDivElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n const {\n nodes,\n selectedNodeId,\n mode,\n lineDrawing,\n viewport,\n canvas,\n setViewport,\n setCanvasConfig,\n addNode,\n selectNode,\n updateNode,\n removeNode,\n undo,\n redo,\n setMode,\n startLineDrawing,\n endLineDrawing,\n cancelLineDrawing,\n } = useEditorStore();\n console.log('selectedNodeId', selectedNodeId);\n const [isDragOver, setIsDragOver] = useState(false);\n const [, forceUpdate] = useState({});\n const modeRef = useRef(mode);\n useEffect(() => {\n modeRef.current = mode;\n }, [mode]);\n // 拖拽状态\n const isDraggingRef = useRef(false);\n const dragStartRef = useRef({ x: 0, y: 0 });\n const dragOffsetRef = useRef({ x: 0, y: 0, newX: 0, newY: 0 });\n const draggingNodeRef = useRef<Node | null>(null);\n\n // 线条绘制状态\n const [linePreview, setLinePreview] = useState<{\n start: { x: number; y: number } | null;\n end: { x: number; y: number } | null;\n isDrawing: boolean;\n }>({ start: null, end: null, isDrawing: false });\n\n // 框选状态\n const [selectionBox, setSelectionBox] = useState<{\n start: { x: number; y: number } | null;\n end: { x: number; y: number } | null;\n }>({ start: null, end: null });\n const [selectedNodeIds, setSelectedNodeIds] = useState<string[]>([]);\n\n // 框选模式辅助:用于判断是否在框选过程中\n const isBoxSelectingRef = useRef(false);\n\n // 数据模拟\n const [dataModalVisible, setDataModalVisible] = useState(false);\n const [dataInput, setDataInput] = useState(\n JSON.stringify(defaultTestData, null, 2)\n );\n\n // 画布配置弹窗\n const [canvasConfigVisible, setCanvasConfigVisible] = useState(false);\n\n // 空格键临时拖拽模式\n const [isSpacePressed, setIsSpacePressed] = useState(false);\n\n // 坐标转换:屏幕坐标 → 画布逻辑坐标\n // 通过 DOM 实际尺寸推算有效缩放比,避免依赖可能不同步的 ref state\n const getCanvasPosition = useCallback((clientX: number, clientY: number) => {\n if (!canvasRef.current) return { x: 0, y: 0 };\n\n const canvasRect = canvasRef.current.getBoundingClientRect();\n\n const mouseXInCanvas = clientX - canvasRect.left;\n const mouseYInCanvas = clientY - canvasRect.top;\n\n const effectiveScaleX = canvasRect.width / canvas.width;\n const effectiveScaleY = canvasRect.height / canvas.height;\n\n const x = mouseXInCanvas / effectiveScaleX;\n const y = mouseYInCanvas / effectiveScaleY;\n return { x: Math.round(x), y: Math.round(y) };\n }, [canvas.width, canvas.height]);\n\n // 坐标转换(仅用于框选)- 复用同样的 DOM 推算逻辑\n const getBoxSelectionPosition = useCallback((clientX: number, clientY: number) => {\n return getCanvasPosition(clientX, clientY);\n }, [getCanvasPosition]);\n\n // 创建线条节点\n const createLineNode = useCallback(\n (start: { x: number; y: number }, end: { x: number; y: number }, continueDrawing: boolean = true) => {\n if (!lineDrawing.material) return;\n\n const material = lineDrawing.material as LineMaterial;\n const config = material.config || {};\n const lineWeight = config.lineWeight || config.thickness || 2;\n\n const x = Math.min(start.x, end.x);\n const y = Math.min(start.y, end.y);\n\n const relativeStartX = Math.round(start.x - x);\n const relativeStartY = Math.round(start.y - y);\n const relativeEndX = Math.round(end.x - x);\n const relativeEndY = Math.round(end.y - y);\n\n const minNodeSize = Math.max(lineWeight * 2, 4);\n const nodeWidth = Math.max(Math.abs(start.x - end.x), minNodeSize);\n const nodeHeight = Math.max(Math.abs(start.y - end.y), minNodeSize);\n\n const lineMaterial: LineMaterial = {\n ...material,\n id: nanoid(),\n config: {\n color: config.color,\n lineWeight,\n thickness: lineWeight,\n lineType: config.lineType,\n startX: relativeStartX,\n startY: relativeStartY,\n endX: relativeEndX,\n endY: relativeEndY,\n },\n };\n\n const newNode: Node = {\n id: nanoid(),\n name: `${material.name}_${Date.now()}`,\n type: 'normal',\n normalStyle: {\n width: nodeWidth,\n height: nodeHeight,\n x,\n y,\n background: 'transparent',\n },\n contentInfo: {\n statusList: [createDefaultStatus(lineMaterial)],\n currentStatusId: undefined,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n },\n };\n\n addNode(newNode, false);\n\n if (continueDrawing) {\n const nextStart = { x: end.x, y: end.y };\n setLinePreview({\n start: nextStart,\n end: { ...nextStart },\n isDrawing: true,\n });\n } else {\n setLinePreview({ start: null, end: null, isDrawing: false });\n endLineDrawing();\n }\n },\n [lineDrawing.material, addNode, endLineDrawing]\n );\n\n // 视口变换\n const handleTransform = useCallback(() => {\n const state = transformRef.current?.state;\n if (state) {\n setViewport({\n scale: state.scale,\n positionX: state.positionX,\n positionY: state.positionY,\n });\n }\n }, [setViewport]);\n\n // 画布点击\n const handleCanvasClick = useCallback(\n (e: React.MouseEvent) => {\n if (isDraggingRef.current) return;\n // 框选模式下点击画布不清空选择\n if (mode === 'box-select') return;\n if (\n e.target === canvasRef.current ||\n (e.target as HTMLElement).dataset?.canvas === \"true\"\n ) {\n selectNode(null);\n setSelectedNodeIds([]);\n }\n },\n [selectNode, mode]\n );\n\n // 画布鼠标按下(线条绘制/框选)\n const handleCanvasMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (e.button !== 0) return;\n\n // 线条绘制模式\n if (mode === \"line-draw\" && lineDrawing.material) {\n e.stopPropagation();\n const pos = getCanvasPosition(e.clientX, e.clientY);\n if (!linePreview.isDrawing) {\n setLinePreview({ start: pos, end: pos, isDrawing: true });\n } else if (linePreview.start) {\n createLineNode(linePreview.start, pos, true);\n }\n return;\n }\n\n // 框选模式(空格键按下时进入拖拽模式,不执行框选)\n if (mode === 'box-select' && !isSpacePressed) {\n const pos = getBoxSelectionPosition(e.clientX, e.clientY);\n setSelectionBox({ start: pos, end: pos });\n setSelectedNodeIds([]);\n e.preventDefault();\n e.stopPropagation();\n }\n },\n [mode, lineDrawing.material, linePreview.isDrawing, linePreview.start, isSpacePressed, createLineNode, getCanvasPosition, getBoxSelectionPosition]\n );\n\n // 画布双击(结束线条绘制)\n const handleCanvasDoubleClick = useCallback(\n (e: React.MouseEvent) => {\n if (mode !== \"line-draw\" || !lineDrawing.material) return;\n if (linePreview.isDrawing && linePreview.start) {\n const pos = getCanvasPosition(e.clientX, e.clientY);\n createLineNode(linePreview.start, pos, false);\n }\n },\n [mode, lineDrawing.material, linePreview.isDrawing, linePreview.start, createLineNode, getCanvasPosition]\n );\n\n // 拖拽悬停\n const handleDragOver = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n e.dataTransfer.dropEffect = \"copy\";\n setIsDragOver(true);\n }, []);\n\n const handleDragLeave = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n }, []);\n\n // 放置物料\n const handleDrop = useCallback(\n (e: React.DragEvent) => {\n e.preventDefault();\n setIsDragOver(false);\n if (!canvasRef.current || mode !== \"select\") return;\n\n try {\n const data = e.dataTransfer.getData(\"application/json\");\n if (!data) return;\n const material = JSON.parse(data);\n const pos = getCanvasPosition(e.clientX, e.clientY);\n const x = pos.x - 50;\n const y = pos.y - 50;\n const newNode = createDefaultNode(x, y, material);\n addNode(newNode);\n setSelectedNodeIds([newNode.id]);\n } catch (error) {\n console.error(\"Failed to parse dropped material:\", error);\n }\n },\n [mode, addNode, getCanvasPosition]\n );\n\n // 节点拖拽开始\n const handleNodeMouseDown = useCallback(\n (e: React.MouseEvent, node: Node) => {\n // 选择模式或框选模式下都可以拖拽\n if ((mode !== \"select\" && mode !== \"box-select\") || !node.controlInfo.isDraggable) return;\n e.stopPropagation();\n selectNode(node.id);\n isDraggingRef.current = true;\n dragStartRef.current = { x: e.clientX, y: e.clientY };\n dragOffsetRef.current = {\n x: node.normalStyle.x || 0,\n y: node.normalStyle.y || 0,\n newX: node.normalStyle.x || 0,\n newY: node.normalStyle.y || 0,\n };\n draggingNodeRef.current = node;\n e.preventDefault();\n },\n [mode, selectNode]\n );\n\n // 鼠标事件\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n // 拖拽\n if (isDraggingRef.current && selectedNodeId && draggingNodeRef.current) {\n if (!canvasRef.current) return;\n const canvasRect = canvasRef.current.getBoundingClientRect();\n const effectiveScaleX = canvasRect.width / canvas.width;\n const effectiveScaleY = canvasRect.height / canvas.height;\n const screenDx = e.clientX - dragStartRef.current.x;\n const screenDy = e.clientY - dragStartRef.current.y;\n const canvasDx = screenDx / effectiveScaleX;\n const canvasDy = screenDy / effectiveScaleY;\n const newX = dragOffsetRef.current.x + canvasDx;\n const newY = dragOffsetRef.current.y + canvasDy;\n const nodeEl = document.querySelector(\n `[data-node-id=\"${selectedNodeId}\"]`\n ) as HTMLElement;\n if (nodeEl) {\n nodeEl.style.left = `${newX}px`;\n nodeEl.style.top = `${newY}px`;\n }\n dragOffsetRef.current.newX = newX;\n dragOffsetRef.current.newY = newY;\n }\n // 框选\n if (mode === 'box-select' && selectionBox.start) {\n const pos = getBoxSelectionPosition(e.clientX, e.clientY);\n setSelectionBox((prev) => ({ ...prev, end: pos }));\n }\n // 线条预览\n if (mode === \"line-draw\" && linePreview.isDrawing) {\n const pos = getCanvasPosition(e.clientX, e.clientY);\n setLinePreview((prev) => ({ ...prev, end: pos }));\n }\n };\n\n const handleMouseUp = () => {\n if (isDraggingRef.current && selectedNodeId && draggingNodeRef.current) {\n const store = useEditorStore.getState();\n const newX = dragOffsetRef.current.newX ?? dragOffsetRef.current.x;\n const newY = dragOffsetRef.current.newY ?? dragOffsetRef.current.y;\n store.updateNode(selectedNodeId, {\n normalStyle: {\n ...draggingNodeRef.current.normalStyle,\n x: newX,\n y: newY,\n },\n });\n }\n isDraggingRef.current = false;\n draggingNodeRef.current = null;\n forceUpdate({});\n // 框选结束,计算选中的节点\n if (mode === 'box-select' && selectionBox.start && selectionBox.end) {\n const minX = Math.min(selectionBox.start.x, selectionBox.end.x);\n const maxX = Math.max(selectionBox.start.x, selectionBox.end.x);\n const minY = Math.min(selectionBox.start.y, selectionBox.end.y);\n const maxY = Math.max(selectionBox.start.y, selectionBox.end.y);\n\n const selectedIds = nodes\n .filter((node) => {\n const nodeX = node.normalStyle.x || 0;\n const nodeY = node.normalStyle.y || 0;\n const nodeW = node.normalStyle.width || 0;\n const nodeH = node.normalStyle.height || 0;\n const centerX = nodeX + nodeW / 2;\n const centerY = nodeY + nodeH / 2;\n return centerX >= minX && centerX <= maxX && centerY >= minY && centerY <= maxY;\n })\n .map((node) => node.id);\n\n setSelectedNodeIds(selectedIds);\n setSelectionBox({ start: null, end: null });\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && mode === \"line-draw\") {\n setLinePreview({ start: null, end: null, isDrawing: false });\n cancelLineDrawing();\n }\n if (e.key === \"Delete\") {\n if (selectedNodeId) removeNode(selectedNodeId);\n else if (selectedNodeIds.length > 0) {\n selectedNodeIds.forEach((id) => removeNode(id));\n setSelectedNodeIds([]);\n }\n }\n if (e.ctrlKey && e.key === \"z\") {\n e.preventDefault();\n undo();\n }\n if (e.ctrlKey && e.key === \"y\") {\n e.preventDefault();\n redo();\n }\n // 空格键按下:进入临时拖拽模式(所有模式都支持)\n if (e.key === \" \" && !isSpacePressed) {\n e.preventDefault();\n setIsSpacePressed(true);\n }\n };\n\n const handleKeyUp = (e: KeyboardEvent) => {\n // 空格键松开:退出临时拖拽模式\n if (e.key === \" \" && isSpacePressed) {\n setIsSpacePressed(false);\n }\n };\n\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n window.addEventListener(\"keydown\", handleKeyDown);\n window.addEventListener(\"keyup\", handleKeyUp);\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n window.removeEventListener(\"keydown\", handleKeyDown);\n window.removeEventListener(\"keyup\", handleKeyUp);\n };\n }, [\n selectedNodeId,\n\n selectionBox,\n mode,\n linePreview.isDrawing,\n selectedNodeIds,\n nodes,\n canvas.width,\n canvas.height,\n removeNode,\n undo,\n isSpacePressed,\n redo,\n cancelLineDrawing,\n getCanvasPosition,\n getBoxSelectionPosition,\n setSelectedNodeIds,\n ]);\n\n // 复制节点\n const handleCopyNodes = useCallback(() => {\n // 确定要复制的节点列表\n const nodesToCopy = selectedNodeIds.length > 0\n ? selectedNodeIds.map((id) => nodes.find((n) => n.id === id)).filter(Boolean) as Node[]\n : selectedNodeId\n ? [nodes.find((n) => n.id === selectedNodeId)].filter(Boolean) as Node[]\n : [];\n\n if (nodesToCopy.length === 0) return;\n\n // 复制每个节点,并向右下方偏移20px\n const newNodeIds: string[] = [];\n nodesToCopy.forEach((node) => {\n const newNode = {\n ...node,\n id: nanoid(),\n name: `${node.name}_副本`,\n normalStyle: {\n ...node.normalStyle,\n x: (node.normalStyle.x || 0) + 20,\n y: (node.normalStyle.y || 0) + 20,\n },\n };\n addNode(newNode);\n newNodeIds.push(newNode.id);\n });\n\n // 选中新复制的节点\n if (newNodeIds.length === 1) {\n selectNode(newNodeIds[0]);\n } else {\n setSelectedNodeIds(newNodeIds);\n }\n }, [selectedNodeId, selectedNodeIds, nodes, addNode, selectNode, setSelectedNodeIds]);\n\n // 组合选中的节点\n const handleGroupNodes = useCallback(() => {\n if (selectedNodeIds.length < 2) return;\n const selectedNodes: Node[] = [];\n for (let i = 0; i < selectedNodeIds.length; i++) {\n const id = selectedNodeIds[i];\n const node = nodes.find((n) => n.id === id);\n if (!node) continue;\n if (node?.type === \"group\") {\n //拆分放入\n const children = node.children;\n // 将子节点从相对坐标转换为绝对坐标\n children.forEach((child) => selectedNodes.push({\n ...child,\n normalStyle: {\n ...child.normalStyle,\n x: (node.normalStyle.x || 0) + (child.normalStyle.x || 0),\n y: (node.normalStyle.y || 0) + (child.normalStyle.y || 0),\n },\n }));\n // 删除群组节点\n removeNode(id);\n continue;\n }\n selectedNodes.push(node);\n }\n if (selectedNodes.length < 2) return;\n\n // 计算边界框\n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n\n selectedNodes.forEach((node) => {\n const x = node.normalStyle.x || 0;\n const y = node.normalStyle.y || 0;\n const w = node.normalStyle.width || 0;\n const h = node.normalStyle.height || 0;\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x + w);\n maxY = Math.max(maxY, y + h);\n });\n\n // 调整子节点位置为相对坐标\n const children = selectedNodes.map((node) => ({\n ...node,\n normalStyle: {\n ...node.normalStyle,\n x: (node.normalStyle.x || 0) - minX,\n y: (node.normalStyle.y || 0) - minY,\n },\n }));\n\n // 创建群组节点\n const groupNode: GroupNode = {\n id: nanoid(),\n name: `群组_${Date.now()}`,\n type: \"group\",\n normalStyle: {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n background: \"transparent\",\n },\n contentInfo: {\n statusList: [],\n currentStatusId: undefined,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n },\n children,\n };\n\n // 删除原子节点并添加群组节点\n selectedNodeIds.forEach((id) => removeNode(id));\n addNode(groupNode);\n setSelectedNodeIds([]);\n selectNode(groupNode.id);\n }, [selectedNodeIds, nodes, removeNode, addNode, selectNode]);\n\n // 解除组合\n const handleUngroupNodes = useCallback(() => {\n // 获取选中的群组节点\n const groupNodesToUngroup = selectedNodeIds.length > 0\n ? selectedNodeIds\n .map((id) => nodes.find((n) => n.id === id))\n .filter((n): n is GroupNode => !!n && n.type === \"group\")\n : selectedNodeId\n ? [nodes.find((n) => n.id === selectedNodeId)].filter((n): n is GroupNode => !!n && n.type === \"group\")\n : [];\n\n if (groupNodesToUngroup.length === 0) return;\n\n // 解除每个群组节点\n groupNodesToUngroup.forEach((groupNode) => {\n if (!groupNode.children || groupNode.children.length === 0) return;\n\n // 将子节点从相对坐标转换为绝对坐标\n const absoluteChildren = groupNode.children.map((child) => ({\n ...child,\n normalStyle: {\n ...child.normalStyle,\n x: (groupNode.normalStyle.x || 0) + (child.normalStyle.x || 0),\n y: (groupNode.normalStyle.y || 0) + (child.normalStyle.y || 0),\n },\n }));\n\n // 删除群组节点并添加子节点\n removeNode(groupNode.id);\n absoluteChildren.forEach((child) => addNode(child));\n });\n\n // 清空选中状态\n setSelectedNodeIds([]);\n selectNode(null);\n }, [selectedNodeId, selectedNodeIds, nodes, removeNode, addNode, selectNode, setSelectedNodeIds]);\n\n // 分布节点\n const handleDistributeNodes = useCallback(\n (direction: \"horizontal\" | \"vertical\") => {\n if (selectedNodeIds.length < 2) return;\n\n const selectedNodes = selectedNodeIds\n .map((id) => nodes.find((n) => n.id === id))\n .filter((n): n is Node => !!n && n.type !== \"group\");\n\n if (selectedNodes.length < 2) return;\n\n // 计算边界\n let minX = Infinity, maxX = -Infinity;\n let minY = Infinity, maxY = -Infinity;\n\n selectedNodes.forEach((node) => {\n const x = node.normalStyle.x || 0;\n const y = node.normalStyle.y || 0;\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n });\n\n // 按坐标排序,便于均匀分布\n const sortedNodes = [...selectedNodes].sort((a, b) => {\n if (direction === \"horizontal\") {\n return (a.normalStyle.x || 0) - (b.normalStyle.x || 0);\n } else {\n return (a.normalStyle.y || 0) - (b.normalStyle.y || 0);\n }\n });\n\n // 计算间隔\n const count = sortedNodes.length;\n if (direction === \"horizontal\") {\n const totalWidth = maxX - minX;\n const step = totalWidth / (count - 1);\n sortedNodes.forEach((node, index) => {\n const newX = minX + step * index;\n updateNode(node.id, {\n normalStyle: { ...node.normalStyle, x: newX },\n });\n });\n } else {\n const totalHeight = maxY - minY;\n const step = totalHeight / (count - 1);\n sortedNodes.forEach((node, index) => {\n const newY = minY + step * index;\n updateNode(node.id, {\n normalStyle: { ...node.normalStyle, y: newY },\n });\n });\n }\n },\n [selectedNodeIds, nodes, updateNode]\n );\n\n // 对齐节点\n const handleAlignNodes = useCallback(\n (direction: \"left\" | \"right\" | \"top\" | \"bottom\") => {\n if (selectedNodeIds.length < 2) return;\n const store = useEditorStore.getState();\n const selectedNodes = selectedNodeIds\n .map((id) => nodes.find((n) => n.id === id))\n .filter((n): n is Node => !!n) as Node[];\n if (selectedNodes.length < 2) return;\n\n let alignValue = 0;\n switch (direction) {\n case \"left\":\n alignValue = Math.min(...selectedNodes.map((n) => n.normalStyle.x || 0));\n break;\n case \"right\":\n alignValue = Math.max(\n ...selectedNodes.map((n) => (n.normalStyle.x || 0) + (n.normalStyle.width || 0))\n );\n break;\n case \"top\":\n alignValue = Math.min(...selectedNodes.map((n) => n.normalStyle.y || 0));\n break;\n case \"bottom\":\n alignValue = Math.max(\n ...selectedNodes.map((n) => (n.normalStyle.y || 0) + (n.normalStyle.height || 0))\n );\n break;\n }\n\n selectedNodes.forEach((node) => {\n let newX = node.normalStyle.x || 0;\n let newY = node.normalStyle.y || 0;\n switch (direction) {\n case \"left\":\n newX = alignValue;\n break;\n case \"right\":\n newX = alignValue - (node.normalStyle.width || 0);\n break;\n case \"top\":\n newY = alignValue;\n break;\n case \"bottom\":\n newY = alignValue - (node.normalStyle.height || 0);\n break;\n }\n store.updateNode(node.id, {\n normalStyle: { ...node.normalStyle, x: newX, y: newY },\n });\n });\n },\n [selectedNodeIds, nodes]\n );\n\n // 工具栏按钮\n const toolbarButtons = [\n {\n icon: <SelectOutlined />,\n title: \"选择模式\",\n active: mode === \"select\",\n onClick: () => {\n setMode(\"select\");\n },\n },\n {\n icon: <GroupOutlined />,\n title: \"框选模式\",\n active: mode === \"box-select\",\n onClick: () => {\n setMode(\"box-select\");\n setSelectedNodeIds([]);\n },\n },\n {\n icon: <DragOutlined />,\n title: \"拖拽模式\",\n active: mode === \"drag\",\n onClick: () => {\n setMode(\"drag\");\n },\n },\n {\n icon: <EditOutlined />,\n title: \"线条绘制\",\n active: mode === \"line-draw\",\n onClick: () => {\n setMode(\"line-draw\");\n },\n },\n {\n icon: <EyeOutlined />,\n title: \"预览模式\",\n active: mode === \"preview\",\n onClick: () => {\n setMode(\"preview\");\n },\n },\n ];\n\n const actionButtons = useMemo(\n () => [\n { icon: <UndoOutlined />, title: \"撤销 (Ctrl+Z)\", onClick: undo },\n { icon: <RedoOutlined />, title: \"重做 (Ctrl+Y)\", onClick: redo },\n {\n icon: <CopyOutlined />,\n title: \"复制节点\",\n disabled: !selectedNodeId && selectedNodeIds.length === 0,\n onClick: handleCopyNodes,\n },\n {\n icon: <GroupOutlined />,\n title: \"组合选中节点\",\n disabled: selectedNodeIds.length < 2,\n onClick: handleGroupNodes,\n },\n {\n icon: <UngroupOutlined />,\n title: \"解除组合\",\n disabled: !selectedNodeId && selectedNodeIds.length === 0,\n onClick: handleUngroupNodes,\n },\n {\n icon: <AlignLeftOutlined />,\n title: \"左对齐\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleAlignNodes(\"left\"),\n },\n {\n icon: <AlignRightOutlined />,\n title: \"右对齐\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleAlignNodes(\"right\"),\n },\n {\n icon: <VerticalAlignTopOutlined />,\n title: \"上对齐\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleAlignNodes(\"top\"),\n },\n {\n icon: <VerticalAlignBottomOutlined />,\n title: \"下对齐\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleAlignNodes(\"bottom\"),\n },\n {\n icon: <ColumnWidthOutlined />,\n title: \"水平分布\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleDistributeNodes(\"horizontal\"),\n },\n {\n icon: <ColumnHeightOutlined />,\n title: \"垂直分布\",\n disabled: selectedNodeIds.length < 2,\n onClick: () => handleDistributeNodes(\"vertical\"),\n },\n {\n icon: <SettingOutlined />,\n title: \"画布配置\",\n onClick: () => setCanvasConfigVisible(true),\n },\n {\n icon: <ExperimentOutlined />,\n title: \"数据模拟\",\n type: \"primary\" as const,\n onClick: () => setDataModalVisible(true),\n },\n {\n icon: <DeleteOutlined />,\n title: \"删除选中 (Delete)\",\n disabled: !selectedNodeId && selectedNodeIds.length === 0,\n onClick: () => {\n if (selectedNodeId) removeNode(selectedNodeId);\n else if (selectedNodeIds.length > 0) {\n selectedNodeIds.forEach((id) => removeNode(id));\n setSelectedNodeIds([]);\n }\n },\n },\n ],\n [\n undo,\n redo,\n mode,\n setMode,\n setSelectedNodeIds,\n selectedNodeIds,\n handleGroupNodes,\n handleUngroupNodes,\n handleCopyNodes,\n handleAlignNodes,\n handleDistributeNodes,\n setCanvasConfigVisible,\n setDataModalVisible,\n selectedNodeId,\n removeNode,\n ]\n );\n\n //框选模式下增加键盘监听平移\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n e.preventDefault();\n if (e.key === \"ArrowLeft\" || e.key === \"ArrowRight\" || e.key === \"ArrowUp\" || e.key === \"ArrowDown\") {\n const selectedNodes = selectedNodeIds.map((id) => nodes.find((n) => n.id === id));\n selectedNodes.forEach((node) => {\n if (node) {\n updateNode(node.id, {\n normalStyle: {\n ...node.normalStyle,\n x: (node.normalStyle.x || 0) - 2 * (e.key === \"ArrowLeft\" ? 1 : e.key === \"ArrowRight\" ? -1 : 0),\n y: (node.normalStyle.y || 0) - 2 * (e.key === \"ArrowUp\" ? 1 : e.key === \"ArrowDown\" ? -1 : 0),\n },\n });\n }\n });\n }\n },\n [selectedNodeIds, nodes, updateNode]\n );\n useEffect(() => {\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [handleKeyDown]);\n\n return (\n <div className=\"flex-1 flex flex-col h-full bg-gray-100\">\n {/* 工具栏 */}\n <div className=\"h-12 bg-white border-b border-gray-200 flex items-center justify-between px-4\">\n <Space>\n {toolbarButtons.map((btn) => (\n <Tooltip key={btn.title} title={btn.title}>\n <Button\n type={btn.active ? \"primary\" : \"default\"}\n icon={btn.icon}\n onClick={btn.onClick}\n />\n </Tooltip>\n ))}\n </Space>\n <Space>\n {actionButtons.map((btn) => (\n <Tooltip key={btn.title} title={btn.title}>\n <Button\n type={(btn as any).active ? \"primary\" : btn.type || \"default\"}\n icon={btn.icon}\n onClick={btn.onClick}\n disabled={btn.disabled}\n />\n </Tooltip>\n ))}\n </Space>\n </div>\n\n {/* 画布 */}\n <div ref={wrapperRef} className=\"flex-1 relative\">\n <TransformWrapper\n ref={transformRef}\n initialScale={1}\n initialPositionX={0}\n initialPositionY={0}\n minScale={0.5}\n maxScale={5}\n onTransformed={handleTransform}\n limitToBounds={false}\n centerZoomedOut={false}\n panning={{ disabled: !isSpacePressed && (mode === 'select' || mode === 'line-draw' || mode === 'box-select'), velocityDisabled: true }}\n wheel={{ disabled: false, step: 0.1 }}\n pinch={{ disabled: false }}\n doubleClick={{ disabled: true }}\n >\n {({ zoomIn, zoomOut, resetTransform }) => (\n <>\n {/* 缩放控制 */}\n <div className=\"absolute bottom-4 right-4 z-10 bg-white rounded-lg shadow-lg p-2\">\n <Space direction=\"vertical\">\n <Tooltip title=\"放大\">\n <Button icon={<ZoomInOutlined />} onClick={() => zoomIn()} />\n </Tooltip>\n <Tooltip title=\"缩小\">\n <Button icon={<ZoomOutOutlined />} onClick={() => zoomOut()} />\n </Tooltip>\n <Tooltip title=\"重置视图\">\n <Button onClick={() => resetTransform()}>100%</Button>\n </Tooltip>\n <div className=\"text-center text-xs text-gray-500\">\n {Math.round(viewport.scale * 100)}%\n </div>\n </Space>\n </div>\n\n <TransformComponent\n wrapperStyle={{ width: \"100%\", height: \"100%\", position: \"relative\" }}\n contentStyle={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <div\n ref={canvasRef}\n data-canvas=\"true\"\n className={`relative ${isDragOver ? \"ring-4 ring-blue-400 ring-opacity-50\" : \"\"\n } ${mode === \"line-draw\" ? \"cursor-crosshair\" : \"\"} ${isSpacePressed ? \"cursor-grab\" : \"\"}`}\n style={{\n width: canvas.width,\n height: canvas.height,\n flexShrink: 0,\n backgroundColor: canvas.background,\n backgroundImage: canvas.backgroundImage ? `url(${canvas.backgroundImage})` : undefined,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }}\n onClick={handleCanvasClick}\n onMouseDown={handleCanvasMouseDown}\n onDoubleClick={handleCanvasDoubleClick}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n >\n {/* 网格背景 */}\n {canvas.showGrid !== false && (\n <svg className=\"absolute top-0 left-0 pointer-events-none\" width={canvas.width} height={canvas.height}>\n <defs>\n <pattern id=\"grid\" width=\"20\" height=\"20\" patternUnits=\"userSpaceOnUse\">\n <path d=\"M 20 0 L 0 0 0 20\" fill=\"none\" stroke=\"#f0f0f0\" strokeWidth=\"1\" />\n </pattern>\n </defs>\n <rect width=\"100%\" height=\"100%\" fill=\"url(#grid)\" />\n </svg>\n )}\n\n {/* 节点 */}\n {nodes.map((node) => (\n <NodeRenderer\n key={`${node.id}`}\n node={node}\n isSelected={\n selectedNodeId === node.id || selectedNodeIds.includes(node.id)\n }\n data={defaultTestData}\n onClick={(e: React.MouseEvent) => {\n console.log('Node onClick:', node.id, 'mode:', modeRef.current);\n // 绘制模式下不触发节点选中\n if (modeRef.current === \"line-draw\") return;\n //假如点击时按着shift键\n if (e.shiftKey) {\n selectNode(node.id);\n setSelectedNodeIds([...selectedNodeIds, node.id]);\n } else {\n selectNode(node.id);\n setSelectedNodeIds([node.id]);\n }\n }}\n onMouseDown={(e) => handleNodeMouseDown(e, node)}\n onUpdateNode={(nodeId, updates) => updateNode(nodeId, updates)}\n scale={viewport.scale}\n />\n ))}\n\n {/* 线条预览 */}\n {mode === \"line-draw\" && linePreview.isDrawing && linePreview.start && linePreview.end && (\n <svg className=\"absolute top-0 left-0 pointer-events-none\" width={canvas.width} height={canvas.height}>\n <line\n x1={linePreview.start.x}\n y1={linePreview.start.y}\n x2={linePreview.end.x}\n y2={linePreview.end.y}\n stroke=\"#1890ff\"\n strokeWidth=\"2\"\n strokeDasharray=\"5,5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n\n {/* 框选框 */}\n {mode === 'box-select' && selectionBox.start && selectionBox.end && (\n <div\n className=\"absolute border-2 border-blue-500 bg-blue-500/10 pointer-events-none\"\n style={{\n left: Math.min(selectionBox.start.x, selectionBox.end.x),\n top: Math.min(selectionBox.start.y, selectionBox.end.y),\n width: Math.abs(selectionBox.end.x - selectionBox.start.x),\n height: Math.abs(selectionBox.end.y - selectionBox.start.y),\n zIndex: 9999,\n }}\n />\n )}\n </div>\n </TransformComponent>\n </>\n )}\n </TransformWrapper>\n </div>\n\n {/* 数据模拟弹窗 */}\n <Modal\n title=\"数据模拟\"\n open={dataModalVisible}\n onCancel={() => setDataModalVisible(false)}\n footer={null}\n >\n <Form layout=\"vertical\">\n <Form.Item label=\"测试数据 (JSON)\">\n <TextArea\n value={dataInput}\n onChange={(e) => setDataInput(e.target.value)}\n rows={10}\n placeholder=\"输入 JSON 格式的测试数据\"\n />\n </Form.Item>\n </Form>\n </Modal>\n\n {/* 画布配置弹窗 */}\n <Modal\n title=\"画布配置\"\n open={canvasConfigVisible}\n onCancel={() => setCanvasConfigVisible(false)}\n footer={null}\n >\n <Form layout=\"vertical\">\n <Form.Item label=\"宽度\">\n <InputNumber\n value={canvas.width}\n onChange={(v) => setCanvasConfig({ width: v || 1920 })}\n min={100}\n max={5000}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"高度\">\n <InputNumber\n value={canvas.height}\n onChange={(v) => setCanvasConfig({ height: v || 1080 })}\n min={100}\n max={5000}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"显示网格\">\n <Switch\n checked={canvas.showGrid !== false}\n onChange={(checked) => setCanvasConfig({ showGrid: checked })}\n />\n </Form.Item>\n <Form.Item label=\"背景色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={canvas.background || '#ffffff'}\n onChange={(color) => setCanvasConfig({ background: color.toHexString() })}\n />\n <Input\n value={canvas.background}\n onChange={(e) => setCanvasConfig({ background: e.target.value })}\n placeholder=\"#ffffff\"\n />\n </div>\n </Form.Item>\n <Form.Item label=\"背景图片\">\n <div className=\"flex items-center gap-2\">\n <Upload\n accept=\"image/*\"\n showUploadList={false}\n beforeUpload={(file) => {\n const isImage = file.type.startsWith('image/');\n if (!isImage) {\n message.error('只能上传图片文件!');\n return false;\n }\n const reader = new FileReader();\n reader.onload = (e) => {\n const base64 = e.target?.result as string;\n setCanvasConfig({ backgroundImage: base64 });\n message.success('背景图片上传成功');\n };\n reader.readAsDataURL(file);\n return false; // 阻止自动上传\n }}\n >\n <Button icon={<UploadOutlined />}>上传图片</Button>\n </Upload>\n <Input\n value={canvas.backgroundImage}\n onChange={(e) => setCanvasConfig({ backgroundImage: e.target.value })}\n placeholder=\"输入图片 URL 或上传图片\"\n style={{ flex: 1 }}\n />\n {canvas.backgroundImage && (\n <Button\n icon={<CloseOutlined />}\n onClick={() => setCanvasConfig({ backgroundImage: undefined })}\n danger\n size=\"small\"\n />\n )}\n </div>\n {canvas.backgroundImage && (\n <div className=\"mt-2 p-2 border rounded\" style={{ maxWidth: '100%' }}>\n <img\n src={canvas.backgroundImage}\n alt=\"背景预览\"\n style={{ maxWidth: '100%', maxHeight: 120, objectFit: 'contain' }}\n />\n </div>\n )}\n </Form.Item>\n </Form>\n </Modal>\n </div>\n );\n};\n\nexport default Canvas;\n","import React, { useEffect, useState } from \"react\";\nimport { Form, Input, InputNumber, Select, Divider, Space, Tag } from \"antd\";\nimport { ColorPicker } from '../../ColorPicker';\nimport type { Material, TextMaterial } from \"../../../types\";\nimport type { DataOption } from \"../types\";\n\nconst { Option } = Select;\n\ninterface TextMaterialEditorProps {\n material: Material;\n onSave: (updates: Partial<Material>) => void;\n bindCodes?: string[];\n dataOptions?: DataOption[];\n}\n\nexport const TextMaterialEditor: React.FC<TextMaterialEditorProps> = ({\n material,\n onSave,\n bindCodes = [],\n dataOptions = [],\n}) => {\n const textMaterial = material as TextMaterial;\n const content = textMaterial.content || {};\n\n const [formData, setFormData] = useState({\n label: content.label || \"\",\n value: content.value || \"\",\n valueSourceCode: content.valueSourceCode || \"\",\n unit: content.unit || \"\",\n decimals: content.decimals ?? 2,\n labelFontSize: content.labelStyle?.fontSize || 14,\n labelFontWeight: content.labelStyle?.fontWeight || \"bold\",\n labelColor: content.labelStyle?.color || \"#262626\",\n valueFontSize: content.valueStyle?.fontSize || 14,\n valueFontWeight: content.valueStyle?.fontWeight || \"normal\",\n valueColor: content.valueStyle?.color || \"#1890ff\",\n });\n\n useEffect(() => {\n setFormData({\n label: content.label || \"\",\n value: content.value || \"\",\n valueSourceCode: content.valueSourceCode || \"\",\n unit: content.unit || \"\",\n decimals: content.decimals ?? 2,\n labelFontSize: content.labelStyle?.fontSize || 14,\n labelFontWeight: content.labelStyle?.fontWeight || \"bold\",\n labelColor: content.labelStyle?.color || \"#262626\",\n valueFontSize: content.valueStyle?.fontSize || 14,\n valueFontWeight: content.valueStyle?.fontWeight || \"normal\",\n valueColor: content.valueStyle?.color || \"#1890ff\",\n });\n }, [material.id]);\n\n const handleChange = (field: string, value: unknown) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n };\n\n const handleValueSourceChange = (code: string) => {\n const selectedOption = dataOptions.find((opt) => opt.paramsCode === code);\n const autoUnit = selectedOption?.unit || \"\";\n\n setFormData((prev) => ({\n ...prev,\n valueSourceCode: code,\n unit: autoUnit,\n value: String(selectedOption?.value || \"\"),\n }));\n\n setTimeout(() => {\n onSave({\n content: {\n ...content,\n valueSourceCode: code,\n value: String(selectedOption?.value || \"\"),\n unit: autoUnit,\n },\n } as Partial<Material>);\n }, 0);\n };\n\n const handleSave = () => {\n onSave({\n content: {\n ...content,\n label: formData.label,\n value: formData.value,\n valueSourceCode: formData.valueSourceCode,\n unit: formData.unit,\n decimals: formData.decimals,\n labelStyle: {\n fontSize: formData.labelFontSize,\n fontWeight: formData.labelFontWeight,\n color: formData.labelColor,\n },\n valueStyle: {\n fontSize: formData.valueFontSize,\n fontWeight: formData.valueFontWeight,\n color: formData.valueColor,\n },\n },\n } as Partial<Material>);\n };\n\n const boundDataOptions = dataOptions.filter((opt) =>\n bindCodes.includes(opt.paramsCode),\n );\n\n return (\n <div className=\"space-y-4\">\n <Divider style={{ marginTop: 0 }}>文本内容</Divider>\n\n <Form layout=\"vertical\">\n <Form.Item label=\"标签文本 (label)\">\n <Input\n value={formData.label}\n onChange={(e) => handleChange(\"label\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"输入标签文本\"\n />\n </Form.Item>\n\n <Form.Item\n label=\"值来源\"\n help=\"从绑定的数据中选择字段,优先级高于手动输入的值\">\n <Select\n value={formData.valueSourceCode || undefined}\n onChange={handleValueSourceChange}\n placeholder=\"选择数据字段(可选)\"\n allowClear\n style={{ width: \"100%\" }}\n fieldNames={{\n value: \"paramsCode\",\n label: \"paramsName\",\n }}\n options={boundDataOptions}\n />\n </Form.Item>\n\n <Form.Item\n label={formData.valueSourceCode ? \"默认值(备用)\" : \"值文本\"}\n help={\n formData.valueSourceCode\n ? \"已绑定数据源,实际值将来自数据字段,此处仅设置无数据时的备用显示\"\n : \"手动输入显示的值\"\n }>\n <Input\n value={formData.value}\n onChange={(e) => handleChange(\"value\", e.target.value)}\n onBlur={handleSave}\n placeholder={\n formData.valueSourceCode\n ? \"数据字段无值时显示此备用值\"\n : \"输入值文本\"\n }\n disabled={!!formData.valueSourceCode}\n variant={formData.valueSourceCode ? \"filled\" : undefined}\n />\n </Form.Item>\n\n <Form.Item label=\"单位\" help=\"优先从绑定数据自动获取,也可手动输入\">\n <Input\n value={formData.unit}\n onChange={(e) => handleChange(\"unit\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"单位(如°C、%、MPa等)\"\n suffix={\n formData.valueSourceCode && boundDataOptions.length > 0 ? (\n <Tag color=\"blue\" style={{ marginRight: -8 }}>\n 自动\n </Tag>\n ) : null\n }\n />\n </Form.Item>\n\n <Form.Item\n label=\"保留小数位\"\n help=\"数值格式化时保留的小数位数,-1表示不格式化\">\n <InputNumber\n value={formData.decimals}\n onChange={(v) => handleChange(\"decimals\", v ?? 2)}\n onBlur={handleSave}\n min={-1}\n max={10}\n style={{ width: \"100%\" }}\n />\n </Form.Item>\n </Form>\n\n <Divider>标签样式</Divider>\n\n <Form layout=\"vertical\">\n <Space>\n <Form.Item label=\"字体大小\">\n <InputNumber\n value={formData.labelFontSize}\n onChange={(v) => handleChange(\"labelFontSize\", v || 14)}\n onBlur={handleSave}\n min={8}\n max={72}\n />\n </Form.Item>\n\n <Form.Item label=\"字体粗细\">\n <Select\n value={formData.labelFontWeight}\n onChange={(v) => {\n handleChange(\"labelFontWeight\", v);\n setTimeout(handleSave, 0);\n }}\n style={{ width: 100 }}>\n <Option value=\"normal\">正常</Option>\n <Option value=\"bold\">粗体</Option>\n </Select>\n </Form.Item>\n </Space>\n\n <Form.Item label=\"文字颜色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.labelColor || '#262626'}\n onChange={(color) => {\n handleChange(\"labelColor\", color.toHexString());\n }}\n onChangeComplete={(color) => {\n onSave({\n content: {\n ...content,\n label: formData.label,\n value: formData.value,\n valueSourceCode: formData.valueSourceCode,\n unit: formData.unit,\n decimals: formData.decimals,\n labelStyle: {\n fontSize: formData.labelFontSize,\n fontWeight: formData.labelFontWeight,\n color: color.toHexString(),\n },\n valueStyle: {\n fontSize: formData.valueFontSize,\n fontWeight: formData.valueFontWeight,\n color: formData.valueColor,\n },\n },\n } as Partial<Material>);\n }}\n />\n <Input\n value={formData.labelColor}\n onChange={(e) => handleChange(\"labelColor\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"#262626\"\n style={{ width: 100 }}\n />\n </div>\n </Form.Item>\n </Form>\n\n <Divider>值样式</Divider>\n\n <Form layout=\"vertical\">\n <Space>\n <Form.Item label=\"字体大小\">\n <InputNumber\n value={formData.valueFontSize}\n onChange={(v) => handleChange(\"valueFontSize\", v || 14)}\n onBlur={handleSave}\n min={8}\n max={72}\n />\n </Form.Item>\n\n <Form.Item label=\"字体粗细\">\n <Select\n value={formData.valueFontWeight}\n onChange={(v) => {\n handleChange(\"valueFontWeight\", v);\n setTimeout(handleSave, 0);\n }}\n style={{ width: 100 }}>\n <Option value=\"normal\">正常</Option>\n <Option value=\"bold\">粗体</Option>\n </Select>\n </Form.Item>\n </Space>\n\n <Form.Item label=\"文字颜色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.valueColor || '#1890ff'}\n onChange={(color) => {\n handleChange(\"valueColor\", color.toHexString());\n }}\n onChangeComplete={(color) => {\n onSave({\n content: {\n ...content,\n label: formData.label,\n value: formData.value,\n valueSourceCode: formData.valueSourceCode,\n unit: formData.unit,\n decimals: formData.decimals,\n labelStyle: {\n fontSize: formData.labelFontSize,\n fontWeight: formData.labelFontWeight,\n color: formData.labelColor,\n },\n valueStyle: {\n fontSize: formData.valueFontSize,\n fontWeight: formData.valueFontWeight,\n color: color.toHexString(),\n },\n },\n } as Partial<Material>);\n }}\n />\n <Input\n value={formData.valueColor}\n onChange={(e) => handleChange(\"valueColor\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"#1890ff\"\n style={{ width: 100 }}\n />\n </div>\n </Form.Item>\n </Form>\n </div>\n );\n};\n\nexport default TextMaterialEditor;\n","import React, { useEffect, useState } from \"react\";\nimport { Form, Input, Divider } from \"antd\";\nimport { ColorPicker } from '../../ColorPicker';\nimport type { Material, ImageMaterial } from \"../../../types\";\n\ninterface ImageMaterialEditorProps {\n material: Material;\n onSave: (updates: Partial<Material>) => void;\n}\n\nexport const ImageMaterialEditor: React.FC<ImageMaterialEditorProps> = ({\n material,\n onSave,\n}) => {\n const imageMaterial = material as ImageMaterial;\n\n const [formData, setFormData] = useState({\n name: material.name,\n src: imageMaterial.src || \"\",\n backgroundColor: imageMaterial.backgroundColor || \"\",\n fillColor: imageMaterial.fillColor || \"\",\n });\n\n useEffect(() => {\n setFormData({\n name: material.name,\n src: imageMaterial.src || \"\",\n backgroundColor: imageMaterial.backgroundColor || \"\",\n fillColor: imageMaterial.fillColor || \"\",\n });\n }, [material.id]);\n\n const handleChange = (field: string, value: string) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n };\n\n const handleSave = () => {\n onSave({\n name: formData.name,\n src: formData.src,\n backgroundColor: formData.backgroundColor,\n } as Partial<Material>);\n };\n\n return (\n <div className=\"space-y-4\">\n <Divider style={{ marginTop: 0 }}>图片属性</Divider>\n\n <Form layout=\"vertical\">\n <Form.Item label=\"图片名称\">\n <Input\n value={formData.name}\n onChange={(e) => handleChange(\"name\", e.target.value)}\n onBlur={handleSave}\n />\n </Form.Item>\n\n <Form.Item label=\"图片地址 (src)\">\n <Input.TextArea\n value={formData.src}\n onChange={(e) => handleChange(\"src\", e.target.value)}\n onBlur={handleSave}\n rows={4}\n placeholder=\"输入图片 URL 或 Data URI\"\n />\n </Form.Item>\n\n <Form.Item label=\"填充颜色(基本形状)\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.fillColor || '#1890ff'}\n onChange={(color) => {\n const newColor = color.toHexString();\n handleChange(\"fillColor\", newColor);\n // 立即保存到 store\n onSave({\n name: formData.name,\n src: formData.src,\n backgroundColor: formData.backgroundColor,\n fillColor: newColor,\n } as Partial<Material>);\n }}\n />\n <Input\n value={formData.fillColor}\n onChange={(e) => handleChange(\"fillColor\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"#1890ff\"\n />\n </div>\n </Form.Item>\n\n <Form.Item label=\"背景颜色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.backgroundColor || '#1890ff'}\n onChange={(color) => {\n const newColor = color.toHexString();\n handleChange(\"backgroundColor\", newColor);\n // 立即保存到 store\n onSave({\n name: formData.name,\n src: formData.src,\n backgroundColor: newColor,\n fillColor: formData.fillColor,\n } as Partial<Material>);\n }}\n />\n <Input\n value={formData.backgroundColor}\n onChange={(e) => handleChange(\"backgroundColor\", e.target.value)}\n onBlur={handleSave}\n placeholder=\"#1890ff\"\n />\n </div>\n </Form.Item>\n </Form>\n </div>\n );\n};\n\nexport default ImageMaterialEditor;\n","import React, { useEffect, useState } from \"react\";\nimport { Form, InputNumber, Select, Divider, Button, Space, Input } from \"antd\";\nimport { ColorPicker } from '../../ColorPicker';\nimport type { Material, LineMaterial } from \"../../../types\";\n\nconst { Option } = Select;\n\ninterface LineMaterialEditorProps {\n material: Material;\n onSave: (updates: Partial<Material>) => void;\n}\n\nexport const LineMaterialEditor: React.FC<LineMaterialEditorProps> = ({\n material,\n onSave,\n}) => {\n const lineConfig = (material as LineMaterial).config || {};\n\n const [formData, setFormData] = useState({\n lineWeight: lineConfig.lineWeight || lineConfig.thickness || 2,\n color: lineConfig.color || \"#262626\",\n lineType: lineConfig.lineType || \"solid\",\n startX: lineConfig.startX ?? 0,\n startY: lineConfig.startY ?? 0,\n endX: lineConfig.endX ?? 100,\n endY: lineConfig.endY ?? 0,\n });\n\n useEffect(() => {\n setFormData({\n lineWeight: lineConfig.lineWeight || lineConfig.thickness || 2,\n color: lineConfig.color || \"#262626\",\n lineType: lineConfig.lineType || \"solid\",\n startX: lineConfig.startX ?? 0,\n startY: lineConfig.startY ?? 0,\n endX: lineConfig.endX ?? 100,\n endY: lineConfig.endY ?? 0,\n });\n }, [material.id]);\n\n const handleSaveWithValues = (newValues: Partial<typeof formData>) => {\n const newFormData = { ...formData, ...newValues };\n setFormData(newFormData);\n \n onSave({\n config: {\n ...lineConfig,\n thickness: newFormData.lineWeight,\n lineWeight: newFormData.lineWeight,\n color: newFormData.color,\n lineType: newFormData.lineType,\n startX: newFormData.startX,\n startY: newFormData.startY,\n endX: newFormData.endX,\n endY: newFormData.endY,\n },\n } as Partial<Material>);\n };\n\n const lineTypeOptions = [\n { value: \"solid\", label: \"实线\", desc: \"连续实线\" },\n { value: \"dashed\", label: \"虚线\", desc: \"长划间隔\" },\n { value: \"center\", label: \"点画线(中心线)\", desc: \"长点-短点交替\" },\n { value: \"phantom\", label: \"假想线\", desc: \"长划-双点交替\" },\n { value: \"dot\", label: \"点线\", desc: \"密集点状\" },\n { value: \"dash-dot\", label: \"画点线\", desc: \"长划-点交替\" },\n ];\n\n return (\n <div className=\"space-y-4\">\n <Divider style={{ marginTop: 0 }}>起止位置(相对节点)</Divider>\n \n <Form layout=\"vertical\">\n <div className=\"grid grid-cols-2 gap-2\">\n <Form.Item label=\"起点 X\" className=\"mb-2\">\n <InputNumber\n value={formData.startX}\n onChange={(v) => handleSaveWithValues({ startX: v ?? 0 })}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"起点 Y\" className=\"mb-2\">\n <InputNumber\n value={formData.startY}\n onChange={(v) => handleSaveWithValues({ startY: v ?? 0 })}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"终点 X\" className=\"mb-2\">\n <InputNumber\n value={formData.endX}\n onChange={(v) => handleSaveWithValues({ endX: v ?? 100 })}\n style={{ width: '100%' }}\n />\n </Form.Item>\n <Form.Item label=\"终点 Y\" className=\"mb-2\">\n <InputNumber\n value={formData.endY}\n onChange={(v) => handleSaveWithValues({ endY: v ?? 0 })}\n style={{ width: '100%' }}\n />\n </Form.Item>\n </div>\n \n <Form.Item label=\"快速对齐\" className=\"mt-4\">\n <Space>\n <Button \n size=\"small\" \n onClick={() => {\n // 使用 lineConfig 中的最新值,确保同步\n const currentStartY = lineConfig.startY ?? formData.startY;\n handleSaveWithValues({ endY: currentStartY });\n }}\n title=\"将线条变为水平线\">\n 水平\n </Button>\n <Button \n size=\"small\" \n onClick={() => {\n // 使用 lineConfig 中的最新值,确保同步\n const currentStartX = lineConfig.startX ?? formData.startX;\n handleSaveWithValues({ endX: currentStartX });\n }}\n title=\"将线条变为垂直线\">\n 垂直\n </Button>\n <Button \n size=\"small\"\n onClick={() => {\n // 使用 lineConfig 中的最新值,确保同步\n const currentStartX = lineConfig.startX ?? formData.startX;\n const currentStartY = lineConfig.startY ?? formData.startY;\n const currentEndX = lineConfig.endX ?? formData.endX;\n const currentEndY = lineConfig.endY ?? formData.endY;\n handleSaveWithValues({ \n startX: currentEndX,\n startY: currentEndY,\n endX: currentStartX,\n endY: currentStartY,\n });\n }}\n title=\"交换起点和终点\">\n 反向\n </Button>\n </Space>\n </Form.Item>\n </Form>\n\n <Divider>线条属性</Divider>\n\n <Form layout=\"vertical\">\n <Form.Item label=\"线型\" help=\"选择线条样式\">\n <Select\n value={formData.lineType}\n onChange={(v) => handleSaveWithValues({ lineType: v })}>\n {lineTypeOptions.map((opt) => (\n <Option key={opt.value} value={opt.value}>\n <div className=\"flex flex-col\">\n <span>{opt.label}</span>\n <span className=\"text-xs text-gray-400\">{opt.desc}</span>\n </div>\n </Option>\n ))}\n </Select>\n </Form.Item>\n\n <Form.Item label=\"线宽(像素)\">\n <InputNumber\n value={formData.lineWeight}\n onChange={(v) => handleSaveWithValues({ lineWeight: v || 2 })}\n min={1}\n max={20}\n style={{ width: 120 }}\n />\n </Form.Item>\n\n <Form.Item label=\"颜色\">\n <div className=\"flex items-center gap-2\">\n <ColorPicker\n value={formData.color || '#d9d9d9'}\n onChange={(color) => handleSaveWithValues({ color: color.toHexString() })}\n />\n <Input\n value={formData.color}\n onChange={(e) => handleSaveWithValues({ color: e.target.value })}\n placeholder=\"#d9d9d9\"\n style={{ width: 100 }}\n />\n </div>\n </Form.Item>\n </Form>\n </div>\n );\n};\n\nexport default LineMaterialEditor;\n","import React from \"react\";\nimport { TextMaterialEditor } from \"./TextMaterialEditor\";\nimport { ImageMaterialEditor } from \"./ImageMaterialEditor\";\nimport { LineMaterialEditor } from \"./LineMaterialEditor\";\nimport type { Material } from \"../../../types\";\nimport type { DataOption } from \"../types\";\n\ninterface MaterialPropertyEditorProps {\n material: Material;\n onSave: (updates: Partial<Material>) => void;\n bindCodes?: string[];\n dataOptions?: DataOption[];\n}\n\nexport const MaterialPropertyEditor: React.FC<MaterialPropertyEditorProps> = ({\n material,\n onSave,\n bindCodes,\n dataOptions,\n}) => {\n switch (material.type) {\n case \"TEXT\":\n return (\n <TextMaterialEditor\n material={material}\n onSave={onSave}\n bindCodes={bindCodes}\n dataOptions={dataOptions}\n />\n );\n case \"IMAGE\":\n return <ImageMaterialEditor material={material} onSave={onSave} />;\n case \"LINE\":\n return <LineMaterialEditor material={material} onSave={onSave} />;\n default:\n return (\n <div className=\"text-center text-gray-400 py-8\">\n 暂不支持编辑此类型的物料\n </div>\n );\n }\n};\n\nexport default MaterialPropertyEditor;\n","import React from \"react\";\nimport { Collapse, Button, Form, Input, Select, Tag, Space, Divider } from \"antd\";\nimport { PlusOutlined, DeleteOutlined, ArrowUpOutlined, ArrowDownOutlined } from \"@ant-design/icons\";\nimport { nanoid } from \"nanoid\";\nimport type { Material, NodeStatus, Node, GroupNode } from \"../../../types\";\nimport type { DataOption } from \"../types\";\nimport { MaterialPropertyEditor } from \"./MaterialPropertyEditor\";\n\nconst { Panel } = Collapse;\nconst { TextArea } = Input;\n\ninterface GroupNodeStatusEditorProps {\n node: GroupNode;\n updateNode: (nodeId: string, updates: Partial<Node>) => void;\n materials: Material[];\n bindCodes?: string[];\n dataOptions?: DataOption[];\n}\n\nexport const GroupNodeStatusEditor: React.FC<GroupNodeStatusEditorProps> = ({\n node,\n updateNode,\n materials,\n}) => {\n // 获取可用的物料列表(排除群组类型)\n const availableMaterials = materials.filter(m => m.type !== 'CUSTOM' || !m.config?.nodes);\n\n // 更新子节点的状态列表\n const handleUpdateChildStatusList = (childId: string, newStatusList: NodeStatus[]) => {\n const newChildren = node.children?.map(child => {\n if (child.id === childId) {\n return {\n ...child,\n contentInfo: {\n ...child.contentInfo,\n statusList: newStatusList,\n },\n };\n }\n return child;\n });\n\n updateNode(node.id, {\n children: newChildren,\n } as Partial<Node>);\n };\n\n // 添加状态到子节点\n const handleAddChildStatus = (childId: string) => {\n const child = node.children?.find(c => c.id === childId);\n if (!child) return;\n\n const newStatus: NodeStatus = {\n id: nanoid(),\n name: `状态${child.contentInfo.statusList.length + 1}`,\n expression: child.contentInfo.statusList.length === 0 ? 'return true;' : 'return false;',\n material: { ...availableMaterials[0], id: nanoid() } as Material,\n bindCodes: [],\n };\n\n handleUpdateChildStatusList(childId, [...child.contentInfo.statusList, newStatus]);\n };\n\n // 删除子节点的状态\n const handleDeleteChildStatus = (childId: string, statusId: string) => {\n const child = node.children?.find(c => c.id === childId);\n if (!child) return;\n\n const newStatusList = child.contentInfo.statusList.filter(s => s.id !== statusId);\n handleUpdateChildStatusList(childId, newStatusList);\n };\n\n // 更新子节点的某个状态\n const handleUpdateChildStatus = (childId: string, statusId: string, updates: Partial<NodeStatus>) => {\n const child = node.children?.find(c => c.id === childId);\n if (!child) return;\n\n const newStatusList = child.contentInfo.statusList.map(s => {\n if (s.id === statusId) {\n return { ...s, ...updates } as NodeStatus;\n }\n return s;\n });\n\n handleUpdateChildStatusList(childId, newStatusList);\n };\n\n // 移动子节点状态\n const handleMoveChildStatus = (childId: string, statusId: string, direction: 'up' | 'down') => {\n const child = node.children?.find(c => c.id === childId);\n if (!child) return;\n\n const index = child.contentInfo.statusList.findIndex(s => s.id === statusId);\n if (index === -1) return;\n\n const newStatusList = [...child.contentInfo.statusList];\n if (direction === 'up' && index > 0) {\n [newStatusList[index], newStatusList[index - 1]] = [newStatusList[index - 1], newStatusList[index]];\n } else if (direction === 'down' && index < newStatusList.length - 1) {\n [newStatusList[index], newStatusList[index + 1]] = [newStatusList[index + 1], newStatusList[index]];\n }\n\n handleUpdateChildStatusList(childId, newStatusList);\n };\n\n // 更换子节点状态的物料\n const handleChangeChildStatusMaterial = (childId: string, statusId: string, materialId: string) => {\n const selectedMaterial = materials.find(m => m.id === materialId);\n if (!selectedMaterial) return;\n\n handleUpdateChildStatus(childId, statusId, {\n material: { ...selectedMaterial, id: nanoid() },\n });\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"p-3 bg-blue-50 border border-blue-200 rounded-lg mb-4\">\n <div className=\"text-sm text-blue-700\">\n <strong>群组节点</strong>:为每个子节点配置多个状态和绑定\n </div>\n </div>\n\n <Collapse ghost>\n {node.children?.map((child, childIndex) => (\n <Panel\n key={child.id}\n header={\n <div className=\"flex items-center justify-between w-full pr-4\">\n <span className=\"font-medium text-sm\">子节点 {childIndex + 1}</span>\n <Tag color=\"blue\" style={{ fontSize: '12px', padding: '0 4px' }}>\n {child.contentInfo.statusList.length} 个状态\n </Tag>\n </div>\n }>\n <div className=\"space-y-3\">\n {/* 添加状态按钮 */}\n <div className=\"flex justify-between items-center mb-3\">\n <span className=\"text-sm text-gray-600\">状态列表</span>\n <Button\n type=\"primary\"\n size=\"small\"\n icon={<PlusOutlined />}\n onClick={() => handleAddChildStatus(child.id)}\n >\n 添加状态\n </Button>\n </div>\n\n {child.contentInfo.statusList.length === 0 ? (\n <div className=\"text-center text-gray-400 py-4 bg-gray-50 rounded-lg\">\n 暂无状态,点击上方按钮添加\n </div>\n ) : (\n <Collapse ghost>\n {child.contentInfo.statusList.map((status, statusIndex) => (\n <Panel\n key={status.id}\n header={\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-gray-400 w-5\">{statusIndex + 1}</span>\n <span className=\"font-medium\">{status.name}</span>\n <Tag color=\"default\" className=\"text-xs\">{status.material.type}</Tag>\n </div>\n }\n extra={\n <Space size=\"small\" onClick={(e) => e.stopPropagation()}>\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ArrowUpOutlined />}\n disabled={statusIndex === 0}\n onClick={(e) => {\n e.stopPropagation();\n handleMoveChildStatus(child.id, status.id, 'up');\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ArrowDownOutlined />}\n disabled={statusIndex === child.contentInfo.statusList.length - 1}\n onClick={(e) => {\n e.stopPropagation();\n handleMoveChildStatus(child.id, status.id, 'down');\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n danger\n icon={<DeleteOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n handleDeleteChildStatus(child.id, status.id);\n }}\n />\n </Space>\n }\n >\n <Form layout=\"vertical\">\n {/* 状态名称 */}\n <Form.Item label=\"状态名称\">\n <Input\n value={status.name}\n onChange={(e) => handleUpdateChildStatus(child.id, status.id, { name: e.target.value })}\n placeholder=\"输入状态名称\"\n />\n </Form.Item>\n\n {/* 执行表达式 */}\n <Form.Item\n label=\"执行表达式\"\n help=\"返回 true 时激活此状态,可使用 data 变量访问绑定数据\"\n >\n <TextArea\n value={status.expression}\n onChange={(e) => handleUpdateChildStatus(child.id, status.id, { expression: e.target.value })}\n rows={3}\n placeholder=\"return true;\"\n />\n </Form.Item>\n\n {/* 绑定数据源 */}\n <Form.Item label=\"绑定数据源 (bindCodes)\">\n <Select\n mode=\"tags\"\n value={status.bindCodes || []}\n onChange={(value) => handleUpdateChildStatus(child.id, status.id, { bindCodes: value })}\n placeholder=\"输入数据源 code\"\n tokenSeparators={[\",\", \" \"]}\n />\n </Form.Item>\n\n {/* 更换物料 */}\n <Form.Item label=\"更换物料\">\n <div className=\"flex items-center gap-2\">\n <Tag color=\"blue\">{status.material.name}</Tag>\n <Tag color=\"default\">{status.material.type}</Tag>\n <Select\n placeholder=\"选择新物料\"\n style={{ width: 150 }}\n value={undefined}\n onChange={(value) => value && handleChangeChildStatusMaterial(child.id, status.id, value)}\n options={availableMaterials.map(m => ({\n value: m.id,\n label: `${m.name} (${m.type})`,\n }))}\n />\n </div>\n </Form.Item>\n\n {/* 物料属性编辑 */}\n <Divider style={{ margin: '12px 0' }} />\n <div className=\"bg-gray-50 rounded-lg p-3 border border-gray-200\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium\">物料属性</span>\n <Tag>{status.material.name}</Tag>\n </div>\n <MaterialPropertyEditor\n material={status.material}\n onSave={(updates) => {\n const newMaterial = { ...status.material, ...updates } as Material;\n handleUpdateChildStatus(child.id, status.id, { material: newMaterial });\n }}\n />\n </div>\n </Form>\n </Panel>\n ))}\n </Collapse>\n )}\n </div>\n </Panel>\n ))}\n </Collapse>\n </div>\n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport {\n Form,\n Input,\n InputNumber,\n Select,\n Switch,\n Collapse,\n Button,\n Empty,\n Tabs,\n Space,\n Tag,\n Modal,\n Divider,\n} from \"antd\";\nimport {\n PlusOutlined,\n DeleteOutlined,\n ArrowUpOutlined,\n ArrowDownOutlined,\n CopyOutlined,\n EditOutlined,\n} from \"@ant-design/icons\";\nimport { useEditorStore } from \"../../store/editorStore\";\nimport type { Material, NodeStatus, Node } from \"../../types\";\nimport { nanoid } from \"nanoid\";\nimport { MaterialPropertyEditor, GroupNodeStatusEditor } from \"./editors\";\nimport type { DataOption } from \"./types\";\n\nconst { Panel } = Collapse;\nconst { TabPane } = Tabs;\nconst { TextArea } = Input;\n\ninterface PropertyPanelProps {\n defaultTestData?: DataOption[];\n}\n\nexport const PropertyPanel: React.FC<PropertyPanelProps> = ({\n defaultTestData,\n}) => {\n const {\n nodes,\n selectedNodeId,\n updateNode,\n updateNodeStyle,\n updateNodeControl,\n updateNodeContent,\n materials,\n selectedStatusId,\n selectStatus,\n } = useEditorStore();\n\n const [form] = Form.useForm();\n const [activeTab, setActiveTab] = useState(\"basic\");\n const [materialModalVisible, setMaterialModalVisible] = useState(false);\n const [editingStatusId, setEditingStatusId] = useState<string | null>(null);\n const [editingExpressions, setEditingExpressions] = useState<\n Record<string, string>\n >({});\n\n const selectedNode = React.useMemo(() => {\n return nodes.find((n) => n.id === selectedNodeId);\n }, [nodes, selectedNodeId]);\n\n const currentStatusList = selectedNode?.contentInfo.statusList || [];\n\n const handleValuesChange = (changedValues: Record<string, unknown>) => {\n if (!selectedNodeId) return;\n\n if (changedValues.normalStyle) {\n updateNodeStyle(selectedNodeId, changedValues.normalStyle as Record<string, unknown>);\n }\n\n if (changedValues.name !== undefined) {\n updateNode(selectedNodeId, { name: changedValues.name as string });\n }\n\n if (changedValues.controlInfo) {\n updateNodeControl(selectedNodeId, changedValues.controlInfo as Record<string, unknown>);\n }\n };\n console.log(selectedNodeId, 'selectedNodeId', selectedNode);\n\n useEffect(() => {\n if (!selectedNode) return;\n\n if (selectedNode) {\n form.setFieldsValue({\n name: selectedNode.name,\n normalStyle: {\n width: 100,\n height: 100,\n x: 0,\n y: 0,\n padding: 8,\n background: \"transparent\",\n borderRadius: 0,\n opacity: 1,\n ...selectedNode.normalStyle,\n },\n controlInfo: {\n isDraggable: true,\n isClickable: true,\n isResizable: true,\n isSelectable: true,\n ...selectedNode.controlInfo,\n },\n });\n selectStatus(null);\n }\n }, [selectedNode, selectStatus, form]);\n\n const handleAddStatus = () => {\n if (!selectedNodeId || !selectedNode) return;\n setEditingStatusId(\"new\");\n setMaterialModalVisible(true);\n };\n\n const handleSelectMaterialForStatus = (material: Material) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatus: NodeStatus = {\n id: nanoid(),\n name: `${material.name}_状态${currentStatusList.length + 1}`,\n expression: currentStatusList.length === 0 ? \"return true;\" : \"return false;\",\n material: { ...material, id: nanoid() },\n bindCodes: [],\n };\n\n if (editingStatusId === \"new\") {\n const newStatusList = [...currentStatusList, newStatus];\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n } else if (editingStatusId) {\n const newStatusList = currentStatusList.map((s) => {\n if (s.id === editingStatusId) {\n return { ...s, material: { ...material, id: nanoid() } };\n }\n return s;\n });\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n }\n\n setMaterialModalVisible(false);\n setEditingStatusId(null);\n };\n\n const handleDeleteStatus = (statusId: string) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatusList =\n selectedNode.contentInfo.statusList?.filter((s) => s.id !== statusId) || [];\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n\n if (selectedStatusId === statusId) {\n selectStatus(null);\n }\n };\n\n const handleUpdateStatus = (statusId: string, updates: Partial<NodeStatus>) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatusList =\n selectedNode.contentInfo.statusList?.map((s) => {\n if (s.id === statusId) {\n return { ...s, ...updates };\n }\n return s;\n }) || [];\n\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n };\n\n const handleCopyStatus = (status: NodeStatus) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatus: NodeStatus = {\n ...status,\n id: nanoid(),\n name: `${status.name}_复制`,\n expression: \"return false;\",\n };\n\n const newStatusList = [...currentStatusList, newStatus];\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n };\n\n const handleMoveStatus = (statusId: string, direction: \"up\" | \"down\") => {\n if (!selectedNodeId || !selectedNode) return;\n\n const index = currentStatusList.findIndex((s) => s.id === statusId);\n if (index === -1) return;\n\n const newStatusList = [...currentStatusList];\n if (direction === \"up\" && index > 0) {\n [newStatusList[index], newStatusList[index - 1]] = [\n newStatusList[index - 1],\n newStatusList[index],\n ];\n } else if (direction === \"down\" && index < newStatusList.length - 1) {\n [newStatusList[index], newStatusList[index + 1]] = [\n newStatusList[index + 1],\n newStatusList[index],\n ];\n }\n\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n };\n\n const handleChangeStatusMaterial = (statusId: string) => {\n setEditingStatusId(statusId);\n setMaterialModalVisible(true);\n };\n\n const handleUpdateStatusMaterial = (statusId: string, updates: Partial<Material>) => {\n if (!selectedNodeId || !selectedNode) return;\n\n const newStatusList = currentStatusList.map((s) => {\n if (s.id === statusId) {\n return {\n ...s,\n material: { ...s.material, ...updates } as Material,\n };\n }\n return s;\n });\n\n updateNodeContent(selectedNodeId, { statusList: newStatusList });\n };\n\n if (!selectedNode) {\n return (\n <div className=\"h-full flex items-center justify-center bg-white border-l border-gray-200\">\n <Empty description=\"请选择一个节点\" />\n </div>\n );\n }\n\n return (\n <div className=\"h-full flex flex-col bg-white border-l border-gray-200\">\n <div className=\"p-4 border-b border-gray-200\">\n <h3 className=\"text-lg font-semibold text-gray-800\">属性面板</h3>\n <p className=\"text-sm text-gray-500\">编辑选中节点的属性</p>\n </div>\n\n <div className=\"flex-1 overflow-y-auto p-4\">\n <Tabs activeKey={activeTab} onChange={setActiveTab}>\n <TabPane tab=\"基础\" key=\"basic\">\n <Form\n form={form}\n layout=\"vertical\"\n onValuesChange={handleValuesChange}\n initialValues={{ name: selectedNode.name }}\n >\n <Form.Item label=\"节点名称\" name=\"name\">\n <Input placeholder=\"输入节点名称\" />\n </Form.Item>\n\n <Collapse ghost defaultActiveKey={[\"position\", \"size\", \"style\"]}>\n <Panel header=\"位置\" key=\"position\">\n <Space>\n <Form.Item label=\"X\" name={[\"normalStyle\", \"x\"]}>\n <InputNumber />\n </Form.Item>\n <Form.Item label=\"Y\" name={[\"normalStyle\", \"y\"]}>\n <InputNumber />\n </Form.Item>\n </Space>\n </Panel>\n\n <Panel header=\"尺寸\" key=\"size\">\n <Space>\n <Form.Item label=\"宽度\" name={[\"normalStyle\", \"width\"]}>\n <InputNumber min={10} />\n </Form.Item>\n <Form.Item label=\"高度\" name={[\"normalStyle\", \"height\"]}>\n <InputNumber min={10} />\n </Form.Item>\n </Space>\n </Panel>\n\n <Panel header=\"样式\" key=\"style\">\n <Form.Item label=\"背景色\" name={[\"normalStyle\", \"background\"]}>\n <Input placeholder=\"transparent, #fff, url(...)\" />\n </Form.Item>\n\n <Form.Item label=\"内边距\" name={[\"normalStyle\", \"padding\"]}>\n <InputNumber min={0} />\n </Form.Item>\n\n <Form.Item label=\"圆角\" name={[\"normalStyle\", \"borderRadius\"]}>\n <InputNumber min={0} />\n </Form.Item>\n\n <Form.Item\n label=\"缩放比例\"\n name={[\"normalStyle\", \"scale\"]}\n help=\"等比缩放节点的宽高\"\n >\n <InputNumber min={0.1} max={5} step={0.1} />\n </Form.Item>\n\n <Form.Item\n label=\"旋转角度\"\n name={[\"normalStyle\", \"rotate\"]}\n help=\"顺时针旋转角度(度)\"\n >\n <InputNumber min={0} max={360} step={1} />\n </Form.Item>\n\n <Form.Item label=\"透明度\" name={[\"normalStyle\", \"opacity\"]}>\n <InputNumber min={0} max={1} step={0.1} />\n </Form.Item>\n\n <Form.Item label=\"层级\" name={[\"normalStyle\", \"zIndex\"]}>\n <InputNumber />\n </Form.Item>\n </Panel>\n </Collapse>\n </Form>\n </TabPane>\n\n <TabPane tab=\"状态\" key=\"status\">\n {selectedNode.type === \"group\" && selectedNode.children ? (\n <GroupNodeStatusEditor\n node={selectedNode}\n updateNode={updateNode}\n materials={materials}\n />\n ) : (\n <div className=\"mb-4\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"font-medium\">\n 状态列表\n <Tag color=\"blue\" className=\"ml-2\">\n {currentStatusList.length}\n </Tag>\n </span>\n <Button\n type=\"primary\"\n size=\"small\"\n icon={<PlusOutlined />}\n onClick={handleAddStatus}\n >\n 添加状态\n </Button>\n </div>\n\n <p className=\"text-xs text-gray-500 mb-3\">\n 节点根据状态表达式计算结果显示对应物料,第一个返回 true 的状态为当前状态\n </p>\n\n {currentStatusList.length > 0 && (\n <div className=\"mb-4 p-3 bg-blue-50 border border-blue-200 rounded-lg\">\n <div className=\"flex items-center justify-between\">\n <div>\n <span className=\"text-sm text-gray-600\">当前状态:</span>\n <span className=\"ml-2 text-sm font-medium text-blue-600\">\n 由表达式自动计算\n </span>\n </div>\n </div>\n </div>\n )}\n\n {currentStatusList.length === 0 ? (\n <div className=\"text-center text-gray-400 py-4 bg-gray-50 rounded-lg\">\n 暂无状态,点击上方按钮添加\n </div>\n ) : (\n <Collapse ghost defaultActiveKey={currentStatusList[0]?.id + selectedNodeId}>\n {currentStatusList.map((status, index) => (\n <Panel\n key={status.id + selectedNodeId}\n header={\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-gray-400 w-5\">{index + 1}</span>\n <span className=\"font-medium\">{status.name}</span>\n <Tag color=\"default\" className=\"text-xs\">\n {status.material.type}\n </Tag>\n </div>\n }\n extra={\n <Space size=\"small\" onClick={(e) => e.stopPropagation()}>\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ArrowUpOutlined />}\n disabled={index === 0}\n onClick={(e) => {\n e.stopPropagation();\n handleMoveStatus(status.id, \"up\");\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n icon={<ArrowDownOutlined />}\n disabled={index === currentStatusList.length - 1}\n onClick={(e) => {\n e.stopPropagation();\n handleMoveStatus(status.id, \"down\");\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n icon={<CopyOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n handleCopyStatus(status);\n }}\n />\n <Button\n type=\"text\"\n size=\"small\"\n danger\n icon={<DeleteOutlined />}\n onClick={(e) => {\n e.stopPropagation();\n handleDeleteStatus(status.id);\n }}\n />\n </Space>\n }\n >\n <Form layout=\"vertical\">\n <Form.Item label=\"状态名称\">\n <Input\n value={status.name}\n onChange={(e) =>\n handleUpdateStatus(status.id, { name: e.target.value })\n }\n placeholder=\"输入状态名称\"\n />\n </Form.Item>\n\n <Form.Item\n label=\"执行表达式\"\n help=\"返回 true 时激活此状态,可使用 data 变量访问绑定数据\"\n >\n <TextArea\n value={editingExpressions[status.id] ?? status.expression}\n onChange={(e) =>\n setEditingExpressions((prev) => ({\n ...prev,\n [status.id]: e.target.value,\n }))\n }\n onBlur={(e) => {\n handleUpdateStatus(status.id, { expression: e.target.value });\n setEditingExpressions((prev) => {\n const newState = { ...prev };\n delete newState[status.id];\n return newState;\n });\n }}\n rows={3}\n placeholder=\"return true;\"\n />\n </Form.Item>\n\n <Form.Item label=\"绑定数据源 (bindCodes)\">\n <Select\n mode=\"tags\"\n value={status.bindCodes || []}\n onChange={(value) =>\n handleUpdateStatus(status.id, { bindCodes: value })\n }\n placeholder=\"输入数据源 code\"\n tokenSeparators={[\",\", \" \"]}\n />\n </Form.Item>\n\n <Form.Item label=\"绑定物料\">\n <div className=\"flex items-center gap-2\">\n <Tag color=\"blue\">{status.material.name}</Tag>\n <Tag color=\"default\">{status.material.type}</Tag>\n <Button\n type=\"link\"\n size=\"small\"\n icon={<EditOutlined />}\n onClick={() => handleChangeStatusMaterial(status.id)}\n >\n 更换物料\n </Button>\n </div>\n </Form.Item>\n\n {/* 状态物料属性编辑 */}\n <Divider style={{ margin: \"12px 0\" }} />\n <div className=\"bg-gray-50 rounded-lg p-3 border border-gray-200\">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-sm font-medium\">物料属性</span>\n <Tag>{status.material.name}</Tag>\n </div>\n <MaterialPropertyEditor\n material={status.material}\n onSave={(updates) =>\n handleUpdateStatusMaterial(status.id, updates)\n }\n bindCodes={status.bindCodes || []}\n dataOptions={defaultTestData || []}\n />\n </div>\n </Form>\n </Panel>\n ))}\n </Collapse>\n )}\n </div>\n )}\n </TabPane>\n\n <TabPane tab=\"控制\" key=\"control\">\n <Form\n form={form}\n layout=\"vertical\"\n onValuesChange={handleValuesChange}\n >\n <Form.Item\n label=\"可拖拽\"\n name={[\"controlInfo\", \"isDraggable\"]}\n valuePropName=\"checked\"\n >\n <Switch />\n </Form.Item>\n\n <Form.Item\n label=\"可点击\"\n name={[\"controlInfo\", \"isClickable\"]}\n valuePropName=\"checked\"\n >\n <Switch />\n </Form.Item>\n\n <Form.Item\n label=\"可调整大小\"\n name={[\"controlInfo\", \"isResizable\"]}\n valuePropName=\"checked\"\n >\n <Switch />\n </Form.Item>\n\n <Form.Item\n label=\"可选中\"\n name={[\"controlInfo\", \"isSelectable\"]}\n valuePropName=\"checked\"\n >\n <Switch />\n </Form.Item>\n </Form>\n </TabPane>\n\n </Tabs>\n </div>\n\n <div className=\"p-3 border-t border-gray-200 bg-gray-50\">\n <div className=\"text-xs text-gray-500\">\n <div>节点 ID: {selectedNode.id.slice(0, 8)}...</div>\n <div>状态数: {currentStatusList.length}</div>\n </div>\n </div>\n\n <Modal\n title=\"选择物料\"\n open={materialModalVisible}\n onCancel={() => {\n setMaterialModalVisible(false);\n setEditingStatusId(null);\n }}\n footer={null}\n width={600}\n >\n <div className=\"max-h-[400px] overflow-y-auto\">\n <Collapse ghost defaultActiveKey={[\"basic\", \"device\", \"text\", \"line\"]}>\n <Panel header=\"基础形状\" key=\"basic\">\n <div className=\"grid grid-cols-4 gap-2\">\n {materials\n .filter((m) => [\"矩形\", \"圆形\", \"圆角矩形\"].includes(m.name))\n .map((material) => (\n <MaterialCard\n key={material.id}\n material={material}\n onClick={() => handleSelectMaterialForStatus(material)}\n />\n ))}\n </div>\n </Panel>\n\n <Panel header=\"设备图标\" key=\"device\">\n <div className=\"grid grid-cols-4 gap-2\">\n {materials\n .filter(\n (m) =>\n [\"阀门\", \"泵\", \"罐体\"].includes(m.name) ||\n (m.type === \"IMAGE\" &&\n ![\"矩形\", \"圆形\", \"圆角矩形\"].includes(m.name))\n )\n .map((material) => (\n <MaterialCard\n key={material.id}\n material={material}\n onClick={() => handleSelectMaterialForStatus(material)}\n />\n ))}\n </div>\n </Panel>\n\n <Panel header=\"文本\" key=\"text\">\n <div className=\"grid grid-cols-4 gap-2\">\n {materials\n .filter((m) => m.type === \"TEXT\")\n .map((material) => (\n <div\n key={material.id}\n className=\"border rounded-lg p-2 cursor-pointer hover:border-blue-500 hover:bg-blue-50 transition-all text-center\"\n onClick={() => handleSelectMaterialForStatus(material)}\n >\n <div className=\"w-12 h-12 mx-auto mb-1 flex items-center justify-center bg-gray-100 rounded\">\n <span className=\"text-lg font-bold text-gray-500\">T</span>\n </div>\n <span className=\"text-xs\">{material.name}</span>\n </div>\n ))}\n </div>\n </Panel>\n\n <Panel header=\"线条\" key=\"line\">\n <div className=\"grid grid-cols-4 gap-2\">\n {materials\n .filter((m) => m.type === \"LINE\")\n .map((material) => (\n <div\n key={material.id}\n className=\"border rounded-lg p-2 cursor-pointer hover:border-blue-500 hover:bg-blue-50 transition-all text-center\"\n onClick={() => handleSelectMaterialForStatus(material)}\n >\n <div className=\"w-12 h-12 mx-auto mb-1 flex items-center justify-center bg-gray-100 rounded\">\n <div className=\"w-8 h-0.5 bg-gray-400\" />\n </div>\n <span className=\"text-xs\">{material.name}</span>\n </div>\n ))}\n </div>\n </Panel>\n </Collapse>\n </div>\n </Modal>\n </div>\n );\n};\n\n// 物料卡片组件\ninterface MaterialCardProps {\n material: Material;\n onClick: () => void;\n}\n\nconst MaterialCard: React.FC<MaterialCardProps> = ({ material, onClick }) => {\n // 安全地获取图片 URL,只处理 IMAGE 类型\n const src = material.type === 'IMAGE' ? (material as Extract<Material, { type: 'IMAGE' }>).src : undefined;\n\n return (\n <div\n className=\"border rounded-lg p-2 cursor-pointer hover:border-blue-500 hover:bg-blue-50 transition-all text-center\"\n onClick={onClick}\n >\n <div className=\"w-12 h-12 mx-auto mb-1 flex items-center justify-center\">\n {src ? (\n <img src={src} alt={material.name} className=\"w-10 h-10 object-contain\" />\n ) : (\n <span className=\"text-xs\">{material.name[0]}</span>\n )}\n </div>\n <span className=\"text-xs\">{material.name}</span>\n </div>\n );\n};\n\nexport default PropertyPanel;\n","import React, { useEffect, useCallback } from \"react\";\nimport type { CSSProperties } from \"react\";\nimport {\n Layout,\n Button,\n Space,\n Tooltip,\n Modal,\n message,\n ConfigProvider,\n} from \"antd\";\nimport { DownloadOutlined, UploadOutlined } from \"@ant-design/icons\";\nimport zhCN from \"antd/locale/zh_CN\";\nimport { MaterialPanel } from \"../MaterialPanel\";\nimport { Canvas } from \"../Canvas\";\nimport { PropertyPanel } from \"../PropertyPanel\";\nimport { useEditorStore } from \"../../store/editorStore\";\nimport { initMaterials } from \"../../utils/initData\";\nimport type { SchemeJSON } from \"../../types\";\nimport styles from \"../../styles/ConfigEditor.module.css\";\n\nconst { Header, Sider, Content } = Layout;\n\nexport interface ConfigEditorProps {\n /** 初始 scheme 数据 */\n initialScheme?: SchemeJSON;\n /** scheme 变化回调 */\n onChange?: (scheme: SchemeJSON) => void;\n /** 是否只读模式 */\n readonly?: boolean;\n /** 自定义头部内容 */\n headerExtra?: React.ReactNode;\n /** 样式类名 */\n className?: string;\n /** 内联样式 */\n style?: CSSProperties;\n /** 画布默认宽度 */\n defaultCanvasWidth?: number;\n /** 画布默认高度 */\n defaultCanvasHeight?: number;\n /** 是否显示头部 */\n showHeader?: boolean;\n /** 是否显示物料面板 */\n showMaterialPanel?: boolean;\n /** 是否显示属性面板 */\n showPropertyPanel?: boolean;\n /** 自定义物料列表 */\n customMaterials?: any[];\n /** 实时数据 */\n defaultTestData?: any[];\n}\n\nexport const ConfigEditor: React.FC<ConfigEditorProps> = ({\n initialScheme,\n onChange,\n readonly = false,\n headerExtra,\n className = \"\",\n style,\n showHeader = true,\n showMaterialPanel = true,\n showPropertyPanel = true,\n customMaterials,\n}) => {\n const [importModalVisible, setImportModalVisible] = React.useState(false);\n const [jsonInput, setJsonInput] = React.useState(\"\");\n const [defaultTestData, setDefaultTestData] = React.useState([\n {\n paramsCode: \"001\",\n paramsName: \"通频速度有效值\",\n value: 25,\n paramsUnit: \"mm/s\",\n },\n {\n paramsCode: \"002\",\n paramsName: \"通频加速度有效值\",\n value: 1.5,\n paramsUnit: \"m/s²\",\n },\n ]);\n const { exportScheme, importScheme, nodes, materials, addMaterial } =\n useEditorStore();\n const internalRef = React.useRef<any>(null);\n const initializedRef = React.useRef(false);\n // useEffect(() => {\n // if (internalRef.current) {\n // clearInterval(internalRef.current);\n // }\n // internalRef.current = setInterval(() => {\n // setDefaultTestData([\n // {\n // paramsCode: \"001\",\n // paramsName: \"通频速度有效值\",\n // value: 25 + Math.random() * 5 * (Math.random() > 0.5 ? 1 : -1),\n // paramsUnit: \"mm/s\",\n // },\n // {\n // paramsCode: \"002\",\n // paramsName: \"通频加速度有效值\",\n // value: 1.5 + Math.random() * 0.5 * (Math.random() > 0.5 ? 1 : -1),\n // paramsUnit: \"m/s²\",\n // },\n // ]);\n // }, 1000);\n // return () => {\n // if (internalRef.current) {\n // clearInterval(internalRef.current);\n // }\n // };\n // }, []);\n // 初始化\n useEffect(() => {\n // 防止 React 18 严格模式下重复执行\n if (initializedRef.current) return;\n initializedRef.current = true;\n\n // 加载默认物料\n if (materials.length === 0) {\n initMaterials.forEach((m) => addMaterial(m));\n }\n\n // 加载自定义物料\n if (customMaterials && customMaterials.length > 0) {\n customMaterials.forEach((m) => addMaterial(m));\n }\n\n // 加载初始 scheme\n if (initialScheme) {\n importScheme(initialScheme);\n }\n }, []);\n\n // 监听变化并回调\n useEffect(() => {\n if (onChange) {\n const scheme = exportScheme();\n onChange(scheme);\n }\n }, [nodes, onChange]);\n\n // 导出 JSON\n const handleExport = useCallback(() => {\n const scheme = exportScheme();\n const dataStr = JSON.stringify(scheme, null, 2);\n const dataUri =\n \"data:application/json;charset=utf-8,\" + encodeURIComponent(dataStr);\n\n const exportFileDefaultName = `scheme_${Date.now()}.json`;\n\n const linkElement = document.createElement(\"a\");\n linkElement.setAttribute(\"href\", dataUri);\n linkElement.setAttribute(\"download\", exportFileDefaultName);\n linkElement.click();\n\n message.success(\"导出成功!\");\n }, [exportScheme]);\n\n // 导入 JSON\n const handleImport = useCallback(() => {\n try {\n const scheme: SchemeJSON = JSON.parse(jsonInput);\n importScheme(scheme);\n setImportModalVisible(false);\n setJsonInput(\"\");\n message.success(\"导入成功!\");\n } catch (error) {\n message.error(\"JSON 格式错误,请检查输入\");\n }\n }, [jsonInput, importScheme]);\n\n // 处理文件导入\n const handleFileImport = useCallback(\n (file: File) => {\n const reader = new FileReader();\n reader.onload = (e) => {\n try {\n const content = e.target?.result as string;\n const scheme: SchemeJSON = JSON.parse(content);\n importScheme(scheme);\n message.success(\"导入成功!\");\n setImportModalVisible(false);\n } catch (error) {\n message.error(\"文件格式错误\");\n }\n };\n reader.readAsText(file);\n return false;\n },\n [importScheme],\n );\n\n // 导出 scheme 方法(供外部 ref 调用)\n const getScheme = useCallback(() => {\n return exportScheme();\n }, [exportScheme]);\n\n // 暴露给父组件\n React.useImperativeHandle(\n (React as any).useRef?.(),\n () => ({\n getScheme,\n exportScheme,\n importScheme,\n }),\n [getScheme, exportScheme, importScheme],\n );\n\n // console.log(\"defaultTestData\", defaultTestData);\n\n return (\n <ConfigProvider locale={zhCN}>\n <div className={styles.configEditor} style={style}>\n <Layout\n className={`h-full w-full overflow-hidden ${className}`}>\n {/* 顶部导航 */}\n {showHeader && (\n <Header className=\"bg-white border-b border-gray-200 px-4 flex items-center justify-between flex-shrink-0\">\n <div className=\"flex items-center gap-4\">\n <div className=\"text-xl font-bold text-blue-600\">组态编辑器</div>\n <div className=\"text-sm text-gray-500\">{nodes.length} 个节点</div>\n </div>\n\n <Space>\n {headerExtra}\n {!readonly && (\n <>\n <Tooltip title=\"导出 JSON\">\n <Button icon={<DownloadOutlined />} onClick={handleExport}>\n 导出\n </Button>\n </Tooltip>\n\n <Tooltip title=\"导入 JSON\">\n <Button\n icon={<UploadOutlined />}\n onClick={() => setImportModalVisible(true)}>\n 导入\n </Button>\n </Tooltip>\n </>\n )}\n </Space>\n </Header>\n )}\n\n {/* 主体内容 */}\n <Layout>\n {/* 左侧物料面板 */}\n {showMaterialPanel && !readonly && (\n <Sider width={280} className=\"bg-white\" theme=\"light\">\n <MaterialPanel />\n </Sider>\n )}\n\n {/* 中间画布 */}\n <Content className=\"bg-gray-100 relative\">\n <Canvas defaultTestData={defaultTestData} />\n </Content>\n\n {/* 右侧属性面板 */}\n {showPropertyPanel && !readonly && (\n <Sider width={360} className=\"bg-white\" theme=\"light\">\n <PropertyPanel defaultTestData={defaultTestData} />\n </Sider>\n )}\n </Layout>\n\n {/* 导入弹窗 */}\n <Modal\n title=\"导入组态方案\"\n open={importModalVisible}\n onOk={handleImport}\n onCancel={() => {\n setImportModalVisible(false);\n setJsonInput(\"\");\n }}\n width={600}>\n <div className=\"space-y-4\">\n <div>\n <p className=\"mb-2\">选择 JSON 文件导入:</p>\n <input\n type=\"file\"\n accept=\".json\"\n onChange={(e) => {\n const file = e.target.files?.[0];\n if (file) handleFileImport(file);\n }}\n className=\"block w-full text-sm text-gray-500\n file:mr-4 file:py-2 file:px-4\n file:rounded-full file:border-0\n file:text-sm file:font-semibold\n file:bg-blue-50 file:text-blue-700\n hover:file:bg-blue-100\"\n />\n </div>\n\n <div className=\"text-center text-gray-400\">或</div>\n\n <div>\n <p className=\"mb-2\">粘贴 JSON 内容:</p>\n <textarea\n value={jsonInput}\n onChange={(e) => setJsonInput(e.target.value)}\n placeholder=\"粘贴 JSON 内容...\"\n className=\"w-full h-48 p-3 border border-gray-300 rounded-lg font-mono text-sm resize-none focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n </div>\n </div>\n </Modal>\n </Layout>\n </div>\n </ConfigProvider>\n );\n};\n\nexport default ConfigEditor;\n"],"names":["_interopRequireDefault","e","module","zh_CN","locale","common","_common","require$$0","_typeof","o","ownKeys","r","t","_objectSpread","_defineProperty","obj","key","value","_toPropertyKey","i","_toPrimitive","_zh_CN","require$$1","_zh_CN2","_zh_CN3","_zh_CN4","typeTemplate","localeValues","immerImpl","initializer","set","get","store","updater","replace","args","nextState","produce","immer","initialState","createEvent","type","targetId","payload","nanoid","useEditorStore","create","node","autoSelect","state","newNode","id","updates","n","style","content","control","index","nodeId","status","newStatus","statusId","s","data","error","material","newMaterial","m","viewport","config","mode","endPoint","lastEvent","nextEvent","event","scheme","initMaterials","createDefaultStatus","createDefaultNode","x","y","children","childNode","minX","minY","maxX","maxY","child","cx","cy","cw","ch","relativeChildren","Panel","Collapse","Text","Typography","MaterialPanel","materials","addMaterial","removeMaterial","selectedStatusId","selectStatus","lineDrawing","startLineDrawing","cancelLineDrawing","activeKeys","setActiveKeys","useState","handleUpload","file","reader","src","groupedMaterials","handleDragStart","dragImage","handleLineMaterialClick","renderMaterialItem","isLineMode","isLineMaterial","isDrawingLine","jsx","List","Button","EditOutlined","DeleteOutlined","Image","jsxs","Tag","Upload","UploadOutlined","keys","item","Empty","Fragment","evaluateStatusExpression","params","d","result","findActiveStatus","statusList","bindData","getDataValue","valueSourceCode","dataItem","formatValue","decimals","num","renderMaterial","isSelected","imageMaterial","bgColor","fillColor","textMaterial","label","configValue","configUnit","labelStyle","valueStyle","customStyle","dataValue","dataUnit","displayValue","displayUnit","lineMaterial","thickness","color","dashed","lineType","lineWeight","startX","startY","endX","endY","dashArray","baseWeight","strokeColor","customMaterial","NodeRendererComponent","onClick","onMouseDown","onUpdateNode","canvasScale","normalStyle","contentInfo","controlInfo","isClickable","isDraggable","isResizable","onClickRef","useRef","useEffect","draggingPoint","setDraggingPoint","dragOriginRef","dragResultRef","resizeResultRef","nodeRef","resizing","setResizing","rotating","setRotating","rotatingAngleRef","currentStatus","useMemo","activeStatus","currentMaterial","isLine","lineConfig","nodeScale","scaledWidth","scaledHeight","getEffectiveCanvasScale","useCallback","canvasEl","canvasRect","logicalWidth","handlePointMouseDown","point","handleMouseMove","origin","effectiveScale","totalDx","totalDy","newStartX","newStartY","newEndX","newEndY","newNodeX","newNodeY","minNodeSize","newWidth","newHeight","el","line","startHandle","endHandle","handleMouseUp","dx","dy","newX","newY","handleResizeStart","corner","handleRotateStart","rect","newAngle","extra","finalAngle","isGroup","containerStyle","startPointPos","endPointPos","latestOnClick","NodeRenderer","React","prevProps","nextProps","nodeA","nodeB","nodeStyleEqual","contentEqual","otherPropsEqual","presetColors","ColorPicker","onChange","onChangeComplete","visible","setVisible","innerValue","setInnerValue","popoverRef","handleClickOutside","handleColorChange","TextArea","Input","Canvas","defaultTestData","transformRef","canvasRef","wrapperRef","nodes","selectedNodeId","canvas","setViewport","setCanvasConfig","addNode","selectNode","updateNode","removeNode","undo","redo","setMode","endLineDrawing","isDragOver","setIsDragOver","forceUpdate","modeRef","isDraggingRef","dragStartRef","dragOffsetRef","draggingNodeRef","linePreview","setLinePreview","selectionBox","setSelectionBox","selectedNodeIds","setSelectedNodeIds","dataModalVisible","setDataModalVisible","dataInput","setDataInput","canvasConfigVisible","setCanvasConfigVisible","isSpacePressed","setIsSpacePressed","getCanvasPosition","clientX","clientY","mouseXInCanvas","mouseYInCanvas","effectiveScaleX","effectiveScaleY","getBoxSelectionPosition","createLineNode","start","end","continueDrawing","relativeStartX","relativeStartY","relativeEndX","relativeEndY","nodeWidth","nodeHeight","nextStart","handleTransform","handleCanvasClick","handleCanvasMouseDown","pos","handleCanvasDoubleClick","handleDragOver","handleDragLeave","handleDrop","handleNodeMouseDown","screenDx","screenDy","canvasDx","canvasDy","nodeEl","prev","selectedIds","nodeX","nodeY","nodeW","nodeH","centerX","centerY","handleKeyDown","handleKeyUp","handleCopyNodes","nodesToCopy","newNodeIds","handleGroupNodes","selectedNodes","w","h","groupNode","handleUngroupNodes","groupNodesToUngroup","absoluteChildren","handleDistributeNodes","direction","sortedNodes","a","b","count","step","handleAlignNodes","alignValue","toolbarButtons","SelectOutlined","GroupOutlined","DragOutlined","EyeOutlined","actionButtons","UndoOutlined","RedoOutlined","CopyOutlined","UngroupOutlined","AlignLeftOutlined","AlignRightOutlined","VerticalAlignTopOutlined","VerticalAlignBottomOutlined","ColumnWidthOutlined","ColumnHeightOutlined","SettingOutlined","ExperimentOutlined","Space","btn","Tooltip","TransformWrapper","zoomIn","zoomOut","resetTransform","ZoomInOutlined","ZoomOutOutlined","TransformComponent","Modal","Form","InputNumber","v","Switch","checked","message","base64","CloseOutlined","Option","Select","TextMaterialEditor","onSave","bindCodes","dataOptions","formData","setFormData","handleChange","field","handleValueSourceChange","code","selectedOption","opt","autoUnit","handleSave","boundDataOptions","Divider","ImageMaterialEditor","newColor","LineMaterialEditor","handleSaveWithValues","newValues","newFormData","lineTypeOptions","currentStartY","currentStartX","currentEndX","currentEndY","MaterialPropertyEditor","GroupNodeStatusEditor","availableMaterials","handleUpdateChildStatusList","childId","newStatusList","newChildren","handleAddChildStatus","c","handleDeleteChildStatus","handleUpdateChildStatus","handleMoveChildStatus","handleChangeChildStatusMaterial","materialId","selectedMaterial","childIndex","PlusOutlined","statusIndex","ArrowUpOutlined","ArrowDownOutlined","TabPane","Tabs","PropertyPanel","updateNodeStyle","updateNodeControl","updateNodeContent","form","activeTab","setActiveTab","materialModalVisible","setMaterialModalVisible","editingStatusId","setEditingStatusId","editingExpressions","setEditingExpressions","selectedNode","currentStatusList","handleValuesChange","changedValues","handleAddStatus","handleSelectMaterialForStatus","handleDeleteStatus","handleUpdateStatus","handleCopyStatus","handleMoveStatus","handleChangeStatusMaterial","handleUpdateStatusMaterial","newState","MaterialCard","Header","Sider","Content","Layout","ConfigEditor","initialScheme","readonly","headerExtra","className","showHeader","showMaterialPanel","showPropertyPanel","customMaterials","importModalVisible","setImportModalVisible","jsonInput","setJsonInput","setDefaultTestData","exportScheme","importScheme","initializedRef","handleExport","dataStr","dataUri","exportFileDefaultName","linkElement","handleImport","handleFileImport","getScheme","ConfigProvider","zhCN","styles","DownloadOutlined"],"mappings":";;;;;;;;;;;;;;AAAA,aAASA,EAAuBC,GAAG;AACjC,aAAOA,KAAKA,EAAE,aAAaA,IAAI;AAAA,QAC7B,SAAWA;AAAA;IAEf;AACA,IAAAC,EAAA,UAAiBF,GAAwBE,EAAA,QAAA,aAA4B,IAAMA,EAAO,QAAQ,UAAaA,EAAO;AAAA;;;;;UCH9G,OAAO,eAAeC,IAAS,cAAc;AAAA,IAC3C,OAAO;AAAA,EACT,CAAC,GACDA,GAAA,UAAkB;AAClB,QAAMC,IAAS;AAAA;AAAA,IAEb,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA;AAAA,IAEN,WAAW;AAAA,IACX,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,WAAW;AAAA;AAEED,SAAAA,GAAA,UAAkBC;;;;wBCnBjC,OAAO,eAAeC,IAAS,cAAc;AAAA,IAC3C,OAAO;AAAA,EACT,CAAC,GACDA,GAAA,eAAuB,QACJA,GAAA,eAAuB;AAAA,IACxC,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,oBAAoB;AAAA,IACpB,iBAAiB;AAAA;;;;;UCRnB,OAAO,eAAeF,IAAS,cAAc;AAAA,IAC3C,OAAO;AAAA,EACT,CAAC,GACDA,GAAA,UAAkB;AAClB,MAAIG,IAAUC,GAAA;AACd,WAASC,EAAQC,GAAG;AAAE;AAA2B,WAAOD,IAAwB,OAAO,UAArB,cAA2C,OAAO,OAAO,YAA1B,WAAqC,SAAUC,GAAG;AAAE,aAAO,OAAOA;AAAA,QAAO,SAAUA,GAAG;AAAE,aAAOA,KAAmB,OAAO,UAArB,cAA+BA,EAAE,gBAAgB,UAAUA,MAAM,OAAO,YAAY,WAAW,OAAOA;AAAA,IAAE,GAAID,EAAQC,CAAC;AAAA,EAAE;AAC5T,WAASC,EAAQT,GAAGU,GAAG;AAAE,QAAIC,IAAI,OAAO,KAAKX,CAAC;AAAG,QAAI,OAAO,uBAAuB;AAAE,UAAIQ,IAAI,OAAO,sBAAsBR,CAAC;AAAG,MAAAU,MAAMF,IAAIA,EAAE,OAAO,SAAUE,GAAG;AAAE,eAAO,OAAO,yBAAyBV,GAAGU,CAAC,EAAE;AAAA,MAAW,CAAE,IAAIC,EAAE,KAAK,MAAMA,GAAGH,CAAC;AAAA;AAAK,WAAOG;AAAA,EAAE;AAC7P,WAASC,EAAcZ,GAAG;AAAE,aAASU,IAAI,GAAGA,IAAI,UAAU,QAAQA,KAAK;AAAE,UAAIC,IAAY,UAAUD,CAAC,KAAnB,OAAuB,UAAUA,CAAC,IAAI,CAAA;AAAI,MAAAA,IAAI,IAAID,EAAQ,OAAOE,CAAC,GAAG,EAAE,EAAE,QAAQ,SAAUD,GAAG;AAAE,QAAAG,EAAgBb,GAAGU,GAAGC,EAAED,CAAC,CAAC;AAAA,MAAE,CAAE,IAAI,OAAO,4BAA4B,OAAO,iBAAiBV,GAAG,OAAO,0BAA0BW,CAAC,CAAC,IAAIF,EAAQ,OAAOE,CAAC,CAAC,EAAE,QAAQ,SAAUD,GAAG;AAAE,eAAO,eAAeV,GAAGU,GAAG,OAAO,yBAAyBC,GAAGD,CAAC,CAAC;AAAA,MAAE,CAAE;AAAA,IAAE;AAAG,WAAOV;AAAA,EAAE;AACrb,WAASa,EAAgBC,GAAKC,GAAKC,GAAO;AAAE,WAAAD,IAAME,EAAeF,CAAG,GAAOA,KAAOD,IAAO,OAAO,eAAeA,GAAKC,GAAK,EAAE,OAAOC,GAAO,YAAY,IAAM,cAAc,IAAM,UAAU,GAAI,CAAE,IAAYF,EAAIC,CAAG,IAAIC,GAAgBF;AAAA,EAAI;AAC1O,WAASG,EAAeN,GAAG;AAAE,QAAIO,IAAIC,EAAaR,GAAG,QAAQ;AAAG,WAAmBJ,EAAQW,CAAC,KAArB,WAAyBA,IAAI,OAAOA,CAAC;AAAA,EAAE;AAC9G,WAASC,EAAaR,GAAGD,GAAG;AAAE,QAAgBH,EAAQI,CAAC,KAArB,YAA0B,CAACA,EAAG,QAAOA;AAAG,QAAIX,IAAIW,EAAE,OAAO,WAAW;AAAG,QAAeX,MAAX,QAAc;AAAE,UAAIkB,IAAIlB,EAAE,KAAKW,GAAGD,CAAc;AAAG,UAAgBH,EAAQW,CAAC,KAArB,SAAwB,QAAOA;AAAG,YAAM,IAAI,UAAU,8CAA8C;AAAA,IAAE;AAAG,YAAqBR,MAAb,WAAiB,SAAS,QAAQC,CAAC;AAAA,EAAE;AAC1T,MAAIR,IAASS,EAAcA,EAAc,CAAA,GAAIP,EAAQ,YAAY,GAAG,IAAI;AAAA,IACtE,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,KAAK;AAAA,IACL,aAAa;AAAA,IACb,IAAI;AAAA,IACJ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,eAAe;AAAA,IACf,WAAW;AAAA,IACX,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,cAAc;AAAA,IACd,cAAc;AAAA,IACd,UAAU;AAAA,IACV,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,EACnB,CAAC;AACcH,SAAAA,GAAA,UAAkBC;;;;;UCvCjC,OAAO,eAAeD,IAAS,cAAc;AAAA,IAC3C,OAAO;AAAA,EACT,CAAC,GACDA,GAAA,UAAkB;AAClB,QAAMC,IAAS;AAAA,IACb,aAAa;AAAA,IACb,kBAAkB,CAAC,QAAQ,MAAM;AAAA;AAEpBD,SAAAA,GAAA,UAAkBC;;;;;;ACRjC,MAAIJ,IAAyBO,GAAA,EAAwD;AACrF,SAAO,eAAeJ,IAAS,cAAc;AAAA,IAC3C,OAAO;AAAA,EACT,CAAC,GACDA,GAAA,UAAkB;AAClB,MAAIkB,IAASrB,EAAuBsB,IAA4C,GAC5EC,IAAUvB,sBAAgE;AAE9E,QAAMI,IAAS;AAAA,IACb,MAAM;AAAA,MACJ,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,MACpB,kBAAkB;AAAA,MAClB,iBAAiB;AAAA,MACjB,kBAAkB,CAAC,QAAQ,MAAM;AAAA,MACjC,sBAAsB,CAAC,QAAQ,MAAM;AAAA,MACrC,uBAAuB,CAAC,QAAQ,MAAM;AAAA,MACtC,yBAAyB,CAAC,QAAQ,MAAM;AAAA,MACxC,sBAAsB,CAAC,OAAO,KAAK;AAAA,MACnC,GAAGiB,EAAO;AAAA;IAEZ,kBAAkB;AAAA,MAChB,GAAGE,EAAQ;AAAA,IACf;AAAA;AAGA,SAAAnB,EAAO,KAAK,KAAK,MAGFD,GAAA,UAAkBC;;;;;;AC9BjC,MAAIJ,IAAyBO,GAAA,EAAwD;AACrF,SAAO,eAAeJ,IAAS,cAAc;AAAA,IAC3C,OAAO;AAAA,EACT,CAAC,GACDA,GAAA,UAAkB;AAClB,MAAIkB,IAASrB,sBAAgE;AAC9DG,SAAAA,GAAA,UAAkBkB,EAAO;;;;;;ACNxC,MAAIrB,IAAyBO,GAAA,EAAwD;AACrF,SAAO,eAAeJ,IAAS,cAAc;AAAA,IAC3C,OAAO;AAAA,EACT,CAAC,GACDA,GAAA,UAAkB;AAClB,MAAIkB,IAASrB,EAAuBsB,IAAoD,GACpFC,IAAUvB,sBAA0D,GACpEwB,IAAUxB,sBAA6D,GACvEyB,IAAUzB,sBAA6D;AAC3E,QAAM0B,IAAe,0BACfC,IAAe;AAAA,IACnB,QAAQ;AAAA,IACR,YAAYN,EAAO;AAAA,IACnB,YAAYG,EAAQ;AAAA,IACpB,YAAYC,EAAQ;AAAA,IACpB,UAAUF,EAAQ;AAAA;AAAA,IAElB,QAAQ;AAAA,MACN,aAAa;AAAA,MACb,OAAO;AAAA,MACP,UAAU;AAAA;IAEZ,OAAO;AAAA,MACL,aAAa;AAAA,MACb,eAAe;AAAA,MACf,aAAa;AAAA,MACb,iBAAiB;AAAA,MACjB,gBAAgB;AAAA,MAChB,yBAAyB;AAAA,MACzB,WAAW;AAAA,MACX,WAAW;AAAA,MACX,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,cAAc;AAAA,MACd,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,YAAY;AAAA;IAEd,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,YAAY;AAAA;IAEd,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA;IAEV,YAAY;AAAA,MACV,YAAY;AAAA,MACZ,QAAQ;AAAA;IAEV,UAAU;AAAA,MACR,QAAQ,CAAC,IAAI,EAAE;AAAA,MACf,mBAAmB;AAAA,MACnB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,eAAe;AAAA,MACf,WAAW;AAAA,MACX,aAAa;AAAA,MACb,WAAW;AAAA,MACX,cAAc;AAAA;IAEhB,QAAQ;AAAA,MACN,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,aAAa;AAAA,MACb,cAAc;AAAA;IAEhB,OAAO;AAAA,MACL,aAAa;AAAA;IAEf,MAAM;AAAA,MACJ,MAAM;AAAA;IAER,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA;IAEZ,MAAM;AAAA,MACJ,UAAU;AAAA,MACV,yBAAyB;AAAA,QACvB,SAAS;AAAA,QACT,UAAU;AAAA,QACV,MAAM;AAAA,QACN,YAAY;AAAA,QACZ,MAAM;AAAA,UACJ,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,SAAS;AAAA;QAEX,OAAO;AAAA,UACL,QAAQG;AAAA,UACR,QAAQA;AAAA,UACR,OAAOA;AAAA,UACP,QAAQA;AAAA,UACR,QAAQA;AAAA,UACR,MAAMA;AAAA,UACN,SAASA;AAAA,UACT,SAASA;AAAA,UACT,OAAOA;AAAA,UACP,QAAQA;AAAA,UACR,OAAOA;AAAA,UACP,KAAKA;AAAA,UACL,KAAKA;AAAA;QAEP,QAAQ;AAAA,UACN,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,OAAO;AAAA;QAET,QAAQ;AAAA,UACN,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,OAAO;AAAA;QAET,OAAO;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,OAAO;AAAA;QAET,SAAS;AAAA,UACP,UAAU;AAAA,QAClB;AAAA,MACA;AAAA;IAEE,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA;IAEX,aAAa;AAAA,MACX,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb,eAAe;AAAA,IACnB;AAAA;AAEevB,SAAAA,GAAA,UAAkBwB;;;;wBCxJjCxB,KAAiBI,gBAAAA,GAAA;;;mCCEXqB,KAAY,CAACC,MAAgB,CAACC,GAAKC,GAAKC,OAC5CA,EAAM,WAAW,CAACC,GAASC,MAAYC,MAAS;AAC9C,QAAMC,IAAY,OAAOH,KAAY,aAAaI,GAAQJ,CAAO,IAAIA;AACrE,SAAOH,EAAIM,GAAWF,GAAS,GAAGC,CAAI;AACxC,GACON,EAAYG,EAAM,UAAUD,GAAKC,CAAK,IAEzCM,KAAQV,ICWRW,KAA4B;AAAA,EAChC,OAAO,CAAA;AAAA,EACP,WAAW,CAAA;AAAA,EACX,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,QAAQ;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,EAAA;AAAA,EAEZ,UAAU;AAAA,IACR,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,EAAA;AAAA,EAEb,SAAS;AAAA,IACP,MAAM,CAAA;AAAA,IACN,QAAQ,CAAA;AAAA,EAAC;AAAA,EAEX,MAAM;AAAA,EACN,aAAa;AAAA,IACX,WAAW;AAAA,IACX,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,UAAU;AAAA,EAAA;AAEd,GAGMC,KAAc,CAACC,GAAiBC,GAAmBC,OAAgC;AAAA,EACvF,IAAIC,EAAA;AAAA,EACJ,MAAAH;AAAA,EACA,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,WAAW,KAAK,IAAA;AAClB,IAoDaE,KAAiBC,GAAA;AAAA,EAC5BR,GAAM,CAACR,GAAKC,OAAS;AAAA,IACnB,GAAGQ;AAAA;AAAA,IAEH,SAAS,CAACQ,GAAMC,IAAa,OAAS;AACpC,MAAAlB,EAAI,CAACmB,MAAU;AAEb,cAAMC,IAAU;AAAA,UACd,GAAGH;AAAA,UACH,IAAIA,EAAK,MAAMH,EAAA;AAAA,QAAO;AAExB,QAAAK,EAAM,MAAM,KAAKC,CAAO,GACpBF,MACFC,EAAM,iBAAiBC,EAAQ,IAC/BD,EAAM,QAAQ,KAAK,KAAKT,GAAY,eAAeU,EAAQ,EAAE,CAAC;AAAA,MAElE,CAAC;AAAA,IACH;AAAA,IAEA,YAAY,CAACC,GAAIC,MAAY;AAC3B,MAAAtB,EAAI,CAACmB,MAAU;AACb,cAAMF,IAAOE,EAAM,MAAM,KAAK,CAACI,MAAMA,EAAE,OAAOF,CAAE;AAChD,QAAIJ,MACF,OAAO,OAAOA,GAAMK,CAAO,GAC3BH,EAAM,QAAQ,KAAK,KAAKT,GAAY,mBAAmBW,GAAIC,CAAO,CAAC;AAAA,MAEvE,CAAC;AAAA,IACH;AAAA,IAEA,iBAAiB,CAACD,GAAIG,MAAU;AAC9B,MAAAxB,EAAI,CAACmB,MAAU;AACb,cAAMF,IAAOE,EAAM,MAAM,KAAK,CAACI,MAAMA,EAAE,OAAOF,CAAE;AAChD,QAAIJ,MACF,OAAO,OAAOA,EAAK,aAAaO,CAAK,GACrCL,EAAM,QAAQ,KAAK,KAAKT,GAAY,mBAAmBW,GAAI,EAAE,aAAaG,EAAA,CAAO,CAAC;AAAA,MAEtF,CAAC;AAAA,IACH;AAAA,IAEA,mBAAmB,CAACH,GAAII,MAAY;AAClC,MAAAzB,EAAI,CAACmB,MAAU;AACb,cAAMF,IAAOE,EAAM,MAAM,KAAK,CAACI,MAAMA,EAAE,OAAOF,CAAE;AAChD,QAAIJ,MAEFA,EAAK,cAAc,EAAE,GAAGA,EAAK,aAAa,GAAGQ,EAAA,GAC7CN,EAAM,QAAQ,KAAK,KAAKT,GAAY,mBAAmBW,GAAI,EAAE,aAAaI,EAAA,CAAS,CAAC;AAAA,MAExF,CAAC;AAAA,IACH;AAAA,IAEA,mBAAmB,CAACJ,GAAIK,MAAY;AAClC,MAAA1B,EAAI,CAACmB,MAAU;AACb,cAAMF,IAAOE,EAAM,MAAM,KAAK,CAACI,MAAMA,EAAE,OAAOF,CAAE;AAChD,QAAIJ,MACF,OAAO,OAAOA,EAAK,aAAaS,CAAO,GACvCP,EAAM,QAAQ,KAAK,KAAKT,GAAY,mBAAmBW,GAAI,EAAE,aAAaK,EAAA,CAAS,CAAC;AAAA,MAExF,CAAC;AAAA,IACH;AAAA,IAEA,YAAY,CAACL,MAAO;AAClB,MAAArB,EAAI,CAACmB,MAAU;AACb,cAAMQ,IAAQR,EAAM,MAAM,UAAU,CAAC,MAAM,EAAE,OAAOE,CAAE;AACtD,QAAIM,MAAU,OACZR,EAAM,MAAM,OAAOQ,GAAO,CAAC,GACvBR,EAAM,mBAAmBE,MAC3BF,EAAM,iBAAiB,MACvBA,EAAM,mBAAmB,OAE3BA,EAAM,QAAQ,KAAK,KAAKT,GAAY,eAAeW,CAAE,CAAC;AAAA,MAE1D,CAAC;AAAA,IACH;AAAA,IAEA,YAAY,CAACA,MAAO;AAClB,MAAArB,EAAI,CAACmB,MAAU;AACb,QAAAA,EAAM,iBAAiBE,GACvBF,EAAM,mBAAmB,MACrBE,KACFF,EAAM,QAAQ,KAAK,KAAKT,GAAY,eAAeW,CAAE,CAAC;AAAA,MAE1D,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,WAAW,CAACO,GAAQC,MAAW;AAC7B,MAAA7B,EAAI,CAACmB,MAAU;AACb,cAAMF,IAAOE,EAAM,MAAM,KAAK,CAACI,MAAMA,EAAE,OAAOK,CAAM;AACpD,YAAI,CAACX,EAAM;AAEX,cAAMa,IAAwB;AAAA,UAC5B,GAAGD;AAAA,UACH,IAAIf,EAAA;AAAA,QAAO;AAGb,QAAAG,EAAK,YAAY,WAAW,KAAKa,CAAS,GAC1CX,EAAM,QAAQ,KAAK,KAAKT,GAAY,0BAA0BkB,GAAQ,EAAE,UAAUE,EAAU,GAAA,CAAI,CAAC;AAAA,MACnG,CAAC;AAAA,IACH;AAAA,IAEA,cAAc,CAACF,GAAQG,MAAa;AAClC,MAAA/B,EAAI,CAACmB,MAAU;AACb,cAAMF,IAAOE,EAAM,MAAM,KAAK,CAACI,MAAMA,EAAE,OAAOK,CAAM;AACpD,YAAI,CAACX,EAAM;AAEX,cAAMU,IAAQV,EAAK,YAAY,WAAW,UAAU,CAACe,MAAMA,EAAE,OAAOD,CAAQ;AAC5E,QAAIJ,MAAU,OACZV,EAAK,YAAY,WAAW,OAAOU,GAAO,CAAC,GACvCV,EAAK,YAAY,oBAAoBc,MACvCd,EAAK,YAAY,kBAAkB,SAEjCE,EAAM,qBAAqBY,MAC7BZ,EAAM,mBAAmB;AAAA,MAG/B,CAAC;AAAA,IACH;AAAA,IAEA,cAAc,CAACS,GAAQG,GAAUT,MAAY;AAC3C,MAAAtB,EAAI,CAACmB,MAAU;AACb,cAAMF,IAAOE,EAAM,MAAM,KAAK,CAACI,MAAMA,EAAE,OAAOK,CAAM;AACpD,YAAI,CAACX,EAAM;AAEX,cAAMY,IAASZ,EAAK,YAAY,WAAW,KAAK,CAACe,MAAMA,EAAE,OAAOD,CAAQ;AACxE,QAAIF,KACF,OAAO,OAAOA,GAAQP,CAAO;AAAA,MAEjC,CAAC;AAAA,IACH;AAAA,IAEA,cAAc,CAACS,MAAa;AAC1B,MAAA/B,EAAI,CAACmB,MAAU;AACb,QAAAA,EAAM,mBAAmBY;AAAA,MAC3B,CAAC;AAAA,IACH;AAAA,IAEA,uBAAuB,CAACH,GAAQK,MAAS;AAEvC,YAAMhB,IADQhB,EAAA,EACK,MAAM,KAAK,CAACsB,MAAMA,EAAE,OAAOK,CAAM;AACpD,UAAKX;AAEL,mBAAWY,KAAUZ,EAAK,YAAY;AACpC,cAAI;AAGF,gBAFW,IAAI,SAAS,QAAQ,aAAa,UAAUY,EAAO,UAAU,EACtDI,GAAMJ,EAAO,WAAWA,CAAM,MACjC;AACb,qBAAOA,EAAO;AAAA,UAElB,SAASK,GAAO;AACd,oBAAQ,KAAK,cAAcL,EAAO,MAAMK,CAAK;AAAA,UAC/C;AAAA,IAIJ;AAAA;AAAA,IAGA,aAAa,CAACC,MAAa;AACzB,MAAAnC,EAAI,CAACmB,MAAU;AACb,cAAMiB,IAAc;AAAA,UAClB,GAAGD;AAAA,UACH,IAAIrB,EAAA;AAAA,QAAO;AAEb,QAAAK,EAAM,UAAU,KAAKiB,CAAuB,GAC5CjB,EAAM,QAAQ,KAAK,KAAKT,GAAY,gBAAgB0B,EAAY,EAAE,CAAC;AAAA,MACrE,CAAC;AAAA,IACH;AAAA,IAEA,gBAAgB,CAACf,GAAIC,MAAY;AAC/B,MAAAtB,EAAI,CAACmB,MAAU;AACb,cAAMgB,IAAWhB,EAAM,UAAU,KAAK,CAACkB,MAAMA,EAAE,OAAOhB,CAAE;AACxD,QAAIc,KACF,OAAO,OAAOA,GAAUb,CAAO;AAAA,MAEnC,CAAC;AAAA,IACH;AAAA,IAEA,gBAAgB,CAACD,MAAO;AACtB,MAAArB,EAAI,CAACmB,MAAU;AACb,cAAMQ,IAAQR,EAAM,UAAU,UAAU,CAACkB,MAAMA,EAAE,OAAOhB,CAAE;AAC1D,QAAIM,MAAU,MACZR,EAAM,UAAU,OAAOQ,GAAO,CAAC;AAAA,MAEnC,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,aAAa,CAACW,MAAa;AACzB,MAAAtC,EAAI,CAACmB,MAAU;AACb,eAAO,OAAOA,EAAM,UAAUmB,CAAQ;AAAA,MACxC,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,iBAAiB,CAACC,MAAW;AAC3B,MAAAvC,EAAI,CAACmB,MAAU;AACb,QAAAA,EAAM,SAAS,EAAE,GAAGA,EAAM,QAAQ,GAAGoB,EAAA;AAAA,MACvC,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,SAAS,CAACC,MAAS;AACjB,MAAAxC,EAAI,CAACmB,MAAU;AACb,QAAAA,EAAM,OAAOqB;AAAA,MACf,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,kBAAkB,CAACL,MAAa;AAC9B,MAAAnC,EAAI,CAACmB,MAAU;AACb,QAAAA,EAAM,OAAO,aACbA,EAAM,cAAc;AAAA,UAClB,WAAW;AAAA,UACX,UAAAgB;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,QAAA;AAAA,MAEd,CAAC;AAAA,IACH;AAAA,IAEA,mBAAmB,CAACM,MAAa;AAC/B,MAAAzC,EAAI,CAACmB,MAAU;AACb,QAAIA,EAAM,YAAY,cACpBA,EAAM,YAAY,WAAWsB;AAAA,MAEjC,CAAC;AAAA,IACH;AAAA,IAEA,gBAAgB,MAAM;AACpB,MAAAzC,EAAI,CAACmB,MAAU;AACb,QAAAA,EAAM,OAAO,UACbA,EAAM,cAAc;AAAA,UAClB,WAAW;AAAA,UACX,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,UAAU;AAAA,QAAA;AAAA,MAEd,CAAC;AAAA,IACH;AAAA,IAEA,mBAAmB,MAAM;AACvB,MAAAnB,EAAI,CAACmB,MAAU;AACb,QAAAA,EAAM,OAAO,UACbA,EAAM,cAAc;AAAA,UAClB,WAAW;AAAA,UACX,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,UAAU;AAAA,QAAA;AAAA,MAEd,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,MAAM,MAAM;AACV,MAAAnB,EAAI,CAACmB,MAAU;AACb,cAAMuB,IAAYvB,EAAM,QAAQ,KAAK,IAAA;AACrC,QAAIuB,KACFvB,EAAM,QAAQ,OAAO,KAAKuB,CAAS;AAAA,MAEvC,CAAC;AAAA,IACH;AAAA,IAEA,MAAM,MAAM;AACV,MAAA1C,EAAI,CAACmB,MAAU;AACb,cAAMwB,IAAYxB,EAAM,QAAQ,OAAO,IAAA;AACvC,QAAIwB,KACFxB,EAAM,QAAQ,KAAK,KAAKwB,CAAS;AAAA,MAErC,CAAC;AAAA,IACH;AAAA,IAEA,aAAa,CAACC,MAAU;AACtB,MAAA5C,EAAI,CAACmB,MAAU;AACb,QAAAA,EAAM,QAAQ,KAAK,KAAKyB,CAAK,GAC7BzB,EAAM,QAAQ,SAAS,CAAA;AAAA,MACzB,CAAC;AAAA,IACH;AAAA;AAAA,IAGA,cAAc,MAAM;AAClB,YAAMA,IAAQlB,EAAA;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAOkB,EAAM;AAAA,QACb,WAAWA,EAAM;AAAA,QACjB,UAAUA,EAAM;AAAA,QAChB,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,UACtB,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,QAAY;AAAA,MACpC;AAAA,IAEJ;AAAA,IAEA,cAAc,CAAC0B,MAAW;AACxB,MAAA7C,EAAI,CAACmB,MAAU;AACb,QAAAA,EAAM,QAAQ0B,EAAO,SAAS,CAAA,GAC9B1B,EAAM,YAAY0B,EAAO,aAAa,CAAA,GACtC1B,EAAM,WAAW0B,EAAO,YAAYpC,GAAa,UACjDU,EAAM,iBAAiB,MACvBA,EAAM,mBAAmB,MACzBA,EAAM,UAAU,EAAE,MAAM,CAAA,GAAI,QAAQ,CAAA,EAAC;AAAA,MACvC,CAAC;AAAA,IACH;AAAA,EAAA,EACA;AACJ,GC1Za2B,KAA4B;AAAA;AAAA,EAEvC;AAAA,IACE,IAAIhC,EAAA;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK,sBAAsB,mBAAmB,6HAA6H,CAAC;AAAA,EAAA;AAAA,EAE9K;AAAA,IACE,IAAIA,EAAA;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK,sBAAsB,mBAAmB,sHAAsH,CAAC;AAAA,EAAA;AAAA,EAEvK;AAAA,IACE,IAAIA,EAAA;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK,sBAAsB,mBAAmB,8HAA8H,CAAC;AAAA,EAAA;AAAA;AAAA,EAI/K;AAAA,IACE,IAAIA,EAAA;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK,sBAAsB,mBAAmB,6NAA6N,CAAC;AAAA,EAAA;AAAA,EAE9Q;AAAA,IACE,IAAIA,EAAA;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK,sBAAsB,mBAAmB,6SAA6S,CAAC;AAAA,EAAA;AAAA,EAE9V;AAAA,IACE,IAAIA,EAAA;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK,sBAAsB,mBAAmB,yVAAyV,CAAC;AAAA,EAAA;AAAA;AAAA,EAI1Y;AAAA,IACE,IAAIA,EAAA;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,MACP,OAAO;AAAA,MACP,OAAO;AAAA,MACP,YAAY;AAAA,QACV,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,WAAW;AAAA,MAAA;AAAA,MAEb,YAAY;AAAA,QACV,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,OAAO;AAAA,QACP,WAAW;AAAA,MAAA;AAAA,IACb;AAAA,EACF;AAAA;AAAA,EAIF;AAAA,IACE,IAAIA,EAAA;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,MACN,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,UAAU;AAAA,IAAA;AAAA,EACZ;AAEJ,GAGaiC,KAAsB,CAACZ,OAAoC;AAAA,EACtE,IAAIrB,EAAA;AAAA,EACJ,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,UAAU,EAAE,GAAGqB,GAAU,IAAIrB,IAAO;AAAA,EACpC,WAAW,CAAA;AACb,IAGakC,KAAoB,CAC/BC,GACAC,GACAf,MACS;AAET,MAAIA,GAAU,SAAS,YAAYA,EAAS,QAAQ,OAAO;AACzD,UAAMgB,IAAWhB,EAAS,OAAO,MAAM,IAAI,CAACiB,OAAqB;AAAA,MAC/D,GAAGA;AAAA,MACH,IAAItC,EAAA;AAAA;AAAA,IAAO,EACX;AAGF,QAAIuC,IAAO,OAAUC,IAAO,OACxBC,IAAO,QAAWC,IAAO;AAE7B,IAAAL,EAAS,QAAQ,CAACM,MAAgB;AAChC,YAAMC,IAAKD,EAAM,YAAY,KAAK,GAC5BE,IAAKF,EAAM,YAAY,KAAK,GAC5BG,IAAKH,EAAM,YAAY,SAAS,GAChCI,IAAKJ,EAAM,YAAY,UAAU;AACvC,MAAAJ,IAAO,KAAK,IAAIA,GAAMK,CAAE,GACxBJ,IAAO,KAAK,IAAIA,GAAMK,CAAE,GACxBJ,IAAO,KAAK,IAAIA,GAAMG,IAAKE,CAAE,GAC7BJ,IAAO,KAAK,IAAIA,GAAMG,IAAKE,CAAE;AAAA,IAC/B,CAAC;AAGD,UAAMC,IAAmBX,EAAS,IAAI,CAACM,OAAiB;AAAA,MACtD,GAAGA;AAAA,MACH,aAAa;AAAA,QACX,GAAGA,EAAM;AAAA,QACT,IAAIA,EAAM,YAAY,KAAK,KAAKJ;AAAA,QAChC,IAAII,EAAM,YAAY,KAAK,KAAKH;AAAA,QAChC,OAAO;AAAA;AAAA,MAAA;AAAA,IACT,EACA;AAEF,WAAO;AAAA,MACL,IAAIxC,EAAA;AAAA,MACJ,MAAMqB,EAAS,QAAQ;AAAA,MACvB,MAAM;AAAA,MACN,aAAa;AAAA,QACX,OAAOoB,IAAOF;AAAA,QACd,QAAQG,IAAOF;AAAA,QACf,GAAAL;AAAA,QACA,GAAAC;AAAA;AAAA,MAAA;AAAA,MAGF,aAAa;AAAA,QACX,YAAY,CAAA;AAAA,QACZ,iBAAiB;AAAA,MAAA;AAAA,MAEnB,aAAa;AAAA,QACX,aAAa;AAAA,QACb,aAAa;AAAA,QACb,aAAa;AAAA,QACb,cAAc;AAAA,MAAA;AAAA,MAEhB,UAAUY;AAAA,IAAA;AAAA,EAEd;AAGA,SAAO;AAAA,IACL,IAAIhD,EAAA;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,MACX,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,GAAAmC;AAAA,MACA,GAAAC;AAAA,MACA,YAAY;AAAA,MACZ,SAAS;AAAA,IAAA;AAAA,IAEX,aAAa;AAAA,MACX,YAAYf,IAAW,CAACY,GAAoBZ,CAAQ,CAAC,IAAI,CAAA;AAAA,MACzD,iBAAiB;AAAA,IAAA;AAAA,IAEnB,aAAa;AAAA,MACX,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb,cAAc;AAAA,IAAA;AAAA,EAChB;AAEJ,GC5KM,EAAA,OAAE4B,OAAUC,IACZ,EAAA,MAAEC,OAASC,IAEJC,KAA0B,MAAM;AAC3C,QAAM;AAAA,IACJ,WAAAC;AAAA,IACA,aAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,MAAAhC;AAAA,IACA,aAAAiC;AAAA,IACA,kBAAAC;AAAA,IACA,mBAAAC;AAAA,EAAA,IACE5D,GAAA,GACE,CAAC6D,GAAYC,CAAa,IAAIC,GAAmB;AAAA,IACrD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD,GAUKC,IAAe,CAACC,MAAe;AACnC,UAAMC,IAAS,IAAI,WAAA;AACnB,WAAAA,EAAO,SAAS,CAAC9G,MAAM;AACrB,YAAM+G,IAAM/G,EAAE,QAAQ;AACtB,MAAAkG,EAAY;AAAA,QACV,MAAMW,EAAK,KAAK,QAAQ,QAAQ,EAAE;AAAA,QAClC,MAAM;AAAA,QACN,KAAAE;AAAA,MAAA,CACW;AAAA,IACf,GACAD,EAAO,cAAcD,CAAI,GAClB;AAAA,EACT,GAGMG,IAAmB;AAAA,IACvB,OAAOf,EAAU;AAAA,MAAO,CAAC/B,MACvB,CAAC,MAAM,MAAM,MAAM,EAAE,SAASA,EAAE,IAAI;AAAA,IAAA;AAAA,IAEtC,QAAQ+B,EAAU;AAAA,MAChB,CAAC/B,MACC,CAAC,MAAM,KAAK,IAAI,EAAE,SAASA,EAAE,IAAI,KAChCA,EAAE,SAAS,WACV,CAAC,CAAC,MAAM,MAAM,MAAM,EAAE,SAASA,EAAE,IAAI,KACrCA,EAAE,SAAS;AAAA,IAAA;AAAA,IAEjB,MAAM+B,EAAU,OAAO,CAAC/B,MAAMA,EAAE,SAAS,MAAM;AAAA,IAC/C,MAAM+B,EAAU,OAAO,CAAC/B,MAAMA,EAAE,SAAS,MAAM;AAAA,IAC/C,OAAO+B,EAAU,OAAO,CAAC/B,MAAMA,EAAE,SAAS,YAAYA,EAAE,QAAQ,KAAK;AAAA,IACrE,QAAQ+B,EAAU;AAAA,MAChB,CAAC/B,MACEA,EAAE,SAAS,YAAY,CAACA,EAAE,QAAQ,SAClCA,EAAE,SAAS,WACV,CAAC,CAAC,MAAM,MAAM,QAAQ,MAAM,KAAK,IAAI,EAAE,SAASA,EAAE,IAAI;AAAA,IAAA;AAAA,EAC5D,GAII+C,IAAkB,CAACjH,GAAoBgE,MAAuB;AAClE,IAAAhE,EAAE,aAAa,gBAAgB,QAC/BA,EAAE,aAAa,QAAQ,oBAAoB,KAAK,UAAUgE,CAAQ,CAAC;AACnE,UAAMkD,IAAYlH,EAAE,cAAc;AAAA,MAChC;AAAA,IAAA;AAEF,IAAIkH,KACFlH,EAAE,aAAa,aAAakH,GAAW,IAAI,EAAE;AAAA,EAEjD,GAGMC,IAA0B,CAACnD,MAAuB;AACtD,IAAIA,EAAS,SAAS,UACpBuC,EAAiBvC,CAAQ;AAAA,EAE7B,GAGMoD,IAAqB,CAACpD,GAAoBqD,IAAsB,OAAU;AAI9E,UAAMC,IAAiBD,MAAe,IAEhCE,IAAgBlD,MAAS,eAAeiD,KAAkBhB,EAAY,UAAU,OAAOtC,EAAS;AAEtG,WACE,gBAAAwD;AAAA,MAACC,GAAK;AAAA,MAAL;AAAA,QAEC,WAAW,CAACH;AAAA,QACZ,aAAa,CAACtH,MAAMiH,EAAgBjH,GAAGgE,CAAQ;AAAA,QAC/C,SAAS,MAAMsD,KAAkBH,EAAwBnD,CAAQ;AAAA,QACjE,WAAW;AAAA;AAAA,YAEPsD,IAAiB,mBAAmB,aAAa;AAAA;AAAA,YAEjDC,IAAgB,oCAAoC,EAAE;AAAA;AAAA,QAE1D,SAAS;AAAA,UACPD,IACE,gBAAAE;AAAA,YAACE;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,wBAAOC,IAAA,EAAa;AAAA,cACpB,SAAS,CAAC3H,MAAM;AACd,gBAAAA,EAAE,gBAAA,GACFmH,EAAwBnD,CAAQ;AAAA,cAClC;AAAA,cACD,UAAA;AAAA,YAAA;AAAA,YARK;AAAA,UAAA,IAWJ;AAAA,UACJ,gBAAAwD;AAAA,YAACE;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,QAAM;AAAA,cACN,wBAAOE,IAAA,EAAe;AAAA,cACtB,SAAS,CAAC5H,MAAM;AACd,gBAAAA,EAAE,gBAAA,GACFmG,EAAenC,EAAS,EAAE;AAAA,cAC5B;AAAA,YAAA;AAAA,YARI;AAAA,UAAA;AAAA,QASN,EACA,OAAO,OAAO;AAAA,QAChB,4BAAC,OAAA,EAAI,WAAW,uCAAuCsD,IAAiB,KAAK,qBAAqB,IAChG,UAAA;AAAA,UAAA,gBAAAE,EAAC,SAAI,WAAU,uGACZ,YAAS,SAAS,WAAYxD,EAAiB,MAC9C,gBAAAwD;AAAA,YAACK;AAAA,YAAA;AAAA,cACC,KAAM7D,EAAiB;AAAA,cACvB,KAAKA,EAAS;AAAA,cACd,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,SAAS;AAAA,YAAA;AAAA,UAAA,IAETA,EAAS,SAAS,2BACnB,QAAA,EAAK,WAAU,yBAAwB,UAAA,IAAA,CAAC,IACvCA,EAAS,SAAS,SACpB,gBAAAwD,EAAC,SAAI,WAAU,wBAAA,CAAwB,IACrCxD,EAAS,SAAS,YAAYA,EAAS,QAAQ,0BAChD,QAAA,EAAK,WAAU,mCAAkC,UAAA,KAAC,IAEnD,gBAAAwD,EAAC,QAAA,EAAK,WAAU,yBAAwB,eAAC,GAE7C;AAAA,UAEA,gBAAAM,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,YAAA,gBAAAN,EAAC1B,MAAK,QAAM,IAAC,WAAU,kBACpB,YAAS,MACZ;AAAA,YACA,gBAAAgC,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,cAAA,gBAAAN,EAAC1B,MAAK,MAAK,aAAY,WAAU,WAC9B,YAAS,MACZ;AAAA,cACCyB,KACC,gBAAAC,EAACO,IAAA,EAAI,OAAM,QAAO,WAAU,WAAU,UAAA,MAAA,CAEtC;AAAA,YAAA,EAAA,CAEJ;AAAA,UAAA,EAAA,CACF;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,MAzEK/D,EAAS;AAAA,IAAA;AAAA,EA4EpB;AAEA,SACE,gBAAA8D,EAAC,OAAA,EAAI,WAAU,0DACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,MAAA,gBAAAN,EAAC,MAAA,EAAG,WAAU,uCAAsC,UAAA,OAAG;AAAA,wBACtD1B,IAAA,EAAK,MAAK,aAAY,WAAU,WAAU,UAAA,cAAA,CAE3C;AAAA,IAAA,GACF;AAAA,IAEA,gBAAA0B,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA,gBAAAA;AAAA,MAACQ;AAAA,MAAA;AAAA,QACC,QAAO;AAAA,QACP,cAAcpB;AAAA,QACd,gBAAgB;AAAA,QAChB,UAAA,gBAAAY,EAACE,GAAA,EAAO,MAAM,gBAAAF,EAACS,IAAA,CAAA,CAAe,GAAI,OAAK,IAAC,MAAK,UAAS,UAAA,SAAA,CAEtD;AAAA,MAAA;AAAA,IAAA,GAEJ;AAAA,IAEA,gBAAAT,EAAC,OAAA,EAAI,WAAU,8BACb,UAAA,gBAAAM;AAAA,MAACjC;AAAA,MAAA;AAAA,QACC,WAAWY;AAAA,QACX,UAAU,CAACyB,MAASxB,EAAcwB,CAAgB;AAAA,QAClD,OAAK;AAAA,QACL,oBAAmB;AAAA,QACnB,UAAA;AAAA,UAAA,gBAAAV,EAAC5B,IAAA,EAAM,QAAO,QACZ,UAAA,gBAAA4B;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,YAAYT,EAAiB;AAAA,cAC7B,YAAY,CAACmB,MAASf,EAAmBe,GAAM,EAAK;AAAA,cACpD,QAAQ;AAAA,gBACN,WACE,gBAAAX;AAAA,kBAACY;AAAA,kBAAA;AAAA,oBACC,aAAY;AAAA,oBACZ,OAAOA,GAAM;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACf;AAAA,YAEJ;AAAA,UAAA,KAXqB,OAazB;AAAA,UAEA,gBAAAZ,EAAC5B,IAAA,EAAM,QAAO,QACZ,UAAA,gBAAA4B;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,YAAYT,EAAiB;AAAA,cAC7B,YAAY,CAACmB,MAASf,EAAmBe,GAAM,EAAK;AAAA,cACpD,QAAQ;AAAA,gBACN,WACE,gBAAAX;AAAA,kBAACY;AAAA,kBAAA;AAAA,oBACC,aAAY;AAAA,oBACZ,OAAOA,GAAM;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACf;AAAA,YAEJ;AAAA,UAAA,KAXqB,QAazB;AAAA,UAEA,gBAAAZ,EAAC5B,IAAA,EAAM,QAAO,MACZ,UAAA,gBAAA4B;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,YAAYT,EAAiB;AAAA,cAC7B,YAAY,CAACmB,MAASf,EAAmBe,GAAM,EAAK;AAAA,cACpD,QAAQ;AAAA,gBACN,WACE,gBAAAX;AAAA,kBAACY;AAAA,kBAAA;AAAA,oBACC,aAAY;AAAA,oBACZ,OAAOA,GAAM;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACf;AAAA,YAEJ;AAAA,UAAA,KAXmB,MAavB;AAAA,UAEA,gBAAAN;AAAA,YAAClC;AAAAA,YAAA;AAAA,cACC,QACE,gBAAAkC,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA;AAAA,gBAAA,gBAAAN,EAAC,UAAK,UAAA,KAAA,CAAE;AAAA,gBACPnD,MAAS,eACR,gBAAAmD,EAACO,IAAA,EAAI,OAAM,QAAO,WAAU,WAAU,UAAA,OAAA,CAEtC;AAAA,cAAA,GAEJ;AAAA,cAGF,UAAA;AAAA,gBAAA,gBAAAP;AAAA,kBAACC;AAAA,kBAAA;AAAA,oBACC,YAAYT,EAAiB;AAAA,oBAC7B,YAAY,CAACmB,MAASf,EAAmBe,GAAM,EAAI;AAAA,oBACnD,QAAQ;AAAA,sBACN,WACE,gBAAAX;AAAA,wBAACY;AAAA,wBAAA;AAAA,0BACC,aAAY;AAAA,0BACZ,OAAOA,GAAM;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBACf;AAAA,kBAEJ;AAAA,gBAAA;AAAA,gBAED/D,MAAS,eACR,gBAAAyD,EAAC,OAAA,EAAI,WAAU,qDACb,UAAA;AAAA,kBAAA,gBAAAN,EAAC,SAAI,UAAA,aAAA,CAAU;AAAA,kBACf,gBAAAA,EAAC,SAAI,UAAA,cAAA,CAAW;AAAA,gBAAA,EAAA,CAClB;AAAA,cAAA;AAAA,YAAA;AAAA,YAjBE;AAAA,UAAA;AAAA,UAqBLR,EAAiB,MAAM,SAAS,KAC/B,gBAAAQ,EAAC5B,IAAA,EAAM,QAAO,MACZ,UAAA,gBAAA4B;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,YAAYT,EAAiB;AAAA,cAC7B,YAAY,CAACmB,MAASf,EAAmBe,GAAM,EAAK;AAAA,cACpD,QAAQ;AAAA,gBACN,WACE,gBAAAX;AAAA,kBAACY;AAAA,kBAAA;AAAA,oBACC,aAAY;AAAA,oBACZ,OAAOA,GAAM;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACf;AAAA,YAEJ;AAAA,UAAA,KAXmB,OAavB;AAAA,UAGDpB,EAAiB,OAAO,SAAS,KAChC,gBAAAQ,EAAC5B,IAAA,EAAM,QAAO,OACZ,UAAA,gBAAA4B;AAAA,YAACC;AAAA,YAAA;AAAA,cACC,YAAYT,EAAiB;AAAA,cAC7B,YAAY,CAACmB,MAASf,EAAmBe,GAAM,EAAK;AAAA,cACpD,QAAQ;AAAA,gBACN,WACE,gBAAAX;AAAA,kBAACY;AAAA,kBAAA;AAAA,oBACC,aAAY;AAAA,oBACZ,OAAOA,GAAM;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACf;AAAA,YAEJ;AAAA,UAAA,KAXoB,QAaxB;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA,GAGN;AAAA,sBAEC,OAAA,EAAI,WAAU,2CACb,UAAA,gBAAAZ,EAAC1B,IAAA,EAAK,MAAK,aAAY,WAAU,WAC9B,UAAAzB,MAAS,cACR,gBAAAmD,EAAAa,IAAA,EAAE,UAAA,sCAAA,CAEF,IAEA,gBAAAb,EAAAa,IAAA,EAAE,UAAA,iCAAA,CAEF,GAEJ,EAAA,CACF;AAAA,EAAA,GACF;AAEJ,GC3UM,EAAE,MAAAvC,OAASC,IAgBXuC,KAA2B,CAAC5E,GAAoBI,MAAwB;AAC5E,MAAI;AAEF,UAAMyE,IACJzE,KAAQ,MAAM,QAAQA,CAAI,IACtBA,EAAK,IAAI,CAAC0E,GAAQhF,MAAkBgF,EAAE,UAAU,IAChD,CAAC,GAAG,GAEJC,IADK,IAAI,SAAS,GAAGF,GAAQ7E,EAAO,UAAU,EAClC,GAAGI,EAAK,IAAI,CAAC0E,MAAWA,EAAE,KAAK,CAAC;AAClD,mBAAQ;AAAA,MACN,sBAAsB9E,EAAO,IAAI;AAAA,MACjCI;AAAA,MACA;AAAA,MACA2E;AAAA,IAAA,GAEKA,MAAW;AAAA,EACpB,SAAS1E,GAAO;AACd,mBAAQ,KAAK,cAAcL,EAAO,IAAI,MAAMK,CAAK,GAC1C;AAAA,EACT;AACF,GAGM2E,KAAmB,CACvBC,GACA7E,MAC2B;AAC3B,aAAWJ,KAAUiF,GAAY;AAC/B,YAAQ,IAAIjF,GAAQ,QAAQ;AAC5B,QAAIkF,IAAkC,CAAA;AAStC,QARI,MAAM,QAAQ9E,CAAI,KACpB,QAAQ,IAAIJ,EAAO,WAAW,WAAW,GACzCkF,IAAW9E,EAAK;AAAA,MAAO,CAAC0E,MACtB9E,EAAO,WAAW,SAAS8E,EAAE,UAAU;AAAA,IAAA,KAGzCI,IAAW9E,GAETwE,GAAyB5E,GAAQkF,CAAQ;AAC3C,aAAOlF;AAAA,EAEX;AAEF,GAGMmF,KAAe,CACnB/E,GACAgF,MACkC;AAClC,MAAI,CAACA,KAAmB,CAAChF;AACvB,WAAO,EAAE,OAAO,OAAA;AAIlB,MAAI,MAAM,QAAQA,CAAI,GAAG;AACvB,UAAMiF,IAAWjF,EAAK,KAAK,CAAC0E,MAAMA,EAAE,eAAeM,CAAe;AAClE,QAAIC;AACF,aAAO;AAAA,QACL,OAAOA,EAAS;AAAA,QAChB,MAAMA,EAAS;AAAA,MAAA;AAAA,EAGrB,WAES,OAAOjF,KAAS,YAAYgF,KAAmBhF;AACtD,WAAO;AAAA,MACL,OAAOA,EAAKgF,CAAe;AAAA,MAC3B,MAAMhF,EAAK;AAAA,IAAA;AAIf,SAAO,EAAE,OAAO,OAAA;AAClB,GAGMkF,KAAc,CAAChI,GAAYiI,MAA8B;AAC7D,MAA2BjI,KAAU,QAAQA,MAAU,GAAI,QAAO;AAGlE,MAAIiI,MAAa,GAAI,QAAO,OAAOjI,CAAK;AAGxC,QAAMkI,IAAM,OAAOlI,CAAK;AACxB,SAAI,MAAMkI,CAAG,IAAU,OAAOlI,CAAK,IAG5BkI,EAAI,QAAQD,KAAY,CAAC;AAClC,GAGME,KAAiB,CAACnF,GAAoBF,GAAYsF,GAAsBtG,MAAgB;AAC5F,UAAQkB,EAAS,MAAA;AAAA,IACf,KAAK;AACH,YAAMqF,IAAgBrF,GAChBsF,IAAUD,EAAc,iBACxBE,IAAYF,EAAc;AAGhC,UAAItC,IAAMsC,EAAc;AACxB,aAAIE,KAAaxC,KAAOA,EAAI,SAAS,oBAAoB,MACnD/C,EAAS,SAAS,OACpB+C,IAAM,sBAAsB,mBAAmB,uGAAuGwC,CAAS,kBAAkB,CAAC,KACzKvF,EAAS,SAAS,OAC3B+C,IAAM,sBAAsB,mBAAmB,uGAAuGwC,CAAS,WAAW,CAAC,KAClKvF,EAAS,SAAS,WAC3B+C,IAAM,sBAAsB,mBAAmB,uGAAuGwC,CAAS,mBAAmB,CAAC,MAKrL,gBAAA/B;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,iBAAiB8B,EAAA;AAAA,UAEzB,UAAAvC,IACC,gBAAAS;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,KAAAT;AAAA,cACA,KAAK/C,EAAS;AAAA,cACd,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,WAAW;AAAA,cAAA;AAAA,YACb;AAAA,UAAA,IAGF,gBAAAwD,EAAC,OAAA,EAAI,WAAU,kDACb,4BAAC,QAAA,EAAK,WAAU,yBAAwB,UAAA,MAAA,CAAG,EAAA,CAC7C;AAAA,QAAA;AAAA,MAAA;AAAA,IAKR,KAAK;AACH,YAAMgC,IAAexF,GACf;AAAA,QACJ,OAAAyF;AAAA,QACA,OAAOC;AAAA,QACP,iBAAAZ;AAAA,QACA,MAAMa;AAAA,QACN,UAAAV;AAAA,QACA,YAAAW;AAAA,QACA,YAAAC;AAAA,QACA,aAAAC;AAAA,MAAA,IACEN,EAAa,WAAW,CAAA,GAGtB,EAAE,OAAOO,GAAW,MAAMC,MAAalB,IACzCD,GAAa/E,GAAMgF,CAAe,IAClC,EAAE,OAAO,QAAW,MAAM,OAAA,GAKxBmB,IAAejB,GAFJe,MAAc,SAAYA,IAAYL,GAEZT,CAAQ,GAE7CiB,IAAcP,KAAcK,KAAY;AAE9C,aACE,gBAAAlC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAO,EAAE,GAAGgC,EAAA;AAAA,UACX,UAAA;AAAA,YAAAL,KACC,gBAAAjC;AAAA,cAAC1B;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,OAAO;AAAA,kBACP,WAAW;AAAA,kBACX,GAAG8D;AAAA,gBAAA;AAAA,gBAEJ,UAAAH;AAAA,cAAA;AAAA,YAAA;AAAA,YAGJQ,KACC,gBAAAnC;AAAA,cAAChC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,kBACL,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,WAAW;AAAA,kBACX,GAAG+D;AAAA,gBAAA;AAAA,gBAEJ,UAAA;AAAA,kBAAAI;AAAA,kBACAC,IAAc,IAAIA,CAAW,KAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UACrC;AAAA,QAAA;AAAA,MAAA;AAAA,IAKR,KAAK;AACH,YAAMC,KAAenG,GACf;AAAA,QACJ,WAAAoG,KAAY;AAAA,QACZ,OAAAC,KAAQ;AAAA,QACR,QAAAC,KAAS;AAAA,QACT,UAAAC,IAAWD,KAAS,WAAW;AAAA,QAC/B,YAAAE,IAAaJ;AAAA;AAAA,QAEb,QAAAK,IAAS;AAAA,QACT,QAAAC,IAAS;AAAA,QACT,MAAAC,IAAO;AAAA,QACP,MAAAC,IAAO;AAAA,MAAA,IACLT,GAAa,UAAU,CAAA,GAuBrBU,KApBe,CAACrI,OAAyB;AAC7C,cAAMsI,IAAa,KAAK,IAAIN,GAAY,CAAC;AACzC,gBAAQhI,IAAA;AAAA,UACN,KAAK;AACH,mBAAO;AAAA,UACT,KAAK;AACH,mBAAO,GAAGsI,IAAa,CAAC,IAAIA,IAAa,CAAC;AAAA,UAC5C,KAAK;AACH,mBAAO,GAAGA,IAAa,EAAE,IAAIA,IAAa,CAAC,IAAIA,IAAa,CAAC,IAAIA,IAAa,CAAC;AAAA,UACjF,KAAK;AACH,mBAAO,GAAGA,IAAa,EAAE,IAAIA,IAAa,CAAC,IAAIA,IAAa,CAAC,IAAIA,IAAa,CAAC,IAAIA,IAAa,CAAC,IAAIA,IAAa,CAAC;AAAA,UACrH,KAAK;AACH,mBAAO,GAAGA,CAAU,IAAIA,IAAa,CAAC;AAAA,UACxC,KAAK;AACH,mBAAO,GAAGA,IAAa,CAAC,IAAIA,IAAa,CAAC,IAAIA,CAAU,IAAIA,IAAa,CAAC;AAAA,UAC5E;AACE,mBAAO;AAAA,QAAA;AAAA,MAEb,GAE+BP,CAAQ,GAGjCQ,IAAc3B,IAAa,YAAYiB;AAI7C,aACE,gBAAA7C,EAAC,SAAI,WAAU,0BAAyB,OAAO,EAAE,UAAU,aACzD,UAAA,gBAAAM;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAU;AAAA,UACV,OAAM;AAAA,UACN,QAAO;AAAA,UACP,OAAO,EAAE,UAAU,WAAW,eAAe,OAAA;AAAA,UAE7C,UAAA;AAAA,YAAA,gBAAAN;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,IAAIiD;AAAA,gBACJ,IAAIC;AAAA,gBACJ,IAAIC;AAAA,gBACJ,IAAIC;AAAA,gBACJ,QAAO;AAAA,gBACP,aAAa,KAAK,IAAIJ,GAAY,EAAE;AAAA,gBACpC,eAAc;AAAA,gBACd,gBAAe;AAAA,gBACf,OAAO,EAAE,eAAe,UAAU,QAAQ,UAAA;AAAA,cAAU;AAAA,YAAA;AAAA,YAGtD,gBAAAhD;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,IAAIiD;AAAA,gBACJ,IAAIC;AAAA,gBACJ,IAAIC;AAAA,gBACJ,IAAIC;AAAA,gBACJ,QAAQG;AAAA,gBACR,aAAaP;AAAA,gBACb,iBAAiBK;AAAA,gBACjB,eAAc;AAAA,gBACd,gBAAe;AAAA,gBACf,OAAO,EAAE,eAAe,OAAA;AAAA,cAAO;AAAA,YAAA;AAAA,UACjC;AAAA,QAAA;AAAA,MAAA,GAEJ;AAAA,IAGJ,KAAK;AACH,YAAMG,IAAiBhH;AACvB,aAAIgH,EAAe,SACVA,EAAe,OAAO,EAAE,IAG/B,gBAAAxD,EAAC,SAAI,WAAU,8DACb,4BAAC,QAAA,EAAK,WAAU,yBAAwB,UAAA,QAAA,CAAK,EAAA,CAC/C;AAAA,IAGJ;AACE,aACE,gBAAAA,EAAC,SAAI,WAAU,8DACb,4BAAC,QAAA,EAAK,WAAU,yBAAwB,UAAA,OAAA,CAAI,EAAA,CAC9C;AAAA,EAAA;AAGR,GAEMyD,KAAqD,CAAC;AAAA,EAC1D,MAAAnI;AAAA,EACA,YAAAsG,IAAa;AAAA,EACb,SAAA8B;AAAA,EACA,aAAAC;AAAA,EACA,MAAArH;AAAA,EACA,cAAAsH;AAAA,EACA,OAAOC,IAAc;AACvB,MAAM;AACJ,QAAM,EAAE,aAAAC,GAAa,aAAAC,GAAa,aAAAC,EAAA,IAAgB1I,GAC5C,EAAE,YAAA6F,MAAe4C,GACjB,EAAE,aAAAE,GAAa,aAAAC,GAAa,aAAAC,EAAA,IAAgBH,GAG5CI,IAAaC,GAAOX,CAAO;AACjC,EAAAY,GAAU,MAAM;AACd,IAAAF,EAAW,UAAUV;AAAA,EACvB,GAAG,CAACA,CAAO,CAAC;AAGZ,QAAM,CAACa,GAAeC,CAAgB,IAAIrF,GAAiC,IAAI,GACzEsF,IAAgBJ,GASZ,IAAI,GAERK,IAAgBL,GAKZ,IAAI,GAERM,IAAkBN,GAGd,IAAI,GACRO,IAAUP,GAAuB,IAAI,GAGrC,CAACQ,GAAUC,EAAW,IAAI3F,GAQtB,IAAI,GAGR,CAAC4F,IAAUC,EAAW,IAAI7F,GAMtB,IAAI,GAER8F,KAAmBZ,GAAsB,IAAI,GAG7Ca,IAAgBC,GAAQ,MAAM;AAClC,QAAIhE,EAAW,WAAW,EAAG;AAG7B,UAAMiE,IAAelE,GAAiBC,GAAY7E,CAAI;AACtD,WAAI8I,KAGGjE,EAAW,CAAC;AAAA,EACrB,GAAG,CAACA,GAAY7E,CAAI,CAAC,GAGf+I,IAAkBH,GAAe,UAGjCI,IAASD,GAAiB,SAAS,QAGnCE,IAAaD,IAAUD,EAAiC,SAAS,MAGjEG,IAAY1B,EAAY,SAAS,GACjC2B,KAAe3B,EAAY,SAAS,OAAO0B,GAC3CE,KAAgB5B,EAAY,UAAU,OAAO0B,GAG7CG,IAA0BC,EAAY,MAAM;AAChD,UAAMC,IAAWjB,EAAQ,SAAS,QAAQ,sBAAsB;AAChE,QAAI,CAACiB,EAAU,QAAOhC;AACtB,UAAMiC,IAAaD,EAAS,sBAAA,GACtBE,IAAe,WAAWF,EAAS,MAAM,KAAK;AACpD,WAAKE,IACED,EAAW,QAAQC,IADAlC;AAAA,EAE5B,GAAG,CAACA,CAAW,CAAC,GAGVmC,IAAuBJ,EAAY,CAACpN,GAAqByN,MAA2B;AACxF,IAAAzN,EAAE,gBAAA,GACFA,EAAE,eAAA,GACFiM,EAAc,UAAU;AAAA,MACtB,QAAQjM,EAAE;AAAA,MACV,QAAQA,EAAE;AAAA,MACV,QAAQ+M,GAAY,UAAU;AAAA,MAC9B,QAAQA,GAAY,UAAU;AAAA,MAC9B,MAAMA,GAAY,QAAQ;AAAA,MAC1B,MAAMA,GAAY,QAAQ;AAAA,MAC1B,OAAOzB,EAAY,KAAK;AAAA,MACxB,OAAOA,EAAY,KAAK;AAAA,IAAA,GAE1BU,EAAiByB,CAAK;AAAA,EACxB,GAAG,CAACV,GAAYzB,EAAY,GAAGA,EAAY,CAAC,CAAC;AAG7C,EAAAQ,GAAU,MAAM;AACd,QAAI,CAACC,KAAiB,CAACe,KAAU,CAACC,KAAc,CAAC3B,EAAc;AAE/D,UAAMsC,IAAkB,CAAC1N,MAAkB;AACzC,YAAM2N,IAAS1B,EAAc;AAC7B,UAAI,CAAC0B,KAAU,CAACvB,EAAQ,QAAS;AAEjC,YAAMwB,KAAiBT,EAAA,GACjBU,MAAW7N,EAAE,UAAU2N,EAAO,UAAUC,IACxCE,MAAW9N,EAAE,UAAU2N,EAAO,UAAUC;AAE9C,UAAIG,IAAYJ,EAAO,QACnBK,KAAYL,EAAO,QACnBM,KAAUN,EAAO,MACjBO,KAAUP,EAAO,MACjBQ,KAAWR,EAAO,OAClBS,KAAWT,EAAO;AAEtB,MAAI5B,MAAkB,WACpBgC,IAAYJ,EAAO,SAASE,IAC5BG,KAAYL,EAAO,SAASG,IACxBC,IAAY,MACdI,KAAWR,EAAO,QAAQI,GAC1BE,KAAUN,EAAO,OAAOI,GACxBA,IAAY,IAEVC,KAAY,MACdI,KAAWT,EAAO,QAAQK,IAC1BE,KAAUP,EAAO,OAAOK,IACxBA,KAAY,OAGdC,KAAUN,EAAO,OAAOE,IACxBK,KAAUP,EAAO,OAAOG,IACpBG,KAAU,MACZE,KAAWR,EAAO,QAAQM,IAC1BF,IAAYJ,EAAO,SAASM,IAC5BA,KAAU,IAERC,KAAU,MACZE,KAAWT,EAAO,QAAQO,IAC1BF,KAAYL,EAAO,SAASO,IAC5BA,KAAU;AAId,YAAMG,KAAc,KAAK,KAAKtB,EAAW,cAAc,KAAK,GAAG,CAAC,GAC1D3H,KAAO,KAAK,IAAI2I,GAAWE,EAAO,GAClC5I,KAAO,KAAK,IAAI2I,IAAWE,EAAO,GAClCI,KAAW,KAAK,IAAIlJ,IAAMiJ,EAAW,GACrCE,KAAY,KAAK,IAAIlJ,IAAMgJ,EAAW;AAG5C,MAAAnC,EAAc,UAAU;AAAA,QACtB,OAAOiC;AAAA,QAAU,OAAOC;AAAA,QACxB,OAAOE;AAAA,QAAU,QAAQC;AAAA,QACzB,QAAQR;AAAA,QAAW,QAAQC;AAAA,QAC3B,MAAMC;AAAA,QAAS,MAAMC;AAAA,MAAA;AAIvB,YAAMM,KAAKpC,EAAQ;AACnB,MAAAoC,GAAG,MAAM,OAAO,GAAGL,EAAQ,MAC3BK,GAAG,MAAM,MAAM,GAAGJ,EAAQ,MAC1BI,GAAG,MAAM,QAAQ,GAAGF,EAAQ,MAC5BE,GAAG,MAAM,SAAS,GAAGD,EAAS,MAGhBC,GAAG,iBAAiB,UAAU,EACtC,QAAQ,CAAAC,MAAQ;AACpB,QAAAA,EAAK,aAAa,MAAM,OAAOV,CAAS,CAAC,GACzCU,EAAK,aAAa,MAAM,OAAOT,EAAS,CAAC,GACzCS,EAAK,aAAa,MAAM,OAAOR,EAAO,CAAC,GACvCQ,EAAK,aAAa,MAAM,OAAOP,EAAO,CAAC;AAAA,MACzC,CAAC;AAGD,YAAMQ,KAAcF,GAAG,cAAc,uBAAuB,GACtDG,KAAYH,GAAG,cAAc,qBAAqB;AACxD,MAAIE,OACFA,GAAY,MAAM,OAAO,GAAGX,IAAY,CAAC,MACzCW,GAAY,MAAM,MAAM,GAAGV,KAAY,CAAC,OAEtCW,OACFA,GAAU,MAAM,OAAO,GAAGV,KAAU,CAAC,MACrCU,GAAU,MAAM,MAAM,GAAGT,KAAU,CAAC;AAAA,IAExC,GAEMU,IAAgB,MAAM;AAC1B,YAAMnG,IAASyD,EAAc;AAC7B,MAAIzD,KACF2C,EAAatI,EAAK,IAAI;AAAA,QACpB,aAAa;AAAA,UACX,GAAGwI;AAAA,UACH,GAAG7C,EAAO;AAAA,UACV,GAAGA,EAAO;AAAA,UACV,OAAOA,EAAO;AAAA,UACd,QAAQA,EAAO;AAAA,QAAA;AAAA,QAEjB,aAAa;AAAA,UACX,GAAG8C;AAAA,UACH,YAAY5C,EAAW,IAAI,CAAA9E,OAAM;AAAA,YAC/B,GAAGA;AAAA,YACH,UAAUA,EAAE,SAAS,SAAS,SAAS;AAAA,cACrC,GAAGA,EAAE;AAAA,cACL,QAAQ;AAAA,gBACN,GAAGkJ;AAAA,gBACH,QAAQtE,EAAO;AAAA,gBACf,QAAQA,EAAO;AAAA,gBACf,MAAMA,EAAO;AAAA,gBACb,MAAMA,EAAO;AAAA,cAAA;AAAA,YACf,IACE5E,EAAE;AAAA,UAAA,EACN;AAAA,QAAA;AAAA,MACJ,CACD,GAEHmI,EAAiB,IAAI,GACrBC,EAAc,UAAU,MACxBC,EAAc,UAAU;AAAA,IAC1B;AAEA,kBAAO,iBAAiB,aAAawB,CAAe,GACpD,OAAO,iBAAiB,WAAWkB,CAAa,GAEzC,MAAM;AACX,aAAO,oBAAoB,aAAalB,CAAe,GACvD,OAAO,oBAAoB,WAAWkB,CAAa;AAAA,IACrD;AAAA,EACF,GAAG,CAAC7C,GAAee,GAAQC,GAAYjK,EAAK,IAAIwI,GAAaC,GAAa5C,GAAYyC,GAAc+B,CAAuB,CAAC,GAG5HrB,GAAU,MAAM;AACd,QAAI,CAACO,KAAY,CAACjB,EAAc;AAEhC,UAAMsC,IAAkB,CAAC1N,MAAkB;AACzC,UAAI,CAACoM,EAAQ,QAAS;AACtB,YAAMwB,IAAiBT,EAAA,GACjB0B,MAAM7O,EAAE,UAAUqM,EAAS,UAAUuB,GACrCkB,MAAM9O,EAAE,UAAUqM,EAAS,UAAUuB;AAE3C,UAAIU,KAAWjC,EAAS,YACpBkC,IAAYlC,EAAS,aACrB0C,KAAO1C,EAAS,YAChB2C,KAAO3C,EAAS;AAEpB,cAAQA,EAAS,QAAA;AAAA,QACf,KAAK;AACH,UAAAiC,KAAW,KAAK,IAAI,IAAIjC,EAAS,aAAawC,EAAE,GAChDN,IAAY,KAAK,IAAI,IAAIlC,EAAS,cAAcyC,EAAE;AAClD;AAAA,QACF,KAAK;AACH,UAAAR,KAAW,KAAK,IAAI,IAAIjC,EAAS,aAAawC,EAAE,GAChDN,IAAY,KAAK,IAAI,IAAIlC,EAAS,cAAcyC,EAAE,GAClDC,KAAO1C,EAAS,cAAcA,EAAS,aAAaiC;AACpD;AAAA,QACF,KAAK;AACH,UAAAA,KAAW,KAAK,IAAI,IAAIjC,EAAS,aAAawC,EAAE,GAChDN,IAAY,KAAK,IAAI,IAAIlC,EAAS,cAAcyC,EAAE,GAClDE,KAAO3C,EAAS,cAAcA,EAAS,cAAckC;AACrD;AAAA,QACF,KAAK;AACH,UAAAD,KAAW,KAAK,IAAI,IAAIjC,EAAS,aAAawC,EAAE,GAChDN,IAAY,KAAK,IAAI,IAAIlC,EAAS,cAAcyC,EAAE,GAClDC,KAAO1C,EAAS,cAAcA,EAAS,aAAaiC,KACpDU,KAAO3C,EAAS,cAAcA,EAAS,cAAckC;AACrD;AAAA,MAAA;AAGJ,MAAApC,EAAgB,UAAU,EAAE,GAAG4C,IAAM,GAAGC,IAAM,OAAOV,IAAU,QAAQC,EAAA;AAEvE,YAAMC,KAAKpC,EAAQ;AACnB,MAAAoC,GAAG,MAAM,OAAO,GAAGO,EAAI,MACvBP,GAAG,MAAM,MAAM,GAAGQ,EAAI,MACtBR,GAAG,MAAM,QAAQ,GAAGF,EAAQ,MAC5BE,GAAG,MAAM,SAAS,GAAGD,CAAS;AAAA,IAChC,GAEMK,IAAgB,MAAM;AAC1B,YAAMnG,IAAS0D,EAAgB;AAC/B,MAAI1D,KACF2C,EAAatI,EAAK,IAAI;AAAA,QACpB,aAAa;AAAA,UACX,GAAGwI;AAAA,UACH,GAAG7C,EAAO;AAAA,UACV,GAAGA,EAAO;AAAA,UACV,OAAOA,EAAO;AAAA,UACd,QAAQA,EAAO;AAAA,QAAA;AAAA,MACjB,CACD,GAEH6D,GAAY,IAAI,GAChBH,EAAgB,UAAU;AAAA,IAC5B;AAEA,kBAAO,iBAAiB,aAAauB,CAAe,GACpD,OAAO,iBAAiB,WAAWkB,CAAa,GAEzC,MAAM;AACX,aAAO,oBAAoB,aAAalB,CAAe,GACvD,OAAO,oBAAoB,WAAWkB,CAAa;AAAA,IACrD;AAAA,EACF,GAAG,CAACvC,GAAUjB,GAActI,EAAK,IAAIwI,GAAa6B,CAAuB,CAAC;AAG1E,QAAM8B,IAAoB7B,EAAY,CAACpN,GAAqBkP,MAAsC;AAChG,IAAAlP,EAAE,gBAAA,GACFA,EAAE,eAAA,GACFsM,GAAY;AAAA,MACV,QAAA4C;AAAA,MACA,QAAQlP,EAAE;AAAA,MACV,QAAQA,EAAE;AAAA,MACV,YAAYsL,EAAY,SAAS;AAAA,MACjC,aAAaA,EAAY,UAAU;AAAA,MACnC,YAAYA,EAAY,KAAK;AAAA,MAC7B,YAAYA,EAAY,KAAK;AAAA,IAAA,CAC9B;AAAA,EACH,GAAG,CAACA,EAAY,OAAOA,EAAY,QAAQA,EAAY,GAAGA,EAAY,CAAC,CAAC,GAGlE6D,KAAoB/B,EAAY,CAACpN,MAAwB;AAC7D,IAAAA,EAAE,gBAAA,GACFA,EAAE,eAAA;AAGF,UAAMoP,IAAOhD,EAAQ,SAAS,sBAAA;AAC9B,IAAKgD,KAEL5C,GAAY;AAAA,MACV,QAAQxM,EAAE;AAAA,MACV,QAAQA,EAAE;AAAA,MACV,YAAYsL,EAAY,UAAU;AAAA,MAClC,SAAS8D,EAAK,OAAOA,EAAK,QAAQ;AAAA,MAClC,SAASA,EAAK,MAAMA,EAAK,SAAS;AAAA,IAAA,CACnC;AAAA,EACH,GAAG,CAAC9D,EAAY,MAAM,CAAC;AAGvB,EAAAQ,GAAU,MAAM;AACd,QAAI,CAACS,GAAU;AAEf,UAAMmB,IAAkB,CAAC1N,MAAkB;AACzC,YAAM6O,IAAK7O,EAAE,UAAUuM,GAAS,SAC1BuC,KAAK9O,EAAE,UAAUuM,GAAS;AAGhC,UAAI8C,MAFU,KAAK,MAAMP,IAAID,CAAE,KAAK,MAAM,KAAK,MAEvB,MAAM;AAK9B,UAJIQ,KAAW,MAAGA,MAAY,MAG9B5C,GAAiB,UAAU4C,IACvBjD,EAAQ,SAAS;AACnB,cAAMkD,IAAQhE,EAAY,aAAa;AACvC,QAAAc,EAAQ,QAAQ,MAAM,YAAY,UAAUiD,EAAQ,QAAQC,CAAK,GAAG,KAAA;AAAA,MACtE;AAAA,IACF,GAEMV,IAAgB,MAAM;AAC1B,YAAMW,IAAa9C,GAAiB,WAAWF,GAAS;AACxD,MAAAE,GAAiB,UAAU,MAEvBrB,KACFA,EAAatI,EAAK,IAAI;AAAA,QACpB,aAAa;AAAA,UACX,GAAGwI;AAAA,UACH,QAAQ,KAAK,MAAMiE,CAAU;AAAA,QAAA;AAAA,MAC/B,CACD,GAEH/C,GAAY,IAAI;AAAA,IAClB;AAEA,kBAAO,iBAAiB,aAAakB,CAAe,GACpD,OAAO,iBAAiB,WAAWkB,CAAa,GAEzC,MAAM;AACX,aAAO,oBAAoB,aAAalB,CAAe,GACvD,OAAO,oBAAoB,WAAWkB,CAAa;AAAA,IACrD;AAAA,EACF,GAAG,CAACrC,IAAUnB,GAActI,EAAK,IAAIwI,CAAW,CAAC;AAGjD,QAAMkE,IAAU1M,EAAK,SAAS,SAGxB2M,KAAgC;AAAA,IACpC,UAAU;AAAA,IACV,MAAMnE,EAAY,KAAK;AAAA,IACvB,KAAKA,EAAY,KAAK;AAAA,IACtB,OAAO2B;AAAA,IACP,QAAQC;AAAA;AAAA,IAER,YAAYsC,IAAU,gBAAiBlE,EAAY,cAAc;AAAA,IACjE,iBAAiBkE,IAAU,SAAalE,EAAY,kBAChD,OAAOA,EAAY,eAAe,MAClC;AAAA,IACJ,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,SAAS,MAAM,QAAQA,EAAY,OAAO,IACtCA,EAAY,QAAQ,KAAK,KAAK,IAAI,OAClCA,EAAY;AAAA,IAChB,QAAQ,MAAM,QAAQA,EAAY,MAAM,IACpCA,EAAY,OAAO,KAAK,KAAK,IAAI,OACjCA,EAAY;AAAA,IAChB,cAAckE,IAAU,SAAYlE,EAAY;AAAA;AAAA;AAAA,IAGhD,QAAQlC,KAAc,CAAC0D,IACnB,sBACAA,KAEE0C,IADA,SAGElE,EAAY,UAAU;AAAA;AAAA,IAE9B,eAAe;AAAA,IACf,SAASA,EAAY,WAAW;AAAA,IAChC,WAAW,UAAUmB,GAAiB,YAAYnB,EAAY,UAAU,EAAE,QAAQA,EAAY,aAAa,EAAE,GAAG,KAAA;AAAA,IAChH,iBAAiB;AAAA,IACjB,QAAQlC,IAAa,MAAQkC,EAAY,UAAU;AAAA,IACnD,QAAQI,KAAe,CAACK,IAAgB,SAASN,IAAc,YAAY;AAAA,IAC3E,WAAW;AAAA;AAAA,IAEX,UAAUrC,KAAc0D,KAAU0C,IAAU,YAAY;AAAA,EAAA,GAIpDE,KAAgB3C,IAAa,EAAE,GAAGA,EAAW,UAAU,GAAG,GAAGA,EAAW,UAAU,MAAM,EAAE,GAAG,GAAG,GAAG,EAAA,GACnG4C,KAAc5C,IAAa,EAAE,GAAGA,EAAW,QAAQ,GAAG,GAAGA,EAAW,QAAQ,MAAM,EAAE,GAAG,GAAG,GAAG,EAAA;AAEnG,SACE,gBAAAjF;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKsE;AAAA,MACL,gBAActJ,EAAK;AAAA,MACnB,OAAO2M;AAAA,MACP,SAAS,CAACzP,MAAM;AACd,gBAAQ,IAAI,wBAAwB8C,EAAK,IAAI,gBAAgB2I,CAAW;AAExE,cAAMmE,IAAgBhE,EAAW;AACjC,QAAIH,KAAemE,KAAiB,CAAC7D,KAAiB,CAACM,KAAY,CAACE,OAClEvM,EAAE,gBAAA,GACF4P,EAAc5P,CAAC;AAAA,MAGnB;AAAA,MACA,aAAa,CAACA,MAAM;AAClB,QAAI0L,KAAeP,KAAe,CAACY,KACjCZ,EAAYnL,CAAC;AAAA,MAEjB;AAAA,MAEC,UAAA;AAAA,QAAAoJ,KAAc,CAAC0D,KAAU,CAAC0C,KACzB,gBAAA1H,EAAAO,IAAA,EAEE,UAAA;AAAA,UAAA,gBAAAb;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,QAAQ,MAAM,eAAe,QAAQ,QAAQ,aAAa,WAAW,QAAQ,YAAY,OAAA;AAAA,cAClG,aAAa,CAACxH,MAAMiP,EAAkBjP,GAAG,IAAI;AAAA,cAC7C,OAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAER,gBAAAwH;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,QAAQ,MAAM,eAAe,QAAQ,QAAQ,aAAa,WAAW,QAAQ,aAAa,OAAA;AAAA,cACnG,aAAa,CAACxH,MAAMiP,EAAkBjP,GAAG,IAAI;AAAA,cAC7C,OAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAER,gBAAAwH;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,QAAQ,MAAM,eAAe,QAAQ,QAAQ,aAAa,cAAc,QAAQ,YAAY,OAAA;AAAA,cACrG,aAAa,CAACxH,MAAMiP,EAAkBjP,GAAG,IAAI;AAAA,cAC7C,OAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAER,gBAAAwH;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,QAAQ,MAAM,eAAe,QAAQ,QAAQ,aAAa,cAAc,QAAQ,aAAa,OAAA;AAAA,cACtG,aAAa,CAACxH,MAAMiP,EAAkBjP,GAAG,IAAI;AAAA,cAC7C,OAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAIR,gBAAAwH;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,QAAQ,MAAM,eAAe,QAAQ,QAAQ,QAAQ,WAAW,SAAS,WAAW,oBAAoB,WAAW,0BAAA;AAAA,cAC5H,aAAa,CAACxH,MAAMmP,GAAkBnP,CAAC;AAAA,cACvC,OAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAGR,gBAAAwH;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAU;AAAA,cACV,OAAO,EAAE,QAAQ,MAAM,eAAe,QAAQ,WAAW,SAAS,WAAW,mBAAA;AAAA,YAAmB;AAAA,UAAA;AAAA,UAIlG,gBAAAM,EAAC,OAAA,EAAI,WAAU,+FACZ,UAAA;AAAA,YAAAhF,EAAK;AAAA,YAAK;AAAA,YAAE4J,IAAgB,IAAIA,EAAc,IAAI,MAAM;AAAA,UAAA,EAAA,CAC3D;AAAA,QAAA,GACF;AAAA,QAIDtD,KAAc0D,KAAUC,KAAc3B,KACrC,gBAAAtD,EAAAO,IAAA,EAEE,UAAA;AAAA,UAAA,gBAAAb;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,MAAMkI,GAAc,IAAI;AAAA,gBACxB,KAAKA,GAAc,IAAI;AAAA,gBACvB,WAAW;AAAA,cAAA;AAAA,cAEb,aAAa,CAAC1P,MAAMwN,EAAqBxN,GAAG,OAAO;AAAA,cACnD,OAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAGR,gBAAAwH;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,eAAY;AAAA,cACZ,WAAU;AAAA,cACV,OAAO;AAAA,gBACL,MAAMmI,GAAY,IAAI;AAAA,gBACtB,KAAKA,GAAY,IAAI;AAAA,gBACrB,WAAW;AAAA,cAAA;AAAA,cAEb,aAAa,CAAC3P,MAAMwN,EAAqBxN,GAAG,KAAK;AAAA,cACjD,OAAM;AAAA,YAAA;AAAA,UAAA;AAAA,UAIR,gBAAAwH,EAAC,OAAA,EAAI,WAAU,+FACZ,YAAK,KAAA,CACR;AAAA,QAAA,GACF;AAAA,0BAID,OAAA,EAAI,WAAU,0BACZ,UAAAqF,sBACE,OAAA,EAAI,WAAU,iBACZ,UAAA1D,GAAe0D,GAAiB/I,GAAMsF,CAAgB,EAAA,CACzD,IACGoG,IAKD;AAAA;AAAA,UAHF,gBAAAhI,EAAC,OAAA,EAAI,WAAU,wEAAuE,UAAA,MAAA,CAEtF;AAAA,WAEJ;AAAA,QAGC1E,EAAK,SAAS,WAAWA,EAAK,8BAC5B,OAAA,EAAI,WAAU,wCACZ,UAAAA,EAAK,SAAS,IAAI,CAAAmC,MACjB,gBAAAuC,EAAC,OAAA,EAAuB,WAAU,uBAChC,UAAA,gBAAAA;AAAA,UAACqI;AAAA,UAAA;AAAA,YACC,MAAM5K;AAAA,YACN,YAAY;AAAA,YACZ,MAAAnB;AAAA,YACA,cAAAsH;AAAA,YACA,OAAOC;AAAA,UAAA;AAAA,QAAA,KANDpG,EAAU,EAQpB,CACD,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR,GAKa4K,KAAeC,GAAM,KAAK7E,IAAuB,CAAC8E,GAAWC,MAAc;AACtF,QAAMC,IAAQF,EAAU,MAClBG,IAAQF,EAAU,MAGlBG,IACJF,EAAM,OAAOC,EAAM,MACnBD,EAAM,YAAY,MAAMC,EAAM,YAAY,KAC1CD,EAAM,YAAY,MAAMC,EAAM,YAAY,KAC1CD,EAAM,YAAY,UAAUC,EAAM,YAAY,SAC9CD,EAAM,YAAY,WAAWC,EAAM,YAAY,QAG3CE,IAAeH,EAAM,gBAAgBC,EAAM,aAG3CG,IACJN,EAAU,eAAeC,EAAU,cACnCD,EAAU,UAAUC,EAAU;AAEhC,SAAOG,KAAkBC,KAAgBC;AAC3C,CAAC,GCn5BKC,KAAe;AAAA,EACnB;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EACjC;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EACjC;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EACjC;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AACnC,GAEaC,KAA0C,CAAC;AAAA,EACtD,OAAAvP,IAAQ;AAAA,EACR,UAAAwP;AAAA,EACA,kBAAAC;AACF,MAAM;AACJ,QAAM,CAACC,GAASC,CAAU,IAAIhK,GAAS,EAAK,GACtC,CAACiK,GAAYC,CAAa,IAAIlK,GAAS3F,CAAK,GAC5C8P,IAAajF,GAAuB,IAAI;AAE9C,EAAAC,GAAU,MAAM;AACd,IAAA+E,EAAc7P,CAAK;AAAA,EACrB,GAAG,CAACA,CAAK,CAAC,GAEV8K,GAAU,MAAM;AACd,UAAMiF,IAAqB,CAAC/Q,MAAkB;AAC5C,MAAI8Q,EAAW,WAAW,CAACA,EAAW,QAAQ,SAAS9Q,EAAE,MAAc,MACrE2Q,EAAW,EAAK,GAChBF,IAAmB,EAAE,aAAa,MAAMG,GAAY;AAAA,IAExD;AACA,WAAIF,KACF,SAAS,iBAAiB,aAAaK,CAAkB,GAEpD,MAAM,SAAS,oBAAoB,aAAaA,CAAkB;AAAA,EAC3E,GAAG,CAACL,GAASD,GAAkBG,CAAU,CAAC;AAE1C,QAAMI,IAAoB,CAAC3G,MAAkB;AAC3C,IAAAwG,EAAcxG,CAAK,GACnBmG,IAAW,EAAE,aAAa,MAAMnG,GAAO;AAAA,EACzC;AAEA,SACE,gBAAAvC,EAAC,OAAA,EAAI,KAAKgJ,GAAY,OAAO,EAAE,UAAU,YAAY,SAAS,eAAA,GAC5D,UAAA;AAAA,IAAA,gBAAAtJ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS,MAAMmJ,EAAW,CAACD,CAAO;AAAA,QAClC,OAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,iBAAiBE;AAAA,UACjB,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,QAAQ;AAAA,QAAA;AAAA,MACV;AAAA,IAAA;AAAA,IAEDF,KACC,gBAAA5I;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,KAAK;AAAA,UACL,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,cAAc;AAAA,UACd,WAAW;AAAA,UACX,QAAQ;AAAA,QAAA;AAAA,QAGV,UAAA;AAAA,UAAA,gBAAAN,EAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,qBAAqB,kBAAkB,KAAK,EAAA,GACxE,UAAA8I,GAAa,IAAI,CAACjG,MACjB,gBAAA7C;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,SAAS,MAAM;AACb,gBAAAwJ,EAAkB3G,CAAK,GACvBsG,EAAW,EAAK,GAChBF,IAAmB,EAAE,aAAa,MAAMpG,GAAO;AAAA,cACjD;AAAA,cACA,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,iBAAiBA;AAAA,gBACjB,QAAQuG,MAAevG,IAAQ,sBAAsB;AAAA,gBACrD,cAAc;AAAA,gBACd,QAAQ;AAAA,cAAA;AAAA,YACV;AAAA,YAbKA;AAAA,UAAA,CAeR,GACH;AAAA,UACA,gBAAA7C;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,OAAOoJ;AAAA,cACP,UAAU,CAAC5Q,MAAMgR,EAAkBhR,EAAE,OAAO,KAAK;AAAA,cACjD,QAAQ,MAAMyQ,IAAmB,EAAE,aAAa,MAAMG,GAAY;AAAA,cAClE,OAAO;AAAA,gBACL,OAAO;AAAA,gBACP,WAAW;AAAA,gBACX,QAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,cAAc;AAAA,cAAA;AAAA,YAChB;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GAEJ;AAEJ,GCxEM,EAAA,UAAEK,OAAaC,IAMRC,KAAgC,CAAC,EAAE,iBAAAC,QAAsB;AACpE,QAAMC,IAAexF,GAA6B,IAAI,GAChDyF,IAAYzF,GAAuB,IAAI,GACvC0F,IAAa1F,GAAuB,IAAI,GAExC;AAAA,IACJ,OAAA2F;AAAA,IACA,gBAAAC;AAAA,IACA,MAAApN;AAAA,IACA,aAAAiC;AAAA,IACA,UAAAnC;AAAA,IACA,QAAAuN;AAAA,IACA,aAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,SAAAC;AAAA,IACA,YAAAC;AAAA,IACA,YAAAC;AAAA,IACA,YAAAC;AAAA,IACA,MAAAC;AAAA,IACA,MAAAC;AAAA,IACA,SAAAC;AAAA,IACA,kBAAA5L;AAAA,IACA,gBAAA6L;AAAA,IACA,mBAAA5L;AAAA,EAAA,IACE5D,GAAA;AACJ,UAAQ,IAAI,kBAAkB6O,CAAc;AAC5C,QAAM,CAACY,IAAYC,EAAa,IAAI3L,GAAS,EAAK,GAC5C,GAAG4L,EAAW,IAAI5L,GAAS,EAAE,GAC7B6L,KAAU3G,GAAOxH,CAAI;AAC3B,EAAAyH,GAAU,MAAM;AACd,IAAA0G,GAAQ,UAAUnO;AAAA,EACpB,GAAG,CAACA,CAAI,CAAC;AAET,QAAMoO,IAAgB5G,GAAO,EAAK,GAC5B6G,IAAe7G,GAAO,EAAE,GAAG,GAAG,GAAG,GAAG,GACpC8G,IAAgB9G,GAAO,EAAE,GAAG,GAAG,GAAG,GAAG,MAAM,GAAG,MAAM,EAAA,CAAG,GACvD+G,IAAkB/G,GAAoB,IAAI,GAG1C,CAACgH,GAAaC,CAAc,IAAInM,GAInC,EAAE,OAAO,MAAM,KAAK,MAAM,WAAW,GAAA,CAAO,GAGzC,CAACoM,GAAcC,CAAe,IAAIrM,GAGrC,EAAE,OAAO,MAAM,KAAK,MAAM,GACvB,CAACsM,GAAiBC,CAAkB,IAAIvM,GAAmB,CAAA,CAAE;AAGzC,EAAAkF,GAAO,EAAK;AAGtC,QAAM,CAACsH,IAAkBC,CAAmB,IAAIzM,GAAS,EAAK,GACxD,CAAC0M,IAAWC,EAAY,IAAI3M;AAAA,IAChC,KAAK,UAAUyK,GAAiB,MAAM,CAAC;AAAA,EAAA,GAInC,CAACmC,IAAqBC,CAAsB,IAAI7M,GAAS,EAAK,GAG9D,CAAC8M,GAAgBC,CAAiB,IAAI/M,GAAS,EAAK,GAIpDgN,IAAoBvG,EAAY,CAACwG,GAAiBC,MAAoB;AAC1E,QAAI,CAACvC,EAAU,QAAS,QAAO,EAAE,GAAG,GAAG,GAAG,EAAA;AAE1C,UAAMhE,IAAagE,EAAU,QAAQ,sBAAA,GAE/BwC,IAAiBF,IAAUtG,EAAW,MACtCyG,IAAiBF,IAAUvG,EAAW,KAEtC0G,IAAkB1G,EAAW,QAAQoE,EAAO,OAC5CuC,IAAkB3G,EAAW,SAASoE,EAAO,QAE7C5M,IAAIgP,IAAiBE,GACrBjP,IAAIgP,IAAiBE;AAC3B,WAAO,EAAE,GAAG,KAAK,MAAMnP,CAAC,GAAG,GAAG,KAAK,MAAMC,CAAC,EAAA;AAAA,EAC5C,GAAG,CAAC2M,EAAO,OAAOA,EAAO,MAAM,CAAC,GAG1BwC,KAA0B9G,EAAY,CAACwG,GAAiBC,MACrDF,EAAkBC,GAASC,CAAO,GACxC,CAACF,CAAiB,CAAC,GAGhBQ,KAAiB/G;AAAA,IACrB,CAACgH,GAAiCC,GAA+BC,IAA2B,OAAS;AACnG,UAAI,CAAChO,EAAY,SAAU;AAE3B,YAAMtC,IAAWsC,EAAY,UACvBlC,IAASJ,EAAS,UAAU,CAAA,GAC5BwG,IAAapG,EAAO,cAAcA,EAAO,aAAa,GAEtDU,IAAI,KAAK,IAAIsP,EAAM,GAAGC,EAAI,CAAC,GAC3BtP,IAAI,KAAK,IAAIqP,EAAM,GAAGC,EAAI,CAAC,GAE3BE,IAAiB,KAAK,MAAMH,EAAM,IAAItP,CAAC,GACvC0P,IAAiB,KAAK,MAAMJ,EAAM,IAAIrP,CAAC,GACvC0P,KAAe,KAAK,MAAMJ,EAAI,IAAIvP,CAAC,GACnC4P,KAAe,KAAK,MAAML,EAAI,IAAItP,CAAC,GAEnCsJ,KAAc,KAAK,IAAI7D,IAAa,GAAG,CAAC,GACxCmK,KAAY,KAAK,IAAI,KAAK,IAAIP,EAAM,IAAIC,EAAI,CAAC,GAAGhG,EAAW,GAC3DuG,KAAa,KAAK,IAAI,KAAK,IAAIR,EAAM,IAAIC,EAAI,CAAC,GAAGhG,EAAW,GAE5DlE,KAA6B;AAAA,QACjC,GAAGnG;AAAA,QACH,IAAIrB,EAAA;AAAA,QACJ,QAAQ;AAAA,UACN,OAAOyB,EAAO;AAAA,UACd,YAAAoG;AAAA,UACA,WAAWA;AAAA,UACX,UAAUpG,EAAO;AAAA,UACjB,QAAQmQ;AAAA,UACR,QAAQC;AAAA,UACR,MAAMC;AAAA,UACN,MAAMC;AAAA,QAAA;AAAA,MACR,GAGIzR,KAAgB;AAAA,QACpB,IAAIN,EAAA;AAAA,QACJ,MAAM,GAAGqB,EAAS,IAAI,IAAI,KAAK,KAAK;AAAA,QACpC,MAAM;AAAA,QACN,aAAa;AAAA,UACX,OAAO2Q;AAAA,UACP,QAAQC;AAAA,UACR,GAAA9P;AAAA,UACA,GAAAC;AAAA,UACA,YAAY;AAAA,QAAA;AAAA,QAEd,aAAa;AAAA,UACX,YAAY,CAACH,GAAoBuF,EAAY,CAAC;AAAA,UAC9C,iBAAiB;AAAA,QAAA;AAAA,QAEnB,aAAa;AAAA,UACX,aAAa;AAAA,UACb,aAAa;AAAA,UACb,aAAa;AAAA,UACb,cAAc;AAAA,QAAA;AAAA,MAChB;AAKF,UAFA0H,EAAQ5O,IAAS,EAAK,GAElBqR,GAAiB;AACnB,cAAMO,KAAY,EAAE,GAAGR,EAAI,GAAG,GAAGA,EAAI,EAAA;AACrC,QAAAvB,EAAe;AAAA,UACb,OAAO+B;AAAA,UACP,KAAK,EAAE,GAAGA,GAAA;AAAA,UACV,WAAW;AAAA,QAAA,CACZ;AAAA,MACH;AACE,QAAA/B,EAAe,EAAE,OAAO,MAAM,KAAK,MAAM,WAAW,IAAO,GAC3DV,EAAA;AAAA,IAEJ;AAAA,IACA,CAAC9L,EAAY,UAAUuL,GAASO,CAAc;AAAA,EAAA,GAI1C0C,KAAkB1H,EAAY,MAAM;AACxC,UAAMpK,IAAQqO,EAAa,SAAS;AACpC,IAAIrO,KACF2O,EAAY;AAAA,MACV,OAAO3O,EAAM;AAAA,MACb,WAAWA,EAAM;AAAA,MACjB,WAAWA,EAAM;AAAA,IAAA,CAClB;AAAA,EAEL,GAAG,CAAC2O,CAAW,CAAC,GAGVoD,IAAoB3H;AAAA,IACxB,CAACpN,MAAwB;AACvB,MAAIyS,EAAc,WAEdpO,MAAS,iBAEXrE,EAAE,WAAWsR,EAAU,WACtBtR,EAAE,OAAuB,SAAS,WAAW,YAE9C8R,EAAW,IAAI,GACfoB,EAAmB,CAAA,CAAE;AAAA,IAEzB;AAAA,IACA,CAACpB,GAAYzN,CAAI;AAAA,EAAA,GAIb2Q,KAAwB5H;AAAA,IAC5B,CAACpN,MAAwB;AACvB,UAAIA,EAAE,WAAW,GAGjB;AAAA,YAAIqE,MAAS,eAAeiC,EAAY,UAAU;AAChD,UAAAtG,EAAE,gBAAA;AACF,gBAAMiV,IAAMtB,EAAkB3T,EAAE,SAASA,EAAE,OAAO;AAClD,UAAK6S,EAAY,YAENA,EAAY,SACrBsB,GAAetB,EAAY,OAAOoC,GAAK,EAAI,IAF3CnC,EAAe,EAAE,OAAOmC,GAAK,KAAKA,GAAK,WAAW,IAAM;AAI1D;AAAA,QACF;AAGA,YAAI5Q,MAAS,gBAAgB,CAACoP,GAAgB;AAC5C,gBAAMwB,IAAMf,GAAwBlU,EAAE,SAASA,EAAE,OAAO;AACxD,UAAAgT,EAAgB,EAAE,OAAOiC,GAAK,KAAKA,GAAK,GACxC/B,EAAmB,CAAA,CAAE,GACrBlT,EAAE,eAAA,GACFA,EAAE,gBAAA;AAAA,QACJ;AAAA;AAAA,IACF;AAAA,IACA,CAACqE,GAAMiC,EAAY,UAAUuM,EAAY,WAAWA,EAAY,OAAOY,GAAgBU,IAAgBR,GAAmBO,EAAuB;AAAA,EAAA,GAI7IgB,KAA0B9H;AAAA,IAC9B,CAACpN,MAAwB;AACvB,UAAI,EAAAqE,MAAS,eAAe,CAACiC,EAAY,aACrCuM,EAAY,aAAaA,EAAY,OAAO;AAC9C,cAAMoC,IAAMtB,EAAkB3T,EAAE,SAASA,EAAE,OAAO;AAClD,QAAAmU,GAAetB,EAAY,OAAOoC,GAAK,EAAK;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,CAAC5Q,GAAMiC,EAAY,UAAUuM,EAAY,WAAWA,EAAY,OAAOsB,IAAgBR,CAAiB;AAAA,EAAA,GAIpGwB,KAAiB/H,EAAY,CAACpN,MAAuB;AACzD,IAAAA,EAAE,eAAA,GACFA,EAAE,aAAa,aAAa,QAC5BsS,GAAc,EAAI;AAAA,EACpB,GAAG,CAAA,CAAE,GAEC8C,KAAkBhI,EAAY,CAACpN,MAAuB;AAC1D,IAAAA,EAAE,eAAA,GACFsS,GAAc,EAAK;AAAA,EACrB,GAAG,CAAA,CAAE,GAGC+C,KAAajI;AAAA,IACjB,CAACpN,MAAuB;AAGtB,UAFAA,EAAE,eAAA,GACFsS,GAAc,EAAK,GACf,GAAChB,EAAU,WAAWjN,MAAS;AAEnC,YAAI;AACF,gBAAMP,IAAO9D,EAAE,aAAa,QAAQ,kBAAkB;AACtD,cAAI,CAAC8D,EAAM;AACX,gBAAME,IAAW,KAAK,MAAMF,CAAI,GAC1BmR,IAAMtB,EAAkB3T,EAAE,SAASA,EAAE,OAAO,GAC5C8E,IAAImQ,EAAI,IAAI,IACZlQ,IAAIkQ,EAAI,IAAI,IACZhS,IAAU4B,GAAkBC,GAAGC,GAAGf,CAAQ;AAChD,UAAA6N,EAAQ5O,CAAO,GACfiQ,EAAmB,CAACjQ,EAAQ,EAAE,CAAC;AAAA,QACjC,SAASc,GAAO;AACd,kBAAQ,MAAM,qCAAqCA,CAAK;AAAA,QAC1D;AAAA,IACF;AAAA,IACA,CAACM,GAAMwN,GAAS8B,CAAiB;AAAA,EAAA,GAI7B2B,KAAsBlI;AAAA,IAC1B,CAACpN,GAAqB8C,MAAe;AAEnC,MAAKuB,MAAS,YAAYA,MAAS,gBAAiB,CAACvB,EAAK,YAAY,gBACtE9C,EAAE,gBAAA,GACF8R,EAAWhP,EAAK,EAAE,GAClB2P,EAAc,UAAU,IACxBC,EAAa,UAAU,EAAE,GAAG1S,EAAE,SAAS,GAAGA,EAAE,QAAA,GAC5C2S,EAAc,UAAU;AAAA,QACtB,GAAG7P,EAAK,YAAY,KAAK;AAAA,QACzB,GAAGA,EAAK,YAAY,KAAK;AAAA,QACzB,MAAMA,EAAK,YAAY,KAAK;AAAA,QAC5B,MAAMA,EAAK,YAAY,KAAK;AAAA,MAAA,GAE9B8P,EAAgB,UAAU9P,GAC1B9C,EAAE,eAAA;AAAA,IACJ;AAAA,IACA,CAACqE,GAAMyN,CAAU;AAAA,EAAA;AAInB,EAAAhG,GAAU,MAAM;AACd,UAAM4B,IAAkB,CAAC1N,MAAkB;AAEzC,UAAIyS,EAAc,WAAWhB,KAAkBmB,EAAgB,SAAS;AACtE,YAAI,CAACtB,EAAU,QAAS;AACxB,cAAMhE,IAAagE,EAAU,QAAQ,sBAAA,GAC/B0C,IAAkB1G,EAAW,QAAQoE,EAAO,OAC5CuC,IAAkB3G,EAAW,SAASoE,EAAO,QAC7C6D,IAAWvV,EAAE,UAAU0S,EAAa,QAAQ,GAC5C8C,IAAWxV,EAAE,UAAU0S,EAAa,QAAQ,GAC5C+C,KAAWF,IAAWvB,GACtB0B,KAAWF,IAAWvB,GACtBlF,KAAO4D,EAAc,QAAQ,IAAI8C,IACjCzG,KAAO2D,EAAc,QAAQ,IAAI+C,IACjCC,KAAS,SAAS;AAAA,UACtB,kBAAkBlE,CAAc;AAAA,QAAA;AAElC,QAAIkE,OACFA,GAAO,MAAM,OAAO,GAAG5G,EAAI,MAC3B4G,GAAO,MAAM,MAAM,GAAG3G,EAAI,OAE5B2D,EAAc,QAAQ,OAAO5D,IAC7B4D,EAAc,QAAQ,OAAO3D;AAAA,MAC/B;AAEA,UAAI3K,MAAS,gBAAgB0O,EAAa,OAAO;AAC/C,cAAMkC,IAAMf,GAAwBlU,EAAE,SAASA,EAAE,OAAO;AACxD,QAAAgT,EAAgB,CAAC4C,OAAU,EAAE,GAAGA,GAAM,KAAKX,IAAM;AAAA,MACnD;AAEA,UAAI5Q,MAAS,eAAewO,EAAY,WAAW;AACjD,cAAMoC,IAAMtB,EAAkB3T,EAAE,SAASA,EAAE,OAAO;AAClD,QAAA8S,EAAe,CAAC8C,OAAU,EAAE,GAAGA,GAAM,KAAKX,IAAM;AAAA,MAClD;AAAA,IACF,GAEMrG,IAAgB,MAAM;AAC1B,UAAI6D,EAAc,WAAWhB,KAAkBmB,EAAgB,SAAS;AACtE,cAAM7Q,IAAQa,GAAe,SAAA,GACvBmM,IAAO4D,EAAc,QAAQ,QAAQA,EAAc,QAAQ,GAC3D3D,IAAO2D,EAAc,QAAQ,QAAQA,EAAc,QAAQ;AACjE,QAAA5Q,EAAM,WAAW0P,GAAgB;AAAA,UAC/B,aAAa;AAAA,YACX,GAAGmB,EAAgB,QAAQ;AAAA,YAC3B,GAAG7D;AAAA,YACH,GAAGC;AAAA,UAAA;AAAA,QACL,CACD;AAAA,MACH;AAKA,UAJAyD,EAAc,UAAU,IACxBG,EAAgB,UAAU,MAC1BL,GAAY,CAAA,CAAE,GAEVlO,MAAS,gBAAgB0O,EAAa,SAASA,EAAa,KAAK;AACnE,cAAM7N,IAAO,KAAK,IAAI6N,EAAa,MAAM,GAAGA,EAAa,IAAI,CAAC,GACxD3N,IAAO,KAAK,IAAI2N,EAAa,MAAM,GAAGA,EAAa,IAAI,CAAC,GACxD5N,IAAO,KAAK,IAAI4N,EAAa,MAAM,GAAGA,EAAa,IAAI,CAAC,GACxD1N,IAAO,KAAK,IAAI0N,EAAa,MAAM,GAAGA,EAAa,IAAI,CAAC,GAExD8C,IAAcrE,EACjB,OAAO,CAAC1O,MAAS;AAChB,gBAAMgT,KAAQhT,EAAK,YAAY,KAAK,GAC9BiT,KAAQjT,EAAK,YAAY,KAAK,GAC9BkT,KAAQlT,EAAK,YAAY,SAAS,GAClCmT,KAAQnT,EAAK,YAAY,UAAU,GACnCoT,KAAUJ,KAAQE,KAAQ,GAC1BG,KAAUJ,KAAQE,KAAQ;AAChC,iBAAOC,MAAWhR,KAAQgR,MAAW9Q,KAAQ+Q,MAAWhR,KAAQgR,MAAW9Q;AAAA,QAC7E,CAAC,EACA,IAAI,CAACvC,MAASA,EAAK,EAAE;AAExB,QAAAoQ,EAAmB2C,CAAW,GAC9B7C,EAAgB,EAAE,OAAO,MAAM,KAAK,MAAM;AAAA,MAC5C;AAAA,IACF,GAEMoD,IAAgB,CAACpW,MAAqB;AAC1C,MAAIA,EAAE,QAAQ,YAAYqE,MAAS,gBACjCyO,EAAe,EAAE,OAAO,MAAM,KAAK,MAAM,WAAW,IAAO,GAC3DtM,EAAA,IAEExG,EAAE,QAAQ,aACRyR,MAA2BA,CAAc,IACpCwB,EAAgB,SAAS,MAChCA,EAAgB,QAAQ,CAAC/P,MAAO8O,EAAW9O,CAAE,CAAC,GAC9CgQ,EAAmB,CAAA,CAAE,KAGrBlT,EAAE,WAAWA,EAAE,QAAQ,QACzBA,EAAE,eAAA,GACFiS,EAAA,IAEEjS,EAAE,WAAWA,EAAE,QAAQ,QACzBA,EAAE,eAAA,GACFkS,EAAA,IAGElS,EAAE,QAAQ,OAAO,CAACyT,MACpBzT,EAAE,eAAA,GACF0T,EAAkB,EAAI;AAAA,IAE1B,GAEM2C,IAAc,CAACrW,MAAqB;AAExC,MAAIA,EAAE,QAAQ,OAAOyT,KACnBC,EAAkB,EAAK;AAAA,IAE3B;AAEA,kBAAO,iBAAiB,aAAahG,CAAe,GACpD,OAAO,iBAAiB,WAAWkB,CAAa,GAChD,OAAO,iBAAiB,WAAWwH,CAAa,GAChD,OAAO,iBAAiB,SAASC,CAAW,GACrC,MAAM;AACX,aAAO,oBAAoB,aAAa3I,CAAe,GACvD,OAAO,oBAAoB,WAAWkB,CAAa,GACnD,OAAO,oBAAoB,WAAWwH,CAAa,GACnD,OAAO,oBAAoB,SAASC,CAAW;AAAA,IACjD;AAAA,EACF,GAAG;AAAA,IACD5E;AAAA,IAEAsB;AAAA,IACA1O;AAAA,IACAwO,EAAY;AAAA,IACZI;AAAA,IACAzB;AAAA,IACAE,EAAO;AAAA,IACPA,EAAO;AAAA,IACPM;AAAA,IACAC;AAAA,IACAwB;AAAA,IACAvB;AAAA,IACA1L;AAAA,IACAmN;AAAA,IACAO;AAAA,IACAhB;AAAA,EAAA,CACD;AAGD,QAAMoD,KAAkBlJ,EAAY,MAAM;AAExC,UAAMmJ,IAActD,EAAgB,SAAS,IACzCA,EAAgB,IAAI,CAAC/P,MAAOsO,EAAM,KAAK,CAACpO,MAAMA,EAAE,OAAOF,CAAE,CAAC,EAAE,OAAO,OAAO,IAC1EuO,IACE,CAACD,EAAM,KAAK,CAACpO,MAAMA,EAAE,OAAOqO,CAAc,CAAC,EAAE,OAAO,OAAO,IAC3D,CAAA;AAEN,QAAI8E,EAAY,WAAW,EAAG;AAG9B,UAAMC,IAAuB,CAAA;AAC7B,IAAAD,EAAY,QAAQ,CAACzT,MAAS;AAC5B,YAAMG,IAAU;AAAA,QACd,GAAGH;AAAA,QACH,IAAIH,EAAA;AAAA,QACJ,MAAM,GAAGG,EAAK,IAAI;AAAA,QAClB,aAAa;AAAA,UACX,GAAGA,EAAK;AAAA,UACR,IAAIA,EAAK,YAAY,KAAK,KAAK;AAAA,UAC/B,IAAIA,EAAK,YAAY,KAAK,KAAK;AAAA,QAAA;AAAA,MACjC;AAEF,MAAA+O,EAAQ5O,CAAO,GACfuT,EAAW,KAAKvT,EAAQ,EAAE;AAAA,IAC5B,CAAC,GAGGuT,EAAW,WAAW,IACxB1E,EAAW0E,EAAW,CAAC,CAAC,IAExBtD,EAAmBsD,CAAU;AAAA,EAEjC,GAAG,CAAC/E,GAAgBwB,GAAiBzB,GAAOK,GAASC,GAAYoB,CAAkB,CAAC,GAG9EuD,KAAmBrJ,EAAY,MAAM;AACzC,QAAI6F,EAAgB,SAAS,EAAG;AAChC,UAAMyD,IAAwB,CAAA;AAC9B,aAASxV,IAAI,GAAGA,IAAI+R,EAAgB,QAAQ/R,KAAK;AAC/C,YAAMgC,IAAK+P,EAAgB/R,CAAC,GACtB4B,IAAO0O,EAAM,KAAK,CAACpO,OAAMA,GAAE,OAAOF,CAAE;AAC1C,UAAKJ,GACL;AAAA,YAAIA,GAAM,SAAS,SAAS;AAI1BkC,UAFiBlC,EAAK,SAEb,QAAQ,CAACwC,OAAUoR,EAAc,KAAK;AAAA,YAC7C,GAAGpR;AAAA,YACH,aAAa;AAAA,cACX,GAAGA,GAAM;AAAA,cACT,IAAIxC,EAAK,YAAY,KAAK,MAAMwC,GAAM,YAAY,KAAK;AAAA,cACvD,IAAIxC,EAAK,YAAY,KAAK,MAAMwC,GAAM,YAAY,KAAK;AAAA,YAAA;AAAA,UACzD,CACD,CAAC,GAEF0M,EAAW9O,CAAE;AACb;AAAA,QACF;AACA,QAAAwT,EAAc,KAAK5T,CAAI;AAAA;AAAA,IACzB;AACA,QAAI4T,EAAc,SAAS,EAAG;AAG9B,QAAIxR,IAAO,OAAUC,IAAO,OACxBC,IAAO,QAAWC,IAAO;AAE7B,IAAAqR,EAAc,QAAQ,CAAC5T,MAAS;AAC9B,YAAMgC,IAAIhC,EAAK,YAAY,KAAK,GAC1BiC,IAAIjC,EAAK,YAAY,KAAK,GAC1B6T,KAAI7T,EAAK,YAAY,SAAS,GAC9B8T,KAAI9T,EAAK,YAAY,UAAU;AACrC,MAAAoC,IAAO,KAAK,IAAIA,GAAMJ,CAAC,GACvBK,IAAO,KAAK,IAAIA,GAAMJ,CAAC,GACvBK,IAAO,KAAK,IAAIA,GAAMN,IAAI6R,EAAC,GAC3BtR,IAAO,KAAK,IAAIA,GAAMN,IAAI6R,EAAC;AAAA,IAC7B,CAAC;AAGD,UAAM5R,IAAW0R,EAAc,IAAI,CAAC5T,OAAU;AAAA,MAC5C,GAAGA;AAAA,MACH,aAAa;AAAA,QACX,GAAGA,EAAK;AAAA,QACR,IAAIA,EAAK,YAAY,KAAK,KAAKoC;AAAA,QAC/B,IAAIpC,EAAK,YAAY,KAAK,KAAKqC;AAAA,MAAA;AAAA,IACjC,EACA,GAGI0R,IAAuB;AAAA,MAC3B,IAAIlU,EAAA;AAAA,MACJ,MAAM,MAAM,KAAK,IAAA,CAAK;AAAA,MACtB,MAAM;AAAA,MACN,aAAa;AAAA,QACX,GAAGuC;AAAA,QACH,GAAGC;AAAA,QACH,OAAOC,IAAOF;AAAA,QACd,QAAQG,IAAOF;AAAA,QACf,YAAY;AAAA,MAAA;AAAA,MAEd,aAAa;AAAA,QACX,YAAY,CAAA;AAAA,QACZ,iBAAiB;AAAA,MAAA;AAAA,MAEnB,aAAa;AAAA,QACX,aAAa;AAAA,QACb,aAAa;AAAA,QACb,aAAa;AAAA,QACb,cAAc;AAAA,MAAA;AAAA,MAEhB,UAAAH;AAAA,IAAA;AAIF,IAAAiO,EAAgB,QAAQ,CAAC/P,MAAO8O,EAAW9O,CAAE,CAAC,GAC9C2O,EAAQgF,CAAS,GACjB3D,EAAmB,CAAA,CAAE,GACrBpB,EAAW+E,EAAU,EAAE;AAAA,EACzB,GAAG,CAAC5D,GAAiBzB,GAAOQ,GAAYH,GAASC,CAAU,CAAC,GAGtDgF,KAAqB1J,EAAY,MAAM;AAE3C,UAAM2J,IAAsB9D,EAAgB,SAAS,IACjDA,EACC,IAAI,CAAC/P,MAAOsO,EAAM,KAAK,CAACpO,MAAMA,EAAE,OAAOF,CAAE,CAAC,EAC1C,OAAO,CAACE,MAAsB,CAAC,CAACA,KAAKA,EAAE,SAAS,OAAO,IACxDqO,IACE,CAACD,EAAM,KAAK,CAACpO,MAAMA,EAAE,OAAOqO,CAAc,CAAC,EAAE,OAAO,CAACrO,MAAsB,CAAC,CAACA,KAAKA,EAAE,SAAS,OAAO,IACpG,CAAA;AAEN,IAAI2T,EAAoB,WAAW,MAGnCA,EAAoB,QAAQ,CAACF,MAAc;AACzC,UAAI,CAACA,EAAU,YAAYA,EAAU,SAAS,WAAW,EAAG;AAG5D,YAAMG,IAAmBH,EAAU,SAAS,IAAI,CAACvR,OAAW;AAAA,QAC1D,GAAGA;AAAA,QACH,aAAa;AAAA,UACX,GAAGA,EAAM;AAAA,UACT,IAAIuR,EAAU,YAAY,KAAK,MAAMvR,EAAM,YAAY,KAAK;AAAA,UAC5D,IAAIuR,EAAU,YAAY,KAAK,MAAMvR,EAAM,YAAY,KAAK;AAAA,QAAA;AAAA,MAC9D,EACA;AAGF,MAAA0M,EAAW6E,EAAU,EAAE,GACvBG,EAAiB,QAAQ,CAAC1R,MAAUuM,EAAQvM,CAAK,CAAC;AAAA,IACpD,CAAC,GAGD4N,EAAmB,CAAA,CAAE,GACrBpB,EAAW,IAAI;AAAA,EACjB,GAAG,CAACL,GAAgBwB,GAAiBzB,GAAOQ,GAAYH,GAASC,GAAYoB,CAAkB,CAAC,GAG1F+D,KAAwB7J;AAAA,IAC5B,CAAC8J,MAAyC;AACxC,UAAIjE,EAAgB,SAAS,EAAG;AAEhC,YAAMyD,IAAgBzD,EACnB,IAAI,CAAC/P,MAAOsO,EAAM,KAAK,CAACpO,MAAMA,EAAE,OAAOF,CAAE,CAAC,EAC1C,OAAO,CAACE,MAAiB,CAAC,CAACA,KAAKA,EAAE,SAAS,OAAO;AAErD,UAAIsT,EAAc,SAAS,EAAG;AAG9B,UAAIxR,IAAO,OAAUE,IAAO,QACxBD,IAAO,OAAUE,IAAO;AAE5B,MAAAqR,EAAc,QAAQ,CAAC5T,MAAS;AAC9B,cAAMgC,IAAIhC,EAAK,YAAY,KAAK,GAC1BiC,KAAIjC,EAAK,YAAY,KAAK;AAChC,QAAAoC,IAAO,KAAK,IAAIA,GAAMJ,CAAC,GACvBM,IAAO,KAAK,IAAIA,GAAMN,CAAC,GACvBK,IAAO,KAAK,IAAIA,GAAMJ,EAAC,GACvBM,IAAO,KAAK,IAAIA,GAAMN,EAAC;AAAA,MACzB,CAAC;AAGD,YAAMoS,IAAc,CAAC,GAAGT,CAAa,EAAE,KAAK,CAACU,GAAGC,MAC1CH,MAAc,gBACRE,EAAE,YAAY,KAAK,MAAMC,EAAE,YAAY,KAAK,MAE5CD,EAAE,YAAY,KAAK,MAAMC,EAAE,YAAY,KAAK,EAEvD,GAGKC,IAAQH,EAAY;AAC1B,UAAID,MAAc,cAAc;AAE9B,cAAMK,KADanS,IAAOF,MACCoS,IAAQ;AACnC,QAAAH,EAAY,QAAQ,CAACrU,IAAMU,OAAU;AACnC,gBAAMuL,KAAO7J,IAAOqS,IAAO/T;AAC3B,UAAAuO,EAAWjP,GAAK,IAAI;AAAA,YAClB,aAAa,EAAE,GAAGA,GAAK,aAAa,GAAGiM,GAAA;AAAA,UAAK,CAC7C;AAAA,QACH,CAAC;AAAA,MACH,OAAO;AAEL,cAAMwI,KADclS,IAAOF,MACCmS,IAAQ;AACpC,QAAAH,EAAY,QAAQ,CAACrU,IAAMU,OAAU;AACnC,gBAAMwL,KAAO7J,IAAOoS,IAAO/T;AAC3B,UAAAuO,EAAWjP,GAAK,IAAI;AAAA,YAClB,aAAa,EAAE,GAAGA,GAAK,aAAa,GAAGkM,GAAA;AAAA,UAAK,CAC7C;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAACiE,GAAiBzB,GAAOO,CAAU;AAAA,EAAA,GAI/ByF,KAAmBpK;AAAA,IACvB,CAAC8J,MAAmD;AAClD,UAAIjE,EAAgB,SAAS,EAAG;AAChC,YAAMlR,IAAQa,GAAe,SAAA,GACvB8T,IAAgBzD,EACnB,IAAI,CAAC/P,MAAOsO,EAAM,KAAK,CAACpO,MAAMA,EAAE,OAAOF,CAAE,CAAC,EAC1C,OAAO,CAACE,MAAiB,CAAC,CAACA,CAAC;AAC/B,UAAIsT,EAAc,SAAS,EAAG;AAE9B,UAAIe,IAAa;AACjB,cAAQP,GAAA;AAAA,QACN,KAAK;AACH,UAAAO,IAAa,KAAK,IAAI,GAAGf,EAAc,IAAI,CAACtT,MAAMA,EAAE,YAAY,KAAK,CAAC,CAAC;AACvE;AAAA,QACF,KAAK;AACH,UAAAqU,IAAa,KAAK;AAAA,YAChB,GAAGf,EAAc,IAAI,CAACtT,OAAOA,EAAE,YAAY,KAAK,MAAMA,EAAE,YAAY,SAAS,EAAE;AAAA,UAAA;AAEjF;AAAA,QACF,KAAK;AACH,UAAAqU,IAAa,KAAK,IAAI,GAAGf,EAAc,IAAI,CAACtT,MAAMA,EAAE,YAAY,KAAK,CAAC,CAAC;AACvE;AAAA,QACF,KAAK;AACH,UAAAqU,IAAa,KAAK;AAAA,YAChB,GAAGf,EAAc,IAAI,CAACtT,OAAOA,EAAE,YAAY,KAAK,MAAMA,EAAE,YAAY,UAAU,EAAE;AAAA,UAAA;AAElF;AAAA,MAAA;AAGJ,MAAAsT,EAAc,QAAQ,CAAC5T,MAAS;AAC9B,YAAIiM,IAAOjM,EAAK,YAAY,KAAK,GAC7BkM,IAAOlM,EAAK,YAAY,KAAK;AACjC,gBAAQoU,GAAA;AAAA,UACN,KAAK;AACH,YAAAnI,IAAO0I;AACP;AAAA,UACF,KAAK;AACH,YAAA1I,IAAO0I,KAAc3U,EAAK,YAAY,SAAS;AAC/C;AAAA,UACF,KAAK;AACH,YAAAkM,IAAOyI;AACP;AAAA,UACF,KAAK;AACH,YAAAzI,IAAOyI,KAAc3U,EAAK,YAAY,UAAU;AAChD;AAAA,QAAA;AAEJ,QAAAf,EAAM,WAAWe,EAAK,IAAI;AAAA,UACxB,aAAa,EAAE,GAAGA,EAAK,aAAa,GAAGiM,GAAM,GAAGC,EAAA;AAAA,QAAK,CACtD;AAAA,MACH,CAAC;AAAA,IACH;AAAA,IACA,CAACiE,GAAiBzB,CAAK;AAAA,EAAA,GAInBkG,KAAiB;AAAA,IACrB;AAAA,MACE,wBAAOC,IAAA,EAAe;AAAA,MACtB,OAAO;AAAA,MACP,QAAQtT,MAAS;AAAA,MACjB,SAAS,MAAM;AACb,QAAA8N,EAAQ,QAAQ;AAAA,MAClB;AAAA,IAAA;AAAA,IAEF;AAAA,MACE,wBAAOyF,IAAA,EAAc;AAAA,MACrB,OAAO;AAAA,MACP,QAAQvT,MAAS;AAAA,MACjB,SAAS,MAAM;AACb,QAAA8N,EAAQ,YAAY,GACpBe,EAAmB,CAAA,CAAE;AAAA,MACvB;AAAA,IAAA;AAAA,IAEF;AAAA,MACE,wBAAO2E,IAAA,EAAa;AAAA,MACpB,OAAO;AAAA,MACP,QAAQxT,MAAS;AAAA,MACjB,SAAS,MAAM;AACb,QAAA8N,EAAQ,MAAM;AAAA,MAChB;AAAA,IAAA;AAAA,IAEF;AAAA,MACE,wBAAOxK,IAAA,EAAa;AAAA,MACpB,OAAO;AAAA,MACP,QAAQtD,MAAS;AAAA,MACjB,SAAS,MAAM;AACb,QAAA8N,EAAQ,WAAW;AAAA,MACrB;AAAA,IAAA;AAAA,IAEF;AAAA,MACE,wBAAO2F,IAAA,EAAY;AAAA,MACnB,OAAO;AAAA,MACP,QAAQzT,MAAS;AAAA,MACjB,SAAS,MAAM;AACb,QAAA8N,EAAQ,SAAS;AAAA,MACnB;AAAA,IAAA;AAAA,EACF,GAGI4F,KAAgBpL;AAAA,IACpB,MAAM;AAAA,MACJ,EAAE,MAAM,gBAAAnF,EAACwQ,IAAA,CAAA,CAAa,GAAI,OAAO,eAAe,SAAS/F,EAAA;AAAA,MACzD,EAAE,MAAM,gBAAAzK,EAACyQ,IAAA,CAAA,CAAa,GAAI,OAAO,eAAe,SAAS/F,EAAA;AAAA,MACzD;AAAA,QACE,wBAAOgG,IAAA,EAAa;AAAA,QACpB,OAAO;AAAA,QACP,UAAU,CAACzG,KAAkBwB,EAAgB,WAAW;AAAA,QACxD,SAASqD;AAAA,MAAA;AAAA,MAEX;AAAA,QACE,wBAAOsB,IAAA,EAAc;AAAA,QACrB,OAAO;AAAA,QACP,UAAU3E,EAAgB,SAAS;AAAA,QACnC,SAASwD;AAAA,MAAA;AAAA,MAEX;AAAA,QACE,wBAAO0B,IAAA,EAAgB;AAAA,QACvB,OAAO;AAAA,QACP,UAAU,CAAC1G,KAAkBwB,EAAgB,WAAW;AAAA,QACxD,SAAS6D;AAAA,MAAA;AAAA,MAEX;AAAA,QACE,wBAAOsB,IAAA,EAAkB;AAAA,QACzB,OAAO;AAAA,QACP,UAAUnF,EAAgB,SAAS;AAAA,QACnC,SAAS,MAAMuE,GAAiB,MAAM;AAAA,MAAA;AAAA,MAExC;AAAA,QACE,wBAAOa,IAAA,EAAmB;AAAA,QAC1B,OAAO;AAAA,QACP,UAAUpF,EAAgB,SAAS;AAAA,QACnC,SAAS,MAAMuE,GAAiB,OAAO;AAAA,MAAA;AAAA,MAEzC;AAAA,QACE,wBAAOc,IAAA,EAAyB;AAAA,QAChC,OAAO;AAAA,QACP,UAAUrF,EAAgB,SAAS;AAAA,QACnC,SAAS,MAAMuE,GAAiB,KAAK;AAAA,MAAA;AAAA,MAEvC;AAAA,QACE,wBAAOe,IAAA,EAA4B;AAAA,QACnC,OAAO;AAAA,QACP,UAAUtF,EAAgB,SAAS;AAAA,QACnC,SAAS,MAAMuE,GAAiB,QAAQ;AAAA,MAAA;AAAA,MAE1C;AAAA,QACE,wBAAOgB,IAAA,EAAoB;AAAA,QAC3B,OAAO;AAAA,QACP,UAAUvF,EAAgB,SAAS;AAAA,QACnC,SAAS,MAAMgE,GAAsB,YAAY;AAAA,MAAA;AAAA,MAEnD;AAAA,QACE,wBAAOwB,IAAA,EAAqB;AAAA,QAC5B,OAAO;AAAA,QACP,UAAUxF,EAAgB,SAAS;AAAA,QACnC,SAAS,MAAMgE,GAAsB,UAAU;AAAA,MAAA;AAAA,MAEjD;AAAA,QACE,wBAAOyB,IAAA,EAAgB;AAAA,QACvB,OAAO;AAAA,QACP,SAAS,MAAMlF,EAAuB,EAAI;AAAA,MAAA;AAAA,MAE5C;AAAA,QACE,wBAAOmF,IAAA,EAAmB;AAAA,QAC1B,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS,MAAMvF,EAAoB,EAAI;AAAA,MAAA;AAAA,MAEzC;AAAA,QACE,wBAAOxL,IAAA,EAAe;AAAA,QACtB,OAAO;AAAA,QACP,UAAU,CAAC6J,KAAkBwB,EAAgB,WAAW;AAAA,QACxD,SAAS,MAAM;AACb,UAAIxB,MAA2BA,CAAc,IACpCwB,EAAgB,SAAS,MAChCA,EAAgB,QAAQ,CAAC/P,MAAO8O,EAAW9O,CAAE,CAAC,GAC9CgQ,EAAmB,CAAA,CAAE;AAAA,QAEzB;AAAA,MAAA;AAAA,IACF;AAAA,IAEF;AAAA,MACEjB;AAAA,MACAC;AAAA,MACA7N;AAAA,MACA8N;AAAA,MACAe;AAAA,MACAD;AAAA,MACAwD;AAAA,MACAK;AAAA,MACAR;AAAA,MACAkB;AAAA,MACAP;AAAA,MACAzD;AAAA,MACAJ;AAAA,MACA3B;AAAA,MACAO;AAAA,IAAA;AAAA,EACF,GAIIoE,KAAgBhJ;AAAA,IAAY,CAACpN,MAAqB;AACtD,MAAAA,EAAE,eAAA,IACEA,EAAE,QAAQ,eAAeA,EAAE,QAAQ,gBAAgBA,EAAE,QAAQ,aAAaA,EAAE,QAAQ,gBAChEiT,EAAgB,IAAI,CAAC/P,MAAOsO,EAAM,KAAK,CAACpO,MAAMA,EAAE,OAAOF,CAAE,CAAC,EAClE,QAAQ,CAACJ,MAAS;AAC9B,QAAIA,KACFiP,EAAWjP,EAAK,IAAI;AAAA,UAClB,aAAa;AAAA,YACX,GAAGA,EAAK;AAAA,YACR,IAAIA,EAAK,YAAY,KAAK,KAAK,KAAK9C,EAAE,QAAQ,cAAc,IAAIA,EAAE,QAAQ,eAAe,KAAK;AAAA,YAC9F,IAAI8C,EAAK,YAAY,KAAK,KAAK,KAAK9C,EAAE,QAAQ,YAAY,IAAIA,EAAE,QAAQ,cAAc,KAAK;AAAA,UAAA;AAAA,QAC7F,CACD;AAAA,MAEL,CAAC;AAAA,IAEL;AAAA,IACE,CAACiT,GAAiBzB,GAAOO,CAAU;AAAA,EAAA;AAErC,SAAAjG,GAAU,OACR,SAAS,iBAAiB,WAAWsK,EAAa,GAC3C,MAAM;AACX,aAAS,oBAAoB,WAAWA,EAAa;AAAA,EACvD,IACC,CAACA,EAAa,CAAC,GAGhB,gBAAAtO,EAAC,OAAA,EAAI,WAAU,2CAEb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,iFACb,UAAA;AAAA,MAAA,gBAAAN,EAACoR,IAAA,EACE,aAAe,IAAI,CAACC,MACnB,gBAAArR,EAACsR,IAAA,EAAwB,OAAOD,EAAI,OAClC,UAAA,gBAAArR;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,MAAMmR,EAAI,SAAS,YAAY;AAAA,UAC/B,MAAMA,EAAI;AAAA,UACV,SAASA,EAAI;AAAA,QAAA;AAAA,MAAA,EACf,GALYA,EAAI,KAMlB,CACD,GACH;AAAA,MACA,gBAAArR,EAACoR,IAAA,EACE,UAAAb,GAAc,IAAI,CAACc,MAClB,gBAAArR,EAACsR,IAAA,EAAwB,OAAOD,EAAI,OAClC,UAAA,gBAAArR;AAAA,QAACE;AAAA,QAAA;AAAA,UACC,MAAOmR,EAAY,SAAS,YAAYA,EAAI,QAAQ;AAAA,UACpD,MAAMA,EAAI;AAAA,UACV,SAASA,EAAI;AAAA,UACb,UAAUA,EAAI;AAAA,QAAA;AAAA,MAAA,KALJA,EAAI,KAOlB,CACD,EAAA,CACH;AAAA,IAAA,GACF;AAAA,IAGA,gBAAArR,EAAC,OAAA,EAAI,KAAK+J,GAAY,WAAU,mBAC9B,UAAA,gBAAA/J;AAAA,MAACuR;AAAA,MAAA;AAAA,QACC,KAAK1H;AAAA,QACL,cAAc;AAAA,QACd,kBAAkB;AAAA,QAClB,kBAAkB;AAAA,QAClB,UAAU;AAAA,QACV,UAAU;AAAA,QACV,eAAeyD;AAAA,QACf,eAAe;AAAA,QACf,iBAAiB;AAAA,QACjB,SAAS,EAAE,UAAU,CAACrB,MAAmBpP,MAAS,YAAYA,MAAS,eAAeA,MAAS,eAAe,kBAAkB,GAAA;AAAA,QAChI,OAAO,EAAE,UAAU,IAAO,MAAM,IAAA;AAAA,QAChC,OAAO,EAAE,UAAU,GAAA;AAAA,QACnB,aAAa,EAAE,UAAU,GAAA;AAAA,QAExB,WAAC,EAAE,QAAA2U,GAAQ,SAAAC,GAAS,gBAAAC,EAAA,MACnB,gBAAApR,EAAAO,IAAA,EAEE,UAAA;AAAA,UAAA,gBAAAb,EAAC,SAAI,WAAU,oEACb,UAAA,gBAAAM,EAAC8Q,IAAA,EAAM,WAAU,YACf,UAAA;AAAA,YAAA,gBAAApR,EAACsR,IAAA,EAAQ,OAAM,MACb,UAAA,gBAAAtR,EAACE,GAAA,EAAO,MAAM,gBAAAF,EAAC2R,IAAA,EAAe,GAAI,SAAS,MAAMH,EAAA,GAAU,GAC7D;AAAA,YACA,gBAAAxR,EAACsR,IAAA,EAAQ,OAAM,MACb,4BAACpR,GAAA,EAAO,MAAM,gBAAAF,EAAC4R,IAAA,EAAgB,GAAI,SAAS,MAAMH,EAAA,GAAW,GAC/D;AAAA,YACA,gBAAAzR,EAACsR,IAAA,EAAQ,OAAM,QACb,UAAA,gBAAAtR,EAACE,GAAA,EAAO,SAAS,MAAMwR,EAAA,GAAkB,UAAA,OAAA,CAAI,EAAA,CAC/C;AAAA,YACA,gBAAApR,EAAC,OAAA,EAAI,WAAU,qCACZ,UAAA;AAAA,cAAA,KAAK,MAAM3D,EAAS,QAAQ,GAAG;AAAA,cAAE;AAAA,YAAA,EAAA,CACpC;AAAA,UAAA,EAAA,CACF,EAAA,CACF;AAAA,UAEA,gBAAAqD;AAAA,YAAC6R;AAAA,YAAA;AAAA,cACC,cAAc,EAAE,OAAO,QAAQ,QAAQ,QAAQ,UAAU,WAAA;AAAA,cACzD,cAAc;AAAA,gBACZ,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,gBAAgB;AAAA,cAAA;AAAA,cAGlB,UAAA,gBAAAvR;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,KAAKwJ;AAAA,kBACL,eAAY;AAAA,kBACZ,WAAW,YAAYe,KAAa,yCAAyC,EAC3E,IAAIhO,MAAS,cAAc,qBAAqB,EAAE,IAAIoP,IAAiB,gBAAgB,EAAE;AAAA,kBAC3F,OAAO;AAAA,oBACL,OAAO/B,EAAO;AAAA,oBACd,QAAQA,EAAO;AAAA,oBACf,YAAY;AAAA,oBACZ,iBAAiBA,EAAO;AAAA,oBACxB,iBAAiBA,EAAO,kBAAkB,OAAOA,EAAO,eAAe,MAAM;AAAA,oBAC7E,gBAAgB;AAAA,oBAChB,oBAAoB;AAAA,kBAAA;AAAA,kBAEtB,SAASqD;AAAA,kBACT,aAAaC;AAAA,kBACb,eAAeE;AAAA,kBACf,YAAYC;AAAA,kBACZ,aAAaC;AAAA,kBACb,QAAQC;AAAA,kBAGP,UAAA;AAAA,oBAAA3D,EAAO,aAAa,MACnB,gBAAA5J,EAAC,OAAA,EAAI,WAAU,6CAA4C,OAAO4J,EAAO,OAAO,QAAQA,EAAO,QAC7F,UAAA;AAAA,sBAAA,gBAAAlK,EAAC,QAAA,EACC,4BAAC,WAAA,EAAQ,IAAG,QAAO,OAAM,MAAK,QAAO,MAAK,cAAa,kBACrD,4BAAC,QAAA,EAAK,GAAE,qBAAoB,MAAK,QAAO,QAAO,WAAU,aAAY,IAAA,CAAI,EAAA,CAC3E,EAAA,CACF;AAAA,wCACC,QAAA,EAAK,OAAM,QAAO,QAAO,QAAO,MAAK,aAAA,CAAa;AAAA,oBAAA,GACrD;AAAA,oBAIDgK,EAAM,IAAI,CAAC1O,MACV,gBAAA0E;AAAA,sBAACqI;AAAA,sBAAA;AAAA,wBAEC,MAAA/M;AAAA,wBACA,YACE2O,MAAmB3O,EAAK,MAAMmQ,EAAgB,SAASnQ,EAAK,EAAE;AAAA,wBAEhE,MAAMsO;AAAA,wBACN,SAAS,CAACpR,MAAwB;AAGhC,0BAFA,QAAQ,IAAI,iBAAiB8C,EAAK,IAAI,SAAS0P,GAAQ,OAAO,GAE1DA,GAAQ,YAAY,gBAEpBxS,EAAE,YACJ8R,EAAWhP,EAAK,EAAE,GAClBoQ,EAAmB,CAAC,GAAGD,GAAiBnQ,EAAK,EAAE,CAAC,MAEhDgP,EAAWhP,EAAK,EAAE,GAClBoQ,EAAmB,CAACpQ,EAAK,EAAE,CAAC;AAAA,wBAEhC;AAAA,wBACA,aAAa,CAAC9C,MAAMsV,GAAoBtV,GAAG8C,CAAI;AAAA,wBAC/C,cAAc,CAACW,GAAQN,MAAY4O,EAAWtO,GAAQN,CAAO;AAAA,wBAC7D,OAAOgB,EAAS;AAAA,sBAAA;AAAA,sBArBX,GAAGrB,EAAK,EAAE;AAAA,oBAAA,CAuBlB;AAAA,oBAGAuB,MAAS,eAAewO,EAAY,aAAaA,EAAY,SAASA,EAAY,OACjF,gBAAArL,EAAC,OAAA,EAAI,WAAU,6CAA4C,OAAOkK,EAAO,OAAO,QAAQA,EAAO,QAC7F,UAAA,gBAAAlK;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,IAAIqL,EAAY,MAAM;AAAA,wBACtB,IAAIA,EAAY,MAAM;AAAA,wBACtB,IAAIA,EAAY,IAAI;AAAA,wBACpB,IAAIA,EAAY,IAAI;AAAA,wBACpB,QAAO;AAAA,wBACP,aAAY;AAAA,wBACZ,iBAAgB;AAAA,wBAChB,eAAc;AAAA,wBACd,gBAAe;AAAA,sBAAA;AAAA,oBAAA,GAEnB;AAAA,oBAIDxO,MAAS,gBAAgB0O,EAAa,SAASA,EAAa,OAC3D,gBAAAvL;AAAA,sBAAC;AAAA,sBAAA;AAAA,wBACC,WAAU;AAAA,wBACV,OAAO;AAAA,0BACL,MAAM,KAAK,IAAIuL,EAAa,MAAM,GAAGA,EAAa,IAAI,CAAC;AAAA,0BACvD,KAAK,KAAK,IAAIA,EAAa,MAAM,GAAGA,EAAa,IAAI,CAAC;AAAA,0BACtD,OAAO,KAAK,IAAIA,EAAa,IAAI,IAAIA,EAAa,MAAM,CAAC;AAAA,0BACzD,QAAQ,KAAK,IAAIA,EAAa,IAAI,IAAIA,EAAa,MAAM,CAAC;AAAA,0BAC1D,QAAQ;AAAA,wBAAA;AAAA,sBACV;AAAA,oBAAA;AAAA,kBACF;AAAA,gBAAA;AAAA,cAAA;AAAA,YAEJ;AAAA,UAAA;AAAA,QACF,EAAA,CACF;AAAA,MAAA;AAAA,IAAA,GAGN;AAAA,IAGA,gBAAAvL;AAAA,MAAC8R;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,MAAMnG;AAAA,QACN,UAAU,MAAMC,EAAoB,EAAK;AAAA,QACzC,QAAQ;AAAA,QAER,UAAA,gBAAA5L,EAAC+R,KAAK,QAAO,YACX,4BAACA,EAAK,MAAL,EAAU,OAAM,eACf,UAAA,gBAAA/R;AAAA,UAACyJ;AAAAA,UAAA;AAAA,YACC,OAAOoC;AAAA,YACP,UAAU,CAACrT,MAAMsT,GAAatT,EAAE,OAAO,KAAK;AAAA,YAC5C,MAAM;AAAA,YACN,aAAY;AAAA,UAAA;AAAA,QAAA,GAEhB,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,IAIF,gBAAAwH;AAAA,MAAC8R;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,MAAM/F;AAAA,QACN,UAAU,MAAMC,EAAuB,EAAK;AAAA,QAC5C,QAAQ;AAAA,QAER,UAAA,gBAAA1L,EAACyR,GAAA,EAAK,QAAO,YACX,UAAA;AAAA,UAAA,gBAAA/R,EAAC+R,EAAK,MAAL,EAAU,OAAM,MACf,UAAA,gBAAA/R;AAAA,YAACgS;AAAA,YAAA;AAAA,cACC,OAAO9H,EAAO;AAAA,cACd,UAAU,CAAC+H,MAAM7H,EAAgB,EAAE,OAAO6H,KAAK,MAAM;AAAA,cACrD,KAAK;AAAA,cACL,KAAK;AAAA,cACL,OAAO,EAAE,OAAO,OAAA;AAAA,YAAO;AAAA,UAAA,GAE3B;AAAA,UACA,gBAAAjS,EAAC+R,EAAK,MAAL,EAAU,OAAM,MACf,UAAA,gBAAA/R;AAAA,YAACgS;AAAA,YAAA;AAAA,cACC,OAAO9H,EAAO;AAAA,cACd,UAAU,CAAC+H,MAAM7H,EAAgB,EAAE,QAAQ6H,KAAK,MAAM;AAAA,cACtD,KAAK;AAAA,cACL,KAAK;AAAA,cACL,OAAO,EAAE,OAAO,OAAA;AAAA,YAAO;AAAA,UAAA,GAE3B;AAAA,UACA,gBAAAjS,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAA/R;AAAA,YAACkS;AAAA,YAAA;AAAA,cACC,SAAShI,EAAO,aAAa;AAAA,cAC7B,UAAU,CAACiI,MAAY/H,EAAgB,EAAE,UAAU+H,GAAS;AAAA,YAAA;AAAA,UAAA,GAEhE;AAAA,UACA,gBAAAnS,EAAC+R,EAAK,MAAL,EAAU,OAAM,OACf,UAAA,gBAAAzR,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,YAAA,gBAAAN;AAAA,cAAC+I;AAAA,cAAA;AAAA,gBACC,OAAOmB,EAAO,cAAc;AAAA,gBAC5B,UAAU,CAACrH,MAAUuH,EAAgB,EAAE,YAAYvH,EAAM,cAAY,CAAG;AAAA,cAAA;AAAA,YAAA;AAAA,YAE1E,gBAAA7C;AAAA,cAAC0J;AAAA,cAAA;AAAA,gBACC,OAAOQ,EAAO;AAAA,gBACd,UAAU,CAAC1R,MAAM4R,EAAgB,EAAE,YAAY5R,EAAE,OAAO,OAAO;AAAA,gBAC/D,aAAY;AAAA,cAAA;AAAA,YAAA;AAAA,UACd,EAAA,CACF,EAAA,CACF;AAAA,UACA,gBAAA8H,EAACyR,EAAK,MAAL,EAAU,OAAM,QACf,UAAA;AAAA,YAAA,gBAAAzR,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,cAAA,gBAAAN;AAAA,gBAACQ;AAAA,gBAAA;AAAA,kBACC,QAAO;AAAA,kBACP,gBAAgB;AAAA,kBAChB,cAAc,CAACnB,MAAS;AAEtB,wBAAI,CADYA,EAAK,KAAK,WAAW,QAAQ;AAE3C,6BAAA+S,GAAQ,MAAM,WAAW,GAClB;AAET,0BAAM9S,IAAS,IAAI,WAAA;AACnB,2BAAAA,EAAO,SAAS,CAAC9G,MAAM;AACrB,4BAAM6Z,IAAS7Z,EAAE,QAAQ;AACzB,sBAAA4R,EAAgB,EAAE,iBAAiBiI,GAAQ,GAC3CD,GAAQ,QAAQ,UAAU;AAAA,oBAC5B,GACA9S,EAAO,cAAcD,CAAI,GAClB;AAAA,kBACT;AAAA,kBAEA,4BAACa,GAAA,EAAO,MAAM,gBAAAF,EAACS,IAAA,CAAA,CAAe,GAAI,UAAA,OAAA,CAAI;AAAA,gBAAA;AAAA,cAAA;AAAA,cAExC,gBAAAT;AAAA,gBAAC0J;AAAA,gBAAA;AAAA,kBACC,OAAOQ,EAAO;AAAA,kBACd,UAAU,CAAC1R,MAAM4R,EAAgB,EAAE,iBAAiB5R,EAAE,OAAO,OAAO;AAAA,kBACpE,aAAY;AAAA,kBACZ,OAAO,EAAE,MAAM,EAAA;AAAA,gBAAE;AAAA,cAAA;AAAA,cAElB0R,EAAO,mBACN,gBAAAlK;AAAA,gBAACE;AAAA,gBAAA;AAAA,kBACC,wBAAOoS,IAAA,EAAc;AAAA,kBACrB,SAAS,MAAMlI,EAAgB,EAAE,iBAAiB,QAAW;AAAA,kBAC7D,QAAM;AAAA,kBACN,MAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,YACP,GAEJ;AAAA,YACCF,EAAO,mBACN,gBAAAlK,EAAC,OAAA,EAAI,WAAU,2BAA0B,OAAO,EAAE,UAAU,OAAA,GAC1D,UAAA,gBAAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,KAAKkK,EAAO;AAAA,gBACZ,KAAI;AAAA,gBACJ,OAAO,EAAE,UAAU,QAAQ,WAAW,KAAK,WAAW,UAAA;AAAA,cAAU;AAAA,YAAA,EAClE,CACF;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ,GCtrCM,EAAA,QAAEqI,OAAWC,IASNC,KAAwD,CAAC;AAAA,EACpE,UAAAjW;AAAA,EACA,QAAAkW;AAAA,EACA,WAAAC,IAAY,CAAA;AAAA,EACZ,aAAAC,IAAc,CAAA;AAChB,MAAM;AAEJ,QAAM9W,IADeU,EACQ,WAAW,CAAA,GAElC,CAACqW,GAAUC,CAAW,IAAI3T,GAAS;AAAA,IACvC,OAAOrD,EAAQ,SAAS;AAAA,IACxB,OAAOA,EAAQ,SAAS;AAAA,IACxB,iBAAiBA,EAAQ,mBAAmB;AAAA,IAC5C,MAAMA,EAAQ,QAAQ;AAAA,IACtB,UAAUA,EAAQ,YAAY;AAAA,IAC9B,eAAeA,EAAQ,YAAY,YAAY;AAAA,IAC/C,iBAAiBA,EAAQ,YAAY,cAAc;AAAA,IACnD,YAAYA,EAAQ,YAAY,SAAS;AAAA,IACzC,eAAeA,EAAQ,YAAY,YAAY;AAAA,IAC/C,iBAAiBA,EAAQ,YAAY,cAAc;AAAA,IACnD,YAAYA,EAAQ,YAAY,SAAS;AAAA,EAAA,CAC1C;AAED,EAAAwI,GAAU,MAAM;AACd,IAAAwO,EAAY;AAAA,MACV,OAAOhX,EAAQ,SAAS;AAAA,MACxB,OAAOA,EAAQ,SAAS;AAAA,MACxB,iBAAiBA,EAAQ,mBAAmB;AAAA,MAC5C,MAAMA,EAAQ,QAAQ;AAAA,MACtB,UAAUA,EAAQ,YAAY;AAAA,MAC9B,eAAeA,EAAQ,YAAY,YAAY;AAAA,MAC/C,iBAAiBA,EAAQ,YAAY,cAAc;AAAA,MACnD,YAAYA,EAAQ,YAAY,SAAS;AAAA,MACzC,eAAeA,EAAQ,YAAY,YAAY;AAAA,MAC/C,iBAAiBA,EAAQ,YAAY,cAAc;AAAA,MACnD,YAAYA,EAAQ,YAAY,SAAS;AAAA,IAAA,CAC1C;AAAA,EACH,GAAG,CAACU,EAAS,EAAE,CAAC;AAEhB,QAAMuW,IAAe,CAACC,GAAexZ,MAAmB;AACtD,IAAAsZ,EAAY,CAAC1E,OAAU,EAAE,GAAGA,GAAM,CAAC4E,CAAK,GAAGxZ,EAAA,EAAQ;AAAA,EACrD,GAEMyZ,IAA0B,CAACC,MAAiB;AAChD,UAAMC,IAAiBP,EAAY,KAAK,CAACQ,MAAQA,EAAI,eAAeF,CAAI,GAClEG,IAAWF,GAAgB,QAAQ;AAEzC,IAAAL,EAAY,CAAC1E,OAAU;AAAA,MACrB,GAAGA;AAAA,MACH,iBAAiB8E;AAAA,MACjB,MAAMG;AAAA,MACN,OAAO,OAAOF,GAAgB,SAAS,EAAE;AAAA,IAAA,EACzC,GAEF,WAAW,MAAM;AACf,MAAAT,EAAO;AAAA,QACL,SAAS;AAAA,UACP,GAAG5W;AAAA,UACH,iBAAiBoX;AAAA,UACjB,OAAO,OAAOC,GAAgB,SAAS,EAAE;AAAA,UACzC,MAAME;AAAA,QAAA;AAAA,MACR,CACoB;AAAA,IACxB,GAAG,CAAC;AAAA,EACN,GAEMC,IAAa,MAAM;AACvB,IAAAZ,EAAO;AAAA,MACL,SAAS;AAAA,QACP,GAAG5W;AAAA,QACH,OAAO+W,EAAS;AAAA,QAChB,OAAOA,EAAS;AAAA,QAChB,iBAAiBA,EAAS;AAAA,QAC1B,MAAMA,EAAS;AAAA,QACf,UAAUA,EAAS;AAAA,QACnB,YAAY;AAAA,UACV,UAAUA,EAAS;AAAA,UACnB,YAAYA,EAAS;AAAA,UACrB,OAAOA,EAAS;AAAA,QAAA;AAAA,QAElB,YAAY;AAAA,UACV,UAAUA,EAAS;AAAA,UACnB,YAAYA,EAAS;AAAA,UACrB,OAAOA,EAAS;AAAA,QAAA;AAAA,MAClB;AAAA,IACF,CACoB;AAAA,EACxB,GAEMU,IAAmBX,EAAY;AAAA,IAAO,CAACQ,MAC3CT,EAAU,SAASS,EAAI,UAAU;AAAA,EAAA;AAGnC,SACE,gBAAA9S,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAN,EAACwT,MAAQ,OAAO,EAAE,WAAW,EAAA,GAAK,UAAA,QAAI;AAAA,IAEtC,gBAAAlT,EAACyR,GAAA,EAAK,QAAO,YACX,UAAA;AAAA,MAAA,gBAAA/R,EAAC+R,EAAK,MAAL,EAAU,OAAM,gBACf,UAAA,gBAAA/R;AAAA,QAAC0J;AAAA,QAAA;AAAA,UACC,OAAOmJ,EAAS;AAAA,UAChB,UAAU,CAACra,MAAMua,EAAa,SAASva,EAAE,OAAO,KAAK;AAAA,UACrD,QAAQ8a;AAAA,UACR,aAAY;AAAA,QAAA;AAAA,MAAA,GAEhB;AAAA,MAEA,gBAAAtT;AAAA,QAAC+R,EAAK;AAAA,QAAL;AAAA,UACC,OAAM;AAAA,UACN,MAAK;AAAA,UACL,UAAA,gBAAA/R;AAAA,YAACwS;AAAA,YAAA;AAAA,cACC,OAAOK,EAAS,mBAAmB;AAAA,cACnC,UAAUI;AAAA,cACV,aAAY;AAAA,cACZ,YAAU;AAAA,cACV,OAAO,EAAE,OAAO,OAAA;AAAA,cAChB,YAAY;AAAA,gBACV,OAAO;AAAA,gBACP,OAAO;AAAA,cAAA;AAAA,cAET,SAASM;AAAA,YAAA;AAAA,UAAA;AAAA,QACX;AAAA,MAAA;AAAA,MAGF,gBAAAvT;AAAA,QAAC+R,EAAK;AAAA,QAAL;AAAA,UACC,OAAOc,EAAS,kBAAkB,YAAY;AAAA,UAC9C,MACEA,EAAS,kBACL,qCACA;AAAA,UAEN,UAAA,gBAAA7S;AAAA,YAAC0J;AAAA,YAAA;AAAA,cACC,OAAOmJ,EAAS;AAAA,cAChB,UAAU,CAACra,MAAMua,EAAa,SAASva,EAAE,OAAO,KAAK;AAAA,cACrD,QAAQ8a;AAAA,cACR,aACET,EAAS,kBACL,kBACA;AAAA,cAEN,UAAU,CAAC,CAACA,EAAS;AAAA,cACrB,SAASA,EAAS,kBAAkB,WAAW;AAAA,YAAA;AAAA,UAAA;AAAA,QACjD;AAAA,MAAA;AAAA,wBAGDd,EAAK,MAAL,EAAU,OAAM,MAAK,MAAK,sBACzB,UAAA,gBAAA/R;AAAA,QAAC0J;AAAA,QAAA;AAAA,UACC,OAAOmJ,EAAS;AAAA,UAChB,UAAU,CAACra,MAAMua,EAAa,QAAQva,EAAE,OAAO,KAAK;AAAA,UACpD,QAAQ8a;AAAA,UACR,aAAY;AAAA,UACZ,QACET,EAAS,mBAAmBU,EAAiB,SAAS,IACpD,gBAAAvT,EAACO,IAAA,EAAI,OAAM,QAAO,OAAO,EAAE,aAAa,GAAA,GAAM,gBAE9C,IACE;AAAA,QAAA;AAAA,MAAA,GAGV;AAAA,MAEA,gBAAAP;AAAA,QAAC+R,EAAK;AAAA,QAAL;AAAA,UACC,OAAM;AAAA,UACN,MAAK;AAAA,UACL,UAAA,gBAAA/R;AAAA,YAACgS;AAAA,YAAA;AAAA,cACC,OAAOa,EAAS;AAAA,cAChB,UAAU,CAACZ,MAAMc,EAAa,YAAYd,KAAK,CAAC;AAAA,cAChD,QAAQqB;AAAA,cACR,KAAK;AAAA,cACL,KAAK;AAAA,cACL,OAAO,EAAE,OAAO,OAAA;AAAA,YAAO;AAAA,UAAA;AAAA,QACzB;AAAA,MAAA;AAAA,IACF,GACF;AAAA,IAEA,gBAAAtT,EAACwT,MAAQ,UAAA,OAAA,CAAI;AAAA,IAEb,gBAAAlT,EAACyR,GAAA,EAAK,QAAO,YACX,UAAA;AAAA,MAAA,gBAAAzR,EAAC8Q,IAAA,EACC,UAAA;AAAA,QAAA,gBAAApR,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAA/R;AAAA,UAACgS;AAAA,UAAA;AAAA,YACC,OAAOa,EAAS;AAAA,YAChB,UAAU,CAACZ,MAAMc,EAAa,iBAAiBd,KAAK,EAAE;AAAA,YACtD,QAAQqB;AAAA,YACR,KAAK;AAAA,YACL,KAAK;AAAA,UAAA;AAAA,QAAA,GAET;AAAA,QAEA,gBAAAtT,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAAzR;AAAA,UAACkS;AAAA,UAAA;AAAA,YACC,OAAOK,EAAS;AAAA,YAChB,UAAU,CAACZ,MAAM;AACf,cAAAc,EAAa,mBAAmBd,CAAC,GACjC,WAAWqB,GAAY,CAAC;AAAA,YAC1B;AAAA,YACA,OAAO,EAAE,OAAO,IAAA;AAAA,YAChB,UAAA;AAAA,cAAA,gBAAAtT,EAACuS,IAAA,EAAO,OAAM,UAAS,UAAA,MAAE;AAAA,cACzB,gBAAAvS,EAACuS,IAAA,EAAO,OAAM,QAAO,UAAA,KAAA,CAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,EACzB,CACF;AAAA,MAAA,GACF;AAAA,MAEA,gBAAAvS,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAAzR,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAAC+I;AAAA,UAAA;AAAA,YACC,OAAO8J,EAAS,cAAc;AAAA,YAC9B,UAAU,CAAChQ,MAAU;AACnB,cAAAkQ,EAAa,cAAclQ,EAAM,aAAa;AAAA,YAChD;AAAA,YACA,kBAAkB,CAACA,MAAU;AAC3B,cAAA6P,EAAO;AAAA,gBACL,SAAS;AAAA,kBACP,GAAG5W;AAAA,kBACH,OAAO+W,EAAS;AAAA,kBAChB,OAAOA,EAAS;AAAA,kBAChB,iBAAiBA,EAAS;AAAA,kBAC1B,MAAMA,EAAS;AAAA,kBACf,UAAUA,EAAS;AAAA,kBACnB,YAAY;AAAA,oBACV,UAAUA,EAAS;AAAA,oBACnB,YAAYA,EAAS;AAAA,oBACrB,OAAOhQ,EAAM,YAAA;AAAA,kBAAY;AAAA,kBAE3B,YAAY;AAAA,oBACV,UAAUgQ,EAAS;AAAA,oBACnB,YAAYA,EAAS;AAAA,oBACrB,OAAOA,EAAS;AAAA,kBAAA;AAAA,gBAClB;AAAA,cACF,CACoB;AAAA,YACxB;AAAA,UAAA;AAAA,QAAA;AAAA,QAEF,gBAAA7S;AAAA,UAAC0J;AAAA,UAAA;AAAA,YACC,OAAOmJ,EAAS;AAAA,YAChB,UAAU,CAACra,MAAMua,EAAa,cAAcva,EAAE,OAAO,KAAK;AAAA,YAC1D,QAAQ8a;AAAA,YACR,aAAY;AAAA,YACZ,OAAO,EAAE,OAAO,IAAA;AAAA,UAAI;AAAA,QAAA;AAAA,MACtB,EAAA,CACF,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAEA,gBAAAtT,EAACwT,MAAQ,UAAA,MAAA,CAAG;AAAA,IAEZ,gBAAAlT,EAACyR,GAAA,EAAK,QAAO,YACX,UAAA;AAAA,MAAA,gBAAAzR,EAAC8Q,IAAA,EACC,UAAA;AAAA,QAAA,gBAAApR,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAA/R;AAAA,UAACgS;AAAA,UAAA;AAAA,YACC,OAAOa,EAAS;AAAA,YAChB,UAAU,CAACZ,MAAMc,EAAa,iBAAiBd,KAAK,EAAE;AAAA,YACtD,QAAQqB;AAAA,YACR,KAAK;AAAA,YACL,KAAK;AAAA,UAAA;AAAA,QAAA,GAET;AAAA,QAEA,gBAAAtT,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAAzR;AAAA,UAACkS;AAAA,UAAA;AAAA,YACC,OAAOK,EAAS;AAAA,YAChB,UAAU,CAACZ,MAAM;AACf,cAAAc,EAAa,mBAAmBd,CAAC,GACjC,WAAWqB,GAAY,CAAC;AAAA,YAC1B;AAAA,YACA,OAAO,EAAE,OAAO,IAAA;AAAA,YAChB,UAAA;AAAA,cAAA,gBAAAtT,EAACuS,IAAA,EAAO,OAAM,UAAS,UAAA,MAAE;AAAA,cACzB,gBAAAvS,EAACuS,IAAA,EAAO,OAAM,QAAO,UAAA,KAAA,CAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,EACzB,CACF;AAAA,MAAA,GACF;AAAA,MAEA,gBAAAvS,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAAzR,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAAC+I;AAAA,UAAA;AAAA,YACC,OAAO8J,EAAS,cAAc;AAAA,YAC9B,UAAU,CAAChQ,MAAU;AACnB,cAAAkQ,EAAa,cAAclQ,EAAM,aAAa;AAAA,YAChD;AAAA,YACA,kBAAkB,CAACA,MAAU;AAC3B,cAAA6P,EAAO;AAAA,gBACL,SAAS;AAAA,kBACP,GAAG5W;AAAA,kBACH,OAAO+W,EAAS;AAAA,kBAChB,OAAOA,EAAS;AAAA,kBAChB,iBAAiBA,EAAS;AAAA,kBAC1B,MAAMA,EAAS;AAAA,kBACf,UAAUA,EAAS;AAAA,kBACnB,YAAY;AAAA,oBACV,UAAUA,EAAS;AAAA,oBACnB,YAAYA,EAAS;AAAA,oBACrB,OAAOA,EAAS;AAAA,kBAAA;AAAA,kBAElB,YAAY;AAAA,oBACV,UAAUA,EAAS;AAAA,oBACnB,YAAYA,EAAS;AAAA,oBACrB,OAAOhQ,EAAM,YAAA;AAAA,kBAAY;AAAA,gBAC3B;AAAA,cACF,CACoB;AAAA,YACxB;AAAA,UAAA;AAAA,QAAA;AAAA,QAEF,gBAAA7C;AAAA,UAAC0J;AAAA,UAAA;AAAA,YACC,OAAOmJ,EAAS;AAAA,YAChB,UAAU,CAACra,MAAMua,EAAa,cAAcva,EAAE,OAAO,KAAK;AAAA,YAC1D,QAAQ8a;AAAA,YACR,aAAY;AAAA,YACZ,OAAO,EAAE,OAAO,IAAA;AAAA,UAAI;AAAA,QAAA;AAAA,MACtB,EAAA,CACF,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ,GC/TaG,KAA0D,CAAC;AAAA,EACtE,UAAAjX;AAAA,EACA,QAAAkW;AACF,MAAM;AACJ,QAAM7Q,IAAgBrF,GAEhB,CAACqW,GAAUC,CAAW,IAAI3T,GAAS;AAAA,IACvC,MAAM3C,EAAS;AAAA,IACf,KAAKqF,EAAc,OAAO;AAAA,IAC1B,iBAAiBA,EAAc,mBAAmB;AAAA,IAClD,WAAWA,EAAc,aAAa;AAAA,EAAA,CACvC;AAED,EAAAyC,GAAU,MAAM;AACd,IAAAwO,EAAY;AAAA,MACV,MAAMtW,EAAS;AAAA,MACf,KAAKqF,EAAc,OAAO;AAAA,MAC1B,iBAAiBA,EAAc,mBAAmB;AAAA,MAClD,WAAWA,EAAc,aAAa;AAAA,IAAA,CACvC;AAAA,EACH,GAAG,CAACrF,EAAS,EAAE,CAAC;AAEhB,QAAMuW,IAAe,CAACC,GAAexZ,MAAkB;AACrD,IAAAsZ,EAAY,CAAC1E,OAAU,EAAE,GAAGA,GAAM,CAAC4E,CAAK,GAAGxZ,EAAA,EAAQ;AAAA,EACrD,GAEM8Z,IAAa,MAAM;AACvB,IAAAZ,EAAO;AAAA,MACL,MAAMG,EAAS;AAAA,MACf,KAAKA,EAAS;AAAA,MACd,iBAAiBA,EAAS;AAAA,IAAA,CACN;AAAA,EACxB;AAEA,SACE,gBAAAvS,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAN,EAACwT,MAAQ,OAAO,EAAE,WAAW,EAAA,GAAK,UAAA,QAAI;AAAA,IAEtC,gBAAAlT,EAACyR,GAAA,EAAK,QAAO,YACX,UAAA;AAAA,MAAA,gBAAA/R,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAA/R;AAAA,QAAC0J;AAAA,QAAA;AAAA,UACC,OAAOmJ,EAAS;AAAA,UAChB,UAAU,CAACra,MAAMua,EAAa,QAAQva,EAAE,OAAO,KAAK;AAAA,UACpD,QAAQ8a;AAAA,QAAA;AAAA,MAAA,GAEZ;AAAA,MAEA,gBAAAtT,EAAC+R,EAAK,MAAL,EAAU,OAAM,cACf,UAAA,gBAAA/R;AAAA,QAAC0J,GAAM;AAAA,QAAN;AAAA,UACC,OAAOmJ,EAAS;AAAA,UAChB,UAAU,CAACra,MAAMua,EAAa,OAAOva,EAAE,OAAO,KAAK;AAAA,UACnD,QAAQ8a;AAAA,UACR,MAAM;AAAA,UACN,aAAY;AAAA,QAAA;AAAA,MAAA,GAEhB;AAAA,MAEA,gBAAAtT,EAAC+R,EAAK,MAAL,EAAU,OAAM,cACf,UAAA,gBAAAzR,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAAC+I;AAAA,UAAA;AAAA,YACC,OAAO8J,EAAS,aAAa;AAAA,YAC7B,UAAU,CAAChQ,MAAU;AACnB,oBAAM6Q,IAAW7Q,EAAM,YAAA;AACvB,cAAAkQ,EAAa,aAAaW,CAAQ,GAElChB,EAAO;AAAA,gBACL,MAAMG,EAAS;AAAA,gBACf,KAAKA,EAAS;AAAA,gBACd,iBAAiBA,EAAS;AAAA,gBAC1B,WAAWa;AAAA,cAAA,CACS;AAAA,YACxB;AAAA,UAAA;AAAA,QAAA;AAAA,QAEF,gBAAA1T;AAAA,UAAC0J;AAAA,UAAA;AAAA,YACC,OAAOmJ,EAAS;AAAA,YAChB,UAAU,CAACra,MAAMua,EAAa,aAAava,EAAE,OAAO,KAAK;AAAA,YACzD,QAAQ8a;AAAA,YACR,aAAY;AAAA,UAAA;AAAA,QAAA;AAAA,MACd,EAAA,CACF,EAAA,CACF;AAAA,MAEA,gBAAAtT,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAAzR,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAAC+I;AAAA,UAAA;AAAA,YACC,OAAO8J,EAAS,mBAAmB;AAAA,YACnC,UAAU,CAAChQ,MAAU;AACnB,oBAAM6Q,IAAW7Q,EAAM,YAAA;AACvB,cAAAkQ,EAAa,mBAAmBW,CAAQ,GAExChB,EAAO;AAAA,gBACL,MAAMG,EAAS;AAAA,gBACf,KAAKA,EAAS;AAAA,gBACd,iBAAiBa;AAAA,gBACjB,WAAWb,EAAS;AAAA,cAAA,CACA;AAAA,YACxB;AAAA,UAAA;AAAA,QAAA;AAAA,QAEF,gBAAA7S;AAAA,UAAC0J;AAAA,UAAA;AAAA,YACC,OAAOmJ,EAAS;AAAA,YAChB,UAAU,CAACra,MAAMua,EAAa,mBAAmBva,EAAE,OAAO,KAAK;AAAA,YAC/D,QAAQ8a;AAAA,YACR,aAAY;AAAA,UAAA;AAAA,QAAA;AAAA,MACd,EAAA,CACF,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ,GClHM,EAAE,QAAAf,OAAWC,IAONmB,KAAwD,CAAC;AAAA,EACpE,UAAAnX;AAAA,EACA,QAAAkW;AACF,MAAM;AACJ,QAAMnN,IAAc/I,EAA0B,UAAU,CAAA,GAElD,CAACqW,GAAUC,CAAW,IAAI3T,GAAS;AAAA,IACvC,YAAYoG,EAAW,cAAcA,EAAW,aAAa;AAAA,IAC7D,OAAOA,EAAW,SAAS;AAAA,IAC3B,UAAUA,EAAW,YAAY;AAAA,IACjC,QAAQA,EAAW,UAAU;AAAA,IAC7B,QAAQA,EAAW,UAAU;AAAA,IAC7B,MAAMA,EAAW,QAAQ;AAAA,IACzB,MAAMA,EAAW,QAAQ;AAAA,EAAA,CAC1B;AAED,EAAAjB,GAAU,MAAM;AACd,IAAAwO,EAAY;AAAA,MACV,YAAYvN,EAAW,cAAcA,EAAW,aAAa;AAAA,MAC7D,OAAOA,EAAW,SAAS;AAAA,MAC3B,UAAUA,EAAW,YAAY;AAAA,MACjC,QAAQA,EAAW,UAAU;AAAA,MAC7B,QAAQA,EAAW,UAAU;AAAA,MAC7B,MAAMA,EAAW,QAAQ;AAAA,MACzB,MAAMA,EAAW,QAAQ;AAAA,IAAA,CAC1B;AAAA,EACH,GAAG,CAAC/I,EAAS,EAAE,CAAC;AAEhB,QAAMoX,IAAuB,CAACC,MAAwC;AACpE,UAAMC,IAAc,EAAE,GAAGjB,GAAU,GAAGgB,EAAA;AACtC,IAAAf,EAAYgB,CAAW,GAEvBpB,EAAO;AAAA,MACL,QAAQ;AAAA,QACN,GAAGnN;AAAA,QACH,WAAWuO,EAAY;AAAA,QACvB,YAAYA,EAAY;AAAA,QACxB,OAAOA,EAAY;AAAA,QACnB,UAAUA,EAAY;AAAA,QACtB,QAAQA,EAAY;AAAA,QACpB,QAAQA,EAAY;AAAA,QACpB,MAAMA,EAAY;AAAA,QAClB,MAAMA,EAAY;AAAA,MAAA;AAAA,IACpB,CACoB;AAAA,EACxB,GAEMC,IAAkB;AAAA,IACtB,EAAE,OAAO,SAAS,OAAO,MAAM,MAAM,OAAA;AAAA,IACrC,EAAE,OAAO,UAAU,OAAO,MAAM,MAAM,OAAA;AAAA,IACtC,EAAE,OAAO,UAAU,OAAO,YAAY,MAAM,UAAA;AAAA,IAC5C,EAAE,OAAO,WAAW,OAAO,OAAO,MAAM,UAAA;AAAA,IACxC,EAAE,OAAO,OAAO,OAAO,MAAM,MAAM,OAAA;AAAA,IACnC,EAAE,OAAO,YAAY,OAAO,OAAO,MAAM,SAAA;AAAA,EAAS;AAGpD,SACE,gBAAAzT,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAN,EAACwT,MAAQ,OAAO,EAAE,WAAW,EAAA,GAAK,UAAA,cAAU;AAAA,IAE5C,gBAAAlT,EAACyR,GAAA,EAAK,QAAO,YACX,UAAA;AAAA,MAAA,gBAAAzR,EAAC,OAAA,EAAI,WAAU,0BACb,UAAA;AAAA,QAAA,gBAAAN,EAAC+R,EAAK,MAAL,EAAU,OAAM,QAAO,WAAU,QAChC,UAAA,gBAAA/R;AAAA,UAACgS;AAAA,UAAA;AAAA,YACC,OAAOa,EAAS;AAAA,YAChB,UAAU,CAACZ,MAAM2B,EAAqB,EAAE,QAAQ3B,KAAK,GAAG;AAAA,YACxD,OAAO,EAAE,OAAO,OAAA;AAAA,UAAO;AAAA,QAAA,GAE3B;AAAA,0BACCF,EAAK,MAAL,EAAU,OAAM,QAAO,WAAU,QAChC,UAAA,gBAAA/R;AAAA,UAACgS;AAAA,UAAA;AAAA,YACC,OAAOa,EAAS;AAAA,YAChB,UAAU,CAACZ,MAAM2B,EAAqB,EAAE,QAAQ3B,KAAK,GAAG;AAAA,YACxD,OAAO,EAAE,OAAO,OAAA;AAAA,UAAO;AAAA,QAAA,GAE3B;AAAA,0BACCF,EAAK,MAAL,EAAU,OAAM,QAAO,WAAU,QAChC,UAAA,gBAAA/R;AAAA,UAACgS;AAAA,UAAA;AAAA,YACC,OAAOa,EAAS;AAAA,YAChB,UAAU,CAACZ,MAAM2B,EAAqB,EAAE,MAAM3B,KAAK,KAAK;AAAA,YACxD,OAAO,EAAE,OAAO,OAAA;AAAA,UAAO;AAAA,QAAA,GAE3B;AAAA,0BACCF,EAAK,MAAL,EAAU,OAAM,QAAO,WAAU,QAChC,UAAA,gBAAA/R;AAAA,UAACgS;AAAA,UAAA;AAAA,YACC,OAAOa,EAAS;AAAA,YAChB,UAAU,CAACZ,MAAM2B,EAAqB,EAAE,MAAM3B,KAAK,GAAG;AAAA,YACtD,OAAO,EAAE,OAAO,OAAA;AAAA,UAAO;AAAA,QAAA,EACzB,CACF;AAAA,MAAA,GACF;AAAA,MAEA,gBAAAjS,EAAC+R,EAAK,MAAL,EAAU,OAAM,QAAO,WAAU,QAChC,UAAA,gBAAAzR,EAAC8Q,IAAA,EACC,UAAA;AAAA,QAAA,gBAAApR;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM;AAEb,oBAAM8T,IAAgBzO,EAAW,UAAUsN,EAAS;AACpD,cAAAe,EAAqB,EAAE,MAAMI,GAAe;AAAA,YAC9C;AAAA,YACA,OAAM;AAAA,YAAW,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGnB,gBAAAhU;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM;AAEb,oBAAM+T,IAAgB1O,EAAW,UAAUsN,EAAS;AACpD,cAAAe,EAAqB,EAAE,MAAMK,GAAe;AAAA,YAC9C;AAAA,YACA,OAAM;AAAA,YAAW,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAGnB,gBAAAjU;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM;AAEb,oBAAM+T,IAAgB1O,EAAW,UAAUsN,EAAS,QAC9CmB,IAAgBzO,EAAW,UAAUsN,EAAS,QAC9CqB,IAAc3O,EAAW,QAAQsN,EAAS,MAC1CsB,IAAc5O,EAAW,QAAQsN,EAAS;AAChD,cAAAe,EAAqB;AAAA,gBACnB,QAAQM;AAAA,gBACR,QAAQC;AAAA,gBACR,MAAMF;AAAA,gBACN,MAAMD;AAAA,cAAA,CACP;AAAA,YACH;AAAA,YACA,OAAM;AAAA,YAAU,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAElB,EAAA,CACF,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAEA,gBAAAhU,EAACwT,MAAQ,UAAA,OAAA,CAAI;AAAA,IAEb,gBAAAlT,EAACyR,GAAA,EAAK,QAAO,YACX,UAAA;AAAA,MAAA,gBAAA/R,EAAC+R,EAAK,MAAL,EAAU,OAAM,MAAK,MAAK,UACzB,UAAA,gBAAA/R;AAAA,QAACwS;AAAA,QAAA;AAAA,UACC,OAAOK,EAAS;AAAA,UAChB,UAAU,CAACZ,MAAM2B,EAAqB,EAAE,UAAU3B,GAAG;AAAA,UACpD,UAAA8B,EAAgB,IAAI,CAACX,MACpB,gBAAApT,EAACuS,IAAA,EAAuB,OAAOa,EAAI,OACjC,UAAA,gBAAA9S,EAAC,OAAA,EAAI,WAAU,iBACb,UAAA;AAAA,YAAA,gBAAAN,EAAC,QAAA,EAAM,YAAI,MAAA,CAAM;AAAA,YACjB,gBAAAA,EAAC,QAAA,EAAK,WAAU,yBAAyB,YAAI,KAAA,CAAK;AAAA,UAAA,GACpD,EAAA,GAJWoT,EAAI,KAKjB,CACD;AAAA,QAAA;AAAA,MAAA,GAEL;AAAA,MAEA,gBAAApT,EAAC+R,EAAK,MAAL,EAAU,OAAM,UACf,UAAA,gBAAA/R;AAAA,QAACgS;AAAA,QAAA;AAAA,UACC,OAAOa,EAAS;AAAA,UAChB,UAAU,CAACZ,MAAM2B,EAAqB,EAAE,YAAY3B,KAAK,GAAG;AAAA,UAC5D,KAAK;AAAA,UACL,KAAK;AAAA,UACL,OAAO,EAAE,OAAO,IAAA;AAAA,QAAI;AAAA,MAAA,GAExB;AAAA,MAEA,gBAAAjS,EAAC+R,EAAK,MAAL,EAAU,OAAM,MACf,UAAA,gBAAAzR,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,QAAA,gBAAAN;AAAA,UAAC+I;AAAA,UAAA;AAAA,YACC,OAAO8J,EAAS,SAAS;AAAA,YACzB,UAAU,CAAChQ,MAAU+Q,EAAqB,EAAE,OAAO/Q,EAAM,cAAY,CAAG;AAAA,UAAA;AAAA,QAAA;AAAA,QAE1E,gBAAA7C;AAAA,UAAC0J;AAAA,UAAA;AAAA,YACC,OAAOmJ,EAAS;AAAA,YAChB,UAAU,CAACra,MAAMob,EAAqB,EAAE,OAAOpb,EAAE,OAAO,OAAO;AAAA,YAC/D,aAAY;AAAA,YACZ,OAAO,EAAE,OAAO,IAAA;AAAA,UAAI;AAAA,QAAA;AAAA,MACtB,EAAA,CACF,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GACF;AAEJ,GCnLa4b,KAAgE,CAAC;AAAA,EAC5E,UAAA5X;AAAA,EACA,QAAAkW;AAAA,EACA,WAAAC;AAAA,EACA,aAAAC;AACF,MAAM;AACJ,UAAQpW,EAAS,MAAA;AAAA,IACf,KAAK;AACH,aACE,gBAAAwD;AAAA,QAACyS;AAAA,QAAA;AAAA,UACC,UAAAjW;AAAA,UACA,QAAAkW;AAAA,UACA,WAAAC;AAAA,UACA,aAAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IAGN,KAAK;AACH,aAAO,gBAAA5S,EAACyT,IAAA,EAAoB,UAAAjX,GAAoB,QAAAkW,EAAA,CAAgB;AAAA,IAClE,KAAK;AACH,aAAO,gBAAA1S,EAAC2T,IAAA,EAAmB,UAAAnX,GAAoB,QAAAkW,EAAA,CAAgB;AAAA,IACjE;AACE,aACE,gBAAA1S,EAAC,OAAA,EAAI,WAAU,kCAAiC,UAAA,gBAEhD;AAAA,EAAA;AAGR,GCjCM,EAAA,OAAE5B,OAAUC,IACZ,EAAA,UAAEoL,OAAaC,IAUR2K,KAA8D,CAAC;AAAA,EAC1E,MAAA/Y;AAAA,EACA,YAAAiP;AAAA,EACA,WAAA9L;AACF,MAAM;AAEJ,QAAM6V,IAAqB7V,EAAU,OAAO,CAAA,MAAK,EAAE,SAAS,YAAY,CAAC,EAAE,QAAQ,KAAK,GAGlF8V,IAA8B,CAACC,GAAiBC,MAAgC;AACpF,UAAMC,IAAcpZ,EAAK,UAAU,IAAI,CAAAwC,MACjCA,EAAM,OAAO0W,IACR;AAAA,MACL,GAAG1W;AAAA,MACH,aAAa;AAAA,QACX,GAAGA,EAAM;AAAA,QACT,YAAY2W;AAAA,MAAA;AAAA,IACd,IAGG3W,CACR;AAED,IAAAyM,EAAWjP,EAAK,IAAI;AAAA,MAClB,UAAUoZ;AAAA,IAAA,CACM;AAAA,EACpB,GAGMC,IAAuB,CAACH,MAAoB;AAChD,UAAM1W,IAAQxC,EAAK,UAAU,KAAK,CAAAsZ,MAAKA,EAAE,OAAOJ,CAAO;AACvD,QAAI,CAAC1W,EAAO;AAEZ,UAAM3B,IAAwB;AAAA,MAC5B,IAAIhB,EAAA;AAAA,MACJ,MAAM,KAAK2C,EAAM,YAAY,WAAW,SAAS,CAAC;AAAA,MAClD,YAAYA,EAAM,YAAY,WAAW,WAAW,IAAI,iBAAiB;AAAA,MACzE,UAAU,EAAE,GAAGwW,EAAmB,CAAC,GAAG,IAAInZ,IAAO;AAAA,MACjD,WAAW,CAAA;AAAA,IAAC;AAGd,IAAAoZ,EAA4BC,GAAS,CAAC,GAAG1W,EAAM,YAAY,YAAY3B,CAAS,CAAC;AAAA,EACnF,GAGM0Y,IAA0B,CAACL,GAAiBpY,MAAqB;AACrE,UAAM0B,IAAQxC,EAAK,UAAU,KAAK,CAAAsZ,MAAKA,EAAE,OAAOJ,CAAO;AACvD,QAAI,CAAC1W,EAAO;AAEZ,UAAM2W,IAAgB3W,EAAM,YAAY,WAAW,OAAO,CAAAzB,MAAKA,EAAE,OAAOD,CAAQ;AAChF,IAAAmY,EAA4BC,GAASC,CAAa;AAAA,EACpD,GAGMK,IAA0B,CAACN,GAAiBpY,GAAkBT,MAAiC;AACnG,UAAMmC,IAAQxC,EAAK,UAAU,KAAK,CAAAsZ,MAAKA,EAAE,OAAOJ,CAAO;AACvD,QAAI,CAAC1W,EAAO;AAEZ,UAAM2W,IAAgB3W,EAAM,YAAY,WAAW,IAAI,CAAAzB,MACjDA,EAAE,OAAOD,IACJ,EAAE,GAAGC,GAAG,GAAGV,EAAA,IAEbU,CACR;AAED,IAAAkY,EAA4BC,GAASC,CAAa;AAAA,EACpD,GAGMM,IAAwB,CAACP,GAAiBpY,GAAkBsT,MAA6B;AAC7F,UAAM5R,IAAQxC,EAAK,UAAU,KAAK,CAAAsZ,MAAKA,EAAE,OAAOJ,CAAO;AACvD,QAAI,CAAC1W,EAAO;AAEZ,UAAM9B,IAAQ8B,EAAM,YAAY,WAAW,UAAU,CAAAzB,MAAKA,EAAE,OAAOD,CAAQ;AAC3E,QAAIJ,MAAU,GAAI;AAElB,UAAMyY,IAAgB,CAAC,GAAG3W,EAAM,YAAY,UAAU;AACtD,IAAI4R,MAAc,QAAQ1T,IAAQ,IAChC,CAACyY,EAAczY,CAAK,GAAGyY,EAAczY,IAAQ,CAAC,CAAC,IAAI,CAACyY,EAAczY,IAAQ,CAAC,GAAGyY,EAAczY,CAAK,CAAC,IACzF0T,MAAc,UAAU1T,IAAQyY,EAAc,SAAS,MAChE,CAACA,EAAczY,CAAK,GAAGyY,EAAczY,IAAQ,CAAC,CAAC,IAAI,CAACyY,EAAczY,IAAQ,CAAC,GAAGyY,EAAczY,CAAK,CAAC,IAGpGuY,EAA4BC,GAASC,CAAa;AAAA,EACpD,GAGMO,IAAkC,CAACR,GAAiBpY,GAAkB6Y,MAAuB;AACjG,UAAMC,IAAmBzW,EAAU,KAAK,CAAA/B,MAAKA,EAAE,OAAOuY,CAAU;AAChE,IAAKC,KAELJ,EAAwBN,GAASpY,GAAU;AAAA,MACzC,UAAU,EAAE,GAAG8Y,GAAkB,IAAI/Z,IAAO;AAAA,IAAE,CAC/C;AAAA,EACH;AAEA,SACE,gBAAAmF,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,gBAAAN,EAAC,SAAI,WAAU,yDACb,UAAA,gBAAAM,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,MAAA,gBAAAN,EAAC,YAAO,UAAA,OAAA,CAAI;AAAA,MAAS;AAAA,IAAA,EAAA,CACvB,EAAA,CACF;AAAA,IAEA,gBAAAA,EAAC3B,MAAS,OAAK,IACZ,YAAK,UAAU,IAAI,CAACP,GAAOqX,MAC1B,gBAAAnV;AAAA,MAAC5B;AAAAA,MAAA;AAAA,QAEC,QACE,gBAAAkC,EAAC,OAAA,EAAI,WAAU,iDACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,uBAAsB,UAAA;AAAA,YAAA;AAAA,YAAK6U,IAAa;AAAA,UAAA,GAAE;AAAA,UAC1D,gBAAA7U,EAACC,IAAA,EAAI,OAAM,QAAO,OAAO,EAAE,UAAU,QAAQ,SAAS,QAAA,GACnD,UAAA;AAAA,YAAAzC,EAAM,YAAY,WAAW;AAAA,YAAO;AAAA,UAAA,EAAA,CACvC;AAAA,QAAA,GACF;AAAA,QAEF,UAAA,gBAAAwC,EAAC,OAAA,EAAI,WAAU,aAEb,UAAA;AAAA,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,YAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,yBAAwB,UAAA,QAAI;AAAA,YAC5C,gBAAAA;AAAA,cAACE;AAAA,cAAA;AAAA,gBACC,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,wBAAOkV,IAAA,EAAa;AAAA,gBACpB,SAAS,MAAMT,EAAqB7W,EAAM,EAAE;AAAA,gBAC7C,UAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAED,GACF;AAAA,UAECA,EAAM,YAAY,WAAW,WAAW,IACvC,gBAAAkC,EAAC,OAAA,EAAI,WAAU,wDAAuD,UAAA,gBAAA,CAEtE,IAEA,gBAAAA,EAAC3B,IAAA,EAAS,OAAK,IACZ,UAAAP,EAAM,YAAY,WAAW,IAAI,CAAC5B,GAAQmZ,MACzC,gBAAArV;AAAA,YAAC5B;AAAAA,YAAA;AAAA,cAEC,QACE,gBAAAkC,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,gBAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,6BAA6B,UAAAqV,IAAc,GAAE;AAAA,gBAC7D,gBAAArV,EAAC,QAAA,EAAK,WAAU,eAAe,YAAO,MAAK;AAAA,gBAC3C,gBAAAA,EAACO,MAAI,OAAM,WAAU,WAAU,WAAW,UAAArE,EAAO,SAAS,KAAA,CAAK;AAAA,cAAA,GACjE;AAAA,cAEF,OACE,gBAAAoE,EAAC8Q,IAAA,EAAM,MAAK,SAAQ,SAAS,CAAC5Y,MAAMA,EAAE,gBAAA,GACpC,UAAA;AAAA,gBAAA,gBAAAwH;AAAA,kBAACE;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,wBAAOoV,IAAA,EAAgB;AAAA,oBACvB,UAAUD,MAAgB;AAAA,oBAC1B,SAAS,CAAC7c,MAAM;AACd,sBAAAA,EAAE,gBAAA,GACFuc,EAAsBjX,EAAM,IAAI5B,EAAO,IAAI,IAAI;AAAA,oBACjD;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEF,gBAAA8D;AAAA,kBAACE;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,wBAAOqV,IAAA,EAAkB;AAAA,oBACzB,UAAUF,MAAgBvX,EAAM,YAAY,WAAW,SAAS;AAAA,oBAChE,SAAS,CAACtF,MAAM;AACd,sBAAAA,EAAE,gBAAA,GACFuc,EAAsBjX,EAAM,IAAI5B,EAAO,IAAI,MAAM;AAAA,oBACnD;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEF,gBAAA8D;AAAA,kBAACE;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,QAAM;AAAA,oBACN,wBAAOE,IAAA,EAAe;AAAA,oBACtB,SAAS,CAAC5H,MAAM;AACd,sBAAAA,EAAE,gBAAA,GACFqc,EAAwB/W,EAAM,IAAI5B,EAAO,EAAE;AAAA,oBAC7C;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACF,GACF;AAAA,cAGF,UAAA,gBAAAoE,EAACyR,GAAA,EAAK,QAAO,YAEX,UAAA;AAAA,gBAAA,gBAAA/R,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAA/R;AAAA,kBAAC0J;AAAA,kBAAA;AAAA,oBACC,OAAOxN,EAAO;AAAA,oBACd,UAAU,CAAC1D,MAAMsc,EAAwBhX,EAAM,IAAI5B,EAAO,IAAI,EAAE,MAAM1D,EAAE,OAAO,OAAO;AAAA,oBACtF,aAAY;AAAA,kBAAA;AAAA,gBAAA,GAEhB;AAAA,gBAGA,gBAAAwH;AAAA,kBAAC+R,EAAK;AAAA,kBAAL;AAAA,oBACC,OAAM;AAAA,oBACN,MAAK;AAAA,oBAEL,UAAA,gBAAA/R;AAAA,sBAACyJ;AAAAA,sBAAA;AAAA,wBACC,OAAOvN,EAAO;AAAA,wBACd,UAAU,CAAC1D,MAAMsc,EAAwBhX,EAAM,IAAI5B,EAAO,IAAI,EAAE,YAAY1D,EAAE,OAAO,OAAO;AAAA,wBAC5F,MAAM;AAAA,wBACN,aAAY;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBACd;AAAA,gBAAA;AAAA,gBAIF,gBAAAwH,EAAC+R,EAAK,MAAL,EAAU,OAAM,qBACf,UAAA,gBAAA/R;AAAA,kBAACwS;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,OAAOtW,EAAO,aAAa,CAAA;AAAA,oBAC3B,UAAU,CAAC1C,MAAUsb,EAAwBhX,EAAM,IAAI5B,EAAO,IAAI,EAAE,WAAW1C,GAAO;AAAA,oBACtF,aAAY;AAAA,oBACZ,iBAAiB,CAAC,KAAK,GAAG;AAAA,kBAAA;AAAA,gBAAA,GAE9B;AAAA,gBAGA,gBAAAwG,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAAzR,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,kBAAA,gBAAAN,EAACO,IAAA,EAAI,OAAM,QAAQ,UAAArE,EAAO,SAAS,MAAK;AAAA,oCACvCqE,IAAA,EAAI,OAAM,WAAW,UAAArE,EAAO,SAAS,MAAK;AAAA,kBAC3C,gBAAA8D;AAAA,oBAACwS;AAAA,oBAAA;AAAA,sBACC,aAAY;AAAA,sBACZ,OAAO,EAAE,OAAO,IAAA;AAAA,sBAChB,OAAO;AAAA,sBACP,UAAU,CAAChZ,MAAUA,KAASwb,EAAgClX,EAAM,IAAI5B,EAAO,IAAI1C,CAAK;AAAA,sBACxF,SAAS8a,EAAmB,IAAI,CAAA5X,OAAM;AAAA,wBACpC,OAAOA,EAAE;AAAA,wBACT,OAAO,GAAGA,EAAE,IAAI,KAAKA,EAAE,IAAI;AAAA,sBAAA,EAC3B;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACJ,EAAA,CACF,EAAA,CACF;AAAA,kCAGC8W,IAAA,EAAQ,OAAO,EAAE,QAAQ,YAAY;AAAA,gBACtC,gBAAAlT,EAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,kBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,oBAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,uBAAsB,UAAA,QAAI;AAAA,oBAC1C,gBAAAA,EAACO,IAAA,EAAK,UAAArE,EAAO,SAAS,KAAA,CAAK;AAAA,kBAAA,GAC7B;AAAA,kBACA,gBAAA8D;AAAA,oBAACoU;AAAA,oBAAA;AAAA,sBACC,UAAUlY,EAAO;AAAA,sBACjB,QAAQ,CAACP,MAAY;AACnB,8BAAMc,IAAc,EAAE,GAAGP,EAAO,UAAU,GAAGP,EAAA;AAC7C,wBAAAmZ,EAAwBhX,EAAM,IAAI5B,EAAO,IAAI,EAAE,UAAUO,GAAa;AAAA,sBACxE;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACF,EAAA,CACF;AAAA,cAAA,EAAA,CACF;AAAA,YAAA;AAAA,YA9GKP,EAAO;AAAA,UAAA,CAgHf,EAAA,CACH;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA;AAAA,MAlJK4B,EAAM;AAAA,IAAA,CAoJd,EAAA,CACH;AAAA,EAAA,GACF;AAEJ,GCxPM,EAAE,OAAAM,OAAUC,IACZ,EAAE,SAAAmX,OAAYC,IACd,EAAE,UAAAhM,OAAaC,IAMRgM,KAA8C,CAAC;AAAA,EAC1D,iBAAA9L;AACF,MAAM;AACJ,QAAM;AAAA,IACJ,OAAAI;AAAA,IACA,gBAAAC;AAAA,IACA,YAAAM;AAAA,IACA,iBAAAoL;AAAA,IACA,mBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,WAAApX;AAAA,IACA,kBAAAG;AAAA,IACA,cAAAC;AAAA,EAAA,IACEzD,GAAA,GAEE,CAAC0a,CAAI,IAAI/D,EAAK,QAAA,GACd,CAACgE,GAAWC,CAAY,IAAI7W,GAAS,OAAO,GAC5C,CAAC8W,GAAsBC,CAAuB,IAAI/W,GAAS,EAAK,GAChE,CAACgX,GAAiBC,CAAkB,IAAIjX,GAAwB,IAAI,GACpE,CAACkX,GAAoBC,CAAqB,IAAInX,GAElD,CAAA,CAAE,GAEEoX,IAAejO,GAAM,QAAQ,MAC1B0B,EAAM,KAAK,CAACpO,MAAMA,EAAE,OAAOqO,CAAc,GAC/C,CAACD,GAAOC,CAAc,CAAC,GAEpBuM,IAAoBD,GAAc,YAAY,cAAc,CAAA,GAE5DE,IAAqB,CAACC,MAA2C;AACrE,IAAKzM,MAEDyM,EAAc,eAChBf,EAAgB1L,GAAgByM,EAAc,WAAsC,GAGlFA,EAAc,SAAS,UACzBnM,EAAWN,GAAgB,EAAE,MAAMyM,EAAc,MAAgB,GAG/DA,EAAc,eAChBd,EAAkB3L,GAAgByM,EAAc,WAAsC;AAAA,EAE1F;AACA,UAAQ,IAAIzM,GAAgB,kBAAkBsM,CAAY,GAE1DjS,GAAU,MAAM;AACd,IAAKiS,KAEDA,MACFT,EAAK,eAAe;AAAA,MAClB,MAAMS,EAAa;AAAA,MACnB,aAAa;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,GAAG;AAAA,QACH,GAAG;AAAA,QACH,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,SAAS;AAAA,QACT,GAAGA,EAAa;AAAA,MAAA;AAAA,MAElB,aAAa;AAAA,QACX,aAAa;AAAA,QACb,aAAa;AAAA,QACb,aAAa;AAAA,QACb,cAAc;AAAA,QACd,GAAGA,EAAa;AAAA,MAAA;AAAA,IAClB,CACD,GACD1X,EAAa,IAAI;AAAA,EAErB,GAAG,CAAC0X,GAAc1X,GAAciX,CAAI,CAAC;AAErC,QAAMa,KAAkB,MAAM;AAC5B,IAAI,CAAC1M,KAAkB,CAACsM,MACxBH,EAAmB,KAAK,GACxBF,EAAwB,EAAI;AAAA,EAC9B,GAEMU,KAAgC,CAACpa,MAAuB;AAC5D,QAAI,CAACyN,KAAkB,CAACsM,EAAc;AAEtC,UAAMpa,IAAwB;AAAA,MAC5B,IAAIhB,EAAA;AAAA,MACJ,MAAM,GAAGqB,EAAS,IAAI,MAAMga,EAAkB,SAAS,CAAC;AAAA,MACxD,YAAYA,EAAkB,WAAW,IAAI,iBAAiB;AAAA,MAC9D,UAAU,EAAE,GAAGha,GAAU,IAAIrB,IAAO;AAAA,MACpC,WAAW,CAAA;AAAA,IAAC;AAGd,QAAIgb,MAAoB,OAAO;AAC7B,YAAM1B,IAAgB,CAAC,GAAG+B,GAAmBra,CAAS;AACtD,MAAA0Z,EAAkB5L,GAAgB,EAAE,YAAYwK,EAAA,CAAe;AAAA,IACjE,WAAW0B,GAAiB;AAC1B,YAAM1B,IAAgB+B,EAAkB,IAAI,CAACna,MACvCA,EAAE,OAAO8Z,IACJ,EAAE,GAAG9Z,GAAG,UAAU,EAAE,GAAGG,GAAU,IAAIrB,EAAA,IAAS,IAEhDkB,CACR;AACD,MAAAwZ,EAAkB5L,GAAgB,EAAE,YAAYwK,EAAA,CAAe;AAAA,IACjE;AAEA,IAAAyB,EAAwB,EAAK,GAC7BE,EAAmB,IAAI;AAAA,EACzB,GAEMS,KAAqB,CAACza,MAAqB;AAC/C,QAAI,CAAC6N,KAAkB,CAACsM,EAAc;AAEtC,UAAM9B,IACJ8B,EAAa,YAAY,YAAY,OAAO,CAACla,MAAMA,EAAE,OAAOD,CAAQ,KAAK,CAAA;AAC3E,IAAAyZ,EAAkB5L,GAAgB,EAAE,YAAYwK,EAAA,CAAe,GAE3D7V,MAAqBxC,KACvByC,EAAa,IAAI;AAAA,EAErB,GAEMiY,KAAqB,CAAC1a,GAAkBT,MAAiC;AAC7E,QAAI,CAACsO,KAAkB,CAACsM,EAAc;AAEtC,UAAM9B,IACJ8B,EAAa,YAAY,YAAY,IAAI,CAACla,MACpCA,EAAE,OAAOD,IACJ,EAAE,GAAGC,GAAG,GAAGV,EAAA,IAEbU,CACR,KAAK,CAAA;AAER,IAAAwZ,EAAkB5L,GAAgB,EAAE,YAAYwK,EAAA,CAAe;AAAA,EACjE,GAEMsC,IAAmB,CAAC7a,MAAuB;AAC/C,QAAI,CAAC+N,KAAkB,CAACsM,EAAc;AAEtC,UAAMpa,IAAwB;AAAA,MAC5B,GAAGD;AAAA,MACH,IAAIf,EAAA;AAAA,MACJ,MAAM,GAAGe,EAAO,IAAI;AAAA,MACpB,YAAY;AAAA,IAAA,GAGRuY,IAAgB,CAAC,GAAG+B,GAAmBra,CAAS;AACtD,IAAA0Z,EAAkB5L,GAAgB,EAAE,YAAYwK,EAAA,CAAe;AAAA,EACjE,GAEMuC,IAAmB,CAAC5a,GAAkBsT,MAA6B;AACvE,QAAI,CAACzF,KAAkB,CAACsM,EAAc;AAEtC,UAAMva,IAAQwa,EAAkB,UAAU,CAACna,MAAMA,EAAE,OAAOD,CAAQ;AAClE,QAAIJ,MAAU,GAAI;AAElB,UAAMyY,IAAgB,CAAC,GAAG+B,CAAiB;AAC3C,IAAI9G,MAAc,QAAQ1T,IAAQ,IAChC,CAACyY,EAAczY,CAAK,GAAGyY,EAAczY,IAAQ,CAAC,CAAC,IAAI;AAAA,MACjDyY,EAAczY,IAAQ,CAAC;AAAA,MACvByY,EAAczY,CAAK;AAAA,IAAA,IAEZ0T,MAAc,UAAU1T,IAAQyY,EAAc,SAAS,MAChE,CAACA,EAAczY,CAAK,GAAGyY,EAAczY,IAAQ,CAAC,CAAC,IAAI;AAAA,MACjDyY,EAAczY,IAAQ,CAAC;AAAA,MACvByY,EAAczY,CAAK;AAAA,IAAA,IAIvB6Z,EAAkB5L,GAAgB,EAAE,YAAYwK,EAAA,CAAe;AAAA,EACjE,GAEMwC,IAA6B,CAAC7a,MAAqB;AACvD,IAAAga,EAAmBha,CAAQ,GAC3B8Z,EAAwB,EAAI;AAAA,EAC9B,GAEMgB,IAA6B,CAAC9a,GAAkBT,MAA+B;AACnF,QAAI,CAACsO,KAAkB,CAACsM,EAAc;AAEtC,UAAM9B,IAAgB+B,EAAkB,IAAI,CAACna,MACvCA,EAAE,OAAOD,IACJ;AAAA,MACL,GAAGC;AAAA,MACH,UAAU,EAAE,GAAGA,EAAE,UAAU,GAAGV,EAAA;AAAA,IAAQ,IAGnCU,CACR;AAED,IAAAwZ,EAAkB5L,GAAgB,EAAE,YAAYwK,EAAA,CAAe;AAAA,EACjE;AAEA,SAAK8B,IASH,gBAAAjW,EAAC,OAAA,EAAI,WAAU,0DACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,gCACb,UAAA;AAAA,MAAA,gBAAAN,EAAC,MAAA,EAAG,WAAU,uCAAsC,UAAA,QAAI;AAAA,MACxD,gBAAAA,EAAC,KAAA,EAAE,WAAU,yBAAwB,UAAA,YAAA,CAAS;AAAA,IAAA,GAChD;AAAA,IAEA,gBAAAA,EAAC,SAAI,WAAU,8BACb,4BAACyV,IAAA,EAAK,WAAWM,GAAW,UAAUC,GACpC,UAAA;AAAA,MAAA,gBAAAhW,EAACwV,IAAA,EAAQ,KAAI,MACX,UAAA,gBAAAlV;AAAA,QAACyR;AAAA,QAAA;AAAA,UACC,MAAA+D;AAAA,UACA,QAAO;AAAA,UACP,gBAAgBW;AAAA,UAChB,eAAe,EAAE,MAAMF,EAAa,KAAA;AAAA,UAEpC,UAAA;AAAA,YAAA,gBAAAvW,EAAC+R,EAAK,MAAL,EAAU,OAAM,QAAO,MAAK,QAC3B,UAAA,gBAAA/R,EAAC0J,IAAA,EAAM,aAAY,SAAA,CAAS,EAAA,CAC9B;AAAA,YAEA,gBAAApJ,EAACjC,MAAS,OAAK,IAAC,kBAAkB,CAAC,YAAY,QAAQ,OAAO,GAC5D,UAAA;AAAA,cAAA,gBAAA2B,EAAC5B,IAAA,EAAM,QAAO,MACZ,UAAA,gBAAAkC,EAAC8Q,IAAA,EACC,UAAA;AAAA,gBAAA,gBAAApR,EAAC+R,EAAK,MAAL,EAAU,OAAM,KAAI,MAAM,CAAC,eAAe,GAAG,GAC5C,UAAA,gBAAA/R,EAACgS,IAAA,CAAA,CAAY,EAAA,CACf;AAAA,gBACA,gBAAAhS,EAAC+R,EAAK,MAAL,EAAU,OAAM,KAAI,MAAM,CAAC,eAAe,GAAG,GAC5C,UAAA,gBAAA/R,EAACgS,MAAY,EAAA,CACf;AAAA,cAAA,EAAA,CACF,KARqB,UASvB;AAAA,cAEA,gBAAAhS,EAAC5B,IAAA,EAAM,QAAO,MACZ,4BAACgT,IAAA,EACC,UAAA;AAAA,gBAAA,gBAAApR,EAAC+R,EAAK,MAAL,EAAU,OAAM,MAAK,MAAM,CAAC,eAAe,OAAO,GACjD,UAAA,gBAAA/R,EAACgS,IAAA,EAAY,KAAK,IAAI,GACxB;AAAA,gBACA,gBAAAhS,EAAC+R,EAAK,MAAL,EAAU,OAAM,MAAK,MAAM,CAAC,eAAe,QAAQ,GAClD,UAAA,gBAAA/R,EAACgS,IAAA,EAAY,KAAK,IAAI,EAAA,CACxB;AAAA,cAAA,EAAA,CACF,KARqB,MASvB;AAAA,cAEA,gBAAA1R,EAAClC,IAAA,EAAM,QAAO,MACZ,UAAA;AAAA,gBAAA,gBAAA4B,EAAC+R,EAAK,MAAL,EAAU,OAAM,OAAM,MAAM,CAAC,eAAe,YAAY,GACvD,UAAA,gBAAA/R,EAAC0J,IAAA,EAAM,aAAY,+BAA8B,GACnD;AAAA,gBAEA,gBAAA1J,EAAC+R,EAAK,MAAL,EAAU,OAAM,OAAM,MAAM,CAAC,eAAe,SAAS,GACpD,UAAA,gBAAA/R,EAACgS,IAAA,EAAY,KAAK,GAAG,GACvB;AAAA,gBAEA,gBAAAhS,EAAC+R,EAAK,MAAL,EAAU,OAAM,MAAK,MAAM,CAAC,eAAe,cAAc,GACxD,UAAA,gBAAA/R,EAACgS,IAAA,EAAY,KAAK,GAAG,GACvB;AAAA,gBAEA,gBAAAhS;AAAA,kBAAC+R,EAAK;AAAA,kBAAL;AAAA,oBACC,OAAM;AAAA,oBACN,MAAM,CAAC,eAAe,OAAO;AAAA,oBAC7B,MAAK;AAAA,oBAEL,4BAACC,IAAA,EAAY,KAAK,KAAK,KAAK,GAAG,MAAM,IAAA,CAAK;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAG5C,gBAAAhS;AAAA,kBAAC+R,EAAK;AAAA,kBAAL;AAAA,oBACC,OAAM;AAAA,oBACN,MAAM,CAAC,eAAe,QAAQ;AAAA,oBAC9B,MAAK;AAAA,oBAEL,4BAACC,IAAA,EAAY,KAAK,GAAG,KAAK,KAAK,MAAM,EAAA,CAAG;AAAA,kBAAA;AAAA,gBAAA;AAAA,kCAGzCD,EAAK,MAAL,EAAU,OAAM,OAAM,MAAM,CAAC,eAAe,SAAS,GACpD,UAAA,gBAAA/R,EAACgS,MAAY,KAAK,GAAG,KAAK,GAAG,MAAM,KAAK,GAC1C;AAAA,gBAEA,gBAAAhS,EAAC+R,EAAK,MAAL,EAAU,OAAM,MAAK,MAAM,CAAC,eAAe,QAAQ,GAClD,UAAA,gBAAA/R,EAACgS,MAAY,EAAA,CACf;AAAA,cAAA,EAAA,GAnCqB,OAoCvB;AAAA,YAAA,EAAA,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,KAvEkB,OAyEtB;AAAA,MAEA,gBAAAhS,EAACwV,MAAQ,KAAI,MACV,YAAa,SAAS,WAAWe,EAAa,WAC7C,gBAAAvW;AAAA,QAACqU;AAAA,QAAA;AAAA,UACC,MAAMkC;AAAA,UACN,YAAAhM;AAAA,UACA,WAAA9L;AAAA,QAAA;AAAA,MAAA,IAGF,gBAAA6B,EAAC,OAAA,EAAI,WAAU,QACb,UAAA;AAAA,QAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,UAAA,gBAAAA,EAAC,QAAA,EAAK,WAAU,eAAc,UAAA;AAAA,YAAA;AAAA,8BAE3BC,IAAA,EAAI,OAAM,QAAO,WAAU,QACzB,YAAkB,OAAA,CACrB;AAAA,UAAA,GACF;AAAA,UACA,gBAAAP;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,MAAK;AAAA,cACL,wBAAOkV,IAAA,EAAa;AAAA,cACpB,SAASuB;AAAA,cACV,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,QAED,GACF;AAAA,QAEA,gBAAA3W,EAAC,KAAA,EAAE,WAAU,8BAA6B,UAAA,2CAE1C;AAAA,QAECwW,EAAkB,SAAS,KAC1B,gBAAAxW,EAAC,OAAA,EAAI,WAAU,yDACb,UAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,qCACb,UAAA,gBAAAM,EAAC,OAAA,EACC,UAAA;AAAA,UAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,yBAAwB,UAAA,SAAK;AAAA,UAC7C,gBAAAA,EAAC,QAAA,EAAK,WAAU,0CAAyC,UAAA,WAAA,CAEzD;AAAA,QAAA,EAAA,CACF,GACF,GACF;AAAA,QAGDwW,EAAkB,WAAW,IAC5B,gBAAAxW,EAAC,SAAI,WAAU,wDAAuD,UAAA,gBAAA,CAEtE,IAEA,gBAAAA,EAAC3B,IAAA,EAAS,OAAK,IAAC,kBAAkBmY,EAAkB,CAAC,GAAG,KAAKvM,GAC1D,UAAAuM,EAAkB,IAAI,CAACta,GAAQF,MAC9B,gBAAAgE;AAAA,UAAC5B;AAAA,UAAA;AAAA,YAEC,QACE,gBAAAkC,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,cAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,6BAA6B,UAAAhE,IAAQ,GAAE;AAAA,cACvD,gBAAAgE,EAAC,QAAA,EAAK,WAAU,eAAe,YAAO,MAAK;AAAA,cAC3C,gBAAAA,EAACO,MAAI,OAAM,WAAU,WAAU,WAC5B,UAAArE,EAAO,SAAS,KAAA,CACnB;AAAA,YAAA,GACF;AAAA,YAEF,OACE,gBAAAoE,EAAC8Q,IAAA,EAAM,MAAK,SAAQ,SAAS,CAAC5Y,MAAMA,EAAE,gBAAA,GACpC,UAAA;AAAA,cAAA,gBAAAwH;AAAA,gBAACE;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,wBAAOoV,IAAA,EAAgB;AAAA,kBACvB,UAAUtZ,MAAU;AAAA,kBACpB,SAAS,CAACxD,MAAM;AACd,oBAAAA,EAAE,gBAAA,GACFwe,EAAiB9a,EAAO,IAAI,IAAI;AAAA,kBAClC;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEF,gBAAA8D;AAAA,gBAACE;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,wBAAOqV,IAAA,EAAkB;AAAA,kBACzB,UAAUvZ,MAAUwa,EAAkB,SAAS;AAAA,kBAC/C,SAAS,CAAChe,MAAM;AACd,oBAAAA,EAAE,gBAAA,GACFwe,EAAiB9a,EAAO,IAAI,MAAM;AAAA,kBACpC;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEF,gBAAA8D;AAAA,gBAACE;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,wBAAOwQ,IAAA,EAAa;AAAA,kBACpB,SAAS,CAAClY,MAAM;AACd,oBAAAA,EAAE,gBAAA,GACFue,EAAiB7a,CAAM;AAAA,kBACzB;AAAA,gBAAA;AAAA,cAAA;AAAA,cAEF,gBAAA8D;AAAA,gBAACE;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,MAAK;AAAA,kBACL,QAAM;AAAA,kBACN,wBAAOE,IAAA,EAAe;AAAA,kBACtB,SAAS,CAAC5H,MAAM;AACd,oBAAAA,EAAE,gBAAA,GACFqe,GAAmB3a,EAAO,EAAE;AAAA,kBAC9B;AAAA,gBAAA;AAAA,cAAA;AAAA,YACF,GACF;AAAA,YAGF,UAAA,gBAAAoE,EAACyR,GAAA,EAAK,QAAO,YACX,UAAA;AAAA,cAAA,gBAAA/R,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAA/R;AAAA,gBAAC0J;AAAA,gBAAA;AAAA,kBACC,OAAOxN,EAAO;AAAA,kBACd,UAAU,CAAC1D,MACTse,GAAmB5a,EAAO,IAAI,EAAE,MAAM1D,EAAE,OAAO,OAAO;AAAA,kBAExD,aAAY;AAAA,gBAAA;AAAA,cAAA,GAEhB;AAAA,cAEA,gBAAAwH;AAAA,gBAAC+R,EAAK;AAAA,gBAAL;AAAA,kBACC,OAAM;AAAA,kBACN,MAAK;AAAA,kBAEL,UAAA,gBAAA/R;AAAA,oBAACyJ;AAAA,oBAAA;AAAA,sBACC,OAAO4M,EAAmBna,EAAO,EAAE,KAAKA,EAAO;AAAA,sBAC/C,UAAU,CAAC1D,MACT8d,EAAsB,CAAClI,OAAU;AAAA,wBAC/B,GAAGA;AAAA,wBACH,CAAClS,EAAO,EAAE,GAAG1D,EAAE,OAAO;AAAA,sBAAA,EACtB;AAAA,sBAEJ,QAAQ,CAACA,MAAM;AACb,wBAAAse,GAAmB5a,EAAO,IAAI,EAAE,YAAY1D,EAAE,OAAO,OAAO,GAC5D8d,EAAsB,CAAClI,MAAS;AAC9B,gCAAM+I,IAAW,EAAE,GAAG/I,EAAA;AACtB,wCAAO+I,EAASjb,EAAO,EAAE,GAClBib;AAAA,wBACT,CAAC;AAAA,sBACH;AAAA,sBACA,MAAM;AAAA,sBACN,aAAY;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACd;AAAA,cAAA;AAAA,cAGF,gBAAAnX,EAAC+R,EAAK,MAAL,EAAU,OAAM,qBACf,UAAA,gBAAA/R;AAAA,gBAACwS;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,OAAOtW,EAAO,aAAa,CAAA;AAAA,kBAC3B,UAAU,CAAC1C,MACTsd,GAAmB5a,EAAO,IAAI,EAAE,WAAW1C,GAAO;AAAA,kBAEpD,aAAY;AAAA,kBACZ,iBAAiB,CAAC,KAAK,GAAG;AAAA,gBAAA;AAAA,cAAA,GAE9B;AAAA,cAEA,gBAAAwG,EAAC+R,EAAK,MAAL,EAAU,OAAM,QACf,UAAA,gBAAAzR,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,gBAAA,gBAAAN,EAACO,IAAA,EAAI,OAAM,QAAQ,UAAArE,EAAO,SAAS,MAAK;AAAA,kCACvCqE,IAAA,EAAI,OAAM,WAAW,UAAArE,EAAO,SAAS,MAAK;AAAA,gBAC3C,gBAAA8D;AAAA,kBAACE;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,MAAK;AAAA,oBACL,wBAAOC,IAAA,EAAa;AAAA,oBACpB,SAAS,MAAM8W,EAA2B/a,EAAO,EAAE;AAAA,oBACpD,UAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAED,EAAA,CACF,EAAA,CACF;AAAA,gCAGCsX,IAAA,EAAQ,OAAO,EAAE,QAAQ,YAAY;AAAA,cACtC,gBAAAlT,EAAC,OAAA,EAAI,WAAU,oDACb,UAAA;AAAA,gBAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,0CACb,UAAA;AAAA,kBAAA,gBAAAN,EAAC,QAAA,EAAK,WAAU,uBAAsB,UAAA,QAAI;AAAA,kBAC1C,gBAAAA,EAACO,IAAA,EAAK,UAAArE,EAAO,SAAS,KAAA,CAAK;AAAA,gBAAA,GAC7B;AAAA,gBACA,gBAAA8D;AAAA,kBAACoU;AAAA,kBAAA;AAAA,oBACC,UAAUlY,EAAO;AAAA,oBACjB,QAAQ,CAACP,MACPub,EAA2Bhb,EAAO,IAAIP,CAAO;AAAA,oBAE/C,WAAWO,EAAO,aAAa,CAAA;AAAA,oBAC/B,aAAa0N,KAAmB,CAAA;AAAA,kBAAC;AAAA,gBAAA;AAAA,cACnC,EAAA,CACF;AAAA,YAAA,EAAA,CACF;AAAA,UAAA;AAAA,UArIK1N,EAAO,KAAK+N;AAAA,QAAA,CAuIpB,EAAA,CACH;AAAA,MAAA,EAAA,CAEJ,KA7LkB,QA+LtB;AAAA,MAEA,gBAAAjK,EAACwV,IAAA,EAAQ,KAAI,MACX,UAAA,gBAAAlV;AAAA,QAACyR;AAAA,QAAA;AAAA,UACC,MAAA+D;AAAA,UACA,QAAO;AAAA,UACP,gBAAgBW;AAAA,UAEhB,UAAA;AAAA,YAAA,gBAAAzW;AAAA,cAAC+R,EAAK;AAAA,cAAL;AAAA,gBACC,OAAM;AAAA,gBACN,MAAM,CAAC,eAAe,aAAa;AAAA,gBACnC,eAAc;AAAA,gBAEd,4BAACG,IAAA,CAAA,CAAO;AAAA,cAAA;AAAA,YAAA;AAAA,YAGV,gBAAAlS;AAAA,cAAC+R,EAAK;AAAA,cAAL;AAAA,gBACC,OAAM;AAAA,gBACN,MAAM,CAAC,eAAe,aAAa;AAAA,gBACnC,eAAc;AAAA,gBAEd,4BAACG,IAAA,CAAA,CAAO;AAAA,cAAA;AAAA,YAAA;AAAA,YAGV,gBAAAlS;AAAA,cAAC+R,EAAK;AAAA,cAAL;AAAA,gBACC,OAAM;AAAA,gBACN,MAAM,CAAC,eAAe,aAAa;AAAA,gBACnC,eAAc;AAAA,gBAEd,4BAACG,IAAA,CAAA,CAAO;AAAA,cAAA;AAAA,YAAA;AAAA,YAGV,gBAAAlS;AAAA,cAAC+R,EAAK;AAAA,cAAL;AAAA,gBACC,OAAM;AAAA,gBACN,MAAM,CAAC,eAAe,cAAc;AAAA,gBACpC,eAAc;AAAA,gBAEd,4BAACG,IAAA,CAAA,CAAO;AAAA,cAAA;AAAA,YAAA;AAAA,UACV;AAAA,QAAA;AAAA,MAAA,KApCkB,SAsCtB;AAAA,IAAA,EAAA,CAEF,EAAA,CACF;AAAA,sBAEC,OAAA,EAAI,WAAU,2CACb,UAAA,gBAAA5R,EAAC,OAAA,EAAI,WAAU,yBACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,UAAA;AAAA,QAAA;AAAA,QAAQiW,EAAa,GAAG,MAAM,GAAG,CAAC;AAAA,QAAE;AAAA,MAAA,GAAG;AAAA,wBAC3C,OAAA,EAAI,UAAA;AAAA,QAAA;AAAA,QAAMC,EAAkB;AAAA,MAAA,EAAA,CAAO;AAAA,IAAA,EAAA,CACtC,EAAA,CACF;AAAA,IAEA,gBAAAxW;AAAA,MAAC8R;AAAA,MAAA;AAAA,QACC,OAAM;AAAA,QACN,MAAMmE;AAAA,QACN,UAAU,MAAM;AACd,UAAAC,EAAwB,EAAK,GAC7BE,EAAmB,IAAI;AAAA,QACzB;AAAA,QACA,QAAQ;AAAA,QACR,OAAO;AAAA,QAEP,UAAA,gBAAApW,EAAC,OAAA,EAAI,WAAU,iCACb,4BAAC3B,IAAA,EAAS,OAAK,IAAC,kBAAkB,CAAC,SAAS,UAAU,QAAQ,MAAM,GAClE,UAAA;AAAA,UAAA,gBAAA2B,EAAC5B,IAAA,EAAM,QAAO,QACZ,UAAA,gBAAA4B,EAAC,SAAI,WAAU,0BACZ,UAAAvB,EACE,OAAO,CAAC/B,MAAM,CAAC,MAAM,MAAM,MAAM,EAAE,SAASA,EAAE,IAAI,CAAC,EACnD,IAAI,CAACF,MACJ,gBAAAwD;AAAA,YAACoX;AAAA,YAAA;AAAA,cAEC,UAAA5a;AAAA,cACA,SAAS,MAAMoa,GAA8Bpa,CAAQ;AAAA,YAAA;AAAA,YAFhDA,EAAS;AAAA,UAAA,CAIjB,EAAA,CACL,EAAA,GAXuB,OAYzB;AAAA,UAEA,gBAAAwD,EAAC5B,MAAM,QAAO,QACZ,4BAAC,OAAA,EAAI,WAAU,0BACZ,UAAAK,EACE;AAAA,YACC,CAAC/B,MACC,CAAC,MAAM,KAAK,IAAI,EAAE,SAASA,EAAE,IAAI,KAChCA,EAAE,SAAS,WACV,CAAC,CAAC,MAAM,MAAM,MAAM,EAAE,SAASA,EAAE,IAAI;AAAA,UAAA,EAE1C,IAAI,CAACF,MACJ,gBAAAwD;AAAA,YAACoX;AAAA,YAAA;AAAA,cAEC,UAAA5a;AAAA,cACA,SAAS,MAAMoa,GAA8Bpa,CAAQ;AAAA,YAAA;AAAA,YAFhDA,EAAS;AAAA,UAAA,CAIjB,EAAA,CACL,EAAA,GAhBuB,QAiBzB;AAAA,4BAEC4B,IAAA,EAAM,QAAO,MACZ,UAAA,gBAAA4B,EAAC,OAAA,EAAI,WAAU,0BACZ,UAAAvB,EACE,OAAO,CAAC/B,MAAMA,EAAE,SAAS,MAAM,EAC/B,IAAI,CAACF,MACJ,gBAAA8D;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,WAAU;AAAA,cACV,SAAS,MAAMsW,GAA8Bpa,CAAQ;AAAA,cAErD,UAAA;AAAA,gBAAA,gBAAAwD,EAAC,OAAA,EAAI,WAAU,+EACb,UAAA,gBAAAA,EAAC,UAAK,WAAU,mCAAkC,eAAC,EAAA,CACrD;AAAA,gBACA,gBAAAA,EAAC,QAAA,EAAK,WAAU,WAAW,YAAS,KAAA,CAAK;AAAA,cAAA;AAAA,YAAA;AAAA,YAPpCxD,EAAS;AAAA,UAAA,CASjB,EAAA,CACL,EAAA,GAhBqB,MAiBvB;AAAA,4BAEC4B,IAAA,EAAM,QAAO,MACZ,UAAA,gBAAA4B,EAAC,OAAA,EAAI,WAAU,0BACZ,UAAAvB,EACE,OAAO,CAAC/B,MAAMA,EAAE,SAAS,MAAM,EAC/B,IAAI,CAACF,MACJ,gBAAA8D;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,WAAU;AAAA,cACV,SAAS,MAAMsW,GAA8Bpa,CAAQ;AAAA,cAErD,UAAA;AAAA,gBAAA,gBAAAwD,EAAC,SAAI,WAAU,+EACb,4BAAC,OAAA,EAAI,WAAU,yBAAwB,EAAA,CACzC;AAAA,gBACA,gBAAAA,EAAC,QAAA,EAAK,WAAU,WAAW,YAAS,KAAA,CAAK;AAAA,cAAA;AAAA,YAAA;AAAA,YAPpCxD,EAAS;AAAA,UAAA,CASjB,EAAA,CACL,EAAA,GAhBqB,MAiBvB;AAAA,QAAA,EAAA,CACF,EAAA,CACF;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF,IAlaE,gBAAAwD,EAAC,SAAI,WAAU,6EACb,4BAACY,IAAA,EAAM,aAAY,WAAU,EAAA,CAC/B;AAkaN,GAQMwW,KAA4C,CAAC,EAAE,UAAA5a,GAAU,SAAAkH,QAAc;AAE3E,QAAMnE,IAAM/C,EAAS,SAAS,UAAWA,EAAkD,MAAM;AAEjG,SACE,gBAAA8D;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,SAAAoD;AAAA,MAEA,UAAA;AAAA,QAAA,gBAAA1D,EAAC,OAAA,EAAI,WAAU,2DACZ,UAAAT,sBACE,OAAA,EAAI,KAAAA,GAAU,KAAK/C,EAAS,MAAM,WAAU,2BAAA,CAA2B,sBAEvE,QAAA,EAAK,WAAU,WAAW,UAAAA,EAAS,KAAK,CAAC,EAAA,CAAE,EAAA,CAEhD;AAAA,QACA,gBAAAwD,EAAC,QAAA,EAAK,WAAU,WAAW,YAAS,KAAA,CAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG/C;;GClpBM,EAAE,QAAAqX,IAAQ,OAAAC,IAAO,SAAAC,GAAA,IAAYC,IA+BtBC,KAA4C,CAAC;AAAA,EACxD,eAAAC;AAAA,EACA,UAAA1O;AAAA,EACA,UAAA2O,IAAW;AAAA,EACX,aAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,OAAAhc;AAAA,EACA,YAAAic,IAAa;AAAA,EACb,mBAAAC,IAAoB;AAAA,EACpB,mBAAAC,IAAoB;AAAA,EACpB,iBAAAC;AACF,MAAM;AACJ,QAAM,CAACC,GAAoBC,CAAqB,IAAI7P,GAAM,SAAS,EAAK,GAClE,CAAC8P,GAAWC,CAAY,IAAI/P,GAAM,SAAS,EAAE,GAC7C,CAACsB,GAAiB0O,CAAkB,IAAIhQ,GAAM,SAAS;AAAA,IAC3D;AAAA,MACE,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,YAAY;AAAA,IAAA;AAAA,IAEd;AAAA,MACE,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,YAAY;AAAA,IAAA;AAAA,EACd,CACD,GACK,EAAE,cAAAiQ,GAAc,cAAAC,GAAc,OAAAxO,GAAO,WAAAvL,GAAW,aAAAC,EAAA,IACpDtD,GAAA;AACkB,EAAAkN,GAAM,OAAY,IAAI;AAC1C,QAAMmQ,IAAiBnQ,GAAM,OAAO,EAAK;AA4BzC,EAAAhE,GAAU,MAAM;AAEd,IAAImU,EAAe,YACnBA,EAAe,UAAU,IAGrBha,EAAU,WAAW,KACvBtB,GAAc,QAAQ,CAACT,MAAMgC,EAAYhC,CAAC,CAAC,GAIzCub,KAAmBA,EAAgB,SAAS,KAC9CA,EAAgB,QAAQ,CAACvb,MAAMgC,EAAYhC,CAAC,CAAC,GAI3Cgb,KACFc,EAAad,CAAa;AAAA,EAE9B,GAAG,CAAA,CAAE,GAGLpT,GAAU,MAAM;AACd,QAAI0E,GAAU;AACZ,YAAM9L,IAASqb,EAAA;AACf,MAAAvP,EAAS9L,CAAM;AAAA,IACjB;AAAA,EACF,GAAG,CAAC8M,GAAOhB,CAAQ,CAAC;AAGpB,QAAM0P,KAAe9S,EAAY,MAAM;AACrC,UAAM1I,IAASqb,EAAA,GACTI,IAAU,KAAK,UAAUzb,GAAQ,MAAM,CAAC,GACxC0b,IACJ,yCAAyC,mBAAmBD,CAAO,GAE/DE,IAAwB,UAAU,KAAK,IAAA,CAAK,SAE5CC,IAAc,SAAS,cAAc,GAAG;AAC9C,IAAAA,EAAY,aAAa,QAAQF,CAAO,GACxCE,EAAY,aAAa,YAAYD,CAAqB,GAC1DC,EAAY,MAAA,GAEZ1G,GAAQ,QAAQ,OAAO;AAAA,EACzB,GAAG,CAACmG,CAAY,CAAC,GAGXQ,KAAenT,EAAY,MAAM;AACrC,QAAI;AACF,YAAM1I,IAAqB,KAAK,MAAMkb,CAAS;AAC/C,MAAAI,EAAatb,CAAM,GACnBib,EAAsB,EAAK,GAC3BE,EAAa,EAAE,GACfjG,GAAQ,QAAQ,OAAO;AAAA,IACzB,QAAgB;AACd,MAAAA,GAAQ,MAAM,iBAAiB;AAAA,IACjC;AAAA,EACF,GAAG,CAACgG,GAAWI,CAAY,CAAC,GAGtBQ,KAAmBpT;AAAA,IACvB,CAACvG,MAAe;AACd,YAAMC,IAAS,IAAI,WAAA;AACnB,aAAAA,EAAO,SAAS,CAAC9G,MAAM;AACrB,YAAI;AACF,gBAAMsD,IAAUtD,EAAE,QAAQ,QACpB0E,IAAqB,KAAK,MAAMpB,CAAO;AAC7C,UAAA0c,EAAatb,CAAM,GACnBkV,GAAQ,QAAQ,OAAO,GACvB+F,EAAsB,EAAK;AAAA,QAC7B,QAAgB;AACd,UAAA/F,GAAQ,MAAM,QAAQ;AAAA,QACxB;AAAA,MACF,GACA9S,EAAO,WAAWD,CAAI,GACf;AAAA,IACT;AAAA,IACA,CAACmZ,CAAY;AAAA,EAAA,GAITS,KAAYrT,EAAY,MACrB2S,EAAA,GACN,CAACA,CAAY,CAAC;AAGjB,SAAAjQ,GAAM;AAAA,IACHA,GAAc,SAAA;AAAA,IACf,OAAO;AAAA,MACL,WAAA2Q;AAAA,MACA,cAAAV;AAAA,MACA,cAAAC;AAAA,IAAA;AAAA,IAEF,CAACS,IAAWV,GAAcC,CAAY;AAAA,EAAA,GAMtC,gBAAAxY,EAACkZ,MAAe,QAAQC,IACtB,4BAAC,OAAA,EAAI,WAAWC,GAAO,cAAc,OAAAvd,GACnC,UAAA,gBAAAyE;AAAA,IAACkX;AAAA,IAAA;AAAA,MACC,WAAW,iCAAiCK,CAAS;AAAA,MAEpD,UAAA;AAAA,QAAAC,KACC,gBAAAxX,EAAC+W,IAAA,EAAO,WAAU,0FAChB,UAAA;AAAA,UAAA,gBAAA/W,EAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,YAAA,gBAAAN,EAAC,OAAA,EAAI,WAAU,mCAAkC,UAAA,SAAK;AAAA,YACtD,gBAAAM,EAAC,OAAA,EAAI,WAAU,yBAAyB,UAAA;AAAA,cAAA0J,EAAM;AAAA,cAAO;AAAA,YAAA,EAAA,CAAI;AAAA,UAAA,GAC3D;AAAA,4BAECoH,IAAA,EACE,UAAA;AAAA,YAAAwG;AAAA,YACA,CAACD,KACA,gBAAArX,EAAAO,IAAA,EACE,UAAA;AAAA,cAAA,gBAAAb,EAACsR,IAAA,EAAQ,OAAM,WACb,UAAA,gBAAAtR,EAACE,GAAA,EAAO,MAAM,gBAAAF,EAACqZ,IAAA,CAAA,CAAiB,GAAI,SAASX,IAAc,UAAA,KAAA,CAE3D,GACF;AAAA,cAEA,gBAAA1Y,EAACsR,IAAA,EAAQ,OAAM,WACb,UAAA,gBAAAtR;AAAA,gBAACE;AAAA,gBAAA;AAAA,kBACC,wBAAOO,IAAA,EAAe;AAAA,kBACtB,SAAS,MAAM0X,EAAsB,EAAI;AAAA,kBAAG,UAAA;AAAA,gBAAA;AAAA,cAAA,EAE9C,CACF;AAAA,YAAA,EAAA,CACF;AAAA,UAAA,EAAA,CAEJ;AAAA,QAAA,GACF;AAAA,0BAIDX,IAAA,EAEE,UAAA;AAAA,UAAAO,KAAqB,CAACJ,KACrB,gBAAA3X,EAACsX,IAAA,EAAM,OAAO,KAAK,WAAU,YAAW,OAAM,SAC5C,UAAA,gBAAAtX,EAACxB,IAAA,CAAA,CAAc,GACjB;AAAA,4BAID+Y,IAAA,EAAQ,WAAU,wBACjB,UAAA,gBAAAvX,EAAC2J,IAAA,EAAO,iBAAAC,GAAkC,GAC5C;AAAA,UAGCoO,KAAqB,CAACL,KACrB,gBAAA3X,EAACsX,MAAM,OAAO,KAAK,WAAU,YAAW,OAAM,SAC5C,UAAA,gBAAAtX,EAAC0V,IAAA,EAAc,iBAAA9L,GAAkC,EAAA,CACnD;AAAA,QAAA,GAEJ;AAAA,QAGA,gBAAA5J;AAAA,UAAC8R;AAAA,UAAA;AAAA,YACC,OAAM;AAAA,YACN,MAAMoG;AAAA,YACN,MAAMa;AAAA,YACN,UAAU,MAAM;AACd,cAAAZ,EAAsB,EAAK,GAC3BE,EAAa,EAAE;AAAA,YACjB;AAAA,YACA,OAAO;AAAA,YACP,UAAA,gBAAA/X,EAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,cAAA,gBAAAA,EAAC,OAAA,EACC,UAAA;AAAA,gBAAA,gBAAAN,EAAC,KAAA,EAAE,WAAU,QAAO,UAAA,iBAAa;AAAA,gBACjC,gBAAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,QAAO;AAAA,oBACP,UAAU,CAACxH,MAAM;AACf,4BAAM6G,IAAO7G,EAAE,OAAO,QAAQ,CAAC;AAC/B,sBAAI6G,QAAuBA,CAAI;AAAA,oBACjC;AAAA,oBACA,WAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAMZ,GACF;AAAA,cAEA,gBAAAW,EAAC,OAAA,EAAI,WAAU,6BAA4B,UAAA,KAAC;AAAA,gCAE3C,OAAA,EACC,UAAA;AAAA,gBAAA,gBAAAA,EAAC,KAAA,EAAE,WAAU,QAAO,UAAA,eAAW;AAAA,gBAC/B,gBAAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAOoY;AAAA,oBACP,UAAU,CAAC5f,MAAM6f,EAAa7f,EAAE,OAAO,KAAK;AAAA,oBAC5C,aAAY;AAAA,oBACZ,WAAU;AAAA,kBAAA;AAAA,gBAAA;AAAA,cACZ,EAAA,CACF;AAAA,YAAA,EAAA,CACF;AAAA,UAAA;AAAA,QAAA;AAAA,MACF;AAAA,IAAA;AAAA,EAAA,GAEJ,EAAA,CACF;AAEJ;","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9]}