@zero-library/chat-agent 2.1.4 → 2.1.6

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,"sources":["../src/services/file.ts","../src/core/utils.ts","../src/stores/Context.ts","../src/ui/common/markdownAlert/styles.module.less","../src/ui/common/markdownAlert/AppCard.tsx","../src/ui/common/markdownAlert/FileView.tsx","../src/ui/common/markdownAlert/components/DocDrawer.tsx","../src/ui/common/markdownAlert/IndexQuote.tsx","../src/ui/common/markdownAlert/MdEdit.tsx","../src/ui/common/markdownAlert/FileEdit.tsx","../src/ui/common/markdownAlert/QuoteList.tsx","../src/ui/layouts/index.tsx","../src/stores/index.ts","../src/services/index.ts","../src/ui/common/markdownAlert/index.ts","../src/components/MessageRender.tsx","../src/core/constants.ts","../src/ui/common/BubbleListItems.tsx","../src/ui/common/styles.module.less","../src/ui/common/MessageAIRender.tsx","../src/ui/common/ChatHeader.tsx","../src/ui/common/AgentCharacter.tsx","../src/ui/common/CharacterList.tsx","../src/ui/common/ConversationList.tsx","../src/components/styles.module.less","../src/components/Attachments.tsx","../src/components/ChatSender.tsx","../src/ui/common/ChatSender.tsx","../src/ui/common/ConversationListHeader.tsx","../src/ui/common/ConversationListPanel.tsx","../src/ui/common/SenderPromptsItems.tsx","../src/ui/layouts/styles.module.less"],"names":["request","downloadFile","copyText","message","dayjs","useCreateValtioContext","appCard","fileView","fileEdit","fileEditHeader","fileEditContent","quoteList","mdEdit","Spin","jsxs","Flex","jsx","FileIcon","useState","useEffect","Drawer","RenderMarkdown","Empty","isExternal","Popover","Tag","MarkdownEditor","Button","PlayCircleOutlined","CopyOutlined","Fragment","Collapse","CaretRightOutlined","proxy","shouldRender","deepMerge","getCurrentUser","userInfo","isObject","deepCopy","Bubble","Attachments","styles_module_default","loadingMessage","conversationListPanel","nsConversations","nsBodyWidth","nsBubbleList","nsChatHeader","nsChatTitle","nsChatHeaderPopover","chatWelcomeWrap","chatWelcome","chatWelcomePrompts","senderListTitle","senderList","senderListItem","senderListFooter","nsChatUserName","nsSenderReferenceHeaderTitle","nsSenderReferenceHeaderContent","avatarListContainer","avatarList","avatarListItem","avatarListItemIcon","avatarListItemIconActive","avatarListItemName","useMemo","Typography","classNames","useSnapshot","isBoolean","UserAvatar","OpenAIOutlined","Space","Welcome","Avatar","Prompts","LikeOutlined","DislikeOutlined","RenderWrapper","useRef","Modal","Row","Col","useDebounce","InfiniteScroll","RedoOutlined","Conversations","DeleteOutlined","PlusOutlined","CommentOutlined","CloseOutlined","nsAttachments","forwardRef","App","useRefState","getFileSuffixName","isNumber","isNullOrUnDef","useImperativeHandle","CloudUploadOutlined","fileUpload","useSyncInput","Badge","PaperClipOutlined","Sender","Suggestion","ChatSender_default","UserSwitchOutlined","EnterOutlined","List","nsPreviewHeader","nsPreviewHeaderTitle","nsChatSenderHeader","nsDisclaimerNotice","nsChatLayout","useDeepEffect","sizes","useWebSocket","getWebSocketUrl","getToken","isLocalhost","XProvider","Splitter","FilePreview"],"mappings":"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","file":"index.cjs.js","sourcesContent":["import { downloadFile, request } from '@zero-library/common'\n\nexport interface DocType {\n /**\n * 内容\n */\n content: string\n /**\n * 文档ID\n */\n docId: string\n /**\n * 关键字\n */\n keywords?: string[]\n /**\n * 位置\n */\n position?: number\n /**\n * 分段ID\n */\n sid?: string\n /**\n * 令牌数\n */\n tokens?: number\n /**\n * 字数\n */\n wordCount?: number\n}\nexport const docQuery = (paramsStr: string): Promise<R<DocType>> => {\n return request.get(`/uc/doc?${paramsStr}`)\n}\nexport const fileCreate = async (fileContent: string, fileName?: string, targetFormat: string = 'docx') => {\n const blob = await request.post(`/uc/doc/convert`, { fileContent, fileName, targetFormat }, { responseType: 'blob' })\n const url = URL.createObjectURL(blob)\n downloadFile(url, fileName)\n}\n","import { copyText } from '@zero-library/common'\nimport { message } from 'antd'\nimport dayjs from 'dayjs'\n\nexport const copy = (value: string) => {\n copyText(value).then(() => {\n message.success('复制成功')\n })\n}\n\nexport const classifyTime = (timestamp?: number): string => {\n const now = dayjs()\n const target = dayjs(timestamp)\n\n if (target.isSame(now, 'day')) {\n return '今天'\n }\n\n const diffInDays = now.diff(target, 'day')\n if (diffInDays < 7) {\n return '最近 7 天'\n } else if (diffInDays < 30) {\n return '最近 30 天'\n } else if (diffInDays < 180) {\n return '最近半年'\n } else {\n return '更早'\n }\n}\n\n// 对象转换函数,将源对象转换为目标对象\nexport function transform<T extends object, U extends object>(\n source: T,\n fieldMap: {\n [K in keyof U]: keyof T | ((source: T) => U[K]) | U[K]\n }\n): U {\n const result = {} as U\n for (const [targetKey, mapping] of Object.entries(fieldMap)) {\n const key = targetKey as keyof U\n if (typeof mapping === 'function') {\n result[key] = (mapping as (src: T) => U[typeof key])(source)\n } else if (typeof mapping === 'string' && source && mapping in source) {\n result[key] = source[mapping as keyof T] as unknown as U[typeof key]\n } else {\n result[key] = mapping as U[typeof key]\n }\n }\n return result\n}\n\n// 批量对象转换函数\nexport function transforms<T extends object, U extends object>(\n sources: T[],\n fieldMap: {\n [K in keyof U]: keyof T | ((source: T) => U[K]) | U[K]\n }\n): U[] {\n return sources?.map((source) => transform<T, U>(source, fieldMap)) || []\n}\n\n// 构建带查询参数的 URL,支持数组参数\nexport function buildURLWithParams(url: string, params?: Record<string, any>) {\n const query = new URLSearchParams(\n Object.entries(params || {}).flatMap(([key, val]) => (Array.isArray(val) ? val.map((v) => [key, String(v)]) : [[key, String(val)]]))\n ).toString()\n return query ? `${url}${url.includes('?') ? '&' : '?'}${query}` : url\n}\n\nexport const getBase64 = (file: File): Promise<string> => {\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(reader.result as string)\n reader.onerror = reject\n reader.readAsDataURL(file)\n })\n}\n","import { useCreateValtioContext } from '@zero-library/common'\nimport { ChatStoreType } from '.'\n\n// 基于泛型创建专用上下文\nexport const { ValtioProvider: ChatProvider, useValtioStore: useChatStore } = useCreateValtioContext<ChatStoreType>()\n",".appCard {\n width: 180px;\n border-radius: 10px;\n border: 1px solid #d7d7d7;\n background-color: #fafafa;\n font-size: 16px;\n cursor: pointer;\n margin: 8px;\n padding: 12px 8px;\n}\n.appCard > div {\n max-width: 100%;\n}\n.appCard > img {\n height: 30px;\n}\n.fileView {\n width: 200px;\n padding: 4px 8px;\n cursor: pointer;\n background-color: #f5f3f3;\n border-radius: 6px;\n}\n.fileEdit {\n margin: 12px 0;\n border-radius: 6px;\n border: 1px solid #f2f2f2;\n}\n.fileEdit .fileEditHeader {\n padding: 2px 8px;\n background-color: #f2f2f2;\n}\n.fileEdit .fileEditContent {\n padding: 8px;\n background-color: #fafafa;\n}\n.quoteList {\n min-width: 300px;\n}\n.quoteList:global.ant-collapse .ant-collapse-item .ant-collapse-header {\n padding: 12px 0;\n color: #8f91a8;\n}\n.quoteList:global.ant-collapse .ant-collapse-item .ant-collapse-content {\n color: #8f91a8;\n background-color: #f2f2f2;\n}\n.mdEdit {\n margin: 10px 0;\n background-color: rgba(242, 242, 242, 0.2);\n border: 1px solid #f2f2f2;\n padding: 10px;\n border-radius: 4px;\n}\n","import { Flex, Spin } from 'antd'\nimport { useChatStore } from '../../../stores/Context'\nimport styles from './styles.module.less'\n\ninterface Props {\n data: {\n // AgentType\n appKey: string\n appName: string\n agentKey: string\n iconUrl: string\n }\n loading: boolean\n}\n// :::alert type=appCard data={appKey:\"cube-acc\",agentKey:\"cube-acc\",appName:\"罗拉易账\",iconUrl:\"/icon-url/2e53e398d31627d559e0b3b1b5acb731.png\"} :::\nexport default ({ data, loading }: Props) => {\n const chatStore = useChatStore()\n const onClick = () => {\n chatStore.switchAgentConversation(`${data.appKey}:${data.agentKey}`)\n // emit('openApp', { appKey: data.appKey })\n }\n return (\n <Spin spinning={loading} size=\"small\">\n <Flex vertical gap={4} align=\"center\" className={styles.appCard} onClick={onClick}>\n <img src={data.iconUrl} />\n <div className=\"text-ellipsis\" title={data.appName}>\n {data.appName}\n </div>\n </Flex>\n </Spin>\n )\n}\n","import { FileIcon } from '@zero-library/common'\nimport { Flex, Spin } from 'antd'\nimport { FileUrlType } from '../../../stores'\nimport { useChatStore } from '../../../stores/Context'\nimport styles from './styles.module.less'\n\ninterface Props {\n data: FileUrlType\n loading: boolean\n}\n// :::alert type=fileView data={fileUrl:\"\",fileName:\"\",suffix:\"\"} :::\nexport default ({ data, loading }: Props) => {\n const chatStore = useChatStore()\n const onClick = () => {\n chatStore.setPreview(data, false)\n }\n return (\n <Spin spinning={loading} size=\"small\">\n <Flex gap={8} align=\"center\" className={styles.fileView} onClick={onClick}>\n <FileIcon suffix={data.suffix} />\n <div className=\"text-ellipsis\" title={data.fileName}>\n {data.fileName}\n </div>\n </Flex>\n </Spin>\n )\n}\n","import { RenderMarkdown } from '@zero-library/common'\nimport { Drawer, Empty, Spin } from 'antd'\nimport { useEffect, useState } from 'react'\nimport { docQuery } from '../../../../services/file'\n\ninterface Props {\n fileUrl: string\n title: string\n open: boolean\n onClose: () => void\n}\nexport default ({ title, open, onClose, fileUrl }: Props) => {\n const [content, setContent] = useState('')\n const [loading, setLoading] = useState(false)\n const getContent = async () => {\n try {\n setLoading(true)\n const res = await docQuery(fileUrl)\n setContent(res.data?.content)\n } finally {\n setLoading(false)\n }\n }\n useEffect(() => {\n getContent()\n }, [fileUrl])\n return (\n <Drawer title={title} push={false} width=\"100%\" open={open} onClose={onClose}>\n <Spin spinning={loading}>{content ? <RenderMarkdown content={content} /> : <Empty className=\"m-t-32\" />}</Spin>\n </Drawer>\n )\n}\n","// :::alert type=indexQuote data={index:\"1\",fileName:'',fileUrl:\"\"} :::\nimport { isExternal } from '@zero-library/common'\nimport { Flex, Popover, Spin, Tag } from 'antd'\nimport { useState } from 'react'\nimport DocDrawer from './components/DocDrawer'\n\ninterface Props {\n data: {\n index: string\n fileUrl?: string\n fileName: string\n }\n loading: boolean\n}\nexport default ({ data, loading }: Props) => {\n const [open, setOpen] = useState(false)\n const onClick = () => {\n if (!data.fileUrl) return\n if (isExternal(data.fileUrl)) {\n window.open(data.fileUrl, '_blank')\n } else {\n setOpen(true)\n }\n }\n const Content = (\n <div>\n <Flex align=\"center\" gap={8}>\n {/* <FileIcon suffix={data.suffix} fontSize={16} /> */}\n <a onClick={onClick}>{data.fileName}</a>\n </Flex>\n </div>\n )\n return (\n <div className=\"inline-block m-l-8\">\n <Spin spinning={loading} size=\"small\">\n <Popover content={Content}>\n <Tag bordered={false} color=\"processing\" className=\"cursor-pointer\">\n {data.index}\n </Tag>\n </Popover>\n </Spin>\n {open && <DocDrawer fileUrl={data.fileUrl} title={data.fileName} open={open} onClose={() => setOpen(false)} />}\n </div>\n )\n}\n","import { MarkdownEditor } from '@zero-library/common'\nimport { Button, Flex } from 'antd'\nimport { useEffect, useState } from 'react'\nimport { useChatStore } from '../../../stores/Context'\nimport styles from './styles.module.less'\n\ninterface Props {\n data: {\n content: string\n // messageId: string\n }\n loading: boolean\n}\n// :::alert type=mdEdit data={content:\"\"} :::\nexport default ({ data, loading }: Props) => {\n const chatStore = useChatStore()\n const [value, setValue] = useState('')\n const onOk = () => {\n chatStore.sendMessage('开始写作', [], { outline: value })\n }\n useEffect(() => {\n setValue(data.content)\n }, [data.content])\n return (\n <div className={styles.mdEdit}>\n <MarkdownEditor disabled={loading} value={value} onChange={setValue} showToolbar={false} />\n {!loading && (\n <Flex justify=\"end\" className=\"m-t-16\">\n <Button color=\"primary\" variant=\"outlined\" onClick={onOk}>\n 确认提纲思路,开始写作\n </Button>\n </Flex>\n )}\n </div>\n )\n}\n","// :::alert type=fileEdit data={fileName:\"\",content:\"\"} :::\nimport { CopyOutlined, PlayCircleOutlined } from '@ant-design/icons'\nimport { FileIcon, RenderMarkdown } from '@zero-library/common'\nimport { Button, Flex, Spin } from 'antd'\nimport { FileTextType } from 'packages/chat-agent/src/stores'\nimport { copy } from '../../../core/utils'\nimport { useChatStore } from '../../../stores/Context'\nimport styles from './styles.module.less'\n\ninterface Props {\n data: FileTextType\n loading: boolean\n}\nexport default ({ data, loading }: Props) => {\n const chatStore = useChatStore()\n // const configState = useSnapshot(chatStore.config)\n const onPreview = () => {\n chatStore.setPreview(data, true)\n }\n // useEffect(() => {\n // if (configState.preview.isShow !== 2 || (loading && configState.preview.isShow === 1)) {\n // chatStore.setPreview(data, {\n // isEdit: true,\n // isShow: 1,\n // isIntact: !loading\n // })\n // }\n // }, [data, loading])\n\n return (\n <Flex vertical className={styles.fileEdit}>\n <Flex gap={8} align=\"center\" justify=\"space-between\" className={styles.fileEditHeader}>\n <Flex gap={4} align=\"center\" className=\"flex-1\">\n <FileIcon suffix={'md'} fontSize={18} />\n <div className=\"text-ellipsis\" title={data.fileName}>\n {data.fileName}\n </div>\n </Flex>\n <Spin spinning={loading} size=\"small\">\n <Flex>\n <Button color=\"default\" variant=\"text\" size=\"small\" icon={<PlayCircleOutlined />} onClick={onPreview}>\n 预览编辑\n </Button>\n <Button color=\"default\" variant=\"text\" size=\"small\" icon={<CopyOutlined />} onClick={() => copy(data.content)}>\n 复制\n </Button>\n </Flex>\n </Spin>\n </Flex>\n <Flex gap={8} align=\"center\" className={styles.fileEditContent}>\n <RenderMarkdown content={data.content} />\n </Flex>\n </Flex>\n )\n}\n","// 文末引用::::alert type=quoteList data={list:[{\"title\":'介绍介绍介绍介绍介绍介绍.pdf',fileUrl:\"2909615725521334\"},{\"title\":'介绍介绍介绍介绍介绍介绍.pdf',fileUrl:\"2909615725521364\"}]} :::\nimport { CaretRightOutlined } from '@ant-design/icons'\nimport { isExternal } from '@zero-library/common'\nimport { Collapse, Flex } from 'antd'\nimport { useState } from 'react'\nimport DocDrawer from './components/DocDrawer'\nimport styles from './styles.module.less'\ninterface QuoteItem {\n title: string\n fileUrl: string\n}\ninterface Props {\n data: {\n list: QuoteItem[]\n }\n loading: boolean\n}\nexport default ({ data, loading }: Props) => {\n const [open, setOpen] = useState(false)\n const [selectItem, setSelectItem] = useState({} as QuoteItem)\n const onClick = (item: QuoteItem) => {\n if (!item.fileUrl) return\n if (isExternal(item.fileUrl)) {\n window.open(item.fileUrl, '_blank')\n } else {\n setSelectItem(item)\n setOpen(true)\n }\n }\n return (\n <>\n <Collapse\n className={styles.quoteList}\n bordered={false}\n ghost\n expandIcon={({ isActive }) => <CaretRightOutlined rotate={isActive ? 90 : 0} />}\n items={[\n {\n key: '1',\n label: '参考资料',\n children: (\n <Flex vertical gap={4}>\n {data.list.map((item) => (\n <p key={item.fileUrl} onClick={() => !loading && onClick(item)} className=\"cursor-pointer\">\n {item.title}\n </p>\n ))}\n </Flex>\n )\n }\n ]}\n />\n {open && <DocDrawer fileUrl={selectItem.fileUrl} title={selectItem.title} open={open} onClose={() => setOpen(false)} />}\n </>\n )\n}\n","import { forwardRef, useEffect, useImperativeHandle, useMemo, useState } from 'react'\n\nimport { CloseOutlined } from '@ant-design/icons'\nimport { Conversation, XProvider } from '@ant-design/x'\nimport {\n downloadFile,\n FilePreview,\n getToken,\n getWebSocketUrl,\n isLocalhost,\n MarkdownEditor,\n RenderWrapper,\n shouldRender,\n useDeepEffect,\n UserInfo,\n useWebSocket\n} from '@zero-library/common'\nimport { Button, Flex, Spin, Splitter, Tag, ThemeConfig } from 'antd'\nimport classNames from 'classnames'\nimport { useSnapshot } from 'valtio'\nimport { AgentInfo, InputFile } from '../../services'\nimport { fileCreate } from '../../services/file'\nimport type { ChatHooks, ChatLayout, ChatParams, ConversationStrategy, FileTextType, FileUrlType, ReferencesType } from '../../stores'\nimport { createChatStore } from '../../stores'\nimport { ChatProvider } from '../../stores/Context'\nimport BubbleListItems from '../common/BubbleListItems'\nimport ChatHeader from '../common/ChatHeader'\nimport ChatSender from '../common/ChatSender'\nimport ConversationListPanel from '../common/ConversationListPanel'\nimport SenderPromptsItems from '../common/SenderPromptsItems'\nimport chatStyles from '../common/styles.module.less'\nimport styles from './styles.module.less'\n\nexport interface ChatConfig {\n receiverType?: number // :1-用户 2-专家 3-Agent\n receiverId?: string // 专家或智能体\n conversationId?: string // 会话Id\n conversationStrategy?: ConversationStrategy\n}\ninterface Props {\n theme?: ThemeConfig\n config?: ChatConfig\n params?: ChatParams\n hooks?: ChatHooks\n layout?: ChatLayout\n userInfo?: UserInfo\n}\nexport interface ChatHandle {\n sendMessage: (message?: string, files?: InputFile[]) => void\n switchAgentConversation: (agentId: AgentInfo['id'], strategy?: ConversationStrategy) => void\n switchConversation: (id?: Conversation['id']) => void\n createConversation: () => Promise<void>\n setReferences: (references?: ReferencesType) => void\n setMessage: (message?: string) => void\n setFiles: (files?: InputFile[]) => void\n}\nexport default forwardRef<ChatHandle, Props>(({ theme, params, userInfo, hooks, layout, config }: Props, ref) => {\n const chatStore = useMemo(() => createChatStore(), [])\n\n useDeepEffect(() => {\n if (config?.conversationId) {\n chatStore.switchConversation(config.conversationId)\n return\n }\n if (config?.receiverId && config?.receiverType === 3) {\n chatStore.switchAgentConversation(config.receiverId, config.conversationStrategy)\n }\n }, [config])\n useEffect(() => {\n chatStore.setUserInfo(userInfo)\n }, [userInfo])\n useEffect(() => {\n // console.log('layout changed:', layout)\n chatStore.setLayout(layout, config?.receiverType)\n }, [layout, config?.receiverType])\n useEffect(() => {\n // console.log('params changed:', params)\n chatStore.setConfigParams(params)\n }, [params])\n useEffect(() => {\n // console.log('hooks changed:', hooks)\n chatStore.setHooks(hooks)\n }, [hooks])\n\n const receiverState = useSnapshot(chatStore.receiver)\n const configState = useSnapshot(chatStore.config)\n useImperativeHandle(\n ref,\n () => ({\n sendMessage: chatStore.sendMessage,\n switchAgentConversation: chatStore.switchAgentConversation,\n switchConversation: chatStore.switchConversation,\n createConversation: chatStore.createConversation,\n setReferences: chatStore.setReferences,\n setMessage: chatStore.setContent,\n setFiles: chatStore.setFileList\n }),\n []\n )\n const hasPreView = useMemo(() => {\n return (\n shouldRender(configState.layout.preview as ChatLayout['preview']) &&\n (!!(configState.preview.file as FileUrlType).fileUrl || !!(configState.preview.file as FileTextType).content)\n )\n }, [configState.layout.preview, configState.preview.file])\n\n // 计算Splitter的尺寸\n const [sizes, setSizes] = useState([0, '100%'])\n const setSplitterSizes = (sizes: (number | string)[]) => {\n setSizes(sizes)\n }\n useEffect(() => {\n if (hasPreView) {\n setSplitterSizes(['70%', '30%'])\n } else {\n setSplitterSizes([0, '100%'])\n }\n }, [hasPreView])\n // 会话Socket\n useWebSocket({\n url: getWebSocketUrl(`/api/lolr/conversation/ws/subscribe?NS-TOKEN=${getToken()}`, isLocalhost() ? '192.168.6.23' : ''),\n onMessage: chatStore.acceptMessage,\n clientHeartbeat: false,\n reconnectInterval: 10000\n })\n\n useEffect(() => {\n configState.hooks?.onBeforeInit?.()\n }, [])\n return (\n <XProvider theme={{ cssVar: true, ...theme }}>\n <ChatProvider store={chatStore}>\n <Spin spinning={receiverState.loading} wrapperClassName=\"full-spin\">\n <Flex vertical className={classNames(styles.nsChatLayout, 'height-full')}>\n {/** 对话区 - header */}\n <RenderWrapper control={configState.layout.globalHeader} DefaultComponent={ChatHeader} />\n <Flex className=\"full-scroll\">\n <RenderWrapper control={configState.layout.leftPanel} />\n\n <RenderWrapper control={configState.layout.conversationList} DefaultComponent={ConversationListPanel} />\n <Splitter className=\"flex-1\" onResize={setSplitterSizes}>\n <Splitter.Panel collapsible={false} min={600} size={sizes[0]}>\n {hasPreView && (\n <>\n {(configState.preview.file as FileUrlType).fileUrl && (\n <Flex vertical className=\"height-full\">\n <Flex justify=\"space-between\" align=\"center\" gap={16} className={styles.nsPreviewHeader}>\n <div className={styles.nsPreviewHeaderTitle}>{configState.preview.file.fileName}</div>\n <Flex gap={8} justify=\"center\" align=\"center\">\n <Button\n color=\"primary\"\n variant=\"outlined\"\n onClick={() => downloadFile((configState.preview.file as FileUrlType).fileUrl, configState.preview.file.fileName)}\n >\n 下载\n </Button>\n <Button onClick={() => chatStore.setPreview()}>关闭</Button>\n </Flex>\n </Flex>\n <div className=\"full-scroll\">\n <FilePreview\n {...(configState.preview.file as FileUrlType)}\n pdfParams={{\n isHasThumbnails: false\n }}\n />\n </div>\n </Flex>\n )}\n {(configState.preview.file as FileTextType).content && (\n <MarkdownEditor\n value={(configState.preview.file as FileTextType).content}\n // onChange={(con) => chatStore.setPreview({ ...configState.preview.file, content: con }, true)}\n onQuote={(text) => {\n chatStore.setReferences({\n type: 1,\n content: {\n name: text,\n markdown: text\n },\n params: {\n outline: text\n }\n })\n }}\n onDownloadFile={(content, type) => fileCreate(content, configState.preview.file.fileName, type)}\n extraNav={\n <>\n <Tag bordered={false} color=\"default\" className=\"cursor-pointer\" onClick={() => chatStore.setPreview()}>\n <CloseOutlined />\n </Tag>\n </>\n // loading && (\n // <Tag bordered={false} color=\"default\">\n // <Flex gap={4} align=\"center\">\n // <SyncOutlined spin style={{ color: LgPrimaryColor }} />\n // 保存中\n // </Flex>\n // </Tag>\n // )\n }\n />\n )}\n </>\n )}\n </Splitter.Panel>\n\n <Splitter.Panel collapsible={false} max={800} min={400} size={sizes[1]}>\n <Flex vertical className={classNames('height-full')}>\n {/** 对话区 - header */}\n <RenderWrapper control={configState.layout.chatHeader} DefaultComponent={ChatHeader} />\n <Flex vertical className={classNames('full-scroll')}>\n <Flex justify=\"center\" vertical gap={24} className={classNames('height-full p-t-8 p-b-8', chatStyles.nsBodyWidth)}>\n {shouldRender(configState.layout.messageList) && (\n <div className=\"full-scroll\">\n <RenderWrapper control={configState.layout.messageList as ChatLayout['messageList']} DefaultComponent={BubbleListItems} />\n </div>\n )}\n <Flex vertical gap={8}>\n <RenderWrapper\n control={configState.layout.senderHeader as ChatLayout['senderHeader']}\n DefaultComponent={<div className={styles.nsChatSenderHeader}>我是 {receiverState.active.name}</div>}\n />\n {/* 🌟 提示词 */}\n <RenderWrapper\n control={configState.layout.senderPrompts as ChatLayout['senderPrompts']}\n DefaultComponent={SenderPromptsItems}\n />\n {/* 🌟 输入框 */}\n <RenderWrapper control={configState.layout.sender} DefaultComponent={ChatSender} />\n <RenderWrapper\n control={configState.layout.disclaimerNotice as ChatLayout['disclaimerNotice']}\n DefaultComponent={<div className={styles.nsDisclaimerNotice}>内容由AI生成,仅供参考,请仔细甄别</div>}\n />\n </Flex>\n <RenderWrapper control={configState.layout.senderFooter} />\n </Flex>\n </Flex>\n </Flex>\n </Splitter.Panel>\n </Splitter>\n </Flex>\n </Flex>\n </Spin>\n </ChatProvider>\n </XProvider>\n )\n})\n","import { Conversation } from '@ant-design/x'\nimport { deepCopy, deepMerge, getCurrentUser, isObject, RenderControl, shouldRender, UserInfo } from '@zero-library/common'\nimport { message } from 'antd'\nimport { proxy } from 'valtio'\nimport { ConversationMemberEnum } from '../core/constants'\nimport { classifyTime, transform, transforms } from '../core/utils'\nimport {\n AgentCharacter,\n agentCharacterQuery,\n agentCharacterSelect,\n AgentConfig,\n AgentInfo,\n agentInfoQuery,\n ChatUserInfo,\n conversationCreate,\n conversationDelete,\n ConversationMember,\n conversationMemberQuery,\n ConversationMessage,\n conversationMessageSend,\n ConversationMessageSend,\n conversationMessagesQuery,\n conversationRecentQuery,\n ConversationsQuery,\n conversationsQuery,\n conversationStop,\n ConversationType,\n FeedbackUpdate,\n feedbackUpdate,\n InputFile,\n MessageQuoteMsg,\n messageSuggestedQuery\n} from '../services'\n\nexport type ConversationStrategy = 1 | 2 // 1-最近会话 2-新会话 默认2\nexport interface ReceiverInfo {\n /**\n * name,名称\n */\n name: string\n /**\n * Agenttype,智能体类型\n */\n type?: number\n /**\n * 智能体的附带信息\n */\n config?: AgentConfig\n /**\n * Description,描述\n */\n description?: string\n /**\n * Id,主键\n */\n id: string\n /**\n * Isavailable,是否可用\n */\n isAvailable?: boolean\n /**\n * Logo,logo\n */\n logo: string\n feature?: ObjectType<any>\n}\nexport type ConversationMemberObj = Partial<Record<ConversationMemberEnum, ConversationMember>>\nexport interface FileUrlType {\n suffix: string\n fileUrl: string\n fileName: string\n // messageId?: string\n}\nexport interface FileTextType {\n content: string\n suffix: string\n fileName: string\n // messageId?: string\n}\nexport interface ReferencesContent extends MessageQuoteMsg {\n name?: string\n markdown?: string\n [key: string]: any\n}\nexport interface ReferencesType {\n type: number // 1:markdown引用(拼正文发) 2: 文案引用(不发正文) 3:消息引用\n content: ReferencesContent\n params?: ObjectType<any>\n}\nexport interface MessageBoxType {\n content?: ConversationMessageSend['msgContent'] // 输入框内容\n files?: ConversationMessageSend['msgFiles'] // 上传文件内容\n headerOpen?: boolean\n loading: boolean\n message: ConversationMessage[]\n questionList?: string[] // 推荐问题\n references?: ReferencesType // 引用消息(可扩展quoteMsg)\n speakHuman?: boolean // false: ai(默认) true: 专家\n}\nexport type ChatStoreType = ReturnType<typeof createChatStore>\nexport interface ChatHooks {\n onBeforeInit?: () => void\n onAfterInit?: () => void\n onSenderFocus?: () => void\n onHeaderClose?: () => void\n onBeforeSend?: (message: ConversationMessageSend['msgContent'], files: InputFile[]) => boolean | Promise<boolean> | void\n onAfterSend?: () => void\n onBeforeSwitchAgent?: (agentId: string) => boolean | Promise<boolean> | void\n onAfterSwitchAgent?: (agentId: string) => void\n onBeforeSwitchConversation?: (conversationId: string) => boolean | Promise<boolean> | void\n onAfterSwitchConversation?: (conversationId: string) => void\n onBeforeInitMessages?: (conversationId: string) => boolean | Promise<boolean> | void\n onAfterInitMessages?: (messages: ConversationMessage[]) => void\n onBeforeDelConversation?: (conversationId: string) => boolean | Promise<boolean> | void\n onAfterDelConversation?: (conversationId: string, isCurrentConversation: boolean) => void\n // onMessageEvent?: (event) => void\n // onAfterLayout?: () => void\n // onError?: (error: unknown) => void\n}\nexport interface ChatParams {\n source?: number\n businessData?: string\n businessId?: string\n businessType?: number\n params?: ObjectType<any>\n}\n// 默认 title = true, closeBtn = false, newConversationBtn = true, conversationListBtn = true\nexport interface ChatLayoutHeader {\n title?: RenderControl<void, void>\n closeBtn?: boolean\n newConversationBtn?: RenderControl<void, void>\n agentCharacter?: boolean\n conversationListBtn?: boolean\n}\n// 默认 header = true\nexport interface ChatLayoutConversationList {\n header?: RenderControl<void, void>\n}\n// placeholder, extraBtn = false, referencesBtn = false\nexport interface ChatLayoutSender {\n placeholder?: string\n extraBtn?: RenderControl<void, void>\n referencesBtn?: RenderControl<void, void>\n}\nexport interface ChatLayoutMessageList {\n avatar?: boolean | Partial<Record<ConversationMemberEnum, boolean>>\n firstMessage?: RenderControl<void, void>\n}\nexport interface ChatLayout {\n leftPanel?: RenderControl<void, void>\n conversationList?: RenderControl<void, ChatLayoutConversationList>\n preview?: boolean // 是否允许预览\n messageList?: RenderControl<void, ChatLayoutMessageList>\n senderHeader?: RenderControl<void, void>\n sender?: RenderControl<void, ChatLayoutSender>\n senderPrompts?: boolean\n senderFooter?: RenderControl<void, void>\n globalHeader?: RenderControl<void, ChatLayoutHeader>\n chatHeader?: RenderControl<void, ChatLayoutHeader>\n disclaimerNotice?: RenderControl<void, void>\n}\nconst defaultAgentLayout = {\n leftPanel: false,\n conversationList: true,\n preview: true,\n messageList: true,\n firstMessage: false,\n senderHeader: false,\n sender: true,\n senderPrompts: true,\n senderFooter: false,\n globalHeader: false,\n chatHeader: true,\n disclaimerNotice: true\n} as ChatLayout\nconst defaultExpertLayout = {\n leftPanel: false,\n conversationList: false,\n preview: false,\n messageList: true,\n firstMessage: false,\n senderHeader: false,\n sender: true,\n senderPrompts: false,\n senderFooter: false,\n globalHeader: false,\n chatHeader: {\n props: {\n title: true,\n closeBtn: false,\n newConversationBtn: false,\n agentCharacter: false,\n conversationListBtn: false\n }\n },\n disclaimerNotice: false\n} as ChatLayout\nexport function createChatStore() {\n const config = proxy({\n hooks: {} as ChatHooks,\n layout: {} as ChatLayout,\n preview: {\n file: {} as FileUrlType | FileTextType,\n isEdit: false // 未使用\n // isShow: 0, // 0 不显示 1 显示 2 用户关闭\n // isIntact: false // true 完整 false 不完整\n },\n userInfo: {} as ChatUserInfo,\n params: {} as ChatParams\n })\n\n const setPreview = (file = {} as FileUrlType | FileTextType, isEdit = false) => {\n if (shouldRender(config.layout.preview)) {\n config.preview = {\n file,\n isEdit\n }\n } else {\n if ((file as FileUrlType)?.fileUrl) {\n window.open((file as FileUrlType).fileUrl, '_blank')\n } else {\n console.log('当前环境不支持预览')\n }\n }\n }\n const setLayout = (layout: ChatLayout, receiverType: number = 3) => {\n const defaultLayout = receiverType === 3 ? defaultAgentLayout : defaultExpertLayout\n config.layout = deepMerge(defaultLayout, layout)\n }\n const setConfigParams = (params = {} as ChatParams) => {\n config.params = { ...params }\n }\n const setHooks = (hooks = {} as ChatHooks) => {\n config.hooks = hooks\n }\n const setUserInfo = (userInfo?: UserInfo) => {\n config.userInfo = transform(userInfo || getCurrentUser(), {\n id: (userInfo) => {\n return String(userInfo['id'])\n },\n name: 'name',\n iconUrl: 'avatar',\n description: 'name'\n })\n }\n const receiver = proxy({\n active: {} as ReceiverInfo,\n loading: false,\n params: {} as ObjectType<any> // 透传参数,后期可能扩展不透传参数\n })\n\n const setReceiverParams = (params?: ObjectType<any>) => {\n if (isObject(params)) {\n Object.assign(receiver.params, params)\n } else {\n receiver.params = {}\n }\n }\n // 智能体切换\n const switchAgent = async (agentId: AgentInfo['id']) => {\n // 切换智能体\n if (receiver.active.id === agentId) return\n\n const canProceed = await config.hooks?.onBeforeSwitchAgent?.(agentId)\n if (canProceed === false) return\n\n try {\n receiver.loading = true\n const { data } = await agentInfoQuery(agentId)\n receiver.active = transform<AgentInfo, ReceiverInfo>(data, {\n name: 'agentName',\n logo: 'logo',\n description: 'description',\n id: 'id',\n config: 'config',\n isAvailable: 'isAvailable',\n feature: (agentInfo) => {\n if (agentInfo.feature) {\n try {\n return JSON.parse(agentInfo.feature)\n } catch (e) {}\n }\n return {}\n }\n })\n receiver.active.type = 3\n setReceiverParams()\n\n // 需要根据配置选择是否存在\n if (receiver.active.feature?.deepThink) {\n setReceiverParams({ thinkMode: '2' })\n }\n config.hooks?.onAfterSwitchAgent?.(agentId)\n } finally {\n receiver.loading = false\n }\n }\n // 目前只是为了对照智能体\n const switchExpert = (expert: ConversationMember) => {\n if (receiver.active.id === expert.memberId) return\n receiver.active = transform<ConversationMember, ReceiverInfo>(expert, {\n name: 'memberName',\n logo: 'memberAvatar',\n id: 'memberId'\n })\n receiver.active.type = 2\n setReceiverParams()\n }\n\n // 智能体性格\n const character = proxy({\n list: [] as AgentCharacter[],\n active: {} as AgentCharacter,\n open: false,\n loading: false,\n switchLoading: false\n })\n\n const getCharacters = async (agentId: AgentInfo['id']) => {\n try {\n character.loading = true\n const res = await agentCharacterQuery(agentId)\n if (receiver.active.id !== agentId) return\n character.list = res.data!\n character.active = res.data.find((item) => item.selected)\n } finally {\n character.loading = false\n }\n }\n const openCharacterList = () => {\n character.open = true\n }\n const closeCharacterList = () => {\n character.open = false\n }\n const switchCharacter = async (c: AgentCharacter) => {\n if (!c.id) return\n try {\n character.switchLoading = true\n await agentCharacterSelect(receiver.active.id, c.id)\n character.active = { ...c }\n closeCharacterList()\n } finally {\n character.switchLoading = false\n }\n }\n\n // 历史会话管理\n const conversations = proxy({\n list: {\n items: [] as Conversation[],\n params: {\n pageNum: 1,\n pageSize: 1000\n }\n },\n updateIndex: 0, // 当前会话索引, 创建会话时更新,促使页面更新会话列表\n loading: false,\n delLoading: false\n })\n\n const getConversations = async (targetId: ConversationsQuery['targetId'], targetType: ConversationsQuery['targetType']) => {\n try {\n conversations.loading = true\n const { data } = await conversationsQuery({\n targetId,\n targetType,\n businessId: config.params.businessId,\n businessType: config.params.businessType,\n ...conversations.list.params\n })\n // 防止会话接口请求前就已经切换了会话\n if (receiver.active.id !== targetId) return\n const items = transforms<ConversationType, Conversation>(data?.items || [], {\n key: 'id',\n id: 'id',\n label: 'title',\n group: (c): string => {\n return classifyTime(c.updateTime)\n },\n timestamp: 'updateTime'\n })\n conversations.list.items = items\n } finally {\n conversations.loading = false\n }\n }\n const delConversation = async (conversationId: ConversationType['id']) => {\n try {\n const canProceed = await config.hooks?.onBeforeDelConversation?.(conversationId)\n if (canProceed === false) return\n conversations.delLoading = true\n await conversationDelete(conversationId)\n message.success('删除成功')\n conversations.list.items = conversations.list.items.filter((item) => item.key !== conversationId)\n delete conversation.messages[conversationId]\n if (conversation.active.id === conversationId) {\n createConversation()\n }\n config.hooks?.onAfterDelConversation?.(conversationId, conversation.active.id === conversationId)\n } finally {\n conversations.delLoading = false\n }\n }\n // 会话管理\n const conversation = proxy({\n // 每个会话单独存储\n active: {\n id: '',\n member: {} as ConversationMemberObj\n },\n messages: {} as { [key: ConversationType['id']]: MessageBoxType },\n feedback: {\n // open: false,\n loading: false\n // recordId: '',\n // target: undefined as number | undefined\n }\n })\n const setSpeakHuman = (speakHuman: boolean) => {\n conversation.messages[conversation.active.id].speakHuman = speakHuman\n }\n const setReferences = (references?: ReferencesType) => {\n conversation.messages[conversation.active.id].references = references\n }\n const setContent = (content?: ConversationMessageSend['msgContent']) => {\n conversation.messages[conversation.active.id].content = content\n }\n const setFileList = (files = [] as ConversationMessageSend['msgFiles']) => {\n conversation.messages[conversation.active.id].files = files\n }\n const setHeaderOpen = (headerOpen: MessageBoxType['headerOpen']) => {\n conversation.messages[conversation.active.id].headerOpen = headerOpen\n }\n const removeQuestionList = (conversationId: ConversationType['id']) => {\n if (conversation.messages[conversationId].questionList?.length) {\n conversation.messages[conversationId].questionList = []\n }\n }\n const getQuestionList = async (conversationId: ConversationType['id'], messageId: ConversationMessage['id']) => {\n const messages = conversation.messages[conversationId]?.message\n if (!messages?.length) return\n let lastMessage = messages[messages.length - 1]\n if (!lastMessage || lastMessage.sender.type !== 3 || lastMessage.id !== messageId) return\n const { data } = await messageSuggestedQuery(messageId)\n lastMessage = messages[messages.length - 1]\n if (lastMessage.id !== messageId) return\n\n conversation.messages[conversationId].questionList = data!\n }\n // const closeFeedback = async () => {\n // conversation.feedback.open = false\n // }\n\n const feedback = async (\n conversationId: FeedbackUpdate['conversationId'],\n messageId: FeedbackUpdate['id'],\n msgFeedback: FeedbackUpdate['msgFeedback'],\n index: number\n ) => {\n try {\n conversation.feedback.loading = true\n await feedbackUpdate({ conversationId, id: messageId, msgFeedback })\n message.success('感谢您的反馈')\n // closeFeedback()\n conversation.messages[conversationId].message[index].msgFeedback = msgFeedback\n } finally {\n conversation.feedback.loading = false\n }\n }\n\n const setInitMessage = async (conversationId: ConversationType['id']) => {\n conversation.messages[conversationId] = {\n content: '',\n files: [] as ConversationMessageSend['msgFiles'], // 上传文件内容\n headerOpen: false,\n loading: false,\n message: [],\n questionList: [] // 推荐问题\n }\n }\n // 如果前端不存在会话ID,目前只有智能体在用\n const resolveConversationId = async (receiverId: AgentInfo['id'], strategy: ConversationStrategy = 2) => {\n if (strategy === 1) {\n const { data } = await conversationRecentQuery({\n receiverId,\n receiverType: 3,\n businessId: config.params.businessId,\n businessType: config.params.businessType\n })\n return data\n } else {\n const { data } = await conversationCreate({\n receiverId,\n receiverType: 3,\n businessId: config.params.businessId,\n businessType: config.params.businessType,\n businessData: config.params.businessData,\n source: config.params.source,\n type: 1\n })\n conversations.updateIndex = conversations.updateIndex + 1\n return data\n }\n }\n\n const initConversation = async (conversationId: Conversation['id']) => {\n try {\n const { data } = await conversationMemberQuery(conversationId)\n conversation.active = { id: conversationId, member: {} }\n data.forEach((member) => {\n if (member.memberType === 3) {\n conversation.active.member.agent = member\n } else {\n if (member.memberId === config.userInfo.id) {\n conversation.active.member.user = member\n } else {\n conversation.active.member.other = member\n }\n }\n })\n } finally {\n }\n }\n const switchAgentConversation = async (id: AgentInfo['id'], strategy?: ConversationStrategy) => {\n const agentId = String(id)\n await switchAgent(agentId)\n const conversationId = await resolveConversationId(agentId, strategy)\n if (conversationId) {\n switchConversation(conversationId)\n }\n }\n const createConversation = async () => {\n if (!receiver.active.id) return\n const conversationId = await resolveConversationId(receiver.active.id)\n if (conversationId) {\n switchConversation(conversationId)\n }\n }\n // 切换会话\n const switchConversation = async (id: Conversation['id']) => {\n const conversationId = String(id)\n if (conversation.active.id === conversationId) return\n\n const canProceed = await config.hooks?.onBeforeSwitchConversation?.(conversationId)\n if (canProceed === false) return\n // 初始化会话\n await initConversation(conversationId)\n // 关闭文件预览\n setPreview()\n config.hooks?.onAfterSwitchConversation?.(conversationId)\n\n // 获取消息列表\n getMessages(conversationId)\n // 初始化接收者\n if (conversation.active.member.agent) {\n switchAgent(conversation.active.member.agent.memberId)\n } else if (conversation.active.member.other) {\n switchExpert(conversation.active.member.other)\n }\n }\n const getMessages = async (conversationId: ConversationType['id']) => {\n const canProceed = await config.hooks?.onBeforeInitMessages?.(conversationId)\n if (canProceed === false) return\n // 初始化消息列表\n if (!conversation.messages[conversationId]) {\n setInitMessage(conversationId)\n }\n if (conversation.messages[conversationId].message.length === 0) {\n try {\n // conversation.messages[key].messageLoading = true\n const { data } = await conversationMessagesQuery({\n pageNo: 1,\n pageSize: 1000,\n conversationId\n })\n conversation.messages[conversationId].message = data.items\n } finally {\n // conversation.messages[key].messageLoading = false\n }\n\n config.hooks?.onAfterInitMessages?.(conversation.messages[conversationId].message)\n config.hooks?.onAfterInit?.()\n }\n }\n\n const pickReceiver = () => {\n const { agent, other } = conversation.active.member\n if (conversation.messages[conversation.active.id].speakHuman && other) return other\n if (agent) return agent\n if (other) return other\n return undefined\n }\n const sendMessage = async (\n message?: ConversationMessageSend['msgContent'],\n files = [] as ConversationMessageSend['msgFiles'],\n params?: ObjectType<any>\n ) => {\n const conversationId = conversation.active.id\n if (conversation.messages[conversationId].loading) return\n let msgContent: ConversationMessageSend['msgContent'] = '',\n msgFiles: ConversationMessageSend['msgFiles'] | undefined\n const references = conversation.messages[conversationId].references\n if (message) {\n msgContent = message\n msgFiles = files\n } else {\n if (references?.type === 1 && references?.content?.markdown) {\n msgContent = references.content.markdown + '\\n'\n }\n msgContent = msgContent + conversation.messages[conversationId].content!\n msgFiles = conversation.messages[conversationId].files\n }\n if (!msgContent) return\n\n const canProceed = await config.hooks?.onBeforeSend?.(msgContent, msgFiles)\n if (canProceed === false) return\n\n conversation.messages[conversationId].loading = true\n const sendReceiver = pickReceiver()\n const sendParams = {\n conversationId,\n msgContent,\n msgFiles,\n // quoteMsgId\n receiverId: sendReceiver.memberId,\n receiverType: sendReceiver.memberType,\n returnType: 2,\n senderId: conversation.active.member.user.memberId,\n senderType: conversation.active.member.user.memberType,\n source: config.params.source,\n stream: true\n } as ConversationMessageSend\n // 参数合并\n const extraParams = deepCopy(config.params.params || {}) as ChatParams\n Object.assign(extraParams, receiver.params, message ? {} : references?.params, params)\n sendParams.params = JSON.stringify(extraParams)\n\n if (!message) {\n setContent('')\n setFileList([])\n setReferences()\n setHeaderOpen(false)\n }\n try {\n await conversationMessageSend(sendParams)\n\n config.hooks?.onAfterSend?.()\n } finally {\n conversation.messages[conversationId].loading = false\n }\n }\n const cancelReceive = async () => {\n console.log('取消接收')\n // TODO 取消接收\n await conversationStop(conversation.active.id)\n }\n const updateConversationTitle = (conversationId: ConversationType['id'], title: ConversationType['title']) => {\n const idx = conversations.list.items.findIndex((item) => item.id === conversationId)\n if (idx === -1) return\n conversations.list.items[idx].title = title\n }\n\n const findMsgIndex = (conversationId: string, msgId: string) => {\n const messages = conversation.messages[conversationId]?.message || []\n return messages.findLastIndex((item) => item.id === msgId)\n }\n const startCallback = (msg: ConversationMessage) => {\n if (msg.conversationTitle && conversations.list.items.length) {\n updateConversationTitle(msg.conversationId, msg.conversationTitle)\n }\n removeQuestionList(msg.conversationId)\n const messages = conversation.messages[msg.conversationId].message\n messages.push(msg.sender.type === 3 ? { ...msg, msgContent: '正在努力思考中' } : msg)\n conversation.messages[msg.conversationId].loading = true\n }\n\n const stepCallback = (msg: ConversationMessage) => {\n const messages = conversation.messages[msg.conversationId].message\n const idx = findMsgIndex(msg.conversationId, msg.id)\n if (idx === -1) return\n messages[idx] = msg\n conversation.messages[msg.conversationId].loading = true\n }\n\n const contentCallback = (msg: ConversationMessage) => {\n const messages = conversation.messages[msg.conversationId].message\n const idx = findMsgIndex(msg.conversationId, msg.id)\n if (idx === -1) return\n const message = messages[idx]\n conversation.messages[msg.conversationId].loading = true\n if (message?.type === 'STEP_STARTED' || message?.type === 'TEXT_MESSAGE_START') {\n messages[idx] = msg\n return\n }\n messages[idx] = {\n ...message,\n msgContent: message.msgContent + (msg.msgContent || '')\n }\n }\n\n const endCallback = (msg: ConversationMessage) => {\n const messages = conversation.messages[msg.conversationId].message\n const idx = findMsgIndex(msg.conversationId, msg.id)\n if (idx === -1) return\n messages[idx] = { ...messages[idx], type: undefined }\n conversation.messages[msg.conversationId].loading = false\n getQuestionList(msg.conversationId, msg.id)\n }\n // 接收消息\n const acceptMessage = (newMessage: R<ConversationMessage>) => {\n const conversationId = newMessage.data.conversationId\n if (!conversation.messages[conversationId]?.message) return\n switch (newMessage.data.type) {\n case 'TEXT_MESSAGE_START':\n startCallback(newMessage.data)\n break\n case 'STEP_STARTED':\n stepCallback(newMessage.data)\n break\n case 'TEXT_MESSAGE_CONTENT':\n contentCallback(newMessage.data)\n break\n case 'TEXT_MESSAGE_END':\n endCallback(newMessage.data)\n break\n default:\n break\n }\n }\n\n return {\n config,\n setPreview,\n setLayout,\n setHooks,\n setConfigParams,\n setUserInfo,\n character,\n getCharacters,\n openCharacterList,\n closeCharacterList,\n switchCharacter,\n receiver,\n setReceiverParams,\n conversations,\n getConversations,\n delConversation,\n conversation,\n setSpeakHuman,\n setReferences,\n setContent,\n setFileList,\n setHeaderOpen,\n feedback,\n switchAgentConversation,\n createConversation,\n switchConversation,\n sendMessage,\n cancelReceive,\n acceptMessage\n }\n}\n","import { request } from '@zero-library/common'\n\nexport interface ChatUserInfo {\n id: string\n iconUrl: string\n name: string\n description: string\n}\n\nexport interface ConversationsQuery extends PageReq {\n businessId?: string\n businessType?: number\n targetId: string\n targetType: number\n}\n/**\n * 会话成员返回模型\n */\nexport interface ConversationMember {\n /**\n * Conversationid,会话ID\n */\n conversationId: string\n /**\n * Id,会话成员表ID\n */\n id: string\n /**\n * Jointime,加入时间\n */\n joinTime: Date\n /**\n * Memberavatar,成员头像\n */\n memberAvatar: string\n /**\n * Memberid,成员ID\n */\n memberId: string\n /**\n * Membername,成员名称\n */\n memberName: string\n /**\n * Membertype,成员类型\n */\n memberType: number\n /**\n * Orgid,机构ID\n */\n orgId: number\n /**\n * Orgname,机构名称\n */\n orgName: string\n}\nexport interface ConversationType {\n /**\n * Agentid,智能体 ID\n */\n agentId: string\n /**\n * Agentname,智能体名称\n */\n agentName: string\n /**\n * Id,会话 ID\n */\n id: string\n /**\n * Logourl,头像路径\n */\n logoUrl: string\n /**\n * Members,会话成员\n */\n members?: ConversationMember[]\n /**\n * Selected,当前选择的会话\n */\n selected: boolean\n /**\n * State,会话状态 1-正常 2-结束\n */\n state: number\n /**\n * Title,会话标题\n */\n title: string\n /**\n * Unreadcount,当前用户未读消息数\n */\n unreadCount: number\n /**\n * Updatetime,更新时间\n */\n updateTime: number\n}\n/**\n * 会话列表查询\n */\nexport const conversationsQuery = (params: ConversationsQuery): Promise<R<PageRes<ConversationType>>> => {\n return request.get('/lolr/conversation', params)\n}\nexport interface ConversationCreate {\n /**\n * Businessdata,业务扩展参数,非必填\n */\n businessData?: string\n /**\n * Businessid,业务数据唯一ID,非必填\n */\n businessId?: string\n /**\n * Businesstype,业务类型,非必填。1-风控;2-弹窗\n */\n businessType?: number\n /**\n * Receiverid,接收者ID\n */\n receiverId: string\n /**\n * Receivertype,接收者类型:1-用户 2-专家 3-Agent 4-税协\n */\n receiverType: number\n /**\n * Source,会话来源: 1-罗拉-APP; 2-罗拉-pc端; 3-合作伙伴端 4-税协 5-罗拉-cube 6-api\n */\n source: number\n /**\n * Type,会话类型: 1-对话; 2-工具\n */\n type: number\n}\n\n/**\n * 创建会话\n */\nexport const conversationCreate = (params: ConversationCreate): Promise<R<string>> => {\n return request.post('/lolr/conversation', params)\n}\n/**\n * 删除会话\n */\nexport const conversationDelete = (conversationId: string): Promise<R<null>> => {\n return request.delete('/agent/conversation', { conversationId })\n}\n/**\n * 更新最近一次会话\n */\nexport interface ConversationRecentUpdate extends ConversationRecentQuery {\n /**\n * Conversationid,会话ID\n */\n conversationId: string\n}\nexport const conversationRecentUpdate = (params: ConversationRecentUpdate): Promise<R<boolean>> => {\n return request.put('/lolr/conversation/recent', params)\n}\n/**\n * 获取最近一次会话\n */\nexport interface ConversationRecentQuery {\n /**\n * Businessid,业务数据唯一ID,非必填\n */\n businessId?: string\n /**\n * Businesstype,业务类型,非必填。1-风控;2-弹窗\n */\n businessType?: number\n /**\n * Receiverid,接收者ID\n */\n receiverId: string\n /**\n * Receivertype,接收者类型:1-用户 2-专家 3-Agent 4-税协\n */\n receiverType: number\n}\nexport const conversationRecentQuery = (params: ConversationRecentQuery): Promise<R<string>> => {\n return request.get('/lolr/conversation/recent', params)\n}\nexport interface conversationMessagesQuery extends PageReq {\n conversationId: string\n}\nexport interface InputFile {\n /**\n * Content,文件内容\n */\n content: string\n /**\n * 文件模式 remote_url local_file\n */\n mode: string\n /**\n * Type,文件类型\n */\n type: string\n /**\n * 文件扩展名\n */\n extension: string\n /**\n * 文件名\n */\n name: string\n}\nexport interface MessageQuoteMsg {\n /**\n * Id,消息ID\n */\n id?: string\n /**\n * Msgcontent,消息内容\n */\n msgContent?: string\n /**\n * Msgfiles,附件文件列表\n */\n msgFiles?: InputFile\n}\n\nexport interface MessageSender {\n /**\n * Curruser,是否为当前用户\n */\n currUser?: boolean\n /**\n * Id,发送者ID\n */\n id: string\n /**\n * Type,1-用户 2-专家 3-Agent 4-税协\n */\n type: number\n}\nexport interface ConversationMessage {\n /**\n * Conversationid,会话ID\n */\n conversationId: string\n // websocket返回\n conversationTitle?: string\n type?: 'TEXT_MESSAGE_START' | 'STEP_STARTED' | 'TEXT_MESSAGE_CONTENT' | 'TEXT_MESSAGE_END'\n /**\n * Id,消息ID\n */\n id: string\n /**\n * Msgcontent,消息内容\n */\n msgContent: string\n /**\n * Msgfeedback,消息反馈\n */\n msgFeedback?: number\n /**\n * Msgfiles,附件文件列表\n */\n msgFiles?: InputFile[]\n /**\n * 引消息\n */\n quoteMsg?: MessageQuoteMsg\n /**\n * 发送者信息\n */\n sender?: MessageSender\n /**\n * Sendtime,发送时间\n */\n sendTime: number\n /**\n * Stopflag,是否打断\n */\n stopFlag?: boolean\n}\nexport const conversationMessagesQuery = (params: conversationMessagesQuery): Promise<R<PageRes<ConversationMessage>>> => {\n return request.get('/lolr/conversation/message', params)\n}\n/**\n * 标记消息已读\n */\nexport const conversationMessageRead = (conversationId: ConversationType['id']): Promise<R<boolean>> => {\n return request.put('/lolr/conversation/message/read', { conversationId })\n}\nexport interface FeedbackUpdate {\n /**\n * Conversationid,会话ID\n */\n conversationId: string\n /**\n * Id,消息ID\n */\n id: string\n /**\n * Msgfeedback,反馈类型:1-赞,2-踩\n */\n msgFeedback: number\n /**\n * Msgfeedbackcontent,消息反馈内容\n */\n msgFeedbackContent?: string\n}\n/**\n * 更新消息反馈 赞或者踩\n */\nexport const feedbackUpdate = (params: FeedbackUpdate): Promise<R<null>> => {\n return request.put('/lolr/conversation/message/feedback', params)\n}\n/**\n * 获取消息推荐问题\n */\nexport const messageSuggestedQuery = (msgId: ConversationMessage['id'], maxCount = 3): Promise<R<string[]>> => {\n return request.get('/lolr/conversation/suggest', { msgId, maxCount })\n}\n\n/**\n * 获取会话成员\n */\nexport const conversationMemberQuery = (conversationId: ConversationType['id']): Promise<R<ConversationMember[]>> => {\n return request.get('/lolr/conversation/member', { conversationId })\n}\n/**\n * 更新会话状态\n */\nexport const conversationStateUpdate = (conversationId: ConversationType['id'], state: ConversationType['state']): Promise<R<boolean>> => {\n return request.put('/lolr/conversation/state', { conversationId, state })\n}\n\nexport interface ConversationMessageSend {\n /**\n * Conversationid,会话 ID\n */\n conversationId: string\n /**\n * Msgcontent,消息内容\n */\n msgContent: string\n /**\n * Msgfiles,附件文件列表\n */\n msgFiles?: InputFile[]\n /**\n * Params,业务参数,透传到智能体\n */\n params?: string\n /**\n * Quotemsgid,引用的消息 ID,大于 0 的整数\n */\n quoteMsgId?: number\n /**\n * Receiverid,接收者 ID。当 receiverType ≠ 3(非 agent)时,后端需填充此字段\n */\n receiverId: string\n /**\n * Receivertype,接收者身份,必填:1-用户;2-专家;3-agent 4-税协\n */\n receiverType: number\n /**\n * Returntype,返回方式:1-http;2-ws(WebSocket)\n */\n returnType: number\n /**\n * Senderid,发送者 ID\n */\n senderId: string\n /**\n * Sendertype,发送者身份,必填:1-用户;2-专家;3-agent 4-税协\n */\n senderType: number\n /**\n * Source,会话来源: 1-罗拉-APP; 2-罗拉-pc端; 3-合作伙伴端 4-税协 5-罗拉-cube 6-api\n */\n source: number\n /**\n * Stream,是否启用流式返回响应结果\n */\n stream: boolean\n}\n/**\n * 发送消息\n */\nexport const conversationMessageSend = (params: ConversationMessageSend): Promise<R<void>> => {\n return request.post('/lolr/conversation/send', params)\n}\n\n/**\n * 打断流式输出\n */\nexport const conversationStop = (conversationId: ConversationType['id']): Promise<R<void>> => {\n return request.post('/lolr/conversation/stop', { conversationId })\n}\n/**\n * FileUploadConfig,文件上传配置\n */\nexport interface FileUploadConfig {\n /**\n * Allowedfiletypes,允许的文件类型\n */\n allowedFileTypes: string[]\n /**\n * Enabled,是否启用文件上传\n */\n enabled: boolean\n /**\n * Maxfilecount,最大文件数量\n */\n maxFileCount: number\n /**\n * Maxfilesize,最大文件大小\n */\n maxFileSize?: number\n}\n\n/**\n * QuestionBO,推荐问题或热门问题项\n */\nexport interface RecommendQuestion {\n /**\n * Id,问题 ID\n */\n id: number\n /**\n * Question,问题内容\n */\n question: string\n}\n/**\n * LabelBO,热门问题标签\n */\nexport interface HotQuestionList {\n /**\n * Id,标签 ID\n */\n id: number\n /**\n * Items,标签下的问题列表\n */\n items: RecommendQuestion[]\n /**\n * Name,标签名称\n */\n name: string\n}\n\nexport interface AgentConfig {\n /**\n * 文件上传配置\n */\n fileUpload?: FileUploadConfig[]\n /**\n * Labels,热门问题标签列表\n */\n labels?: HotQuestionList[]\n /**\n * Recommendquestions,推荐问题列表\n */\n recommendQuestions?: RecommendQuestion[]\n}\nexport interface AgentInfo {\n /**\n * Agentname,名称\n */\n agentName: string\n /**\n * Agenttype,智能体类型\n */\n agentType: number\n /**\n * 智能体的附带信息\n */\n config: AgentConfig\n /**\n * Description,描述\n */\n description?: string\n /**\n * Id,主键\n */\n id: string\n /**\n * Isavailable,是否可用\n */\n isAvailable?: boolean\n /**\n * Logo,logo\n */\n logo: string\n feature?: string // json字符串\n}\n/**\n * 获取智能体信息\n */\nexport const agentInfoQuery = (agentId: AgentInfo['id']): Promise<R<AgentInfo>> => {\n return request.get('/lolr/agent/detail', { agentId })\n}\n\nexport interface AgentCharacter {\n /**\n * Agentid,智能体ID\n */\n agentId: number\n /**\n * Charactername,性格名称\n */\n characterName: string\n /**\n * Detaillevel,详细程度:1-10\n */\n detailLevel: number\n /**\n * Humorlevel,幽默程度:1-10\n */\n humorLevel: number\n /**\n * Id,id\n */\n id: number\n /**\n * Logo,头像,存储图片路径\n */\n logo: string\n /**\n * Professionallevel,专业程度:1-10\n */\n professionalLevel: number\n /**\n * Selected,是否已选择\n */\n selected: boolean\n /**\n * Sex,性别:1-男,2-女\n */\n sex: number\n}\n/**\n * 获取智能体角色性格列表\n */\nexport const agentCharacterQuery = (agentId: AgentInfo['id']): Promise<R<AgentCharacter[]>> => {\n return request.get('/lolr/character', { agentId })\n}\n/**\n * 选择智能体角色\n */\nexport const agentCharacterSelect = (agentId: AgentInfo['id'], characterId: AgentCharacter['id']): Promise<R<null>> => {\n return request.post('/lolr/character/user', { agentId, characterId })\n}\n\n/**\n * 文件上传\n */\nexport const fileUpload = (formData: FormData): Promise<R<InputFile>> => {\n return request.post('/lolr/storage/upload', formData, { timeout: 5 * 60 * 1000 })\n}\n","export const customComponents = {\n appCard: () => import('./AppCard'),\n fileView: () => import('./FileView'),\n indexQuote: () => import('./IndexQuote'),\n mdEdit: () => import('./MdEdit'),\n fileEdit: () => import('./FileEdit'),\n quoteList: () => import('./QuoteList')\n}\n","import { Attachments, Bubble, BubbleProps } from '@ant-design/x'\nimport { RenderMarkdown } from '@zero-library/common'\nimport { Flex } from 'antd'\nimport { ConversationMessage } from '../services'\nimport { customComponents } from '../ui/common/markdownAlert'\n\ninterface Props {\n message: ConversationMessage\n placement: BubbleProps['placement']\n}\n\nexport default ({ message, placement }: Props) => {\n return (\n <Flex vertical>\n {message.msgContent && (\n <Bubble placement={placement} content={<RenderMarkdown content={message.msgContent} customComponents={customComponents} />} />\n )}\n {message.msgFiles?.map((file) => (\n <Bubble\n className=\"m-t-8\"\n key={file.content}\n variant=\"borderless\"\n placement={placement}\n content={\n <Attachments.FileCard\n key={file.content}\n item={{\n uid: file.content,\n name: file.name,\n url: file.content\n }}\n />\n }\n />\n ))}\n {/* {message.quoteMsg?.id && (\n <Bubble\n className={classNames(styles.chatQuoteMsg)}\n placement={placement}\n content={\n <Flex vertical gap={8}>\n {message.quoteMsg.quoteMsgContent && (\n <Flex>\n <span>【引用消息】:</span>\n <Flex flex={1} className=\"text-ellipsis-3\">\n {message.quoteMsg.quoteMsgContent}\n </Flex>\n </Flex>\n )}\n {message.quoteMsg?.msgImgList && message.quoteMsg.msgImgList.length > 0 && (\n <Flex>\n <span>【引用图片】:</span>\n <Flex gap={8} wrap flex={1}>\n {message.quoteMsg.msgImgList.map((url, index) => (\n <Attachments.FileCard\n key={index}\n item={{\n uid: url,\n url,\n name: getFileName(url)\n }}\n />\n ))}\n </Flex>\n </Flex>\n )}\n </Flex>\n }\n />\n )} */}\n </Flex>\n )\n}\n","export type ConversationMemberEnum = 'agent' | 'user' | 'other'\nexport const MEMBER_TYPE: ObjectType<ConversationMemberEnum> = {\n 1: 'user',\n 2: 'other',\n 3: 'agent'\n}\n","import { CopyOutlined, DislikeOutlined, LikeOutlined, OpenAIOutlined } from '@ant-design/icons'\nimport { Bubble, BubbleProps, Prompts, Welcome } from '@ant-design/x'\nimport { BubbleDataType } from '@ant-design/x/es/bubble/BubbleList'\nimport { isBoolean, RenderWrapper, shouldRender, UserAvatar } from '@zero-library/common'\nimport { Avatar, Button, Flex, GetRef, Space } from 'antd'\nimport classNames from 'classnames'\nimport { useEffect, useMemo, useRef } from 'react'\nimport { useSnapshot } from 'valtio'\nimport ChatMessageRender from '../../components/MessageRender'\nimport { ConversationMemberEnum, MEMBER_TYPE } from '../../core/constants'\nimport { copy } from '../../core/utils'\nimport { ConversationMessage } from '../../services'\nimport { ChatLayoutMessageList, MessageBoxType } from '../../stores'\nimport { useChatStore } from '../../stores/Context'\nimport MessageAIRender from './MessageAIRender'\nimport styles from './styles.module.less'\n\ninterface RoleContent {\n user: ConversationMemberEnum\n placement: BubbleProps['placement']\n avatar?: any\n}\n\n/* 🌟 消息列表 */\nexport default ({ firstMessage = false, avatar = { user: false, agent: true, other: true } }: ChatLayoutMessageList) => {\n const chatStore = useChatStore()\n\n const receiverState = useSnapshot(chatStore.receiver)\n const conversationState = useSnapshot(chatStore.conversation)\n\n const conversationRoles = useMemo(() => {\n const roles = {} as Record<ConversationMemberEnum, RoleContent>\n if (conversationState.active.member.user) {\n roles.user = {\n user: 'user',\n placement: 'end',\n avatar: (isBoolean(avatar) ? avatar : avatar?.user) ? (\n <UserAvatar\n size={30}\n avatarSrc={conversationState.active.member.user?.memberAvatar}\n userName={conversationState.active.member.user?.memberName}\n />\n ) : null\n }\n }\n if (conversationState.active.member.agent) {\n roles.agent = {\n user: 'agent',\n placement: 'start',\n avatar: (isBoolean(avatar) ? avatar : avatar?.agent)\n ? { src: conversationState.active.member.agent?.memberAvatar, icon: <OpenAIOutlined /> }\n : null\n }\n }\n if (conversationState.active.member.other) {\n roles.other = {\n user: 'other',\n placement: 'start',\n avatar: (isBoolean(avatar) ? avatar : avatar?.other)\n ? { src: conversationState.active.member.other?.memberAvatar, icon: <OpenAIOutlined /> }\n : null\n }\n }\n return roles\n }, [conversationState.active.member, avatar])\n // 当前会话参数\n const chatMessage = useMemo(\n () => conversationState.messages[conversationState.active.id] || ({} as MessageBoxType),\n [conversationState.messages[conversationState.active.id]]\n )\n const placeholderNode = useMemo(\n () => [\n {\n key: 'placeholder',\n content: (\n <Space direction=\"vertical\" size={16} className={styles.chatWelcomeWrap}>\n <Welcome\n className={classNames(styles.chatWelcome, 'p-t-32')}\n variant=\"borderless\"\n icon={<Avatar shape=\"square\" size={58} src={receiverState.active.logo} />}\n title={`你好,我是${receiverState.active.name || ''}`}\n description={<div dangerouslySetInnerHTML={{ __html: receiverState.active.description || '' }}></div>}\n />\n {receiverState.active.config?.recommendQuestions?.length > 0 && (\n <Prompts\n className=\"m-t-16\"\n wrap\n items={[\n {\n key: '1',\n label: '🤔 推荐问题:',\n children: receiverState.active.config.recommendQuestions.map(({ question }) => ({\n key: question,\n description: (\n <span onClick={() => chatStore.sendMessage(question)} className={classNames(styles.chatWelcomePrompts, 'text-ellipsis')}>\n {question}\n </span>\n )\n }))\n }\n ]}\n />\n )}\n </Space>\n ),\n variant: 'borderless'\n } as BubbleDataType\n ],\n [receiverState.active]\n )\n\n const questionList = useMemo(\n () =>\n chatMessage?.questionList?.length\n ? [\n {\n key: 'questionList',\n content: (\n <Prompts\n className=\"m-b-16\"\n styles={{\n list: {\n overflow: 'auto'\n }\n }}\n vertical\n items={chatMessage?.questionList.map((question) => ({\n key: question,\n description: <span onClick={() => chatStore.sendMessage(question)}>{question}</span>\n }))}\n />\n ),\n variant: 'borderless',\n avatar: { style: { visibility: 'hidden' } }\n } as BubbleDataType\n ]\n : [],\n [chatMessage?.questionList]\n )\n\n const chatRecords = useMemo(() => {\n return (chatMessage?.message || []).map((message, index) => {\n // let isHasTime = false\n // if (index === 0) {\n // isHasTime = true\n // } else {\n // const lastMessage = chatMessage.message[index - 1]\n // // if((lastMessage.sendDate - message.sendDate) > 60 * 60 * 1000)\n // }\n const role = conversationRoles[MEMBER_TYPE[message.sender.type]] || ({} as RoleContent)\n return {\n key: message.id,\n placement: role.placement,\n variant: 'borderless',\n avatar: role.avatar,\n content:\n role.user === 'agent' ? (\n <MessageAIRender message={message as ConversationMessage} placement={role.placement} />\n ) : (\n <ChatMessageRender message={message as ConversationMessage} placement={role.placement} />\n ),\n // loadingRender: () => <Spin size=\"small\" />,\n footer: role.user === 'agent' && (\n <Flex>\n <Button onClick={() => copy(message.msgContent)} color=\"default\" variant=\"text\" size=\"small\" icon={<CopyOutlined />} />\n <Button\n color={message.msgFeedback === 1 ? 'primary' : 'default'}\n disabled={!!message.type}\n size=\"small\"\n variant=\"text\"\n icon={<LikeOutlined />}\n onClick={() => chatStore.feedback(conversationState.active.id, message.id, 1, index)}\n />\n <Button\n color={message.msgFeedback === 2 ? 'primary' : 'default'}\n disabled={!!message.type}\n size=\"small\"\n variant=\"text\"\n icon={<DislikeOutlined />}\n onClick={() => chatStore.feedback(conversationState.active.id, message.id, 2, index)}\n />\n {/* <Button color=\"default\" variant=\"text\" size=\"large\" icon={<ShareAltOutlined />} /> */}\n {/* <Button color=\"default\" variant=\"text\" size=\"large\" icon={<ReloadOutlined />} /> */}\n </Flex>\n )\n // ...(isHasTime\n // ? { rootClassName: styles.hasSendTime, classNames: { header: styles.sendTime }, header: <span>{formatDate(message.sendDate)}</span> }\n // : {})\n } as BubbleDataType\n })\n }, [chatMessage?.message])\n\n const firstMessageRecord = useMemo(() => {\n const isExist = shouldRender(firstMessage)\n return isExist\n ? [\n {\n key: 'firstMessage',\n content: <RenderWrapper control={firstMessage} />,\n placement: 'end'\n // avatar: { style: { visibility: 'hidden' } }\n } as BubbleDataType\n ]\n : []\n }, [firstMessage])\n const bubbleListItems = useMemo(() => {\n const list = []\n if (firstMessageRecord.length > 0) {\n list.push(...firstMessageRecord)\n }\n if (chatRecords.length > 0) {\n list.push(...chatRecords, ...questionList)\n }\n if (list.length) {\n return list\n }\n return [...placeholderNode]\n }, [chatRecords, questionList, placeholderNode, firstMessageRecord])\n\n const listRef = useRef<GetRef<typeof Bubble.List>>(null)\n // 真实控制是否自动滚动的 ref(不会触发渲染)\n const autoScrollRef = useRef(true)\n const handleScroll = (el: any) => {\n const target = el.target\n // console.log('handleScroll', target.scrollHeight - target.scrollTop - target.clientHeight)\n const distanceToBottom = target.scrollHeight - target.scrollTop - target.clientHeight\n // 小于 100px 表示接近底部,允许自动滚动\n autoScrollRef.current = distanceToBottom < 100\n }\n useEffect(() => {\n // console.log('bubbleListItems2')\n autoScrollRef.current = true\n }, [bubbleListItems.length])\n useEffect(() => {\n const el = listRef.current?.nativeElement\n if (!el || !bubbleListItems.length) return\n // console.log('bubbleListItems', bubbleListItems, autoScrollRef.current)\n // 只有当用户在底部(autoScroll = true)时,才滚动到底\n if (autoScrollRef.current) {\n setTimeout(() => {\n if (autoScrollRef.current) {\n listRef.current?.scrollTo({\n key: bubbleListItems[bubbleListItems.length - 1].key,\n block: 'end'\n })\n }\n }, 100)\n }\n }, [bubbleListItems])\n return (\n <Bubble.List\n autoScroll={false}\n key={conversationState.active.id}\n ref={listRef}\n items={bubbleListItems}\n className={classNames(styles.nsBubbleList, 'height-full', 'scroll-fade-in')}\n onScroll={handleScroll}\n />\n )\n}\n",".loadingMessage {\n background-image: linear-gradient(90deg, #ff6b23 0%, #af3cb8 31%, #53b6ff 89%);\n background-size: 100% 2px;\n background-repeat: no-repeat;\n background-position: bottom;\n padding-bottom: 2px;\n}\n.conversationListPanel {\n width: 360px;\n}\n.nsConversations {\n padding: 0 24px;\n}\n.nsConversations :global .ant-conversations-group-title {\n padding: 0;\n}\n.nsConversations :global .ant-conversations-group-title .ant-typography {\n color: #878aab;\n}\n.nsConversations :global .ant-conversations-list .ant-conversations-item {\n padding-left: 16px;\n}\n.nsConversations :global .ant-conversations-list .ant-conversations-item .ant-conversations-label {\n color: rgba(0, 0, 0, 0.88);\n}\n.nsConversations :global .ant-conversations-list .ant-conversations-item.ant-conversations-item-active .ant-conversations-label {\n color: var(--ant-color-primary);\n}\n.nsBodyWidth {\n margin: 0 auto;\n max-width: 896px;\n min-width: 320px;\n width: calc(100% - 24px) !important;\n}\n.nsBubbleList:global.ant-bubble-list .ant-bubble.ant-bubble-start .ant-bubble-content-filled {\n background-color: transparent;\n}\n.nsBubbleList:global.ant-bubble-list .ant-bubble.ant-bubble-end .ant-bubble-content-filled {\n background-color: var(--ant-color-primary-bg);\n}\n.nsBubbleList:global.ant-bubble-list .ant-bubble .ant-bubble-content .ant-typography {\n font-size: 16px;\n}\n.nsBubbleList:global.ant-bubble-list .ant-bubble .ant-bubble-content > .ant-collapse {\n margin-bottom: 16px;\n}\n.nsBubbleList:global.ant-bubble-list .ant-bubble .ant-bubble-content > .ant-collapse .ant-collapse-header {\n color: #8f91a8;\n}\n.nsBubbleList:global.ant-bubble-list .ant-bubble .ant-bubble-content > .ant-collapse .ant-collapse-content {\n color: #8f91a8;\n margin-top: -10px;\n}\n.nsBubbleList:global.ant-bubble-list .ant-bubble .ant-bubble-content > .ant-collapse .ant-collapse-content .ant-collapse-content-box {\n padding: 0 10px 0 24px;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n.nsChatHeader {\n padding: 8px 16px;\n border-bottom: 1px solid #eee;\n}\n.nsChatHeader .nsChatTitle {\n font-size: 16px;\n font-weight: bold;\n}\n.nsChatHeader .nsChatHeaderPopover {\n max-height: 500px;\n width: 300px;\n display: flex;\n flex-direction: column;\n}\n.nsChatHeader .nsChatHeaderPopover :global .ant-popover-inner-content {\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n.chatWelcomeWrap :global .ant-prompts .ant-prompts-list {\n overflow: auto;\n}\n.chatWelcomeWrap .chatWelcome :global .ant-welcome-icon > img {\n border-radius: 10px;\n max-width: initial;\n}\n.chatWelcomeWrap .chatWelcomePrompts {\n width: 300px;\n}\n.senderListTitle {\n width: 300px;\n}\n.senderList :global .ant-list-items {\n max-height: 350px;\n overflow-y: auto;\n margin-right: -12px;\n padding-right: 12px;\n}\n.senderList.historyList :global .ant-list-items {\n max-height: initial;\n}\n.senderList .senderListItem {\n background-color: #f6f6f6;\n color: #6b6b6b !important;\n border-radius: 5px;\n width: 300px;\n padding: 6px 12px !important;\n margin-top: 12px;\n font-size: 14px;\n cursor: pointer;\n}\n.senderList .senderListFooter {\n font-size: 12px;\n}\n.nsChatUserName {\n font-size: 16px;\n font-weight: bold;\n}\n.nsSenderReferenceHeaderTitle:global > .ant-sender-header-title {\n overflow: hidden;\n}\n.nsSenderReferenceHeaderContent {\n padding: 0 !important;\n}\n.avatarListContainer {\n height: 300px;\n padding: 30px 48px 30px 24px;\n overflow-y: auto;\n margin-right: -24px;\n}\n.avatarListContainer .avatarList .avatarListItem:hover {\n opacity: 90%;\n}\n.avatarListContainer .avatarList .avatarListItem .avatarListItemIcon.avatarListItemIconActive {\n outline: 2px solid var(--ant-color-primary);\n}\n.avatarListContainer .avatarList .avatarListItem .avatarListItemName {\n font-size: 12px;\n}\n","import { Bubble, BubbleProps } from '@ant-design/x'\nimport { RenderMarkdown } from '@zero-library/common'\nimport { Collapse, Flex, Spin, Typography } from 'antd'\nimport classNames from 'classnames'\nimport { useMemo } from 'react'\nimport { ConversationMessage } from '../../services'\nimport { customComponents } from './markdownAlert'\nimport styles from './styles.module.less'\n\ninterface Props {\n message?: ConversationMessage\n placement: BubbleProps['placement']\n}\n\nfunction extractThinkContent(content: string): {\n mainContent: string\n thinkContents: string[]\n thinkBuffer: string\n} {\n let main = content\n const thinkContents: string[] = []\n let buffer = ''\n\n const regex = /<think>(.*?)<\\/think>/gs\n for (const match of content.matchAll(regex)) {\n const thinkText = match[1].trim()\n thinkContents.push(thinkText)\n main = main.replace(match[0], '')\n }\n\n const lastStart = content.lastIndexOf('<think>')\n const lastEnd = content.lastIndexOf('</think>')\n if (lastStart > lastEnd) {\n buffer = content.slice(lastStart).replace('<think>', '')\n main = main.slice(0, lastStart)\n }\n\n return { mainContent: main, thinkContents, thinkBuffer: buffer }\n}\n\nfunction renderMarkdownPanel(content: string, label: string, key: string) {\n return {\n key,\n label,\n children: <RenderMarkdown content={content} customComponents={customComponents} />\n }\n}\n\nexport default ({ message, placement }: Props) => {\n const { mainContent, thinkContents, thinkBuffer } = useMemo(() => {\n if (!message?.msgContent) return { mainContent: '', thinkContents: [], thinkBuffer: '' }\n return extractThinkContent(message.msgContent)\n }, [message?.msgContent])\n\n if (!message.msgContent) {\n return (\n <Typography>\n <Spin size={'small'} />\n </Typography>\n )\n }\n return (\n <Flex vertical>\n <Bubble\n placement={placement}\n className={classNames({ [styles.loadingMessage]: message.type && message.type !== 'TEXT_MESSAGE_END' })}\n content={\n <>\n {/* 渲染 think 内容,默认展开所有项 */}\n {thinkContents.length > 0 && (\n <Collapse\n ghost\n size=\"small\"\n defaultActiveKey={thinkContents.map((_, i) => `think-${i}`)}\n items={thinkContents.map((content, index) => renderMarkdownPanel(content, `思考过程`, `think-${index}`))}\n />\n )}\n\n {/* 渲染缓冲中的 think 内容 */}\n {thinkBuffer && (\n <Collapse\n ghost\n size=\"small\"\n defaultActiveKey={['buffer-think']}\n items={[renderMarkdownPanel(thinkBuffer, '仔细思考中...', 'buffer-think')]}\n />\n )}\n\n {/* 渲染主内容 */}\n {/* {mainContent && message.status === 'error' ? (\n <div>\n <CloseCircleOutlined color={'red'} /> {mainContent}\n </div>\n ) : ( */}\n <RenderMarkdown content={mainContent} customComponents={customComponents} />\n {/* )} */}\n </>\n }\n />\n </Flex>\n )\n}\n","import { CloseOutlined, CommentOutlined, PlusOutlined } from '@ant-design/icons'\nimport { RenderWrapper } from '@zero-library/common'\nimport { Avatar, Button, Flex, Popover, Space } from 'antd'\nimport { useSnapshot } from 'valtio'\nimport { ChatLayoutHeader } from '../../stores'\nimport { useChatStore } from '../../stores/Context'\nimport AgentCharacter from './AgentCharacter'\nimport ConversationList from './ConversationList'\nimport styles from './styles.module.less'\n\nexport default ({\n title = true,\n closeBtn = false,\n newConversationBtn = true,\n agentCharacter = true,\n conversationListBtn = true\n}: ChatLayoutHeader) => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n const configState = useSnapshot(chatStore.config)\n return (\n <>\n <Flex justify=\"space-between\" align=\"center\" className={styles.nsChatHeader}>\n <Flex gap={4} align=\"center\">\n <RenderWrapper\n control={title}\n DefaultComponent={\n <>\n <Avatar size={22} src={receiverState.active.logo} alt={receiverState.active.name} />\n <div className={styles.nsChatTitle}>{receiverState.active.name}</div>\n </>\n }\n />{' '}\n </Flex>\n <Space size={2}>\n <RenderWrapper control={agentCharacter} DefaultComponent={AgentCharacter} />\n <RenderWrapper\n control={newConversationBtn}\n DefaultComponent={\n <Button title=\"新建会话\" type=\"text\" size=\"large\" icon={<PlusOutlined />} onClick={() => chatStore.createConversation()} />\n }\n />\n\n <RenderWrapper\n control={conversationListBtn}\n DefaultComponent={\n <Popover\n getPopupContainer={(e) => e}\n placement=\"bottom\"\n classNames={{ body: styles.nsChatHeaderPopover }}\n content={<ConversationList />}\n trigger={['click']}\n >\n <Button title=\"历史会话\" type=\"text\" size=\"large\" icon={<CommentOutlined />} />\n </Popover>\n }\n />\n\n <RenderWrapper\n control={closeBtn}\n DefaultComponent={<Button title=\"关闭\" type=\"text\" size=\"large\" onClick={configState.hooks?.onHeaderClose} icon={<CloseOutlined />} />}\n />\n </Space>\n </Flex>\n </>\n )\n}\n","import { Avatar } from 'antd'\nimport { useEffect } from 'react'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport CharacterList from './CharacterList'\n\nexport default () => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n const characterState = useSnapshot(chatStore.character)\n useEffect(() => {\n if (receiverState.active.id && receiverState.active.type === 3) {\n chatStore.getCharacters(receiverState.active.id)\n }\n }, [receiverState.active.id])\n\n return (\n characterState.active.id && (\n <>\n <div title=\"性格\">\n <Avatar onClick={chatStore.openCharacterList} className=\"cursor-pointer\" src={characterState.active.logo} />\n </div>\n {characterState.open && <CharacterList />}\n </>\n )\n )\n}\n","import { Avatar, Col, Flex, Modal, Row } from 'antd'\nimport classNames from 'classnames'\nimport { useState } from 'react'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport styles from './styles.module.less'\n\nexport default () => {\n const chatStore = useChatStore()\n const characterState = useSnapshot(chatStore.character)\n const [activeCharacter, setActiveCharacter] = useState(characterState.active)\n return (\n <Modal\n width={500}\n title=\"选择性格\"\n maskClosable={false}\n open={characterState.open}\n onCancel={chatStore.closeCharacterList}\n loading={characterState.loading}\n okText=\"切换性格\"\n onOk={() => chatStore.switchCharacter(activeCharacter)}\n confirmLoading={characterState.switchLoading}\n >\n <div className={styles.avatarListContainer}>\n <Row wrap gutter={[16, 32]} className={styles.avatarList}>\n {characterState.list.map((item) => (\n <Col span={6} key={item.id}>\n <Flex vertical align=\"center\" className={styles.avatarListItem} onClick={() => setActiveCharacter(item)}>\n <Avatar\n className={classNames(styles.avatarListItemIcon, 'cursor-pointer', {\n [styles.avatarListItemIconActive]: activeCharacter.id === item.id\n })}\n size={50}\n // onClick={openCharacterList}\n src={<img src={item.logo} alt=\"头像\" />}\n />\n <div className={styles.avatarListItemName}>{item.characterName}</div>\n </Flex>\n </Col>\n ))}\n {/* <Col span={6}>\n <Flex vertical align=\"center\" className={styles.avatarListItem} onClick={() => onOpenUpdateCharacter(1)}>\n <PlusCircleFilled className={classNames(styles.avatarListItemIcon, 'cursor-pointer')} style={{ fontSize: 50, color: '#eee' }} />\n <div className={styles.avatarListItemName}>自定义</div>\n </Flex>\n </Col> */}\n </Row>\n </div>\n </Modal>\n )\n}\n","import { DeleteOutlined, RedoOutlined } from '@ant-design/icons'\nimport { Conversations } from '@ant-design/x'\nimport type { Conversation } from '@ant-design/x/es/conversations/interface'\nimport { useDebounce } from '@zero-library/common'\nimport { Empty, Spin } from 'antd'\nimport { useEffect, useMemo } from 'react'\nimport InfiniteScroll from 'react-infinite-scroll-component'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport styles from './styles.module.less'\n\nexport default () => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n const conversationsState = useSnapshot(chatStore.conversations)\n const conversationState = useSnapshot(chatStore.conversation)\n\n const getConversations = useDebounce(() => {\n chatStore.getConversations(receiverState.active.id, 3)\n }, 300)\n\n useEffect(() => {\n if (receiverState.active.id) {\n getConversations()\n }\n }, [receiverState.active.id, conversationsState.updateIndex])\n\n const conversationList = useMemo(() => {\n return conversationsState.list.items.filter((item) => item.label)\n }, [conversationsState.list.items])\n return (\n <>\n <div className=\"height-full scroll-fade-in\" id=\"scrollableDiv\">\n {conversationList.length ? (\n <InfiniteScroll\n dataLength={conversationList.length}\n next={() => {\n console.log('next')\n // chatStore.getConversations(receiverState.active.id, conversationsState.list.lastId)\n }}\n hasMore={false}\n loader={\n <div className=\"text-center\">\n <Spin indicator={<RedoOutlined spin />} size=\"small\" />\n </div>\n }\n style={{ overflow: 'hidden' }}\n scrollableTarget=\"scrollableDiv\" // 👈 指定滚动容器\n >\n <Conversations\n className={styles.nsConversations}\n items={conversationList as Conversation[]}\n activeKey={conversationState.active.id}\n onActiveChange={async (id) => chatStore.switchConversation(id)}\n groupable\n menu={(conversation) => ({\n items: [\n {\n label: '删除会话',\n key: 'delete',\n icon: <DeleteOutlined />,\n danger: true\n }\n ],\n onClick: (menuInfo) => {\n menuInfo.domEvent.stopPropagation()\n if (menuInfo.key === 'delete') {\n chatStore.delConversation(conversation.id)\n }\n }\n })}\n />\n </InfiniteScroll>\n ) : (\n <Empty description=\"暂无会话记录\" image={Empty.PRESENTED_IMAGE_SIMPLE} />\n )}\n </div>\n </>\n )\n}\n",".nsAttachments:global > .ant-attachment-list .ant-attachment-list-card-status-uploading .ant-progress .ant-progress-text {\n display: none;\n}\n.nsAttachments:global > .ant-attachment-list .ant-attachment-list-card-status-uploading .ant-progress .ant-progress-circle {\n animation: spin 2s linear infinite;\n}\n.nsAttachments:global > .ant-attachment-list .ant-attachment-list-card-status-uploading .ant-attachment-list-card-content {\n gap: 4px;\n}\n.nsAttachments:global > .ant-attachment-list .ant-attachment-list-card-status-uploading .ant-attachment-list-card-content .ant-attachment-list-card-desc {\n width: 15px;\n height: 15px;\n border: 2px solid transparent;\n border-color: #1890ff;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n box-sizing: border-box;\n position: relative;\n clip-path: inset(0 0 30% 0);\n}\n.nsAttachments:global > .ant-attachment-list .ant-attachment-list-card-status-uploading .ant-attachment-list-card-content .ant-attachment-list-card-desc .ant-attachment-list-card-ellipsis-prefix {\n display: none;\n}\n","import { CloudUploadOutlined } from '@ant-design/icons'\nimport { Attachments } from '@ant-design/x'\nimport { Attachment } from '@ant-design/x/es/attachments'\nimport { getFileSuffixName, isNullOrUnDef, isNumber, isObject, useDebounce, useRefState } from '@zero-library/common'\nimport { App } from 'antd'\nimport { RcFile, UploadFile } from 'antd/lib/upload'\nimport { forwardRef, useEffect, useImperativeHandle, useMemo, useRef } from 'react'\nimport { FileUploadConfig, InputFile, fileUpload } from '../services'\nimport styles from './styles.module.less'\ninterface Props {\n fileUploadConfig?: FileUploadConfig[]\n extraParams?: ObjectType<string | undefined>\n // fileSizeTip?: string\n fileList?: InputFile[]\n onChange: (fileList: InputFile[]) => void\n}\ntype AttachedFile = Attachment\n// {\n// extension: string\n// }\nexport default forwardRef(({ fileUploadConfig = [], fileList = [], onChange, extraParams }: Props, ref) => {\n const { message } = App.useApp()\n const fileListRef = useRef<InputFile[]>([])\n const [attachedFiles, setAttachedFiles, getAttachedFiles] = useRefState<AttachedFile[]>([])\n // 初始化 fileList 映射为 Attachments 所需格式\n useEffect(() => {\n if (JSON.stringify(fileList) !== JSON.stringify(fileListRef.current)) {\n fileListRef.current = fileList\n const mapped: AttachedFile[] = fileList.map((file) => ({\n ...file,\n uid: file.content,\n url: file.content,\n status: 'done'\n }))\n setAttachedFiles(mapped)\n }\n }, [fileList])\n useEffect(() => {\n // console.log('attachedFiles', attachedFiles)\n const files = attachedFiles\n .filter((file) => file.status === 'done')\n .map((file) => {\n const f = { ...file }\n delete f.status\n delete f.uid\n delete f.size\n delete f.url\n return f as unknown as InputFile\n })\n fileListRef.current = files\n onChange(files)\n }, [attachedFiles])\n const onErrorTip = useDebounce((errorMsg: string) => {\n message.error(errorMsg)\n }, 300)\n /** 根据文件类型找到对应的 upload config */\n const findConfigByFile = (file: RcFile): FileUploadConfig | undefined => {\n return fileUploadConfig.find((cfg) => cfg.allowedFileTypes?.includes(getFileSuffixName(file.name).toLocaleUpperCase()))\n }\n\n const onBeforeUpload = (files: RcFile[]) => {\n // console.log('onBeforeUpload', maxFileCount, files, attachedFiles)\n // 多规则支持:逐个文件校验\n for (const file of files) {\n const cfg = findConfigByFile(file)\n\n if (!cfg) {\n onErrorTip(`不支持的文件类型:${file.name} (${file.type})`)\n return Promise.reject(false)\n }\n\n // 校验数量\n if (isNumber(cfg.maxFileCount)) {\n const currentCount = attachedFiles.filter((f) => cfg.allowedFileTypes.includes(getFileSuffixName(f.name || '').toLocaleUpperCase())).length\n\n if (currentCount + 1 > cfg.maxFileCount) {\n onErrorTip(`【${file.name}】所属类型最多只能上传 ${cfg.maxFileCount} 个文件`)\n return Promise.reject(false)\n }\n }\n }\n }\n const onCustomRequest = async ({ file }: any) => {\n // console.log('onCustomRequest', file)\n const cfg = findConfigByFile(file)\n\n if (!cfg) {\n onErrorTip(`不支持的文件类型:${file.name}`)\n return\n }\n\n // 校验大小\n if (cfg.maxFileSize && file.size > cfg.maxFileSize * 1024 * 1024) {\n onErrorTip(`文件大小不能超过 ${cfg.maxFileSize} MB`)\n return\n }\n // console.log('上传文件列表1:', file)\n setAttachedFiles([\n ...getAttachedFiles(),\n {\n uid: file.uid,\n status: 'uploading',\n percent: 70,\n size: file.size,\n type: file.type,\n name: file.name\n }\n ])\n try {\n const formData = new FormData()\n formData.append('file', file)\n if (isObject(extraParams)) {\n Object.keys(extraParams).forEach((key) => {\n if (isNullOrUnDef(extraParams[key])) return\n formData.append(key, extraParams[key])\n })\n }\n // 发送文件到后端\n const { data } = await fileUpload(formData)\n\n setAttachedFiles(\n getAttachedFiles().map((f) => {\n if (f.uid === file.uid) {\n return { ...data!, uid: data!.content, url: data.content, status: 'done', size: f.size }\n } else {\n return f\n }\n })\n )\n } catch (error) {\n console.log('上传文件错误:', error)\n setAttachedFiles(\n getAttachedFiles().map((f) => {\n if (f.uid === file.uid) {\n return { ...f, status: 'error', description: '上传失败' }\n } else {\n return f\n }\n })\n )\n }\n }\n const onRemove = (file: UploadFile<any>) => {\n // 删除文件\n setAttachedFiles(attachedFiles.filter((f) => f.uid !== file.uid))\n }\n useImperativeHandle(\n ref,\n () => ({\n validateFile: () => {\n const files = getAttachedFiles()\n const uploadingFiles = files.filter((file) => file.status === 'uploading')\n if (uploadingFiles.length > 0) {\n onErrorTip('请等待所有文件上传完成')\n return false\n }\n const errorFiles = files.filter((file) => file.status === 'error')\n if (errorFiles.length > 0) {\n onErrorTip('请检查上传失败的文件')\n return false\n }\n return true\n }\n }),\n []\n )\n\n const acceptStr = useMemo(() => {\n const allTypes = fileUploadConfig.flatMap((cfg) => cfg.allowedFileTypes || [])\n return allTypes.length ? allTypes.join(',') : undefined\n }, [fileUploadConfig])\n return (\n <Attachments\n className={styles.nsAttachments}\n accept={acceptStr}\n multiple={true}\n customRequest={onCustomRequest}\n beforeUpload={(file, files) => onBeforeUpload(files)}\n items={attachedFiles}\n onRemove={onRemove}\n placeholder={(type) =>\n type === 'drop'\n ? { title: '将文件放到这里' }\n : {\n icon: <CloudUploadOutlined />,\n title: '提交文件',\n description: (\n <div>\n <div>单击或拖动文件到此区域进行上传; </div>\n {/* {allowedFileTypes && <div>支持扩展名:{allowedFileTypes}; </div>} */}\n </div>\n )\n }\n }\n />\n )\n})\n","import { PaperClipOutlined } from '@ant-design/icons'\nimport { Sender, Suggestion } from '@ant-design/x'\nimport { useSyncInput } from '@zero-library/common'\nimport { Badge, Button, ButtonProps, Flex, GetRef } from 'antd'\nimport { forwardRef, useImperativeHandle, useRef } from 'react'\nimport { FileUploadConfig, InputFile } from '../services'\nimport ChatSendAttachments from './Attachments'\n\ninterface FileUpload {\n params?: ObjectType<any>\n config: FileUploadConfig[]\n}\n\ninterface Props {\n placeholder?: string\n content?: string\n fileList?: InputFile[]\n headerOpen?: boolean\n loading?: boolean\n onContentChange: (value: string) => void\n onFileListChange: (files: InputFile[]) => void\n onHeaderOpenChange: (open: boolean) => void\n onSend: () => void\n onCancel?: () => void\n onFocus?: () => void\n extraHeader?: React.ReactNode\n extraFooter?: React.ReactNode\n extraFooterBelow?: React.ReactNode\n sendButtonProps?: ButtonProps\n fileUpload?: FileUpload\n}\n\nexport default forwardRef(\n (\n {\n placeholder,\n content,\n fileList = [],\n headerOpen = false,\n loading = false,\n onContentChange,\n onFileListChange,\n onHeaderOpenChange,\n onSend,\n onCancel,\n onFocus,\n extraHeader,\n extraFooter,\n extraFooterBelow,\n sendButtonProps,\n fileUpload\n }: Props,\n ref\n ) => {\n const senderRef = useRef<GetRef<typeof Sender>>(null)\n const { inputValue, setInputValue } = useSyncInput(content || '', onContentChange)\n\n const attachmentsNode = (fileUpload?.config?.length ?? 0 > 0) && (\n <Badge dot={!!fileList?.length && !headerOpen}>\n <Button type=\"text\" icon={<PaperClipOutlined />} onClick={() => onHeaderOpenChange(!headerOpen)} />\n </Badge>\n )\n\n const attachmentsRef = useRef<any>()\n const senderHeader = (\n <>\n <Sender.Header title=\"选择文件\" open={headerOpen} onOpenChange={onHeaderOpenChange}>\n <ChatSendAttachments\n ref={attachmentsRef}\n fileList={fileList}\n onChange={onFileListChange}\n fileUploadConfig={fileUpload.config}\n extraParams={fileUpload.params}\n />\n </Sender.Header>\n {extraHeader}\n </>\n )\n const onSubmit = () => {\n if (!attachmentsRef.current?.validateFile || attachmentsRef.current.validateFile()) {\n onSend()\n }\n }\n\n // 暴露方法给外部组件\n useImperativeHandle(\n ref,\n () => ({\n focus: (options?: { cursor?: 'start' | 'end' }) => {\n senderRef.current?.focus(options)\n }\n }),\n []\n )\n\n return (\n <Suggestion items={[]} onSelect={(itemVal) => setInputValue(`[${itemVal}]:`)}>\n {({}) => (\n <Sender\n ref={senderRef}\n value={inputValue}\n header={senderHeader}\n onSubmit={onSubmit}\n onChange={setInputValue}\n onFocus={onFocus}\n autoSize={{ minRows: 2, maxRows: 6 }}\n // prefix={attachmentsNode}\n // loading={loading}\n // components={{ input: (...Props) => <MarkdownEditor showToolbar={false} /> }}\n onCancel={onCancel}\n footer={({ components }) => {\n const { SendButton, LoadingButton } = components\n return (\n <Flex vertical>\n <Flex justify=\"space-between\" align=\"center\" gap={12}>\n <Flex className=\"flex-1\" gap={6} align=\"center\">\n {attachmentsNode}\n {extraFooter}{' '}\n </Flex>\n <Flex align=\"center\">{loading ? <LoadingButton /> : <SendButton {...sendButtonProps} />}</Flex>\n </Flex>\n {extraFooterBelow}\n </Flex>\n )\n }}\n actions={false}\n placeholder={placeholder || '有什么我能帮您的吗?'}\n />\n )}\n </Suggestion>\n )\n }\n)\n","import { EnterOutlined, UserSwitchOutlined } from '@ant-design/icons'\nimport { Sender } from '@ant-design/x'\nimport { RenderWrapper, shouldRender } from '@zero-library/common'\nimport { Button, Flex, Typography } from 'antd'\nimport { useMemo } from 'react'\nimport { useSnapshot } from 'valtio'\nimport ChatSender from '../../components/ChatSender'\nimport { FileUploadConfig, InputFile } from '../../services'\nimport { ChatLayoutSender, MessageBoxType } from '../../stores'\nimport { useChatStore } from '../../stores/Context'\nimport styles from './styles.module.less'\n\nexport default ({ placeholder, extraBtn = false, referencesBtn = false }: ChatLayoutSender) => {\n const chatStore = useChatStore()\n\n const receiverState = useSnapshot(chatStore.receiver)\n const conversationState = useSnapshot(chatStore.conversation)\n // 当前会话参数\n const chatMessage = useMemo(\n () => conversationState.messages[conversationState.active.id] || ({} as MessageBoxType),\n [conversationState.messages[conversationState.active.id]]\n )\n const referenceHandle = (con: string) => {\n if (chatMessage?.loading) return\n chatStore.setContent(con)\n setTimeout(() => {\n chatStore.sendMessage()\n }, 10)\n }\n return (\n <ChatSender\n placeholder={placeholder}\n content={chatMessage.content}\n fileList={chatMessage.files as InputFile[]}\n headerOpen={chatMessage.headerOpen}\n loading={chatMessage.loading}\n onContentChange={chatStore.setContent}\n onFileListChange={chatStore.setFileList}\n onHeaderOpenChange={chatStore.setHeaderOpen}\n onSend={() => chatStore.sendMessage()}\n onCancel={chatStore.cancelReceive}\n onFocus={chatStore.config.hooks?.onSenderFocus}\n fileUpload={{\n config: receiverState.active.config?.fileUpload as FileUploadConfig[]\n }}\n extraFooter={\n <>\n {receiverState.active.feature?.deepThink && (\n <Button\n size=\"small\"\n color={receiverState.params.thinkMode === '1' ? 'primary' : 'default'}\n variant=\"filled\"\n onClick={() => chatStore.setReceiverParams({ thinkMode: receiverState.params.thinkMode === '1' ? '2' : '1' })}\n >\n 深度思考\n </Button>\n )}\n {receiverState.active.feature?.switchManual && (\n <Button\n size=\"small\"\n title={\n chatMessage?.speakHuman\n ? '当前状态为人工模式。您发送的问题将直接发送给专家,智能助手将不再回复'\n : '当前状态为智能助手模式。您发送的问题将发送给智能助手,智能助手将回复您'\n }\n shape=\"round\"\n icon={<UserSwitchOutlined />}\n color={chatMessage?.speakHuman ? 'primary' : 'default'}\n variant=\"filled\"\n onClick={() => {\n chatStore.setSpeakHuman?.(!chatMessage?.speakHuman)\n }}\n >\n 向专家咨询\n </Button>\n )}\n <RenderWrapper control={extraBtn} />\n </>\n }\n extraHeader={\n <Sender.Header\n title={\n <Flex gap={4}>\n <EnterOutlined />\n <Typography.Text type=\"secondary\" ellipsis>\n {chatMessage?.references?.content?.name}\n </Typography.Text>\n </Flex>\n }\n open={!!chatMessage?.references?.content?.name}\n onOpenChange={() => chatStore.setReferences()}\n classNames={{\n header: styles.nsSenderReferenceHeaderTitle,\n content: shouldRender(referencesBtn) ? '' : styles.nsSenderReferenceHeaderContent\n }}\n >\n <RenderWrapper\n control={referencesBtn}\n DefaultComponent={\n <Flex gap={8}>\n {['深度解读', '概要解读'].map((con) => (\n <Button key={con} color=\"primary\" variant=\"filled\" onClick={() => referenceHandle(con)}>\n {con} →\n </Button>\n ))}\n </Flex>\n }\n />\n </Sender.Header>\n }\n />\n )\n}\n","import { PlusOutlined } from '@ant-design/icons'\nimport { Avatar, Button, Flex } from 'antd'\nimport classNames from 'classnames'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport styles from './styles.module.less'\n\nexport default () => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n\n return (\n <div className=\"p-24\">\n <Flex align=\"center\" gap={8}>\n <Avatar size={36} src={receiverState.active.logo} />\n <span className={styles.nsChatUserName}>{receiverState.active.name}</span>\n </Flex>\n <Button\n block\n type=\"primary\"\n shape=\"round\"\n onClick={() => chatStore.createConversation()}\n className={classNames('m-t-16')}\n icon={<PlusOutlined />}\n >\n 新建会话\n </Button>\n </div>\n )\n}\n","import { RenderWrapper } from '@zero-library/common'\nimport { Flex } from 'antd'\nimport classNames from 'classnames'\nimport { ChatLayoutConversationList } from '../../stores'\nimport ConversationList from './ConversationList'\nimport ConversationListHeader from './ConversationListHeader'\nimport styles from './styles.module.less'\n\nexport default ({ header }: ChatLayoutConversationList) => {\n return (\n <Flex vertical className={classNames('height-full', styles.conversationListPanel)}>\n <RenderWrapper control={header} DefaultComponent={ConversationListHeader} />\n <div className=\"full-scroll\">\n <ConversationList />\n </div>\n </Flex>\n )\n}\n","import { Button, Flex, List, Popover } from 'antd'\nimport classNames from 'classnames'\nimport { useMemo } from 'react'\nimport { useSnapshot } from 'valtio'\nimport { RecommendQuestion } from '../../services'\nimport { useChatStore } from '../../stores/Context'\nimport styles from './styles.module.less'\n\n/* 🌟 提示词 */\nexport default () => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n\n const component = useMemo(\n () =>\n receiverState.active.config?.labels?.length > 0 && (\n <Flex gap={4} className=\"overflow-hidden\">\n <Button disabled color=\"default\" variant=\"text\">\n 随便聊聊\n </Button>\n {receiverState.active.config.labels.map((question) => (\n <Popover\n key={question.id}\n content={\n <List\n itemLayout=\"horizontal\"\n split={false}\n className={styles.senderList}\n dataSource={question.items as RecommendQuestion[]}\n renderItem={(item) => (\n <List.Item onClick={() => chatStore.sendMessage(item.question)} className={styles.senderListItem}>\n {item.question}\n </List.Item>\n )}\n footer={\n <Flex justify=\"end\" className={styles.senderListFooter}>\n (您可点击以上问题开启AI体验)\n </Flex>\n }\n />\n }\n title={\n <div\n className={classNames(styles.senderListTitle, 'text-ellipsis')}\n >{`${receiverState.active.name}开始关注${question.name}内容!`}</div>\n }\n >\n <Button color=\"default\" variant=\"filled\">\n {question.name}\n </Button>\n </Popover>\n ))}\n </Flex>\n ),\n [receiverState.active.config?.labels]\n )\n return component\n}\n",".nsPreviewHeader {\n padding: 16px 24px;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);\n}\n.nsPreviewHeader .nsPreviewHeaderTitle {\n font-size: 16px;\n font-weight: bold;\n}\n.nsChatSenderHeader {\n margin-bottom: 16px;\n padding: 24px;\n font-size: 24px;\n text-align: center;\n}\n.nsDisclaimerNotice {\n font-size: 12px;\n text-align: center;\n color: #bfbfbf;\n}\n.nsChatLayout {\n background-color: #fff;\n}\n"]}
1
+ {"version":3,"sources":["../src/services/file.ts","../src/core/utils.ts","../src/stores/Context.ts","../src/ui/common/markdownAlert/styles.module.less","../src/ui/common/markdownAlert/AppCard.tsx","../src/ui/common/markdownAlert/FileView.tsx","../src/ui/common/markdownAlert/components/DocDrawer.tsx","../src/ui/common/markdownAlert/IndexQuote.tsx","../src/ui/common/markdownAlert/MdEdit.tsx","../src/ui/common/markdownAlert/FileEdit.tsx","../src/ui/common/markdownAlert/QuoteList.tsx","../src/ui/layouts/index.tsx","../src/stores/index.ts","../src/services/index.ts","../src/ui/common/markdownAlert/index.ts","../src/components/MessageRender.tsx","../src/core/constants.ts","../src/ui/common/BubbleListItems.tsx","../src/ui/common/styles.module.less","../src/ui/common/MessageAIRender.tsx","../src/ui/common/ChatHeader.tsx","../src/ui/common/AgentCharacter.tsx","../src/ui/common/CharacterList.tsx","../src/ui/common/ConversationList.tsx","../src/components/styles.module.less","../src/components/Attachments.tsx","../src/components/ChatSender.tsx","../src/ui/common/ChatSender.tsx","../src/ui/common/SenderPromptsItems.tsx","../src/ui/common/ConversationListHeader.tsx","../src/ui/common/ConversationListPanel.tsx","../src/ui/layouts/styles.module.less"],"names":["request","downloadFile","copyText","message","dayjs","useCreateValtioContext","appCard","fileView","fileEdit","fileEditHeader","fileEditContent","quoteList","mdEdit","Spin","jsxs","Flex","jsx","FileIcon","useState","useEffect","Drawer","RenderMarkdown","Empty","isExternal","Popover","Tag","MarkdownEditor","Button","PlayCircleOutlined","CopyOutlined","Fragment","Collapse","CaretRightOutlined","proxy","shouldRender","deepMerge","getCurrentUser","userInfo","isObject","deepCopy","Bubble","Attachments","styles_module_default","loadingMessage","conversationListPanel","nsConversations","nsBodyWidth","nsBubbleList","nsChatHeader","nsChatTitle","nsChatHeaderPopover","chatWelcomeWrap","chatWelcome","chatWelcomePrompts","senderListTitle","senderList","senderListItem","senderListFooter","nsChatUserName","nsSenderReferenceHeaderTitle","nsSenderReferenceHeaderContent","avatarListContainer","avatarList","avatarListItem","avatarListItemIcon","avatarListItemIconActive","avatarListItemName","useMemo","Typography","classNames","useSnapshot","isBoolean","UserAvatar","OpenAIOutlined","Space","Welcome","Avatar","Prompts","LikeOutlined","DislikeOutlined","RenderWrapper","useRef","Modal","Row","Col","useDebounce","InfiniteScroll","RedoOutlined","Conversations","DeleteOutlined","PlusOutlined","CommentOutlined","CloseOutlined","nsAttachments","forwardRef","App","useRefState","getFileSuffixName","isNumber","isNullOrUnDef","useImperativeHandle","CloudUploadOutlined","fileUpload","useSyncInput","Badge","PaperClipOutlined","Sender","Suggestion","List","ChatSender_default","UserSwitchOutlined","EnterOutlined","nsPreviewHeader","nsPreviewHeaderTitle","nsChatSenderHeader","nsDisclaimerNotice","nsChatLayout","useDeepEffect","sizes","useWebSocket","getWebSocketUrl","getToken","isLocalhost","XProvider","Splitter","FilePreview"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAgCa,QAAA,EAGA,UAAA;AAnCb,IAAA,SAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sBAAA,GAAA;AAgCO,IAAM,QAAA,GAAW,CAAC,SAAA,KAA2C;AAClE,MAAA,OAAOA,cAAA,CAAQ,GAAA,CAAI,CAAA,QAAA,EAAW,SAAS,CAAA,CAAE,CAAA;AAAA,IAC3C,CAAA;AACO,IAAM,UAAA,GAAa,OAAO,WAAA,EAAqB,QAAA,EAAmB,eAAuB,MAAA,KAAW;AACzG,MAAA,MAAM,IAAA,GAAO,MAAMA,cAAA,CAAQ,IAAA,CAAK,CAAA,eAAA,CAAA,EAAmB,EAAE,WAAA,EAAa,QAAA,EAAU,YAAA,EAAa,EAAG,EAAE,YAAA,EAAc,QAAQ,CAAA;AACpH,MAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,MAAAC,mBAAA,CAAa,KAAK,QAAQ,CAAA;AAAA,IAC5B,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACRO,SAAS,SAAA,CACd,QACA,QAAA,EAGG;AACH,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC3D,IAAA,MAAM,GAAA,GAAM,SAAA;AACZ,IAAA,IAAI,OAAO,YAAY,UAAA,EAAY;AACjC,MAAA,MAAA,CAAO,GAAG,CAAA,GAAK,OAAA,CAAsC,MAAM,CAAA;AAAA,IAC7D,WAAW,OAAO,OAAA,KAAY,QAAA,IAAY,MAAA,IAAU,WAAW,MAAA,EAAQ;AACrE,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,MAAA,CAAO,OAAkB,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,OAAA;AAAA,IAChB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,UAAA,CACd,SACA,QAAA,EAGK;AACL,EAAA,OAAO,OAAA,EAAS,IAAI,CAAC,MAAA,KAAW,UAAgB,MAAA,EAAQ,QAAQ,CAAC,CAAA,IAAK,EAAC;AACzE;AA3DA,IAIa,IAAA,EAMA,YAAA;AAVb,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mBAAA,GAAA;AAIO,IAAM,IAAA,GAAO,CAAC,KAAA,KAAkB;AACrC,MAAAC,eAAA,CAAS,KAAK,CAAA,CAAE,IAAA,CAAK,MAAM;AACzB,QAAAC,YAAA,CAAQ,QAAQ,0BAAM,CAAA;AAAA,MACxB,CAAC,CAAA;AAAA,IACH,CAAA;AAEO,IAAM,YAAA,GAAe,CAAC,SAAA,KAA+B;AAC1D,MAAA,MAAM,MAAMC,sBAAA,EAAM;AAClB,MAAA,MAAM,MAAA,GAASA,uBAAM,SAAS,CAAA;AAE9B,MAAA,IAAI,MAAA,CAAO,MAAA,CAAO,GAAA,EAAK,KAAK,CAAA,EAAG;AAC7B,QAAA,OAAO,cAAA;AAAA,MACT;AAEA,MAAA,MAAM,UAAA,GAAa,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAA;AACzC,MAAA,IAAI,aAAa,CAAA,EAAG;AAClB,QAAA,OAAO,uBAAA;AAAA,MACT,CAAA,MAAA,IAAW,aAAa,EAAA,EAAI;AAC1B,QAAA,OAAO,wBAAA;AAAA,MACT,CAAA,MAAA,IAAW,aAAa,GAAA,EAAK;AAC3B,QAAA,OAAO,0BAAA;AAAA,MACT,CAAA,MAAO;AACL,QAAA,OAAO,cAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;AC5BA,IAI+B,YAAA,EAA8B,YAAA;AAJ7D,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uBAAA,GAAA;AAIO,IAAA,CAAM,EAAE,cAAA,EAAgB,YAAA,EAAc,cAAA,EAAgB,iBAAiBC,6BAAA,EAAsC;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACJpH,IAAA,qBAAA;AAAA,IAAA,kBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gDAAA,GAAA;AAAA,IAAA,qBAAA,GAAA;AAAA,MAAC,OAAA,EAAAC,uBAAAA;AAAA,MAgBA,QAAA,EAAAC,wBAAAA;AAAA,MAOA,QAAA,EAAAC,wBAAAA;AAAA,MAKU,cAAA,EAAAC,8BAAAA;AAAA,MAIA,eAAA,EAAAC,+BAAAA;AAAA,MAIV,SAAA,EAAAC,yBAAAA;AAAA,MAWA,MAAA,EAAAC;AAAA,KAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC/CD,IAAA,eAAA,GAAA,EAAA;AAAA,QAAA,CAAA,eAAA,EAAA;AAAA,EAAA,OAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAeO,eAAA;AAfP,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yCAAA,GAAA;AACA,IAAA,YAAA,EAAA;AACA,IAAA,kBAAA,EAAA;AAaA,IAAO,eAAA,GAAQ,CAAC,EAAE,IAAA,EAAM,SAAQ,KAAa;AAC3C,MAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,SAAA,CAAU,wBAAwB,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AAAA,MAErE,CAAA;AACA,MAAA,sCACGC,SAAA,EAAA,EAAK,QAAA,EAAU,OAAA,EAAS,IAAA,EAAK,SAC5B,QAAA,kBAAAC,eAAA,CAACC,SAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,KAAK,CAAA,EAAG,KAAA,EAAM,UAAS,SAAA,EAAW,qBAAA,CAAO,SAAS,OAAA,EAC/D,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,IAAA,CAAK,OAAA,EAAS,CAAA;AAAA,wBACxBA,cAAA,CAAC,SAAI,SAAA,EAAU,eAAA,EAAgB,OAAO,IAAA,CAAK,OAAA,EACxC,eAAK,OAAA,EACR;AAAA,OAAA,EACF,CAAA,EACF,CAAA;AAAA,IAEJ,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC/BA,IAAA,gBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,gBAAA,EAAA;AAAA,EAAA,OAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAWO,gBAAA;AAXP,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0CAAA,GAAA;AAGA,IAAA,YAAA,EAAA;AACA,IAAA,kBAAA,EAAA;AAOA,IAAO,gBAAA,GAAQ,CAAC,EAAE,IAAA,EAAM,SAAQ,KAAa;AAC3C,MAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,SAAA,CAAU,UAAA,CAAW,MAAM,KAAK,CAAA;AAAA,MAClC,CAAA;AACA,MAAA,uBACEA,cAAAA,CAACH,SAAAA,EAAA,EAAK,QAAA,EAAU,OAAA,EAAS,MAAK,OAAA,EAC5B,QAAA,kBAAAC,gBAACC,SAAAA,EAAA,EAAK,KAAK,CAAA,EAAG,KAAA,EAAM,UAAS,SAAA,EAAW,qBAAA,CAAO,UAAU,OAAA,EACvD,QAAA,EAAA;AAAA,wBAAAC,cAAAA,CAACC,eAAA,EAAA,EAAS,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,CAAA;AAAA,wBAC/BD,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAgB,KAAA,EAAO,IAAA,CAAK,QAAA,EACxC,QAAA,EAAA,IAAA,CAAK,QAAA,EACR;AAAA,OAAA,EACF,CAAA,EACF,CAAA;AAAA,IAEJ,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;AC1BA,IAWO,iBAAA;AAXP,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,sDAAA,GAAA;AAGA,IAAA,SAAA,EAAA;AAQA,IAAO,oBAAQ,CAAC,EAAE,OAAO,IAAA,EAAM,OAAA,EAAS,SAAQ,KAAa;AAC3D,MAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIE,eAAS,EAAE,CAAA;AACzC,MAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC5C,MAAA,MAAM,aAAa,YAAY;AAC7B,QAAA,IAAI;AACF,UAAA,UAAA,CAAW,IAAI,CAAA;AACf,UAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,OAAO,CAAA;AAClC,UAAA,UAAA,CAAW,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,QAC9B,CAAA,SAAE;AACA,UAAA,UAAA,CAAW,KAAK,CAAA;AAAA,QAClB;AAAA,MACF,CAAA;AACA,MAAAC,eAAA,CAAU,MAAM;AACd,QAAA,UAAA,EAAW;AAAA,MACb,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AACZ,MAAA,uBACEH,cAAAA,CAACI,WAAA,EAAA,EAAO,KAAA,EAAc,IAAA,EAAM,KAAA,EAAO,KAAA,EAAM,MAAA,EAAO,IAAA,EAAY,OAAA,EAC1D,QAAA,kBAAAJ,cAAAA,CAACH,SAAAA,EAAA,EAAK,QAAA,EAAU,OAAA,EAAU,QAAA,EAAA,OAAA,mBAAUG,cAAAA,CAACK,qBAAA,EAAA,EAAe,OAAA,EAAkB,CAAA,mBAAKL,cAAAA,CAACM,UAAA,EAAA,EAAM,SAAA,EAAU,QAAA,EAAS,CAAA,EAAG,CAAA,EAC1G,CAAA;AAAA,IAEJ,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC/BA,IAAA,kBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,kBAAA,EAAA;AAAA,EAAA,OAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAcO,kBAAA;AAdP,IAAA,eAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4CAAA,GAAA;AAIA,IAAA,cAAA,EAAA;AAUA,IAAO,kBAAA,GAAQ,CAAC,EAAE,IAAA,EAAM,SAAQ,KAAa;AAC3C,MAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIJ,eAAS,KAAK,CAAA;AACtC,MAAA,MAAM,UAAU,MAAM;AACpB,QAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,QAAA,IAAIK,iBAAA,CAAW,IAAA,CAAK,OAAO,CAAA,EAAG;AAC5B,UAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,QAAQ,CAAA;AAAA,QACpC,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,QACd;AAAA,MACF,CAAA;AACA,MAAA,MAAM,0BACJP,cAAAA,CAAC,SACC,QAAA,kBAAAA,cAAAA,CAACD,WAAA,EAAK,KAAA,EAAM,UAAS,GAAA,EAAK,CAAA,EAExB,0BAAAC,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAmB,QAAA,EAAA,IAAA,CAAK,QAAA,EAAS,GACtC,CAAA,EACF,CAAA;AAEF,MAAA,uBACEF,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,wBAAAE,cAAAA,CAACH,SAAAA,EAAA,EAAK,QAAA,EAAU,OAAA,EAAS,MAAK,OAAA,EAC5B,QAAA,kBAAAG,cAAAA,CAACQ,YAAA,EAAA,EAAQ,OAAA,EAAS,OAAA,EAChB,0BAAAR,cAAAA,CAACS,QAAA,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,KAAA,EAAM,YAAA,EAAa,WAAU,gBAAA,EAChD,QAAA,EAAA,IAAA,CAAK,KAAA,EACR,CAAA,EACF,CAAA,EACF,CAAA;AAAA,QACC,IAAA,oBAAQT,cAAAA,CAAC,iBAAA,EAAA,EAAU,SAAS,IAAA,CAAK,OAAA,EAAS,KAAA,EAAO,IAAA,CAAK,UAAU,IAAA,EAAY,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAAA,OAAA,EAC9G,CAAA;AAAA,IAEJ,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC5CA,IAAA,cAAA,GAAA,EAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,OAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAcO,cAAA;AAdP,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,wCAAA,GAAA;AAGA,IAAA,YAAA,EAAA;AACA,IAAA,kBAAA,EAAA;AAUA,IAAO,cAAA,GAAQ,CAAC,EAAE,IAAA,EAAM,SAAQ,KAAa;AAC3C,MAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,MAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIE,eAAS,EAAE,CAAA;AACrC,MAAA,MAAM,OAAO,MAAM;AACjB,QAAA,SAAA,CAAU,YAAY,0BAAA,EAAQ,IAAI,EAAE,OAAA,EAAS,OAAO,CAAA;AAAA,MACtD,CAAA;AACA,MAAAC,gBAAU,MAAM;AACd,QAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,MACvB,CAAA,EAAG,CAAC,IAAA,CAAK,OAAO,CAAC,CAAA;AACjB,MAAA,uBACEL,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,sBAAO,MAAA,EACrB,QAAA,EAAA;AAAA,wBAAAE,cAAAA,CAACU,yBAAe,QAAA,EAAU,OAAA,EAAS,OAAc,QAAA,EAAU,QAAA,EAAU,aAAa,KAAA,EAAO,CAAA;AAAA,QACxF,CAAC,2BACAV,cAAAA,CAACD,WAAA,EAAK,OAAA,EAAQ,OAAM,SAAA,EAAU,QAAA,EAC5B,0BAAAC,cAAAA,CAACW,WAAA,EAAA,EAAO,OAAM,SAAA,EAAU,OAAA,EAAQ,YAAW,OAAA,EAAS,IAAA,EAAM,gFAE1D,CAAA,EACF;AAAA,OAAA,EAEJ,CAAA;AAAA,IAEJ,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACnCA,IAAA,gBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,gBAAA,EAAA;AAAA,EAAA,OAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAaO,gBAAA;AAbP,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0CAAA,GAAA;AAKA,IAAA,UAAA,EAAA;AACA,IAAA,YAAA,EAAA;AACA,IAAA,kBAAA,EAAA;AAMA,IAAO,gBAAA,GAAQ,CAAC,EAAE,IAAA,EAAM,SAAQ,KAAa;AAC3C,MAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,MAAA,MAAM,YAAY,MAAM;AACtB,QAAA,SAAA,CAAU,UAAA,CAAW,MAAM,IAAI,CAAA;AAAA,MACjC,CAAA;AAWA,MAAA,uBACEb,gBAACC,SAAAA,EAAA,EAAK,UAAQ,IAAA,EAAC,SAAA,EAAW,sBAAO,QAAA,EAC/B,QAAA,EAAA;AAAA,wBAAAD,eAAAA,CAACC,SAAAA,EAAA,EAAK,GAAA,EAAK,CAAA,EAAG,KAAA,EAAM,QAAA,EAAS,OAAA,EAAQ,eAAA,EAAgB,SAAA,EAAW,qBAAA,CAAO,cAAA,EACrE,QAAA,EAAA;AAAA,0BAAAD,eAAAA,CAACC,WAAA,EAAK,GAAA,EAAK,GAAG,KAAA,EAAM,QAAA,EAAS,WAAU,QAAA,EACrC,QAAA,EAAA;AAAA,4BAAAC,eAACC,eAAAA,EAAA,EAAS,MAAA,EAAQ,IAAA,EAAM,UAAU,EAAA,EAAI,CAAA;AAAA,4BACtCD,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAgB,KAAA,EAAO,IAAA,CAAK,QAAA,EACxC,QAAA,EAAA,IAAA,CAAK,QAAA,EACR;AAAA,WAAA,EACF,CAAA;AAAA,0BACAA,cAAAA,CAACH,SAAAA,EAAA,EAAK,QAAA,EAAU,OAAA,EAAS,IAAA,EAAK,OAAA,EAC5B,QAAA,kBAAAC,eAAAA,CAACC,SAAAA,EAAA,EACC,QAAA,EAAA;AAAA,4BAAAC,eAACW,WAAAA,EAAA,EAAO,KAAA,EAAM,SAAA,EAAU,SAAQ,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,IAAA,kBAAMX,cAAAA,CAACY,wBAAA,EAAA,EAAmB,CAAA,EAAI,OAAA,EAAS,WAAW,QAAA,EAAA,0BAAA,EAEtG,CAAA;AAAA,4BACAZ,eAACW,WAAAA,EAAA,EAAO,OAAM,SAAA,EAAU,OAAA,EAAQ,QAAO,IAAA,EAAK,OAAA,EAAQ,sBAAMX,cAAAA,CAACa,sBAAa,CAAA,EAAI,OAAA,EAAS,MAAM,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,EAAG,QAAA,EAAA,cAAA,EAE/G;AAAA,WAAA,EACF,CAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,wBACAb,cAAAA,CAACD,SAAAA,EAAA,EAAK,GAAA,EAAK,CAAA,EAAG,OAAM,QAAA,EAAS,SAAA,EAAW,qBAAA,CAAO,eAAA,EAC7C,0BAAAC,cAAAA,CAACK,qBAAAA,EAAA,EAAe,OAAA,EAAS,IAAA,CAAK,SAAS,CAAA,EACzC;AAAA,OAAA,EACF,CAAA;AAAA,IAEJ,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACtDA,IAAA,iBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,iBAAA,EAAA;AAAA,EAAA,OAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAiBO,iBAAA;AAjBP,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2CAAA,GAAA;AAKA,IAAA,cAAA,EAAA;AACA,IAAA,kBAAA,EAAA;AAWA,IAAO,iBAAA,GAAQ,CAAC,EAAE,IAAA,EAAM,SAAQ,KAAa;AAC3C,MAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIH,eAAS,KAAK,CAAA;AACtC,MAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,cAAAA,CAAS,EAAe,CAAA;AAC5D,MAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAAoB;AACnC,QAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AACnB,QAAA,IAAIK,iBAAAA,CAAW,IAAA,CAAK,OAAO,CAAA,EAAG;AAC5B,UAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,QAAQ,CAAA;AAAA,QACpC,CAAA,MAAO;AACL,UAAA,aAAA,CAAc,IAAI,CAAA;AAClB,UAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,QACd;AAAA,MACF,CAAA;AACA,MAAA,uBACET,gBAAAgB,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAd,cAAAA;AAAA,UAACe,aAAA;AAAA,UAAA;AAAA,YACC,WAAW,qBAAA,CAAO,SAAA;AAAA,YAClB,QAAA,EAAU,KAAA;AAAA,YACV,KAAA,EAAK,IAAA;AAAA,YACL,UAAA,EAAY,CAAC,EAAE,QAAA,EAAS,qBAAMf,cAAAA,CAACgB,wBAAA,EAAA,EAAmB,MAAA,EAAQ,QAAA,GAAW,EAAA,GAAK,CAAA,EAAG,CAAA;AAAA,YAC7E,KAAA,EAAO;AAAA,cACL;AAAA,gBACE,GAAA,EAAK,GAAA;AAAA,gBACL,KAAA,EAAO,0BAAA;AAAA,gBACP,QAAA,kBACEhB,cAAAA,CAACD,SAAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,GAAA,EAAK,CAAA,EACjB,QAAA,EAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,qBACdC,cAAAA,CAAC,GAAA,EAAA,EAAqB,OAAA,EAAS,MAAM,CAAC,OAAA,IAAW,QAAQ,IAAI,CAAA,EAAG,SAAA,EAAU,gBAAA,EACvE,QAAA,EAAA,IAAA,CAAK,KAAA,EAAA,EADA,IAAA,CAAK,OAEb,CACD,CAAA,EACH;AAAA;AAEJ;AACF;AAAA,SACF;AAAA,QACC,IAAA,oBAAQA,cAAAA,CAAC,iBAAA,EAAA,EAAU,SAAS,UAAA,CAAW,OAAA,EAAS,KAAA,EAAO,UAAA,CAAW,OAAO,IAAA,EAAY,OAAA,EAAS,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAAA,OAAA,EACvH,CAAA;AAAA,IAEJ,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjCA,SAAA,EAAA;;;ACjBA,UAAA,EAAA;ACgGO,IAAM,kBAAA,GAAqB,CAAC,MAAA,KAAsE;AACvG,EAAA,OAAOhB,cAAAA,CAAQ,GAAA,CAAI,oBAAA,EAAsB,MAAM,CAAA;AACjD,CAAA;AAmCO,IAAM,kBAAA,GAAqB,CAAC,MAAA,KAAmD;AACpF,EAAA,OAAOA,cAAAA,CAAQ,IAAA,CAAK,oBAAA,EAAsB,MAAM,CAAA;AAClD,CAAA;AAIO,IAAM,kBAAA,GAAqB,CAAC,cAAA,KAA6C;AAC9E,EAAA,OAAOA,cAAAA,CAAQ,MAAA,CAAO,qBAAA,EAAuB,EAAE,gBAAgB,CAAA;AACjE,CAAA;AAkCO,IAAM,uBAAA,GAA0B,CAAC,MAAA,KAAwD;AAC9F,EAAA,OAAOA,cAAAA,CAAQ,GAAA,CAAI,2BAAA,EAA6B,MAAM,CAAA;AACxD,CAAA;AAgGO,IAAM,yBAAA,GAA4B,CAAC,MAAA,KAAgF;AACxH,EAAA,OAAOA,cAAAA,CAAQ,GAAA,CAAI,4BAAA,EAA8B,MAAM,CAAA;AACzD,CAAA;AA4BO,IAAM,cAAA,GAAiB,CAAC,MAAA,KAA6C;AAC1E,EAAA,OAAOA,cAAAA,CAAQ,GAAA,CAAI,qCAAA,EAAuC,MAAM,CAAA;AAClE,CAAA;AAIO,IAAM,qBAAA,GAAwB,CAAC,KAAA,EAAkC,QAAA,GAAW,CAAA,KAA4B;AAC7G,EAAA,OAAOA,eAAQ,GAAA,CAAI,4BAAA,EAA8B,EAAE,KAAA,EAAO,UAAU,CAAA;AACtE,CAAA;AAKO,IAAM,uBAAA,GAA0B,CAAC,cAAA,KAA6E;AACnH,EAAA,OAAOA,cAAAA,CAAQ,GAAA,CAAI,2BAAA,EAA6B,EAAE,gBAAgB,CAAA;AACpE,CAAA;AA6DO,IAAM,uBAAA,GAA0B,CAAC,MAAA,KAAsD;AAC5F,EAAA,OAAOA,cAAAA,CAAQ,IAAA,CAAK,yBAAA,EAA2B,MAAM,CAAA;AACvD,CAAA;AAKO,IAAM,gBAAA,GAAmB,CAAC,cAAA,KAA6D;AAC5F,EAAA,OAAOA,cAAAA,CAAQ,IAAA,CAAK,yBAAA,EAA2B,EAAE,gBAAgB,CAAA;AACnE,CAAA;AAsGO,IAAM,cAAA,GAAiB,CAAC,OAAA,KAAoD;AACjF,EAAA,OAAOA,cAAAA,CAAQ,GAAA,CAAI,oBAAA,EAAsB,EAAE,SAAS,CAAA;AACtD,CAAA;AA2CO,IAAM,mBAAA,GAAsB,CAAC,OAAA,KAA2D;AAC7F,EAAA,OAAOA,cAAAA,CAAQ,GAAA,CAAI,iBAAA,EAAmB,EAAE,SAAS,CAAA;AACnD,CAAA;AAIO,IAAM,oBAAA,GAAuB,CAAC,OAAA,EAA0B,WAAA,KAAwD;AACrH,EAAA,OAAOA,eAAQ,IAAA,CAAK,sBAAA,EAAwB,EAAE,OAAA,EAAS,aAAa,CAAA;AACtE,CAAA;AAKO,IAAM,UAAA,GAAa,CAAC,QAAA,KAA8C;AACvE,EAAA,OAAOA,cAAAA,CAAQ,KAAK,sBAAA,EAAwB,QAAA,EAAU,EAAE,OAAA,EAAS,CAAA,GAAI,EAAA,GAAK,GAAA,EAAM,CAAA;AAClF,CAAA;;;ADxYA,IAAM,kBAAA,GAAqB;AAAA,EACzB,SAAA,EAAW,KAAA;AAAA,EACX,gBAAA,EAAkB,IAAA;AAAA,EAClB,OAAA,EAAS,IAAA;AAAA,EACT,WAAA,EAAa,IAAA;AAAA,EACb,YAAA,EAAc,KAAA;AAAA,EACd,YAAA,EAAc,KAAA;AAAA,EACd,MAAA,EAAQ,IAAA;AAAA,EACR,YAAA,EAAc,KAAA;AAAA,EACd,YAAA,EAAc,KAAA;AAAA,EACd,UAAA,EAAY,IAAA;AAAA,EACZ,gBAAA,EAAkB;AACpB,CAAA;AACA,IAAM,mBAAA,GAAsB;AAAA,EAC1B,SAAA,EAAW,KAAA;AAAA,EACX,gBAAA,EAAkB,KAAA;AAAA,EAClB,OAAA,EAAS,KAAA;AAAA,EACT,WAAA,EAAa,IAAA;AAAA,EACb,YAAA,EAAc,KAAA;AAAA,EACd,YAAA,EAAc,KAAA;AAAA,EACd,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO;AAAA,MACL,OAAA,EAAS;AAAA;AACX,GACF;AAAA,EACA,YAAA,EAAc,KAAA;AAAA,EACd,YAAA,EAAc,KAAA;AAAA,EACd,UAAA,EAAY;AAAA,IACV,KAAA,EAAO;AAAA,MACL,KAAA,EAAO,IAAA;AAAA,MACP,QAAA,EAAU,KAAA;AAAA,MACV,kBAAA,EAAoB,KAAA;AAAA,MACpB,cAAA,EAAgB,KAAA;AAAA,MAChB,mBAAA,EAAqB;AAAA;AACvB,GACF;AAAA,EACA,gBAAA,EAAkB;AACpB,CAAA;AACO,SAAS,eAAA,GAAkB;AAChC,EAAA,MAAM,SAASiC,YAAA,CAAM;AAAA,IACnB,OAAO,EAAC;AAAA,IACR,QAAQ,EAAC;AAAA,IACT,OAAA,EAAS;AAAA,MACP,MAAM,EAAC;AAAA,MACP,MAAA,EAAQ;AAAA;AAAA;AAAA;AAAA,KAGV;AAAA,IACA,UAAU,EAAC;AAAA,IACX,QAAQ;AAAC,GACV,CAAA;AAED,EAAA,MAAM,aAAa,CAAC,IAAA,GAAO,EAAC,EAAiC,SAAS,KAAA,KAAU;AAC9E,IAAA,IAAIC,mBAAA,CAAa,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,EAAG;AACvC,MAAA,MAAA,CAAO,OAAA,GAAU;AAAA,QACf,IAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAK,MAAsB,OAAA,EAAS;AAClC,QAAA,MAAA,CAAO,IAAA,CAAM,IAAA,CAAqB,OAAA,EAAS,QAAQ,CAAA;AAAA,MACrD,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAI,wDAAW,CAAA;AAAA,MACzB;AAAA,IACF;AAAA,EACF,CAAA;AACA,EAAA,MAAM,SAAA,GAAY,CAAC,MAAA,EAAoB,YAAA,GAAuB,CAAA,KAAM;AAClE,IAAA,MAAM,aAAA,GAAgB,YAAA,KAAiB,CAAA,GAAI,kBAAA,GAAqB,mBAAA;AAChE,IAAA,MAAA,CAAO,MAAA,GAASC,gBAAA,CAAU,aAAA,EAAe,MAAM,CAAA;AAAA,EACjD,CAAA;AACA,EAAA,MAAM,eAAA,GAAkB,CAAC,MAAA,GAAS,EAAC,KAAoB;AACrD,IAAA,MAAA,CAAO,MAAA,GAAS,EAAE,GAAG,MAAA,EAAO;AAAA,EAC9B,CAAA;AACA,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,GAAQ,EAAC,KAAmB;AAC5C,IAAA,MAAA,CAAO,KAAA,GAAQ,KAAA;AAAA,EACjB,CAAA;AACA,EAAA,MAAM,WAAA,GAAc,CAAC,QAAA,KAAwB;AAC3C,IAAA,MAAA,CAAO,QAAA,GAAW,SAAA,CAAU,QAAA,IAAYC,qBAAA,EAAe,EAAG;AAAA,MACxD,EAAA,EAAI,CAACC,SAAAA,KAAa;AAChB,QAAA,OAAO,MAAA,CAAOA,SAAAA,CAAS,IAAI,CAAC,CAAA;AAAA,MAC9B,CAAA;AAAA,MACA,IAAA,EAAM,MAAA;AAAA,MACN,OAAA,EAAS,QAAA;AAAA,MACT,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,EACH,CAAA;AACA,EAAA,MAAM,WAAWJ,YAAA,CAAM;AAAA,IACrB,QAAQ,EAAC;AAAA,IACT,OAAA,EAAS,KAAA;AAAA,IACT,QAAQ;AAAC;AAAA,GACV,CAAA;AAED,EAAA,MAAM,iBAAA,GAAoB,CAAC,MAAA,KAA6B;AACtD,IAAA,IAAIK,eAAA,CAAS,MAAM,CAAA,EAAG;AACpB,MAAA,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,MAAA,EAAQ,MAAM,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,SAAS,EAAC;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,OAAO,OAAA,KAA6B;AAEtD,IAAA,IAAI,QAAA,CAAS,MAAA,CAAO,EAAA,KAAO,OAAA,EAAS;AAEpC,IAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,KAAA,EAAO,sBAAsB,OAAO,CAAA;AACpE,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,MAAM,IAAI,MAAM,gCAAO,CAAA;AAAA,IACzB;AAEA,IAAA,IAAI;AACF,MAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,eAAe,OAAO,CAAA;AAC7C,MAAA,QAAA,CAAS,MAAA,GAAS,UAAmC,IAAA,EAAM;AAAA,QACzD,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,MAAA;AAAA,QACN,WAAA,EAAa,aAAA;AAAA,QACb,EAAA,EAAI,IAAA;AAAA,QACJ,MAAA,EAAQ,QAAA;AAAA,QACR,WAAA,EAAa,aAAA;AAAA,QACb,OAAA,EAAS,CAAC,SAAA,KAAc;AACtB,UAAA,IAAI,UAAU,OAAA,EAAS;AACrB,YAAA,IAAI;AACF,cAAA,OAAO,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,OAAO,CAAA;AAAA,YACrC,SAAS,CAAA,EAAG;AAAA,YAAC;AAAA,UACf;AACA,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,OACD,CAAA;AACD,MAAA,QAAA,CAAS,OAAO,IAAA,GAAO,CAAA;AACvB,MAAA,iBAAA,EAAkB;AAGlB,MAAA,IAAI,QAAA,CAAS,MAAA,CAAO,OAAA,EAAS,SAAA,EAAW;AACtC,QAAA,iBAAA,CAAkB,EAAE,SAAA,EAAW,GAAA,EAAK,CAAA;AAAA,MACtC;AACA,MAAA,MAAA,CAAO,KAAA,EAAO,qBAAqB,IAAI,CAAA;AAAA,IACzC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,MAAA,KAA+B;AACnD,IAAA,IAAI,QAAA,CAAS,MAAA,CAAO,EAAA,KAAO,MAAA,CAAO,QAAA,EAAU;AAC5C,IAAA,QAAA,CAAS,MAAA,GAAS,UAA4C,MAAA,EAAQ;AAAA,MACpE,IAAA,EAAM,YAAA;AAAA,MACN,IAAA,EAAM,cAAA;AAAA,MACN,EAAA,EAAI;AAAA,KACL,CAAA;AACD,IAAA,QAAA,CAAS,OAAO,IAAA,GAAO,CAAA;AACvB,IAAA,iBAAA,EAAkB;AAAA,EACpB,CAAA;AAGA,EAAA,MAAM,YAAYL,YAAA,CAAM;AAAA,IACtB,MAAM,EAAC;AAAA,IACP,QAAQ,EAAC;AAAA,IACT,IAAA,EAAM,KAAA;AAAA,IACN,OAAA,EAAS,KAAA;AAAA,IACT,aAAA,EAAe;AAAA,GAChB,CAAA;AAED,EAAA,MAAM,aAAA,GAAgB,OAAO,OAAA,KAA6B;AACxD,IAAA,IAAI;AACF,MAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AACpB,MAAA,MAAM,GAAA,GAAM,MAAM,mBAAA,CAAoB,OAAO,CAAA;AAC7C,MAAA,IAAI,QAAA,CAAS,MAAA,CAAO,EAAA,KAAO,OAAA,EAAS;AACpC,MAAA,SAAA,CAAU,OAAO,GAAA,CAAI,IAAA;AACrB,MAAA,SAAA,CAAU,SAAS,GAAA,CAAI,IAAA,CAAK,KAAK,CAAC,IAAA,KAAS,KAAK,QAAQ,CAAA;AAAA,IAC1D,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,OAAA,GAAU,KAAA;AAAA,IACtB;AAAA,EACF,CAAA;AACA,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAA,SAAA,CAAU,IAAA,GAAO,IAAA;AAAA,EACnB,CAAA;AACA,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,SAAA,CAAU,IAAA,GAAO,KAAA;AAAA,EACnB,CAAA;AACA,EAAA,MAAM,eAAA,GAAkB,OAAO,CAAA,KAAsB;AACnD,IAAA,IAAI,CAAC,EAAE,EAAA,EAAI;AACX,IAAA,IAAI;AACF,MAAA,SAAA,CAAU,aAAA,GAAgB,IAAA;AAC1B,MAAA,MAAM,oBAAA,CAAqB,QAAA,CAAS,MAAA,CAAO,EAAA,EAAI,EAAE,EAAE,CAAA;AACnD,MAAA,SAAA,CAAU,MAAA,GAAS,EAAE,GAAG,CAAA,EAAE;AAC1B,MAAA,kBAAA,EAAmB;AAAA,IACrB,CAAA,SAAE;AACA,MAAA,SAAA,CAAU,aAAA,GAAgB,KAAA;AAAA,IAC5B;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,gBAAgBA,YAAA,CAAM;AAAA,IAC1B,IAAA,EAAM;AAAA,MACJ,OAAO,EAAC;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,OAAA,EAAS,CAAA;AAAA,QACT,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,IACA,WAAA,EAAa,CAAA;AAAA;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACb,CAAA;AAED,EAAA,MAAM,gBAAA,GAAmB,OAAO,QAAA,EAA0C,UAAA,KAAiD;AACzH,IAAA,IAAI;AACF,MAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AACxB,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,kBAAA,CAAmB;AAAA,QACxC,QAAA;AAAA,QACA,UAAA;AAAA,QACA,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AAAA,QAC1B,YAAA,EAAc,OAAO,MAAA,CAAO,YAAA;AAAA,QAC5B,GAAG,cAAc,IAAA,CAAK;AAAA,OACvB,CAAA;AAED,MAAA,IAAI,QAAA,CAAS,MAAA,CAAO,EAAA,KAAO,QAAA,EAAU;AACrC,MAAA,MAAM,KAAA,GAAQ,UAAA,CAA2C,IAAA,EAAM,KAAA,IAAS,EAAC,EAAG;AAAA,QAC1E,GAAA,EAAK,IAAA;AAAA,QACL,EAAA,EAAI,IAAA;AAAA,QACJ,KAAA,EAAO,OAAA;AAAA,QACP,KAAA,EAAO,CAAC,CAAA,KAAc;AACpB,UAAA,OAAO,YAAA,CAAa,EAAE,UAAU,CAAA;AAAA,QAClC,CAAA;AAAA,QACA,SAAA,EAAW;AAAA,OACZ,CAAA;AACD,MAAA,aAAA,CAAc,KAAK,KAAA,GAAQ,KAAA;AAAA,IAC7B,CAAA,SAAE;AACA,MAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AAAA,IAC1B;AAAA,EACF,CAAA;AACA,EAAA,MAAM,eAAA,GAAkB,OAAO,cAAA,KAA2C;AACxE,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,KAAA,EAAO,0BAA0B,cAAc,CAAA;AAC/E,MAAA,IAAI,eAAe,KAAA,EAAO;AAC1B,MAAA,aAAA,CAAc,UAAA,GAAa,IAAA;AAC3B,MAAA,MAAM,mBAAmB,cAAc,CAAA;AACvC,MAAA9B,YAAAA,CAAQ,QAAQ,0BAAM,CAAA;AACtB,MAAA,aAAA,CAAc,IAAA,CAAK,KAAA,GAAQ,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,IAAA,KAAS,IAAA,CAAK,GAAA,KAAQ,cAAc,CAAA;AAChG,MAAA,OAAO,YAAA,CAAa,SAAS,cAAc,CAAA;AAC3C,MAAA,IAAI,YAAA,CAAa,MAAA,CAAO,EAAA,KAAO,cAAA,EAAgB;AAC7C,QAAA,kBAAA,EAAmB;AAAA,MACrB;AACA,MAAA,MAAA,CAAO,OAAO,sBAAA,GAAyB,cAAA,EAAgB,YAAA,CAAa,MAAA,CAAO,OAAO,cAAc,CAAA;AAAA,IAClG,CAAA,SAAE;AACA,MAAA,aAAA,CAAc,UAAA,GAAa,KAAA;AAAA,IAC7B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAe8B,YAAA,CAAM;AAAA;AAAA,IAEzB,MAAA,EAAQ;AAAA,MACN,EAAA,EAAI,EAAA;AAAA,MACJ,QAAQ;AAAC,KACX;AAAA,IACA,UAAU,EAAC;AAAA,IACX,QAAA,EAAU;AAAA;AAAA,MAER,OAAA,EAAS;AAAA;AAAA;AAAA;AAGX,GACD,CAAA;AACD,EAAA,MAAM,aAAA,GAAgB,CAAC,UAAA,KAAwB;AAC7C,IAAA,YAAA,CAAa,QAAA,CAAS,YAAA,CAAa,MAAA,CAAO,EAAE,EAAE,UAAA,GAAa,UAAA;AAAA,EAC7D,CAAA;AACA,EAAA,MAAM,aAAA,GAAgB,CAAC,UAAA,KAAgC;AACrD,IAAA,YAAA,CAAa,QAAA,CAAS,YAAA,CAAa,MAAA,CAAO,EAAE,EAAE,UAAA,GAAa,UAAA;AAAA,EAC7D,CAAA;AACA,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,KAAoD;AACtE,IAAA,YAAA,CAAa,QAAA,CAAS,YAAA,CAAa,MAAA,CAAO,EAAE,EAAE,OAAA,GAAU,OAAA;AAAA,EAC1D,CAAA;AACA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,GAAQ,EAAC,KAA6C;AACzE,IAAA,YAAA,CAAa,QAAA,CAAS,YAAA,CAAa,MAAA,CAAO,EAAE,EAAE,KAAA,GAAQ,KAAA;AAAA,EACxD,CAAA;AACA,EAAA,MAAM,aAAA,GAAgB,CAAC,UAAA,KAA6C;AAClE,IAAA,YAAA,CAAa,QAAA,CAAS,YAAA,CAAa,MAAA,CAAO,EAAE,EAAE,UAAA,GAAa,UAAA;AAAA,EAC7D,CAAA;AACA,EAAA,MAAM,kBAAA,GAAqB,CAAC,cAAA,KAA2C;AACrE,IAAA,IAAI,YAAA,CAAa,QAAA,CAAS,cAAc,CAAA,CAAE,cAAc,MAAA,EAAQ;AAC9D,MAAA,YAAA,CAAa,QAAA,CAAS,cAAc,CAAA,CAAE,YAAA,GAAe,EAAC;AAAA,IACxD;AAAA,EACF,CAAA;AACA,EAAA,MAAM,eAAA,GAAkB,OAAO,cAAA,EAAwC,SAAA,KAAyC;AAC9G,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,CAAS,cAAc,CAAA,EAAG,OAAA;AACxD,IAAA,IAAI,CAAC,UAAU,MAAA,EAAQ;AACvB,IAAA,IAAI,WAAA,GAAc,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAC9C,IAAA,IAAI,CAAC,eAAe,WAAA,CAAY,MAAA,CAAO,SAAS,CAAA,IAAK,WAAA,CAAY,OAAO,SAAA,EAAW;AACnF,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,sBAAsB,SAAS,CAAA;AACtD,IAAA,WAAA,GAAc,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAC1C,IAAA,IAAI,WAAA,CAAY,OAAO,SAAA,EAAW;AAElC,IAAA,YAAA,CAAa,QAAA,CAAS,cAAc,CAAA,CAAE,YAAA,GAAe,IAAA;AAAA,EACvD,CAAA;AAKA,EAAA,MAAM,QAAA,GAAW,OACf,cAAA,EACA,SAAA,EACA,aACA,KAAA,KACG;AACH,IAAA,IAAI;AACF,MAAA,YAAA,CAAa,SAAS,OAAA,GAAU,IAAA;AAChC,MAAA,MAAM,eAAe,EAAE,cAAA,EAAgB,EAAA,EAAI,SAAA,EAAW,aAAa,CAAA;AACnE,MAAA9B,YAAAA,CAAQ,QAAQ,sCAAQ,CAAA;AAExB,MAAA,YAAA,CAAa,SAAS,cAAc,CAAA,CAAE,OAAA,CAAQ,KAAK,EAAE,WAAA,GAAc,WAAA;AAAA,IACrE,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,SAAS,OAAA,GAAU,KAAA;AAAA,IAClC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,OAAO,cAAA,KAA2C;AACvE,IAAA,YAAA,CAAa,QAAA,CAAS,cAAc,CAAA,GAAI;AAAA,MACtC,OAAA,EAAS,EAAA;AAAA,MACT,OAAO,EAAC;AAAA;AAAA,MACR,UAAA,EAAY,KAAA;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,SAAS,EAAC;AAAA,MACV,cAAc;AAAC;AAAA,KACjB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,qBAAA,GAAwB,OAAO,UAAA,EAA6B,QAAA,GAAiC,CAAA,KAAM;AACvG,IAAA,IAAI,aAAa,CAAA,EAAG;AAClB,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,uBAAA,CAAwB;AAAA,QAC7C,UAAA;AAAA,QACA,YAAA,EAAc,CAAA;AAAA,QACd,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AAAA,QAC1B,YAAA,EAAc,OAAO,MAAA,CAAO;AAAA,OAC7B,CAAA;AACD,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,kBAAA,CAAmB;AAAA,QACxC,UAAA;AAAA,QACA,YAAA,EAAc,CAAA;AAAA,QACd,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AAAA,QAC1B,YAAA,EAAc,OAAO,MAAA,CAAO,YAAA;AAAA,QAC5B,YAAA,EAAc,OAAO,MAAA,CAAO,YAAA;AAAA,QAC5B,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAA;AAAA,QACtB,IAAA,EAAM;AAAA,OACP,CAAA;AACD,MAAA,aAAA,CAAc,WAAA,GAAc,cAAc,WAAA,GAAc,CAAA;AACxD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,OAAO,cAAA,KAAuC;AACrE,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,wBAAwB,cAAc,CAAA;AAC7D,MAAA,YAAA,CAAa,SAAS,EAAE,EAAA,EAAI,cAAA,EAAgB,MAAA,EAAQ,EAAC,EAAE;AACvD,MAAA,IAAA,CAAK,OAAA,CAAQ,CAAC,MAAA,KAAW;AACvB,QAAA,IAAI,MAAA,CAAO,eAAe,CAAA,EAAG;AAC3B,UAAA,YAAA,CAAa,MAAA,CAAO,OAAO,KAAA,GAAQ,MAAA;AAAA,QACrC,CAAA,MAAO;AAEL,UAAA,IAAI,OAAO,QAAA,KAAa,MAAA,CAAO,SAAS,EAAA,IAAM,MAAA,CAAO,eAAe,CAAA,EAAG;AACrE,YAAA,YAAA,CAAa,MAAA,CAAO,OAAO,IAAA,GAAO,MAAA;AAAA,UACpC,CAAA,MAAO;AACL,YAAA,YAAA,CAAa,MAAA,CAAO,OAAO,KAAA,GAAQ,MAAA;AAAA,UACrC;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAA,SAAE;AAAA,IACF;AAAA,EACF,CAAA;AACA,EAAA,MAAM,uBAAA,GAA0B,OAAO,EAAA,EAAqB,QAAA,KAAoC;AAC9F,IAAA,MAAM,OAAA,GAAU,OAAO,EAAE,CAAA;AACzB,IAAA,MAAM,YAAY,OAAO,CAAA;AACzB,IAAA,MAAM,cAAA,GAAiB,MAAM,qBAAA,CAAsB,OAAA,EAAS,QAAQ,CAAA;AACpE,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,mBAAmB,cAAc,CAAA;AAAA,IACzC;AAAA,EACF,CAAA;AACA,EAAA,MAAM,qBAAqB,YAAY;AACrC,IAAA,IAAI,CAAC,QAAA,CAAS,MAAA,CAAO,EAAA,EAAI;AACzB,IAAA,MAAM,cAAA,GAAiB,MAAM,qBAAA,CAAsB,QAAA,CAAS,OAAO,EAAE,CAAA;AACrE,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,mBAAmB,cAAc,CAAA;AAAA,IACzC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,kBAAA,GAAqB,OAAO,EAAA,KAA2B;AAC3D,IAAA,MAAM,cAAA,GAAiB,OAAO,EAAE,CAAA;AAChC,IAAA,IAAI,YAAA,CAAa,MAAA,CAAO,EAAA,KAAO,cAAA,EAAgB;AAE/C,IAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,KAAA,EAAO,6BAA6B,cAAc,CAAA;AAClF,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,MAAM,IAAI,MAAM,gCAAO,CAAA;AAAA,IACzB;AAEA,IAAA,MAAM,iBAAiB,cAAc,CAAA;AAErC,IAAA,UAAA,EAAW;AACX,IAAA,MAAA,CAAO,KAAA,EAAO,4BAA4B,cAAc,CAAA;AAGxD,IAAA,IAAI;AACF,MAAA,IAAI,YAAA,CAAa,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO;AACpC,QAAA,WAAA,CAAY,YAAA,CAAa,MAAA,CAAO,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAAA,MACvD,CAAA,MAAA,IAAW,YAAA,CAAa,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO;AAC3C,QAAA,YAAA,CAAa,YAAA,CAAa,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAAA,MAC/C;AAAA,IACF,SAAS,CAAA,EAAG;AAAA,IAAC;AAEb,IAAA,MAAM,YAAY,cAAc,CAAA;AAAA,EAClC,CAAA;AACA,EAAA,MAAM,WAAA,GAAc,OAAO,cAAA,KAA2C;AACpE,IAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,KAAA,EAAO,uBAAuB,cAAc,CAAA;AAC5E,IAAA,IAAI,eAAe,KAAA,EAAO;AACxB,MAAA,MAAM,IAAI,MAAM,gCAAO,CAAA;AAAA,IACzB;AAEA,IAAA,IAAI,CAAC,YAAA,CAAa,QAAA,CAAS,cAAc,CAAA,EAAG;AAC1C,MAAA,cAAA,CAAe,cAAc,CAAA;AAAA,IAC/B;AACA,IAAA,IAAI,aAAa,QAAA,CAAS,cAAc,CAAA,CAAE,OAAA,CAAQ,WAAW,CAAA,EAAG;AAG9D,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,yBAAA,CAA0B;AAAA,QAC/C,MAAA,EAAQ,CAAA;AAAA,QACR,QAAA,EAAU,GAAA;AAAA,QACV;AAAA,OACD,CAAA;AACD,MAAA,YAAA,CAAa,QAAA,CAAS,cAAc,CAAA,CAAE,OAAA,GAAU,IAAA,CAAK,KAAA;AAOrD,MAAA,MAAA,CAAO,OAAO,mBAAA,GAAsB,YAAA,CAAa,QAAA,CAAS,cAAc,EAAE,OAAO,CAAA;AACjF,MAAA,MAAA,CAAO,OAAO,WAAA,IAAc;AAAA,IAC9B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,aAAa,MAAA,CAAO,MAAA;AAC7C,IAAA,IAAI,YAAA,CAAa,SAAS,YAAA,CAAa,MAAA,CAAO,EAAE,CAAA,CAAE,UAAA,IAAc,OAAO,OAAO,KAAA;AAC9E,IAAA,IAAI,OAAO,OAAO,KAAA;AAClB,IAAA,IAAI,OAAO,OAAO,KAAA;AAClB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACA,EAAA,MAAM,cAAc,OAClBA,QAAAA,EACA,KAAA,GAAQ,IACR,MAAA,KACG;AACH,IAAA,MAAM,cAAA,GAAiB,aAAa,MAAA,CAAO,EAAA;AAC3C,IAAA,IAAI,YAAA,CAAa,QAAA,CAAS,cAAc,CAAA,CAAE,OAAA,EAAS;AACnD,IAAA,IAAI,aAAoD,EAAA,EACtD,QAAA;AACF,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,QAAA,CAAS,cAAc,CAAA,CAAE,UAAA;AACzD,IAAA,IAAIA,QAAAA,EAAS;AACX,MAAA,UAAA,GAAaA,QAAAA;AACb,MAAA,QAAA,GAAW,KAAA;AAAA,IACb,CAAA,MAAO;AACL,MAAA,IAAI,UAAA,EAAY,IAAA,KAAS,CAAA,IAAK,UAAA,EAAY,SAAS,QAAA,EAAU;AAC3D,QAAA,UAAA,GAAa,UAAA,CAAW,QAAQ,QAAA,GAAW,IAAA;AAAA,MAC7C;AACA,MAAA,UAAA,GAAa,UAAA,GAAa,YAAA,CAAa,QAAA,CAAS,cAAc,CAAA,CAAE,OAAA;AAChE,MAAA,QAAA,GAAW,YAAA,CAAa,QAAA,CAAS,cAAc,CAAA,CAAE,KAAA;AAAA,IACnD;AACA,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,aAAa,MAAM,MAAA,CAAO,KAAA,EAAO,YAAA,GAAe,YAAY,QAAQ,CAAA;AAC1E,IAAA,IAAI,eAAe,KAAA,EAAO;AAE1B,IAAA,YAAA,CAAa,QAAA,CAAS,cAAc,CAAA,CAAE,OAAA,GAAU,IAAA;AAChD,IAAA,MAAM,eAAe,YAAA,EAAa;AAClC,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,cAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA;AAAA,MAEA,YAAY,YAAA,CAAa,QAAA;AAAA,MACzB,cAAc,YAAA,CAAa,UAAA;AAAA,MAC3B,UAAA,EAAY,CAAA;AAAA,MACZ,QAAA,EAAU,YAAA,CAAa,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,QAAA;AAAA,MAC1C,UAAA,EAAY,YAAA,CAAa,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,UAAA;AAAA,MAC5C,MAAA,EAAQ,OAAO,MAAA,CAAO,MAAA;AAAA,MACtB,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,MAAM,cAAcoC,eAAA,CAAS,MAAA,CAAO,MAAA,CAAO,MAAA,IAAU,EAAE,CAAA;AACvD,IAAA,MAAA,CAAO,MAAA,CAAO,aAAa,QAAA,CAAS,MAAA,EAAQpC,WAAU,EAAC,GAAI,UAAA,EAAY,MAAA,EAAQ,MAAM,CAAA;AACrF,IAAA,UAAA,CAAW,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA;AAE9C,IAAA,IAAI,CAACA,QAAAA,EAAS;AACZ,MAAA,UAAA,CAAW,EAAE,CAAA;AACb,MAAA,WAAA,CAAY,EAAE,CAAA;AACd,MAAA,aAAA,EAAc;AACd,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB;AACA,IAAA,IAAI;AACF,MAAA,MAAM,wBAAwB,UAAU,CAAA;AAExC,MAAA,MAAA,CAAO,OAAO,WAAA,IAAc;AAAA,IAC9B,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,QAAA,CAAS,cAAc,CAAA,CAAE,OAAA,GAAU,KAAA;AAAA,IAClD;AAAA,EACF,CAAA;AACA,EAAA,MAAM,gBAAgB,YAAY;AAChC,IAAA,OAAA,CAAQ,IAAI,0BAAM,CAAA;AAElB,IAAA,MAAM,gBAAA,CAAiB,YAAA,CAAa,MAAA,CAAO,EAAE,CAAA;AAAA,EAC/C,CAAA;AACA,EAAA,MAAM,uBAAA,GAA0B,CAAC,cAAA,EAAwC,KAAA,KAAqC;AAC5G,IAAA,MAAM,GAAA,GAAM,cAAc,IAAA,CAAK,KAAA,CAAM,UAAU,CAAC,IAAA,KAAS,IAAA,CAAK,EAAA,KAAO,cAAc,CAAA;AACnF,IAAA,IAAI,QAAQ,EAAA,EAAI;AAChB,IAAA,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,GAAQ,KAAA;AAAA,EACxC,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,cAAA,EAAwB,KAAA,KAAkB;AAC9D,IAAA,MAAM,WAAW,YAAA,CAAa,QAAA,CAAS,cAAc,CAAA,EAAG,WAAW,EAAC;AACpE,IAAA,OAAO,SAAS,aAAA,CAAc,CAAC,IAAA,KAAS,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EAC3D,CAAA;AACA,EAAA,MAAM,aAAA,GAAgB,CAAC,GAAA,KAA6B;AAClD,IAAA,IAAI,GAAA,CAAI,iBAAA,IAAqB,aAAA,CAAc,IAAA,CAAK,MAAM,MAAA,EAAQ;AAC5D,MAAA,uBAAA,CAAwB,GAAA,CAAI,cAAA,EAAgB,GAAA,CAAI,iBAAiB,CAAA;AAAA,IACnE;AACA,IAAA,kBAAA,CAAmB,IAAI,cAAc,CAAA;AACrC,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,CAAS,GAAA,CAAI,cAAc,CAAA,CAAE,OAAA;AAC3D,IAAA,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,KAAS,CAAA,GAAI,EAAE,GAAG,GAAA,EAAK,UAAA,EAAY,4CAAA,EAAU,GAAI,GAAG,CAAA;AAC7E,IAAA,YAAA,CAAa,QAAA,CAAS,GAAA,CAAI,cAAc,CAAA,CAAE,OAAA,GAAU,IAAA;AAAA,EACtD,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,GAAA,KAA6B;AACjD,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,CAAS,GAAA,CAAI,cAAc,CAAA,CAAE,OAAA;AAC3D,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,cAAA,EAAgB,IAAI,EAAE,CAAA;AACnD,IAAA,IAAI,QAAQ,EAAA,EAAI;AAChB,IAAA,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA;AAChB,IAAA,YAAA,CAAa,QAAA,CAAS,GAAA,CAAI,cAAc,CAAA,CAAE,OAAA,GAAU,IAAA;AAAA,EACtD,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,GAAA,KAA6B;AACpD,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,CAAS,GAAA,CAAI,cAAc,CAAA,CAAE,OAAA;AAC3D,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,cAAA,EAAgB,IAAI,EAAE,CAAA;AACnD,IAAA,IAAI,QAAQ,EAAA,EAAI;AAChB,IAAA,MAAMA,QAAAA,GAAU,SAAS,GAAG,CAAA;AAC5B,IAAA,YAAA,CAAa,QAAA,CAAS,GAAA,CAAI,cAAc,CAAA,CAAE,OAAA,GAAU,IAAA;AACpD,IAAA,IAAIA,QAAAA,EAAS,IAAA,KAAS,cAAA,IAAkBA,QAAAA,EAAS,SAAS,oBAAA,EAAsB;AAC9E,MAAA,QAAA,CAAS,GAAG,CAAA,GAAI,GAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,GAAG,CAAA,GAAI;AAAA,MACd,GAAGA,QAAAA;AAAA,MACH,UAAA,EAAYA,QAAAA,CAAQ,UAAA,IAAc,GAAA,CAAI,UAAA,IAAc,EAAA;AAAA,KACtD;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,GAAA,KAA6B;AAChD,IAAA,MAAM,QAAA,GAAW,YAAA,CAAa,QAAA,CAAS,GAAA,CAAI,cAAc,CAAA,CAAE,OAAA;AAC3D,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,cAAA,EAAgB,IAAI,EAAE,CAAA;AACnD,IAAA,IAAI,QAAQ,EAAA,EAAI;AAChB,IAAA,QAAA,CAAS,GAAG,IAAI,EAAE,GAAG,SAAS,GAAG,CAAA,EAAG,MAAM,MAAA,EAAU;AACpD,IAAA,YAAA,CAAa,QAAA,CAAS,GAAA,CAAI,cAAc,CAAA,CAAE,OAAA,GAAU,KAAA;AACpD,IAAA,eAAA,CAAgB,GAAA,CAAI,cAAA,EAAgB,GAAA,CAAI,EAAE,CAAA;AAAA,EAC5C,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,UAAA,KAAuC;AAC5D,IAAA,MAAM,cAAA,GAAiB,WAAW,IAAA,CAAK,cAAA;AACvC,IAAA,IAAI,CAAC,YAAA,CAAa,QAAA,CAAS,cAAc,GAAG,OAAA,EAAS;AACrD,IAAA,QAAQ,UAAA,CAAW,KAAK,IAAA;AAAM,MAC5B,KAAK,oBAAA;AACH,QAAA,aAAA,CAAc,WAAW,IAAI,CAAA;AAC7B,QAAA;AAAA,MACF,KAAK,cAAA;AACH,QAAA,YAAA,CAAa,WAAW,IAAI,CAAA;AAC5B,QAAA;AAAA,MACF,KAAK,sBAAA;AACH,QAAA,eAAA,CAAgB,WAAW,IAAI,CAAA;AAC/B,QAAA;AAAA,MACF,KAAK,kBAAA;AACH,QAAA,WAAA,CAAY,WAAW,IAAI,CAAA;AAC3B,QAAA;AAEA;AACJ,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA;AAAA,IACA,iBAAA;AAAA,IACA,kBAAA;AAAA,IACA,eAAA;AAAA,IACA,QAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,eAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA,uBAAA;AAAA,IACA,kBAAA;AAAA,IACA,kBAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACF;AACF;;;ADlvBA,YAAA,EAAA;;;AGzBO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,SAAS,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,YAAA,EAAA,EAAA,eAAA,CAAA,CAAA;AAAA,EACf,UAAU,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,aAAA,EAAA,EAAA,gBAAA,CAAA,CAAA;AAAA,EAChB,YAAY,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,eAAA,EAAA,EAAA,kBAAA,CAAA,CAAA;AAAA,EAClB,QAAQ,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AAAA,EACd,UAAU,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,aAAA,EAAA,EAAA,gBAAA,CAAA,CAAA;AAAA,EAChB,WAAW,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,cAAA,EAAA,EAAA,iBAAA,CAAA;AACnB,CAAA;ACIA,IAAO,wBAAQ,CAAC,EAAE,OAAA,EAAAA,QAAAA,EAAS,WAAU,KAAa;AAChD,EAAA,uBACEW,eAAAA,CAACC,SAAAA,EAAA,EAAK,UAAQ,IAAA,EACX,QAAA,EAAA;AAAA,IAAAZ,QAAAA,CAAQ,UAAA,oBACPa,cAAAA,CAACwB,YAAO,SAAA,EAAsB,OAAA,kBAASxB,cAAAA,CAACK,uBAAA,EAAe,OAAA,EAASlB,QAAAA,CAAQ,UAAA,EAAY,kBAAoC,CAAA,EAAI,CAAA;AAAA,IAE7HA,QAAAA,CAAQ,QAAA,EAAU,GAAA,CAAI,CAAC,yBACtBa,cAAAA;AAAA,MAACwB,QAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,OAAA;AAAA,QAEV,OAAA,EAAQ,YAAA;AAAA,QACR,SAAA;AAAA,QACA,yBACExB,cAAAA;AAAA,UAACyB,aAAA,CAAY,QAAA;AAAA,UAAZ;AAAA,YAEC,IAAA,EAAM;AAAA,cACJ,KAAK,IAAA,CAAK,OAAA;AAAA,cACV,MAAM,IAAA,CAAK,IAAA;AAAA,cACX,KAAK,IAAA,CAAK;AAAA;AACZ,WAAA;AAAA,UALK,IAAA,CAAK;AAAA;AAMZ,OAAA;AAAA,MAXG,IAAA,CAAK;AAAA,KAcb;AAAA,GAAA,EAoCH,CAAA;AAEJ,CAAA;;;ACvEO,IAAM,WAAA,GAAkD;AAAA,EAC7D,CAAA,EAAG,MAAA;AAAA,EACH,CAAA,EAAG,OAAA;AAAA,EACH,CAAA,EAAG;AACL,CAAA;;;ACKA,UAAA,EAAA;AAGA,YAAA,EAAA;;;ACbA,IAAAC,sBAAAA,GAAA;AAAA,EAAC,cAAA,EAAAC,8BAAAA;AAAA,EAOA,qBAAA,EAAAC,qCAAAA;AAAA,EAGA,eAAA,EAAAC,+BAAAA;AAAA,EAkBA,WAAA,EAAAC,2BAAAA;AAAA,EAMA,YAAA,EAAAC,4BAAAA;AAAA,EA2BA,YAAA,EAAAC,4BAAAA;AAAA,EAIc,WAAA,EAAAC,2BAAAA;AAAA,EAIA,mBAAA,EAAAC,mCAAAA;AAAA,EAWd,eAAA,EAAAC,+BAAAA;AAAA,EAGiB,WAAA,EAAAC,2BAAAA;AAAA,EAIA,kBAAA,EAAAC,kCAAAA;AAAA,EAGjB,eAAA,EAAAC,+BAAAA;AAAA,EAGA,UAAA,EAAAC,0BAAAA;AAAA,EASY,cAAA,EAAAC,8BAAAA;AAAA,EAUA,gBAAA,EAAAC,gCAAAA;AAAA,EAGZ,cAAA,EAAAC,8BAAAA;AAAA,EAIA,4BAAA,EAAAC,4CAAAA;AAAA,EAGA,8BAAA,EAAAC,8CAAAA;AAAA,EAGA,mBAAA,EAAAC,mCAAAA;AAAA,EAMqB,UAAA,EAAAC,0BAAAA;AAAA,EAAY,cAAA,EAAAC,8BAAAA;AAAA,EAGgB,kBAAA,EAAAC,kCAAAA;AAAA,EAAmB,wBAAA,EAAAC,wCAAAA;AAAA,EAGnB,kBAAA,EAAAC;AAAA,CAAA;AC3HlD,SAAS,oBAAoB,OAAA,EAI3B;AACA,EAAA,IAAI,IAAA,GAAO,OAAA;AACX,EAAA,MAAM,gBAA0B,EAAC;AACjC,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,MAAM,KAAA,GAAQ,yBAAA;AACd,EAAA,KAAA,MAAW,KAAA,IAAS,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3C,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAChC,IAAA,aAAA,CAAc,KAAK,SAAS,CAAA;AAC5B,IAAA,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAAA,EAClC;AAEA,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA;AAC/C,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,WAAA,CAAY,UAAU,CAAA;AAC9C,EAAA,IAAI,YAAY,OAAA,EAAS;AACvB,IAAA,MAAA,GAAS,QAAQ,KAAA,CAAM,SAAS,CAAA,CAAE,OAAA,CAAQ,WAAW,EAAE,CAAA;AACvD,IAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AAAA,EAChC;AAEA,EAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,aAAA,EAAe,aAAa,MAAA,EAAO;AACjE;AAEA,SAAS,mBAAA,CAAoB,OAAA,EAAiB,KAAA,EAAe,GAAA,EAAa;AACxE,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,KAAA;AAAA,IACA,0BAAUlD,cAAAA,CAACK,qBAAAA,EAAA,EAAe,SAAkB,gBAAA,EAAoC;AAAA,GAClF;AACF;AAEA,IAAO,0BAAQ,CAAC,EAAE,OAAA,EAAAlB,QAAAA,EAAS,WAAU,KAAa;AAChD,EAAA,MAAM,EAAE,WAAA,EAAa,aAAA,EAAe,WAAA,EAAY,GAAIgE,cAAQ,MAAM;AAChE,IAAA,IAAI,CAAChE,QAAAA,EAAS,UAAA,EAAY,OAAO,EAAE,WAAA,EAAa,EAAA,EAAI,aAAA,EAAe,EAAC,EAAG,WAAA,EAAa,EAAA,EAAG;AACvF,IAAA,OAAO,mBAAA,CAAoBA,SAAQ,UAAU,CAAA;AAAA,EAC/C,CAAA,EAAG,CAACA,QAAAA,EAAS,UAAU,CAAC,CAAA;AAExB,EAAA,IAAI,CAACA,SAAQ,UAAA,EAAY;AACvB,IAAA,uBACEa,eAACoD,eAAA,EAAA,EACC,QAAA,kBAAApD,eAACH,SAAAA,EAAA,EAAK,IAAA,EAAM,OAAA,EAAS,CAAA,EACvB,CAAA;AAAA,EAEJ;AACA,EAAA,uBACEG,cAAAA,CAACD,SAAAA,EAAA,EAAK,QAAA,EAAQ,MACZ,QAAA,kBAAAC,cAAAA;AAAA,IAACwB,QAAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,SAAA,EAAW6B,4BAAA,CAAW,EAAE,CAAC3B,sBAAAA,CAAO,cAAc,GAAGvC,QAAAA,CAAQ,IAAA,IAAQA,QAAAA,CAAQ,IAAA,KAAS,kBAAA,EAAoB,CAAA;AAAA,MACtG,OAAA,kBACEW,eAAAA,CAAAgB,mBAAAA,EAAA,EAEG,QAAA,EAAA;AAAA,QAAA,aAAA,CAAc,MAAA,GAAS,qBACtBd,cAAAA;AAAA,UAACe,aAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAK,IAAA;AAAA,YACL,IAAA,EAAK,OAAA;AAAA,YACL,gBAAA,EAAkB,cAAc,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM,CAAA,MAAA,EAAS,CAAC,CAAA,CAAE,CAAA;AAAA,YAC1D,KAAA,EAAO,aAAA,CAAc,GAAA,CAAI,CAAC,OAAA,EAAS,KAAA,KAAU,mBAAA,CAAoB,OAAA,EAAS,CAAA,wBAAA,CAAA,EAAQ,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,CAAC;AAAA;AAAA,SACrG;AAAA,QAID,+BACCf,cAAAA;AAAA,UAACe,aAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAK,IAAA;AAAA,YACL,IAAA,EAAK,OAAA;AAAA,YACL,gBAAA,EAAkB,CAAC,cAAc,CAAA;AAAA,YACjC,OAAO,CAAC,mBAAA,CAAoB,WAAA,EAAa,mCAAA,EAAY,cAAc,CAAC;AAAA;AAAA,SACtE;AAAA,wBASFf,cAAAA,CAACK,qBAAAA,EAAA,EAAe,OAAA,EAAS,aAAa,gBAAA,EAAoC;AAAA,OAAA,EAE5E;AAAA;AAAA,GAEJ,EACF,CAAA;AAEJ,CAAA;AF7EA,IAAO,uBAAA,GAAQ,CAAC,EAAE,YAAA,GAAe,OAAO,MAAA,GAAS,EAAE,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,IAAA,IAAO,KAA6B;AACtH,EAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,EAAA,MAAM,aAAA,GAAgBiD,kBAAA,CAAY,SAAA,CAAU,QAAQ,CAAA;AACpD,EAAA,MAAM,iBAAA,GAAoBA,kBAAA,CAAY,SAAA,CAAU,YAAY,CAAA;AAE5D,EAAA,MAAM,iBAAA,GAAoBH,cAAQ,MAAM;AACtC,IAAA,MAAM,QAAQ,EAAC;AACf,IAAA,IAAI,iBAAA,CAAkB,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM;AACxC,MAAA,KAAA,CAAM,IAAA,GAAO;AAAA,QACX,IAAA,EAAM,MAAA;AAAA,QACN,SAAA,EAAW,KAAA;AAAA,QACX,SAASI,gBAAA,CAAU,MAAM,IAAI,MAAA,GAAS,MAAA,EAAQ,wBAC5CvD,cAAAA;AAAA,UAACwD,iBAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,EAAA;AAAA,YACN,SAAA,EAAW,iBAAA,CAAkB,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,YAAA;AAAA,YACjD,QAAA,EAAU,iBAAA,CAAkB,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM;AAAA;AAAA,SAClD,GACE;AAAA,OACN;AAAA,IACF;AACA,IAAA,IAAI,iBAAA,CAAkB,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO;AACzC,MAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,QACZ,IAAA,EAAM,OAAA;AAAA,QACN,SAAA,EAAW,OAAA;AAAA,QACX,SAASD,gBAAA,CAAU,MAAM,IAAI,MAAA,GAAS,MAAA,EAAQ,SAC1C,EAAE,GAAA,EAAK,kBAAkB,MAAA,CAAO,MAAA,CAAO,OAAO,YAAA,EAAc,IAAA,kBAAMvD,cAAAA,CAACyD,oBAAA,EAAA,EAAe,GAAG,GACrF;AAAA,OACN;AAAA,IACF;AACA,IAAA,IAAI,iBAAA,CAAkB,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO;AACzC,MAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,QACZ,IAAA,EAAM,OAAA;AAAA,QACN,SAAA,EAAW,OAAA;AAAA,QACX,SAASF,gBAAA,CAAU,MAAM,IAAI,MAAA,GAAS,MAAA,EAAQ,SAC1C,EAAE,GAAA,EAAK,kBAAkB,MAAA,CAAO,MAAA,CAAO,OAAO,YAAA,EAAc,IAAA,kBAAMvD,cAAAA,CAACyD,oBAAA,EAAA,EAAe,GAAG,GACrF;AAAA,OACN;AAAA,IACF;AACA,IAAA,OAAO,KAAA;AAAA,EACT,GAAG,CAAC,iBAAA,CAAkB,MAAA,CAAO,MAAA,EAAQ,MAAM,CAAC,CAAA;AAE5C,EAAA,MAAM,WAAA,GAAcN,aAAAA;AAAA,IAClB,MAAM,iBAAA,CAAkB,QAAA,CAAS,kBAAkB,MAAA,CAAO,EAAE,KAAM,EAAC;AAAA,IACnE,CAAC,iBAAA,CAAkB,QAAA,CAAS,iBAAA,CAAkB,MAAA,CAAO,EAAE,CAAC;AAAA,GAC1D;AACA,EAAA,MAAM,eAAA,GAAkBA,aAAAA;AAAA,IACtB,MAAM;AAAA,MACJ;AAAA,QACE,GAAA,EAAK,aAAA;AAAA,QACL,OAAA,kBACErD,eAAAA,CAAC4D,UAAA,EAAA,EAAM,SAAA,EAAU,YAAW,IAAA,EAAM,EAAA,EAAI,SAAA,EAAWhC,sBAAAA,CAAO,eAAA,EACtD,QAAA,EAAA;AAAA,0BAAA1B,cAAAA;AAAA,YAAC2D,SAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAWN,4BAAAA,CAAW3B,sBAAAA,CAAO,WAAA,EAAa,QAAQ,CAAA;AAAA,cAClD,OAAA,EAAQ,YAAA;AAAA,cACR,IAAA,kBAAM1B,cAAAA,CAAC4D,WAAA,EAAA,EAAO,KAAA,EAAM,QAAA,EAAS,IAAA,EAAM,EAAA,EAAI,GAAA,EAAK,aAAA,CAAc,MAAA,CAAO,IAAA,EAAM,CAAA;AAAA,cACvE,KAAA,EAAO,CAAA,8BAAA,EAAQ,aAAA,CAAc,MAAA,CAAO,QAAQ,EAAE,CAAA,CAAA;AAAA,cAC9C,WAAA,kBAAa5D,cAAAA,CAAC,KAAA,EAAA,EAAI,uBAAA,EAAyB,EAAE,MAAA,EAAQ,aAAA,CAAc,MAAA,CAAO,WAAA,IAAe,EAAA,EAAG,EAAG;AAAA;AAAA,WACjG;AAAA,UACC,cAAc,MAAA,CAAO,MAAA,EAAQ,kBAAA,EAAoB,MAAA,GAAS,qBACzDA,cAAAA;AAAA,YAAC6D,SAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,QAAA;AAAA,cACV,IAAA,EAAI,IAAA;AAAA,cACJ,KAAA,EAAO;AAAA,gBACL;AAAA,kBACE,GAAA,EAAK,GAAA;AAAA,kBACL,KAAA,EAAO,qCAAA;AAAA,kBACP,QAAA,EAAU,cAAc,MAAA,CAAO,MAAA,CAAO,mBAAmB,GAAA,CAAI,CAAC,EAAE,QAAA,EAAS,MAAO;AAAA,oBAC9E,GAAA,EAAK,QAAA;AAAA,oBACL,6BACE7D,cAAAA,CAAC,MAAA,EAAA,EAAK,OAAA,EAAS,MAAM,SAAA,CAAU,WAAA,CAAY,QAAQ,CAAA,EAAG,WAAWqD,4BAAAA,CAAW3B,sBAAAA,CAAO,kBAAA,EAAoB,eAAe,GACnH,QAAA,EAAA,QAAA,EACH;AAAA,mBAEJ,CAAE;AAAA;AACJ;AACF;AAAA;AACF,SAAA,EAEJ,CAAA;AAAA,QAEF,OAAA,EAAS;AAAA;AACX,KACF;AAAA,IACA,CAAC,cAAc,MAAM;AAAA,GACvB;AAEA,EAAA,MAAM,YAAA,GAAeyB,aAAAA;AAAA,IACnB,MACE,WAAA,EAAa,YAAA,EAAc,MAAA,GACvB;AAAA,MACE;AAAA,QACE,GAAA,EAAK,cAAA;AAAA,QACL,yBACEnD,cAAAA;AAAA,UAAC6D,SAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,QAAA;AAAA,YACV,MAAA,EAAQ;AAAA,cACN,IAAA,EAAM;AAAA,gBACJ,QAAA,EAAU;AAAA;AACZ,aACF;AAAA,YACA,QAAA,EAAQ,IAAA;AAAA,YACR,KAAA,EAAO,WAAA,EAAa,YAAA,CAAa,GAAA,CAAI,CAAC,QAAA,MAAc;AAAA,cAClD,GAAA,EAAK,QAAA;AAAA,cACL,WAAA,kBAAa7D,cAAAA,CAAC,MAAA,EAAA,EAAK,OAAA,EAAS,MAAM,SAAA,CAAU,WAAA,CAAY,QAAQ,CAAA,EAAI,QAAA,EAAA,QAAA,EAAS;AAAA,aAC/E,CAAE;AAAA;AAAA,SACJ;AAAA,QAEF,OAAA,EAAS,YAAA;AAAA,QACT,QAAQ,EAAE,KAAA,EAAO,EAAE,UAAA,EAAY,UAAS;AAAE;AAC5C,QAEF,EAAC;AAAA,IACP,CAAC,aAAa,YAAY;AAAA,GAC5B;AAEA,EAAA,MAAM,WAAA,GAAcmD,cAAQ,MAAM;AAChC,IAAA,OAAA,CAAQ,aAAa,OAAA,IAAW,IAAI,GAAA,CAAI,CAAChE,UAAS,KAAA,KAAU;AAQ1D,MAAA,MAAM,IAAA,GAAO,kBAAkB,WAAA,CAAYA,QAAAA,CAAQ,OAAO,IAAI,CAAC,KAAM,EAAC;AACtE,MAAA,OAAO;AAAA,QACL,KAAKA,QAAAA,CAAQ,EAAA;AAAA,QACb,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,OAAA,EAAS,YAAA;AAAA,QACT,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,OAAA,EACE,KAAK,IAAA,KAAS,OAAA,mBACZa,cAAAA,CAAC,uBAAA,EAAA,EAAgB,SAASb,QAAAA,EAAgC,SAAA,EAAW,KAAK,SAAA,EAAW,CAAA,mBAErFa,cAAAA,CAAC,qBAAA,EAAA,EAAkB,SAASb,QAAAA,EAAgC,SAAA,EAAW,KAAK,SAAA,EAAW,CAAA;AAAA;AAAA,QAG3F,QAAQ,IAAA,CAAK,IAAA,KAAS,2BACpBW,eAAAA,CAACC,WAAA,EACC,QAAA,EAAA;AAAA,0BAAAC,cAAAA,CAACW,aAAA,EAAO,OAAA,EAAS,MAAM,IAAA,CAAKxB,QAAAA,CAAQ,UAAU,CAAA,EAAG,KAAA,EAAM,WAAU,OAAA,EAAQ,MAAA,EAAO,MAAK,OAAA,EAAQ,IAAA,kBAAMa,cAAAA,CAACa,kBAAAA,EAAA,EAAa,CAAA,EAAI,CAAA;AAAA,0BACrHb,cAAAA;AAAA,YAACW,WAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAOxB,QAAAA,CAAQ,WAAA,KAAgB,CAAA,GAAI,SAAA,GAAY,SAAA;AAAA,cAC/C,QAAA,EAAU,CAAC,CAACA,QAAAA,CAAQ,IAAA;AAAA,cACpB,IAAA,EAAK,OAAA;AAAA,cACL,OAAA,EAAQ,MAAA;AAAA,cACR,IAAA,kBAAMa,cAAAA,CAAC8D,kBAAA,EAAA,EAAa,CAAA;AAAA,cACpB,OAAA,EAAS,MAAM,SAAA,CAAU,QAAA,CAAS,iBAAA,CAAkB,OAAO,EAAA,EAAI3E,QAAAA,CAAQ,EAAA,EAAI,CAAA,EAAG,KAAK;AAAA;AAAA,WACrF;AAAA,0BACAa,cAAAA;AAAA,YAACW,WAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAOxB,QAAAA,CAAQ,WAAA,KAAgB,CAAA,GAAI,SAAA,GAAY,SAAA;AAAA,cAC/C,QAAA,EAAU,CAAC,CAACA,QAAAA,CAAQ,IAAA;AAAA,cACpB,IAAA,EAAK,OAAA;AAAA,cACL,OAAA,EAAQ,MAAA;AAAA,cACR,IAAA,kBAAMa,cAAAA,CAAC+D,qBAAA,EAAA,EAAgB,CAAA;AAAA,cACvB,OAAA,EAAS,MAAM,SAAA,CAAU,QAAA,CAAS,iBAAA,CAAkB,OAAO,EAAA,EAAI5E,QAAAA,CAAQ,EAAA,EAAI,CAAA,EAAG,KAAK;AAAA;AAAA;AACrF,SAAA,EAGF;AAAA;AAAA;AAAA;AAAA,OAKJ;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,WAAA,EAAa,OAAO,CAAC,CAAA;AAEzB,EAAA,MAAM,kBAAA,GAAqBgE,cAAQ,MAAM;AACvC,IAAA,MAAM,OAAA,GAAUjC,oBAAa,YAAY,CAAA;AACzC,IAAA,OAAO,OAAA,GACH;AAAA,MACE;AAAA,QACE,GAAA,EAAK,cAAA;AAAA,QACL,OAAA,kBAASlB,cAAAA,CAACgE,oBAAA,EAAA,EAAc,SAAS,YAAA,EAAc,CAAA;AAAA,QAC/C,SAAA,EAAW;AAAA;AAAA;AAEb,QAEF,EAAC;AAAA,EACP,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AACjB,EAAA,MAAM,eAAA,GAAkBb,cAAQ,MAAM;AACpC,IAAA,MAAM,OAAO,EAAC;AACd,IAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjC,MAAA,IAAA,CAAK,IAAA,CAAK,GAAG,kBAAkB,CAAA;AAAA,IACjC;AACA,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,IAAA,CAAK,IAAA,CAAK,GAAG,WAAA,EAAa,GAAG,YAAY,CAAA;AAAA,IAC3C;AACA,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,CAAC,GAAG,eAAe,CAAA;AAAA,EAC5B,GAAG,CAAC,WAAA,EAAa,YAAA,EAAc,eAAA,EAAiB,kBAAkB,CAAC,CAAA;AAEnE,EAAA,MAAM,OAAA,GAAUc,aAAmC,IAAI,CAAA;AAEvD,EAAA,MAAM,aAAA,GAAgBA,aAAO,IAAI,CAAA;AACjC,EAAA,MAAM,YAAA,GAAe,CAAC,EAAA,KAAY;AAChC,IAAA,MAAM,SAAS,EAAA,CAAG,MAAA;AAElB,IAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,YAAA,GAAe,MAAA,CAAO,YAAY,MAAA,CAAO,YAAA;AAEzE,IAAA,aAAA,CAAc,UAAU,gBAAA,GAAmB,GAAA;AAAA,EAC7C,CAAA;AACA,EAAA9D,gBAAU,MAAM;AAEd,IAAA,aAAA,CAAc,OAAA,GAAU,IAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,eAAA,CAAgB,MAAM,CAAC,CAAA;AAC3B,EAAAA,gBAAU,MAAM;AACd,IAAA,MAAM,EAAA,GAAK,QAAQ,OAAA,EAAS,aAAA;AAC5B,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,eAAA,CAAgB,MAAA,EAAQ;AAGpC,IAAA,IAAI,cAAc,OAAA,EAAS;AACzB,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,IAAI,cAAc,OAAA,EAAS;AACzB,UAAA,OAAA,CAAQ,SAAS,QAAA,CAAS;AAAA,YACxB,GAAA,EAAK,eAAA,CAAgB,eAAA,CAAgB,MAAA,GAAS,CAAC,CAAA,CAAE,GAAA;AAAA,YACjD,KAAA,EAAO;AAAA,WACR,CAAA;AAAA,QACH;AAAA,MACF,GAAG,GAAG,CAAA;AAAA,IACR;AAAA,EACF,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AACpB,EAAA,uBACEH,cAAAA;AAAA,IAACwB,QAAAA,CAAO,IAAA;AAAA,IAAP;AAAA,MACC,UAAA,EAAY,KAAA;AAAA,MAEZ,GAAA,EAAK,OAAA;AAAA,MACL,KAAA,EAAO,eAAA;AAAA,MACP,SAAA,EAAW6B,4BAAAA,CAAW3B,sBAAAA,CAAO,YAAA,EAAc,eAAe,gBAAgB,CAAA;AAAA,MAC1E,QAAA,EAAU;AAAA,KAAA;AAAA,IAJL,kBAAkB,MAAA,CAAO;AAAA,GAKhC;AAEJ,CAAA;;;AG9PA,YAAA,EAAA;;;ACFA,YAAA,EAAA;;;ACCA,YAAA,EAAA;AAGA,IAAO,wBAAQ,MAAM;AACnB,EAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,EAAA,MAAM,cAAA,GAAiB4B,kBAAAA,CAAY,SAAA,CAAU,SAAS,CAAA;AACtD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIpD,cAAAA,CAAS,eAAe,MAAM,CAAA;AAC5E,EAAA,uBACEF,cAAAA;AAAA,IAACkE,UAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,GAAA;AAAA,MACP,KAAA,EAAM,0BAAA;AAAA,MACN,YAAA,EAAc,KAAA;AAAA,MACd,MAAM,cAAA,CAAe,IAAA;AAAA,MACrB,UAAU,SAAA,CAAU,kBAAA;AAAA,MACpB,SAAS,cAAA,CAAe,OAAA;AAAA,MACxB,MAAA,EAAO,0BAAA;AAAA,MACP,IAAA,EAAM,MAAM,SAAA,CAAU,eAAA,CAAgB,eAAe,CAAA;AAAA,MACrD,gBAAgB,cAAA,CAAe,aAAA;AAAA,MAE/B,QAAA,kBAAAlE,eAAC,KAAA,EAAA,EAAI,SAAA,EAAW0B,uBAAO,mBAAA,EACrB,QAAA,kBAAA1B,eAACmE,QAAA,EAAA,EAAI,IAAA,EAAI,MAAC,MAAA,EAAQ,CAAC,IAAI,EAAE,CAAA,EAAG,WAAWzC,sBAAAA,CAAO,UAAA,EAC3C,yBAAe,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,qBACxB1B,eAACoE,QAAA,EAAA,EAAI,IAAA,EAAM,GACT,QAAA,kBAAAtE,eAAAA,CAACC,WAAA,EAAK,QAAA,EAAQ,MAAC,KAAA,EAAM,QAAA,EAAS,WAAW2B,sBAAAA,CAAO,cAAA,EAAgB,SAAS,MAAM,kBAAA,CAAmB,IAAI,CAAA,EACpG,QAAA,EAAA;AAAA,wBAAA1B,cAAAA;AAAA,UAAC4D,WAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWP,4BAAAA,CAAW3B,sBAAAA,CAAO,kBAAA,EAAoB,gBAAA,EAAkB;AAAA,cACjE,CAACA,sBAAAA,CAAO,wBAAwB,GAAG,eAAA,CAAgB,OAAO,IAAA,CAAK;AAAA,aAChE,CAAA;AAAA,YACD,IAAA,EAAM,EAAA;AAAA,YAEN,GAAA,kBAAK1B,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAK,IAAA,CAAK,IAAA,EAAM,KAAI,cAAA,EAAK;AAAA;AAAA,SACrC;AAAA,wBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAW0B,sBAAAA,CAAO,kBAAA,EAAqB,eAAK,aAAA,EAAc;AAAA,OAAA,EACjE,CAAA,EAAA,EAXiB,IAAA,CAAK,EAYxB,CACD,GAOH,CAAA,EACF;AAAA;AAAA,GACF;AAEJ,CAAA;AD5CA,IAAO,yBAAQ,MAAM;AACnB,EAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,EAAA,MAAM,aAAA,GAAgB4B,kBAAAA,CAAY,SAAA,CAAU,QAAQ,CAAA;AACpD,EAAA,MAAM,cAAA,GAAiBA,kBAAAA,CAAY,SAAA,CAAU,SAAS,CAAA;AACtD,EAAAnD,gBAAU,MAAM;AACd,IAAA,IAAI,cAAc,MAAA,CAAO,EAAA,IAAM,aAAA,CAAc,MAAA,CAAO,SAAS,CAAA,EAAG;AAC9D,MAAA,SAAA,CAAU,aAAA,CAAc,aAAA,CAAc,MAAA,CAAO,EAAE,CAAA;AAAA,IACjD;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,CAAc,MAAA,CAAO,EAAE,CAAC,CAAA;AAE5B,EAAA,OACE,eAAe,MAAA,CAAO,EAAA,oBACpBL,eAAAA,CAAAgB,qBAAA,EACE,QAAA,EAAA;AAAA,oBAAAd,eAAC,KAAA,EAAA,EAAI,KAAA,EAAM,cAAA,EACT,QAAA,kBAAAA,eAAC4D,WAAAA,EAAA,EAAO,OAAA,EAAS,SAAA,CAAU,mBAAmB,SAAA,EAAU,gBAAA,EAAiB,KAAK,cAAA,CAAe,MAAA,CAAO,MAAM,CAAA,EAC5G,CAAA;AAAA,IACC,cAAA,CAAe,IAAA,oBAAQ5D,cAAAA,CAAC,qBAAA,EAAA,EAAc;AAAA,GAAA,EACzC,CAAA;AAGN,CAAA;;;AElBA,YAAA,EAAA;AAGA,IAAO,2BAAQ,MAAM;AACnB,EAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,EAAA,MAAM,aAAA,GAAgBsD,kBAAAA,CAAY,SAAA,CAAU,QAAQ,CAAA;AACpD,EAAA,MAAM,kBAAA,GAAqBA,kBAAAA,CAAY,SAAA,CAAU,aAAa,CAAA;AAC9D,EAAA,MAAM,iBAAA,GAAoBA,kBAAAA,CAAY,SAAA,CAAU,YAAY,CAAA;AAE5D,EAAA,MAAM,gBAAA,GAAmBe,mBAAY,MAAM;AACzC,IAAA,SAAA,CAAU,gBAAA,CAAiB,aAAA,CAAc,MAAA,CAAO,EAAA,EAAI,CAAC,CAAA;AAAA,EACvD,GAAG,GAAG,CAAA;AAEN,EAAAlE,gBAAU,MAAM;AACd,IAAA,IAAI,aAAA,CAAc,OAAO,EAAA,EAAI;AAC3B,MAAA,gBAAA,EAAiB;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,aAAA,CAAc,OAAO,EAAA,EAAI,kBAAA,CAAmB,WAAW,CAAC,CAAA;AAE5D,EAAA,MAAM,gBAAA,GAAmBgD,cAAQ,MAAM;AACrC,IAAA,OAAO,mBAAmB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,IAAA,KAAS,KAAK,KAAK,CAAA;AAAA,EAClE,CAAA,EAAG,CAAC,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAC,CAAA;AAClC,EAAA,uBACEnD,cAAAA,CAAAc,mBAAAA,EAAA,EACE,QAAA,kBAAAd,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,EAAA,EAAG,eAAA,EAC5C,QAAA,EAAA,gBAAA,CAAiB,yBAChBA,cAAAA;AAAA,IAACsE,+BAAA;AAAA,IAAA;AAAA,MACC,YAAY,gBAAA,CAAiB,MAAA;AAAA,MAC7B,MAAM,MAAM;AACV,QAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAAA,MAEpB,CAAA;AAAA,MACA,OAAA,EAAS,KAAA;AAAA,MACT,wBACEtE,cAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EACb,0BAAAA,cAAAA,CAACH,SAAAA,EAAA,EAAK,SAAA,kBAAWG,eAACuE,kBAAA,EAAA,EAAa,IAAA,EAAI,MAAC,CAAA,EAAI,IAAA,EAAK,SAAQ,CAAA,EACvD,CAAA;AAAA,MAEF,KAAA,EAAO,EAAE,QAAA,EAAU,QAAA,EAAS;AAAA,MAC5B,gBAAA,EAAiB,eAAA;AAAA,MAEjB,QAAA,kBAAAvE,cAAAA;AAAA,QAACwE,eAAA;AAAA,QAAA;AAAA,UACC,WAAW9C,sBAAAA,CAAO,eAAA;AAAA,UAClB,KAAA,EAAO,gBAAA;AAAA,UACP,SAAA,EAAW,kBAAkB,MAAA,CAAO,EAAA;AAAA,UACpC,cAAA,EAAgB,OAAO,EAAA,KAAO,SAAA,CAAU,mBAAmB,EAAE,CAAA;AAAA,UAC7D,SAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM,CAAC,YAAA,MAAkB;AAAA,YACvB,KAAA,EAAO;AAAA,cACL;AAAA,gBACE,KAAA,EAAO,0BAAA;AAAA,gBACP,GAAA,EAAK,QAAA;AAAA,gBACL,IAAA,kBAAM1B,cAAAA,CAACyE,oBAAA,EAAA,EAAe,CAAA;AAAA,gBACtB,MAAA,EAAQ;AAAA;AACV,aACF;AAAA,YACA,OAAA,EAAS,CAAC,QAAA,KAAa;AACrB,cAAA,QAAA,CAAS,SAAS,eAAA,EAAgB;AAClC,cAAA,IAAI,QAAA,CAAS,QAAQ,QAAA,EAAU;AAC7B,gBAAA,SAAA,CAAU,eAAA,CAAgB,aAAa,EAAE,CAAA;AAAA,cAC3C;AAAA,YACF;AAAA,WACF;AAAA;AAAA;AACF;AAAA,GACF,mBAEAzE,cAAAA,CAACM,UAAAA,EAAA,EAAM,WAAA,EAAY,sCAAA,EAAS,KAAA,EAAOA,UAAAA,CAAM,sBAAA,EAAwB,CAAA,EAErE,CAAA,EACF,CAAA;AAEJ,CAAA;AHrEA,IAAO,qBAAQ,CAAC;AAAA,EACd,KAAA,GAAQ,IAAA;AAAA,EACR,QAAA,GAAW,KAAA;AAAA,EACX,kBAAA,GAAqB,IAAA;AAAA,EACrB,cAAA,GAAiB,IAAA;AAAA,EACjB,mBAAA,GAAsB;AACxB,CAAA,KAAwB;AACtB,EAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,EAAA,MAAM,aAAA,GAAgBgD,kBAAAA,CAAY,SAAA,CAAU,QAAQ,CAAA;AACpD,EAAA,MAAM,WAAA,GAAcA,kBAAAA,CAAY,SAAA,CAAU,MAAM,CAAA;AAChD,EAAA,uBACEtD,cAAAA,CAAAc,mBAAAA,EAAA,EACE,0BAAAhB,eAAAA,CAACC,SAAAA,EAAA,EAAK,OAAA,EAAQ,eAAA,EAAgB,KAAA,EAAM,QAAA,EAAS,SAAA,EAAW2B,uBAAO,YAAA,EAC7D,QAAA,EAAA;AAAA,oBAAA5B,gBAACC,SAAAA,EAAA,EAAK,GAAA,EAAK,CAAA,EAAG,OAAM,QAAA,EAClB,QAAA,EAAA;AAAA,sBAAAC,cAAAA;AAAA,QAACgE,oBAAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,KAAA;AAAA,UACT,gBAAA,kBACElE,eAAAA,CAAAgB,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAAd,cAAAA,CAAC4D,WAAAA,EAAA,EAAO,IAAA,EAAM,EAAA,EAAI,GAAA,EAAK,aAAA,CAAc,MAAA,CAAO,IAAA,EAAM,GAAA,EAAK,aAAA,CAAc,MAAA,CAAO,IAAA,EAAM,CAAA;AAAA,4BAClF5D,eAAC,KAAA,EAAA,EAAI,SAAA,EAAW0B,uBAAO,WAAA,EAAc,QAAA,EAAA,aAAA,CAAc,OAAO,IAAA,EAAK;AAAA,WAAA,EACjE;AAAA;AAAA,OAEJ;AAAA,MAAG;AAAA,KAAA,EACL,CAAA;AAAA,oBACA5B,eAAAA,CAAC4D,UAAAA,EAAA,EAAM,MAAM,CAAA,EACX,QAAA,EAAA;AAAA,sBAAA1D,eAACgE,oBAAAA,EAAA,EAAc,OAAA,EAAS,cAAA,EAAgB,kBAAkB,sBAAA,EAAgB,CAAA;AAAA,sBAC1EhE,cAAAA;AAAA,QAACgE,oBAAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,kBAAA;AAAA,UACT,gBAAA,kBACEhE,cAAAA,CAACW,WAAAA,EAAA,EAAO,KAAA,EAAM,0BAAA,EAAO,MAAK,MAAA,EAAO,IAAA,EAAK,SAAQ,IAAA,kBAAMX,eAAC0E,kBAAA,EAAA,EAAa,CAAA,EAAI,SAAS,MAAM,SAAA,CAAU,oBAAmB,EAAG;AAAA;AAAA,OAEzH;AAAA,sBAEA1E,cAAAA;AAAA,QAACgE,oBAAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,mBAAA;AAAA,UACT,kCACEhE,cAAAA;AAAA,YAACQ,YAAAA;AAAA,YAAA;AAAA,cACC,iBAAA,EAAmB,CAAC,CAAA,KAAM,CAAA;AAAA,cAC1B,SAAA,EAAU,QAAA;AAAA,cACV,UAAA,EAAY,EAAE,IAAA,EAAMkB,sBAAAA,CAAO,mBAAA,EAAoB;AAAA,cAC/C,OAAA,kBAAS1B,cAAAA,CAAC,wBAAA,EAAA,EAAiB,CAAA;AAAA,cAC3B,OAAA,EAAS,CAAC,OAAO,CAAA;AAAA,cAEjB,QAAA,kBAAAA,cAAAA,CAACW,WAAAA,EAAA,EAAO,OAAM,0BAAA,EAAO,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,IAAA,kBAAMX,cAAAA,CAAC2E,yBAAgB,CAAA,EAAI;AAAA;AAAA;AAC3E;AAAA,OAEJ;AAAA,sBAEA3E,cAAAA;AAAA,QAACgE,oBAAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,QAAA;AAAA,UACT,kCAAkBhE,cAAAA,CAACW,aAAA,EAAO,KAAA,EAAM,gBAAK,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,OAAA,EAAS,YAAY,KAAA,EAAO,aAAA,EAAe,sBAAMX,cAAAA,CAAC4E,uBAAc,CAAA,EAAI;AAAA;AAAA;AACpI,KAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ,CAAA;;;AIlEA,IAAAlD,sBAAAA,GAAA;AAAA,EAAC,aAAA,EAAAmD;AAAA,CAAA;ACoBD,IAAO,mBAAA,GAAQC,gBAAA,CAAW,CAAC,EAAE,gBAAA,GAAmB,EAAC,EAAG,QAAA,GAAW,EAAC,EAAG,QAAA,EAAU,WAAA,IAAsB,GAAA,KAAQ;AACzG,EAAA,MAAM,EAAE,OAAA,EAAA3F,QAAAA,EAAQ,GAAI4F,SAAI,MAAA,EAAO;AAC/B,EAAA,MAAM,WAAA,GAAcd,YAAAA,CAAoB,EAAE,CAAA;AAC1C,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAA,EAAkB,gBAAgB,CAAA,GAAIe,kBAAA,CAA4B,EAAE,CAAA;AAE1F,EAAA7E,gBAAU,MAAM;AACd,IAAA,IAAI,IAAA,CAAK,UAAU,QAAQ,CAAA,KAAM,KAAK,SAAA,CAAU,WAAA,CAAY,OAAO,CAAA,EAAG;AACpE,MAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AACtB,MAAA,MAAM,MAAA,GAAyB,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,QACrD,GAAG,IAAA;AAAA,QACH,KAAK,IAAA,CAAK,OAAA;AAAA,QACV,KAAK,IAAA,CAAK,OAAA;AAAA,QACV,MAAA,EAAQ;AAAA,OACV,CAAE,CAAA;AACF,MAAA,gBAAA,CAAiB,MAAM,CAAA;AAAA,IACzB;AAAA,EACF,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AACb,EAAAA,gBAAU,MAAM;AAEd,IAAA,MAAM,KAAA,GAAQ,aAAA,CACX,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,KAAW,MAAM,CAAA,CACvC,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,MAAA,MAAM,CAAA,GAAI,EAAE,GAAG,IAAA,EAAK;AACpB,MAAA,OAAO,CAAA,CAAE,MAAA;AACT,MAAA,OAAO,CAAA,CAAE,GAAA;AACT,MAAA,OAAO,CAAA,CAAE,IAAA;AACT,MAAA,OAAO,CAAA,CAAE,GAAA;AACT,MAAA,OAAO,CAAA;AAAA,IACT,CAAC,CAAA;AACH,IAAA,WAAA,CAAY,OAAA,GAAU,KAAA;AACtB,IAAA,QAAA,CAAS,KAAK,CAAA;AAAA,EAChB,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAClB,EAAA,MAAM,UAAA,GAAakE,kBAAAA,CAAY,CAAC,QAAA,KAAqB;AACnD,IAAAlF,QAAAA,CAAQ,MAAM,QAAQ,CAAA;AAAA,EACxB,GAAG,GAAG,CAAA;AAEN,EAAA,MAAM,gBAAA,GAAmB,CAAC,IAAA,KAA+C;AACvE,IAAA,OAAO,gBAAA,CAAiB,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,gBAAA,EAAkB,QAAA,CAAS8F,wBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA,CAAE,iBAAA,EAAmB,CAAC,CAAA;AAAA,EACxH,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAoB;AAG1C,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,GAAA,GAAM,iBAAiB,IAAI,CAAA;AAEjC,MAAA,IAAI,CAAC,GAAA,EAAK;AACR,QAAA,UAAA,CAAW,yDAAY,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,CAAA,CAAG,CAAA;AACjD,QAAA,OAAO,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,MAC7B;AAGA,MAAA,IAAIC,eAAA,CAAS,GAAA,CAAI,YAAY,CAAA,EAAG;AAC9B,QAAA,MAAM,eAAe,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,KAAM,IAAI,gBAAA,CAAiB,QAAA,CAASD,wBAAA,CAAkB,CAAA,CAAE,QAAQ,EAAE,CAAA,CAAE,iBAAA,EAAmB,CAAC,CAAA,CAAE,MAAA;AAErI,QAAA,IAAI,YAAA,GAAe,CAAA,GAAI,GAAA,CAAI,YAAA,EAAc;AACvC,UAAA,UAAA,CAAW,SAAI,IAAA,CAAK,IAAI,CAAA,mEAAA,EAAe,GAAA,CAAI,YAAY,CAAA,mBAAA,CAAM,CAAA;AAC7D,UAAA,OAAO,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAA;AACA,EAAA,MAAM,eAAA,GAAkB,OAAO,EAAE,IAAA,EAAK,KAAW;AAE/C,IAAA,MAAM,GAAA,GAAM,iBAAiB,IAAI,CAAA;AAEjC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,UAAA,CAAW,CAAA,sDAAA,EAAY,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAClC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAI,WAAA,IAAe,IAAA,CAAK,OAAO,GAAA,CAAI,WAAA,GAAc,OAAO,IAAA,EAAM;AAChE,MAAA,UAAA,CAAW,CAAA,iDAAA,EAAY,GAAA,CAAI,WAAW,CAAA,GAAA,CAAK,CAAA;AAC3C,MAAA;AAAA,IACF;AAEA,IAAA,gBAAA,CAAiB;AAAA,MACf,GAAG,gBAAA,EAAiB;AAAA,MACpB;AAAA,QACE,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,MAAA,EAAQ,WAAA;AAAA,QACR,OAAA,EAAS,EAAA;AAAA,QACT,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAM,IAAA,CAAK;AAAA;AACb,KACD,CAAA;AACD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAS;AAC9B,MAAA,QAAA,CAAS,MAAA,CAAO,QAAQ,IAAI,CAAA;AAC5B,MAAA,IAAI3D,eAAAA,CAAS,WAAW,CAAA,EAAG;AACzB,QAAA,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,OAAA,CAAQ,CAAC,GAAA,KAAQ;AACxC,UAAA,IAAI6D,oBAAA,CAAc,WAAA,CAAY,GAAG,CAAC,CAAA,EAAG;AACrC,UAAA,QAAA,CAAS,MAAA,CAAO,GAAA,EAAK,WAAA,CAAY,GAAG,CAAC,CAAA;AAAA,QACvC,CAAC,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,WAAW,QAAQ,CAAA;AAE1C,MAAA,gBAAA;AAAA,QACE,gBAAA,EAAiB,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM;AAC5B,UAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,IAAA,CAAK,GAAA,EAAK;AACtB,YAAA,OAAO,EAAE,GAAG,IAAA,EAAO,GAAA,EAAK,IAAA,CAAM,OAAA,EAAS,GAAA,EAAK,IAAA,CAAK,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,EAAE,IAAA,EAAK;AAAA,UACzF,CAAA,MAAO;AACL,YAAA,OAAO,CAAA;AAAA,UACT;AAAA,QACF,CAAC;AAAA,OACH;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,GAAA,CAAI,8CAAW,KAAK,CAAA;AAC5B,MAAA,gBAAA;AAAA,QACE,gBAAA,EAAiB,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM;AAC5B,UAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,IAAA,CAAK,GAAA,EAAK;AACtB,YAAA,OAAO,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,OAAA,EAAS,aAAa,0BAAA,EAAO;AAAA,UACtD,CAAA,MAAO;AACL,YAAA,OAAO,CAAA;AAAA,UACT;AAAA,QACF,CAAC;AAAA,OACH;AAAA,IACF;AAAA,EACF,CAAA;AACA,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAA0B;AAE1C,IAAA,gBAAA,CAAiB,aAAA,CAAc,OAAO,CAAC,CAAA,KAAM,EAAE,GAAA,KAAQ,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EAClE,CAAA;AACA,EAAAC,yBAAA;AAAA,IACE,GAAA;AAAA,IACA,OAAO;AAAA,MACL,cAAc,MAAM;AAClB,QAAA,MAAM,QAAQ,gBAAA,EAAiB;AAC/B,QAAA,MAAM,iBAAiB,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,WAAW,WAAW,CAAA;AACzE,QAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,UAAA,UAAA,CAAW,oEAAa,CAAA;AACxB,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,MAAM,aAAa,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,WAAW,OAAO,CAAA;AACjE,QAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,UAAA,UAAA,CAAW,8DAAY,CAAA;AACvB,UAAA,OAAO,KAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACF,CAAA;AAAA,IACA;AAAC,GACH;AAEA,EAAA,MAAM,SAAA,GAAYjC,cAAQ,MAAM;AAC9B,IAAA,MAAM,QAAA,GAAW,iBAAiB,OAAA,CAAQ,CAAC,QAAQ,GAAA,CAAI,gBAAA,IAAoB,EAAE,CAAA;AAC7E,IAAA,OAAO,QAAA,CAAS,MAAA,GAAS,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,GAAI,MAAA;AAAA,EAChD,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AACrB,EAAA,uBACEnD,cAAAA;AAAA,IAACyB,aAAAA;AAAA,IAAA;AAAA,MACC,WAAWC,sBAAAA,CAAO,aAAA;AAAA,MAClB,MAAA,EAAQ,SAAA;AAAA,MACR,QAAA,EAAU,IAAA;AAAA,MACV,aAAA,EAAe,eAAA;AAAA,MACf,YAAA,EAAc,CAAC,IAAA,EAAM,KAAA,KAAU,eAAe,KAAK,CAAA;AAAA,MACnD,KAAA,EAAO,aAAA;AAAA,MACP,QAAA;AAAA,MACA,WAAA,EAAa,CAAC,IAAA,KACZ,IAAA,KAAS,SACL,EAAE,KAAA,EAAO,8CAAU,GACnB;AAAA,QACE,IAAA,kBAAM1B,cAAAA,CAACqF,yBAAA,EAAA,EAAoB,CAAA;AAAA,QAC3B,KAAA,EAAO,0BAAA;AAAA,QACP,WAAA,kBACErF,cAAAA,CAAC,KAAA,EAAA,EACC,0BAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,0GAAiB,CAAA,EAExB;AAAA;AAEJ;AAAA,GAER;AAEJ,CAAC,CAAA;ACjKD,IAAO,kBAAA,GAAQ8E,gBAAAA;AAAA,EACb,CACE;AAAA,IACE,WAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAW,EAAC;AAAA,IACZ,UAAA,GAAa,KAAA;AAAA,IACb,OAAA,GAAU,KAAA;AAAA,IACV,eAAA;AAAA,IACA,gBAAA;AAAA,IACA,kBAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA,EAAAQ;AAAA,KAEF,GAAA,KACG;AACH,IAAA,MAAM,SAAA,GAAYrB,aAA8B,IAAI,CAAA;AACpD,IAAA,MAAM,EAAE,UAAA,EAAY,aAAA,KAAkBsB,mBAAA,CAAa,OAAA,IAAW,IAAI,eAAe,CAAA;AAEjF,IAAA,MAAM,eAAA,GAAA,CAAmBD,WAAAA,EAAY,MAAA,EAAQ,MAAA,IAAU,IAAI,CAAA,qBACzDtF,cAAAA,CAACwF,UAAA,EAAA,EAAM,GAAA,EAAK,CAAC,CAAC,QAAA,EAAU,UAAU,CAAC,UAAA,EACjC,QAAA,kBAAAxF,cAAAA,CAACW,WAAAA,EAAA,EAAO,IAAA,EAAK,MAAA,EAAO,sBAAMX,cAAAA,CAACyF,uBAAA,EAAA,EAAkB,CAAA,EAAI,SAAS,MAAM,kBAAA,CAAmB,CAAC,UAAU,GAAG,CAAA,EACnG,CAAA;AAGF,IAAA,MAAM,iBAAiBxB,YAAAA,EAAY;AACnC,IAAA,MAAM,YAAA,mBACJnE,eAAAA,CAAAgB,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAAd,cAAAA,CAAC0F,QAAA,CAAO,MAAA,EAAP,EAAc,KAAA,EAAM,4BAAO,IAAA,EAAM,UAAA,EAAY,YAAA,EAAc,kBAAA,EAC1D,QAAA,kBAAA1F,cAAAA;AAAA,QAAC,mBAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,cAAA;AAAA,UACL,QAAA;AAAA,UACA,QAAA,EAAU,gBAAA;AAAA,UACV,kBAAkBsF,WAAAA,CAAW,MAAA;AAAA,UAC7B,aAAaA,WAAAA,CAAW;AAAA;AAAA,OAC1B,EACF,CAAA;AAAA,MACC;AAAA,KAAA,EACH,CAAA;AAEF,IAAA,MAAM,WAAW,MAAM;AACrB,MAAA,IAAI,CAAC,cAAA,CAAe,OAAA,EAAS,gBAAgB,cAAA,CAAe,OAAA,CAAQ,cAAa,EAAG;AAClF,QAAA,MAAA,EAAO;AAAA,MACT;AAAA,IACF,CAAA;AAGA,IAAAF,yBAAAA;AAAA,MACE,GAAA;AAAA,MACA,OAAO;AAAA,QACL,KAAA,EAAO,CAAC,OAAA,KAA2C;AACjD,UAAA,SAAA,CAAU,OAAA,EAAS,MAAM,OAAO,CAAA;AAAA,QAClC;AAAA,OACF,CAAA;AAAA,MACA;AAAC,KACH;AAEA,IAAA,uBACEpF,cAAAA,CAAC2F,YAAA,EAAA,EAAW,KAAA,EAAO,IAAI,QAAA,EAAU,CAAC,OAAA,KAAY,aAAA,CAAc,IAAI,OAAO,CAAA,EAAA,CAAI,GACxE,QAAA,EAAA,CAAC,uBACA3F,cAAAA;AAAA,MAAC0F,QAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,SAAA;AAAA,QACL,KAAA,EAAO,UAAA;AAAA,QACP,MAAA,EAAQ,YAAA;AAAA,QACR,QAAA;AAAA,QACA,QAAA,EAAU,aAAA;AAAA,QACV,OAAA;AAAA,QACA,QAAA,EAAU,EAAE,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,QAInC,QAAA;AAAA,QACA,MAAA,EAAQ,CAAC,EAAE,UAAA,EAAW,KAAM;AAC1B,UAAA,MAAM,EAAE,UAAA,EAAY,aAAA,EAAc,GAAI,UAAA;AACtC,UAAA,uBACE5F,eAAAA,CAACC,SAAAA,EAAA,EAAK,UAAQ,IAAA,EACZ,QAAA,EAAA;AAAA,4BAAAD,eAAAA,CAACC,WAAA,EAAK,OAAA,EAAQ,iBAAgB,KAAA,EAAM,QAAA,EAAS,KAAK,EAAA,EAChD,QAAA,EAAA;AAAA,8BAAAD,eAAAA,CAACC,WAAA,EAAK,SAAA,EAAU,UAAS,GAAA,EAAK,CAAA,EAAG,OAAM,QAAA,EACpC,QAAA,EAAA;AAAA,gBAAA,eAAA;AAAA,gBACA,WAAA;AAAA,gBAAa;AAAA,eAAA,EAChB,CAAA;AAAA,8BACAC,cAAAA,CAACD,SAAAA,EAAA,EAAK,KAAA,EAAM,UAAU,QAAA,EAAA,OAAA,mBAAUC,cAAAA,CAAC,aAAA,EAAA,EAAc,oBAAKA,cAAAA,CAAC,UAAA,EAAA,EAAY,GAAG,cAAc,CAAA,EAAG;AAAA,aAAA,EACvF,CAAA;AAAA,YACC;AAAA,WAAA,EACH,CAAA;AAAA,QAEJ,CAAA;AAAA,QACA,OAAA,EAAS,KAAA;AAAA,QACT,aAAa,WAAA,IAAe;AAAA;AAAA,KAC9B,EAEJ,CAAA;AAAA,EAEJ;AACF,CAAA;;;AC9HA,YAAA,EAAA;;;ACJA,YAAA,EAAA;AAIA,IAAO,6BAAQ,MAAM;AACnB,EAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,EAAA,MAAM,aAAA,GAAgBsD,kBAAAA,CAAY,SAAA,CAAU,QAAQ,CAAA;AAEpD,EAAA,MAAM,SAAA,GAAYH,aAAAA;AAAA,IAChB,MACE,aAAA,CAAc,MAAA,CAAO,MAAA,EAAQ,QAAQ,MAAA,GAAS,CAAA,oBAC5CrD,eAAAA,CAACC,SAAAA,EAAA,EAAK,GAAA,EAAK,CAAA,EAAG,WAAU,iBAAA,EACtB,QAAA,EAAA;AAAA,sBAAAC,cAAAA,CAACW,aAAA,EAAO,QAAA,EAAQ,MAAC,KAAA,EAAM,SAAA,EAAU,OAAA,EAAQ,MAAA,EAAO,QAAA,EAAA,0BAAA,EAEhD,CAAA;AAAA,MACC,cAAc,MAAA,CAAO,MAAA,CAAO,OAAO,GAAA,CAAI,CAAC,6BACvCX,cAAAA;AAAA,QAACQ,YAAAA;AAAA,QAAA;AAAA,UAEC,yBACER,cAAAA;AAAA,YAAC4F,SAAA;AAAA,YAAA;AAAA,cACC,UAAA,EAAW,YAAA;AAAA,cACX,KAAA,EAAO,KAAA;AAAA,cACP,WAAWlE,sBAAAA,CAAO,UAAA;AAAA,cAClB,YAAY,QAAA,CAAS,KAAA;AAAA,cACrB,YAAY,CAAC,IAAA,qBACX1B,cAAAA,CAAC4F,SAAA,CAAK,MAAL,EAAU,OAAA,EAAS,MAAM,SAAA,CAAU,WAAA,CAAY,KAAK,QAAQ,CAAA,EAAG,WAAWlE,sBAAAA,CAAO,cAAA,EAC/E,eAAK,QAAA,EACR,CAAA;AAAA,cAEF,MAAA,kBACE1B,cAAAA,CAACD,SAAAA,EAAA,EAAK,SAAQ,KAAA,EAAM,SAAA,EAAW2B,sBAAAA,CAAO,gBAAA,EAAkB,QAAA,EAAA,8EAAA,EAExD;AAAA;AAAA,WAEJ;AAAA,UAEF,uBACE1B,cAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAWqD,4BAAAA,CAAW3B,sBAAAA,CAAO,eAAA,EAAiB,eAAe,CAAA;AAAA,cAC7D,aAAG,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA,wBAAA,EAAO,SAAS,IAAI,CAAA,kBAAA;AAAA;AAAA,WAAM;AAAA,UAG1D,QAAA,kBAAA1B,eAACW,WAAAA,EAAA,EAAO,OAAM,SAAA,EAAU,OAAA,EAAQ,QAAA,EAC7B,QAAA,EAAA,QAAA,CAAS,IAAA,EACZ;AAAA,SAAA;AAAA,QA3BK,QAAA,CAAS;AAAA,OA6BjB;AAAA,KAAA,EACH,CAAA;AAAA,IAEJ,CAAC,aAAA,CAAc,MAAA,CAAO,MAAA,EAAQ,MAAM;AAAA,GACtC;AACA,EAAA,OAAO,SAAA;AACT,CAAA;AD5CA,IAAOkF,mBAAAA,GAAQf,gBAAAA;AAAA,EACb,CAAC,EAAE,WAAA,EAAa,QAAA,GAAW,OAAO,aAAA,GAAgB,KAAA,EAAO,YAAA,GAAe,IAAI,WAAA,GAAc,KAAA,EAAO,OAAA,GAAU,IAAA,IAAQ,GAAA,KAAQ;AACzH,IAAA,MAAM,YAAY,YAAA,EAAa;AAE/B,IAAA,MAAM,aAAA,GAAgBxB,kBAAAA,CAAY,SAAA,CAAU,QAAQ,CAAA;AACpD,IAAA,MAAM,iBAAA,GAAoBA,kBAAAA,CAAY,SAAA,CAAU,YAAY,CAAA;AAE5D,IAAA,MAAM,WAAA,GAAcH,aAAAA;AAAA,MAClB,MAAM,iBAAA,CAAkB,QAAA,CAAS,kBAAkB,MAAA,CAAO,EAAE,KAAM,EAAC;AAAA,MACnE,CAAC,iBAAA,CAAkB,QAAA,CAAS,iBAAA,CAAkB,MAAA,CAAO,EAAE,CAAC;AAAA,KAC1D;AACA,IAAA,MAAM,eAAA,GAAkB,CAAC,GAAA,KAAgB;AACvC,MAAA,IAAI,aAAa,OAAA,EAAS;AAC1B,MAAA,SAAA,CAAU,WAAW,GAAG,CAAA;AACxB,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,SAAA,CAAU,WAAA,EAAY;AAAA,MACxB,GAAG,EAAE,CAAA;AAAA,IACP,CAAA;AAEA,IAAA,uBACErD,eAAAA,CAACC,SAAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,KAAK,CAAA,EAElB,QAAA,EAAA;AAAA,sBAAAC,eAACgE,oBAAAA,EAAA,EAAc,OAAA,EAAS,OAAA,EAAS,kBAAkB,0BAAA,EAAoB,CAAA;AAAA,sBACvEhE,cAAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,GAAA;AAAA,UACA,WAAA;AAAA,UACA,SAAS,WAAA,CAAY,OAAA;AAAA,UACrB,UAAU,WAAA,CAAY,KAAA;AAAA,UACtB,YAAY,WAAA,CAAY,UAAA;AAAA,UACxB,SAAS,WAAA,CAAY,OAAA;AAAA,UACrB,iBAAiB,SAAA,CAAU,UAAA;AAAA,UAC3B,kBAAkB,SAAA,CAAU,WAAA;AAAA,UAC5B,oBAAoB,SAAA,CAAU,aAAA;AAAA,UAC9B,MAAA,EAAQ,MAAM,SAAA,CAAU,WAAA,EAAY;AAAA,UACpC,UAAU,SAAA,CAAU,aAAA;AAAA,UACpB,OAAA,EAAS,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,aAAA;AAAA,UACjC,UAAA,EAAY;AAAA,YACV,MAAA,EAAQ,aAAA,CAAc,MAAA,CAAO,MAAA,EAAQ;AAAA,WACvC;AAAA,UACA,YAAA;AAAA,UACA,kCAAkBA,cAAAA,CAACgE,oBAAAA,EAAA,EAAc,SAAS,WAAA,EAAa,CAAA;AAAA,UACvD,WAAA,kBACElE,eAAAA,CAAAgB,mBAAAA,EAAA,EACG,QAAA,EAAA;AAAA,YAAA,aAAA,CAAc,MAAA,CAAO,OAAA,EAAS,SAAA,oBAC7Bd,cAAAA;AAAA,cAACW,WAAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,OAAA;AAAA,gBACL,KAAA,EAAO,aAAA,CAAc,MAAA,CAAO,SAAA,KAAc,MAAM,SAAA,GAAY,SAAA;AAAA,gBAC5D,OAAA,EAAQ,QAAA;AAAA,gBACR,OAAA,EAAS,MAAM,SAAA,CAAU,iBAAA,CAAkB,EAAE,SAAA,EAAW,aAAA,CAAc,MAAA,CAAO,SAAA,KAAc,GAAA,GAAM,GAAA,GAAM,GAAA,EAAK,CAAA;AAAA,gBAC7G,QAAA,EAAA;AAAA;AAAA,aAED;AAAA,YAED,aAAA,CAAc,MAAA,CAAO,OAAA,EAAS,YAAA,oBAC7BX,cAAAA;AAAA,cAACW,WAAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,OAAA;AAAA,gBACL,KAAA,EACE,WAAA,EAAa,UAAA,GACT,8MAAA,GACA,oNAAA;AAAA,gBAEN,KAAA,EAAM,OAAA;AAAA,gBACN,IAAA,kBAAMX,cAAAA,CAAC8F,wBAAA,EAAA,EAAmB,CAAA;AAAA,gBAC1B,KAAA,EAAO,WAAA,EAAa,UAAA,GAAa,SAAA,GAAY,SAAA;AAAA,gBAC7C,OAAA,EAAQ,QAAA;AAAA,gBACR,SAAS,MAAM;AACb,kBAAA,SAAA,CAAU,aAAA,GAAgB,CAAC,WAAA,EAAa,UAAU,CAAA;AAAA,gBACpD,CAAA;AAAA,gBACD,QAAA,EAAA;AAAA;AAAA,aAED;AAAA,4BAEF9F,cAAAA,CAACgE,oBAAAA,EAAA,EAAc,SAAS,QAAA,EAAU;AAAA,WAAA,EACpC,CAAA;AAAA,UAEF,6BACEhE,cAAAA;AAAA,YAAC0F,QAAAA,CAAO,MAAA;AAAA,YAAP;AAAA,cACC,uBACE5F,eAAAA,CAACC,SAAAA,EAAA,EAAK,KAAK,CAAA,EACT,QAAA,EAAA;AAAA,gCAAAC,eAAC+F,mBAAA,EAAA,EAAc,CAAA;AAAA,gCACf/F,cAAAA,CAACoD,eAAAA,CAAW,IAAA,EAAX,EAAgB,IAAA,EAAK,WAAA,EAAY,QAAA,EAAQ,IAAA,EACvC,QAAA,EAAA,WAAA,EAAa,UAAA,EAAY,OAAA,EAAS,IAAA,EACrC;AAAA,eAAA,EACF,CAAA;AAAA,cAEF,IAAA,EAAM,CAAC,CAAC,WAAA,EAAa,YAAY,OAAA,EAAS,IAAA;AAAA,cAC1C,YAAA,EAAc,MAAM,SAAA,CAAU,aAAA,EAAc;AAAA,cAC5C,UAAA,EAAY;AAAA,gBACV,QAAQ1B,sBAAAA,CAAO,4BAAA;AAAA,gBACf,OAAA,EAASR,mBAAAA,CAAa,aAAa,CAAA,GAAI,KAAKQ,sBAAAA,CAAO;AAAA,eACrD;AAAA,cAEA,QAAA,kBAAA1B,cAAAA;AAAA,gBAACgE,oBAAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,aAAA;AAAA,kBACT,gBAAA,kBACEhE,cAAAA,CAACD,SAAAA,EAAA,EAAK,GAAA,EAAK,CAAA,EACR,QAAA,EAAA,CAAC,0BAAA,EAAQ,0BAAM,CAAA,CAAE,GAAA,CAAI,CAAC,wBACrBD,eAAAA,CAACa,WAAAA,EAAA,EAAiB,KAAA,EAAM,SAAA,EAAU,OAAA,EAAQ,QAAA,EAAS,OAAA,EAAS,MAAM,eAAA,CAAgB,GAAG,CAAA,EAClF,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,oBAAI;AAAA,mBAAA,EAAA,EADM,GAEb,CACD,CAAA,EACH;AAAA;AAAA;AAEJ;AAAA;AACF;AAAA;AAEJ,KAAA,EACF,CAAA;AAAA,EAEJ;AACF,CAAA;;;AEvHA,YAAA,EAAA;AAGA,IAAO,iCAAQ,MAAM;AACnB,EAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,EAAA,MAAM,aAAA,GAAgB2C,kBAAAA,CAAY,SAAA,CAAU,QAAQ,CAAA;AAEpD,EAAA,uBACExD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,MAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,gBAACC,SAAAA,EAAA,EAAK,KAAA,EAAM,QAAA,EAAS,KAAK,CAAA,EACxB,QAAA,EAAA;AAAA,sBAAAC,cAAAA,CAAC4D,aAAA,EAAO,IAAA,EAAM,IAAI,GAAA,EAAK,aAAA,CAAc,OAAO,IAAA,EAAM,CAAA;AAAA,sBAClD5D,eAAC,MAAA,EAAA,EAAK,SAAA,EAAW0B,uBAAO,cAAA,EAAiB,QAAA,EAAA,aAAA,CAAc,OAAO,IAAA,EAAK;AAAA,KAAA,EACrE,CAAA;AAAA,oBACA1B,cAAAA;AAAA,MAACW,WAAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAK,IAAA;AAAA,QACL,IAAA,EAAK,SAAA;AAAA,QACL,KAAA,EAAM,OAAA;AAAA,QACN,OAAA,EAAS,MAAM,SAAA,CAAU,kBAAA,EAAmB;AAAA,QAC5C,SAAA,EAAW0C,6BAAW,QAAQ,CAAA;AAAA,QAC9B,IAAA,kBAAMrD,cAAAA,CAAC0E,kBAAAA,EAAA,EAAa,CAAA;AAAA,QACrB,QAAA,EAAA;AAAA;AAAA;AAED,GAAA,EACF,CAAA;AAEJ,CAAA;ACrBA,IAAO,6BAAA,GAAQ,CAAC,EAAE,MAAA,EAAO,KAAkC;AACzD,EAAA,uBACE5E,eAAAA,CAACC,SAAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,SAAA,EAAWsD,4BAAAA,CAAW,aAAA,EAAe3B,sBAAAA,CAAO,qBAAqB,CAAA,EAC9E,QAAA,EAAA;AAAA,oBAAA1B,eAACgE,oBAAAA,EAAA,EAAc,OAAA,EAAS,MAAA,EAAQ,kBAAkB,8BAAA,EAAwB,CAAA;AAAA,oBAC1EhE,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eACb,QAAA,kBAAAA,cAAAA,CAAC,4BAAiB,CAAA,EACpB;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;;;ACjBA,IAAA0B,sBAAAA,GAAA;AAAA,EAAC,eAAA,EAAAsE,+BAAAA;AAAA,EAIiB,oBAAA,EAAAC,oCAAAA;AAAA,EAIjB,kBAAA,EAAAC,kCAAAA;AAAA,EAMA,kBAAA,EAAAC,kCAAAA;AAAA,EAKA,YAAA,EAAAC;AAAA,CAAA;ApBsCD,IAAO,eAAA,GAAQtB,gBAAAA,CAA8B,CAAC,EAAE,KAAA,EAAO,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAO,EAAU,GAAA,KAAQ;AAC/G,EAAA,MAAM,YAAY3B,aAAAA,CAAQ,MAAM,eAAA,EAAgB,EAAG,EAAE,CAAA;AACrD,EAAA,MAAM,YAAYc,YAAAA,EAAyB;AAE3C,EAAAoC,oBAAA,CAAc,MAAM;AAClB,IAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,MAAA,SAAA,CAAU,kBAAA,CAAmB,OAAO,cAAc,CAAA;AAClD,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAA,EAAQ,UAAA,IAAc,MAAA,EAAQ,YAAA,KAAiB,CAAA,EAAG;AACpD,MAAA,SAAA,CAAU,uBAAA,CAAwB,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,oBAAoB,CAAA;AAAA,IAClF;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACX,EAAAlG,gBAAU,MAAM;AACd,IAAA,SAAA,CAAU,YAAY,QAAQ,CAAA;AAAA,EAChC,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AACb,EAAAA,gBAAU,MAAM;AAEd,IAAA,SAAA,CAAU,SAAA,CAAU,MAAA,EAAQ,MAAA,EAAQ,YAAY,CAAA;AAAA,EAClD,CAAA,EAAG,CAAC,MAAA,EAAQ,MAAA,EAAQ,YAAY,CAAC,CAAA;AACjC,EAAAA,gBAAU,MAAM;AAEd,IAAA,SAAA,CAAU,gBAAgB,MAAM,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACX,EAAAA,gBAAU,MAAM;AAEd,IAAA,SAAA,CAAU,SAAS,KAAK,CAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,aAAA,GAAgBmD,kBAAAA,CAAY,SAAA,CAAU,QAAQ,CAAA;AACpD,EAAA,MAAM,WAAA,GAAcA,kBAAAA,CAAY,SAAA,CAAU,MAAM,CAAA;AAChD,EAAA8B,yBAAAA;AAAA,IACE,GAAA;AAAA,IACA,OAAO;AAAA,MACL,aAAa,SAAA,CAAU,WAAA;AAAA,MACvB,yBAAyB,SAAA,CAAU,uBAAA;AAAA,MACnC,oBAAoB,SAAA,CAAU,kBAAA;AAAA,MAC9B,oBAAoB,SAAA,CAAU,kBAAA;AAAA,MAC9B,eAAe,SAAA,CAAU,aAAA;AAAA,MACzB,YAAY,SAAA,CAAU,UAAA;AAAA,MACtB,UAAU,SAAA,CAAU,WAAA;AAAA,MACpB,WAAA,EAAa,CAAC,OAAA,KAAY;AACxB,QAAA,SAAA,CAAU,OAAA,EAAS,MAAM,OAAO,CAAA;AAAA,MAClC;AAAA,KACF,CAAA;AAAA,IACA;AAAC,GACH;AACA,EAAA,MAAM,UAAA,GAAajC,cAAQ,MAAM;AAC/B,IAAA,OACEjC,mBAAAA,CAAa,WAAA,CAAY,MAAA,CAAO,OAAgC,MAC/D,CAAC,CAAE,WAAA,CAAY,OAAA,CAAQ,KAAqB,OAAA,IAAW,CAAC,CAAE,WAAA,CAAY,QAAQ,IAAA,CAAsB,OAAA,CAAA;AAAA,EAEzG,CAAA,EAAG,CAAC,WAAA,CAAY,MAAA,CAAO,SAAS,WAAA,CAAY,OAAA,CAAQ,IAAI,CAAC,CAAA;AAGzD,EAAA,MAAM,CAAC,OAAO,QAAQ,CAAA,GAAIhB,eAAS,CAAC,CAAA,EAAG,MAAM,CAAC,CAAA;AAC9C,EAAA,MAAM,gBAAA,GAAmB,CAACoG,MAAAA,KAA+B;AACvD,IAAA,QAAA,CAASA,MAAK,CAAA;AAAA,EAChB,CAAA;AACA,EAAAnG,gBAAU,MAAM;AACd,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,gBAAA,CAAiB,CAAC,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,IACjC,CAAA,MAAO;AACL,MAAA,gBAAA,CAAiB,CAAC,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAAoG,mBAAA,CAAa;AAAA,IACX,GAAA,EAAKC,uBAAgB,CAAA,6CAAA,EAAgDC,eAAA,EAAU,CAAA,CAAA,EAAIC,kBAAA,EAAY,GAAI,cAAA,GAAiB,EAAE,CAAA;AAAA,IACtH,WAAW,SAAA,CAAU,aAAA;AAAA,IACrB,eAAA,EAAiB,KAAA;AAAA,IACjB,iBAAA,EAAmB;AAAA,GACpB,CAAA;AAED,EAAAvG,gBAAU,MAAM;AACd,IAAA,WAAA,CAAY,OAAO,YAAA,IAAe;AAAA,EACpC,CAAA,EAAG,EAAE,CAAA;AACL,EAAA,uBACEH,cAAAA,CAAC2G,WAAA,EAAA,EAAU,KAAA,EAAO,EAAE,MAAA,EAAQ,IAAA,EAAM,GAAG,KAAA,IACnC,QAAA,kBAAA3G,cAAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAO,WACnB,QAAA,kBAAAA,cAAAA,CAACH,SAAAA,EAAA,EAAK,UAAU,aAAA,CAAc,OAAA,EAAS,gBAAA,EAAiB,WAAA,EACtD,0BAAAC,eAAAA,CAACC,SAAAA,EAAA,EAAK,QAAA,EAAQ,MAAC,SAAA,EAAWsD,4BAAAA,CAAW3B,sBAAAA,CAAO,YAAA,EAAc,aAAa,CAAA,EAErE,QAAA,EAAA;AAAA,oBAAA1B,cAAAA,CAACgE,sBAAA,EAAc,OAAA,EAAS,YAAY,MAAA,CAAO,YAAA,EAAc,kBAAkB,kBAAA,EAAY,CAAA;AAAA,oBACvFlE,eAAAA,CAACC,SAAAA,EAAA,EAAK,WAAU,aAAA,EACd,QAAA,EAAA;AAAA,sBAAAC,eAACgE,oBAAAA,EAAA,EAAc,OAAA,EAAS,WAAA,CAAY,OAAO,SAAA,EAAW,CAAA;AAAA,sBAEtDhE,eAACgE,oBAAAA,EAAA,EAAc,SAAS,WAAA,CAAY,MAAA,CAAO,gBAAA,EAAkB,gBAAA,EAAkB,6BAAA,EAAuB,CAAA;AAAA,sBACtGlE,eAAAA,CAAC8G,aAAA,EAAA,EAAS,SAAA,EAAU,QAAA,EAAS,UAAU,gBAAA,EACrC,QAAA,EAAA;AAAA,wBAAA5G,eAAC4G,aAAA,CAAS,KAAA,EAAT,EAAe,WAAA,EAAa,OAAO,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,EACxD,QAAA,EAAA,UAAA,oBACC9G,eAAAA,CAAAgB,qBAAA,EACI,QAAA,EAAA;AAAA,UAAA,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAqB,OAAA,oBACzChB,eAAAA,CAACC,WAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,SAAA,EAAU,aAAA,EACvB,QAAA,EAAA;AAAA,4BAAAD,eAAAA,CAACC,SAAAA,EAAA,EAAK,OAAA,EAAQ,eAAA,EAAgB,KAAA,EAAM,QAAA,EAAS,GAAA,EAAK,EAAA,EAAI,SAAA,EAAW2B,sBAAAA,CAAO,eAAA,EACtE,QAAA,EAAA;AAAA,8BAAA1B,cAAAA,CAAC,SAAI,SAAA,EAAW0B,sBAAAA,CAAO,sBAAuB,QAAA,EAAA,WAAA,CAAY,OAAA,CAAQ,KAAK,QAAA,EAAS,CAAA;AAAA,8BAChF5B,gBAACC,SAAAA,EAAA,EAAK,KAAK,CAAA,EAAG,OAAA,EAAQ,QAAA,EAAS,KAAA,EAAM,QAAA,EACnC,QAAA,EAAA;AAAA,gCAAAC,cAAAA;AAAA,kBAACW,WAAAA;AAAA,kBAAA;AAAA,oBACC,KAAA,EAAM,SAAA;AAAA,oBACN,OAAA,EAAQ,UAAA;AAAA,oBACR,OAAA,EAAS,MAAM1B,mBAAAA,CAAc,WAAA,CAAY,OAAA,CAAQ,KAAqB,OAAA,EAAS,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,oBACjH,QAAA,EAAA;AAAA;AAAA,iBAED;AAAA,gCACAe,eAACW,WAAAA,EAAA,EAAO,SAAS,MAAM,SAAA,CAAU,UAAA,EAAW,EAAG,QAAA,EAAA,cAAA,EAAE;AAAA,eAAA,EACnD;AAAA,aAAA,EACF,CAAA;AAAA,4BACAX,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eACb,QAAA,kBAAAA,cAAAA;AAAA,cAAC6G,kBAAA;AAAA,cAAA;AAAA,gBACE,GAAI,YAAY,OAAA,CAAQ,IAAA;AAAA,gBACzB,SAAA,EAAW;AAAA,kBACT,eAAA,EAAiB;AAAA;AACnB;AAAA,aACF,EACF;AAAA,WAAA,EACF,CAAA;AAAA,UAEA,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAsB,OAAA,oBAC1C7G,cAAAA;AAAA,YAACU,qBAAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAQ,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAsB,OAAA;AAAA,cAElD,OAAA,EAAS,CAAC,IAAA,KAAS;AACjB,gBAAA,SAAA,CAAU,aAAA,CAAc;AAAA,kBACtB,IAAA,EAAM,CAAA;AAAA,kBACN,OAAA,EAAS;AAAA,oBACP,IAAA,EAAM,IAAA;AAAA,oBACN,QAAA,EAAU;AAAA,mBACZ;AAAA,kBACA,MAAA,EAAQ;AAAA,oBACN,OAAA,EAAS;AAAA;AACX,iBACD,CAAA;AAAA,cACH,CAAA;AAAA,cACA,cAAA,EAAgB,CAAC,OAAA,EAAS,IAAA,KAAS,UAAA,CAAW,SAAS,WAAA,CAAY,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AAAA,cAC9F,QAAA,kBACEV,cAAAA,CAAAc,mBAAAA,EAAA,EACE,0BAAAd,cAAAA,CAACS,QAAAA,EAAA,EAAI,QAAA,EAAU,KAAA,EAAO,KAAA,EAAM,WAAU,SAAA,EAAU,gBAAA,EAAiB,OAAA,EAAS,MAAM,SAAA,CAAU,UAAA,EAAW,EACnG,QAAA,kBAAAT,cAAAA,CAAC4E,mBAAAA,EAAA,EAAc,CAAA,EACjB,CAAA,EACF;AAAA;AAAA;AAUJ,SAAA,EAEJ,CAAA,EAEJ,CAAA;AAAA,wBAEA5E,cAAAA,CAAC4G,aAAA,CAAS,KAAA,EAAT,EAAe,aAAa,KAAA,EAAO,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,IAAA,EAAM,MAAM,CAAC,CAAA,EACnE,QAAA,kBAAA9G,eAAAA,CAACC,SAAAA,EAAA,EAAK,UAAQ,IAAA,EAAC,SAAA,EAAWsD,4BAAAA,CAAW,aAAa,CAAA,EAEhD,QAAA,EAAA;AAAA,0BAAArD,cAAAA,CAACgE,sBAAA,EAAc,OAAA,EAAS,YAAY,MAAA,CAAO,UAAA,EAAY,kBAAkB,kBAAA,EAAY,CAAA;AAAA,0BACrFhE,cAAAA,CAACD,SAAAA,EAAA,EAAK,QAAA,EAAQ,MAAC,SAAA,EAAWsD,4BAAAA,CAAW,aAAa,CAAA,EAChD,QAAA,kBAAAvD,eAAAA,CAACC,WAAA,EAAK,OAAA,EAAQ,QAAA,EAAS,QAAA,EAAQ,IAAA,EAAC,GAAA,EAAK,EAAA,EAAI,SAAA,EAAWsD,4BAAAA,CAAW,yBAAA,EAA2B3B,sBAAAA,CAAW,WAAW,CAAA,EAC7G,QAAA,EAAA;AAAA,YAAAR,mBAAAA,CAAa,YAAY,MAAA,CAAO,WAAW,qBAC1ClB,cAAAA,CAAC,SAAI,SAAA,EAAU,aAAA,EACb,0BAAAA,cAAAA,CAACgE,oBAAAA,EAAA,EAAc,OAAA,EAAS,WAAA,CAAY,OAAO,WAAA,EAA0C,gBAAA,EAAkB,yBAAiB,CAAA,EAC1H,CAAA;AAAA,4BAEFlE,eAAAA,CAACC,SAAAA,EAAA,EAAK,QAAA,EAAQ,IAAA,EAAC,KAAK,CAAA,EAClB,QAAA,EAAA;AAAA,8BAAAC,cAAAA;AAAA,gBAACgE,oBAAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,YAAY,MAAA,CAAO,YAAA;AAAA,kBAC5B,kCAAkBlE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW4B,uBAAO,kBAAA,EAAoB,QAAA,EAAA;AAAA,oBAAA,eAAA;AAAA,oBAAI,cAAc,MAAA,CAAO;AAAA,mBAAA,EAAK;AAAA;AAAA,eAC7F;AAAA,8BAEA1B,cAAAA,CAACgE,oBAAAA,EAAA,EAAc,GAAA,EAAK,SAAA,EAAW,OAAA,EAAS,WAAA,CAAY,MAAA,CAAO,MAAA,EAAQ,gBAAA,EAAkB6B,mBAAAA,EAAY,CAAA;AAAA,8BACjG7F,cAAAA;AAAA,gBAACgE,oBAAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,YAAY,MAAA,CAAO,gBAAA;AAAA,kBAC5B,kCAAkBhE,cAAAA,CAAC,SAAI,SAAA,EAAW0B,sBAAAA,CAAO,oBAAoB,QAAA,EAAA,oGAAA,EAAkB;AAAA;AAAA;AACjF,aAAA,EACF,CAAA;AAAA,4BACA1B,cAAAA,CAACgE,oBAAAA,EAAA,EAAc,OAAA,EAAS,WAAA,CAAY,OAAO,YAAA,EAAc;AAAA,WAAA,EAC3D,CAAA,EACF;AAAA,SAAA,EACF,CAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA,EACF,GACF,CAAA,EACF,CAAA;AAEJ,CAAC","file":"index.cjs.js","sourcesContent":["import { downloadFile, request } from '@zero-library/common'\n\nexport interface DocType {\n /**\n * 内容\n */\n content: string\n /**\n * 文档ID\n */\n docId: string\n /**\n * 关键字\n */\n keywords?: string[]\n /**\n * 位置\n */\n position?: number\n /**\n * 分段ID\n */\n sid?: string\n /**\n * 令牌数\n */\n tokens?: number\n /**\n * 字数\n */\n wordCount?: number\n}\nexport const docQuery = (paramsStr: string): Promise<R<DocType>> => {\n return request.get(`/uc/doc?${paramsStr}`)\n}\nexport const fileCreate = async (fileContent: string, fileName?: string, targetFormat: string = 'docx') => {\n const blob = await request.post(`/uc/doc/convert`, { fileContent, fileName, targetFormat }, { responseType: 'blob' })\n const url = URL.createObjectURL(blob)\n downloadFile(url, fileName)\n}\n","import { copyText } from '@zero-library/common'\nimport { message } from 'antd'\nimport dayjs from 'dayjs'\n\nexport const copy = (value: string) => {\n copyText(value).then(() => {\n message.success('复制成功')\n })\n}\n\nexport const classifyTime = (timestamp?: number): string => {\n const now = dayjs()\n const target = dayjs(timestamp)\n\n if (target.isSame(now, 'day')) {\n return '今天'\n }\n\n const diffInDays = now.diff(target, 'day')\n if (diffInDays < 7) {\n return '最近 7 天'\n } else if (diffInDays < 30) {\n return '最近 30 天'\n } else if (diffInDays < 180) {\n return '最近半年'\n } else {\n return '更早'\n }\n}\n\n// 对象转换函数,将源对象转换为目标对象\nexport function transform<T extends object, U extends object>(\n source: T,\n fieldMap: {\n [K in keyof U]: keyof T | ((source: T) => U[K]) | U[K]\n }\n): U {\n const result = {} as U\n for (const [targetKey, mapping] of Object.entries(fieldMap)) {\n const key = targetKey as keyof U\n if (typeof mapping === 'function') {\n result[key] = (mapping as (src: T) => U[typeof key])(source)\n } else if (typeof mapping === 'string' && source && mapping in source) {\n result[key] = source[mapping as keyof T] as unknown as U[typeof key]\n } else {\n result[key] = mapping as U[typeof key]\n }\n }\n return result\n}\n\n// 批量对象转换函数\nexport function transforms<T extends object, U extends object>(\n sources: T[],\n fieldMap: {\n [K in keyof U]: keyof T | ((source: T) => U[K]) | U[K]\n }\n): U[] {\n return sources?.map((source) => transform<T, U>(source, fieldMap)) || []\n}\n\n// 构建带查询参数的 URL,支持数组参数\nexport function buildURLWithParams(url: string, params?: Record<string, any>) {\n const query = new URLSearchParams(\n Object.entries(params || {}).flatMap(([key, val]) => (Array.isArray(val) ? val.map((v) => [key, String(v)]) : [[key, String(val)]]))\n ).toString()\n return query ? `${url}${url.includes('?') ? '&' : '?'}${query}` : url\n}\n\nexport const getBase64 = (file: File): Promise<string> => {\n return new Promise<string>((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => resolve(reader.result as string)\n reader.onerror = reject\n reader.readAsDataURL(file)\n })\n}\n","import { useCreateValtioContext } from '@zero-library/common'\nimport { ChatStoreType } from '.'\n\n// 基于泛型创建专用上下文\nexport const { ValtioProvider: ChatProvider, useValtioStore: useChatStore } = useCreateValtioContext<ChatStoreType>()\n",".appCard {\n width: 180px;\n border-radius: 10px;\n border: 1px solid #d7d7d7;\n background-color: #fafafa;\n font-size: 16px;\n cursor: pointer;\n margin: 8px;\n padding: 12px 8px;\n}\n.appCard > div {\n max-width: 100%;\n}\n.appCard > img {\n height: 30px;\n}\n.fileView {\n width: 200px;\n padding: 4px 8px;\n cursor: pointer;\n background-color: #f5f3f3;\n border-radius: 6px;\n}\n.fileEdit {\n margin: 12px 0;\n border-radius: 6px;\n border: 1px solid #f2f2f2;\n}\n.fileEdit .fileEditHeader {\n padding: 2px 8px;\n background-color: #f2f2f2;\n}\n.fileEdit .fileEditContent {\n padding: 8px;\n background-color: #fafafa;\n}\n.quoteList {\n min-width: 300px;\n}\n.quoteList:global.ant-collapse .ant-collapse-item .ant-collapse-header {\n padding: 12px 0;\n color: #8f91a8;\n}\n.quoteList:global.ant-collapse .ant-collapse-item .ant-collapse-content {\n color: #8f91a8;\n background-color: #f2f2f2;\n}\n.mdEdit {\n margin: 10px 0;\n background-color: rgba(242, 242, 242, 0.2);\n border: 1px solid #f2f2f2;\n padding: 10px;\n border-radius: 4px;\n}\n","import { Flex, Spin } from 'antd'\nimport { useChatStore } from '../../../stores/Context'\nimport styles from './styles.module.less'\n\ninterface Props {\n data: {\n // AgentType\n appKey: string\n appName: string\n agentKey: string\n iconUrl: string\n }\n loading: boolean\n}\n// :::alert type=appCard data={appKey:\"cube-acc\",agentKey:\"cube-acc\",appName:\"罗拉易账\",iconUrl:\"/icon-url/2e53e398d31627d559e0b3b1b5acb731.png\"} :::\nexport default ({ data, loading }: Props) => {\n const chatStore = useChatStore()\n const onClick = () => {\n chatStore.switchAgentConversation(`${data.appKey}:${data.agentKey}`)\n // emit('openApp', { appKey: data.appKey })\n }\n return (\n <Spin spinning={loading} size=\"small\">\n <Flex vertical gap={4} align=\"center\" className={styles.appCard} onClick={onClick}>\n <img src={data.iconUrl} />\n <div className=\"text-ellipsis\" title={data.appName}>\n {data.appName}\n </div>\n </Flex>\n </Spin>\n )\n}\n","import { FileIcon } from '@zero-library/common'\nimport { Flex, Spin } from 'antd'\nimport { FileUrlType } from '../../../stores'\nimport { useChatStore } from '../../../stores/Context'\nimport styles from './styles.module.less'\n\ninterface Props {\n data: FileUrlType\n loading: boolean\n}\n// :::alert type=fileView data={fileUrl:\"\",fileName:\"\",suffix:\"\"} :::\nexport default ({ data, loading }: Props) => {\n const chatStore = useChatStore()\n const onClick = () => {\n chatStore.setPreview(data, false)\n }\n return (\n <Spin spinning={loading} size=\"small\">\n <Flex gap={8} align=\"center\" className={styles.fileView} onClick={onClick}>\n <FileIcon suffix={data.suffix} />\n <div className=\"text-ellipsis\" title={data.fileName}>\n {data.fileName}\n </div>\n </Flex>\n </Spin>\n )\n}\n","import { RenderMarkdown } from '@zero-library/common'\nimport { Drawer, Empty, Spin } from 'antd'\nimport { useEffect, useState } from 'react'\nimport { docQuery } from '../../../../services/file'\n\ninterface Props {\n fileUrl: string\n title: string\n open: boolean\n onClose: () => void\n}\nexport default ({ title, open, onClose, fileUrl }: Props) => {\n const [content, setContent] = useState('')\n const [loading, setLoading] = useState(false)\n const getContent = async () => {\n try {\n setLoading(true)\n const res = await docQuery(fileUrl)\n setContent(res.data?.content)\n } finally {\n setLoading(false)\n }\n }\n useEffect(() => {\n getContent()\n }, [fileUrl])\n return (\n <Drawer title={title} push={false} width=\"100%\" open={open} onClose={onClose}>\n <Spin spinning={loading}>{content ? <RenderMarkdown content={content} /> : <Empty className=\"m-t-32\" />}</Spin>\n </Drawer>\n )\n}\n","// :::alert type=indexQuote data={index:\"1\",fileName:'',fileUrl:\"\"} :::\nimport { isExternal } from '@zero-library/common'\nimport { Flex, Popover, Spin, Tag } from 'antd'\nimport { useState } from 'react'\nimport DocDrawer from './components/DocDrawer'\n\ninterface Props {\n data: {\n index: string\n fileUrl?: string\n fileName: string\n }\n loading: boolean\n}\nexport default ({ data, loading }: Props) => {\n const [open, setOpen] = useState(false)\n const onClick = () => {\n if (!data.fileUrl) return\n if (isExternal(data.fileUrl)) {\n window.open(data.fileUrl, '_blank')\n } else {\n setOpen(true)\n }\n }\n const Content = (\n <div>\n <Flex align=\"center\" gap={8}>\n {/* <FileIcon suffix={data.suffix} fontSize={16} /> */}\n <a onClick={onClick}>{data.fileName}</a>\n </Flex>\n </div>\n )\n return (\n <div className=\"inline-block m-l-8\">\n <Spin spinning={loading} size=\"small\">\n <Popover content={Content}>\n <Tag bordered={false} color=\"processing\" className=\"cursor-pointer\">\n {data.index}\n </Tag>\n </Popover>\n </Spin>\n {open && <DocDrawer fileUrl={data.fileUrl} title={data.fileName} open={open} onClose={() => setOpen(false)} />}\n </div>\n )\n}\n","import { MarkdownEditor } from '@zero-library/common'\nimport { Button, Flex } from 'antd'\nimport { useEffect, useState } from 'react'\nimport { useChatStore } from '../../../stores/Context'\nimport styles from './styles.module.less'\n\ninterface Props {\n data: {\n content: string\n // messageId: string\n }\n loading: boolean\n}\n// :::alert type=mdEdit data={content:\"\"} :::\nexport default ({ data, loading }: Props) => {\n const chatStore = useChatStore()\n const [value, setValue] = useState('')\n const onOk = () => {\n chatStore.sendMessage('开始写作', [], { outline: value })\n }\n useEffect(() => {\n setValue(data.content)\n }, [data.content])\n return (\n <div className={styles.mdEdit}>\n <MarkdownEditor disabled={loading} value={value} onChange={setValue} showToolbar={false} />\n {!loading && (\n <Flex justify=\"end\" className=\"m-t-16\">\n <Button color=\"primary\" variant=\"outlined\" onClick={onOk}>\n 确认提纲思路,开始写作\n </Button>\n </Flex>\n )}\n </div>\n )\n}\n","// :::alert type=fileEdit data={fileName:\"\",content:\"\"} :::\nimport { CopyOutlined, PlayCircleOutlined } from '@ant-design/icons'\nimport { FileIcon, RenderMarkdown } from '@zero-library/common'\nimport { Button, Flex, Spin } from 'antd'\nimport { FileTextType } from 'packages/chat-agent/src/stores'\nimport { copy } from '../../../core/utils'\nimport { useChatStore } from '../../../stores/Context'\nimport styles from './styles.module.less'\n\ninterface Props {\n data: FileTextType\n loading: boolean\n}\nexport default ({ data, loading }: Props) => {\n const chatStore = useChatStore()\n // const configState = useSnapshot(chatStore.config)\n const onPreview = () => {\n chatStore.setPreview(data, true)\n }\n // useEffect(() => {\n // if (configState.preview.isShow !== 2 || (loading && configState.preview.isShow === 1)) {\n // chatStore.setPreview(data, {\n // isEdit: true,\n // isShow: 1,\n // isIntact: !loading\n // })\n // }\n // }, [data, loading])\n\n return (\n <Flex vertical className={styles.fileEdit}>\n <Flex gap={8} align=\"center\" justify=\"space-between\" className={styles.fileEditHeader}>\n <Flex gap={4} align=\"center\" className=\"flex-1\">\n <FileIcon suffix={'md'} fontSize={18} />\n <div className=\"text-ellipsis\" title={data.fileName}>\n {data.fileName}\n </div>\n </Flex>\n <Spin spinning={loading} size=\"small\">\n <Flex>\n <Button color=\"default\" variant=\"text\" size=\"small\" icon={<PlayCircleOutlined />} onClick={onPreview}>\n 预览编辑\n </Button>\n <Button color=\"default\" variant=\"text\" size=\"small\" icon={<CopyOutlined />} onClick={() => copy(data.content)}>\n 复制\n </Button>\n </Flex>\n </Spin>\n </Flex>\n <Flex gap={8} align=\"center\" className={styles.fileEditContent}>\n <RenderMarkdown content={data.content} />\n </Flex>\n </Flex>\n )\n}\n","// 文末引用::::alert type=quoteList data={list:[{\"title\":'介绍介绍介绍介绍介绍介绍.pdf',fileUrl:\"2909615725521334\"},{\"title\":'介绍介绍介绍介绍介绍介绍.pdf',fileUrl:\"2909615725521364\"}]} :::\nimport { CaretRightOutlined } from '@ant-design/icons'\nimport { isExternal } from '@zero-library/common'\nimport { Collapse, Flex } from 'antd'\nimport { useState } from 'react'\nimport DocDrawer from './components/DocDrawer'\nimport styles from './styles.module.less'\ninterface QuoteItem {\n title: string\n fileUrl: string\n}\ninterface Props {\n data: {\n list: QuoteItem[]\n }\n loading: boolean\n}\nexport default ({ data, loading }: Props) => {\n const [open, setOpen] = useState(false)\n const [selectItem, setSelectItem] = useState({} as QuoteItem)\n const onClick = (item: QuoteItem) => {\n if (!item.fileUrl) return\n if (isExternal(item.fileUrl)) {\n window.open(item.fileUrl, '_blank')\n } else {\n setSelectItem(item)\n setOpen(true)\n }\n }\n return (\n <>\n <Collapse\n className={styles.quoteList}\n bordered={false}\n ghost\n expandIcon={({ isActive }) => <CaretRightOutlined rotate={isActive ? 90 : 0} />}\n items={[\n {\n key: '1',\n label: '参考资料',\n children: (\n <Flex vertical gap={4}>\n {data.list.map((item) => (\n <p key={item.fileUrl} onClick={() => !loading && onClick(item)} className=\"cursor-pointer\">\n {item.title}\n </p>\n ))}\n </Flex>\n )\n }\n ]}\n />\n {open && <DocDrawer fileUrl={selectItem.fileUrl} title={selectItem.title} open={open} onClose={() => setOpen(false)} />}\n </>\n )\n}\n","import { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'\n\nimport { CloseOutlined } from '@ant-design/icons'\nimport { Conversation, XProvider } from '@ant-design/x'\nimport {\n downloadFile,\n FilePreview,\n getToken,\n getWebSocketUrl,\n isLocalhost,\n MarkdownEditor,\n RenderWrapper,\n shouldRender,\n useDeepEffect,\n UserInfo,\n useWebSocket\n} from '@zero-library/common'\nimport { Button, Flex, Spin, Splitter, Tag, ThemeConfig } from 'antd'\nimport classNames from 'classnames'\nimport { useSnapshot } from 'valtio'\nimport { ChatSenderHandle } from '../../components/ChatSender'\nimport { AgentInfo, InputFile } from '../../services'\nimport { fileCreate } from '../../services/file'\nimport type { ChatHooks, ChatLayout, ChatParams, ConversationStrategy, FileTextType, FileUrlType, ReferencesType } from '../../stores'\nimport { createChatStore } from '../../stores'\nimport { ChatProvider } from '../../stores/Context'\nimport BubbleListItems from '../common/BubbleListItems'\nimport ChatHeader from '../common/ChatHeader'\nimport ChatSender from '../common/ChatSender'\nimport ConversationListPanel from '../common/ConversationListPanel'\nimport chatStyles from '../common/styles.module.less'\nimport styles from './styles.module.less'\n\nexport interface ChatConfig {\n receiverType?: number // :1-用户 2-专家 3-Agent\n receiverId?: string // 专家或智能体\n conversationId?: string // 会话Id\n conversationStrategy?: ConversationStrategy\n}\ninterface Props {\n theme?: ThemeConfig\n config?: ChatConfig\n params?: ChatParams\n hooks?: ChatHooks\n layout?: ChatLayout\n userInfo?: UserInfo\n}\nexport interface ChatHandle {\n sendMessage: (message?: string, files?: InputFile[]) => void\n switchAgentConversation: (agentId: AgentInfo['id'], strategy?: ConversationStrategy) => void\n switchConversation: (id?: Conversation['id']) => void\n createConversation: () => Promise<void>\n setReferences: (references?: ReferencesType) => void\n setMessage: (message?: string) => void\n setFiles: (files?: InputFile[]) => void\n senderFocus: ChatSenderHandle['focus']\n}\nexport default forwardRef<ChatHandle, Props>(({ theme, params, userInfo, hooks, layout, config }: Props, ref) => {\n const chatStore = useMemo(() => createChatStore(), [])\n const senderRef = useRef<ChatSenderHandle>()\n\n useDeepEffect(() => {\n if (config?.conversationId) {\n chatStore.switchConversation(config.conversationId)\n return\n }\n if (config?.receiverId && config?.receiverType === 3) {\n chatStore.switchAgentConversation(config.receiverId, config.conversationStrategy)\n }\n }, [config])\n useEffect(() => {\n chatStore.setUserInfo(userInfo)\n }, [userInfo])\n useEffect(() => {\n // console.log('layout changed:', layout)\n chatStore.setLayout(layout, config?.receiverType)\n }, [layout, config?.receiverType])\n useEffect(() => {\n // console.log('params changed:', params)\n chatStore.setConfigParams(params)\n }, [params])\n useEffect(() => {\n // console.log('hooks changed:', hooks)\n chatStore.setHooks(hooks)\n }, [hooks])\n\n const receiverState = useSnapshot(chatStore.receiver)\n const configState = useSnapshot(chatStore.config)\n useImperativeHandle(\n ref,\n () => ({\n sendMessage: chatStore.sendMessage,\n switchAgentConversation: chatStore.switchAgentConversation,\n switchConversation: chatStore.switchConversation,\n createConversation: chatStore.createConversation,\n setReferences: chatStore.setReferences,\n setMessage: chatStore.setContent,\n setFiles: chatStore.setFileList,\n senderFocus: (options) => {\n senderRef.current?.focus(options)\n }\n }),\n []\n )\n const hasPreView = useMemo(() => {\n return (\n shouldRender(configState.layout.preview as ChatLayout['preview']) &&\n (!!(configState.preview.file as FileUrlType).fileUrl || !!(configState.preview.file as FileTextType).content)\n )\n }, [configState.layout.preview, configState.preview.file])\n\n // 计算Splitter的尺寸\n const [sizes, setSizes] = useState([0, '100%'])\n const setSplitterSizes = (sizes: (number | string)[]) => {\n setSizes(sizes)\n }\n useEffect(() => {\n if (hasPreView) {\n setSplitterSizes(['70%', '30%'])\n } else {\n setSplitterSizes([0, '100%'])\n }\n }, [hasPreView])\n // 会话Socket\n useWebSocket({\n url: getWebSocketUrl(`/api/lolr/conversation/ws/subscribe?NS-TOKEN=${getToken()}`, isLocalhost() ? '192.168.6.23' : ''),\n onMessage: chatStore.acceptMessage,\n clientHeartbeat: false,\n reconnectInterval: 10000\n })\n\n useEffect(() => {\n configState.hooks?.onBeforeInit?.()\n }, [])\n return (\n <XProvider theme={{ cssVar: true, ...theme }}>\n <ChatProvider store={chatStore}>\n <Spin spinning={receiverState.loading} wrapperClassName=\"full-spin\">\n <Flex vertical className={classNames(styles.nsChatLayout, 'height-full')}>\n {/** 对话区 - header */}\n <RenderWrapper control={configState.layout.globalHeader} DefaultComponent={ChatHeader} />\n <Flex className=\"full-scroll\">\n <RenderWrapper control={configState.layout.leftPanel} />\n\n <RenderWrapper control={configState.layout.conversationList} DefaultComponent={ConversationListPanel} />\n <Splitter className=\"flex-1\" onResize={setSplitterSizes}>\n <Splitter.Panel collapsible={false} min={600} size={sizes[0]}>\n {hasPreView && (\n <>\n {(configState.preview.file as FileUrlType).fileUrl && (\n <Flex vertical className=\"height-full\">\n <Flex justify=\"space-between\" align=\"center\" gap={16} className={styles.nsPreviewHeader}>\n <div className={styles.nsPreviewHeaderTitle}>{configState.preview.file.fileName}</div>\n <Flex gap={8} justify=\"center\" align=\"center\">\n <Button\n color=\"primary\"\n variant=\"outlined\"\n onClick={() => downloadFile((configState.preview.file as FileUrlType).fileUrl, configState.preview.file.fileName)}\n >\n 下载\n </Button>\n <Button onClick={() => chatStore.setPreview()}>关闭</Button>\n </Flex>\n </Flex>\n <div className=\"full-scroll\">\n <FilePreview\n {...(configState.preview.file as FileUrlType)}\n pdfParams={{\n isHasThumbnails: false\n }}\n />\n </div>\n </Flex>\n )}\n {(configState.preview.file as FileTextType).content && (\n <MarkdownEditor\n value={(configState.preview.file as FileTextType).content}\n // onChange={(con) => chatStore.setPreview({ ...configState.preview.file, content: con }, true)}\n onQuote={(text) => {\n chatStore.setReferences({\n type: 1,\n content: {\n name: text,\n markdown: text\n },\n params: {\n outline: text\n }\n })\n }}\n onDownloadFile={(content, type) => fileCreate(content, configState.preview.file.fileName, type)}\n extraNav={\n <>\n <Tag bordered={false} color=\"default\" className=\"cursor-pointer\" onClick={() => chatStore.setPreview()}>\n <CloseOutlined />\n </Tag>\n </>\n // loading && (\n // <Tag bordered={false} color=\"default\">\n // <Flex gap={4} align=\"center\">\n // <SyncOutlined spin style={{ color: LgPrimaryColor }} />\n // 保存中\n // </Flex>\n // </Tag>\n // )\n }\n />\n )}\n </>\n )}\n </Splitter.Panel>\n\n <Splitter.Panel collapsible={false} max={800} min={400} size={sizes[1]}>\n <Flex vertical className={classNames('height-full')}>\n {/** 对话区 - header */}\n <RenderWrapper control={configState.layout.chatHeader} DefaultComponent={ChatHeader} />\n <Flex vertical className={classNames('full-scroll')}>\n <Flex justify=\"center\" vertical gap={24} className={classNames('height-full p-t-8 p-b-8', chatStyles.nsBodyWidth)}>\n {shouldRender(configState.layout.messageList) && (\n <div className=\"full-scroll\">\n <RenderWrapper control={configState.layout.messageList as ChatLayout['messageList']} DefaultComponent={BubbleListItems} />\n </div>\n )}\n <Flex vertical gap={8}>\n <RenderWrapper\n control={configState.layout.senderHeader as ChatLayout['senderHeader']}\n DefaultComponent={<div className={styles.nsChatSenderHeader}>我是 {receiverState.active.name}</div>}\n />\n {/* 🌟 输入框 */}\n <RenderWrapper ref={senderRef} control={configState.layout.sender} DefaultComponent={ChatSender} />\n <RenderWrapper\n control={configState.layout.disclaimerNotice as ChatLayout['disclaimerNotice']}\n DefaultComponent={<div className={styles.nsDisclaimerNotice}>内容由AI生成,仅供参考,请仔细甄别</div>}\n />\n </Flex>\n <RenderWrapper control={configState.layout.senderFooter} />\n </Flex>\n </Flex>\n </Flex>\n </Splitter.Panel>\n </Splitter>\n </Flex>\n </Flex>\n </Spin>\n </ChatProvider>\n </XProvider>\n )\n})\n","import { Conversation } from '@ant-design/x'\nimport { deepCopy, deepMerge, getCurrentUser, isObject, RenderControl, shouldRender, UserInfo } from '@zero-library/common'\nimport { ButtonProps, message } from 'antd'\nimport { proxy } from 'valtio'\nimport { ConversationMemberEnum } from '../core/constants'\nimport { classifyTime, transform, transforms } from '../core/utils'\nimport {\n AgentCharacter,\n agentCharacterQuery,\n agentCharacterSelect,\n AgentConfig,\n AgentInfo,\n agentInfoQuery,\n ChatUserInfo,\n conversationCreate,\n conversationDelete,\n ConversationMember,\n conversationMemberQuery,\n ConversationMessage,\n conversationMessageSend,\n ConversationMessageSend,\n conversationMessagesQuery,\n conversationRecentQuery,\n ConversationsQuery,\n conversationsQuery,\n conversationStop,\n ConversationType,\n FeedbackUpdate,\n feedbackUpdate,\n InputFile,\n MessageQuoteMsg,\n messageSuggestedQuery\n} from '../services'\n\nexport type ConversationStrategy = 1 | 2 // 1-最近会话 2-新会话 默认2\nexport interface ReceiverInfo {\n /**\n * name,名称\n */\n name: string\n /**\n * Agenttype,智能体类型\n */\n type?: number\n /**\n * 智能体的附带信息\n */\n config?: AgentConfig\n /**\n * Description,描述\n */\n description?: string\n /**\n * Id,主键\n */\n id: string\n /**\n * Isavailable,是否可用\n */\n isAvailable?: boolean\n /**\n * Logo,logo\n */\n logo: string\n feature?: ObjectType<any>\n}\nexport type ConversationMemberObj = Partial<Record<ConversationMemberEnum, ConversationMember>>\nexport interface FileUrlType {\n suffix: string\n fileUrl: string\n fileName: string\n // messageId?: string\n}\nexport interface FileTextType {\n content: string\n suffix: string\n fileName: string\n // messageId?: string\n}\nexport interface ReferencesContent extends MessageQuoteMsg {\n name?: string\n markdown?: string\n [key: string]: any\n}\nexport interface ReferencesType {\n type: number // 1:markdown引用(拼正文发) 2: 文案引用(不发正文) 3:消息引用\n content: ReferencesContent\n params?: ObjectType<any>\n}\nexport interface MessageBoxType {\n content?: ConversationMessageSend['msgContent'] // 输入框内容\n files?: ConversationMessageSend['msgFiles'] // 上传文件内容\n headerOpen?: boolean\n loading: boolean\n message: ConversationMessage[]\n questionList?: string[] // 推荐问题\n references?: ReferencesType // 引用消息(可扩展quoteMsg)\n speakHuman?: boolean // false: ai(默认) true: 专家\n}\nexport type ChatStoreType = ReturnType<typeof createChatStore>\nexport interface ChatHooks {\n onBeforeInit?: () => void\n onAfterInit?: () => void\n onSenderFocus?: () => void\n onHeaderClose?: () => void\n onBeforeSend?: (message: ConversationMessageSend['msgContent'], files: InputFile[]) => boolean | Promise<boolean> | void\n onAfterSend?: () => void\n onBeforeSwitchAgent?: (agentId: string) => boolean | Promise<boolean> | void\n onAfterSwitchAgent?: (agent: AgentInfo) => void\n onBeforeSwitchConversation?: (conversationId: string) => boolean | Promise<boolean> | void\n onAfterSwitchConversation?: (conversationId: string) => void\n onBeforeInitMessages?: (conversationId: string) => boolean | Promise<boolean> | void\n onAfterInitMessages?: (messages: ConversationMessage[]) => void\n onBeforeDelConversation?: (conversationId: string) => boolean | Promise<boolean> | void\n onAfterDelConversation?: (conversationId: string, isCurrentConversation: boolean) => void\n // onMessageEvent?: (event) => void\n // onAfterLayout?: () => void\n // onError?: (error: unknown) => void\n}\nexport interface ChatParams {\n source?: number\n businessData?: string\n businessId?: string\n businessType?: number\n params?: ObjectType<any>\n}\n// 默认 title = true, closeBtn = false, newConversationBtn = true, conversationListBtn = true\nexport interface ChatLayoutHeader {\n title?: RenderControl<void, void>\n closeBtn?: boolean\n newConversationBtn?: RenderControl<void, void>\n agentCharacter?: boolean\n conversationListBtn?: boolean\n}\n// 默认 header = true\nexport interface ChatLayoutConversationList {\n header?: RenderControl<void, void>\n}\n// placeholder, extraBtn = false, referencesBtn = false\nexport interface ChatLayoutSender {\n placeholder?: string\n extraBtn?: RenderControl<void, void>\n referencesBtn?: RenderControl<void, void>\n footerBelow?: RenderControl<void, void>\n sendBtnProps?: ButtonProps\n prompts?: boolean\n}\nexport interface ChatLayoutMessageList {\n avatar?: boolean | Partial<Record<ConversationMemberEnum, boolean>>\n firstMessage?: RenderControl<void, void>\n}\nexport interface ChatLayout {\n leftPanel?: RenderControl<void, void>\n conversationList?: RenderControl<void, ChatLayoutConversationList>\n preview?: boolean // 是否允许预览\n messageList?: RenderControl<void, ChatLayoutMessageList>\n senderHeader?: RenderControl<void, void>\n sender?: RenderControl<void, ChatLayoutSender>\n senderFooter?: RenderControl<void, void>\n globalHeader?: RenderControl<void, ChatLayoutHeader>\n chatHeader?: RenderControl<void, ChatLayoutHeader>\n disclaimerNotice?: RenderControl<void, void>\n}\nconst defaultAgentLayout = {\n leftPanel: false,\n conversationList: true,\n preview: true,\n messageList: true,\n firstMessage: false,\n senderHeader: false,\n sender: true,\n senderFooter: false,\n globalHeader: false,\n chatHeader: true,\n disclaimerNotice: true\n} as ChatLayout\nconst defaultExpertLayout = {\n leftPanel: false,\n conversationList: false,\n preview: false,\n messageList: true,\n firstMessage: false,\n senderHeader: false,\n sender: {\n props: {\n prompts: false\n }\n },\n senderFooter: false,\n globalHeader: false,\n chatHeader: {\n props: {\n title: true,\n closeBtn: false,\n newConversationBtn: false,\n agentCharacter: false,\n conversationListBtn: false\n }\n },\n disclaimerNotice: false\n} as ChatLayout\nexport function createChatStore() {\n const config = proxy({\n hooks: {} as ChatHooks,\n layout: {} as ChatLayout,\n preview: {\n file: {} as FileUrlType | FileTextType,\n isEdit: false // 未使用\n // isShow: 0, // 0 不显示 1 显示 2 用户关闭\n // isIntact: false // true 完整 false 不完整\n },\n userInfo: {} as ChatUserInfo,\n params: {} as ChatParams\n })\n\n const setPreview = (file = {} as FileUrlType | FileTextType, isEdit = false) => {\n if (shouldRender(config.layout.preview)) {\n config.preview = {\n file,\n isEdit\n }\n } else {\n if ((file as FileUrlType)?.fileUrl) {\n window.open((file as FileUrlType).fileUrl, '_blank')\n } else {\n console.log('当前环境不支持预览')\n }\n }\n }\n const setLayout = (layout: ChatLayout, receiverType: number = 3) => {\n const defaultLayout = receiverType === 3 ? defaultAgentLayout : defaultExpertLayout\n config.layout = deepMerge(defaultLayout, layout)\n }\n const setConfigParams = (params = {} as ChatParams) => {\n config.params = { ...params }\n }\n const setHooks = (hooks = {} as ChatHooks) => {\n config.hooks = hooks\n }\n const setUserInfo = (userInfo?: UserInfo) => {\n config.userInfo = transform(userInfo || getCurrentUser(), {\n id: (userInfo) => {\n return String(userInfo['id'])\n },\n name: 'name',\n iconUrl: 'avatar',\n description: 'name'\n })\n }\n const receiver = proxy({\n active: {} as ReceiverInfo,\n loading: false,\n params: {} as ObjectType<any> // 透传参数,后期可能扩展不透传参数\n })\n\n const setReceiverParams = (params?: ObjectType<any>) => {\n if (isObject(params)) {\n Object.assign(receiver.params, params)\n } else {\n receiver.params = {}\n }\n }\n // 智能体切换\n const switchAgent = async (agentId: AgentInfo['id']) => {\n // 切换智能体\n if (receiver.active.id === agentId) return\n\n const canProceed = await config.hooks?.onBeforeSwitchAgent?.(agentId)\n if (canProceed === false) {\n throw new Error('操作被阻止')\n }\n\n try {\n receiver.loading = true\n const { data } = await agentInfoQuery(agentId)\n receiver.active = transform<AgentInfo, ReceiverInfo>(data, {\n name: 'agentName',\n logo: 'logo',\n description: 'description',\n id: 'id',\n config: 'config',\n isAvailable: 'isAvailable',\n feature: (agentInfo) => {\n if (agentInfo.feature) {\n try {\n return JSON.parse(agentInfo.feature)\n } catch (e) {}\n }\n return {}\n }\n })\n receiver.active.type = 3\n setReceiverParams()\n\n // 需要根据配置选择是否存在\n if (receiver.active.feature?.deepThink) {\n setReceiverParams({ thinkMode: '2' })\n }\n config.hooks?.onAfterSwitchAgent?.(data)\n } catch (error) {\n throw error\n } finally {\n receiver.loading = false\n }\n }\n // 目前只是为了对照智能体\n const switchExpert = (expert: ConversationMember) => {\n if (receiver.active.id === expert.memberId) return\n receiver.active = transform<ConversationMember, ReceiverInfo>(expert, {\n name: 'memberName',\n logo: 'memberAvatar',\n id: 'memberId'\n })\n receiver.active.type = 2\n setReceiverParams()\n }\n\n // 智能体性格\n const character = proxy({\n list: [] as AgentCharacter[],\n active: {} as AgentCharacter,\n open: false,\n loading: false,\n switchLoading: false\n })\n\n const getCharacters = async (agentId: AgentInfo['id']) => {\n try {\n character.loading = true\n const res = await agentCharacterQuery(agentId)\n if (receiver.active.id !== agentId) return\n character.list = res.data!\n character.active = res.data.find((item) => item.selected)\n } finally {\n character.loading = false\n }\n }\n const openCharacterList = () => {\n character.open = true\n }\n const closeCharacterList = () => {\n character.open = false\n }\n const switchCharacter = async (c: AgentCharacter) => {\n if (!c.id) return\n try {\n character.switchLoading = true\n await agentCharacterSelect(receiver.active.id, c.id)\n character.active = { ...c }\n closeCharacterList()\n } finally {\n character.switchLoading = false\n }\n }\n\n // 历史会话管理\n const conversations = proxy({\n list: {\n items: [] as Conversation[],\n params: {\n pageNum: 1,\n pageSize: 1000\n }\n },\n updateIndex: 0, // 当前会话索引, 创建会话时更新,促使页面更新会话列表\n loading: false,\n delLoading: false\n })\n\n const getConversations = async (targetId: ConversationsQuery['targetId'], targetType: ConversationsQuery['targetType']) => {\n try {\n conversations.loading = true\n const { data } = await conversationsQuery({\n targetId,\n targetType,\n businessId: config.params.businessId,\n businessType: config.params.businessType,\n ...conversations.list.params\n })\n // 防止会话接口请求前就已经切换了会话\n if (receiver.active.id !== targetId) return\n const items = transforms<ConversationType, Conversation>(data?.items || [], {\n key: 'id',\n id: 'id',\n label: 'title',\n group: (c): string => {\n return classifyTime(c.updateTime)\n },\n timestamp: 'updateTime'\n })\n conversations.list.items = items\n } finally {\n conversations.loading = false\n }\n }\n const delConversation = async (conversationId: ConversationType['id']) => {\n try {\n const canProceed = await config.hooks?.onBeforeDelConversation?.(conversationId)\n if (canProceed === false) return\n conversations.delLoading = true\n await conversationDelete(conversationId)\n message.success('删除成功')\n conversations.list.items = conversations.list.items.filter((item) => item.key !== conversationId)\n delete conversation.messages[conversationId]\n if (conversation.active.id === conversationId) {\n createConversation()\n }\n config.hooks?.onAfterDelConversation?.(conversationId, conversation.active.id === conversationId)\n } finally {\n conversations.delLoading = false\n }\n }\n // 会话管理\n const conversation = proxy({\n // 每个会话单独存储\n active: {\n id: '',\n member: {} as ConversationMemberObj\n },\n messages: {} as { [key: ConversationType['id']]: MessageBoxType },\n feedback: {\n // open: false,\n loading: false\n // recordId: '',\n // target: undefined as number | undefined\n }\n })\n const setSpeakHuman = (speakHuman: boolean) => {\n conversation.messages[conversation.active.id].speakHuman = speakHuman\n }\n const setReferences = (references?: ReferencesType) => {\n conversation.messages[conversation.active.id].references = references\n }\n const setContent = (content?: ConversationMessageSend['msgContent']) => {\n conversation.messages[conversation.active.id].content = content\n }\n const setFileList = (files = [] as ConversationMessageSend['msgFiles']) => {\n conversation.messages[conversation.active.id].files = files\n }\n const setHeaderOpen = (headerOpen: MessageBoxType['headerOpen']) => {\n conversation.messages[conversation.active.id].headerOpen = headerOpen\n }\n const removeQuestionList = (conversationId: ConversationType['id']) => {\n if (conversation.messages[conversationId].questionList?.length) {\n conversation.messages[conversationId].questionList = []\n }\n }\n const getQuestionList = async (conversationId: ConversationType['id'], messageId: ConversationMessage['id']) => {\n const messages = conversation.messages[conversationId]?.message\n if (!messages?.length) return\n let lastMessage = messages[messages.length - 1]\n if (!lastMessage || lastMessage.sender.type !== 3 || lastMessage.id !== messageId) return\n const { data } = await messageSuggestedQuery(messageId)\n lastMessage = messages[messages.length - 1]\n if (lastMessage.id !== messageId) return\n\n conversation.messages[conversationId].questionList = data!\n }\n // const closeFeedback = async () => {\n // conversation.feedback.open = false\n // }\n\n const feedback = async (\n conversationId: FeedbackUpdate['conversationId'],\n messageId: FeedbackUpdate['id'],\n msgFeedback: FeedbackUpdate['msgFeedback'],\n index: number\n ) => {\n try {\n conversation.feedback.loading = true\n await feedbackUpdate({ conversationId, id: messageId, msgFeedback })\n message.success('感谢您的反馈')\n // closeFeedback()\n conversation.messages[conversationId].message[index].msgFeedback = msgFeedback\n } finally {\n conversation.feedback.loading = false\n }\n }\n\n const setInitMessage = async (conversationId: ConversationType['id']) => {\n conversation.messages[conversationId] = {\n content: '',\n files: [] as ConversationMessageSend['msgFiles'], // 上传文件内容\n headerOpen: false,\n loading: false,\n message: [],\n questionList: [] // 推荐问题\n }\n }\n // 如果前端不存在会话ID,目前只有智能体在用\n const resolveConversationId = async (receiverId: AgentInfo['id'], strategy: ConversationStrategy = 2) => {\n if (strategy === 1) {\n const { data } = await conversationRecentQuery({\n receiverId,\n receiverType: 3,\n businessId: config.params.businessId,\n businessType: config.params.businessType\n })\n return data\n } else {\n const { data } = await conversationCreate({\n receiverId,\n receiverType: 3,\n businessId: config.params.businessId,\n businessType: config.params.businessType,\n businessData: config.params.businessData,\n source: config.params.source,\n type: 1\n })\n conversations.updateIndex = conversations.updateIndex + 1\n return data\n }\n }\n\n const initConversation = async (conversationId: Conversation['id']) => {\n try {\n const { data } = await conversationMemberQuery(conversationId)\n conversation.active = { id: conversationId, member: {} }\n data.forEach((member) => {\n if (member.memberType === 3) {\n conversation.active.member.agent = member\n } else {\n // TODO 应该使用用户id 匹配; member.memberType === 1临时判断\n if (member.memberId === config.userInfo.id || member.memberType === 1) {\n conversation.active.member.user = member\n } else {\n conversation.active.member.other = member\n }\n }\n })\n } finally {\n }\n }\n const switchAgentConversation = async (id: AgentInfo['id'], strategy?: ConversationStrategy) => {\n const agentId = String(id)\n await switchAgent(agentId)\n const conversationId = await resolveConversationId(agentId, strategy)\n if (conversationId) {\n await switchConversation(conversationId)\n }\n }\n const createConversation = async () => {\n if (!receiver.active.id) return\n const conversationId = await resolveConversationId(receiver.active.id)\n if (conversationId) {\n await switchConversation(conversationId)\n }\n }\n // 切换会话\n const switchConversation = async (id: Conversation['id']) => {\n const conversationId = String(id)\n if (conversation.active.id === conversationId) return\n\n const canProceed = await config.hooks?.onBeforeSwitchConversation?.(conversationId)\n if (canProceed === false) {\n throw new Error('操作被阻止')\n }\n // 初始化会话\n await initConversation(conversationId)\n // 关闭文件预览\n setPreview()\n config.hooks?.onAfterSwitchConversation?.(conversationId)\n\n // 初始化接收者\n try {\n if (conversation.active.member.agent) {\n switchAgent(conversation.active.member.agent.memberId)\n } else if (conversation.active.member.other) {\n switchExpert(conversation.active.member.other)\n }\n } catch (e) {}\n // 获取消息列表\n await getMessages(conversationId)\n }\n const getMessages = async (conversationId: ConversationType['id']) => {\n const canProceed = await config.hooks?.onBeforeInitMessages?.(conversationId)\n if (canProceed === false) {\n throw new Error('操作被阻止')\n }\n // 初始化消息列表\n if (!conversation.messages[conversationId]) {\n setInitMessage(conversationId)\n }\n if (conversation.messages[conversationId].message.length === 0) {\n // try {\n // conversation.messages[key].messageLoading = true\n const { data } = await conversationMessagesQuery({\n pageNo: 1,\n pageSize: 1000,\n conversationId\n })\n conversation.messages[conversationId].message = data.items\n // }catch(e){\n // throw e\n // } finally {\n // conversation.messages[key].messageLoading = false\n // }\n\n config.hooks?.onAfterInitMessages?.(conversation.messages[conversationId].message)\n config.hooks?.onAfterInit?.()\n }\n }\n\n const pickReceiver = () => {\n const { agent, other } = conversation.active.member\n if (conversation.messages[conversation.active.id].speakHuman && other) return other\n if (agent) return agent\n if (other) return other\n return undefined\n }\n const sendMessage = async (\n message?: ConversationMessageSend['msgContent'],\n files = [] as ConversationMessageSend['msgFiles'],\n params?: ObjectType<any>\n ) => {\n const conversationId = conversation.active.id\n if (conversation.messages[conversationId].loading) return\n let msgContent: ConversationMessageSend['msgContent'] = '',\n msgFiles: ConversationMessageSend['msgFiles'] | undefined\n const references = conversation.messages[conversationId].references\n if (message) {\n msgContent = message\n msgFiles = files\n } else {\n if (references?.type === 1 && references?.content?.markdown) {\n msgContent = references.content.markdown + '\\n'\n }\n msgContent = msgContent + conversation.messages[conversationId].content!\n msgFiles = conversation.messages[conversationId].files\n }\n if (!msgContent) return\n\n const canProceed = await config.hooks?.onBeforeSend?.(msgContent, msgFiles)\n if (canProceed === false) return\n\n conversation.messages[conversationId].loading = true\n const sendReceiver = pickReceiver()\n const sendParams = {\n conversationId,\n msgContent,\n msgFiles,\n // quoteMsgId\n receiverId: sendReceiver.memberId,\n receiverType: sendReceiver.memberType,\n returnType: 2,\n senderId: conversation.active.member.user.memberId,\n senderType: conversation.active.member.user.memberType,\n source: config.params.source,\n stream: true\n } as ConversationMessageSend\n // 参数合并\n const extraParams = deepCopy(config.params.params || {}) as ChatParams\n Object.assign(extraParams, receiver.params, message ? {} : references?.params, params)\n sendParams.params = JSON.stringify(extraParams)\n\n if (!message) {\n setContent('')\n setFileList([])\n setReferences()\n setHeaderOpen(false)\n }\n try {\n await conversationMessageSend(sendParams)\n\n config.hooks?.onAfterSend?.()\n } finally {\n conversation.messages[conversationId].loading = false\n }\n }\n const cancelReceive = async () => {\n console.log('取消接收')\n // TODO 取消接收\n await conversationStop(conversation.active.id)\n }\n const updateConversationTitle = (conversationId: ConversationType['id'], title: ConversationType['title']) => {\n const idx = conversations.list.items.findIndex((item) => item.id === conversationId)\n if (idx === -1) return\n conversations.list.items[idx].title = title\n }\n\n const findMsgIndex = (conversationId: string, msgId: string) => {\n const messages = conversation.messages[conversationId]?.message || []\n return messages.findLastIndex((item) => item.id === msgId)\n }\n const startCallback = (msg: ConversationMessage) => {\n if (msg.conversationTitle && conversations.list.items.length) {\n updateConversationTitle(msg.conversationId, msg.conversationTitle)\n }\n removeQuestionList(msg.conversationId)\n const messages = conversation.messages[msg.conversationId].message\n messages.push(msg.sender.type === 3 ? { ...msg, msgContent: '正在努力思考中' } : msg)\n conversation.messages[msg.conversationId].loading = true\n }\n\n const stepCallback = (msg: ConversationMessage) => {\n const messages = conversation.messages[msg.conversationId].message\n const idx = findMsgIndex(msg.conversationId, msg.id)\n if (idx === -1) return\n messages[idx] = msg\n conversation.messages[msg.conversationId].loading = true\n }\n\n const contentCallback = (msg: ConversationMessage) => {\n const messages = conversation.messages[msg.conversationId].message\n const idx = findMsgIndex(msg.conversationId, msg.id)\n if (idx === -1) return\n const message = messages[idx]\n conversation.messages[msg.conversationId].loading = true\n if (message?.type === 'STEP_STARTED' || message?.type === 'TEXT_MESSAGE_START') {\n messages[idx] = msg\n return\n }\n messages[idx] = {\n ...message,\n msgContent: message.msgContent + (msg.msgContent || '')\n }\n }\n\n const endCallback = (msg: ConversationMessage) => {\n const messages = conversation.messages[msg.conversationId].message\n const idx = findMsgIndex(msg.conversationId, msg.id)\n if (idx === -1) return\n messages[idx] = { ...messages[idx], type: undefined }\n conversation.messages[msg.conversationId].loading = false\n getQuestionList(msg.conversationId, msg.id)\n }\n // 接收消息\n const acceptMessage = (newMessage: R<ConversationMessage>) => {\n const conversationId = newMessage.data.conversationId\n if (!conversation.messages[conversationId]?.message) return\n switch (newMessage.data.type) {\n case 'TEXT_MESSAGE_START':\n startCallback(newMessage.data)\n break\n case 'STEP_STARTED':\n stepCallback(newMessage.data)\n break\n case 'TEXT_MESSAGE_CONTENT':\n contentCallback(newMessage.data)\n break\n case 'TEXT_MESSAGE_END':\n endCallback(newMessage.data)\n break\n default:\n break\n }\n }\n\n return {\n config,\n setPreview,\n setLayout,\n setHooks,\n setConfigParams,\n setUserInfo,\n character,\n getCharacters,\n openCharacterList,\n closeCharacterList,\n switchCharacter,\n receiver,\n setReceiverParams,\n conversations,\n getConversations,\n delConversation,\n conversation,\n setSpeakHuman,\n setReferences,\n setContent,\n setFileList,\n setHeaderOpen,\n feedback,\n switchAgentConversation,\n createConversation,\n switchConversation,\n sendMessage,\n cancelReceive,\n acceptMessage\n }\n}\n","import { request } from '@zero-library/common'\n\nexport interface ChatUserInfo {\n id: string\n iconUrl: string\n name: string\n description: string\n}\n\nexport interface ConversationsQuery extends PageReq {\n businessId?: string\n businessType?: number\n targetId: string\n targetType: number\n}\n/**\n * 会话成员返回模型\n */\nexport interface ConversationMember {\n /**\n * Conversationid,会话ID\n */\n conversationId: string\n /**\n * Id,会话成员表ID\n */\n id: string\n /**\n * Jointime,加入时间\n */\n joinTime: Date\n /**\n * Memberavatar,成员头像\n */\n memberAvatar: string\n /**\n * Memberid,成员ID\n */\n memberId: string\n /**\n * Membername,成员名称\n */\n memberName: string\n /**\n * Membertype,成员类型\n */\n memberType: number\n /**\n * Orgid,机构ID\n */\n orgId: number\n /**\n * Orgname,机构名称\n */\n orgName: string\n}\nexport interface ConversationType {\n /**\n * Agentid,智能体 ID\n */\n agentId: string\n /**\n * Agentname,智能体名称\n */\n agentName: string\n /**\n * Id,会话 ID\n */\n id: string\n /**\n * Logourl,头像路径\n */\n logoUrl: string\n /**\n * Members,会话成员\n */\n members?: ConversationMember[]\n /**\n * Selected,当前选择的会话\n */\n selected: boolean\n /**\n * State,会话状态 1-正常 2-结束\n */\n state: number\n /**\n * Title,会话标题\n */\n title: string\n /**\n * Unreadcount,当前用户未读消息数\n */\n unreadCount: number\n /**\n * Updatetime,更新时间\n */\n updateTime: number\n}\n/**\n * 会话列表查询\n */\nexport const conversationsQuery = (params: ConversationsQuery): Promise<R<PageRes<ConversationType>>> => {\n return request.get('/lolr/conversation', params)\n}\nexport interface ConversationCreate {\n /**\n * Businessdata,业务扩展参数,非必填\n */\n businessData?: string\n /**\n * Businessid,业务数据唯一ID,非必填\n */\n businessId?: string\n /**\n * Businesstype,业务类型,非必填。1-风控;2-弹窗\n */\n businessType?: number\n /**\n * Receiverid,接收者ID\n */\n receiverId: string\n /**\n * Receivertype,接收者类型:1-用户 2-专家 3-Agent 4-税协\n */\n receiverType: number\n /**\n * Source,会话来源: 1-罗拉-APP; 2-罗拉-pc端; 3-合作伙伴端 4-税协 5-罗拉-cube 6-api\n */\n source: number\n /**\n * Type,会话类型: 1-对话; 2-工具\n */\n type: number\n}\n\n/**\n * 创建会话\n */\nexport const conversationCreate = (params: ConversationCreate): Promise<R<string>> => {\n return request.post('/lolr/conversation', params)\n}\n/**\n * 删除会话\n */\nexport const conversationDelete = (conversationId: string): Promise<R<null>> => {\n return request.delete('/agent/conversation', { conversationId })\n}\n/**\n * 更新最近一次会话\n */\nexport interface ConversationRecentUpdate extends ConversationRecentQuery {\n /**\n * Conversationid,会话ID\n */\n conversationId: string\n}\nexport const conversationRecentUpdate = (params: ConversationRecentUpdate): Promise<R<boolean>> => {\n return request.put('/lolr/conversation/recent', params)\n}\n/**\n * 获取最近一次会话\n */\nexport interface ConversationRecentQuery {\n /**\n * Businessid,业务数据唯一ID,非必填\n */\n businessId?: string\n /**\n * Businesstype,业务类型,非必填。1-风控;2-弹窗\n */\n businessType?: number\n /**\n * Receiverid,接收者ID\n */\n receiverId: string\n /**\n * Receivertype,接收者类型:1-用户 2-专家 3-Agent 4-税协\n */\n receiverType: number\n}\nexport const conversationRecentQuery = (params: ConversationRecentQuery): Promise<R<string>> => {\n return request.get('/lolr/conversation/recent', params)\n}\nexport interface conversationMessagesQuery extends PageReq {\n conversationId: string\n}\nexport interface InputFile {\n /**\n * Content,文件内容\n */\n content: string\n /**\n * 文件模式 remote_url local_file\n */\n mode: string\n /**\n * Type,文件类型\n */\n type: string\n /**\n * 文件扩展名\n */\n extension: string\n /**\n * 文件名\n */\n name: string\n}\nexport interface MessageQuoteMsg {\n /**\n * Id,消息ID\n */\n id?: string\n /**\n * Msgcontent,消息内容\n */\n msgContent?: string\n /**\n * Msgfiles,附件文件列表\n */\n msgFiles?: InputFile\n}\n\nexport interface MessageSender {\n /**\n * Curruser,是否为当前用户\n */\n currUser?: boolean\n /**\n * Id,发送者ID\n */\n id: string\n /**\n * Type,1-用户 2-专家 3-Agent 4-税协\n */\n type: number\n}\nexport interface ConversationMessage {\n /**\n * Conversationid,会话ID\n */\n conversationId: string\n // websocket返回\n conversationTitle?: string\n type?: 'TEXT_MESSAGE_START' | 'STEP_STARTED' | 'TEXT_MESSAGE_CONTENT' | 'TEXT_MESSAGE_END'\n /**\n * Id,消息ID\n */\n id: string\n /**\n * Msgcontent,消息内容\n */\n msgContent: string\n /**\n * Msgfeedback,消息反馈\n */\n msgFeedback?: number\n /**\n * Msgfiles,附件文件列表\n */\n msgFiles?: InputFile[]\n /**\n * 引消息\n */\n quoteMsg?: MessageQuoteMsg\n /**\n * 发送者信息\n */\n sender?: MessageSender\n /**\n * Sendtime,发送时间\n */\n sendTime: number\n /**\n * Stopflag,是否打断\n */\n stopFlag?: boolean\n}\nexport const conversationMessagesQuery = (params: conversationMessagesQuery): Promise<R<PageRes<ConversationMessage>>> => {\n return request.get('/lolr/conversation/message', params)\n}\n/**\n * 标记消息已读\n */\nexport const conversationMessageRead = (conversationId: ConversationType['id']): Promise<R<boolean>> => {\n return request.put('/lolr/conversation/message/read', { conversationId })\n}\nexport interface FeedbackUpdate {\n /**\n * Conversationid,会话ID\n */\n conversationId: string\n /**\n * Id,消息ID\n */\n id: string\n /**\n * Msgfeedback,反馈类型:1-赞,2-踩\n */\n msgFeedback: number\n /**\n * Msgfeedbackcontent,消息反馈内容\n */\n msgFeedbackContent?: string\n}\n/**\n * 更新消息反馈 赞或者踩\n */\nexport const feedbackUpdate = (params: FeedbackUpdate): Promise<R<null>> => {\n return request.put('/lolr/conversation/message/feedback', params)\n}\n/**\n * 获取消息推荐问题\n */\nexport const messageSuggestedQuery = (msgId: ConversationMessage['id'], maxCount = 3): Promise<R<string[]>> => {\n return request.get('/lolr/conversation/suggest', { msgId, maxCount })\n}\n\n/**\n * 获取会话成员\n */\nexport const conversationMemberQuery = (conversationId: ConversationType['id']): Promise<R<ConversationMember[]>> => {\n return request.get('/lolr/conversation/member', { conversationId })\n}\n/**\n * 更新会话状态\n */\nexport const conversationStateUpdate = (conversationId: ConversationType['id'], state: ConversationType['state']): Promise<R<boolean>> => {\n return request.put('/lolr/conversation/state', { conversationId, state })\n}\n\nexport interface ConversationMessageSend {\n /**\n * Conversationid,会话 ID\n */\n conversationId: string\n /**\n * Msgcontent,消息内容\n */\n msgContent: string\n /**\n * Msgfiles,附件文件列表\n */\n msgFiles?: InputFile[]\n /**\n * Params,业务参数,透传到智能体\n */\n params?: string\n /**\n * Quotemsgid,引用的消息 ID,大于 0 的整数\n */\n quoteMsgId?: number\n /**\n * Receiverid,接收者 ID。当 receiverType ≠ 3(非 agent)时,后端需填充此字段\n */\n receiverId: string\n /**\n * Receivertype,接收者身份,必填:1-用户;2-专家;3-agent 4-税协\n */\n receiverType: number\n /**\n * Returntype,返回方式:1-http;2-ws(WebSocket)\n */\n returnType: number\n /**\n * Senderid,发送者 ID\n */\n senderId: string\n /**\n * Sendertype,发送者身份,必填:1-用户;2-专家;3-agent 4-税协\n */\n senderType: number\n /**\n * Source,会话来源: 1-罗拉-APP; 2-罗拉-pc端; 3-合作伙伴端 4-税协 5-罗拉-cube 6-api\n */\n source: number\n /**\n * Stream,是否启用流式返回响应结果\n */\n stream: boolean\n}\n/**\n * 发送消息\n */\nexport const conversationMessageSend = (params: ConversationMessageSend): Promise<R<void>> => {\n return request.post('/lolr/conversation/send', params)\n}\n\n/**\n * 打断流式输出\n */\nexport const conversationStop = (conversationId: ConversationType['id']): Promise<R<void>> => {\n return request.post('/lolr/conversation/stop', { conversationId })\n}\n/**\n * FileUploadConfig,文件上传配置\n */\nexport interface FileUploadConfig {\n /**\n * Allowedfiletypes,允许的文件类型\n */\n allowedFileTypes: string[]\n /**\n * Enabled,是否启用文件上传\n */\n enabled: boolean\n /**\n * Maxfilecount,最大文件数量\n */\n maxFileCount: number\n /**\n * Maxfilesize,最大文件大小\n */\n maxFileSize?: number\n}\n\n/**\n * QuestionBO,推荐问题或热门问题项\n */\nexport interface RecommendQuestion {\n /**\n * Id,问题 ID\n */\n id: number\n /**\n * Question,问题内容\n */\n question: string\n}\n/**\n * LabelBO,热门问题标签\n */\nexport interface HotQuestionList {\n /**\n * Id,标签 ID\n */\n id: number\n /**\n * Items,标签下的问题列表\n */\n items: RecommendQuestion[]\n /**\n * Name,标签名称\n */\n name: string\n}\n\nexport interface AgentConfig {\n /**\n * 文件上传配置\n */\n fileUpload?: FileUploadConfig[]\n /**\n * Labels,热门问题标签列表\n */\n labels?: HotQuestionList[]\n /**\n * Recommendquestions,推荐问题列表\n */\n recommendQuestions?: RecommendQuestion[]\n}\nexport interface AgentInfo {\n /**\n * Agentname,名称\n */\n agentName: string\n /**\n * Agenttype,智能体类型\n */\n agentType: number\n /**\n * 智能体的附带信息\n */\n config: AgentConfig\n /**\n * Description,描述\n */\n description?: string\n /**\n * Id,主键\n */\n id: string\n /**\n * Isavailable,是否可用\n */\n isAvailable?: boolean\n /**\n * Logo,logo\n */\n logo: string\n feature?: string // json字符串\n}\n/**\n * 获取智能体信息\n */\nexport const agentInfoQuery = (agentId: AgentInfo['id']): Promise<R<AgentInfo>> => {\n return request.get('/lolr/agent/detail', { agentId })\n}\n\nexport interface AgentCharacter {\n /**\n * Agentid,智能体ID\n */\n agentId: number\n /**\n * Charactername,性格名称\n */\n characterName: string\n /**\n * Detaillevel,详细程度:1-10\n */\n detailLevel: number\n /**\n * Humorlevel,幽默程度:1-10\n */\n humorLevel: number\n /**\n * Id,id\n */\n id: number\n /**\n * Logo,头像,存储图片路径\n */\n logo: string\n /**\n * Professionallevel,专业程度:1-10\n */\n professionalLevel: number\n /**\n * Selected,是否已选择\n */\n selected: boolean\n /**\n * Sex,性别:1-男,2-女\n */\n sex: number\n}\n/**\n * 获取智能体角色性格列表\n */\nexport const agentCharacterQuery = (agentId: AgentInfo['id']): Promise<R<AgentCharacter[]>> => {\n return request.get('/lolr/character', { agentId })\n}\n/**\n * 选择智能体角色\n */\nexport const agentCharacterSelect = (agentId: AgentInfo['id'], characterId: AgentCharacter['id']): Promise<R<null>> => {\n return request.post('/lolr/character/user', { agentId, characterId })\n}\n\n/**\n * 文件上传\n */\nexport const fileUpload = (formData: FormData): Promise<R<InputFile>> => {\n return request.post('/lolr/storage/upload', formData, { timeout: 5 * 60 * 1000 })\n}\n","export const customComponents = {\n appCard: () => import('./AppCard'),\n fileView: () => import('./FileView'),\n indexQuote: () => import('./IndexQuote'),\n mdEdit: () => import('./MdEdit'),\n fileEdit: () => import('./FileEdit'),\n quoteList: () => import('./QuoteList')\n}\n","import { Attachments, Bubble, BubbleProps } from '@ant-design/x'\nimport { RenderMarkdown } from '@zero-library/common'\nimport { Flex } from 'antd'\nimport { ConversationMessage } from '../services'\nimport { customComponents } from '../ui/common/markdownAlert'\n\ninterface Props {\n message: ConversationMessage\n placement: BubbleProps['placement']\n}\n\nexport default ({ message, placement }: Props) => {\n return (\n <Flex vertical>\n {message.msgContent && (\n <Bubble placement={placement} content={<RenderMarkdown content={message.msgContent} customComponents={customComponents} />} />\n )}\n {message.msgFiles?.map((file) => (\n <Bubble\n className=\"m-t-8\"\n key={file.content}\n variant=\"borderless\"\n placement={placement}\n content={\n <Attachments.FileCard\n key={file.content}\n item={{\n uid: file.content,\n name: file.name,\n url: file.content\n }}\n />\n }\n />\n ))}\n {/* {message.quoteMsg?.id && (\n <Bubble\n className={classNames(styles.chatQuoteMsg)}\n placement={placement}\n content={\n <Flex vertical gap={8}>\n {message.quoteMsg.quoteMsgContent && (\n <Flex>\n <span>【引用消息】:</span>\n <Flex flex={1} className=\"text-ellipsis-3\">\n {message.quoteMsg.quoteMsgContent}\n </Flex>\n </Flex>\n )}\n {message.quoteMsg?.msgImgList && message.quoteMsg.msgImgList.length > 0 && (\n <Flex>\n <span>【引用图片】:</span>\n <Flex gap={8} wrap flex={1}>\n {message.quoteMsg.msgImgList.map((url, index) => (\n <Attachments.FileCard\n key={index}\n item={{\n uid: url,\n url,\n name: getFileName(url)\n }}\n />\n ))}\n </Flex>\n </Flex>\n )}\n </Flex>\n }\n />\n )} */}\n </Flex>\n )\n}\n","export type ConversationMemberEnum = 'agent' | 'user' | 'other'\nexport const MEMBER_TYPE: ObjectType<ConversationMemberEnum> = {\n 1: 'user',\n 2: 'other',\n 3: 'agent'\n}\n","import { CopyOutlined, DislikeOutlined, LikeOutlined, OpenAIOutlined } from '@ant-design/icons'\nimport { Bubble, BubbleProps, Prompts, Welcome } from '@ant-design/x'\nimport { BubbleDataType } from '@ant-design/x/es/bubble/BubbleList'\nimport { isBoolean, RenderWrapper, shouldRender, UserAvatar } from '@zero-library/common'\nimport { Avatar, Button, Flex, GetRef, Space } from 'antd'\nimport classNames from 'classnames'\nimport { useEffect, useMemo, useRef } from 'react'\nimport { useSnapshot } from 'valtio'\nimport ChatMessageRender from '../../components/MessageRender'\nimport { ConversationMemberEnum, MEMBER_TYPE } from '../../core/constants'\nimport { copy } from '../../core/utils'\nimport { ConversationMessage } from '../../services'\nimport { ChatLayoutMessageList, MessageBoxType } from '../../stores'\nimport { useChatStore } from '../../stores/Context'\nimport MessageAIRender from './MessageAIRender'\nimport styles from './styles.module.less'\n\ninterface RoleContent {\n user: ConversationMemberEnum\n placement: BubbleProps['placement']\n avatar?: any\n}\n\n/* 🌟 消息列表 */\nexport default ({ firstMessage = false, avatar = { user: false, agent: true, other: true } }: ChatLayoutMessageList) => {\n const chatStore = useChatStore()\n\n const receiverState = useSnapshot(chatStore.receiver)\n const conversationState = useSnapshot(chatStore.conversation)\n\n const conversationRoles = useMemo(() => {\n const roles = {} as Record<ConversationMemberEnum, RoleContent>\n if (conversationState.active.member.user) {\n roles.user = {\n user: 'user',\n placement: 'end',\n avatar: (isBoolean(avatar) ? avatar : avatar?.user) ? (\n <UserAvatar\n size={30}\n avatarSrc={conversationState.active.member.user?.memberAvatar}\n userName={conversationState.active.member.user?.memberName}\n />\n ) : null\n }\n }\n if (conversationState.active.member.agent) {\n roles.agent = {\n user: 'agent',\n placement: 'start',\n avatar: (isBoolean(avatar) ? avatar : avatar?.agent)\n ? { src: conversationState.active.member.agent?.memberAvatar, icon: <OpenAIOutlined /> }\n : null\n }\n }\n if (conversationState.active.member.other) {\n roles.other = {\n user: 'other',\n placement: 'start',\n avatar: (isBoolean(avatar) ? avatar : avatar?.other)\n ? { src: conversationState.active.member.other?.memberAvatar, icon: <OpenAIOutlined /> }\n : null\n }\n }\n return roles\n }, [conversationState.active.member, avatar])\n // 当前会话参数\n const chatMessage = useMemo(\n () => conversationState.messages[conversationState.active.id] || ({} as MessageBoxType),\n [conversationState.messages[conversationState.active.id]]\n )\n const placeholderNode = useMemo(\n () => [\n {\n key: 'placeholder',\n content: (\n <Space direction=\"vertical\" size={16} className={styles.chatWelcomeWrap}>\n <Welcome\n className={classNames(styles.chatWelcome, 'p-t-32')}\n variant=\"borderless\"\n icon={<Avatar shape=\"square\" size={58} src={receiverState.active.logo} />}\n title={`你好,我是${receiverState.active.name || ''}`}\n description={<div dangerouslySetInnerHTML={{ __html: receiverState.active.description || '' }}></div>}\n />\n {receiverState.active.config?.recommendQuestions?.length > 0 && (\n <Prompts\n className=\"m-t-16\"\n wrap\n items={[\n {\n key: '1',\n label: '🤔 推荐问题:',\n children: receiverState.active.config.recommendQuestions.map(({ question }) => ({\n key: question,\n description: (\n <span onClick={() => chatStore.sendMessage(question)} className={classNames(styles.chatWelcomePrompts, 'text-ellipsis')}>\n {question}\n </span>\n )\n }))\n }\n ]}\n />\n )}\n </Space>\n ),\n variant: 'borderless'\n } as BubbleDataType\n ],\n [receiverState.active]\n )\n\n const questionList = useMemo(\n () =>\n chatMessage?.questionList?.length\n ? [\n {\n key: 'questionList',\n content: (\n <Prompts\n className=\"m-b-16\"\n styles={{\n list: {\n overflow: 'auto'\n }\n }}\n vertical\n items={chatMessage?.questionList.map((question) => ({\n key: question,\n description: <span onClick={() => chatStore.sendMessage(question)}>{question}</span>\n }))}\n />\n ),\n variant: 'borderless',\n avatar: { style: { visibility: 'hidden' } }\n } as BubbleDataType\n ]\n : [],\n [chatMessage?.questionList]\n )\n\n const chatRecords = useMemo(() => {\n return (chatMessage?.message || []).map((message, index) => {\n // let isHasTime = false\n // if (index === 0) {\n // isHasTime = true\n // } else {\n // const lastMessage = chatMessage.message[index - 1]\n // // if((lastMessage.sendDate - message.sendDate) > 60 * 60 * 1000)\n // }\n const role = conversationRoles[MEMBER_TYPE[message.sender.type]] || ({} as RoleContent)\n return {\n key: message.id,\n placement: role.placement,\n variant: 'borderless',\n avatar: role.avatar,\n content:\n role.user === 'agent' ? (\n <MessageAIRender message={message as ConversationMessage} placement={role.placement} />\n ) : (\n <ChatMessageRender message={message as ConversationMessage} placement={role.placement} />\n ),\n // loadingRender: () => <Spin size=\"small\" />,\n footer: role.user === 'agent' && (\n <Flex>\n <Button onClick={() => copy(message.msgContent)} color=\"default\" variant=\"text\" size=\"small\" icon={<CopyOutlined />} />\n <Button\n color={message.msgFeedback === 1 ? 'primary' : 'default'}\n disabled={!!message.type}\n size=\"small\"\n variant=\"text\"\n icon={<LikeOutlined />}\n onClick={() => chatStore.feedback(conversationState.active.id, message.id, 1, index)}\n />\n <Button\n color={message.msgFeedback === 2 ? 'primary' : 'default'}\n disabled={!!message.type}\n size=\"small\"\n variant=\"text\"\n icon={<DislikeOutlined />}\n onClick={() => chatStore.feedback(conversationState.active.id, message.id, 2, index)}\n />\n {/* <Button color=\"default\" variant=\"text\" size=\"large\" icon={<ShareAltOutlined />} /> */}\n {/* <Button color=\"default\" variant=\"text\" size=\"large\" icon={<ReloadOutlined />} /> */}\n </Flex>\n )\n // ...(isHasTime\n // ? { rootClassName: styles.hasSendTime, classNames: { header: styles.sendTime }, header: <span>{formatDate(message.sendDate)}</span> }\n // : {})\n } as BubbleDataType\n })\n }, [chatMessage?.message])\n\n const firstMessageRecord = useMemo(() => {\n const isExist = shouldRender(firstMessage)\n return isExist\n ? [\n {\n key: 'firstMessage',\n content: <RenderWrapper control={firstMessage} />,\n placement: 'end'\n // avatar: { style: { visibility: 'hidden' } }\n } as BubbleDataType\n ]\n : []\n }, [firstMessage])\n const bubbleListItems = useMemo(() => {\n const list = []\n if (firstMessageRecord.length > 0) {\n list.push(...firstMessageRecord)\n }\n if (chatRecords.length > 0) {\n list.push(...chatRecords, ...questionList)\n }\n if (list.length) {\n return list\n }\n return [...placeholderNode]\n }, [chatRecords, questionList, placeholderNode, firstMessageRecord])\n\n const listRef = useRef<GetRef<typeof Bubble.List>>(null)\n // 真实控制是否自动滚动的 ref(不会触发渲染)\n const autoScrollRef = useRef(true)\n const handleScroll = (el: any) => {\n const target = el.target\n // console.log('handleScroll', target.scrollHeight - target.scrollTop - target.clientHeight)\n const distanceToBottom = target.scrollHeight - target.scrollTop - target.clientHeight\n // 小于 100px 表示接近底部,允许自动滚动\n autoScrollRef.current = distanceToBottom < 100\n }\n useEffect(() => {\n // console.log('bubbleListItems2')\n autoScrollRef.current = true\n }, [bubbleListItems.length])\n useEffect(() => {\n const el = listRef.current?.nativeElement\n if (!el || !bubbleListItems.length) return\n // console.log('bubbleListItems', bubbleListItems, autoScrollRef.current)\n // 只有当用户在底部(autoScroll = true)时,才滚动到底\n if (autoScrollRef.current) {\n setTimeout(() => {\n if (autoScrollRef.current) {\n listRef.current?.scrollTo({\n key: bubbleListItems[bubbleListItems.length - 1].key,\n block: 'end'\n })\n }\n }, 100)\n }\n }, [bubbleListItems])\n return (\n <Bubble.List\n autoScroll={false}\n key={conversationState.active.id}\n ref={listRef}\n items={bubbleListItems}\n className={classNames(styles.nsBubbleList, 'height-full', 'scroll-fade-in')}\n onScroll={handleScroll}\n />\n )\n}\n",".loadingMessage {\n background-image: linear-gradient(90deg, #ff6b23 0%, #af3cb8 31%, #53b6ff 89%);\n background-size: 100% 2px;\n background-repeat: no-repeat;\n background-position: bottom;\n padding-bottom: 2px;\n}\n.conversationListPanel {\n width: 360px;\n}\n.nsConversations {\n padding: 0 24px;\n}\n.nsConversations :global .ant-conversations-group-title {\n padding: 0;\n}\n.nsConversations :global .ant-conversations-group-title .ant-typography {\n color: #878aab;\n}\n.nsConversations :global .ant-conversations-list .ant-conversations-item {\n padding-left: 16px;\n}\n.nsConversations :global .ant-conversations-list .ant-conversations-item .ant-conversations-label {\n color: rgba(0, 0, 0, 0.88);\n}\n.nsConversations :global .ant-conversations-list .ant-conversations-item.ant-conversations-item-active .ant-conversations-label {\n color: var(--ant-color-primary);\n}\n.nsBodyWidth {\n margin: 0 auto;\n max-width: 896px;\n min-width: 320px;\n width: calc(100% - 24px) !important;\n}\n.nsBubbleList:global.ant-bubble-list .ant-bubble.ant-bubble-start .ant-bubble-content-filled {\n background-color: transparent;\n}\n.nsBubbleList:global.ant-bubble-list .ant-bubble.ant-bubble-end .ant-bubble-content-filled {\n background-color: var(--ant-color-primary-bg);\n}\n.nsBubbleList:global.ant-bubble-list .ant-bubble .ant-bubble-content .ant-typography {\n font-size: 16px;\n}\n.nsBubbleList:global.ant-bubble-list .ant-bubble .ant-bubble-content > .ant-collapse {\n margin-bottom: 16px;\n}\n.nsBubbleList:global.ant-bubble-list .ant-bubble .ant-bubble-content > .ant-collapse .ant-collapse-header {\n color: #8f91a8;\n}\n.nsBubbleList:global.ant-bubble-list .ant-bubble .ant-bubble-content > .ant-collapse .ant-collapse-content {\n color: #8f91a8;\n margin-top: -10px;\n}\n.nsBubbleList:global.ant-bubble-list .ant-bubble .ant-bubble-content > .ant-collapse .ant-collapse-content .ant-collapse-content-box {\n padding: 0 10px 0 24px;\n}\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n.nsChatHeader {\n padding: 8px 16px;\n border-bottom: 1px solid #eee;\n}\n.nsChatHeader .nsChatTitle {\n font-size: 16px;\n font-weight: bold;\n}\n.nsChatHeader .nsChatHeaderPopover {\n max-height: 500px;\n width: 300px;\n display: flex;\n flex-direction: column;\n}\n.nsChatHeader .nsChatHeaderPopover :global .ant-popover-inner-content {\n min-height: 0;\n display: flex;\n flex-direction: column;\n}\n.chatWelcomeWrap :global .ant-prompts .ant-prompts-list {\n overflow: auto;\n}\n.chatWelcomeWrap .chatWelcome :global .ant-welcome-icon > img {\n border-radius: 10px;\n max-width: initial;\n}\n.chatWelcomeWrap .chatWelcomePrompts {\n width: 300px;\n}\n.senderListTitle {\n width: 300px;\n}\n.senderList :global .ant-list-items {\n max-height: 350px;\n overflow-y: auto;\n margin-right: -12px;\n padding-right: 12px;\n}\n.senderList.historyList :global .ant-list-items {\n max-height: initial;\n}\n.senderList .senderListItem {\n background-color: #f6f6f6;\n color: #6b6b6b !important;\n border-radius: 5px;\n width: 300px;\n padding: 6px 12px !important;\n margin-top: 12px;\n font-size: 14px;\n cursor: pointer;\n}\n.senderList .senderListFooter {\n font-size: 12px;\n}\n.nsChatUserName {\n font-size: 16px;\n font-weight: bold;\n}\n.nsSenderReferenceHeaderTitle:global > .ant-sender-header-title {\n overflow: hidden;\n}\n.nsSenderReferenceHeaderContent {\n padding: 0 !important;\n}\n.avatarListContainer {\n height: 300px;\n padding: 30px 48px 30px 24px;\n overflow-y: auto;\n margin-right: -24px;\n}\n.avatarListContainer .avatarList .avatarListItem:hover {\n opacity: 90%;\n}\n.avatarListContainer .avatarList .avatarListItem .avatarListItemIcon.avatarListItemIconActive {\n outline: 2px solid var(--ant-color-primary);\n}\n.avatarListContainer .avatarList .avatarListItem .avatarListItemName {\n font-size: 12px;\n}\n","import { Bubble, BubbleProps } from '@ant-design/x'\nimport { RenderMarkdown } from '@zero-library/common'\nimport { Collapse, Flex, Spin, Typography } from 'antd'\nimport classNames from 'classnames'\nimport { useMemo } from 'react'\nimport { ConversationMessage } from '../../services'\nimport { customComponents } from './markdownAlert'\nimport styles from './styles.module.less'\n\ninterface Props {\n message?: ConversationMessage\n placement: BubbleProps['placement']\n}\n\nfunction extractThinkContent(content: string): {\n mainContent: string\n thinkContents: string[]\n thinkBuffer: string\n} {\n let main = content\n const thinkContents: string[] = []\n let buffer = ''\n\n const regex = /<think>(.*?)<\\/think>/gs\n for (const match of content.matchAll(regex)) {\n const thinkText = match[1].trim()\n thinkContents.push(thinkText)\n main = main.replace(match[0], '')\n }\n\n const lastStart = content.lastIndexOf('<think>')\n const lastEnd = content.lastIndexOf('</think>')\n if (lastStart > lastEnd) {\n buffer = content.slice(lastStart).replace('<think>', '')\n main = main.slice(0, lastStart)\n }\n\n return { mainContent: main, thinkContents, thinkBuffer: buffer }\n}\n\nfunction renderMarkdownPanel(content: string, label: string, key: string) {\n return {\n key,\n label,\n children: <RenderMarkdown content={content} customComponents={customComponents} />\n }\n}\n\nexport default ({ message, placement }: Props) => {\n const { mainContent, thinkContents, thinkBuffer } = useMemo(() => {\n if (!message?.msgContent) return { mainContent: '', thinkContents: [], thinkBuffer: '' }\n return extractThinkContent(message.msgContent)\n }, [message?.msgContent])\n\n if (!message.msgContent) {\n return (\n <Typography>\n <Spin size={'small'} />\n </Typography>\n )\n }\n return (\n <Flex vertical>\n <Bubble\n placement={placement}\n className={classNames({ [styles.loadingMessage]: message.type && message.type !== 'TEXT_MESSAGE_END' })}\n content={\n <>\n {/* 渲染 think 内容,默认展开所有项 */}\n {thinkContents.length > 0 && (\n <Collapse\n ghost\n size=\"small\"\n defaultActiveKey={thinkContents.map((_, i) => `think-${i}`)}\n items={thinkContents.map((content, index) => renderMarkdownPanel(content, `思考过程`, `think-${index}`))}\n />\n )}\n\n {/* 渲染缓冲中的 think 内容 */}\n {thinkBuffer && (\n <Collapse\n ghost\n size=\"small\"\n defaultActiveKey={['buffer-think']}\n items={[renderMarkdownPanel(thinkBuffer, '仔细思考中...', 'buffer-think')]}\n />\n )}\n\n {/* 渲染主内容 */}\n {/* {mainContent && message.status === 'error' ? (\n <div>\n <CloseCircleOutlined color={'red'} /> {mainContent}\n </div>\n ) : ( */}\n <RenderMarkdown content={mainContent} customComponents={customComponents} />\n {/* )} */}\n </>\n }\n />\n </Flex>\n )\n}\n","import { CloseOutlined, CommentOutlined, PlusOutlined } from '@ant-design/icons'\nimport { RenderWrapper } from '@zero-library/common'\nimport { Avatar, Button, Flex, Popover, Space } from 'antd'\nimport { useSnapshot } from 'valtio'\nimport { ChatLayoutHeader } from '../../stores'\nimport { useChatStore } from '../../stores/Context'\nimport AgentCharacter from './AgentCharacter'\nimport ConversationList from './ConversationList'\nimport styles from './styles.module.less'\n\nexport default ({\n title = true,\n closeBtn = false,\n newConversationBtn = true,\n agentCharacter = true,\n conversationListBtn = true\n}: ChatLayoutHeader) => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n const configState = useSnapshot(chatStore.config)\n return (\n <>\n <Flex justify=\"space-between\" align=\"center\" className={styles.nsChatHeader}>\n <Flex gap={4} align=\"center\">\n <RenderWrapper\n control={title}\n DefaultComponent={\n <>\n <Avatar size={22} src={receiverState.active.logo} alt={receiverState.active.name} />\n <div className={styles.nsChatTitle}>{receiverState.active.name}</div>\n </>\n }\n />{' '}\n </Flex>\n <Space size={2}>\n <RenderWrapper control={agentCharacter} DefaultComponent={AgentCharacter} />\n <RenderWrapper\n control={newConversationBtn}\n DefaultComponent={\n <Button title=\"新建会话\" type=\"text\" size=\"large\" icon={<PlusOutlined />} onClick={() => chatStore.createConversation()} />\n }\n />\n\n <RenderWrapper\n control={conversationListBtn}\n DefaultComponent={\n <Popover\n getPopupContainer={(e) => e}\n placement=\"bottom\"\n classNames={{ body: styles.nsChatHeaderPopover }}\n content={<ConversationList />}\n trigger={['click']}\n >\n <Button title=\"历史会话\" type=\"text\" size=\"large\" icon={<CommentOutlined />} />\n </Popover>\n }\n />\n\n <RenderWrapper\n control={closeBtn}\n DefaultComponent={<Button title=\"关闭\" type=\"text\" size=\"large\" onClick={configState.hooks?.onHeaderClose} icon={<CloseOutlined />} />}\n />\n </Space>\n </Flex>\n </>\n )\n}\n","import { Avatar } from 'antd'\nimport { useEffect } from 'react'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport CharacterList from './CharacterList'\n\nexport default () => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n const characterState = useSnapshot(chatStore.character)\n useEffect(() => {\n if (receiverState.active.id && receiverState.active.type === 3) {\n chatStore.getCharacters(receiverState.active.id)\n }\n }, [receiverState.active.id])\n\n return (\n characterState.active.id && (\n <>\n <div title=\"性格\">\n <Avatar onClick={chatStore.openCharacterList} className=\"cursor-pointer\" src={characterState.active.logo} />\n </div>\n {characterState.open && <CharacterList />}\n </>\n )\n )\n}\n","import { Avatar, Col, Flex, Modal, Row } from 'antd'\nimport classNames from 'classnames'\nimport { useState } from 'react'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport styles from './styles.module.less'\n\nexport default () => {\n const chatStore = useChatStore()\n const characterState = useSnapshot(chatStore.character)\n const [activeCharacter, setActiveCharacter] = useState(characterState.active)\n return (\n <Modal\n width={500}\n title=\"选择性格\"\n maskClosable={false}\n open={characterState.open}\n onCancel={chatStore.closeCharacterList}\n loading={characterState.loading}\n okText=\"切换性格\"\n onOk={() => chatStore.switchCharacter(activeCharacter)}\n confirmLoading={characterState.switchLoading}\n >\n <div className={styles.avatarListContainer}>\n <Row wrap gutter={[16, 32]} className={styles.avatarList}>\n {characterState.list.map((item) => (\n <Col span={6} key={item.id}>\n <Flex vertical align=\"center\" className={styles.avatarListItem} onClick={() => setActiveCharacter(item)}>\n <Avatar\n className={classNames(styles.avatarListItemIcon, 'cursor-pointer', {\n [styles.avatarListItemIconActive]: activeCharacter.id === item.id\n })}\n size={50}\n // onClick={openCharacterList}\n src={<img src={item.logo} alt=\"头像\" />}\n />\n <div className={styles.avatarListItemName}>{item.characterName}</div>\n </Flex>\n </Col>\n ))}\n {/* <Col span={6}>\n <Flex vertical align=\"center\" className={styles.avatarListItem} onClick={() => onOpenUpdateCharacter(1)}>\n <PlusCircleFilled className={classNames(styles.avatarListItemIcon, 'cursor-pointer')} style={{ fontSize: 50, color: '#eee' }} />\n <div className={styles.avatarListItemName}>自定义</div>\n </Flex>\n </Col> */}\n </Row>\n </div>\n </Modal>\n )\n}\n","import { DeleteOutlined, RedoOutlined } from '@ant-design/icons'\nimport { Conversations } from '@ant-design/x'\nimport type { Conversation } from '@ant-design/x/es/conversations/interface'\nimport { useDebounce } from '@zero-library/common'\nimport { Empty, Spin } from 'antd'\nimport { useEffect, useMemo } from 'react'\nimport InfiniteScroll from 'react-infinite-scroll-component'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport styles from './styles.module.less'\n\nexport default () => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n const conversationsState = useSnapshot(chatStore.conversations)\n const conversationState = useSnapshot(chatStore.conversation)\n\n const getConversations = useDebounce(() => {\n chatStore.getConversations(receiverState.active.id, 3)\n }, 300)\n\n useEffect(() => {\n if (receiverState.active.id) {\n getConversations()\n }\n }, [receiverState.active.id, conversationsState.updateIndex])\n\n const conversationList = useMemo(() => {\n return conversationsState.list.items.filter((item) => item.label)\n }, [conversationsState.list.items])\n return (\n <>\n <div className=\"height-full scroll-fade-in\" id=\"scrollableDiv\">\n {conversationList.length ? (\n <InfiniteScroll\n dataLength={conversationList.length}\n next={() => {\n console.log('next')\n // chatStore.getConversations(receiverState.active.id, conversationsState.list.lastId)\n }}\n hasMore={false}\n loader={\n <div className=\"text-center\">\n <Spin indicator={<RedoOutlined spin />} size=\"small\" />\n </div>\n }\n style={{ overflow: 'hidden' }}\n scrollableTarget=\"scrollableDiv\" // 👈 指定滚动容器\n >\n <Conversations\n className={styles.nsConversations}\n items={conversationList as Conversation[]}\n activeKey={conversationState.active.id}\n onActiveChange={async (id) => chatStore.switchConversation(id)}\n groupable\n menu={(conversation) => ({\n items: [\n {\n label: '删除会话',\n key: 'delete',\n icon: <DeleteOutlined />,\n danger: true\n }\n ],\n onClick: (menuInfo) => {\n menuInfo.domEvent.stopPropagation()\n if (menuInfo.key === 'delete') {\n chatStore.delConversation(conversation.id)\n }\n }\n })}\n />\n </InfiniteScroll>\n ) : (\n <Empty description=\"暂无会话记录\" image={Empty.PRESENTED_IMAGE_SIMPLE} />\n )}\n </div>\n </>\n )\n}\n",".nsAttachments:global > .ant-attachment-list .ant-attachment-list-card-status-uploading .ant-progress .ant-progress-text {\n display: none;\n}\n.nsAttachments:global > .ant-attachment-list .ant-attachment-list-card-status-uploading .ant-progress .ant-progress-circle {\n animation: spin 2s linear infinite;\n}\n.nsAttachments:global > .ant-attachment-list .ant-attachment-list-card-status-uploading .ant-attachment-list-card-content {\n gap: 4px;\n}\n.nsAttachments:global > .ant-attachment-list .ant-attachment-list-card-status-uploading .ant-attachment-list-card-content .ant-attachment-list-card-desc {\n width: 15px;\n height: 15px;\n border: 2px solid transparent;\n border-color: #1890ff;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n box-sizing: border-box;\n position: relative;\n clip-path: inset(0 0 30% 0);\n}\n.nsAttachments:global > .ant-attachment-list .ant-attachment-list-card-status-uploading .ant-attachment-list-card-content .ant-attachment-list-card-desc .ant-attachment-list-card-ellipsis-prefix {\n display: none;\n}\n","import { CloudUploadOutlined } from '@ant-design/icons'\nimport { Attachments } from '@ant-design/x'\nimport { Attachment } from '@ant-design/x/es/attachments'\nimport { getFileSuffixName, isNullOrUnDef, isNumber, isObject, useDebounce, useRefState } from '@zero-library/common'\nimport { App } from 'antd'\nimport { RcFile, UploadFile } from 'antd/lib/upload'\nimport { forwardRef, useEffect, useImperativeHandle, useMemo, useRef } from 'react'\nimport { FileUploadConfig, InputFile, fileUpload } from '../services'\nimport styles from './styles.module.less'\ninterface Props {\n fileUploadConfig?: FileUploadConfig[]\n extraParams?: ObjectType<string | undefined>\n // fileSizeTip?: string\n fileList?: InputFile[]\n onChange: (fileList: InputFile[]) => void\n}\ntype AttachedFile = Attachment\n// {\n// extension: string\n// }\nexport default forwardRef(({ fileUploadConfig = [], fileList = [], onChange, extraParams }: Props, ref) => {\n const { message } = App.useApp()\n const fileListRef = useRef<InputFile[]>([])\n const [attachedFiles, setAttachedFiles, getAttachedFiles] = useRefState<AttachedFile[]>([])\n // 初始化 fileList 映射为 Attachments 所需格式\n useEffect(() => {\n if (JSON.stringify(fileList) !== JSON.stringify(fileListRef.current)) {\n fileListRef.current = fileList\n const mapped: AttachedFile[] = fileList.map((file) => ({\n ...file,\n uid: file.content,\n url: file.content,\n status: 'done'\n }))\n setAttachedFiles(mapped)\n }\n }, [fileList])\n useEffect(() => {\n // console.log('attachedFiles', attachedFiles)\n const files = attachedFiles\n .filter((file) => file.status === 'done')\n .map((file) => {\n const f = { ...file }\n delete f.status\n delete f.uid\n delete f.size\n delete f.url\n return f as unknown as InputFile\n })\n fileListRef.current = files\n onChange(files)\n }, [attachedFiles])\n const onErrorTip = useDebounce((errorMsg: string) => {\n message.error(errorMsg)\n }, 300)\n /** 根据文件类型找到对应的 upload config */\n const findConfigByFile = (file: RcFile): FileUploadConfig | undefined => {\n return fileUploadConfig.find((cfg) => cfg.allowedFileTypes?.includes(getFileSuffixName(file.name).toLocaleUpperCase()))\n }\n\n const onBeforeUpload = (files: RcFile[]) => {\n // console.log('onBeforeUpload', maxFileCount, files, attachedFiles)\n // 多规则支持:逐个文件校验\n for (const file of files) {\n const cfg = findConfigByFile(file)\n\n if (!cfg) {\n onErrorTip(`不支持的文件类型:${file.name} (${file.type})`)\n return Promise.reject(false)\n }\n\n // 校验数量\n if (isNumber(cfg.maxFileCount)) {\n const currentCount = attachedFiles.filter((f) => cfg.allowedFileTypes.includes(getFileSuffixName(f.name || '').toLocaleUpperCase())).length\n\n if (currentCount + 1 > cfg.maxFileCount) {\n onErrorTip(`【${file.name}】所属类型最多只能上传 ${cfg.maxFileCount} 个文件`)\n return Promise.reject(false)\n }\n }\n }\n }\n const onCustomRequest = async ({ file }: any) => {\n // console.log('onCustomRequest', file)\n const cfg = findConfigByFile(file)\n\n if (!cfg) {\n onErrorTip(`不支持的文件类型:${file.name}`)\n return\n }\n\n // 校验大小\n if (cfg.maxFileSize && file.size > cfg.maxFileSize * 1024 * 1024) {\n onErrorTip(`文件大小不能超过 ${cfg.maxFileSize} MB`)\n return\n }\n // console.log('上传文件列表1:', file)\n setAttachedFiles([\n ...getAttachedFiles(),\n {\n uid: file.uid,\n status: 'uploading',\n percent: 70,\n size: file.size,\n type: file.type,\n name: file.name\n }\n ])\n try {\n const formData = new FormData()\n formData.append('file', file)\n if (isObject(extraParams)) {\n Object.keys(extraParams).forEach((key) => {\n if (isNullOrUnDef(extraParams[key])) return\n formData.append(key, extraParams[key])\n })\n }\n // 发送文件到后端\n const { data } = await fileUpload(formData)\n\n setAttachedFiles(\n getAttachedFiles().map((f) => {\n if (f.uid === file.uid) {\n return { ...data!, uid: data!.content, url: data.content, status: 'done', size: f.size }\n } else {\n return f\n }\n })\n )\n } catch (error) {\n console.log('上传文件错误:', error)\n setAttachedFiles(\n getAttachedFiles().map((f) => {\n if (f.uid === file.uid) {\n return { ...f, status: 'error', description: '上传失败' }\n } else {\n return f\n }\n })\n )\n }\n }\n const onRemove = (file: UploadFile<any>) => {\n // 删除文件\n setAttachedFiles(attachedFiles.filter((f) => f.uid !== file.uid))\n }\n useImperativeHandle(\n ref,\n () => ({\n validateFile: () => {\n const files = getAttachedFiles()\n const uploadingFiles = files.filter((file) => file.status === 'uploading')\n if (uploadingFiles.length > 0) {\n onErrorTip('请等待所有文件上传完成')\n return false\n }\n const errorFiles = files.filter((file) => file.status === 'error')\n if (errorFiles.length > 0) {\n onErrorTip('请检查上传失败的文件')\n return false\n }\n return true\n }\n }),\n []\n )\n\n const acceptStr = useMemo(() => {\n const allTypes = fileUploadConfig.flatMap((cfg) => cfg.allowedFileTypes || [])\n return allTypes.length ? allTypes.join(',') : undefined\n }, [fileUploadConfig])\n return (\n <Attachments\n className={styles.nsAttachments}\n accept={acceptStr}\n multiple={true}\n customRequest={onCustomRequest}\n beforeUpload={(file, files) => onBeforeUpload(files)}\n items={attachedFiles}\n onRemove={onRemove}\n placeholder={(type) =>\n type === 'drop'\n ? { title: '将文件放到这里' }\n : {\n icon: <CloudUploadOutlined />,\n title: '提交文件',\n description: (\n <div>\n <div>单击或拖动文件到此区域进行上传; </div>\n {/* {allowedFileTypes && <div>支持扩展名:{allowedFileTypes}; </div>} */}\n </div>\n )\n }\n }\n />\n )\n})\n","import { PaperClipOutlined } from '@ant-design/icons'\nimport { Sender, Suggestion } from '@ant-design/x'\nimport { useSyncInput } from '@zero-library/common'\nimport { Badge, Button, ButtonProps, Flex, GetRef } from 'antd'\nimport { forwardRef, useImperativeHandle, useRef } from 'react'\nimport { FileUploadConfig, InputFile } from '../services'\nimport ChatSendAttachments from './Attachments'\n\nexport interface ChatSenderHandle {\n focus: (options?: { cursor?: 'start' | 'end' }) => void\n}\ninterface FileUpload {\n params?: ObjectType<any>\n config: FileUploadConfig[]\n}\n\ninterface Props {\n placeholder?: string\n content?: string\n fileList?: InputFile[]\n headerOpen?: boolean\n loading?: boolean\n onContentChange: (value: string) => void\n onFileListChange: (files: InputFile[]) => void\n onHeaderOpenChange: (open: boolean) => void\n onSend: () => void\n onCancel?: () => void\n onFocus?: () => void\n extraHeader?: React.ReactNode\n extraFooter?: React.ReactNode\n extraFooterBelow?: React.ReactNode\n sendBtnProps?: ButtonProps\n fileUpload?: FileUpload\n}\n\nexport default forwardRef<ChatSenderHandle, Props>(\n (\n {\n placeholder,\n content,\n fileList = [],\n headerOpen = false,\n loading = false,\n onContentChange,\n onFileListChange,\n onHeaderOpenChange,\n onSend,\n onCancel,\n onFocus,\n extraHeader,\n extraFooter,\n extraFooterBelow,\n sendBtnProps,\n fileUpload\n },\n ref\n ) => {\n const senderRef = useRef<GetRef<typeof Sender>>(null)\n const { inputValue, setInputValue } = useSyncInput(content || '', onContentChange)\n\n const attachmentsNode = (fileUpload?.config?.length ?? 0 > 0) && (\n <Badge dot={!!fileList?.length && !headerOpen}>\n <Button type=\"text\" icon={<PaperClipOutlined />} onClick={() => onHeaderOpenChange(!headerOpen)} />\n </Badge>\n )\n\n const attachmentsRef = useRef<any>()\n const senderHeader = (\n <>\n <Sender.Header title=\"选择文件\" open={headerOpen} onOpenChange={onHeaderOpenChange}>\n <ChatSendAttachments\n ref={attachmentsRef}\n fileList={fileList}\n onChange={onFileListChange}\n fileUploadConfig={fileUpload.config}\n extraParams={fileUpload.params}\n />\n </Sender.Header>\n {extraHeader}\n </>\n )\n const onSubmit = () => {\n if (!attachmentsRef.current?.validateFile || attachmentsRef.current.validateFile()) {\n onSend()\n }\n }\n\n // 暴露方法给外部组件\n useImperativeHandle(\n ref,\n () => ({\n focus: (options?: { cursor?: 'start' | 'end' }) => {\n senderRef.current?.focus(options)\n }\n }),\n []\n )\n\n return (\n <Suggestion items={[]} onSelect={(itemVal) => setInputValue(`[${itemVal}]:`)}>\n {({}) => (\n <Sender\n ref={senderRef}\n value={inputValue}\n header={senderHeader}\n onSubmit={onSubmit}\n onChange={setInputValue}\n onFocus={onFocus}\n autoSize={{ minRows: 2, maxRows: 6 }}\n // prefix={attachmentsNode}\n // loading={loading}\n // components={{ input: (...Props) => <MarkdownEditor showToolbar={false} /> }}\n onCancel={onCancel}\n footer={({ components }) => {\n const { SendButton, LoadingButton } = components\n return (\n <Flex vertical>\n <Flex justify=\"space-between\" align=\"center\" gap={12}>\n <Flex className=\"flex-1\" gap={6} align=\"center\">\n {attachmentsNode}\n {extraFooter}{' '}\n </Flex>\n <Flex align=\"center\">{loading ? <LoadingButton /> : <SendButton {...sendBtnProps} />}</Flex>\n </Flex>\n {extraFooterBelow}\n </Flex>\n )\n }}\n actions={false}\n placeholder={placeholder || '有什么我能帮您的吗?'}\n />\n )}\n </Suggestion>\n )\n }\n)\n","import { EnterOutlined, UserSwitchOutlined } from '@ant-design/icons'\nimport { Sender } from '@ant-design/x'\nimport { RenderWrapper, shouldRender } from '@zero-library/common'\nimport { Button, Flex, Typography } from 'antd'\nimport { forwardRef, useMemo } from 'react'\nimport { useSnapshot } from 'valtio'\nimport ChatSender, { ChatSenderHandle } from '../../components/ChatSender'\nimport { FileUploadConfig, InputFile } from '../../services'\nimport { ChatLayoutSender, MessageBoxType } from '../../stores'\nimport { useChatStore } from '../../stores/Context'\nimport SenderPromptsItems from './SenderPromptsItems'\nimport styles from './styles.module.less'\n\nexport default forwardRef<ChatSenderHandle, ChatLayoutSender>(\n ({ placeholder, extraBtn = false, referencesBtn = false, sendBtnProps = {}, footerBelow = false, prompts = true }, ref) => {\n const chatStore = useChatStore()\n\n const receiverState = useSnapshot(chatStore.receiver)\n const conversationState = useSnapshot(chatStore.conversation)\n // 当前会话参数\n const chatMessage = useMemo(\n () => conversationState.messages[conversationState.active.id] || ({} as MessageBoxType),\n [conversationState.messages[conversationState.active.id]]\n )\n const referenceHandle = (con: string) => {\n if (chatMessage?.loading) return\n chatStore.setContent(con)\n setTimeout(() => {\n chatStore.sendMessage()\n }, 10)\n }\n\n return (\n <Flex vertical gap={8}>\n {/* 🌟 提示词 */}\n <RenderWrapper control={prompts} DefaultComponent={SenderPromptsItems} />\n <ChatSender\n ref={ref}\n placeholder={placeholder}\n content={chatMessage.content}\n fileList={chatMessage.files as InputFile[]}\n headerOpen={chatMessage.headerOpen}\n loading={chatMessage.loading}\n onContentChange={chatStore.setContent}\n onFileListChange={chatStore.setFileList}\n onHeaderOpenChange={chatStore.setHeaderOpen}\n onSend={() => chatStore.sendMessage()}\n onCancel={chatStore.cancelReceive}\n onFocus={chatStore.config.hooks?.onSenderFocus}\n fileUpload={{\n config: receiverState.active.config?.fileUpload as FileUploadConfig[]\n }}\n sendBtnProps={sendBtnProps}\n extraFooterBelow={<RenderWrapper control={footerBelow} />}\n extraFooter={\n <>\n {receiverState.active.feature?.deepThink && (\n <Button\n size=\"small\"\n color={receiverState.params.thinkMode === '1' ? 'primary' : 'default'}\n variant=\"filled\"\n onClick={() => chatStore.setReceiverParams({ thinkMode: receiverState.params.thinkMode === '1' ? '2' : '1' })}\n >\n 深度思考\n </Button>\n )}\n {receiverState.active.feature?.switchManual && (\n <Button\n size=\"small\"\n title={\n chatMessage?.speakHuman\n ? '当前状态为人工模式。您发送的问题将直接发送给专家,智能助手将不再回复'\n : '当前状态为智能助手模式。您发送的问题将发送给智能助手,智能助手将回复您'\n }\n shape=\"round\"\n icon={<UserSwitchOutlined />}\n color={chatMessage?.speakHuman ? 'primary' : 'default'}\n variant=\"filled\"\n onClick={() => {\n chatStore.setSpeakHuman?.(!chatMessage?.speakHuman)\n }}\n >\n 向专家咨询\n </Button>\n )}\n <RenderWrapper control={extraBtn} />\n </>\n }\n extraHeader={\n <Sender.Header\n title={\n <Flex gap={4}>\n <EnterOutlined />\n <Typography.Text type=\"secondary\" ellipsis>\n {chatMessage?.references?.content?.name}\n </Typography.Text>\n </Flex>\n }\n open={!!chatMessage?.references?.content?.name}\n onOpenChange={() => chatStore.setReferences()}\n classNames={{\n header: styles.nsSenderReferenceHeaderTitle,\n content: shouldRender(referencesBtn) ? '' : styles.nsSenderReferenceHeaderContent\n }}\n >\n <RenderWrapper\n control={referencesBtn}\n DefaultComponent={\n <Flex gap={8}>\n {['深度解读', '概要解读'].map((con) => (\n <Button key={con} color=\"primary\" variant=\"filled\" onClick={() => referenceHandle(con)}>\n {con} →\n </Button>\n ))}\n </Flex>\n }\n />\n </Sender.Header>\n }\n />\n </Flex>\n )\n }\n)\n","import { Button, Flex, List, Popover } from 'antd'\nimport classNames from 'classnames'\nimport { useMemo } from 'react'\nimport { useSnapshot } from 'valtio'\nimport { RecommendQuestion } from '../../services'\nimport { useChatStore } from '../../stores/Context'\nimport styles from './styles.module.less'\n\n/* 🌟 提示词 */\nexport default () => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n\n const component = useMemo(\n () =>\n receiverState.active.config?.labels?.length > 0 && (\n <Flex gap={4} className=\"overflow-hidden\">\n <Button disabled color=\"default\" variant=\"text\">\n 随便聊聊\n </Button>\n {receiverState.active.config.labels.map((question) => (\n <Popover\n key={question.id}\n content={\n <List\n itemLayout=\"horizontal\"\n split={false}\n className={styles.senderList}\n dataSource={question.items as RecommendQuestion[]}\n renderItem={(item) => (\n <List.Item onClick={() => chatStore.sendMessage(item.question)} className={styles.senderListItem}>\n {item.question}\n </List.Item>\n )}\n footer={\n <Flex justify=\"end\" className={styles.senderListFooter}>\n (您可点击以上问题开启AI体验)\n </Flex>\n }\n />\n }\n title={\n <div\n className={classNames(styles.senderListTitle, 'text-ellipsis')}\n >{`${receiverState.active.name}开始关注${question.name}内容!`}</div>\n }\n >\n <Button color=\"default\" variant=\"filled\">\n {question.name}\n </Button>\n </Popover>\n ))}\n </Flex>\n ),\n [receiverState.active.config?.labels]\n )\n return component\n}\n","import { PlusOutlined } from '@ant-design/icons'\nimport { Avatar, Button, Flex } from 'antd'\nimport classNames from 'classnames'\nimport { useSnapshot } from 'valtio'\nimport { useChatStore } from '../../stores/Context'\nimport styles from './styles.module.less'\n\nexport default () => {\n const chatStore = useChatStore()\n const receiverState = useSnapshot(chatStore.receiver)\n\n return (\n <div className=\"p-24\">\n <Flex align=\"center\" gap={8}>\n <Avatar size={36} src={receiverState.active.logo} />\n <span className={styles.nsChatUserName}>{receiverState.active.name}</span>\n </Flex>\n <Button\n block\n type=\"primary\"\n shape=\"round\"\n onClick={() => chatStore.createConversation()}\n className={classNames('m-t-16')}\n icon={<PlusOutlined />}\n >\n 新建会话\n </Button>\n </div>\n )\n}\n","import { RenderWrapper } from '@zero-library/common'\nimport { Flex } from 'antd'\nimport classNames from 'classnames'\nimport { ChatLayoutConversationList } from '../../stores'\nimport ConversationList from './ConversationList'\nimport ConversationListHeader from './ConversationListHeader'\nimport styles from './styles.module.less'\n\nexport default ({ header }: ChatLayoutConversationList) => {\n return (\n <Flex vertical className={classNames('height-full', styles.conversationListPanel)}>\n <RenderWrapper control={header} DefaultComponent={ConversationListHeader} />\n <div className=\"full-scroll\">\n <ConversationList />\n </div>\n </Flex>\n )\n}\n",".nsPreviewHeader {\n padding: 16px 24px;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);\n}\n.nsPreviewHeader .nsPreviewHeaderTitle {\n font-size: 16px;\n font-weight: bold;\n}\n.nsChatSenderHeader {\n margin-bottom: 16px;\n padding: 24px;\n font-size: 24px;\n text-align: center;\n}\n.nsDisclaimerNotice {\n font-size: 12px;\n text-align: center;\n color: #bfbfbf;\n}\n.nsChatLayout {\n background-color: #fff;\n}\n"]}