pcm-agents 0.6.76 → 0.6.78
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components-position-selector.cjs.entry.js +1 -1
- package/dist/cjs/index-C_qhED9Z.js +2 -6
- package/dist/cjs/{index-DJuHr4W9.js → index-DOCJeM7I.js} +3 -3
- package/dist/cjs/{index-DJuHr4W9.js.map → index-DOCJeM7I.js.map} +1 -1
- package/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/oem-htws-modal.cjs.entry.js +1 -1
- package/dist/cjs/oem-jd-modal.cjs.entry.js +2 -2
- package/dist/cjs/oem-jlpp-modal.cjs.entry.js +1 -1
- package/dist/cjs/oem-jlsx-modal.cjs.entry.js +24 -2
- package/dist/cjs/oem-jlsx-modal.cjs.entry.js.map +1 -1
- package/dist/cjs/oem-jlsx-modal.entry.cjs.js.map +1 -1
- package/dist/cjs/oem-jlzz-modal.cjs.entry.js +1 -1
- package/dist/cjs/oem-mnct-modal.cjs.entry.js +1 -1
- package/dist/cjs/oem-mnms-modal.cjs.entry.js +1 -1
- package/dist/cjs/oem-qgqjl-modal.cjs.entry.js +1 -1
- package/dist/cjs/oem-zygh-modal.cjs.entry.js +1 -1
- package/dist/cjs/{pcm-1zhanshi-mnms-modal_28.cjs.entry.js → pcm-1zhanshi-mnms-modal_29.cjs.entry.js} +540 -108
- package/dist/cjs/pcm-1zhanshi-mnms-modal_29.cjs.entry.js.map +1 -0
- package/dist/cjs/pcm-agents.cjs.js +1 -1
- package/dist/cjs/pcm-hr-chat-modal.cjs.entry.js +19 -2
- package/dist/cjs/pcm-hr-chat-modal.cjs.entry.js.map +1 -1
- package/dist/cjs/pcm-hr-chat-modal.entry.cjs.js.map +1 -1
- package/dist/cjs/{sentry-reporter-COJ0pOg4.js → sentry-reporter-BY3e-WWj.js} +3 -3
- package/dist/cjs/{sentry-reporter-COJ0pOg4.js.map → sentry-reporter-BY3e-WWj.js.map} +1 -1
- package/dist/collection/components/oem-jlsx-modal/oem-jlsx-modal.js +22 -0
- package/dist/collection/components/oem-jlsx-modal/oem-jlsx-modal.js.map +1 -1
- package/dist/collection/components/pcm-app-chat-modal/pcm-app-chat-modal.js +19 -0
- package/dist/collection/components/pcm-app-chat-modal/pcm-app-chat-modal.js.map +1 -1
- package/dist/collection/components/pcm-hr-chat-modal/pcm-hr-chat-modal.js +17 -0
- package/dist/collection/components/pcm-hr-chat-modal/pcm-hr-chat-modal.js.map +1 -1
- package/dist/collection/components/pcm-jlpp-modal/pcm-jlpp-modal.js +12 -11
- package/dist/collection/components/pcm-jlpp-modal/pcm-jlpp-modal.js.map +1 -1
- package/dist/collection/components/pcm-jlsx-modal/pcm-jlsx-modal.js +12 -0
- package/dist/collection/components/pcm-jlsx-modal/pcm-jlsx-modal.js.map +1 -1
- package/dist/collection/components/pcm-jlzz-modal/pcm-jlzz-modal.js +88 -2
- package/dist/collection/components/pcm-jlzz-modal/pcm-jlzz-modal.js.map +1 -1
- package/dist/collection/components/pcm-qgqjl-modal/pcm-qgqjl-modal.js +20 -19
- package/dist/collection/components/pcm-qgqjl-modal/pcm-qgqjl-modal.js.map +1 -1
- package/dist/collection/components/pcm-virtual-chat-modal/pcm-virtual-chat-modal.js +108 -3
- package/dist/collection/components/pcm-virtual-chat-modal/pcm-virtual-chat-modal.js.map +1 -1
- package/dist/collection/components/pcm-zsk-chat-modal/pcm-zsk-chat-modal.js +17 -0
- package/dist/collection/components/pcm-zsk-chat-modal/pcm-zsk-chat-modal.js.map +1 -1
- package/dist/collection/components/pcm-zygh-v2-modal/pcm-zygh-v2-modal.js +14 -14
- package/dist/collection/components/pcm-zygh-v2-modal/pcm-zygh-v2-modal.js.map +1 -1
- package/dist/components/components-position-selector.js +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/oem-htws-modal.js +6 -6
- package/dist/components/oem-jd-modal.js +4 -4
- package/dist/components/oem-jlpp-modal.js +8 -8
- package/dist/components/oem-jlsx-modal.js +28 -6
- package/dist/components/oem-jlsx-modal.js.map +1 -1
- package/dist/components/oem-jlzz-modal.js +6 -6
- package/dist/components/oem-mnct-modal.js +8 -8
- package/dist/components/oem-mnms-modal.js +9 -9
- package/dist/components/oem-qgqjl-modal.js +8 -8
- package/dist/components/oem-zygh-modal.js +6 -6
- package/dist/components/{p-CGRQB-kz.js → p-9hnllPbt.js} +3 -3
- package/dist/components/{p-CGRQB-kz.js.map → p-9hnllPbt.js.map} +1 -1
- package/dist/components/{p-nFix5BDn.js → p-B7cdvqSY.js} +4 -4
- package/dist/components/{p-nFix5BDn.js.map → p-B7cdvqSY.js.map} +1 -1
- package/dist/components/{p-BZeNORff.js → p-BnkPmLIU.js} +111 -6
- package/dist/components/p-BnkPmLIU.js.map +1 -0
- package/dist/components/{p-DtCXILg5.js → p-C4KAf-6-.js} +3 -3
- package/dist/components/{p-DtCXILg5.js.map → p-C4KAf-6-.js.map} +1 -1
- package/dist/components/{p-pTzOe1-b.js → p-C6OdIxkm.js} +3 -3
- package/dist/components/{p-pTzOe1-b.js.map → p-C6OdIxkm.js.map} +1 -1
- package/dist/components/{p-BJnD41Qm.js → p-DHwXxizT.js} +3 -3
- package/dist/components/{p-BJnD41Qm.js.map → p-DHwXxizT.js.map} +1 -1
- package/dist/components/{p-Caxrsbp0.js → p-Da-8BxdM.js} +24 -5
- package/dist/components/p-Da-8BxdM.js.map +1 -0
- package/dist/components/{p--B9t4xVs.js → p-QwH3TimN.js} +3 -3
- package/dist/components/{p--B9t4xVs.js.map → p-QwH3TimN.js.map} +1 -1
- package/dist/components/{p-BjKpPzZZ.js → p-ikx6J73I.js} +3 -3
- package/dist/components/{p-BjKpPzZZ.js.map → p-ikx6J73I.js.map} +1 -1
- package/dist/components/{p-CvHWzHdd.js → p-qUBE1daM.js} +3 -3
- package/dist/components/{p-CvHWzHdd.js.map → p-qUBE1daM.js.map} +1 -1
- package/dist/components/pcm-1zhanshi-mnms-modal.js +5 -5
- package/dist/components/pcm-app-chat-modal.js +1 -1
- package/dist/components/pcm-ats-mnms-modal.js +5 -5
- package/dist/components/pcm-card.js +1 -1
- package/dist/components/pcm-chat-message.js +1 -1
- package/dist/components/pcm-digital-human.js +1 -1
- package/dist/components/pcm-export-records-modal.js +1 -1
- package/dist/components/pcm-hr-chat-modal.js +19 -2
- package/dist/components/pcm-hr-chat-modal.js.map +1 -1
- package/dist/components/pcm-htws-modal.js +7 -7
- package/dist/components/pcm-hyzj-modal.js +4 -4
- package/dist/components/pcm-jd-modal.js +4 -4
- package/dist/components/pcm-jlpp-modal.js +18 -17
- package/dist/components/pcm-jlpp-modal.js.map +1 -1
- package/dist/components/pcm-jlsx-modal.js +17 -5
- package/dist/components/pcm-jlsx-modal.js.map +1 -1
- package/dist/components/pcm-jlzz-modal.js +39 -8
- package/dist/components/pcm-jlzz-modal.js.map +1 -1
- package/dist/components/pcm-mnct-modal.js +4 -4
- package/dist/components/pcm-mnms-modal.js +8 -8
- package/dist/components/pcm-mnms-zp-modal.js +8 -8
- package/dist/components/pcm-mobile-input-btn.js +1 -1
- package/dist/components/pcm-mobile-upload-btn.js +1 -1
- package/dist/components/pcm-msbg-modal.js +4 -4
- package/dist/components/pcm-qgqjl-modal.js +26 -25
- package/dist/components/pcm-qgqjl-modal.js.map +1 -1
- package/dist/components/pcm-upload.js +1 -1
- package/dist/components/pcm-virtual-chat-modal.js +1 -1
- package/dist/components/pcm-zsk-chat-modal.js +19 -2
- package/dist/components/pcm-zsk-chat-modal.js.map +1 -1
- package/dist/components/pcm-zygh-modal.js +6 -6
- package/dist/components/pcm-zygh-v2-modal.js +18 -18
- package/dist/components/pcm-zygh-v2-modal.js.map +1 -1
- package/dist/esm/components-position-selector.entry.js +1 -1
- package/dist/esm/index-Bq0K-WqZ.js +2 -6
- package/dist/esm/{index-DBfBNGaa.js → index-CtBK1m67.js} +3 -3
- package/dist/esm/{index-DBfBNGaa.js.map → index-CtBK1m67.js.map} +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/oem-htws-modal.entry.js +1 -1
- package/dist/esm/oem-jd-modal.entry.js +2 -2
- package/dist/esm/oem-jlpp-modal.entry.js +1 -1
- package/dist/esm/oem-jlsx-modal.entry.js +24 -2
- package/dist/esm/oem-jlsx-modal.entry.js.map +1 -1
- package/dist/esm/oem-jlzz-modal.entry.js +1 -1
- package/dist/esm/oem-mnct-modal.entry.js +1 -1
- package/dist/esm/oem-mnms-modal.entry.js +1 -1
- package/dist/esm/oem-qgqjl-modal.entry.js +1 -1
- package/dist/esm/oem-zygh-modal.entry.js +1 -1
- package/dist/esm/{pcm-1zhanshi-mnms-modal_28.entry.js → pcm-1zhanshi-mnms-modal_29.entry.js} +540 -109
- package/dist/esm/pcm-1zhanshi-mnms-modal_29.entry.js.map +1 -0
- package/dist/esm/pcm-agents.js +1 -1
- package/dist/esm/pcm-hr-chat-modal.entry.js +19 -2
- package/dist/esm/pcm-hr-chat-modal.entry.js.map +1 -1
- package/dist/esm/{sentry-reporter-BcA0r0vQ.js → sentry-reporter-D8jwTnnH.js} +3 -3
- package/dist/esm/{sentry-reporter-BcA0r0vQ.js.map → sentry-reporter-D8jwTnnH.js.map} +1 -1
- package/dist/pcm-agents/index.esm.js +1 -1
- package/dist/pcm-agents/oem-jlsx-modal.entry.esm.js.map +1 -1
- package/dist/pcm-agents/p-0a831595.entry.js +2 -0
- package/dist/pcm-agents/{p-365a351b.entry.js.map → p-0a831595.entry.js.map} +1 -1
- package/dist/pcm-agents/{p-d9e464fd.entry.js → p-1cc1dbcc.entry.js} +2 -2
- package/dist/pcm-agents/{p-cc3c0220.entry.js → p-43cefa20.entry.js} +2 -2
- package/dist/pcm-agents/{p-4b363eb3.entry.js → p-5bf761de.entry.js} +2 -2
- package/dist/pcm-agents/{p-96c41b85.entry.js → p-680bf3a3.entry.js} +2 -2
- package/dist/pcm-agents/p-8452f80b.entry.js +251 -0
- package/dist/pcm-agents/p-8452f80b.entry.js.map +1 -0
- package/dist/pcm-agents/{p-86c2748a.entry.js → p-890fb793.entry.js} +2 -2
- package/dist/pcm-agents/{p-Dz4pPCio.js → p-B1X08zm_.js} +2 -2
- package/dist/pcm-agents/{p-Dz4pPCio.js.map → p-B1X08zm_.js.map} +1 -1
- package/dist/pcm-agents/{p-zJbvNgZt.js → p-BmPGiYO3.js} +2 -2
- package/dist/pcm-agents/{p-zJbvNgZt.js.map → p-BmPGiYO3.js.map} +1 -1
- package/dist/pcm-agents/{p-a54ca8e2.entry.js → p-a31fa268.entry.js} +2 -2
- package/dist/pcm-agents/{p-4b257381.entry.js → p-ad6ce0c9.entry.js} +2 -2
- package/dist/pcm-agents/{p-41b4b6bb.entry.js → p-b80f01e6.entry.js} +2 -2
- package/dist/pcm-agents/{p-e442dabc.entry.js → p-c3eb9590.entry.js} +2 -2
- package/dist/pcm-agents/{p-92eea906.entry.js → p-eb44bda0.entry.js} +2 -2
- package/dist/pcm-agents/pcm-agents.esm.js +1 -1
- package/dist/pcm-agents/pcm-hr-chat-modal.entry.esm.js.map +1 -1
- package/dist/types/components/pcm-jlpp-modal/pcm-jlpp-modal.d.ts +3 -2
- package/dist/types/components/pcm-jlzz-modal/pcm-jlzz-modal.d.ts +14 -0
- package/dist/types/components/pcm-qgqjl-modal/pcm-qgqjl-modal.d.ts +3 -2
- package/dist/types/components/pcm-virtual-chat-modal/pcm-virtual-chat-modal.d.ts +10 -0
- package/dist/types/components/pcm-zygh-v2-modal/pcm-zygh-v2-modal.d.ts +4 -4
- package/dist/types/components.d.ts +36 -12
- package/package.json +1 -1
- package/dist/cjs/pcm-1zhanshi-mnms-modal_28.cjs.entry.js.map +0 -1
- package/dist/cjs/pcm-zygh-v2-modal.cjs.entry.js +0 -260
- package/dist/cjs/pcm-zygh-v2-modal.cjs.entry.js.map +0 -1
- package/dist/cjs/pcm-zygh-v2-modal.entry.cjs.js.map +0 -1
- package/dist/components/p-BZeNORff.js.map +0 -1
- package/dist/components/p-Caxrsbp0.js.map +0 -1
- package/dist/esm/pcm-1zhanshi-mnms-modal_28.entry.js.map +0 -1
- package/dist/esm/pcm-zygh-v2-modal.entry.js +0 -258
- package/dist/esm/pcm-zygh-v2-modal.entry.js.map +0 -1
- package/dist/pcm-agents/p-210d610a.entry.js +0 -2
- package/dist/pcm-agents/p-210d610a.entry.js.map +0 -1
- package/dist/pcm-agents/p-365a351b.entry.js +0 -2
- package/dist/pcm-agents/p-6551d616.entry.js +0 -251
- package/dist/pcm-agents/p-6551d616.entry.js.map +0 -1
- package/dist/pcm-agents/pcm-zygh-v2-modal.entry.esm.js.map +0 -1
- /package/dist/pcm-agents/{p-d9e464fd.entry.js.map → p-1cc1dbcc.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-cc3c0220.entry.js.map → p-43cefa20.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-4b363eb3.entry.js.map → p-5bf761de.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-96c41b85.entry.js.map → p-680bf3a3.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-86c2748a.entry.js.map → p-890fb793.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-a54ca8e2.entry.js.map → p-a31fa268.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-4b257381.entry.js.map → p-ad6ce0c9.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-41b4b6bb.entry.js.map → p-b80f01e6.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-e442dabc.entry.js.map → p-c3eb9590.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-92eea906.entry.js.map → p-eb44bda0.entry.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pcm-app-chat-modal.js","sourceRoot":"","sources":["../../../../src/components/pcm-app-chat-modal/pcm-app-chat-modal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Prop, h, State, Event, EventEmitter, Element, Watch } from '@stencil/core';\r\nimport { sendSSERequest, sendHttpRequest, uploadFileToBackend, fetchAgentInfo, getSupportedMimeType, getSupportedAudioMimeType, convertAudioToText } from '../../utils/utils';\r\nimport { ChatMessage, ConversationItem } from '../../interfaces/chat';\r\nimport { StreamCompleteEventData, ConversationStartEventData, InterviewCompleteEventData, RecordingErrorEventData, RecordingStatusChangeEventData } from '../../interfaces/events';\r\nimport { marked } from 'marked';\r\nimport { ErrorEventBus } from '../../utils/error-event';\r\nimport { authStore } from '../../../store/auth.store'; // 导入 authStore\r\nimport { configStore } from '../../../store/config.store';\r\nimport { SentryReporter } from '../../utils/sentry-reporter';\r\nimport stringsZh from './pcm-app-chat-modal.i18n.zh.json';\r\nimport stringsEn from './pcm-app-chat-modal.i18n.en.json';\r\n\r\n@Component({\r\n tag: 'pcm-app-chat-modal',\r\n styleUrls: ['pcm-app-chat-modal.css', '../../global/markdown.css', '../../global/host.css'],\r\n shadow: true,\r\n})\r\nexport class ChatAPPModal {\r\n /**\r\n * 语言设置\r\n */\r\n @Prop() locale?: string;\r\n\r\n /**\r\n * 国际化字符串\r\n */\r\n @State() strings: any;\r\n\r\n /**\r\n * 模态框标题\r\n */\r\n @Prop() modalTitle: string = '在线客服';\r\n\r\n /**\r\n * SDK鉴权密钥\r\n */\r\n @Prop({ attribute: 'token' }) token?: string;\r\n\r\n /**\r\n * 是否显示聊天模态框\r\n */\r\n @Prop({ mutable: true }) isOpen: boolean = false;\r\n\r\n /**\r\n * 聊天消息历史\r\n */\r\n @State() messages: ChatMessage[] = [];\r\n\r\n /**\r\n * 当点击模态框关闭时触发\r\n */\r\n @Event() modalClosed: EventEmitter<void>;\r\n\r\n /**\r\n * 应用图标URL\r\n */\r\n @Prop() icon?: string;\r\n\r\n /**\r\n * 聊天框的页面层级\r\n */\r\n @Prop({ mutable: true }) zIndex?: number;\r\n\r\n /**\r\n * 是否展示顶部标题栏\r\n */\r\n @Prop() isShowHeader: boolean = true;\r\n\r\n /**\r\n * 是否展示右上角的关闭按钮\r\n */\r\n @Prop() isNeedClose: boolean = true;\r\n\r\n /**\r\n * 会话ID,传入继续对话,否则创建新会话\r\n */\r\n @Prop({ mutable: true }) conversationId?: string;\r\n\r\n /**\r\n * 是否显示“保存职位”按钮(仅JD助手智能体生效)\r\n */\r\n @Prop() showSaveJdButton: boolean = false;\r\n\r\n /**\r\n * 保存职位按钮文本\r\n */\r\n @Prop() saveJdButtonText: string = '保存职位';\r\n\r\n /**\r\n * 是否正在加载回复\r\n */\r\n @State() isLoading: boolean = false;\r\n\r\n /**\r\n * 当前正在流式输出的消息\r\n */\r\n @State() currentStreamingMessage: ChatMessage | null = null;\r\n\r\n // 添加新的状态控制\r\n @State() shouldAutoScroll: boolean = true;\r\n\r\n @State() isLoadingHistory: boolean = false;\r\n\r\n // 使用 @Element 装饰器获取组件的 host 元素\r\n @Element() hostElement: HTMLElement;\r\n\r\n /**\r\n * 一轮对话结束时的回调\r\n */\r\n @Event() streamComplete: EventEmitter<StreamCompleteEventData>;\r\n\r\n /**\r\n * 新会话开始的回调,只会在一轮对话开始时触发一次\r\n */\r\n @Event() conversationStart: EventEmitter<ConversationStartEventData>;\r\n\r\n /**\r\n * 默认发送文本\r\n */\r\n @Prop() defaultQuery: string = '你好!聘才猫';\r\n\r\n /**\r\n * 视频录制最大时长(秒)\r\n */\r\n @Prop() maxRecordingTime: number = 120;\r\n\r\n /**\r\n * 录制倒计时提醒时间(秒)\r\n * 当剩余时间小于此值时,显示倒计时警告\r\n */\r\n @Prop() countdownWarningTime: number = 30;\r\n\r\n /**\r\n * 等待录制时间(秒)\r\n */\r\n @Prop() waitingTime: number = 10;\r\n\r\n @Prop() closeResume?: () => void;\r\n\r\n // 添加视频录制相关状态\r\n @State() isRecording: boolean = false;\r\n @State() recordingStream: MediaStream | null = null;\r\n @State() recordedBlob: Blob | null = null;\r\n @State() mediaRecorder: MediaRecorder | null = null;\r\n @State() recordingTimeLeft: number = 0;\r\n @State() showRecordingUI: boolean = false;\r\n @State() recordingTimer: any = null;\r\n @State() recordingStartTime: number = 0;\r\n @State() waitingToRecord: boolean = false;\r\n @State() waitingTimer: any = null;\r\n @State() waitingTimeLeft: number = 0; // 等待时间(秒)\r\n\r\n // 添加一个新的私有属性来存储视频元素的引用\r\n private videoRef: HTMLVideoElement | null = null;\r\n\r\n /**\r\n * 当前轮数\r\n */\r\n @State() currentQuestionNumber: number = 0;\r\n\r\n /**\r\n * 当聊天完成时触发\r\n */\r\n @Event() interviewComplete: EventEmitter<InterviewCompleteEventData>;\r\n\r\n @State() showCountdownWarning: boolean = false;\r\n\r\n /**\r\n * 是否以全屏模式打开,移动端建议设置为true\r\n */\r\n @Prop() fullscreen: boolean = false;\r\n\r\n // 添加新的状态来跟踪视频上传\r\n @State() isUploadingVideo: boolean = false;\r\n\r\n // 添加新的状态和属性\r\n @State() isPlayingAudio: boolean = false;\r\n\r\n /**\r\n * 录制错误事件\r\n */\r\n @Event() recordingError: EventEmitter<RecordingErrorEventData>;\r\n\r\n /**\r\n * 录制状态变化事件\r\n */\r\n @Event() recordingStatusChange: EventEmitter<RecordingStatusChangeEventData>;\r\n\r\n /**\r\n * SDK密钥验证失败事件\r\n */\r\n @Event() tokenInvalid: EventEmitter<void>;\r\n\r\n /**\r\n * 聊天模式\r\n * video: 视频聊天模式\r\n * text: 文字聊天模式\r\n */\r\n @Prop() interviewMode: 'video' | 'text' = 'text';\r\n\r\n // 添加文字输入相关状态\r\n @State() textAnswer: string = '';\r\n @State() isSubmittingText: boolean = false;\r\n\r\n /**\r\n * 自定义智能体inputs输入参数\r\n */\r\n @Prop({ mutable: true }) customInputs: Record<string, any> = {};\r\n\r\n /**\r\n * 机器人ID\r\n */\r\n @Prop() botId?: string;\r\n\r\n // 添加语音输入相关状态\r\n @State() isRecordingAudio: boolean = false;\r\n @State() audioRecorder: MediaRecorder | null = null;\r\n @State() audioChunks: BlobPart[] = [];\r\n @State() isConvertingAudio: boolean = false;\r\n @State() audioRecordingTimeLeft: number = 60; // 最大录音时间(秒)\r\n @State() audioRecordingTimer: any = null;\r\n @State() audioRecordingStartTime: number = 0;\r\n\r\n /**\r\n * 语音录制最大时长(秒)\r\n */\r\n @Prop() maxAudioRecordingTime: number = 60;\r\n\r\n /**\r\n * 用户头像URL\r\n */\r\n @Prop() userAvatar?: string = 'https://pub.pincaimao.com/static/common/i_pcm_logo.png';\r\n\r\n /**\r\n * 助手头像URL\r\n */\r\n @Prop() assistantAvatar?: string;\r\n\r\n /**\r\n * 智能体头像URL(从后端获取)\r\n */\r\n @State() agentLogo: string = '';\r\n\r\n // 添加新的状态属性来跟踪任务是否已完成\r\n @State() isTaskCompleted: boolean = false;\r\n\r\n /**\r\n * 数字人 virtualmanKey\r\n */\r\n @State() virtualmanKey: string = '';\r\n\r\n private tokenInvalidListener: () => void;\r\n\r\n /**\r\n * 是否显示复制按钮\r\n */\r\n @Prop() showCopyButton: boolean = true;\r\n\r\n /**\r\n * 是否显示点赞点踩按钮\r\n */\r\n @Prop() showFeedbackButtons: boolean = true;\r\n\r\n /**\r\n * 附件预览模式\r\n * 'drawer': 在右侧抽屉中预览\r\n * 'window': 在新窗口中打开\r\n */\r\n @Prop() filePreviewMode: 'drawer' | 'window' = 'drawer';\r\n\r\n /**\r\n * 是否显示工作区历史会话按钮\r\n */\r\n @Prop() showWorkspaceHistory: boolean = false;\r\n\r\n // 添加新的状态来管理抽屉\r\n @State() isDrawerOpen: boolean = false;\r\n @State() previewUrl: string = '';\r\n @State() previewFileName: string = '';\r\n\r\n // 添加内容类型状态\r\n @State() previewContentType: 'file' | 'markdown' | 'text' = 'file';\r\n @State() previewContent: string = '';\r\n\r\n // 添加新的状态来追踪用户交互\r\n @State() isUserScrolling: boolean = false;\r\n\r\n @State() deviceError: string | null = null;\r\n\r\n /**\r\n * 面试流程状态管理说明:\r\n *\r\n * 核心状态:\r\n * - isTaskCompleted: 任务是否已完成(面试正常结束)\r\n * - isEndingInterview: 是否正在执行结束面试流程(用户主动结束)\r\n * - isRecording: 是否正在录制视频\r\n * - waitingToRecord: 是否正在等待开始录制\r\n * - waitingForDigitalHuman: 是否正在等待数字人视频播放完成\r\n * - isLoading: 是否正在等待AI回复\r\n * - isUploadingVideo: 是否正在上传视频\r\n *\r\n * 流程控制原则:\r\n * 1. 一旦 isTaskCompleted 或 isEndingInterview 为 true,所有录制和等待流程都应停止\r\n * 2. isEndingInterview 设置为 true 后,只允许发送结束面试消息\r\n * 3. 结束面试按钮在 isTaskCompleted 或 isEndingInterview 为 true 时置灰禁用\r\n * 4. 所有可能触发新录制的地方都需要检查这两个状态\r\n */\r\n\r\n // 添加历史会话相关状态\r\n @State() isHistoryDrawerOpen: boolean = false;\r\n @State() historyConversations: ConversationItem[] = [];\r\n @State() isLoadingConversations: boolean = false;\r\n\r\n // 添加二次确认相关状态\r\n @State() showConfirmModal: boolean = false;\r\n @State() skipConfirmThisInterview: boolean = false;\r\n\r\n // 添加结束面试确认相关状态\r\n @State() showEndInterviewConfirmModal: boolean = false;\r\n\r\n /**\r\n * 标记是否正在执行结束面试流程\r\n */\r\n @State() isEndingInterview: boolean = false;\r\n\r\n /**\r\n * 最后完成的AI回复文本,用于数字人视频生成\r\n */\r\n @State() lastCompletedAnswer: string = '';\r\n\r\n /**\r\n * 是否正在等待数字人视频播放完成\r\n */\r\n @State() waitingForDigitalHuman: boolean = false;\r\n\r\n /**\r\n * 数字人视频是否已生成完成\r\n */\r\n @State() digitalHumanVideoReady: boolean = false;\r\n\r\n /**\r\n * 虚拟数字人ID,指定则开启虚拟数字人功能\r\n */\r\n @Prop() digitalId?: string;\r\n\r\n /**\r\n * 是否显示结束面试按钮\r\n */\r\n @Prop() showEndInterviewButton: boolean = false;\r\n\r\n /**\r\n * 数字人视频播放速率(0.5-2.0之间),默认1.0\r\n */\r\n @Prop() playbackRate: number = 1.0;\r\n\r\n @Watch('token')\r\n handleTokenChange(newToken: string) {\r\n // 当传入的 token 变化时,更新 authStore 中的 token\r\n if (newToken && newToken !== authStore.getToken()) {\r\n authStore.setToken(newToken);\r\n }\r\n }\r\n\r\n constructor() {\r\n // 配置 marked 选项\r\n marked.setOptions({\r\n breaks: true,\r\n gfm: true,\r\n });\r\n }\r\n\r\n async componentWillLoad() {\r\n // 加载国际化字符串\r\n this.strings = this.locale === 'en' ? stringsEn : stringsZh;\r\n\r\n // 将 zIndex 存入配置缓存\r\n if (this.zIndex) {\r\n configStore.setItem('modal-zIndex', this.zIndex);\r\n } else {\r\n // 如果没有提供 zIndex,尝试从缓存中读取\r\n const cachedZIndex = configStore.getItem<number>('modal-zIndex');\r\n if (cachedZIndex) {\r\n this.zIndex = cachedZIndex;\r\n } else {\r\n this.zIndex = 1000;\r\n configStore.setItem('modal-zIndex', 1000);\r\n }\r\n }\r\n\r\n if (this.token) {\r\n authStore.setToken(this.token);\r\n }\r\n\r\n // 添加全局token无效事件监听器\r\n this.tokenInvalidListener = () => {\r\n this.tokenInvalid.emit();\r\n };\r\n document.addEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n\r\n // 确保 customInputs 是一个对象\r\n if (!this.customInputs) {\r\n this.customInputs = {};\r\n }\r\n\r\n // 如果没有设置助手头像,尝试获取智能体头像\r\n if (!this.assistantAvatar && this.botId) {\r\n this.fetchAgentLogo();\r\n }\r\n\r\n // 如果组件加载时已经是打开状态,则直接开始对话\r\n if (this.isOpen) {\r\n if (this.conversationId) {\r\n // 在下一个事件循环中加载历史消息,避免在componentWillLoad中进行异步操作\r\n setTimeout(() => this.loadHistoryMessages(), 0);\r\n } else {\r\n // 在下一个事件循环中发送初始消息,避免在componentWillLoad中进行异步操作\r\n setTimeout(() => {\r\n this.sendMessageToAPI(this.defaultQuery);\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n private handleClose = () => {\r\n this.stopRecording();\r\n this.modalClosed.emit();\r\n };\r\n\r\n // 添加获取智能体信息的方法\r\n private async fetchAgentLogo() {\r\n if (!this.botId) return;\r\n\r\n try {\r\n const agentInfo = await fetchAgentInfo(this.botId);\r\n\r\n if (agentInfo && agentInfo.logo) {\r\n this.agentLogo = agentInfo.logo;\r\n }\r\n } catch (error) {\r\n SentryReporter.captureError(error, {\r\n action: 'fetchAgentLogo',\r\n component: 'pcm-app-chat-modal',\r\n title: '获取智能体信息失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '获取智能体信息失败',\r\n });\r\n }\r\n }\r\n\r\n private async sendMessageToAPI(message: string, videoUrl?: string) {\r\n // 如果任务已完成或正在结束面试,不允许发送消息\r\n if (this.isTaskCompleted && !this.isEndingInterview) {\r\n console.log('任务已完成,不允许发送消息');\r\n return;\r\n }\r\n\r\n // 发送新消息时重置状态\r\n this.waitingForDigitalHuman = false;\r\n this.digitalHumanVideoReady = false;\r\n\r\n this.isLoading = true;\r\n let answer = '';\r\n let llmText = '';\r\n\r\n const now = new Date();\r\n const time = `${now.getHours()}:${now.getMinutes().toString().padStart(2, '0')}`;\r\n\r\n // 修改消息处理逻辑,移除文件上传相关代码\r\n const queryText = message.trim() || this.strings?.messages?.pleaseStart;\r\n\r\n // 如果有视频URL,添加到customInputs中\r\n if (videoUrl) {\r\n this.customInputs = {\r\n ...this.customInputs,\r\n video_url: videoUrl,\r\n };\r\n }\r\n\r\n // 创建新的消息对象\r\n const newMessage: ChatMessage = {\r\n id: `temp-${Date.now()}`, // 临时ID,将被服务器返回的ID替换\r\n conversation_id: this.conversationId, // 会话ID\r\n inputs: this.customInputs || {}, // 输入参数\r\n query: queryText, // 用户输入的消息内容\r\n answer: '', // 初始为空\r\n message_files: [], // 消息附件\r\n feedback: {}, // 反馈\r\n retriever_resources: [], // 检索资源\r\n created_at: Math.floor(Date.now() / 1000).toString(), // 创建时间\r\n agent_thoughts: [], // 代理思考过程\r\n status: 'normal', // 消息状态\r\n error: null, // 错误信息\r\n // 添加组件内部使用的字段\r\n time: time, // 消息时间(显示用)\r\n isStreaming: true, // 是否正在流式输出\r\n };\r\n\r\n // 设置当前流式消息\r\n this.currentStreamingMessage = newMessage;\r\n\r\n // 滚动到底部\r\n setTimeout(() => {\r\n this.shouldAutoScroll = true;\r\n this.scrollToBottom();\r\n }, 200);\r\n\r\n // 准备请求数据\r\n const requestData: any = {\r\n response_mode: 'streaming',\r\n conversation_id: this.conversationId,\r\n query: queryText,\r\n bot_id: this.botId, // 添加 botId 到请求数据中\r\n };\r\n\r\n // 合并基本输入参数和自定义输入参数\r\n requestData.inputs = {\r\n // 合并自定义输入参数\r\n ...this.customInputs,\r\n };\r\n\r\n await sendSSERequest({\r\n url: '/sdk/v1/chat/chat-messages',\r\n method: 'POST',\r\n data: requestData,\r\n onMessage: data => {\r\n console.log(new Date().toLocaleString());\r\n console.log('收到Stream数据:', data);\r\n\r\n if (data.conversation_id && !this.conversationId) {\r\n this.conversationId = data.conversation_id;\r\n this.conversationStart.emit({\r\n conversation_id: data.conversation_id,\r\n event: data.event,\r\n message_id: data.message_id,\r\n id: data.id,\r\n });\r\n }\r\n\r\n // 检查是否有 node_finished 事件和 LLMText\r\n if (data.event === 'node_finished' && data.data.inputs && data.data.inputs.LLMText) {\r\n llmText = data.data.inputs.LLMText;\r\n }\r\n\r\n // 添加对任务结束的判断\r\n if (data.event === 'node_finished' && data.data.title && data.data.title.includes('聘才猫任务结束')) {\r\n console.log('检测到任务结束事件:', data);\r\n\r\n // 设置标志,表示任务已结束\r\n this.isTaskCompleted = true;\r\n\r\n // 获取当前AI回复内容,优先使用LLMText,否则使用answer\r\n const aiResponse = llmText || answer || this.currentStreamingMessage?.answer || '';\r\n\r\n // 触发面试完成事件\r\n this.interviewComplete.emit({\r\n conversation_id: this.conversationId,\r\n current_question_number: this.currentQuestionNumber,\r\n ai_response: aiResponse, // 添加AI回复内容\r\n });\r\n }\r\n if (data.event === 'node_finished' && data.data.title && data.data.title.includes('聘才猫数字人题目')) {\r\n const digital_human_list = JSON.parse(data.data.process_data.digital_human_list);\r\n console.log('数字人题目:', digital_human_list);\r\n this.precreateDigitalHumanVideos(digital_human_list);\r\n }\r\n\r\n if (data.event === 'message') {\r\n if (data.event === 'agent_message' || data.event === 'message') {\r\n if (data.answer) {\r\n answer += data.answer;\r\n // 更新消息时保持完整的消息结构\r\n const updatedMessage: ChatMessage = {\r\n ...this.currentStreamingMessage,\r\n answer,\r\n id: data.message_id || this.currentStreamingMessage.id,\r\n isStreaming: true,\r\n // 如果服务器返回了其他字段,也更新它们\r\n retriever_resources: data.retriever_resources || this.currentStreamingMessage.retriever_resources,\r\n agent_thoughts: data.agent_thoughts || this.currentStreamingMessage.agent_thoughts,\r\n };\r\n this.currentStreamingMessage = updatedMessage;\r\n this.scrollToBottom();\r\n }\r\n }\r\n }\r\n if (data.event === 'message_end') {\r\n this.streamComplete.emit({\r\n conversation_id: data.conversation_id || '',\r\n event: data.event,\r\n message_id: data.message_id,\r\n id: data.id,\r\n });\r\n }\r\n },\r\n onError: error => {\r\n console.error('发生错误:', error);\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '消息发送失败,请稍后再试',\r\n });\r\n SentryReporter.captureError(error, {\r\n action: 'sendMessageToAPI',\r\n component: 'pcm-app-chat-modal',\r\n title: '消息发送失败',\r\n });\r\n\r\n this.messages = [\r\n ...this.messages,\r\n {\r\n ...newMessage,\r\n answer: this.strings?.errors?.sendMessageCheckNetwork,\r\n error: error,\r\n isStreaming: false,\r\n },\r\n ];\r\n this.currentStreamingMessage = null;\r\n this.isLoading = false;\r\n },\r\n onComplete: async () => {\r\n this.isLoading = false;\r\n // 发送第一条消息后,清空指定的 customInputs 字段\r\n setTimeout(() => {\r\n if (this.customInputs) {\r\n // 只清除指定的字段,其他字段保留\r\n delete this.customInputs.job_info;\r\n delete this.customInputs.file_url;\r\n delete this.customInputs.file_name;\r\n }\r\n }, 1000); // 给一些时间让第一条消息处理完成\r\n\r\n // 获取最新的AI回复内容,创建新对象确保 Stencil 能检测到 isStreaming 状态变化\r\n const latestAIMessage: ChatMessage = {\r\n ...this.currentStreamingMessage,\r\n isStreaming: false,\r\n };\r\n\r\n // 保存最后完成的回复内容用于数字人视频生成\r\n if (latestAIMessage && latestAIMessage.answer) {\r\n this.lastCompletedAnswer = latestAIMessage.answer;\r\n }\r\n\r\n // 先更新消息列表,再清空流式消息,避免中间状态造成消息\"消失\"导致 Button 组不显示\r\n this.messages = [...this.messages, latestAIMessage];\r\n this.currentStreamingMessage = null;\r\n\r\n // 增加计数\r\n this.currentQuestionNumber++;\r\n\r\n // 如果任务已完成或正在结束面试,不执行后续流程\r\n if (this.isTaskCompleted || this.isEndingInterview) {\r\n console.log('任务已完成或正在结束面试,停止后续流程');\r\n return;\r\n }\r\n\r\n if (this.interviewMode === 'video') {\r\n // 如果开启了数字人,等待数字人视频播放完成\r\n if (this.digitalId) {\r\n this.waitingForDigitalHuman = true;\r\n console.log('等待数字人视频播放完成...');\r\n } else {\r\n // 没有开启数字人,直接开始录制\r\n this.startWaitingToRecord();\r\n }\r\n }\r\n },\r\n });\r\n }\r\n\r\n // 修改滚动处理函数\r\n private handleScroll = () => {\r\n // 只有当用户正在滚动时才更新自动滚动状态\r\n if (this.isUserScrolling) {\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n if (!chatHistory) return;\r\n\r\n const { scrollTop, scrollHeight, clientHeight } = chatHistory;\r\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\r\n\r\n // 更新是否应该自动滚动的状态\r\n this.shouldAutoScroll = distanceFromBottom <= 20;\r\n }\r\n };\r\n\r\n // 添加触摸开始事件处理\r\n private handleTouchStart = () => {\r\n this.isUserScrolling = true;\r\n };\r\n\r\n // 添加触摸结束事件处理\r\n private handleTouchEnd = () => {\r\n setTimeout(() => {\r\n this.isUserScrolling = false;\r\n }, 100); // 添加小延迟以确保滚动事件处理完成\r\n };\r\n\r\n private _wheelTimer: any = null;\r\n\r\n // 添加鼠标滚轮事件处理\r\n private handleWheel = () => {\r\n this.isUserScrolling = true;\r\n\r\n // 清除之前的定时器(如果存在)\r\n if (this._wheelTimer) {\r\n clearTimeout(this._wheelTimer);\r\n }\r\n\r\n // 设置新的定时器\r\n this._wheelTimer = setTimeout(() => {\r\n this.isUserScrolling = false;\r\n }, 150); // 滚轮停止后的延迟时间\r\n };\r\n\r\n private scrollToBottom() {\r\n if (!this.shouldAutoScroll) return;\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n if (chatHistory && this.isOpen) {\r\n // 强制浏览器重新计算布局\r\n chatHistory.scrollTop = chatHistory.scrollHeight;\r\n }\r\n }\r\n\r\n // 修改加载历史消息的方法\r\n private async loadHistoryMessages() {\r\n if (!this.conversationId) return;\r\n\r\n this.isLoadingHistory = true;\r\n console.log('加载历史消息...');\r\n let conversationStatus = false;\r\n this.digitalHumanVideoReady = true;\r\n\r\n try {\r\n // 首先获取会话状态\r\n const conversationStatusResponse = await sendHttpRequest({\r\n url: `/sdk/v1/chat/conversation`,\r\n method: 'GET',\r\n data: {\r\n conversation_id: this.conversationId,\r\n },\r\n });\r\n // 处理会话状态\r\n if (conversationStatusResponse.success && conversationStatusResponse.data && conversationStatusResponse.data.run_status == '结束') {\r\n conversationStatus = true;\r\n }\r\n\r\n // 获取历史消息\r\n const result = await sendHttpRequest({\r\n url: '/sdk/v1/chat/messages',\r\n method: 'GET',\r\n data: {\r\n conversation_id: this.conversationId,\r\n bot_id: this.botId,\r\n limit: 20,\r\n },\r\n });\r\n\r\n if (result.success && result.data) {\r\n const historyData = result.data.data || [];\r\n const formattedMessages: ChatMessage[] = historyData.map(msg => {\r\n const time = new Date(parseInt(msg.created_at) * 1000);\r\n const hours = time.getHours().toString().padStart(2, '0');\r\n const minutes = time.getMinutes().toString().padStart(2, '0');\r\n const timeStr = `${hours}:${minutes}`;\r\n\r\n // 创建完整的消息对象,保持统一结构\r\n return {\r\n id: msg.id,\r\n conversation_id: msg.conversation_id,\r\n inputs: msg.inputs || {},\r\n query: msg.query || '',\r\n answer: msg.answer || '',\r\n message_files: msg.message_files || [],\r\n feedback: msg.feedback || {},\r\n retriever_resources: msg.retriever_resources || [],\r\n created_at: msg.created_at,\r\n agent_thoughts: msg.agent_thoughts || [],\r\n status: msg.status || 'normal',\r\n error: msg.error,\r\n // 组件内部使用的字段\r\n time: timeStr,\r\n isStreaming: false,\r\n };\r\n });\r\n\r\n this.messages = formattedMessages;\r\n\r\n // 根据历史消息数量设置currentQuestionNumber\r\n this.currentQuestionNumber = formattedMessages.length || 0;\r\n }\r\n } catch (error) {\r\n console.error('加载历史消息或会话状态失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'loadHistoryMessages',\r\n component: 'pcm-app-chat-modal',\r\n title: '加载历史消息失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '加载历史消息失败',\r\n });\r\n } finally {\r\n this.isLoadingHistory = false;\r\n setTimeout(async () => {\r\n this.shouldAutoScroll = true;\r\n this.scrollToBottom();\r\n\r\n // 如果有会话ID且有历史消息,且会话未结束,处理继续对话的逻辑\r\n if (this.conversationId && this.messages.length > 0 && !conversationStatus && !this.isTaskCompleted && !this.isEndingInterview) {\r\n // 如果是视频模式,开始等待录制\r\n if (this.interviewMode === 'video') {\r\n this.startWaitingToRecord();\r\n }\r\n } else if (conversationStatus) {\r\n // 如果会话已结束,设置任务完成状态\r\n this.isTaskCompleted = true;\r\n }\r\n }, 200);\r\n }\r\n }\r\n\r\n // 开始等待录制\r\n private startWaitingToRecord() {\r\n // 如果不是视频模式,直接返回\r\n if (this.interviewMode !== 'video') {\r\n return;\r\n }\r\n\r\n // 如果任务已完成或正在结束面试,不开始录制流程\r\n if (this.isTaskCompleted || this.isEndingInterview) {\r\n console.log('任务已完成或正在结束面试,不开始录制流程');\r\n return;\r\n }\r\n\r\n // 清除可能存在的计时器\r\n if (this.waitingTimer) {\r\n clearInterval(this.waitingTimer);\r\n }\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n }\r\n\r\n this.waitingToRecord = true;\r\n this.waitingTimeLeft = this.waitingTime;\r\n\r\n this.waitingTimer = setInterval(() => {\r\n this.waitingTimeLeft--;\r\n if (this.waitingTimeLeft <= 0) {\r\n clearInterval(this.waitingTimer);\r\n this.waitingTimer = null;\r\n this.waitingToRecord = false;\r\n this.startRecording();\r\n }\r\n }, 1000);\r\n }\r\n\r\n // 开始录制视频\r\n private async startRecording() {\r\n // 如果任务已完成或正在结束面试,不开始录制\r\n if (this.isTaskCompleted || this.isEndingInterview) {\r\n console.log('任务已完成或正在结束面试,不开始录制');\r\n return;\r\n }\r\n\r\n try {\r\n const stream = await navigator.mediaDevices.getUserMedia({\r\n audio: true,\r\n video: {\r\n width: { ideal: 1280 },\r\n height: { ideal: 720 },\r\n frameRate: { ideal: 30 },\r\n },\r\n });\r\n\r\n // 如果成功获取到媒体流,清除之前的设备错误\r\n this.deviceError = null;\r\n\r\n this.recordingStream = stream;\r\n this.showRecordingUI = true;\r\n this.showCountdownWarning = false;\r\n\r\n // 重置视频引用\r\n this.videoRef = null;\r\n\r\n // 确保视频元素获取到流\r\n this.setupVideoPreview(stream);\r\n\r\n // 检测浏览器支持的MIME类型\r\n const mimeType = getSupportedMimeType();\r\n\r\n // 创建MediaRecorder实例\r\n let mediaRecorder;\r\n try {\r\n mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n videoBitsPerSecond: 800000, // 800kbps 视频比特率限制\r\n audioBitsPerSecond: 64000, // 64kbps 音频比特率限制\r\n });\r\n } catch (e) {\r\n // 如果指定MIME类型失败,尝试使用默认设置\r\n console.warn('指定的MIME类型不受支持,使用默认设置:', e);\r\n try {\r\n mediaRecorder = new MediaRecorder(stream, {\r\n videoBitsPerSecond: 800000, // 即使降级也保持比特率限制\r\n audioBitsPerSecond: 64000,\r\n });\r\n } catch (recorderError) {\r\n // 最后的降级选项,不设置任何参数\r\n try {\r\n mediaRecorder = new MediaRecorder(stream);\r\n } catch (finalError) {\r\n // 通知父组件录制器创建失败\r\n this.recordingError.emit({\r\n type: 'recorder_creation_failed',\r\n message: '无法创建媒体录制器,您的浏览器可能不支持此功能',\r\n details: finalError,\r\n });\r\n this.showRecordingUI = false;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.mediaRecorder = mediaRecorder;\r\n\r\n const chunks: BlobPart[] = [];\r\n\r\n mediaRecorder.ondataavailable = event => {\r\n if (event.data.size > 0) {\r\n chunks.push(event.data);\r\n }\r\n };\r\n\r\n mediaRecorder.onerror = event => {\r\n // 通知父组件录制过程中发生错误\r\n this.recordingError.emit({\r\n type: 'recording_error',\r\n message: this.strings?.errors?.recordingErrorText,\r\n details: event,\r\n });\r\n this.stopRecording();\r\n };\r\n\r\n mediaRecorder.onstop = () => {\r\n try {\r\n // 根据实际使用的MIME类型创建Blob\r\n const blobType = mimeType || 'video/mp4';\r\n const blob = new Blob(chunks, { type: blobType });\r\n\r\n if (blob.size === 0) {\r\n // 通知父组件录制的视频为空\r\n this.recordingError.emit({\r\n type: 'empty_recording',\r\n message: this.strings?.errors?.emptyVideo,\r\n });\r\n this.showRecordingUI = false;\r\n return;\r\n }\r\n\r\n this.recordedBlob = blob;\r\n\r\n // 通知父组件录制已完成\r\n this.recordingStatusChange.emit({\r\n status: 'stopped',\r\n details: {\r\n duration: Math.floor((Date.now() - this.recordingStartTime) / 1000),\r\n size: blob.size,\r\n type: blob.type,\r\n },\r\n });\r\n\r\n this.uploadRecordedVideo();\r\n } catch (error) {\r\n // 通知父组件处理录制视频时出错\r\n this.recordingError.emit({\r\n type: 'processing_error',\r\n message: this.strings?.errors?.processVideoError,\r\n details: error,\r\n });\r\n this.showRecordingUI = false;\r\n SentryReporter.captureError(error, {\r\n action: 'uploadRecordedVideo',\r\n component: 'pcm-hr-chat-modal',\r\n title: '处理录制视频时出错',\r\n });\r\n }\r\n };\r\n\r\n // 开始录制\r\n try {\r\n mediaRecorder.start();\r\n this.isRecording = true;\r\n this.recordingStartTime = Date.now();\r\n this.recordingTimeLeft = this.maxRecordingTime;\r\n\r\n // 通知父组件录制已开始\r\n this.recordingStatusChange.emit({\r\n status: 'started',\r\n details: {\r\n maxDuration: this.maxRecordingTime,\r\n mimeType: mediaRecorder.mimeType,\r\n },\r\n });\r\n } catch (startError) {\r\n // 通知父组件开始录制失败\r\n this.recordingError.emit({\r\n type: 'start_failed',\r\n message: '开始录制失败,请检查您的设备权限',\r\n details: startError,\r\n });\r\n this.showRecordingUI = false;\r\n SentryReporter.captureError(startError, {\r\n action: 'startRecording',\r\n component: 'pcm-hr-chat-modal',\r\n title: '开始录制失败',\r\n });\r\n return;\r\n }\r\n\r\n // 设置录制计时器\r\n this.recordingTimer = setInterval(() => {\r\n const elapsedTime = Math.floor((Date.now() - this.recordingStartTime) / 1000);\r\n this.recordingTimeLeft = Math.max(0, this.maxRecordingTime - elapsedTime);\r\n\r\n // 检查是否需要显示倒计时警告\r\n if (this.recordingTimeLeft <= this.countdownWarningTime && !this.showCountdownWarning) {\r\n this.showCountdownWarning = true;\r\n }\r\n\r\n // 时间到自动停止录制\r\n if (this.recordingTimeLeft <= 0) {\r\n this.stopRecording();\r\n }\r\n }, 1000);\r\n } catch (error) {\r\n console.error('无法访问摄像头或麦克风:', error);\r\n\r\n // 设置设备错误状态\r\n let errorMessage = this.strings?.errors?.deviceAccessFailed;\r\n\r\n if (error.name === 'NotAllowedError') {\r\n errorMessage = this.strings.errors.permissionDenied;\r\n } else if (error.name === 'NotFoundError') {\r\n errorMessage = this.strings.errors.deviceNotFound;\r\n } else if (error.name === 'NotReadableError') {\r\n errorMessage = this.strings.errors.browserNotSupportVideoRecording;\r\n } else if (error.name === 'OverconstrainedError') {\r\n errorMessage = this.strings.errors.unsupportedConfiguration;\r\n } else {\r\n errorMessage = this.strings.errors.cameraOrMicAccessFailed;\r\n }\r\n\r\n this.deviceError = errorMessage;\r\n this.showRecordingUI = false;\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: errorMessage,\r\n });\r\n\r\n SentryReporter.captureError(error, {\r\n action: 'startRecording',\r\n component: 'pcm-app-chat-modal',\r\n title: errorMessage,\r\n });\r\n }\r\n }\r\n\r\n // 添加新方法来设置视频预览\r\n private setupVideoPreview(stream: MediaStream) {\r\n // 延迟执行以确保DOM已更新\r\n setTimeout(() => {\r\n const videoElement = this.hostElement.shadowRoot?.querySelector('video') as HTMLVideoElement;\r\n if (videoElement && stream) {\r\n // 先尝试使用标准方法\r\n try {\r\n videoElement.srcObject = stream;\r\n videoElement.play().catch(err => {\r\n console.error('视频播放失败:', err);\r\n SentryReporter.captureError(err, {\r\n action: 'setupVideoPreview',\r\n component: 'pcm-app-chat-modal',\r\n title: '视频播放失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: err,\r\n message: '视频播放失败',\r\n });\r\n });\r\n } catch (e) {\r\n console.warn('设置srcObject失败,尝试替代方法:', e);\r\n\r\n // 对于不支持srcObject的旧浏览器,使用URL.createObjectURL\r\n try {\r\n // 使用类型断言解决TypeScript错误\r\n const objectUrl = URL.createObjectURL(stream as unknown as MediaSource);\r\n videoElement.src = objectUrl;\r\n\r\n // 确保在视频元素不再使用时释放URL\r\n videoElement.onended = () => {\r\n URL.revokeObjectURL(objectUrl);\r\n };\r\n } catch (urlError) {\r\n console.error('创建对象URL失败:', urlError);\r\n SentryReporter.captureError(urlError, {\r\n action: 'setupVideoPreview',\r\n component: 'pcm-app-chat-modal',\r\n title: '创建对象URL失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: urlError,\r\n message: '创建对象URL失败',\r\n });\r\n }\r\n }\r\n } else {\r\n console.warn('未找到视频元素或媒体流无效');\r\n }\r\n }, 100);\r\n }\r\n\r\n // 停止录制\r\n private stopRecording() {\r\n if (this.mediaRecorder && this.isRecording) {\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n\r\n // 清理计时器\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n this.recordingTimer = null;\r\n }\r\n\r\n // 停止并释放媒体流\r\n if (this.recordingStream) {\r\n this.recordingStream.getTracks().forEach(track => track.stop());\r\n this.recordingStream = null;\r\n }\r\n\r\n // 清理视频引用\r\n this.videoRef = null;\r\n }\r\n }\r\n\r\n // 处理停止录制按钮点击\r\n private handleStopRecording = () => {\r\n // 如果已经设置了跳过确认,直接停止录制\r\n if (this.skipConfirmThisInterview) {\r\n this.stopRecording();\r\n return;\r\n }\r\n\r\n // 否则显示确认模态框\r\n this.showConfirmModal = true;\r\n };\r\n\r\n // 处理\"本次面试不再提醒\"复选框变化\r\n private handleSkipConfirmChange = (event: Event) => {\r\n const checkbox = event.target as HTMLInputElement;\r\n this.skipConfirmThisInterview = checkbox.checked;\r\n };\r\n\r\n // 处理确认模态框的取消事件\r\n private handleConfirmModalCancel = () => {\r\n this.showConfirmModal = false;\r\n };\r\n\r\n // 处理确认模态框的OK事件\r\n private handleConfirmModalOk = () => {\r\n this.showConfirmModal = false;\r\n this.stopRecording();\r\n };\r\n\r\n // 处理确认模态框的Cancel事件\r\n private handleConfirmModalCancelEvent = () => {\r\n this.showConfirmModal = false;\r\n };\r\n\r\n // 上传录制的视频\r\n private async uploadRecordedVideo() {\r\n if (!this.recordedBlob) return;\r\n\r\n try {\r\n this.isUploadingVideo = true; // 开始上传时设置状态\r\n this.showRecordingUI = false; // 隐藏视频预览\r\n\r\n // 根据Blob类型确定文件扩展名\r\n const fileExtension = this.recordedBlob.type.includes('webm') ? 'webm' : 'mp4';\r\n const fileName = `answer.${fileExtension}`;\r\n\r\n // 创建File对象\r\n const file = new File([this.recordedBlob], fileName, { type: this.recordedBlob.type });\r\n\r\n // 使用uploadFileToBackend上传文件\r\n const fileInfo = await uploadFileToBackend(\r\n file,\r\n {},\r\n {\r\n tags: ['other'],\r\n },\r\n );\r\n // 使用 cos_key 作为视频标识符\r\n // 调用音频转文字API\r\n const transcriptionText = await convertAudioToText(fileInfo.cos_key);\r\n\r\n // 检查是否是结束面试流程\r\n if (this.isEndingInterview) {\r\n console.log('视频上传完成,现在发送结束面试消息');\r\n // 如果是结束面试流程,发送结束面试消息\r\n await this.sendEndInterviewMessage();\r\n } else {\r\n // 正常流程:发送\"下一题\"请求,可以附带转录文本\r\n this.sendMessageToAPI(transcriptionText || this.strings?.messages?.nextQuestion, fileInfo.cos_key);\r\n }\r\n } catch (error) {\r\n console.error('视频上传或处理错误:', error);\r\n this.isEndingInterview = false; // 出错时重置标志\r\n SentryReporter.captureError(error, {\r\n action: 'uploadRecordedVideo',\r\n component: 'pcm-app-chat-modal',\r\n title: '视频上传或处理失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '视频上传或处理失败',\r\n });\r\n } finally {\r\n this.isUploadingVideo = false; // 上传完成后重置状态\r\n this.showRecordingUI = false;\r\n this.recordedBlob = null;\r\n }\r\n }\r\n\r\n // 确保组件卸载时释放资源\r\n disconnectedCallback() {\r\n document.removeEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n\r\n // 清理其他计时器\r\n if (this.waitingTimer) {\r\n clearInterval(this.waitingTimer);\r\n this.waitingTimer = null;\r\n }\r\n\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n this.recordingTimer = null;\r\n }\r\n\r\n // 清理音频录制计时器\r\n if (this.audioRecordingTimer) {\r\n clearInterval(this.audioRecordingTimer);\r\n this.audioRecordingTimer = null;\r\n }\r\n\r\n // 停止录制\r\n this.stopRecording();\r\n\r\n // 停止音频录制\r\n this.stopAudioRecording();\r\n }\r\n\r\n // 处理文本输入变化\r\n private handleTextInputChange = (event: Event) => {\r\n const input = event.target as HTMLTextAreaElement;\r\n this.textAnswer = input.value;\r\n };\r\n\r\n // 添加处理键盘事件的方法\r\n private handleKeyDown = (event: KeyboardEvent) => {\r\n // 如果按下的是回车键\r\n if (event.key === 'Enter') {\r\n if (event.isComposing) {\r\n return;\r\n }\r\n\r\n // 如果同时按下了Ctrl键,允许换行\r\n if (event.ctrlKey) {\r\n // 获取当前光标位置\r\n const textarea = event.target as HTMLTextAreaElement;\r\n const cursorPosition = textarea.selectionStart;\r\n\r\n // 在光标位置插入换行符\r\n const beforeCursor = this.textAnswer.substring(0, cursorPosition);\r\n const afterCursor = this.textAnswer.substring(cursorPosition);\r\n this.textAnswer = beforeCursor + '\\n' + afterCursor;\r\n\r\n // 阻止默认行为\r\n event.preventDefault();\r\n\r\n // 在下一个事件循环中设置光标位置\r\n setTimeout(() => {\r\n const newPosition = cursorPosition + 1;\r\n textarea.setSelectionRange(newPosition, newPosition);\r\n }, 0);\r\n\r\n return;\r\n } else {\r\n // 阻止默认的换行行为\r\n event.preventDefault();\r\n // 如果文本框不为空且不处于禁用状态,则发送消息\r\n if (this.textAnswer.trim() && !this.isSubmittingText && !this.isLoading && !this.currentStreamingMessage && !this.waitingToRecord) {\r\n this.submitTextAnswer();\r\n }\r\n }\r\n }\r\n };\r\n\r\n // 修改提交文本回答的方法\r\n private submitTextAnswer = async () => {\r\n if (!this.textAnswer.trim() || this.isSubmittingText) {\r\n return;\r\n }\r\n\r\n this.isSubmittingText = true;\r\n\r\n try {\r\n // 保存当前输入内容\r\n const textToSend = this.textAnswer;\r\n\r\n // 立即清空文本输入\r\n this.textAnswer = '';\r\n\r\n // 发送用户输入的文本作为查询\r\n await this.sendMessageToAPI(textToSend);\r\n } catch (error) {\r\n console.error('提交文本回答失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'submitTextAnswer',\r\n component: 'pcm-app-chat-modal',\r\n title: '提交文本回答失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '提交文本回答失败',\r\n });\r\n } finally {\r\n this.isSubmittingText = false;\r\n }\r\n };\r\n\r\n // 如果是简历制作,可以提前结束对话\r\n private closeResumeChat = async () => {\r\n const message = {\r\n query: this.strings?.messages?.generateResume,\r\n inputs: {\r\n mode_type: 1,\r\n generate_resume: 1,\r\n },\r\n };\r\n this.isSubmittingText = true;\r\n\r\n try {\r\n this.customInputs = message.inputs;\r\n this.closeResume?.();\r\n // 发送用户输入的文本作为查询\r\n await this.sendMessageToAPI(message.query);\r\n } catch (error) {\r\n console.error('提交文本回答失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'submitTextAnswer',\r\n component: 'pcm-app-chat-modal',\r\n title: '提交文本回答失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '提交文本回答失败',\r\n });\r\n } finally {\r\n this.isSubmittingText = false;\r\n this.customInputs = {};\r\n }\r\n };\r\n\r\n // 处理语音输入按钮点击\r\n private handleVoiceInputClick = () => {\r\n if (this.isRecordingAudio) {\r\n this.stopAudioRecording();\r\n } else {\r\n // 直接在用户交互事件处理程序中请求权限\r\n // 不使用 async/await,而是使用 Promise 链\r\n navigator.mediaDevices\r\n .getUserMedia({ audio: true })\r\n .then(stream => {\r\n // 权限已获取,开始录音\r\n this.startRecordingWithStream(stream);\r\n })\r\n .catch(error => {\r\n console.error('麦克风权限请求失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'handleVoiceInputClick',\r\n component: 'pcm-app-chat-modal',\r\n title: '麦克风权限请求失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '麦克风权限请求失败',\r\n });\r\n });\r\n }\r\n };\r\n\r\n // 新方法:使用已获取的媒体流开始录音\r\n private startRecordingWithStream(stream: MediaStream) {\r\n try {\r\n // 检测浏览器支持的音频MIME类型\r\n const mimeType = getSupportedAudioMimeType();\r\n\r\n // 创建MediaRecorder实例\r\n let audioRecorder;\r\n try {\r\n audioRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n });\r\n } catch (e) {\r\n console.warn('指定的音频MIME类型不受支持,使用默认设置:', e);\r\n try {\r\n audioRecorder = new MediaRecorder(stream);\r\n } catch (recorderError) {\r\n // 停止并释放媒体流\r\n stream.getTracks().forEach(track => track.stop());\r\n console.error('无法创建音频录制器:', recorderError);\r\n SentryReporter.captureError(recorderError, {\r\n action: 'startRecordingWithStream',\r\n component: 'pcm-app-chat-modal',\r\n title: '无法创建音频录制器',\r\n });\r\n ErrorEventBus.emitError({\r\n error: recorderError,\r\n message: '无法创建音频录制器',\r\n });\r\n return;\r\n }\r\n }\r\n\r\n this.audioRecorder = audioRecorder;\r\n this.audioChunks = [];\r\n this.isRecordingAudio = true;\r\n this.audioRecordingStartTime = Date.now();\r\n this.audioRecordingTimeLeft = this.maxAudioRecordingTime;\r\n\r\n // 设置数据可用事件处理\r\n audioRecorder.ondataavailable = event => {\r\n if (event.data.size > 0) {\r\n this.audioChunks.push(event.data);\r\n }\r\n };\r\n\r\n // 设置录制停止事件处理\r\n audioRecorder.onstop = () => {\r\n // 停止并释放媒体流\r\n stream.getTracks().forEach(track => track.stop());\r\n\r\n // 处理录制的音频\r\n this.processAudioRecording();\r\n };\r\n\r\n // 开始录制\r\n audioRecorder.start(100); // 每100毫秒获取一次数据\r\n\r\n // 设置录制计时器\r\n this.audioRecordingTimer = setInterval(() => {\r\n const elapsedTime = Math.floor((Date.now() - this.audioRecordingStartTime) / 1000);\r\n this.audioRecordingTimeLeft = Math.max(0, this.maxAudioRecordingTime - elapsedTime);\r\n\r\n // 时间到自动停止录制\r\n if (this.audioRecordingTimeLeft <= 0) {\r\n this.stopAudioRecording();\r\n }\r\n }, 1000);\r\n } catch (error) {\r\n // 停止并释放媒体流\r\n stream.getTracks().forEach(track => track.stop());\r\n console.error('开始录音失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'startRecordingWithStream',\r\n component: 'pcm-app-chat-modal',\r\n title: '开始录音失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '开始录音失败,请确保麦克风设备正常工作',\r\n });\r\n }\r\n }\r\n\r\n // 处理录制的音频\r\n private async processAudioRecording() {\r\n if (this.audioChunks.length === 0) {\r\n console.warn('没有录制到音频数据');\r\n return;\r\n }\r\n\r\n try {\r\n this.isConvertingAudio = true;\r\n\r\n // 创建音频Blob\r\n const audioType = getSupportedAudioMimeType() || 'audio/webm';\r\n const audioBlob = new Blob(this.audioChunks, { type: audioType });\r\n\r\n if (audioBlob.size === 0) {\r\n console.warn('录制的音频为空');\r\n this.isConvertingAudio = false;\r\n return;\r\n }\r\n\r\n // 创建File对象\r\n const fileExtension = audioType.includes('webm') ? 'webm' : 'mp3';\r\n const fileName = `audio_input.${fileExtension}`;\r\n const audioFile = new File([audioBlob], fileName, { type: audioType });\r\n\r\n // 上传音频文件\r\n const fileInfo = await uploadFileToBackend(\r\n audioFile,\r\n {},\r\n {\r\n tags: ['audio'],\r\n },\r\n );\r\n\r\n // 调用音频转文字API\r\n const transcriptionText = await convertAudioToText(fileInfo.cos_key);\r\n\r\n // 将转录文本追加到文本框,而不是替换\r\n if (transcriptionText) {\r\n // 保存当前光标位置\r\n const textArea = this.hostElement.shadowRoot?.querySelector('.text-answer-input') as HTMLTextAreaElement;\r\n const cursorPosition = textArea?.selectionStart || this.textAnswer.length;\r\n\r\n // 在光标位置插入识别的文本\r\n const beforeCursor = this.textAnswer.substring(0, cursorPosition);\r\n const afterCursor = this.textAnswer.substring(cursorPosition);\r\n\r\n // 如果当前文本不为空且不以空格结尾,添加一个空格\r\n const spacer = beforeCursor.length > 0 && !beforeCursor.endsWith(' ') ? ' ' : '';\r\n\r\n // 更新文本\r\n this.textAnswer = beforeCursor + spacer + transcriptionText + afterCursor;\r\n\r\n // 设置新的光标位置\r\n setTimeout(() => {\r\n if (textArea) {\r\n const newPosition = cursorPosition + spacer.length + transcriptionText.length;\r\n textArea.focus();\r\n textArea.setSelectionRange(newPosition, newPosition);\r\n }\r\n }, 0);\r\n } else {\r\n console.warn('未能识别语音内容');\r\n alert('未能识别语音内容,请重试或直接输入文字');\r\n }\r\n } catch (error) {\r\n console.error('处理音频录制失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'processAudioRecording',\r\n component: 'pcm-app-chat-modal',\r\n title: '处理音频录制失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '语音识别失败,请重试',\r\n });\r\n } finally {\r\n this.isConvertingAudio = false;\r\n this.audioChunks = [];\r\n }\r\n }\r\n\r\n // 停止录制音频\r\n private stopAudioRecording() {\r\n if (this.audioRecorder && this.isRecordingAudio) {\r\n this.audioRecorder.stop();\r\n this.isRecordingAudio = false;\r\n\r\n // 清理计时器\r\n if (this.audioRecordingTimer) {\r\n clearInterval(this.audioRecordingTimer);\r\n this.audioRecordingTimer = null;\r\n }\r\n }\r\n }\r\n\r\n // 处理历史会话按钮点击\r\n private handleHistoryClick = () => {\r\n this.isHistoryDrawerOpen = true;\r\n this.loadHistoryConversations();\r\n };\r\n\r\n // 获取历史会话列表\r\n private async loadHistoryConversations() {\r\n if (!this.botId) {\r\n console.warn('没有提供botId,无法获取历史会话');\r\n return;\r\n }\r\n\r\n this.isLoadingConversations = true;\r\n\r\n try {\r\n const result = await sendHttpRequest({\r\n url: '/sdk/v1/chat/conversations',\r\n method: 'GET',\r\n data: {\r\n bot_id: this.botId,\r\n limit: 50, // 获取最近50个会话\r\n page: 1,\r\n },\r\n });\r\n\r\n if (result.success && result.data) {\r\n const conversations = result.data.data || [];\r\n\r\n // 格式化会话数据\r\n this.historyConversations = conversations.map((conv: any) => {\r\n // 处理时间戳,确保它是有效的数字\r\n let createdTime: Date;\r\n let timeDisplay = this.strings?.unknownTime;\r\n\r\n try {\r\n // 确保 created_at 是一个有效的时间戳\r\n const timestamp = typeof conv.created_at === 'string' ? parseInt(conv.created_at) : conv.created_at;\r\n\r\n if (isNaN(timestamp) || timestamp <= 0) {\r\n console.warn('无效的时间戳:', conv.created_at);\r\n createdTime = new Date();\r\n } else {\r\n // Unix时间戳转换为JavaScript Date对象(乘以1000转换为毫秒)\r\n createdTime = new Date(timestamp * 1000);\r\n }\r\n\r\n // 验证日期是否有效\r\n if (isNaN(createdTime.getTime())) {\r\n console.warn('无效的日期对象:', conv.created_at);\r\n createdTime = new Date();\r\n }\r\n\r\n const now = new Date();\r\n const diffTime = now.getTime() - createdTime.getTime();\r\n const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24));\r\n\r\n // 格式化时间显示\r\n if (diffDays === 0) {\r\n // 今天\r\n timeDisplay = `今天 ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n } else if (diffDays === 1) {\r\n // 昨天\r\n timeDisplay = `昨天 ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n } else if (diffDays > 0 && diffDays < 7) {\r\n // 一周内\r\n const weekdays = [\r\n this.strings?.weekdays?.sunday,\r\n this.strings?.weekdays?.monday,\r\n this.strings?.weekdays?.tuesday,\r\n this.strings?.weekdays?.wednesday,\r\n this.strings?.weekdays?.thursday,\r\n this.strings?.weekdays?.friday,\r\n this.strings?.weekdays?.saturday\r\n ];\r\n timeDisplay = `${weekdays[createdTime.getDay()]} ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n } else if (diffDays < 0) {\r\n // 未来时间(可能是时区问题或系统时间不准确)\r\n timeDisplay = `${(createdTime.getMonth() + 1).toString().padStart(2, '0')}-${createdTime.getDate().toString().padStart(2, '0')} ${createdTime\r\n .getHours()\r\n .toString()\r\n .padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n } else {\r\n // 超过一周\r\n timeDisplay = `${(createdTime.getMonth() + 1).toString().padStart(2, '0')}-${createdTime.getDate().toString().padStart(2, '0')} ${createdTime\r\n .getHours()\r\n .toString()\r\n .padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n }\r\n } catch (error) {\r\n console.error('时间格式化错误:', error, conv.created_at);\r\n timeDisplay = this.strings?.timeParseError;\r\n }\r\n\r\n return {\r\n id: conv.id,\r\n name: conv.name || this.strings?.newConversation,\r\n created_at: conv.created_at,\r\n updated_at: conv.updated_at,\r\n status: conv.status,\r\n message_count: conv.message_count || 0,\r\n timeDisplay,\r\n } as ConversationItem;\r\n });\r\n }\r\n } catch (error) {\r\n console.error('获取历史会话失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'loadHistoryConversations',\r\n component: 'pcm-app-chat-modal',\r\n title: '获取历史会话失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '获取历史会话失败',\r\n });\r\n } finally {\r\n this.isLoadingConversations = false;\r\n }\r\n }\r\n\r\n // 切换到指定会话\r\n private handleSwitchConversation = (conversationId: string) => {\r\n if (conversationId === this.conversationId) {\r\n // 如果点击的是当前会话,直接关闭抽屉\r\n this.isHistoryDrawerOpen = false;\r\n return;\r\n }\r\n\r\n // 切换到新会话\r\n this.conversationId = conversationId;\r\n this.messages = [];\r\n this.currentStreamingMessage = null;\r\n this.isTaskCompleted = false;\r\n this.currentQuestionNumber = 0;\r\n\r\n // 关闭抽屉\r\n this.isHistoryDrawerOpen = false;\r\n\r\n // 加载新会话的历史消息\r\n this.loadHistoryMessages();\r\n };\r\n\r\n // pcm-chat-message事件处理方法\r\n private handleFilePreviewRequest = (\r\n event: CustomEvent<{\r\n url?: string;\r\n fileName: string;\r\n content?: string;\r\n contentType: 'file' | 'markdown' | 'text';\r\n }>,\r\n ) => {\r\n const { url, fileName, content, contentType } = event.detail;\r\n\r\n this.previewFileName = fileName || this.strings?.contentPreview;\r\n this.previewContentType = contentType;\r\n this.previewUrl = url;\r\n this.previewContent = content || '';\r\n this.isDrawerOpen = true;\r\n };\r\n\r\n /**\r\n * 判断当前消息是否为最后一个消息(用于确定是否需要等待数字人视频)\r\n */\r\n private isLastMessage(message: ChatMessage): boolean {\r\n if (this.currentStreamingMessage) {\r\n return false;\r\n }\r\n\r\n // 如果没有流式消息,检查当前消息是否是messages数组中的最后一个\r\n if (this.messages.length === 0) {\r\n return false;\r\n }\r\n\r\n const lastMessage = this.messages[this.messages.length - 1];\r\n\r\n return message.id === lastMessage.id;\r\n }\r\n\r\n /**\r\n * 处理数字人视频生成成功事件\r\n */\r\n private handleDigitalHumanVideoGenerated = (\r\n event: CustomEvent<{\r\n videoUrl: string;\r\n }>,\r\n ) => {\r\n const { videoUrl } = event.detail;\r\n\r\n console.log('数字人视频生成成功:', {\r\n videoUrl,\r\n conversationId: this.conversationId,\r\n currentQuestionNumber: this.currentQuestionNumber,\r\n });\r\n\r\n // 设置数字人视频已准备好\r\n this.digitalHumanVideoReady = true;\r\n };\r\n\r\n /**\r\n * 处理数字人视频播放完成事件\r\n */\r\n private handleDigitalHumanVideoEnded = () => {\r\n\r\n // 数字人视频播放完成后,开始录制流程\r\n // 如果任务已完成或正在结束面试,不开始录制流程\r\n if (this.waitingForDigitalHuman && this.interviewMode === 'video' && !this.isTaskCompleted && !this.isEndingInterview) {\r\n this.waitingForDigitalHuman = false;\r\n this.startWaitingToRecord();\r\n }\r\n };\r\n\r\n /**\r\n * 预创建数字人视频\r\n */\r\n private async precreateDigitalHumanVideos(digital_human_list: string[]) {\r\n if (!this.virtualmanKey) {\r\n console.warn('VirtualmanKey尚未加载,无法预创建视频。');\r\n // 可以在此处添加逻辑,等待virtualmanKey加载后再执行\r\n return;\r\n }\r\n\r\n console.log('开始批量预创建数字人视频...');\r\n\r\n for (const text of digital_human_list) {\r\n if (!text || !text.trim()) continue;\r\n try {\r\n // 注意:这里只创建任务,不等待视频生成完成\r\n await sendHttpRequest({\r\n url: '/sdk/v1/virtual-human/create-video',\r\n method: 'POST',\r\n data: {\r\n VirtualmanKey: this.virtualmanKey,\r\n InputSsml: text,\r\n SpeechParam: {\r\n Speed: 1,\r\n },\r\n VideoParam: {\r\n Format: 'TransparentWebm',\r\n },\r\n DriverType: 'Text',\r\n },\r\n });\r\n } catch (error) {\r\n console.error(`为文本 \"${text}\" 创建视频任务失败:`, error);\r\n // 可以选择性地报告错误\r\n SentryReporter.captureError(error, {\r\n action: 'precreateDigitalHumanVideos',\r\n component: 'pcm-app-chat-modal',\r\n title: `为文本 \"${text}\" 创建视频任务失败`,\r\n });\r\n }\r\n }\r\n console.log('数字人视频预创建任务已全部发送。');\r\n }\r\n\r\n /**\r\n * 处理数字人详情加载完成事件\r\n */\r\n private handleAvatarDetailLoaded = (event: CustomEvent<{ virtualmanKey: string }>) => {\r\n if (event.detail.virtualmanKey) {\r\n this.virtualmanKey = event.detail.virtualmanKey;\r\n console.log('已获取 VirtualmanKey:', this.virtualmanKey);\r\n }\r\n };\r\n\r\n /**\r\n * 处理面试结束按钮点击 - 显示二次确认模态框\r\n */\r\n private handleInterviewEnd = () => {\r\n // 如果已经在结束流程中或任务已完成,不允许再次点击\r\n if (this.isEndingInterview || this.isTaskCompleted) {\r\n console.log('已在结束流程中或任务已完成,忽略点击');\r\n return;\r\n }\r\n\r\n console.log('点击结束面试按钮,显示确认模态框');\r\n this.showEndInterviewConfirmModal = true;\r\n };\r\n\r\n /**\r\n * 确认结束面试\r\n */\r\n private handleConfirmEndInterview = async () => {\r\n try {\r\n console.log('用户确认结束面试');\r\n this.showEndInterviewConfirmModal = false;\r\n\r\n // 设置结束面试标志\r\n this.isEndingInterview = true;\r\n\r\n // 停止所有可能正在进行的流程\r\n // 1. 清除等待录制计时器\r\n if (this.waitingTimer) {\r\n clearInterval(this.waitingTimer);\r\n this.waitingTimer = null;\r\n }\r\n this.waitingToRecord = false;\r\n\r\n // 2. 清除等待数字人标志\r\n this.waitingForDigitalHuman = false;\r\n\r\n // 3. 如果正在录制,需要先停止录制并上传视频\r\n if (this.isRecording) {\r\n console.log('正在录制,先停止录制并上传视频');\r\n this.stopRecording();\r\n // uploadRecordedVideo 会在上传完成后检查 isEndingInterview 标志\r\n // 并发送结束面试消息\r\n } else {\r\n // 如果没有录制,直接发送结束面试消息\r\n await this.sendEndInterviewMessage();\r\n }\r\n\r\n } catch (error) {\r\n console.error('点击结束发送消息失败:', error);\r\n this.isEndingInterview = false;\r\n SentryReporter.captureError(error, {\r\n action: 'handleConfirmEndInterview',\r\n component: 'pcm-app-chat-modal',\r\n title: '点击结束发送消息失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '点击结束发送消息失败',\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * 发送结束面试消息\r\n */\r\n private sendEndInterviewMessage = async () => {\r\n try {\r\n const endMessage = this.strings?.messages?.endInterviewMessage;\r\n\r\n // 发送消息到API\r\n await this.sendMessageToAPI(endMessage);\r\n\r\n // 重置标志\r\n this.isEndingInterview = false;\r\n } catch (error) {\r\n console.error('发送结束面试消息失败:', error);\r\n this.isEndingInterview = false;\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * 取消结束面试\r\n */\r\n private handleCancelEndInterview = () => {\r\n this.showEndInterviewConfirmModal = false;\r\n };\r\n\r\n /**\r\n * 计算已回答的题数\r\n */\r\n private getAnsweredQuestionCount = (): number => {\r\n // 统计用户已经回答的问题数量(有answer的消息)\r\n return this.messages.filter(msg => msg.answer && msg.answer.trim()).length;\r\n };\r\n\r\n render() {\r\n if (!this.isOpen) return null;\r\n\r\n const modalStyle = {\r\n zIndex: String(this.zIndex),\r\n };\r\n\r\n const containerClass = {\r\n 'modal-container': true,\r\n 'fullscreen': this.fullscreen,\r\n };\r\n\r\n const overlayClass = {\r\n 'modal-overlay': true,\r\n 'fullscreen-overlay': this.fullscreen,\r\n };\r\n\r\n const renderVideoPreview = () => (\r\n <div class=\"video-preview\">\r\n <video\r\n autoPlay\r\n playsInline\r\n muted\r\n style={{ transform: 'scaleX(-1)' }}\r\n ref={el => {\r\n if (el && this.recordingStream && !this.videoRef) {\r\n this.videoRef = el;\r\n // 不在这里设置srcObject,而是使用setupVideoPreview方法\r\n }\r\n }}\r\n ></video>\r\n <div\r\n class={{\r\n 'recording-status': true,\r\n 'warning': this.showCountdownWarning,\r\n }}\r\n >\r\n <span class=\"recording-dot\"></span>\r\n <span>\r\n {this.strings.recording.recordingInProgress} {Math.floor(this.recordingTimeLeft / 60)}:{(this.recordingTimeLeft % 60).toString().padStart(2, '0')}\r\n {this.showCountdownWarning && ` (${this.strings.recording.autoCompleteWarning})`}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n\r\n // 渲染占位符状态信息\r\n const renderPlaceholderStatus = () => {\r\n // 设备错误状态 - 优先显示\r\n if (this.deviceError) {\r\n return (\r\n <div class=\"placeholder-status error-status\">\r\n <p>{this.deviceError}</p>\r\n <div class=\"error-suggestions\">\r\n <p>{this.strings.deviceError.trySolutions}</p>\r\n <ul>\r\n <li>{this.strings.deviceError.solution1}</li>\r\n <li>{this.strings.deviceError.solution2}</li>\r\n <li>{this.strings.deviceError.solution3}</li>\r\n </ul>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // 任务已完成\r\n if (this.isTaskCompleted) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>{this.strings.placeholderStatus.interviewCompleted}</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 正在等待数字人视频播放完成\r\n if (this.waitingForDigitalHuman && this.digitalId) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>{this.strings?.placeholderStatus?.aiReviewing}</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 正在播放音频\r\n if (this.isPlayingAudio) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>{this.strings?.placeholderStatus?.playingQuestion}</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 正在上传视频\r\n if (this.isUploadingVideo) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>{this.strings?.placeholderStatus?.uploadingVideo}</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 正在加载或等待AI回复\r\n if (this.isLoading || this.currentStreamingMessage) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>{this.strings?.placeholderStatus?.waitingForQuestion}</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 等待开始录制\r\n if (this.waitingToRecord) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>{(this.strings?.placeholderStatus?.prepareToRecord).replace('{time}', this.waitingTimeLeft.toString())}</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 添加默认状态\r\n return (\r\n <div class=\"placeholder-status default-status\">\r\n <p>{this.strings?.placeholderStatus?.preparing}</p>\r\n </div>\r\n );\r\n };\r\n\r\n // 修改文本输入区域渲染函数\r\n const renderTextInputArea = () => (\r\n <div class=\"text-input-area\">\r\n {/* 只有简历制作的时候需要展示结束对话 */}\r\n {this.botId === '39284520284983296' && (\r\n <button\r\n class={{\r\n 'cancel-button': true,\r\n 'disabled': this.messages.length <= 3,\r\n }}\r\n disabled={this.messages.length <= 3}\r\n onClick={this.closeResumeChat}\r\n >\r\n {this.strings?.buttons?.endChatGenerateResume}\r\n </button>\r\n )}\r\n {this.botId === '45444431062634496' && (\r\n <button\r\n class={{\r\n 'cancel-button': true,\r\n 'disabled': this.isLoading,\r\n }}\r\n disabled={this.isLoading}\r\n onClick={() => this.closeResume?.()}\r\n title={this.strings?.resumeCreation}\r\n >\r\n {this.strings?.resumeCreation}\r\n </button>\r\n )}\r\n <textarea\r\n class=\"text-answer-input\"\r\n placeholder={this.isTaskCompleted ? this.strings.conversationEnded : this.strings.sendMessage}\r\n value={this.textAnswer}\r\n onInput={this.handleTextInputChange}\r\n onKeyDown={this.handleKeyDown}\r\n disabled={this.isTaskCompleted || this.isRecordingAudio || this.isConvertingAudio}\r\n ></textarea>\r\n <div class=\"input-toolbar\">\r\n <div class=\"toolbar-actions\">\r\n <button\r\n class={{\r\n 'toolbar-button': true,\r\n 'recording': this.isRecordingAudio,\r\n 'converting': this.isConvertingAudio,\r\n }}\r\n title={this.isRecordingAudio ? this.strings.clickToStopRecording : this.isConvertingAudio ? this.strings.recognizingSpeech : this.strings.voiceInput}\r\n onClick={this.handleVoiceInputClick}\r\n disabled={\r\n this.isTaskCompleted ||\r\n this.isConvertingAudio ||\r\n this.isSubmittingText ||\r\n this.isLoading ||\r\n !!this.currentStreamingMessage ||\r\n this.waitingToRecord ||\r\n this.isPlayingAudio\r\n }\r\n >\r\n {this.isRecordingAudio ? (\r\n <div>\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M12 14c1.66 0 3-1.34 3-3V5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3z\" />\r\n <path d=\"M17 11c0 2.76-2.24 5-5 5s-5-2.24-5-5H5c0 3.53 2.61 6.43 6 6.92V21h2v-3.08c3.39-.49 6-3.39 6-6.92h-2z\" />\r\n <circle cx=\"12\" cy=\"11\" r=\"4\" fill=\"red\" />\r\n </svg>\r\n {/* <span class=\"recording-time\">{this.audioRecordingTimeLeft}s</span> */}\r\n </div>\r\n ) : this.isConvertingAudio ? (\r\n <div class=\"converting-indicator\">\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z\" />\r\n </svg>\r\n </div>\r\n ) : (\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M12 14c1.66 0 3-1.34 3-3V5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3z\" />\r\n <path d=\"M17 11c0 2.76-2.24 5-5 5s-5-2.24-5-5H5c0 3.53 2.61 6.43 6 6.92V21h2v-3.08c3.39-.49 6-3.39 6-6.92h-2z\" />\r\n </svg>\r\n )}\r\n </button>\r\n </div>\r\n <div\r\n class={{\r\n 'send-button': true,\r\n 'disabled':\r\n this.isTaskCompleted ||\r\n !this.textAnswer.trim() ||\r\n this.isSubmittingText ||\r\n this.isLoading ||\r\n !!this.currentStreamingMessage ||\r\n this.waitingToRecord ||\r\n this.isPlayingAudio ||\r\n this.isRecordingAudio ||\r\n this.isConvertingAudio,\r\n }}\r\n onClick={() => {\r\n if (\r\n this.isTaskCompleted ||\r\n !this.textAnswer.trim() ||\r\n this.isSubmittingText ||\r\n this.isLoading ||\r\n !!this.currentStreamingMessage ||\r\n this.waitingToRecord ||\r\n this.isPlayingAudio ||\r\n this.isRecordingAudio ||\r\n this.isConvertingAudio\r\n ) {\r\n return;\r\n }\r\n this.submitTextAnswer();\r\n }}\r\n >\r\n <img src=\"https://pcm-pub-1351162788.cos.ap-guangzhou.myqcloud.com/sdk/image/i_send.png\" />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n // 确定要使用的助手头像\r\n const effectiveAssistantAvatar = this.assistantAvatar || this.agentLogo;\r\n\r\n return (\r\n <div class={overlayClass} style={modalStyle}>\r\n <div class={containerClass}>\r\n {this.isShowHeader && (\r\n <div class=\"modal-header\">\r\n <div class=\"header-left\">\r\n {this.icon && <img src={this.icon} class=\"header-icon\" />}\r\n <div>{this.modalTitle}</div>\r\n </div>\r\n {this.isNeedClose && (\r\n <button class=\"close-button\" onClick={this.handleClose}>\r\n <span>×</span>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n <div class=\"chat-container\">\r\n <div class=\"chat-history\" onScroll={this.handleScroll} onTouchStart={this.handleTouchStart} onTouchEnd={this.handleTouchEnd} onWheel={this.handleWheel}>\r\n {this.isLoadingHistory ? (\r\n <div class=\"loading-container\">\r\n <div class=\"loading-spinner\"></div>\r\n <p>{this.strings?.loading?.loadingHistory}</p>\r\n </div>\r\n ) : (\r\n <div>\r\n {/* 合并历史消息和流式消息统一渲染,避免组件闪烁 */}\r\n {[...this.messages, ...(this.currentStreamingMessage ? [this.currentStreamingMessage] : [])].map(message => (\r\n <div id={`message_${message.id}`} key={message.id}>\r\n <pcm-chat-message\r\n locale={this.locale}\r\n botId={this.botId}\r\n message={message}\r\n showAssistantMessage={!this.digitalId || !this.isLastMessage(message) || this.digitalHumanVideoReady || this.isTaskCompleted}\r\n userAvatar={this.userAvatar}\r\n assistantAvatar={effectiveAssistantAvatar}\r\n showCopyButton={this.showCopyButton}\r\n showFeedbackButtons={this.showFeedbackButtons}\r\n filePreviewMode={this.filePreviewMode}\r\n onFilePreviewRequest={this.handleFilePreviewRequest}\r\n showSaveJdButton={this.showSaveJdButton}\r\n saveJdButtonText={this.saveJdButtonText}\r\n ></pcm-chat-message>\r\n </div>\r\n ))}\r\n {this.messages.length === 0 && !this.currentStreamingMessage && (\r\n <div class=\"empty-state\">\r\n <p>{this.strings?.welcome?.greeting}</p>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div class=\"recording-section\">\r\n <div class=\"recording-container\">\r\n {/* 工作区 */}\r\n {(this.showWorkspaceHistory || this.digitalId || (this.showEndInterviewButton && !this.isTaskCompleted && this.conversationId)) && (\r\n <div class=\"workspace-section\">\r\n <div class=\"workspace-toolbar\">\r\n <div style={{ display: 'flex', gap: '8px' }}>\r\n {!this.isTaskCompleted && this.conversationId && this.showEndInterviewButton && (\r\n <button\r\n class=\"workspace-button end-interview-button\"\r\n onClick={this.handleInterviewEnd}\r\n disabled={this.isLoading || this.isEndingInterview}\r\n title={this.isEndingInterview ? this.strings?.endingInterview : this.strings?.endInterview}\r\n >\r\n <span>{this.isEndingInterview ? this.strings?.ending : this.strings?.endInterview}</span>\r\n </button>\r\n )}\r\n {this.showWorkspaceHistory && (\r\n <button class=\"workspace-button history-button\" onClick={() => this.handleHistoryClick()}>\r\n <span>{this.strings?.historyConversations}</span>\r\n </button>\r\n )}\r\n </div>\r\n {this.digitalId && !this.isTaskCompleted && (\r\n <div class=\"digital-human-wrapper\">\r\n <pcm-digital-human\r\n digitalId={this.digitalId}\r\n speechText={this.lastCompletedAnswer}\r\n isStreaming={!!this.currentStreamingMessage}\r\n playbackRate={this.playbackRate}\r\n onVideoGenerated={this.handleDigitalHumanVideoGenerated}\r\n onVideoEnded={this.handleDigitalHumanVideoEnded}\r\n onAvatarDetailLoaded={this.handleAvatarDetailLoaded}\r\n ></pcm-digital-human>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n {this.interviewMode === 'text' && renderTextInputArea()}\r\n {this.interviewMode === 'video' && (\r\n <div class=\"video-container\">\r\n <div class=\"video-area\">{this.showRecordingUI ? renderVideoPreview() : <div class=\"video-preview placeholder\">{renderPlaceholderStatus()}</div>}</div>\r\n <div class=\"recording-controls\">\r\n {this.showRecordingUI ? (\r\n <button class=\"stop-recording-button\" onClick={() => this.handleStopRecording()}>\r\n {this.strings?.buttons?.completeAnswer}\r\n </button>\r\n ) : (\r\n <div class=\"waiting-message\">\r\n <button class=\"stop-recording-button disabled\" disabled>\r\n {this.strings?.buttons?.completeAnswerShort}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* 添加预览抽屉 */}\r\n <pcm-drawer\r\n isOpen={this.isDrawerOpen}\r\n drawerTitle={this.previewFileName}\r\n width=\"80%\"\r\n onClosed={() => {\r\n this.isDrawerOpen = false;\r\n this.previewUrl = '';\r\n this.previewContent = '';\r\n }}\r\n >\r\n {this.previewContentType === 'file' && this.previewUrl && (\r\n <div class=\"file-preview-container\">\r\n <iframe src={this.previewUrl} frameborder=\"0\" width=\"100%\" height=\"100%\" style={{ border: 'none', height: 'calc(100vh - 120px)' }}></iframe>\r\n </div>\r\n )}\r\n\r\n {this.previewContentType === 'markdown' && this.previewContent && <div class=\"markdown-preview-container markdown-body\" innerHTML={marked(this.previewContent)}></div>}\r\n\r\n {this.previewContentType === 'text' && this.previewContent && (\r\n <div class=\"text-preview-container\">\r\n <pre style={{ whiteSpace: 'pre-wrap', wordWrap: 'break-word' }}>{this.previewContent}</pre>\r\n </div>\r\n )}\r\n </pcm-drawer>\r\n\r\n {/* 历史会话抽屉 */}\r\n <pcm-drawer\r\n isOpen={this.isHistoryDrawerOpen}\r\n drawerTitle={this.strings?.historyConversations}\r\n width=\"400px\"\r\n onClosed={() => {\r\n this.isHistoryDrawerOpen = false;\r\n }}\r\n >\r\n <div class=\"history-drawer-content\">\r\n {/* 会话列表 */}\r\n <div class=\"conversation-list\">\r\n {this.isLoadingConversations ? (\r\n <div class=\"loading-conversations\">\r\n <div class=\"loading-spinner-small\"></div>\r\n <p>{this.strings.history.loading}</p>\r\n </div>\r\n ) : this.historyConversations.length === 0 ? (\r\n <div class=\"empty-conversations\">\r\n <p>{this.strings.history.noHistory}</p>\r\n </div>\r\n ) : (\r\n this.historyConversations.map(conversation => (\r\n <div\r\n key={conversation.id}\r\n class={{\r\n 'conversation-item': true,\r\n 'active': conversation.id === this.conversationId,\r\n }}\r\n onClick={() => this.handleSwitchConversation(conversation.id)}\r\n >\r\n <div class=\"conversation-info\">\r\n <div class=\"conversation-title\">{conversation.name}</div>\r\n <div class=\"conversation-meta\">\r\n <span class=\"conversation-time\">{conversation.timeDisplay}</span>\r\n {conversation.message_count > 0 && <span class=\"message-count\">{conversation.message_count}条消息</span>}\r\n {conversation.status && (\r\n <span\r\n class={{\r\n 'conversation-status': true,\r\n 'completed': conversation.status === '结束',\r\n 'running': conversation.status === '进行中',\r\n }}\r\n >\r\n {conversation.status}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n {conversation.id === this.conversationId && (\r\n <div class=\"current-indicator\">\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"currentColor\">\r\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\" />\r\n </svg>\r\n </div>\r\n )}\r\n </div>\r\n ))\r\n )}\r\n </div>\r\n </div>\r\n </pcm-drawer>\r\n\r\n {/* 二次确认模态框 */}\r\n <pcm-confirm-modal\r\n isOpen={this.showConfirmModal}\r\n modalTitle={this.strings?.confirmComplete}\r\n okText={this.strings?.confirmComplete}\r\n cancelText={this.strings?.continueRecording}\r\n okType=\"danger\"\r\n onOk={this.handleConfirmModalOk}\r\n onCancel={this.handleConfirmModalCancelEvent}\r\n onClosed={this.handleConfirmModalCancel}\r\n >\r\n <div style={{ marginBottom: '16px' }}>\r\n <div\r\n style={{\r\n fontSize: '14px',\r\n color: '#1890ff',\r\n fontWeight: '500',\r\n marginBottom: '16px',\r\n textAlign: 'center',\r\n }}\r\n >\r\n {this.strings.recording.currentRecordingTime}\r\n {(() => {\r\n // 计算实际的录制时长(秒)\r\n const elapsedSeconds = this.recordingStartTime > 0 ? Math.floor((Date.now() - this.recordingStartTime) / 1000) : 0;\r\n const minutes = Math.floor(elapsedSeconds / 60);\r\n const seconds = elapsedSeconds % 60;\r\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\r\n })()}\r\n </div>\r\n\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n padding: '12px 16px',\r\n background: '#fff7e6',\r\n border: '1px solid #ffec99',\r\n borderRadius: '6px',\r\n color: '#d46b08',\r\n fontSize: '14px',\r\n marginBottom: '16px',\r\n }}\r\n >\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\" />\r\n </svg>\r\n <span>{this.strings.recording.recordingStillInProgress}</span>\r\n </div>\r\n\r\n <div\r\n style={{\r\n fontSize: '16px',\r\n color: '#595959',\r\n lineHeight: '1.5',\r\n marginBottom: '16px',\r\n }}\r\n >\r\n {this.strings.clickConfirmCompleteToEnd}\r\n </div>\r\n\r\n <label\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n cursor: 'pointer',\r\n padding: '8px 0',\r\n userSelect: 'none',\r\n }}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n style={{\r\n width: '16px',\r\n height: '16px',\r\n accentColor: '#1890ff',\r\n cursor: 'pointer',\r\n margin: '0',\r\n }}\r\n checked={this.skipConfirmThisInterview}\r\n onChange={this.handleSkipConfirmChange}\r\n />\r\n <span\r\n style={{\r\n fontSize: '14px',\r\n color: '#595959',\r\n cursor: 'pointer',\r\n lineHeight: '1.4',\r\n }}\r\n >\r\n {this.strings.confirm.noReminderThisInterview}\r\n </span>\r\n </label>\r\n </div>\r\n </pcm-confirm-modal>\r\n\r\n {/* 结束面试确认模态框 */}\r\n <pcm-confirm-modal\r\n isOpen={this.showEndInterviewConfirmModal}\r\n modalTitle={this.strings?.confirmEnd}\r\n okText={this.strings?.confirmEnd}\r\n cancelText={this.strings?.cancel}\r\n okType=\"danger\"\r\n onOk={this.handleConfirmEndInterview}\r\n onCancel={this.handleCancelEndInterview}\r\n onClosed={this.handleCancelEndInterview}\r\n >\r\n <div style={{ marginBottom: '16px' }}>\r\n {(() => {\r\n const answeredCount = this.getAnsweredQuestionCount();\r\n return (\r\n <div>\r\n <div\r\n style={{\r\n fontSize: '14px',\r\n color: '#1890ff',\r\n fontWeight: '500',\r\n marginBottom: '16px',\r\n textAlign: 'center',\r\n }}\r\n >\r\n {this.strings.confirm.currentQuestion.replace('{count}', answeredCount.toString())}\r\n </div>\r\n\r\n {answeredCount < 3 && (\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n gap: '8px',\r\n padding: '12px 16px',\r\n background: '#fff2e8',\r\n border: '1px solid #ffbb96',\r\n borderRadius: '6px',\r\n color: '#d4380d',\r\n fontSize: '14px',\r\n marginBottom: '16px',\r\n }}\r\n >\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n width=\"20\"\r\n height=\"20\"\r\n fill=\"currentColor\"\r\n style={{ flexShrink: '0', marginTop: '2px' }}\r\n >\r\n <path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\" />\r\n </svg>\r\n <span>\r\n <strong>{this.strings.confirm.fewQuestionsWarning}</strong>{this.strings.confirm.fewQuestionsWarningText}\r\n </span>\r\n </div>\r\n )}\r\n\r\n <div\r\n style={{\r\n fontSize: '14px',\r\n color: '#595959',\r\n lineHeight: '1.6',\r\n textAlign: 'center',\r\n }}\r\n >\r\n {this.strings.confirm.endInterviewConfirm}\r\n </div>\r\n </div>\r\n );\r\n })()}\r\n </div>\r\n </pcm-confirm-modal>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"pcm-app-chat-modal.js","sourceRoot":"","sources":["../../../../src/components/pcm-app-chat-modal/pcm-app-chat-modal.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAgB,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG9K,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC,CAAC,eAAe;AACtE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,SAAS,MAAM,mCAAmC,CAAC;AAC1D,OAAO,SAAS,MAAM,mCAAmC,CAAC;AAO1D,MAAM,OAAO,YAAY;IACvB;;OAEG;IACK,MAAM,CAAU;IAExB;;OAEG;IACM,OAAO,CAAM;IAEtB;;OAEG;IACK,UAAU,GAAW,MAAM,CAAC;IAEpC;;OAEG;IAC2B,KAAK,CAAU;IAE7C;;OAEG;IACsB,MAAM,GAAY,KAAK,CAAC;IAEjD;;OAEG;IACM,QAAQ,GAAkB,EAAE,CAAC;IAEtC;;OAEG;IACM,WAAW,CAAqB;IAEzC;;OAEG;IACK,IAAI,CAAU;IAEtB;;OAEG;IACsB,MAAM,CAAU;IAEzC;;OAEG;IACK,YAAY,GAAY,IAAI,CAAC;IAErC;;OAEG;IACK,WAAW,GAAY,IAAI,CAAC;IAEpC;;OAEG;IACsB,cAAc,CAAU;IAEjD;;OAEG;IACK,gBAAgB,GAAY,KAAK,CAAC;IAE1C;;OAEG;IACK,gBAAgB,GAAW,MAAM,CAAC;IAE1C;;OAEG;IACM,SAAS,GAAY,KAAK,CAAC;IAEpC;;OAEG;IACM,uBAAuB,GAAuB,IAAI,CAAC;IAE5D,WAAW;IACF,gBAAgB,GAAY,IAAI,CAAC;IAEjC,gBAAgB,GAAY,KAAK,CAAC;IAE3C,+BAA+B;IACpB,WAAW,CAAc;IAEpC;;OAEG;IACM,cAAc,CAAwC;IAE/D;;OAEG;IACM,iBAAiB,CAA2C;IAErE;;OAEG;IACK,YAAY,GAAW,QAAQ,CAAC;IAExC;;OAEG;IACK,gBAAgB,GAAW,GAAG,CAAC;IAEvC;;;OAGG;IACK,oBAAoB,GAAW,EAAE,CAAC;IAE1C;;OAEG;IACK,WAAW,GAAW,EAAE,CAAC;IAEzB,WAAW,CAAc;IAEjC,aAAa;IACJ,WAAW,GAAY,KAAK,CAAC;IAC7B,eAAe,GAAuB,IAAI,CAAC;IAC3C,YAAY,GAAgB,IAAI,CAAC;IACjC,aAAa,GAAyB,IAAI,CAAC;IAC3C,iBAAiB,GAAW,CAAC,CAAC;IAC9B,eAAe,GAAY,KAAK,CAAC;IACjC,cAAc,GAAQ,IAAI,CAAC;IAC3B,kBAAkB,GAAW,CAAC,CAAC;IAC/B,eAAe,GAAY,KAAK,CAAC;IACjC,YAAY,GAAQ,IAAI,CAAC;IACzB,eAAe,GAAW,CAAC,CAAC,CAAC,UAAU;IAEhD,uBAAuB;IACf,QAAQ,GAA4B,IAAI,CAAC;IAEjD;;OAEG;IACM,qBAAqB,GAAW,CAAC,CAAC;IAE3C;;OAEG;IACM,iBAAiB,CAA2C;IAE5D,oBAAoB,GAAY,KAAK,CAAC;IAE/C;;OAEG;IACK,UAAU,GAAY,KAAK,CAAC;IAEpC,gBAAgB;IACP,gBAAgB,GAAY,KAAK,CAAC;IAE3C,YAAY;IACH,cAAc,GAAY,KAAK,CAAC;IAEzC;;OAEG;IACM,cAAc,CAAwC;IAE/D;;OAEG;IACM,qBAAqB,CAA+C;IAE7E;;OAEG;IACM,YAAY,CAAqB;IAE1C;;;;OAIG;IACK,aAAa,GAAqB,MAAM,CAAC;IAEjD,aAAa;IACJ,UAAU,GAAW,EAAE,CAAC;IACxB,gBAAgB,GAAY,KAAK,CAAC;IAE3C;;OAEG;IACsB,YAAY,GAAwB,EAAE,CAAC;IAEhE;;OAEG;IACK,KAAK,CAAU;IAEvB,aAAa;IACJ,gBAAgB,GAAY,KAAK,CAAC;IAClC,aAAa,GAAyB,IAAI,CAAC;IAC3C,WAAW,GAAe,EAAE,CAAC;IAC7B,iBAAiB,GAAY,KAAK,CAAC;IACnC,sBAAsB,GAAW,EAAE,CAAC,CAAC,YAAY;IACjD,mBAAmB,GAAQ,IAAI,CAAC;IAChC,uBAAuB,GAAW,CAAC,CAAC;IAE7C;;OAEG;IACK,qBAAqB,GAAW,EAAE,CAAC;IAE3C;;OAEG;IACK,UAAU,GAAY,wDAAwD,CAAC;IAEvF;;OAEG;IACK,eAAe,CAAU;IAEjC;;OAEG;IACM,SAAS,GAAW,EAAE,CAAC;IAEhC,qBAAqB;IACZ,eAAe,GAAY,KAAK,CAAC;IAE1C;;OAEG;IACM,aAAa,GAAW,EAAE,CAAC;IAE5B,oBAAoB,CAAa;IAEzC;;OAEG;IACK,cAAc,GAAY,IAAI,CAAC;IAEvC;;OAEG;IACK,mBAAmB,GAAY,IAAI,CAAC;IAE5C;;;;OAIG;IACK,eAAe,GAAwB,QAAQ,CAAC;IAExD;;OAEG;IACK,oBAAoB,GAAY,KAAK,CAAC;IAE9C,cAAc;IACL,YAAY,GAAY,KAAK,CAAC;IAC9B,UAAU,GAAW,EAAE,CAAC;IACxB,eAAe,GAAW,EAAE,CAAC;IAEtC,WAAW;IACF,kBAAkB,GAAiC,MAAM,CAAC;IAC1D,cAAc,GAAW,EAAE,CAAC;IAErC,gBAAgB;IACP,eAAe,GAAY,KAAK,CAAC;IAEjC,WAAW,GAAkB,IAAI,CAAC;IAE3C;;;;;;;;;;;;;;;;;OAiBG;IAEH,aAAa;IACJ,mBAAmB,GAAY,KAAK,CAAC;IACrC,oBAAoB,GAAuB,EAAE,CAAC;IAC9C,sBAAsB,GAAY,KAAK,CAAC;IAEjD,aAAa;IACJ,gBAAgB,GAAY,KAAK,CAAC;IAClC,wBAAwB,GAAY,KAAK,CAAC;IAEnD,eAAe;IACN,4BAA4B,GAAY,KAAK,CAAC;IAEvD;;OAEG;IACM,iBAAiB,GAAY,KAAK,CAAC;IAE5C;;OAEG;IACM,mBAAmB,GAAW,EAAE,CAAC;IAE1C;;OAEG;IACM,sBAAsB,GAAY,KAAK,CAAC;IAEjD;;OAEG;IACM,sBAAsB,GAAY,KAAK,CAAC;IAEjD;;OAEG;IACK,SAAS,CAAU;IAE3B;;OAEG;IACK,sBAAsB,GAAY,KAAK,CAAC;IAEhD;;OAEG;IACK,YAAY,GAAW,GAAG,CAAC;IAGnC,iBAAiB,CAAC,QAAgB;QAChC,uCAAuC;QACvC,IAAI,QAAQ,IAAI,QAAQ,KAAK,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC;YAClD,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED;QACE,eAAe;QACf,MAAM,CAAC,UAAU,CAAC;YAChB,MAAM,EAAE,IAAI;YACZ,GAAG,EAAE,IAAI;SACV,CAAC,CAAC;KACJ;IAED,KAAK,CAAC,iBAAiB;QACrB,WAAW;QACX,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAE5D,kBAAkB;QAClB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,WAAW,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACN,yBAAyB;YACzB,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAS,cAAc,CAAC,CAAC;YACjE,IAAI,YAAY,EAAE,CAAC;gBACjB,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,WAAW,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC,oBAAoB,GAAG,GAAG,EAAE;YAC/B,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAE1E,wBAAwB;QACxB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACzB,CAAC;QAED,uBAAuB;QACvB,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACxC,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC;QAED,yBAAyB;QACzB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,8CAA8C;gBAC9C,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,8CAA8C;gBAC9C,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC3C,CAAC,EAAE,CAAC,CAAC,CAAC;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAEO,WAAW,GAAG,GAAG,EAAE;QACzB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IAC1B,CAAC,CAAC;IAEF,eAAe;IACP,KAAK,CAAC,cAAc;QAC1B,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QAExB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEnD,IAAI,SAAS,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;gBAChC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC;YAClC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;gBACjC,MAAM,EAAE,gBAAgB;gBACxB,SAAS,EAAE,oBAAoB;gBAC/B,KAAK,EAAE,WAAW;aACnB,CAAC,CAAC;YACH,aAAa,CAAC,SAAS,CAAC;gBACtB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,WAAW;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,OAAe,EAAE,QAAiB;QAC/D,yBAAyB;QACzB,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,aAAa;QACb,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;QACpC,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;QAEpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,OAAO,GAAG,EAAE,CAAC;QAEjB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QAEjF,sBAAsB;QACtB,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,WAAW,CAAC;QAExE,4BAA4B;QAC5B,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,YAAY,GAAG;gBAClB,GAAG,IAAI,CAAC,YAAY;gBACpB,SAAS,EAAE,QAAQ;aACpB,CAAC;QACJ,CAAC;QAED,WAAW;QACX,MAAM,UAAU,GAAgB;YAC9B,EAAE,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,oBAAoB;YAC9C,eAAe,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO;YAC7C,MAAM,EAAE,IAAI,CAAC,YAAY,IAAI,EAAE,EAAE,OAAO;YACxC,KAAK,EAAE,SAAS,EAAE,YAAY;YAC9B,MAAM,EAAE,EAAE,EAAE,OAAO;YACnB,aAAa,EAAE,EAAE,EAAE,OAAO;YAC1B,QAAQ,EAAE,EAAE,EAAE,KAAK;YACnB,mBAAmB,EAAE,EAAE,EAAE,OAAO;YAChC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,OAAO;YAC7D,cAAc,EAAE,EAAE,EAAE,SAAS;YAC7B,MAAM,EAAE,QAAQ,EAAE,OAAO;YACzB,KAAK,EAAE,IAAI,EAAE,OAAO;YACpB,cAAc;YACd,IAAI,EAAE,IAAI,EAAE,YAAY;YACxB,WAAW,EAAE,IAAI,EAAE,WAAW;SAC/B,CAAC;QAEF,WAAW;QACX,IAAI,CAAC,uBAAuB,GAAG,UAAU,CAAC;QAE1C,QAAQ;QACR,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC7B,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC,EAAE,GAAG,CAAC,CAAC;QAER,SAAS;QACT,MAAM,WAAW,GAAQ;YACvB,aAAa,EAAE,WAAW;YAC1B,eAAe,EAAE,IAAI,CAAC,cAAc;YACpC,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,kBAAkB;SACvC,CAAC;QAEF,mBAAmB;QACnB,WAAW,CAAC,MAAM,GAAG;YACnB,YAAY;YACZ,GAAG,IAAI,CAAC,YAAY;SACrB,CAAC;QAEF,MAAM,cAAc,CAAC;YACnB,GAAG,EAAE,4BAA4B;YACjC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,IAAI,CAAC,EAAE;gBAChB,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;gBACzC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;gBAEjC,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;oBACjD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC;oBAC3C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;wBAC1B,eAAe,EAAE,IAAI,CAAC,eAAe;wBACrC,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,EAAE,EAAE,IAAI,CAAC,EAAE;qBACZ,CAAC,CAAC;gBACL,CAAC;gBAED,kCAAkC;gBAClC,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnF,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;gBACrC,CAAC;gBAED,aAAa;gBACb,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7F,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;oBAEhC,eAAe;oBACf,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;oBAE5B,oCAAoC;oBACpC,MAAM,UAAU,GAAG,OAAO,IAAI,MAAM,IAAI,IAAI,CAAC,uBAAuB,EAAE,MAAM,IAAI,EAAE,CAAC;oBAEnF,WAAW;oBACX,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;wBAC1B,eAAe,EAAE,IAAI,CAAC,cAAc;wBACpC,uBAAuB,EAAE,IAAI,CAAC,qBAAqB;wBACnD,WAAW,EAAE,UAAU,EAAE,WAAW;qBACrC,CAAC,CAAC;gBACL,CAAC;gBACD,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC9F,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;oBACjF,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;oBAC1C,IAAI,CAAC,2BAA2B,CAAC,kBAAkB,CAAC,CAAC;gBACvD,CAAC;gBAED,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC7B,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;wBAC/D,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;4BAChB,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;4BACtB,iBAAiB;4BACjB,MAAM,cAAc,GAAgB;gCAClC,GAAG,IAAI,CAAC,uBAAuB;gCAC/B,MAAM;gCACN,EAAE,EAAE,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,uBAAuB,CAAC,EAAE;gCACtD,WAAW,EAAE,IAAI;gCACjB,qBAAqB;gCACrB,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,uBAAuB,CAAC,mBAAmB;gCACjG,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,uBAAuB,CAAC,cAAc;6BACnF,CAAC;4BACF,IAAI,CAAC,uBAAuB,GAAG,cAAc,CAAC;4BAC9C,IAAI,CAAC,cAAc,EAAE,CAAC;wBACxB,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;oBAC3B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC;oBAClE,IAAI,CAAC,QAAQ,GAAG;wBACd,GAAG,IAAI,CAAC,QAAQ;wBAChB;4BACE,GAAG,UAAU;4BACb,MAAM,EAAE,YAAY;4BACpB,KAAK,EAAE,IAAI,CAAC,IAAI;4BAChB,WAAW,EAAE,KAAK;yBACnB;qBACF,CAAC;oBACF,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;oBACpC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;oBACvB,aAAa,CAAC,SAAS,CAAC;wBACtB,KAAK,EAAE,IAAI,CAAC,IAAI;wBAChB,OAAO,EAAE,YAAY;qBACtB,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBAED,IAAI,IAAI,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;oBACjC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;wBACvB,eAAe,EAAE,IAAI,CAAC,eAAe,IAAI,EAAE;wBAC3C,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,EAAE,EAAE,IAAI,CAAC,EAAE;qBACZ,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,OAAO,EAAE,KAAK,CAAC,EAAE;gBACf,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAC9B,aAAa,CAAC,SAAS,CAAC;oBACtB,KAAK,EAAE,KAAK;oBACZ,OAAO,EAAE,cAAc;iBACxB,CAAC,CAAC;gBACH,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;oBACjC,MAAM,EAAE,kBAAkB;oBAC1B,SAAS,EAAE,oBAAoB;oBAC/B,KAAK,EAAE,QAAQ;iBAChB,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,GAAG;oBACd,GAAG,IAAI,CAAC,QAAQ;oBAChB;wBACE,GAAG,UAAU;wBACb,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,uBAAuB;wBACrD,KAAK,EAAE,KAAK;wBACZ,WAAW,EAAE,KAAK;qBACnB;iBACF,CAAC;gBACF,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;gBACpC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACzB,CAAC;YACD,UAAU,EAAE,KAAK,IAAI,EAAE;gBACrB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBACvB,kCAAkC;gBAClC,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;wBACtB,kBAAkB;wBAClB,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;wBAClC,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC;wBAClC,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;oBACrC,CAAC;gBACH,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,kBAAkB;gBAE5B,oDAAoD;gBACpD,MAAM,eAAe,GAAgB;oBACnC,GAAG,IAAI,CAAC,uBAAuB;oBAC/B,WAAW,EAAE,KAAK;iBACnB,CAAC;gBAEF,uBAAuB;gBACvB,IAAI,eAAe,IAAI,eAAe,CAAC,MAAM,EAAE,CAAC;oBAC9C,IAAI,CAAC,mBAAmB,GAAG,eAAe,CAAC,MAAM,CAAC;gBACpD,CAAC;gBAED,+CAA+C;gBAC/C,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;gBACpD,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;gBAEpC,OAAO;gBACP,IAAI,CAAC,qBAAqB,EAAE,CAAC;gBAE7B,yBAAyB;gBACzB,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACnD,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;oBACnC,OAAO;gBACT,CAAC;gBAED,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;oBACnC,uBAAuB;oBACvB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;wBACnB,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;wBACnC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;oBAChC,CAAC;yBAAM,CAAC;wBACN,iBAAiB;wBACjB,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC9B,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAED,WAAW;IACH,YAAY,GAAG,GAAG,EAAE;QAC1B,sBAAsB;QACtB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;YAChF,IAAI,CAAC,WAAW;gBAAE,OAAO;YAEzB,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,WAAW,CAAC;YAC9D,MAAM,kBAAkB,GAAG,YAAY,GAAG,SAAS,GAAG,YAAY,CAAC;YAEnE,gBAAgB;YAChB,IAAI,CAAC,gBAAgB,GAAG,kBAAkB,IAAI,EAAE,CAAC;QACnD,CAAC;IACH,CAAC,CAAC;IAEF,aAAa;IACL,gBAAgB,GAAG,GAAG,EAAE;QAC9B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;IAC9B,CAAC,CAAC;IAEF,aAAa;IACL,cAAc,GAAG,GAAG,EAAE;QAC5B,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC/B,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,mBAAmB;IAC9B,CAAC,CAAC;IAEM,WAAW,GAAQ,IAAI,CAAC;IAEhC,aAAa;IACL,WAAW,GAAG,GAAG,EAAE;QACzB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAE5B,iBAAiB;QACjB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,CAAC;QAED,UAAU;QACV,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC/B,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,aAAa;IACxB,CAAC,CAAC;IAEM,cAAc;QACpB,IAAI,CAAC,IAAI,CAAC,gBAAgB;YAAE,OAAO;QACnC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;QAChF,IAAI,WAAW,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC/B,cAAc;YACd,WAAW,CAAC,SAAS,GAAG,WAAW,CAAC,YAAY,CAAC;QACnD,CAAC;IACH,CAAC;IAED,cAAc;IACN,KAAK,CAAC,mBAAmB;QAC/B,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO;QAEjC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,IAAI,kBAAkB,GAAG,KAAK,CAAC;QAC/B,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;QAEnC,IAAI,CAAC;YACH,WAAW;YACX,MAAM,0BAA0B,GAAG,MAAM,eAAe,CAAC;gBACvD,GAAG,EAAE,2BAA2B;gBAChC,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE;oBACJ,eAAe,EAAE,IAAI,CAAC,cAAc;iBACrC;aACF,CAAC,CAAC;YACH,SAAS;YACT,IAAI,0BAA0B,CAAC,OAAO,IAAI,0BAA0B,CAAC,IAAI,IAAI,0BAA0B,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;gBAChI,kBAAkB,GAAG,IAAI,CAAC;YAC5B,CAAC;YAED,SAAS;YACT,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;gBACnC,GAAG,EAAE,uBAAuB;gBAC5B,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE;oBACJ,eAAe,EAAE,IAAI,CAAC,cAAc;oBACpC,MAAM,EAAE,IAAI,CAAC,KAAK;oBAClB,KAAK,EAAE,EAAE;iBACV;aACF,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAClC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;gBAC3C,MAAM,iBAAiB,GAAkB,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;oBAC7D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC;oBACvD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;oBAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;oBAC9D,MAAM,OAAO,GAAG,GAAG,KAAK,IAAI,OAAO,EAAE,CAAC;oBAEtC,mBAAmB;oBACnB,OAAO;wBACL,EAAE,EAAE,GAAG,CAAC,EAAE;wBACV,eAAe,EAAE,GAAG,CAAC,eAAe;wBACpC,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;wBACxB,KAAK,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE;wBACtB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;wBACxB,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,EAAE;wBACtC,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE;wBAC5B,mBAAmB,EAAE,GAAG,CAAC,mBAAmB,IAAI,EAAE;wBAClD,UAAU,EAAE,GAAG,CAAC,UAAU;wBAC1B,cAAc,EAAE,GAAG,CAAC,cAAc,IAAI,EAAE;wBACxC,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,QAAQ;wBAC9B,KAAK,EAAE,GAAG,CAAC,KAAK;wBAChB,YAAY;wBACZ,IAAI,EAAE,OAAO;wBACb,WAAW,EAAE,KAAK;qBACnB,CAAC;gBACJ,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,GAAG,iBAAiB,CAAC;gBAElC,kCAAkC;gBAClC,IAAI,CAAC,qBAAqB,GAAG,iBAAiB,CAAC,MAAM,IAAI,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACvC,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;gBACjC,MAAM,EAAE,qBAAqB;gBAC7B,SAAS,EAAE,oBAAoB;gBAC/B,KAAK,EAAE,UAAU;aAClB,CAAC,CAAC;YACH,aAAa,CAAC,SAAS,CAAC;gBACtB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,UAAU;aACpB,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC9B,UAAU,CAAC,KAAK,IAAI,EAAE;gBACpB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAC7B,IAAI,CAAC,cAAc,EAAE,CAAC;gBAEtB,iCAAiC;gBACjC,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAC/H,iBAAiB;oBACjB,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;wBACnC,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC9B,CAAC;gBACH,CAAC;qBAAM,IAAI,kBAAkB,EAAE,CAAC;oBAC9B,mBAAmB;oBACnB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;gBAC9B,CAAC;YACH,CAAC,EAAE,GAAG,CAAC,CAAC;QACV,CAAC;IACH,CAAC;IAED,SAAS;IACD,oBAAoB;QAC1B,gBAAgB;QAChB,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QAED,yBAAyB;QACzB,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QAED,aAAa;QACb,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACrC,CAAC;QAED,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC;QAExC,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;YACnC,IAAI,CAAC,eAAe,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,EAAE,CAAC;gBAC9B,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;gBACzB,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;gBAC7B,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,CAAC;IACX,CAAC;IAED,SAAS;IACD,KAAK,CAAC,cAAc;QAC1B,uBAAuB;QACvB,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC;gBACvD,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE;oBACL,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;oBACtB,MAAM,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;oBACtB,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;iBACzB;aACF,CAAC,CAAC;YAEH,uBAAuB;YACvB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YAExB,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC;YAC9B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;YAElC,SAAS;YACT,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YAErB,aAAa;YACb,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAE/B,iBAAiB;YACjB,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;YAExC,oBAAoB;YACpB,IAAI,aAAa,CAAC;YAClB,IAAI,CAAC;gBACH,aAAa,GAAG,IAAI,aAAa,CAAC,MAAM,EAAE;oBACxC,QAAQ,EAAE,QAAQ;oBAClB,kBAAkB,EAAE,MAAM,EAAE,kBAAkB;oBAC9C,kBAAkB,EAAE,KAAK,EAAE,iBAAiB;iBAC7C,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,wBAAwB;gBACxB,OAAO,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC;gBACzC,IAAI,CAAC;oBACH,aAAa,GAAG,IAAI,aAAa,CAAC,MAAM,EAAE;wBACxC,kBAAkB,EAAE,MAAM,EAAE,eAAe;wBAC3C,kBAAkB,EAAE,KAAK;qBAC1B,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,aAAa,EAAE,CAAC;oBACvB,kBAAkB;oBAClB,IAAI,CAAC;wBACH,aAAa,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;oBAC5C,CAAC;oBAAC,OAAO,UAAU,EAAE,CAAC;wBACpB,eAAe;wBACf,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;4BACvB,IAAI,EAAE,0BAA0B;4BAChC,OAAO,EAAE,yBAAyB;4BAClC,OAAO,EAAE,UAAU;yBACpB,CAAC,CAAC;wBACH,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;wBAC7B,OAAO;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;YAEnC,MAAM,MAAM,GAAe,EAAE,CAAC;YAE9B,aAAa,CAAC,eAAe,GAAG,KAAK,CAAC,EAAE;gBACtC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBACxB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC1B,CAAC;YACH,CAAC,CAAC;YAEF,aAAa,CAAC,OAAO,GAAG,KAAK,CAAC,EAAE;gBAC9B,iBAAiB;gBACjB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;oBACvB,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,kBAAkB;oBACjD,OAAO,EAAE,KAAK;iBACf,CAAC,CAAC;gBACH,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC,CAAC;YAEF,aAAa,CAAC,MAAM,GAAG,GAAG,EAAE;gBAC1B,IAAI,CAAC;oBACH,sBAAsB;oBACtB,MAAM,QAAQ,GAAG,QAAQ,IAAI,WAAW,CAAC;oBACzC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAElD,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;wBACpB,eAAe;wBACf,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;4BACvB,IAAI,EAAE,iBAAiB;4BACvB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU;yBAC1C,CAAC,CAAC;wBACH,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;wBAC7B,OAAO;oBACT,CAAC;oBAED,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;oBAEzB,aAAa;oBACb,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;wBAC9B,MAAM,EAAE,SAAS;wBACjB,OAAO,EAAE;4BACP,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC;4BACnE,IAAI,EAAE,IAAI,CAAC,IAAI;4BACf,IAAI,EAAE,IAAI,CAAC,IAAI;yBAChB;qBACF,CAAC,CAAC;oBAEH,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC7B,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,iBAAiB;oBACjB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;wBACvB,IAAI,EAAE,kBAAkB;wBACxB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB;wBAChD,OAAO,EAAE,KAAK;qBACf,CAAC,CAAC;oBACH,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;oBAC7B,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;wBACjC,MAAM,EAAE,qBAAqB;wBAC7B,SAAS,EAAE,mBAAmB;wBAC9B,KAAK,EAAE,WAAW;qBACnB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC,CAAC;YAEF,OAAO;YACP,IAAI,CAAC;gBACH,aAAa,CAAC,KAAK,EAAE,CAAC;gBACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;gBACxB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACrC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,CAAC;gBAE/C,aAAa;gBACb,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC;oBAC9B,MAAM,EAAE,SAAS;oBACjB,OAAO,EAAE;wBACP,WAAW,EAAE,IAAI,CAAC,gBAAgB;wBAClC,QAAQ,EAAE,aAAa,CAAC,QAAQ;qBACjC;iBACF,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,UAAU,EAAE,CAAC;gBACpB,cAAc;gBACd,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;oBACvB,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,kBAAkB;oBAC3B,OAAO,EAAE,UAAU;iBACpB,CAAC,CAAC;gBACH,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;gBAC7B,cAAc,CAAC,YAAY,CAAC,UAAU,EAAE;oBACtC,MAAM,EAAE,gBAAgB;oBACxB,SAAS,EAAE,mBAAmB;oBAC9B,KAAK,EAAE,QAAQ;iBAChB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,UAAU;YACV,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;gBACrC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC9E,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC,CAAC;gBAE1E,gBAAgB;gBAChB,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBACtF,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;gBACnC,CAAC;gBAED,YAAY;gBACZ,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,EAAE,CAAC;oBAChC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;YAErC,WAAW;YACX,IAAI,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,kBAAkB,CAAC;YAE5D,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBACrC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC;YACtD,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;gBAC1C,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC;YACpD,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBAC7C,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,+BAA+B,CAAC;YACrE,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;gBACjD,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,wBAAwB,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACN,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,uBAAuB,CAAC;YAC7D,CAAC;YAED,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC;YAChC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,aAAa,CAAC,SAAS,CAAC;gBACtB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,YAAY;aACtB,CAAC,CAAC;YAEH,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;gBACjC,MAAM,EAAE,gBAAgB;gBACxB,SAAS,EAAE,oBAAoB;gBAC/B,KAAK,EAAE,YAAY;aACpB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,eAAe;IACP,iBAAiB,CAAC,MAAmB;QAC3C,gBAAgB;QAChB,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,OAAO,CAAqB,CAAC;YAC7F,IAAI,YAAY,IAAI,MAAM,EAAE,CAAC;gBAC3B,YAAY;gBACZ,IAAI,CAAC;oBACH,YAAY,CAAC,SAAS,GAAG,MAAM,CAAC;oBAChC,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;wBAC9B,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;wBAC9B,cAAc,CAAC,YAAY,CAAC,GAAG,EAAE;4BAC/B,MAAM,EAAE,mBAAmB;4BAC3B,SAAS,EAAE,oBAAoB;4BAC/B,KAAK,EAAE,QAAQ;yBAChB,CAAC,CAAC;wBACH,aAAa,CAAC,SAAS,CAAC;4BACtB,KAAK,EAAE,GAAG;4BACV,OAAO,EAAE,QAAQ;yBAClB,CAAC,CAAC;oBACL,CAAC,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC;oBAEzC,4CAA4C;oBAC5C,IAAI,CAAC;wBACH,uBAAuB;wBACvB,MAAM,SAAS,GAAG,GAAG,CAAC,eAAe,CAAC,MAAgC,CAAC,CAAC;wBACxE,YAAY,CAAC,GAAG,GAAG,SAAS,CAAC;wBAE7B,oBAAoB;wBACpB,YAAY,CAAC,OAAO,GAAG,GAAG,EAAE;4BAC1B,GAAG,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;wBACjC,CAAC,CAAC;oBACJ,CAAC;oBAAC,OAAO,QAAQ,EAAE,CAAC;wBAClB,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;wBACtC,cAAc,CAAC,YAAY,CAAC,QAAQ,EAAE;4BACpC,MAAM,EAAE,mBAAmB;4BAC3B,SAAS,EAAE,oBAAoB;4BAC/B,KAAK,EAAE,WAAW;yBACnB,CAAC,CAAC;wBACH,aAAa,CAAC,SAAS,CAAC;4BACtB,KAAK,EAAE,QAAQ;4BACf,OAAO,EAAE,WAAW;yBACrB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAED,OAAO;IACC,aAAa;QACnB,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3C,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YAEzB,QAAQ;YACR,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;YAC7B,CAAC;YAED,WAAW;YACX,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAChE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC9B,CAAC;YAED,SAAS;YACT,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IAED,aAAa;IACL,mBAAmB,GAAG,GAAG,EAAE;QACjC,qBAAqB;QACrB,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAClC,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,OAAO;QACT,CAAC;QAED,YAAY;QACZ,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC/B,CAAC,CAAC;IAEF,oBAAoB;IACZ,uBAAuB,GAAG,CAAC,KAAY,EAAE,EAAE;QACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAA0B,CAAC;QAClD,IAAI,CAAC,wBAAwB,GAAG,QAAQ,CAAC,OAAO,CAAC;IACnD,CAAC,CAAC;IAEF,eAAe;IACP,wBAAwB,GAAG,GAAG,EAAE;QACtC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC,CAAC;IAEF,eAAe;IACP,oBAAoB,GAAG,GAAG,EAAE;QAClC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC,CAAC;IAEF,mBAAmB;IACX,6BAA6B,GAAG,GAAG,EAAE;QAC3C,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC,CAAC;IAEF,UAAU;IACF,KAAK,CAAC,mBAAmB;QAC/B,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO;QAE/B,IAAI,CAAC;YACH,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC,YAAY;YAC1C,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,CAAC,SAAS;YAEvC,kBAAkB;YAClB,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;YAC/E,MAAM,QAAQ,GAAG,UAAU,aAAa,EAAE,CAAC;YAE3C,WAAW;YACX,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;YAEvF,4BAA4B;YAC5B,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CACxC,IAAI,EACJ,EAAE,EACF;gBACE,IAAI,EAAE,CAAC,OAAO,CAAC;aAChB,CACF,CAAC;YACF,qBAAqB;YACrB,aAAa;YACb,MAAM,iBAAiB,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAErE,cAAc;YACd,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;gBACjC,qBAAqB;gBACrB,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,0BAA0B;gBAC1B,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;YACrG,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,CAAC,UAAU;YAC1C,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;gBACjC,MAAM,EAAE,qBAAqB;gBAC7B,SAAS,EAAE,oBAAoB;gBAC/B,KAAK,EAAE,WAAW;aACnB,CAAC,CAAC;YACH,aAAa,CAAC,SAAS,CAAC;gBACtB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,WAAW;aACrB,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,CAAC,YAAY;YAC3C,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,cAAc;IACd,oBAAoB;QAClB,QAAQ,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAE7E,UAAU;QACV,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QAED,YAAY;QACZ,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACxC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAClC,CAAC;QAED,OAAO;QACP,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,SAAS;QACT,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED,WAAW;IACH,qBAAqB,GAAG,CAAC,KAAY,EAAE,EAAE;QAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,MAA6B,CAAC;QAClD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC;IAChC,CAAC,CAAC;IAEF,cAAc;IACN,aAAa,GAAG,CAAC,KAAoB,EAAE,EAAE;QAC/C,YAAY;QACZ,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;YAC1B,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;gBACtB,OAAO;YACT,CAAC;YAED,oBAAoB;YACpB,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,WAAW;gBACX,MAAM,QAAQ,GAAG,KAAK,CAAC,MAA6B,CAAC;gBACrD,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;gBAE/C,aAAa;gBACb,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;gBAClE,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;gBAC9D,IAAI,CAAC,UAAU,GAAG,YAAY,GAAG,IAAI,GAAG,WAAW,CAAC;gBAEpD,SAAS;gBACT,KAAK,CAAC,cAAc,EAAE,CAAC;gBAEvB,kBAAkB;gBAClB,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,WAAW,GAAG,cAAc,GAAG,CAAC,CAAC;oBACvC,QAAQ,CAAC,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;gBACvD,CAAC,EAAE,CAAC,CAAC,CAAC;gBAEN,OAAO;YACT,CAAC;iBAAM,CAAC;gBACN,YAAY;gBACZ,KAAK,CAAC,cAAc,EAAE,CAAC;gBACvB,yBAAyB;gBACzB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;oBAClI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC1B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,cAAc;IACN,gBAAgB,GAAG,KAAK,IAAI,EAAE;QACpC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACrD,OAAO;QACT,CAAC;QAED,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAE7B,IAAI,CAAC;YACH,WAAW;YACX,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YAEnC,WAAW;YACX,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;YAErB,gBAAgB;YAChB,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAClC,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;gBACjC,MAAM,EAAE,kBAAkB;gBAC1B,SAAS,EAAE,oBAAoB;gBAC/B,KAAK,EAAE,UAAU;aAClB,CAAC,CAAC;YACH,aAAa,CAAC,SAAS,CAAC;gBACtB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,UAAU;aACpB,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAChC,CAAC;IACH,CAAC,CAAC;IAEF,mBAAmB;IACX,eAAe,GAAG,KAAK,IAAI,EAAE;QACnC,MAAM,OAAO,GAAG;YACd,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,cAAc;YAC7C,MAAM,EAAE;gBACN,SAAS,EAAE,CAAC;gBACZ,eAAe,EAAE,CAAC;aACnB;SACF,CAAC;QACF,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAE7B,IAAI,CAAC;YACH,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;YACnC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACrB,gBAAgB;YAChB,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAClC,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;gBACjC,MAAM,EAAE,kBAAkB;gBAC1B,SAAS,EAAE,oBAAoB;gBAC/B,KAAK,EAAE,UAAU;aAClB,CAAC,CAAC;YACH,aAAa,CAAC,SAAS,CAAC;gBACtB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,UAAU;aACpB,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAC9B,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACzB,CAAC;IACH,CAAC,CAAC;IAEF,aAAa;IACL,qBAAqB,GAAG,GAAG,EAAE;QACnC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,qBAAqB;YACrB,iCAAiC;YACjC,SAAS,CAAC,YAAY;iBACnB,YAAY,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;iBAC7B,IAAI,CAAC,MAAM,CAAC,EAAE;gBACb,aAAa;gBACb,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;YACxC,CAAC,CAAC;iBACD,KAAK,CAAC,KAAK,CAAC,EAAE;gBACb,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;gBACnC,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;oBACjC,MAAM,EAAE,uBAAuB;oBAC/B,SAAS,EAAE,oBAAoB;oBAC/B,KAAK,EAAE,WAAW;iBACnB,CAAC,CAAC;gBACH,aAAa,CAAC,SAAS,CAAC;oBACtB,KAAK,EAAE,KAAK;oBACZ,OAAO,EAAE,WAAW;iBACrB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;IACH,CAAC,CAAC;IAEF,oBAAoB;IACZ,wBAAwB,CAAC,MAAmB;QAClD,IAAI,CAAC;YACH,mBAAmB;YACnB,MAAM,QAAQ,GAAG,yBAAyB,EAAE,CAAC;YAE7C,oBAAoB;YACpB,IAAI,aAAa,CAAC;YAClB,IAAI,CAAC;gBACH,aAAa,GAAG,IAAI,aAAa,CAAC,MAAM,EAAE;oBACxC,QAAQ,EAAE,QAAQ;iBACnB,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC;gBAC3C,IAAI,CAAC;oBACH,aAAa,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;gBAC5C,CAAC;gBAAC,OAAO,aAAa,EAAE,CAAC;oBACvB,WAAW;oBACX,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;oBAClD,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;oBAC3C,cAAc,CAAC,YAAY,CAAC,aAAa,EAAE;wBACzC,MAAM,EAAE,0BAA0B;wBAClC,SAAS,EAAE,oBAAoB;wBAC/B,KAAK,EAAE,WAAW;qBACnB,CAAC,CAAC;oBACH,aAAa,CAAC,SAAS,CAAC;wBACtB,KAAK,EAAE,aAAa;wBACpB,OAAO,EAAE,WAAW;qBACrB,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;YACH,CAAC;YAED,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;YACnC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC7B,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC1C,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,qBAAqB,CAAC;YAEzD,aAAa;YACb,aAAa,CAAC,eAAe,GAAG,KAAK,CAAC,EAAE;gBACtC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBACxB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC,CAAC;YAEF,aAAa;YACb,aAAa,CAAC,MAAM,GAAG,GAAG,EAAE;gBAC1B,WAAW;gBACX,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBAElD,UAAU;gBACV,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC/B,CAAC,CAAC;YAEF,OAAO;YACP,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe;YAEzC,UAAU;YACV,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAC,GAAG,EAAE;gBAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAAC,CAAC;gBACnF,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,qBAAqB,GAAG,WAAW,CAAC,CAAC;gBAEpF,YAAY;gBACZ,IAAI,IAAI,CAAC,sBAAsB,IAAI,CAAC,EAAE,CAAC;oBACrC,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC5B,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW;YACX,MAAM,CAAC,SAAS,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YAClD,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YAChC,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;gBACjC,MAAM,EAAE,0BAA0B;gBAClC,SAAS,EAAE,oBAAoB;gBAC/B,KAAK,EAAE,QAAQ;aAChB,CAAC,CAAC;YACH,aAAa,CAAC,SAAS,CAAC;gBACtB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,qBAAqB;aAC/B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,UAAU;IACF,KAAK,CAAC,qBAAqB;QACjC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAE9B,WAAW;YACX,MAAM,SAAS,GAAG,yBAAyB,EAAE,IAAI,YAAY,CAAC;YAC9D,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAElE,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACxB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;gBAC/B,OAAO;YACT,CAAC;YAED,WAAW;YACX,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;YAClE,MAAM,QAAQ,GAAG,eAAe,aAAa,EAAE,CAAC;YAChD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YAEvE,SAAS;YACT,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CACxC,SAAS,EACT,EAAE,EACF;gBACE,IAAI,EAAE,CAAC,OAAO,CAAC;aAChB,CACF,CAAC;YAEF,aAAa;YACb,MAAM,iBAAiB,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAErE,oBAAoB;YACpB,IAAI,iBAAiB,EAAE,CAAC;gBACtB,WAAW;gBACX,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,aAAa,CAAC,oBAAoB,CAAwB,CAAC;gBACzG,MAAM,cAAc,GAAG,QAAQ,EAAE,cAAc,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gBAE1E,eAAe;gBACf,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;gBAClE,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;gBAE9D,0BAA0B;gBAC1B,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAEjF,OAAO;gBACP,IAAI,CAAC,UAAU,GAAG,YAAY,GAAG,MAAM,GAAG,iBAAiB,GAAG,WAAW,CAAC;gBAE1E,WAAW;gBACX,UAAU,CAAC,GAAG,EAAE;oBACd,IAAI,QAAQ,EAAE,CAAC;wBACb,MAAM,WAAW,GAAG,cAAc,GAAG,MAAM,CAAC,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC;wBAC9E,QAAQ,CAAC,KAAK,EAAE,CAAC;wBACjB,QAAQ,CAAC,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;oBACvD,CAAC;gBACH,CAAC,EAAE,CAAC,CAAC,CAAC;YACR,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACzB,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAClC,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;gBACjC,MAAM,EAAE,uBAAuB;gBAC/B,SAAS,EAAE,oBAAoB;gBAC/B,KAAK,EAAE,UAAU;aAClB,CAAC,CAAC;YACH,aAAa,CAAC,SAAS,CAAC;gBACtB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,YAAY;aACtB,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC/B,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,SAAS;IACD,kBAAkB;QACxB,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAChD,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YAC1B,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;YAE9B,QAAQ;YACR,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC7B,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;gBACxC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,aAAa;IACL,kBAAkB,GAAG,GAAG,EAAE;QAChC,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,wBAAwB,EAAE,CAAC;IAClC,CAAC,CAAC;IAEF,WAAW;IACH,KAAK,CAAC,wBAAwB;QACpC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;QAEnC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;gBACnC,GAAG,EAAE,4BAA4B;gBACjC,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE;oBACJ,MAAM,EAAE,IAAI,CAAC,KAAK;oBAClB,KAAK,EAAE,EAAE,EAAE,YAAY;oBACvB,IAAI,EAAE,CAAC;iBACR;aACF,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAClC,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;gBAE7C,UAAU;gBACV,IAAI,CAAC,oBAAoB,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAS,EAAE,EAAE;oBAC1D,kBAAkB;oBAClB,IAAI,WAAiB,CAAC;oBACtB,IAAI,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;oBAE5C,IAAI,CAAC;wBACH,0BAA0B;wBAC1B,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC;wBAEpG,IAAI,KAAK,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;4BACvC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;4BACzC,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;wBAC3B,CAAC;6BAAM,CAAC;4BACN,2CAA2C;4BAC3C,WAAW,GAAG,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;wBAC3C,CAAC;wBAED,WAAW;wBACX,IAAI,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;4BACjC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;4BAC1C,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC;wBAC3B,CAAC;wBAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;wBACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;wBACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;wBAE9D,UAAU;wBACV,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;4BACnB,KAAK;4BACL,WAAW,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;wBACnI,CAAC;6BAAM,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;4BAC1B,KAAK;4BACL,WAAW,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;wBACnI,CAAC;6BAAM,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;4BACxC,MAAM;4BACN,MAAM,QAAQ,GAAG;gCACf,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM;gCAC9B,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM;gCAC9B,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO;gCAC/B,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS;gCACjC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ;gCAChC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM;gCAC9B,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ;6BACjC,CAAC;4BACF,WAAW,GAAG,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;wBAClK,CAAC;6BAAM,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;4BACxB,wBAAwB;4BACxB,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,WAAW;iCAC1I,QAAQ,EAAE;iCACV,QAAQ,EAAE;iCACV,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;wBAChF,CAAC;6BAAM,CAAC;4BACN,OAAO;4BACP,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,WAAW;iCAC1I,QAAQ,EAAE;iCACV,QAAQ,EAAE;iCACV,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;wBAChF,CAAC;oBACH,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;wBAClD,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC;oBAC7C,CAAC;oBAED,OAAO;wBACL,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,eAAe;wBAChD,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,CAAC;wBACtC,WAAW;qBACQ,CAAC;gBACxB,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YAClC,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;gBACjC,MAAM,EAAE,0BAA0B;gBAClC,SAAS,EAAE,oBAAoB;gBAC/B,KAAK,EAAE,UAAU;aAClB,CAAC,CAAC;YACH,aAAa,CAAC,SAAS,CAAC;gBACtB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,UAAU;aACpB,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;QACtC,CAAC;IACH,CAAC;IAED,UAAU;IACF,wBAAwB,GAAG,CAAC,cAAsB,EAAE,EAAE;QAC5D,IAAI,cAAc,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;YAC3C,oBAAoB;YACpB,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;YACjC,OAAO;QACT,CAAC;QAED,SAAS;QACT,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;QACpC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAC7B,IAAI,CAAC,qBAAqB,GAAG,CAAC,CAAC;QAE/B,OAAO;QACP,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;QAEjC,aAAa;QACb,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC,CAAC;IAEF,yBAAyB;IACjB,wBAAwB,GAAG,CACjC,KAKE,EACF,EAAE;QACF,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;QAE7D,IAAI,CAAC,eAAe,GAAG,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC;QAChE,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAC;QACtC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;QACtB,IAAI,CAAC,cAAc,GAAG,OAAO,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC,CAAC;IAEF;;OAEG;IACK,aAAa,CAAC,OAAoB;QACxC,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,qCAAqC;QACrC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAE5D,OAAO,OAAO,CAAC,EAAE,KAAK,WAAW,CAAC,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACK,gCAAgC,GAAG,CACzC,KAEE,EACF,EAAE;QACF,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC;QAElC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE;YACxB,QAAQ;YACR,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;SAClD,CAAC,CAAC;QAEH,cAAc;QACd,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;IACrC,CAAC,CAAC;IAEF;;OAEG;IACK,4BAA4B,GAAG,GAAG,EAAE;QAE1C,oBAAoB;QACpB,yBAAyB;QACzB,IAAI,IAAI,CAAC,sBAAsB,IAAI,IAAI,CAAC,aAAa,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACtH,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;YACpC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC;IAEF;;OAEG;IACK,KAAK,CAAC,2BAA2B,CAAC,kBAA4B;QACpE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC3C,kCAAkC;YAClC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAE/B,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAAE,SAAS;YACpC,IAAI,CAAC;gBACH,uBAAuB;gBACvB,MAAM,eAAe,CAAC;oBACpB,GAAG,EAAE,oCAAoC;oBACzC,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE;wBACJ,aAAa,EAAE,IAAI,CAAC,aAAa;wBACjC,SAAS,EAAE,IAAI;wBACf,WAAW,EAAE;4BACX,KAAK,EAAE,CAAC;yBACT;wBACD,UAAU,EAAE;4BACV,MAAM,EAAE,iBAAiB;yBAC1B;wBACD,UAAU,EAAE,MAAM;qBACnB;iBACF,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,QAAQ,IAAI,aAAa,EAAE,KAAK,CAAC,CAAC;gBAChD,aAAa;gBACb,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;oBACjC,MAAM,EAAE,6BAA6B;oBACrC,SAAS,EAAE,oBAAoB;oBAC/B,KAAK,EAAE,QAAQ,IAAI,YAAY;iBAChC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACK,wBAAwB,GAAG,CAAC,KAA6C,EAAE,EAAE;QACnF,IAAI,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC/B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACxD,CAAC;IACH,CAAC,CAAC;IAEF;;OAEG;IACK,kBAAkB,GAAG,GAAG,EAAE;QAChC,2BAA2B;QAC3B,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YAClC,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAChC,IAAI,CAAC,4BAA4B,GAAG,IAAI,CAAC;IAC3C,CAAC,CAAC;IAEF;;OAEG;IACK,yBAAyB,GAAG,KAAK,IAAI,EAAE;QAC7C,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxB,IAAI,CAAC,4BAA4B,GAAG,KAAK,CAAC;YAE1C,WAAW;YACX,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAE9B,gBAAgB;YAChB,eAAe;YACf,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACjC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YAC3B,CAAC;YACD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAE7B,eAAe;YACf,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;YAEpC,yBAAyB;YACzB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;gBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,qDAAqD;gBACrD,YAAY;YACd,CAAC;iBAAM,CAAC;gBACN,oBAAoB;gBACpB,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;YACvC,CAAC;QAEH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YACpC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC/B,cAAc,CAAC,YAAY,CAAC,KAAK,EAAE;gBACjC,MAAM,EAAE,2BAA2B;gBACnC,SAAS,EAAE,oBAAoB;gBAC/B,KAAK,EAAE,YAAY;aACpB,CAAC,CAAC;YACH,aAAa,CAAC,SAAS,CAAC;gBACtB,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,YAAY;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF;;OAEG;IACK,uBAAuB,GAAG,KAAK,IAAI,EAAE;QAC3C,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,mBAAmB,CAAC;YAE/D,WAAW;YACX,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAExC,OAAO;YACP,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YACpC,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC;YAC/B,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IAEF;;OAEG;IACK,wBAAwB,GAAG,GAAG,EAAE;QACtC,IAAI,CAAC,4BAA4B,GAAG,KAAK,CAAC;IAC5C,CAAC,CAAC;IAEF;;OAEG;IACK,wBAAwB,GAAG,GAAW,EAAE;QAC9C,4BAA4B;QAC5B,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IAC7E,CAAC,CAAC;IAEF,MAAM;QACJ,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAE9B,MAAM,UAAU,GAAG;YACjB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;SAC5B,CAAC;QAEF,MAAM,cAAc,GAAG;YACrB,iBAAiB,EAAE,IAAI;YACvB,YAAY,EAAE,IAAI,CAAC,UAAU;SAC9B,CAAC;QAEF,MAAM,YAAY,GAAG;YACnB,eAAe,EAAE,IAAI;YACrB,oBAAoB,EAAE,IAAI,CAAC,UAAU;SACtC,CAAC;QAEF,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,CAC/B,WAAK,KAAK,EAAC,eAAe;YACxB,aACE,QAAQ,QACR,WAAW,QACX,KAAK,QACL,KAAK,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE,EAClC,GAAG,EAAE,EAAE,CAAC,EAAE;oBACR,IAAI,EAAE,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACjD,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;wBACnB,0CAA0C;oBAC5C,CAAC;gBACH,CAAC,GACM;YACT,WACE,KAAK,EAAE;oBACL,kBAAkB,EAAE,IAAI;oBACxB,SAAS,EAAE,IAAI,CAAC,oBAAoB;iBACrC;gBAED,YAAM,KAAK,EAAC,eAAe,GAAQ;gBACnC;oBACG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,mBAAmB;;oBAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;;oBAAG,CAAC,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;oBAChJ,IAAI,CAAC,oBAAoB,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,mBAAmB,GAAG,CAC3E,CACH,CACF,CACP,CAAC;QAEF,YAAY;QACZ,MAAM,uBAAuB,GAAG,GAAG,EAAE;YACnC,gBAAgB;YAChB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACrB,OAAO,CACL,WAAK,KAAK,EAAC,iCAAiC;oBAC1C,aAAI,IAAI,CAAC,WAAW,CAAK;oBACzB,WAAK,KAAK,EAAC,mBAAmB;wBAC5B,aAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,YAAY,CAAK;wBAC9C;4BACE,cAAK,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAM;4BAC7C,cAAK,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAM;4BAC7C,cAAK,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,CAAM,CAC1C,CACD,CACF,CACP,CAAC;YACJ,CAAC;YAED,QAAQ;YACR,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,OAAO,CACL,WAAK,KAAK,EAAC,oBAAoB;oBAC7B,aAAI,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,kBAAkB,CAAK,CACtD,CACP,CAAC;YACJ,CAAC;YAED,gBAAgB;YAChB,IAAI,IAAI,CAAC,sBAAsB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAClD,OAAO,CACL,WAAK,KAAK,EAAC,oBAAoB;oBAC7B,aAAI,IAAI,CAAC,OAAO,EAAE,iBAAiB,EAAE,WAAW,CAAK,CACjD,CACP,CAAC;YACJ,CAAC;YAED,SAAS;YACT,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxB,OAAO,CACL,WAAK,KAAK,EAAC,oBAAoB;oBAC7B,aAAI,IAAI,CAAC,OAAO,EAAE,iBAAiB,EAAE,eAAe,CAAK,CACrD,CACP,CAAC;YACJ,CAAC;YAED,SAAS;YACT,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC1B,OAAO,CACL,WAAK,KAAK,EAAC,oBAAoB;oBAC7B,aAAI,IAAI,CAAC,OAAO,EAAE,iBAAiB,EAAE,cAAc,CAAK,CACpD,CACP,CAAC;YACJ,CAAC;YAED,cAAc;YACd,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBACnD,OAAO,CACL,WAAK,KAAK,EAAC,oBAAoB;oBAC7B,aAAI,IAAI,CAAC,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,CAAK,CACxD,CACP,CAAC;YACJ,CAAC;YAED,SAAS;YACT,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,OAAO,CACL,WAAK,KAAK,EAAC,oBAAoB;oBAC7B,aAAI,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,EAAE,eAAe,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAK,CAC1G,CACP,CAAC;YACJ,CAAC;YAED,SAAS;YACT,OAAO,CACL,WAAK,KAAK,EAAC,mCAAmC;gBAC5C,aAAI,IAAI,CAAC,OAAO,EAAE,iBAAiB,EAAE,SAAS,CAAK,CAC/C,CACP,CAAC;QACJ,CAAC,CAAC;QAEF,eAAe;QACf,MAAM,mBAAmB,GAAG,GAAG,EAAE,CAAC,CAChC,WAAK,KAAK,EAAC,iBAAiB;YAEzB,IAAI,CAAC,KAAK,KAAK,mBAAmB,IAAI,CACrC,cACE,KAAK,EAAE;oBACL,eAAe,EAAE,IAAI;oBACrB,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC;iBACtC,EACD,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,EACnC,OAAO,EAAE,IAAI,CAAC,eAAe,IAE5B,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,qBAAqB,CACtC,CACV;YACA,IAAI,CAAC,KAAK,KAAK,mBAAmB,IAAI,CACrC,cACE,KAAK,EAAE;oBACL,eAAe,EAAE,IAAI;oBACrB,UAAU,EAAE,IAAI,CAAC,SAAS;iBAC3B,EACD,QAAQ,EAAE,IAAI,CAAC,SAAS,EACxB,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EACnC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,cAAc,IAElC,IAAI,CAAC,OAAO,EAAE,cAAc,CACtB,CACV;YACD,gBACE,KAAK,EAAC,mBAAmB,EACzB,WAAW,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAC7F,KAAK,EAAE,IAAI,CAAC,UAAU,EACtB,OAAO,EAAE,IAAI,CAAC,qBAAqB,EACnC,SAAS,EAAE,IAAI,CAAC,aAAa,EAC7B,QAAQ,EAAE,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,iBAAiB,GACvE;YACZ,WAAK,KAAK,EAAC,eAAe;gBACxB,WAAK,KAAK,EAAC,iBAAiB;oBAC1B,cACE,KAAK,EAAE;4BACL,gBAAgB,EAAE,IAAI;4BACtB,WAAW,EAAE,IAAI,CAAC,gBAAgB;4BAClC,YAAY,EAAE,IAAI,CAAC,iBAAiB;yBACrC,EACD,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EACpJ,OAAO,EAAE,IAAI,CAAC,qBAAqB,EACnC,QAAQ,EACN,IAAI,CAAC,eAAe;4BACpB,IAAI,CAAC,iBAAiB;4BACtB,IAAI,CAAC,gBAAgB;4BACrB,IAAI,CAAC,SAAS;4BACd,CAAC,CAAC,IAAI,CAAC,uBAAuB;4BAC9B,IAAI,CAAC,eAAe;4BACpB,IAAI,CAAC,cAAc,IAGpB,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CACvB;wBACE,WAAK,OAAO,EAAC,WAAW,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,cAAc;4BACjE,YAAM,CAAC,EAAC,8EAA8E,GAAG;4BACzF,YAAM,CAAC,EAAC,sGAAsG,GAAG;4BACjH,cAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,EAAC,IAAI,EAAC,KAAK,GAAG,CACvC,CAEF,CACP,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAC3B,WAAK,KAAK,EAAC,sBAAsB;wBAC/B,WAAK,OAAO,EAAC,WAAW,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,cAAc;4BACjE,YAAM,CAAC,EAAC,iOAAiO,GAAG,CACxO,CACF,CACP,CAAC,CAAC,CAAC,CACF,WAAK,OAAO,EAAC,WAAW,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,cAAc;wBACjE,YAAM,CAAC,EAAC,8EAA8E,GAAG;wBACzF,YAAM,CAAC,EAAC,sGAAsG,GAAG,CAC7G,CACP,CACM,CACL;gBACN,WACE,KAAK,EAAE;wBACL,aAAa,EAAE,IAAI;wBACnB,UAAU,EACR,IAAI,CAAC,eAAe;4BACpB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;4BACvB,IAAI,CAAC,gBAAgB;4BACrB,IAAI,CAAC,SAAS;4BACd,CAAC,CAAC,IAAI,CAAC,uBAAuB;4BAC9B,IAAI,CAAC,eAAe;4BACpB,IAAI,CAAC,cAAc;4BACnB,IAAI,CAAC,gBAAgB;4BACrB,IAAI,CAAC,iBAAiB;qBACzB,EACD,OAAO,EAAE,GAAG,EAAE;wBACZ,IACE,IAAI,CAAC,eAAe;4BACpB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;4BACvB,IAAI,CAAC,gBAAgB;4BACrB,IAAI,CAAC,SAAS;4BACd,CAAC,CAAC,IAAI,CAAC,uBAAuB;4BAC9B,IAAI,CAAC,eAAe;4BACpB,IAAI,CAAC,cAAc;4BACnB,IAAI,CAAC,gBAAgB;4BACrB,IAAI,CAAC,iBAAiB,EACtB,CAAC;4BACD,OAAO;wBACT,CAAC;wBACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBAC1B,CAAC;oBAED,WAAK,GAAG,EAAC,+EAA+E,GAAG,CACvF,CACF,CACF,CACP,CAAC;QAEF,aAAa;QACb,MAAM,wBAAwB,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,SAAS,CAAC;QAExE,OAAO,CACL,WAAK,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU;YACzC,WAAK,KAAK,EAAE,cAAc;gBACvB,IAAI,CAAC,YAAY,IAAI,CACpB,WAAK,KAAK,EAAC,cAAc;oBACvB,WAAK,KAAK,EAAC,aAAa;wBACrB,IAAI,CAAC,IAAI,IAAI,WAAK,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAC,aAAa,GAAG;wBACzD,eAAM,IAAI,CAAC,UAAU,CAAO,CACxB;oBACL,IAAI,CAAC,WAAW,IAAI,CACnB,cAAQ,KAAK,EAAC,cAAc,EAAC,OAAO,EAAE,IAAI,CAAC,WAAW;wBACpD,yBAAc,CACP,CACV,CACG,CACP;gBAED,WAAK,KAAK,EAAC,gBAAgB;oBACzB,WAAK,KAAK,EAAC,cAAc,EAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,WAAW,IACnJ,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CACvB,WAAK,KAAK,EAAC,mBAAmB;wBAC5B,WAAK,KAAK,EAAC,iBAAiB,GAAO;wBACnC,aAAI,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAAK,CAC1C,CACP,CAAC,CAAC,CAAC,CACF;wBAEG,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAC1G,WAAK,EAAE,EAAE,WAAW,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE;4BAC/C,wBACE,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,KAAK,EAAE,IAAI,CAAC,KAAK,EACjB,OAAO,EAAE,OAAO,EAChB,oBAAoB,EAAE,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,sBAAsB,IAAI,IAAI,CAAC,eAAe,EAC5H,UAAU,EAAE,IAAI,CAAC,UAAU,EAC3B,eAAe,EAAE,wBAAwB,EACzC,cAAc,EAAE,IAAI,CAAC,cAAc,EACnC,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,EAC7C,eAAe,EAAE,IAAI,CAAC,eAAe,EACrC,oBAAoB,EAAE,IAAI,CAAC,wBAAwB,EACnD,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EACvC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,GACrB,CAChB,CACP,CAAC;wBACD,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAC9D,WAAK,KAAK,EAAC,aAAa;4BACtB,aAAI,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAK,CACpC,CACP,CACG,CACP,CACG;oBAEN,WAAK,KAAK,EAAC,mBAAmB;wBAC5B,WAAK,KAAK,EAAC,qBAAqB;4BAE7B,CAAC,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CACjI,WAAK,KAAK,EAAC,mBAAmB;gCAC5B,WAAK,KAAK,EAAC,mBAAmB;oCAC5B,WAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE;wCACxC,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,sBAAsB,IAAI,CAC9E,cACE,KAAK,EAAC,uCAAuC,EAC7C,OAAO,EAAE,IAAI,CAAC,kBAAkB,EAChC,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,iBAAiB,EAClD,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY;4CAE1F,gBAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAQ,CAClF,CACV;wCACA,IAAI,CAAC,oBAAoB,IAAI,CAC5B,cAAQ,KAAK,EAAC,iCAAiC,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE;4CACtF,gBAAO,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAQ,CAC1C,CACV,CACG;oCACL,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,CAC1C,WAAK,KAAK,EAAC,uBAAuB;wCAChC,yBACE,SAAS,EAAE,IAAI,CAAC,SAAS,EACzB,UAAU,EAAE,IAAI,CAAC,mBAAmB,EACpC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,uBAAuB,EAC3C,YAAY,EAAE,IAAI,CAAC,YAAY,EAC/B,gBAAgB,EAAE,IAAI,CAAC,gCAAgC,EACvD,YAAY,EAAE,IAAI,CAAC,4BAA4B,EAC/C,oBAAoB,EAAE,IAAI,CAAC,wBAAwB,GAChC,CACjB,CACP,CACG,CACF,CACP;4BACA,IAAI,CAAC,aAAa,KAAK,MAAM,IAAI,mBAAmB,EAAE;4BACtD,IAAI,CAAC,aAAa,KAAK,OAAO,IAAI,CACjC,WAAK,KAAK,EAAC,iBAAiB;gCAC1B,WAAK,KAAK,EAAC,YAAY,IAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,WAAK,KAAK,EAAC,2BAA2B,IAAE,uBAAuB,EAAE,CAAO,CAAO;gCACtJ,WAAK,KAAK,EAAC,oBAAoB,IAC5B,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CACtB,cAAQ,KAAK,EAAC,uBAAuB,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAC5E,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,cAAc,CAC/B,CACV,CAAC,CAAC,CAAC,CACF,WAAK,KAAK,EAAC,iBAAiB;oCAC1B,cAAQ,KAAK,EAAC,gCAAgC,EAAC,QAAQ,UACpD,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,mBAAmB,CACpC,CACL,CACP,CACG,CACF,CACP,CACG,CACF,CACF;gBAGN,kBACE,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,WAAW,EAAE,IAAI,CAAC,eAAe,EACjC,KAAK,EAAC,KAAK,EACX,QAAQ,EAAE,GAAG,EAAE;wBACb,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;wBAC1B,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;wBACrB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;oBAC3B,CAAC;oBAEA,IAAI,CAAC,kBAAkB,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,IAAI,CACxD,WAAK,KAAK,EAAC,wBAAwB;wBACjC,cAAQ,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,EAAC,GAAG,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,GAAW,CACxI,CACP;oBAEA,IAAI,CAAC,kBAAkB,KAAK,UAAU,IAAI,IAAI,CAAC,cAAc,IAAI,WAAK,KAAK,EAAC,0CAA0C,EAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,GAAQ;oBAErK,IAAI,CAAC,kBAAkB,KAAK,MAAM,IAAI,IAAI,CAAC,cAAc,IAAI,CAC5D,WAAK,KAAK,EAAC,wBAAwB;wBACjC,WAAK,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAG,IAAI,CAAC,cAAc,CAAO,CACvF,CACP,CACU;gBAGb,kBACE,MAAM,EAAE,IAAI,CAAC,mBAAmB,EAChC,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,oBAAoB,EAC/C,KAAK,EAAC,OAAO,EACb,QAAQ,EAAE,GAAG,EAAE;wBACb,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;oBACnC,CAAC;oBAED,WAAK,KAAK,EAAC,wBAAwB;wBAEjC,WAAK,KAAK,EAAC,mBAAmB,IAC3B,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAC7B,WAAK,KAAK,EAAC,uBAAuB;4BAChC,WAAK,KAAK,EAAC,uBAAuB,GAAO;4BACzC,aAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAK,CACjC,CACP,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAC3C,WAAK,KAAK,EAAC,qBAAqB;4BAC9B,aAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAK,CACnC,CACP,CAAC,CAAC,CAAC,CACF,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAC5C,WACE,GAAG,EAAE,YAAY,CAAC,EAAE,EACpB,KAAK,EAAE;gCACL,mBAAmB,EAAE,IAAI;gCACzB,QAAQ,EAAE,YAAY,CAAC,EAAE,KAAK,IAAI,CAAC,cAAc;6BAClD,EACD,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,YAAY,CAAC,EAAE,CAAC;4BAE7D,WAAK,KAAK,EAAC,mBAAmB;gCAC5B,WAAK,KAAK,EAAC,oBAAoB,IAAE,YAAY,CAAC,IAAI,CAAO;gCACzD,WAAK,KAAK,EAAC,mBAAmB;oCAC5B,YAAM,KAAK,EAAC,mBAAmB,IAAE,YAAY,CAAC,WAAW,CAAQ;oCAChE,YAAY,CAAC,aAAa,GAAG,CAAC,IAAI,YAAM,KAAK,EAAC,eAAe;wCAAE,YAAY,CAAC,aAAa;6DAAW;oCACpG,YAAY,CAAC,MAAM,IAAI,CACtB,YACE,KAAK,EAAE;4CACL,qBAAqB,EAAE,IAAI;4CAC3B,WAAW,EAAE,YAAY,CAAC,MAAM,KAAK,IAAI;4CACzC,SAAS,EAAE,YAAY,CAAC,MAAM,KAAK,KAAK;yCACzC,IAEA,YAAY,CAAC,MAAM,CACf,CACR,CACG,CACF;4BACL,YAAY,CAAC,EAAE,KAAK,IAAI,CAAC,cAAc,IAAI,CAC1C,WAAK,KAAK,EAAC,mBAAmB;gCAC5B,WAAK,OAAO,EAAC,WAAW,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,cAAc;oCACjE,YAAM,CAAC,EAAC,mDAAmD,GAAG,CAC1D,CACF,CACP,CACG,CACP,CAAC,CACH,CACG,CACF,CACK;gBAGb,yBACE,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAC7B,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,eAAe,EACzC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,eAAe,EACrC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,iBAAiB,EAC3C,MAAM,EAAC,QAAQ,EACf,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAC/B,QAAQ,EAAE,IAAI,CAAC,6BAA6B,EAC5C,QAAQ,EAAE,IAAI,CAAC,wBAAwB;oBAEvC,WAAK,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE;wBAClC,WACE,KAAK,EAAE;gCACL,QAAQ,EAAE,MAAM;gCAChB,KAAK,EAAE,SAAS;gCAChB,UAAU,EAAE,KAAK;gCACjB,YAAY,EAAE,MAAM;gCACpB,SAAS,EAAE,QAAQ;6BACpB;4BAEA,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,oBAAoB;4BAC3C,CAAC,GAAG,EAAE;gCACL,eAAe;gCACf,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gCACnH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,EAAE,CAAC,CAAC;gCAChD,MAAM,OAAO,GAAG,cAAc,GAAG,EAAE,CAAC;gCACpC,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;4BACzF,CAAC,CAAC,EAAE,CACA;wBAEN,WACE,KAAK,EAAE;gCACL,OAAO,EAAE,MAAM;gCACf,UAAU,EAAE,QAAQ;gCACpB,GAAG,EAAE,KAAK;gCACV,OAAO,EAAE,WAAW;gCACpB,UAAU,EAAE,SAAS;gCACrB,MAAM,EAAE,mBAAmB;gCAC3B,YAAY,EAAE,KAAK;gCACnB,KAAK,EAAE,SAAS;gCAChB,QAAQ,EAAE,MAAM;gCAChB,YAAY,EAAE,MAAM;6BACrB;4BAED,WAAK,OAAO,EAAC,WAAW,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,cAAc;gCACjE,YAAM,CAAC,EAAC,oDAAoD,GAAG,CAC3D;4BACN,gBAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,wBAAwB,CAAQ,CAC1D;wBAEN,WACE,KAAK,EAAE;gCACL,QAAQ,EAAE,MAAM;gCAChB,KAAK,EAAE,SAAS;gCAChB,UAAU,EAAE,KAAK;gCACjB,YAAY,EAAE,MAAM;6BACrB,IAEA,IAAI,CAAC,OAAO,CAAC,yBAAyB,CACnC;wBAEN,aACE,KAAK,EAAE;gCACL,OAAO,EAAE,MAAM;gCACf,UAAU,EAAE,QAAQ;gCACpB,GAAG,EAAE,KAAK;gCACV,MAAM,EAAE,SAAS;gCACjB,OAAO,EAAE,OAAO;gCAChB,UAAU,EAAE,MAAM;6BACnB;4BAED,aACE,IAAI,EAAC,UAAU,EACf,KAAK,EAAE;oCACL,KAAK,EAAE,MAAM;oCACb,MAAM,EAAE,MAAM;oCACd,WAAW,EAAE,SAAS;oCACtB,MAAM,EAAE,SAAS;oCACjB,MAAM,EAAE,GAAG;iCACZ,EACD,OAAO,EAAE,IAAI,CAAC,wBAAwB,EACtC,QAAQ,EAAE,IAAI,CAAC,uBAAuB,GACtC;4BACF,YACE,KAAK,EAAE;oCACL,QAAQ,EAAE,MAAM;oCAChB,KAAK,EAAE,SAAS;oCAChB,MAAM,EAAE,SAAS;oCACjB,UAAU,EAAE,KAAK;iCAClB,IAEA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CACxC,CACD,CACJ,CACY;gBAGpB,yBACE,MAAM,EAAE,IAAI,CAAC,4BAA4B,EACzC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,EACpC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,EAChC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAChC,MAAM,EAAC,QAAQ,EACf,IAAI,EAAE,IAAI,CAAC,yBAAyB,EACpC,QAAQ,EAAE,IAAI,CAAC,wBAAwB,EACvC,QAAQ,EAAE,IAAI,CAAC,wBAAwB;oBAEvC,WAAK,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,IACjC,CAAC,GAAG,EAAE;wBACL,MAAM,aAAa,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;wBACtD,OAAO,CACL;4BACE,WACE,KAAK,EAAE;oCACL,QAAQ,EAAE,MAAM;oCAChB,KAAK,EAAE,SAAS;oCAChB,UAAU,EAAE,KAAK;oCACjB,YAAY,EAAE,MAAM;oCACpB,SAAS,EAAE,QAAQ;iCACpB,IAEA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC,QAAQ,EAAE,CAAC,CAC9E;4BAEL,aAAa,GAAG,CAAC,IAAI,CACpB,WACE,KAAK,EAAE;oCACL,OAAO,EAAE,MAAM;oCACf,UAAU,EAAE,YAAY;oCACxB,GAAG,EAAE,KAAK;oCACV,OAAO,EAAE,WAAW;oCACpB,UAAU,EAAE,SAAS;oCACrB,MAAM,EAAE,mBAAmB;oCAC3B,YAAY,EAAE,KAAK;oCACnB,KAAK,EAAE,SAAS;oCAChB,QAAQ,EAAE,MAAM;oCAChB,YAAY,EAAE,MAAM;iCACrB;gCAED,WACE,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,IAAI,EAAC,cAAc,EACnB,KAAK,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE;oCAE5C,YAAM,CAAC,EAAC,oDAAoD,GAAG,CAC3D;gCACN;oCACE,kBAAS,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAU;oCAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CACnG,CACH,CACP;4BAED,WACE,KAAK,EAAE;oCACL,QAAQ,EAAE,MAAM;oCAChB,KAAK,EAAE,SAAS;oCAChB,UAAU,EAAE,KAAK;oCACjB,SAAS,EAAE,QAAQ;iCACpB,IAEA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CACrC,CACF,CACP,CAAC;oBACJ,CAAC,CAAC,EAAE,CACA,CACY,CAChB,CACF,CACP,CAAC;IACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["import { Component, Prop, h, State, Event, EventEmitter, Element, Watch } from '@stencil/core';\r\nimport { sendSSERequest, sendHttpRequest, uploadFileToBackend, fetchAgentInfo, getSupportedMimeType, getSupportedAudioMimeType, convertAudioToText } from '../../utils/utils';\r\nimport { ChatMessage, ConversationItem } from '../../interfaces/chat';\r\nimport { StreamCompleteEventData, ConversationStartEventData, InterviewCompleteEventData, RecordingErrorEventData, RecordingStatusChangeEventData } from '../../interfaces/events';\r\nimport { marked } from 'marked';\r\nimport { ErrorEventBus } from '../../utils/error-event';\r\nimport { authStore } from '../../../store/auth.store'; // 导入 authStore\r\nimport { configStore } from '../../../store/config.store';\r\nimport { SentryReporter } from '../../utils/sentry-reporter';\r\nimport stringsZh from './pcm-app-chat-modal.i18n.zh.json';\r\nimport stringsEn from './pcm-app-chat-modal.i18n.en.json';\r\n\r\n@Component({\r\n tag: 'pcm-app-chat-modal',\r\n styleUrls: ['pcm-app-chat-modal.css', '../../global/markdown.css', '../../global/host.css'],\r\n shadow: true,\r\n})\r\nexport class ChatAPPModal {\r\n /**\r\n * 语言设置\r\n */\r\n @Prop() locale?: string;\r\n\r\n /**\r\n * 国际化字符串\r\n */\r\n @State() strings: any;\r\n\r\n /**\r\n * 模态框标题\r\n */\r\n @Prop() modalTitle: string = '在线客服';\r\n\r\n /**\r\n * SDK鉴权密钥\r\n */\r\n @Prop({ attribute: 'token' }) token?: string;\r\n\r\n /**\r\n * 是否显示聊天模态框\r\n */\r\n @Prop({ mutable: true }) isOpen: boolean = false;\r\n\r\n /**\r\n * 聊天消息历史\r\n */\r\n @State() messages: ChatMessage[] = [];\r\n\r\n /**\r\n * 当点击模态框关闭时触发\r\n */\r\n @Event() modalClosed: EventEmitter<void>;\r\n\r\n /**\r\n * 应用图标URL\r\n */\r\n @Prop() icon?: string;\r\n\r\n /**\r\n * 聊天框的页面层级\r\n */\r\n @Prop({ mutable: true }) zIndex?: number;\r\n\r\n /**\r\n * 是否展示顶部标题栏\r\n */\r\n @Prop() isShowHeader: boolean = true;\r\n\r\n /**\r\n * 是否展示右上角的关闭按钮\r\n */\r\n @Prop() isNeedClose: boolean = true;\r\n\r\n /**\r\n * 会话ID,传入继续对话,否则创建新会话\r\n */\r\n @Prop({ mutable: true }) conversationId?: string;\r\n\r\n /**\r\n * 是否显示“保存职位”按钮(仅JD助手智能体生效)\r\n */\r\n @Prop() showSaveJdButton: boolean = false;\r\n\r\n /**\r\n * 保存职位按钮文本\r\n */\r\n @Prop() saveJdButtonText: string = '保存职位';\r\n\r\n /**\r\n * 是否正在加载回复\r\n */\r\n @State() isLoading: boolean = false;\r\n\r\n /**\r\n * 当前正在流式输出的消息\r\n */\r\n @State() currentStreamingMessage: ChatMessage | null = null;\r\n\r\n // 添加新的状态控制\r\n @State() shouldAutoScroll: boolean = true;\r\n\r\n @State() isLoadingHistory: boolean = false;\r\n\r\n // 使用 @Element 装饰器获取组件的 host 元素\r\n @Element() hostElement: HTMLElement;\r\n\r\n /**\r\n * 一轮对话结束时的回调\r\n */\r\n @Event() streamComplete: EventEmitter<StreamCompleteEventData>;\r\n\r\n /**\r\n * 新会话开始的回调,只会在一轮对话开始时触发一次\r\n */\r\n @Event() conversationStart: EventEmitter<ConversationStartEventData>;\r\n\r\n /**\r\n * 默认发送文本\r\n */\r\n @Prop() defaultQuery: string = '你好!聘才猫';\r\n\r\n /**\r\n * 视频录制最大时长(秒)\r\n */\r\n @Prop() maxRecordingTime: number = 120;\r\n\r\n /**\r\n * 录制倒计时提醒时间(秒)\r\n * 当剩余时间小于此值时,显示倒计时警告\r\n */\r\n @Prop() countdownWarningTime: number = 30;\r\n\r\n /**\r\n * 等待录制时间(秒)\r\n */\r\n @Prop() waitingTime: number = 10;\r\n\r\n @Prop() closeResume?: () => void;\r\n\r\n // 添加视频录制相关状态\r\n @State() isRecording: boolean = false;\r\n @State() recordingStream: MediaStream | null = null;\r\n @State() recordedBlob: Blob | null = null;\r\n @State() mediaRecorder: MediaRecorder | null = null;\r\n @State() recordingTimeLeft: number = 0;\r\n @State() showRecordingUI: boolean = false;\r\n @State() recordingTimer: any = null;\r\n @State() recordingStartTime: number = 0;\r\n @State() waitingToRecord: boolean = false;\r\n @State() waitingTimer: any = null;\r\n @State() waitingTimeLeft: number = 0; // 等待时间(秒)\r\n\r\n // 添加一个新的私有属性来存储视频元素的引用\r\n private videoRef: HTMLVideoElement | null = null;\r\n\r\n /**\r\n * 当前轮数\r\n */\r\n @State() currentQuestionNumber: number = 0;\r\n\r\n /**\r\n * 当聊天完成时触发\r\n */\r\n @Event() interviewComplete: EventEmitter<InterviewCompleteEventData>;\r\n\r\n @State() showCountdownWarning: boolean = false;\r\n\r\n /**\r\n * 是否以全屏模式打开,移动端建议设置为true\r\n */\r\n @Prop() fullscreen: boolean = false;\r\n\r\n // 添加新的状态来跟踪视频上传\r\n @State() isUploadingVideo: boolean = false;\r\n\r\n // 添加新的状态和属性\r\n @State() isPlayingAudio: boolean = false;\r\n\r\n /**\r\n * 录制错误事件\r\n */\r\n @Event() recordingError: EventEmitter<RecordingErrorEventData>;\r\n\r\n /**\r\n * 录制状态变化事件\r\n */\r\n @Event() recordingStatusChange: EventEmitter<RecordingStatusChangeEventData>;\r\n\r\n /**\r\n * SDK密钥验证失败事件\r\n */\r\n @Event() tokenInvalid: EventEmitter<void>;\r\n\r\n /**\r\n * 聊天模式\r\n * video: 视频聊天模式\r\n * text: 文字聊天模式\r\n */\r\n @Prop() interviewMode: 'video' | 'text' = 'text';\r\n\r\n // 添加文字输入相关状态\r\n @State() textAnswer: string = '';\r\n @State() isSubmittingText: boolean = false;\r\n\r\n /**\r\n * 自定义智能体inputs输入参数\r\n */\r\n @Prop({ mutable: true }) customInputs: Record<string, any> = {};\r\n\r\n /**\r\n * 机器人ID\r\n */\r\n @Prop() botId?: string;\r\n\r\n // 添加语音输入相关状态\r\n @State() isRecordingAudio: boolean = false;\r\n @State() audioRecorder: MediaRecorder | null = null;\r\n @State() audioChunks: BlobPart[] = [];\r\n @State() isConvertingAudio: boolean = false;\r\n @State() audioRecordingTimeLeft: number = 60; // 最大录音时间(秒)\r\n @State() audioRecordingTimer: any = null;\r\n @State() audioRecordingStartTime: number = 0;\r\n\r\n /**\r\n * 语音录制最大时长(秒)\r\n */\r\n @Prop() maxAudioRecordingTime: number = 60;\r\n\r\n /**\r\n * 用户头像URL\r\n */\r\n @Prop() userAvatar?: string = 'https://pub.pincaimao.com/static/common/i_pcm_logo.png';\r\n\r\n /**\r\n * 助手头像URL\r\n */\r\n @Prop() assistantAvatar?: string;\r\n\r\n /**\r\n * 智能体头像URL(从后端获取)\r\n */\r\n @State() agentLogo: string = '';\r\n\r\n // 添加新的状态属性来跟踪任务是否已完成\r\n @State() isTaskCompleted: boolean = false;\r\n\r\n /**\r\n * 数字人 virtualmanKey\r\n */\r\n @State() virtualmanKey: string = '';\r\n\r\n private tokenInvalidListener: () => void;\r\n\r\n /**\r\n * 是否显示复制按钮\r\n */\r\n @Prop() showCopyButton: boolean = true;\r\n\r\n /**\r\n * 是否显示点赞点踩按钮\r\n */\r\n @Prop() showFeedbackButtons: boolean = true;\r\n\r\n /**\r\n * 附件预览模式\r\n * 'drawer': 在右侧抽屉中预览\r\n * 'window': 在新窗口中打开\r\n */\r\n @Prop() filePreviewMode: 'drawer' | 'window' = 'drawer';\r\n\r\n /**\r\n * 是否显示工作区历史会话按钮\r\n */\r\n @Prop() showWorkspaceHistory: boolean = false;\r\n\r\n // 添加新的状态来管理抽屉\r\n @State() isDrawerOpen: boolean = false;\r\n @State() previewUrl: string = '';\r\n @State() previewFileName: string = '';\r\n\r\n // 添加内容类型状态\r\n @State() previewContentType: 'file' | 'markdown' | 'text' = 'file';\r\n @State() previewContent: string = '';\r\n\r\n // 添加新的状态来追踪用户交互\r\n @State() isUserScrolling: boolean = false;\r\n\r\n @State() deviceError: string | null = null;\r\n\r\n /**\r\n * 面试流程状态管理说明:\r\n *\r\n * 核心状态:\r\n * - isTaskCompleted: 任务是否已完成(面试正常结束)\r\n * - isEndingInterview: 是否正在执行结束面试流程(用户主动结束)\r\n * - isRecording: 是否正在录制视频\r\n * - waitingToRecord: 是否正在等待开始录制\r\n * - waitingForDigitalHuman: 是否正在等待数字人视频播放完成\r\n * - isLoading: 是否正在等待AI回复\r\n * - isUploadingVideo: 是否正在上传视频\r\n *\r\n * 流程控制原则:\r\n * 1. 一旦 isTaskCompleted 或 isEndingInterview 为 true,所有录制和等待流程都应停止\r\n * 2. isEndingInterview 设置为 true 后,只允许发送结束面试消息\r\n * 3. 结束面试按钮在 isTaskCompleted 或 isEndingInterview 为 true 时置灰禁用\r\n * 4. 所有可能触发新录制的地方都需要检查这两个状态\r\n */\r\n\r\n // 添加历史会话相关状态\r\n @State() isHistoryDrawerOpen: boolean = false;\r\n @State() historyConversations: ConversationItem[] = [];\r\n @State() isLoadingConversations: boolean = false;\r\n\r\n // 添加二次确认相关状态\r\n @State() showConfirmModal: boolean = false;\r\n @State() skipConfirmThisInterview: boolean = false;\r\n\r\n // 添加结束面试确认相关状态\r\n @State() showEndInterviewConfirmModal: boolean = false;\r\n\r\n /**\r\n * 标记是否正在执行结束面试流程\r\n */\r\n @State() isEndingInterview: boolean = false;\r\n\r\n /**\r\n * 最后完成的AI回复文本,用于数字人视频生成\r\n */\r\n @State() lastCompletedAnswer: string = '';\r\n\r\n /**\r\n * 是否正在等待数字人视频播放完成\r\n */\r\n @State() waitingForDigitalHuman: boolean = false;\r\n\r\n /**\r\n * 数字人视频是否已生成完成\r\n */\r\n @State() digitalHumanVideoReady: boolean = false;\r\n\r\n /**\r\n * 虚拟数字人ID,指定则开启虚拟数字人功能\r\n */\r\n @Prop() digitalId?: string;\r\n\r\n /**\r\n * 是否显示结束面试按钮\r\n */\r\n @Prop() showEndInterviewButton: boolean = false;\r\n\r\n /**\r\n * 数字人视频播放速率(0.5-2.0之间),默认1.0\r\n */\r\n @Prop() playbackRate: number = 1.0;\r\n\r\n @Watch('token')\r\n handleTokenChange(newToken: string) {\r\n // 当传入的 token 变化时,更新 authStore 中的 token\r\n if (newToken && newToken !== authStore.getToken()) {\r\n authStore.setToken(newToken);\r\n }\r\n }\r\n\r\n constructor() {\r\n // 配置 marked 选项\r\n marked.setOptions({\r\n breaks: true,\r\n gfm: true,\r\n });\r\n }\r\n\r\n async componentWillLoad() {\r\n // 加载国际化字符串\r\n this.strings = this.locale === 'en' ? stringsEn : stringsZh;\r\n\r\n // 将 zIndex 存入配置缓存\r\n if (this.zIndex) {\r\n configStore.setItem('modal-zIndex', this.zIndex);\r\n } else {\r\n // 如果没有提供 zIndex,尝试从缓存中读取\r\n const cachedZIndex = configStore.getItem<number>('modal-zIndex');\r\n if (cachedZIndex) {\r\n this.zIndex = cachedZIndex;\r\n } else {\r\n this.zIndex = 1000;\r\n configStore.setItem('modal-zIndex', 1000);\r\n }\r\n }\r\n\r\n if (this.token) {\r\n authStore.setToken(this.token);\r\n }\r\n\r\n // 添加全局token无效事件监听器\r\n this.tokenInvalidListener = () => {\r\n this.tokenInvalid.emit();\r\n };\r\n document.addEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n\r\n // 确保 customInputs 是一个对象\r\n if (!this.customInputs) {\r\n this.customInputs = {};\r\n }\r\n\r\n // 如果没有设置助手头像,尝试获取智能体头像\r\n if (!this.assistantAvatar && this.botId) {\r\n this.fetchAgentLogo();\r\n }\r\n\r\n // 如果组件加载时已经是打开状态,则直接开始对话\r\n if (this.isOpen) {\r\n if (this.conversationId) {\r\n // 在下一个事件循环中加载历史消息,避免在componentWillLoad中进行异步操作\r\n setTimeout(() => this.loadHistoryMessages(), 0);\r\n } else {\r\n // 在下一个事件循环中发送初始消息,避免在componentWillLoad中进行异步操作\r\n setTimeout(() => {\r\n this.sendMessageToAPI(this.defaultQuery);\r\n }, 0);\r\n }\r\n }\r\n }\r\n\r\n private handleClose = () => {\r\n this.stopRecording();\r\n this.modalClosed.emit();\r\n };\r\n\r\n // 添加获取智能体信息的方法\r\n private async fetchAgentLogo() {\r\n if (!this.botId) return;\r\n\r\n try {\r\n const agentInfo = await fetchAgentInfo(this.botId);\r\n\r\n if (agentInfo && agentInfo.logo) {\r\n this.agentLogo = agentInfo.logo;\r\n }\r\n } catch (error) {\r\n SentryReporter.captureError(error, {\r\n action: 'fetchAgentLogo',\r\n component: 'pcm-app-chat-modal',\r\n title: '获取智能体信息失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '获取智能体信息失败',\r\n });\r\n }\r\n }\r\n\r\n private async sendMessageToAPI(message: string, videoUrl?: string) {\r\n // 如果任务已完成或正在结束面试,不允许发送消息\r\n if (this.isTaskCompleted && !this.isEndingInterview) {\r\n console.log('任务已完成,不允许发送消息');\r\n return;\r\n }\r\n\r\n // 发送新消息时重置状态\r\n this.waitingForDigitalHuman = false;\r\n this.digitalHumanVideoReady = false;\r\n\r\n this.isLoading = true;\r\n let answer = '';\r\n let llmText = '';\r\n\r\n const now = new Date();\r\n const time = `${now.getHours()}:${now.getMinutes().toString().padStart(2, '0')}`;\r\n\r\n // 修改消息处理逻辑,移除文件上传相关代码\r\n const queryText = message.trim() || this.strings?.messages?.pleaseStart;\r\n\r\n // 如果有视频URL,添加到customInputs中\r\n if (videoUrl) {\r\n this.customInputs = {\r\n ...this.customInputs,\r\n video_url: videoUrl,\r\n };\r\n }\r\n\r\n // 创建新的消息对象\r\n const newMessage: ChatMessage = {\r\n id: `temp-${Date.now()}`, // 临时ID,将被服务器返回的ID替换\r\n conversation_id: this.conversationId, // 会话ID\r\n inputs: this.customInputs || {}, // 输入参数\r\n query: queryText, // 用户输入的消息内容\r\n answer: '', // 初始为空\r\n message_files: [], // 消息附件\r\n feedback: {}, // 反馈\r\n retriever_resources: [], // 检索资源\r\n created_at: Math.floor(Date.now() / 1000).toString(), // 创建时间\r\n agent_thoughts: [], // 代理思考过程\r\n status: 'normal', // 消息状态\r\n error: null, // 错误信息\r\n // 添加组件内部使用的字段\r\n time: time, // 消息时间(显示用)\r\n isStreaming: true, // 是否正在流式输出\r\n };\r\n\r\n // 设置当前流式消息\r\n this.currentStreamingMessage = newMessage;\r\n\r\n // 滚动到底部\r\n setTimeout(() => {\r\n this.shouldAutoScroll = true;\r\n this.scrollToBottom();\r\n }, 200);\r\n\r\n // 准备请求数据\r\n const requestData: any = {\r\n response_mode: 'streaming',\r\n conversation_id: this.conversationId,\r\n query: queryText,\r\n bot_id: this.botId, // 添加 botId 到请求数据中\r\n };\r\n\r\n // 合并基本输入参数和自定义输入参数\r\n requestData.inputs = {\r\n // 合并自定义输入参数\r\n ...this.customInputs,\r\n };\r\n\r\n await sendSSERequest({\r\n url: '/sdk/v1/chat/chat-messages',\r\n method: 'POST',\r\n data: requestData,\r\n onMessage: data => {\r\n console.log(new Date().toLocaleString());\r\n console.log('收到Stream数据:', data);\r\n\r\n if (data.conversation_id && !this.conversationId) {\r\n this.conversationId = data.conversation_id;\r\n this.conversationStart.emit({\r\n conversation_id: data.conversation_id,\r\n event: data.event,\r\n message_id: data.message_id,\r\n id: data.id,\r\n });\r\n }\r\n\r\n // 检查是否有 node_finished 事件和 LLMText\r\n if (data.event === 'node_finished' && data.data.inputs && data.data.inputs.LLMText) {\r\n llmText = data.data.inputs.LLMText;\r\n }\r\n\r\n // 添加对任务结束的判断\r\n if (data.event === 'node_finished' && data.data.title && data.data.title.includes('聘才猫任务结束')) {\r\n console.log('检测到任务结束事件:', data);\r\n\r\n // 设置标志,表示任务已结束\r\n this.isTaskCompleted = true;\r\n\r\n // 获取当前AI回复内容,优先使用LLMText,否则使用answer\r\n const aiResponse = llmText || answer || this.currentStreamingMessage?.answer || '';\r\n\r\n // 触发面试完成事件\r\n this.interviewComplete.emit({\r\n conversation_id: this.conversationId,\r\n current_question_number: this.currentQuestionNumber,\r\n ai_response: aiResponse, // 添加AI回复内容\r\n });\r\n }\r\n if (data.event === 'node_finished' && data.data.title && data.data.title.includes('聘才猫数字人题目')) {\r\n const digital_human_list = JSON.parse(data.data.process_data.digital_human_list);\r\n console.log('数字人题目:', digital_human_list);\r\n this.precreateDigitalHumanVideos(digital_human_list);\r\n }\r\n\r\n if (data.event === 'message') {\r\n if (data.event === 'agent_message' || data.event === 'message') {\r\n if (data.answer) {\r\n answer += data.answer;\r\n // 更新消息时保持完整的消息结构\r\n const updatedMessage: ChatMessage = {\r\n ...this.currentStreamingMessage,\r\n answer,\r\n id: data.message_id || this.currentStreamingMessage.id,\r\n isStreaming: true,\r\n // 如果服务器返回了其他字段,也更新它们\r\n retriever_resources: data.retriever_resources || this.currentStreamingMessage.retriever_resources,\r\n agent_thoughts: data.agent_thoughts || this.currentStreamingMessage.agent_thoughts,\r\n };\r\n this.currentStreamingMessage = updatedMessage;\r\n this.scrollToBottom();\r\n }\r\n }\r\n }\r\n if (data.event === 'error') {\r\n const errorMessage = data.data?.message || data.message || '请求失败';\r\n this.messages = [\r\n ...this.messages,\r\n {\r\n ...newMessage,\r\n answer: errorMessage,\r\n error: data.data,\r\n isStreaming: false,\r\n },\r\n ];\r\n this.currentStreamingMessage = null;\r\n this.isLoading = false;\r\n ErrorEventBus.emitError({\r\n error: data.data,\r\n message: errorMessage,\r\n });\r\n return;\r\n }\r\n\r\n if (data.event === 'message_end') {\r\n this.streamComplete.emit({\r\n conversation_id: data.conversation_id || '',\r\n event: data.event,\r\n message_id: data.message_id,\r\n id: data.id,\r\n });\r\n }\r\n },\r\n onError: error => {\r\n console.error('发生错误:', error);\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '消息发送失败,请稍后再试',\r\n });\r\n SentryReporter.captureError(error, {\r\n action: 'sendMessageToAPI',\r\n component: 'pcm-app-chat-modal',\r\n title: '消息发送失败',\r\n });\r\n\r\n this.messages = [\r\n ...this.messages,\r\n {\r\n ...newMessage,\r\n answer: this.strings?.errors?.sendMessageCheckNetwork,\r\n error: error,\r\n isStreaming: false,\r\n },\r\n ];\r\n this.currentStreamingMessage = null;\r\n this.isLoading = false;\r\n },\r\n onComplete: async () => {\r\n this.isLoading = false;\r\n // 发送第一条消息后,清空指定的 customInputs 字段\r\n setTimeout(() => {\r\n if (this.customInputs) {\r\n // 只清除指定的字段,其他字段保留\r\n delete this.customInputs.job_info;\r\n delete this.customInputs.file_url;\r\n delete this.customInputs.file_name;\r\n }\r\n }, 1000); // 给一些时间让第一条消息处理完成\r\n\r\n // 获取最新的AI回复内容,创建新对象确保 Stencil 能检测到 isStreaming 状态变化\r\n const latestAIMessage: ChatMessage = {\r\n ...this.currentStreamingMessage,\r\n isStreaming: false,\r\n };\r\n\r\n // 保存最后完成的回复内容用于数字人视频生成\r\n if (latestAIMessage && latestAIMessage.answer) {\r\n this.lastCompletedAnswer = latestAIMessage.answer;\r\n }\r\n\r\n // 先更新消息列表,再清空流式消息,避免中间状态造成消息\"消失\"导致 Button 组不显示\r\n this.messages = [...this.messages, latestAIMessage];\r\n this.currentStreamingMessage = null;\r\n\r\n // 增加计数\r\n this.currentQuestionNumber++;\r\n\r\n // 如果任务已完成或正在结束面试,不执行后续流程\r\n if (this.isTaskCompleted || this.isEndingInterview) {\r\n console.log('任务已完成或正在结束面试,停止后续流程');\r\n return;\r\n }\r\n\r\n if (this.interviewMode === 'video') {\r\n // 如果开启了数字人,等待数字人视频播放完成\r\n if (this.digitalId) {\r\n this.waitingForDigitalHuman = true;\r\n console.log('等待数字人视频播放完成...');\r\n } else {\r\n // 没有开启数字人,直接开始录制\r\n this.startWaitingToRecord();\r\n }\r\n }\r\n },\r\n });\r\n }\r\n\r\n // 修改滚动处理函数\r\n private handleScroll = () => {\r\n // 只有当用户正在滚动时才更新自动滚动状态\r\n if (this.isUserScrolling) {\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n if (!chatHistory) return;\r\n\r\n const { scrollTop, scrollHeight, clientHeight } = chatHistory;\r\n const distanceFromBottom = scrollHeight - scrollTop - clientHeight;\r\n\r\n // 更新是否应该自动滚动的状态\r\n this.shouldAutoScroll = distanceFromBottom <= 20;\r\n }\r\n };\r\n\r\n // 添加触摸开始事件处理\r\n private handleTouchStart = () => {\r\n this.isUserScrolling = true;\r\n };\r\n\r\n // 添加触摸结束事件处理\r\n private handleTouchEnd = () => {\r\n setTimeout(() => {\r\n this.isUserScrolling = false;\r\n }, 100); // 添加小延迟以确保滚动事件处理完成\r\n };\r\n\r\n private _wheelTimer: any = null;\r\n\r\n // 添加鼠标滚轮事件处理\r\n private handleWheel = () => {\r\n this.isUserScrolling = true;\r\n\r\n // 清除之前的定时器(如果存在)\r\n if (this._wheelTimer) {\r\n clearTimeout(this._wheelTimer);\r\n }\r\n\r\n // 设置新的定时器\r\n this._wheelTimer = setTimeout(() => {\r\n this.isUserScrolling = false;\r\n }, 150); // 滚轮停止后的延迟时间\r\n };\r\n\r\n private scrollToBottom() {\r\n if (!this.shouldAutoScroll) return;\r\n const chatHistory = this.hostElement.shadowRoot?.querySelector('.chat-history');\r\n if (chatHistory && this.isOpen) {\r\n // 强制浏览器重新计算布局\r\n chatHistory.scrollTop = chatHistory.scrollHeight;\r\n }\r\n }\r\n\r\n // 修改加载历史消息的方法\r\n private async loadHistoryMessages() {\r\n if (!this.conversationId) return;\r\n\r\n this.isLoadingHistory = true;\r\n console.log('加载历史消息...');\r\n let conversationStatus = false;\r\n this.digitalHumanVideoReady = true;\r\n\r\n try {\r\n // 首先获取会话状态\r\n const conversationStatusResponse = await sendHttpRequest({\r\n url: `/sdk/v1/chat/conversation`,\r\n method: 'GET',\r\n data: {\r\n conversation_id: this.conversationId,\r\n },\r\n });\r\n // 处理会话状态\r\n if (conversationStatusResponse.success && conversationStatusResponse.data && conversationStatusResponse.data.run_status == '结束') {\r\n conversationStatus = true;\r\n }\r\n\r\n // 获取历史消息\r\n const result = await sendHttpRequest({\r\n url: '/sdk/v1/chat/messages',\r\n method: 'GET',\r\n data: {\r\n conversation_id: this.conversationId,\r\n bot_id: this.botId,\r\n limit: 20,\r\n },\r\n });\r\n\r\n if (result.success && result.data) {\r\n const historyData = result.data.data || [];\r\n const formattedMessages: ChatMessage[] = historyData.map(msg => {\r\n const time = new Date(parseInt(msg.created_at) * 1000);\r\n const hours = time.getHours().toString().padStart(2, '0');\r\n const minutes = time.getMinutes().toString().padStart(2, '0');\r\n const timeStr = `${hours}:${minutes}`;\r\n\r\n // 创建完整的消息对象,保持统一结构\r\n return {\r\n id: msg.id,\r\n conversation_id: msg.conversation_id,\r\n inputs: msg.inputs || {},\r\n query: msg.query || '',\r\n answer: msg.answer || '',\r\n message_files: msg.message_files || [],\r\n feedback: msg.feedback || {},\r\n retriever_resources: msg.retriever_resources || [],\r\n created_at: msg.created_at,\r\n agent_thoughts: msg.agent_thoughts || [],\r\n status: msg.status || 'normal',\r\n error: msg.error,\r\n // 组件内部使用的字段\r\n time: timeStr,\r\n isStreaming: false,\r\n };\r\n });\r\n\r\n this.messages = formattedMessages;\r\n\r\n // 根据历史消息数量设置currentQuestionNumber\r\n this.currentQuestionNumber = formattedMessages.length || 0;\r\n }\r\n } catch (error) {\r\n console.error('加载历史消息或会话状态失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'loadHistoryMessages',\r\n component: 'pcm-app-chat-modal',\r\n title: '加载历史消息失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '加载历史消息失败',\r\n });\r\n } finally {\r\n this.isLoadingHistory = false;\r\n setTimeout(async () => {\r\n this.shouldAutoScroll = true;\r\n this.scrollToBottom();\r\n\r\n // 如果有会话ID且有历史消息,且会话未结束,处理继续对话的逻辑\r\n if (this.conversationId && this.messages.length > 0 && !conversationStatus && !this.isTaskCompleted && !this.isEndingInterview) {\r\n // 如果是视频模式,开始等待录制\r\n if (this.interviewMode === 'video') {\r\n this.startWaitingToRecord();\r\n }\r\n } else if (conversationStatus) {\r\n // 如果会话已结束,设置任务完成状态\r\n this.isTaskCompleted = true;\r\n }\r\n }, 200);\r\n }\r\n }\r\n\r\n // 开始等待录制\r\n private startWaitingToRecord() {\r\n // 如果不是视频模式,直接返回\r\n if (this.interviewMode !== 'video') {\r\n return;\r\n }\r\n\r\n // 如果任务已完成或正在结束面试,不开始录制流程\r\n if (this.isTaskCompleted || this.isEndingInterview) {\r\n console.log('任务已完成或正在结束面试,不开始录制流程');\r\n return;\r\n }\r\n\r\n // 清除可能存在的计时器\r\n if (this.waitingTimer) {\r\n clearInterval(this.waitingTimer);\r\n }\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n }\r\n\r\n this.waitingToRecord = true;\r\n this.waitingTimeLeft = this.waitingTime;\r\n\r\n this.waitingTimer = setInterval(() => {\r\n this.waitingTimeLeft--;\r\n if (this.waitingTimeLeft <= 0) {\r\n clearInterval(this.waitingTimer);\r\n this.waitingTimer = null;\r\n this.waitingToRecord = false;\r\n this.startRecording();\r\n }\r\n }, 1000);\r\n }\r\n\r\n // 开始录制视频\r\n private async startRecording() {\r\n // 如果任务已完成或正在结束面试,不开始录制\r\n if (this.isTaskCompleted || this.isEndingInterview) {\r\n console.log('任务已完成或正在结束面试,不开始录制');\r\n return;\r\n }\r\n\r\n try {\r\n const stream = await navigator.mediaDevices.getUserMedia({\r\n audio: true,\r\n video: {\r\n width: { ideal: 1280 },\r\n height: { ideal: 720 },\r\n frameRate: { ideal: 30 },\r\n },\r\n });\r\n\r\n // 如果成功获取到媒体流,清除之前的设备错误\r\n this.deviceError = null;\r\n\r\n this.recordingStream = stream;\r\n this.showRecordingUI = true;\r\n this.showCountdownWarning = false;\r\n\r\n // 重置视频引用\r\n this.videoRef = null;\r\n\r\n // 确保视频元素获取到流\r\n this.setupVideoPreview(stream);\r\n\r\n // 检测浏览器支持的MIME类型\r\n const mimeType = getSupportedMimeType();\r\n\r\n // 创建MediaRecorder实例\r\n let mediaRecorder;\r\n try {\r\n mediaRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n videoBitsPerSecond: 800000, // 800kbps 视频比特率限制\r\n audioBitsPerSecond: 64000, // 64kbps 音频比特率限制\r\n });\r\n } catch (e) {\r\n // 如果指定MIME类型失败,尝试使用默认设置\r\n console.warn('指定的MIME类型不受支持,使用默认设置:', e);\r\n try {\r\n mediaRecorder = new MediaRecorder(stream, {\r\n videoBitsPerSecond: 800000, // 即使降级也保持比特率限制\r\n audioBitsPerSecond: 64000,\r\n });\r\n } catch (recorderError) {\r\n // 最后的降级选项,不设置任何参数\r\n try {\r\n mediaRecorder = new MediaRecorder(stream);\r\n } catch (finalError) {\r\n // 通知父组件录制器创建失败\r\n this.recordingError.emit({\r\n type: 'recorder_creation_failed',\r\n message: '无法创建媒体录制器,您的浏览器可能不支持此功能',\r\n details: finalError,\r\n });\r\n this.showRecordingUI = false;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n this.mediaRecorder = mediaRecorder;\r\n\r\n const chunks: BlobPart[] = [];\r\n\r\n mediaRecorder.ondataavailable = event => {\r\n if (event.data.size > 0) {\r\n chunks.push(event.data);\r\n }\r\n };\r\n\r\n mediaRecorder.onerror = event => {\r\n // 通知父组件录制过程中发生错误\r\n this.recordingError.emit({\r\n type: 'recording_error',\r\n message: this.strings?.errors?.recordingErrorText,\r\n details: event,\r\n });\r\n this.stopRecording();\r\n };\r\n\r\n mediaRecorder.onstop = () => {\r\n try {\r\n // 根据实际使用的MIME类型创建Blob\r\n const blobType = mimeType || 'video/mp4';\r\n const blob = new Blob(chunks, { type: blobType });\r\n\r\n if (blob.size === 0) {\r\n // 通知父组件录制的视频为空\r\n this.recordingError.emit({\r\n type: 'empty_recording',\r\n message: this.strings?.errors?.emptyVideo,\r\n });\r\n this.showRecordingUI = false;\r\n return;\r\n }\r\n\r\n this.recordedBlob = blob;\r\n\r\n // 通知父组件录制已完成\r\n this.recordingStatusChange.emit({\r\n status: 'stopped',\r\n details: {\r\n duration: Math.floor((Date.now() - this.recordingStartTime) / 1000),\r\n size: blob.size,\r\n type: blob.type,\r\n },\r\n });\r\n\r\n this.uploadRecordedVideo();\r\n } catch (error) {\r\n // 通知父组件处理录制视频时出错\r\n this.recordingError.emit({\r\n type: 'processing_error',\r\n message: this.strings?.errors?.processVideoError,\r\n details: error,\r\n });\r\n this.showRecordingUI = false;\r\n SentryReporter.captureError(error, {\r\n action: 'uploadRecordedVideo',\r\n component: 'pcm-hr-chat-modal',\r\n title: '处理录制视频时出错',\r\n });\r\n }\r\n };\r\n\r\n // 开始录制\r\n try {\r\n mediaRecorder.start();\r\n this.isRecording = true;\r\n this.recordingStartTime = Date.now();\r\n this.recordingTimeLeft = this.maxRecordingTime;\r\n\r\n // 通知父组件录制已开始\r\n this.recordingStatusChange.emit({\r\n status: 'started',\r\n details: {\r\n maxDuration: this.maxRecordingTime,\r\n mimeType: mediaRecorder.mimeType,\r\n },\r\n });\r\n } catch (startError) {\r\n // 通知父组件开始录制失败\r\n this.recordingError.emit({\r\n type: 'start_failed',\r\n message: '开始录制失败,请检查您的设备权限',\r\n details: startError,\r\n });\r\n this.showRecordingUI = false;\r\n SentryReporter.captureError(startError, {\r\n action: 'startRecording',\r\n component: 'pcm-hr-chat-modal',\r\n title: '开始录制失败',\r\n });\r\n return;\r\n }\r\n\r\n // 设置录制计时器\r\n this.recordingTimer = setInterval(() => {\r\n const elapsedTime = Math.floor((Date.now() - this.recordingStartTime) / 1000);\r\n this.recordingTimeLeft = Math.max(0, this.maxRecordingTime - elapsedTime);\r\n\r\n // 检查是否需要显示倒计时警告\r\n if (this.recordingTimeLeft <= this.countdownWarningTime && !this.showCountdownWarning) {\r\n this.showCountdownWarning = true;\r\n }\r\n\r\n // 时间到自动停止录制\r\n if (this.recordingTimeLeft <= 0) {\r\n this.stopRecording();\r\n }\r\n }, 1000);\r\n } catch (error) {\r\n console.error('无法访问摄像头或麦克风:', error);\r\n\r\n // 设置设备错误状态\r\n let errorMessage = this.strings?.errors?.deviceAccessFailed;\r\n\r\n if (error.name === 'NotAllowedError') {\r\n errorMessage = this.strings.errors.permissionDenied;\r\n } else if (error.name === 'NotFoundError') {\r\n errorMessage = this.strings.errors.deviceNotFound;\r\n } else if (error.name === 'NotReadableError') {\r\n errorMessage = this.strings.errors.browserNotSupportVideoRecording;\r\n } else if (error.name === 'OverconstrainedError') {\r\n errorMessage = this.strings.errors.unsupportedConfiguration;\r\n } else {\r\n errorMessage = this.strings.errors.cameraOrMicAccessFailed;\r\n }\r\n\r\n this.deviceError = errorMessage;\r\n this.showRecordingUI = false;\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: errorMessage,\r\n });\r\n\r\n SentryReporter.captureError(error, {\r\n action: 'startRecording',\r\n component: 'pcm-app-chat-modal',\r\n title: errorMessage,\r\n });\r\n }\r\n }\r\n\r\n // 添加新方法来设置视频预览\r\n private setupVideoPreview(stream: MediaStream) {\r\n // 延迟执行以确保DOM已更新\r\n setTimeout(() => {\r\n const videoElement = this.hostElement.shadowRoot?.querySelector('video') as HTMLVideoElement;\r\n if (videoElement && stream) {\r\n // 先尝试使用标准方法\r\n try {\r\n videoElement.srcObject = stream;\r\n videoElement.play().catch(err => {\r\n console.error('视频播放失败:', err);\r\n SentryReporter.captureError(err, {\r\n action: 'setupVideoPreview',\r\n component: 'pcm-app-chat-modal',\r\n title: '视频播放失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: err,\r\n message: '视频播放失败',\r\n });\r\n });\r\n } catch (e) {\r\n console.warn('设置srcObject失败,尝试替代方法:', e);\r\n\r\n // 对于不支持srcObject的旧浏览器,使用URL.createObjectURL\r\n try {\r\n // 使用类型断言解决TypeScript错误\r\n const objectUrl = URL.createObjectURL(stream as unknown as MediaSource);\r\n videoElement.src = objectUrl;\r\n\r\n // 确保在视频元素不再使用时释放URL\r\n videoElement.onended = () => {\r\n URL.revokeObjectURL(objectUrl);\r\n };\r\n } catch (urlError) {\r\n console.error('创建对象URL失败:', urlError);\r\n SentryReporter.captureError(urlError, {\r\n action: 'setupVideoPreview',\r\n component: 'pcm-app-chat-modal',\r\n title: '创建对象URL失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: urlError,\r\n message: '创建对象URL失败',\r\n });\r\n }\r\n }\r\n } else {\r\n console.warn('未找到视频元素或媒体流无效');\r\n }\r\n }, 100);\r\n }\r\n\r\n // 停止录制\r\n private stopRecording() {\r\n if (this.mediaRecorder && this.isRecording) {\r\n this.mediaRecorder.stop();\r\n this.isRecording = false;\r\n\r\n // 清理计时器\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n this.recordingTimer = null;\r\n }\r\n\r\n // 停止并释放媒体流\r\n if (this.recordingStream) {\r\n this.recordingStream.getTracks().forEach(track => track.stop());\r\n this.recordingStream = null;\r\n }\r\n\r\n // 清理视频引用\r\n this.videoRef = null;\r\n }\r\n }\r\n\r\n // 处理停止录制按钮点击\r\n private handleStopRecording = () => {\r\n // 如果已经设置了跳过确认,直接停止录制\r\n if (this.skipConfirmThisInterview) {\r\n this.stopRecording();\r\n return;\r\n }\r\n\r\n // 否则显示确认模态框\r\n this.showConfirmModal = true;\r\n };\r\n\r\n // 处理\"本次面试不再提醒\"复选框变化\r\n private handleSkipConfirmChange = (event: Event) => {\r\n const checkbox = event.target as HTMLInputElement;\r\n this.skipConfirmThisInterview = checkbox.checked;\r\n };\r\n\r\n // 处理确认模态框的取消事件\r\n private handleConfirmModalCancel = () => {\r\n this.showConfirmModal = false;\r\n };\r\n\r\n // 处理确认模态框的OK事件\r\n private handleConfirmModalOk = () => {\r\n this.showConfirmModal = false;\r\n this.stopRecording();\r\n };\r\n\r\n // 处理确认模态框的Cancel事件\r\n private handleConfirmModalCancelEvent = () => {\r\n this.showConfirmModal = false;\r\n };\r\n\r\n // 上传录制的视频\r\n private async uploadRecordedVideo() {\r\n if (!this.recordedBlob) return;\r\n\r\n try {\r\n this.isUploadingVideo = true; // 开始上传时设置状态\r\n this.showRecordingUI = false; // 隐藏视频预览\r\n\r\n // 根据Blob类型确定文件扩展名\r\n const fileExtension = this.recordedBlob.type.includes('webm') ? 'webm' : 'mp4';\r\n const fileName = `answer.${fileExtension}`;\r\n\r\n // 创建File对象\r\n const file = new File([this.recordedBlob], fileName, { type: this.recordedBlob.type });\r\n\r\n // 使用uploadFileToBackend上传文件\r\n const fileInfo = await uploadFileToBackend(\r\n file,\r\n {},\r\n {\r\n tags: ['other'],\r\n },\r\n );\r\n // 使用 cos_key 作为视频标识符\r\n // 调用音频转文字API\r\n const transcriptionText = await convertAudioToText(fileInfo.cos_key);\r\n\r\n // 检查是否是结束面试流程\r\n if (this.isEndingInterview) {\r\n console.log('视频上传完成,现在发送结束面试消息');\r\n // 如果是结束面试流程,发送结束面试消息\r\n await this.sendEndInterviewMessage();\r\n } else {\r\n // 正常流程:发送\"下一题\"请求,可以附带转录文本\r\n this.sendMessageToAPI(transcriptionText || this.strings?.messages?.nextQuestion, fileInfo.cos_key);\r\n }\r\n } catch (error) {\r\n console.error('视频上传或处理错误:', error);\r\n this.isEndingInterview = false; // 出错时重置标志\r\n SentryReporter.captureError(error, {\r\n action: 'uploadRecordedVideo',\r\n component: 'pcm-app-chat-modal',\r\n title: '视频上传或处理失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '视频上传或处理失败',\r\n });\r\n } finally {\r\n this.isUploadingVideo = false; // 上传完成后重置状态\r\n this.showRecordingUI = false;\r\n this.recordedBlob = null;\r\n }\r\n }\r\n\r\n // 确保组件卸载时释放资源\r\n disconnectedCallback() {\r\n document.removeEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n\r\n // 清理其他计时器\r\n if (this.waitingTimer) {\r\n clearInterval(this.waitingTimer);\r\n this.waitingTimer = null;\r\n }\r\n\r\n if (this.recordingTimer) {\r\n clearInterval(this.recordingTimer);\r\n this.recordingTimer = null;\r\n }\r\n\r\n // 清理音频录制计时器\r\n if (this.audioRecordingTimer) {\r\n clearInterval(this.audioRecordingTimer);\r\n this.audioRecordingTimer = null;\r\n }\r\n\r\n // 停止录制\r\n this.stopRecording();\r\n\r\n // 停止音频录制\r\n this.stopAudioRecording();\r\n }\r\n\r\n // 处理文本输入变化\r\n private handleTextInputChange = (event: Event) => {\r\n const input = event.target as HTMLTextAreaElement;\r\n this.textAnswer = input.value;\r\n };\r\n\r\n // 添加处理键盘事件的方法\r\n private handleKeyDown = (event: KeyboardEvent) => {\r\n // 如果按下的是回车键\r\n if (event.key === 'Enter') {\r\n if (event.isComposing) {\r\n return;\r\n }\r\n\r\n // 如果同时按下了Ctrl键,允许换行\r\n if (event.ctrlKey) {\r\n // 获取当前光标位置\r\n const textarea = event.target as HTMLTextAreaElement;\r\n const cursorPosition = textarea.selectionStart;\r\n\r\n // 在光标位置插入换行符\r\n const beforeCursor = this.textAnswer.substring(0, cursorPosition);\r\n const afterCursor = this.textAnswer.substring(cursorPosition);\r\n this.textAnswer = beforeCursor + '\\n' + afterCursor;\r\n\r\n // 阻止默认行为\r\n event.preventDefault();\r\n\r\n // 在下一个事件循环中设置光标位置\r\n setTimeout(() => {\r\n const newPosition = cursorPosition + 1;\r\n textarea.setSelectionRange(newPosition, newPosition);\r\n }, 0);\r\n\r\n return;\r\n } else {\r\n // 阻止默认的换行行为\r\n event.preventDefault();\r\n // 如果文本框不为空且不处于禁用状态,则发送消息\r\n if (this.textAnswer.trim() && !this.isSubmittingText && !this.isLoading && !this.currentStreamingMessage && !this.waitingToRecord) {\r\n this.submitTextAnswer();\r\n }\r\n }\r\n }\r\n };\r\n\r\n // 修改提交文本回答的方法\r\n private submitTextAnswer = async () => {\r\n if (!this.textAnswer.trim() || this.isSubmittingText) {\r\n return;\r\n }\r\n\r\n this.isSubmittingText = true;\r\n\r\n try {\r\n // 保存当前输入内容\r\n const textToSend = this.textAnswer;\r\n\r\n // 立即清空文本输入\r\n this.textAnswer = '';\r\n\r\n // 发送用户输入的文本作为查询\r\n await this.sendMessageToAPI(textToSend);\r\n } catch (error) {\r\n console.error('提交文本回答失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'submitTextAnswer',\r\n component: 'pcm-app-chat-modal',\r\n title: '提交文本回答失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '提交文本回答失败',\r\n });\r\n } finally {\r\n this.isSubmittingText = false;\r\n }\r\n };\r\n\r\n // 如果是简历制作,可以提前结束对话\r\n private closeResumeChat = async () => {\r\n const message = {\r\n query: this.strings?.messages?.generateResume,\r\n inputs: {\r\n mode_type: 1,\r\n generate_resume: 1,\r\n },\r\n };\r\n this.isSubmittingText = true;\r\n\r\n try {\r\n this.customInputs = message.inputs;\r\n this.closeResume?.();\r\n // 发送用户输入的文本作为查询\r\n await this.sendMessageToAPI(message.query);\r\n } catch (error) {\r\n console.error('提交文本回答失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'submitTextAnswer',\r\n component: 'pcm-app-chat-modal',\r\n title: '提交文本回答失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '提交文本回答失败',\r\n });\r\n } finally {\r\n this.isSubmittingText = false;\r\n this.customInputs = {};\r\n }\r\n };\r\n\r\n // 处理语音输入按钮点击\r\n private handleVoiceInputClick = () => {\r\n if (this.isRecordingAudio) {\r\n this.stopAudioRecording();\r\n } else {\r\n // 直接在用户交互事件处理程序中请求权限\r\n // 不使用 async/await,而是使用 Promise 链\r\n navigator.mediaDevices\r\n .getUserMedia({ audio: true })\r\n .then(stream => {\r\n // 权限已获取,开始录音\r\n this.startRecordingWithStream(stream);\r\n })\r\n .catch(error => {\r\n console.error('麦克风权限请求失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'handleVoiceInputClick',\r\n component: 'pcm-app-chat-modal',\r\n title: '麦克风权限请求失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '麦克风权限请求失败',\r\n });\r\n });\r\n }\r\n };\r\n\r\n // 新方法:使用已获取的媒体流开始录音\r\n private startRecordingWithStream(stream: MediaStream) {\r\n try {\r\n // 检测浏览器支持的音频MIME类型\r\n const mimeType = getSupportedAudioMimeType();\r\n\r\n // 创建MediaRecorder实例\r\n let audioRecorder;\r\n try {\r\n audioRecorder = new MediaRecorder(stream, {\r\n mimeType: mimeType,\r\n });\r\n } catch (e) {\r\n console.warn('指定的音频MIME类型不受支持,使用默认设置:', e);\r\n try {\r\n audioRecorder = new MediaRecorder(stream);\r\n } catch (recorderError) {\r\n // 停止并释放媒体流\r\n stream.getTracks().forEach(track => track.stop());\r\n console.error('无法创建音频录制器:', recorderError);\r\n SentryReporter.captureError(recorderError, {\r\n action: 'startRecordingWithStream',\r\n component: 'pcm-app-chat-modal',\r\n title: '无法创建音频录制器',\r\n });\r\n ErrorEventBus.emitError({\r\n error: recorderError,\r\n message: '无法创建音频录制器',\r\n });\r\n return;\r\n }\r\n }\r\n\r\n this.audioRecorder = audioRecorder;\r\n this.audioChunks = [];\r\n this.isRecordingAudio = true;\r\n this.audioRecordingStartTime = Date.now();\r\n this.audioRecordingTimeLeft = this.maxAudioRecordingTime;\r\n\r\n // 设置数据可用事件处理\r\n audioRecorder.ondataavailable = event => {\r\n if (event.data.size > 0) {\r\n this.audioChunks.push(event.data);\r\n }\r\n };\r\n\r\n // 设置录制停止事件处理\r\n audioRecorder.onstop = () => {\r\n // 停止并释放媒体流\r\n stream.getTracks().forEach(track => track.stop());\r\n\r\n // 处理录制的音频\r\n this.processAudioRecording();\r\n };\r\n\r\n // 开始录制\r\n audioRecorder.start(100); // 每100毫秒获取一次数据\r\n\r\n // 设置录制计时器\r\n this.audioRecordingTimer = setInterval(() => {\r\n const elapsedTime = Math.floor((Date.now() - this.audioRecordingStartTime) / 1000);\r\n this.audioRecordingTimeLeft = Math.max(0, this.maxAudioRecordingTime - elapsedTime);\r\n\r\n // 时间到自动停止录制\r\n if (this.audioRecordingTimeLeft <= 0) {\r\n this.stopAudioRecording();\r\n }\r\n }, 1000);\r\n } catch (error) {\r\n // 停止并释放媒体流\r\n stream.getTracks().forEach(track => track.stop());\r\n console.error('开始录音失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'startRecordingWithStream',\r\n component: 'pcm-app-chat-modal',\r\n title: '开始录音失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '开始录音失败,请确保麦克风设备正常工作',\r\n });\r\n }\r\n }\r\n\r\n // 处理录制的音频\r\n private async processAudioRecording() {\r\n if (this.audioChunks.length === 0) {\r\n console.warn('没有录制到音频数据');\r\n return;\r\n }\r\n\r\n try {\r\n this.isConvertingAudio = true;\r\n\r\n // 创建音频Blob\r\n const audioType = getSupportedAudioMimeType() || 'audio/webm';\r\n const audioBlob = new Blob(this.audioChunks, { type: audioType });\r\n\r\n if (audioBlob.size === 0) {\r\n console.warn('录制的音频为空');\r\n this.isConvertingAudio = false;\r\n return;\r\n }\r\n\r\n // 创建File对象\r\n const fileExtension = audioType.includes('webm') ? 'webm' : 'mp3';\r\n const fileName = `audio_input.${fileExtension}`;\r\n const audioFile = new File([audioBlob], fileName, { type: audioType });\r\n\r\n // 上传音频文件\r\n const fileInfo = await uploadFileToBackend(\r\n audioFile,\r\n {},\r\n {\r\n tags: ['audio'],\r\n },\r\n );\r\n\r\n // 调用音频转文字API\r\n const transcriptionText = await convertAudioToText(fileInfo.cos_key);\r\n\r\n // 将转录文本追加到文本框,而不是替换\r\n if (transcriptionText) {\r\n // 保存当前光标位置\r\n const textArea = this.hostElement.shadowRoot?.querySelector('.text-answer-input') as HTMLTextAreaElement;\r\n const cursorPosition = textArea?.selectionStart || this.textAnswer.length;\r\n\r\n // 在光标位置插入识别的文本\r\n const beforeCursor = this.textAnswer.substring(0, cursorPosition);\r\n const afterCursor = this.textAnswer.substring(cursorPosition);\r\n\r\n // 如果当前文本不为空且不以空格结尾,添加一个空格\r\n const spacer = beforeCursor.length > 0 && !beforeCursor.endsWith(' ') ? ' ' : '';\r\n\r\n // 更新文本\r\n this.textAnswer = beforeCursor + spacer + transcriptionText + afterCursor;\r\n\r\n // 设置新的光标位置\r\n setTimeout(() => {\r\n if (textArea) {\r\n const newPosition = cursorPosition + spacer.length + transcriptionText.length;\r\n textArea.focus();\r\n textArea.setSelectionRange(newPosition, newPosition);\r\n }\r\n }, 0);\r\n } else {\r\n console.warn('未能识别语音内容');\r\n alert('未能识别语音内容,请重试或直接输入文字');\r\n }\r\n } catch (error) {\r\n console.error('处理音频录制失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'processAudioRecording',\r\n component: 'pcm-app-chat-modal',\r\n title: '处理音频录制失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '语音识别失败,请重试',\r\n });\r\n } finally {\r\n this.isConvertingAudio = false;\r\n this.audioChunks = [];\r\n }\r\n }\r\n\r\n // 停止录制音频\r\n private stopAudioRecording() {\r\n if (this.audioRecorder && this.isRecordingAudio) {\r\n this.audioRecorder.stop();\r\n this.isRecordingAudio = false;\r\n\r\n // 清理计时器\r\n if (this.audioRecordingTimer) {\r\n clearInterval(this.audioRecordingTimer);\r\n this.audioRecordingTimer = null;\r\n }\r\n }\r\n }\r\n\r\n // 处理历史会话按钮点击\r\n private handleHistoryClick = () => {\r\n this.isHistoryDrawerOpen = true;\r\n this.loadHistoryConversations();\r\n };\r\n\r\n // 获取历史会话列表\r\n private async loadHistoryConversations() {\r\n if (!this.botId) {\r\n console.warn('没有提供botId,无法获取历史会话');\r\n return;\r\n }\r\n\r\n this.isLoadingConversations = true;\r\n\r\n try {\r\n const result = await sendHttpRequest({\r\n url: '/sdk/v1/chat/conversations',\r\n method: 'GET',\r\n data: {\r\n bot_id: this.botId,\r\n limit: 50, // 获取最近50个会话\r\n page: 1,\r\n },\r\n });\r\n\r\n if (result.success && result.data) {\r\n const conversations = result.data.data || [];\r\n\r\n // 格式化会话数据\r\n this.historyConversations = conversations.map((conv: any) => {\r\n // 处理时间戳,确保它是有效的数字\r\n let createdTime: Date;\r\n let timeDisplay = this.strings?.unknownTime;\r\n\r\n try {\r\n // 确保 created_at 是一个有效的时间戳\r\n const timestamp = typeof conv.created_at === 'string' ? parseInt(conv.created_at) : conv.created_at;\r\n\r\n if (isNaN(timestamp) || timestamp <= 0) {\r\n console.warn('无效的时间戳:', conv.created_at);\r\n createdTime = new Date();\r\n } else {\r\n // Unix时间戳转换为JavaScript Date对象(乘以1000转换为毫秒)\r\n createdTime = new Date(timestamp * 1000);\r\n }\r\n\r\n // 验证日期是否有效\r\n if (isNaN(createdTime.getTime())) {\r\n console.warn('无效的日期对象:', conv.created_at);\r\n createdTime = new Date();\r\n }\r\n\r\n const now = new Date();\r\n const diffTime = now.getTime() - createdTime.getTime();\r\n const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24));\r\n\r\n // 格式化时间显示\r\n if (diffDays === 0) {\r\n // 今天\r\n timeDisplay = `今天 ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n } else if (diffDays === 1) {\r\n // 昨天\r\n timeDisplay = `昨天 ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n } else if (diffDays > 0 && diffDays < 7) {\r\n // 一周内\r\n const weekdays = [\r\n this.strings?.weekdays?.sunday,\r\n this.strings?.weekdays?.monday,\r\n this.strings?.weekdays?.tuesday,\r\n this.strings?.weekdays?.wednesday,\r\n this.strings?.weekdays?.thursday,\r\n this.strings?.weekdays?.friday,\r\n this.strings?.weekdays?.saturday\r\n ];\r\n timeDisplay = `${weekdays[createdTime.getDay()]} ${createdTime.getHours().toString().padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n } else if (diffDays < 0) {\r\n // 未来时间(可能是时区问题或系统时间不准确)\r\n timeDisplay = `${(createdTime.getMonth() + 1).toString().padStart(2, '0')}-${createdTime.getDate().toString().padStart(2, '0')} ${createdTime\r\n .getHours()\r\n .toString()\r\n .padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n } else {\r\n // 超过一周\r\n timeDisplay = `${(createdTime.getMonth() + 1).toString().padStart(2, '0')}-${createdTime.getDate().toString().padStart(2, '0')} ${createdTime\r\n .getHours()\r\n .toString()\r\n .padStart(2, '0')}:${createdTime.getMinutes().toString().padStart(2, '0')}`;\r\n }\r\n } catch (error) {\r\n console.error('时间格式化错误:', error, conv.created_at);\r\n timeDisplay = this.strings?.timeParseError;\r\n }\r\n\r\n return {\r\n id: conv.id,\r\n name: conv.name || this.strings?.newConversation,\r\n created_at: conv.created_at,\r\n updated_at: conv.updated_at,\r\n status: conv.status,\r\n message_count: conv.message_count || 0,\r\n timeDisplay,\r\n } as ConversationItem;\r\n });\r\n }\r\n } catch (error) {\r\n console.error('获取历史会话失败:', error);\r\n SentryReporter.captureError(error, {\r\n action: 'loadHistoryConversations',\r\n component: 'pcm-app-chat-modal',\r\n title: '获取历史会话失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '获取历史会话失败',\r\n });\r\n } finally {\r\n this.isLoadingConversations = false;\r\n }\r\n }\r\n\r\n // 切换到指定会话\r\n private handleSwitchConversation = (conversationId: string) => {\r\n if (conversationId === this.conversationId) {\r\n // 如果点击的是当前会话,直接关闭抽屉\r\n this.isHistoryDrawerOpen = false;\r\n return;\r\n }\r\n\r\n // 切换到新会话\r\n this.conversationId = conversationId;\r\n this.messages = [];\r\n this.currentStreamingMessage = null;\r\n this.isTaskCompleted = false;\r\n this.currentQuestionNumber = 0;\r\n\r\n // 关闭抽屉\r\n this.isHistoryDrawerOpen = false;\r\n\r\n // 加载新会话的历史消息\r\n this.loadHistoryMessages();\r\n };\r\n\r\n // pcm-chat-message事件处理方法\r\n private handleFilePreviewRequest = (\r\n event: CustomEvent<{\r\n url?: string;\r\n fileName: string;\r\n content?: string;\r\n contentType: 'file' | 'markdown' | 'text';\r\n }>,\r\n ) => {\r\n const { url, fileName, content, contentType } = event.detail;\r\n\r\n this.previewFileName = fileName || this.strings?.contentPreview;\r\n this.previewContentType = contentType;\r\n this.previewUrl = url;\r\n this.previewContent = content || '';\r\n this.isDrawerOpen = true;\r\n };\r\n\r\n /**\r\n * 判断当前消息是否为最后一个消息(用于确定是否需要等待数字人视频)\r\n */\r\n private isLastMessage(message: ChatMessage): boolean {\r\n if (this.currentStreamingMessage) {\r\n return false;\r\n }\r\n\r\n // 如果没有流式消息,检查当前消息是否是messages数组中的最后一个\r\n if (this.messages.length === 0) {\r\n return false;\r\n }\r\n\r\n const lastMessage = this.messages[this.messages.length - 1];\r\n\r\n return message.id === lastMessage.id;\r\n }\r\n\r\n /**\r\n * 处理数字人视频生成成功事件\r\n */\r\n private handleDigitalHumanVideoGenerated = (\r\n event: CustomEvent<{\r\n videoUrl: string;\r\n }>,\r\n ) => {\r\n const { videoUrl } = event.detail;\r\n\r\n console.log('数字人视频生成成功:', {\r\n videoUrl,\r\n conversationId: this.conversationId,\r\n currentQuestionNumber: this.currentQuestionNumber,\r\n });\r\n\r\n // 设置数字人视频已准备好\r\n this.digitalHumanVideoReady = true;\r\n };\r\n\r\n /**\r\n * 处理数字人视频播放完成事件\r\n */\r\n private handleDigitalHumanVideoEnded = () => {\r\n\r\n // 数字人视频播放完成后,开始录制流程\r\n // 如果任务已完成或正在结束面试,不开始录制流程\r\n if (this.waitingForDigitalHuman && this.interviewMode === 'video' && !this.isTaskCompleted && !this.isEndingInterview) {\r\n this.waitingForDigitalHuman = false;\r\n this.startWaitingToRecord();\r\n }\r\n };\r\n\r\n /**\r\n * 预创建数字人视频\r\n */\r\n private async precreateDigitalHumanVideos(digital_human_list: string[]) {\r\n if (!this.virtualmanKey) {\r\n console.warn('VirtualmanKey尚未加载,无法预创建视频。');\r\n // 可以在此处添加逻辑,等待virtualmanKey加载后再执行\r\n return;\r\n }\r\n\r\n console.log('开始批量预创建数字人视频...');\r\n\r\n for (const text of digital_human_list) {\r\n if (!text || !text.trim()) continue;\r\n try {\r\n // 注意:这里只创建任务,不等待视频生成完成\r\n await sendHttpRequest({\r\n url: '/sdk/v1/virtual-human/create-video',\r\n method: 'POST',\r\n data: {\r\n VirtualmanKey: this.virtualmanKey,\r\n InputSsml: text,\r\n SpeechParam: {\r\n Speed: 1,\r\n },\r\n VideoParam: {\r\n Format: 'TransparentWebm',\r\n },\r\n DriverType: 'Text',\r\n },\r\n });\r\n } catch (error) {\r\n console.error(`为文本 \"${text}\" 创建视频任务失败:`, error);\r\n // 可以选择性地报告错误\r\n SentryReporter.captureError(error, {\r\n action: 'precreateDigitalHumanVideos',\r\n component: 'pcm-app-chat-modal',\r\n title: `为文本 \"${text}\" 创建视频任务失败`,\r\n });\r\n }\r\n }\r\n console.log('数字人视频预创建任务已全部发送。');\r\n }\r\n\r\n /**\r\n * 处理数字人详情加载完成事件\r\n */\r\n private handleAvatarDetailLoaded = (event: CustomEvent<{ virtualmanKey: string }>) => {\r\n if (event.detail.virtualmanKey) {\r\n this.virtualmanKey = event.detail.virtualmanKey;\r\n console.log('已获取 VirtualmanKey:', this.virtualmanKey);\r\n }\r\n };\r\n\r\n /**\r\n * 处理面试结束按钮点击 - 显示二次确认模态框\r\n */\r\n private handleInterviewEnd = () => {\r\n // 如果已经在结束流程中或任务已完成,不允许再次点击\r\n if (this.isEndingInterview || this.isTaskCompleted) {\r\n console.log('已在结束流程中或任务已完成,忽略点击');\r\n return;\r\n }\r\n\r\n console.log('点击结束面试按钮,显示确认模态框');\r\n this.showEndInterviewConfirmModal = true;\r\n };\r\n\r\n /**\r\n * 确认结束面试\r\n */\r\n private handleConfirmEndInterview = async () => {\r\n try {\r\n console.log('用户确认结束面试');\r\n this.showEndInterviewConfirmModal = false;\r\n\r\n // 设置结束面试标志\r\n this.isEndingInterview = true;\r\n\r\n // 停止所有可能正在进行的流程\r\n // 1. 清除等待录制计时器\r\n if (this.waitingTimer) {\r\n clearInterval(this.waitingTimer);\r\n this.waitingTimer = null;\r\n }\r\n this.waitingToRecord = false;\r\n\r\n // 2. 清除等待数字人标志\r\n this.waitingForDigitalHuman = false;\r\n\r\n // 3. 如果正在录制,需要先停止录制并上传视频\r\n if (this.isRecording) {\r\n console.log('正在录制,先停止录制并上传视频');\r\n this.stopRecording();\r\n // uploadRecordedVideo 会在上传完成后检查 isEndingInterview 标志\r\n // 并发送结束面试消息\r\n } else {\r\n // 如果没有录制,直接发送结束面试消息\r\n await this.sendEndInterviewMessage();\r\n }\r\n\r\n } catch (error) {\r\n console.error('点击结束发送消息失败:', error);\r\n this.isEndingInterview = false;\r\n SentryReporter.captureError(error, {\r\n action: 'handleConfirmEndInterview',\r\n component: 'pcm-app-chat-modal',\r\n title: '点击结束发送消息失败',\r\n });\r\n ErrorEventBus.emitError({\r\n error: error,\r\n message: '点击结束发送消息失败',\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * 发送结束面试消息\r\n */\r\n private sendEndInterviewMessage = async () => {\r\n try {\r\n const endMessage = this.strings?.messages?.endInterviewMessage;\r\n\r\n // 发送消息到API\r\n await this.sendMessageToAPI(endMessage);\r\n\r\n // 重置标志\r\n this.isEndingInterview = false;\r\n } catch (error) {\r\n console.error('发送结束面试消息失败:', error);\r\n this.isEndingInterview = false;\r\n throw error;\r\n }\r\n };\r\n\r\n /**\r\n * 取消结束面试\r\n */\r\n private handleCancelEndInterview = () => {\r\n this.showEndInterviewConfirmModal = false;\r\n };\r\n\r\n /**\r\n * 计算已回答的题数\r\n */\r\n private getAnsweredQuestionCount = (): number => {\r\n // 统计用户已经回答的问题数量(有answer的消息)\r\n return this.messages.filter(msg => msg.answer && msg.answer.trim()).length;\r\n };\r\n\r\n render() {\r\n if (!this.isOpen) return null;\r\n\r\n const modalStyle = {\r\n zIndex: String(this.zIndex),\r\n };\r\n\r\n const containerClass = {\r\n 'modal-container': true,\r\n 'fullscreen': this.fullscreen,\r\n };\r\n\r\n const overlayClass = {\r\n 'modal-overlay': true,\r\n 'fullscreen-overlay': this.fullscreen,\r\n };\r\n\r\n const renderVideoPreview = () => (\r\n <div class=\"video-preview\">\r\n <video\r\n autoPlay\r\n playsInline\r\n muted\r\n style={{ transform: 'scaleX(-1)' }}\r\n ref={el => {\r\n if (el && this.recordingStream && !this.videoRef) {\r\n this.videoRef = el;\r\n // 不在这里设置srcObject,而是使用setupVideoPreview方法\r\n }\r\n }}\r\n ></video>\r\n <div\r\n class={{\r\n 'recording-status': true,\r\n 'warning': this.showCountdownWarning,\r\n }}\r\n >\r\n <span class=\"recording-dot\"></span>\r\n <span>\r\n {this.strings.recording.recordingInProgress} {Math.floor(this.recordingTimeLeft / 60)}:{(this.recordingTimeLeft % 60).toString().padStart(2, '0')}\r\n {this.showCountdownWarning && ` (${this.strings.recording.autoCompleteWarning})`}\r\n </span>\r\n </div>\r\n </div>\r\n );\r\n\r\n // 渲染占位符状态信息\r\n const renderPlaceholderStatus = () => {\r\n // 设备错误状态 - 优先显示\r\n if (this.deviceError) {\r\n return (\r\n <div class=\"placeholder-status error-status\">\r\n <p>{this.deviceError}</p>\r\n <div class=\"error-suggestions\">\r\n <p>{this.strings.deviceError.trySolutions}</p>\r\n <ul>\r\n <li>{this.strings.deviceError.solution1}</li>\r\n <li>{this.strings.deviceError.solution2}</li>\r\n <li>{this.strings.deviceError.solution3}</li>\r\n </ul>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // 任务已完成\r\n if (this.isTaskCompleted) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>{this.strings.placeholderStatus.interviewCompleted}</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 正在等待数字人视频播放完成\r\n if (this.waitingForDigitalHuman && this.digitalId) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>{this.strings?.placeholderStatus?.aiReviewing}</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 正在播放音频\r\n if (this.isPlayingAudio) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>{this.strings?.placeholderStatus?.playingQuestion}</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 正在上传视频\r\n if (this.isUploadingVideo) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>{this.strings?.placeholderStatus?.uploadingVideo}</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 正在加载或等待AI回复\r\n if (this.isLoading || this.currentStreamingMessage) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>{this.strings?.placeholderStatus?.waitingForQuestion}</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 等待开始录制\r\n if (this.waitingToRecord) {\r\n return (\r\n <div class=\"placeholder-status\">\r\n <p>{(this.strings?.placeholderStatus?.prepareToRecord).replace('{time}', this.waitingTimeLeft.toString())}</p>\r\n </div>\r\n );\r\n }\r\n\r\n // 添加默认状态\r\n return (\r\n <div class=\"placeholder-status default-status\">\r\n <p>{this.strings?.placeholderStatus?.preparing}</p>\r\n </div>\r\n );\r\n };\r\n\r\n // 修改文本输入区域渲染函数\r\n const renderTextInputArea = () => (\r\n <div class=\"text-input-area\">\r\n {/* 只有简历制作的时候需要展示结束对话 */}\r\n {this.botId === '39284520284983296' && (\r\n <button\r\n class={{\r\n 'cancel-button': true,\r\n 'disabled': this.messages.length <= 3,\r\n }}\r\n disabled={this.messages.length <= 3}\r\n onClick={this.closeResumeChat}\r\n >\r\n {this.strings?.buttons?.endChatGenerateResume}\r\n </button>\r\n )}\r\n {this.botId === '45444431062634496' && (\r\n <button\r\n class={{\r\n 'cancel-button': true,\r\n 'disabled': this.isLoading,\r\n }}\r\n disabled={this.isLoading}\r\n onClick={() => this.closeResume?.()}\r\n title={this.strings?.resumeCreation}\r\n >\r\n {this.strings?.resumeCreation}\r\n </button>\r\n )}\r\n <textarea\r\n class=\"text-answer-input\"\r\n placeholder={this.isTaskCompleted ? this.strings.conversationEnded : this.strings.sendMessage}\r\n value={this.textAnswer}\r\n onInput={this.handleTextInputChange}\r\n onKeyDown={this.handleKeyDown}\r\n disabled={this.isTaskCompleted || this.isRecordingAudio || this.isConvertingAudio}\r\n ></textarea>\r\n <div class=\"input-toolbar\">\r\n <div class=\"toolbar-actions\">\r\n <button\r\n class={{\r\n 'toolbar-button': true,\r\n 'recording': this.isRecordingAudio,\r\n 'converting': this.isConvertingAudio,\r\n }}\r\n title={this.isRecordingAudio ? this.strings.clickToStopRecording : this.isConvertingAudio ? this.strings.recognizingSpeech : this.strings.voiceInput}\r\n onClick={this.handleVoiceInputClick}\r\n disabled={\r\n this.isTaskCompleted ||\r\n this.isConvertingAudio ||\r\n this.isSubmittingText ||\r\n this.isLoading ||\r\n !!this.currentStreamingMessage ||\r\n this.waitingToRecord ||\r\n this.isPlayingAudio\r\n }\r\n >\r\n {this.isRecordingAudio ? (\r\n <div>\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M12 14c1.66 0 3-1.34 3-3V5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3z\" />\r\n <path d=\"M17 11c0 2.76-2.24 5-5 5s-5-2.24-5-5H5c0 3.53 2.61 6.43 6 6.92V21h2v-3.08c3.39-.49 6-3.39 6-6.92h-2z\" />\r\n <circle cx=\"12\" cy=\"11\" r=\"4\" fill=\"red\" />\r\n </svg>\r\n {/* <span class=\"recording-time\">{this.audioRecordingTimeLeft}s</span> */}\r\n </div>\r\n ) : this.isConvertingAudio ? (\r\n <div class=\"converting-indicator\">\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M12 4V1L8 5l4 4V6c3.31 0 6 2.69 6 6 0 1.01-.25 1.97-.7 2.8l1.46 1.46C19.54 15.03 20 13.57 20 12c0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-1.01.25-1.97.7-2.8L5.24 7.74C4.46 8.97 4 10.43 4 12c0 4.42 3.58 8 8 8v3l4-4-4-4v3z\" />\r\n </svg>\r\n </div>\r\n ) : (\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M12 14c1.66 0 3-1.34 3-3V5c0-1.66-1.34-3-3-3S9 3.34 9 5v6c0 1.66 1.34 3 3 3z\" />\r\n <path d=\"M17 11c0 2.76-2.24 5-5 5s-5-2.24-5-5H5c0 3.53 2.61 6.43 6 6.92V21h2v-3.08c3.39-.49 6-3.39 6-6.92h-2z\" />\r\n </svg>\r\n )}\r\n </button>\r\n </div>\r\n <div\r\n class={{\r\n 'send-button': true,\r\n 'disabled':\r\n this.isTaskCompleted ||\r\n !this.textAnswer.trim() ||\r\n this.isSubmittingText ||\r\n this.isLoading ||\r\n !!this.currentStreamingMessage ||\r\n this.waitingToRecord ||\r\n this.isPlayingAudio ||\r\n this.isRecordingAudio ||\r\n this.isConvertingAudio,\r\n }}\r\n onClick={() => {\r\n if (\r\n this.isTaskCompleted ||\r\n !this.textAnswer.trim() ||\r\n this.isSubmittingText ||\r\n this.isLoading ||\r\n !!this.currentStreamingMessage ||\r\n this.waitingToRecord ||\r\n this.isPlayingAudio ||\r\n this.isRecordingAudio ||\r\n this.isConvertingAudio\r\n ) {\r\n return;\r\n }\r\n this.submitTextAnswer();\r\n }}\r\n >\r\n <img src=\"https://pcm-pub-1351162788.cos.ap-guangzhou.myqcloud.com/sdk/image/i_send.png\" />\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n\r\n // 确定要使用的助手头像\r\n const effectiveAssistantAvatar = this.assistantAvatar || this.agentLogo;\r\n\r\n return (\r\n <div class={overlayClass} style={modalStyle}>\r\n <div class={containerClass}>\r\n {this.isShowHeader && (\r\n <div class=\"modal-header\">\r\n <div class=\"header-left\">\r\n {this.icon && <img src={this.icon} class=\"header-icon\" />}\r\n <div>{this.modalTitle}</div>\r\n </div>\r\n {this.isNeedClose && (\r\n <button class=\"close-button\" onClick={this.handleClose}>\r\n <span>×</span>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n <div class=\"chat-container\">\r\n <div class=\"chat-history\" onScroll={this.handleScroll} onTouchStart={this.handleTouchStart} onTouchEnd={this.handleTouchEnd} onWheel={this.handleWheel}>\r\n {this.isLoadingHistory ? (\r\n <div class=\"loading-container\">\r\n <div class=\"loading-spinner\"></div>\r\n <p>{this.strings?.loading?.loadingHistory}</p>\r\n </div>\r\n ) : (\r\n <div>\r\n {/* 合并历史消息和流式消息统一渲染,避免组件闪烁 */}\r\n {[...this.messages, ...(this.currentStreamingMessage ? [this.currentStreamingMessage] : [])].map(message => (\r\n <div id={`message_${message.id}`} key={message.id}>\r\n <pcm-chat-message\r\n locale={this.locale}\r\n botId={this.botId}\r\n message={message}\r\n showAssistantMessage={!this.digitalId || !this.isLastMessage(message) || this.digitalHumanVideoReady || this.isTaskCompleted}\r\n userAvatar={this.userAvatar}\r\n assistantAvatar={effectiveAssistantAvatar}\r\n showCopyButton={this.showCopyButton}\r\n showFeedbackButtons={this.showFeedbackButtons}\r\n filePreviewMode={this.filePreviewMode}\r\n onFilePreviewRequest={this.handleFilePreviewRequest}\r\n showSaveJdButton={this.showSaveJdButton}\r\n saveJdButtonText={this.saveJdButtonText}\r\n ></pcm-chat-message>\r\n </div>\r\n ))}\r\n {this.messages.length === 0 && !this.currentStreamingMessage && (\r\n <div class=\"empty-state\">\r\n <p>{this.strings?.welcome?.greeting}</p>\r\n </div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n\r\n <div class=\"recording-section\">\r\n <div class=\"recording-container\">\r\n {/* 工作区 */}\r\n {(this.showWorkspaceHistory || this.digitalId || (this.showEndInterviewButton && !this.isTaskCompleted && this.conversationId)) && (\r\n <div class=\"workspace-section\">\r\n <div class=\"workspace-toolbar\">\r\n <div style={{ display: 'flex', gap: '8px' }}>\r\n {!this.isTaskCompleted && this.conversationId && this.showEndInterviewButton && (\r\n <button\r\n class=\"workspace-button end-interview-button\"\r\n onClick={this.handleInterviewEnd}\r\n disabled={this.isLoading || this.isEndingInterview}\r\n title={this.isEndingInterview ? this.strings?.endingInterview : this.strings?.endInterview}\r\n >\r\n <span>{this.isEndingInterview ? this.strings?.ending : this.strings?.endInterview}</span>\r\n </button>\r\n )}\r\n {this.showWorkspaceHistory && (\r\n <button class=\"workspace-button history-button\" onClick={() => this.handleHistoryClick()}>\r\n <span>{this.strings?.historyConversations}</span>\r\n </button>\r\n )}\r\n </div>\r\n {this.digitalId && !this.isTaskCompleted && (\r\n <div class=\"digital-human-wrapper\">\r\n <pcm-digital-human\r\n digitalId={this.digitalId}\r\n speechText={this.lastCompletedAnswer}\r\n isStreaming={!!this.currentStreamingMessage}\r\n playbackRate={this.playbackRate}\r\n onVideoGenerated={this.handleDigitalHumanVideoGenerated}\r\n onVideoEnded={this.handleDigitalHumanVideoEnded}\r\n onAvatarDetailLoaded={this.handleAvatarDetailLoaded}\r\n ></pcm-digital-human>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n {this.interviewMode === 'text' && renderTextInputArea()}\r\n {this.interviewMode === 'video' && (\r\n <div class=\"video-container\">\r\n <div class=\"video-area\">{this.showRecordingUI ? renderVideoPreview() : <div class=\"video-preview placeholder\">{renderPlaceholderStatus()}</div>}</div>\r\n <div class=\"recording-controls\">\r\n {this.showRecordingUI ? (\r\n <button class=\"stop-recording-button\" onClick={() => this.handleStopRecording()}>\r\n {this.strings?.buttons?.completeAnswer}\r\n </button>\r\n ) : (\r\n <div class=\"waiting-message\">\r\n <button class=\"stop-recording-button disabled\" disabled>\r\n {this.strings?.buttons?.completeAnswerShort}\r\n </button>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* 添加预览抽屉 */}\r\n <pcm-drawer\r\n isOpen={this.isDrawerOpen}\r\n drawerTitle={this.previewFileName}\r\n width=\"80%\"\r\n onClosed={() => {\r\n this.isDrawerOpen = false;\r\n this.previewUrl = '';\r\n this.previewContent = '';\r\n }}\r\n >\r\n {this.previewContentType === 'file' && this.previewUrl && (\r\n <div class=\"file-preview-container\">\r\n <iframe src={this.previewUrl} frameborder=\"0\" width=\"100%\" height=\"100%\" style={{ border: 'none', height: 'calc(100vh - 120px)' }}></iframe>\r\n </div>\r\n )}\r\n\r\n {this.previewContentType === 'markdown' && this.previewContent && <div class=\"markdown-preview-container markdown-body\" innerHTML={marked(this.previewContent)}></div>}\r\n\r\n {this.previewContentType === 'text' && this.previewContent && (\r\n <div class=\"text-preview-container\">\r\n <pre style={{ whiteSpace: 'pre-wrap', wordWrap: 'break-word' }}>{this.previewContent}</pre>\r\n </div>\r\n )}\r\n </pcm-drawer>\r\n\r\n {/* 历史会话抽屉 */}\r\n <pcm-drawer\r\n isOpen={this.isHistoryDrawerOpen}\r\n drawerTitle={this.strings?.historyConversations}\r\n width=\"400px\"\r\n onClosed={() => {\r\n this.isHistoryDrawerOpen = false;\r\n }}\r\n >\r\n <div class=\"history-drawer-content\">\r\n {/* 会话列表 */}\r\n <div class=\"conversation-list\">\r\n {this.isLoadingConversations ? (\r\n <div class=\"loading-conversations\">\r\n <div class=\"loading-spinner-small\"></div>\r\n <p>{this.strings.history.loading}</p>\r\n </div>\r\n ) : this.historyConversations.length === 0 ? (\r\n <div class=\"empty-conversations\">\r\n <p>{this.strings.history.noHistory}</p>\r\n </div>\r\n ) : (\r\n this.historyConversations.map(conversation => (\r\n <div\r\n key={conversation.id}\r\n class={{\r\n 'conversation-item': true,\r\n 'active': conversation.id === this.conversationId,\r\n }}\r\n onClick={() => this.handleSwitchConversation(conversation.id)}\r\n >\r\n <div class=\"conversation-info\">\r\n <div class=\"conversation-title\">{conversation.name}</div>\r\n <div class=\"conversation-meta\">\r\n <span class=\"conversation-time\">{conversation.timeDisplay}</span>\r\n {conversation.message_count > 0 && <span class=\"message-count\">{conversation.message_count}条消息</span>}\r\n {conversation.status && (\r\n <span\r\n class={{\r\n 'conversation-status': true,\r\n 'completed': conversation.status === '结束',\r\n 'running': conversation.status === '进行中',\r\n }}\r\n >\r\n {conversation.status}\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n {conversation.id === this.conversationId && (\r\n <div class=\"current-indicator\">\r\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"currentColor\">\r\n <path d=\"M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z\" />\r\n </svg>\r\n </div>\r\n )}\r\n </div>\r\n ))\r\n )}\r\n </div>\r\n </div>\r\n </pcm-drawer>\r\n\r\n {/* 二次确认模态框 */}\r\n <pcm-confirm-modal\r\n isOpen={this.showConfirmModal}\r\n modalTitle={this.strings?.confirmComplete}\r\n okText={this.strings?.confirmComplete}\r\n cancelText={this.strings?.continueRecording}\r\n okType=\"danger\"\r\n onOk={this.handleConfirmModalOk}\r\n onCancel={this.handleConfirmModalCancelEvent}\r\n onClosed={this.handleConfirmModalCancel}\r\n >\r\n <div style={{ marginBottom: '16px' }}>\r\n <div\r\n style={{\r\n fontSize: '14px',\r\n color: '#1890ff',\r\n fontWeight: '500',\r\n marginBottom: '16px',\r\n textAlign: 'center',\r\n }}\r\n >\r\n {this.strings.recording.currentRecordingTime}\r\n {(() => {\r\n // 计算实际的录制时长(秒)\r\n const elapsedSeconds = this.recordingStartTime > 0 ? Math.floor((Date.now() - this.recordingStartTime) / 1000) : 0;\r\n const minutes = Math.floor(elapsedSeconds / 60);\r\n const seconds = elapsedSeconds % 60;\r\n return `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\r\n })()}\r\n </div>\r\n\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n padding: '12px 16px',\r\n background: '#fff7e6',\r\n border: '1px solid #ffec99',\r\n borderRadius: '6px',\r\n color: '#d46b08',\r\n fontSize: '14px',\r\n marginBottom: '16px',\r\n }}\r\n >\r\n <svg viewBox=\"0 0 24 24\" width=\"20\" height=\"20\" fill=\"currentColor\">\r\n <path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\" />\r\n </svg>\r\n <span>{this.strings.recording.recordingStillInProgress}</span>\r\n </div>\r\n\r\n <div\r\n style={{\r\n fontSize: '16px',\r\n color: '#595959',\r\n lineHeight: '1.5',\r\n marginBottom: '16px',\r\n }}\r\n >\r\n {this.strings.clickConfirmCompleteToEnd}\r\n </div>\r\n\r\n <label\r\n style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '8px',\r\n cursor: 'pointer',\r\n padding: '8px 0',\r\n userSelect: 'none',\r\n }}\r\n >\r\n <input\r\n type=\"checkbox\"\r\n style={{\r\n width: '16px',\r\n height: '16px',\r\n accentColor: '#1890ff',\r\n cursor: 'pointer',\r\n margin: '0',\r\n }}\r\n checked={this.skipConfirmThisInterview}\r\n onChange={this.handleSkipConfirmChange}\r\n />\r\n <span\r\n style={{\r\n fontSize: '14px',\r\n color: '#595959',\r\n cursor: 'pointer',\r\n lineHeight: '1.4',\r\n }}\r\n >\r\n {this.strings.confirm.noReminderThisInterview}\r\n </span>\r\n </label>\r\n </div>\r\n </pcm-confirm-modal>\r\n\r\n {/* 结束面试确认模态框 */}\r\n <pcm-confirm-modal\r\n isOpen={this.showEndInterviewConfirmModal}\r\n modalTitle={this.strings?.confirmEnd}\r\n okText={this.strings?.confirmEnd}\r\n cancelText={this.strings?.cancel}\r\n okType=\"danger\"\r\n onOk={this.handleConfirmEndInterview}\r\n onCancel={this.handleCancelEndInterview}\r\n onClosed={this.handleCancelEndInterview}\r\n >\r\n <div style={{ marginBottom: '16px' }}>\r\n {(() => {\r\n const answeredCount = this.getAnsweredQuestionCount();\r\n return (\r\n <div>\r\n <div\r\n style={{\r\n fontSize: '14px',\r\n color: '#1890ff',\r\n fontWeight: '500',\r\n marginBottom: '16px',\r\n textAlign: 'center',\r\n }}\r\n >\r\n {this.strings.confirm.currentQuestion.replace('{count}', answeredCount.toString())}\r\n </div>\r\n\r\n {answeredCount < 3 && (\r\n <div\r\n style={{\r\n display: 'flex',\r\n alignItems: 'flex-start',\r\n gap: '8px',\r\n padding: '12px 16px',\r\n background: '#fff2e8',\r\n border: '1px solid #ffbb96',\r\n borderRadius: '6px',\r\n color: '#d4380d',\r\n fontSize: '14px',\r\n marginBottom: '16px',\r\n }}\r\n >\r\n <svg\r\n viewBox=\"0 0 24 24\"\r\n width=\"20\"\r\n height=\"20\"\r\n fill=\"currentColor\"\r\n style={{ flexShrink: '0', marginTop: '2px' }}\r\n >\r\n <path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\" />\r\n </svg>\r\n <span>\r\n <strong>{this.strings.confirm.fewQuestionsWarning}</strong>{this.strings.confirm.fewQuestionsWarningText}\r\n </span>\r\n </div>\r\n )}\r\n\r\n <div\r\n style={{\r\n fontSize: '14px',\r\n color: '#595959',\r\n lineHeight: '1.6',\r\n textAlign: 'center',\r\n }}\r\n >\r\n {this.strings.confirm.endInterviewConfirm}\r\n </div>\r\n </div>\r\n );\r\n })()}\r\n </div>\r\n </pcm-confirm-modal>\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
|