dsh-plugin-prompt-tool 0.7.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +185 -46
- package/engine/THIRD_PARTY_LICENSES +25 -0
- package/engine/actions.mjs +931 -0
- package/engine/anchor-match.mjs +6 -3
- package/engine/character-tools.mjs +11 -0
- package/engine/classify-task.mjs +18 -0
- package/engine/compaction-epoch.mjs +41 -20
- package/engine/compositions/library/agent-instructions.yml +9 -0
- package/engine/compositions/library/command-goal.yml +2 -6
- package/engine/compositions/library/compaction.yml +2 -32
- package/engine/compositions/library/delegation-ptc.yml +58 -0
- package/engine/compositions/library/delegation.yml +5 -38
- package/engine/compositions/library/persistent-shell.yml +4 -13
- package/engine/compositions/library/planning.yml +8 -23
- package/engine/compositions/library/skill-filesystem-cordis.yml +10 -0
- package/engine/compositions/library/skill-filesystem.yml +2 -8
- package/engine/compositions/library/tool-ask-user.yml +2 -3
- package/engine/compositions/library/tool-bash.yml +4 -12
- package/engine/compositions/library/tool-cordis.yml +7 -0
- package/engine/compositions/library/tool-fs-search.yml +2 -11
- package/engine/compositions/library/tool-fs.yml +2 -5
- package/engine/compositions/library/tool-goal.yml +2 -6
- package/engine/compositions/library/tool-jobs.yml +2 -18
- package/engine/compositions/library/tool-plugin-manager-disabled.yml +8 -0
- package/engine/compositions/library/tool-plugin-manager.yml +8 -0
- package/engine/compositions/library/tool-present.yml +7 -0
- package/engine/compositions/library/tool-presentation.yml +9 -0
- package/engine/compositions/library/tool-pwsh.yml +2 -6
- package/engine/compositions/library/tool-skill.yml +7 -0
- package/engine/compositions/library/tool-todo.yml +2 -4
- package/engine/compositions/library/tool-web.yml +2 -1
- package/engine/compositions/source/local/character-tools.yml +5 -0
- package/engine/compositions/source/local/declared-triggers.yml +12 -0
- package/engine/compositions/source/local/filesystem-editor.yml +30 -0
- package/engine/compositions/source/local/instruction-hint.yml +15 -0
- package/engine/compositions/{library/official-persistent-shell.yml → source/local/persistent-shell-posix.yml} +10 -8
- package/engine/compositions/source/local/prompt-config-engine.yml +3 -9
- package/engine/compositions/source/local/run-code-env.yml +4 -7
- package/engine/compositions/source/local/session-var-tools.yml +5 -0
- package/engine/compositions/source/local/skill-search.yml +3 -9
- package/engine/compositions/source/local/subagent-tool-policy.yml +21 -0
- package/engine/compositions/source/local/tool-bash-disabled.yml +9 -0
- package/engine/compositions/source/local/tool-config-engine.yml +8 -0
- package/engine/compositions/source/local/tool-git-bash.yml +15 -0
- package/engine/compositions/source/local/world-book-tools.yml +5 -0
- package/engine/condition.mjs +83 -0
- package/engine/declared-triggers.mjs +93 -0
- package/engine/executor.mjs +364 -185
- package/engine/fields.mjs +219 -0
- package/engine/fillers.mjs +12 -141
- package/engine/host-package.mjs +51 -0
- package/engine/instruction-hint.mjs +285 -0
- package/engine/interpolate.mjs +157 -29
- package/engine/layers.mjs +495 -75
- package/engine/predicates.mjs +753 -0
- package/engine/prompt-config-engine.mjs +63 -8
- package/engine/run-code-env.mjs +48 -31
- package/engine/schema.mjs +444 -103
- package/engine/sdk-strip.mjs +365 -0
- package/engine/session-var-tools.mjs +11 -0
- package/engine/session-vars.mjs +8 -6
- package/engine/shared.mjs +137 -0
- package/engine/skill-search.mjs +34 -21
- package/engine/st-macros.d.mts +22 -0
- package/engine/st-macros.mjs +208 -0
- package/engine/st-render.mjs +105 -0
- package/engine/st-world-book.d.mts +10 -0
- package/engine/st-world-book.mjs +259 -0
- package/engine/strategies.mjs +31 -20
- package/engine/subagent-tool-policy-core.mjs +400 -0
- package/engine/subagent-tool-policy.mjs +327 -0
- package/engine/tool-config-engine.mjs +207 -145
- package/engine/tool-definition.mjs +143 -0
- package/engine/{custom-bash.mjs → tool-git-bash.mjs} +38 -13
- package/engine/trigger-editor-meta.mjs +48 -0
- package/engine/trigger-spec.mjs +257 -0
- package/engine/trigger.mjs +304 -0
- package/engine/world-book-tools.mjs +11 -0
- package/lib/client.js +16495 -5456
- package/lib/client.js.map +1 -1
- package/lib/index.d.mts +628 -382
- package/lib/index.mjs +5391 -2942
- package/lib/paths-CY5psBqE.d.mts +1233 -0
- package/lib/preset-package-BnJqrU4R.mjs +16792 -0
- package/lib/preset-transfer.d.mts +2 -0
- package/lib/preset-transfer.mjs +2 -0
- package/package.json +91 -49
- package/preset/pt-cordis/preset.yml +43 -0
- package/preset/pt-cordis/skills/cordis-composition-reference/SKILL.md +29 -0
- package/preset/pt-cordis/skills/cordis-composition-reference/references/packages.md +501 -0
- package/preset/pt-cordis/skills/cordis-plugin-development/SKILL.md +38 -0
- package/preset/pt-cordis/skills/cordis-plugin-development/references/host-plugin.md +60 -0
- package/preset/pt-cordis/skills/cordis-plugin-development/references/mcp-bundle.md +5 -0
- package/preset/pt-cordis/skills/cordis-plugin-development/references/ui-plugin.md +13 -0
- package/preset/pt-cordis/skills/cordis-plugin-development/references/verification.md +5 -0
- package/preset/pt-cordis/skills/cordis-plugin-development/templates/decoration/client.js +22 -0
- package/preset/pt-cordis/skills/cordis-plugin-development/templates/decoration/cordis.patch.yml +3 -0
- package/preset/pt-cordis/skills/cordis-plugin-development/templates/decoration/index.js +2 -0
- package/preset/pt-cordis/skills/cordis-plugin-development/templates/decoration/package.json +15 -0
- package/preset/pt-cordis/skills/cordis-plugin-development/templates/mcp/cordis.patch.yml +8 -0
- package/preset/pt-cordis/skills/cordis-plugin-development/templates/mcp/package.json +7 -0
- package/preset/pt-cordis/skills/editing-cordis-compositions/SKILL.md +84 -0
- package/preset/pt-custom/preset.yml +15 -0
- package/preset/pt-minimal/preset.yml +27 -0
- package/preset/pt-ptc/preset.yml +45 -0
- package/preset/pt-standard/preset.yml +43 -0
- package/templates/14-first-turn-anchor.yml +4 -4
- package/templates/15-guide-auto.yml +3 -3
- package/templates/16-custom-fallback.yml +1 -0
- package/templates/18-placeholder-env-facts.yml +3 -3
- package/templates/20-system-section.yml +3 -2
- package/templates/65-turn-stop.yml +18 -0
- package/templates/66-subagent-start.yml +14 -0
- package/templates/75-subagent-end.yml +15 -0
- package/templates/tools/10-shell-command.yml +1 -1
- package/templates/tools/40-delegate-character.yml +1 -1
- package/templates/tools/50-delegate-worldbook.yml +1 -1
- package/templates/tools/60-delegate-session-var.yml +1 -1
- package/templates/tools/70-delegate-worldbook-upsert.yml +1 -1
- package/engine/anchor-turn.mjs +0 -68
- package/engine/code-presentation.mjs +0 -103
- package/engine/compositions/library/anchor-turn.yml +0 -10
- package/engine/compositions/library/bootstrap-filesystem.yml +0 -19
- package/engine/compositions/library/code-presentation.yml +0 -8
- package/engine/compositions/library/context-gate.yml +0 -39
- package/engine/compositions/library/cot-drip.yml +0 -11
- package/engine/compositions/library/custom-bash.yml +0 -14
- package/engine/compositions/library/deliberation-gate.yml +0 -11
- package/engine/compositions/library/official-agent-instructions.yml +0 -17
- package/engine/compositions/library/official-skill-filesystem-cordis.yml +0 -10
- package/engine/compositions/library/official-tool-bash.yml +0 -6
- package/engine/compositions/library/official-tool-cordis.yml +0 -13
- package/engine/compositions/library/official-tool-presentation.yml +0 -7
- package/engine/compositions/library/official-tool-skill.yml +0 -14
- package/engine/compositions/library/persona.yml +0 -13
- package/engine/compositions/library/prompt-config-engine.yml +0 -16
- package/engine/compositions/library/run-code-env.yml +0 -15
- package/engine/compositions/library/skill-search.yml +0 -14
- package/engine/compositions/library/str-replace-editor.yml +0 -10
- package/engine/compositions/library/tool-bootstrap.yml +0 -14
- package/engine/compositions/library/tool-config-engine.yml +0 -9
- package/engine/compositions/library/tool-filter.yml +0 -8
- package/engine/compositions/source/local/code-presentation.yml +0 -8
- package/engine/compositions/source/local/context-gate.yml +0 -36
- package/engine/compositions/source/local/custom-bash.yml +0 -11
- package/engine/compositions/source/local/str-replace-editor.yml +0 -10
- package/engine/compositions/source/local/tool-bootstrap.yml +0 -11
- package/engine/compositions/source/local/tool-filter.yml +0 -8
- package/engine/context-gate.mjs +0 -305
- package/engine/cot-drip.mjs +0 -137
- package/engine/deliberation-gate.mjs +0 -127
- package/engine/tool-bootstrap.mjs +0 -476
- package/engine/tool-filter.mjs +0 -80
- package/lib/preset-core.d.mts +0 -10
- package/lib/preset-core.mjs +0 -77
- package/lib/prompt-configs-BnQKRHVb.mjs +0 -884
- package/lib/prompt-configs-CN0sJTUL.d.mts +0 -193
- package/preset/anchored/preset.yml +0 -296
- package/preset/creative/preset.yml +0 -67
- package/preset/creative/skills/cordis-plugin-development/SKILL.md +0 -420
- package/preset/creative/skills/editing-cordis-compositions/SKILL.md +0 -165
- package/preset/custom/preset.yml +0 -12
- package/preset/liangshen/preset.yml +0 -75
- package/preset/minimal/preset.yml +0 -45
- package/preset/ptc/preset.yml +0 -58
- package/preset/standard/preset.yml +0 -57
- package/skills/manifest.json +0 -7
- package/skills/sandboxmod/SKILL.md +0 -49
- package/skills/web ui/SKILL.md +0 -42
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":["asRecord","record","useState","useRef","useCallback","useState","styles","useId","styles","isValidElement","cloneElement","useState","useMemo","memo","IconChevronDownOutline14","useState","useMemo","useRef","useCallback","styles","useRef","styles","useState","useState","styles","IconChevronDownOutline14","styles","useState","IconChevronDownOutline14","useState","useRef","styles","IconChevronDownOutline14","useSyncExternalStore","useRef","memo","useState","useRef","styles","IconCopyOutline16","IconFolderOpenOutline16","styles","useState","styles","IconChevronDownOutline14","ui","memo","ui","memo","useState","useRef","ui","IconFolderOpenOutline16","IconTrashOutline16","ui","memo","useState","useMemo","useCallback","ui","css","memo","useCallback","useState","useSyncExternalStore","useSyncExternalStore","css","useRef","createPortal","useCallback","useState","ui"],"sources":["../src/client/workspace-controller.ts","../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../src/client/tab-key.ts","../src/shared/bridge-contract.ts","../src/client/prompt-tool-bridge.ts","../src/client/prompt-tool-store.ts","../src/client/textarea-resize.ts","../src/client/TagInput.tsx","../src/client/PromptConfigCard.tsx","../src/client/PromptConfigList.tsx","../src/client/TemplatePicker.tsx","../src/client/useTemplatePicker.ts","../src/client/EngineModuleCards.tsx","../src/client/CustomToolsModuleCard.tsx","../src/client/PromptConfigsEditor.tsx","../src/client/use-prompt-tool-fields.ts","../src/client/PresetSwitcher.tsx","../src/client/ToggleRow.tsx","../src/client/CollapsibleCard.tsx","../src/client/SettingInputRow.tsx","../src/client/PresetsPage.tsx","../src/client/character-card.ts","../src/client/CharactersPage.tsx","../src/client/SkillsSettings.tsx","../src/client/PromptWorkspace.tsx","../src/client/slot-workbench.tsx","../src/client/index.ts"],"sourcesContent":["export interface PromptToolWorkspaceSnapshot {\n open: boolean\n}\n\n/** 侧边栏入口与中央列工作台共享的轻量开关状态。 */\nexport class PromptToolWorkspaceController {\n private snapshot: PromptToolWorkspaceSnapshot = { open: false }\n private readonly listeners = new Set<() => void>()\n\n getSnapshot = (): PromptToolWorkspaceSnapshot => this.snapshot\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener)\n return () => { this.listeners.delete(listener) }\n }\n\n open(): void { this.setOpen(true) }\n close(): void { this.setOpen(false) }\n toggle(): void { this.setOpen(!this.snapshot.open) }\n\n private setOpen(open: boolean): void {\n if (this.snapshot.open === open) return\n this.snapshot = { open }\n for (const listener of this.listeners) listener()\n }\n}\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","/** ARIA tabs 键盘导航:左右切换、Home/End 跳首尾(顶层页、技能筛选、内容资产 tab 共用)。 */\nimport type { KeyboardEvent as ReactKeyboardEvent } from 'react'\n\nexport function tabKeyHandler<T>(\n items: readonly T[],\n current: T,\n onSelect: (item: T) => void,\n): (event: ReactKeyboardEvent<HTMLElement>) => void {\n return (event) => {\n const index = items.indexOf(current)\n if (index < 0) return\n let next: number | undefined\n if (event.key === 'ArrowRight') next = (index + 1) % items.length\n else if (event.key === 'ArrowLeft') next = (index - 1 + items.length) % items.length\n else if (event.key === 'Home') next = 0\n else if (event.key === 'End') next = items.length - 1\n if (next === undefined) return\n event.preventDefault()\n onSelect(items[next]!)\n }\n}\n","/**\n * settings bridge 跨端契约(host 注册 / client 消费的唯一来源)。\n * 铁律:25 端点载荷统一成功 `{ ok: true, value }`、失败 `{ ok: false, code?, message? }`;\n * 端点附加字段只能以 value 旁的可选扩展字段出现(describe)。\n * 改路径或载荷形状必须同步更新 test/shared/bridge-contract.test.mjs。\n */\nexport const SETTINGS_BRIDGE_PREFIX = '/api/prompt-tool/settings'\n\n/** 桥端点路径(相对前缀)。新增端点必须同时登记到契约测试。 */\nexport const BRIDGE_ENDPOINTS = {\n meta: '/meta',\n bootstrap: '/bootstrap',\n describe: '/describe',\n models: '/models',\n mutate: '/mutate',\n configsValidate: '/configs-validate',\n skillFix: '/skill-fix',\n templates: '/templates',\n promptConfigs: '/prompt-configs',\n presetContent: '/preset-content',\n importPreset: '/import-preset',\n paramOverrides: '/param-overrides',\n presetVariables: '/preset-variables',\n customTools: '/custom-tools',\n importPresetPackage: '/import-preset-package',\n exportPreset: '/export-preset',\n presetDelete: '/preset-delete',\n presetClone: '/preset-clone',\n presetDuplicate: '/preset-duplicate',\n presetOpen: '/preset-open',\n charactersImport: '/characters-import',\n charactersList: '/characters-list',\n charactersDelete: '/characters-delete',\n charactersApply: '/characters-apply',\n charactersRemove: '/characters-remove',\n} as const\n\nexport type BridgeEndpoint = (typeof BRIDGE_ENDPOINTS)[keyof typeof BRIDGE_ENDPOINTS]\n\n/** 失败载荷:两端共用。 */\nexport type BridgeErrorPayload = { ok: false; code?: string; message?: string }\n","/** settings bridge 客户端传输与载荷解析层(无 react 依赖;UI 状态见 prompt-tool-store)。 */\nimport type { PromptConfigDraft, EngineMeta } from './prompt-tool-types.ts'\nimport type { EngineParamKey } from '../shared/engine-params.ts'\nimport { SETTINGS_BRIDGE_PREFIX, type BridgeErrorPayload } from '../shared/bridge-contract.ts'\n\nexport interface BridgeSettingsView { ns: string; value: unknown; base?: unknown; revision: number }\nexport type BridgeResult<T> = { ok: true; value: T; providers?: string[]; modelCatalog?: Record<string, string[]>; activeSkillsDirs?: string[]; skillCatalog?: SkillCatalogEntry[]; templatePreStepCount?: number; presetParams?: Record<string, unknown>; hostDefaultModel?: { provider?: string; model?: string; reasoningEffort?: string }; meta?: { meta: EngineMeta }; overrides?: { overrides: Record<string, unknown> }; variables?: { variables: Record<string, string>; enabled: boolean }; promptConfigs?: { promptConfigs: PromptConfigDraft[] } } | BridgeErrorPayload\n\n/** 宿主默认模型回显(agent-default-model settings:provider/model/reasoningEffort;插件参数未设置 = 继承宿主)。 */\nexport interface HostDefaultModel {\n provider?: string\n model?: string\n reasoningEffort?: string\n}\n\nexport interface SkillCatalogEntry {\n folder: string\n name: string\n description: string\n valid: boolean\n /** 来源技能目录绝对路径。 */\n dir?: string\n /** 同名标记:多目录存在相同 folder 时 UI 标注。 */\n duplicate?: boolean\n issue?: string\n modelInvocable: boolean\n userInvocable: boolean\n}\n\nexport interface Fields {\n promptText: string\n promptPath: string\n agentsText: string\n agentsPath: string\n injectAgentsPrompt: boolean\n firstTurnAnchor: boolean\n firstTurnText: string\n firstTurnCustom: boolean\n guideText: string\n guideCustom: boolean\n /** 每轮引导独立开关;undefined = 跟随 firstTurnAnchor。 */\n guideEnabled: boolean | undefined\n modelProvider: string\n modelName: string\n subagentModelProvider: string\n subagentModelName: string\n modelReasoningEffort: string\n modelTemperature: string\n modelMaxTokens: string\n subagentReasoningEffort: string\n subagentTemperature: string\n subagentMaxTokens: string\n toolFilterAllow: string\n toolFilterDeny: string\n /** 子代理也启用主对话工具过滤。 */\n toolFilterSubagents: boolean\n maxDepth: string\n allowKinds: string\n firstTurnWord: string\n bootstrapMaxTokens: number\n usePtcMode: boolean\n /** 门控晋升:首段 reasoning minimal-like + 工具调用才晋升(tool-bootstrap 参数桥)。 */\n promoteGate: boolean\n /** 无工具首响应 / 首轮 turn/end 即晋升。 */\n promoteAfterFirstResponse: boolean\n /** 门控回退步数上限(0 = 引擎默认 4)。 */\n maxPromoteSteps: number\n /** 首轮工具窄化集(逗号分隔;覆盖行默认)。 */\n bootstrapTools: string\n /** 压缩后恢复工具集(逗号分隔)。 */\n compactionTools: string\n /** 渐进披露阶段定义(UI 草稿形态:tools 逗号分隔字符串;非空 = 激活多级阶段窄化)。 */\n stages: StageDraft[]\n /** 预放档数(0 = 引擎默认 1)。 */\n stagePreUnlock: number\n /** 阶段推进工具名(空 = 默认 phase_advance)。 */\n stageAdvanceTool: string\n /** 阶段推进工具描述。 */\n stageAdvanceDescription: string\n /** 阶段状态 section 模板({{stage}}/{{stageName}}/{{unlocked}}/{{total}};空 = 不注入)。 */\n stageSectionTemplate: string\n /** phase-1 提示词段只留 persona。 */\n personaSectionsOnly: boolean\n /** 晋升后 persona 附加工作目录行。 */\n workspaceLine: boolean\n /** phase-1 persona 追加的首次调用指令行。 */\n phase1FirstCallInstruction: string\n /** 晋升后 agent-instructions 全文 → 一次性 hint(context-gate)。 */\n instructionHint: boolean\n /** context-gate phase-1 消息源白名单(逗号分隔;空 = 不启用)。 */\n messageSources: string\n /** 晋升后延迟注入的 source kind(逗号分隔)。 */\n deferredSources: string\n /** 延迟注入宽限步数(0 = 不延迟)。 */\n deferredGraceSteps: number\n /** 前置锚定轮(anchor-turn 行;需模块列表已挂行)。 */\n anchorTurn: boolean\n /** 前置锚定轮自定义锚定文本(空 = 引擎默认)。 */\n anchorTurnText: string\n /** 轨迹深度门(deliberation-gate 行;需模块列表已挂行)。 */\n deliberationGate: boolean\n /** 深思下限字符数(0 = 回落行默认 400)。 */\n deliberationMinChars: number\n /** 每轮最大门控次数(0 = 回落行默认 1)。 */\n deliberationMaxGatesPerTurn: number\n /** 深思维持节拍(cot-drip 行;需模块列表已挂行)。 */\n cotDrip: boolean\n /** 节拍间隔工具结果数(0 = 回落行默认 4)。 */\n cotDripEvery: number\n /** 每轮最大提醒条数(0 = 回落行默认 1)。 */\n cotDripMaxPerTurn: number\n /** str-replace-editor 最大输出字符数;16000 = 官方默认。 */\n strReplaceEditorMaxOutputChars: number\n injectPrompt: boolean\n skillSwitches: Record<string, boolean>\n skillOrder: string[]\n skillCatalog: SkillCatalogEntry[]\n /** 用户技能目录列表(按添加顺序);空 = 默认副本。 */\n skillsDirs: string[]\n /** 实际生效目录列表(空配置 = [默认副本路径])。 */\n activeSkillsDirs: string[]\n /** 生效目录存在性(path → 是否存在)。 */\n skillsDirExists: Record<string, boolean>\n skillRankBase: number\n residentAgentsPath: string\n presetDir: string\n presetOrder: number\n fallbackText: string\n writeAgents: boolean\n writePreset: boolean\n presetTemplate: string\n promptConfigs: PromptConfigDraft[]\n}\n\n/** 渐进披露阶段草稿(UI 编辑形态;persist 时转引擎形态 [{name, tools: string[]}])。 */\nexport interface StageDraft {\n name: string\n tools: string\n}\n\nexport const EMPTY_META: EngineMeta = {\n layers: [],\n strategies: [],\n slotKinds: [],\n positions: [],\n dedupes: [],\n promotions: [],\n audienceModes: [],\n modelScopes: [],\n roles: [],\n mergeModes: [],\n fills: [],\n layerFieldPolicies: {},\n layerLabels: {},\n}\nexport const EMPTY_FIELDS: Fields = {\n promptText: '',\n promptPath: '',\n agentsText: '',\n agentsPath: '',\n injectAgentsPrompt: false,\n firstTurnAnchor: false,\n firstTurnText: '',\n firstTurnCustom: false,\n guideText: '',\n guideCustom: false,\n guideEnabled: undefined,\n modelProvider: '',\n modelName: '',\n subagentModelProvider: '',\n subagentModelName: '',\n modelReasoningEffort: '',\n modelTemperature: '',\n modelMaxTokens: '',\n subagentReasoningEffort: '',\n subagentTemperature: '',\n subagentMaxTokens: '',\n toolFilterAllow: '',\n toolFilterDeny: '',\n toolFilterSubagents: false,\n maxDepth: '',\n allowKinds: '',\n firstTurnWord: '',\n bootstrapMaxTokens: 0,\n usePtcMode: false,\n stages: [],\n stagePreUnlock: 1,\n stageAdvanceTool: '',\n stageAdvanceDescription: '',\n stageSectionTemplate: '',\n promoteGate: false,\n promoteAfterFirstResponse: false,\n maxPromoteSteps: 0,\n bootstrapTools: '',\n compactionTools: '',\n personaSectionsOnly: false,\n workspaceLine: false,\n phase1FirstCallInstruction: '',\n instructionHint: false,\n messageSources: '',\n deferredSources: '',\n deferredGraceSteps: 0,\n anchorTurn: false,\n anchorTurnText: '',\n deliberationGate: false,\n deliberationMinChars: 0,\n deliberationMaxGatesPerTurn: 0,\n cotDrip: false,\n cotDripEvery: 0,\n cotDripMaxPerTurn: 0,\n strReplaceEditorMaxOutputChars: 16000,\n injectPrompt: true,\n skillSwitches: {},\n skillOrder: [],\n skillCatalog: [],\n skillsDirs: [],\n activeSkillsDirs: [],\n skillsDirExists: {},\n skillRankBase: 250,\n residentAgentsPath: '',\n presetDir: '',\n presetOrder: 5,\n fallbackText: '',\n writeAgents: true,\n writePreset: true,\n presetTemplate: 'anchored',\n promptConfigs: [],\n}\n\nconst asRecord = (value: unknown): Record<string, unknown> =>\n value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {}\n\nconst readString = (source: Record<string, unknown>, key: string): string | undefined => {\n const value = source[key]\n return typeof value === 'string' ? value : undefined\n}\n\nconst readStringArray = (source: Record<string, unknown>, key: string): string[] => {\n const value = source[key]\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === 'string') : []\n}\n\nconst readBoolean = (source: Record<string, unknown>, key: string, fallback: boolean): boolean => {\n const value = source[key]\n return typeof value === 'boolean' ? value : fallback\n}\n\nconst readNumber = (source: Record<string, unknown>, key: string, fallback: number): number => {\n const value = source[key]\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 ? value : fallback\n}\n\nconst readSkillSwitches = (source: Record<string, unknown>, key: string): Record<string, boolean> => {\n const value = source[key]\n if (value === null || typeof value !== 'object') return {}\n const entries = Object.entries(value as Record<string, unknown>)\n const result: Record<string, boolean> = {}\n for (const [name, enabled] of entries) {\n if (typeof enabled === 'boolean') result[name] = enabled\n }\n return result\n}\n\nconst readSkillCatalog = (source: Record<string, unknown>, key: string): SkillCatalogEntry[] => {\n const value = source[key]\n if (!Array.isArray(value)) return []\n return value.flatMap((entry) => {\n if (entry === null || typeof entry !== 'object') return []\n const record = entry as Record<string, unknown>\n const folder = readString(record, 'folder')\n const name = readString(record, 'name')\n if (folder === undefined || name === undefined) return []\n return [{\n folder,\n name,\n description: readString(record, 'description') ?? '',\n // 向后兼容旧宿主:旧版 /describe 只返回 folder/name/description(且旧扫描\n // 已过滤非法名),缺字段按旧语义默认 true;新版宿主显式携带 valid=false。\n valid: readBoolean(record, 'valid', true),\n ...(typeof record.dir === 'string' && record.dir.length > 0 ? { dir: record.dir } : {}),\n ...(record.duplicate === true ? { duplicate: true } : {}),\n ...(typeof record.issue === 'string' && record.issue.length > 0 ? { issue: record.issue } : {}),\n modelInvocable: readBoolean(record, 'modelInvocable', true),\n userInvocable: readBoolean(record, 'userInvocable', true),\n }]\n })\n}\n\nconst readPromptConfigs = (source: Record<string, unknown>, key: string): PromptConfigDraft[] => {\n const value = source[key]\n if (!Array.isArray(value)) return []\n return value.flatMap((entry) => {\n if (entry === null || typeof entry !== 'object') return []\n const record = entry as Record<string, unknown>\n return typeof record.id === 'string' && record.id.length > 0 ? [entry as PromptConfigDraft] : []\n })\n}\n\nexport const errorMessage = (error: unknown): string => error instanceof Error ? error.message : String(error)\n\nconst isBridgeResultPayload = (payload: unknown): payload is BridgeResult<unknown> => {\n if (payload === null || typeof payload !== 'object' || Array.isArray(payload)) return false\n const record = payload as Record<string, unknown>\n if (typeof record.ok !== 'boolean') return false\n return !record.ok || 'value' in record\n}\n\nexport async function bridgePost<T>(path: string, body: unknown): Promise<BridgeResult<T>> {\n try {\n const response = await fetch(SETTINGS_BRIDGE_PREFIX + path, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body),\n })\n const payload = await response.json() as unknown\n if (isBridgeResultPayload(payload)) return payload as BridgeResult<T>\n return { ok: false, message: `invalid settings bridge payload (HTTP ${response.status})` }\n } catch (error) {\n return { ok: false, message: errorMessage(error) }\n }\n}\n\nexport function fieldsFromView(res: BridgeResult<BridgeSettingsView>): Fields {\n const ns = res.ok ? res.value : undefined\n const value = asRecord(ns?.value)\n const base = asRecord(ns?.base)\n const next: Fields = {\n promptText: readString(value, 'promptText') ?? readString(base, 'promptText') ?? '',\n promptPath: readString(value, 'promptPath') ?? readString(base, 'promptPath') ?? '',\n agentsText: readString(value, 'agentsText') ?? readString(base, 'agentsText') ?? '',\n agentsPath: readString(value, 'agentsPath') ?? readString(base, 'agentsPath') ?? '',\n injectAgentsPrompt: readBoolean(value, 'injectAgentsPrompt', readBoolean(base, 'injectAgentsPrompt', false)),\n firstTurnAnchor: readBoolean(value, 'firstTurnAnchor', readBoolean(base, 'firstTurnAnchor', false)),\n firstTurnText: readString(value, 'firstTurnText') ?? readString(base, 'firstTurnText') ?? '',\n firstTurnCustom: readBoolean(value, 'firstTurnCustom', readBoolean(base, 'firstTurnCustom', false)),\n guideText: readString(value, 'guideText') ?? readString(base, 'guideText') ?? '',\n guideCustom: readBoolean(value, 'guideCustom', readBoolean(base, 'guideCustom', false)),\n guideEnabled: typeof value.guideEnabled === 'boolean' ? value.guideEnabled\n : typeof base.guideEnabled === 'boolean' ? base.guideEnabled\n : undefined,\n modelProvider: readString(value, 'modelProvider') ?? readString(base, 'modelProvider') ?? '',\n modelName: readString(value, 'modelName') ?? readString(base, 'modelName') ?? '',\n subagentModelProvider: readString(value, 'subagentModelProvider') ?? readString(base, 'subagentModelProvider') ?? '',\n subagentModelName: readString(value, 'subagentModelName') ?? readString(base, 'subagentModelName') ?? '',\n modelReasoningEffort: readString(value, 'modelReasoningEffort') ?? readString(base, 'modelReasoningEffort') ?? '',\n modelTemperature: readString(value, 'modelTemperature') ?? readString(base, 'modelTemperature') ?? '',\n modelMaxTokens: readString(value, 'modelMaxTokens') ?? readString(base, 'modelMaxTokens') ?? '',\n subagentReasoningEffort: readString(value, 'subagentReasoningEffort') ?? readString(base, 'subagentReasoningEffort') ?? '',\n subagentTemperature: readString(value, 'subagentTemperature') ?? readString(base, 'subagentTemperature') ?? '',\n subagentMaxTokens: readString(value, 'subagentMaxTokens') ?? readString(base, 'subagentMaxTokens') ?? '',\n // 预设级参数(toolFilterAllow/toolFilterDeny/maxDepth/allowKinds/firstTurnWord)\n // 不进 settings namespace:默认空,由 /param-overrides 读回后填充(store.load paramPatch)。\n toolFilterAllow: '',\n toolFilterDeny: '',\n toolFilterSubagents: false,\n maxDepth: '',\n allowKinds: '',\n firstTurnWord: '',\n bootstrapMaxTokens: readNumber(value, 'bootstrapMaxTokens', readNumber(base, 'bootstrapMaxTokens', 0)),\n usePtcMode: readBoolean(value, 'usePtcMode', readBoolean(base, 'usePtcMode', false)),\n // 渐进披露(stages 模式):预设级参数,由 /param-overrides 读回后填充。\n stages: [],\n stagePreUnlock: 1,\n stageAdvanceTool: '',\n stageAdvanceDescription: '',\n stageSectionTemplate: '',\n // 晋升门控(tool-bootstrap 参数桥):预设级参数,由 /param-overrides + presetParams 填充。\n promoteGate: false,\n promoteAfterFirstResponse: false,\n maxPromoteSteps: 0,\n bootstrapTools: '',\n compactionTools: '',\n personaSectionsOnly: false,\n workspaceLine: false,\n phase1FirstCallInstruction: '',\n instructionHint: false,\n // context-gate 注入门控(预设级参数,由 /param-overrides 填充)。\n messageSources: '',\n deferredSources: '',\n deferredGraceSteps: 0,\n // 锚定/深思可选模块(anchor-turn / deliberation-gate / cot-drip 参数桥)。\n anchorTurn: readBoolean(value, 'anchorTurn', readBoolean(base, 'anchorTurn', false)),\n anchorTurnText: readString(value, 'anchorTurnText') ?? readString(base, 'anchorTurnText') ?? '',\n deliberationGate: readBoolean(value, 'deliberationGate', readBoolean(base, 'deliberationGate', false)),\n deliberationMinChars: readNumber(value, 'deliberationMinChars', readNumber(base, 'deliberationMinChars', 0)),\n deliberationMaxGatesPerTurn: readNumber(value, 'deliberationMaxGatesPerTurn', readNumber(base, 'deliberationMaxGatesPerTurn', 0)),\n cotDrip: readBoolean(value, 'cotDrip', readBoolean(base, 'cotDrip', false)),\n cotDripEvery: readNumber(value, 'cotDripEvery', readNumber(base, 'cotDripEvery', 0)),\n cotDripMaxPerTurn: readNumber(value, 'cotDripMaxPerTurn', readNumber(base, 'cotDripMaxPerTurn', 0)),\n strReplaceEditorMaxOutputChars: readNumber(value, 'strReplaceEditorMaxOutputChars',\n readNumber(base, 'strReplaceEditorMaxOutputChars', 16000)),\n injectPrompt: readBoolean(value, 'injectPrompt', readBoolean(base, 'injectPrompt', true)),\n skillSwitches: value.skillSwitches !== undefined || base.skillSwitches !== undefined\n ? { ...readSkillSwitches(base, 'skillSwitches'), ...readSkillSwitches(value, 'skillSwitches') }\n : {},\n skillOrder: readStringArray(value, 'skillOrder').length > 0\n ? readStringArray(value, 'skillOrder')\n : readStringArray(base, 'skillOrder'),\n skillCatalog: res.ok && res.skillCatalog !== undefined && res.skillCatalog.length > 0\n ? res.skillCatalog\n : readSkillCatalog(value, 'skillCatalog').length > 0\n ? readSkillCatalog(value, 'skillCatalog')\n : readSkillCatalog(base, 'skillCatalog'),\n skillsDirs: readStringArray(value, 'skillsDirs').length > 0\n ? readStringArray(value, 'skillsDirs')\n : readStringArray(base, 'skillsDirs'),\n activeSkillsDirs: readStringArray(value, 'activeSkillsDirs').length > 0\n ? readStringArray(value, 'activeSkillsDirs')\n : readStringArray(base, 'activeSkillsDirs'),\n skillsDirExists: (() => {\n const merged: Record<string, boolean> = {}\n for (const entry of [value, base]) {\n const record = entry\n const exists = record.skillsDirExists\n if (exists !== null && typeof exists === 'object' && !Array.isArray(exists)) {\n Object.assign(merged, exists as Record<string, unknown>)\n }\n }\n const result: Record<string, boolean> = {}\n for (const [path, ok] of Object.entries(merged)) {\n if (typeof ok === 'boolean') result[path] = ok\n }\n return result\n })(),\n skillRankBase: readNumber(value, 'skillRankBase', readNumber(base, 'skillRankBase', 250)),\n residentAgentsPath: readString(value, 'residentAgentsPath') ?? readString(base, 'residentAgentsPath') ?? '',\n presetDir: readString(value, 'presetDir') ?? readString(base, 'presetDir') ?? '',\n presetOrder: readNumber(value, 'presetOrder', readNumber(base, 'presetOrder', 5)),\n fallbackText: readString(value, 'fallbackText') ?? readString(base, 'fallbackText') ?? '',\n writeAgents: readBoolean(value, 'writeAgents', readBoolean(base, 'writeAgents', true)),\n writePreset: readBoolean(value, 'writePreset', readBoolean(base, 'writePreset', true)),\n presetTemplate: readString(value, 'presetTemplate') ?? readString(base, 'presetTemplate') ?? 'anchored',\n promptConfigs: value.promptConfigs !== undefined\n ? readPromptConfigs(value, 'promptConfigs')\n : readPromptConfigs(base, 'promptConfigs'),\n }\n return next\n}\n\n/** 编译期契约:所有引擎参数键都必须进入 Fields,防止 host 契约新增键后 client 静默丢弃。 */\ntype MissingEngineParamKeys = Exclude<EngineParamKey, keyof Fields>\nconst _assertEngineParamsInFields: MissingEngineParamKeys[] = []\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { SettingsPathOpView } from '@deepseek-ai/dsh-api-remotes/client'\nimport type { SettingsScope, SettingsScopeSnapshot } from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type { EngineMeta, PromptConfigDraft, PromptToolHostApi } from './prompt-tool-types.ts'\nimport {\n EMPTY_FIELDS,\n EMPTY_META,\n bridgePost,\n errorMessage,\n fieldsFromView,\n type BridgeResult,\n type BridgeSettingsView,\n type Fields,\n type HostDefaultModel,\n type StageDraft,\n} from './prompt-tool-bridge.ts'\n\n/** rc8 ui-settings 共享镜像传输面:标准字段经官方 settingsScope 读写。 */\nexport interface PromptToolSettingsTransport {\n /** 宿主注册的 prompt-tool settings namespace 绑定。 */\n scope: SettingsScope<Record<string, unknown>>\n /** 触发一次共享 describe mirror 读取(idle 时才真正发 RPC)。 */\n ensure: () => Promise<void>\n /** 批量 path-op 写入;成功后 scope 快照已 fold 最新 revision。 */\n mutate: (ops: SettingsPathOpView[], expectedRevision?: number) => Promise<void>\n}\n\nexport interface SwitchSnapshot {\n injectAgentsPrompt: boolean\n firstTurnAnchor: boolean\n firstTurnText: string\n firstTurnCustom: boolean\n guideText: string\n guideCustom: boolean\n guideEnabled: boolean | undefined\n modelProvider: string\n modelName: string\n subagentModelProvider: string\n subagentModelName: string\n modelReasoningEffort: string\n modelTemperature: string\n modelMaxTokens: string\n subagentReasoningEffort: string\n subagentTemperature: string\n subagentMaxTokens: string\n bootstrapMaxTokens: number\n usePtcMode: boolean\n stages: StageDraft[]\n stagePreUnlock: number\n stageAdvanceTool: string\n stageAdvanceDescription: string\n stageSectionTemplate: string\n promoteGate: boolean\n promoteAfterFirstResponse: boolean\n maxPromoteSteps: number\n bootstrapTools: string\n compactionTools: string\n personaSectionsOnly: boolean\n workspaceLine: boolean\n phase1FirstCallInstruction: string\n instructionHint: boolean\n messageSources: string\n deferredSources: string\n deferredGraceSteps: number\n anchorTurn: boolean\n anchorTurnText: string\n deliberationGate: boolean\n deliberationMinChars: number\n deliberationMaxGatesPerTurn: number\n cotDrip: boolean\n cotDripEvery: number\n cotDripMaxPerTurn: number\n strReplaceEditorMaxOutputChars: number\n injectPrompt: boolean\n skillSwitches: Record<string, boolean>\n skillOrder: string[]\n skillsDirs: string[]\n skillRankBase: number\n residentAgentsPath: string\n presetDir: string\n presetOrder: number\n fallbackText: string\n writeAgents: boolean\n writePreset: boolean\n}\n\nconst EMPTY_SWITCHES: SwitchSnapshot = {\n injectAgentsPrompt: false,\n firstTurnAnchor: false,\n firstTurnText: '',\n firstTurnCustom: false,\n guideText: '',\n guideCustom: false,\n guideEnabled: undefined,\n modelProvider: '',\n modelName: '',\n subagentModelProvider: '',\n subagentModelName: '',\n modelReasoningEffort: '',\n modelTemperature: '',\n modelMaxTokens: '',\n subagentReasoningEffort: '',\n subagentTemperature: '',\n subagentMaxTokens: '',\n bootstrapMaxTokens: 0,\n usePtcMode: false,\n stages: [],\n stagePreUnlock: 1,\n stageAdvanceTool: '',\n stageAdvanceDescription: '',\n stageSectionTemplate: '',\n promoteGate: false,\n promoteAfterFirstResponse: false,\n maxPromoteSteps: 0,\n bootstrapTools: '',\n compactionTools: '',\n personaSectionsOnly: false,\n workspaceLine: false,\n phase1FirstCallInstruction: '',\n instructionHint: false,\n messageSources: '',\n deferredSources: '',\n deferredGraceSteps: 0,\n anchorTurn: false,\n anchorTurnText: '',\n deliberationGate: false,\n deliberationMinChars: 0,\n deliberationMaxGatesPerTurn: 0,\n cotDrip: false,\n cotDripEvery: 0,\n cotDripMaxPerTurn: 0,\n strReplaceEditorMaxOutputChars: 16000,\n injectPrompt: true,\n skillSwitches: {},\n skillOrder: [],\n skillsDirs: [],\n skillRankBase: 250,\n residentAgentsPath: '',\n presetDir: '',\n presetOrder: 5,\n fallbackText: '',\n writeAgents: true,\n writePreset: true,\n}\n\n/** 本项目默认不设上限时的显示值(adapter 默认 maxTokens)。 */\nconst DEFAULT_BOOTSTRAP_DISPLAY = '256000'\n\n/** 内容资产条目:preset.md(prompt-injector)/ agents.md(instruction-hint),\n * text 走生成目录文件通道,settings 覆盖层只存轻字段。 */\nconst isContentAsset = (config: PromptConfigDraft): boolean =>\n config.id === 'prompt-injector' || config.fill === 'instruction-hint'\n\n/**\n * promptConfigs 脏检测:引用比较为主,但两个空数组内容相同必须判「不脏」。\n * store 初始化时 fields=EMPTY_FIELDS.promptConfigs(模块级常量 [])而\n * savedConfigs 是 useState([]) 新字面量,引用不同——纯引用比较会误判脏,\n * 挂载 800ms 后把空数组自动保存进 preset.yml,清空大预设的全部配置卡。\n */\nconst promptConfigsDirty = (current: PromptConfigDraft[], saved: PromptConfigDraft[]): boolean =>\n current !== saved && !(current.length === 0 && saved.length === 0)\n\n/** 剥离内容资产的 text(顶层 + params.text):settings 载荷不承载大文本。 */\nconst stripContentText = (config: PromptConfigDraft): PromptConfigDraft => {\n const next: PromptConfigDraft = { ...config }\n delete next.text\n if (next.params !== undefined) {\n const params = { ...next.params }\n delete params.text\n next.params = params\n }\n return next\n}\n\n/** 渲染产物 → 编辑草稿:内容资产条目的 params.text(生成目录文件内容)提升到 text 框显示。 */\nconst liftContentText = (config: PromptConfigDraft): PromptConfigDraft => {\n if (!isContentAsset(config)) return config\n if ((config.text ?? '') !== '') return config\n const text = typeof config.params?.text === 'string' ? config.params.text : ''\n return text.length > 0 ? { ...config, text } : config\n}\n\nexport const snapshotSwitches = (fields: Fields): SwitchSnapshot => ({\n injectAgentsPrompt: fields.injectAgentsPrompt,\n firstTurnAnchor: fields.firstTurnAnchor,\n firstTurnText: fields.firstTurnText,\n firstTurnCustom: fields.firstTurnCustom,\n guideText: fields.guideText,\n guideCustom: fields.guideCustom,\n guideEnabled: fields.guideEnabled,\n modelProvider: fields.modelProvider,\n modelName: fields.modelName,\n subagentModelProvider: fields.subagentModelProvider,\n subagentModelName: fields.subagentModelName,\n modelReasoningEffort: fields.modelReasoningEffort,\n modelTemperature: fields.modelTemperature,\n modelMaxTokens: fields.modelMaxTokens,\n subagentReasoningEffort: fields.subagentReasoningEffort,\n subagentTemperature: fields.subagentTemperature,\n subagentMaxTokens: fields.subagentMaxTokens,\n bootstrapMaxTokens: fields.bootstrapMaxTokens,\n usePtcMode: fields.usePtcMode,\n stages: fields.stages.map((stage) => ({ ...stage })),\n stagePreUnlock: fields.stagePreUnlock,\n stageAdvanceTool: fields.stageAdvanceTool,\n stageAdvanceDescription: fields.stageAdvanceDescription,\n stageSectionTemplate: fields.stageSectionTemplate,\n promoteGate: fields.promoteGate,\n promoteAfterFirstResponse: fields.promoteAfterFirstResponse,\n maxPromoteSteps: fields.maxPromoteSteps,\n bootstrapTools: fields.bootstrapTools,\n compactionTools: fields.compactionTools,\n personaSectionsOnly: fields.personaSectionsOnly,\n workspaceLine: fields.workspaceLine,\n phase1FirstCallInstruction: fields.phase1FirstCallInstruction,\n instructionHint: fields.instructionHint,\n messageSources: fields.messageSources,\n deferredSources: fields.deferredSources,\n deferredGraceSteps: fields.deferredGraceSteps,\n anchorTurn: fields.anchorTurn,\n anchorTurnText: fields.anchorTurnText,\n deliberationGate: fields.deliberationGate,\n deliberationMinChars: fields.deliberationMinChars,\n deliberationMaxGatesPerTurn: fields.deliberationMaxGatesPerTurn,\n cotDrip: fields.cotDrip,\n cotDripEvery: fields.cotDripEvery,\n cotDripMaxPerTurn: fields.cotDripMaxPerTurn,\n strReplaceEditorMaxOutputChars: fields.strReplaceEditorMaxOutputChars,\n injectPrompt: fields.injectPrompt,\n skillSwitches: { ...fields.skillSwitches },\n skillOrder: [...fields.skillOrder],\n skillsDirs: [...fields.skillsDirs],\n skillRankBase: fields.skillRankBase,\n residentAgentsPath: fields.residentAgentsPath,\n presetDir: fields.presetDir,\n presetOrder: fields.presetOrder,\n fallbackText: fields.fallbackText,\n writeAgents: fields.writeAgents,\n writePreset: fields.writePreset,\n})\n\nconst isPlainRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === 'object' && !Array.isArray(value)\n\n/** 深比较 snapshot 内的数组/record;不使用 JSON.stringify,避免键顺序影响脏检测。 */\nconst deepEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) return true\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false\n return a.every((item, index) => deepEqual(item, b[index]))\n }\n if (isPlainRecord(a) || isPlainRecord(b)) {\n if (!isPlainRecord(a) || !isPlainRecord(b)) return false\n const keys = new Set([...Object.keys(a), ...Object.keys(b)])\n for (const key of keys) {\n if (!deepEqual(a[key], b[key])) return false\n }\n return true\n }\n return false\n}\n\n/** 全字段结构化比较:SwitchSnapshot 声明的每个键都参与,防止新增参数漏比较。 */\nconst switchesEqual = (a: SwitchSnapshot, b: SwitchSnapshot): boolean => {\n const keys = new Set([...Object.keys(a), ...Object.keys(b)])\n for (const key of keys) {\n if (!deepEqual(a[key as keyof SwitchSnapshot], b[key as keyof SwitchSnapshot])) return false\n }\n return true\n}\n\nexport type SwitchKey = 'injectAgentsPrompt' | 'firstTurnAnchor' | 'firstTurnCustom' | 'guideCustom' | 'toolFilterSubagents' | 'injectPrompt' | 'usePtcMode' | 'promoteGate' | 'promoteAfterFirstResponse' | 'personaSectionsOnly' | 'workspaceLine' | 'instructionHint' | 'anchorTurn' | 'deliberationGate' | 'cotDrip' | 'writeAgents' | 'writePreset'\n\n/** 参数类布尔开关:写激活预设 preset.yml(settings 只留全局开关)。 */\nconst PARAM_SWITCH_KEYS: ReadonlySet<SwitchKey> = new Set(['firstTurnAnchor', 'firstTurnCustom', 'guideCustom', 'toolFilterSubagents', 'injectPrompt', 'usePtcMode', 'promoteGate', 'promoteAfterFirstResponse', 'personaSectionsOnly', 'workspaceLine', 'instructionHint', 'anchorTurn', 'deliberationGate', 'cotDrip'])\n\nexport interface PromptToolStore {\n fields: Fields\n /** fields 外部订阅通道(usePromptToolFields):patch/load 变更后通知。\n * getFields 返回引用稳定快照,selector 化的组件据此跳过无关重渲染。 */\n getFields: () => Fields\n subscribeFields: (listener: () => void) => () => void\n meta: EngineMeta\n loading: boolean\n providers: string[]\n modelCatalog: Record<string, string[]>\n hostDefaultModel?: HostDefaultModel\n bootstrapTokensDraft: string\n /** 新技能目录路径输入(多目录卡片:输入路径添加)。 */\n skillsDirDraft: string\n /** 当前预设模板消息批层(pre-step)配置数;0 = 模板无配置(入口开关联动关闭)。 */\n templatePreStepCount: number\n savedSwitches: SwitchSnapshot\n savedConfigs: PromptConfigDraft[]\n savingSkillsDir: boolean\n fixingSkill: string | undefined\n notice: string\n noticeKind: 'ok' | 'error'\n load: () => Promise<Fields>\n showNotice: (kind: 'ok' | 'error', message: string) => void\n patch: (partial: Partial<Fields>) => void\n persistSwitches: () => void\n persistParamOverrides: () => Promise<void>\n persistConfigs: (configs: PromptConfigDraft[]) => void\n /** 预设级模板变量(preset.yml 内容变量;writePreset 展开进 variables.yml,引擎合并进每条配置)。 */\n templateVariables: Record<string, string>\n setTemplateVariables: (value: Record<string, string>) => void\n /** 模板变量插值开关(preset.yml 顶层 variablesEnabled,缺省 true)。 */\n templateVariablesEnabled: boolean\n setTemplateVariablesEnabled: (value: boolean) => void\n /** 保存模板变量;可显式传入下一份值(如清空场景,避免 setState 未生效时的旧闭包)。 */\n saveTemplateVariables: (next?: Record<string, string>) => Promise<void>\n toggle: (key: SwitchKey) => void\n toggleBootstrapMaxTokens: () => void\n setPresetTemplate: (id: string) => void\n setBootstrapTokensDraft: (value: string) => void\n commitBootstrapTokensDraft: () => void\n /** 门控回退步数草稿(数字输入,失焦提交;0 = 引擎默认 4)。 */\n gateStepsDraft: string\n setGateStepsDraft: (value: string) => void\n commitGateStepsDraft: () => void\n setSkillsDirDraft: (value: string) => void\n /** 追加技能目录(按添加顺序;重复路径拒绝)。 */\n addSkillsDir: (dir: string) => void\n /** 移除技能目录引用(只删引用,不删原文件)。 */\n removeSkillsDir: (dir: string) => void\n toggleSkill: (folder: string) => void\n skillEnabled: (folder: string) => boolean\n fixSkill: (folder: string) => void\n /** 打开指定技能目录;不传 = 打开第一个生效目录。 */\n openSkillsDir: (path?: string) => Promise<void>\n dirtySwitches: boolean\n dirtyConfigs: boolean\n dirty: boolean\n}\n\n\n/** 等待共享 mirror 的首次应答离开 loading(ready/idle/unavailable 都会返回)。 */\nfunction waitForScope(scope: SettingsScope<Record<string, unknown>>): Promise<SettingsScopeSnapshot<Record<string, unknown>>> {\n const current = scope.getSnapshot()\n if (current.status !== 'loading') return Promise.resolve(current)\n return new Promise((resolve) => {\n let settled = false\n const dispose = scope.subscribe(() => {\n const next = scope.getSnapshot()\n if (next.status === 'loading') return\n if (settled) return\n settled = true\n dispose()\n resolve(next)\n })\n // 宿主 mirror 卡 loading 时兜底超时,避免 UI 永久 loading。\n setTimeout(() => {\n if (settled) return\n settled = true\n dispose()\n resolve(scope.getSnapshot())\n }, 5000)\n })\n}\n\n/** 把 /bootstrap 响应(value=服务端 settings descriptor)直接组装成旧 BridgeResult 视图。\n * 不再走 rc8 共享 mirror:宿主全量 describe 在插件多时是秒级 RPC,切换预设后\n * settings.ensure() 会让配置卡延迟十几秒出现;/bootstrap 已携带同源 descriptor。 */\nfunction bridgeViewFromBoot(boot: BridgeResult<BridgeSettingsView>): BridgeResult<BridgeSettingsView> {\n if (!boot.ok) return boot\n return {\n ok: true,\n value: {\n ns: 'prompt-tool',\n value: boot.value.value,\n base: boot.value.base,\n revision: boot.value.revision,\n },\n providers: boot.providers,\n modelCatalog: boot.modelCatalog,\n activeSkillsDirs: boot.activeSkillsDirs,\n skillCatalog: boot.skillCatalog,\n templatePreStepCount: boot.templatePreStepCount,\n presetParams: boot.presetParams,\n hostDefaultModel: boot.hostDefaultModel,\n }\n}\n\nexport function usePromptToolStore(api: PromptToolHostApi, settings: PromptToolSettingsTransport): PromptToolStore {\n const [providers, setProviders] = useState<string[]>([])\n const [modelCatalog, setModelCatalog] = useState<Record<string, string[]>>({})\n const [hostDefaultModel, setHostDefaultModel] = useState<HostDefaultModel | undefined>(undefined)\n const [fields, setFields] = useState<Fields>(EMPTY_FIELDS)\n const [meta, setMeta] = useState<EngineMeta>(EMPTY_META)\n const [bootstrapTokensDraft, setBootstrapTokensDraft] = useState(DEFAULT_BOOTSTRAP_DISPLAY)\n const [gateStepsDraft, setGateStepsDraft] = useState('4')\n const [skillsDirDraft, setSkillsDirDraft] = useState('')\n const [templatePreStepCount, setTemplatePreStepCount] = useState(0)\n const [savedSwitches, setSavedSwitches] = useState<SwitchSnapshot>(EMPTY_SWITCHES)\n const [savedConfigs, setSavedConfigs] = useState<PromptConfigDraft[]>([])\n const [templateVariables, setTemplateVariables] = useState<Record<string, string>>({})\n const [templateVariablesEnabled, setTemplateVariablesEnabled] = useState(true)\n const [loading, setLoading] = useState(false)\n const [savingSkillsDir, setSavingSkillsDir] = useState(false)\n const [fixingSkill, setFixingSkill] = useState<string | undefined>(undefined)\n const [notice, setNotice] = useState('')\n const [noticeKind, setNoticeKind] = useState<'ok' | 'error'>('ok')\n const fieldsRef = useRef<Fields>(EMPTY_FIELDS)\n /** fields 订阅者集合:patch/load 每次产生新 fields 引用时广播。\n * ponytail: 单订阅通道(无 selector 缓存层),selector 在消费侧 useRef 缓存。 */\n const fieldsListenersRef = useRef(new Set<() => void>())\n const publishFields = useCallback((next: Fields) => {\n fieldsRef.current = next\n setFields(next)\n for (const listener of fieldsListenersRef.current) listener()\n }, [])\n const getFields = useCallback(() => fieldsRef.current, [])\n const subscribeFields = useCallback((listener: () => void) => {\n fieldsListenersRef.current.add(listener)\n return () => { fieldsListenersRef.current.delete(listener) }\n }, [])\n const revisionRef = useRef<number | undefined>(undefined)\n const saveQueueRef = useRef<Promise<void>>(Promise.resolve())\n const paramSaveQueueRef = useRef<Promise<void>>(Promise.resolve())\n const loadSeqRef = useRef(0)\n /** 用户草稿版本:patch 时递增。load 应答返回时若版本变化,跳过覆盖,避免\n * 保存后的静默刷新吞掉用户在读取期间的编辑。 */\n const draftVersionRef = useRef(0)\n /** applyView 自动预选的 provider:无模型名时不作为用户显式参数落盘。 */\n const autoModelProviderRef = useRef<string | undefined>(undefined)\n const autoSubagentModelProviderRef = useRef<string | undefined>(undefined)\n /** 最近一次 load 时 preset.yml params 现有键集:persist 只发送「已有键或已改动」,\n * 未动过的键不写——避免 UI 默认值固化覆盖模板 moduleConfigs 默认(liangshen 等)。 */\n const loadedKeysRef = useRef<Set<string>>(new Set())\n\n const showNotice = useCallback((kind: 'ok' | 'error', message: string) => {\n setNotice(message)\n setNoticeKind(kind)\n }, [])\n\n /** 模型目录惰性加载:独立于主 load(/describe 不再阻塞等模型查询)。 */\n const loadModels = useCallback(async (): Promise<void> => {\n const res = await bridgePost<{ modelCatalog: Record<string, string[]> }>('/models', {})\n if (res.ok) setModelCatalog(res.value.modelCatalog ?? {})\n }, [])\n\n const applyView = useCallback((res: BridgeResult<BridgeSettingsView>): Fields => {\n setTemplatePreStepCount(res.ok && typeof res.templatePreStepCount === 'number' ? res.templatePreStepCount : 0)\n setProviders(res.ok ? res.providers ?? [] : [])\n setModelCatalog(res.ok ? res.modelCatalog ?? {} : {})\n setHostDefaultModel(res.ok ? res.hostDefaultModel : undefined)\n const next = fieldsFromView(res)\n // 引擎参数按预设存储(激活预设 preset.yml):settings 不再承载,\n // 参数键由 /describe 的 presetParams 合并(类型匹配键覆盖,其余保持)。\n if (res.ok && res.presetParams !== undefined) {\n const params = res.presetParams\n const nextRecord = next as unknown as Record<string, unknown>\n for (const key of Object.keys(params)) {\n const value = params[key]\n if (value === undefined || value === null || key === 'promptConfigs') continue\n const current = nextRecord[key]\n if (current === undefined) continue\n if (key === 'guideEnabled' && typeof value === 'boolean') {\n nextRecord[key] = value\n } else if (typeof current === 'boolean' && typeof value === 'boolean') {\n nextRecord[key] = value\n } else if (typeof current === 'number' && typeof value === 'number') {\n nextRecord[key] = value\n } else if (typeof current === 'string' && typeof value === 'string') {\n nextRecord[key] = value\n }\n }\n }\n // 检测到 DeepSeek 路由且用户未设置服务商时,直接预选第一个检测到的 provider\n // (模型名为空则路由不激活,继承主会话语义不变;用户后续选择模型名即生效)。\n // 自动预选值记录到 ref:它只是显示兜底,不作为用户显式参数写进 preset.yml。\n autoModelProviderRef.current = undefined\n if (res.ok && next.modelProvider === '' && (res.providers?.length ?? 0) > 0) {\n autoModelProviderRef.current = res.providers![0]!\n next.modelProvider = autoModelProviderRef.current\n }\n // 子代理服务商同样预选:模型名为空则固定路由不激活(继承主会话),仅让模型名下拉有候选。\n autoSubagentModelProviderRef.current = undefined\n if (res.ok && next.subagentModelProvider === '' && (res.providers?.length ?? 0) > 0) {\n autoSubagentModelProviderRef.current = res.providers![0]!\n next.subagentModelProvider = autoSubagentModelProviderRef.current\n }\n publishFields(next)\n setBootstrapTokensDraft(next.bootstrapMaxTokens > 0 ? String(next.bootstrapMaxTokens) : DEFAULT_BOOTSTRAP_DISPLAY)\n setGateStepsDraft(next.maxPromoteSteps > 0 ? String(next.maxPromoteSteps) : '4')\n setSkillsDirDraft('')\n setSavedSwitches(snapshotSwitches(next))\n setSavedConfigs(next.promptConfigs)\n // revision 只在首次建立,后续由 enqueueSave 的 mutate 应答维护——/bootstrap 的\n // descriptor 有 30s 服务端缓存,用其 revision 倒退会导致下一次保存 409。\n if (res.ok && revisionRef.current === undefined) revisionRef.current = res.value.revision\n return next\n }, [])\n\n const load = useCallback(async (options?: { silent?: boolean }) => {\n // 并发保护:慢的旧请求不得覆盖新请求(last-good 语义保留旧数据)。\n const seq = ++loadSeqRef.current\n const draftVersion = draftVersionRef.current\n // silent:保存后静默刷新(不闪 loading、避免重渲染风暴与滚动跳动);失败仍报错。\n if (!options?.silent) setLoading(true)\n try {\n // /bootstrap 聚合读取:meta + describe runtime facts + 参数覆盖 + 模板变量 +\n // 实际生效配置一次取回(此前 5 端点串行,preset.yml 每端点读盘解析)。\n const boot = await bridgePost<BridgeSettingsView>('/bootstrap', {})\n if (seq !== loadSeqRef.current) return EMPTY_FIELDS\n // 读取期间用户已修改草稿:不应用服务端快照覆盖,保留草稿;后续保存/读取再同步。\n if (draftVersionRef.current !== draftVersion) return fieldsRef.current\n if (!boot.ok) {\n showNotice('error', '读取配置失败:' + (boot.message ?? 'bootstrap unavailable'))\n return EMPTY_FIELDS\n }\n if (boot.meta !== undefined) setMeta(boot.meta.meta)\n // /bootstrap 已携带 settings descriptor(value/base/revision):直接作为 fields\n // 主源,不再 await settings.ensure()——宿主全量 describe mirror 是切换预设后\n // 配置卡十几秒才出现的瓶颈。\n const res = bridgeViewFromBoot(boot)\n applyView(res)\n // 用户参数覆盖(激活预设 preset.yml params;settings 不再承载参数)。\n if (boot.ok && boot.overrides !== undefined) {\n const o = boot.overrides.overrides\n loadedKeysRef.current = new Set(Object.keys(o))\n const paramPatch: Partial<Fields> = {}\n if (typeof o.firstTurnAnchor === 'boolean') paramPatch.firstTurnAnchor = o.firstTurnAnchor\n if (typeof o.firstTurnText === 'string') paramPatch.firstTurnText = o.firstTurnText\n if (typeof o.firstTurnCustom === 'boolean') paramPatch.firstTurnCustom = o.firstTurnCustom\n if (typeof o.guideText === 'string') paramPatch.guideText = o.guideText\n if (typeof o.guideCustom === 'boolean') paramPatch.guideCustom = o.guideCustom\n if (typeof o.guideEnabled === 'boolean') paramPatch.guideEnabled = o.guideEnabled\n if (typeof o.modelProvider === 'string') paramPatch.modelProvider = o.modelProvider\n if (typeof o.modelName === 'string') paramPatch.modelName = o.modelName\n if (typeof o.subagentModelProvider === 'string') paramPatch.subagentModelProvider = o.subagentModelProvider\n if (typeof o.subagentModelName === 'string') paramPatch.subagentModelName = o.subagentModelName\n // 模型参数三件套(主对话 + 子代理):引擎按这些 params 生成 model-params\n // 配置(agent-request patch),UI 侧统一在「模型设置」卡片编辑显示,\n // 不依赖模块列表里的 model-params 卡片。\n if (typeof o.modelReasoningEffort === 'string') paramPatch.modelReasoningEffort = o.modelReasoningEffort\n if (typeof o.modelTemperature === 'string') paramPatch.modelTemperature = o.modelTemperature\n if (typeof o.modelMaxTokens === 'string') paramPatch.modelMaxTokens = o.modelMaxTokens\n if (typeof o.subagentReasoningEffort === 'string') paramPatch.subagentReasoningEffort = o.subagentReasoningEffort\n if (typeof o.subagentTemperature === 'string') paramPatch.subagentTemperature = o.subagentTemperature\n if (typeof o.subagentMaxTokens === 'string') paramPatch.subagentMaxTokens = o.subagentMaxTokens\n if (typeof o.usePtcMode === 'boolean') paramPatch.usePtcMode = o.usePtcMode\n if (typeof o.injectPrompt === 'boolean') paramPatch.injectPrompt = o.injectPrompt\n if (Array.isArray(o.toolFilterAllow)) paramPatch.toolFilterAllow = o.toolFilterAllow.join(', ')\n else if (typeof o.toolFilterAllow === 'string') paramPatch.toolFilterAllow = o.toolFilterAllow\n if (Array.isArray(o.toolFilterDeny)) paramPatch.toolFilterDeny = o.toolFilterDeny.join(', ')\n else if (typeof o.toolFilterDeny === 'string') paramPatch.toolFilterDeny = o.toolFilterDeny\n if (o.maxDepth !== undefined && o.maxDepth !== null && o.maxDepth !== '') {\n paramPatch.maxDepth = String(o.maxDepth)\n }\n if (Array.isArray(o.allowKinds)) paramPatch.allowKinds = o.allowKinds.join(', ')\n else if (typeof o.allowKinds === 'string') paramPatch.allowKinds = o.allowKinds\n if (typeof o.firstTurnWord === 'string') paramPatch.firstTurnWord = o.firstTurnWord\n if (typeof o.bootstrapMaxTokens === 'number') paramPatch.bootstrapMaxTokens = o.bootstrapMaxTokens\n // 晋升门控(tool-bootstrap 参数桥)。\n if (typeof o.promoteGate === 'boolean') paramPatch.promoteGate = o.promoteGate\n if (typeof o.promoteAfterFirstResponse === 'boolean') paramPatch.promoteAfterFirstResponse = o.promoteAfterFirstResponse\n if (typeof o.maxPromoteSteps === 'number') paramPatch.maxPromoteSteps = o.maxPromoteSteps\n if (Array.isArray(o.bootstrapTools)) paramPatch.bootstrapTools = o.bootstrapTools.join(', ')\n else if (typeof o.bootstrapTools === 'string') paramPatch.bootstrapTools = o.bootstrapTools\n if (Array.isArray(o.compactionTools)) paramPatch.compactionTools = o.compactionTools.join(', ')\n else if (typeof o.compactionTools === 'string') paramPatch.compactionTools = o.compactionTools\n // 渐进披露(stages 模式):引擎形态 [{name, tools: string[]}] → UI 草稿。\n if (Array.isArray(o.stages)) {\n paramPatch.stages = o.stages\n .filter((stage): stage is { name?: unknown; tools?: unknown } =>\n stage !== null && typeof stage === 'object')\n .map((stage) => ({\n name: typeof stage.name === 'string' ? stage.name : '',\n tools: Array.isArray(stage.tools)\n ? stage.tools.filter((item): item is string => typeof item === 'string').join(', ')\n : '',\n }))\n }\n if (typeof o.stagePreUnlock === 'number') paramPatch.stagePreUnlock = o.stagePreUnlock\n if (typeof o.stageAdvanceTool === 'string') paramPatch.stageAdvanceTool = o.stageAdvanceTool\n if (typeof o.stageAdvanceDescription === 'string') paramPatch.stageAdvanceDescription = o.stageAdvanceDescription\n if (typeof o.stageSectionTemplate === 'string') paramPatch.stageSectionTemplate = o.stageSectionTemplate\n if (typeof o.personaSectionsOnly === 'boolean') paramPatch.personaSectionsOnly = o.personaSectionsOnly\n if (typeof o.workspaceLine === 'boolean') paramPatch.workspaceLine = o.workspaceLine\n if (typeof o.phase1FirstCallInstruction === 'string') paramPatch.phase1FirstCallInstruction = o.phase1FirstCallInstruction\n if (typeof o.instructionHint === 'boolean') paramPatch.instructionHint = o.instructionHint\n // context-gate 注入门控。\n if (Array.isArray(o.messageSources)) paramPatch.messageSources = o.messageSources.join(', ')\n else if (typeof o.messageSources === 'string') paramPatch.messageSources = o.messageSources\n if (Array.isArray(o.deferredSources)) paramPatch.deferredSources = o.deferredSources.join(', ')\n else if (typeof o.deferredSources === 'string') paramPatch.deferredSources = o.deferredSources\n if (typeof o.deferredGraceSteps === 'number') paramPatch.deferredGraceSteps = o.deferredGraceSteps\n // 锚定/深思可选模块(anchor-turn / deliberation-gate / cot-drip 参数桥)。\n if (typeof o.anchorTurn === 'boolean') paramPatch.anchorTurn = o.anchorTurn\n if (typeof o.anchorTurnText === 'string') paramPatch.anchorTurnText = o.anchorTurnText\n if (typeof o.deliberationGate === 'boolean') paramPatch.deliberationGate = o.deliberationGate\n if (typeof o.deliberationMinChars === 'number') paramPatch.deliberationMinChars = o.deliberationMinChars\n if (typeof o.deliberationMaxGatesPerTurn === 'number') paramPatch.deliberationMaxGatesPerTurn = o.deliberationMaxGatesPerTurn\n if (typeof o.cotDrip === 'boolean') paramPatch.cotDrip = o.cotDrip\n if (typeof o.cotDripEvery === 'number') paramPatch.cotDripEvery = o.cotDripEvery\n if (typeof o.cotDripMaxPerTurn === 'number') paramPatch.cotDripMaxPerTurn = o.cotDripMaxPerTurn\n if (typeof o.strReplaceEditorMaxOutputChars === 'number') paramPatch.strReplaceEditorMaxOutputChars = o.strReplaceEditorMaxOutputChars\n if (Object.keys(paramPatch).length > 0) {\n const next = { ...fieldsRef.current, ...paramPatch }\n publishFields(next)\n setSavedSwitches(snapshotSwitches(next))\n }\n }\n // 预设级模板变量(preset.yml 内容变量;失败不阻断主流程)。\n if (boot.ok && boot.variables !== undefined) {\n setTemplateVariables(boot.variables.variables)\n setTemplateVariablesEnabled(boot.variables.enabled !== false)\n }\n // 实际生效配置(引擎从生成目录加载;settings.promptConfigs 仅为覆盖层,\n // 默认为空不代表无配置)。非空时以实际配置为准,并同步已保存快照避免误判 dirty。\n if (boot.ok && boot.promptConfigs !== undefined\n && Array.isArray(boot.promptConfigs.promptConfigs) && boot.promptConfigs.promptConfigs.length > 0) {\n // 引擎自动生成的模型参数配置(model-params / subagent-model-params)由\n // 「模型设置」卡片管理,不进入模块列表(避免重复编辑入口)。\n const engineGenerated = new Set(['model-params', 'subagent-model-params'])\n const userConfigs = boot.promptConfigs.promptConfigs.filter((config) => !engineGenerated.has(config.id))\n // 内容资产条目(prompt-injector / instruction-hint):params.text(生成目录文件渲染产物)\n // 提升到 text 框显示,编辑入口统一为模块卡片。\n const actual = userConfigs.map(liftContentText)\n const next = { ...fieldsRef.current, promptConfigs: actual }\n publishFields(next)\n setSavedConfigs(actual)\n }\n setNotice('')\n return fieldsRef.current\n } catch (error) {\n showNotice('error', '读取失败:' + errorMessage(error))\n return EMPTY_FIELDS\n } finally {\n if (seq === loadSeqRef.current && !options?.silent) setLoading(false)\n }\n }, [applyView, settings, showNotice])\n\n // 挂载即后台拉取模型目录(不阻塞工作台首屏;10min 缓存兜底重复打开)。\n useEffect(() => {\n void loadModels()\n }, [loadModels])\n\n const refreshRevision = useCallback(async () => {\n try {\n await settings.ensure()\n const snapshot = await waitForScope(settings.scope)\n if (snapshot.revision !== undefined) revisionRef.current = snapshot.revision\n } catch {\n // 刷新失败保持原 revision,用户可重试。\n }\n }, [settings])\n\n const patch = useCallback((partial: Partial<Fields>) => {\n draftVersionRef.current += 1\n let next = { ...fieldsRef.current, ...partial }\n // complete 互斥:system-section/persona 共用官方 complete 语义(预设内仅一个),\n // 开启任一 enabled 配置的 complete 时自动关闭其他 enabled 配置的 complete。\n // disabled 配置不参与(引擎 effectiveList 已过滤,不注册即不独占;重新启用时由本次收敛)。\n if (Array.isArray(next.promptConfigs)) {\n const activeComplete = (config: PromptConfigDraft): boolean => config.enabled !== false && config.params?.complete === true\n const enabledComplete = next.promptConfigs.some(activeComplete)\n if (enabledComplete) {\n const kept = next.promptConfigs.findIndex(activeComplete)\n next = {\n ...next,\n promptConfigs: next.promptConfigs.map((config, index) =>\n index === kept || config.enabled === false\n ? config\n : { ...config, params: { ...config.params, complete: false } }),\n }\n }\n }\n publishFields(next)\n }, [publishFields])\n\n const enqueueSave = useCallback((ops: SettingsPathOpView[], okMessage: string | undefined, onSaved: () => void, setBusy?: (busy: boolean) => void) => {\n setBusy?.(true)\n saveQueueRef.current = saveQueueRef.current.then(async () => {\n try {\n await settings.mutate(ops, revisionRef.current)\n revisionRef.current = settings.scope.getSnapshot().revision\n onSaved()\n if (okMessage) showNotice('ok', okMessage)\n } catch (error) {\n // settings 注册重建(fiber reload)会把 namespace revision 归零,客户端\n // 持有的版本号随即过期:冲突时重试一次不带 expectedRevision(官方语义 =\n // 不检查并发,last-write-wins),全局开关不会再被过期版本号卡死。\n const message = errorMessage(error)\n if (/expected revision|changed since it was read/i.test(message)) {\n try {\n await settings.mutate(ops)\n revisionRef.current = settings.scope.getSnapshot().revision\n onSaved()\n if (okMessage) showNotice('ok', okMessage)\n } catch (retryError) {\n await refreshRevision()\n showNotice('error', '保存失败:' + errorMessage(retryError) + '(已刷新配置版本,可重试)')\n }\n } else {\n await refreshRevision()\n showNotice('error', '保存失败:' + message + '(已刷新配置版本,可重试)')\n }\n } finally {\n setBusy?.(false)\n }\n }).catch(() => {})\n }, [refreshRevision, settings, showNotice])\n\n const persistSwitches = useCallback((onSaved?: () => void) => {\n const savedSnapshot = snapshotSwitches(fieldsRef.current)\n return enqueueSave(\n [\n { op: 'set', path: ['injectAgentsPrompt'], value: fieldsRef.current.injectAgentsPrompt },\n { op: 'set', path: ['skillSwitches'], value: fieldsRef.current.skillSwitches },\n { op: 'set', path: ['skillOrder'], value: fieldsRef.current.skillOrder },\n { op: 'set', path: ['skillsDirs'], value: fieldsRef.current.skillsDirs },\n { op: 'set', path: ['skillRankBase'], value: fieldsRef.current.skillRankBase },\n { op: 'set', path: ['residentAgentsPath'], value: fieldsRef.current.residentAgentsPath },\n { op: 'set', path: ['presetDir'], value: fieldsRef.current.presetDir },\n { op: 'set', path: ['presetOrder'], value: fieldsRef.current.presetOrder },\n { op: 'set', path: ['fallbackText'], value: fieldsRef.current.fallbackText },\n { op: 'set', path: ['writeAgents'], value: fieldsRef.current.writeAgents },\n { op: 'set', path: ['writePreset'], value: fieldsRef.current.writePreset },\n ],\n undefined,\n () => {\n setSavedSwitches(savedSnapshot)\n onSaved?.()\n },\n )\n }, [enqueueSave])\n\n /** 参数类设置:写入激活预设 preset.yml(savePresetParams;随预设隔离)。\n * 保存进独立队列;请求成功只把「发起时快照」标记为已保存。若用户在请求期间\n * 继续编辑,则跳过静默重载,避免磁盘旧快照覆盖未保存草稿。 */\n const persistParamOverrides = useCallback(async () => {\n const run = async (): Promise<void> => {\n const f = fieldsRef.current\n const savedSnapshot = snapshotSwitches(f)\n const splitList = (value: string): string[] => value.split(',').map((item) => item.trim()).filter((item) => item.length > 0)\n const loadedKeys = loadedKeysRef.current\n // 条件发送:preset.yml 已有该键(含模板默认键)或字段值 != UI 默认 -> 发送;\n // 未动过的键不写--既保留「改回留空清旧值」(已有键总是发送空值删键),\n // 又避免 UI 默认值固化覆盖模板 moduleConfigs 默认(liangshen promoteGate=true\n // 等被首次保存的 false 静默改写--参数桥优先后的回归)。\n const emit = (key: string, value: unknown, empty: unknown): Record<string, unknown> =>\n loadedKeys.has(key) || !deepEqual(value, empty) ? { [key]: value } : {}\n // provider 自动预选只是显示兜底:preset 未声明且模型名为空时不落盘。\n const providerShouldPersist = (key: 'modelProvider' | 'subagentModelProvider', value: string, auto: string | undefined, modelName: string): boolean =>\n loadedKeys.has(key) || modelName.length > 0 || value !== auto\n const overrides: Record<string, unknown> = {\n ...emit('firstTurnAnchor', f.firstTurnAnchor, false),\n ...emit('firstTurnText', f.firstTurnText, ''),\n ...emit('firstTurnCustom', f.firstTurnCustom, false),\n ...emit('guideText', f.guideText, ''),\n ...emit('guideCustom', f.guideCustom, false),\n ...emit('guideEnabled', f.guideEnabled, undefined),\n ...emit('usePtcMode', f.usePtcMode, false),\n ...emit('injectPrompt', f.injectPrompt, true),\n ...emit('modelProvider', f.modelProvider, ''),\n ...emit('modelName', f.modelName, ''),\n ...emit('subagentModelProvider', f.subagentModelProvider, ''),\n ...emit('subagentModelName', f.subagentModelName, ''),\n ...emit('modelReasoningEffort', f.modelReasoningEffort, ''),\n ...emit('modelTemperature', f.modelTemperature, ''),\n ...emit('modelMaxTokens', f.modelMaxTokens, ''),\n ...emit('subagentReasoningEffort', f.subagentReasoningEffort, ''),\n ...emit('subagentTemperature', f.subagentTemperature, ''),\n ...emit('subagentMaxTokens', f.subagentMaxTokens, ''),\n ...emit('toolFilterAllow', splitList(f.toolFilterAllow), []),\n ...emit('toolFilterDeny', splitList(f.toolFilterDeny), []),\n ...emit('toolFilterSubagents', f.toolFilterSubagents, false),\n ...emit('maxDepth', f.maxDepth === '' ? '' : f.maxDepth === 'provider-managed' ? 'provider-managed' : Number(f.maxDepth), ''),\n ...emit('allowKinds', splitList(f.allowKinds), []),\n ...emit('firstTurnWord', f.firstTurnWord, ''),\n ...emit('bootstrapMaxTokens', f.bootstrapMaxTokens, 0),\n // 晋升门控/渐进披露/验证工具:已有键或已改动才发送;空值由 savePresetParams\n // 删键回落模板/引擎默认;false/0 引擎布尔归一或默认等价。\n ...emit('promoteGate', f.promoteGate, false),\n ...emit('promoteAfterFirstResponse', f.promoteAfterFirstResponse, false),\n ...emit('maxPromoteSteps', f.maxPromoteSteps, 0),\n ...emit('bootstrapTools', splitList(f.bootstrapTools), []),\n ...emit('compactionTools', splitList(f.compactionTools), []),\n ...emit('stages', f.stages\n .map((stage) => ({\n name: stage.name.trim(),\n tools: splitList(stage.tools),\n }))\n .filter((stage) => stage.name.length > 0 && stage.tools.length > 0), []),\n // 未设置 = 1(引擎默认);0 是合法档位,必须能发送并落盘。\n ...emit('stagePreUnlock', f.stagePreUnlock, 1),\n ...emit('stageAdvanceTool', f.stageAdvanceTool, ''),\n ...emit('stageAdvanceDescription', f.stageAdvanceDescription, ''),\n ...emit('stageSectionTemplate', f.stageSectionTemplate, ''),\n ...emit('personaSectionsOnly', f.personaSectionsOnly, false),\n ...emit('workspaceLine', f.workspaceLine, false),\n ...emit('phase1FirstCallInstruction', f.phase1FirstCallInstruction, ''),\n ...emit('instructionHint', f.instructionHint, false),\n // context-gate 注入门控。\n ...emit('messageSources', splitList(f.messageSources), []),\n ...emit('deferredSources', splitList(f.deferredSources), []),\n ...emit('deferredGraceSteps', f.deferredGraceSteps, 0),\n // 锚定/深思可选模块:已有键或已改动才发送;false/0 引擎布尔归一或默认等价。\n ...emit('anchorTurn', f.anchorTurn, false),\n ...emit('anchorTurnText', f.anchorTurnText, ''),\n ...emit('deliberationGate', f.deliberationGate, false),\n ...emit('deliberationMinChars', f.deliberationMinChars, 0),\n ...emit('deliberationMaxGatesPerTurn', f.deliberationMaxGatesPerTurn, 0),\n ...emit('cotDrip', f.cotDrip, false),\n ...emit('cotDripEvery', f.cotDripEvery, 0),\n ...emit('cotDripMaxPerTurn', f.cotDripMaxPerTurn, 0),\n ...emit('strReplaceEditorMaxOutputChars', f.strReplaceEditorMaxOutputChars, 16000),\n }\n // 自动预选 provider 不落盘:从条件发送结果中剔除,除非用户改选或填写模型名。\n if (!providerShouldPersist('modelProvider', f.modelProvider, autoModelProviderRef.current, f.modelName)) delete overrides.modelProvider\n if (!providerShouldPersist('subagentModelProvider', f.subagentModelProvider, autoSubagentModelProviderRef.current, f.subagentModelName)) delete overrides.subagentModelProvider\n const res = await bridgePost<{ overrides: unknown }>('/param-overrides', { overrides })\n if (res.ok) {\n // 只标记发起时快照;若期间有新编辑,当前 fields 仍保持 dirty。\n setSavedSwitches(savedSnapshot)\n const currentSnapshot = snapshotSwitches(fieldsRef.current)\n if (switchesEqual(currentSnapshot, savedSnapshot)) {\n // 参数已写激活预设 preset.yml:服务端重建后刷新(模型参数配置等随预设变化)。\n void load({ silent: true })\n }\n } else {\n showNotice('error', '参数保存失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n }\n paramSaveQueueRef.current = paramSaveQueueRef.current.then(run).catch(() => {})\n await paramSaveQueueRef.current\n }, [load, showNotice])\n\n /** 保存后是否静默重载。切换预设时传 false(随后的 settings.mutate 回调会统一 load,\n * 避免一次切换触发两次全量读取)。 */\n const persistConfigs = useCallback((configs: PromptConfigDraft[], options?: { reload?: boolean; rebuild?: boolean }): Promise<void> => {\n const contentEntries = configs.filter(isContentAsset)\n return (async () => {\n // 内容资产:text 先写生成目录文件。合并为单次 /import-preset(批量载荷),\n // 服务端只触发一次重建——此前逐条请求每条各重建一次(多次写盘+recomposition)。\n if (contentEntries.length > 0) {\n const contents = contentEntries.map((config) => ({\n scope: config.id === 'prompt-injector' ? 'preset' as const : 'agents' as const,\n content: config.text ?? '',\n }))\n const res = await bridgePost<{ scopes: Array<'preset' | 'agents'> }>('/import-preset', { contents })\n if (!res.ok) {\n showNotice('error', 'preset.md/agents.md 保存失败:' + (res.message ?? 'settings bridge unavailable'))\n return\n }\n }\n // promptConfigs 按预设存储:写激活预设 preset.yml(settings 不再承载)。\n // 防御:空数组(且无内容资产)绝不覆盖服务端 promptConfigs——历史教训是\n // 初始化期的空数组自动保存把 beta-2-42 的 129 张配置卡一次清空。\n if (configs.length === 0) return\n const res = await bridgePost<{ promptConfigs: unknown }>('/param-overrides', {\n promptConfigs: configs.map(stripContentText),\n ...(options?.rebuild === false ? { rebuild: false } : {}),\n })\n if (res.ok) {\n setSavedConfigs(configs)\n if (options?.reload !== false) void load({ silent: true })\n } else {\n showNotice('error', '提示词配置保存失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n })()\n }, [load, showNotice])\n\n /** 模板变量:写激活预设 preset.yml 内容变量(后端 savePresetParams + afterOverridesChange 触发重建)。 */\n const saveTemplateVariables = useCallback(async (next?: Record<string, string>) => {\n // 空 key 行(待编辑)不落盘;本地同步清理保持显示一致。\n const cleaned = Object.fromEntries(\n Object.entries(next ?? templateVariables).filter(([key]) => key.trim().length > 0),\n )\n const res = await bridgePost<{ variables: unknown }>('/preset-variables', {\n variables: cleaned,\n enabled: templateVariablesEnabled,\n })\n if (!res.ok) {\n showNotice('error', `模板变量保存失败:${res.message ?? '未知错误'}`)\n return\n }\n setTemplateVariables(cleaned)\n }, [templateVariables, templateVariablesEnabled, showNotice])\n\n const toggle = useCallback((key: SwitchKey) => {\n patch({ [key]: !fieldsRef.current[key] })\n if (PARAM_SWITCH_KEYS.has(key)) void persistParamOverrides()\n // writePreset 关闭/开启会重建或移除生成目录:保存后必须重新加载,\n // 否则模块卡片仍显示旧配置(不刷新)。\n else if (key === 'writePreset') persistSwitches(() => { void load({ silent: true }) })\n else persistSwitches()\n }, [patch, persistParamOverrides, persistSwitches, load])\n\n const toggleBootstrapMaxTokens = useCallback(() => {\n const next = fieldsRef.current.bootstrapMaxTokens > 0 ? 0 : 256000\n patch({ bootstrapMaxTokens: next })\n setBootstrapTokensDraft(DEFAULT_BOOTSTRAP_DISPLAY)\n void persistParamOverrides()\n }, [patch, persistParamOverrides])\n\n const setPresetTemplate = useCallback(async (id: string) => {\n if (fieldsRef.current.presetTemplate === id) return\n // 切换即保存:模块列表有未保存的提示词配置修改时先提交(写当前激活预设),\n // 避免切换后 load() 重置 fields 丢失修改。已保存/无修改则直接切换。\n const dirtyConfigs = promptConfigsDirty(fieldsRef.current.promptConfigs, savedConfigs)\n if (dirtyConfigs) {\n // 免双 load:保存成功后由下方 enqueueSave 的 onSaved 统一静默重载。\n // 切换前只落盘当前预设,不重建;settings 切换后目标预设只重建一次。\n await persistConfigs(fieldsRef.current.promptConfigs, { reload: false, rebuild: false })\n }\n const switchResult = await api.switchPreset(id)\n patch({ presetTemplate: id })\n enqueueSave(\n [{ op: 'set', path: ['presetTemplate'], value: id }],\n switchResult.applied\n ? `已切换预设模板:${id}(当前空会话已重组)`\n : `已切换默认预设模板:${id}`,\n () => {\n void load({ silent: true })\n if (switchResult.message !== undefined) {\n showNotice('error', switchResult.message)\n }\n },\n )\n }, [enqueueSave, load, patch, persistConfigs, savedConfigs])\n\n const commitBootstrapTokensDraft = useCallback(() => {\n const parsed = Number(bootstrapTokensDraft)\n if (!Number.isSafeInteger(parsed) || parsed <= 0) {\n setBootstrapTokensDraft(DEFAULT_BOOTSTRAP_DISPLAY)\n patch({ bootstrapMaxTokens: 256000 })\n } else {\n patch({ bootstrapMaxTokens: parsed })\n }\n void persistParamOverrides()\n }, [bootstrapTokensDraft, patch, persistParamOverrides])\n\n /** 门控回退步数提交:0 = 引擎默认 4(不写 params)。 */\n const commitGateStepsDraft = useCallback(() => {\n const parsed = Number(gateStepsDraft)\n if (!Number.isSafeInteger(parsed) || parsed < 0) {\n setGateStepsDraft(String(fieldsRef.current.maxPromoteSteps > 0 ? fieldsRef.current.maxPromoteSteps : 4))\n return\n }\n patch({ maxPromoteSteps: parsed })\n setGateStepsDraft(String(parsed))\n void persistParamOverrides()\n }, [gateStepsDraft, patch, persistParamOverrides])\n\n const addSkillsDir = useCallback((dir: string) => {\n const next = dir.trim()\n if (next.length === 0) return\n const current = fieldsRef.current.skillsDirs\n if (current.includes(next)) {\n showNotice('error', '该目录已在列表中')\n return\n }\n const dirs = [...current, next]\n patch({ skillsDirs: dirs })\n enqueueSave(\n [{ op: 'set', path: ['skillsDirs'], value: dirs }],\n `技能目录已添加:${next}`,\n () => {\n setSavedSwitches(snapshotSwitches(fieldsRef.current))\n void load({ silent: true })\n },\n setSavingSkillsDir,\n )\n }, [enqueueSave, load, patch, showNotice])\n\n const removeSkillsDir = useCallback((dir: string) => {\n const dirs = fieldsRef.current.skillsDirs.filter((item) => item !== dir)\n patch({ skillsDirs: dirs })\n enqueueSave(\n [{ op: 'set', path: ['skillsDirs'], value: dirs }],\n `已移除技能目录引用:${dir}`,\n () => {\n setSavedSwitches(snapshotSwitches(fieldsRef.current))\n void load({ silent: true })\n },\n setSavingSkillsDir,\n )\n }, [enqueueSave, load, patch, showNotice])\n\n const skillEnabled = useCallback((folder: string) => fieldsRef.current.skillSwitches[folder] !== false, [])\n\n const toggleSkill = useCallback((folder: string) => {\n const enabled = fieldsRef.current.skillSwitches[folder] !== false\n patch({ skillSwitches: { ...fieldsRef.current.skillSwitches, [folder]: !enabled } })\n persistSwitches()\n }, [patch, persistSwitches])\n\n interface SkillFixValue {\n folder: string\n fixedFolder: string\n name: string\n actions: string[]\n }\n const fixSkill = useCallback(async (folder: string) => {\n setFixingSkill(folder)\n try {\n const res = await bridgePost<SkillFixValue>('/skill-fix', { folder })\n if (res.ok) {\n showNotice('ok', `已修复技能 ${res.value.folder} → ${res.value.fixedFolder}:${res.value.actions.join(';') || '无需改动'}`)\n await load()\n } else {\n showNotice('error', '一键修复失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n } catch (error) {\n showNotice('error', '一键修复失败:' + errorMessage(error))\n } finally {\n setFixingSkill(undefined)\n }\n }, [load, showNotice])\n\n const openSkillsDir = useCallback(async (path?: string) => {\n const target = path ?? fieldsRef.current.activeSkillsDirs[0] ?? ''\n if (!target) { showNotice('error', '技能目录路径未知,请先重新读取配置'); return }\n try {\n await api.openPath(target)\n showNotice('ok', '已打开技能目录:' + target)\n } catch (error) {\n showNotice('error', '打开失败:' + errorMessage(error))\n }\n }, [api, showNotice])\n\n const currentSwitches = snapshotSwitches(fields)\n const dirtySwitches = !switchesEqual(currentSwitches, savedSwitches)\n const dirtyConfigs = promptConfigsDirty(fields.promptConfigs, savedConfigs)\n const dirty = dirtySwitches || dirtyConfigs\n\n // 任意 UI 修改自动保存:模块列表的提示词配置修改(顶端总开关/卡片字段/增删/排序,\n // 全部经 patch({ promptConfigs }) 落 fields)debounce 后统一走 persistConfigs——\n // 与手动「保存」共用同一写盘逻辑(跳过校验:编辑中间态直存,后端容错;\n // 手动保存按钮仍保留校验路径)。保存成功 load() 更新 savedConfigs → dirty 消失自愈。\n useEffect(() => {\n if (!dirtyConfigs) return\n const timer = setTimeout(() => { void persistConfigs(fields.promptConfigs) }, 800)\n return () => clearTimeout(timer)\n }, [dirtyConfigs, fields.promptConfigs, persistConfigs])\n\n // 返回引用稳定化:memo 子组件以 props.store 同一性跳过父级重渲染(订阅式 selector\n // 化依赖稳定 store 引用);每次渲染重建内容对象但复用 ref 外壳。\n const storeRef = useRef<PromptToolStore>()\n storeRef.current = {\n fields,\n getFields,\n subscribeFields,\n meta,\n loading,\n providers,\n modelCatalog,\n hostDefaultModel,\n bootstrapTokensDraft,\n skillsDirDraft,\n templatePreStepCount,\n savedSwitches,\n savedConfigs,\n savingSkillsDir,\n fixingSkill,\n notice,\n noticeKind,\n load,\n showNotice,\n patch,\n persistSwitches,\n persistParamOverrides,\n persistConfigs,\n templateVariables,\n setTemplateVariables,\n templateVariablesEnabled,\n setTemplateVariablesEnabled,\n saveTemplateVariables,\n toggle,\n toggleBootstrapMaxTokens,\n setPresetTemplate,\n setBootstrapTokensDraft,\n commitBootstrapTokensDraft,\n gateStepsDraft,\n setGateStepsDraft,\n commitGateStepsDraft,\n setSkillsDirDraft,\n addSkillsDir,\n removeSkillsDir,\n toggleSkill,\n skillEnabled,\n fixSkill,\n openSkillsDir,\n dirtySwitches,\n dirtyConfigs,\n dirty,\n }\n return storeRef.current\n}\n","/** textarea 随内容自适应高度(field-sizing 的 JS 兜底:不支持的内核手动调整)。 */\nimport type { ChangeEvent } from 'react'\n\nexport function autoResizeTextarea(event: ChangeEvent<HTMLTextAreaElement>): void {\n const el = event.currentTarget\n if (typeof CSS !== 'undefined' && typeof CSS.supports === 'function' && CSS.supports('field-sizing', 'content')) return\n el.style.height = 'auto'\n el.style.height = `${el.scrollHeight}px`\n}\n","/** 标签输入:chip 增删 + 回车/逗号添加;底层仍为逗号分隔字符串,零数据层改动。 */\nimport { useState, type ReactNode } from 'react'\nimport styles from './PromptUi.module.css'\n\nexport function TagInput(props: {\n id: string\n label: string\n hint: string\n value: string\n placeholder?: string\n disabled?: boolean\n onChange: (value: string) => void\n onCommit: () => void\n}): ReactNode {\n const { id, label, hint, value, placeholder, disabled, onChange, onCommit } = props\n const [draft, setDraft] = useState('')\n const tags = value.split(',').map((tag) => tag.trim()).filter((tag) => tag.length > 0)\n\n const commitDraft = () => {\n const next = draft.trim()\n setDraft('')\n if (next.length === 0 || tags.includes(next)) return\n onChange([...tags, next].join(', '))\n onCommit()\n }\n\n const remove = (tag: string) => {\n onChange(tags.filter((item) => item !== tag).join(', '))\n onCommit()\n }\n\n return (\n <div className={styles.rowGroup}>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}><strong>{label}</strong><small>{hint}</small></span>\n <div className={styles.tagInput} data-disabled={disabled ? '' : undefined}>\n {tags.map((tag) => (\n <span key={tag} className={styles.tagChip}>\n {tag}\n {!disabled && (\n <button type=\"button\" className={styles.tagChipRemove} aria-label={`移除 ${tag}`} onClick={() => remove(tag)}>×</button>\n )}\n </span>\n ))}\n <input\n id={id}\n className={styles.tagInputField}\n value={draft}\n aria-label={label}\n placeholder={tags.length === 0 ? (placeholder ?? '输入后回车添加') : undefined}\n disabled={disabled}\n spellCheck={false}\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ',') {\n event.preventDefault()\n commitDraft()\n } else if (event.key === 'Backspace' && draft.length === 0 && tags.length > 0) {\n remove(tags[tags.length - 1]!)\n }\n }}\n onBlur={commitDraft}\n />\n </div>\n </div>\n </div>\n )\n}\n","/**\n * 单条提示词配置卡片 + 编辑表单(独立文件:\n * 打破 PromptConfigsEditor ⇄ PromptConfigList 的循环 import)。\n */\nimport { cloneElement, isValidElement, memo, useEffect, useId, useMemo, useState, type ReactElement, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { IconChevronDownOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport styles from './PromptUi.module.css'\nimport { autoResizeTextarea } from './textarea-resize.ts'\nimport { TagInput } from './TagInput.tsx'\n\nimport type { EngineMeta, LayerFieldPolicy, PromptConfigDraft } from './prompt-tool-types.ts'\n\nexport type { PromptConfigDraft, LayerFieldPolicy } from './prompt-tool-types.ts'\n\n/** sourceKind / form 是少量固定语义值,用下拉选择;引擎不设枚举,因此额外保留当前值。 */\nexport const SOURCE_KINDS = ['', 'plugin', 'instruction-hint', 'skill-catalog', 'env-facts'] as const\nexport const SOURCE_FORMS = ['notice', 'hint', ''] as const\n\n/** audience 的 UI 中文标签:空值=公用(缺省,通用参数默认);main=仅主会话;subagent=仅子代理。 */\nexport const AUDIENCE_LABELS: Record<string, string> = { '': '公用(缺省)', main: '仅主会话', subagent: '仅子代理' }\n\n/** 从引擎 /meta 中读取某层的字段能力;未知层回退 pre-step。 */\nconst EMPTY_POLICY: LayerFieldPolicy = {\n position: false,\n dedupe: false,\n promotion: false,\n audience: false,\n modelScope: false,\n merge: false,\n order: false,\n role: false,\n placeholder: false,\n}\n\nexport function fieldPolicyFor(meta: EngineMeta, layer: string | undefined): LayerFieldPolicy {\n return meta.layerFieldPolicies[(layer ?? 'pre-step')] ?? EMPTY_POLICY\n}\n\nfunction selectOptions(options: readonly string[], value: string | undefined): Array<{ value: string; label: string }> {\n const current = value ?? ''\n const entries = options.map((item) => ({ value: item, label: item === '' ? '(默认)' : item }))\n if (current !== '' && !options.includes(current)) entries.push({ value: current, label: `${current}(当前值)` })\n return entries\n}\n\nexport function Field(props: { label: string; hint?: string; children: ReactNode }): ReactNode {\n const id = useId()\n return (\n <div className={styles.configField}>\n <label className={styles.configFieldLabel} htmlFor={id}>{props.label}</label>\n {isValidElement(props.children) ? cloneElement(props.children as ReactElement<{ id?: string }>, { id }) : props.children}\n {props.hint && <p className={styles.configFieldHint}>{props.hint}</p>}\n </div>\n )\n}\n\nfunction selectValue(options: readonly string[], value: string | undefined, fallback: string): string {\n return options.includes(value ?? '') ? value ?? fallback : fallback\n}\n\n/** JSON 对象文本域:解析失败只在本地标红,不污染草稿。 */\nexport function JsonField(props: { label: string; value: Record<string, unknown> | undefined; onChange: (value: Record<string, unknown> | undefined) => void }): ReactNode {\n const [text, setText] = useState(JSON.stringify(props.value ?? {}, null, 2))\n const [error, setError] = useState('')\n // 依赖序列化结果而非对象引用:父级 patch 会让 params 产生新引用(即使内容未变),\n // 旧写法会把用户未提交的编辑重置;引用不变时 useMemo 不再重复序列化。\n const serialized = useMemo(() => JSON.stringify(props.value ?? {}, null, 2), [props.value])\n useEffect(() => {\n setText(serialized)\n setError('')\n }, [serialized])\n const commit = () => {\n try {\n const parsed = JSON.parse(text) as unknown\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {\n setError('必须是 JSON 对象')\n return\n }\n props.onChange(parsed as Record<string, unknown>)\n setError('')\n } catch {\n setError('JSON 无效')\n }\n }\n return (\n <span className={styles.configFieldStack}>\n <span className={styles.configFieldLabel}>{props.label}{error && <span className={styles.configJsonError}> {error}</span>}</span>\n <textarea\n className={clsx(styles.configTextarea, styles.configJsonInput, error && styles.configInputError)}\n aria-label={props.label}\n value={text}\n spellCheck={false}\n onChange={(e) => { autoResizeTextarea(e); setText(e.target.value) }}\n onBlur={commit}\n />\n </span>\n )\n}\n\n/** 布尔开关行(params 结构化编辑用)。 */\nfunction ParamToggle(props: { label: string; hint?: string; checked: boolean; onChange: (checked: boolean) => void }): ReactNode {\n return (\n <label className={styles.configEnable} title={props.checked ? '点击关闭' : '点击开启'}>\n <span className={styles.configFieldLabel}>{props.label}</span>\n <input type=\"checkbox\" aria-label={props.label} checked={props.checked} onChange={(e) => props.onChange(e.target.checked)} />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n {props.hint && <span className={styles.configFieldHint}>{props.hint}</span>}\n </label>\n )\n}\n\n/** params 文本域(结构化编辑用):失焦写入草稿 params。 */\nfunction ParamTextarea(props: { label: string; hint?: string; value: string; onChange: (value: string) => void }): ReactNode {\n return (\n <span className={styles.configFieldStack}>\n <span className={styles.configFieldLabel}>{props.label}</span>\n <textarea\n className={styles.configTextarea}\n aria-label={props.label}\n value={props.value}\n spellCheck={false}\n onChange={(e) => { autoResizeTextarea(e); props.onChange(e.target.value) }}\n />\n {props.hint && <p className={styles.configFieldHint}>{props.hint}</p>}\n </span>\n )\n}\n\n/** params 单行文本域(结构化编辑用)。 */\nfunction ParamInput(props: { label: string; hint?: string; value: string; onChange: (value: string) => void }): ReactNode {\n return (\n <Field label={props.label} hint={props.hint}>\n <input className={styles.configInput} value={props.value} spellCheck={false} onChange={(e) => props.onChange(e.target.value)} />\n </Field>\n )\n}\n\n/**\n * 按 strategy 拆解 params 为结构化编辑框(替代裸 JSON):\n * first-turn-anchor → near-anchor 锚点参数(开关/锚文本/任务正则/引导句);\n * guide-auto → router-guide 每轮引导参数(开关/文本/复杂正则/强弱引导句);\n * custom-fallback → prompt-injector 锚定词(params.text 为运行时注入内容,不暴露编辑);\n * placeholder / instruction-hint → fill 模板参数(text/envKeys/limit/fields/providers/emptyBehavior/emptyText);\n * 无固定字段的策略回退 JSON 编辑(保留任意 params 能力)。\n */\nexport function StrategyParamsFields(props: { strategy: string; layer?: string; params: Record<string, unknown> | undefined; onPatch: (params: Record<string, unknown>) => void; id?: string }): ReactNode {\n const { strategy, layer, params, onPatch, id } = props\n const value = params ?? {}\n const str = (key: string): string => (typeof value[key] === 'string' ? value[key] as string : '')\n const bool = (key: string): boolean => value[key] === true\n const set = (key: string, next: unknown): void => onPatch({ ...value, [key]: next })\n if (layer === 'system-section') {\n // system-section 层参数:人设段开关(开 = sectionName=deployment:persona 官方 shadow;\n // 关 = 可选自定义段名,空则引擎回退 id 注册为普通段)、complete(独占 system prompt,\n // 预设内互斥)、suppressRuntimeContext(抑制动态快照)。\n const isPersona = str('sectionName') === 'deployment:persona' || str('sectionName') === 'persona'\n return (\n <>\n <ParamToggle label=\"人设段\" hint=\"开启 = 注册为全局 persona(sectionName=deployment:persona,同名 shadow;触发人设徽标/相位先行/子代理继承)\"\n checked={isPersona}\n onChange={(next) => set('sectionName', next ? 'deployment:persona' : '')} />\n {!isPersona && (\n <ParamInput label=\"sectionName(自定义注册段名)\" hint=\"可选;空 = 引擎回退用 id 注册为普通段。同名段会 shadow 合并/覆盖官方段。\" value={str('sectionName')} onChange={(next) => set('sectionName', next)} />\n )}\n <ParamToggle label=\"complete(独占 system prompt)\" hint=\"开启后 assembly 只保留本段;预设内互斥(多个 complete 官方 fail loud)\"\n checked={bool('complete')} onChange={(next) => set('complete', next)} />\n <ParamToggle label=\"suppressRuntimeContext(抑制动态上下文)\" hint=\"等价官方 dsh-persona includeRuntimeContext:false\"\n checked={bool('suppressRuntimeContext')} onChange={(next) => set('suppressRuntimeContext', next)} />\n </>\n )\n }\n if (strategy === 'first-turn-anchor') {\n // writePreset 按 id 把顶层 params(firstTurnCustom/firstTurnText/…)统一写入\n // 这两个模板配置的 params——这里的编辑会被重建覆盖,隐藏以避免假入口。\n const managed = id === 'near-anchor'\n return (\n <>\n {managed && (\n <p className={styles.configFieldHint}>锚定开关与文本由设置页「锚定」管理(writePreset 重建时统一写入本配置),此处编辑会被覆盖。</p>\n )}\n {!managed && (\n <>\n <ParamToggle label=\"useCustom(自定义锚文本)\" hint=\"true = 固定使用 text;false = 按 buildPattern/complexPattern 自动选择引导句\"\n checked={bool('useCustom')} onChange={(next) => set('useCustom', next)} />\n <ParamTextarea label=\"text(自定义锚文本)\" hint=\"useCustom=true 时固定注入\" value={str('text')} onChange={(next) => set('text', next)} />\n <ParamInput label=\"buildPattern(构建任务正则)\" hint=\"命中即用 firstTurnBuild 引导句\" value={str('buildPattern')} onChange={(next) => set('buildPattern', next)} />\n <ParamInput label=\"complexPattern(复杂任务正则)\" hint=\"命中即用 firstTurnDeep 引导句\" value={str('complexPattern')} onChange={(next) => set('complexPattern', next)} />\n <ParamTextarea label=\"firstTurnBuild(构建引导句)\" value={str('firstTurnBuild')} onChange={(next) => set('firstTurnBuild', next)} />\n <ParamTextarea label=\"firstTurnInspect(排查引导句)\" value={str('firstTurnInspect')} onChange={(next) => set('firstTurnInspect', next)} />\n <ParamTextarea label=\"firstTurnDeep(复杂设计引导句)\" value={str('firstTurnDeep')} onChange={(next) => set('firstTurnDeep', next)} />\n </>\n )}\n </>\n )\n }\n if (strategy === 'guide-auto') {\n const managed = id === 'router-guide'\n return (\n <>\n {managed && (\n <p className={styles.configFieldHint}>引导开关与文本由设置页「引导」管理(writePreset 重建时统一写入本配置),此处编辑会被覆盖。</p>\n )}\n {!managed && (\n <>\n <ParamToggle label=\"useCustom(自定义每轮引导)\" hint=\"true = 固定使用 text;false = 按任务自动选择强弱引导\"\n checked={bool('useCustom')} onChange={(next) => set('useCustom', next)} />\n <ParamTextarea label=\"text(自定义引导文本)\" hint=\"useCustom=true 时固定注入\" value={str('text')} onChange={(next) => set('text', next)} />\n <p className={styles.configFieldHint}>复杂任务判定复用锚定卡的 complexPattern(引导 fallback 共用分类器)。</p>\n <ParamTextarea label=\"guideWeak(简单任务自动引导)\" value={str('guideWeak')} onChange={(next) => set('guideWeak', next)} />\n <ParamTextarea label=\"guideDeep(复杂任务自动引导)\" value={str('guideDeep')} onChange={(next) => set('guideDeep', next)} />\n </>\n )}\n </>\n )\n }\n if (strategy === 'custom-fallback') {\n return (\n <>\n <ParamInput label=\"firstTurnWord(锚定词)\" hint=\"晋升后首个 reasoning 命中该词即注入;任意自定义文本\"\n value={str('firstTurnWord')} onChange={(next) => set('firstTurnWord', next)} />\n </>\n )\n }\n if (strategy === 'world-book') {\n const keyId = useId()\n const list = (key: string): string => Array.isArray(value[key])\n ? (value[key] as unknown[]).map(String).join(', ') : str(key)\n const setList = (key: string, next: string): void => set(key, next.split(',').map((item) => item.trim()).filter((item) => item.length > 0))\n return (\n <>\n <ParamToggle label=\"constant(常驻注入)\" hint=\"true = 不依赖关键字,每轮恒注入;false = 命中 keys 才注入\"\n checked={bool('constant')} onChange={(next) => set('constant', next)} />\n <TagInput id={`${keyId}-keys`} label=\"keys(触发关键字)\" hint=\"命中消息文本中的任一关键字即注入;逗号分隔\" onCommit={() => {}}\n value={list('keys')} placeholder=\"关键字,回车添加\" onChange={(next) => setList('keys', next)} />\n <TagInput id={`${keyId}-secondary-keys`} label=\"secondaryKeys(次级关键字)\" hint=\"与 keys 合并匹配(任一命中即注入);逗号分隔\" onCommit={() => {}}\n value={list('secondaryKeys')} placeholder=\"次级关键字,回车添加\" onChange={(next) => setList('secondaryKeys', next)} />\n <ParamToggle label=\"caseSensitive(区分大小写)\" hint=\"true = 关键字精确大小写匹配\"\n checked={bool('caseSensitive')} onChange={(next) => set('caseSensitive', next)} />\n <ParamToggle label=\"wholeWords(整词匹配)\" hint=\"true = 关键字必须整词出现(词边界),false = 子串包含即命中\"\n checked={bool('wholeWords')} onChange={(next) => set('wholeWords', next)} />\n <ParamToggle label=\"useRegex(键为正则)\" hint=\"true = keys / secondaryKeys 按正则表达式匹配(作者负责合法性)\"\n checked={bool('useRegex')} onChange={(next) => set('useRegex', next)} />\n <OptionField\n label=\"selectiveLogic(触发逻辑)\"\n hint=\"ST world_info_logic:0 = 主/副键任一命中;3 = 副键全中才注入;1 = 副键全不中才注入;2 = 至少一个副键未中才注入\"\n value={value['selectiveLogic'] !== undefined ? String(value['selectiveLogic']) : '0'}\n options={['0', '1', '2', '3']}\n fallback=\"0\"\n labels={{\n '0': '0 · 任一命中(默认)',\n '1': '1 · 副键全排除',\n '2': '2 · 部分排除',\n '3': '3 · 副键全包含',\n }}\n onChange={(next) => set('selectiveLogic', Number(next))}\n />\n </>\n )\n }\n if (strategy === 'placeholder' || strategy === 'instruction-hint') {\n return (\n <>\n <ParamTextarea label=\"text(自定义提示文本)\" hint=\"覆盖文件与动态探测的提示文本;留空 = 默认\"\n value={str('text')} onChange={(next) => set('text', next)} />\n <ParamInput label=\"envKeys(env-facts 环境变量白名单)\" hint=\"逗号分隔;留空 = 默认 DSH_HOME,DSH_WORKSPACE\"\n value={str('envKeys')} onChange={(next) => set('envKeys', next)} />\n <ParamInput label=\"limit(skill-catalog 数量上限)\" hint=\"正整数;留空 = 不限制\"\n value={str('limit')} onChange={(next) => set('limit', next === '' ? '' : Number(next))} />\n <ParamInput label=\"fields(skill-catalog 字段)\" hint=\"逗号分隔;默认 name,description\"\n value={str('fields')} onChange={(next) => set('fields', next)} />\n <ParamInput label=\"providers(skill-catalog provider 白名单)\" hint=\"逗号分隔;留空 = 全部\"\n value={str('providers')} onChange={(next) => set('providers', next)} />\n <OptionField label=\"emptyBehavior(空结果行为)\" hint=\"skip = 不注入;text = 注入 emptyText\"\n value={str('emptyBehavior')} options={['skip', 'text']} fallback=\"skip\" onChange={(next) => set('emptyBehavior', next)} />\n <ParamTextarea label=\"emptyText(空结果提示文本)\" value={str('emptyText')} onChange={(next) => set('emptyText', next)} />\n </>\n )\n }\n // 无策略参数的配置(static 等):预设级内容变量已展开进 variables(官方插值\n // 机制,由上方 VariablesEditor 结构化编辑),params 为空时不再渲染 JSON 框。\n if (Object.keys(value).length === 0) {\n return <p className={styles.configFieldHint}>本策略无高级参数;模板变量见上方「variables」。</p>\n }\n return <JsonField label=\"params(高级参数 JSON;本策略无固定字段)\" value={value} onChange={(next) => { if (next !== undefined) onPatch(next) }} />\n}\n\n/** 模板变量键值对编辑器(替代 JSON):每行 key + value,可增删。工作台「模板变量」卡片复用。 */\nexport function VariablesEditor(props: { value: Record<string, string> | undefined; onChange: (value: Record<string, string> | undefined) => void }): ReactNode {\n const entries = Object.entries(props.value ?? {})\n const commit = (next: Array<[string, string]>) => {\n // 保留空 key 行(「添加变量」新增的待编辑行);空 key 由保存端(savePresetParams)\n // 统一清理,避免新增行被立即过滤导致按钮失效。\n props.onChange(next.length > 0 ? Object.fromEntries(next) : undefined)\n }\n const setEntry = (index: number, key: string, value: string) => {\n commit(entries.map((entry, at): [string, string] => at === index ? [key, value] : entry))\n }\n return (\n <span className={styles.configFieldStack}>\n <span className={styles.configFieldLabel}>{'variables(模板变量 {{key}} 插值)'}</span>\n {entries.length === 0 && <p className={styles.configFieldHint}>{'无模板变量;下方添加键值对,注入文本中的 {{key}} 会被替换。'}</p>}\n {entries.map(([key, value], index) => (\n <span key={`${key}-${index}`} className={styles.variableRow}>\n <input className={styles.configInput} aria-label=\"模板变量名\" value={key} spellCheck={false} placeholder=\"变量名\"\n onChange={(e) => setEntry(index, e.target.value, value)} />\n <input className={styles.configInput} aria-label=\"模板变量值\" value={value} spellCheck={false} placeholder=\"变量值\"\n onChange={(e) => setEntry(index, key, e.target.value)} />\n <button type=\"button\" className={styles.pillButton} data-danger aria-label={`删除变量 ${key || index}`}\n onClick={() => commit(entries.filter((_, at) => at !== index))}>删除</button>\n </span>\n ))}\n <span>\n <button type=\"button\" className={styles.pillButton} onClick={() => commit([...entries, ['', '']])}>添加</button>\n </span>\n </span>\n )\n}\n\n/** identity 结构化编辑(替代 JSON):field 下拉 + value 输入;value 留空 = 使用默认(等于配置 id)。 */\nfunction IdentityFields(props: { identity: { field: string; value: string } | undefined; onPatch: (identity: { field: string; value: string } | undefined) => void }): ReactNode {\n const field = props.identity?.field ?? 'plugin'\n const value = props.identity?.value ?? ''\n return (\n <>\n <OptionField label=\"identity.field(幂等身份域)\" hint=\"plugin = 按插件 id 幂等;kind = 按注入类型\"\n value={field} options={['plugin', 'kind']} fallback=\"plugin\" onChange={(next) => props.onPatch({ field: next, value })} />\n <Field label=\"identity.value(幂等身份值)\" hint=\"留空 = 使用默认(等于配置 id)\">\n <input className={styles.configInput} value={value} spellCheck={false}\n onChange={(e) => props.onPatch(e.target.value.length > 0 ? { field, value: e.target.value } : undefined)} />\n </Field>\n </>\n )\n}\n\n/** 枚举下拉:值不在选项内时用回退值,保证表单始终可渲染。 */\nfunction OptionField(props: { label: string; hint?: string; value: string | undefined; options: readonly string[]; fallback: string; onChange: (value: string) => void; keepCurrent?: boolean; labels?: Record<string, string> }): ReactNode {\n const options = props.keepCurrent === true ? selectOptions(props.options, props.value) : props.options.map((item) => ({ value: item, label: item }))\n return (\n <Field label={props.label} hint={props.hint}>\n <select className={styles.configInput} value={selectValue(props.options, props.value, props.fallback)} onChange={(e) => props.onChange(e.target.value)}>\n {options.map((item) => <option key={item.value} value={item.value}>{props.labels?.[item.value] ?? item.label}</option>)}\n </select>\n </Field>\n )\n}\n\n/** 单条提示词配置表单:按注入层级的能力矩阵过滤字段,只显示本层生效的参数。 */\nexport function PromptConfigForm(props: {\n meta: EngineMeta\n config: PromptConfigDraft\n onPatch: (patch: Partial<PromptConfigDraft>) => void\n}): ReactNode {\n const { meta, config, onPatch } = props\n const policy = fieldPolicyFor(meta, config.layer)\n const strategy = config.strategy ?? 'static'\n const placeholder = strategy === 'placeholder' && policy.placeholder\n const fillOptions = ['', ...meta.fills]\n return (\n <div className={styles.configForm}>\n <div className={styles.configGrid}>\n <Field label=\"id(唯一,必填)\">\n <input className={styles.configInput} value={config.id} spellCheck={false} onChange={(e) => onPatch({ id: e.target.value })} />\n </Field>\n <Field label=\"name(显示名)\">\n <input className={styles.configInput} value={config.name ?? ''} spellCheck={false} onChange={(e) => onPatch({ name: e.target.value })} />\n </Field>\n <OptionField label=\"layer\" hint=\"注入层级;切换后下方字段按新层能力矩阵重新出现\" value={config.layer} options={meta.layers} fallback=\"pre-step\" onChange={(value) => onPatch({ layer: value })} />\n <OptionField label=\"strategy\" hint=\"内容策略;placeholder 需配合 fill\" value={config.strategy} options={meta.strategies} fallback=\"static\" onChange={(value) => onPatch({ strategy: value })} />\n <OptionField label=\"configKind\" hint=\"ordered 按 order 升序;anchor 固定文件序排最前\" value={config.configKind} options={meta.slotKinds} fallback=\"ordered\" onChange={(value) => onPatch({ configKind: value })} />\n {policy.role && <OptionField label=\"role\" hint=\"注入消息角色:user / assistant\" value={config.role} options={meta.roles} fallback=\"user\" onChange={(value) => onPatch({ role: value })} />}\n {policy.position && <OptionField label=\"position\" hint=\"同层拼接位置:after-user / before-all / after-all\" value={config.position} options={meta.positions} fallback=\"after-user\" onChange={(value) => onPatch({ position: value })} />}\n {policy.merge && <OptionField label=\"mergeMode\" hint=\"merged=同位置配置拼接为一条消息\" value={config.mergeMode} options={meta.mergeModes} fallback=\"separate\" onChange={(value) => onPatch({ mergeMode: value })} />}\n {policy.order && <Field label=\"order\" hint=\"本层排序:数值小者在前(与同层列表上下移动等价)\"><input className={styles.configInput} type=\"number\" step={1} value={config.order ?? 0} onChange={(e) => onPatch({ order: Number(e.target.value) })} /></Field>}\n <Field label=\"group\" hint=\"互斥组名:同 group 且 exclusive=true 时只执行排序后的第一个 enabled 配置\"><input className={styles.configInput} value={config.group ?? ''} spellCheck={false} onChange={(e) => onPatch({ group: e.target.value })} /></Field>\n <label className={styles.configEnable} title={config.exclusive === true ? '点击关闭互斥' : '点击开启互斥'}>\n <span className={styles.configFieldLabel}>exclusive</span>\n <input type=\"checkbox\" aria-label=\"exclusive\" checked={config.exclusive === true} onChange={(e) => onPatch({ exclusive: e.target.checked })} />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n {policy.dedupe && <OptionField label=\"dedupe\" hint=\"session=每会话一次;batch=当前批去重\" value={config.dedupe} options={meta.dedupes} fallback=\"none\" onChange={(value) => onPatch({ dedupe: value })} />}\n {policy.promotion && <OptionField label=\"promotion\" hint=\"none=不要求晋升;main=主会话晋升;include-subagents=子代理跟随\" value={config.promotion} options={meta.promotions} fallback=\"none\" onChange={(value) => onPatch({ promotion: value })} />}\n {policy.audience && <OptionField label=\"消息受众\" hint=\"缺省(通用)=公用,主会话与子代理都注入;main=仅主会话;subagent=仅子代理(专用才标记)\" value={config.audience ?? undefined} options={['', ...meta.audienceModes]} fallback=\"\" labels={AUDIENCE_LABELS} onChange={(value) => onPatch(value === '' ? { audience: null } : { audience: value })} />}\n {policy.modelScope && <OptionField label=\"modelScope\" hint=\"all / pro / flash;flash 按模型名包含 flash 判定\" value={config.modelScope} options={meta.modelScopes} fallback=\"all\" onChange={(value) => onPatch({ modelScope: value })} />}\n {placeholder && <OptionField label=\"fill(placeholder 专用)\" hint=\"instruction-hint / env-facts / skill-catalog\" value={config.fill} options={fillOptions} fallback=\"\" onChange={(value) => onPatch({ fill: value || undefined })} />}\n <OptionField label=\"sourceKind\" hint=\"注入消息 source.kind;默认等于 id\" value={config.sourceKind} options={SOURCE_KINDS} fallback=\"\" keepCurrent onChange={(value) => onPatch({ sourceKind: value || undefined })} />\n <OptionField label=\"form\" hint=\"source.form;默认 notice,hint 用于指令提示\" value={config.form} options={SOURCE_FORMS} fallback=\"notice\" keepCurrent onChange={(value) => onPatch({ form: value || undefined })} />\n <Field label=\"summary\">\n <input className={styles.configInput} value={config.summary ?? ''} spellCheck={false} onChange={(e) => onPatch({ summary: e.target.value })} />\n </Field>\n <Field label=\"templateFile\">\n <input className={styles.configInput} value={config.templateFile ?? ''} spellCheck={false} onChange={(e) => onPatch({ templateFile: e.target.value })} />\n </Field>\n </div>\n <span className={styles.configFieldStack}>\n <span className={styles.configFieldLabel}>{'内容(注入文本;空 = 不注入;变量 {{key}} 插值)'}</span>\n <textarea\n className={styles.configTextarea}\n aria-label=\"注入内容(空 = 不注入)\"\n value={[config.text ?? '', ...(config.texts ?? [])].filter((item) => item.length > 0).join('\\n')}\n spellCheck={false}\n onChange={(e) => {\n autoResizeTextarea(e)\n const next = e.target.value\n // 内容资产(prompt-injector / instruction-hint)走生成目录文件通道(text →\n // params.text);普通配置保存统一写 texts 单段整块(对齐官方 text 单字符串\n // 语义;text 字段兼容读取,编辑后归一)。\n if (config.id === 'prompt-injector' || config.fill === 'instruction-hint') {\n onPatch({ text: next, texts: [] })\n } else {\n onPatch({ text: undefined, texts: next.trim().length > 0 ? [next] : [] })\n }\n }}\n />\n </span>\n <VariablesEditor value={config.variables} onChange={(value) => onPatch({ variables: value })} />\n <StrategyParamsFields strategy={strategy} layer={config.layer} params={config.params} id={config.id} onPatch={(value) => onPatch({ params: value })} />\n <IdentityFields identity={config.identity} onPatch={(value) => onPatch({ identity: value })} />\n </div>\n )\n}\n\n/** 列表卡片(memo 化):props 全部为数据或稳定回调——config 引用变化才重渲染该卡,\n * 129 卡列表编辑/拖拽 hover 时不再整列表级联渲染。 */\nexport const PromptConfigCard = memo(function PromptConfigCard(props: {\n meta: EngineMeta\n config: PromptConfigDraft\n expanded: boolean\n canMoveUp: boolean\n canMoveDown: boolean\n dragging?: boolean\n dropBefore?: boolean\n dropAfter?: boolean\n onToggleExpanded: (id: string) => void\n onToggleEnabled: (id: string, enabled: boolean) => void\n onPatch: (id: string, patch: Partial<PromptConfigDraft>) => void\n onMoveUp: (id: string) => void\n onMoveDown: (id: string) => void\n onDuplicate: (id: string) => void\n onDelete: (id: string) => void\n onDragStart?: (id: string, event: React.DragEvent<HTMLElement>) => void\n onDragOver?: (id: string, event: React.DragEvent<HTMLElement>) => void\n onDrop?: (id: string, event: React.DragEvent<HTMLElement>) => void\n onDragEnd?: () => void\n}): ReactNode {\n const { meta, config } = props\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const enabled = config.enabled !== false\n const policy = fieldPolicyFor(meta, config.layer)\n const chips = [config.layer ?? 'pre-step', config.strategy ?? 'static']\n if (config.fill) chips.push(config.fill)\n if (policy.position) chips.push(`pos=${config.position ?? 'after-user'}`)\n if (config.mergeMode === 'merged') chips.push('merged')\n if ((config.order ?? 0) !== 0) chips.push(`order=${config.order}`)\n if (config.group) chips.push(config.exclusive === true ? `exclusive:${config.group}` : `group:${config.group}`)\n return (\n <article\n className={clsx(styles.configCard, props.expanded && styles.configCardOpen)}\n data-dragging={props.dragging ? '' : undefined}\n data-drop-before={props.dropBefore ? '' : undefined}\n data-drop-after={props.dropAfter ? '' : undefined}\n onDragOver={props.onDragOver === undefined ? undefined : (event) => props.onDragOver!(config.id, event)}\n onDrop={props.onDrop === undefined ? undefined : (event) => props.onDrop!(config.id, event)}\n onDragEnd={props.onDragEnd}\n >\n <header className={styles.configHeader}>\n {props.onDragStart !== undefined && (\n <span\n className={styles.dragHandle}\n title=\"拖动调整顺序\"\n aria-hidden=\"true\"\n draggable\n onDragStart={(event) => props.onDragStart!(config.id, event)}\n >⠿</span>\n )}\n <button type=\"button\" className={styles.configToggle} aria-expanded={props.expanded} onClick={() => props.onToggleExpanded(config.id)}>\n <span className={styles.configTitle}>\n <span className={styles.configTitleRow}>\n <span className={styles.configName}>{config.name && config.name !== config.id ? `${config.id} · ${config.name}` : config.id}</span>\n {config.layer === 'system-section' && config.params?.sectionName === 'deployment:persona' && (\n <span className={styles.configChip} title=\"deployment:persona 同名 shadow:主会话人设(子代理经 scope 链继承)\">人设</span>\n )}\n </span>\n <span className={styles.configMeta}>{chips.join(' · ')}</span>\n </span>\n <IconChevronDownOutline14 className={clsx(styles.chevron, props.expanded && styles.chevronOpen)} />\n </button>\n <span className={styles.configHeaderActions}>\n <label className={styles.configEnable} title={enabled ? '点击关闭' : '点击启用'}>\n <input type=\"checkbox\" checked={enabled} aria-label={`启用 ${config.name ?? config.id}`} onChange={(e) => props.onToggleEnabled(config.id, e.target.checked)} />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n <span className={styles.configActions}>\n <button type=\"button\" className={styles.pillButton} disabled={!props.canMoveUp} onClick={() => props.onMoveUp(config.id)}>上移</button>\n <button type=\"button\" className={styles.pillButton} disabled={!props.canMoveDown} onClick={() => props.onMoveDown(config.id)}>下移</button>\n <button type=\"button\" className={styles.pillButton} onClick={() => props.onDuplicate(config.id)}>复制</button>\n {confirmingDelete ? (\n <>\n <button type=\"button\" className={styles.pillButton} data-danger onClick={() => props.onDelete(config.id)}>确认删除</button>\n <button type=\"button\" className={styles.pillButton} data-variant=\"secondary\" onClick={() => setConfirmingDelete(false)}>取消</button>\n </>\n ) : (\n <button type=\"button\" className={styles.pillButton} data-danger onClick={() => setConfirmingDelete(true)}>删除</button>\n )}\n </span>\n </span>\n </header>\n {props.expanded && <PromptConfigForm meta={meta} config={config} onPatch={(patch) => props.onPatch(config.id, patch)} />}\n </article>\n )\n})\n","import { useCallback, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { bridgePost, errorMessage } from './prompt-tool-bridge.ts'\nimport { PromptConfigCard } from './PromptConfigCard.tsx'\nimport type { EngineMeta, PromptConfigDraft, ValidationErrorEntry } from './prompt-tool-types.ts'\nimport styles from './PromptUi.module.css'\n\ninterface ValidateResult {\n ok: boolean\n valid: boolean\n errors?: ValidationErrorEntry[]\n message?: string\n}\n\nexport interface PromptConfigListProps {\n meta: EngineMeta\n configs: PromptConfigDraft[]\n savedConfigs: PromptConfigDraft[]\n /** 传入 layer 时只展示该层配置;不传展示全部配置。 */\n layer?: string\n /** 传入 scope 时按 audience 作用域过滤:main = 非仅子代理(主会话可见);subagent = 非仅主会话(子代理可见;缺省公用两边都可见)。 */\n scope?: 'main' | 'subagent'\n /** 列表工具栏追加操作(如「新建模板」)。 */\n extraActions?: ReactNode\n /** 列表头部之后、配置卡片之前渲染的固定卡片(如模板变量——归类于配置列表下)。 */\n beforeCards?: ReactNode\n /** 受控层筛选(全部/世界书/层级);未传时内部 state 兜底(子代理页等独立实例)。 */\n viewFilter?: string\n onViewFilterChange?: (value: string) => void\n /** 空状态追加提示(如「当前预设模板该层无配置」)。 */\n emptyHint?: string\n onPatchConfigs: (configs: PromptConfigDraft[]) => void\n onSaveConfigs: (configs: PromptConfigDraft[]) => void\n onNotice: (kind: 'ok' | 'error', message: string) => void\n}\n\nconst layerOf = (config: PromptConfigDraft): string => config.layer ?? 'pre-step'\n\n/** 与列表一致的显示视图排序:按(层序, order, 声明序)稳定排序,返回排序后 id 序列。 */\nfunction viewOrderedIds(\n all: PromptConfigDraft[],\n layer: string | undefined,\n layers: readonly string[],\n): string[] {\n const layerRank = (config: PromptConfigDraft): number => {\n const index = layers.indexOf(layerOf(config))\n return index < 0 ? layers.length : index\n }\n return all\n .map((config, index) => ({ config, index }))\n .filter((entry) => layer === undefined || layerOf(entry.config) === layer)\n .sort((a, b) => {\n const byLayer = layerRank(a.config) - layerRank(b.config)\n if (byLayer !== 0) return byLayer\n const byOrder = (a.config.order ?? 0) - (b.config.order ?? 0)\n if (byOrder !== 0) return byOrder\n return a.index - b.index\n })\n .map((entry) => entry.config.id)\n}\n\n/**\n * 在显示视图中向上/向下移动:目标 = 当前项的显示相邻项(层序/order/声明序),\n * 交换两者的 order 与数组位置——显示顺序与引擎注入顺序(数组序)同步变化。\n * 修复:此前按数组相邻交换,跨层配置混合时数组顺序 ≠ 显示顺序,上移/下移视觉失效。\n */\nfunction moveWithinLayer(\n all: PromptConfigDraft[],\n globalIndex: number,\n delta: -1 | 1,\n layer?: string,\n layers?: readonly string[],\n): PromptConfigDraft[] {\n const currentId = all[globalIndex]?.id\n if (currentId === undefined) return all\n const view = viewOrderedIds(all, layer, layers ?? [])\n const viewIndex = view.indexOf(currentId)\n const targetViewIndex = viewIndex + delta\n if (viewIndex < 0 || targetViewIndex < 0 || targetViewIndex >= view.length) return all\n const targetId = view[targetViewIndex]!\n const currentIndex = all.findIndex((config) => config.id === currentId)\n const targetIndex = all.findIndex((config) => config.id === targetId)\n if (currentIndex < 0 || targetIndex < 0) return all\n const next = [...all]\n const current = next[currentIndex]\n const targetCard = next[targetIndex]\n // 引擎按 order 升序渲染(executor pre-step / layers 同规则):层内移动必须同步\n // 交换 order,否则拖拽后实际注入顺序不变(显示与引擎脱节 = 排序混乱)。\n if (current === undefined || targetCard === undefined) return all\n next[currentIndex] = { ...targetCard, order: current.order ?? 0 }\n next[targetIndex] = { ...current, order: targetCard.order ?? 0 }\n return next\n}\n\n/** 拖拽移动到目标显示位置:把 source 移到 target 前/后,用显示视图相邻交换逐步到位\n * (order 链式交换,与连续点击上移/下移等价)。 */\nfunction moveToView(\n all: PromptConfigDraft[],\n sourceId: string,\n targetId: string,\n before: boolean,\n layer?: string,\n layers?: readonly string[],\n): PromptConfigDraft[] {\n const view = viewOrderedIds(all, layer, layers ?? [])\n const sourceIndex = view.indexOf(sourceId)\n if (sourceIndex < 0) return all\n const rest = view.filter((id) => id !== sourceId)\n const targetIndex = rest.indexOf(targetId)\n if (targetIndex < 0) return all\n const targetViewIndex = targetIndex + (before ? 0 : 1)\n if (targetViewIndex === sourceIndex) return all\n const steps = targetViewIndex - sourceIndex\n const delta: -1 | 1 = steps > 0 ? 1 : -1\n let current = all\n for (let step = 0; step < Math.abs(steps); step++) {\n const globalIndex = current.findIndex((config) => config.id === sourceId)\n if (globalIndex < 0) break\n current = moveWithinLayer(current, globalIndex, delta, layer, layers)\n }\n return current\n}\n\n/** 共享的提示词配置列表:校验、保存、脏检测、复制、删除、层内移动。 */\nexport function PromptConfigList(props: PromptConfigListProps): ReactNode {\n const { meta, configs, savedConfigs, layer, scope, extraActions, beforeCards, viewFilter: viewFilterProp, onViewFilterChange, emptyHint, onPatchConfigs, onSaveConfigs, onNotice } = props\n const [expanded, setExpanded] = useState<string | undefined>(undefined)\n const [errors, setErrors] = useState<ValidationErrorEntry[]>([])\n const [validating, setValidating] = useState(false)\n const [saving, setSaving] = useState(false)\n const [filter, setFilter] = useState('')\n /** 拖拽排序状态:源卡片 id + 落点(目标 id + 前/后)。 */\n const [dragId, setDragId] = useState<string | undefined>(undefined)\n const [dropTarget, setDropTarget] = useState<{ id: string; before: boolean } | undefined>(undefined)\n /** 合并过滤下拉:全部 / 世界书(策略)/ 各注入层级。外部 layer prop 传入时固定该层。 */\n const [innerViewFilter, setInnerViewFilter] = useState<string>('all')\n const viewFilter = viewFilterProp ?? innerViewFilter\n const changeViewFilter = (value: string): void => {\n if (onViewFilterChange !== undefined) onViewFilterChange(value)\n else setInnerViewFilter(value)\n }\n\n const effectiveLayer = layer ?? (viewFilter !== 'all' && viewFilter !== 'world-book' ? viewFilter : undefined)\n const visible = effectiveLayer === undefined\n ? configs\n : configs.filter((config) => layerOf(config) === effectiveLayer)\n const scoped = scope === undefined\n ? visible\n : visible.filter((config) => {\n const mode = config.audience\n return scope === 'main' ? mode !== 'subagent' : mode !== 'main'\n })\n const byStrategy = viewFilter !== 'world-book'\n ? scoped\n : scoped.filter((config) => config.strategy === 'world-book')\n const keyword = filter.trim().toLowerCase()\n const filtered = keyword.length === 0\n ? byStrategy\n : byStrategy.filter((config) =>\n [config.id, config.name ?? '', config.strategy ?? ''].join(' ').toLowerCase().includes(keyword))\n // 显示顺序 = 引擎注入顺序:按(层序, order, 声明序)稳定排序,跨层全量视图\n // 也一致;order 相同时保持数组原序(同值稳定)。\n const layerRank = (config: PromptConfigDraft): number => {\n const index = meta.layers.indexOf(layerOf(config))\n return index < 0 ? meta.layers.length : index\n }\n const ordered = filtered\n .map((config, index) => ({ config, index }))\n .sort((a, b) => {\n const byLayer = layerRank(a.config) - layerRank(b.config)\n if (byLayer !== 0) return byLayer\n const byOrder = (a.config.order ?? 0) - (b.config.order ?? 0)\n if (byOrder !== 0) return byOrder\n return a.index - b.index\n })\n .map((entry) => entry.config)\n /** 按过滤后可见配置一次性启用/禁用(批量开关)。 */\n const batchSetEnabled = (enabled: boolean): void => {\n const visibleIds = new Set(ordered.map((config) => config.id))\n onPatchConfigs(configs.map((config) => visibleIds.has(config.id) ? { ...config, enabled } : config))\n }\n\n // patch 路径从不原地 mutate(均生成新数组),引用比较即可判断脏;省掉每次渲染全量序列化大数组。\n const dirty = configs !== savedConfigs\n\n const runValidate = async (target: PromptConfigDraft[]): Promise<boolean> => {\n setValidating(true)\n try {\n const res = await bridgePost<ValidateResult>('/configs-validate', { promptConfigs: target })\n if (!res.ok) {\n onNotice('error', '校验请求失败:' + (res.message ?? 'settings bridge unavailable'))\n return false\n }\n setErrors(res.value.valid ? [] : res.value.errors ?? [])\n return res.value.valid\n } catch (error) {\n onNotice('error', '校验请求失败:' + errorMessage(error))\n return false\n } finally {\n setValidating(false)\n }\n }\n\n const save = async () => {\n setSaving(true)\n const valid = await runValidate(configs)\n if (valid) {\n setErrors([])\n onSaveConfigs(configs)\n onNotice('ok', `已校验并保存(${configs.length} 条)`)\n }\n setSaving(false)\n }\n\n const discard = () => {\n onPatchConfigs(savedConfigs)\n setErrors([])\n setExpanded(undefined)\n }\n\n // 显示顺序(层序/order/声明序)一次计算:position map 供每张卡判断上移/下移,\n // 此前每张卡各自调 viewOrderedIds(O(n log n) × n)。\n const viewIds = useMemo(() => viewOrderedIds(configs, layer, meta.layers), [configs, layer, meta.layers])\n const positionOf = useMemo(() => new Map(viewIds.map((id, at) => [id, at])), [viewIds])\n\n /** 卡片稳定回调(memo 生效前提):经 liveRef 读最新列表状态,回调引用跨渲染不变。 */\n const liveRef = useRef({ configs, layer, metaLayers: meta.layers, dragId, dropTarget })\n liveRef.current = { configs, layer, metaLayers: meta.layers, dragId, dropTarget }\n const handleToggleExpanded = useCallback((id: string) => {\n setExpanded((current) => current === id ? undefined : id)\n }, [])\n const handleToggleEnabled = useCallback((id: string, enabled: boolean) => {\n const index = liveRef.current.configs.findIndex((item) => item.id === id)\n if (index >= 0) onPatchConfigs(liveRef.current.configs.map((item, at) => at === index ? { ...item, enabled } : item))\n }, [onPatchConfigs])\n const handlePatch = useCallback((id: string, patch: Partial<PromptConfigDraft>) => {\n const index = liveRef.current.configs.findIndex((item) => item.id === id)\n if (index >= 0) onPatchConfigs(liveRef.current.configs.map((item, at) => at === index ? { ...item, ...patch } : item))\n }, [onPatchConfigs])\n const handleMove = useCallback((id: string, delta: -1 | 1) => {\n const { configs: current, layer: currentLayer, metaLayers } = liveRef.current\n const index = current.findIndex((item) => item.id === id)\n if (index >= 0) onPatchConfigs(moveWithinLayer(current, index, delta, currentLayer, metaLayers))\n }, [onPatchConfigs])\n const handleDuplicate = useCallback((id: string) => {\n const current = liveRef.current.configs\n const source = current.find((item) => item.id === id)\n if (source === undefined) return\n let nextId = `${source.id}-copy`\n let suffix = 2\n while (current.some((item) => item.id === nextId)) {\n nextId = `${source.id}-copy${suffix}`\n suffix += 1\n }\n const clone = JSON.parse(JSON.stringify(source)) as PromptConfigDraft\n clone.id = nextId\n onPatchConfigs([...current, clone])\n setExpanded(nextId)\n onNotice('ok', '已复制')\n }, [onNotice, onPatchConfigs])\n const handleDelete = useCallback((id: string) => {\n const current = liveRef.current.configs\n onPatchConfigs(current.filter((item) => item.id !== id))\n setExpanded((value) => value === id ? undefined : value)\n onNotice('ok', '已删除')\n }, [onNotice, onPatchConfigs])\n const handleDragStart = useCallback((id: string, event: React.DragEvent<HTMLElement>) => {\n setDragId(id)\n event.dataTransfer.effectAllowed = 'move'\n }, [])\n const handleDragOver = useCallback((id: string, event: React.DragEvent<HTMLElement>) => {\n event.preventDefault()\n const { dragId: currentDrag } = liveRef.current\n if (currentDrag === undefined || currentDrag === id) return\n const rect = event.currentTarget.getBoundingClientRect()\n setDropTarget({ id, before: event.clientY < rect.top + rect.height / 2 })\n }, [])\n const handleDrop = useCallback((id: string, event: React.DragEvent<HTMLElement>) => {\n event.preventDefault()\n const { configs: current, layer: currentLayer, metaLayers, dragId: source, dropTarget: target } = liveRef.current\n if (source !== undefined && target !== undefined && source !== id) {\n onPatchConfigs(moveToView(current, source, target.id, target.before, currentLayer, metaLayers))\n }\n setDragId(undefined)\n setDropTarget(undefined)\n }, [onPatchConfigs])\n const handleDragEnd = useCallback(() => {\n setDragId(undefined)\n setDropTarget(undefined)\n }, [])\n const handleMoveUp = useCallback((id: string) => handleMove(id, -1), [handleMove])\n const handleMoveDown = useCallback((id: string) => handleMove(id, 1), [handleMove])\n\n const renderCard = (config: PromptConfigDraft) => {\n const position = positionOf.get(config.id) ?? -1\n return (\n <PromptConfigCard\n key={config.id}\n meta={meta}\n config={config}\n expanded={expanded === config.id}\n canMoveUp={position > 0}\n canMoveDown={position >= 0 && position < viewIds.length - 1}\n dragging={dragId === config.id}\n dropBefore={dropTarget?.id === config.id && dropTarget.before}\n dropAfter={dropTarget?.id === config.id && !dropTarget.before}\n onToggleExpanded={handleToggleExpanded}\n onToggleEnabled={handleToggleEnabled}\n onPatch={handlePatch}\n onMoveUp={handleMoveUp}\n onMoveDown={handleMoveDown}\n onDuplicate={handleDuplicate}\n onDelete={handleDelete}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onDragEnd={handleDragEnd}\n />\n )\n }\n\n return (\n <section className={styles.section} aria-labelledby=\"prompt-tool-configs-heading\">\n <div className={styles.sectionHeading}>\n <div><h2 id=\"prompt-tool-configs-heading\">{layer === undefined ? '模块列表' : '本层配置'}</h2><p>{scoped.length} 条配置 · {scoped.filter((config) => config.enabled !== false).length} 条启用;上下移动控制同层顺序。</p></div>\n <div className={styles.sectionActions}>\n {extraActions}\n <button type=\"button\" className={styles.pillButton} disabled={validating} onClick={() => void runValidate(configs)}>{validating && <span className={styles.spinner} aria-hidden=\"true\" />}{validating ? '校验中…' : '校验'}</button>\n <button type=\"button\" className={styles.primaryPill} disabled={saving || validating} onClick={() => void save()}>{saving && <span className={styles.spinner} aria-hidden=\"true\" />}{saving ? '保存中…' : '保存'}</button>\n </div>\n </div>\n\n <div className={styles.listFilterRow}>\n <input\n className={styles.listFilter}\n value={filter}\n aria-label=\"过滤模块列表\"\n placeholder=\"过滤:按 id / 名称…\"\n spellCheck={false}\n onChange={(event) => setFilter(event.target.value)}\n />\n {layer === undefined && (\n <select\n className={styles.listFilter}\n value={viewFilter}\n aria-label=\"按层级或策略过滤\"\n onChange={(event) => changeViewFilter(event.target.value)}\n >\n <option value=\"all\">全部</option>\n <option value=\"world-book\">世界书</option>\n {meta.layers.map((item) => (\n <option key={item} value={item}>层级:{item}</option>\n ))}\n </select>\n )}\n <span className={styles.batchControls}>\n <button type=\"button\" className={styles.pillButton} disabled={ordered.length === 0}\n onClick={() => batchSetEnabled(true)}>启用</button>\n <button type=\"button\" className={styles.pillButton} disabled={ordered.length === 0}\n onClick={() => batchSetEnabled(false)}>禁用</button>\n </span>\n </div>\n\n {errors.length > 0 && (\n <div className={styles.configErrorBox}>\n {errors.map((error, index) => (\n <div key={`${error.index}-${index}`} className={styles.configErrorLine}>[{error.index}] {error.id || '(缺 id)'}:{error.message}</div>\n ))}\n </div>\n )}\n\n {/* 归类于配置列表下的固定卡片(模板变量:可折叠 / 可删除 / 可新建)。 */}\n {beforeCards}\n\n {scoped.length === 0 ? (\n <div className={styles.emptyState}><span className={styles.emptyGlyph} aria-hidden=\"true\">⌁</span><div><h3>{scope === 'subagent' ? '还没有子代理可见的配置' : effectiveLayer === undefined ? '还没有自定义配置' : '本层还没有自定义配置'}</h3><p>{scope === 'subagent' ? '从上方「新建」插入一条(插入后可在卡片「消息受众」下拉自由切换仅主会话/公用/仅子代理),或到主设置「配置」从目录导入。' : effectiveLayer === undefined ? '从上方模板插入一条,或从本地目录导入;默认四条内置配置不受影响。' : '请到主设置「配置」从模板插入或从目录导入。'}</p>{emptyHint !== undefined && <p className={styles.readOnly}>{emptyHint}</p>}</div></div>\n ) : filtered.length === 0 ? (\n <p className={styles.readOnly} role=\"status\">没有匹配「{filter.trim()}」的配置。</p>\n ) : (\n <div className={styles.configList}>\n {ordered.map((config) => renderCard(config))}\n </div>\n )}\n\n <div className={styles.feedback} aria-live=\"polite\">\n {dirty && <p className={styles.readOnly}>模块列表有未保存修改。</p>}\n </div>\n\n <footer className={`${styles.actions} ${dirty ? styles.actionsVisible : ''}`} aria-live=\"polite\">\n <span>{dirty ? '有未保存修改' : ''}</span>\n <div>\n <button type=\"button\" className={styles.pillButton} data-variant=\"secondary\" disabled={saving || !dirty} onClick={discard}>放弃修改</button>\n <button type=\"button\" className={styles.save} disabled={saving || validating || !dirty} onClick={() => void save()}>{saving && <span className={styles.spinner} aria-hidden=\"true\" />}{saving ? '保存中…' : '保存全部'}</button>\n </div>\n </footer>\n </section>\n )\n}","/** 内置模板选择弹窗:按注入层分组展示;传入 layer 时只显示该层模板。 */\nimport { useEffect, useRef, type KeyboardEvent as ReactKeyboardEvent, type ReactNode } from 'react'\nimport styles from './PromptUi.module.css'\nimport type { PromptConfigTemplateEntry } from './prompt-tool-types.ts'\n\nexport const TEMPLATE_LAYER_TITLES: Record<string, string> = {\n 'pre-step': '消息批层',\n 'system-section': '系统段层',\n 'runtime-context': '运行上下文',\n 'agent-request': '调用配置层',\n 'llm-stream': '模型流层',\n 'tool-pipeline': '工具管线层',\n}\n\nexport function TemplatePicker(props: {\n templates: PromptConfigTemplateEntry[]\n /** 传入 layer 时只显示该层模板(无分组标题);不传按层分组展示全部。 */\n layer?: string\n onPick: (entry: PromptConfigTemplateEntry) => void\n /** 可选:自定义工具模板(「工具」分组;点击经 onPickTool 回调工具定义)。 */\n toolTemplates?: Array<{ file: string; spec: Record<string, unknown> }>\n onPickTool?: (spec: Record<string, unknown>) => void\n /** 可选:「模板变量(Variables)」固定入口——点击不插入配置,由宿主展开模板变量卡片。 */\n onPickVariables?: () => void\n onClose: () => void\n}): ReactNode {\n const { templates, layer, onPick, toolTemplates, onPickTool, onPickVariables, onClose } = props\n const dialogRef = useRef<HTMLDivElement>(null)\n const restoreRef = useRef<HTMLElement | null>(null)\n\n // 打开时记录触发元素并聚焦弹窗首控件;关闭时还原焦点(焦点陷阱闭环)。\n useEffect(() => {\n restoreRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null\n dialogRef.current?.querySelector<HTMLElement>('button')?.focus()\n return () => { restoreRef.current?.focus() }\n }, [])\n\n const onDialogKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>): void => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n onClose()\n return\n }\n if (event.key !== 'Tab') return\n const dialog = dialogRef.current\n if (dialog === null) return\n const focusables = [...dialog.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n )].filter((element) => !element.hasAttribute('disabled'))\n if (focusables.length === 0) return\n const first = focusables[0]!\n const last = focusables[focusables.length - 1]!\n const active = document.activeElement\n if (event.shiftKey) {\n if (active === first || !dialog.contains(active)) {\n event.preventDefault()\n last.focus()\n }\n } else if (active === last || !dialog.contains(active)) {\n event.preventDefault()\n first.focus()\n }\n }\n\n const visible = layer === undefined\n ? templates\n : templates.filter((template) => (template.spec.layer ?? 'pre-step') === layer)\n const groups = new Map<string, PromptConfigTemplateEntry[]>()\n for (const template of visible) {\n const key = template.spec.layer ?? 'pre-step'\n const items = groups.get(key)\n if (items === undefined) groups.set(key, [template])\n else items.push(template)\n }\n return (\n <div className={styles.modalBackdrop} onClick={onClose}>\n <div\n ref={dialogRef}\n className={styles.templateModal}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"选择内置模板\"\n onClick={(event) => event.stopPropagation()}\n onKeyDown={onDialogKeyDown}\n >\n <div className={styles.templateModalHead}>\n <strong>选择内置模板{layer !== undefined ? `(${TEMPLATE_LAYER_TITLES[layer] ?? layer})` : ''}</strong>\n <button type=\"button\" className={styles.pillButton} aria-label=\"关闭模板选择\" onClick={onClose}>×</button>\n </div>\n <div className={styles.templateModalList}>\n {onPickVariables !== undefined && (\n <div className={styles.templateGroup}>\n <strong className={styles.templateGroupTitle}>变量</strong>\n <button type=\"button\" className={styles.templateModalItem} onClick={onPickVariables}>\n <strong>Variables</strong>\n <small>{'模板变量(预设级 {{key}} 插值)'}</small>\n </button>\n </div>\n )}\n {visible.length === 0 && (toolTemplates?.length ?? 0) === 0\n && <p className={styles.configFieldHint}>本层暂无内置模板。</p>}\n {[...groups.entries()].map(([groupLayer, items]) => (\n <div key={groupLayer} className={styles.templateGroup}>\n {layer === undefined && <strong className={styles.templateGroupTitle}>{TEMPLATE_LAYER_TITLES[groupLayer] ?? groupLayer}</strong>}\n {items.map((template) => (\n <button key={template.file} type=\"button\" className={styles.templateModalItem} onClick={() => onPick(template)}>\n <strong>{template.file}</strong>\n <small>{template.spec.name ?? template.spec.id}</small>\n </button>\n ))}\n </div>\n ))}\n {toolTemplates !== undefined && toolTemplates.length > 0 && (\n <div className={styles.templateGroup}>\n <strong className={styles.templateGroupTitle}>工具</strong>\n {toolTemplates.map((template) => (\n <button key={template.file} type=\"button\" className={styles.templateModalItem}\n onClick={() => onPickTool?.(template.spec)}>\n <strong>{template.file}</strong>\n <small>{String(template.spec.name ?? template.spec.id ?? '')}</small>\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n )\n}\n","/** 模板库加载 + 插入共享逻辑:PromptConfigsEditor 与各配置列表页(六层/子代理)共用。 */\nimport { useState } from 'react'\nimport { bridgePost, errorMessage } from './prompt-tool-bridge.ts'\nimport type { PromptConfigDraft, PromptConfigTemplateEntry } from './prompt-tool-types.ts'\n\ninterface TemplatesResult {\n ok: boolean\n templates?: PromptConfigTemplateEntry[]\n message?: string\n}\n\nexport function useTemplatePicker(\n configs: PromptConfigDraft[],\n onPickConfig: (config: PromptConfigDraft) => void,\n onNotice: (kind: 'ok' | 'error', message: string) => void,\n): {\n templates: PromptConfigTemplateEntry[]\n open: boolean\n openPicker: () => void\n closePicker: () => void\n pickTemplate: (entry: PromptConfigTemplateEntry) => void\n} {\n const [templates, setTemplates] = useState<PromptConfigTemplateEntry[]>([])\n const [open, setOpen] = useState(false)\n\n const loadTemplates = async (): Promise<void> => {\n if (templates.length > 0) return\n try {\n const res = await bridgePost<TemplatesResult>('/templates', {})\n if (!res.ok) {\n onNotice('error', '读取模板库失败:' + (res.message ?? 'settings bridge unavailable'))\n return\n }\n if (!Array.isArray(res.value.templates)) {\n onNotice('error', '读取模板库失败:模板列表为空')\n return\n }\n setTemplates(res.value.templates)\n } catch (error) {\n onNotice('error', '读取模板库失败:' + errorMessage(error))\n }\n }\n\n const openPicker = (): void => {\n setOpen(true)\n void loadTemplates()\n }\n\n const closePicker = (): void => setOpen(false)\n\n const pickTemplate = (entry: PromptConfigTemplateEntry): void => {\n if (configs.some((config) => config.id === entry.spec.id)) {\n onNotice('error', `id 已存在:${entry.spec.id}(请先改名或删除同 id 配置)`)\n return\n }\n const clone = JSON.parse(JSON.stringify(entry.spec)) as PromptConfigDraft\n onPickConfig(clone)\n onNotice('ok', `已插入模板 ${entry.file}(id=${clone.id})`)\n setOpen(false)\n }\n\n return { templates, open, openPicker, closePicker, pickTemplate }\n}\n","import { useState, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { IconChevronDownOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { TagInput } from './TagInput.tsx'\nimport styles from './PromptUi.module.css'\n\nimport type { PromptToolStore } from './prompt-tool-store.ts'\n\n/** 引擎模块可折叠卡片:与模块列表(PromptConfigList)同款形态——\n * configCard + configToggle + chevron,点击展开 configForm 编辑组合行 config\n * (经 params 参数桥扁平键落 preset.yml)。归类于配置列表下(beforeCards)。\n * layer:6 层注入层级归类(pre-step / system-section / tool-pipeline),\n * 参与模块列表层筛选(layerFilter 联动)。 */\nfunction EngineModuleCard(props: {\n store: PromptToolStore\n name: string\n meta: string\n layer?: string\n children?: ReactNode\n /** 纯开关卡:开关直接渲染在 header 顶层(右侧),卡片不展开、不折叠。 */\n topSwitch?: {\n id: string\n label: string\n hint: string\n checked: boolean\n disabled?: boolean\n onToggle: () => void\n }\n}): ReactNode {\n const [expanded, setExpanded] = useState(false)\n const compact = props.topSwitch !== undefined\n return (\n <article className={styles.configCard}>\n <header className={styles.configHeader}>\n <button type=\"button\" className={styles.configToggle} aria-expanded={expanded} onClick={() => setExpanded(!expanded)}>\n <span className={styles.configTitle}>\n <span className={styles.configTitleRow}>\n <span className={styles.configName}>{props.name}</span>\n {props.layer !== undefined && <span className={styles.configChip}>{props.layer}</span>}\n </span>\n <span className={styles.configMeta}>{props.meta}</span>\n </span>\n {!compact && <IconChevronDownOutline14 className={clsx(styles.chevron, expanded && styles.chevronOpen)} />}\n </button>\n {props.topSwitch !== undefined && (\n <span className={styles.configHeaderActions}>\n <label className={styles.configEnable} htmlFor={props.topSwitch.id} title={props.topSwitch.hint}>\n <input\n id={props.topSwitch.id}\n type=\"checkbox\"\n checked={props.topSwitch.checked}\n disabled={props.topSwitch.disabled}\n aria-label={props.topSwitch.label}\n onChange={props.topSwitch.onToggle}\n />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n </span>\n )}\n </header>\n {expanded && !compact && <div className={styles.configForm}>{props.children}</div>}\n </article>\n )\n}\n\n/** 模型路由模块卡(官方 agent-default-model 层,非引擎模块——归类配置列表下):\n * 主对话/子代理共用同一配置源(缺省继承宿主默认);模型路由与人设按作用域完全分离\n * (main=主对话模型、subagent=子代理模型,参数各自独立)。 */\nexport function ModelRouteModuleCard(props: { store: PromptToolStore; scope: 'main' | 'subagent' }): ReactNode {\n const { store } = props\n const fields = store.fields\n const host = store.hostDefaultModel\n // 宿主默认模型回显:插件参数未设置(空 = 继承宿主)时,下拉可见宿主当前\n // agent-default-model 的可选项(模型目录查询失败/未公布时也能选择与回显)。\n const providerOptions = [...new Set([...store.providers, ...(host?.provider !== undefined && host.provider.length > 0 ? [host.provider] : [])])]\n const provider = props.scope === 'main' ? fields.modelProvider : fields.subagentModelProvider\n const modelName = props.scope === 'main' ? fields.modelName : fields.subagentModelName\n const modelOptions = [...new Set([\n ...(store.modelCatalog[provider] ?? []),\n ...(host?.model !== undefined && host.model.length > 0 ? [host.model] : []),\n ])]\n const reasoningEffortOptions = ['', 'off', 'low', 'high', 'max']\n // 宿主默认思维程度回显(agent-default-model settings reasoningEffort;官方档位同源)。\n const hostEffort = host?.reasoningEffort !== undefined && host.reasoningEffort.length > 0\n ? host.reasoningEffort\n : undefined\n const withCurrent = (options: string[], current: string): string[] =>\n current.length > 0 && !options.includes(current) ? [...options, current] : options\n const active = provider.length > 0 && modelName.length > 0\n const reasoningEffort = props.scope === 'main' ? fields.modelReasoningEffort : fields.subagentReasoningEffort\n const temperature = props.scope === 'main' ? fields.modelTemperature : fields.subagentTemperature\n const maxTokens = props.scope === 'main' ? fields.modelMaxTokens : fields.subagentMaxTokens\n const patchModelParam = (key: 'modelReasoningEffort' | 'modelTemperature' | 'modelMaxTokens' | 'subagentReasoningEffort' | 'subagentTemperature' | 'subagentMaxTokens', value: string): void => {\n store.patch({ [key]: value } as Partial<typeof fields>)\n void store.persistParamOverrides()\n }\n const scopeMeta = props.scope === 'main'\n ? { title: '模型路由', idle: '未设置:展开选择模型(留空 = 继承宿主默认)', active: '固定模型路由已设置(新会话默认模型)' }\n : { title: '子代理模型', idle: '未设置:展开选择模型(留空 = 继承主会话)', active: '子代理固定模型路由已设置' }\n // 主对话卡片:宿主默认模型名回显(子代理默认继承主会话,不回显宿主)。\n const idleMeta = props.scope === 'main' && host?.model !== undefined && host.model.length > 0\n ? `未设置:展开选择模型(当前继承宿主默认 ${host.model})`\n : scopeMeta.idle\n return (\n <EngineModuleCard store={store} name={scopeMeta.title} meta={active ? scopeMeta.active : idleMeta}>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>模型服务商</strong>\n <small>{props.scope === 'main'\n ? '主对话新会话默认模型(agent-default-model);调用方未显式指定时自动补入。检测到的服务商可直接选择。'\n : '子代理固定模型路由(agentOptions 注入 tool-subagent,经预设参数传递);调用方显式模型优先。检测到的服务商可直接选择。'}</small>\n </span>\n <select\n className={styles.configInput}\n aria-label=\"模型服务商\"\n value={provider}\n disabled={!fields.writePreset}\n onChange={(event) => {\n store.patch(props.scope === 'main' ? { modelProvider: event.target.value } : { subagentModelProvider: event.target.value })\n void store.persistParamOverrides()\n }}\n >\n {withCurrent(providerOptions, provider).map((item) => (\n <option key={item} value={item}>{item}</option>\n ))}\n </select>\n </div>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>模型名</strong>\n <small>{props.scope === 'main'\n ? '与模型服务商同时非空时生效(主对话新会话默认模型),例如 deepseek-v4-flash。'\n : '与子代理模型服务商同时非空时生效(子代理固定路由),例如 deepseek-v4-flash。'}</small>\n </span>\n <select\n className={styles.configInput}\n aria-label=\"模型名\"\n value={modelName}\n disabled={!fields.writePreset}\n onChange={(event) => {\n store.patch(props.scope === 'main' ? { modelName: event.target.value } : { subagentModelName: event.target.value })\n void store.persistParamOverrides()\n }}\n >\n {withCurrent(modelOptions, modelName).map((item) => (\n <option key={item} value={item}>{item}</option>\n ))}\n </select>\n </div>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>思维程度</strong>\n <small>reasoningEffort(agent-request patch);官方档位 off / low / high / max;{reasoningEffort.length === 0 && hostEffort !== undefined\n ? `留空 = 继承宿主默认(${hostEffort})。`\n : '留空 = 不设置(模型默认)。'}选择即保存。</small>\n </span>\n <select\n className={styles.configInput}\n aria-label=\"思维程度\"\n value={reasoningEffort}\n disabled={!fields.writePreset}\n onChange={(event) => patchModelParam(\n props.scope === 'main' ? 'modelReasoningEffort' : 'subagentReasoningEffort',\n event.target.value,\n )}\n >\n {withCurrent(hostEffort !== undefined ? [...new Set([...reasoningEffortOptions, hostEffort])] : reasoningEffortOptions, reasoningEffort).map((item) => (\n <option key={item} value={item}>{item.length === 0 ? '(不设置)' : item}</option>\n ))}\n </select>\n </div>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>采样温度</strong>\n <small>temperature(agent-request patch);数字 0–2,留空 = 不设置(模型默认)。失焦保存。</small>\n </span>\n <input\n className={styles.configInput}\n type=\"number\"\n min={0}\n max={2}\n step={0.1}\n aria-label=\"采样温度\"\n value={temperature}\n disabled={!fields.writePreset}\n placeholder=\"不设置\"\n onChange={(event) => patchModelParam(\n props.scope === 'main' ? 'modelTemperature' : 'subagentTemperature',\n event.target.value,\n )}\n onBlur={() => void store.persistParamOverrides()}\n />\n </div>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>输出上限</strong>\n <small>maxTokens(agent-request patch);正整数,留空 = 不设置(模型默认)。失焦保存。</small>\n </span>\n <input\n className={styles.configInput}\n type=\"number\"\n min={1}\n step={1}\n aria-label=\"输出上限\"\n value={maxTokens}\n disabled={!fields.writePreset}\n placeholder=\"不设置\"\n onChange={(event) => patchModelParam(\n props.scope === 'main' ? 'modelMaxTokens' : 'subagentMaxTokens',\n event.target.value,\n )}\n onBlur={() => void store.persistParamOverrides()}\n />\n </div>\n </EngineModuleCard>\n )\n}\n\n/** 工具与深度模块卡(子代理作用域配置;参数经 params 桥扁平键,与主会话引擎模块卡同一来源)。 */\nexport function DelegationToolsModuleCard(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n const fields = store.fields\n const maxDepthOptions = ['', 'provider-managed', '0', '1', '2', '3', '5']\n return (\n <EngineModuleCard store={store} name=\"工具与深度\" meta=\"工具集白名单/黑名单 + 注入 kind 白名单 + 递归深度\">\n <TagInput id=\"pt-tool-filter-allow\" label=\"工具集白名单\" hint=\"toolFilter.allow:主会话常驻过滤(tool-filter 模块,作用于任意注册工具含自定义插件)+ 委派子代理 toolFilter;留空 = 不限制。\"\n value={fields.toolFilterAllow} placeholder=\"read, write, glob\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ toolFilterAllow: value })}\n onCommit={() => void store.persistParamOverrides()} />\n <TagInput id=\"pt-tool-filter-deny\" label=\"工具集黑名单\" hint=\"toolFilter.deny:主会话常驻过滤(tool-filter 模块)+ 委派子代理 toolFilter;留空 = 不限制。\"\n value={fields.toolFilterDeny} placeholder=\"bash, run_code\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ toolFilterDeny: value })}\n onCommit={() => void store.persistParamOverrides()} />\n <TagInput id=\"pt-allow-kinds\" label=\"注入 kind 白名单\" hint=\"context-gate allowKinds(注入门控);例如 skill-invocation、near-anchor、router-guide;留空 = 官方默认(不过滤)。\"\n value={fields.allowKinds} placeholder=\"skill-invocation, near-anchor, router-guide\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ allowKinds: value })}\n onCommit={() => void store.persistParamOverrides()} />\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>递归深度</strong>\n <small>委派 maxDepth:0 禁止委派;provider-managed 由服务商管理;正整数限制递归层数;不设置 = 官方默认。选择即保存。</small>\n </span>\n <select\n className={styles.configInput}\n aria-label=\"递归深度\"\n value={fields.maxDepth}\n disabled={!fields.writePreset}\n onChange={(event) => {\n store.patch({ maxDepth: event.target.value })\n void store.persistParamOverrides()\n }}\n >\n {maxDepthOptions.map((item) => (\n <option key={item} value={item}>{item === '' ? '(不设置)' : item}</option>\n ))}\n </select>\n </div>\n </EngineModuleCard>\n )\n}\n\n/** 引擎模块卡片组(模块列表顶部,按 6 层注入层级归类):\n * tool-bootstrap(system-section)/ context-gate(pre-step)/\n * code-presentation · tool-filter · delegation\n * (tool-pipeline)各一张可折叠模块卡。\n * 语义 = 参数桥扁平键的 UI 化;保存走 params 桥 /param-overrides。\n * layerFilter:模块列表层筛选联动('all' 显示全部;指定层只显示该层;\n * 'world-book' 不显示引擎卡)。 */\nexport function EngineModuleCards(props: { store: PromptToolStore; layerFilter?: string }): ReactNode {\n const { store } = props\n const fields = store.fields\n const layerFilter = props.layerFilter ?? 'all'\n const visible = (layer?: string): boolean =>\n layerFilter === 'all' || (layer !== undefined && layerFilter === layer)\n // 选中层无引擎模块卡时给出提示(引擎模块分布在 pre-step / system-section / tool-pipeline)。\n const hasVisibleCard = layerFilter === 'all' || layerFilter === 'pre-step'\n || layerFilter === 'system-section' || layerFilter === 'tool-pipeline'\n const capped = fields.bootstrapMaxTokens > 0\n const maxDepthOptions = ['', 'provider-managed', '0', '1', '2', '3', '5']\n const gateRow = (id: string, label: string, hint: string, key: 'usePtcMode' | 'promoteGate' | 'promoteAfterFirstResponse' | 'personaSectionsOnly' | 'workspaceLine' | 'toolFilterSubagents' | 'instructionHint' | 'anchorTurn' | 'deliberationGate' | 'cotDrip'): ReactNode => (\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>{label}</strong>\n <small>{hint}</small>\n </span>\n <label className={styles.configEnable} htmlFor={id}>\n <input id={id} type=\"checkbox\" checked={fields[key]} disabled={!fields.writePreset} aria-label={label} onChange={() => store.toggle(key)} />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n </div>\n )\n const numberRow = (id: string, label: string, hint: string, value: number, onCommit: (next: number) => void, min = 0): ReactNode => (\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>{label}</strong>\n <small>{hint}</small>\n </span>\n <input\n className={styles.configInput}\n type=\"number\"\n min={min}\n step={1}\n value={String(value)}\n placeholder=\"1(默认)\"\n disabled={!fields.writePreset}\n aria-label={label}\n onChange={(event) => {\n if (event.target.value.trim() === '') onCommit(0)\n else {\n const parsed = Number(event.target.value)\n if (Number.isSafeInteger(parsed) && parsed >= 0) onCommit(parsed)\n }\n }}\n onBlur={() => void store.persistParamOverrides()}\n />\n </div>\n )\n return (\n <>\n {visible('system-section') && (\n <EngineModuleCard store={store} name=\"tool-bootstrap\" layer=\"system-section\" meta=\"目录相位 · 首轮窄化 / 门控晋升 / 压缩恢复\">\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>首轮输出封顶</strong>\n <small>bootstrapMaxTokens:首轮请求 #1 的 maxTokens(正整数,失焦保存);0 = 不设上限。</small>\n </span>\n <input\n className={styles.configInput}\n type=\"number\"\n min={1}\n step={1}\n value={store.bootstrapTokensDraft}\n disabled={!fields.writePreset || !capped}\n aria-label=\"首轮输出封顶数值\"\n onChange={(event) => store.setBootstrapTokensDraft(event.target.value)}\n onBlur={store.commitBootstrapTokensDraft}\n />\n <label className={styles.configEnable} htmlFor=\"pt-bootstrap-tokens\">\n <input id=\"pt-bootstrap-tokens\" type=\"checkbox\" checked={capped} disabled={!fields.writePreset} aria-label=\"首轮输出封顶\" onChange={store.toggleBootstrapMaxTokens} />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n </div>\n {gateRow('pt-promote-gate', '门控晋升', 'promoteGate:首段 reasoning minimal-like(we 无 let me)+ 工具调用才晋升', 'promoteGate')}\n {gateRow('pt-promote-after', '首响应即晋升', 'promoteAfterFirstResponse:无工具首响应 / 首轮 turn/end 即晋升', 'promoteAfterFirstResponse')}\n {gateRow('pt-persona-only', '首轮只留人设', 'personaSectionsOnly:phase-1 提示词段只留 persona(plan-mode 等晋升后恢复)', 'personaSectionsOnly')}\n {gateRow('pt-workspace-line', '工作目录行', 'workspaceLine:晋升后 persona 附加工作目录行', 'workspaceLine')}\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>首次调用指令</strong>\n <small>phase1FirstCallInstruction:phase-1 persona 追加的首次工具调用指令;空 = 不追加。失焦保存。</small>\n </span>\n <input\n className={styles.configInput}\n type=\"text\"\n value={fields.phase1FirstCallInstruction}\n disabled={!fields.writePreset}\n aria-label=\"首次调用指令\"\n placeholder=\"After your first reasoning block, make one tool call.\"\n onChange={(event) => store.patch({ phase1FirstCallInstruction: event.target.value })}\n onBlur={() => void store.persistParamOverrides()}\n />\n </div>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>门控回退步数</strong>\n <small>maxPromoteSteps:门控模式步数达上限强制晋升;0 = 引擎默认 4。失焦保存。</small>\n </span>\n <input\n className={styles.configInput}\n type=\"number\"\n min={0}\n step={1}\n value={store.gateStepsDraft}\n disabled={!fields.writePreset}\n aria-label=\"门控回退步数\"\n onChange={(event) => store.setGateStepsDraft(event.target.value)}\n onBlur={store.commitGateStepsDraft}\n />\n </div>\n <TagInput id=\"pt-bootstrap-tools\" label=\"首轮窄化集\" hint=\"bootstrapTools:首轮模型可见工具;清空 = 零工具模式(首请求空工具面,assistant/message 后晋升)。回车或逗号添加,× 移除。\"\n value={fields.bootstrapTools} placeholder=\"bash, str_replace_editor\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ bootstrapTools: value })}\n onCommit={() => void store.persistParamOverrides()} />\n <div className={styles.configSectionTitle}>前置锚定轮(anchor-turn 模块)</div>\n {gateRow('pt-anchor-turn', '前置锚定轮', 'anchorTurn:用户首条真实消息前 prepend 合成锚定轮(配合零工具模式 = 空工具面锚定);需模块列表已挂 anchor-turn 行。', 'anchorTurn')}\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>锚定文本</strong>\n <small>anchorTurnText:合成锚定轮文本(如「你是谁」);空 = 引擎默认 \"This round is a test…\"。失焦保存。</small>\n </span>\n <input\n className={styles.configInput}\n type=\"text\"\n value={fields.anchorTurnText}\n disabled={!fields.writePreset}\n aria-label=\"锚定文本\"\n placeholder=\"This round is a test. Tools are not open yet…\"\n onChange={(event) => store.patch({ anchorTurnText: event.target.value })}\n onBlur={() => void store.persistParamOverrides()}\n />\n </div>\n <TagInput id=\"pt-compaction-tools\" label=\"压缩后恢复集\" hint=\"compactionTools:压缩后回到受控相位时的核心工作集(模型中途继续工作)。回车或逗号添加,× 移除。\"\n value={fields.compactionTools} placeholder=\"read, write, edit, glob, grep\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ compactionTools: value })}\n onCommit={() => void store.persistParamOverrides()} />\n <div className={styles.configFieldHint} style={{ marginTop: '6px' }}>\n <strong>渐进披露(stages)</strong>:阶段定义非空即激活多级阶段窄化(替换两相窄化);每阶段模型可见工具 = 当前档 + 预放档。\n </div>\n {fields.stages.map((stage, index) => (\n <div key={`stage-${index}`} className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>{`阶段 ${index + 1}`}</strong>\n <small>名称 + 本阶段工具集(空名称或空工具集的行不写入);上移/下移调整阶段顺序。</small>\n </span>\n <input\n className={styles.configInput}\n type=\"text\"\n value={stage.name}\n disabled={!fields.writePreset}\n aria-label={`阶段 ${index + 1} 名称`}\n placeholder=\"阶段名(如 了解 / 开发 / 验证)\"\n onChange={(event) => {\n const next = [...fields.stages]\n next[index] = { ...stage, name: event.target.value }\n store.patch({ stages: next })\n }}\n onBlur={() => void store.persistParamOverrides()}\n />\n <TagInput\n id={`pt-stage-${index}-tools`}\n label=\"工具集\"\n hint=\"本阶段工具(回车或逗号添加,× 移除)。\"\n value={stage.tools}\n placeholder=\"read, glob, grep\"\n disabled={!fields.writePreset}\n onChange={(value) => {\n const next = [...fields.stages]\n next[index] = { ...stage, tools: value }\n store.patch({ stages: next })\n }}\n onCommit={() => void store.persistParamOverrides()}\n />\n <span className={styles.configActions}>\n <button type=\"button\" className={styles.pillButton} aria-label={`上移阶段 ${index + 1}`} title=\"上移\"\n disabled={!fields.writePreset || index === 0} onClick={() => {\n const next = [...fields.stages]\n ;[next[index - 1], next[index]] = [next[index]!, next[index - 1]!]\n store.patch({ stages: next })\n void store.persistParamOverrides()\n }}>↑</button>\n <button type=\"button\" className={styles.pillButton} aria-label={`下移阶段 ${index + 1}`} title=\"下移\"\n disabled={!fields.writePreset || index >= fields.stages.length - 1} onClick={() => {\n const next = [...fields.stages]\n ;[next[index], next[index + 1]] = [next[index + 1]!, next[index]!]\n store.patch({ stages: next })\n void store.persistParamOverrides()\n }}>↓</button>\n <button type=\"button\" className={styles.pillButton} data-danger aria-label={`删除阶段 ${index + 1}`} title=\"删除\"\n disabled={!fields.writePreset} onClick={() => {\n const next = fields.stages.filter((_, at) => at !== index)\n store.patch({ stages: next })\n void store.persistParamOverrides()\n }}>×</button>\n </span>\n </div>\n ))}\n <div className={styles.configActions}>\n <button type=\"button\" className={styles.pillButton} disabled={!fields.writePreset}\n onClick={() => {\n store.patch({ stages: [...fields.stages, { name: '', tools: '' }] })\n void store.persistParamOverrides()\n }}>+ 添加阶段</button>\n </div>\n {numberRow('pt-stage-pre-unlock', '预放档数', 'stagePreUnlock:调用预放档工具 = 直达其档;0 = 不预放,未设置 = 引擎默认 1。', fields.stagePreUnlock, (next) => store.patch({ stagePreUnlock: next }))}\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>推进工具名</strong>\n <small>stageAdvanceTool:阶段推进工具(模型调用即进下一档);空 = 默认 phase_advance。失焦保存。</small>\n </span>\n <input\n className={styles.configInput}\n type=\"text\"\n value={fields.stageAdvanceTool}\n disabled={!fields.writePreset}\n aria-label=\"推进工具名\"\n placeholder=\"phase_advance\"\n onChange={(event) => store.patch({ stageAdvanceTool: event.target.value })}\n onBlur={() => void store.persistParamOverrides()}\n />\n </div>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>推进工具描述</strong>\n <small>stageAdvanceDescription:阶段推进工具的模型可见描述;空 = 引擎默认。失焦保存。</small>\n </span>\n <input\n className={styles.configInput}\n type=\"text\"\n value={fields.stageAdvanceDescription}\n disabled={!fields.writePreset}\n aria-label=\"推进工具描述\"\n placeholder=\"Advance to the next stage.\"\n onChange={(event) => store.patch({ stageAdvanceDescription: event.target.value })}\n onBlur={() => void store.persistParamOverrides()}\n />\n </div>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>阶段状态模板</strong>\n <small>{'stageSectionTemplate:阶段状态 section 模板({{stage}}/{{stageName}}/{{unlocked}}/{{total}});空 = 不注入。失焦保存。'}</small>\n </span>\n <input\n className={styles.configInput}\n type=\"text\"\n value={fields.stageSectionTemplate}\n disabled={!fields.writePreset}\n aria-label=\"阶段状态模板\"\n placeholder={'Stage {{stageName}} ({{stage}}/{{total}}). Unlocked: {{unlocked}}.'}\n onChange={(event) => store.patch({ stageSectionTemplate: event.target.value })}\n onBlur={() => void store.persistParamOverrides()}\n />\n </div>\n </EngineModuleCard>\n )}\n {visible('pre-step') && (\n <EngineModuleCard store={store} name=\"context-gate\" layer=\"pre-step\" meta=\"注入门控 · 白名单 / 延迟注入 / 指令提示\">\n <TagInput id=\"pt-allow-kinds\" label=\"注入 kind 白名单\" hint=\"allowKinds:context-gate 注入门控;空 = 官方 pre-step 行为(不过滤)。\"\n value={fields.allowKinds} placeholder=\"skill-invocation, near-anchor, router-guide\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ allowKinds: value })}\n onCommit={() => void store.persistParamOverrides()} />\n <TagInput id=\"pt-message-sources\" label=\"消息源白名单\" hint=\"messageSources:phase-1 只放行声明的 source.kind(含 claimed 批);空 = 不启用。\"\n value={fields.messageSources} placeholder=\"user, goal\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ messageSources: value })}\n onCommit={() => void store.persistParamOverrides()} />\n <TagInput id=\"pt-deferred-sources\" label=\"晋升后延迟注入\" hint=\"deferredSources:晋升后延迟 N 步注入的 source kind;空 = 不延迟。\"\n value={fields.deferredSources} placeholder=\"agent-instructions, skill-catalog\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ deferredSources: value })}\n onCommit={() => void store.persistParamOverrides()} />\n {numberRow('pt-deferred-steps', '延迟宽限步数', 'deferredGraceSteps:晋升后前 N 步过滤延迟注入源;0 = 不延迟。', fields.deferredGraceSteps, (next) => store.patch({ deferredGraceSteps: next }))}\n {gateRow('pt-instr-hint', '指令提示转换', 'instructionHint:晋升后 agent-instructions 全文 → 一次性引用提示', 'instructionHint')}\n </EngineModuleCard>\n )}\n {visible('tool-pipeline') && (\n <EngineModuleCard store={store} name=\"工具管线\" layer=\"tool-pipeline\" meta=\"工具设置 · 呈现 / 过滤 / 委派 / 验证\">\n <div className={styles.configSectionTitle}>呈现(code-presentation)</div>\n {gateRow('pt-use-ptc', '使用 PTC 模式', 'usePtcMode:晋升后 Code Mode (PTC) 呈现(默认 false,opt-in);false = 原生完整工具目录', 'usePtcMode')}\n\n <div className={styles.configSectionTitle}>过滤(tool-filter)</div>\n <TagInput id=\"pt-tool-filter-allow\" label=\"工具集白名单\" hint=\"toolFilter.allow:主会话常驻过滤(tool-filter 模块,作用于任意注册工具含自定义插件)+ 委派子代理 toolFilter;留空 = 不限制。\"\n value={fields.toolFilterAllow} placeholder=\"read, write, glob\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ toolFilterAllow: value })}\n onCommit={() => void store.persistParamOverrides()} />\n <TagInput id=\"pt-tool-filter-deny\" label=\"工具集黑名单\" hint=\"toolFilter.deny:主会话常驻过滤(tool-filter 模块)+ 委派子代理 toolFilter;留空 = 不限制。\"\n value={fields.toolFilterDeny} placeholder=\"bash, run_code\" disabled={!fields.writePreset}\n onChange={(value) => store.patch({ toolFilterDeny: value })}\n onCommit={() => void store.persistParamOverrides()} />\n {gateRow('pt-tool-filter-subagents', '子代理同过滤', 'toolFilterSubagents:主会话 tool-filter 也作用于子代理;false/未设置 = 子代理不受主会话过滤限制。', 'toolFilterSubagents')}\n {numberRow('pt-editor-max-output', '编辑器输出上限', 'strReplaceEditorMaxOutputChars:str_replace_editor 单次输出字符上限;16000 = 官方默认。', fields.strReplaceEditorMaxOutputChars, (next) => store.patch({ strReplaceEditorMaxOutputChars: next }), 1)}\n\n <div className={styles.configSectionTitle}>委派(delegation)</div>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>递归深度</strong>\n <small>委派 maxDepth:0 禁止委派;provider-managed 由服务商管理;正整数限制递归层数;不设置 = 官方默认。选择即保存。</small>\n </span>\n <select\n className={styles.configInput}\n aria-label=\"递归深度\"\n value={fields.maxDepth}\n disabled={!fields.writePreset}\n onChange={(event) => {\n store.patch({ maxDepth: event.target.value })\n void store.persistParamOverrides()\n }}\n >\n {maxDepthOptions.map((item) => (\n <option key={item} value={item}>{item === '' ? '(不设置)' : item}</option>\n ))}\n </select>\n </div>\n\n <div className={styles.configSectionTitle}>深思门控(deliberation-gate / cot-drip 模块)</div>\n {gateRow('pt-deliberation-gate', '轨迹深度门', 'deliberationGate:首工具调用前流式深思 < 下限时 deny 一次(规划式提示);需模块列表已挂 deliberation-gate 行。', 'deliberationGate')}\n {numberRow('pt-delib-min-chars', '深思下限', 'deliberationMinChars:首工具调用前的流式深思字符数下限;0 = 引擎默认 400。', fields.deliberationMinChars, (next) => store.patch({ deliberationMinChars: next }))}\n {numberRow('pt-delib-max-gates', '每轮最大门控', 'deliberationMaxGatesPerTurn:每轮最多 deny 次数;0 = 引擎默认 1。', fields.deliberationMaxGatesPerTurn, (next) => store.patch({ deliberationMaxGatesPerTurn: next }))}\n {gateRow('pt-cot-drip', '深思维持节拍', 'cotDrip:每 N 次工具结果滴入一条 \"We…\" 重申提醒(additionalContexts);需模块列表已挂 cot-drip 行。', 'cotDrip')}\n {numberRow('pt-cot-every', '节拍间隔', 'cotDripEvery:每几次工具结果滴入一条;0 = 引擎默认 4(0 禁用由引擎 every:0 语义处理)。', fields.cotDripEvery, (next) => store.patch({ cotDripEvery: next }))}\n {numberRow('pt-cot-max', '每轮最大提醒', 'cotDripMaxPerTurn:每轮最多提醒条数;0 = 引擎默认 1。', fields.cotDripMaxPerTurn, (next) => store.patch({ cotDripMaxPerTurn: next }))}\n </EngineModuleCard>\n )}\n {!hasVisibleCard && (\n <p className={styles.configFieldHint} role=\"status\">\n 该层无引擎模块卡:引擎模块分布在 pre-step(context-gate)/ system-section(tool-bootstrap)/ tool-pipeline(code-presentation · tool-filter · delegation)。\n </p>\n )}\n </>\n )\n}\n","/** 工具管理(tool-pipeline 层):自定义工具定义 + 第三方策略入口。\n * 数据源 preset.yml customTools 段(/custom-tools);工具卡片表单化编辑\n * (kind 专属字段),parameters 行式编辑。内置工具为插件固有注册,\n * 自定义面走 delegate 模板包装(无需开关/描述配置)。 */\nimport { useEffect, useState, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { IconChevronDownOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { bridgePost } from './prompt-tool-bridge.ts'\nimport { Field } from './PromptConfigCard.tsx'\nimport { TemplatePicker } from './TemplatePicker.tsx'\nimport styles from './PromptUi.module.css'\n\n/** 内置工具名(delegate 提示)。 */\nconst BUILTIN_TOOL_NAMES = ['character_list', 'character_import', 'character_apply', 'character_remove', 'character_delete',\n 'world_book_list', 'world_book_upsert', 'world_book_delete', 'session_var']\n\nconst KIND_OPTIONS = ['shell', 'http', 'delegate', 'fs', 'ask-user'] as const\nconst FS_ACTIONS = ['read', 'write', 'append', 'list', 'delete'] as const\nconst HTTP_METHODS = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'] as const\nconst SHELLS = ['pwsh', 'powershell', 'cmd', 'sh', 'bash'] as const\nconst SCHEMA_TYPES = ['string', 'number', 'integer', 'boolean', 'array', 'object', 'json'] as const\n\ntype ToolDraft = Record<string, unknown>\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {}\n}\n\n/** parameters 行式编辑:key + type 下拉 + required 开关 + description,可增删。 */\nfunction ParameterRowsEditor(props: { value: ToolDraft | undefined; onChange: (value: ToolDraft | undefined) => void }): ReactNode {\n const params = asRecord(props.value)\n const rows = Object.entries(params).map(([key, spec]) => {\n const record = asRecord(spec)\n return {\n key,\n type: typeof record.type === 'string' ? record.type : 'string',\n required: record.required === true,\n description: typeof record.description === 'string' ? record.description : '',\n }\n })\n const commit = (next: Array<{ key: string; type: string; required: boolean; description: string }>): void => {\n const out: ToolDraft = {}\n for (const row of next) {\n // 保留空 key 行(「添加参数」新增的待编辑行);空 key 由保存端(save)统一清理,\n // 与 VariablesEditor 同语义——否则添加/清空 key 瞬间行被过滤,按钮失效。\n out[row.key] = {\n type: row.type,\n ...(row.required ? { required: true } : {}),\n ...(row.description.trim().length > 0 ? { description: row.description } : {}),\n }\n }\n props.onChange(Object.keys(out).length > 0 ? out : undefined)\n }\n const setRow = (index: number, patch: Partial<{ key: string; type: string; required: boolean; description: string }>): void => {\n commit(rows.map((row, at) => at === index ? { ...row, ...patch } : row))\n }\n return (\n <span className={styles.configFieldStack}>\n <span className={styles.configFieldLabel}>parameters(模型可见参数 schema)</span>\n {rows.length === 0 && <p className={styles.configFieldHint}>{'无参数;下方添加。required=true 时模型必须提供该参数。'}</p>}\n {rows.map((row, index) => (\n <span key={`${row.key}-${index}`} className={styles.variableRow}>\n <input className={styles.configInput} aria-label=\"参数名\" value={row.key} spellCheck={false} placeholder=\"参数名\"\n onChange={(e) => setRow(index, { key: e.target.value })} />\n <select className={styles.configInput} aria-label=\"参数类型\" value={row.type}\n onChange={(e) => setRow(index, { type: e.target.value })}>\n {SCHEMA_TYPES.map((type) => <option key={type} value={type}>{type}</option>)}\n </select>\n <label className={styles.configEnable} title=\"required\">\n <input type=\"checkbox\" aria-label=\"必填\" checked={row.required}\n onChange={(e) => setRow(index, { required: e.target.checked })} />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n <input className={styles.configInput} aria-label=\"参数描述\" value={row.description} spellCheck={false} placeholder=\"描述\"\n onChange={(e) => setRow(index, { description: e.target.value })} />\n <button type=\"button\" className={styles.pillButton} data-danger aria-label={`删除参数 ${row.key || index}`}\n onClick={() => commit(rows.filter((_, at) => at !== index))}>删除</button>\n </span>\n ))}\n <span>\n <button type=\"button\" className={styles.pillButton} onClick={() => commit([...rows, { key: '', type: 'string', required: false, description: '' }])}>\n 添加参数\n </button>\n </span>\n </span>\n )\n}\n\n/** 单张工具卡片(对齐模块列表卡片形态):header(enabled 开关 + chips + 上移/下移/复制/两段式删除)+ Field 表单。 */\nfunction CustomToolCard(props: {\n tool: ToolDraft\n index: number\n expanded: boolean\n onToggleExpanded: () => void\n onPatch: (patch: Partial<ToolDraft>) => void\n onToggleEnabled: (enabled: boolean) => void\n onMoveUp: () => void\n onMoveDown: () => void\n onDuplicate: () => void\n onRemove: () => void\n canMoveUp: boolean\n canMoveDown: boolean\n}): ReactNode {\n const { tool, index } = props\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const execute = asRecord(tool.execute)\n const kind = typeof execute.kind === 'string' ? execute.kind : 'shell'\n const name = typeof tool.name === 'string' ? tool.name : ''\n const id = typeof tool.id === 'string' ? tool.id : `tool-${index + 1}`\n const description = typeof tool.description === 'string' ? tool.description : ''\n const enabled = tool.enabled !== false\n const paramCount = Object.keys(asRecord(tool.parameters)).length\n const chips = [kind]\n if (paramCount > 0) chips.push(`${paramCount} 参数`)\n if (Number.isSafeInteger(tool.timeoutMs) && (tool.timeoutMs as number) > 0) chips.push(`timeout=${tool.timeoutMs}`)\n const patchExecute = (patch: Record<string, unknown>): void => {\n props.onPatch({ execute: { ...execute, ...patch } })\n }\n const patchJson = (field: string, value: ToolDraft | undefined): void => {\n props.onPatch({ [field]: value ?? {} })\n }\n return (\n <article className={clsx(styles.configCard, props.expanded && styles.configCardOpen)}>\n <header className={styles.configHeader}>\n <button type=\"button\" className={styles.configToggle} aria-expanded={props.expanded} onClick={props.onToggleExpanded}>\n <span className={styles.configTitle}>\n <span className={styles.configTitleRow}>\n <span className={styles.configName}>{name.length > 0 ? `${id} · ${name}` : id}</span>\n <span className={styles.configChip}>{kind}</span>\n </span>\n <span className={styles.configMeta}>{description || '(无描述)'}{chips.length > 1 && ` · ${chips.slice(1).join(' · ')}`}</span>\n </span>\n <IconChevronDownOutline14 className={clsx(styles.chevron, props.expanded && styles.chevronOpen)} />\n </button>\n <span className={styles.configHeaderActions}>\n <label className={styles.configEnable} title={enabled ? '点击停用(enabled=false 不注册)' : '点击启用'}>\n <input type=\"checkbox\" aria-label={`启用工具 ${id}`} checked={enabled}\n onChange={(e) => props.onToggleEnabled(e.target.checked)} />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n <span className={styles.configActions}>\n <button type=\"button\" className={styles.pillButton} disabled={!props.canMoveUp} onClick={props.onMoveUp}>上移</button>\n <button type=\"button\" className={styles.pillButton} disabled={!props.canMoveDown} onClick={props.onMoveDown}>下移</button>\n <button type=\"button\" className={styles.pillButton} onClick={props.onDuplicate}>复制</button>\n {confirmingDelete ? (\n <>\n <button type=\"button\" className={styles.pillButton} data-danger onClick={props.onRemove}>确认删除</button>\n <button type=\"button\" className={styles.pillButton} data-variant=\"secondary\" onClick={() => setConfirmingDelete(false)}>取消</button>\n </>\n ) : (\n <button type=\"button\" className={styles.pillButton} data-danger onClick={() => setConfirmingDelete(true)}>删除</button>\n )}\n </span>\n </span>\n </header>\n {props.expanded && (\n <div className={styles.configForm}>\n <span className={styles.variableRow}>\n <Field label=\"id(文件标识)\">\n <input className={styles.configInput} aria-label=\"工具 id\" value={id} spellCheck={false}\n onChange={(e) => props.onPatch({ id: e.target.value })} />\n </Field>\n <Field label=\"name(模型可见名)\">\n <input className={styles.configInput} aria-label=\"工具名\" value={name} spellCheck={false} placeholder=\"my_tool\"\n onChange={(e) => props.onPatch({ name: e.target.value })} />\n </Field>\n </span>\n <Field label=\"description(模型可见描述)\">\n <textarea className={styles.configTextarea} rows={2} aria-label=\"工具描述\" value={description} spellCheck={false}\n placeholder=\"描述该工具给模型看\"\n onChange={(e) => props.onPatch({ description: e.target.value })} />\n </Field>\n <Field label=\"execute.kind(执行器)\" hint=\"shell=命令;http=请求;delegate=委托内置/已注册工具;fs=工作区文件;ask-user=询问用户\">\n <select className={styles.configInput} aria-label=\"执行器\" value={kind}\n onChange={(e) => patchExecute({ kind: e.target.value })}>\n {KIND_OPTIONS.map((option) => <option key={option} value={option}>{option}</option>)}\n </select>\n </Field>\n {kind === 'shell' && (\n <>\n <Field label=\"command\" hint={'{{args.x}} 参数插值;env 白名单;cwd=会话工作区'}>\n <textarea className={styles.configTextarea} rows={3} aria-label=\"shell 命令\" spellCheck={false}\n value={typeof execute.command === 'string' ? execute.command : ''} placeholder=\"Write-Output {{args.x}}\"\n onChange={(e) => patchExecute({ command: e.target.value })} />\n </Field>\n <Field label=\"shell\" hint=\"pwsh 强制 UTF-8 输出(中文不乱码)\">\n <select className={styles.configInput} aria-label=\"shell\"\n value={typeof execute.shell === 'string' ? execute.shell : 'pwsh'}\n onChange={(e) => patchExecute({ shell: e.target.value })}>\n {SHELLS.map((shell) => <option key={shell} value={shell}>{shell}</option>)}\n </select>\n </Field>\n </>\n )}\n {kind === 'http' && (\n <>\n <Field label=\"url\" hint={'{{args.x}} 参数插值'}>\n <input className={styles.configInput} aria-label=\"请求 URL\" spellCheck={false}\n value={typeof execute.url === 'string' ? execute.url : ''} placeholder=\"https://…/{{args.q}}\"\n onChange={(e) => patchExecute({ url: e.target.value })} />\n </Field>\n <Field label=\"method\">\n <select className={styles.configInput} aria-label=\"请求方法\"\n value={typeof execute.method === 'string' ? execute.method : 'GET'}\n onChange={(e) => patchExecute({ method: e.target.value })}>\n {HTTP_METHODS.map((method) => <option key={method} value={method}>{method}</option>)}\n </select>\n </Field>\n </>\n )}\n {kind === 'delegate' && (\n <Field label=\"tool(委托目标)\" hint={`内置工具:${BUILTIN_TOOL_NAMES.join(' / ')}`}>\n <input className={styles.configInput} aria-label=\"委托目标工具\" spellCheck={false}\n value={typeof execute.tool === 'string' ? execute.tool : ''} placeholder=\"world_book_upsert\"\n onChange={(e) => patchExecute({ tool: e.target.value })} />\n </Field>\n )}\n {kind === 'fs' && (\n <>\n <Field label=\"action\">\n <select className={styles.configInput} aria-label=\"fs 动作\"\n value={typeof execute.action === 'string' && (FS_ACTIONS as readonly string[]).includes(execute.action) ? execute.action : 'read'}\n onChange={(e) => patchExecute({ action: e.target.value })}>\n {FS_ACTIONS.map((action) => <option key={action} value={action}>{action}</option>)}\n </select>\n </Field>\n <Field label=\"path\" hint=\"相对工作区路径;越界拒绝\">\n <input className={styles.configInput} aria-label=\"文件路径\" spellCheck={false}\n value={typeof execute.path === 'string' ? execute.path : ''} placeholder=\"data/{{args.name}}.json\"\n onChange={(e) => patchExecute({ path: e.target.value })} />\n </Field>\n </>\n )}\n {kind === 'ask-user' && (\n <Field label=\"question(向用户确认的问题)\">\n <input className={styles.configInput} aria-label=\"询问问题\" spellCheck={false}\n value={typeof execute.question === 'string' ? execute.question : ''} placeholder=\"是否继续执行该操作?\"\n onChange={(e) => patchExecute({ question: e.target.value })} />\n </Field>\n )}\n <ParameterRowsEditor\n value={asRecord(tool.parameters)}\n onChange={(next) => props.onPatch({ parameters: next })}\n />\n <Field label=\"output.schema(JSON;默认开放对象)\">\n <textarea className={styles.configTextarea} rows={4} aria-label=\"输出 schema JSON\" spellCheck={false}\n value={JSON.stringify(asRecord(tool.output), null, 2) === '{}' ? '' : JSON.stringify(asRecord(tool.output), null, 2)}\n onChange={(e) => {\n const text = e.target.value.trim()\n if (text.length === 0) { props.onPatch({ output: { schema: { type: 'object', additionalProperties: true } } }); return }\n try { patchJson('output', JSON.parse(text) as ToolDraft) } catch { /* 解析失败不落盘 */ }\n }} />\n </Field>\n </div>\n )}\n </article>\n )\n}\n/** 工具管理区块(tool-pipeline 层可见):标题 + 工具卡片列表。 */\nexport function CustomToolsModuleCard(props: {\n expanded: boolean\n onToggleExpanded: () => void\n onNotice: (kind: 'ok' | 'error', message: string) => void\n}): ReactNode {\n const [tools, setTools] = useState<ToolDraft[]>([])\n const [toolTemplates, setToolTemplates] = useState<Array<{ file: string; spec: ToolDraft }>>([])\n const [pickerOpen, setPickerOpen] = useState(false)\n const [expandedCards, setExpandedCards] = useState<Set<number>>(new Set())\n const [loaded, setLoaded] = useState(false)\n const [saving, setSaving] = useState(false)\n useEffect(() => {\n if (loaded || !props.expanded) return\n void (async () => {\n const [customResult, templatesResult] = await Promise.all([\n bridgePost<{ customTools?: unknown[] }>('/custom-tools', {}),\n bridgePost<{ toolTemplates?: Array<{ file: string; spec: ToolDraft }> }>('/templates', {}),\n ])\n setTools((customResult.ok ? customResult.value?.customTools ?? [] : []).map((tool) => asRecord(tool)))\n setToolTemplates(templatesResult.ok ? templatesResult.value?.toolTemplates ?? [] : [])\n setLoaded(true)\n })()\n }, [props.expanded, loaded])\n const save = (): void => {\n // 保存前清理:工具 parameters 的空 key 待编辑行(与 presetVariables 保存端清理对齐)。\n const cleanTools = tools.map((tool) => {\n const params = asRecord(tool.parameters)\n const clean: ToolDraft = {}\n for (const [key, value] of Object.entries(params)) {\n if (key.trim().length === 0) continue\n clean[key] = value\n }\n const next = { ...tool }\n if (Object.keys(clean).length > 0) next.parameters = clean\n else delete next.parameters\n return next\n })\n setSaving(true)\n void bridgePost<{ customTools?: unknown[] }>('/custom-tools', { customTools: cleanTools }).then((customResult) => {\n setSaving(false)\n if (customResult.ok) {\n props.onNotice('ok', `已保存 ${tools.length} 个自定义工具(已重建)`)\n } else {\n props.onNotice('error', ('message' in customResult ? customResult.message : undefined) ?? '保存失败')\n }\n })\n }\n const insertTemplate = (spec: ToolDraft): void => {\n if (tools.some((tool) => tool.id === spec.id)) {\n props.onNotice('error', `工具 id 已存在:${String(spec.id)}`)\n return\n }\n const clone = JSON.parse(JSON.stringify(spec)) as ToolDraft\n setTools([...tools, clone])\n setExpandedCards(new Set([...expandedCards, tools.length]))\n props.onNotice('ok', `已插入工具模板 ${String(spec.id)}(保存后生效)`)\n setPickerOpen(false)\n }\n const patchTool = (index: number, patch: Partial<ToolDraft>): void => {\n setTools(tools.map((tool, at) => at === index ? { ...tool, ...patch } : tool))\n }\n const toggleCard = (index: number): void => {\n const next = new Set(expandedCards)\n if (next.has(index)) next.delete(index)\n else next.add(index)\n setExpandedCards(next)\n }\n return (\n <section aria-label=\"自定义工具\">\n <div className={clsx(styles.sectionHeading, styles.toolHeading)}>\n <div>\n <h2>\n <button type=\"button\" className={styles.configToggle} aria-expanded={props.expanded} onClick={props.onToggleExpanded}>\n <span className={styles.configName}>自定义工具<span className={styles.toolHeadingDot} aria-hidden=\"true\" /></span>\n <IconChevronDownOutline14 className={clsx(styles.chevron, props.expanded && styles.chevronOpen)} />\n </button>\n </h2>\n <p>{`${tools.length} 个自定义工具 · 第三方策略见下方模块卡片`}</p>\n </div>\n <span className={styles.configActions}>\n <button type=\"button\" className={styles.pillButton} onClick={() => setPickerOpen(true)}>从模板新建</button>\n <button type=\"button\" className={styles.pillButton}\n onClick={() => setTools([...tools, {\n id: `tool-${tools.length + 1}`,\n name: 'my_tool',\n description: '',\n output: { schema: { type: 'object', additionalProperties: true } },\n execute: { kind: 'shell', command: '' },\n }])}>\n 添加工具\n </button>\n <button type=\"button\" className={styles.primaryPill} disabled={saving} onClick={save}>\n {saving ? '保存中…' : '保存'}\n </button>\n </span>\n </div>\n {props.expanded && (\n <div className={styles.configList} style={{ marginTop: 10 }}>\n {tools.map((tool, index) => (\n <CustomToolCard\n key={`${String(tool.id ?? '')}-${index}`}\n tool={tool}\n index={index}\n expanded={expandedCards.has(index)}\n onToggleExpanded={() => toggleCard(index)}\n onPatch={(patch) => patchTool(index, patch)}\n onToggleEnabled={(enabled) => patchTool(index, { enabled })}\n onMoveUp={() => setTools(tools.map((item, at) => {\n if (at === index) return tools[index - 1]!\n if (at === index - 1) return tools[index]!\n return item\n }))}\n onMoveDown={() => setTools(tools.map((item, at) => {\n if (at === index) return tools[index + 1]!\n if (at === index + 1) return tools[index]!\n return item\n }))}\n onDuplicate={() => setTools([...tools.slice(0, index + 1), {\n ...JSON.parse(JSON.stringify(tool)) as ToolDraft,\n id: `${String(tool.id ?? 'tool')}-copy`,\n }, ...tools.slice(index + 1)])}\n onRemove={() => setTools(tools.filter((_, at) => at !== index))}\n canMoveUp={index > 0}\n canMoveDown={index < tools.length - 1}\n />\n ))}\n {tools.length === 0 && <p className={styles.configFieldHint}>{'无自定义工具;从模板新建或直接添加。'}</p>}\n </div>\n )}\n {pickerOpen && (\n <TemplatePicker\n templates={[]}\n toolTemplates={toolTemplates}\n onPick={() => {}}\n onPickTool={insertTemplate}\n onClose={() => setPickerOpen(false)}\n />\n )}\n </section>\n )\n}\n","import { useEffect, useRef, useState, type FocusEvent, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { IconChevronDownOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { PromptConfigList } from './PromptConfigList.tsx'\nimport { TemplatePicker } from './TemplatePicker.tsx'\nimport { useTemplatePicker } from './useTemplatePicker.ts'\nimport { VariablesEditor } from './PromptConfigCard.tsx'\nimport { EngineModuleCards, ModelRouteModuleCard } from './EngineModuleCards.tsx'\nimport { CustomToolsModuleCard } from './CustomToolsModuleCard.tsx'\nimport styles from './PromptUi.module.css'\n\nimport type { EngineMeta, PromptConfigDraft } from './prompt-tool-types.ts'\nimport type { PromptToolStore } from './prompt-tool-store.ts'\n\nexport type { PromptConfigDraft, LayerFieldPolicy } from './prompt-tool-types.ts'\nexport type { ValidationErrorEntry } from './prompt-tool-types.ts'\nexport { Field, JsonField, PromptConfigCard, PromptConfigForm, SOURCE_FORMS, SOURCE_KINDS, fieldPolicyFor } from './PromptConfigCard.tsx'\n\nexport type { PromptConfigTemplateEntry } from './prompt-tool-types.ts'\n\nexport interface PromptConfigsEditorProps {\n meta: EngineMeta\n configs: PromptConfigDraft[]\n savedConfigs: PromptConfigDraft[]\n onPatchConfigs: (configs: PromptConfigDraft[]) => void\n onSaveConfigs: (configs: PromptConfigDraft[]) => void\n onNotice: (kind: 'ok' | 'error', message: string) => void\n /** 预设级模板变量(preset.yml 顶层 variables 段;编辑入口与模块列表统一)。 */\n templateVariables: Record<string, string>\n setTemplateVariables: (value: Record<string, string>) => void\n templateVariablesEnabled: boolean\n setTemplateVariablesEnabled: (value: boolean) => void\n saveTemplateVariables: (next?: Record<string, string>) => Promise<void>\n /** 引擎模块配置(tool-bootstrap 等组合行 config 卡片,同模块列表形态)。 */\n store: PromptToolStore\n}\n\n/** 预设级模板变量模块卡片(归类于配置列表下):{{key}} 插值源,非 promptConfig——\n * 不进配置保存路径,保存走 /preset-variables 写 preset.yml 顶层 variables 段。\n * 可折叠(chevron)/ 可删除(清空全部变量,两段式确认)/ 可新建(VariablesEditor 添加变量)。 */\nfunction TemplateVariablesModuleCard(props: {\n templateVariables: Record<string, string>\n setTemplateVariables: (value: Record<string, string>) => void\n templateVariablesEnabled: boolean\n setTemplateVariablesEnabled: (value: boolean) => void\n saveTemplateVariables: (next?: Record<string, string>) => Promise<void>\n expanded: boolean\n onToggleExpanded: () => void\n}): ReactNode {\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const cardRef = useRef<HTMLElement>(null)\n const count = Object.keys(props.templateVariables).length\n const enabled = props.templateVariablesEnabled\n // 无变量时不显示卡片(模块列表恢复干净;「新建 → Variables」添加空行后自动出现)。\n if (count === 0) return null\n const clearAll = (): void => {\n props.setTemplateVariables({})\n void props.saveTemplateVariables({})\n setConfirmingDelete(false)\n if (props.expanded) props.onToggleExpanded()\n }\n /** 失焦自动保存:焦点离开卡片容器(含收起/切换开关/点击删除)即持久化。 */\n const autoSaveOnBlur = (event: FocusEvent<HTMLElement>): void => {\n const next = event.relatedTarget\n if (next === null || !cardRef.current?.contains(next as Node)) {\n void props.saveTemplateVariables()\n }\n }\n return (\n <article ref={cardRef} className={styles.configCard} onBlur={autoSaveOnBlur}>\n <header className={styles.configHeader}>\n <button type=\"button\" className={styles.configToggle} aria-expanded={props.expanded} onClick={props.onToggleExpanded}>\n <span className={styles.configTitle}>\n <span className={styles.configName}>模板变量</span>\n <span className={styles.configMeta}>{`预设级 {{key}} 插值 · ${count} 个变量`}</span>\n </span>\n <IconChevronDownOutline14 className={clsx(styles.chevron, props.expanded && styles.chevronOpen)} />\n </button>\n <span className={styles.configHeaderActions}>\n <label className={styles.configEnable} title={enabled ? '点击停用模板变量插值' : '点击启用模板变量插值'}>\n <input\n type=\"checkbox\"\n aria-label=\"启用模板变量插值\"\n checked={enabled}\n onChange={(e) => {\n props.setTemplateVariablesEnabled(e.target.checked)\n void props.saveTemplateVariables()\n }}\n />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n <span className={styles.configActions}>\n {confirmingDelete ? (\n <>\n <button type=\"button\" className={styles.pillButton} data-danger onClick={clearAll}>确认清空</button>\n <button type=\"button\" className={styles.pillButton} data-variant=\"secondary\" onClick={() => setConfirmingDelete(false)}>取消</button>\n </>\n ) : (\n <button type=\"button\" className={styles.pillButton} data-danger onClick={() => setConfirmingDelete(true)}>删除</button>\n )}\n </span>\n </span>\n </header>\n {props.expanded && (\n <div className={styles.configForm}>\n {!enabled && <p className={styles.configFieldHint}>{'模板变量插值已停用:{{key}} 将不再被替换(预设级变量文件不生成)。'}</p>}\n <VariablesEditor value={props.templateVariables} onChange={(next) => props.setTemplateVariables(next ?? {})} />\n </div>\n )}\n </article>\n )\n}\n\n\n/** 提示词配置编辑器:配置列表(层级/策略过滤已并入列表)+ 模板插入 + 保存前权威校验。 */\nexport function PromptConfigsEditor(props: PromptConfigsEditorProps): ReactNode {\n const [templateVarsExpanded, setTemplateVarsExpanded] = useState(false)\n const [customToolsExpanded, setCustomToolsExpanded] = useState(false)\n /** 层筛选状态(模块列表下拉联动引擎模块卡:选中层只显示该层引擎模块)。 */\n const [layerFilter, setLayerFilter] = useState('all')\n // 进入 tool-pipeline 层时自动展开工具管理(工具域视图)。\n useEffect(() => {\n if (layerFilter === 'tool-pipeline') setCustomToolsExpanded(true)\n }, [layerFilter])\n const templatePicker = useTemplatePicker(\n props.configs,\n (config) => props.onPatchConfigs([...props.configs, config]),\n props.onNotice,\n )\n /** 「新建 → Variables」:展开模板变量卡片并添加一个待编辑空行。 */\n const pickVariables = (): void => {\n props.setTemplateVariables({ ...props.templateVariables, '': '' })\n setTemplateVarsExpanded(true)\n templatePicker.closePicker()\n }\n return (\n <section className={styles.page} aria-label=\"提示词配置\">\n <div className={styles.configList}>\n <ModelRouteModuleCard store={props.store} scope=\"main\" />\n <EngineModuleCards store={props.store} layerFilter={layerFilter} />\n </div>\n <PromptConfigList\n meta={props.meta}\n configs={props.configs}\n savedConfigs={props.savedConfigs}\n viewFilter={layerFilter}\n onViewFilterChange={setLayerFilter}\n extraActions={<button type=\"button\" className={styles.primaryPill} onClick={templatePicker.openPicker}>新建</button>}\n beforeCards={\n <>\n {layerFilter === 'tool-pipeline' && (\n <CustomToolsModuleCard\n expanded={customToolsExpanded}\n onToggleExpanded={() => setCustomToolsExpanded(!customToolsExpanded)}\n onNotice={props.onNotice}\n />\n )}\n <TemplateVariablesModuleCard\n templateVariables={props.templateVariables}\n setTemplateVariables={props.setTemplateVariables}\n templateVariablesEnabled={props.templateVariablesEnabled}\n setTemplateVariablesEnabled={props.setTemplateVariablesEnabled}\n saveTemplateVariables={props.saveTemplateVariables}\n expanded={templateVarsExpanded}\n onToggleExpanded={() => setTemplateVarsExpanded(!templateVarsExpanded)}\n />\n </>\n }\n onPatchConfigs={props.onPatchConfigs}\n onSaveConfigs={props.onSaveConfigs}\n onNotice={props.onNotice}\n />\n\n {templatePicker.open && (\n <TemplatePicker\n templates={templatePicker.templates}\n onPick={templatePicker.pickTemplate}\n onPickVariables={pickVariables}\n onClose={templatePicker.closePicker}\n />\n )}\n\n <p className={styles.settingsNote}>提示词配置写入 <code>settings.promptConfigs</code>;外部提示词配置可经「预设配置 → 导入预设」引入。</p>\n </section>\n )\n}\n","/** fields 订阅式选择器(L3 selector 化):\n * 组件通过 useSyncExternalStore 订阅 store.fields 的引用变化,仅在所选切片\n * 变化时重渲染——配合 React.memo 组件,父级重渲染不再级联触发子组件。\n * 注意 selector 只在 fields 引用变化时执行一次,返回引用由组件 ref 缓存。\n */\nimport { useRef, useSyncExternalStore } from 'react'\nimport type { Fields } from './prompt-tool-bridge.ts'\nimport type { PromptToolStore } from './prompt-tool-store.ts'\n\nexport function usePromptToolFields<T>(store: PromptToolStore, selector: (fields: Fields) => T): T {\n const fields = useSyncExternalStore(store.subscribeFields, store.getFields, store.getFields)\n const cache = useRef<{ fields: Fields | undefined; value: T }>({ fields: undefined, value: undefined as unknown as T })\n if (cache.current.fields !== fields) {\n cache.current = { fields, value: selector(fields) }\n }\n return cache.current.value\n}","/** 预设切换器:预设全部在用户目录(首次启动种子化),列表点击切换;新建 = 从内置模板复制还原。 */\nimport { memo, useEffect, useRef, useState, type KeyboardEvent as ReactKeyboardEvent, type ReactNode } from 'react'\nimport { usePromptToolFields } from './use-prompt-tool-fields.ts'\nimport clsx from 'clsx'\nimport { IconCopyOutline16, IconFolderOpenOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { bridgePost } from './prompt-tool-bridge.ts'\nimport type { PromptToolStore } from './prompt-tool-store.ts'\nimport styles from './PromptUi.module.css'\n\nexport const PresetSwitcher = memo(function PresetSwitcher(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n const fields = usePromptToolFields(store, (value) => value)\n const presets = store.meta.presets ?? []\n const templates = store.meta.builtinTemplates ?? []\n const [importing, setImporting] = useState(false)\n const [confirmingDelete, setConfirmingDelete] = useState<string | undefined>(undefined)\n const [pickerOpen, setPickerOpen] = useState(false)\n const dialogRef = useRef<HTMLDivElement>(null)\n const yamlRef = useRef<HTMLInputElement>(null)\n const dirRef = useRef<HTMLInputElement>(null)\n\n // 新建弹窗:聚焦首控件 + Esc 关闭。\n useEffect(() => {\n if (!pickerOpen) return\n dialogRef.current?.querySelector<HTMLElement>('button')?.focus()\n const onKeyDown = (event: globalThis.KeyboardEvent): void => {\n if (event.key === 'Escape') setPickerOpen(false)\n }\n document.addEventListener('keydown', onKeyDown)\n return () => document.removeEventListener('keydown', onKeyDown)\n }, [pickerOpen])\n\n /** 上传预设包:path 为相对路径(preset.yml 或文件夹内文件),服务端按 id 归入用户预设目录。 */\n const uploadPreset = async (entries: Array<{ path: string; content: string }>): Promise<void> => {\n if (entries.length === 0) return\n setImporting(true)\n try {\n const res = await bridgePost<{ id: string }>('/import-preset-package', { files: entries })\n if (res.ok) {\n store.showNotice('ok', `预设 ${res.value.id} 已导入,点击卡片即可切换`)\n await store.load()\n } else {\n store.showNotice('error', '导入预设失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n } finally {\n setImporting(false)\n }\n }\n\n /** 导入单个配置文件:preset.yml / 任意 *.yml/*.yaml / SillyTavern *.json(服务端按扩展名分流)。 */\n const pickPresetYaml = (file: File | undefined): void => {\n if (file === undefined) return\n void (async () => {\n const path = /\\.json$/i.test(file.name) ? file.name : 'preset.yml'\n await uploadPreset([{ path, content: await file.text() }])\n })()\n }\n\n /** 导入整个预设文件夹(webkitdirectory;传原始相对路径,顶层目录段由服务端剥离)。 */\n const pickPresetDir = (files: FileList | null): void => {\n if (files === null || files.length === 0) return\n void (async () => {\n const entries: Array<{ path: string; content: string }> = []\n for (const file of Array.from(files)) {\n entries.push({ path: file.webkitRelativePath || file.name, content: await file.text() })\n }\n await uploadPreset(entries)\n })()\n }\n\n /** 导出当前预设为单文件配置(浏览器下载,可保存到任意目录)。 */\n const exportPreset = async (): Promise<void> => {\n const res = await bridgePost<{ id: string; name: string; content: string }>('/export-preset', { id: fields.presetTemplate })\n if (!res.ok) {\n store.showNotice('error', '导出预设失败:' + (res.message ?? 'settings bridge unavailable'))\n return\n }\n const blob = new Blob([res.value.content], { type: 'application/yaml' })\n const url = URL.createObjectURL(blob)\n const anchor = document.createElement('a')\n anchor.href = url\n anchor.download = `${res.value.id}.preset.yml`\n anchor.click()\n URL.revokeObjectURL(url)\n store.showNotice('ok', `已导出 ${res.value.id}.preset.yml(单文件配置,可保存到任意目录)`)\n }\n\n /** 删除预设(物理删除用户目录副本;插件目录模板保留,可经「新建预设」还原)。 */\n const deletePreset = async (id: string): Promise<void> => {\n const res = await bridgePost<{ id: string }>('/preset-delete', { id })\n if (res.ok) {\n setConfirmingDelete(undefined)\n store.showNotice('ok', `预设 ${id} 已删除(可经「新建预设」从内置模板还原)`)\n await store.load()\n } else {\n store.showNotice('error', '删除预设失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n }\n\n /** 复制预设:用户目录完整副本,id 自动递增(<id>-copy / <id>-copy-2 / …)。 */\n const duplicatePreset = async (id: string): Promise<void> => {\n const res = await bridgePost<{ id: string }>('/preset-duplicate', { id })\n if (res.ok) {\n store.showNotice('ok', `已复制为预设 ${res.value.id}`)\n await store.load()\n } else {\n store.showNotice('error', '复制预设失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n }\n\n /** 打开预设文件夹(宿主系统文件管理器;失败时提示路径)。 */\n const openLocation = async (id: string): Promise<void> => {\n const res = await bridgePost<{ path: string }>('/preset-open', { id })\n if (res.ok) {\n store.showNotice('ok', `已打开预设文件夹:${res.value.path}`)\n } else {\n store.showNotice('error', '打开预设文件夹失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n }\n\n /** 新建:从插件目录模板复制到用户目录(还原/自定义起点);自定义入口重名自动递增。 */\n const clonePreset = async (id: string, autoSuffix = false): Promise<void> => {\n const res = await bridgePost<{ id: string }>('/preset-clone', { id, autoSuffix })\n if (res.ok) {\n setPickerOpen(false)\n store.showNotice('ok', `已从内置模板新建预设 ${res.value.id}`)\n await store.load()\n } else {\n store.showNotice('error', '新建预设失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n }\n\n const onDialogKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>): void => {\n if (event.key !== 'Tab' || dialogRef.current === null) return\n const focusables = [...dialogRef.current.querySelectorAll<HTMLElement>(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])',\n )].filter((element) => !element.hasAttribute('disabled'))\n if (focusables.length === 0) return\n const first = focusables[0]!\n const last = focusables[focusables.length - 1]!\n const active = document.activeElement\n if (event.shiftKey) {\n if (active === first || !dialogRef.current.contains(active)) {\n event.preventDefault()\n last.focus()\n }\n } else if (active === last || !dialogRef.current.contains(active)) {\n event.preventDefault()\n first.focus()\n }\n }\n\n return (\n <div className={styles.rowGroup}>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>预设模板</strong>\n <small>预设保存在用户目录(首次启动自动内置全部模板);点击卡片即切换并按新模板重建生成目录。删除后可从内置模板「新建」还原;导入预设 = 选择 preset.yml / 任意 *.yml/*.yaml / SillyTavern *.json 配置文件,或整个预设文件夹。</small>\n </span>\n <span className={styles.inlineControls}>\n <input\n ref={yamlRef}\n type=\"file\"\n accept=\".yml,.yaml,.json\"\n className={styles.visuallyHidden}\n aria-label=\"选择 preset.yml / SillyTavern JSON 配置文件\"\n onChange={(event) => { pickPresetYaml(event.target.files?.[0]); event.target.value = '' }}\n />\n <input\n ref={dirRef}\n type=\"file\"\n // @ts-expect-error webkitdirectory 为 Chromium 扩展属性(文件夹选择)。\n webkitdirectory=\"\"\n className={styles.visuallyHidden}\n aria-label=\"选择预设文件夹\"\n onChange={(event) => { pickPresetDir(event.target.files); event.target.value = '' }}\n />\n <button type=\"button\" className={styles.primaryPill} onClick={() => setPickerOpen(true)}>新建预设</button>\n <button type=\"button\" className={styles.pillButton} disabled={importing} onClick={() => yamlRef.current?.click()}>\n {importing ? '导入中…' : '导入预设'}\n </button>\n <button type=\"button\" className={styles.pillButton} disabled={importing} onClick={() => dirRef.current?.click()}>\n 导入文件夹\n </button>\n <button type=\"button\" className={styles.pillButton} onClick={() => void exportPreset()}>\n 导出预设\n </button>\n </span>\n </div>\n <div className={styles.presetGrid}>\n {presets.length === 0 ? (\n <p className={styles.readOnly} role=\"status\">暂无预设;点击上方「新建预设」从内置模板创建,或「导入预设」添加。</p>\n ) : presets.map((preset) => renderCard(preset))}\n </div>\n {pickerOpen && (\n <div className={styles.modalBackdrop} onClick={() => setPickerOpen(false)}>\n <div\n ref={dialogRef}\n className={styles.templateModal}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"从内置模板新建预设\"\n onClick={(event) => event.stopPropagation()}\n onKeyDown={onDialogKeyDown}\n >\n <div className={styles.templateModalHead}>\n <strong>从内置模板新建预设</strong>\n <button type=\"button\" className={styles.pillButton} aria-label=\"关闭模板选择\" onClick={() => setPickerOpen(false)}>×</button>\n </div>\n <div className={styles.templateModalList}>\n {templates.length === 0 && <p className={styles.configFieldHint}>插件目录无内置模板。</p>}\n <button type=\"button\" className={styles.templateModalItem} data-custom\n title=\"新建一份所有参数为空的自定义预设(重名自动加序号)\"\n onClick={() => void clonePreset('custom', true)}>\n <strong>自定义预设</strong>\n <small>custom · 所有参数为空(空白起点,重名自动加序号)</small>\n </button>\n {templates.map((template) => (\n <button key={template.id} type=\"button\" className={styles.templateModalItem}\n title={`新建到用户目录:${template.id}`} onClick={() => void clonePreset(template.id)}>\n <strong>{template.name}</strong>\n <small>{template.id}</small>\n </button>\n ))}\n </div>\n </div>\n </div>\n )}\n </div>\n )\n\n function renderCard(preset: { id: string; name: string; description?: string }): ReactNode {\n const active = fields.presetTemplate === preset.id\n const confirming = confirmingDelete === preset.id\n return (\n <div key={preset.id} className={clsx(styles.presetCard, active && styles.presetCardActive)}\n data-active={active ? '' : undefined}>\n <button type=\"button\" className={styles.presetCardMain} disabled={!fields.writePreset}\n title={active ? '当前预设模板' : `切换到 ${preset.name}`}\n onClick={() => store.setPresetTemplate(preset.id)}>\n <span className={styles.presetCardHead}>\n <strong className={styles.presetCardName}>{preset.name}</strong>\n {active && <span className={styles.presetInUse}>使用中</span>}\n </span>\n {preset.description !== undefined && preset.description.length > 0\n && <p className={styles.presetCardDesc}>{preset.description}</p>}\n <code className={styles.presetCardId}>{preset.id}</code>\n </button>\n <span className={styles.presetCardFooter}>\n <button type=\"button\" className={styles.presetIconButton} data-tip=\"复制预设\"\n aria-label={`复制预设:${preset.name}`}\n onClick={() => void duplicatePreset(preset.id)}>\n <IconCopyOutline16 />\n </button>\n <button type=\"button\" className={styles.presetIconButton} data-tip=\"打开预设文件夹\"\n aria-label={`打开预设文件夹:${preset.name}`}\n onClick={() => void openLocation(preset.id)}>\n <IconFolderOpenOutline16 />\n </button>\n {confirming ? (\n <span className={styles.presetCardActions}>\n <button type=\"button\" className={styles.pillButton} data-danger disabled={active}\n title=\"删除后可从内置模板「新建」还原\" onClick={() => void deletePreset(preset.id)}>确认删除</button>\n <button type=\"button\" className={styles.pillButton} data-variant=\"secondary\" onClick={() => setConfirmingDelete(undefined)}>取消</button>\n </span>\n ) : (\n <button type=\"button\" className={styles.pillButton} data-danger disabled={active}\n title={active ? '先切换其他预设再删除' : '删除用户目录副本(内置模板保留,可新建还原)'}\n onClick={() => setConfirmingDelete(preset.id)}>删除</button>\n )}\n </span>\n </div>\n )\n }\n})\n","/** 开关行:label + hint + 可选 extra + checkbox。 */\nimport type { ReactNode } from 'react'\nimport styles from './PromptUi.module.css'\n\nexport function ToggleRow(props: { id: string; label: string; hint: string; checked: boolean; disabled?: boolean; extra?: ReactNode; onChange: (value: boolean) => void }): ReactNode {\n return (\n <label className={styles.toggleRow} htmlFor={props.id}>\n <span className={styles.settingCopy}><strong>{props.label}</strong><small>{props.hint}</small></span>\n {props.extra}\n <input id={props.id} type=\"checkbox\" aria-label={props.label} checked={props.checked} disabled={props.disabled} onChange={(event) => props.onChange(event.target.checked)} />\n <span className={styles.switch} aria-hidden=\"true\"><i /></span>\n </label>\n )\n}\n","/** 通用折叠卡片:设置区块统一折叠入口(除模块列表外全部卡片化)。 */\nimport { useState, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { IconChevronDownOutline14 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport styles from './PromptUi.module.css'\n\nexport function CollapsibleCard(props: {\n id: string\n title: string\n meta?: string\n children: ReactNode\n defaultOpen?: boolean\n}): ReactNode {\n const [open, setOpen] = useState(props.defaultOpen ?? false)\n return (\n <article className={clsx(styles.configCard, open && styles.configCardOpen)}>\n <header className={styles.configHeader}>\n <button type=\"button\" className={styles.configToggle} aria-expanded={open} onClick={() => setOpen((value) => !value)}>\n <span className={styles.configTitle}>\n <span className={styles.configName}>{props.title}</span>\n {props.meta !== undefined && <span className={styles.configMeta}>{props.meta}</span>}\n </span>\n <IconChevronDownOutline14 className={clsx(styles.chevron, open && styles.chevronOpen)} />\n </button>\n </header>\n {open && <div className={styles.configForm}>{props.children}</div>}\n </article>\n )\n}\n","/** 设置输入行:编辑框失焦即保存(与 anchor 文本一致)。 */\nimport type { ReactNode } from 'react'\nimport ui from './PromptUi.module.css'\n\nexport function SettingInputRow(props: {\n id: string\n label: string\n hint: string\n value: string\n type?: 'text' | 'number'\n placeholder?: string\n disabled?: boolean\n onInput: (value: string) => void\n onCommit: () => void\n}): ReactNode {\n return (\n <div className={ui.rowGroup}>\n <div className={ui.settingRowStack}>\n <span className={ui.settingCopy}><strong>{props.label}</strong><small>{props.hint}</small></span>\n <div className={ui.directoryControl}>\n <input\n id={props.id}\n className={ui.directoryInput}\n type={props.type ?? 'text'}\n value={props.value}\n aria-label={props.label}\n placeholder={props.placeholder}\n disabled={props.disabled}\n spellCheck={false}\n autoComplete=\"off\"\n onChange={(event) => props.onInput(event.target.value)}\n onBlur={props.onCommit}\n />\n </div>\n </div>\n </div>\n )\n}\n","/** 「预设和配置」页:全局开关 + 预设切换/导入 + 提示词配置列表统一管理。 */\nimport { memo, type ReactNode } from 'react'\nimport { usePromptToolFields } from './use-prompt-tool-fields.ts'\nimport { PresetSwitcher } from './PresetSwitcher.tsx'\nimport { ToggleRow } from './ToggleRow.tsx'\nimport { CollapsibleCard } from './CollapsibleCard.tsx'\nimport { SettingInputRow } from './SettingInputRow.tsx'\nimport ui from './PromptUi.module.css'\nimport type { PromptToolStore } from './prompt-tool-store.ts'\n\nexport const PresetsPage = memo(function PresetsPage(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n const fields = usePromptToolFields(store, (value) => value)\n return (\n <>\n <section className={ui.section} aria-label=\"全局开关\">\n <div className={ui.rowGroup}>\n <ToggleRow id=\"pt-write-preset\" label=\"全局开关\" hint=\"预设生成总开关,作用于全部六个层级:开启时生成并刷新生成目录;关闭时移除生成目录。关闭/开启后自动重新加载模块卡片。\"\n checked={fields.writePreset} onChange={() => store.toggle('writePreset')} />\n </div>\n </section>\n <CollapsibleCard id=\"pt-host-generated\" title=\"AGENTS.md 与生成目录\" meta=\"全局常驻注入、生成路径与显示顺序\">\n <div className={ui.rowGroup}>\n <ToggleRow id=\"pt-write-agents\" label=\"写入 ~/.dsh/AGENTS.md\" hint=\"保持 AGENTS.md 的全局常驻注入;关闭后不再写入,已有文件保持原样。与六层注入无关,属于宿主常驻层。\"\n checked={fields.writeAgents} onChange={() => store.toggle('writeAgents')} />\n </div>\n <SettingInputRow id=\"pt-resident-agents-path\" label=\"AGENTS.md 常驻路径\" hint=\"写入/移除 AGENTS.md 受管块的目标文件;修改后下一次开关保存立即切换。\"\n value={fields.residentAgentsPath} placeholder={fields.residentAgentsPath || '默认 ~/.dsh/AGENTS.md'}\n onInput={(value) => store.patch({ residentAgentsPath: value })}\n onCommit={store.persistSwitches} />\n <SettingInputRow id=\"pt-preset-dir\" label=\"预设根目录\" hint=\"预设根目录(官方 USER_PRESET_DIR);每个预设一个官方预设目录,修改后下次写入会生成到新根,建议同时在宿主 agent-presets 设置里选择该目录。\"\n value={fields.presetDir} placeholder={fields.presetDir || '默认 ~/.dsh/.agent-presets'}\n onInput={(value) => store.patch({ presetDir: value })}\n onCommit={store.persistSwitches} />\n <SettingInputRow id=\"pt-preset-order\" label=\"preset 显示顺序\" hint=\"生成 preset.yml 的 order;数值小的 preset 在宿主列表中靠前。\"\n type=\"number\" value={String(fields.presetOrder)}\n onInput={(value) => store.patch({ presetOrder: Number(value) || 0 })}\n onCommit={store.persistSwitches} />\n </CollapsibleCard>\n <PresetSwitcher store={store} />\n </>\n )\n})\n","/** SillyTavern 角色卡 PNG 解析(对齐官方 public/scripts/utils.js extractDataFromPng):\n * PNG tEXt chunk,关键字 ccv3(v3 优先)/ chara(v2 兜底),值为 base64 编码的\n * 角色卡 JSON。官方仅解 V1 明文(JSON.parse(atob(...)));本实现增加 V2\n * (base64(zlib(JSON)))deflate 回退,为官方实现的超集扩展。\n * 浏览器端解析字节流,不依赖第三方库。 */\n\nexport interface CharacterCardData {\n /** 角色卡 JSON 文本(chara_card_v2/v3,含 data 内层正文)。 */\n jsonText: string\n /** 角色名(顶层 name 或 data.name,缺省回退文件名)。 */\n name: string\n /** 原图 base64(dataURL 逗号后部分,落盘为 avatar.png)。 */\n imageBase64: string\n}\n\nfunction readU32(bytes: Uint8Array, offset: number): number {\n return ((bytes[offset]! << 24) >>> 0) + (bytes[offset + 1]! << 16) + (bytes[offset + 2]! << 8) + bytes[offset + 3]!\n}\n\n/** tEXt 文本为 Latin-1(PNG 规范);关键字/值经此解码后 base64 解出 UTF-8 JSON。 */\nfunction latin1(bytes: Uint8Array): string {\n let text = ''\n for (const byte of bytes) text += String.fromCharCode(byte)\n return text\n}\n\nasync function decodeBase64(text: string): Promise<string> {\n const binary = atob(text)\n const bytes = new Uint8Array(binary.length)\n for (let index = 0; index < binary.length; index++) bytes[index] = binary.charCodeAt(index)\n // V1:明文 base64(JSON);V2:base64(zlib(JSON))——明文 JSON 解析失败时 inflate 回退\n // (对齐官方 utils.js extractDataFromPng 并扩展 V2;与 scripts/extract-st-character.mjs 的 parseChara 同法)。\n const plain = new TextDecoder('utf-8').decode(bytes)\n try {\n JSON.parse(plain)\n return plain\n } catch {\n const stream = new Blob([bytes]).stream().pipeThrough(new DecompressionStream('deflate'))\n return new TextDecoder('utf-8').decode(await new Response(stream).arrayBuffer())\n }\n}\n\n/** 解析角色卡 PNG:返回角色卡 JSON + 原图 base64。非 PNG / 无角色卡 chunk 抛错。 */\nexport async function parseCharacterCardPng(buffer: ArrayBuffer, fileName: string): Promise<CharacterCardData> {\n const bytes = new Uint8Array(buffer)\n if (bytes.length < 24 || bytes[0] !== 0x89 || bytes[1] !== 0x50 || bytes[2] !== 0x4e || bytes[3] !== 0x47) {\n throw new Error('不是有效的 PNG 文件')\n }\n const chunks: Array<{ keyword: string; text: string }> = []\n let offset = 8\n while (offset + 12 <= bytes.length) {\n const length = readU32(bytes, offset)\n const type = latin1(bytes.subarray(offset + 4, offset + 8))\n const dataStart = offset + 8\n const dataEnd = dataStart + length\n if (type === 'tEXt') {\n let separator = dataStart\n while (separator < dataEnd && bytes[separator] !== 0) separator += 1\n chunks.push({\n keyword: latin1(bytes.subarray(dataStart, separator)).toLowerCase(),\n text: latin1(bytes.subarray(separator + 1, dataEnd)),\n })\n }\n if (type === 'IEND') break\n offset = dataEnd + 4 // 跳过 CRC\n }\n const card = chunks.find((chunk) => chunk.keyword === 'ccv3') ?? chunks.find((chunk) => chunk.keyword === 'chara')\n if (card === undefined) {\n throw new Error('PNG 不含角色卡数据(无 chara/ccv3 tEXt chunk)')\n }\n const jsonText = await decodeBase64(card.text)\n let name = ''\n try {\n const parsed = JSON.parse(jsonText) as { name?: unknown; data?: { name?: unknown } }\n if (typeof parsed.name === 'string' && parsed.name.trim().length > 0) name = parsed.name.trim()\n else if (parsed.data !== null && typeof parsed.data === 'object'\n && typeof parsed.data.name === 'string' && parsed.data.name.trim().length > 0) {\n name = parsed.data.name.trim()\n }\n } catch (error) {\n throw new Error(`角色卡 JSON 解析失败:${error instanceof Error ? error.message : String(error)}`)\n }\n const base64 = (() => {\n let binary = ''\n const chunkSize = 0x8000\n for (let index = 0; index < bytes.length; index += chunkSize) {\n binary += String.fromCharCode(...bytes.subarray(index, index + chunkSize))\n }\n return btoa(binary)\n })()\n return { jsonText, name: name || fileName.replace(/\\.png$/i, ''), imageBase64: base64 }\n}\n","/** 角色管理页:角色卡库(PNG / JSON 素材 + 转换参数独立存储)。\n * 库中角色卡不直接生成预设——点击「导入到当前预设」把角色卡参数\n * (角色设定 / 系统提示 / 开场白 / 提示词库 / 采样参数)合并进当前激活预设,\n * 已导入的角色卡显示状态并可一键移除。 */\nimport { memo, useEffect, useRef, useState, type ReactNode } from 'react'\nimport { IconFolderOpenOutline16, IconTrashOutline16 } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { bridgePost } from './prompt-tool-bridge.ts'\nimport { parseCharacterCardPng } from './character-card.ts'\nimport type { PromptToolStore } from './prompt-tool-store.ts'\nimport ui from './PromptUi.module.css'\n\ninterface CharacterCardItem {\n id: string\n name: string\n description?: string\n hasAvatar: boolean\n imported: boolean\n}\n\nexport const CharactersPage = memo(function CharactersPage(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n const [importing, setImporting] = useState(false)\n const [confirmingDelete, setConfirmingDelete] = useState<string | undefined>(undefined)\n const [busy, setBusy] = useState<string | undefined>(undefined)\n const [characters, setCharacters] = useState<CharacterCardItem[]>([])\n const pngRef = useRef<HTMLInputElement>(null)\n const jsonRef = useRef<HTMLInputElement>(null)\n\n const loadCharacters = async (): Promise<void> => {\n const res = await bridgePost<{ characters: CharacterCardItem[] }>('/characters-list', {})\n if (res.ok) setCharacters(res.value.characters)\n }\n useEffect(() => {\n void loadCharacters()\n }, [])\n\n /** 导入角色卡入库(PNG 解析出 JSON + 原图,JSON 直传)。 */\n const importCard = async (files: FileList | null): Promise<void> => {\n if (files === null || files.length === 0) return\n setImporting(true)\n try {\n for (const file of Array.from(files)) {\n if (/\\.png$/i.test(file.name)) {\n const buffer = await file.arrayBuffer()\n const card = await parseCharacterCardPng(buffer, file.name)\n const res = await bridgePost<{ id: string; name: string }>('/characters-import', {\n files: [\n { path: 'avatar.png', content: card.imageBase64 },\n { path: `${card.name}.json`, content: card.jsonText },\n ],\n })\n if (res.ok) store.showNotice('ok', `角色卡「${res.value.name}」已入库`)\n else store.showNotice('error', '角色卡入库失败:' + (res.message ?? 'settings bridge unavailable'))\n } else if (/\\.json$/i.test(file.name)) {\n const res = await bridgePost<{ id: string; name: string }>('/characters-import', {\n files: [{ path: file.name, content: await file.text() }],\n })\n if (res.ok) store.showNotice('ok', `角色卡「${res.value.name}」已入库`)\n else store.showNotice('error', '角色卡入库失败:' + (res.message ?? 'settings bridge unavailable'))\n } else {\n store.showNotice('error', `不支持的文件类型:${file.name}(仅 .png / .json)`)\n }\n }\n await loadCharacters()\n } catch (error) {\n store.showNotice('error', `角色卡导入失败:${error instanceof Error ? error.message : String(error)}`)\n } finally {\n setImporting(false)\n }\n }\n\n /** 角色卡参数导入当前预设(合并 promptConfigs + params,重建后生效)。 */\n const applyCard = async (id: string): Promise<void> => {\n setBusy(id)\n try {\n const res = await bridgePost<{ id: string; count: number }>('/characters-apply', { id })\n if (res.ok) {\n store.showNotice('ok', `已导入到当前预设(${res.value.count} 条配置)`)\n await store.load()\n await loadCharacters()\n } else {\n store.showNotice('error', '导入到当前预设失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n } finally {\n setBusy(undefined)\n }\n }\n\n /** 从当前预设移除该角色卡参数。 */\n const removeCard = async (id: string): Promise<void> => {\n setBusy(id)\n try {\n const res = await bridgePost<{ id: string; count: number }>('/characters-remove', { id })\n if (res.ok) {\n store.showNotice('ok', `已从当前预设移除(${res.value.count} 条配置)`)\n await store.load()\n await loadCharacters()\n } else {\n store.showNotice('error', '移除失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n } finally {\n setBusy(undefined)\n }\n }\n\n const deleteCard = async (id: string): Promise<void> => {\n const res = await bridgePost<{ id: string }>('/characters-delete', { id })\n if (res.ok) {\n setConfirmingDelete(undefined)\n store.showNotice('ok', `角色卡 ${id} 已删除(已导入当前预设的参数不受影响)`)\n await loadCharacters()\n } else {\n store.showNotice('error', '删除失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n }\n\n const openLocation = async (id: string): Promise<void> => {\n const res = await bridgePost<{ path: string }>('/preset-open', { id: `/.characters/${id}` })\n if (res.ok) store.showNotice('ok', `已打开角色卡目录:${res.value.path}`)\n else store.showNotice('error', '打开目录失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n\n return (\n <section className={ui.section} aria-label=\"角色管理\">\n <div className={ui.rowGroup}>\n <div className={ui.settingRowStack}>\n <span className={ui.settingCopy}>\n <strong>角色卡库</strong>\n <small>导入 SillyTavern 角色卡(PNG tEXt chunk:ccv3 / chara,或 chara_card JSON)到独立库。角色卡参数不直接生成预设——点击「导入到当前预设」把角色设定 / 系统提示 / 开场白 / 提示词库合并进当前激活预设,可随时移除。</small>\n </span>\n <span className={ui.inlineControls}>\n <input\n ref={pngRef}\n type=\"file\"\n accept=\".png\"\n multiple\n className={ui.visuallyHidden}\n aria-label=\"选择 SillyTavern 角色卡 PNG\"\n onChange={(event) => { void importCard(event.target.files); event.target.value = '' }}\n />\n <input\n ref={jsonRef}\n type=\"file\"\n accept=\".json\"\n multiple\n className={ui.visuallyHidden}\n aria-label=\"选择角色卡 JSON\"\n onChange={(event) => { void importCard(event.target.files); event.target.value = '' }}\n />\n <button type=\"button\" className={ui.primaryPill} disabled={importing} onClick={() => pngRef.current?.click()}>\n {importing ? '导入中…' : '导入角色卡 PNG'}\n </button>\n <button type=\"button\" className={ui.pillButton} disabled={importing} onClick={() => jsonRef.current?.click()}>\n 导入角色卡 JSON\n </button>\n </span>\n </div>\n </div>\n\n {characters.length === 0 ? (\n <div className={ui.emptyState}>\n <span className={ui.emptyGlyph} aria-hidden=\"true\">⌁</span>\n <div>\n <h3>角色卡库为空</h3>\n <p>从上方导入 SillyTavern 角色卡(PNG / JSON),然后点击「导入到当前预设」应用到正在使用的预设。</p>\n </div>\n </div>\n ) : (\n <div className={ui.presetGrid}>\n {characters.map((card) => {\n const confirming = confirmingDelete === card.id\n return (\n <div key={card.id} className={ui.presetCard}>\n <div className={ui.presetCardBody}>\n <span className={ui.presetCardHead}>\n <strong className={ui.presetCardName}>{card.name}</strong>\n {card.imported && <span className={ui.presetInUse}>已导入当前预设</span>}\n </span>\n {card.description !== undefined && card.description.length > 0\n && <p className={ui.presetCardDesc}>{card.description}</p>}\n <code className={ui.presetCardId}>{card.id}</code>\n </div>\n <span className={ui.presetCardFooter}>\n {card.imported ? (\n <button type=\"button\" className={ui.pillButton} data-variant=\"secondary\" disabled={busy === card.id}\n onClick={() => void removeCard(card.id)}>\n {busy === card.id ? '移除中…' : '从当前预设移除'}\n </button>\n ) : (\n <button type=\"button\" className={ui.primaryPill} disabled={busy === card.id}\n onClick={() => void applyCard(card.id)}>\n {busy === card.id ? '导入中…' : '导入到当前预设'}\n </button>\n )}\n <button type=\"button\" className={ui.presetIconButton} data-tip=\"打开角色卡目录\"\n aria-label={`打开角色卡目录:${card.name}`}\n onClick={() => void openLocation(card.id)}>\n <IconFolderOpenOutline16 />\n </button>\n {confirming ? (\n <>\n <button type=\"button\" className={ui.pillButton} data-danger\n onClick={() => void deleteCard(card.id)}>确认删除</button>\n <button type=\"button\" className={ui.pillButton} data-variant=\"secondary\"\n onClick={() => setConfirmingDelete(undefined)}>取消</button>\n </>\n ) : (\n <button type=\"button\" className={ui.presetIconButton} data-tip=\"删除角色卡\"\n aria-label={`删除角色卡:${card.name}`}\n onClick={() => setConfirmingDelete(card.id)}>\n <IconTrashOutline16 />\n </button>\n )}\n </span>\n </div>\n )\n })}\n </div>\n )}\n </section>\n )\n})\n","/** 技能设置页(从 PromptWorkspace 拆出):状态筛选 + 过滤 + 拖拽排序 + 目录管理。\n * L3 selector 化:usePromptToolFields 订阅 fields 引用变化;技能行抽 SkillRow\n * memo 组件——开关/筛选/拖拽 hover 只重渲染受影响行,不再全列表级联。 */\nimport { memo, useCallback, useMemo, useState, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport type { SkillCatalogEntry } from './prompt-tool-bridge.ts'\nimport type { PromptToolStore } from './prompt-tool-store.ts'\nimport type { PromptToolHostApi } from './prompt-tool-types.ts'\nimport { usePromptToolFields } from './use-prompt-tool-fields.ts'\nimport { tabKeyHandler } from './tab-key.ts'\nimport { CollapsibleCard } from './CollapsibleCard.tsx'\nimport { SettingInputRow } from './SettingInputRow.tsx'\nimport ui from './PromptUi.module.css'\n\n/** 技能调用状态徽章:只保留模型可调用状态,开关关闭后立即变灰。 */\nfunction SkillStatusChips(props: { skill: SkillCatalogEntry; enabled: boolean }): ReactNode {\n const { skill, enabled } = props\n const callable = skill.valid && skill.modelInvocable && enabled\n const status = skill.valid ? (callable ? '模型可调用' : '模型不可调用') : '未注册'\n return (\n <span className={ui.skillStatusRow} aria-label={`技能调用状态:${status}`}>\n <span className={clsx(ui.skillStatusChip, skill.valid ? (callable ? ui.skillStatusModel : ui.skillStatusOff) : ui.skillStatusError)}>\n <i className={ui.skillStatusDot} aria-hidden=\"true\" />\n {status}\n </span>\n </span>\n )\n}\n\n/** 技能状态筛选维度(统计条与列表联动)。 */\ntype SkillStatusTab = 'all' | 'callable' | 'invalid'\n\nconst SKILL_STATUS_TABS: Array<{ id: SkillStatusTab; label: string }> = [\n { id: 'all', label: '全部' },\n { id: 'callable', label: '模型可调用' },\n { id: 'invalid', label: '未注册' },\n]\n\ninterface SkillRowProps {\n skill: SkillCatalogEntry\n depth: number\n primaryIndex: number\n enabled: boolean\n isSelected: boolean\n dragging: boolean\n dropBefore: boolean\n dropAfter: boolean\n fixing: boolean\n canMoveUp: boolean\n canMoveDown: boolean\n onDragStart: (folder: string, event: React.DragEvent<HTMLDivElement>) => void\n onDragOver: (folder: string, event: React.DragEvent<HTMLDivElement>) => void\n onDrop: (folder: string, event: React.DragEvent<HTMLDivElement>) => void\n onDragEnd: () => void\n onToggleSelect: (folder: string) => void\n onToggleSkill: (folder: string) => void\n onFix: (folder: string) => void\n onMoveUp: (folder: string) => void\n onMoveDown: (folder: string) => void\n}\n\n/** 技能行 memo:props 全部为数据/稳定回调,单行变化只重渲染该行。 */\nconst SkillRow = memo(function SkillRow(props: SkillRowProps): ReactNode {\n const { skill, depth, primaryIndex, enabled, isSelected, dragging, dropBefore, dropAfter, fixing } = props\n const nested = depth > 0\n const hint = `${skill.dir ?? 'skills'}/${skill.folder}${skill.description ? ` · ${skill.description}` : ''}`\n return (\n <div\n className={clsx(ui.skillCard, !skill.valid && ui.skillRowInvalid)}\n data-nested={nested ? '' : undefined}\n data-selected={isSelected ? '' : undefined}\n data-dragging={dragging ? '' : undefined}\n data-drop-before={dropBefore ? '' : undefined}\n data-drop-after={dropAfter ? '' : undefined}\n draggable={skill.valid && !nested}\n onDragStart={(event) => props.onDragStart(skill.folder, event)}\n onDragOver={(event) => props.onDragOver(skill.folder, event)}\n onDrop={(event) => props.onDrop(skill.folder, event)}\n onDragEnd={props.onDragEnd}\n >\n {/* 勾选框:只选择(职责分离——开关状态由行内 Switch 与上方批量按钮控制)。 */}\n <label className={ui.skillSelect} aria-label={`选择 ${skill.name || skill.folder}`}>\n <input type=\"checkbox\" checked={isSelected} disabled={!skill.valid} onChange={() => props.onToggleSelect(skill.folder)} />\n </label>\n {nested\n ? <span className={ui.skillNestedMark} aria-hidden=\"true\" title=\"嵌套子技能(跟随主技能,不参与拖拽排序)\">▸</span>\n : (\n <>\n <span className={ui.dragHandle} title={`第 ${primaryIndex + 1} 位,拖动调整顺序`} aria-hidden=\"true\">⠿</span>\n <span className={ui.skillRankBadge} title={`第 ${primaryIndex + 1} 位`}>{primaryIndex + 1}</span>\n </>\n )}\n <div className={ui.skillCardBody}>\n <span className={ui.skillCardTitleRow}>\n <strong>{skill.name || skill.folder}</strong>\n {skill.duplicate === true && <span className={ui.duplicateBadge} title={`同名技能:来源目录 ${skill.dir ?? '未知'}`}>同名</span>}\n <SkillStatusChips skill={skill} enabled={enabled} />\n </span>\n <small className={ui.skillCardMeta}>{hint}</small>\n {!skill.valid && skill.issue && <span className={ui.skillIssue} role=\"note\">{skill.issue}</span>}\n </div>\n {/* Switch:独立切换技能开关。 */}\n <label className={ui.skillSwitch} htmlFor={`pt-skill-${skill.folder}`}>\n <input id={`pt-skill-${skill.folder}`} type=\"checkbox\" checked={enabled} disabled={!skill.valid} aria-label={`启用 ${skill.name || skill.folder}`} onChange={() => props.onToggleSkill(skill.folder)} />\n <span className={ui.switch} aria-hidden=\"true\"><i /></span>\n </label>\n {!skill.valid ? (\n <button type=\"button\" className={ui.pillButton} disabled={fixing} onClick={() => props.onFix(skill.folder)}>\n {fixing && <span className={ui.spinner} aria-hidden=\"true\" />}\n {fixing ? '修复中…' : '修复'}\n </button>\n ) : !nested ? (\n <span className={ui.skillOrderButtons}>\n <button type=\"button\" className={ui.pillButton} aria-label={`上移 ${skill.name || skill.folder}`} title=\"上移(键盘排序)\" disabled={!props.canMoveUp} onClick={() => props.onMoveUp(skill.folder)}>↑</button>\n <button type=\"button\" className={ui.pillButton} aria-label={`下移 ${skill.name || skill.folder}`} title=\"下移(键盘排序)\" disabled={!props.canMoveDown} onClick={() => props.onMoveDown(skill.folder)}>↓</button>\n </span>\n ) : null}\n </div>\n )\n})\n\nexport const SkillsSettings = memo(function SkillsSettings(props: { store: PromptToolStore; api: PromptToolHostApi }): ReactNode {\n const { store, api } = props\n const fields = usePromptToolFields(store, (value) => value)\n const [pickingDir, setPickingDir] = useState(false)\n const [dragFolder, setDragFolder] = useState<string | undefined>(undefined)\n const [dropTarget, setDropTarget] = useState<{ folder: string; before: boolean } | undefined>(undefined)\n const [skillFilter, setSkillFilter] = useState('')\n const [statusTab, setStatusTab] = useState<SkillStatusTab>('all')\n const [selected, setSelected] = useState<Set<string>>(new Set())\n const [removingDir, setRemovingDir] = useState<string | undefined>(undefined)\n const orderedSkills = useMemo(() => {\n const index = new Map(fields.skillOrder.map((folder, at) => [folder, at]))\n return [...fields.skillCatalog].sort((left, right) => {\n const leftAt = index.get(left.folder)\n const rightAt = index.get(right.folder)\n if (leftAt === undefined && rightAt === undefined) return left.folder.localeCompare(right.folder)\n if (leftAt === undefined) return 1\n if (rightAt === undefined) return -1\n return leftAt - rightAt\n })\n }, [fields.skillCatalog, fields.skillOrder])\n // patch 路径从不原地 mutate:引用相等即内容未变,变化时再退内容比较。\n const dirty = (fields.skillSwitches !== store.savedSwitches.skillSwitches\n && JSON.stringify(fields.skillSwitches) !== JSON.stringify(store.savedSwitches.skillSwitches))\n || (fields.skillOrder !== store.savedSwitches.skillOrder\n && JSON.stringify(fields.skillOrder) !== JSON.stringify(store.savedSwitches.skillOrder))\n || (fields.skillsDirs !== store.savedSwitches.skillsDirs\n && JSON.stringify(fields.skillsDirs) !== JSON.stringify(store.savedSwitches.skillsDirs))\n || store.skillsDirDraft.trim().length > 0\n\n const callableCount = orderedSkills.filter((skill) => skill.valid && skill.modelInvocable && store.skillEnabled(skill.folder)).length\n const invalidCount = orderedSkills.filter((skill) => !skill.valid).length\n const tabCounts: Record<SkillStatusTab, number> = {\n all: orderedSkills.length,\n callable: callableCount,\n invalid: invalidCount,\n }\n\n const keyword = skillFilter.trim().toLowerCase()\n const visibleSkills = orderedSkills.filter((skill) => {\n if (statusTab === 'callable' && !(skill.valid && skill.modelInvocable && store.skillEnabled(skill.folder))) return false\n if (statusTab === 'invalid' && skill.valid) return false\n return keyword.length === 0\n || [skill.folder, skill.name ?? '', skill.description ?? ''].join(' ').toLowerCase().includes(keyword)\n })\n\n const selectionMode = selected.size > 0\n const toggleSelect = useCallback((folder: string) => {\n setSelected((prev) => {\n const next = new Set(prev)\n if (next.has(folder)) next.delete(folder)\n else next.add(folder)\n return next\n })\n }, [])\n /** 全选目标:当前筛选后的合法技能(同名/无效技能不可批量启用)。 */\n const selectableSkills = visibleSkills.filter((skill) => skill.valid)\n const allSelected = selectionMode && selectableSkills.length > 0\n && selectableSkills.every((skill) => selected.has(skill.folder))\n const toggleSelectAll = () => {\n if (allSelected) setSelected(new Set())\n else setSelected(new Set(selectableSkills.map((skill) => skill.folder)))\n }\n const dirSkillCount = (dir: string): number =>\n fields.skillCatalog.filter((skill) => skill.dir === dir).length\n /** 空配置 = 默认副本兜底(只读,不可移除)。 */\n const isDefaultDir = (dir: string): boolean =>\n fields.skillsDirs.length === 0 && fields.activeSkillsDirs[0] === dir\n /** 嵌套技能:folder 含 /(相对路径)即子技能;渲染时父技能下递归展开。 */\n const isNestedFolder = (folder: string): boolean => folder.includes('/')\n /** 主技能序列(不嵌套):拖拽/菜单排序只在主技能间进行,子技能跟随。 */\n const orderedPrimary = orderedSkills.filter((skill) => !isNestedFolder(skill.folder))\n const childrenByParent = new Map<string, SkillCatalogEntry[]>()\n for (const skill of visibleSkills) {\n if (!isNestedFolder(skill.folder)) continue\n const slash = skill.folder.lastIndexOf('/')\n const parent = skill.folder.slice(0, slash)\n const list = childrenByParent.get(parent) ?? []\n list.push(skill)\n childrenByParent.set(parent, list)\n }\n for (const list of childrenByParent.values()) list.sort((a, b) => a.folder.localeCompare(b.folder))\n const expandSkill = (skill: SkillCatalogEntry): SkillCatalogEntry[] =>\n [skill, ...(childrenByParent.get(skill.folder) ?? []).flatMap(expandSkill)]\n const renderOrder = visibleSkills.filter((skill) => !isNestedFolder(skill.folder)).flatMap(expandSkill)\n const depthOf = (folder: string): number => folder.split('/').length - 1\n\n /** 批量启用/禁用:一次 patch + 一次保存(避免逐项写 N 次)。 */\n const batchSet = (enabled: boolean) => {\n const next = { ...fields.skillSwitches }\n for (const folder of selected) next[folder] = enabled\n store.patch({ skillSwitches: next })\n store.persistSwitches()\n store.showNotice('ok', `已${enabled ? '启用' : '禁用'} ${selected.size} 个技能`)\n setSelected(new Set())\n }\n\n const moveSkill = useCallback((from: string, to: string) => {\n const folders = orderedSkills.map((skill) => skill.folder)\n const fromAt = folders.indexOf(from)\n const toAt = folders.indexOf(to)\n if (fromAt < 0 || toAt < 0 || fromAt === toAt) return\n const [moved] = folders.splice(fromAt, 1)\n folders.splice(toAt, 0, moved!)\n store.patch({ skillOrder: folders })\n store.persistSwitches()\n }, [orderedSkills, store])\n\n /** 拖拽插入:插到目标技能前/后(带放置方向指示)。 */\n const moveSkillAt = (from: string, target: string, before: boolean) => {\n const folders = orderedSkills.map((skill) => skill.folder)\n const fromAt = folders.indexOf(from)\n if (fromAt < 0) return\n let toAt = folders.indexOf(target)\n if (toAt < 0 || fromAt === toAt) return\n const [moved] = folders.splice(fromAt, 1)\n if (fromAt < toAt) toAt -= 1\n if (!before) toAt += 1\n folders.splice(toAt, 0, moved!)\n store.patch({ skillOrder: folders })\n store.persistSwitches()\n }\n\n const pickSkillsDir = async () => {\n if (pickingDir) return\n setPickingDir(true)\n try {\n const path = await api.pickDirectory()\n if (path === null) return\n store.addSkillsDir(path)\n } catch (error) {\n store.showNotice('error', '选择目录失败:' + (error instanceof Error ? error.message : String(error)))\n } finally {\n setPickingDir(false)\n }\n }\n\n /** 行级稳定回调(memo 行只在自身 props 变化时重渲染)。 */\n const onDragStart = useCallback((folder: string, event: React.DragEvent<HTMLDivElement>) => {\n setDragFolder(folder)\n event.dataTransfer.effectAllowed = 'move'\n }, [])\n const onDragOver = useCallback((folder: string, event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n if (dragFolder === undefined || dragFolder === folder || folder.includes('/')) return\n const rect = event.currentTarget.getBoundingClientRect()\n setDropTarget({ folder, before: event.clientY < rect.top + rect.height / 2 })\n }, [dragFolder])\n const onDrop = useCallback((folder: string, event: React.DragEvent<HTMLDivElement>) => {\n event.preventDefault()\n const target = dropTarget\n if (dragFolder !== undefined && target !== undefined && dragFolder !== folder && !folder.includes('/')) {\n moveSkillAt(dragFolder, target.folder, target.before)\n }\n setDragFolder(undefined)\n setDropTarget(undefined)\n }, [dragFolder, dropTarget])\n const onDragEnd = useCallback(() => { setDragFolder(undefined); setDropTarget(undefined) }, [])\n const onToggleSkill = useCallback((folder: string) => store.toggleSkill(folder), [store])\n const onFix = useCallback((folder: string) => void store.fixSkill(folder), [store])\n const onMoveUp = useCallback((folder: string) => {\n const at = orderedPrimary.findIndex((skill) => skill.folder === folder)\n if (at > 0) moveSkill(folder, orderedPrimary[at - 1]!.folder)\n }, [orderedPrimary, moveSkill])\n const onMoveDown = useCallback((folder: string) => {\n const at = orderedPrimary.findIndex((skill) => skill.folder === folder)\n if (at >= 0 && at < orderedPrimary.length - 1) moveSkill(folder, orderedPrimary[at + 1]!.folder)\n }, [orderedPrimary, moveSkill])\n\n return (\n <section className={ui.section} aria-label=\"技能设置\">\n {fields.skillCatalog.length > 0 && (\n <>\n <div className={ui.skillStatsRow}>\n <div className={ui.skillStats} role=\"tablist\" aria-label=\"技能状态筛选\">\n {SKILL_STATUS_TABS.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={statusTab === tab.id}\n data-active={statusTab === tab.id ? '' : undefined}\n onClick={() => setStatusTab(tab.id)}\n onKeyDown={tabKeyHandler(SKILL_STATUS_TABS.map((entry) => entry.id), statusTab, setStatusTab)}\n >\n <i className={clsx(ui.skillStatDot,\n tab.id === 'invalid' ? ui.skillStatusError\n : tab.id === 'callable' ? ui.skillStatusModel\n : ui.skillStatAll)} aria-hidden=\"true\" />\n <strong>{tabCounts[tab.id]}</strong>\n <small>{tab.label}</small>\n </button>\n ))}\n </div>\n <button type=\"button\" className={ui.pillButton} onClick={() => void store.load()}>刷新技能列表</button>\n </div>\n <div className={ui.listFilterRow}>\n <input\n className={ui.listFilter}\n value={skillFilter}\n aria-label=\"过滤技能列表\"\n placeholder=\"过滤技能:名称 / 目录 / 描述…\"\n spellCheck={false}\n onChange={(event) => setSkillFilter(event.target.value)}\n />\n {selected.size > 0 && <span className={ui.selectionCount}>已选 {selected.size}</span>}\n {selectableSkills.length > 0 && (\n <button type=\"button\" className={ui.pillButton} data-active={allSelected ? '' : undefined} onClick={toggleSelectAll}>\n {allSelected ? '取消全选' : '全选'}\n </button>\n )}\n <button type=\"button\" className={ui.pillButton} disabled={!selectionMode} onClick={() => batchSet(true)}>批量启用</button>\n <button type=\"button\" className={ui.pillButton} disabled={!selectionMode} onClick={() => batchSet(false)}>批量禁用</button>\n </div>\n </>\n )}\n\n {fields.skillCatalog.length === 0 ? (\n <div className={ui.emptyState}><span className={ui.emptyGlyph} aria-hidden=\"true\">◇</span><div><h3>skills 目录下没有技能</h3><p>展开下方「目录与来源」选择目录导入,或确认技能目录路径后重新打开工作台。</p></div></div>\n ) : visibleSkills.length === 0 ? (\n <p className={ui.readOnly} role=\"status\">没有匹配当前筛选的技能。</p>\n ) : (\n <>\n <div className={ui.skillCardList} data-dragging={dragFolder !== undefined ? '' : undefined}>\n {renderOrder.map((skill) => {\n const depth = depthOf(skill.folder)\n const primaryIndex = depth === 0 ? orderedPrimary.indexOf(skill) : 0\n return (\n <SkillRow\n key={skill.folder}\n skill={skill}\n depth={depth}\n primaryIndex={primaryIndex}\n enabled={store.skillEnabled(skill.folder)}\n isSelected={selected.has(skill.folder)}\n dragging={dragFolder === skill.folder}\n dropBefore={dropTarget?.folder === skill.folder && dropTarget.before === true}\n dropAfter={dropTarget?.folder === skill.folder && dropTarget.before === false}\n fixing={store.fixingSkill === skill.folder}\n canMoveUp={depth === 0 && primaryIndex > 0}\n canMoveDown={depth === 0 && primaryIndex < orderedPrimary.length - 1}\n onDragStart={onDragStart}\n onDragOver={onDragOver}\n onDrop={onDrop}\n onDragEnd={onDragEnd}\n onToggleSelect={toggleSelect}\n onToggleSkill={onToggleSkill}\n onFix={onFix}\n onMoveUp={onMoveUp}\n onMoveDown={onMoveDown}\n />\n )\n })}\n </div>\n </>\n )}\n\n <CollapsibleCard id=\"pt-skills-dirs\" title=\"目录与来源\"\n meta={`${fields.activeSkillsDirs.length} 个目录 · 添加 / 移除引用`}>\n <div className={ui.dirAddBar}>\n <button type=\"button\" className={ui.primaryPill} disabled={pickingDir} onClick={() => void pickSkillsDir()}>\n {pickingDir && <span className={ui.spinner} aria-hidden=\"true\" />}\n {pickingDir ? '选择中…' : '从文件夹选择器添加'}\n </button>\n <div className={ui.dirAddInput}>\n <input\n className={ui.directoryInput}\n aria-label=\"按路径添加技能目录\"\n value={store.skillsDirDraft}\n placeholder=\"或输入目录路径后添加\"\n spellCheck={false}\n onChange={(event) => store.setSkillsDirDraft(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' && store.skillsDirDraft.trim().length > 0) {\n store.addSkillsDir(store.skillsDirDraft)\n store.setSkillsDirDraft('')\n }\n }}\n />\n <button\n type=\"button\"\n className={ui.pillButton}\n disabled={store.savingSkillsDir || store.skillsDirDraft.trim().length === 0}\n onClick={() => {\n store.addSkillsDir(store.skillsDirDraft)\n store.setSkillsDirDraft('')\n }}\n >\n {store.savingSkillsDir && <span className={ui.spinner} aria-hidden=\"true\" />}\n 添加\n </button>\n </div>\n </div>\n {fields.activeSkillsDirs.length === 0 ? (\n <p className={ui.readOnly} role=\"status\">技能目录列表为空。</p>\n ) : (\n <div className={ui.dirCardList}>\n {fields.activeSkillsDirs.map((dir, index) => {\n const exists = fields.skillsDirExists[dir] === true\n const count = dirSkillCount(dir)\n const isDefault = isDefaultDir(dir)\n return (\n <div key={dir} className={ui.dirCard} data-invalid={!exists ? '' : undefined}>\n <span className={ui.skillRankBadge} title={`第 ${index + 1} 个目录`}>{index + 1}</span>\n <div className={ui.dirCardBody}>\n <span className={ui.dirCardTitle}>\n <code className={ui.dirPath} title={dir}>{dir}</code>\n {isDefault && <span className={ui.duplicateBadge} title=\"未配置自定义目录时使用的 profile skills 副本\">默认副本</span>}\n </span>\n <span className={ui.dirCardMeta}>\n {exists\n ? (count > 0 ? `${count} 个技能` : '空目录')\n : '目录不存在'}\n {!exists && ' · 可移除后重新添加'}\n </span>\n </div>\n <div className={ui.dirCardActions}>\n <button type=\"button\" className={ui.pillButton} onClick={() => void store.openSkillsDir(dir)}>打开</button>\n <button type=\"button\" className={ui.pillButton} onClick={() => void store.load()}>重扫</button>\n {!isDefault && (removingDir === dir ? (\n <>\n <button type=\"button\" className={ui.pillButton} data-danger onClick={() => { store.removeSkillsDir(dir); setRemovingDir(undefined) }}>确认移除</button>\n <button type=\"button\" className={ui.pillButton} data-variant=\"secondary\" onClick={() => setRemovingDir(undefined)}>取消</button>\n </>\n ) : (\n <button type=\"button\" className={ui.pillButton} onClick={() => setRemovingDir(dir)}>移除</button>\n ))}\n </div>\n </div>\n )\n })}\n </div>\n )}\n <p className={ui.readOnly}>目录顺序即添加顺序;同名技能全部保留并标注「同名」,模型注册只取首个目录。移除目录只删除引用,不删除原文件。</p>\n <div className={ui.cardDivider} />\n <SettingInputRow id=\"pt-skill-rank-base\" label=\"技能排序基数\" hint=\"每个技能实际 rank = 基数 + 拖拽序号;默认 250。数值过小会让本项目技能抢占其他插件技能的位置,但不会影响任何提示词消息注入。\"\n type=\"number\" value={String(fields.skillRankBase)}\n onInput={(value) => store.patch({ skillRankBase: Number(value) || 0 })}\n onCommit={store.persistSwitches} />\n </CollapsibleCard>\n\n {dirty && <p className={ui.readOnly} role=\"status\">Skills 开关与目录修改立即保存;如上方按钮仍在写入,请稍候。</p>}\n </section>\n )\n})\n","import { memo, useCallback, useEffect, useState, useSyncExternalStore, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { tabKeyHandler } from './tab-key.ts'\nimport {\n type PromptToolStore,\n type PromptToolSettingsTransport,\n usePromptToolStore,\n} from './prompt-tool-store.ts'\nimport type { PromptToolHostApi } from './prompt-tool-types.ts'\nimport { PromptConfigList } from './PromptConfigList.tsx'\nimport { PromptConfigsEditor } from './PromptConfigsEditor.tsx'\nimport type { PromptToolWorkspaceController } from './workspace-controller.ts'\nimport { PresetsPage } from './PresetsPage.tsx'\nimport { CharactersPage } from './CharactersPage.tsx'\nimport { TemplatePicker } from './TemplatePicker.tsx'\nimport { useTemplatePicker } from './useTemplatePicker.ts'\nimport { DelegationToolsModuleCard, ModelRouteModuleCard } from './EngineModuleCards.tsx'\nimport { SkillsSettings } from './SkillsSettings.tsx'\nimport { usePromptToolFields } from './use-prompt-tool-fields.ts'\nimport ui from './PromptUi.module.css'\nimport css from './PromptWorkspace.module.css'\n\nfunction PageHeader(props: { title: string; description: string; meta?: string }): ReactNode {\n return (\n <div className={ui.pageHeader}>\n <div><h2>{props.title}</h2><p>{props.description}</p></div>\n {props.meta !== undefined && <div className={css.pageHeaderMeta}><code>{props.meta}</code></div>}\n </div>\n )\n}\n\n/** 模型路由状态 chip:主对话页与子代理页共用(检测到 DeepSeek 路由时展示 provider 列表)。 */\nfunction ModelRouteStatus(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n const detected = store.providers.length > 0\n const catalog = store.modelCatalog\n const catalogEntries = Object.entries(catalog)\n const hostModel = store.hostDefaultModel?.model\n return (\n <div className={ui.skillStatusRow} aria-label=\"模型服务商状态\">\n <span className={clsx(ui.skillStatusChip, detected ? ui.skillStatusModel : ui.skillStatusOff)}>\n <i className={ui.skillStatusDot} aria-hidden=\"true\" />\n {detected ? `已检测到模型服务商:${store.providers.join('、')}` : '未检测到模型服务商'}\n </span>\n <span className={clsx(ui.skillStatusChip, catalogEntries.length > 0 ? ui.skillStatusModel : ui.skillStatusOff)}>\n <i className={ui.skillStatusDot} aria-hidden=\"true\" />\n {catalogEntries.length > 0\n ? `已检测到模型名:${catalogEntries.map(([provider, models]) => `${provider} → ${models.join('、')}`).join(';')}`\n : hostModel !== undefined && hostModel.length > 0\n ? `模型名:继承宿主默认(${hostModel})`\n : '未检测到模型名'}\n </span>\n </div>\n )\n}\n\n/** 主会话页:主对话参数 + Preset/AGENTS 内容 + 管线状态卡 + 模块库(层筛选)。\n * 注入层 tab 已并入本页(层专属开关与内容资产卡片),模块库按层级下拉筛选浏览。 */\nconst FeatureSettings = memo(function FeatureSettings(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n // L3 selector 化:fields 引用变化才重渲染(父级 loading/notice/page 变化不再级联)。\n const fields = usePromptToolFields(store, (value) => value)\n // 稳定回调:卡片 memo 的生效前提(store 引用已稳定)。\n const patchConfigs = useCallback((configs: PromptToolStore['fields']['promptConfigs']) => {\n store.patch({ promptConfigs: configs })\n }, [store])\n const saveConfigs = useCallback((configs: PromptToolStore['fields']['promptConfigs']) => {\n void store.persistConfigs(configs)\n }, [store])\n return (\n <section className={ui.section} aria-label=\"主会话与全局\">\n <ModelRouteStatus store={store} />\n <PromptConfigsEditor\n meta={store.meta}\n configs={fields.promptConfigs}\n savedConfigs={store.savedConfigs}\n onPatchConfigs={patchConfigs}\n onSaveConfigs={saveConfigs}\n onNotice={store.showNotice}\n templateVariables={store.templateVariables}\n setTemplateVariables={store.setTemplateVariables}\n templateVariablesEnabled={store.templateVariablesEnabled}\n setTemplateVariablesEnabled={store.setTemplateVariablesEnabled}\n saveTemplateVariables={store.saveTemplateVariables}\n store={store}\n />\n </section>\n )\n})\n\n/** 配置列表 + 新建模板:六层页按 layer 过滤,子代理页按 scope 过滤(subagent 只列子代理可见模板)。 */\nconst ConfigListWithTemplates = memo(function ConfigListWithTemplates(props: { store: PromptToolStore; layer?: string; scope?: 'main' | 'subagent'; beforeCards?: ReactNode }): ReactNode {\n const { store, layer, scope, beforeCards } = props\n const fields = usePromptToolFields(store, (value) => value)\n // 稳定回调:卡片 memo 的生效前提(store 引用已稳定)。\n const patchConfigs = useCallback((configs: PromptToolStore['fields']['promptConfigs']) => {\n store.patch({ promptConfigs: configs })\n }, [store])\n const saveConfigs = useCallback((configs: PromptToolStore['fields']['promptConfigs']) => {\n void store.persistConfigs(configs)\n }, [store])\n // 当前预设模板消息批层无配置时,pre-step 层空状态追加提示(列表仍可自定义:\n // 新建配置作为 settings 覆盖层保存,切换预设后保留)。\n const preStepEmpty = store.templatePreStepCount === 0 && (layer === undefined || layer === 'pre-step')\n const templatePicker = useTemplatePicker(\n fields.promptConfigs,\n (config) => store.patch({ promptConfigs: [...fields.promptConfigs, config] }),\n store.showNotice,\n )\n return (\n <>\n <PromptConfigList\n meta={store.meta}\n configs={fields.promptConfigs}\n savedConfigs={store.savedConfigs}\n layer={layer}\n scope={scope}\n beforeCards={beforeCards}\n emptyHint={preStepEmpty ? '当前预设模板消息批层无配置;可新建自定义配置(作为 settings 覆盖层,切换预设后仍保留)。' : undefined}\n extraActions={\n <button type=\"button\" className={ui.primaryPill} onClick={templatePicker.openPicker}>新建</button>\n }\n onPatchConfigs={patchConfigs}\n onSaveConfigs={saveConfigs}\n onNotice={store.showNotice}\n />\n {templatePicker.open && (\n <TemplatePicker templates={templatePicker.templates} layer={layer} onPick={templatePicker.pickTemplate} onClose={templatePicker.closePicker} />\n )}\n </>\n )\n})\n\n/** 子代理页:路由状态 + 子代理引擎模块区块(列表上方,与主会话同构)+ 子代理配置列表\n * (audience != main 即公用或仅子代理)。子代理独有:子代理模型、工具与深度\n * (toolFilter / allowKinds / maxDepth);主会话引擎模块(tool-bootstrap /\n * context-gate / 工具管线)不在此重复(避免双入口)。 */\nconst SubagentPage = memo(function SubagentPage(props: { store: PromptToolStore }): ReactNode {\n const { store } = props\n // 订阅 fields:memo 后 props 不变,靠订阅通道随 fields 变化重渲(子代理模型/工具卡数据源)。\n usePromptToolFields(store, (value) => value)\n return (\n <>\n <section className={ui.section} aria-label=\"子代理\">\n <ModelRouteStatus store={store} />\n <div className={ui.configList}>\n <ModelRouteModuleCard store={store} scope=\"subagent\" />\n <DelegationToolsModuleCard store={store} />\n </div>\n </section>\n <div className={ui.subagentConfigs}>\n <ConfigListWithTemplates store={store} scope=\"subagent\" />\n </div>\n </>\n )\n})\n\n/** 技能状态筛选维度(统计条与列表联动)。 */\nexport interface PromptWorkspaceProps {\n api: PromptToolHostApi\n settings: PromptToolSettingsTransport\n controller: PromptToolWorkspaceController\n onClose: () => void\n}\n\n/** 顶层页面:注入层已并入主会话页(层专属开关 + 内容资产卡片 + 模块库层筛选)。 */\ntype WorkspacePage = 'subagent' | 'skills' | 'features' | 'presets' | 'characters'\n\nconst TOP_PAGES: Array<{ id: WorkspacePage; label: string }> = [\n { id: 'features', label: '主会话' },\n { id: 'subagent', label: '子代理' },\n { id: 'skills', label: '技能设置' },\n { id: 'presets', label: '预设配置' },\n { id: 'characters', label: '角色管理' },\n]\n\n/** 侧边栏独立工作台:顶层 4 页(注入层并入主会话)。 */\nexport function PromptWorkspace(props: PromptWorkspaceProps): ReactNode {\n const store = usePromptToolStore(props.api, props.settings)\n const [page, setPage] = useState<WorkspacePage>('features')\n const open = useSyncExternalStore(\n props.controller.subscribe,\n props.controller.getSnapshot,\n props.controller.getSnapshot,\n ).open\n\n useEffect(() => {\n // 每次打开工作台都重新同步 settings(其他客户端可能已修改)。\n if (open) void store.load()\n }, [open, store.load])\n\n\n const enabledCount = store.fields.promptConfigs.filter((config) => config.enabled !== false).length\n const layerMeta = page === 'skills'\n ? `${store.fields.skillCatalog.length} 技能`\n : page === 'features'\n ? '全局'\n : page === 'presets'\n ? '预设配置'\n : page === 'characters'\n ? `${(store.meta.presets ?? []).filter((preset) => preset.meta?.source === 'sillytavern').length} 角色卡`\n : '子代理'\n const pageTitle = page === 'skills' ? '技能设置'\n : page === 'features' ? '主会话'\n : page === 'presets' ? '预设配置'\n : page === 'characters' ? '角色管理'\n : '子代理'\n const pageDetail = page === 'skills'\n ? '按 skills 目录注册的可开关技能;目录与逐技能开关立即生效。'\n : page === 'features'\n ? '主会话参数(模型设置、工具与深度)、消息批层入口开关、Preset/AGENTS 内容与提示词配置模块库(按层级筛选)。'\n : page === 'presets'\n ? '统一管理预设模板(切换/导入)与提示词配置(六层列表/模板插入/配置目录)。'\n : page === 'characters'\n ? '导入 SillyTavern 角色卡(PNG / JSON)并管理转换出的角色卡预设模块(角色设定 / 系统提示 / 开场白 / 提示词库)。'\n : '子代理作用域参数(模型/工具集/深度)与子代理提示词配置(audience 非仅主会话;子代理独立人设 = 新建配置卡:system-section + audience=subagent + 人设段,装配时替换主会话人设,无卡 = 继承主会话)。'\n // 已加载过数据时保留旧内容(顶部状态点显示「读取中」),避免切换/保存触发整区骨架屏闪烁。\n const hasData = store.meta.layers.length > 0\n || store.fields.skillCatalog.length > 0\n || store.fields.promptConfigs.length > 0\n\n return (\n <div className={css.shell}>\n <header className={css.masthead}>\n <div className={css.brand}>\n <span className={css.brandLogo} aria-hidden=\"true\">⌁</span>\n <h1>提示词工具</h1>\n </div>\n <div className={css.statusCluster}>\n <span className={css.statusDot} data-state={store.loading ? 'checking' : 'online'} aria-hidden=\"true\" />\n <span>{store.loading ? '读取中' : `${store.fields.promptConfigs.length} 配置 · ${enabledCount} 启用`}</span>\n </div>\n <button type=\"button\" className={css.backButton} onClick={props.onClose}>返回对话</button>\n </header>\n\n <div className={css.topNavigation}>\n <div className={css.nav} role=\"tablist\" aria-label=\"提示词工具页面\">\n {TOP_PAGES.map((item) => (\n <button key={item.id} type=\"button\" role=\"tab\" aria-selected={page === item.id} data-active={page === item.id ? '' : undefined} onClick={() => setPage(item.id)} onKeyDown={tabKeyHandler(TOP_PAGES.map((entry) => entry.id), page, setPage)}>\n <span><strong>{item.label}</strong></span>\n </button>\n ))}\n </div>\n </div>\n\n <main className={css.canvas}>\n <div>\n <PageHeader title={pageTitle} description={pageDetail} meta={layerMeta} />\n\n {store.loading && !hasData ? (\n <div className={ui.skeletonStack} aria-hidden=\"true\">\n {[0, 1, 2, 3].map((item) => <div key={item} className={ui.skeletonRow} />)}\n </div>\n ) : page === 'skills' ? <SkillsSettings store={store} api={props.api} /> : (\n <>\n {page === 'features' && <FeatureSettings store={store} />}\n {page === 'presets' && <PresetsPage store={store} />}\n {page === 'characters' && <CharactersPage store={store} />}\n {page === 'subagent' && <SubagentPage store={store} />}\n </>\n )}\n\n {store.notice && <p className={clsx(ui.notice, store.noticeKind === 'error' && ui.noticeError)} role=\"status\">{store.notice}</p>}\n </div>\n </main>\n </div>\n )\n}\n","/**\n * 官方 slot 工作台:shell.overlay 左上角悬浮触发器 + 右侧抽屉 + settings.plugins.tab 基础设置。\n * 两个可见面共享同一个 PromptToolWorkspaceController,触发按钮通过 body portal\n * 落在对话界面层,几何探针只消费官方 sidebar slot 的宽度。\n */\nimport { useCallback, useEffect, useLayoutEffect, useRef, useSyncExternalStore, useState, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-layout/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings-plugins/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-sidebar/client'\nimport type { InjectFace, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { PromptWorkspace } from './PromptWorkspace.tsx'\nimport { PromptToolWorkspaceController } from './workspace-controller.ts'\nimport type { PromptToolSettingsTransport } from './prompt-tool-store.ts'\nimport type { PromptToolHostApi } from './prompt-tool-types.ts'\nimport { ToggleRow } from './ToggleRow.tsx'\nimport { bridgePost } from './prompt-tool-bridge.ts'\nimport ui from './PromptUi.module.css'\nimport css from './PromptWorkspace.module.css'\n\n/** 两个可见面共享的业务面(无 hooks 舱,InjectFace 原样透传成员);几何探针不携带业务 face。 */\nexport interface PromptToolWorkbenchFace {\n controller: PromptToolWorkspaceController\n api: PromptToolHostApi\n settings: PromptToolSettingsTransport\n}\n\ntype OverlayProps = PropsRuntime<'shell.overlay'> & InjectFace<PromptToolWorkbenchFace>\ntype SidebarGeometryProps = PropsRuntime<'sidebar.footer.action'>\n\n/** 左上角悬浮触发器:透过 body portal 落在对话界面层。 */\nfunction FloatingTrigger(props: { controller: PromptToolWorkspaceController }): ReactNode {\n const { controller } = props\n const open = useSyncExternalStore(controller.subscribe, controller.getSnapshot, controller.getSnapshot).open\n return (\n <div className={css.floatingTriggerLayer} data-dsh-part=\"floating-trigger-layer\">\n <button\n type=\"button\"\n className={css.floatingTrigger}\n data-open={open ? '' : undefined}\n data-dsh-plugin=\"prompt-tool\"\n data-dsh-part=\"floating-trigger\"\n aria-label={open ? '关闭提示词工具' : '打开提示词工具'}\n aria-pressed={open}\n title={open ? '关闭提示词工具' : '打开提示词工具'}\n onClick={() => controller.toggle()}\n >\n <svg viewBox=\"0 0 16 16\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3.5 2.5h6l3 3v8h-9zM9.5 2.5v3h3M6 8.5h4M8 6.5v4\" />\n </svg>\n </button>\n </div>\n )\n}\n\nconst SIDEBAR_WIDE_PADDING = 12\nconst SIDEBAR_COLLAPSED_WIDTH = 56\nconst FLOATING_TRIGGER_GAP = 10\nconst FLOATING_TRIGGER_LEFT_PROPERTY = '--pt-sidebar-edge'\n\n/**\n * Official sidebar slot geometry bridge. The visible trigger is portaled to body\n * from the frame-wide overlay; this element only measures the real, resizable sidebar\n * edge, including the collapsed 56px rail.\n */\nfunction SidebarGeometryProbe(props: SidebarGeometryProps): ReactNode {\n const { wide } = props\n const probeRef = useRef<HTMLDivElement>(null)\n useLayoutEffect(() => {\n const probe = probeRef.current\n if (probe === null) return\n const setLeft = (left: number): void => {\n document.documentElement.style.setProperty(FLOATING_TRIGGER_LEFT_PROPERTY, String(Math.round(left)) + 'px')\n }\n const update = (): void => {\n if (!wide) {\n setLeft(SIDEBAR_COLLAPSED_WIDTH + FLOATING_TRIGGER_GAP)\n return\n }\n // The first parent is the renderer's display:contents slot anchor;\n // the second is the official SidebarRoot footerActions container.\n const rect = probe.parentElement?.parentElement?.getBoundingClientRect()\n if (rect === undefined || (rect.width === 0 && rect.height === 0)) return\n setLeft(rect.right + SIDEBAR_WIDE_PADDING + FLOATING_TRIGGER_GAP)\n }\n update()\n const observer = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(update)\n if (wide) observer?.observe(probe.parentElement?.parentElement ?? probe)\n window.addEventListener('resize', update)\n return () => {\n observer?.disconnect()\n window.removeEventListener('resize', update)\n document.documentElement.style.removeProperty(FLOATING_TRIGGER_LEFT_PROPERTY)\n }\n }, [wide])\n return (\n <div\n ref={probeRef}\n className={css.sidebarEdgeProbe}\n aria-hidden=\"true\"\n />\n )\n}\n\n/** shell.overlay:顶层触发器 + 右侧抽屉工作台;store 状态跨开关保留。 */\nfunction WorkbenchDrawerSlot(props: OverlayProps): ReactNode {\n const { controller, api, settings } = props\n const open = useSyncExternalStore(controller.subscribe, controller.getSnapshot, controller.getSnapshot).open\n useEffect(() => {\n if (!open) return\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') { event.preventDefault(); controller.close() }\n }\n // 与其他面板互斥:兼容仍在 DOM 面板上的 taskboard / ssh 事件总线。\n const onOther = (event: Event): void => {\n const detail = (event as CustomEvent<unknown>).detail\n if (detail === 'taskboard' || detail === 'ssh') controller.close()\n }\n document.addEventListener('keydown', onKey)\n document.addEventListener('dsh-panel-activate', onOther)\n document.dispatchEvent(new CustomEvent('dsh-panel-activate', { detail: 'prompt-tool' }))\n return () => {\n document.removeEventListener('keydown', onKey)\n document.removeEventListener('dsh-panel-activate', onOther)\n }\n }, [open, controller])\n const trigger = <FloatingTrigger controller={controller} />\n return (\n <>\n {typeof document === 'undefined' || document.body === null ? trigger : createPortal(trigger, document.body)}\n <div className={css.drawerLayer} data-open={open ? '' : undefined}>\n <div className={css.drawerBackdrop} onClick={() => controller.close()} aria-hidden=\"true\" />\n <section className={css.drawerPanel} role=\"dialog\" aria-modal=\"true\" aria-label=\"提示词工具\">\n <PromptWorkspace api={api} settings={settings} controller={controller} onClose={() => controller.close()} />\n </section>\n </div>\n </>\n )\n}\n\n/** settings.plugins.tab:基础开关(settings 命名空间直读直写,官方 SettingsScope 通道)。 */\ntype TabProps = PropsRuntime<'settings.plugins.tab'> & InjectFace<PromptToolWorkbenchFace>\n\nfunction SettingsTabSlot(props: TabProps): ReactNode {\n const scope = props.settings.scope\n // useSyncExternalStore 需要稳定的函数引用;直接传方法引用会脱离 this 调用。\n const subscribe = useCallback((listener: () => void) => scope.subscribe(listener), [scope])\n const getSnapshot = useCallback(() => scope.getSnapshot(), [scope])\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n const value = (snapshot.value ?? {}) as Record<string, unknown>\n const [presets, setPresets] = useState<Array<{ id: string; name: string }>>([])\n const [switchingPreset, setSwitchingPreset] = useState(false)\n const [presetNotice, setPresetNotice] = useState<{ kind: 'ok' | 'error'; message: string }>()\n useEffect(() => {\n void bridgePost<{ meta?: { presets?: Array<{ id: string; name: string }> } }>('/meta', {})\n .then((res) => { if (res.ok && res.value.meta?.presets !== undefined) setPresets(res.value.meta.presets) })\n .catch(() => {})\n }, [])\n const set = (field: string, next: unknown): void => { void scope.set(field, next) }\n const switchPreset = async (id: string): Promise<void> => {\n if (switchingPreset || id === value.presetTemplate) return\n setSwitchingPreset(true)\n setPresetNotice(undefined)\n try {\n // 先持久化默认值:Host applyState 会物化目标预设并同步 agent-presets default;\n // settlement 后再重组当前空会话,避免目标生成物尚未就绪。\n await scope.set('presetTemplate', id)\n const result = await props.api.switchPreset(id)\n if (result.applied) {\n setPresetNotice({ kind: 'ok', message: `已切换到 ${id},当前空会话已重组。` })\n } else if (result.message !== undefined) {\n setPresetNotice({ kind: 'error', message: `默认预设已更新为 ${id};当前会话未切换:${result.message}` })\n } else {\n setPresetNotice({ kind: 'ok', message: `默认预设已更新为 ${id};当前没有可重组的空会话。` })\n }\n } catch (error) {\n setPresetNotice({ kind: 'error', message: `切换预设失败:${error instanceof Error ? error.message : String(error)}` })\n } finally {\n setSwitchingPreset(false)\n }\n }\n\n return (\n <section className={ui.section} aria-label=\"提示词工具基础设置\">\n <ToggleRow id=\"pt-writePreset\" label=\"生成锚定注入预设\" hint=\"关闭后移除各预设目录的生成物,参数与内容不再物化。\" checked={value.writePreset === true} onChange={(v) => set('writePreset', v)} />\n <ToggleRow id=\"pt-writeAgents\" label=\"写入 AGENTS.md\" hint=\"把常驻规则写入 ~/.dsh/AGENTS.md。\" checked={value.writeAgents === true} onChange={(v) => set('writeAgents', v)} />\n <ToggleRow id=\"pt-injectAgentsPrompt\" label=\"注入 AGENTS 内容到提示词\" hint=\"用 AGENTS.md 内容替换本地 instruction-hint 的默认提示文本。\" checked={value.injectAgentsPrompt === true} onChange={(v) => set('injectAgentsPrompt', v)} />\n <div className={ui.rowGroup}>\n <div className={ui.settingRowStack}>\n <span className={ui.settingCopy}><strong>预设模板</strong><small>新会话默认挂载的预设;完整预设管理与提示词配置请使用左上角悬浮按钮打开工作台。</small></span>\n <select className={ui.directoryInput} aria-label=\"预设模板\"\n value={typeof value.presetTemplate === 'string' ? value.presetTemplate : ''}\n disabled={!snapshot.writable || switchingPreset}\n onChange={(event) => { void switchPreset(event.target.value) }}>\n {presets.map((preset) => <option key={preset.id} value={preset.id}>{preset.name}</option>)}\n </select>\n {presetNotice !== undefined && (\n <p className={presetNotice.kind === 'error' ? ui.noticeError : ui.notice} role=\"status\">\n {presetNotice.message}\n </p>\n )}\n </div>\n </div>\n </section>\n )\n}\n\n/** 注册官方槽位;触发器在 shell.overlay 顶层,sidebar.footer.action 只提供可拉伸宽度探针。 */\nexport function registerWorkbenchSlots(ctx: ClientContext, face: PromptToolWorkbenchFace): () => void {\n const disposeGeometry = ctx.slots.inject('sidebar.footer.action', () => ctx.slots.register({\n name: 'sidebar.footer.action', id: 'prompt-tool-floating-geometry', order: 40,\n }, SidebarGeometryProbe))\n const disposeTab = ctx.slots.inject('settings.plugins.tab', () => ctx.slots.register({\n name: 'settings.plugins.tab', id: 'prompt-tool', order: 40, label: '提示词工具', inject: () => face,\n }, SettingsTabSlot))\n const disposeOverlay = ctx.slots.inject('shell.overlay', () => ctx.slots.register({\n name: 'shell.overlay', id: 'prompt-tool-workbench', order: 50, inject: () => face,\n }, WorkbenchDrawerSlot))\n return () => { disposeOverlay(); disposeGeometry(); disposeTab() }\n}\n","import type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-api-session-controller/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-workspace/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-api-remotes/client'\nimport type { PromptToolSettingsTransport } from './prompt-tool-store.ts'\nimport { PromptToolWorkspaceController } from './workspace-controller.ts'\nimport { registerWorkbenchSlots, type PromptToolWorkbenchFace } from './slot-workbench.tsx'\nimport type { PromptToolHostApi } from './prompt-tool-types.ts'\n\nexport const inject = [\n 'slots',\n 'settingsScope',\n 'uiWorkspace',\n 'remote',\n 'remote.agentPresets',\n 'remote.session',\n 'sessions',\n]\n\n/** 与宿主 settings namespace 相同的字符串;client 侧不依赖 host 包,按契约字面拼写。 */\nconst PROMPT_TOOL_NS = 'prompt-tool'\n\nexport function apply(ctx: ClientContext): void {\n // alpha.1 ui-settings:标准字段读写走官方共享 describe mirror + scope mutate\n // (revision 校验与 mirror fold 由 SettingsScopeController 内置,无需 acceptView)。\n const scope = ctx.settingsScope.bind<Record<string, unknown>>({ namespace: PROMPT_TOOL_NS })\n const settings: PromptToolSettingsTransport = {\n scope,\n ensure: () => ctx.settingsScope.describe().ensure(),\n mutate: async (ops, expectedRevision) => {\n await scope.mutate(ops, expectedRevision)\n },\n }\n const hostApi: PromptToolHostApi = {\n pickDirectory: () => ctx.uiWorkspace.pickDirectory(),\n openPath: async (path) => {\n const result = await ctx.remote.session.openWorkspacePath({ path })\n if (!result.ok) throw new Error(result.error.message)\n },\n switchPreset: async (id) => {\n const list = ctx.sessions.list.getSnapshot()\n const session = list.current === undefined ? undefined : list.byId[list.current]\n if (session === undefined) return { applied: false }\n if (!session.blank) {\n return { applied: false, message: '当前会话已有内容,官方只允许空会话切换;本次只更新后续会话默认预设' }\n }\n const result = await ctx.remote.agentPresets.select(session.id, id)\n if (!result.ok) {\n const failure = result.error as { message: string; details?: { reason?: unknown } }\n const reason = failure.details?.reason\n return {\n applied: false,\n message: typeof reason === 'string' ? reason : failure.message,\n }\n }\n return { applied: true }\n },\n }\n\n // 官方 slot 工作台:shell.overlay 顶层悬浮按钮 + 右侧抽屉;sidebar.footer.action\n // 仅提供可拉伸侧边栏的几何探针;settings.plugins.tab 基础设置共享同一 controller。\n // 注册全部走 SlotRegistry 的 inject()(等声明就绪)+ ctx.effect 生命周期,\n // 不手工挂载 DOM。\n const controller = new PromptToolWorkspaceController()\n const face: PromptToolWorkbenchFace = { controller, api: hostApi, settings }\n registerWorkbenchSlots(ctx, face)\n}\n"],"x_google_ignoreList":[1],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":["useRef","useState","useRef","styles","Menu","IconChevronDownOutlineRegular","styles","Switch","useCallback","useSyncExternalStore","useState","ui","asRecord","useRef","useState","useCallback","useState","useRef","useCallback","useState","useRef","useAnchoredPosition","useRef","useCallback","useId","useRef","styles","Button","createPortal","useRef","useState","styles","useId","useRef","useState","useCallback","cloneElement","createPortal","css","useRef","ui","memo","sharedCss","useState","useRef","useId","sharedCss","css","css","css","Tag","ui","sharedCss","featureCss","memo","useState","useRef","IconFolderOpenOutlineRegular","IconTrashOutlineRegular","useSyncExternalStore","useRef","useId","useState","useRef","shared","css","styles","sharedCss","featureCss","memo","useState","useRef","IconCopyOutlineRegular","IconFolderOpenOutlineRegular","IconTrashOutlineRegular","useState","useId","styles","IconChevronDownOutlineRegular","ui","ui","sharedCss","featureCss","memo","ui","sharedCss","featureCss","memo","useId","useMemo","useReducer","useState","IconChevronDownOutlineRegular","Switch","sharedCss","featureCss","memo","useState","useRef","useCallback","useMemo","useId","useState","css","IconChevronDownOutlineRegular","useState","useSyncExternalStore","useCallback","css","IconSearchOutlineRegular","useId","isValidElement","cloneElement","styles","useState","styles","styles","sharedCss","featureCss","useMemo","useState","Switch","useId","useId","useRef","useState","Children","isValidElement","styles","styles","sharedCss","featureCss","Switch","styles","sharedCss","featureCss","memo","useState","useRef","useId","IconChevronDownOutlineRegular","Switch","Menu","Button","styles","sharedCss","featureCss","useState","useRef","useMemo","useCallback","styles","sharedCss","featureCss","useState","useRef","useId","IconChevronDownOutlineRegular","Switch","useRef","useState","useState","useRef","useId","styles","IconChevronDownOutlineRegular","Switch","IconTrashOutlineRegular","Switch","styles","useState","useRef","Menu","styles","IconChevronDownOutlineRegular","useSyncExternalStore","useState","styles","useMemo","useState","useRef","useCallback","styles","Button","styles","sharedCss","featureCss","styles","sharedCss","featureCss","useState","useId","useRef","useCallback","useMemo","Switch","memo","useState","useCallback","ui","styles","sharedCss","featureCss","Switch","useState","useId","useRef","IconChevronDownOutlineRegular","Menu","Button","sharedCss","featureCss","useMemo","useState","useRef","Button","ui","css","ui","useState","ui","css","useMemo","useState","useRef","css","ui","styles","Button","createPortal","memo","useState","useCallback","ui","memo","useCallback","memo","useState","useCallback","ui","useRef","css","useRef","css","ui","useState","useRef","useCallback","useSyncExternalStore","useSyncExternalStore","useRef","useState","useCallback","css","useSyncExternalStore","useRef","css","createPortal","PROMPT_TOOL_NS","PROMPT_TOOL_NS","LOCALE_NS"],"sources":["../src/client/data/session-model-face.ts","../src/client/data/session-preset-face.ts","../src/client/data/session-id-source.ts","../src/shared/bridge-contract.ts","../src/client/data/bridge-transport.ts","../src/client/data/bridge-client.ts","../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../src/client/ui/menu-focus.ts","../src/client/ui/MenuSelect.tsx","../src/client/ui/ToggleRow.tsx","../src/client/app/workbench/SettingsTab.tsx","../src/client/data/skill-import.ts","../src/client/data/session-preset-follow.ts","../src/shared/engine-params.ts","../src/shared/engine-capabilities.ts","../src/shared/preset-ids.ts","../src/client/data/prompt-tool-fields.ts","../src/client/data/dirty-state.ts","../src/client/data/param-overrides.ts","../src/shared/skills.ts","../src/shared/managed-config-fields.ts","../src/client/data/prompt-tool-view.ts","../src/client/data/prompt-config-content.ts","../src/client/data/instruction-drafts.ts","../src/client/data/instruction-policy.ts","../src/client/data/save-queue.ts","../src/client/data/trigger-drafts.ts","../src/client/data/workspace-drafts.ts","../src/client/features/models/model-options.ts","../src/client/data/use-prompt-tool-store.ts","../src/client/data/asset-import.ts","../src/client/data/import-files.ts","../src/client/data/use-import-preview-flow.ts","../src/client/ui/anchored-popover-fit.ts","../src/client/ui/anchored-popover.ts","../src/client/ui/dialog-focus.ts","../src/client/ui/DialogSurface.tsx","../src/client/ui/ConfirmDialog.tsx","../src/client/ui/hint-tooltip-position.ts","../src/client/ui/hint-tooltip-focus.ts","../src/client/ui/HintTooltip.tsx","../src/client/ui/ImportFileButton.tsx","../src/client/ui/ImportPreviewCard.tsx","../src/client/ui/ImportDialog.tsx","../src/client/ui/StatusDot.tsx","../src/client/ui/StatusBadge.tsx","../src/client/features/characters/CharactersPage.tsx","../src/client/data/use-prompt-tool-fields.ts","../src/client/features/presets/PresetExportDialog.tsx","../src/client/features/presets/PresetSwitcher.tsx","../src/client/ui/CollapsibleCard.tsx","../src/client/ui/SettingInputRow.tsx","../src/client/features/presets/PresetsPage.tsx","../src/client/features/skills/skill-status.ts","../src/client/features/skills/SkillRow.tsx","../src/client/features/skills/SkillsPage.tsx","../src/client/features/tools/tool-surface-request.ts","../src/client/features/tools/ToolSurfaceView.tsx","../src/client/features/tools/ToolsPreviewPage.tsx","../src/client/ui/reveal-card.ts","../src/client/ui/FormField.tsx","../src/client/ui/TagInput.tsx","../src/client/features/prompts/textarea-resize.ts","../src/client/prompt-tool-types.ts","../src/client/features/prompts/prompt-config-policy.ts","../src/client/features/prompts/PromptConfigFields.tsx","../src/client/ui/tab-key.ts","../src/client/features/prompts/PromptConfigNavigation.tsx","../src/client/features/prompts/PromptConfigForm.tsx","../src/client/features/prompts/PromptConfigCard.tsx","../src/client/features/prompts/prompt-config-order.ts","../src/client/features/prompts/PromptConfigList.tsx","../src/client/features/prompts/PromptConfigsEditor.tsx","../src/client/features/prompts/useTemplatePicker.ts","../src/client/ui/EngineModuleCard.tsx","../src/client/features/modules/EngineParamFields.tsx","../src/client/features/modules/EngineModuleList.tsx","../src/client/features/models/ModelRouteCard.tsx","../src/client/features/persona/PresetPersonaCard.tsx","../src/client/features/subagents/DelegationToolsCard.tsx","../src/client/features/subagents/subagent-policy-draft.ts","../src/client/features/subagents/SubagentToolPolicyCard.tsx","../src/client/features/prompts/WorldBookDiagnosticsCard.tsx","../src/client/features/tools/custom-tool-parameters.ts","../src/client/features/tools/CustomToolEditor.tsx","../src/client/features/tools/CustomToolsCard.tsx","../src/client/features/triggers/TriggerJsonField.tsx","../src/client/locales-triggers.ts","../src/client/features/triggers/trigger-labels.ts","../src/client/features/triggers/TriggerRuleFields.tsx","../src/client/features/triggers/TriggerRulesEditor.tsx","../src/client/app/workspace/pages/EngineLayersPanel.tsx","../src/client/ui/TemplatePicker.tsx","../src/client/app/workspace/pages/MainSessionPage.tsx","../src/client/app/workspace/pages/ConfigListWithTemplates.tsx","../src/client/app/workspace/pages/SubagentPage.tsx","../src/client/app/workspace/workspace-pages.ts","../src/client/app/workspace/WorkspaceNavigation.tsx","../src/client/app/workspace/WorkspaceFrame.tsx","../src/client/app/workspace/workspace-browse-state.ts","../src/client/app/workspace/PromptWorkspace.tsx","../src/client/app/workbench/floating-trigger-position.ts","../src/client/app/workbench/FloatingTrigger.tsx","../src/client/app/workbench/WorkbenchOverlay.tsx","../src/client/locales-params.ts","../src/client/locales-prompts.ts","../src/client/locales-cards.ts","../src/client/locales.ts","../src/client/app/workbench/register-workbench.tsx","../src/client/app/workbench/workspace-controller.ts","../src/client/index.ts"],"sourcesContent":["/**\n * 当前会话模型选择面工厂(官方 session 投影 + session.selectModel 通道)。\n *\n * 与官方 ui-model-selection(composer 模型位 / /model 弹层)同一事实源:\n * 显示 = sessions 投影 `modelSelection.next` ?? 宿主默认(调用方回退);\n * 写入 = session.selectModel —— 宿主 session-controller 校验路由、追加\n * `model/selection` 事件,并把同一选择持久化为新会话默认(agent-default-model),\n * 因此宿主侧(composer 选择器)与本插件 UI 双向同源。\n *\n * 依赖以结构类型声明(客户端 sessions 服务与 session remote 的使用子集),\n * 便于 node:test 以纯 mock 做确定性回归。\n */\n\nimport type { SessionModelFace, SessionModelSnapshot } from './host-api.ts'\n\n/** 快照 Observable 的结构最小面(官方 ObservableSnapshot 同构)。 */\ninterface SnapshotLike<T> {\n getSnapshot(): T\n subscribe(listener: () => void): () => void\n}\n\n/**\n * 客户端 sessions 服务与当前会话来源的使用子集。\n *\n * `currentSessionId`/`subscribeCurrent` 由 session-id-source 的作用域绑定提供:\n * 官方在 alpha.2 删除了 `SessionListState.current`,列表快照不再承载当前选中项,\n * 这里不再声明该字段,让官方字段再次变动时类型检查能够报错。\n */\nexport interface SessionModelSessionsLike {\n currentSessionId(): string | undefined\n /** 会话切换信号(作用域绑定变化);退订后静默。 */\n subscribeCurrent(listener: () => void): () => void\n binding(id: string): { session: { projections: { faceOf(key: string): SnapshotLike<unknown> } } } | undefined\n subagentAddress(id: string): unknown\n}\n\n/** session.selectModel remote 的结构面(RemoteResult 同构)。 */\nexport type SessionModelSelectFn = (request: {\n sessionId: string\n provider: string\n model: string\n reasoningEffort?: string\n}) => Promise<{ ok: true } | { ok: false; error: { code?: string; message?: string } }>\n\n/** 从 modelSelection 投影值提取有效选择(next;缺 provider/model 视为无会话级选择)。 */\nfunction projectionSelection(value: unknown): SessionModelSnapshot['selection'] {\n if (value === null || typeof value !== 'object') return undefined\n const next = (value as { next?: unknown }).next\n if (next === null || next === undefined || typeof next !== 'object') return undefined\n const record = next as Record<string, unknown>\n const provider = typeof record.provider === 'string' && record.provider.length > 0 ? record.provider : undefined\n const model = typeof record.model === 'string' && record.model.length > 0 ? record.model : undefined\n if (provider === undefined || model === undefined) return undefined\n return {\n provider,\n model,\n ...(typeof record.reasoningEffort === 'string' && record.reasoningEffort.length > 0\n ? { reasoningEffort: record.reasoningEffort }\n : {}),\n }\n}\n\n/** 创建当前会话模型选择面(引用稳定快照 + 列表/投影双层订阅)。 */\nexport function createSessionModelFace(sessions: SessionModelSessionsLike, selectModel: SessionModelSelectFn): SessionModelFace {\n let cached: SessionModelSnapshot = { selectable: false }\n const snapshot = (): SessionModelSnapshot => {\n const sessionId = sessions.currentSessionId()\n const selectable = sessionId !== undefined && sessions.subagentAddress(sessionId) === undefined\n const selection = sessionId === undefined\n ? undefined\n : projectionSelection(sessions.binding(sessionId)?.session.projections.faceOf('modelSelection').getSnapshot())\n // uSES 引用稳定:逐字段比较,值不变复用旧引用(否则每次 getSnapshot 新对象导致死循环重渲染)。\n if (cached.sessionId === sessionId && cached.selectable === selectable\n && cached.selection?.provider === selection?.provider\n && cached.selection?.model === selection?.model\n && cached.selection?.reasoningEffort === selection?.reasoningEffort) return cached\n cached = {\n ...(sessionId === undefined ? {} : { sessionId }),\n selectable,\n ...(selection === undefined ? {} : { selection }),\n }\n return cached\n }\n return {\n snapshot,\n subscribe(listener) {\n let watched: string | undefined\n let stopProjection: (() => void) | undefined\n const watchCurrent = (): void => {\n const id = sessions.currentSessionId()\n if (id === watched) return\n watched = id\n stopProjection?.()\n stopProjection = undefined\n if (id !== undefined) {\n stopProjection = sessions.binding(id)?.session.projections.faceOf('modelSelection').subscribe(listener)\n }\n }\n watchCurrent()\n const stopList = sessions.subscribeCurrent(() => {\n watchCurrent()\n listener()\n })\n return () => {\n stopList()\n stopProjection?.()\n }\n },\n async select(selection) {\n const sessionId = sessions.currentSessionId()\n if (sessionId === undefined) throw new Error('当前没有活动会话')\n const result = await selectModel({ sessionId, ...selection })\n if (!result.ok) throw new Error(`${result.error.code ?? 'session/model-unavailable'}: ${result.error.message ?? 'selectModel failed'}`)\n },\n }\n}\n","/**\n * 当前会话预设面:读官方会话投影 `agentPreset`(该会话真正运行的预设)。\n *\n * 为什么需要它:官方「新建会话」旁的预设选择器走会话级切换\n * (`agentPresets/select`),只作用于那个空白会话,记录成 `agent-preset/selected`\n * 事件并推进 `agentPreset` 投影;宿主默认预设(`agent-presets.default`)保持不变。\n * 插件的 `presetTemplate` 镜像的是宿主默认(官方设置页改默认那条路已由宿主侧双向\n * 同步覆盖),因此不订阅这个投影就看不到官方侧的选择。\n *\n * 读取路径与官方 ui-agent-preset 的 chip 同源:会话投影值。宿主未装 agent-presets\n * 时投影不存在,按「无记录」处理,不让工作台因此报错。\n * 依赖以结构类型声明,便于 node:test 以纯 mock 做确定性回归。\n */\n\nimport type { SessionPresetFace } from './host-api.ts'\n\n/** 快照 Observable 的结构最小面(官方 ObservableSnapshot 同构)。 */\ninterface SnapshotLike<T> {\n getSnapshot(): T\n subscribe(listener: () => void): () => void\n}\n\n/** 客户端 sessions 服务与当前会话来源的使用子集(与 session-model-face 同源契约)。 */\nexport interface SessionPresetSessionsLike {\n currentSessionId(): string | undefined\n /** 会话切换信号(作用域绑定变化);退订后静默。 */\n subscribeCurrent(listener: () => void): () => void\n binding(id: string): { session: { projections: { faceOf(key: string): SnapshotLike<unknown> } } } | undefined\n}\n\n/** 投影值 → 预设 id:非字符串或空串表示该会话没有记录预设。 */\nfunction presetIdOf(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\n/** 创建当前会话预设面(引用稳定快照 + 当前会话/投影双层订阅)。 */\nexport function createSessionPresetFace(sessions: SessionPresetSessionsLike): SessionPresetFace {\n /** 投影缺失(宿主未装 agent-presets)或 face 读取失败都按「无记录」。 */\n const faceOf = (id: string): SnapshotLike<unknown> | undefined => {\n try {\n return sessions.binding(id)?.session.projections.faceOf('agentPreset')\n } catch {\n return undefined\n }\n }\n const presetOf = (id: string | undefined): string | undefined =>\n id === undefined ? undefined : presetIdOf(faceOf(id)?.getSnapshot())\n return {\n snapshot: () => presetOf(sessions.currentSessionId()),\n subscribe(listener) {\n let watched: string | undefined\n let stopProjection: (() => void) | undefined\n const watchCurrent = (): void => {\n const id = sessions.currentSessionId()\n if (id === watched) return\n watched = id\n stopProjection?.()\n stopProjection = undefined\n if (id !== undefined) stopProjection = faceOf(id)?.subscribe(listener)\n }\n watchCurrent()\n const stopList = sessions.subscribeCurrent(() => {\n watchCurrent()\n listener()\n })\n return () => {\n stopList()\n stopProjection?.()\n }\n },\n }\n}\n","/**\n * 当前会话 id 来源。\n *\n * alpha.2 起官方把「当前选中会话」移出 Session Controller:`ISessions` 的注释\n * 明示 `navigation belongs to view owners`,`SessionListState.current` 已被删除,\n * `UiWorkspaceService.selection` 与 `UiSession.current` 均为 private,\n * `useSessions` 返回的 `SessionListState` 也不含 current。\n *\n * 唯一公开的读取路径是 ui-session 的 `SlotScopeAdapter`:`adapter.current` 给出\n * 当前会话作用域绑定,非 root 绑定自带作用域 ctx,经 `sessions.scopeOf` 反查\n * 得到 session id;绑定的 `key` 是作用域身份,作为兜底。\n *\n * 依赖以结构类型声明(只描述实际用到的成员),便于 node:test 以纯 mock 做\n * 确定性回归;同时让官方删除字段时类型检查能够报错,而不是静默降级。\n */\n\n/** sessions 服务的使用子集:从作用域 ctx 反查会话 id。 */\nexport interface SessionIdSessionsLike {\n /** 接受任意对象形态的作用域 ctx;官方签名为 `(ctx: Context)`,参数更宽即兼容。 */\n scopeOf(ctx: object): string | undefined\n}\n\n/** 作用域绑定:kv 身份 + 可选的作用域 ctx。 */\nexport interface ScopeBindingLike {\n readonly key?: string | undefined\n readonly ctx?: unknown\n}\n\n/** ui-session 适配器的结构面:当前作用域绑定快照与变化通知。 */\nexport interface SessionIdAdapterLike {\n readonly current: {\n getSnapshot(): ScopeBindingLike\n subscribe(listener: () => void): () => void\n }\n}\n\n/**\n * 读当前会话 id。\n *\n * @param adapter - ui-session 的 `ctx.uiSession.adapter`。\n * @param sessions - `ctx.sessions`。\n * @returns 当前会话 id;无选中会话、root 绑定或 key 为空时返回 undefined。\n */\nexport function readCurrentSessionId(adapter: SessionIdAdapterLike, sessions: SessionIdSessionsLike): string | undefined {\n const binding = adapter.current.getSnapshot()\n const scopeCtx = binding.ctx\n if (typeof scopeCtx === 'object' && scopeCtx !== null) {\n const viaScope = sessions.scopeOf(scopeCtx)\n if (viaScope !== undefined && viaScope.length > 0) return viaScope\n }\n const key = binding.key\n return key === undefined || key.length === 0 ? undefined : key\n}\n\n/**\n * 订阅当前会话 id 的变化。\n *\n * 作用域绑定要等主视图 retain 该会话之后才有值(官方 `publishMain` 以\n * `retainedBy.mainView > 0` 为准),所以它晚于工作台首次打开——这是必须在\n * id 就绪时补一次加载的原因。只在 id **实际变化**时通知:绑定对象换引用\n * 不算变化,否则会空转重载。\n *\n * @param adapter - ui-session 的 `ctx.uiSession.adapter`。\n * @param sessions - `ctx.sessions`。\n * @param onChange - id 实际变化时回调(无参,调用方自行读取当前值)。\n * @returns 退订函数。\n */\nexport function subscribeSessionIdChange(\n adapter: SessionIdAdapterLike,\n sessions: SessionIdSessionsLike,\n onChange: () => void,\n): () => void {\n let last = readCurrentSessionId(adapter, sessions)\n return adapter.current.subscribe(() => {\n const next = readCurrentSessionId(adapter, sessions)\n if (next === last) return\n last = next\n onChange()\n })\n}\n","/**\n * settings bridge 跨端契约(host 注册 / client 消费的唯一来源)。\n * 铁律:所有端点载荷统一成功 `{ ok: true, value }`、失败 `{ ok: false, code?, message? }`;\n * 端点附加字段只能以 value 旁的可选扩展字段出现(describe)。\n * 改路径或载荷形状必须同步更新 test/shared/bridge-contract.test.mjs。\n */\nimport type { PersonaSpec } from './persona-section.ts'\nimport type { AssetImportRequest, AssetSummary, ImportKind, PresetExportRequest, PresetExportResult } from './asset-transfer.ts'\nimport type { EngineEditorGroup, EngineLayer } from './engine-capabilities.ts'\nimport type { ConfigFieldSources } from './managed-config-fields.ts'\nimport type { OfficialOrdersView } from './official-orders.ts'\nimport type { SkillContentSnapshot, SkillPolicyChange, SkillsCatalogSnapshot } from './skills.ts'\nimport type {\n InstructionFileWriteResult,\n InstructionPolicy,\n InstructionPolicyPatch,\n InstructionsSnapshot,\n} from './instructions.ts'\n\nexport const SETTINGS_BRIDGE_PREFIX = '/api/prompt-tool/settings'\n\n/** JSON bridge 的统一内存缓冲上限;超过后改用原始文件流端点。 */\nexport const MAX_BRIDGE_BODY_BYTES = 32 * 1024 * 1024\n/** 角色卡原始文件流上限;独立于 JSON bridge,避免 base64 膨胀。 */\nexport const MAX_CHARACTER_CARD_STREAM_BYTES = 64 * 1024 * 1024\n\n/** 桥端点路径(相对前缀)。新增端点必须同时登记到契约测试。 */\nexport const BRIDGE_ENDPOINTS = {\n meta: '/meta',\n bootstrap: '/bootstrap',\n describe: '/describe',\n models: '/models',\n modelReasoning: '/model-reasoning',\n mutate: '/mutate',\n configsValidate: '/configs-validate',\n skillsList: '/skills-list',\n skillPolicy: '/skill-policy',\n skillRead: '/skill-read',\n skillWrite: '/skill-write',\n skillsFolders: '/skills-folders',\n skillsImport: '/skills-import',\n skillsImportDirectory: '/skills-import-directory',\n skillCreate: '/skill-create',\n skillDelete: '/skill-delete',\n templates: '/templates',\n promptConfigs: '/prompt-configs',\n agentsFile: '/agents-file',\n instructionsPolicy: '/instructions-policy',\n presetContent: '/preset-content',\n importPreset: '/import-preset',\n paramOverrides: '/param-overrides',\n triggers: '/triggers',\n persona: '/persona',\n presetVariables: '/preset-variables',\n customTools: '/custom-tools',\n importPresetPackage: '/import-preset-package',\n assetUpload: '/asset-upload',\n assetRelease: '/asset-release',\n exportPreset: '/export-preset',\n presetDelete: '/preset-delete',\n presetClone: '/preset-clone',\n presetDuplicate: '/preset-duplicate',\n presetOpen: '/preset-open',\n charactersImport: '/characters-import',\n charactersImportStream: '/characters-import-stream',\n charactersList: '/characters-list',\n charactersDelete: '/characters-delete',\n charactersApply: '/characters-apply',\n charactersRemove: '/characters-remove',\n subagentToolPolicy: '/subagent-tool-policy',\n subagentToolPolicyPreview: '/subagent-tool-policy-preview',\n toolSurface: '/tool-surface',\n engineCapability: '/engine-capability',\n worldBookDiagnostics: '/world-book-diagnostics',\n} as const\n\nexport type BridgeEndpoint = (typeof BRIDGE_ENDPOINTS)[keyof typeof BRIDGE_ENDPOINTS]\n\n/** 失败载荷:两端共用。 */\nexport type BridgeErrorPayload = { ok: false; code?: string; message?: string; conflicts?: string[] }\n\n/**\n * 端点级请求体契约(body 形状;无请求体端点 = undefined)。\n * 与 BRIDGE_ENDPOINTS 一一对应:新增端点必须同时补请求/响应映射,否则编译期断言失败。\n * 载荷仍统一走 { ok, value } 包装(见 BridgeResult),这里收敛每端的 value 具体形状。\n */\nexport interface BridgeRequestMap {\n meta: undefined\n /** 可选 sessionId:服务端据此解析该本地 Agent 的工作区,返回对应指令文件快照。 */\n bootstrap: { sessionId?: string } | undefined\n describe: undefined\n /** 省略 body 或 `refresh: true`(显式刷新越过 10 分钟目录 TTL)。 */\n models: { refresh?: boolean } | undefined\n modelReasoning: { provider: string; model: string }\n mutate: { ops: unknown[]; expectedRevision?: number }\n configsValidate: { promptConfigs: unknown[]; strategyDir?: string }\n /** 技能清单:按会话工作区扫描官方六类技能根,调用策略取自各技能文件的 frontmatter。 */\n skillsList: { sessionId?: string } | undefined\n /** 调用策略开关:改写该技能 SKILL.md frontmatter 的官方两个键(正文不动);\n * path 必须命中服务端当次扫描的同名条目,否则按陈旧界面拒绝。 */\n skillPolicy: { name: string; path: string; sessionId?: string } & SkillPolicyChange\n /** 技能描述、Markdown 正文和完整原文摘要;重新扫描同名同路径身份。 */\n skillRead: { name: string; path: string; sessionId?: string }\n /** 仅保存描述与正文,保持其余 frontmatter,并用完整原文摘要拒绝并发覆盖。 */\n skillWrite: { name: string; path: string; sessionId?: string; content: string; description: string; expectedRevision: string }\n /** 添加 / 移除引用的技能文件夹(只记状态,不复制文件)。 */\n skillsFolders: { folders: string[]; sessionId?: string }\n /** overwrite 仅包含用户已确认覆盖的技能目录名;缺省时遇到同名返回冲突且不写盘。 */\n skillsImport: { files: Array<{ path: string; content: string }>; overwrite?: string[] }\n skillsImportDirectory: { path: string; overwrite?: string[] }\n skillCreate: { name: string; description: string; content: string }\n skillDelete: { name: string; path: string; sessionId?: string }\n templates: undefined\n /** 可选 sessionId:与 /bootstrap 同源解析当前工作区(单读与聚合读取必须一致)。 */\n promptConfigs: { sessionId?: string } | undefined\n /**\n * 单文件写盘:fileId/contextId 必须命中服务端当次解析的白名单;\n * expectedRevision 是客户端已读取的字节版本(乐观并发控制,服务端重读校验)。\n */\n agentsFile: {\n sessionId?: string\n contextId: string\n fileId: string\n expectedRevision: string | null\n content: string\n }\n /**\n * 指令文件卡策略(独立存储,默认禁用):省略 `policy` = 读取;\n * 写入必须带读取时的 `expectedRevision`(文件缺失为 null)。\n */\n instructionsPolicy: { policy?: InstructionPolicyPatch; expectedRevision?: string | null } | undefined\n presetContent: undefined\n importPreset: { contents: Array<{ scope: 'preset' | 'agents'; content: string }>; expectedPresetId?: string }\n paramOverrides: { overrides?: Record<string, unknown>; promptConfigs?: unknown[]; rebuild?: boolean; expectedPresetId?: string }\n triggers: { expectedPresetId: string; triggers?: unknown[]; expectedRevision?: string; validateOnly?: boolean }\n /** 顶层 persona 段读写(官方 @deepseek-ai/dsh-persona 行 config 同构);省略 persona 键 = 读取。 */\n persona: { persona?: PersonaSpec | null; expectedPresetId?: string } | undefined\n presetVariables: { variables?: Record<string, string>; enabled?: boolean; expectedPresetId?: string }\n customTools: { customTools?: unknown[]; expectedPresetId?: string } | undefined\n /**\n * 预设包导入(原生/ST/PNG/ZIP)。`preview: true` 只转换并返回报告,不写目标;\n * 提交必须携带 expectedSourceDigest 和 expectedPreviewRevision,服务端重算并拒绝过期预览。\n * `expectedPreviewRevision` 是预览返回的版本凭据:绑定文件、实际选组、转换器版本与\n * 目标身份(含目标当前内容),服务端提交时重算,不符返回 409 且零写盘。\n * `promptOrderCharacterId` 用于多顺序组包时显式选择:预览缺省时先返回候选\n * (`state: 'needs-order-selection'`),提交时仍无法明确对应则拒绝。\n * 上述参数只接受声明的类型,其它类型一律 400(见 docs/SillyTavern.md)。\n */\n importPresetPackage: AssetImportRequest\n assetUpload: undefined\n assetRelease: { sourceId: string }\n exportPreset: PresetExportRequest\n presetDelete: { id: string }\n presetClone: { id: string; autoSuffix?: boolean }\n presetDuplicate: { id: string }\n presetOpen: { id: string }\n /** 角色卡 PNG/JSON/YAML 导入;预览不写角色库,提交必验版本,目标和选组均绑定预览。 */\n charactersImport: AssetImportRequest\n charactersImportStream: undefined\n charactersList: undefined\n charactersDelete: { id: string }\n charactersApply: { id: string }\n charactersRemove: { id: string }\n subagentToolPolicy: { policy?: unknown; expectedPresetId?: string } | undefined\n subagentToolPolicyPreview: { tool?: string; description?: string; prompt?: string; tool_profile?: string; character_id?: string; task_type?: string; additional_tools?: string[]; restrict_tools?: string[] }\n toolSurface: { sessionId: string; presetId?: never } | { presetId: string; sessionId?: never }\n engineCapability: ({ action: 'create' | 'remove'; capabilityId: string } | { action: 'create-recipe'; recipeId: string }) & { expectedPresetId?: string }\n /** 只读世界书诊断:只回当前授权会话最近一次选择的观测记录。 */\n worldBookDiagnostics: { sessionId?: string } | undefined\n}\n\n/** settings descriptor 的跨端最小结构。 */\nexport interface BridgeSettingsView {\n ns: string\n value: unknown\n base?: unknown\n revision: number\n}\n\n/**\n * 一条 provider/model 路由的推理档位元数据(官方模型元数据的展示子集)。\n *\n * `known` 区分「查过且该路由不提供档位」与「尚未取得元数据」:前者 UI 必须隐藏档位\n * 选择而不是拿固定列表伪造能力;后者只是还没查到,不能据此判断模型没有推理能力。\n * 目录/元数据只作展示,不是授权白名单——查询失败不影响保存任意模型 id。\n */\nexport interface ModelReasoningView {\n known: boolean\n efforts: Array<{ id: string; name: string; description?: string }>\n defaultEffort?: string\n}\n\n/**\n * SillyTavern 转换报告(ST-03):host 在真实转换路径上生成的**只读派生元数据**。\n * 不落盘进 preset.yml、不进入模型上下文,也不是写入凭证——提交仍以本次上传文件重算的\n * `sourceDigest` 为准;预览返回的摘要不能替代后端对目标/类型/大小的既有校验。\n */\nexport type StConversionClass = 'equivalent' | 'degraded' | 'unsupported' | 'excluded'\n\nexport interface StConversionEntryReport {\n /** 来源条目身份:上传文件显示名内的原 identifier/uid(不含绝对路径)。 */\n sourceId: string\n /** 来源在文件内的序号(prompts 数组下标或世界书 entries 序号)。 */\n sourceIndex: number\n /** 生成的目标配置 id(被排除的条目没有目标)。多文件合并后重写为**最终** id。 */\n targetId?: string\n /** 同源生成的 promptConfigs 下标:合并重命名时用它把 targetId 关联到最终配置。 */\n targetIndex?: number\n /** 来源显示名(多文件合并时用于区分条目来自哪个上传文件)。 */\n sourceName?: string\n /** 来源在本次合并中的序号(0 起)。 */\n sourceFileIndex?: number\n layer?: string\n order?: number\n role?: string\n position?: string\n classification: StConversionClass\n /** 稳定原因码(如 depth-collapsed / system-role-downgrade / marker-dropped)。 */\n codes: string[]\n}\n\nexport interface StConversionDiagnostic {\n code: string\n severity: 'warning' | 'info'\n message: string\n /** 源身份定位:来源条目 id(与 targetId 分开表达,不混用同一字段)。 */\n entryId?: string\n /** 目标身份定位:生成/合并后的最终配置 id(源条目被排除时缺省)。 */\n targetId?: string\n field?: string\n}\n\nexport interface StConversionReport {\n /** 转换器版本:解释本次生成使用了哪一版语义。 */\n converter: string\n /** 来源显示名(上传文件名,不含绝对路径)。 */\n sourceName: string\n /** prompt_order 分组;`selected` 标记本次实际采用的组。 */\n orderGroups: Array<{ characterId: string; selected: boolean; entries: number }>\n entries: StConversionEntryReport[]\n diagnostics: StConversionDiagnostic[]\n summary: {\n /** 来源条目总数(prompts + 世界书条目 + 角色卡正文段)。 */\n inputs: number\n /** 生成的 promptConfigs 数量。 */\n converted: number\n /** 生成但被禁用的条目数。 */\n disabled: number\n excluded: number\n unsupported: number\n degraded: number\n /** 需要用户确认的诊断数(warning 级)。 */\n needsReview: number\n }\n /** 记录超出上限时为 true:只截断展示,不影响转换结果。 */\n truncated?: boolean\n}\n\n/** 世界书入选/落选诊断记录(只读派生数据,由引擎真实求值路径产生)。 */\nexport interface WorldBookDiagnosticRecord {\n /** 配置 id(`lore-<来源条目>`)。 */\n id: string\n stage: 'excluded' | 'rejected' | 'candidate' | 'selected' | 'committed'\n /** 稳定原因码:disabled / delay / cooldown / recursion / primary-miss / secondary-miss /\n * probability / group-lost / group-occupied / match-error / sticky / constant / key-match /\n * ungrouped / group-winner / injected。 */\n reason: string\n [key: string]: unknown\n}\n\n/** 顺序组候选:多 prompt_order 组需要用户先选择时的有界选项(不含转换结果)。 */\nexport interface StOrderGroupCandidate {\n characterId: string\n entries: number\n}\n\n/** 导入预览状态:`ready` 才有报告与写入凭据;候选状态不得启用确认。 */\nexport type ImportPreviewState = 'ready' | 'needs-order-selection' | 'needs-kind-selection'\n\n/** 引擎实际消费的实例参数;只下发可序列化约束,未知扩展键仍由原配置保留。 */\nexport interface LayerParamContract {\n type: 'string' | 'boolean' | 'object' | 'enum'\n values?: readonly string[]\n}\n\n/** 声明编辑目录由引擎提供;示例同时经过声明编译器验证。 */\nexport interface TriggerEditorMeta {\n predicates: Array<{ kind: string; example: Record<string, unknown> }>\n actions: Array<{ kind: string; example: Record<string, unknown>; channel: string; phase: string; supportsWhen: boolean }>\n composites: string[]\n waterfallPositions: string[]\n}\n\nexport interface LayerContract {\n strategies: readonly string[]\n subjects: readonly string[]\n content: 'text' | 'request' | 'stream' | 'tool-result' | 'subagent-result'\n variables: boolean\n messageMetadata: boolean\n params: Readonly<Record<string, LayerParamContract>>\n}\n\n/**\n * /meta 与 /bootstrap 的 meta 段下发的层契约:九层顺序 + 编辑组主归属。\n * 只含可序列化白名单字段(组 id / displayLayer / relatedLayers / hook):\n * 不含路径、行级配置、校验函数或服务实例 —— 展示归属不扩大写权限。\n * 插件与内置引擎同步发布,这些字段由当前 bridge 完整下发。\n */\nexport interface EngineMetaLayerContract {\n /** 九层固定顺序(引擎 LAYER_ORDER,host 不另写一份)。 */\n layerOrder: readonly EngineLayer[]\n /** 编辑组主归属总表(能力组 id = 能力 id);前端据此组织九层卡片。 */\n editorGroups: readonly EngineEditorGroup[]\n /** 每层真实可编辑的行为契约,来自独立可分发的 engine/schema.mjs。 */\n layerContracts: Record<EngineLayer, LayerContract>\n}\n\n/** 物化配置的只读来源;与配置一同读回,不能作为写入字段或授权。 */\nexport interface PromptConfigSourceView {\n fieldSources?: ConfigFieldSources\n}\n\n/** 端点级响应 value 契约(value 字段形状;扩展字段仍以 value 旁可选字段出现)。 */\nexport interface BridgeValueMap {\n /**\n * `/meta` 与 `/bootstrap` 的 meta 段:层契约 + 官方装配刻度。\n * `officialOrders` 缺席表示服务降级或官方档位名不匹配,消费方必须退化(不渲染刻度)。\n */\n meta: { meta: Record<string, unknown> & EngineMetaLayerContract & { officialOrders?: OfficialOrdersView } }\n bootstrap: BridgeSettingsView\n describe: BridgeSettingsView\n models: { modelCatalog: Record<string, string[]> }\n modelReasoning: { reasoning: ModelReasoningView }\n mutate: BridgeSettingsView\n configsValidate: { valid: boolean; errors: Array<{ index: number; id: string; message: string }>; configs?: unknown[]; files?: unknown[] }\n /** 技能清单 + 引用目录 + 技能根(客户端据此渲染来源分组与调用策略)。 */\n skillsList: SkillsCatalogSnapshot & { folders: string[]; roots: string[] }\n skillPolicy: SkillsCatalogSnapshot\n skillRead: SkillContentSnapshot\n skillWrite: SkillContentSnapshot\n skillsFolders: SkillsCatalogSnapshot & { folders: string[] }\n skillsImport: { path: string; count: number; overwritten: number; warning?: string }\n skillCreate: { id: string; path: string }\n skillDelete: { id: string; path: string }\n skillsImportDirectory: { path: string; count: number; overwritten: number; warning?: string }\n templates: { templates?: unknown[]; toolTemplates?: unknown[] }\n promptConfigs: { promptConfigs: Array<Record<string, unknown> & PromptConfigSourceView>; instructions?: InstructionsSnapshot }\n agentsFile: InstructionFileWriteResult\n instructionsPolicy: { policy: InstructionPolicy; revision: string | null; exists: boolean; error?: string }\n presetContent: Record<string, unknown>\n importPreset: { scopes: Array<'preset' | 'agents'> }\n /** 参数/提示词配置只保存当前预设,不同步宿主全局默认模型。 */\n paramOverrides: { overrides?: Record<string, unknown>; promptConfigs?: unknown[] }\n triggers: { triggers: unknown[]; revision: string; meta: TriggerEditorMeta }\n persona: { persona: PersonaSpec | null }\n presetVariables: { variables: Record<string, string>; enabled: boolean }\n customTools: { customTools?: unknown[] }\n importPresetPackage: {\n id?: string\n backupPath?: string\n preview?: boolean\n state?: ImportPreviewState\n /** 候选状态下的歧义来源文件显示名(不含绝对路径)。 */\n sourceName?: string\n candidates?: StOrderGroupCandidate[]\n sourceDigest?: string\n previewRevision?: string\n report?: StConversionReport\n summary?: AssetSummary\n kinds?: ImportKind[]\n refreshWarning?: string\n }\n assetUpload: { sourceId: string; name: string; bytes: number }\n assetRelease: { released: boolean }\n exportPreset: PresetExportResult\n presetDelete: { id: string }\n presetClone: { id: string }\n presetDuplicate: { id: string }\n presetOpen: { path: string }\n charactersImport: {\n id?: string\n name?: string\n preview?: boolean\n state?: ImportPreviewState\n candidates?: StOrderGroupCandidate[]\n sourceDigest?: string\n previewRevision?: string\n report?: StConversionReport\n summary?: AssetSummary\n kinds?: ImportKind[]\n }\n charactersImportStream: { id: string; name: string }\n charactersList: { characters: Array<{ id: string; name: string; description?: string; hasAvatar: boolean; imported: boolean }> }\n charactersDelete: { id: string }\n charactersApply: { id: string; count: number }\n charactersRemove: { id: string; count: number }\n subagentToolPolicy: { policy: unknown; defaultProfile?: string; errors?: string[] }\n subagentToolPolicyPreview: { result: unknown; errors?: string[] }\n toolSurface: {\n source: 'session' | 'preset'\n sessionId?: string\n presetId?: string\n tools: Array<{ name: string; description: string }>\n }\n engineCapability: { changed: boolean; addedModules?: string[]; removedModules?: string[]; capabilityIds: string[] }\n /** 只读世界书诊断:只回当前授权会话最近一次选择的观测记录(读取不重新求值)。 */\n worldBookDiagnostics: { records: WorldBookDiagnosticRecord[]; truncated: boolean; step: number; evaluated: boolean }\n}\n/** 编译期断言:请求/响应映射与 BRIDGE_ENDPOINTS 键集合完全一致(漏改任一侧 typecheck 失败)。 */\ntype AssertCoverage<K extends string, M extends object> =\n Exclude<K, keyof M> extends never\n ? Exclude<keyof M, K> extends never ? true : false\n : false\ntype _requestCoverage = AssertCoverage<keyof typeof BRIDGE_ENDPOINTS, BridgeRequestMap>\ntype _responseCoverage = AssertCoverage<keyof typeof BRIDGE_ENDPOINTS, BridgeValueMap>\n","/** settings bridge 的底层 HTTP/文件传输与统一结果解析。 */\nimport type { EngineMeta, PromptConfigDraft } from '../prompt-tool-types.ts'\nimport type { HostDefaultModel, SkillCatalogEntry } from './prompt-tool-fields.ts'\nimport type { PresetModuleFacts } from '../../shared/engine-capabilities.ts'\nimport type { InstructionsSnapshot } from '../../shared/instructions.ts'\nimport {\n MAX_BRIDGE_BODY_BYTES,\n SETTINGS_BRIDGE_PREFIX,\n type BridgeErrorPayload,\n} from '../../shared/bridge-contract.ts'\n\ninterface BridgeSuccessExtras {\n providers?: string[]\n modelCatalog?: Record<string, string[]>\n activeSkillsDirs?: string[]\n skillCatalog?: SkillCatalogEntry[]\n skillsComplete?: boolean\n /** 用户添加的技能文件夹(只引用,不复制)。 */\n skillFolders?: string[]\n templatePreStepCount?: number\n presetParams?: Record<string, unknown>\n hostDefaultModel?: HostDefaultModel\n moduleFacts?: PresetModuleFacts\n meta?: { meta: EngineMeta }\n overrides?: { overrides: Record<string, unknown> }\n variables?: { variables: Record<string, string>; enabled: boolean }\n promptConfigs?: { promptConfigs: PromptConfigDraft[] }\n /** 指令文件快照(独立来源):正文、身份、版本与读取状态来自同一次读取。 */\n instructions?: InstructionsSnapshot\n}\n\nexport type { BridgeSettingsView } from '../../shared/bridge-contract.ts'\n\nexport type BridgeResult<T> = ({ ok: true; value: T } & BridgeSuccessExtras) | BridgeErrorPayload\n\nexport const errorMessage = (error: unknown): string => error instanceof Error ? error.message : String(error)\n\nconst isBridgeResultPayload = (payload: unknown): payload is BridgeResult<unknown> => {\n if (payload === null || typeof payload !== 'object' || Array.isArray(payload)) return false\n const record = payload as Record<string, unknown>\n if (typeof record.ok !== 'boolean') return false\n return !record.ok || 'value' in record\n}\n\n/**\n * 宿主尚未就绪或路由未注册时,HTTP 层可能返回空体/非 JSON 响应;\n * 统一转成可诊断的桥接错误,不把原生 response.json() 异常透传给 UI。\n */\nasync function readBridgeResponse<T>(response: Response): Promise<BridgeResult<T>> {\n const text = await response.text()\n if (text.trim().length === 0) {\n return { ok: false, message: `桥接接口返回空响应(HTTP ${response.status})` }\n }\n let payload: unknown\n try {\n payload = JSON.parse(text) as unknown\n } catch {\n const preview = text.trim().replace(/\\s+/g, ' ').slice(0, 80)\n return { ok: false, message: `桥接接口返回非 JSON 响应(HTTP ${response.status}:${preview})` }\n }\n if (isBridgeResultPayload(payload)) return payload as BridgeResult<T>\n return { ok: false, message: `invalid settings bridge payload (HTTP ${response.status})` }\n}\n\nexport async function postBridge<T>(path: string, body: unknown): Promise<BridgeResult<T>> {\n try {\n const response = await fetch(SETTINGS_BRIDGE_PREFIX + path, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(body ?? {}),\n })\n return await readBridgeResponse<T>(response)\n } catch (error) {\n return { ok: false, message: errorMessage(error) }\n }\n}\n\n/** 原始文件流上传;用于避开 JSON/base64 的额外膨胀。 */\nexport async function uploadBridge<T>(path: string, file: Blob, fileName: string): Promise<BridgeResult<T>> {\n try {\n const response = await fetch(SETTINGS_BRIDGE_PREFIX + path, {\n method: 'POST',\n headers: {\n 'content-type': file.type || 'application/octet-stream',\n 'x-file-name': encodeURIComponent(fileName),\n },\n body: file,\n })\n return await readBridgeResponse<T>(response)\n } catch (error) {\n return { ok: false, message: errorMessage(error) }\n }\n}\n\n/** JSON 包装字段和少量路径元数据预留 4KiB,避免临界文件刚好超限。 */\nexport function shouldStreamJsonFile(file: Blob): boolean {\n return file.size >= MAX_BRIDGE_BODY_BYTES - 4 * 1024\n}\n","/** 由 shared bridge contract 驱动的类型化客户端。 */\nimport {\n BRIDGE_ENDPOINTS,\n type BridgeRequestMap,\n type BridgeValueMap,\n} from '../../shared/bridge-contract.ts'\nimport {\n postBridge,\n uploadBridge,\n type BridgeResult,\n} from './bridge-transport.ts'\n\nexport type BridgeKey = keyof typeof BRIDGE_ENDPOINTS\n\nexport function bridgeCall<K extends BridgeKey>(\n endpoint: K,\n // 契约里 body 可省略(`models: { refresh?: boolean } | undefined`)时,调用方无需显式传 undefined。\n ...args: undefined extends BridgeRequestMap[K] ? [body?: BridgeRequestMap[K]] : [body: BridgeRequestMap[K]]\n): Promise<BridgeResult<BridgeValueMap[K]>> {\n return postBridge<BridgeValueMap[K]>(BRIDGE_ENDPOINTS[endpoint], args[0])\n}\n\nexport function bridgeUpload(file: Blob, fileName: string): Promise<BridgeResult<BridgeValueMap['assetUpload']>> {\n return uploadBridge<BridgeValueMap['assetUpload']>(BRIDGE_ENDPOINTS.assetUpload, file, fileName)\n}\n\nexport { errorMessage, shouldStreamJsonFile } from './bridge-transport.ts'\nexport type { BridgeResult, BridgeSettingsView } from './bridge-transport.ts'\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","import { useEffect, useRef, type RefObject } from 'react'\n\n/** 已发布 Menu 的 portal 先隐藏后定位;等可见帧再补齐首项焦点。ref 仅指向调用方自己的 label。 */\nexport function useMenuFocus(open: boolean): RefObject<HTMLSpanElement> {\n const labelRef = useRef<HTMLSpanElement>(null)\n useEffect(() => {\n if (!open) return\n const frame = requestAnimationFrame(() => { labelRef.current?.closest('button')?.focus() })\n return () => cancelAnimationFrame(frame)\n }, [open])\n return labelRef\n}\n","import { useEffect, useRef, useState, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { IconChevronDownOutlineRegular, Menu, type MenuEntry } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { useMenuFocus } from './menu-focus.ts'\nimport styles from './controls.module.css'\n\nexport interface MenuSelectOption {\n value: string\n label: string\n disabled?: boolean\n /** 连续相同 group 的选项会在官方 Menu 中显示分组标题。 */\n group?: string\n}\n\n/** 官方 Menu 外观的紧凑单选控件。 */\nexport function MenuSelect(props: {\n value: string\n options: readonly MenuSelectOption[]\n onChange: (value: string) => void\n ariaLabel: string\n disabled?: boolean\n placeholder?: string\n className?: string\n align?: 'start' | 'end'\n compact?: boolean\n id?: string\n 'aria-invalid'?: boolean\n 'aria-describedby'?: string\n}): ReactNode {\n const [open, setOpen] = useState(false)\n const triggerRef = useRef<HTMLButtonElement>(null)\n const ownsFocus = useRef(false)\n const disabled = props.disabled === true\n const compact = props.compact === true\n const firstItemRef = useMenuFocus(open && !disabled)\n const firstEnabledIndex = props.options.findIndex((option) => !option.disabled)\n const selected = props.options.find((option) => option.value === props.value)\n let previousGroup: string | undefined\n const items: MenuEntry[] = props.options.flatMap((option, index) => {\n const entries: MenuEntry[] = []\n if (option.group !== undefined && option.group.length > 0 && option.group !== previousGroup) {\n entries.push({ type: 'label', id: `group-${index}`, text: option.group })\n }\n previousGroup = option.group\n entries.push({\n id: option.value,\n label: <span ref={index === firstEnabledIndex ? firstItemRef : undefined}>{option.label}</span>,\n ...(option.disabled !== undefined ? { disabled: option.disabled } : {}),\n })\n return entries\n })\n\n useEffect(() => {\n if (disabled) setOpen(false)\n }, [disabled])\n\n return (\n <span className={styles.menuSelectOwner} onKeyDown={(event) => {\n if (!open || (event.key !== 'Escape' && event.key !== 'Tab')) return\n event.stopPropagation()\n if (event.key === 'Escape') event.preventDefault()\n triggerRef.current?.focus()\n setOpen(false)\n }} onBlur={(event) => {\n const next = event.relatedTarget\n if (next instanceof Node && (event.currentTarget.contains(next) || firstItemRef.current?.closest('[role=\"menu\"]')?.contains(next))) return\n ownsFocus.current = false\n // 原生鼠标的focusout与focusin之间会执行微任务,须等焦点转移结束,避免卸载待点击选项。\n requestAnimationFrame(() => { if (!ownsFocus.current) setOpen(false) })\n }} onFocus={() => { ownsFocus.current = true }}>\n <Menu\n open={open && !disabled}\n compact={compact}\n portal\n autoFocus\n align={props.align ?? 'end'}\n className={clsx(styles.menuSelect, compact ? styles.menuSelectCompact : styles.menuSelectStandard, props.className)}\n items={items}\n selectedId={props.value}\n onClose={() => setOpen(false)}\n onSelect={(value) => {\n setOpen(false)\n triggerRef.current?.focus()\n if (triggerRef.current?.matches(':disabled')) return\n if (value !== props.value) props.onChange(value)\n }}\n anchor={(\n <button\n ref={triggerRef}\n id={props.id}\n type=\"button\"\n className={clsx(styles.menuSelectTrigger, compact ? styles.menuSelectTriggerCompact : styles.menuSelectTriggerStandard)}\n aria-label={props.ariaLabel}\n aria-haspopup=\"menu\"\n aria-expanded={open && !disabled}\n aria-invalid={props['aria-invalid']}\n aria-describedby={props['aria-describedby']}\n disabled={disabled}\n onClick={() => setOpen((value) => !value)}\n >\n <span className={styles.menuSelectLabel}>\n {selected?.label ?? (props.value.length > 0 ? props.value : props.placeholder ?? '(未选择)')}\n </span>\n <IconChevronDownOutlineRegular className={styles.menuSelectChevron} />\n </button>\n )}\n />\n </span>\n )\n}\n","/** 开关行:label + hint + 可选 extra + 官方 Switch。 */\nimport type { ReactNode } from 'react'\nimport { Switch } from '@deepseek-ai/dsh-client-ui-primitives'\nimport styles from './controls.module.css'\n\nexport function ToggleRow(props: { id: string; label: string; hint: string; checked: boolean; disabled?: boolean; extra?: ReactNode; onChange: (value: boolean) => void }): ReactNode {\n return (\n <div className={styles.toggleRow}>\n <span className={styles.settingCopy} id={props.id}><strong>{props.label}</strong><small>{props.hint}</small></span>\n {props.extra}\n <Switch checked={props.checked} disabled={props.disabled} label={props.label} onChange={props.onChange} />\n </div>\n )\n}\n","import { useCallback, useEffect, useState, useSyncExternalStore, type ReactNode } from 'react'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings-plugins/client'\nimport type { InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { bridgeCall } from '../../data/bridge-client.ts'\nimport { MenuSelect } from '../../ui/MenuSelect.tsx'\nimport { ToggleRow } from '../../ui/ToggleRow.tsx'\nimport type { PromptToolWorkbenchFace } from './workbench-face.ts'\nimport ui from '../../ui/controls.module.css'\n/** settings.plugins.tab:基础开关(settings 命名空间直读直写,官方 SettingsScope 通道)。 */\ntype TabProps = PropsRuntime<'settings.plugins.tab'> & InjectFace<PromptToolWorkbenchFace> & PropsLocale<'prompt-tool'>\n\nexport function SettingsTab(props: TabProps): ReactNode {\n const { t } = props\n const scope = props.settings.scope\n // useSyncExternalStore 需要稳定的函数引用;直接传方法引用会脱离 this 调用。\n const subscribe = useCallback((listener: () => void) => scope.subscribe(listener), [scope])\n const getSnapshot = useCallback(() => scope.getSnapshot(), [scope])\n const snapshot = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n const value = (snapshot.value ?? {}) as Record<string, unknown>\n const [presets, setPresets] = useState<Array<{ id: string; name: string }>>([])\n const [switchingPreset, setSwitchingPreset] = useState(false)\n const [presetNotice, setPresetNotice] = useState<{ kind: 'ok' | 'error'; message: string }>()\n useEffect(() => {\n void bridgeCall('meta')\n .then((res) => {\n if (!res.ok) return\n const meta = res.value.meta as { presets?: Array<{ id: string; name: string }> }\n if (meta.presets !== undefined) setPresets(meta.presets)\n })\n .catch(() => {})\n }, [])\n const set = (field: string, next: unknown): void => { void scope.set(field, next) }\n const switchPreset = async (id: string): Promise<void> => {\n if (switchingPreset || id === value.presetTemplate) return\n setSwitchingPreset(true)\n setPresetNotice(undefined)\n try {\n // 先持久化默认值:Host applyState 会物化目标预设并同步 agent-presets default;\n // settlement 后再重组当前空会话,避免目标生成物尚未就绪。\n await scope.set('presetTemplate', id)\n const result = await props.api.switchPreset(id)\n if (result.applied) {\n setPresetNotice({ kind: 'ok', message: t('settings.switched', { id }) })\n } else if (result.message !== undefined) {\n setPresetNotice({ kind: 'error', message: t('settings.switchDefaultOnly', { id, reason: result.message }) })\n } else {\n setPresetNotice({ kind: 'ok', message: t('settings.switchPending', { id }) })\n }\n } catch (error) {\n setPresetNotice({ kind: 'error', message: t('settings.switchFailed', { reason: error instanceof Error ? error.message : String(error) }) })\n } finally {\n setSwitchingPreset(false)\n }\n }\n\n return (\n <section className={ui.section} aria-label={t('settings.aria')}>\n <ToggleRow id=\"pt-writePreset\" label={t('settings.writePreset.label')} hint={t('settings.writePreset.hint')} checked={value.writePreset === true} onChange={(v) => set('writePreset', v)} />\n <div className={ui.rowGroup}>\n <div className={ui.settingRowStack}>\n <span className={ui.settingCopy}><strong>{t('settings.presetTemplate.title')}</strong><small>{t('settings.presetTemplate.hint')}</small></span>\n <MenuSelect className={ui.directoryInput} ariaLabel={t('settings.presetTemplate.title')}\n value={typeof value.presetTemplate === 'string' ? value.presetTemplate : ''}\n disabled={!snapshot.writable || switchingPreset}\n compact={false}\n options={presets.map((preset) => ({ value: preset.id, label: preset.name }))}\n onChange={(id) => { void switchPreset(id) }} />\n {presetNotice !== undefined && (\n <p className={presetNotice.kind === 'error' ? ui.noticeError : ui.notice} role=\"status\">\n {presetNotice.message}\n </p>\n )}\n </div>\n </div>\n </section>\n )\n}\n","import type { BridgeValueMap } from '../../shared/bridge-contract.ts'\nimport type { BridgeResult } from './bridge-transport.ts'\n\nexport type ConfirmSkillOverwrite = (names: string[]) => Promise<boolean>\ntype ImportResult = BridgeResult<BridgeValueMap['skillsImport']>\n\n/** 两个导入入口共用确认协议;新增冲突必须再次确认,不保存内容版本。 */\nexport async function requestSkillImport(\n submit: (overwrite?: string[]) => Promise<ImportResult>,\n confirm?: ConfirmSkillOverwrite,\n): Promise<ImportResult> {\n const approved = new Set<string>()\n let result = await submit()\n while (!result.ok && result.code === 'skills-overwrite-required' && result.conflicts?.length) {\n if (confirm === undefined) return result\n if (!await confirm(result.conflicts)) return { ok: false, code: 'skills-import-cancelled' }\n for (const name of result.conflicts) approved.add(name)\n result = await submit([...approved])\n }\n return result\n}\n","/**\n * 会话预设跟随:把工作台事实跟随官方会话级预设选择。\n *\n * 官方「新建会话」旁的预设选择器走 `agentPresets/select`,只改那一个空白会话并推进\n * 会话投影 `agentPreset`;宿主默认预设(`agent-presets.default`)不变。插件的\n * `presetTemplate` 镜像的是宿主默认,因此那条路径原本看不到官方侧的选择——本模块\n * 读会话投影,把工作台切到会话真正运行的预设(用户 2026-09-22 定案:自动跟随)。\n *\n * 跟随不重复切换会话:会话已经在该预设上,再 select 只会多记一条\n * `agent-preset/selected` 事件。决策集中在这里,store 只提供事实与动作,因此每条\n * 分支都能用纯 mock 做确定性回归:一致不动作、首次加载未完成不做决策、不在插件\n * 管理目录只提示一次、有未保存草稿保持不动、写盘期间防重入。\n */\n\n/** 一次跟随检查需要的事实与动作(由 store 注入,便于测试)。 */\nexport interface SessionPresetFollowSnapshot {\n /** 当前会话记录的预设(官方会话投影 agentPreset);未知为 undefined。 */\n sessionPreset: string | undefined\n /** 工作台当前预设。 */\n currentPreset: string\n /** 已成功应用快照的预设 id;与 currentPreset 不同表示数据尚未加载完成。 */\n loadedPreset: string | undefined\n /** 该预设是否可跟随(在插件管理目录中且可渲染)。 */\n followable(presetId: string): boolean\n /** 该预设上是否有未保存草稿:有则保持当前预设,静默不动。 */\n blocked(presetId: string): boolean\n /** 把工作台切到该预设(不重复切换会话)。 */\n apply(presetId: string): Promise<void>\n /** 无法跟随的提示;同一 id 只提示一次,避免每次投影通知都重复刷屏。 */\n warn(presetId: string): void\n}\n\nexport interface SessionPresetFollower {\n /** 检查一次并按需跟随;可重复调用(幂等)。 */\n check(snapshot: SessionPresetFollowSnapshot): Promise<void>\n}\n\n/** 创建跟随器:跨调用只保留「写盘进行中」与「已提示过的 id」两项状态。 */\nexport function createSessionPresetFollower(): SessionPresetFollower {\n let busy = false\n let warned: string | undefined\n return {\n async check(snapshot) {\n if (busy) return\n const target = snapshot.sessionPreset\n // 没有会话预设事实,或工作台已经在目标预设上:不动作。\n if (target === undefined || target === snapshot.currentPreset) return\n // 首次加载未完成(fields 还不是可写事实)或切换进行中:等下一次检查。\n if (snapshot.loadedPreset !== snapshot.currentPreset) return\n if (!snapshot.followable(target)) {\n if (warned !== target) {\n warned = target\n snapshot.warn(target)\n }\n return\n }\n warned = undefined\n // 有未保存草稿:保持当前预设,等用户处理(不弹错,草稿本身在界面上可见)。\n if (snapshot.blocked(snapshot.currentPreset)) return\n busy = true\n try {\n await snapshot.apply(target)\n } finally {\n busy = false\n }\n },\n }\n}\n","/**\n * 引擎行为参数契约(单一来源)。\n *\n * 这是「可配置引擎参数」的类型唯一权威:所有消费引擎参数的接口(RuntimeOptions /\n * WritePresetOptions)从这里派生,不再各自手写一遍字段\n * (此前多处重复声明导致同字段签名漂移,如 maxDepth / modelTemperature)。\n *\n * 分层约定:\n * - 本文件 = 引擎参数「契约层」(类型):参数桥/模板/UI 可配置的键与类型;\n * - ENGINE_PARAM_DEFINITIONS 统一键、校验、卡片、默认草稿与组合映射;\n * Record<keyof EngineParams, ...> 强制完整覆盖,ENGINE_PARAM_KEYS 与 PARAM_KEYS 从其派生;\n * - layerSettings ↔ 运行时平铺键:loadPresetSpec 展平 / savePresetParams 按层写入。\n *\n * 全部字段可选:缺省 = 模板 preset.yml layerSettings / 引擎默认,符合「一切皆可自定义」。\n */\nexport interface EngineParams {\n /** 首轮近距离锚定:首条真实用户消息后追加一次性首句锚点。 */\n firstTurnAnchor?: boolean\n /** 自定义锚点文本;firstTurnCustom=true 时固定使用。 */\n firstTurnText?: string\n /** 自定义锚点开关:true 固定使用 firstTurnText;false 按任务自动选择。 */\n firstTurnCustom?: boolean\n /** 自定义每轮引导文本;guideCustom=true 时固定使用。 */\n guideText?: string\n /** 自定义每轮引导开关:true 固定使用 guideText;false 按任务自动选择。 */\n guideCustom?: boolean\n /** 每轮引导独立开关;缺省关闭。 */\n guideEnabled?: boolean\n /** 锚定确认后注入 preset.md;关闭时仍保留工具引导,但不生成 prompt-injector 提示词配置内容。 */\n injectPrompt?: boolean\n /** 模型路由 provider;与模型名同时非空时给 subagent/subagent_fork 行加 agentOptions(主对话直派子代理与委派子代理通用)。 */\n modelProvider?: string\n /** 模型名;与 provider 同时非空时生效。 */\n modelName?: string\n /** 子代理固定模型路由 provider(agentOptions 注入 tool-subagent)。 */\n subagentModelProvider?: string\n /** 子代理固定模型名。 */\n subagentModelName?: string\n /** 主对话思维程度(agent-request patch reasoningEffort;''=不设置,官方档位 off/low/high/max)。 */\n modelReasoningEffort?: string\n /** 主对话采样温度(agent-request patch temperature;''=不设置)。 */\n modelTemperature?: string\n /** 主对话输出上限(agent-request patch maxTokens;''=不设置)。 */\n modelMaxTokens?: string\n /** 子代理思维程度(agent-request patch,audience=subagent;''=不设置)。 */\n subagentReasoningEffort?: string\n /** 子代理采样温度(agent-request patch,audience=subagent;''=不设置)。 */\n subagentTemperature?: string\n /** 子代理输出上限(agent-request patch,audience=subagent;''=不设置)。 */\n subagentMaxTokens?: string\n /** 委派递归深度上限(0 禁止委派 / provider-managed / 正整数;数字字符串同义)。 */\n maxDepth?: number | 'provider-managed' | string\n /** custom-fallback 锚定词(prompt-injector params.firstTurnWord)。 */\n firstTurnWord?: string\n /**\n * 锚定/引导内容键:writePreset 把它们映射进 near-anchor / router-guide 的\n * promptConfig params(由对应策略消费)。此前只在 PARAM_KEYS 旁路白名单里,\n * 保存链接受键名却被值校验拒绝,形成「白名单通过、写盘前报未知键」的断层。\n */\n /** 构建任务正则(锚定三档分类的 build 档;编译规则与 engine/classify-task.mjs 同源,flags=i)。 */\n buildPattern?: string\n /** 复杂任务正则(锚定 complex 档与引导深度判定共用)。 */\n complexPattern?: string\n /** 构建档锚句。 */\n firstTurnBuild?: string\n /** 排查档锚句。 */\n firstTurnInspect?: string\n /** 深度档锚句。 */\n firstTurnDeep?: string\n /** 引导-简短档正文。 */\n guideWeak?: string\n /** 引导-深度档正文。 */\n guideDeep?: string\n /** 晋升后 agent-instructions 全文 → 一次性 hint。 */\n instructionHint?: boolean\n /** str-replace-editor 最大输出字符数(参数桥默认官方值 16000;由引擎能力卡编辑)。 */\n strReplaceEditorMaxOutputChars?: number\n /** tool-git-bash 行的能力开关(B2 T3 补;此前该行只能靠「在不在组合里」决定启停)。 */\n toolGitBashEnabled?: boolean\n /** 自定义模型工具在执行前需用户批准的执行器种类。 */\n customToolRequireApproval?: string[] | string\n}\n\nexport type EngineParamKey = keyof EngineParams\n\n/** 双向相等断言工具:两字符串集合完全一致 → true,否则 false。 */\ntype AssertKeysEqual<A extends string, B extends string> =\n Exclude<A, B> extends never\n ? Exclude<B, A> extends never ? true : false\n : false\n\n/**\n * writePreset.runtimeOf 实际透传进运行时 params 的引擎参数子集。\n * RuntimeOptions(装配态)与 WritePresetOptions(写入态)都从这里派生,\n * 防止「加参数只改一处、writePreset 忘透传」的静默漂移(如 stageAdvanceDescription 历史事故)。\n */\nexport type PresetWriterParams = Partial<EngineParams>\n\n/**\n * 数值型引擎参数保存前校验(与 write-preset.modelRequestConfigs 消费规则同源)。\n * 保存层响亮失败(400 逐字段错误),渲染层保持宽容(never-brick):\n * - 布尔键:必须是 boolean;\n * - 数值键(temperature / maxTokens / 字符数):'' = 合法(删键回落默认);\n * 非空必须可解析为数字并满足各自约束(有限数 / 正整数);\n * - 字符串键:必须是 string('' = 删键回落默认);\n * - 列表键(执行器种类等):必须是 string 或 string[];\n * - maxDepth:'' / 'provider-managed' / 非负安全整数及其数字字符串。\n * 未知键(旧内容别名等不兼容键)在保存期响亮失败,不做运行时自动兼容。\n * 注意:内容占位变量(variables)的空字符串是合理设计(世界书动态引用),\n * 本函数只校验引擎行为参数,绝不碰 variables 通道。\n */\nexport interface EngineParamValueError {\n key: string\n message: string\n}\n\ntype ParamRule =\n | { kind: 'boolean' }\n | { kind: 'number'; check: (value: number) => string | undefined }\n | { kind: 'string'; options?: readonly string[] }\n /** 正则字符串:编译规则与 engine/classify-task.mjs 的 new RegExp(pattern, 'i') 同源。 */\n | { kind: 'pattern' }\n | { kind: 'string-list'; options?: readonly string[] }\n | { kind: 'max-depth' }\n\nconst FINITE_NUMBER: (value: number) => string | undefined = (value) =>\n Number.isFinite(value) ? undefined : '必须是有限数字'\nconst POSITIVE_INTEGER: (value: number) => string | undefined = (value) =>\n Number.isSafeInteger(value) && value > 0 ? undefined : '必须是正整数'\n\nexport type EngineParamDefinition = ParamRule & {\n card: string\n /**\n * 显示标签不进 shared:UI 侧按 `param.<键>` 查 prompt-tool 字典(见\n * src/client/locales-params.ts)。shared 不 import client 字典,也不持有任何文案。\n */\n /** 未配置时的编辑草稿;不等于强制写入运行时默认值。 */\n defaultValue: string | number | boolean | undefined\n module?: { row: string; key?: string; mode?: 'editor-default' }\n}\n\n/** 类型、校验、卡片归属、草稿默认值和组合行映射的唯一运行时目录。 */\nexport const ENGINE_PARAM_DEFINITIONS: Record<EngineParamKey, EngineParamDefinition> = {\n firstTurnAnchor: { kind: 'boolean', defaultValue: false, card: 'prompt-defaults' },\n firstTurnText: { kind: 'string', defaultValue: '', card: 'prompt-defaults' },\n firstTurnCustom: { kind: 'boolean', defaultValue: false, card: 'prompt-defaults' },\n guideText: { kind: 'string', defaultValue: '', card: 'prompt-defaults' },\n guideCustom: { kind: 'boolean', defaultValue: false, card: 'prompt-defaults' },\n guideEnabled: { kind: 'boolean', defaultValue: false, card: 'prompt-defaults' },\n injectPrompt: { kind: 'boolean', defaultValue: true, card: 'prompt-defaults' },\n modelProvider: { kind: 'string', defaultValue: '', card: 'main-model' },\n modelName: { kind: 'string', defaultValue: '', card: 'main-model' },\n subagentModelProvider: { kind: 'string', defaultValue: '', card: 'subagent-model' },\n subagentModelName: { kind: 'string', defaultValue: '', card: 'subagent-model' },\n modelReasoningEffort: { kind: 'string', defaultValue: '', card: 'main-model' },\n modelTemperature: { kind: 'number', check: FINITE_NUMBER, defaultValue: '', card: 'main-model' },\n modelMaxTokens: { kind: 'number', check: POSITIVE_INTEGER, defaultValue: '', card: 'main-model' },\n subagentReasoningEffort: { kind: 'string', defaultValue: '', card: 'subagent-model' },\n subagentTemperature: { kind: 'number', check: FINITE_NUMBER, defaultValue: '', card: 'subagent-model' },\n subagentMaxTokens: { kind: 'number', check: POSITIVE_INTEGER, defaultValue: '', card: 'subagent-model' },\n maxDepth: { kind: 'max-depth', defaultValue: '', card: 'subagent-tools' },\n firstTurnWord: { kind: 'string', defaultValue: '', card: 'prompt-defaults' },\n buildPattern: { kind: 'pattern', defaultValue: '', card: 'prompt-defaults' },\n complexPattern: { kind: 'pattern', defaultValue: '', card: 'prompt-defaults' },\n firstTurnBuild: { kind: 'string', defaultValue: '', card: 'prompt-defaults' },\n firstTurnInspect: { kind: 'string', defaultValue: '', card: 'prompt-defaults' },\n firstTurnDeep: { kind: 'string', defaultValue: '', card: 'prompt-defaults' },\n guideWeak: { kind: 'string', defaultValue: '', card: 'prompt-defaults' },\n guideDeep: { kind: 'string', defaultValue: '', card: 'prompt-defaults' },\n // B7 T3:card 随 `context-gate` 卡删除一并改到 prompt-defaults。`module.row` 早已绑定到\n // `instruction-hint`(B7 T1),所以这条只改展示归属,不改它写进哪一行配置。\n instructionHint: { kind: 'boolean', defaultValue: false, card: 'prompt-defaults', module: { row: 'instruction-hint', key: 'enabled' } },\n strReplaceEditorMaxOutputChars: { kind: 'number', check: POSITIVE_INTEGER, defaultValue: 16000, card: 'str-replace-editor', module: { row: 'str-replace-editor', key: 'maxOutputChars', mode: 'editor-default' } },\n toolGitBashEnabled: { kind: 'boolean', defaultValue: true, card: 'tool-git-bash', module: { row: 'tool-git-bash', key: 'enabled' } },\n customToolRequireApproval: { kind: 'string-list', options: ['shell', 'http', 'delegate', 'fs', 'ask-user'], defaultValue: '', card: 'tool-config-engine', module: { row: 'tool-config-engine', key: 'requireApproval' } },\n}\n\nexport const ENGINE_PARAM_KEYS = Object.keys(ENGINE_PARAM_DEFINITIONS) as EngineParamKey[]\n\n/** writePreset.runtimeOf 实际透传键:全部引擎参数可直接进入 writer。 */\nexport const WRITER_PARAM_KEYS = ENGINE_PARAM_KEYS\n\n/** 编译期断言:WRITER_PARAM_KEYS 与 PresetWriterParams 键必须一致。 */\nconst _assertWriterParamsKeys: AssertKeysEqual<typeof WRITER_PARAM_KEYS[number], keyof PresetWriterParams> = true\n\n/** 已有逗号分隔/flow-array 语义,client 与生成器共享。 */\nexport function engineParamList(value: unknown): string[] {\n if (Array.isArray(value)) return value.map(String).filter((item) => item.length > 0)\n if (typeof value !== 'string') return []\n const text = value.trim()\n const inner = text.startsWith('[') && text.endsWith(']') ? text.slice(1, -1) : text\n return inner.split(',').map((item) => item.trim()).filter(Boolean)\n}\n\n/** 仅生成声明字段的行配置;复杂的子代理授权仍由 host 所有者处理。 */\nexport function buildEngineModuleParams(params: Record<string, unknown>): Record<string, Record<string, unknown>> {\n const result: Record<string, Record<string, unknown>> = {}\n for (const key of ENGINE_PARAM_KEYS) {\n const definition = ENGINE_PARAM_DEFINITIONS[key]\n const binding = definition.module\n if (binding === undefined) continue\n let value = params[key]\n // editor-default:只投影调用方真正提供的合法值。缺参不补目录默认值——参数桥\n // 优先级高于 moduleConfigs 与行默认,补值会把「未配置」写成显式覆盖,压掉\n // 模板/导入预设的行级 maxOutputChars;非法值同样不写,交给行默认兜底。\n if (binding.mode === 'editor-default') {\n if (typeof value === 'string' && value.trim().length > 0) value = Number(value)\n if (typeof value !== 'number' || !Number.isSafeInteger(value) || value <= 0) continue\n }\n if (value === undefined || value === null) continue\n if (definition.kind === 'boolean') value = value === true\n else if (definition.kind === 'string-list') value = engineParamList(value)\n else if (definition.kind === 'string' && (typeof value !== 'string' || value.length === 0)) continue\n else if (definition.kind === 'number') {\n if (typeof value === 'string' && value.trim().length > 0) value = Number(value)\n if (typeof value !== 'number' || definition.check(value) !== undefined) continue\n }\n const config = result[binding.row] ??= {}\n config[binding.key ?? key] = value\n }\n return result\n}\n\n/** 仅投影已登记字段,绝不把任意行配置/路径/凭据泄露给浏览器。 */\nexport function moduleParamFallbacks(configs: Record<string, Record<string, unknown>>): Record<string, unknown> {\n const result: Record<string, unknown> = {}\n for (const key of ENGINE_PARAM_KEYS) {\n const binding = ENGINE_PARAM_DEFINITIONS[key].module\n if (binding === undefined) continue\n const value = configs[binding.row]?.[binding.key ?? key]\n if (value !== undefined) result[key] = value\n }\n return result\n}\n\n/** 保存校验与参数桥共用深度解析;无效值在渲染时不覆盖行默认。 */\nexport function normalizeMaxDepth(value: unknown): number | 'provider-managed' | undefined {\n if (value === 'provider-managed') return value\n const depth = typeof value === 'string' && value.trim().length > 0 ? Number(value) : value\n return typeof depth === 'number' && Number.isSafeInteger(depth) && depth >= 0 ? depth : undefined\n}\n\n/** 校验单个键值;返回错误消息(undefined = 通过)。 */\nfunction validateParamValue(key: string, rule: ParamRule, value: unknown): string | undefined {\n if (value === '') return undefined\n switch (rule.kind) {\n case 'boolean':\n return typeof value === 'boolean' ? undefined : `${key}: 必须是布尔值`\n case 'number': {\n // '' 是合法删键值(留空 = 不设置)。\n if (value === '') return undefined\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) return `${key}: 必须是有限数字(留空 = 不设置)`\n const reason = rule.check(value)\n return reason === undefined ? undefined : `${key}: ${reason}(留空 = 不设置)`\n }\n if (typeof value === 'string') {\n const text = value.trim()\n if (text.length === 0) return `${key}: 必须是数字(留空 = 不设置)`\n const numeric = Number(text)\n if (Number.isNaN(numeric)) return `${key}: 必须是数字(留空 = 不设置)`\n const reason = rule.check(numeric)\n return reason === undefined ? undefined : `${key}: ${reason}(留空 = 不设置)`\n }\n return `${key}: 必须是数字或数字字符串(留空 = 不设置)`\n }\n case 'string':\n if (typeof value !== 'string') return `${key}: 必须是字符串`\n return value === '' || rule.options === undefined || rule.options.includes(value)\n ? undefined : `${key}: 必须为 ${rule.options.join('/')} 或留空`\n case 'pattern': {\n if (typeof value !== 'string') return `${key}: 必须是字符串`\n try {\n // 与引擎消费同源:classify-task 按 flags=i 编译;非法正则会让锚定/引导静默失效,\n // 因此这里在写盘前响亮拒绝,而不是先存下再让策略什么都不做。\n new RegExp(value, 'i')\n } catch (error) {\n return `${key}: 不是合法正则(${error instanceof Error ? error.message : String(error)};留空 = 不设置)`\n }\n return undefined\n }\n case 'string-list':\n if (typeof value === 'string' || (Array.isArray(value) && value.every((item) => typeof item === 'string'))) {\n return rule.options !== undefined && engineParamList(value).some((item) => !rule.options!.includes(item))\n ? `${key}: 只允许 ${rule.options.join('/')}` : undefined\n }\n return `${key}: 必须是字符串或字符串数组`\n case 'max-depth':\n return normalizeMaxDepth(value) !== undefined\n ? undefined : `${key}: 必须是非负安全整数、数字字符串、provider-managed 或留空`\n }\n}\n\n/**\n * 校验参数键值(键集合合法性由调用方白名单先行校验,本函数同样拒绝未知键)。\n * 返回逐字段错误;空数组 = 通过。类型收窄:布尔/字符串/数值/列表各按 canonical\n * 规则校验;'' 是合法删键值,其余非法类型与越界值在保存层响亮失败。\n */\nexport function validateEngineParamValues(overrides: Record<string, unknown>): EngineParamValueError[] {\n const errors: EngineParamValueError[] = []\n for (const [key, value] of Object.entries(overrides)) {\n // undefined/null 由保存层跳过。\n if (value === undefined || value === null) continue\n const rule = Object.hasOwn(ENGINE_PARAM_DEFINITIONS, key) ? ENGINE_PARAM_DEFINITIONS[key as EngineParamKey] : undefined\n if (rule === undefined) {\n errors.push({ key, message: `${key}: 未知参数键,请按当前参数定义更新预设` })\n continue\n }\n const message = validateParamValue(key, rule, value)\n if (message !== undefined) errors.push({ key, message })\n }\n return errors\n}\n","/** 引擎能力目录:把 UI capability id 与 preset module/row 实际事实解耦。 */\nimport { ENGINE_PARAM_DEFINITIONS, ENGINE_PARAM_KEYS, type EngineParamKey } from './engine-params.ts'\n\n/** 该编辑组 / 能力 card 拥有的扁平参数键:分组渲染与技术键搜索共用这一份派生。 */\nexport function engineGroupParamKeys(id: string): readonly EngineParamKey[] {\n return ENGINE_PARAM_KEYS.filter((key) => ENGINE_PARAM_DEFINITIONS[key].card === id)\n}\n\nexport type ModuleSourceMode = 'explicit' | 'composition' | 'official' | 'unknown'\n\n/** 官方九个注入层:与 engine/schema.mjs 的 LAYER_ORDER 同源,改一处必须同步另一处。 */\nexport type EngineLayer =\n | 'pre-step'\n | 'system-section'\n | 'runtime-context'\n | 'agent-request'\n | 'llm-stream'\n | 'tool-pipeline'\n | 'turn-stop'\n | 'subagent-start'\n | 'subagent-end'\n\n/**\n * 九层顺序的共享副本:宿主是旧版本(不下发 meta.layerOrder)时前端退化用它,\n * 而不是各自再写一份层序清单。\n */\nexport const ENGINE_LAYER_ORDER: readonly EngineLayer[] = [\n 'pre-step',\n 'system-section',\n 'runtime-context',\n 'agent-request',\n 'llm-stream',\n 'tool-pipeline',\n 'turn-stop',\n 'subagent-start',\n 'subagent-end',\n]\n\nexport interface PresetModuleFacts {\n declaredModules: string[] | null\n effectiveModules: string[] | null\n rowIds: string[]\n sourceMode: ModuleSourceMode\n editable: boolean\n effectiveConfigs?: Record<string, Record<string, unknown>>\n}\n\nexport interface EngineCapability {\n id: string\n moduleKeys: readonly string[]\n rowIds: readonly string[]\n displayLayer: EngineLayer\n /** 真实跨层影响的相关层(只在确有第二通道时登记,避免把归属铺满九层)。 */\n relatedLayers?: readonly EngineLayer[]\n /**\n * 该能力拥有的 preset 顶层数据段(不是行级 config)。\n * 创建时若段缺失则写入 `skeleton`(保证\"模块在 ⇒ 数据在\");删除时一并移除该段。\n */\n ownSection?: {\n /** preset.yml 顶层键名。 */\n key: string\n /** 启用时写入的可用骨架(必须能通过该段的校验)。 */\n skeleton: Readonly<Record<string, unknown>>\n }\n}\n\n/** 子代理工具策略的启用骨架:常用工具全放行 + 扩权受限(用户决策,可在卡片内继续收窄)。 */\nexport const SUBAGENT_TOOL_POLICY_SKELETON: Readonly<Record<string, unknown>> = {\n defaultProfile: 'default',\n ceiling: { allow: ['read', 'write', 'edit', 'glob', 'grep', 'bash'], deny: [] },\n profiles: [\n {\n id: 'default',\n name: '默认',\n allow: ['read', 'write', 'edit', 'glob', 'grep', 'bash'],\n deny: [],\n modelSelectable: true,\n },\n ],\n // 扩权必须严格 ⊆ ceiling.allow(校验会拒绝超限);requireApproval 要求宿主有批准通道(无通道则 fail closed)。\n modelExpansion: {\n enabled: true,\n allow: ['write', 'edit', 'glob', 'grep'],\n maxAdditionalTools: 2,\n requireApproval: true,\n },\n}\n\n/** 首期只登记已有 typed editor 的能力,避免万能 key/value 表单。 */\nexport const ENGINE_CAPABILITIES: readonly EngineCapability[] = [\n // B7 T3:tool-bootstrap / context-gate / anchor-turn / promoted-code-mode / tool-filter /\n // deliberation-gate / progress-reminder 七张专用能力卡随对应引擎模块退场,不再登记。\n // 子代理工具面:模块 + 顶层策略段(段是结构化数据,物化为 subagent-tools/policy.yml)。\n {\n id: 'subagent-tool-policy',\n moduleKeys: ['subagent-tool-policy'],\n rowIds: ['subagent-tool-policy'],\n displayLayer: 'tool-pipeline',\n ownSection: { key: 'subagentToolPolicy', skeleton: SUBAGENT_TOOL_POLICY_SKELETON },\n },\n // filesystem-editor 同时提供 fs-local 与 str-replace-editor,二者必须同域。\n { id: 'str-replace-editor', moduleKeys: ['filesystem-editor'], rowIds: ['str-replace-editor'], displayLayer: 'tool-pipeline' },\n { id: 'tool-config-engine', moduleKeys: ['tool-config-engine'], rowIds: ['tool-config-engine'], displayLayer: 'tool-pipeline' },\n // B2 T3:tool-git-bash 此前没有能力卡(开关只能靠「行在不在组合里」),补 `enabled` 键后登记卡片,\n // 否则 impliedModulesForParams 查不到 card,「参数在 ⇒ 装配在」对该行静默失效。\n { id: 'tool-git-bash', moduleKeys: ['tool-git-bash'], rowIds: ['tool-git-bash'], displayLayer: 'tool-pipeline' },\n] as const\n\n/**\n * 编辑组 = 前端一张可编辑卡(能力卡或专用卡)的主归属层。\n * id 必须是代码里真实存在的 card / 展开键名,不新增臆造 id。\n */\nexport interface EngineEditorGroup {\n id: string\n displayLayer: EngineLayer\n /** 真实跨层影响的相关层(只有确有第二通道时才写)。 */\n relatedLayers?: readonly EngineLayer[]\n /** 真实生效通道的只读说明键(如 'agent-request' / 'system-section'):供 UI 显示「实际生效通道」,\n * 只写代码里可核对的事实,不承诺未验证的通道。 */\n hook: string\n}\n\n/**\n * 非能力编辑组的主归属。能力组不在这里重复登记:它们的 displayLayer 由能力定义本身承载\n * (例如「编辑器输出上限」参数的 card 就是能力 id `str-replace-editor`,已随能力登记)。\n */\nexport const ENGINE_EDITOR_GROUPS: readonly EngineEditorGroup[] = [\n // 提示词默认值(injectPrompt / firstTurnAnchor / guideText)改写 pre-step 消息批。\n { id: 'prompt-defaults', displayLayer: 'pre-step', hook: 'pre-step' },\n // 人设注册 system-section 段;includeRuntimeContext 同时抑制 runtime-context 快照,属真实跨层。\n { id: 'persona', displayLayer: 'system-section', relatedLayers: ['runtime-context'], hook: 'system-section' },\n // 预设顶层 variables 是插值源,由 runtime-context 的 placeholder 消费。\n { id: 'variables', displayLayer: 'runtime-context', hook: 'runtime-context' },\n // 主模型 provider/model 与采样参数经当前预设生成的 agent-request patch 生效。\n { id: 'main-model', displayLayer: 'agent-request', hook: 'agent-request' },\n // 子代理模型路由随子代理启动注入 tool-subagent 行 agentOptions;同卡采样三参数写\n // agent-request 的 subagent-model-params patch,因此关联 agent-request。\n { id: 'subagent-model', displayLayer: 'subagent-start', relatedLayers: ['agent-request'], hook: 'subagent-start' },\n // 委派递归深度(maxDepth)经 tool-subagent / tool-subagent-fork 行 config 下发,\n // 启用实例策略时改由 subagent-tool-policy 承载:两条通道都在子代理启动处生效。\n { id: 'subagent-tools', displayLayer: 'subagent-start', hook: 'subagent-start' },\n // 自定义工具定义进 tools/* 管线。\n { id: 'custom-tools', displayLayer: 'tool-pipeline', hook: 'tool-pipeline' },\n] as const\n\n/**\n * 编辑组主归属总表:能力组(id = 能力 id,通道即能力声明的 displayLayer)在前,专用编辑组在后。\n * host 的 /meta 下发与前端九层组织共用这一份派生,参数不再各自复制归属。\n */\nexport const ENGINE_EDITOR_GROUP_MAP: readonly EngineEditorGroup[] = [\n ...ENGINE_CAPABILITIES.map(({ id, displayLayer, relatedLayers }) => ({ id, displayLayer, relatedLayers, hook: displayLayer })),\n ...ENGINE_EDITOR_GROUPS,\n]\n\n/**\n * 该编辑组在给定层筛选下是否可见:`all` / `world-book` 视图恒可见(保持既有平铺位置),\n * 否则主归属或 `relatedLayers` 命中该层才显示。未登记的 id 不猜归属,一律可见——\n * 这样新增卡片忘登记时是「哪层都能看到」,而不是「哪层都看不到」。\n */\nexport function isEditorGroupVisible(id: string, viewFilter: string): boolean {\n if (viewFilter === 'all' || viewFilter === 'world-book') return true\n const group = ENGINE_EDITOR_GROUP_MAP.find((item) => item.id === id)\n if (group === undefined) return true\n return group.displayLayer === viewFilter || (group.relatedLayers ?? []).includes(viewFilter as EngineLayer)\n}\n\nexport interface EngineRecipe {\n id: string\n capabilities: readonly string[]\n initialParams?: Readonly<Record<string, unknown>>\n}\n\n/**\n * 只保留已有真实工作流的一键组合;recipe 本身不写入 preset.yml。\n *\n * B7 T3 清空:三条 recipe 的成员都是随本轮退场的专用能力(phase-control /\n * phase-control-ptc / deliberation),没有任何一条还能组成合法能力集合。\n * export 与 `engineRecipe()` 保留——调用点(创建菜单、bridge 校验)不必跟着改,\n * 空表天然让组合项整个消失。\n */\nexport const ENGINE_RECIPES: readonly EngineRecipe[] = []\n\nexport function engineCapability(id: string): EngineCapability | undefined {\n return ENGINE_CAPABILITIES.find((capability) => capability.id === id)\n}\n\nexport function engineRecipe(id: string): EngineRecipe | undefined {\n return ENGINE_RECIPES.find((recipe) => recipe.id === id)\n}\n\n/**\n * 预设里显式写了的引擎参数 / 行配置所隐含的模块:**参数在 ⇒ 装配在**。\n *\n * 只认显式声明(`params` 的登记参数键与 `moduleConfigs` 的行键),组合源自带的默认值不算——\n * 否则任何预设都会把全部能力装回来。返回能力拥有的模块 id(去重,顺序稳定)。\n * 装配入口、模块事实与\"移除能力\"三处共用这一份派生,避免各自判断漂移。\n */\nexport function impliedModulesForParams(\n params: Readonly<Record<string, unknown>> | undefined | null,\n moduleConfigs: Readonly<Record<string, unknown>> | undefined | null,\n): string[] {\n const implied = new Set<string>()\n const add = (capability: EngineCapability | undefined): void => {\n if (capability === undefined) return\n for (const module of capability.moduleKeys) implied.add(module)\n }\n const addRow = (rowId: string): void => {\n const capability = ENGINE_CAPABILITIES.find((item) => item.rowIds.includes(rowId) || item.moduleKeys.includes(rowId))\n if (capability !== undefined) add(capability)\n else if (ENGINE_PARAM_KEYS.some((key) => ENGINE_PARAM_DEFINITIONS[key].module?.row === rowId)) implied.add(rowId)\n }\n if (params !== undefined && params !== null) {\n for (const key of ENGINE_PARAM_KEYS) {\n if (!Object.prototype.hasOwnProperty.call(params, key)) continue\n const definition = ENGINE_PARAM_DEFINITIONS[key]\n if (definition.module !== undefined) addRow(definition.module.row)\n else add(engineCapability(definition.card))\n }\n }\n if (moduleConfigs !== undefined && moduleConfigs !== null) {\n for (const rowId of Object.keys(moduleConfigs)) {\n addRow(rowId)\n }\n }\n return [...implied]\n}\n\n/** 显式模块预设中的实际能力;包含当前参数与顶层策略所需的装配。\n * 创建补声明由 host 单独检查 declaredModules;官方组合行不伪装成可编辑能力。 */\nexport function isEngineCapabilityPresent(id: string, facts: PresetModuleFacts | undefined): boolean {\n if (facts === undefined || facts.sourceMode !== 'explicit') return false\n const capability = engineCapability(id)\n if (capability === undefined) return false\n const modules = facts.effectiveModules ?? facts.declaredModules\n if (modules === null) return false\n return capability.moduleKeys.some((key) => modules.includes(key))\n}\n\nexport interface CustomToolIdentity {\n index: number\n id: string\n name: string\n}\n\n/** custom tool 的运行时名称缺省回落 id;保存前拒绝会导致同层注册失败的重复项。 */\nexport function validateCustomToolIdentities(tools: readonly unknown[]): string[] {\n const errors: string[] = []\n const ids = new Map<string, number>()\n const names = new Map<string, number>()\n for (const [index, value] of tools.entries()) {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n errors.push(`customTools[${index}] 必须是对象`)\n continue\n }\n const record = value as Record<string, unknown>\n const id = typeof record.id === 'string' ? record.id.trim() : ''\n if (id.length === 0) {\n errors.push(`customTools[${index}].id 必须是非空字符串`)\n continue\n }\n const name = typeof record.name === 'string' && record.name.trim().length > 0 ? record.name.trim() : id\n const previousId = ids.get(id)\n if (previousId !== undefined) errors.push(`customTools[${index}].id 与 customTools[${previousId}] 重复:${id}`)\n else ids.set(id, index)\n const previousName = names.get(name)\n if (previousName !== undefined) errors.push(`customTools[${index}].name 与 customTools[${previousName}] 重复:${name}`)\n else names.set(name, index)\n }\n return errors\n}\n","/** 包内模板、用户副本与当前预设共用同名 ID;避免与宿主官方预设重名。 */\nexport const DEFAULT_PRESET_ID = 'pt-standard'\n","/** 提示词工具客户端状态模型与稳定默认值(无网络、无 React)。 */\nimport { ENGINE_PARAM_DEFINITIONS, ENGINE_PARAM_KEYS, type EngineParamKey, type EngineParams } from '../../shared/engine-params.ts'\nimport { ENGINE_LAYER_ORDER } from '../../shared/engine-capabilities.ts'\nimport { DEFAULT_PRESET_ID } from '../../shared/preset-ids.ts'\nimport type { SkillCatalogEntry } from '../../shared/skills.ts'\nimport type { EngineMeta, PromptConfigDraft } from '../prompt-tool-types.ts'\n\n/** 宿主默认模型回显(agent-default-model settings:provider/model/reasoningEffort;插件参数未设置 = 继承宿主)。 */\nexport interface HostDefaultModel {\n provider?: string\n model?: string\n reasoningEffort?: string\n}\n\n/** 技能目录条目:与服务端共用同一契约(来源、优先级、两端调用策略、同名遮蔽)。 */\nexport type { SkillCatalogEntry } from '../../shared/skills.ts'\n\n/** 参数草稿类型从宿主契约派生,只转换 UI 的列表/深度形态。 */\ntype EngineParamDrafts = {\n [K in EngineParamKey]-?: K extends 'maxDepth' ? string\n : NonNullable<EngineParams[K]> extends string | string[] ? string : NonNullable<EngineParams[K]>\n}\n\nexport interface Fields extends EngineParamDrafts {\n promptText: string\n promptPath: string\n agentsText: string\n agentsPath: string\n /** 技能清单:官方六类技能根扫描结果(两端调用策略直接来自各技能文件的 frontmatter)。 */\n skillCatalog: SkillCatalogEntry[]\n /** 当前会话的注册表观测是否完整;false 不能解释成技能不存在。 */\n skillsComplete: boolean\n /** 用户添加的技能文件夹(只引用,不复制)。 */\n skillFolders: string[]\n /** 用户技能根(创建、复制导入与回收站的落点)。 */\n skillsRoot: string\n presetOrder: number\n fallbackText: string\n writePreset: boolean\n presetTemplate: string\n promptConfigs: PromptConfigDraft[]\n}\n\n/**\n * /meta 的**列表类事实键**(对应 getEngineMeta() 下发的列表):EMPTY_META 按本表派生空表,\n * 新增列表键只改这一处。产品代码不 import engine/*.mjs(零引擎运行时依赖),故键名清单留在此处;\n * 漏掉必备键会在下面 EMPTY_META 的 `: EngineMeta` 赋值处直接编译报错(缺键会被列出)。\n * 对象型契约在 EMPTY_META 中单独初始化。\n */\nconst META_LIST_KEYS = [\n 'layers', 'strategies', 'slotKinds', 'positions', 'dedupes', 'promotions',\n 'audienceModes', 'modelScopes', 'roles', 'mergeModes', 'fills', 'subjects',\n] as const satisfies readonly MetaListKey[]\n\n/** EngineMeta 里字符串列表型的键。 */\ntype MetaListKey = { [K in keyof EngineMeta]-?: NonNullable<EngineMeta[K]> extends string[] ? K : never }[keyof EngineMeta]\n\n/**\n * 按键名清单派生空表(`Record<K, string[]>` 而非索引签名):返回类型保留显式键,\n * 因此下面 `: EngineMeta` 的赋值仍会在漏掉必备列表键时编译报错。\n */\nconst emptyLists = <K extends MetaListKey>(keys: readonly K[]): Record<K, string[]> =>\n Object.fromEntries(keys.map((key): [K, string[]] => [key, []])) as Record<K, string[]>\n\nexport const EMPTY_META: EngineMeta = {\n // bootstrap 返回前的加载快照;收到响应后整体替换。\n layerOrder: ENGINE_LAYER_ORDER,\n ...emptyLists(META_LIST_KEYS),\n editorGroups: [],\n layerDefaultSubjects: {},\n layerContracts: {} as EngineMeta['layerContracts'],\n layerFieldPolicies: {},\n layerLabels: {},\n}\nexport const EMPTY_FIELDS: Fields = {\n ...Object.fromEntries(ENGINE_PARAM_KEYS.map((key) => [key, ENGINE_PARAM_DEFINITIONS[key].defaultValue])) as Pick<Fields, EngineParamKey>,\n promptText: '',\n promptPath: '',\n agentsText: '',\n agentsPath: '',\n skillCatalog: [],\n skillsComplete: false,\n skillFolders: [],\n skillsRoot: '',\n presetOrder: 5,\n fallbackText: '',\n writePreset: true,\n presetTemplate: DEFAULT_PRESET_ID,\n promptConfigs: [],\n}\n/** 编译期契约:所有引擎参数键都必须进入 Fields,防止 host 新增参数后 client 静默丢弃。 */\ntype MissingEngineParamKeys = Exclude<EngineParamKey, keyof Fields>\nconst _assertEngineParamsInFields: MissingEngineParamKeys extends never ? true : false = true\n","/** 客户端脏检测、保存快照与保存后重载判定(纯逻辑)。 */\nimport type { PromptConfigDraft } from '../prompt-tool-types.ts'\nimport { ENGINE_PARAM_KEYS, type EngineParamKey } from '../../shared/engine-params.ts'\nimport { EMPTY_FIELDS, type Fields } from './prompt-tool-fields.ts'\n\nconst SETTINGS_SNAPSHOT_KEYS = [\n 'presetOrder', 'fallbackText', 'writePreset',\n] as const\nexport type SwitchSnapshot = Pick<Fields, EngineParamKey | typeof SETTINGS_SNAPSHOT_KEYS[number]>\n\n/** 全量参数自动进入快照;结构化复制隔离保存期间继续编辑的数组和对象。 */\nexport function snapshotSwitches(fields: Fields): SwitchSnapshot {\n return structuredClone(Object.fromEntries([...ENGINE_PARAM_KEYS, ...SETTINGS_SNAPSHOT_KEYS]\n .map((key) => [key, fields[key]]))) as SwitchSnapshot\n}\n\nexport const EMPTY_SWITCHES = snapshotSwitches(EMPTY_FIELDS)\n\n/** 两个空数组不算脏,防止首屏自动保存清空已有提示词配置。 */\nexport const promptConfigsDirty = (current: PromptConfigDraft[], saved: PromptConfigDraft[]): boolean =>\n current !== saved && !(current.length === 0 && saved.length === 0)\n\n/** 配置卡内未填写变量名的「待编辑行」(空 key)。这类行由保存端(savePresetParams)清理、\n * 不落盘;保存后静默重载会用服务端状态覆盖草稿,使刚点开的编辑行立即消失——重载前先排除。 */\nexport const hasPendingVariableRows = (configs: PromptConfigDraft[]): boolean =>\n configs.some((config) => Object.keys(config.variables ?? {}).some((key) => key.trim().length === 0))\n\nconst isPlainRecord = (value: unknown): value is Record<string, unknown> =>\n value !== null && typeof value === 'object' && !Array.isArray(value)\n\n/** 深比较 snapshot 内的数组/record;不使用 JSON.stringify,避免键顺序影响脏检测。 */\nexport const deepEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) return true\n if (Array.isArray(a) || Array.isArray(b)) {\n if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) return false\n return a.every((item, index) => deepEqual(item, b[index]))\n }\n if (isPlainRecord(a) || isPlainRecord(b)) {\n if (!isPlainRecord(a) || !isPlainRecord(b)) return false\n const keys = new Set([...Object.keys(a), ...Object.keys(b)])\n for (const key of keys) if (!deepEqual(a[key], b[key])) return false\n return true\n }\n return false\n}\n\nexport const switchesEqual = (a: SwitchSnapshot, b: SwitchSnapshot): boolean => deepEqual(a, b)\n\n/** 参数保存后仅在草稿未继续变化时重载(结构化草稿由各自编辑器自行保留)。 */\nexport const shouldReloadAfterParamSave = (current: SwitchSnapshot, saved: SwitchSnapshot): boolean =>\n switchesEqual(current, saved)\n\n/** 任一通道出现新草稿时,旧保存响应不得触发全量重载。 */\nexport const shouldReloadAfterPresetSave = (\n savedDraftVersion: number,\n currentDraftVersion: number,\n otherDraftsClean: boolean,\n): boolean => savedDraftVersion === currentDraftVersion && otherDraftsClean\n","/** preset.yml params 与客户端字段之间的纯转换;字段清单/类型/默认值来自共享契约。 */\nimport { ENGINE_PARAM_DEFINITIONS, ENGINE_PARAM_KEYS, engineParamList, type EngineParamKey } from '../../shared/engine-params.ts'\nimport type { Fields } from './prompt-tool-fields.ts'\nimport { deepEqual } from './dirty-state.ts'\n\nexport function readParamOverridesPatch(source: Record<string, unknown>): Partial<Fields> {\n const patch: Record<string, unknown> = {}\n for (const key of ENGINE_PARAM_KEYS) {\n const value = source[key]\n const definition = ENGINE_PARAM_DEFINITIONS[key]\n if (value === undefined || value === null) continue\n switch (definition.kind) {\n case 'boolean':\n if (typeof value === 'boolean') patch[key] = value\n break\n case 'number': {\n const number = typeof value === 'number' ? value : typeof value === 'string' && value.trim() !== '' ? Number(value) : undefined\n if (number !== undefined && definition.check(number) === undefined) {\n patch[key] = typeof definition.defaultValue === 'string' ? String(number) : number\n }\n break\n }\n case 'string':\n if (typeof value === 'string') patch[key] = value\n break\n // 正则串按原样回显:合法性交给保存层响亮拒绝,读回不因本地编译失败就吞掉用户值。\n case 'pattern':\n if (typeof value === 'string') patch[key] = value\n break\n case 'string-list':\n if (typeof value === 'string' || Array.isArray(value)) patch[key] = engineParamList(value).join(', ')\n break\n case 'max-depth':\n if (typeof value === 'string' || typeof value === 'number') patch[key] = String(value)\n break\n }\n }\n return patch as Partial<Fields>\n}\n\nexport interface ParamOverrideBuildOptions {\n loadedKeys: ReadonlySet<string>\n /** 最近读回/保存的有效草稿;未编辑的行默认值不固化进 params。 */\n baseline?: Partial<Fields>\n autoModelProvider?: string\n autoSubagentModelProvider?: string\n}\n\n/** 将一次成功写入折叠到已存键集合,供后续请求正确发送删键值。 */\nexport function updateLoadedParamKeys(loadedKeys: Set<string>, overrides: Readonly<Record<string, unknown>>): void {\n for (const [key, value] of Object.entries(overrides)) {\n if (value === '' || (Array.isArray(value) && value.length === 0)) loadedKeys.delete(key)\n else if (value !== undefined && value !== null) loadedKeys.add(key)\n }\n}\n\nfunction serializedParam(key: EngineParamKey, value: unknown): unknown {\n switch (ENGINE_PARAM_DEFINITIONS[key].kind) {\n case 'string-list': return engineParamList(value)\n case 'max-depth': return value === '' || value === 'provider-managed' ? value : Number(value)\n default: return value\n }\n}\n\n/** 只发送已存键或偏离默认的草稿;未操作字段不覆盖组合默认值。 */\nexport function buildParamOverrides(fields: Fields, options: ParamOverrideBuildOptions): Record<string, unknown> {\n const overrides: Record<string, unknown> = {}\n for (const key of ENGINE_PARAM_KEYS) {\n const value = serializedParam(key, fields[key])\n const empty = serializedParam(key, options.baseline !== undefined && Object.hasOwn(options.baseline, key)\n ? options.baseline[key] : ENGINE_PARAM_DEFINITIONS[key].defaultValue)\n if (options.loadedKeys.has(key) || !deepEqual(value, empty)) overrides[key] = value ?? ''\n }\n const modelProviderIsDisplayOnly = !options.loadedKeys.has('modelProvider')\n && fields.modelName.length === 0 && fields.modelProvider === options.autoModelProvider\n const subagentProviderIsDisplayOnly = !options.loadedKeys.has('subagentModelProvider')\n && fields.subagentModelName.length === 0 && fields.subagentModelProvider === options.autoSubagentModelProvider\n if (modelProviderIsDisplayOnly) delete overrides.modelProvider\n if (subagentProviderIsDisplayOnly) delete overrides.subagentModelProvider\n // 选择了模型时同时提交自动显示的 provider,不能只落 modelName 形成无效半路由。\n if (Object.hasOwn(overrides, 'modelName') && fields.modelName !== '' && fields.modelProvider !== '') overrides.modelProvider = fields.modelProvider\n if (Object.hasOwn(overrides, 'subagentModelName') && fields.subagentModelName !== '' && fields.subagentModelProvider !== '') overrides.subagentModelProvider = fields.subagentModelProvider\n return overrides\n}\n\n/** 保存队列中的过期草稿不得发往新预设;服务端另校验 expectedPresetId。 */\nexport const isCurrentPresetDraft = (draft: Pick<Fields, 'presetTemplate'>, current: Pick<Fields, 'presetTemplate'>): boolean =>\n draft.presetTemplate === current.presetTemplate\n","/** 技能管理的共享契约:技能实体由官方发现,**调用策略写在技能文件自己的 frontmatter 里**。\n *\n * 为什么不再有「屏蔽表」:注册层的同名裁决是「最近层无视优先级直接胜出」(官方 `dsh-skill` 的\n * `collectFresh`),而本插件的提供方在 profile/全局层、官方文件提供方由预设常驻组合挂在预设层,\n * 影子候选必然被预设层候选覆盖。停用改为改写技能文件的两个官方调用策略键后,任何装配下都成立。 */\nexport const SKILL_MARKER = 'SKILL.md'\n/** 技能文件编辑的 UTF-8 字节上限(包括 frontmatter)。 */\nexport const MAX_SKILL_CONTENT_BYTES = 1024 * 1024\n\nexport interface SkillContentSnapshot {\n /** Markdown 正文,不含 YAML frontmatter 与分隔线。 */\n content: string\n description: string\n /** 当前原始内容的 SHA-256;只用于冲突检查,不保存历史版本。 */\n revision: string\n}\n\n/** 技能状态文件版本(v4:状态文件只保存引用目录,调用策略回到技能文件)。\n * v3 里的 `blocked` 屏蔽表已弃用,读取时忽略、写入时删除。 */\nexport const SKILLS_STATE_VERSION = 4\n\n/** 官方技能根分类;数值越小越优先,与官方 rank 一致。 */\nexport type SkillSourceKind =\n | 'project-dsh'\n | 'project-agents'\n | 'custom'\n | 'user-dsh'\n | 'user-agents'\n | 'bundled'\n | 'other'\n\n/** 来源优先级:与官方六类技能根的次序一致(数值越小越优先)。\n * 展示名不在这里——标题由界面按 `skills.source.<kind>` 取字典,避免同一批文案出现两处真相。 */\nexport const SKILL_SOURCES: Record<SkillSourceKind, { rank: number }> = {\n 'project-dsh': { rank: 100 },\n 'project-agents': { rank: 200 },\n custom: { rank: 300 },\n 'user-dsh': { rank: 400 },\n 'user-agents': { rank: 500 },\n bundled: { rank: 600 },\n other: { rank: 700 },\n}\n\n/** 两个官方调用策略键:值就是「该端是否可调用」。 */\nexport interface SkillInvocation {\n /** `disable-model-invocation`:false 时模型不可发现、不可加载。 */\n modelInvocable: boolean\n /** `user-invocable`:false 时用户斜杠命令不可加载。 */\n userInvocable: boolean\n}\n\n/** 两端调用策略的目标范围:'model' = 只让模型端不可调用,'user' = 只让用户端不可调用,\n * 'all' = 两端都不可调用,'none' = 两端都恢复可调用。语义是「点击之后的目标状态」。 */\nexport type SkillPolicyScope = 'none' | 'model' | 'user' | 'all'\n\n/** 单端操作不携带另一端的旧快照;显式 scope 供两端批量操作和 TUI 使用。 */\nexport type SkillPolicyChange = { side: 'model' | 'user'; enabled: boolean } | { scope: SkillPolicyScope }\n\nexport interface SkillsCatalogSnapshot {\n skills: SkillCatalogEntry[]\n /** false 表示观测不完整,不能把未发现解释成不存在。 */\n complete: boolean\n}\n\n/** 目标范围 → 两个键的写入意图(true = 该端可调用)。 */\nexport function invocationForScope(scope: SkillPolicyScope): SkillInvocation {\n return {\n modelInvocable: scope === 'none' || scope === 'user',\n userInvocable: scope === 'none' || scope === 'model',\n }\n}\n\n/** 当前两端状态 → 范围(两端都可调用时为 'none')。 */\nexport function scopeOfInvocation(invocation: SkillInvocation): SkillPolicyScope {\n if (invocation.modelInvocable && invocation.userInvocable) return 'none'\n if (!invocation.modelInvocable && !invocation.userInvocable) return 'all'\n return invocation.modelInvocable ? 'user' : 'model'\n}\n\n/** 插件技能状态:只剩用户显式引用的技能文件夹(绝对路径,按引用顺序)。\n * 技能是否可调用由技能文件自己声明,不再进状态文件。 */\nexport interface SkillsState {\n version: number\n folders: string[]\n}\n\n/** 清单条目:由插件扫描六类官方技能根得到,是管理面的事实来源。 */\nexport interface SkillCatalogEntry {\n /** 稳定键:来源类别 + 来源根 + 目录名。 */\n id: string\n /** frontmatter name(缺失时回退目录名)。 */\n name: string\n description: string\n /** 技能目录名(一层扫描,与官方发现规则一致)。 */\n folder: string\n /** 来源根的绝对路径。 */\n dir: string\n source: SkillSourceKind\n /** 来源优先级(越小越优先)。 */\n rank: number\n valid: boolean\n issue?: string\n /** frontmatter 声明的模型端调用策略(唯一事实,缺省为可调用)。 */\n modelInvocable: boolean\n /** frontmatter 声明的用户端调用策略(唯一事实,缺省为可调用)。 */\n userInvocable: boolean\n /** 同名技能中的胜出者 id;本项未胜出时用于提示\"被同名技能遮蔽\"。 */\n winnerId?: string\n /** 标记文件绝对路径(调用策略的写入目标与身份校验依据)。 */\n path?: string\n /** 同名遮蔽事实:只有注册表确实报了同名技能时才标注;其余条目按文件声明为事实。 */\n availability?: 'active' | 'shadowed'\n provider?: string\n canSetPolicy?: boolean\n /** 普通本地资产可编辑描述和正文;缺描述可修复,损坏的 frontmatter 拒绝读取。 */\n canEdit?: boolean\n canDelete?: boolean\n readonlyReason?: string\n}\n","/** 受管字段白名单;实际来源必须由 writer 最终合并分支提供,不能仅凭 id 判定。 */\nimport type { EngineParamKey } from './engine-params.ts'\n\nexport interface ManagedConfigField {\n /** 配置内的字段路径:`params.<键>` 或顶层字段名(`enabled` / `modelScope`)。 */\n path: string\n /** 该字段由 writer 投影时使用的预设级扁平参数键。 */\n sourceParam: EngineParamKey\n /**\n * 计算结果而不是逐字映射:来源参数的组合结果(或集合开关),\n * 只读回显但不断言等于来源参数的字面值。\n */\n derived?: boolean\n /** 来源参数缺省(undefined)时的回落说明键,供只读回显标注真实生效语义。 */\n fallbackNote?: 'followsCustom'\n}\n\nexport interface ManagedConfigSpec {\n /** writer 投影规则认的配置 id。 */\n configId: string\n fields: readonly ManagedConfigField[]\n}\n\n/** writer 可投影的字段白名单;是否确由参数投影由 ConfigFieldSources 决定。 */\nexport const MANAGED_CONFIG_FIELDS: readonly ManagedConfigSpec[] = [\n {\n configId: 'near-anchor',\n fields: [\n { path: 'enabled', sourceParam: 'firstTurnAnchor' },\n { path: 'params.useCustom', sourceParam: 'firstTurnCustom' },\n { path: 'params.text', sourceParam: 'firstTurnText' },\n { path: 'params.buildPattern', sourceParam: 'buildPattern' },\n { path: 'params.complexPattern', sourceParam: 'complexPattern' },\n { path: 'params.firstTurnBuild', sourceParam: 'firstTurnBuild' },\n { path: 'params.firstTurnInspect', sourceParam: 'firstTurnInspect' },\n { path: 'params.firstTurnDeep', sourceParam: 'firstTurnDeep' },\n ],\n },\n {\n configId: 'router-guide',\n fields: [\n { path: 'enabled', sourceParam: 'guideEnabled' },\n // 自定义引导对所有模型注入,自动引导只服务 Flash 家族。\n { path: 'modelScope', sourceParam: 'guideCustom', derived: true, fallbackNote: 'followsCustom' },\n { path: 'params.useCustom', sourceParam: 'guideCustom', derived: true },\n { path: 'params.text', sourceParam: 'guideText' },\n { path: 'params.complexPattern', sourceParam: 'complexPattern' },\n { path: 'params.guideWeak', sourceParam: 'guideWeak' },\n { path: 'params.guideDeep', sourceParam: 'guideDeep' },\n ],\n },\n]\n\nexport interface ConfigFieldSources {\n configId: string\n fields: Array<{ path: string; source: 'preset-param' | 'prompt-config' }>\n}\n\n/** 严格投影白名单;未知路径、参数键和附加属性都不进入客户端。 */\nexport function readConfigFieldSources(configId: string, raw: unknown): ConfigFieldSources | undefined {\n const spec = MANAGED_CONFIG_FIELDS.find((entry) => entry.configId === configId)\n if (spec === undefined || raw === null || typeof raw !== 'object' || Array.isArray(raw)) return undefined\n const record = raw as Record<string, unknown>\n if (record.configId !== configId || !Array.isArray(record.fields)) return undefined\n const fields = spec.fields.flatMap(({ path }) => {\n const entry = (record.fields as unknown[]).find((item) => item !== null && typeof item === 'object'\n && (item as Record<string, unknown>).path === path) as Record<string, unknown> | undefined\n const source = entry?.source\n return source === 'preset-param' || source === 'prompt-config' ? [{ path, source } satisfies ConfigFieldSources['fields'][number]] : []\n })\n return { configId, fields }\n}\n\n/** 只有本次物化确由预设参数投影的字段才锁定;重命名或缺少事实均不按 id 猜测。 */\nexport function managedConfigSpec(configId: string | undefined, sources?: ConfigFieldSources): ManagedConfigSpec | undefined {\n if (configId === undefined || sources?.configId !== configId) return undefined\n const spec = MANAGED_CONFIG_FIELDS.find((entry) => entry.configId === configId)\n const fields = spec?.fields.filter((field) => sources.fields.some((entry) => entry.path === field.path && entry.source === 'preset-param')) ?? []\n return fields.length > 0 ? { configId, fields } : undefined\n}\n\nexport function isManagedConfigField(config: { id: string; fieldSources?: ConfigFieldSources }, path: string): boolean {\n return managedConfigSpec(config.id, config.fieldSources)?.fields.some((field) => field.path === path) === true\n}\n\n/** 来源只用于读回;无论客户端传了什么来源,都不能写入预设定义。 */\nexport function stripConfigFieldSources<T extends { fieldSources?: unknown }>(config: T): Omit<T, 'fieldSources'> {\n const { fieldSources: _fieldSources, ...definition } = config\n return definition\n}\n\n/** 该受管字段在当前配置草稿里的值(只读回显用;缺失时返回 undefined)。 */\nexport function managedFieldValue(\n field: ManagedConfigField,\n config: { enabled?: boolean; modelScope?: string; params?: Record<string, unknown> },\n): unknown {\n if (field.path === 'enabled') return config.enabled\n if (field.path === 'modelScope') return config.modelScope\n const key = field.path.replace(/^params\\./, '')\n return config.params?.[key]\n}\n","/** settings/bootstrap 载荷到客户端 Fields 的纯映射。 */\nimport type { PromptConfigDraft } from '../prompt-tool-types.ts'\nimport type { BridgeResult, BridgeSettingsView } from './bridge-transport.ts'\nimport { EMPTY_FIELDS, type Fields, type SkillCatalogEntry } from './prompt-tool-fields.ts'\nimport { readParamOverridesPatch } from './param-overrides.ts'\nimport { DEFAULT_PRESET_ID } from '../../shared/preset-ids.ts'\nimport { SKILL_SOURCES } from '../../shared/skills.ts'\nimport type { BridgeValueMap } from '../../shared/bridge-contract.ts'\nimport { readConfigFieldSources, stripConfigFieldSources } from '../../shared/managed-config-fields.ts'\n\n/** 来源随当前物化快照读回,不从配置 id 或参数值猜测。 */\nexport function withConfigFieldSources(config: PromptConfigDraft): PromptConfigDraft {\n const fieldSources = readConfigFieldSources(config.id, config.fieldSources)\n return { ...stripConfigFieldSources(config), ...(fieldSources === undefined ? {} : { fieldSources }) }\n}\n\nconst asRecord = (value: unknown): Record<string, unknown> =>\n value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {}\n\nconst readString = (source: Record<string, unknown>, key: string): string | undefined => {\n const value = source[key]\n return typeof value === 'string' ? value : undefined\n}\n\nconst readStringArray = (source: Record<string, unknown>, key: string): string[] => {\n const value = source[key]\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === 'string') : []\n}\n\nconst readBoolean = (source: Record<string, unknown>, key: string, fallback: boolean): boolean => {\n const value = source[key]\n return typeof value === 'boolean' ? value : fallback\n}\n\nconst readNumber = (source: Record<string, unknown>, key: string, fallback: number): number => {\n const value = source[key]\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0 ? value : fallback\n}\n\nconst readSkillCatalog = (source: Record<string, unknown>, key: string): SkillCatalogEntry[] => {\n const value = source[key]\n if (!Array.isArray(value)) return []\n return value.flatMap((entry) => {\n if (entry === null || typeof entry !== 'object') return []\n const record = entry as Record<string, unknown>\n const id = readString(record, 'id')\n const name = readString(record, 'name')\n const folder = readString(record, 'folder')\n const dir = readString(record, 'dir')\n const kind = readString(record, 'source')\n if (id === undefined || name === undefined || folder === undefined || dir === undefined || kind === undefined) return []\n return [{\n id,\n name,\n folder,\n dir,\n source: Object.hasOwn(SKILL_SOURCES, kind) ? kind as SkillCatalogEntry['source'] : 'other',\n rank: readNumber(record, 'rank', 0),\n description: readString(record, 'description') ?? '',\n valid: readBoolean(record, 'valid', false),\n modelInvocable: readBoolean(record, 'modelInvocable', true),\n userInvocable: readBoolean(record, 'userInvocable', true),\n ...(readString(record, 'issue') !== undefined ? { issue: readString(record, 'issue')! } : {}),\n ...(readString(record, 'winnerId') !== undefined ? { winnerId: readString(record, 'winnerId')! } : {}),\n ...(readString(record, 'path') !== undefined ? { path: readString(record, 'path')! } : {}),\n // 只有遮蔽是注册表带来的事实;其余条目按文件声明为事实(不再有未注册/未确认)。\n availability: record.availability === 'shadowed' ? 'shadowed' : 'active',\n ...(typeof record.canSetPolicy === 'boolean' ? { canSetPolicy: record.canSetPolicy } : {}),\n ...(typeof record.canEdit === 'boolean' ? { canEdit: record.canEdit } : {}),\n ...(typeof record.canDelete === 'boolean' ? { canDelete: record.canDelete } : {}),\n ...(readString(record, 'provider') !== undefined ? { provider: readString(record, 'provider')! } : {}),\n ...(readString(record, 'readonlyReason') !== undefined ? { readonlyReason: readString(record, 'readonlyReason')! } : {}),\n }]\n })\n}\n\nconst readPromptConfigs = (source: Record<string, unknown>, key: string): PromptConfigDraft[] => {\n const value = source[key]\n if (!Array.isArray(value)) return []\n return value.flatMap((entry) => {\n if (entry === null || typeof entry !== 'object') return []\n const record = entry as Record<string, unknown>\n return typeof record.id === 'string' && record.id.length > 0 ? [entry as PromptConfigDraft] : []\n })\n}\n\n\n/** 技能快照只更新自身字段,供首屏与局部刷新共用。空数组也是权威结果。 */\nexport function skillFieldsFromSnapshot(snapshot: BridgeValueMap['skillsList']): Pick<Fields, 'skillCatalog' | 'skillsComplete' | 'skillFolders' | 'skillsRoot'> {\n const catalog = readSkillCatalog({ skills: snapshot.skills }, 'skills')\n return {\n // 观测是否完整只影响 skillsComplete 提示,不再据此把条目降级成 unknown:\n // 本地扫描到的技能按文件声明为事实(重构前语义,与参照实现 dsh-web 的\n // collectSkills 一致)。降级会让状态徽章停在「未确认」,并让「模型可用/\n // 用户可用」两个页签计数归零。\n skillCatalog: catalog,\n skillsComplete: snapshot.complete === true,\n skillFolders: readStringArray({ folders: snapshot.folders }, 'folders'),\n skillsRoot: readStringArray({ roots: snapshot.roots }, 'roots')[0] ?? '',\n }\n}\n\nexport function fieldsFromView(res: BridgeResult<BridgeSettingsView>): Fields {\n const ns = res.ok ? res.value : undefined\n const value = asRecord(ns?.value)\n const base = asRecord(ns?.base)\n const next: Fields = {\n ...EMPTY_FIELDS,\n promptText: readString(value, 'promptText') ?? readString(base, 'promptText') ?? '',\n promptPath: readString(value, 'promptPath') ?? readString(base, 'promptPath') ?? '',\n agentsText: readString(value, 'agentsText') ?? readString(base, 'agentsText') ?? '',\n agentsPath: readString(value, 'agentsPath') ?? readString(base, 'agentsPath') ?? '',\n ...skillFieldsFromSnapshot({\n skills: res.ok ? res.skillCatalog ?? [] : [],\n complete: res.ok && res.skillsComplete === true,\n folders: res.ok ? res.skillFolders ?? [] : [],\n roots: res.ok ? res.activeSkillsDirs ?? [] : [],\n }),\n presetOrder: readNumber(value, 'presetOrder', readNumber(base, 'presetOrder', 5)),\n fallbackText: readString(value, 'fallbackText') ?? readString(base, 'fallbackText') ?? '',\n writePreset: readBoolean(value, 'writePreset', readBoolean(base, 'writePreset', true)),\n presetTemplate: readString(value, 'presetTemplate') ?? readString(base, 'presetTemplate') ?? DEFAULT_PRESET_ID,\n promptConfigs: value.promptConfigs !== undefined\n ? readPromptConfigs(value, 'promptConfigs')\n : readPromptConfigs(base, 'promptConfigs'),\n }\n return next\n}\n/** /bootstrap 已携带 descriptor;归一成 fieldsFromView 使用的结果形状。 */\nexport function bridgeViewFromBoot(boot: BridgeResult<BridgeSettingsView>): BridgeResult<BridgeSettingsView> {\n if (!boot.ok) return boot\n return {\n ok: true,\n value: {\n ns: 'prompt-tool',\n value: boot.value.value,\n base: boot.value.base,\n revision: boot.value.revision,\n },\n providers: boot.providers,\n modelCatalog: boot.modelCatalog,\n activeSkillsDirs: boot.activeSkillsDirs,\n skillCatalog: boot.skillCatalog,\n skillsComplete: boot.skillsComplete,\n skillFolders: boot.skillFolders,\n templatePreStepCount: boot.templatePreStepCount,\n presetParams: boot.presetParams,\n hostDefaultModel: boot.hostDefaultModel,\n moduleFacts: boot.moduleFacts,\n }\n}\n\n/** 只从预设投影行为参数;不把 settings 重新引入预设优先级链。 */\nexport function mergePresetParams(fields: Fields, params: Record<string, unknown> | undefined): Fields {\n return params === undefined ? fields : { ...fields, ...readParamOverridesPatch(params) }\n}\n","/** promptConfigs 内容资产的文件载荷与 UI 草稿映射(纯逻辑)。 */\nimport type { PromptConfigDraft } from '../prompt-tool-types.ts'\n\n/**\n * 内容资产条目:只有 preset.md 注入卡(prompt-injector)的 text 走生成目录文件通道。\n * 指令文件正文不在这里:它按 fileId 走独立的文件草稿与 /agents-file 单文件写通道。\n */\nexport const isContentAsset = (config: PromptConfigDraft): boolean =>\n config.id === 'prompt-injector'\n\n/**\n * 指令文件卡绑定的 fileId:origin 优先(服务端生成的来源),回退卡自带的 params.fileId。\n * 只有能解析出 fileId 的卡才是指令文件卡——按卡 id 前缀或 params.file 猜所有者会造成误路由。\n */\nexport const instructionFileIdOf = (config: PromptConfigDraft): string | undefined => {\n const origin = config.origin\n if (origin !== undefined && origin.kind === 'instruction-file') return origin.fileId\n const fileId = config.params?.fileId\n return config.sourceKind === 'instruction-file' && typeof fileId === 'string' && fileId.length > 0\n ? fileId\n : undefined\n}\n\n/** 指令文件卡:正文与卡片定义都不写进 preset.yml,正文只能经 /agents-file 显式写盘。 */\nexport const isAgentsFileCard = (config: PromptConfigDraft): boolean => instructionFileIdOf(config) !== undefined\n\n/** 预设卡(不含指令文件来源)。 */\nexport const isPresetCard = (config: PromptConfigDraft): boolean => !isAgentsFileCard(config)\n\n/**\n * 剥离内容资产的 text(顶层 + params.text):settings 载荷不承载大文本。\n * 只对内容资产生效——普通卡的 text/texts/params.text 是自身合法字段,剥离会静默丢正文。\n */\nexport const stripContentText = (config: PromptConfigDraft): PromptConfigDraft => {\n if (!isContentAsset(config)) return config\n const next: PromptConfigDraft = { ...config }\n delete next.text\n if (next.params !== undefined) {\n const params = { ...next.params }\n delete params.text\n next.params = params\n }\n return next\n}\n\n/** 渲染产物 → 编辑草稿:params.text 提升到 text 编辑框。 */\nexport const liftContentText = (config: PromptConfigDraft): PromptConfigDraft => {\n if (!isContentAsset(config) || (config.text ?? '') !== '') return config\n const text = typeof config.params?.text === 'string' ? config.params.text : ''\n return text.length > 0 ? { ...config, text } : config\n}\n","/**\n * 指令文件草稿池(纯逻辑,无 React、无网络)。\n * 与预设卡草稿分离:文件正文只按 fileId 索引显式保存,不参与预设的 debounce 自动保存;\n * 读取失败/超限不是空正文,冲突与保存失败都不丢用户草稿。\n */\nimport type {\n InstructionFileSnapshot,\n InstructionFileStatus,\n InstructionsOwnerView,\n InstructionsSnapshot,\n} from '../../shared/instructions.ts'\n\nexport interface InstructionDraft {\n fileId: string\n /** 读取该草稿时的工作区上下文;与 pool.contextId 不一致时禁止写盘。 */\n contextId: string | null\n path: string\n displayPath: string\n scope: 'global' | 'project'\n status: InstructionFileStatus\n message?: string\n /** 基线版本(保存请求的 expectedRevision);不可读时为 null,此时禁止保存。 */\n revision: string | null\n /** 已读取或已保存的基线正文。 */\n savedContent: string\n /** 用户当前正文。 */\n content: string\n /** 读取后磁盘已变:不静默覆盖,先让用户重新读取或显式保存(由服务端 409 兜底)。 */\n conflict?: boolean\n /** 最近一次保存失败原因;保存成功或重新编辑后清除。 */\n error?: string\n /** 保存中:同文件请求串行,期间继续编辑仍保持 dirty。 */\n saving?: boolean\n}\n\nexport interface InstructionDraftPool {\n contextId: string | null\n cwd: string | null\n /**\n * session = 由存活本地 Agent 的会话 cwd 解析;deploy-cwd = 会话不可用,\n * 退回部署进程 cwd;global-only = 客户端尚无服务端解析结果时的空池标记。\n */\n source: 'session' | 'deploy-cwd' | 'global-only'\n /** 上下文序号:迟到响应按序号丢弃,不写入新上下文。 */\n seq: number\n drafts: InstructionDraft[]\n /** 负责人事实(服务端观察):true 时独立来源本次不注入正文,UI 只做提示。 */\n owner: InstructionsOwnerView\n}\n\nexport interface InstructionSaveRequest {\n sessionId?: string\n contextId: string\n fileId: string\n expectedRevision: string | null\n content: string\n}\n\nexport interface InstructionSaveOutcome {\n fileId: string\n ok: boolean\n revision?: string\n message?: string\n /** 版本冲突(409):草稿保留,必须重新读取后才能再写。 */\n conflict?: boolean\n}\n\nexport const EMPTY_INSTRUCTION_POOL: InstructionDraftPool = {\n contextId: null,\n cwd: null,\n source: 'global-only',\n seq: 0,\n drafts: [],\n owner: { officialInstructions: null },\n}\n\n/**\n * 需要「重新读取」才能继续的写盘失败码(host/agents-cards.ts 的输出):\n * 版本冲突、目标身份变化、当前不可读——都不是可以自动重试成功的情况。\n */\nexport const INSTRUCTION_CONFLICT_CODES: readonly string[] = [\n 'agents-file-conflict',\n 'agents-file-identity-changed',\n 'agents-file-unreadable',\n // 工作区/会话上下文已变(settings-bridge 的写前重解析):同样必须先重新读取。\n 'agents-file-context-stale',\n]\n\nexport const isInstructionConflictCode = (code: string | undefined): boolean =>\n code !== undefined && INSTRUCTION_CONFLICT_CODES.includes(code)\n\nconst draftFromSnapshot = (file: InstructionFileSnapshot, contextId: string | null): InstructionDraft => ({\n fileId: file.fileId,\n contextId,\n path: file.path,\n displayPath: file.displayPath,\n scope: file.scope,\n status: file.status,\n ...(file.message === undefined ? {} : { message: file.message }),\n revision: file.revision,\n savedContent: file.status === 'ready' ? file.text : '',\n content: file.status === 'ready' ? file.text : '',\n})\n\n/** 同一文件的新快照并入既有草稿:用户改了正文就不让远端版本静默顶掉它。 */\nfunction mergeDraft(draft: InstructionDraft, file: InstructionFileSnapshot, contextId: string | null): InstructionDraft {\n if (file.status !== 'ready') {\n // 读取失败/超限/消失:保留草稿,但状态与版本按事实更新,且不再可写。\n return {\n ...draft,\n contextId,\n path: file.path,\n displayPath: file.displayPath,\n scope: file.scope,\n status: file.status,\n message: file.message,\n saving: false,\n revision: null,\n }\n }\n const dirty = draft.content !== draft.savedContent\n const diskChanged = file.revision !== draft.revision\n if (dirty && diskChanged) {\n // 期间磁盘变了:保留草稿与旧基线(保存时由 expectedRevision 判 409),不采纳新版本。\n return {\n ...draft,\n contextId,\n path: file.path,\n displayPath: file.displayPath,\n scope: file.scope,\n status: 'ready',\n message: file.message,\n saving: false,\n conflict: true,\n }\n }\n if (dirty) return { ...draft, contextId, path: file.path, displayPath: file.displayPath, scope: file.scope, status: 'ready', message: file.message, saving: false }\n return draftFromSnapshot(file, contextId)\n}\n\n/**\n * 用一次读取快照重建草稿池。同一上下文内到达的快照不会丢用户草稿:\n * 未改动的文件采纳磁盘新版本,改过的文件保留草稿并标记冲突。\n */\nexport function poolFromSnapshot(\n snapshot: InstructionsSnapshot,\n seq: number,\n previous?: InstructionDraftPool,\n): InstructionDraftPool {\n const base = previous ?? EMPTY_INSTRUCTION_POOL\n const contextId = snapshot.context.contextId\n const drafts = snapshot.files.map((file) => {\n const existing = base.drafts.find((draft) => draft.fileId === file.fileId)\n return existing === undefined ? draftFromSnapshot(file, contextId) : mergeDraft(existing, file, contextId)\n })\n for (const draft of base.drafts) {\n if (snapshot.files.some((file) => file.fileId === draft.fileId)) continue\n drafts.push({ ...draft, contextId: null, status: 'missing', saving: false, message: '文件不在当前工作区范围或已不存在' })\n }\n return {\n contextId,\n cwd: snapshot.context.cwd,\n source: snapshot.context.source,\n seq,\n drafts,\n // 老宿主/异常载荷缺 owner 时按「未观察到」处理,不猜成冲突。\n owner: snapshot.owner ?? { officialInstructions: null },\n }\n}\n\n/** 上下文切换:保留草稿(不丢输入),但旧上下文草稿自此不可写;负责人事实回到未观察态。 */\nexport function switchInstructionContext(pool: InstructionDraftPool, seq: number): InstructionDraftPool {\n return { ...pool, contextId: null, cwd: null, source: 'global-only', seq, drafts: pool.drafts.map((draft) => ({ ...draft, saving: false })), owner: { officialInstructions: null } }\n}\n\n/** 迟到响应(上下文序号已过期)不得写入当前视图。 */\nexport const isCurrentInstructionSeq = (pool: InstructionDraftPool, seq: number): boolean => pool.seq === seq\n\nexport function setDraftContent(pool: InstructionDraftPool, fileId: string, content: string): InstructionDraftPool {\n return {\n ...pool,\n drafts: pool.drafts.map((draft) => (\n draft.fileId === fileId ? { ...draft, content, error: undefined } : draft\n )),\n }\n}\n\n/** 显式「重新读取」:丢弃本地草稿,采纳磁盘版本(含清除冲突)。 */\nexport function resetDraftFromSnapshot(pool: InstructionDraftPool, file: InstructionFileSnapshot): InstructionDraftPool {\n const existing = pool.drafts.find((draft) => draft.fileId === file.fileId)\n const next = draftFromSnapshot(file, pool.contextId)\n return {\n ...pool,\n drafts: existing === undefined\n ? [...pool.drafts, next]\n : pool.drafts.map((draft) => (draft.fileId === file.fileId ? next : draft)),\n }\n}\n\n/** 正文相对基线有改动(含冲突中、保存中的文件):用于「未保存草稿」提示。 */\nexport const unsavedInstructionDrafts = (pool: InstructionDraftPool): InstructionDraft[] =>\n pool.drafts.filter((draft) => draft.content !== draft.savedContent)\n\n/** 可提交的文件:读取就绪、有基线版本、无未解决冲突、上下文仍是当前的。 */\nexport const canSaveDraft = (pool: InstructionDraftPool, draft: InstructionDraft): boolean =>\n draft.status === 'ready'\n && draft.contextId !== null\n && draft.contextId === pool.contextId\n && draft.revision !== null\n && draft.conflict !== true\n && draft.saving !== true\n && draft.content !== draft.savedContent\n\nexport const saveableInstructionDrafts = (pool: InstructionDraftPool): InstructionDraft[] =>\n pool.drafts.filter((draft) => canSaveDraft(pool, draft))\n\n/** 单文件保存请求(契约形状);不可提交时返回 undefined,不发送注定失败的请求。 */\nexport function instructionSaveRequest(\n pool: InstructionDraftPool,\n fileId: string,\n sessionId?: string,\n): InstructionSaveRequest | undefined {\n const draft = pool.drafts.find((entry) => entry.fileId === fileId)\n if (draft === undefined || pool.contextId === null || !canSaveDraft(pool, draft)) return undefined\n return {\n ...(sessionId === undefined || sessionId.length === 0 ? {} : { sessionId }),\n contextId: pool.contextId,\n fileId: draft.fileId,\n expectedRevision: draft.revision,\n content: draft.content,\n }\n}\n\nexport function markDraftSaving(pool: InstructionDraftPool, fileId: string, saving: boolean): InstructionDraftPool {\n return {\n ...pool,\n drafts: pool.drafts.map((draft) => (\n draft.fileId === fileId ? { ...draft, saving, ...(saving ? { error: undefined } : {}) } : draft\n )),\n }\n}\n\n/** 保存成功:只把「请求时快照」记为基线;期间的新输入仍是 dirty。 */\nexport function applySaveSuccess(\n pool: InstructionDraftPool,\n fileId: string,\n request: InstructionSaveRequest,\n revision: string,\n): InstructionDraftPool {\n return {\n ...pool,\n drafts: pool.drafts.map((draft) => (\n draft.fileId === fileId\n ? { ...draft, savedContent: request.content, revision, saving: false, error: undefined, conflict: undefined }\n : draft\n )),\n }\n}\n\n/** 保存失败:保留草稿与旧基线;冲突时要求重新读取,不自动重载覆盖用户输入。 */\nexport function applySaveFailure(\n pool: InstructionDraftPool,\n fileId: string,\n message: string,\n options: { conflict?: boolean } = {},\n): InstructionDraftPool {\n return {\n ...pool,\n drafts: pool.drafts.map((draft) => (\n draft.fileId === fileId\n ? { ...draft, saving: false, error: message, ...(options.conflict === true ? { conflict: true } : {}) }\n : draft\n )),\n }\n}\n\n/** 保存全部:逐文件结果,成功项更新基线、失败项保留草稿,不宣称跨文件原子提交。 */\nexport function applySaveOutcomes(\n pool: InstructionDraftPool,\n results: readonly InstructionSaveOutcome[],\n requests: ReadonlyMap<string, InstructionSaveRequest>,\n): InstructionDraftPool {\n let next = pool\n for (const result of results) {\n if (result.ok && result.revision !== undefined) {\n const request = requests.get(result.fileId)\n if (request !== undefined) next = applySaveSuccess(next, result.fileId, request, result.revision)\n else next = markDraftSaving(next, result.fileId, false)\n } else {\n next = applySaveFailure(next, result.fileId, result.message ?? '保存失败', { conflict: result.conflict === true })\n }\n }\n return next\n}\n","/**\n * 指令卡策略的客户端纯逻辑(无 React、无网络):\n * 默认值、按 fileId 解析有效行为、以及把单文件改动编成 bridge 载荷。\n */\nimport type {\n InstructionPolicy,\n InstructionPolicyFileOverride,\n InstructionPolicyPatch,\n InstructionPolicySnapshot,\n InstructionPolicyValues,\n} from '../../shared/instructions.ts'\n\n/** 与 host 默认值一致(host 是事实源;这里是未读到快照前的显示兜底)。 */\nexport const DEFAULT_INSTRUCTION_POLICY_VALUES: InstructionPolicyValues = {\n order: 30,\n position: 'after-user',\n promotion: 'none',\n audience: null,\n modelScope: 'all',\n}\n\nexport const EMPTY_INSTRUCTION_POLICY_SNAPSHOT: InstructionPolicySnapshot = {\n policy: { enabled: false, defaults: { ...DEFAULT_INSTRUCTION_POLICY_VALUES }, files: {} },\n revision: null,\n exists: false,\n}\n\n/** 单个文件的有效策略:覆盖优先于 defaults;部署级 enabled 优先于每文件开关。 */\nexport function resolveInstructionFilePolicy(\n policy: InstructionPolicy,\n fileId: string,\n): InstructionPolicyValues & { enabled: boolean; name?: string } {\n // 服务端载荷可能不完整(老宿主/异常):缺字段按默认,不当作「无策略」或抛错。\n const override = policy.files?.[fileId] ?? {}\n return {\n ...DEFAULT_INSTRUCTION_POLICY_VALUES,\n ...policy.defaults,\n ...override,\n enabled: policy.enabled && override.enabled !== false,\n }\n}\n\n/** 单文件覆盖写请求:未列出的字段不提交,null 表示删除该文件覆盖。 */\nexport function instructionPolicyPatchForFile(\n fileId: string,\n override: InstructionPolicyFileOverride | null,\n): InstructionPolicyPatch {\n return { files: { [fileId]: override } }\n}\n","/** 失败不阻断后续任务的最小串行队列。 */\nexport interface SerialTaskQueue {\n enqueue<T>(task: () => Promise<T>): Promise<T>\n}\n\nexport function createSerialTaskQueue(): SerialTaskQueue {\n let tail: Promise<unknown> = Promise.resolve()\n return {\n enqueue(task) {\n const current = tail.then(task)\n tail = current.catch(() => {})\n return current\n },\n }\n}\n","/** 规则草稿归属工作台;页面卸载不丢输入,网络响应只确认本次请求的快照。 */\nimport type { BridgeErrorPayload, BridgeRequestMap, BridgeValueMap } from '../../shared/bridge-contract.ts'\nimport type { BridgeResult } from './bridge-client.ts'\nimport { deepEqual } from './dirty-state.ts'\nimport type { FieldDraft, WorkspaceDrafts } from './workspace-drafts.ts'\n\ntype TriggerSnapshot = BridgeValueMap['triggers']\nexport interface TriggerEditorDraft {\n value: unknown[]\n saved: unknown[]\n fields: Map<string, FieldDraft>\n revision?: string\n meta?: TriggerSnapshot['meta']\n remote?: TriggerSnapshot\n loaded: boolean\n busy?: 'read' | 'save' | 'validate'\n error?: BridgeErrorPayload\n validated: boolean\n sequence: number\n}\n\nexport const hasTriggerFieldDrafts = (draft: TriggerEditorDraft): boolean => [...draft.fields.values()].some((field) => field.text !== field.source || field.error.length > 0)\nexport const triggerDraftDirty = (draft: TriggerEditorDraft): boolean => !deepEqual(draft.value, draft.saved) || hasTriggerFieldDrafts(draft)\n\nexport function getTriggerDraft(drafts: WorkspaceDrafts, presetId: string): TriggerEditorDraft {\n let draft = drafts.triggers.get(presetId)\n if (draft === undefined) {\n draft = { value: [], saved: [], fields: new Map(), loaded: false, validated: false, sequence: 0 }\n drafts.triggers.set(presetId, draft)\n }\n return draft\n}\n\ninterface TriggerEditorDependencies {\n request(body: BridgeRequestMap['triggers']): Promise<BridgeResult<TriggerSnapshot>>\n enqueue<T>(presetId: string, task: () => Promise<T>): Promise<T>\n isCurrent(): boolean\n changed(): void\n}\n\nexport function createTriggerEditor(presetId: string, draft: TriggerEditorDraft, deps: TriggerEditorDependencies) {\n const current = (sequence: number): boolean => sequence === draft.sequence && deps.isCurrent()\n const failure = (error: unknown): BridgeErrorPayload => ({ ok: false, code: 'trigger-request-failed', message: error instanceof Error ? error.message : String(error) })\n const finish = (sequence: number): void => {\n if (sequence === draft.sequence) { draft.busy = undefined; deps.changed() }\n }\n const patch = (value: unknown[]): void => {\n draft.value = structuredClone(value)\n draft.validated = false\n if (draft.remote === undefined) draft.error = undefined\n deps.changed()\n }\n const load = async (): Promise<boolean> => {\n if (!deps.isCurrent() || draft.busy === 'save' || draft.busy === 'validate') return false\n const sequence = ++draft.sequence\n draft.busy = 'read'\n deps.changed()\n try {\n const result = await deps.request({ expectedPresetId: presetId })\n if (!current(sequence)) return false\n if (!result.ok) { draft.error = result; return false }\n const snapshot = result.value\n draft.meta = snapshot.meta\n // 其他预设设置也改变整文件版本:仅当规则未被他人修改时,才可保留本地输入并推进基线。\n if (triggerDraftDirty(draft) && !deepEqual(snapshot.triggers, draft.saved)) {\n draft.remote = snapshot\n draft.error = { ok: false, code: 'trigger-rules-changed' }\n return false\n }\n if (!triggerDraftDirty(draft)) draft.value = structuredClone(snapshot.triggers)\n draft.saved = structuredClone(snapshot.triggers)\n draft.revision = snapshot.revision\n draft.loaded = true\n draft.remote = undefined\n draft.error = undefined\n draft.validated = false\n return true\n } catch (error) {\n if (current(sequence)) draft.error = failure(error)\n return false\n } finally { finish(sequence) }\n }\n const submit = async (validateOnly = false): Promise<boolean> => {\n if (!deps.isCurrent() || !draft.loaded || draft.busy !== undefined || draft.remote !== undefined || draft.revision === undefined || hasTriggerFieldDrafts(draft)) return false\n const sequence = ++draft.sequence\n const submitted = structuredClone(draft.value)\n const expectedRevision = draft.revision\n draft.busy = validateOnly ? 'validate' : 'save'\n draft.validated = false\n draft.error = undefined\n deps.changed()\n try {\n const result = await deps.enqueue(presetId, async () => {\n if (!current(sequence)) return undefined\n return deps.request({ expectedPresetId: presetId, expectedRevision, triggers: submitted, ...(validateOnly ? { validateOnly: true } : {}) })\n })\n if (!current(sequence) || result === undefined) return false\n if (!result.ok) { draft.error = result; return false }\n if (validateOnly) {\n draft.validated = deepEqual(draft.value, submitted) && !hasTriggerFieldDrafts(draft)\n } else {\n draft.saved = structuredClone(submitted)\n draft.revision = result.value.revision\n draft.meta = result.value.meta\n }\n return true\n } catch (error) {\n if (current(sequence)) draft.error = failure(error)\n return false\n } finally { finish(sequence) }\n }\n /** 仅供用户确认放弃本地输入后调用;普通重新读取始终保留未保存草稿。 */\n const discard = (): void => {\n if (draft.busy !== undefined) return\n if (draft.remote !== undefined) {\n draft.saved = structuredClone(draft.remote.triggers)\n draft.revision = draft.remote.revision\n draft.meta = draft.remote.meta\n draft.loaded = true\n }\n draft.value = structuredClone(draft.saved)\n draft.fields.clear()\n draft.remote = undefined\n draft.error = undefined\n draft.validated = false\n deps.changed()\n }\n return { patch, load, submit, discard }\n}\n\nexport type TriggerEditor = ReturnType<typeof createTriggerEditor>\n","/** 工作台实例期的业务草稿。每类数据有明确 owner,切页只卸载视图,不丢原始输入。 */\nimport { triggerDraftDirty, type TriggerEditorDraft } from './trigger-drafts.ts'\nimport type { SkillContentSnapshot } from '../../shared/skills.ts'\n\nexport interface SkillEditorDraft {\n saved?: SkillContentSnapshot\n text: string\n description: string\n error: string\n loading: boolean\n saving: boolean\n refresh?: () => void\n}\nexport interface FieldDraft {\n source: string\n text: string\n error: string\n}\n\nexport interface PersonaDraft {\n prefix: string\n suffix: string\n complete: boolean\n includeRuntimeContext: boolean\n}\n\nexport interface PersonaEditorDraft {\n refresh?: () => void\n value: PersonaDraft\n saved: PersonaDraft\n declared: boolean\n loaded: boolean\n error: string\n saving: boolean\n}\n\nexport interface ToolsEditorDraft {\n refresh?: () => void\n tools: Record<string, unknown>[]\n saved: Record<string, unknown>[]\n expanded: Set<number>\n fields: Map<string, FieldDraft>\n loaded: boolean\n error: string\n saving: boolean\n}\n\nexport interface PolicyDraft {\n defaultProfile?: string\n ceiling?: { allow?: string[]; deny?: string[] }\n profiles?: Array<{ id: string; name?: string; allow?: string[]; deny?: string[]; modelSelectable?: boolean }>\n characterBindings?: Array<{ characterId: string; profile: string; modelSelectable?: boolean }>\n taskRules?: Array<{ id: string; name?: string; pattern: string; profile: string; order?: number; modelSelectable?: boolean }>\n modelExpansion?: { enabled?: boolean; allow?: string[]; maxAdditionalTools?: number; requireApproval?: boolean }\n}\n\nexport interface PolicyEditorDraft {\n draft: PolicyDraft | null\n saved: PolicyDraft | null\n pending?: PolicyDraft | null\n saving: boolean\n loaded: boolean\n refresh?: () => void\n report?: (kind: 'ok' | 'error', message: string) => void\n}\n\nexport interface WorkspaceDrafts {\n skills: Map<string, SkillEditorDraft>\n triggers: Map<string, TriggerEditorDraft>\n tools: Map<string, ToolsEditorDraft>\n persona: Map<string, PersonaEditorDraft>\n policies: Map<string, PolicyEditorDraft>\n expanded: Map<string, boolean>\n fields: Map<string, FieldDraft>\n}\n\nexport function createWorkspaceDrafts(): WorkspaceDrafts {\n return { skills: new Map(), triggers: new Map(), tools: new Map(), persona: new Map(), policies: new Map(), fields: new Map(), expanded: new Map() }\n}\n\n/** 切换预设前阻止无声丢弃局部草稿;用户回对应页面处理,不替其隐式落盘。 */\nexport function hasWorkspaceDrafts(drafts: WorkspaceDrafts, presetId: string): boolean {\n const triggers = drafts.triggers.get(presetId)\n const tools = drafts.tools.get(presetId)\n const persona = drafts.persona.get(presetId)\n const policy = drafts.policies.get(presetId)\n return (triggers !== undefined && (triggers.busy === 'save' || triggerDraftDirty(triggers)))\n || (tools !== undefined && (tools.saving || JSON.stringify(tools.tools) !== JSON.stringify(tools.saved)\n || [...tools.fields.values()].some((field) => field.text !== field.source || field.error.length > 0)))\n || (persona !== undefined && (persona.saving || JSON.stringify(persona.value) !== JSON.stringify(persona.saved)))\n || (policy !== undefined && (policy.saving || JSON.stringify(policy.draft) !== JSON.stringify(policy.saved)))\n || [...drafts.fields].some(([key, field]) => key.startsWith(`${presetId}:`) && (field.text !== field.source || field.error.length > 0))\n}\n","import type { MenuSelectOption } from '../../ui/MenuSelect.tsx'\nimport type { ModelReasoningView } from '../../../shared/bridge-contract.ts'\n\nexport interface ModelSelection {\n provider: string\n model: string\n}\n\n/** 用无歧义的复合值承载 provider + model;同名模型可跨服务商共存。 */\nexport const modelChoiceValue = (provider: string, model: string): string =>\n JSON.stringify([provider, model])\n\nexport function parseModelChoice(value: string): ModelSelection | undefined {\n if (value.length === 0) return undefined\n try {\n const parsed: unknown = JSON.parse(value)\n if (!Array.isArray(parsed) || parsed.length !== 2\n || typeof parsed[0] !== 'string' || parsed[0].length === 0\n || typeof parsed[1] !== 'string' || parsed[1].length === 0) return undefined\n return { provider: parsed[0], model: parsed[1] }\n } catch {\n return undefined\n }\n}\n\n/** 将完整模型目录展平为按 provider 连续分组的下拉选项。 */\nexport function buildModelOptions(\n catalog: Record<string, readonly string[]>,\n extras: readonly ModelSelection[] = [],\n): MenuSelectOption[] {\n const options: MenuSelectOption[] = [{ value: '', label: '(不设置,继承默认)' }]\n const seen = new Set<string>()\n const add = (provider: string, model: string): void => {\n if (provider.length === 0 || model.length === 0) return\n const value = modelChoiceValue(provider, model)\n if (seen.has(value)) return\n seen.add(value)\n options.push({ value, label: model, group: provider })\n }\n\n for (const [provider, models] of Object.entries(catalog)) {\n if (!Array.isArray(models)) continue\n for (const model of models) {\n if (typeof model === 'string') add(provider, model)\n }\n }\n for (const selection of extras) add(selection.provider, selection.model)\n return options\n}\n\n/**\n * 思维程度选项:只展示该 provider/model 路由真实声明的档位。\n *\n * - 目录未收录 / 尚未查到(known=false):返回空列表,UI 不展示档位选择,也不用固定\n * 列表伪造能力(M-12)。\n * - 查过但不提供推理档位(known=true, efforts 空):同样返回空列表。\n * - 已保存但不在目录中的值:保留为唯一可选项并标注,用户切换界面后仍然可回显,\n * 不会因为目录缺项把存量值吞掉。\n *\n * @param view 该路由的推理元数据视图(来自 store.modelReasoning)。\n * @param current 当前生效的档位值(会话选择 / 插件参数),空字符串表示未设置。\n */\nexport function buildEffortOptions(view: ModelReasoningView | undefined, current: string): MenuSelectOption[] {\n const known = view?.known === true\n const declared = known && Array.isArray(view.efforts) ? view.efforts : []\n const options: MenuSelectOption[] = []\n const seen = new Set<string>()\n for (const effort of declared) {\n if (typeof effort?.id !== 'string' || effort.id.length === 0 || seen.has(effort.id)) continue\n seen.add(effort.id)\n const label = typeof effort.name === 'string' && effort.name.length > 0 ? effort.name : effort.id\n options.push({ value: effort.id, label })\n }\n if (current.length > 0 && !seen.has(current)) {\n options.push({ value: current, label: `${current}(当前值,模型未声明)` })\n }\n if (options.length > 0 && current.length === 0 && !options.some((option) => option.value === '')) {\n options.unshift({ value: '', label: '(模型默认)' })\n }\n return options\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { SettingsPathOpView } from '@deepseek-ai/dsh-api-remotes/client'\nimport type { ConfigForm, ConfigFormSnapshot } from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type { EngineMeta, PromptConfigDraft } from '../prompt-tool-types.ts'\nimport type { PromptToolHostApi } from './host-api.ts'\nimport type { PresetModuleFacts } from '../../shared/engine-capabilities.ts'\nimport type { SkillCatalogEntry, SkillContentSnapshot, SkillPolicyChange } from '../../shared/skills.ts'\nimport { bridgeCall, errorMessage, type BridgeResult, type BridgeSettingsView } from './bridge-client.ts'\nimport { requestSkillImport, type ConfirmSkillOverwrite } from './skill-import.ts'\nimport { createSessionPresetFollower, type SessionPresetFollower } from './session-preset-follow.ts'\nimport {\n EMPTY_FIELDS,\n EMPTY_META,\n type Fields,\n type HostDefaultModel,\n} from './prompt-tool-fields.ts'\nimport { bridgeViewFromBoot, fieldsFromView, mergePresetParams, skillFieldsFromSnapshot, withConfigFieldSources } from './prompt-tool-view.ts'\nimport { stripConfigFieldSources } from '../../shared/managed-config-fields.ts'\nimport {\n EMPTY_SWITCHES,\n deepEqual,\n hasPendingVariableRows,\n promptConfigsDirty,\n shouldReloadAfterParamSave,\n shouldReloadAfterPresetSave,\n snapshotSwitches,\n switchesEqual,\n type SwitchSnapshot,\n} from './dirty-state.ts'\nimport { instructionFileIdOf, isContentAsset, isPresetCard, liftContentText, stripContentText } from './prompt-config-content.ts'\nimport {\n applySaveOutcomes,\n EMPTY_INSTRUCTION_POOL,\n instructionSaveRequest,\n isCurrentInstructionSeq,\n isInstructionConflictCode,\n markDraftSaving,\n poolFromSnapshot,\n resetDraftFromSnapshot,\n saveableInstructionDrafts,\n setDraftContent,\n switchInstructionContext,\n unsavedInstructionDrafts,\n type InstructionDraftPool,\n type InstructionSaveOutcome,\n} from './instruction-drafts.ts'\nimport {\n EMPTY_INSTRUCTION_POLICY_SNAPSHOT,\n instructionPolicyPatchForFile,\n resolveInstructionFilePolicy,\n} from './instruction-policy.ts'\nimport type { InstructionPolicyFileOverride, InstructionPolicyPatch, InstructionPolicySnapshot } from '../../shared/instructions.ts'\nimport { buildParamOverrides, isCurrentPresetDraft, readParamOverridesPatch, updateLoadedParamKeys } from './param-overrides.ts'\nimport { createSerialTaskQueue } from './save-queue.ts'\nimport { createWorkspaceDrafts, hasWorkspaceDrafts, type WorkspaceDrafts } from './workspace-drafts.ts'\nimport { modelChoiceValue } from '../features/models/model-options.ts'\nimport type { ModelReasoningView } from '../../shared/bridge-contract.ts'\n\n/** 官方 ConfigForms 共享镜像传输面:标准字段共用宿主读写队列。 */\nexport interface PromptToolSettingsTransport {\n /** 宿主注册的 prompt-tool settings namespace 绑定。 */\n scope: ConfigForm<Record<string, unknown>>\n /** 触发一次共享 describe mirror 读取(idle 时才真正发 RPC)。 */\n ensure: () => Promise<void>\n /** 批量 path-op 写入;成功后 scope 快照已 fold 最新 revision。 */\n mutate: (ops: SettingsPathOpView[], expectedRevision?: number) => Promise<void>\n}\n\nexport type SwitchKey = 'firstTurnAnchor' | 'firstTurnCustom' | 'guideCustom' | 'injectPrompt' | 'instructionHint' | 'writePreset'\n\n/** 参数类布尔开关:写激活预设 preset.yml(settings 只留全局开关)。 */\nconst PARAM_SWITCH_KEYS: ReadonlySet<SwitchKey> = new Set(['firstTurnAnchor', 'firstTurnCustom', 'guideCustom', 'injectPrompt', 'instructionHint'])\n\n/** 预设切换/首次加载期间写盘拒绝提示:写盘会持续拒绝,直到该预设数据成功应用。 */\nconst PRESET_PENDING_MESSAGE = '预设数据尚未加载完成,本次修改未保存;请稍后重试或重新打开工作台'\n\nexport interface PromptToolStore {\n editorDrafts: WorkspaceDrafts\n api: PromptToolHostApi\n fields: Fields\n /** fields 外部订阅通道(usePromptToolFields):patch/load 变更后通知。\n * getFields 返回引用稳定快照,selector 化的组件据此跳过无关重渲染。 */\n getFields: () => Fields\n subscribeFields: (listener: () => void) => () => void\n /** 参数草稿外部订阅通道:同一参数的多个镜像渲染点据此同步未完成的数字输入与错误态。\n * 草稿本身仍只有一份(`editorDrafts.fields`),这里只广播修订号,不引入第二份状态。 */\n getDraftRevision: () => number\n subscribeDrafts: (listener: () => void) => () => void\n /** 草稿池写入后调用:镜像控件一起重渲染,读同一草稿键。 */\n publishDrafts: () => void\n meta: EngineMeta\n loading: boolean\n modelCatalog: Record<string, string[]>\n /** provider/model 路由的推理档位元数据(按 modelChoiceValue 键);未查到 = known:false。 */\n modelReasoning: Record<string, ModelReasoningView>\n /** 按需查询某路由的推理档位(结果进 modelReasoning;失败静默保持未查到)。 */\n ensureModelReasoning: (provider: string, model: string) => void\n hostDefaultModel?: HostDefaultModel\n moduleFacts?: PresetModuleFacts\n /** 当前预设模板消息批层(pre-step)配置数;0 = 模板无配置(入口开关联动关闭)。 */\n templatePreStepCount: number\n savedSwitches: SwitchSnapshot\n savedConfigs: PromptConfigDraft[]\n /** 指令文件草稿池:正文/版本/读取状态按 fileId 索引,跨预设保留。 */\n instructionPool: InstructionDraftPool\n /** 草稿池读取(回调里读最新值,不依赖渲染快照)。 */\n getInstructionPool: () => InstructionDraftPool\n /** 存在未保存的指令文件草稿(预设保存不覆盖它们)。 */\n dirtyInstructions: boolean\n /** 显式保存指令文件(不传 fileIds = 保存全部可写文件);只提交已改动、可写、上下文匹配的文件。 */\n persistInstructionFiles: (fileIds?: readonly string[]) => Promise<boolean>\n /** 重新读取单个指令文件并丢弃本地草稿(版本冲突时使用)。 */\n reloadInstructionFile: (fileId: string) => Promise<void>\n /** 指令卡策略快照(独立存储):error 非空时 UI 禁用策略编辑。 */\n instructionPolicy: InstructionPolicySnapshot\n /** 策略快照读取(回调里读最新值,不依赖渲染快照)。 */\n getInstructionPolicy: () => InstructionPolicySnapshot\n /** 写单个文件的行为策略(null = 删除覆盖、恢复默认);带 revision 乐观并发。 */\n updateInstructionPolicy: (fileId: string, override: InstructionPolicyFileOverride | null) => Promise<boolean>\n /** 独立来源总开关:仅写策略顶层 enabled,不改变官方负责人或单文件覆盖。 */\n setInstructionSourceEnabled: (enabled: boolean) => Promise<boolean>\n /** 技能资产写入忙碌态(复制导入 / 创建 / 删除)。 */\n skillsBusy: boolean\n notice: string\n noticeKind: 'ok' | 'error'\n load: () => Promise<Fields>\n showNotice: (kind: 'ok' | 'error', message: string) => void\n patch: (partial: Partial<Fields>) => void\n /** 保存全局开关与技能顺序/rank;返回两个通道是否都成功(失败字段保持 dirty)。 */\n persistSwitches: (onSaved?: () => void) => Promise<boolean>\n persistParamOverrides: () => Promise<void>\n /** 保存提示词配置;返回 false 表示未写入(预设切换中、跨预设旧草稿或失败)。 */\n persistConfigs: (configs: PromptConfigDraft[], options?: { reload?: boolean; rebuild?: boolean; includeInstructions?: boolean }) => Promise<boolean>\n /** 规则声明复用预设队列;实际执行时复核目标预设与已加载身份。 */\n enqueuePresetTask: <T>(presetId: string, task: () => Promise<T>) => Promise<T>\n /** 预设级模板变量(preset.yml 内容变量;writePreset 展开进 variables.yml,引擎合并进每条配置)。 */\n templateVariables: Record<string, string>\n setTemplateVariables: (value: Record<string, string>) => void\n /** 模板变量插值开关(preset.yml 顶层 variablesEnabled,缺省 true)。 */\n templateVariablesEnabled: boolean\n setTemplateVariablesEnabled: (value: boolean) => void\n /** 保存模板变量;可显式传入下一份值与开关状态(避免 setState 未生效时的旧闭包)。 */\n saveTemplateVariables: (next?: Record<string, string>, enabled?: boolean) => Promise<boolean>\n toggle: (key: SwitchKey) => void\n setPresetTemplate: (id: string) => void\n createEngineCapability: (action: 'create' | 'create-recipe', id: string) => Promise<boolean>\n removeEngineCapability: (id: string) => Promise<boolean>\n /** 从宿主机目录复制导入到用户技能根。 */\n importSkillsDirectory: (path: string, confirm?: ConfirmSkillOverwrite) => Promise<boolean>\n /** 只刷新技能事实,不重读预设或覆盖其它草稿。 */\n refreshSkills: () => Promise<boolean>\n /** 创建标准技能到用户技能根。 */\n createSkill: (input: { name: string; description: string; content: string }) => Promise<boolean>\n readSkill: (skill: SkillCatalogEntry, sessionId: string | undefined) => Promise<BridgeResult<SkillContentSnapshot>>\n saveSkill: (skill: SkillCatalogEntry, content: string, description: string, expectedRevision: string, sessionId: string | undefined) => Promise<BridgeResult<SkillContentSnapshot>>\n /** 按准确文件身份删除服务端允许管理的技能。 */\n deleteSkill: (skill: Pick<SkillCatalogEntry, 'name' | 'path'>) => Promise<boolean>\n /** 开关只提交 side/enabled;完整 scope 仅供明确的双端操作。失败保持已读取事实。 */\n setSkillPolicy: (name: string, path: string, change: SkillPolicyChange) => Promise<boolean>\n /** 添加 / 移除引用的技能文件夹(只记引用,不复制文件)。 */\n patchSkillFolders: (folders: string[]) => Promise<boolean>\n /** 打开用户技能根。 */\n openSkillsDir: (path?: string) => Promise<void>\n dirtySwitches: boolean\n dirtyConfigs: boolean\n dirty: boolean\n}\n\n\n/** 等待共享 mirror 的首次应答离开 loading(ready/idle/unavailable 都会返回)。 */\nfunction waitForScope(scope: ConfigForm<Record<string, unknown>>): Promise<ConfigFormSnapshot<Record<string, unknown>>> {\n const current = scope.getSnapshot()\n if (current.status !== 'loading') return Promise.resolve(current)\n return new Promise((resolve) => {\n let settled = false\n const dispose = scope.subscribe(() => {\n const next = scope.getSnapshot()\n if (next.status === 'loading') return\n if (settled) return\n settled = true\n dispose()\n resolve(next)\n })\n // 宿主 mirror 卡 loading 时兜底超时,避免 UI 永久 loading。\n setTimeout(() => {\n if (settled) return\n settled = true\n dispose()\n resolve(scope.getSnapshot())\n }, 5000)\n })\n}\n\n/**\n * 把文件草稿状态贴到指令文件卡上(视图元数据,不写进 preset.yml)。\n * 卡片正文以草稿池为准:服务端附带的 params.text 不再是文件正文的来源。\n */\nfunction withInstructionState(\n configs: PromptConfigDraft[],\n pool: InstructionDraftPool,\n policy: InstructionPolicySnapshot,\n): PromptConfigDraft[] {\n return configs.map((config) => {\n const fileId = instructionFileIdOf(config)\n if (fileId === undefined) return config\n // 行为字段来自独立策略(不是预设卡字段),文件卡的显隐/顺序/位置等以它为准。\n const resolved = resolveInstructionFilePolicy(policy.policy, fileId)\n const draft = pool.drafts.find((entry) => entry.fileId === fileId)\n if (draft === undefined) {\n // 卡存在但没有对应快照:不把未知正文当空文件,直接禁用保存。\n return {\n ...config,\n ...policyFields(resolved),\n text: '',\n contentStatus: 'unreadable' as const,\n contentMessage: '未读取到该文件正文,已禁用保存',\n }\n }\n const message = draft.error ?? draft.message\n return {\n ...config,\n ...policyFields(resolved),\n text: draft.content,\n contentStatus: draft.status,\n // 视图字段显式覆盖:池里冲突/提示已清除时卡片不得留上一帧的旧标记。\n contentMessage: message,\n contentDirty: draft.content !== draft.savedContent,\n contentConflict: draft.conflict === true ? true : undefined,\n // 负责人冲突是会话级事实(服务端观察),不是文件自身状态:只在确认冲突时显示。\n contentOwnerConflict: pool.owner?.officialInstructions === true ? true : undefined,\n contentSaving: draft.saving === true ? true : undefined,\n }\n })\n}\n\n/** 策略值 → 卡片行为字段(文件卡的行为不来自 preset.yml)。 */\nfunction policyFields(\n resolved: { order: number; position: string; promotion: string; audience: string | null; modelScope: string; enabled: boolean; name?: string },\n): Partial<PromptConfigDraft> {\n return {\n enabled: resolved.enabled,\n order: resolved.order,\n position: resolved.position,\n promotion: resolved.promotion,\n audience: resolved.audience,\n modelScope: resolved.modelScope,\n ...(resolved.name === undefined ? {} : { name: resolved.name }),\n }\n}\n\nexport function usePromptToolStore(api: PromptToolHostApi, settings: PromptToolSettingsTransport): PromptToolStore {\n const editorDrafts = useRef(createWorkspaceDrafts()).current\n const [modelCatalog, setModelCatalog] = useState<Record<string, string[]>>({})\n const [modelReasoning, setModelReasoning] = useState<Record<string, ModelReasoningView>>({})\n const [hostDefaultModel, setHostDefaultModel] = useState<HostDefaultModel | undefined>(undefined)\n const [moduleFacts, setModuleFacts] = useState<PresetModuleFacts | undefined>(undefined)\n const [fields, setFields] = useState<Fields>(EMPTY_FIELDS)\n const [meta, setMeta] = useState<EngineMeta>(EMPTY_META)\n const [templatePreStepCount, setTemplatePreStepCount] = useState(0)\n const [savedSwitches, setSavedSwitches] = useState<SwitchSnapshot>(EMPTY_SWITCHES)\n const [savedConfigs, setSavedConfigsState] = useState<PromptConfigDraft[]>([])\n const savedConfigsRef = useRef<PromptConfigDraft[]>([])\n const setSavedConfigs = useCallback((next: PromptConfigDraft[]) => {\n savedConfigsRef.current = next\n setSavedConfigsState(next)\n }, [])\n const [instructionPool, setInstructionPool] = useState<InstructionDraftPool>(EMPTY_INSTRUCTION_POOL)\n const [instructionPolicy, setInstructionPolicy] = useState<InstructionPolicySnapshot>(EMPTY_INSTRUCTION_POLICY_SNAPSHOT)\n const [templateVariables, setTemplateVariablesState] = useState<Record<string, string>>({})\n const templateVariablesRef = useRef<Record<string, string>>({})\n const savedTemplateVariablesRef = useRef<Record<string, string>>({})\n const [templateVariablesEnabled, setTemplateVariablesEnabled] = useState(true)\n const [loading, setLoading] = useState(false)\n const [skillsBusy, setSkillsBusy] = useState(false)\n // ref 同步守卫覆盖按钮、Enter 与浏览器导入,React disabled 尚未渲染时也不会重复提交。\n const skillWriteRef = useRef(false)\n const [notice, setNotice] = useState('')\n const [noticeKind, setNoticeKind] = useState<'ok' | 'error'>('ok')\n const fieldsRef = useRef<Fields>(EMPTY_FIELDS)\n /** fields 订阅者集合:patch/load 每次产生新 fields 引用时广播。\n * ponytail: 单订阅通道(无 selector 缓存层),selector 在消费侧 useRef 缓存。 */\n const fieldsListenersRef = useRef(new Set<() => void>())\n const publishFields = useCallback((next: Fields) => {\n fieldsRef.current = next\n setFields(next)\n for (const listener of fieldsListenersRef.current) listener()\n }, [])\n const getFields = useCallback(() => fieldsRef.current, [])\n const subscribeFields = useCallback((listener: () => void) => {\n fieldsListenersRef.current.add(listener)\n return () => { fieldsListenersRef.current.delete(listener) }\n }, [])\n /** 参数草稿广播:未完成的数字输入与错误态按同一草稿键在镜像控件之间同步。\n * 草稿池是可变 Map(不触发 React 重渲染),因此写入方显式发布修订号;\n * 这是既有 subscribeFields 的同一模式,不是第二份状态或事件总线。 */\n const draftListenersRef = useRef(new Set<() => void>())\n const draftRevisionRef = useRef(0)\n const getDraftRevision = useCallback(() => draftRevisionRef.current, [])\n const publishDrafts = useCallback(() => {\n draftRevisionRef.current += 1\n for (const listener of draftListenersRef.current) listener()\n }, [])\n const subscribeDrafts = useCallback((listener: () => void) => {\n draftListenersRef.current.add(listener)\n return () => { draftListenersRef.current.delete(listener) }\n }, [])\n /** 指令文件草稿池(独立于 fields):patch/保存/重新读取都经此发布。 */\n const instructionPoolRef = useRef<InstructionDraftPool>(EMPTY_INSTRUCTION_POOL)\n const instructionPolicyRef = useRef<InstructionPolicySnapshot>(EMPTY_INSTRUCTION_POLICY_SNAPSHOT)\n const instructionSeqRef = useRef(0)\n /** 上一次指令上下文对应的会话 id:变化即建立新上下文(旧草稿保留但不可写)。 */\n const instructionSessionRef = useRef<string | undefined>(undefined)\n const publishInstructions = useCallback((next: InstructionDraftPool) => {\n instructionPoolRef.current = next\n setInstructionPool(next)\n }, [])\n /** 卡片是草稿池的派生视图:池变化后同步正文与状态,避免界面停留旧版本。 */\n const syncInstructionCards = useCallback((pool: InstructionDraftPool) => {\n const current = fieldsRef.current\n publishFields({ ...current, promptConfigs: withInstructionState(current.promptConfigs, pool, instructionPolicyRef.current) })\n }, [publishFields])\n const publishInstructionPolicy = useCallback((next: InstructionPolicySnapshot) => {\n instructionPolicyRef.current = next\n setInstructionPolicy(next)\n }, [])\n const revisionRef = useRef<number | undefined>(undefined)\n const saveQueueRef = useRef(createSerialTaskQueue())\n const presetSaveQueueRef = useRef(createSerialTaskQueue())\n const loadSeqRef = useRef(0)\n const skillsSeqRef = useRef(0)\n const skillsSessionRef = useRef<string | undefined>(undefined)\n /** 用户草稿版本:patch 时递增。load 应答返回时若版本变化,跳过覆盖,避免\n * 保存后的静默刷新吞掉用户在读取期间的编辑。 */\n const draftVersionRef = useRef(0)\n const setTemplateVariables = useCallback((next: Record<string, string>) => {\n draftVersionRef.current += 1\n templateVariablesRef.current = next\n setTemplateVariablesState(next)\n }, [])\n /** 已成功应用快照的预设 id:与当前 fields.presetTemplate 不一致时(切换/加载进行中)\n * 拒绝写盘,避免旧预设字段被当成当前预设数据写进新预设。 */\n const loadedPresetRef = useRef<string | undefined>(undefined)\n const enqueuePresetTask = useCallback(<T,>(presetId: string, task: () => Promise<T>): Promise<T> => presetSaveQueueRef.current.enqueue(async () => {\n if (fieldsRef.current.presetTemplate !== presetId || loadedPresetRef.current !== presetId) throw new Error(PRESET_PENDING_MESSAGE)\n return task()\n }), [])\n /** 会话预设跟随器:跨检查只保留「写盘进行中」与「已提示过的 id」。 */\n const presetFollowerRef = useRef<SessionPresetFollower | undefined>(undefined)\n if (presetFollowerRef.current === undefined) presetFollowerRef.current = createSessionPresetFollower()\n /** 跟随检查入口:load 结束时也调用一次(用 ref 打破 load ↔ 跟随的依赖环)。 */\n const followCheckRef = useRef<() => void>(() => {})\n /** applyView 自动预选的 provider:无模型名时不作为用户显式参数落盘。 */\n const autoModelProviderRef = useRef<string | undefined>(undefined)\n const autoSubagentModelProviderRef = useRef<string | undefined>(undefined)\n /** 最近一次 load 时 preset.yml params 现有键集:persist 只发送「已有键或已改动」,\n * 未动过的键不写——避免 UI 默认值固化覆盖模板 moduleConfigs 默认。 */\n const loadedKeysRef = useRef<Set<string>>(new Set())\n const paramBaselineRef = useRef<SwitchSnapshot>(EMPTY_SWITCHES)\n\n const showNotice = useCallback((kind: 'ok' | 'error', message: string) => {\n setNotice(message)\n setNoticeKind(kind)\n }, [])\n\n /** 模型目录惰性加载:独立于主 load(/describe 不再阻塞等模型查询)。 */\n /** 模型目录:默认走 10 分钟缓存;refresh=true 时请求宿主越过 TTL 重新查询。 */\n const loadModels = useCallback(async (refresh = false): Promise<void> => {\n const res = refresh ? await bridgeCall('models', { refresh: true }) : await bridgeCall('models')\n if (res.ok) setModelCatalog(res.value.modelCatalog ?? {})\n }, [])\n\n /** 已发起过查询的路由键:避免同一路由随每次渲染重复请求(结果无论成败都不重发)。 */\n const reasoningRequestedRef = useRef(new Set<string>())\n const ensureModelReasoning = useCallback((provider: string, model: string): void => {\n if (provider.length === 0 || model.length === 0) return\n const key = modelChoiceValue(provider, model)\n if (reasoningRequestedRef.current.has(key)) return\n reasoningRequestedRef.current.add(key)\n void (async () => {\n const res = await bridgeCall('modelReasoning', { provider, model })\n // 未查到(失败/超时/未注册):保持「未查到」,不写入空档位,UI 不虚构选项。\n if (!res.ok) return\n setModelReasoning((previous) => ({ ...previous, [key]: res.value.reasoning }))\n })()\n }, [])\n\n const applyView = useCallback((res: BridgeResult<BridgeSettingsView>, skillsSeq: number): Fields => {\n setTemplatePreStepCount(res.ok && typeof res.templatePreStepCount === 'number' ? res.templatePreStepCount : 0)\n setModelCatalog(res.ok ? res.modelCatalog ?? {} : {})\n setHostDefaultModel(res.ok ? res.hostDefaultModel : undefined)\n setModuleFacts(res.ok ? res.moduleFacts : undefined)\n const next = mergePresetParams(fieldsFromView(res), res.ok ? res.presetParams : undefined)\n if (skillsSeq !== skillsSeqRef.current) {\n const current = fieldsRef.current\n Object.assign(next, { skillCatalog: current.skillCatalog, skillsComplete: current.skillsComplete, skillFolders: current.skillFolders, skillsRoot: current.skillsRoot })\n }\n // 检测到 DeepSeek 路由且用户未设置服务商时,直接预选第一个检测到的 provider\n // (模型名为空则路由不激活,继承主会话语义不变;用户后续选择模型名即生效)。\n // 自动预选值记录到 ref:它只是显示兜底,不作为用户显式参数写进 preset.yml。\n autoModelProviderRef.current = undefined\n if (res.ok && next.modelProvider === '' && (res.providers?.length ?? 0) > 0) {\n autoModelProviderRef.current = res.providers![0]!\n next.modelProvider = autoModelProviderRef.current\n }\n // 子代理服务商同样预选:模型名为空则固定路由不激活(继承主会话),仅让模型名下拉有候选。\n autoSubagentModelProviderRef.current = undefined\n if (res.ok && next.subagentModelProvider === '' && (res.providers?.length ?? 0) > 0) {\n autoSubagentModelProviderRef.current = res.providers![0]!\n next.subagentModelProvider = autoSubagentModelProviderRef.current\n }\n publishFields(next)\n setSavedSwitches(snapshotSwitches(next))\n setSavedConfigs(next.promptConfigs)\n // revision 只在首次建立,后续由 enqueueSave 的 mutate 应答维护——/bootstrap 的\n // descriptor 有 30s 服务端缓存,用其 revision 倒退会导致下一次保存 409。\n if (res.ok && revisionRef.current === undefined) revisionRef.current = res.value.revision\n return next\n }, [])\n\n const load = useCallback(async (options?: { silent?: boolean; presetConfigs?: PromptConfigDraft[] }) => {\n // 并发保护:慢的旧请求不得覆盖新请求(last-good 语义保留旧数据)。\n const seq = ++loadSeqRef.current\n const skillsSeq = skillsSeqRef.current\n const draftVersion = draftVersionRef.current\n const samePreset = loadedPresetRef.current === fieldsRef.current.presetTemplate\n const localConfigs = fieldsRef.current.promptConfigs.filter(isPresetCard)\n // 读取保护也覆盖“请求开始前”已有的草稿;不能只检查 await 期间的版本变化。\n const retainedConfigs = options?.presetConfigs ?? (samePreset && !deepEqual(localConfigs, savedConfigsRef.current.filter(isPresetCard)) ? localConfigs : undefined)\n const retainVariables = samePreset && !deepEqual(templateVariablesRef.current, savedTemplateVariablesRef.current)\n const sessionId = api.currentSessionId()\n // silent:保存后静默刷新(不闪 loading、避免重渲染风暴与滚动跳动);失败仍报错。\n if (!options?.silent) setLoading(true)\n try {\n // /bootstrap 聚合读取:meta + describe runtime facts + 参数覆盖 + 模板变量 +\n // 实际生效配置一次取回(此前 5 端点串行,preset.yml 每端点读盘解析)。\n // 带当前会话 id:服务端据此解析该本地 Agent 的工作区,返回对应指令文件快照。\n // 会话/工作区切换:建立新的指令上下文。草稿保留但旧上下文不可写,未保存的文件\n // 与版本在切换到新工作区后必须重新读取校验,防止把 A 的正文写进 B 的文件集。\n if (sessionId !== instructionSessionRef.current) {\n instructionSessionRef.current = sessionId\n publishInstructions(switchInstructionContext(instructionPoolRef.current, ++instructionSeqRef.current))\n publishFields({ ...fieldsRef.current, promptConfigs: fieldsRef.current.promptConfigs.filter((config) => instructionFileIdOf(config) === undefined) })\n }\n const instructionSnapshot = instructionPoolRef.current\n const policySnapshot = instructionPolicyRef.current\n const boot = await bridgeCall('bootstrap', sessionId === undefined ? {} : { sessionId })\n if (seq !== loadSeqRef.current || sessionId !== api.currentSessionId()) return EMPTY_FIELDS\n // 读取期间用户已修改草稿:不应用服务端快照覆盖,保留草稿;后续保存/读取再同步。\n if (draftVersionRef.current !== draftVersion) return fieldsRef.current\n if (!boot.ok) {\n showNotice('error', '读取配置失败:' + (boot.message ?? 'bootstrap unavailable'))\n return EMPTY_FIELDS\n }\n // 两次读取都完成后才应用快照;任何 await 期间的新上下文/草稿/文件结果优先。\n const policyRes = await bridgeCall('instructionsPolicy')\n if (seq !== loadSeqRef.current || sessionId !== api.currentSessionId()) return EMPTY_FIELDS\n if (draftVersionRef.current !== draftVersion || instructionPoolRef.current !== instructionSnapshot) return fieldsRef.current\n if (boot.meta !== undefined) setMeta(boot.meta.meta)\n // /bootstrap 已携带 settings descriptor(value/base/revision):直接作为 fields\n // 主源,不再 await settings.ensure()——宿主全量 describe mirror 是切换预设后\n // 配置卡十几秒才出现的瓶颈。\n const res = bridgeViewFromBoot(boot)\n applyView(res, skillsSeq)\n if (skillsSeq === skillsSeqRef.current) skillsSessionRef.current = sessionId\n // 用户参数覆盖(激活预设 preset.yml params;settings 不再承载参数)。\n if (boot.ok && boot.overrides !== undefined) {\n const o = boot.overrides.overrides\n loadedKeysRef.current = new Set(Object.keys(o))\n const paramPatch = readParamOverridesPatch(o)\n if (Object.keys(paramPatch).length > 0) {\n const next = { ...fieldsRef.current, ...paramPatch }\n publishFields(next)\n setSavedSwitches(snapshotSwitches(next))\n }\n }\n // 指令文件(独立来源):正文、身份、版本、读取状态来自同一次读取。\n if (boot.ok && boot.instructions !== undefined) {\n publishInstructions(poolFromSnapshot(boot.instructions, ++instructionSeqRef.current, instructionPoolRef.current))\n // 切到别的工作区后,未保存草稿的文件可能已不在当前可见范围:保留草稿,但要说清楚。\n const visible = new Set(boot.instructions.files.map((file) => file.fileId))\n const stranded = unsavedInstructionDrafts(instructionPoolRef.current).filter((draft) => !visible.has(draft.fileId))\n if (stranded.length > 0) {\n showNotice('error', `有 ${stranded.length} 个未保存的指令文件草稿不在当前工作区(${stranded.map((draft) => draft.displayPath).join('、')}),已保留;切回原工作区后可继续保存`)\n }\n }\n // 指令卡策略(独立存储,默认禁用):读失败时明确标记,UI 据此禁用策略编辑。\n const policyValue = policyRes.ok ? policyRes.value : undefined\n // 响应缺少策略快照(老宿主/异常载荷)不得当成「空策略」放开编辑。\n if (instructionPolicyRef.current === policySnapshot) publishInstructionPolicy(policyValue?.policy === undefined\n ? { ...EMPTY_INSTRUCTION_POLICY_SNAPSHOT, error: `未读取到指令策略:${policyRes.ok ? '响应缺少策略快照' : policyRes.message ?? 'settings bridge unavailable'}` }\n : {\n policy: policyValue.policy,\n revision: policyValue.revision ?? null,\n exists: policyValue.exists === true,\n ...(policyValue.error === undefined ? {} : { error: policyValue.error }),\n })\n // 预设级模板变量(preset.yml 内容变量;失败不阻断主流程)。\n if (boot.ok && boot.variables !== undefined) {\n savedTemplateVariablesRef.current = boot.variables.variables\n if (!retainVariables) {\n templateVariablesRef.current = boot.variables.variables\n setTemplateVariablesState(boot.variables.variables)\n }\n setTemplateVariablesEnabled(boot.variables.enabled !== false)\n }\n // 实际生效配置(引擎从生成目录加载;settings.promptConfigs 仅为覆盖层,\n // 默认为空不代表无配置)。非空时以实际配置为准,并同步已保存快照避免误判 dirty。\n if (boot.ok && boot.promptConfigs !== undefined\n && Array.isArray(boot.promptConfigs.promptConfigs) && boot.promptConfigs.promptConfigs.length > 0) {\n // 引擎自动生成的模型参数配置(model-params / subagent-model-params)由\n // 「模型设置」卡片管理,不进入模块列表(避免重复编辑入口)。\n const engineGenerated = new Set(['model-params', 'subagent-model-params'])\n const userConfigs = boot.promptConfigs.promptConfigs.filter((config) => !engineGenerated.has(config.id))\n // 内容资产条目(prompt-injector / instruction-hint):params.text(生成目录文件渲染产物)\n // 提升到 text 框显示,编辑入口统一为模块卡片。\n const actual = withInstructionState(userConfigs.map(withConfigFieldSources).map(liftContentText), instructionPoolRef.current, instructionPolicyRef.current)\n const next = { ...fieldsRef.current, promptConfigs: actual }\n publishFields(next)\n setSavedConfigs(actual)\n }\n if (retainedConfigs !== undefined) {\n const refreshed = new Map(fieldsRef.current.promptConfigs.map((config) => [config.id, config.fieldSources]))\n const restored = [...retainedConfigs.map((config) => withConfigFieldSources({ ...config, fieldSources: refreshed.get(config.id) })), ...fieldsRef.current.promptConfigs.filter((config) => !isPresetCard(config))]\n publishFields({ ...fieldsRef.current, promptConfigs: restored })\n // 明确保存的定义是权威应答;生成目录的暂时空快照不能让新卡消失。\n if (options?.presetConfigs !== undefined) setSavedConfigs(restored)\n }\n // 快照已完整应用:该预设自此可写(切换/首次加载期间由 loadedPresetRef 拦截写盘)。\n loadedPresetRef.current = fieldsRef.current.presetTemplate\n paramBaselineRef.current = snapshotSwitches(fieldsRef.current)\n setNotice('')\n // 加载完成后补一次会话预设检查:工作台打开时会话可能已经运行在别的预设上\n // (官方侧切换发生在订阅建立之前,不会有投影通知)。\n followCheckRef.current()\n return fieldsRef.current\n } catch (error) {\n if (seq === loadSeqRef.current && sessionId === api.currentSessionId() && draftVersionRef.current === draftVersion) showNotice('error', '读取失败:' + errorMessage(error))\n return EMPTY_FIELDS\n } finally {\n if (seq === loadSeqRef.current && !options?.silent) setLoading(false)\n }\n }, [api, applyView, publishInstructionPolicy, publishInstructions, settings, showNotice])\n\n // 挂载即后台拉取模型目录(不阻塞工作台首屏;10min 缓存兜底重复打开)。\n useEffect(() => {\n void loadModels()\n }, [loadModels])\n\n // 会话 id 晚于工作台首次打开就绪时(页面加载、会话恢复)补一次加载。\n // ui-session 的作用域绑定要等主视图 retain 该会话之后才有值(官方 publishMain\n // 以 retainedBy.mainView > 0 为准),否则首屏会一直停在「只有全局文件」的范围,\n // 直到用户关掉工作台重开。\n useEffect(() => api.subscribeSessionChange(() => { void load() }), [api, load])\n\n // 目录就绪后补查当前可见路由的推理档位(会话选择 / 预设主模型 / 子代理模型 / 宿主默认)。\n // 只查这几条可见路由:不遍历整个目录,也不把目录当授权白名单。\n useEffect(() => {\n reasoningRequestedRef.current.clear()\n const current = fieldsRef.current\n const face = api.sessionModel.snapshot()\n const sessionSelection = face.selection\n const routes: Array<{ provider?: string; model?: string }> = [\n { provider: sessionSelection?.provider, model: sessionSelection?.model },\n { provider: current.modelProvider, model: current.modelName },\n { provider: current.subagentModelProvider, model: current.subagentModelName },\n { provider: hostDefaultModel?.provider, model: hostDefaultModel?.model },\n ]\n for (const route of routes) {\n if (route.provider !== undefined && route.model !== undefined) {\n ensureModelReasoning(route.provider, route.model)\n }\n }\n }, [api, ensureModelReasoning, hostDefaultModel?.model, hostDefaultModel?.provider, modelCatalog])\n\n const refreshRevision = useCallback(async () => {\n try {\n await settings.ensure()\n const snapshot = await waitForScope(settings.scope)\n if (snapshot.revision !== undefined) revisionRef.current = snapshot.revision\n } catch {\n // 刷新失败保持原 revision,用户可重试。\n }\n }, [settings])\n\n const patch = useCallback((partial: Partial<Fields>) => {\n draftVersionRef.current += 1\n let next = { ...fieldsRef.current, ...partial }\n // 文件卡正文镜像进文件草稿池:预设保存不承载它们,文件只能经显式保存写盘。\n if (Array.isArray(partial.promptConfigs)) {\n let pool = instructionPoolRef.current\n for (const config of partial.promptConfigs) {\n const fileId = instructionFileIdOf(config)\n if (fileId === undefined || typeof config.text !== 'string') continue\n const draft = pool.drafts.find((entry) => entry.fileId === fileId)\n if (draft === undefined || draft.content === config.text) continue\n pool = setDraftContent(pool, fileId, config.text)\n }\n if (pool !== instructionPoolRef.current) publishInstructions(pool)\n // 卡片视图(状态徽标、正文)以草稿池为准,避免编辑后状态停在上一帧。\n next = { ...next, promptConfigs: withInstructionState(next.promptConfigs, instructionPoolRef.current, instructionPolicyRef.current) }\n }\n // complete 互斥:官方 complete 段一个 scope 只能有一个,开启任一 enabled 配置的\n // complete 时自动关闭其他 enabled 配置的 complete。disabled 配置不参与(引擎\n // effectiveList 已过滤,不注册即不独占;重新启用时由本次收敛)。顶层人设的\n // complete 不在本数组内,跨层冲突由 settings bridge 写盘前 fail loud。\n if (Array.isArray(next.promptConfigs)) {\n const activeComplete = (config: PromptConfigDraft): boolean => config.enabled !== false && config.params?.complete === true\n const enabledComplete = next.promptConfigs.some(activeComplete)\n if (enabledComplete) {\n const kept = next.promptConfigs.findIndex(activeComplete)\n next = {\n ...next,\n promptConfigs: next.promptConfigs.map((config, index) =>\n index === kept || config.enabled === false\n ? config\n : { ...config, params: { ...config.params, complete: false } }),\n }\n }\n }\n publishFields(next)\n }, [publishFields, publishInstructions])\n\n const enqueueSave = useCallback((ops: SettingsPathOpView[], okMessage: string | undefined, onSaved: () => void, setBusy?: (busy: boolean) => void): Promise<boolean> => {\n setBusy?.(true)\n return saveQueueRef.current.enqueue(async () => {\n try {\n await settings.mutate(ops, revisionRef.current)\n revisionRef.current = settings.scope.getSnapshot().revision\n onSaved()\n if (okMessage) showNotice('ok', okMessage)\n return true\n } catch (error) {\n // settings 注册重建(fiber reload)会把 namespace revision 归零,客户端\n // 持有的版本号随即过期:冲突时重试一次不带 expectedRevision(官方语义 =\n // 不检查并发,last-write-wins),全局开关不会再被过期版本号卡死。\n const message = errorMessage(error)\n if (/expected revision|changed since it was read/i.test(message)) {\n try {\n await settings.mutate(ops)\n revisionRef.current = settings.scope.getSnapshot().revision\n onSaved()\n if (okMessage) showNotice('ok', okMessage)\n return true\n } catch (retryError) {\n await refreshRevision()\n showNotice('error', '保存失败:' + errorMessage(retryError) + '(已刷新配置版本,可重试)')\n }\n } else {\n await refreshRevision()\n showNotice('error', '保存失败:' + message + '(已刷新配置版本,可重试)')\n }\n return false\n } finally {\n setBusy?.(false)\n }\n })\n }, [refreshRevision, settings, showNotice])\n\n /** 全局开关保存:技能状态已不进 settings(调用策略直接写技能文件,走自己的端点)。 */\n const persistSwitches = useCallback((onSaved?: () => void): Promise<boolean> => {\n const savedSnapshot = snapshotSwitches(fieldsRef.current)\n return enqueueSave(\n [\n { op: 'set', path: ['presetOrder'], value: fieldsRef.current.presetOrder },\n { op: 'set', path: ['fallbackText'], value: fieldsRef.current.fallbackText },\n { op: 'set', path: ['writePreset'], value: fieldsRef.current.writePreset },\n ],\n undefined,\n () => {\n setSavedSwitches(savedSnapshot)\n onSaved?.()\n },\n )\n }, [enqueueSave])\n\n /** 参数类设置:写入激活预设 preset.yml(savePresetParams;随预设隔离)。\n * 与提示词配置共用预设队列;请求成功只把「发起时快照」标记为已保存。若用户在请求期间\n * 继续编辑,则跳过静默重载,避免磁盘旧快照覆盖未保存草稿。 */\n const persistParamOverrides = useCallback(async () => {\n const f = fieldsRef.current\n const savedSnapshot = snapshotSwitches(f)\n const draftVersion = draftVersionRef.current\n // 待编辑变量行(空 key)不落盘;此时不重载,避免服务端状态覆盖草稿使编辑行消失。\n const configsWereClean = !promptConfigsDirty(f.promptConfigs, savedConfigs)\n && !hasPendingVariableRows(f.promptConfigs)\n const autoModelProvider = autoModelProviderRef.current\n const autoSubagentModelProvider = autoSubagentModelProviderRef.current\n await presetSaveQueueRef.current.enqueue(async () => {\n // 切换进行中(目标预设数据未应用):参数仍是旧预设值,拒绝写入 presetTemplate。\n if (loadedPresetRef.current !== undefined && loadedPresetRef.current !== fieldsRef.current.presetTemplate) {\n showNotice('error', PRESET_PENDING_MESSAGE)\n return\n }\n if (!isCurrentPresetDraft(f, fieldsRef.current)) {\n showNotice('error', '预设已切换,旧参数草稿未写入')\n return\n }\n const overrides = buildParamOverrides(f, {\n loadedKeys: loadedKeysRef.current,\n baseline: paramBaselineRef.current,\n autoModelProvider,\n autoSubagentModelProvider,\n })\n const res = await bridgeCall('paramOverrides', { overrides, expectedPresetId: f.presetTemplate })\n if (!isCurrentPresetDraft(f, fieldsRef.current)) return\n if (res.ok) {\n updateLoadedParamKeys(loadedKeysRef.current, overrides)\n paramBaselineRef.current = savedSnapshot\n // 只标记发起时快照;若期间有新编辑,当前 fields 仍保持 dirty。\n setSavedSwitches(savedSnapshot)\n const currentSnapshot = snapshotSwitches(fieldsRef.current)\n // 服务端会过滤未完成阶段;此时不重载,保留 UI 正在编辑的空草稿行。\n if (shouldReloadAfterPresetSave(\n draftVersion,\n draftVersionRef.current,\n configsWereClean && shouldReloadAfterParamSave(currentSnapshot, savedSnapshot),\n )) {\n // 参数已写激活预设 preset.yml:服务端重建后刷新(模型参数配置等随预设变化)。\n await load({ silent: true })\n }\n } else {\n showNotice('error', '参数保存失败:' + (res.message ?? 'settings bridge unavailable'))\n }\n })\n }, [load, savedConfigs, showNotice])\n\n /**\n * 指令文件显式保存:只提交「已改动 + 读取就绪 + 有基线版本 + 上下文匹配」的文件。\n * 逐文件结果;失败与冲突都保留草稿,不触发预设重建,也不重载覆盖用户输入。\n */\n const persistInstructionFiles = useCallback(async (fileIds?: readonly string[]): Promise<boolean> => {\n const pool = instructionPoolRef.current\n const pending = unsavedInstructionDrafts(pool).filter((draft) => fileIds === undefined || fileIds.includes(draft.fileId))\n if (pending.length === 0) return true\n const targets = saveableInstructionDrafts(pool)\n .filter((draft) => fileIds === undefined || fileIds.includes(draft.fileId))\n const sessionId = api.currentSessionId()\n const isCurrent = (): boolean => isCurrentInstructionSeq(instructionPoolRef.current, pool.seq)\n && instructionPoolRef.current.contextId === pool.contextId\n && sessionId === api.currentSessionId() && sessionId === instructionSessionRef.current\n if (!isCurrent()) return false\n const requests = new Map(targets.flatMap((draft) => {\n const request = instructionSaveRequest(instructionPoolRef.current, draft.fileId, sessionId)\n return request === undefined ? [] : [[draft.fileId, request] as const]\n }))\n for (const fileId of requests.keys()) {\n const saving = markDraftSaving(instructionPoolRef.current, fileId, true)\n publishInstructions(saving)\n syncInstructionCards(saving)\n }\n const results: InstructionSaveOutcome[] = pending.filter((draft) => !requests.has(draft.fileId)).map((draft) => ({\n fileId: draft.fileId, ok: false, message: draft.error ?? draft.message ?? '文件尚不可写、存在冲突或正在保存',\n }))\n for (const [fileId, request] of requests) {\n // 每次发送前和应答后都复核;切换工作区后不能继续提交批次中的旧文件。\n if (!isCurrent()) return false\n const current = instructionPoolRef.current.drafts.find((draft) => draft.fileId === fileId)\n if (current?.saving !== true || current.revision !== request.expectedRevision || current.contextId !== request.contextId) {\n results.push({ fileId, ok: false, message: '文件已重新读取,本次旧草稿未继续保存' })\n continue\n }\n const res = await bridgeCall('agentsFile', request)\n if (!isCurrent()) return false\n const latest = instructionPoolRef.current.drafts.find((draft) => draft.fileId === fileId)\n if (latest?.saving !== true || latest.revision !== request.expectedRevision || latest.contextId !== request.contextId) {\n results.push({ fileId, ok: false, message: '文件已重新读取,迟到保存结果未应用' })\n continue\n }\n const result: InstructionSaveOutcome = res.ok && typeof res.value.revision === 'string'\n ? { fileId, ok: true, revision: res.value.revision }\n : { fileId, ok: false, message: res.ok ? '保存响应缺少文件版本' : res.message ?? '写盘失败', conflict: !res.ok && isInstructionConflictCode(res.code) }\n results.push(result)\n // 已成功的文件立即确认;后续文件失败或切换上下文也不丢失成功基线。\n const settled = applySaveOutcomes(instructionPoolRef.current, [result], requests)\n publishInstructions(settled)\n syncInstructionCards(settled)\n }\n const failures = results.filter((result) => !result.ok)\n if (failures.length > 0) {\n const label = (fileId: string): string => instructionPoolRef.current.drafts.find((draft) => draft.fileId === fileId)?.displayPath ?? fileId\n showNotice('error', `指令文件保存失败(${failures.length}/${results.length}):${failures.map((failure) => `${label(failure.fileId)}:${failure.message ?? '未知错误'}`).join(';')}`)\n return false\n }\n showNotice('ok', `已保存指令文件:${results.length} 个`)\n return true\n }, [api, publishInstructions, showNotice, syncInstructionCards])\n\n /**\n * 写单个文件的指令卡策略(独立于预设):enabled/顺序/位置/晋升/受众/模型范围/显示名。\n * 带读取时 revision 的乐观并发;失败保留快照并提示,不偷偷改本地状态。\n */\n const persistInstructionPolicy = useCallback((policy: InstructionPolicyPatch): Promise<boolean> => saveQueueRef.current.enqueue(async () => {\n const current = instructionPolicyRef.current\n if (current.error !== undefined) {\n showNotice('error', `指令策略不可写:${current.error}`)\n return false\n }\n const res = await bridgeCall('instructionsPolicy', {\n policy,\n expectedRevision: current.revision,\n })\n if (instructionPolicyRef.current !== current) return false\n if (!res.ok || res.value.policy === undefined || res.value.error !== undefined) {\n showNotice('error', '指令策略保存失败:' + (res.ok ? res.value.error ?? '响应缺少策略快照' : res.message ?? 'settings bridge unavailable'))\n return false\n }\n publishInstructionPolicy({ policy: res.value.policy, revision: res.value.revision, exists: res.value.exists })\n syncInstructionCards(instructionPoolRef.current)\n showNotice('ok', '指令策略已保存(影响后续注入,不撤回已进入会话的内容)')\n return true\n }), [publishInstructionPolicy, showNotice, syncInstructionCards])\n\n const updateInstructionPolicy = useCallback((fileId: string, override: InstructionPolicyFileOverride | null): Promise<boolean> => (\n persistInstructionPolicy(instructionPolicyPatchForFile(fileId, override))\n ), [persistInstructionPolicy])\n const setInstructionSourceEnabled = useCallback((enabled: boolean): Promise<boolean> => (\n persistInstructionPolicy({ enabled })\n ), [persistInstructionPolicy])\n\n /** 冲突处理:重新读取单个文件并丢弃本地草稿(不自动重载,避免悄悄覆盖用户输入)。 */\n const reloadInstructionFile = useCallback(async (fileId: string): Promise<void> => {\n const sessionId = api.currentSessionId()\n const pool = instructionPoolRef.current\n const draft = pool.drafts.find((entry) => entry.fileId === fileId)\n if (pool.contextId === null || draft?.contextId !== pool.contextId || sessionId !== instructionSessionRef.current) return\n const res = await bridgeCall('promptConfigs', sessionId === undefined ? {} : { sessionId })\n if (sessionId !== api.currentSessionId() || !isCurrentInstructionSeq(instructionPoolRef.current, pool.seq)\n || instructionPoolRef.current.contextId !== pool.contextId) return\n if (instructionPoolRef.current.drafts.find((entry) => entry.fileId === fileId) !== draft) {\n showNotice('error', '重新读取期间文件草稿已更新,本次读取未覆盖新草稿')\n return\n }\n if (!res.ok || res.value.instructions === undefined) {\n showNotice('error', `重新读取指令文件失败:${res.ok ? '未返回指令文件快照' : res.message ?? 'settings bridge unavailable'}`)\n return\n }\n if (res.value.instructions.context.contextId !== pool.contextId) {\n showNotice('error', '指令文件上下文已变化,本次读取未应用;请重新加载工作台')\n return\n }\n const file = res.value.instructions.files.find((entry) => entry.fileId === fileId)\n if (file === undefined) {\n showNotice('error', '该指令文件不在当前工作区范围内,本地草稿已保留但不可写')\n return\n }\n const reset = resetDraftFromSnapshot(instructionPoolRef.current, file)\n publishInstructions(reset)\n syncInstructionCards(reset)\n showNotice('ok', `已重新读取指令文件:${file.displayPath}`)\n }, [api, publishInstructions, showNotice, syncInstructionCards])\n\n /** 保存后是否静默重载。切换预设时传 false(随后的 settings.mutate 回调会统一 load,\n * 避免一次切换触发两次全量读取)。返回 false = 未写入(切换中/跨预设旧草稿/失败),\n * 调用方(如开关预设)据此中止后续流程。 */\n const persistConfigs = useCallback((configs: PromptConfigDraft[], options?: { reload?: boolean; rebuild?: boolean; includeInstructions?: boolean }): Promise<boolean> => {\n const expectedPresetId = fieldsRef.current.presetTemplate\n const contentEntries = configs.filter(isContentAsset)\n const draftVersion = draftVersionRef.current\n const switchesWereClean = switchesEqual(snapshotSwitches(fieldsRef.current), savedSwitches)\n // 待编辑变量行(空 key)不落盘(服务端 savePresetParams 清理);此时跳过保存后静默重载,\n // 否则服务端状态覆盖草稿,刚点开的变量编辑行立即消失。\n const pendingVariableRows = hasPendingVariableRows(configs)\n return presetSaveQueueRef.current.enqueue(async () => {\n // 切换进行中(目标预设数据未应用):fields 仍是旧预设字段,拒绝写入 presetTemplate。\n if (loadedPresetRef.current !== undefined && loadedPresetRef.current !== fieldsRef.current.presetTemplate) {\n showNotice('error', PRESET_PENDING_MESSAGE)\n return false\n }\n if (expectedPresetId !== fieldsRef.current.presetTemplate) {\n showNotice('error', '预设已切换,旧提示词草稿未写入')\n return false\n }\n // 内容资产(preset.md):合并为单次 /import-preset(批量载荷),服务端只触发一次重建。\n if (contentEntries.length > 0) {\n const contents = contentEntries.map((config) => ({\n scope: 'preset' as const,\n content: config.text ?? '',\n }))\n const res = await bridgeCall('importPreset', { contents, expectedPresetId })\n if (expectedPresetId !== fieldsRef.current.presetTemplate) return false\n if (!res.ok) {\n showNotice('error', 'preset.md 保存失败:' + (res.message ?? 'settings bridge unavailable'))\n return false\n }\n }\n // 指令文件与预设是两类资产:只提交已改动且可写的文件(逐文件版本校验),\n // 未修改的文件不写盘;文件失败不回滚预设写盘,也不假装整体成功。\n const instructionsSaved = options?.includeInstructions === false || await persistInstructionFiles()\n if (expectedPresetId !== fieldsRef.current.presetTemplate) return false\n // promptConfigs 按预设存储:写激活预设 preset.yml(settings 不再承载)。\n // 防御:初始化期空数组自动保存不得覆盖服务端已有配置(历史教训:beta-2-42\n // 的 129 张配置卡被一次清空);用户主动清空(此前已加载非空配置)允许落盘空数组。\n if (configs.length === 0 && savedConfigs.length === 0) return instructionsSaved\n const res = await bridgeCall('paramOverrides', {\n expectedPresetId,\n // 引擎探测生成的文件卡不进预设(文件即真相):只持久化用户自己的卡片。\n promptConfigs: configs.filter(isPresetCard).map(stripConfigFieldSources).map(stripContentText),\n ...(options?.rebuild === false ? { rebuild: false } : {}),\n })\n if (expectedPresetId !== fieldsRef.current.presetTemplate) return false\n if (res.ok) {\n setSavedConfigs(configs)\n if (instructionsSaved && options?.reload !== false && !pendingVariableRows && shouldReloadAfterPresetSave(\n draftVersion,\n draftVersionRef.current,\n switchesWereClean && !promptConfigsDirty(fieldsRef.current.promptConfigs, configs),\n )) {\n await load({ silent: true, presetConfigs: configs.filter(isPresetCard) })\n }\n return instructionsSaved\n } else {\n showNotice('error', '提示词配置保存失败:' + (res.message ?? 'settings bridge unavailable'))\n return false\n }\n })\n }, [api, load, persistInstructionFiles, savedConfigs, savedSwitches, showNotice])\n\n /** 模板变量:写激活预设 preset.yml 内容变量(后端 savePresetParams + afterOverridesChange 触发重建)。 */\n const saveTemplateVariables = useCallback(async (next?: Record<string, string>, enabledOverride?: boolean): Promise<boolean> => {\n // 切换进行中(目标预设数据未应用):变量仍是旧预设值,拒绝写入 presetTemplate。\n if (loadedPresetRef.current !== undefined && loadedPresetRef.current !== fieldsRef.current.presetTemplate) {\n showNotice('error', PRESET_PENDING_MESSAGE)\n return false\n }\n const expectedPresetId = fieldsRef.current.presetTemplate\n // 空 key 行不落盘,但必须保留在本地草稿,不能把编辑中的整张卡清掉。\n const cleaned = Object.fromEntries(\n Object.entries(next ?? templateVariablesRef.current).filter(([key]) => key.trim().length > 0),\n )\n const res = await bridgeCall('presetVariables', {\n expectedPresetId,\n variables: cleaned,\n // 开关 onChange 与保存同帧触发:优先用调用方传入的新值,避免读到上一帧 enabled。\n enabled: enabledOverride ?? templateVariablesEnabled,\n })\n if (!res.ok) {\n showNotice('error', `模板变量保存失败:${res.message ?? '未知错误'}`)\n return false\n }\n if (expectedPresetId === fieldsRef.current.presetTemplate) savedTemplateVariablesRef.current = cleaned\n return expectedPresetId === fieldsRef.current.presetTemplate\n }, [templateVariablesEnabled, showNotice])\n\n const toggle = useCallback((key: SwitchKey) => {\n patch({ [key]: !fieldsRef.current[key] })\n if (PARAM_SWITCH_KEYS.has(key)) void persistParamOverrides()\n // writePreset 关闭/开启会重建或移除生成目录:保存后必须重新加载,\n // 否则模块卡片仍显示旧配置(不刷新)。\n else if (key === 'writePreset') void persistSwitches(() => { void load({ silent: true }) })\n else void persistSwitches()\n }, [patch, persistParamOverrides, persistSwitches, load])\n\n /**\n * 把插件预设事实切到 id:保存当前预设的未提交修改 → 写 settings.presetTemplate\n * (宿主据此物化目标预设并同步官方默认预设)→ 静默重载目标预设数据。\n * @param switchSession 是否同时把当前空白会话切到该预设。用户主动切换为 true;\n * 跟随官方会话级选择时为 false——那个会话已经运行在该预设上,再 select 只会重复\n * 记一条 `agent-preset/selected` 事件。\n * @param notice 自定义成功文案(跟随的提示与主动切换区分开)。\n */\n const applyPresetTemplate = useCallback(async (id: string, switchSession: boolean, notice?: string): Promise<void> => {\n if (fieldsRef.current.presetTemplate === id) return\n if (hasWorkspaceDrafts(editorDrafts, fieldsRef.current.presetTemplate)) {\n showNotice('error', '当前预设仍有未保存的规则、工具、人设、策略或字段草稿,请返回对应页面保存或修正后再切换')\n return\n }\n await presetSaveQueueRef.current.enqueue(async () => {})\n // 切换即保存:模块列表有未保存的提示词配置修改时先提交(写当前激活预设),\n // 避免切换后 load() 重置 fields 丢失修改。已保存/无修改则直接切换;\n // 保存未成功(失败/被拒)时不切换,把草稿完整留在当前预设。\n const dirtyConfigs = promptConfigsDirty(fieldsRef.current.promptConfigs, savedConfigsRef.current)\n if (dirtyConfigs) {\n // 免双 load:保存成功后由下方 enqueueSave 的 onSaved 统一静默重载。\n // 切换前只落盘当前预设,不重建;settings 切换后目标预设只重建一次。\n // 指令文件草稿与预设无关:切换不隐式保存、不清空它们(独立显式保存)。\n const savedDraft = await persistConfigs(fieldsRef.current.promptConfigs, { reload: false, rebuild: false, includeInstructions: false })\n if (!savedDraft) {\n showNotice('error', '当前预设的提示词配置未保存成功,已取消切换')\n return\n }\n }\n const switchResult = switchSession ? await api.switchPreset(id) : { applied: false }\n patch({ presetTemplate: id })\n await enqueueSave(\n [{ op: 'set', path: ['presetTemplate'], value: id }],\n notice ?? (switchResult.applied\n ? `已切换预设模板:${id}(当前空会话已重组)`\n : `已切换默认预设模板:${id}`),\n () => {\n if (switchResult.message !== undefined) {\n showNotice('error', switchResult.message)\n }\n },\n )\n // 队列完成后再刷新:新数据应用前 fields 仍是旧预设字段,写路径守卫以此拦截误写。\n await load({ silent: true })\n }, [api, editorDrafts, enqueueSave, load, patch, persistConfigs, showNotice])\n\n // 返回 Promise 保持调用契约(既有调用方会 then/await 它等写入完成)。\n const setPresetTemplate = useCallback((id: string): Promise<void> => applyPresetTemplate(id, true), [applyPresetTemplate])\n\n /**\n * 跟随官方会话级预设选择:会话投影 agentPreset 记的是该会话真正运行的预设,\n * 官方「新建会话」旁的选择器只改那个空白会话、不改宿主默认预设,因此插件镜像宿主\n * 默认的 presetTemplate 只有读这个投影才能跟随(决策与守卫见 session-preset-follow)。\n */\n const followCheck = useCallback((): void => {\n const follower = presetFollowerRef.current\n if (follower === undefined) return\n void follower.check({\n sessionPreset: api.sessionPreset.snapshot(),\n currentPreset: fieldsRef.current.presetTemplate,\n loadedPreset: loadedPresetRef.current,\n // 只跟随插件管理目录中可渲染的预设:别处(官方随包预设等)不由本插件物化。\n followable: (presetId) => (meta.presets ?? [])\n .some((preset) => preset.id === presetId && preset.renderable !== false),\n blocked: (presetId) => hasWorkspaceDrafts(editorDrafts, presetId),\n apply: (presetId) => applyPresetTemplate(presetId, false, `已跟随当前会话预设:${presetId}`),\n warn: (presetId) => showNotice('error', `当前会话预设 ${presetId} 不在提示词工具管理目录中,工作台未跟随`),\n })\n }, [api, applyPresetTemplate, editorDrafts, meta.presets, showNotice])\n followCheckRef.current = followCheck\n\n // 会话预设跟随:官方侧切换不经过插件设置,只有订阅会话投影才能即时回显。\n useEffect(() => {\n const unsubscribe = api.sessionPreset.subscribe(followCheck)\n followCheck()\n return unsubscribe\n }, [api, followCheck])\n\n /** 能力变更和参数保存共用队列;预设切换等待写入及其读回完成。 */\n const changeEngineCapability = useCallback((action: 'create' | 'create-recipe' | 'remove', id: string): Promise<boolean> => {\n const expectedPresetId = fieldsRef.current.presetTemplate\n return presetSaveQueueRef.current.enqueue(async () => {\n if (expectedPresetId !== fieldsRef.current.presetTemplate || loadedPresetRef.current !== expectedPresetId) {\n showNotice('error', PRESET_PENDING_MESSAGE)\n return false\n }\n const request = action === 'create-recipe' ? { action, recipeId: id } : { action, capabilityId: id }\n const result = await bridgeCall('engineCapability', { ...request, expectedPresetId })\n if (expectedPresetId !== fieldsRef.current.presetTemplate) return false\n if (!result.ok) {\n showNotice('error', '引擎能力变更失败:' + (result.message ?? 'settings bridge unavailable'))\n return false\n }\n await load({ silent: true })\n showNotice('ok', action === 'remove' ? `已移除引擎能力:${id}` : `已装配引擎能力:${id}`)\n return true\n })\n }, [load, showNotice])\n const createEngineCapability = useCallback((action: 'create' | 'create-recipe', id: string) => changeEngineCapability(action, id), [changeEngineCapability])\n const removeEngineCapability = useCallback((id: string) => changeEngineCapability('remove', id), [changeEngineCapability])\n\n const refreshSkills = useCallback(async (): Promise<boolean> => {\n const seq = ++skillsSeqRef.current\n const sessionId = api.currentSessionId()\n const res = await bridgeCall('skillsList', sessionId === undefined ? {} : { sessionId })\n if (seq !== skillsSeqRef.current || sessionId !== api.currentSessionId()) return false\n if (!res.ok) {\n showNotice('error', '技能列表刷新失败:' + (res.message ?? 'settings bridge unavailable'))\n return false\n }\n skillsSessionRef.current = sessionId\n skillsSeqRef.current += 1\n publishFields({ ...fieldsRef.current, ...skillFieldsFromSnapshot(res.value) })\n return true\n }, [api, publishFields, showNotice])\n\n /** 所有技能写操作共用即时忙期守卫与局部刷新,覆盖确认期间也保持忙碌。 */\n const writeSkill = useCallback(async <T,>(\n submit: () => Promise<BridgeResult<T>>, success: (value: T) => string, failure: string,\n ): Promise<boolean> => {\n if (skillWriteRef.current) { showNotice('error', '技能正在保存,请稍候再试'); return false }\n skillWriteRef.current = true\n setSkillsBusy(true)\n try {\n const res = await submit()\n if (!res.ok) {\n if (res.code !== 'skills-import-cancelled') showNotice('error', failure + ':' + (res.message ?? 'settings bridge unavailable'))\n return false\n }\n const refreshed = await refreshSkills()\n showNotice(refreshed ? 'ok' : 'error', success(res.value) + (refreshed ? '' : ';技能列表刷新失败,请重新读取'))\n return true\n } catch (error) {\n showNotice('error', failure + ':' + errorMessage(error))\n return false\n } finally {\n skillWriteRef.current = false\n setSkillsBusy(false)\n }\n }, [refreshSkills, showNotice])\n\n const importSkills = useCallback((submit: Parameters<typeof requestSkillImport>[0], confirm?: ConfirmSkillOverwrite) =>\n writeSkill(() => requestSkillImport(submit, confirm), ({ count, path, overwritten, warning }) =>\n `已复制 ${count} 个技能文件到 ${path}` + (overwritten > 0 ? `,覆盖 ${overwritten} 个已确认的同名技能` : '')\n + (warning ? `;导入已完成,清理提示:${warning}` : ''), '导入技能目录失败'), [writeSkill])\n\n const importSkillsDirectory = useCallback((path: string, confirm?: ConfirmSkillOverwrite): Promise<boolean> => {\n const source = path.trim()\n if (source.length === 0) { showNotice('error', '请选择要导入的目录'); return Promise.resolve(false) }\n return importSkills((overwrite) => bridgeCall('skillsImportDirectory', { path: source, ...(overwrite === undefined ? {} : { overwrite }) }), confirm)\n }, [importSkills, showNotice])\n\n const createSkill = useCallback((input: { name: string; description: string; content: string }) =>\n writeSkill(() => bridgeCall('skillCreate', input), ({ id }) => `已创建技能:${id}`, '创建技能失败'), [writeSkill])\n\n const readSkill = useCallback(async (skill: SkillCatalogEntry, sessionId: string | undefined): Promise<BridgeResult<SkillContentSnapshot>> => {\n if (skill.path === undefined || sessionId !== api.currentSessionId() || sessionId !== skillsSessionRef.current) {\n return { ok: false, message: '技能上下文已变化,请刷新后重试' }\n }\n const result = await bridgeCall('skillRead', { name: skill.name, path: skill.path, ...(sessionId === undefined ? {} : { sessionId }) })\n return sessionId === api.currentSessionId() ? result : { ok: false, message: '技能上下文已变化,请刷新后重试' }\n }, [api])\n\n const saveSkill = useCallback(async (skill: SkillCatalogEntry, content: string, description: string, expectedRevision: string, sessionId: string | undefined): Promise<BridgeResult<SkillContentSnapshot>> => {\n const path = skill.path\n if (path === undefined || sessionId !== api.currentSessionId() || sessionId !== skillsSessionRef.current) {\n return { ok: false, message: '技能上下文已变化,请刷新后重试' }\n }\n let result: BridgeResult<SkillContentSnapshot> = { ok: false, message: '技能正在保存,请稍候再试' }\n await writeSkill(async () => {\n result = await bridgeCall('skillWrite', { name: skill.name, path, content, description, expectedRevision, ...(sessionId === undefined ? {} : { sessionId }) })\n return result\n }, () => `已保存技能:${skill.name}`, '技能保存失败')\n return result\n }, [api, writeSkill])\n\n const deleteSkill = useCallback((skill: Pick<SkillCatalogEntry, 'name' | 'path'>): Promise<boolean> => {\n const sessionId = api.currentSessionId()\n const path = skill.path\n if (path === undefined || sessionId !== skillsSessionRef.current) {\n showNotice('error', '技能上下文已变化,请刷新后重试')\n return Promise.resolve(false)\n }\n return writeSkill(() => bridgeCall('skillDelete', { name: skill.name, path, ...(sessionId === undefined ? {} : { sessionId }) }),\n ({ path }) => `已删除技能 ${skill.name};文件已移入回收站 ${path},可人工恢复`, `删除技能 ${skill.name} 失败`)\n }, [api, showNotice, writeSkill])\n\n const setSkillPolicy = useCallback((name: string, path: string, change: SkillPolicyChange): Promise<boolean> => {\n const sessionId = api.currentSessionId()\n if (sessionId !== skillsSessionRef.current) {\n showNotice('error', '技能上下文已变化,请刷新后重试')\n return Promise.resolve(false)\n }\n return writeSkill(() => bridgeCall('skillPolicy', { name, path, ...change, ...(sessionId === undefined ? {} : { sessionId }) }),\n () => `已更新技能 ${name} 的调用策略`, `技能 ${name} 调用策略写入失败`)\n }, [api, showNotice, writeSkill])\n\n const patchSkillFolders = useCallback((folders: string[]) => {\n const sessionId = api.currentSessionId()\n return writeSkill(() => bridgeCall('skillsFolders', { folders, ...(sessionId === undefined ? {} : { sessionId }) }),\n () => `已更新技能文件夹引用(${folders.length} 个)`, '技能文件夹保存失败')\n }, [api, writeSkill])\n\n const openSkillsDir = useCallback(async (path?: string) => {\n const target = path ?? fieldsRef.current.skillsRoot\n if (!target) { showNotice('error', '技能目录路径未知,请先重新读取配置'); return }\n try {\n await api.openPath(target)\n showNotice('ok', '已打开技能目录:' + target)\n } catch (error) {\n showNotice('error', '打开失败:' + errorMessage(error))\n }\n }, [api, showNotice])\n\n const currentSwitches = snapshotSwitches(fields)\n const dirtySwitches = !switchesEqual(currentSwitches, savedSwitches)\n // 预设卡与文件卡分开算脏:文件正文只走显式保存,不进入预设的 debounce 自动保存。\n const presetCards = fields.promptConfigs.filter(isPresetCard)\n const savedPresetCards = savedConfigs.filter(isPresetCard)\n const dirtyPresetConfigs = presetCards.length !== savedPresetCards.length\n || presetCards.some((config, index) => config !== savedPresetCards[index])\n const dirtyInstructions = unsavedInstructionDrafts(instructionPool).length > 0\n const dirtyConfigs = dirtyPresetConfigs || dirtyInstructions\n const dirty = dirtySwitches || dirtyConfigs\n\n // 任意 UI 修改自动保存:模块列表的提示词配置修改(顶端总开关/卡片字段/增删/排序,\n // 全部经 patch({ promptConfigs }) 落 fields)debounce 后统一走 persistConfigs——\n // 与手动「保存」共用同一写盘逻辑(跳过校验:编辑中间态直存,后端容错;\n // 手动保存按钮仍保留校验路径)。保存成功 load() 更新 savedConfigs → dirty 消失自愈。\n useEffect(() => {\n if (!dirtyPresetConfigs) return\n const timer = setTimeout(() => { void persistConfigs(fields.promptConfigs, { includeInstructions: false }) }, 800)\n return () => clearTimeout(timer)\n }, [dirtyPresetConfigs, fields.promptConfigs, persistConfigs])\n\n // 返回引用稳定化:memo 子组件以 props.store 同一性跳过父级重渲染(订阅式 selector\n // 化依赖稳定 store 引用);每次渲染重建内容对象但复用 ref 外壳。\n const storeRef = useRef<PromptToolStore>()\n storeRef.current = {\n editorDrafts,\n api,\n fields,\n getFields,\n subscribeFields,\n getDraftRevision,\n subscribeDrafts,\n publishDrafts,\n meta,\n loading,\n modelCatalog,\n modelReasoning,\n ensureModelReasoning,\n hostDefaultModel,\n moduleFacts,\n templatePreStepCount,\n savedSwitches,\n savedConfigs,\n instructionPool,\n getInstructionPool: () => instructionPoolRef.current,\n dirtyInstructions,\n persistInstructionFiles,\n reloadInstructionFile,\n instructionPolicy,\n getInstructionPolicy: () => instructionPolicyRef.current,\n updateInstructionPolicy,\n setInstructionSourceEnabled,\n skillsBusy,\n notice,\n noticeKind,\n load,\n showNotice,\n patch,\n persistSwitches,\n persistParamOverrides,\n persistConfigs,\n enqueuePresetTask,\n templateVariables,\n setTemplateVariables,\n templateVariablesEnabled,\n setTemplateVariablesEnabled,\n saveTemplateVariables,\n toggle,\n setPresetTemplate,\n createEngineCapability,\n removeEngineCapability,\n importSkillsDirectory,\n refreshSkills,\n createSkill,\n readSkill,\n saveSkill,\n deleteSkill,\n setSkillPolicy,\n patchSkillFolders,\n openSkillsDir,\n dirtySwitches,\n dirtyConfigs,\n dirty,\n }\n return storeRef.current\n}\n","import type { AssetImportRequest } from '../../shared/asset-transfer.ts'\nimport type { ImportPreviewState } from '../prompt-tool-types.ts'\nimport type { ImportCommitResult, ImportPreviewOutcome } from './use-import-preview-flow.ts'\nimport { bridgeCall } from './bridge-client.ts'\n\ntype ImportEndpoint = 'importPresetPackage' | 'charactersImport'\nexport async function previewAsset(endpoint: ImportEndpoint, request: AssetImportRequest): Promise<ImportPreviewOutcome> {\n const response = await bridgeCall(endpoint, { ...request, preview: true })\n if (!response.ok) return { kind: 'error', message: response.message ?? 'settings bridge unavailable' }\n const value = response.value\n if (value.state === 'needs-order-selection') return { kind: 'candidates', candidates: value.candidates ?? [], sourceName: 'sourceName' in value ? value.sourceName : undefined }\n if (value.state === 'needs-kind-selection') return { kind: 'kinds', kinds: value.kinds ?? [] }\n return { kind: 'ready', sourceDigest: value.sourceDigest, previewRevision: value.previewRevision, report: value.report, summary: value.summary }\n}\nexport async function commitAsset(endpoint: ImportEndpoint, preview: ImportPreviewState): Promise<ImportCommitResult> {\n const { files, sourceId, targetId, targetName, overwrite, sourceKind, promptOrderCharacterId, sourceDigest, previewRevision } = preview\n const response = await bridgeCall(endpoint, { files, sourceId, targetId, targetName, overwrite, sourceKind, promptOrderCharacterId, expectedSourceDigest: sourceDigest, expectedPreviewRevision: previewRevision })\n return response.ok ? { ok: true, label: response.value.id, refreshWarning: 'refreshWarning' in response.value ? response.value.refreshWarning : undefined } : { ok: false, stale: response.code?.endsWith('preview-stale'), message: response.message ?? 'settings bridge unavailable' }\n}\n","/** 浏览器文件到 bridge 载荷的共享转换:预设文本与技能二进制共用同一入口。 */\nexport interface ImportFileEntry {\n path: string\n content: string\n encoding?: 'utf8' | 'base64'\n}\n\nfunction readFile(file: File, encoding: 'text' | 'base64'): Promise<string> {\n if (encoding === 'text') return file.text()\n return new Promise((resolve, reject) => {\n const reader = new FileReader()\n reader.onload = () => {\n const result = reader.result\n if (typeof result !== 'string') {\n reject(new Error(`读取文件失败:${file.name}`))\n return\n }\n const comma = result.indexOf(',')\n resolve(comma >= 0 ? result.slice(comma + 1) : '')\n }\n reader.onerror = () => reject(reader.error ?? new Error(`读取文件失败:${file.name}`))\n reader.readAsDataURL(file)\n })\n}\n\nexport async function readImportFiles(\n files: readonly File[],\n encoding: 'text' | 'base64',\n): Promise<ImportFileEntry[]> {\n return Promise.all(files.map(async (file) => ({\n path: file.webkitRelativePath || file.name,\n content: await readFile(file, encoding),\n encoding: encoding === 'text' ? 'utf8' : 'base64',\n })))\n}\r\n","/** 有界导入队列:读取、暂存、预览和提交共享生命周期;结束与跳过明确分开。 */\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport type { StConversionReport, StOrderGroupCandidate } from '../../shared/bridge-contract.ts'\nimport { MAX_BRIDGE_BODY_BYTES } from '../../shared/bridge-contract.ts'\nimport type { AssetFile, AssetImportRequest, AssetSummary, ImportChoices, ImportKind } from '../../shared/asset-transfer.ts'\nimport type { ImportOrderCandidates, ImportPreviewState } from '../prompt-tool-types.ts'\nimport { bridgeCall, bridgeUpload, errorMessage } from './bridge-client.ts'\nimport { readImportFiles } from './import-files.ts'\n\nexport type ImportFlowPhase = 'idle' | 'reading' | 'confirming' | 'submitting' | 'stale' | 'error' | 'complete'\nexport type ImportPreviewOutcome =\n | { kind: 'ready'; sourceDigest?: string; previewRevision?: string; report?: StConversionReport; summary?: AssetSummary }\n | { kind: 'candidates'; candidates: StOrderGroupCandidate[]; sourceName?: string }\n | { kind: 'kinds'; kinds: ImportKind[] }\n | { kind: 'error'; message: string; stale?: boolean }\nexport interface ImportCommitResult { ok: boolean; stale?: boolean; message?: string; label?: string; refreshWarning?: string }\nexport interface ImportFlowHandlers {\n preview: (request: AssetImportRequest) => Promise<ImportPreviewOutcome>\n commit: (preview: ImportPreviewState) => Promise<ImportCommitResult>\n onCommitted?: (label?: string) => Promise<void> | void\n onError: (message: string, stale: boolean) => void\n directoryTooLarge: string\n}\ninterface ImportProgress { index: number; total: number; imported: number; skipped: number; failed: number; failures: string[] }\nconst emptyProgress: ImportProgress = { index: 0, total: 0, imported: 0, skipped: 0, failed: 0, failures: [] }\n\nexport function useImportPreviewFlow(handlers: ImportFlowHandlers) {\n const [phase, setPhase] = useState<ImportFlowPhase>('idle')\n const [preview, setPreview] = useState<ImportPreviewState>()\n const [candidates, setCandidates] = useState<ImportOrderCandidates>()\n const [kinds, setKinds] = useState<ImportKind[]>()\n const [choices, setChoices] = useState<ImportChoices>({})\n const [error, setError] = useState('')\n const [sourceName, setSourceName] = useState('')\n const [sourceImage, setSourceImage] = useState<string>()\n const [progress, setProgress] = useState(emptyProgress)\n const [resultLabel, setResultLabel] = useState<string>()\n const [refreshError, setRefreshError] = useState('')\n const api = useRef(handlers)\n api.current = handlers\n const alive = useRef(true)\n const sequence = useRef(0)\n const locked = useRef(false)\n const submitting = useRef(false)\n const source = useRef<AssetImportRequest>()\n const units = useRef<Array<File[] | AssetFile[]>>([])\n const index = useRef(0)\n const selected = useRef<ImportChoices>({})\n const ready = useRef<ImportPreviewState>()\n const result = useRef<string>()\n const imageUrl = useRef<string>()\n\n const release = useCallback(() => {\n const id = source.current?.sourceId\n source.current = undefined\n if (imageUrl.current !== undefined) URL.revokeObjectURL(imageUrl.current)\n imageUrl.current = undefined\n if (id !== undefined) void bridgeCall('assetRelease', { sourceId: id })\n }, [])\n useEffect(() => {\n alive.current = true\n return () => { alive.current = false; sequence.current += 1; release() }\n }, [release])\n\n const inspect = useCallback(async (): Promise<void> => {\n if (!alive.current || submitting.current) return\n const seq = ++sequence.current\n ready.current = undefined\n setPhase('reading')\n setError('')\n try {\n if (source.current === undefined) {\n const batch = units.current[index.current]\n if (batch === undefined) return\n const first = batch[0]\n if (first instanceof File) {\n if (batch.length === 1 && !first.webkitRelativePath) {\n const uploaded = await bridgeUpload(first, first.name)\n if (!uploaded.ok) throw new Error(uploaded.message)\n if (!alive.current || seq !== sequence.current) {\n void bridgeCall('assetRelease', { sourceId: uploaded.value.sourceId })\n return\n }\n source.current = { sourceId: uploaded.value.sourceId }\n } else {\n const files = batch as File[]\n if (files.reduce((total, file) => total + Math.ceil(file.size / 3) * 4 + file.webkitRelativePath.length * 6 + 128, 4096) >= MAX_BRIDGE_BODY_BYTES) throw new Error(api.current.directoryTooLarge)\n const entries = await readImportFiles(files, 'base64')\n if (!alive.current || seq !== sequence.current) return\n source.current = { files: entries }\n }\n } else source.current = { files: batch as AssetFile[] }\n }\n const request = { ...source.current, ...selected.current }\n const response = await api.current.preview(request)\n if (!alive.current || seq !== sequence.current) return\n if (response.kind === 'error') {\n setPhase(response.stale ? 'stale' : 'error')\n setError(response.message)\n api.current.onError(response.message, response.stale === true)\n return\n }\n setCandidates(response.kind === 'candidates' ? response : undefined)\n setKinds(response.kind === 'kinds' ? response.kinds : undefined)\n if (response.kind === 'ready') {\n const state: ImportPreviewState = { ...request, sourceDigest: response.sourceDigest ?? '', previewRevision: response.previewRevision, report: response.report, summary: response.summary, groupCharacterId: selected.current.promptOrderCharacterId }\n // 服务端提供默认的新身份。确认始终绑定这一份预览,不自动改成覆盖。\n selected.current = { ...selected.current, targetId: response.summary?.targetId ?? selected.current.targetId, targetName: response.summary?.targetName ?? selected.current.targetName }\n setChoices(selected.current)\n ready.current = state\n setPreview(state)\n } else setPreview(undefined)\n setPhase('confirming')\n } catch (reason) {\n if (!alive.current || seq !== sequence.current) return\n const message = errorMessage(reason)\n setError(message)\n setPhase('error')\n api.current.onError(message, false)\n }\n }, [])\n\n const startUnit = useCallback(async (): Promise<void> => {\n release()\n selected.current = {}\n ready.current = undefined\n setChoices({})\n setPreview(undefined)\n setCandidates(undefined)\n setKinds(undefined)\n const first = units.current[index.current]?.[0]\n setSourceName(first instanceof File ? first.name : first?.path ?? '')\n imageUrl.current = first instanceof File && (first.type === 'image/png' || /\\.png$/i.test(first.name)) ? URL.createObjectURL(first) : undefined\n setSourceImage(imageUrl.current)\n setProgress((previous) => ({ ...previous, index: index.current + 1 }))\n await inspect()\n }, [inspect, release])\n\n const run = useCallback(async (files: File[] | AssetFile[], mode: 'package' | 'files' = 'package'): Promise<void> => {\n if (files.length === 0 || locked.current) return\n locked.current = true\n units.current = mode === 'files' ? files.map((file) => [file] as File[] | AssetFile[]) : [files]\n index.current = 0\n setProgress({ ...emptyProgress, total: units.current.length })\n setResultLabel(undefined)\n setRefreshError('')\n await startUnit()\n }, [startUnit])\n\n const advance = useCallback(async (): Promise<void> => {\n release()\n index.current += 1\n if (index.current < units.current.length) await startUnit()\n else {\n ready.current = undefined\n setPreview(undefined)\n setCandidates(undefined)\n setKinds(undefined)\n setError('')\n setPhase('complete')\n }\n }, [release, startUnit])\n\n const updateChoices = useCallback((patch: ImportChoices): void => {\n if (submitting.current) return\n selected.current = { ...selected.current, ...patch }\n setChoices(selected.current)\n void inspect()\n }, [inspect])\n\n const confirm = useCallback(async (): Promise<void> => {\n const state = ready.current\n if (state === undefined || submitting.current) return\n ready.current = undefined\n submitting.current = true\n setPhase('submitting')\n setError('')\n try {\n const committed = await api.current.commit(state)\n if (!alive.current) return\n if (!committed.ok) {\n setError(committed.message ?? '')\n setPhase(committed.stale ? 'stale' : 'error')\n api.current.onError(committed.message ?? '', committed.stale === true)\n return\n }\n result.current = committed.label\n setResultLabel(committed.label)\n setProgress((previous) => ({ ...previous, imported: previous.imported + 1 }))\n try {\n await api.current.onCommitted?.(committed.label)\n if (committed.refreshWarning) throw new Error(committed.refreshWarning)\n } catch (reason) {\n if (!alive.current) return\n setRefreshError(errorMessage(reason))\n const remaining = units.current.length - index.current - 1\n setProgress((previous) => ({ ...previous, skipped: previous.skipped + remaining }))\n units.current = []\n setPhase('complete')\n release()\n return\n }\n if (alive.current) { submitting.current = false; await advance() }\n } catch (reason) {\n if (!alive.current) return\n setError(errorMessage(reason))\n setPhase('error')\n api.current.onError(errorMessage(reason), false)\n } finally { submitting.current = false }\n }, [advance, release])\n\n const skip = useCallback((): void => {\n if (submitting.current || index.current !== progress.index - 1 || units.current.length === 0) return\n sequence.current += 1\n setProgress((previous) => ({ ...previous, skipped: previous.skipped + (error ? 0 : 1), failed: previous.failed + (error ? 1 : 0), failures: error ? [...previous.failures, `${sourceName}: ${error}`] : previous.failures }))\n void advance()\n }, [advance, error, sourceName, progress.index])\n const cancel = useCallback((): void => {\n if (submitting.current) return\n sequence.current += 1\n locked.current = false\n ready.current = undefined\n release()\n units.current = []\n setPreview(undefined)\n setCandidates(undefined)\n setKinds(undefined)\n setError('')\n setPhase('idle')\n }, [release])\n const retryRefresh = useCallback(async (): Promise<void> => {\n if (submitting.current) return\n submitting.current = true\n try { await api.current.onCommitted?.(result.current); if (alive.current) setRefreshError('') }\n catch (reason) { if (alive.current) setRefreshError(errorMessage(reason)) }\n finally { submitting.current = false }\n }, [])\n const end = useCallback((): void => {\n if (submitting.current || units.current.length === 0) return\n sequence.current += 1\n ready.current = undefined\n release()\n const remaining = units.current.length - index.current\n setProgress((previous) => ({ ...previous, skipped: previous.skipped + remaining - (error ? 1 : 0), failed: previous.failed + (error ? 1 : 0), failures: error ? [...previous.failures, `${sourceName}: ${error}`] : previous.failures }))\n units.current = []\n setPreview(undefined)\n setPhase('complete')\n }, [error, release, sourceName])\n return { phase, preview, candidates, kinds, choices, error, sourceName, sourceImage, progress, resultLabel, refreshError, run, updateChoices, chooseGroup: (characterId: string) => updateChoices({ promptOrderCharacterId: characterId }), confirm, cancel, end, skip, repreview: inspect, retryRefresh }\n}\n","export interface AnchoredPopoverFit {\n side: 'top' | 'bottom'\n maxHeight: number\n}\n\n/** 选择空间更充足的一侧,并把面板高度限制在锚点与视口边缘之间。 */\nexport function resolveAnchoredPopoverFit(input: {\n anchorTop: number\n anchorBottom: number\n desiredHeight: number\n viewportHeight: number\n gap: number\n margin: number\n}): AnchoredPopoverFit {\n const below = Math.max(0, input.viewportHeight - input.anchorBottom - input.gap - input.margin)\n const above = Math.max(0, input.anchorTop - input.gap - input.margin)\n const side = below >= input.desiredHeight || below >= above ? 'bottom' : 'top'\n // maxHeight 只取可用空间上限:实际高度由内容决定。若把首帧内容高度也算进来,\n // 异步内容(模板列表)加载后会被锁死在初始高度。\n return { side, maxHeight: side === 'bottom' ? below : above }\n}\n\n/** 测量面板真实内容高度:面板可能已被 max-height 限制,内部滚动容器的溢出不计入\n * panel.scrollHeight,直接测量只会得到被裁剪后的高度;先临时解除限制再量。\n * 同步读写不产生可见闪烁,测量后恢复原值。 */\nexport function measurePanelContentHeight(panel: {\n style: { maxHeight: string }\n scrollHeight: number\n offsetHeight: number\n}): number {\n const applied = panel.style.maxHeight\n panel.style.maxHeight = 'none'\n const height = Math.max(panel.scrollHeight, panel.offsetHeight)\n panel.style.maxHeight = applied\n return height\n}\n","import { useLayoutEffect, useRef, useState, type CSSProperties, type RefObject } from 'react'\nimport { useAnchoredPosition } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { measurePanelContentHeight, resolveAnchoredPopoverFit } from './anchored-popover-fit.ts'\nimport type { AnchoredPopoverFit } from './anchored-popover-fit.ts'\n\n/** body-portaled 浮层的统一定位:滚动、缩放和锚点/面板尺寸变化时重新测量。 */\nexport function useAnchoredPopoverStyle(options: {\n open: boolean\n anchorRef: RefObject<HTMLElement | null>\n panelRef: RefObject<HTMLElement | null>\n gap?: number\n margin?: number\n maxViewportRatio?: number\n}): CSSProperties | null {\n const { open, anchorRef, panelRef, gap = 8, margin = 12, maxViewportRatio = 0.72 } = options\n const [fit, setFit] = useState<AnchoredPopoverFit | null>(null)\n /** 最近一次测量:内容异步变化时补测(见下方第二次 useLayoutEffect)。 */\n const measureRef = useRef<() => void>(() => {})\n\n useLayoutEffect(() => {\n if (!open) {\n measureRef.current = () => {}\n setFit(null)\n return\n }\n const measure = (): void => {\n const anchor = anchorRef.current?.getBoundingClientRect()\n const panel = panelRef.current\n if (anchor === undefined || panel === null) return\n const cap = Math.floor(window.innerHeight * maxViewportRatio)\n const desiredHeight = Math.min(measurePanelContentHeight(panel), cap)\n const next = resolveAnchoredPopoverFit({\n anchorTop: anchor.top,\n anchorBottom: anchor.bottom,\n desiredHeight,\n viewportHeight: window.innerHeight,\n gap,\n margin,\n })\n const maxHeight = Math.min(next.maxHeight, cap)\n setFit((current) => current?.side === next.side && current.maxHeight === maxHeight ? current : { side: next.side, maxHeight })\n }\n measureRef.current = measure\n measure()\n window.addEventListener('scroll', measure, true)\n window.addEventListener('resize', measure)\n const observer = typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(measure)\n if (anchorRef.current !== null) observer?.observe(anchorRef.current)\n if (panelRef.current !== null) observer?.observe(panelRef.current)\n return () => {\n observer?.disconnect()\n window.removeEventListener('scroll', measure, true)\n window.removeEventListener('resize', measure)\n }\n }, [open, anchorRef, panelRef, gap, margin, maxViewportRatio])\n\n // 面板被 max-height 锁住后,异步内容变高不会改变元素尺寸,ResizeObserver 不再触发\n // (模板列表首次打开为空、随后加载即此场景);每次渲染补测一次,让 scrollHeight 重新参与计算。\n useLayoutEffect(() => {\n measureRef.current()\n })\n\n const position = useAnchoredPosition({\n open: open && fit !== null,\n anchorRef,\n panelRef,\n side: fit?.side ?? 'bottom',\n gap,\n margin,\n })\n if (fit === null) return null\n return position === null\n ? { visibility: 'hidden', maxHeight: fit.maxHeight }\n : { ...position, maxHeight: fit.maxHeight }\n}\r\n","import { useCallback, useEffect, useRef, type KeyboardEvent as ReactKeyboardEvent, type RefObject } from 'react'\n\nexport const FOCUSABLE = 'button, [href], input, select, textarea, summary, [tabindex]:not([tabindex=\"-1\"])'\n\n/** 仅在焦点将越过首尾或当前焦点不在弹窗内时返回循环目标。 */\nexport function nextDialogFocusIndex(length: number, current: number, backward: boolean): number | undefined {\n if (length <= 0) return undefined\n if (current < 0) return backward ? length - 1 : 0\n if (backward && current === 0) return length - 1\n if (!backward && current === length - 1) return 0\n return undefined\n}\n\nexport function useDialogFocus<T extends HTMLElement>(open: boolean, onClose: () => void, options?: {\n initialFocusRef?: RefObject<HTMLElement | null>\n returnFocusRef?: RefObject<HTMLElement | null>\n}): {\n dialogRef: RefObject<T>\n onDialogKeyDown: (event: ReactKeyboardEvent<T>) => void\n} {\n const dialogRef = useRef<T>(null)\n const restoreRef = useRef<HTMLElement | null>(null)\n\n useEffect(() => {\n if (!open) return\n const returnTarget = options?.returnFocusRef?.current\n restoreRef.current = returnTarget?.querySelector<HTMLElement>(FOCUSABLE) ?? returnTarget ?? (document.activeElement instanceof HTMLElement ? document.activeElement : null)\n const card = restoreRef.current?.closest('article')\n const siblings = card?.parentElement === null || card?.parentElement === undefined ? [] : [...card.parentElement.children]\n const at = card === null || card === undefined ? -1 : siblings.indexOf(card)\n const fallbacks = at < 0 ? [] : [...siblings.slice(at + 1), ...siblings.slice(0, at).reverse()]\n .map((element) => element.querySelector<HTMLElement>(FOCUSABLE)).filter((element) => element !== null)\n const parent = card?.parentElement\n // 锚定浮层首帧可能仍为 hidden;与菜单一致,等定位帧后再聚焦。\n const frame = requestAnimationFrame(() => {\n const initial = options?.initialFocusRef?.current ?? [...(dialogRef.current?.querySelectorAll<HTMLElement>(FOCUSABLE) ?? [])]\n .find((element) => !element.matches(':disabled') && element.getClientRects().length > 0)\n ;(initial ?? dialogRef.current)?.focus()\n })\n return () => {\n cancelAnimationFrame(frame)\n if (restoreRef.current?.isConnected) { restoreRef.current.focus(); return }\n // 删除 owner 可先安排更精确的焦点;仅在焦点随卸载丢失时补到相邻卡/创建入口。\n if (document.activeElement !== document.body && document.activeElement?.isConnected) return\n const target = fallbacks.find((element) => element.isConnected && !element.matches(':disabled'))\n ?? parent?.querySelector<HTMLElement>('[data-create-entry], button:not(:disabled)')\n target?.focus()\n }\n }, [open])\n\n const onDialogKeyDown = useCallback((event: ReactKeyboardEvent<T>): void => {\n if (!open || event.defaultPrevented) return\n // body portal 的 React 事件仍向外层对话冒泡;浮层拥有自己的键盘边界。\n if (event.target instanceof Node && !dialogRef.current?.contains(event.target)) return\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n onClose()\n return\n }\n if (event.key !== 'Tab' || dialogRef.current === null) return\n const focusables = [...dialogRef.current.querySelectorAll<HTMLElement>(FOCUSABLE)]\n .filter((element) => !element.matches(':disabled') && element.getClientRects().length > 0)\n const current = document.activeElement instanceof HTMLElement ? focusables.indexOf(document.activeElement) : -1\n const next = nextDialogFocusIndex(focusables.length, current, event.shiftKey)\n if (next === undefined) return\n event.preventDefault()\n focusables[next]?.focus()\n }, [open, onClose])\n\n return { dialogRef, onDialogKeyDown }\n}\n","import { useId, useRef, type ReactNode, type RefObject } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Button, useDismissOnOutsidePointer } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { useAnchoredPopoverStyle } from './anchored-popover.ts'\nimport { useDialogFocus } from './dialog-focus.ts'\nimport styles from './controls.module.css'\n\n/** 共享 picker 表面:缺 anchor 时居中模态;传 anchor 时 body 顶层跟随触发按钮。 */\nexport function DialogSurface(props: {\n title: string\n ariaLabel?: string\n closeLabel?: string\n role?: 'dialog' | 'alertdialog'\n description?: string\n initialFocusRef?: RefObject<HTMLElement | null>\n returnFocusRef?: RefObject<HTMLElement | null>\n anchorRef?: RefObject<HTMLElement | null>\n size?: 'wide'\n footer?: ReactNode\n onClose: () => void\n children: ReactNode\n}): ReactNode {\n const { dialogRef, onDialogKeyDown } = useDialogFocus<HTMLDivElement>(true, props.onClose, props)\n const titleId = useId()\n const descriptionId = useId()\n const fallbackAnchorRef = useRef<HTMLElement>(null)\n const anchorRef = props.anchorRef ?? fallbackAnchorRef\n const panelRef = dialogRef as RefObject<HTMLElement | null>\n const anchored = props.anchorRef !== undefined\n const position = useAnchoredPopoverStyle({\n open: anchored,\n anchorRef,\n panelRef,\n gap: 8,\n margin: 12,\n })\n useDismissOnOutsidePointer(anchorRef, anchored, (open) => { if (!open) props.onClose() }, panelRef)\n\n const panel = (\n <div\n ref={dialogRef}\n className={`${anchored ? styles.templatePopover : styles.templateModal}${props.size === 'wide' ? ` ${styles.templateModalWide}` : ''}`}\n style={anchored ? position ?? { visibility: 'hidden' } : undefined}\n role={props.role ?? 'dialog'}\n tabIndex={-1}\n aria-modal={anchored ? undefined : true}\n aria-label={props.ariaLabel}\n aria-labelledby={props.ariaLabel === undefined ? titleId : undefined}\n aria-describedby={props.description === undefined ? undefined : descriptionId}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={onDialogKeyDown}\n >\n <div className={styles.templateModalHead}>\n <strong id={titleId}>{props.title}</strong>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={styles.dialogClose}\n aria-label={props.closeLabel ?? '关闭'}\n onClick={props.onClose}\n >\n ×\n </Button>\n </div>\n {props.description !== undefined && <p id={descriptionId} className={styles.confirmDescription}>{props.description}</p>}\n <div className={styles.templateModalList}>{props.children}</div>\n {props.footer !== undefined && <div className={styles.dialogFooter}>{props.footer}</div>}\n </div>\n )\n const surface = anchored ? panel : <div className={styles.modalBackdrop} onClick={props.onClose}>{panel}</div>\n return typeof document === 'undefined' || document.body === null ? surface : createPortal(surface, document.body)\n}\n","import { useEffect, useRef, useState, type ReactNode, type RefObject } from 'react'\nimport { DialogSurface } from './DialogSurface.tsx'\nimport styles from './controls.module.css'\n\n/** 危险操作确认:取消先聚焦;请求中拒绝重复提交,失败保留当前确认面。\n * 取消与确认同为 `.pillButton` 胶囊(同尺寸、同字号、同描边),确认按钮加 `data-danger`\n * 走全项目统一的「描边染红」危险形态(透明底、红调描边与文字)。\n * 两处入口(预设、角色卡等)共用本组件,因此删除确认的外观不会各走一套。 */\nexport function ConfirmDialog(props: {\n title: string\n description: string\n confirmLabel: string\n cancelLabel: string\n failureMessage?: string\n returnFocusRef?: RefObject<HTMLElement | null>\n onConfirm: () => void | Promise<void>\n onCancel: () => void\n}): ReactNode {\n const cancelRef = useRef<HTMLButtonElement>(null)\n const pending = useRef(false)\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<string>()\n useEffect(() => { if (busy) cancelRef.current?.focus() }, [busy])\n const cancel = (): void => { if (!pending.current) props.onCancel() }\n const confirm = async (): Promise<void> => {\n if (pending.current) return\n pending.current = true\n setBusy(true)\n setError(undefined)\n try {\n await props.onConfirm()\n props.onCancel()\n } catch (reason) {\n setError(reason instanceof Error ? reason.message : props.failureMessage ?? String(reason))\n } finally {\n pending.current = false\n setBusy(false)\n }\n }\n return <DialogSurface title={props.title} description={props.description} role=\"alertdialog\"\n initialFocusRef={cancelRef} returnFocusRef={props.returnFocusRef} closeLabel={props.cancelLabel} onClose={cancel}>\n {error !== undefined && <p className={styles.confirmError} role=\"alert\">{error}</p>}\n <div className={styles.confirmActions} aria-busy={busy}>\n <button ref={cancelRef} type=\"button\" className={styles.pillButton} aria-disabled={busy} onClick={cancel}>{props.cancelLabel}</button>\n <button type=\"button\" className={styles.pillButton} data-danger disabled={busy} onClick={() => { void confirm() }}>{props.confirmLabel}</button>\n </div>\n </DialogSurface>\n}\n","export type HintTooltipPosition =\n | { kind: 'pointer'; x: number; y: number }\n | { kind: 'focus'; left: number; right: number; centerY: number }\n\nconst clamp = (value: number, min: number, max: number): number =>\n max < min ? min : Math.min(Math.max(value, min), max)\n\n/** 把说明浮窗贴近指针或聚焦控件,并限制在视口内。 */\nexport function fitHintTooltipPosition(\n position: HintTooltipPosition,\n bubble: { width: number; height: number },\n viewport: { width: number; height: number },\n): { left: number; top: number } {\n const edge = 12\n const gap = 12\n let left = position.kind === 'pointer' ? position.x + gap : position.right + 10\n let top = position.kind === 'pointer' ? position.y + gap : position.centerY - bubble.height / 2\n if (left + bubble.width > viewport.width - edge) {\n left = position.kind === 'pointer' ? position.x - bubble.width - gap : position.left - bubble.width - 10\n }\n if (top + bubble.height > viewport.height - edge && position.kind === 'pointer') {\n top = position.y - bubble.height - gap\n }\n return {\n left: clamp(left, edge, viewport.width - edge - bubble.width),\n top: clamp(top, edge, viewport.height - edge - bubble.height),\n }\n}\n","/** 指针按下后多久内的 focus 视为鼠标点击聚焦(点击到 focus 通常间隔几十毫秒)。 */\nexport const POINTER_FOCUS_WINDOW_MS = 500\n\n/** 聚焦说明是否应锁定显示:只有键盘聚焦(Tab / :focus-visible)才算。\n * 鼠标点击按钮同样会触发 focus,若照此显示,点击后按钮失焦或卸载\n * 会让浮窗在按钮旁边闪一次。选择器查询不可用时保守按键盘聚焦处理。 */\nexport function isKeyboardFocus(element: { matches?: (selector: string) => boolean }): boolean {\n if (typeof element.matches !== 'function') return true\n try {\n return element.matches(':focus-visible')\n } catch {\n return true\n }\n}\n\n/** 是否锁定聚焦说明:刚发生指针按下(鼠标点击)一律不锁定——checkbox 等控件\n * 点击后也会匹配 :focus-visible,只靠选择器无法区分。 */\nexport function shouldLockFocus(options: {\n element: { matches?: (selector: string) => boolean }\n pointerDownAt: number\n now: number\n}): boolean {\n if (options.now - options.pointerDownAt < POINTER_FOCUS_WINDOW_MS) return false\n return isKeyboardFocus(options.element)\n}\n","import { cloneElement, useCallback, useEffect, useId, useLayoutEffect, useRef, useState, type FocusEventHandler, type MouseEventHandler, type MutableRefObject, type PointerEventHandler, type ReactElement, type ReactNode, type Ref } from 'react'\nimport { createPortal } from 'react-dom'\nimport css from './HintTooltip.module.css'\nimport { fitHintTooltipPosition, type HintTooltipPosition } from './hint-tooltip-position.ts'\nimport { shouldLockFocus } from './hint-tooltip-focus.ts'\n\n/** 悬停延迟:与 pointer 模式保持一致,失焦回到悬停时复用同一节奏。 */\nconst HOVER_DELAY_MS = 500\n\ninterface HintAnchorProps {\n ref?: Ref<HTMLElement>\n onMouseEnter?: MouseEventHandler\n onMouseMove?: MouseEventHandler\n onMouseLeave?: MouseEventHandler\n onPointerDown?: PointerEventHandler\n onFocus?: FocusEventHandler\n onBlur?: FocusEventHandler\n 'aria-describedby'?: string\n}\n\n/** 统一说明浮窗:只复用宿主视觉 token;定位走 body portal,悬停跟随指针,聚焦跟随控件。 */\nexport function HintTooltip(props: { label: string; children: ReactElement<HintAnchorProps> }): ReactNode {\n const id = useId()\n const anchor = useRef<HTMLElement | null>(null)\n const bubble = useRef<HTMLSpanElement | null>(null)\n const showTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n const hideTimer = useRef<ReturnType<typeof setTimeout> | null>(null)\n const pointer = useRef({ x: 0, y: 0 })\n const pointerDownAt = useRef(0)\n const triggers = useRef({ hover: false, focus: false })\n const [position, setPosition] = useState<HintTooltipPosition | null>(null)\n // 官方 Switch 等函数组件不透传 ref/焦点事件;只为这种锚点补一个可冒泡的 DOM owner。\n const source: ReactElement<HintAnchorProps> = typeof props.children.type === 'string'\n ? props.children : <span>{props.children}</span>\n const childRef = (source as ReactElement<HintAnchorProps> & { ref?: Ref<HTMLElement> }).ref\n const focusTarget = useRef<HTMLElement | null>(null)\n const mergedRef = useCallback((element: HTMLElement | null) => {\n anchor.current = element\n if (typeof childRef === 'function') childRef(element)\n else if (childRef != null) (childRef as MutableRefObject<HTMLElement | null>).current = element\n }, [childRef])\n const cancelShow = useCallback(() => {\n if (showTimer.current === null) return\n clearTimeout(showTimer.current)\n showTimer.current = null\n }, [])\n const cancelHide = useCallback(() => {\n if (hideTimer.current !== null) clearTimeout(hideTimer.current)\n hideTimer.current = null\n }, [])\n const hide = useCallback(() => {\n cancelHide()\n hideTimer.current = setTimeout(() => { if (!triggers.current.focus) setPosition(null) }, 160)\n }, [cancelHide])\n const showAtFocus = useCallback(() => {\n const rect = anchor.current?.getBoundingClientRect()\n if (rect === undefined) return\n setPosition({ kind: 'focus', left: rect.left, right: rect.right, centerY: rect.top + rect.height / 2 })\n }, [])\n const hideAfterBlur = useCallback(() => {\n cancelShow()\n if (!triggers.current.hover) {\n setPosition(null)\n return\n }\n // 鼠标仍悬停时不要立刻弹出:点击后按钮失焦会瞬间闪一次;回到悬停延迟。\n showTimer.current = setTimeout(() => {\n showTimer.current = null\n setPosition({ kind: 'pointer', ...pointer.current })\n }, HOVER_DELAY_MS)\n }, [cancelShow])\n\n useEffect(() => () => { cancelShow(); cancelHide() }, [cancelShow, cancelHide])\n useEffect(() => {\n if (position === null) return\n const dismiss = (event: KeyboardEvent): void => {\n if (event.key !== 'Escape') return\n event.preventDefault()\n event.stopImmediatePropagation()\n cancelShow()\n cancelHide()\n setPosition(null)\n }\n document.addEventListener('keydown', dismiss, true)\n return () => document.removeEventListener('keydown', dismiss, true)\n }, [position !== null, cancelShow, cancelHide])\n useEffect(() => {\n if (position?.kind !== 'focus') return\n const target = focusTarget.current\n const previous = target?.getAttribute('aria-describedby')\n if (target !== null) target.setAttribute('aria-describedby', [...new Set([...(previous ?? '').split(' '), id].filter(Boolean))].join(' '))\n const update = () => showAtFocus()\n window.addEventListener('resize', update)\n window.addEventListener('scroll', update, true)\n return () => {\n window.removeEventListener('resize', update)\n window.removeEventListener('scroll', update, true)\n if (target !== null) {\n const remaining = (target.getAttribute('aria-describedby') ?? '').split(' ').filter((value) => value !== id && value.length > 0).join(' ')\n if (remaining) target.setAttribute('aria-describedby', remaining)\n else target.removeAttribute('aria-describedby')\n }\n }\n }, [position?.kind, showAtFocus])\n\n useLayoutEffect(() => {\n if (position === null || bubble.current === null) return\n const element = bubble.current\n const rect = element.getBoundingClientRect()\n const fitted = fitHintTooltipPosition(position, rect, { width: window.innerWidth, height: window.innerHeight })\n element.style.left = `${fitted.left}px`\n element.style.top = `${fitted.top}px`\n }, [position, props.label])\n\n const child = cloneElement(source, {\n ref: mergedRef,\n 'aria-describedby': position === null\n ? source.props['aria-describedby']\n : [source.props['aria-describedby'], id].filter(Boolean).join(' '),\n onMouseEnter: (event) => {\n source.props.onMouseEnter?.(event)\n triggers.current.hover = true\n cancelHide()\n pointer.current = { x: event.clientX, y: event.clientY }\n if (triggers.current.focus) return\n cancelShow()\n showTimer.current = setTimeout(() => {\n showTimer.current = null\n setPosition({ kind: 'pointer', ...pointer.current })\n }, HOVER_DELAY_MS)\n },\n onMouseMove: (event) => {\n source.props.onMouseMove?.(event)\n pointer.current = { x: event.clientX, y: event.clientY }\n if (position?.kind === 'pointer') setPosition({ kind: 'pointer', ...pointer.current })\n },\n onMouseLeave: (event) => {\n source.props.onMouseLeave?.(event)\n triggers.current.hover = false\n cancelShow()\n if (!triggers.current.focus) hide()\n },\n onPointerDown: (event) => {\n source.props.onPointerDown?.(event)\n pointerDownAt.current = Date.now()\n cancelShow()\n cancelHide()\n setPosition(null)\n },\n onFocus: (event) => {\n source.props.onFocus?.(event)\n if (event.target instanceof Node && !event.currentTarget.contains(event.target)) {\n triggers.current.focus = false\n cancelShow()\n setPosition(null)\n return\n }\n focusTarget.current = event.target instanceof HTMLElement ? event.target : null\n // 鼠标点击也会触发 focus(checkbox 等控件点击后同样匹配 :focus-visible):\n // 只有键盘聚焦才锁定聚焦说明,否则点击按钮后它失焦或卸载会让浮窗在旁边闪一次。\n const keyboard = shouldLockFocus({ element: focusTarget.current ?? event.currentTarget, pointerDownAt: pointerDownAt.current, now: Date.now() })\n triggers.current.focus = keyboard\n cancelShow()\n if (keyboard) showAtFocus()\n },\n onBlur: (event) => {\n source.props.onBlur?.(event)\n triggers.current.focus = false\n hideAfterBlur()\n },\n })\n const tooltip = position !== null && typeof document !== 'undefined' && document.body !== null\n ? createPortal(<span ref={bubble} id={id} className={css.bubble} role=\"tooltip\"\n onMouseEnter={cancelHide} onMouseLeave={hide}>{props.label}</span>, document.body)\n : null\n return <>{child}{tooltip}</>\n}\n","/** 可复用导入按钮:隐藏原生 file input,统一触发、目录模式与重复选择重置。 */\nimport { useRef, type ReactNode } from 'react'\nimport { HintTooltip } from './HintTooltip.tsx'\nimport ui from './controls.module.css'\n\nexport function ImportFileButton(props: {\n label: string\n ariaLabel: string\n title?: string\n accept?: string\n directory?: boolean\n multiple?: boolean\n disabled?: boolean\n busy?: boolean\n busyLabel?: string\n className?: string\n onFiles: (files: File[]) => void\n}): ReactNode {\n const inputRef = useRef<HTMLInputElement>(null)\n const directoryProps = props.directory === true\n ? { webkitdirectory: '' } as Record<string, string>\n : undefined\n const busy = props.busy === true\n const button = (\n <button\n type=\"button\"\n className={props.className ?? ui.pillButton}\n disabled={props.disabled === true || busy}\n onClick={() => inputRef.current?.click()}\n >\n {busy && <span className={ui.spinner} aria-hidden=\"true\" />}\n {busy ? props.busyLabel ?? props.label : props.label}\n </button>\n )\n return (\n <>\n <input\n ref={inputRef}\n type=\"file\"\n accept={props.accept}\n multiple={props.multiple === true || props.directory === true}\n aria-label={props.ariaLabel}\n tabIndex={-1}\n disabled={props.disabled === true || busy}\n className={ui.visuallyHidden}\n {...directoryProps}\n onChange={(event) => {\n const files = Array.from(event.target.files ?? [])\n event.target.value = ''\n if (files.length > 0) props.onFiles(files)\n }}\n />\n {props.title === undefined ? button : <HintTooltip label={props.title}>{button}</HintTooltip>}\n </>\n )\n}\n","/** 导入预览卡:展示服务端同源转换报告与顺序组选择;只有用户确认才提交写入。\n * 组件自身不发起转换、不持草稿以外的状态,文本全部来自 prompt-tool 字典。\n * 候选状态(多 prompt_order 组无法明确对应)只让用户选组后重新预览,确认保持禁用——\n * 候选从未宣称已转换,也没有可回传的写入凭据。 */\nimport { memo, type ReactNode } from 'react'\nimport type { PromptToolTranslate } from '../locales.ts'\nimport type { ImportOrderCandidates, ImportPreviewState } from '../prompt-tool-types.ts'\nimport { MenuSelect } from './MenuSelect.tsx'\nimport sharedCss from './controls.module.css'\n\nexport type { ImportPreviewState } from '../prompt-tool-types.ts'\n\nexport const ImportPreviewCard = memo(function ImportPreviewCard(props: {\n t: PromptToolTranslate\n preview?: ImportPreviewState\n candidates?: ImportOrderCandidates\n /** 提交进行中:确认与取消都禁用。 */\n busy: boolean\n /** 重新预览进行中:旧 ready 已失效,只有确认禁用(仍可继续换组)。 */\n confirmDisabled?: boolean\n hideActions?: boolean\n onGroupChange: (characterId: string) => void\n onConfirm: () => void\n onCancel: () => void\n}): ReactNode {\n const { t, preview, candidates, busy } = props\n const candidateMode = candidates !== undefined\n const confirmDisabled = busy || props.confirmDisabled === true || candidateMode\n const report = preview?.report\n const groups = report?.orderGroups ?? []\n const warnings = report?.diagnostics.filter((item) => item.severity === 'warning') ?? []\n const infos = report?.diagnostics.filter((item) => item.severity === 'info') ?? []\n const excluded = report?.entries.filter((entry) => entry.classification === 'excluded') ?? []\n const selectedGroup = preview?.groupCharacterId ?? groups.find((group) => group.selected)?.characterId ?? groups[0]?.characterId ?? ''\n // 有损信息必须可查看:只要还存在降级/不支持/排除条目或 info 诊断,就不宣称\"无需检查\"。\n const lossy = (report?.summary.degraded ?? 0) + (report?.summary.unsupported ?? 0) + (report?.summary.excluded ?? 0)\n const hasFindings = warnings.length > 0 || infos.length > 0 || excluded.length > 0 || lossy > 0\n const groupOption = (id: string, entries: number): { value: string; label: string } =>\n ({ value: id, label: t('importPreview.groupOption', { id, entries }) })\n /** 一条诊断/条目的定位:来源身份与目标身份分字段展示,不只重复告警文字。 */\n const location = (source?: string, target?: string): ReactNode =>\n (source === undefined && target === undefined)\n ? null\n : (\n <small className={sharedCss.previewLocation}>\n {source === undefined ? null : t('importPreview.diagSource', { source })}\n {source !== undefined && target !== undefined ? ' · ' : null}\n {target === undefined ? null : t('importPreview.diagTarget', { target })}\n </small>\n )\n return (\n <div className={sharedCss.section}>\n <div className={sharedCss.sectionHeading}>\n <div>\n <h2>{t('importPreview.title')}</h2>\n {candidateMode\n ? <p>{t('importPreview.needsGroup', { source: candidates.sourceName ?? '' })}</p>\n : (\n <p>\n {report === undefined\n ? null\n : t('importPreview.summary', {\n inputs: report.summary.inputs, converted: report.summary.converted, disabled: report.summary.disabled,\n degraded: report.summary.degraded, unsupported: report.summary.unsupported, excluded: report.summary.excluded,\n })}\n </p>\n )}\n </div>\n </div>\n {candidateMode && (\n <div>\n <span>{t('importPreview.groups')}</span>\n <MenuSelect\n value=\"\"\n options={candidates.candidates.map((candidate) => groupOption(candidate.characterId, candidate.entries))}\n onChange={props.onGroupChange}\n ariaLabel={t('importPreview.groupsAria')}\n placeholder={t('importPreview.pickGroup')}\n disabled={busy}\n />\n </div>\n )}\n {!candidateMode && groups.length > 1 && (\n <div>\n <span>{t('importPreview.groups')}</span>\n <MenuSelect value={selectedGroup} options={groups.map((group) => groupOption(group.characterId, group.entries))}\n onChange={props.onGroupChange} ariaLabel={t('importPreview.groupsAria')} disabled={busy} />\n </div>\n )}\n {!candidateMode && report !== undefined && warnings.length > 0 && (\n <div className={sharedCss.previewGroup}>\n <p className={sharedCss.previewGroupTitle}>{t('importPreview.review', { count: warnings.length })}</p>\n {/* 服务端已给出有界数据:这里全部展示(长列表在容器内滚动),不再二次截断。 */}\n <ul className={sharedCss.previewList} data-preview-warnings tabIndex={0} aria-label={t('importPreview.reviewAria', { count: warnings.length })}>\n {warnings.map((item) => (\n <li className={sharedCss.previewItem} key={`${item.code}:${item.entryId ?? ''}`}>\n {item.message}\n {location(item.entryId, item.targetId)}\n </li>\n ))}\n </ul>\n </div>\n )}\n {!candidateMode && report !== undefined && infos.length > 0 && (\n <div className={sharedCss.previewGroup}>\n <p className={sharedCss.previewGroupTitle}>{t('importPreview.info', { count: infos.length })}</p>\n <ul className={sharedCss.previewList} data-preview-infos tabIndex={0} aria-label={t('importPreview.infoAria', { count: infos.length })}>\n {infos.map((item) => (\n <li className={sharedCss.previewItem} key={`${item.code}:${item.entryId ?? ''}`}>\n {item.message}\n {location(item.entryId, item.targetId)}\n </li>\n ))}\n </ul>\n </div>\n )}\n {!candidateMode && report !== undefined && excluded.length > 0 && (\n <div className={sharedCss.previewGroup}>\n <p className={sharedCss.previewGroupTitle}>{t('importPreview.excluded', { count: excluded.length })}</p>\n <ul className={sharedCss.previewList} data-preview-excluded tabIndex={0} aria-label={t('importPreview.excludedAria', { count: excluded.length })}>\n {excluded.map((entry, index) => (\n <li className={sharedCss.previewItem} key={`${entry.sourceId}:${index}`}>\n {t('importPreview.excludedItem', { source: entry.sourceId, codes: entry.codes.join(', ') })}\n {location(entry.sourceName)}\n </li>\n ))}\n </ul>\n </div>\n )}\n {!candidateMode && report !== undefined && !hasFindings && <p>{t('importPreview.none')}</p>}\n {!candidateMode && report?.truncated === true && (\n <p>\n {t('importPreview.truncated', {\n entries: report.entries.length,\n diagnostics: report.diagnostics.length,\n inputs: report.summary.inputs,\n })}\n </p>\n )}\n {!props.hideActions && <div>\n <button type=\"button\" className={sharedCss.primaryPill} disabled={confirmDisabled} onClick={props.onConfirm}>\n {t('importPreview.confirm')}\n </button>\n <button type=\"button\" className={sharedCss.pillButton} disabled={busy} onClick={props.onCancel}>\n {t('importPreview.cancel')}\n </button>\n </div>}\n </div>\n )\n})\n","import { useEffect, useId, useRef, useState, type ReactNode } from 'react'\nimport type { ImportChoices, ImportKind } from '../../shared/asset-transfer.ts'\nimport type { ImportOrderCandidates, ImportPreviewState } from '../prompt-tool-types.ts'\nimport type { PromptToolTranslate } from '../locales.ts'\nimport { DialogSurface } from './DialogSurface.tsx'\nimport { MenuSelect } from './MenuSelect.tsx'\nimport { ConfirmDialog } from './ConfirmDialog.tsx'\nimport { ImportFileButton } from './ImportFileButton.tsx'\nimport { ImportPreviewCard } from './ImportPreviewCard.tsx'\nimport sharedCss from './controls.module.css'\nimport css from './ImportDialog.module.css'\n\nexport function ImportDialog(props: {\n t: PromptToolTranslate\n destination: 'preset' | 'character'\n phase: 'idle' | 'reading' | 'confirming' | 'submitting' | 'stale' | 'error' | 'complete'\n preview?: ImportPreviewState\n candidates?: ImportOrderCandidates\n kinds?: ImportKind[]\n choices: ImportChoices\n sourceName: string\n sourceImage?: string\n error: string\n refreshError: string\n progress: { index: number; total: number; imported: number; skipped: number; failed: number; failures: string[] }\n targets: Array<{ id: string; name: string }>\n onFiles: (files: File[], directory: boolean) => void\n onChoices: (choices: ImportChoices) => void\n onConfirm: () => void\n onClose: () => void\n onReset: () => void\n onSkip: () => void\n onEnd: () => void\n onRepreview: () => void\n onRefresh: () => void\n onUse?: () => void\n}): ReactNode {\n const { t, phase, preview, choices, progress } = props\n const [confirming, setConfirming] = useState(false)\n const [imageFailed, setImageFailed] = useState(false)\n const errorRef = useRef<HTMLParagraphElement>(null)\n const headingRef = useRef<HTMLHeadingElement>(null)\n const id = useId()\n const summary = preview?.summary\n const busy = phase === 'submitting'\n const complete = phase === 'complete'\n const validId = choices.targetId === undefined || (choices.targetId.length <= 128 && /^[a-z0-9][a-z0-9-]*$/.test(choices.targetId))\n const ready = phase === 'confirming' && preview !== undefined && validId && (choices.targetName === undefined || choices.targetName.trim().length > 0)\n const close = (): void => { if (!busy) props.onClose() }\n useEffect(() => { if (props.error) errorRef.current?.focus() }, [props.error])\n useEffect(() => { setConfirming(false) }, [preview?.previewRevision, phase])\n useEffect(() => { setImageFailed(false) }, [props.sourceImage])\n const fromCharacter = summary?.kind === 'native-character' || summary?.kind === 'st-character'\n const confirmLabel = choices.overwrite === true ? t('assetImport.update') : t(props.destination === 'preset' ? fromCharacter ? 'assetImport.createFromCharacter' : 'assetImport.createPreset' : 'assetImport.createCharacter')\n if (confirming) return <ConfirmDialog title={t('assetImport.overwriteTitle', { name: summary?.targetName ?? choices.targetName ?? '' })}\n description={t(props.destination === 'character' ? 'assetImport.characterReplace' : 'assetImport.presetReplace')}\n confirmLabel={confirmLabel} cancelLabel={t('assetImport.back')}\n onCancel={() => setConfirming(false)} onConfirm={() => { setConfirming(false); props.onConfirm() }} />\n return <DialogSurface title={t(props.destination === 'preset' ? 'assetImport.presetTitle' : 'assetImport.characterTitle')}\n closeLabel={t('assetImport.close')} onClose={close} size=\"wide\" initialFocusRef={headingRef}\n footer={<>\n {complete ? <>\n <button type=\"button\" className={sharedCss.pillButton} onClick={close}>{t('assetImport.done')}</button>\n {props.refreshError ? <button type=\"button\" className={sharedCss.primaryPill} onClick={props.onRefresh}>{t('assetImport.refresh')}</button>\n : props.onUse && progress.imported > 0 ? <button type=\"button\" className={sharedCss.primaryPill} onClick={props.onUse}>{t(props.destination === 'preset' ? 'assetImport.switch' : 'assetImport.apply')}</button> : null}\n </> : <>\n {phase !== 'idle' && progress.total <= 1 && <button type=\"button\" className={sharedCss.pillButton} disabled={busy} onClick={props.onReset}>{t('assetImport.reselect')}</button>}\n {progress.total > 1 && <button type=\"button\" className={sharedCss.pillButton} disabled={busy} onClick={props.onSkip}>{t('assetImport.skip')}</button>}\n <button type=\"button\" className={sharedCss.pillButton} disabled={busy} onClick={progress.total > 1 ? props.onEnd : close}>{t(progress.total > 1 ? 'assetImport.end' : 'assetImport.cancel')}</button>\n {(phase === 'error' || phase === 'stale') ? <button type=\"button\" className={sharedCss.primaryPill} onClick={props.onRepreview}>{t('assetImport.repreview')}</button>\n : phase !== 'idle' && <button type=\"button\" className={sharedCss.primaryPill} disabled={!ready} onClick={() => choices.overwrite ? setConfirming(true) : props.onConfirm()}>{confirmLabel}</button>}\n </>}\n </>}>\n <div className={css.content} aria-busy={phase === 'reading' || busy}>\n <h2 ref={headingRef} tabIndex={-1} className={css.heading}>{t(complete ? 'assetImport.result' : phase === 'idle' ? 'assetImport.select' : 'assetImport.inspect')}</h2>\n <ol className={css.steps} aria-label={t('assetImport.steps')}>\n {(['assetImport.select', 'assetImport.inspect', 'assetImport.result'] as const).map((key, step) => <li key={key} aria-current={step === (complete ? 2 : phase === 'idle' ? 0 : 1) ? 'step' : undefined}>{t(key)}</li>)}\n </ol>\n {progress.total > 1 && !complete && <p>{t('assetImport.queue', { index: progress.index, total: progress.total })}</p>}\n {phase === 'idle' ? <>\n <p>{t('assetImport.formats')}</p><p>{t('assetImport.noWrite')}</p>\n <div className={css.actions}>\n <ImportFileButton label={t('assetImport.file')} ariaLabel={t('assetImport.file')} accept=\".zip,.json,.png,.yml,.yaml\" multiple={props.destination === 'character'} onFiles={(files) => props.onFiles(files, false)} />\n <ImportFileButton label={t('assetImport.folder')} ariaLabel={t('assetImport.folder')} directory onFiles={(files) => props.onFiles(files, true)} />\n </div>\n </> : complete ? <>\n <p role=\"status\">{t('assetImport.counts', { imported: progress.imported, skipped: progress.skipped, failed: progress.failed })}</p>\n {progress.failures.length > 0 && <ul>{progress.failures.map((failure, index) => <li key={index}>{failure}</li>)}</ul>}\n {props.refreshError && <p role=\"alert\">{t('assetImport.refreshFailed', { reason: props.refreshError })}</p>}\n </> : <>\n <p>{t('assetImport.source', { name: summary?.sourceName ?? props.sourceName })}</p>\n {props.sourceImage && (imageFailed ? <p>{t('assetImport.avatarUnavailable')}</p> : <img className={css.avatar} src={props.sourceImage} alt={t('assetImport.avatar', { name: summary?.targetName ?? props.sourceName })} onError={() => setImageFailed(true)} />)}\n {(phase === 'reading' || busy) && <p role=\"status\">{t(busy ? 'assetImport.submitting' : 'assetImport.reading')}</p>}\n {props.error && <p ref={errorRef} tabIndex={-1} role=\"alert\" className={sharedCss.confirmError}>{phase === 'stale' ? `${t('assetImport.stale')} ${props.error}` : props.error}</p>}\n {props.kinds !== undefined && <fieldset><legend>{t('assetImport.kind')}</legend>{props.kinds.map((kind) => <label key={kind} className={css.option}><input type=\"radio\" name={`${id}-kind`} checked={choices.sourceKind === kind} onChange={() => props.onChoices({ sourceKind: kind })} />{t(`assetImport.kind.${kind}`)}</label>)}</fieldset>}\n {summary !== undefined && <>\n <p>{t(`assetImport.kind.${summary.kind}`)} · {t('assetImport.summary', { files: summary.files.length, bytes: summary.files.reduce((total, file) => total + file.bytes, 0), configs: summary.configCount })}</p>\n <fieldset disabled={busy} className={css.fields}>\n <legend>{t('assetImport.target')}</legend>\n <label>{t('assetImport.name')}<input value={choices.targetName ?? summary.targetName} onChange={(event) => props.onChoices({ targetName: event.target.value })} aria-invalid={choices.targetName?.trim() === ''} /></label>\n <label>{t('assetImport.id')}<input value={choices.targetId ?? summary.targetId} onChange={(event) => props.onChoices({ targetId: event.target.value })} aria-invalid={!validId} aria-describedby={!validId ? `${id}-invalid` : undefined} /></label>\n {!validId && <p id={`${id}-invalid`} role=\"alert\">{t('assetImport.invalidId')}</p>}\n <label className={css.option}><input type=\"radio\" name={`${id}-target`} checked={!choices.overwrite} onChange={() => props.onChoices({ overwrite: false, targetId: undefined })} />{t('assetImport.new')}</label>\n <label className={css.option}><input type=\"radio\" name={`${id}-target`} checked={choices.overwrite === true} disabled={props.targets.length === 0} onChange={() => props.onChoices({ overwrite: true, targetId: props.targets[0]?.id })} />{t('assetImport.existing')}</label>\n {choices.overwrite && <div>{t('assetImport.existing')}<MenuSelect value={choices.targetId ?? ''} ariaLabel={t('assetImport.existing')} disabled={busy} onChange={(targetId) => props.onChoices({ targetId })} options={props.targets.map((target) => ({ value: target.id, label: `${target.name} · ${target.id}` }))} /></div>}\n </fieldset>\n <p>{t(choices.overwrite ? props.destination === 'character' ? 'assetImport.characterReplace' : 'assetImport.presetReplace' : 'assetImport.newHint')}</p>\n <details><summary>{t('assetImport.files', { count: summary.files.length })}</summary><ul className={css.files}>{summary.files.map((file) => <li key={file.path}><span>{file.path}</span><span>{file.bytes} B · {t(choices.overwrite ? 'assetImport.replace' : 'assetImport.add')}</span></li>)}</ul></details>\n {summary.warnings.length > 0 && <details open><summary>{t('assetImport.warnings')}</summary><ul>{summary.warnings.map((warning, index) => <li key={index}>{warning}</li>)}</ul></details>}\n </>}\n {(preview !== undefined || props.candidates !== undefined) && <ImportPreviewCard t={t} preview={preview === undefined ? undefined : { ...preview, groupCharacterId: choices.promptOrderCharacterId ?? preview.groupCharacterId }} candidates={props.candidates} busy={busy} hideActions onGroupChange={(characterId) => props.onChoices({ promptOrderCharacterId: characterId })} onConfirm={props.onConfirm} onCancel={close} />}\n {!ready && phase === 'confirming' && <p role=\"status\">{t('assetImport.chooseFirst')}</p>}\n </>}\n </div>\n </DialogSurface>\n}\n","import type { ReactNode } from 'react'\nimport css from './StatusDot.module.css'\n\n/** 状态色调:成功 / 中性 / 失败 / 警告。 */\nexport type StatusDotTone = 'success' | 'neutral' | 'danger' | 'warning'\n\n/** 实心状态圆点与柔和静态光晕,状态含义由相邻文字提供。 */\nexport function StatusDot(props: { tone: StatusDotTone }): ReactNode {\n return <i className={css.dot} data-tone={props.tone} aria-hidden=\"true\" />\n}\n","import type { ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { Tag } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { StatusDot, type StatusDotTone } from './StatusDot.tsx'\nimport css from './StatusBadge.module.css'\n\n/** 状态色调:成功 / 中性 / 失败;同时驱动共享 StatusDot 与官方 Tag 胶囊。 */\nexport type StatusBadgeTone = StatusDotTone\n\n/** 只读状态徽章:共享 StatusDot + 官方 Tag,跨 feature 复用的唯一状态呈现形态。 */\nexport function StatusBadge(props: {\n tone: StatusBadgeTone\n label: ReactNode\n ariaLabel?: string\n className?: string\n}): ReactNode {\n return (\n <span className={clsx(css.badge, props.className)} aria-label={props.ariaLabel}>\n <StatusDot tone={props.tone} />\n <Tag tone={props.tone}>{props.label}</Tag>\n </span>\n )\n}\n","/** 角色管理页:角色卡库(PNG / JSON 素材 + 转换参数独立存储)。\n * 库中角色卡不直接生成预设——点击「导入到当前预设」把角色卡参数\n * (角色设定 / 系统提示 / 开场白 / 提示词库 / 采样参数)合并进当前激活预设,\n * 已导入的角色卡显示状态并可一键移除。 */\nimport { memo, useEffect, useRef, useState, type ReactNode } from 'react'\nimport { IconFolderOpenOutlineRegular, IconTrashOutlineRegular } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { bridgeCall } from '../../data/bridge-client.ts'\nimport { previewAsset, commitAsset } from '../../data/asset-import.ts'\nimport { useImportPreviewFlow } from '../../data/use-import-preview-flow.ts'\nimport { ConfirmDialog } from '../../ui/ConfirmDialog.tsx'\nimport { ImportDialog } from '../../ui/ImportDialog.tsx'\nimport { HintTooltip } from '../../ui/HintTooltip.tsx'\nimport { StatusBadge } from '../../ui/StatusBadge.tsx'\nimport type { PromptToolStore } from '../../data/use-prompt-tool-store.ts'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport sharedCss from '../../ui/controls.module.css'\nimport featureCss from './characters.module.css'\n\nconst ui = { ...sharedCss, ...featureCss }\n\ninterface CharacterCardItem {\n id: string\n name: string\n description?: string\n hasAvatar: boolean\n imported: boolean\n}\n\nexport const CharactersPage = memo(function CharactersPage(props: { store: PromptToolStore; t: PromptToolTranslate; onReady?: () => void }): ReactNode {\n const { store, t } = props\n const [confirmingDelete, setConfirmingDelete] = useState<string | undefined>(undefined)\n const [busy, setBusy] = useState<string | undefined>(undefined)\n const [importOpen, setImportOpen] = useState(false)\n const [characters, setCharacters] = useState<CharacterCardItem[]>([])\n const [loading, setLoading] = useState(true)\n const [loadError, setLoadError] = useState('')\n const loadSequence = useRef(0)\n const importArea = useRef<HTMLDivElement>(null)\n\n const loadCharacters = async (throwOnError = false): Promise<void> => {\n const sequence = ++loadSequence.current\n setLoading(true)\n setLoadError('')\n const res = await bridgeCall('charactersList')\n if (sequence !== loadSequence.current) return\n if (res.ok) setCharacters(res.value.characters)\n else setLoadError(res.message ?? t('card.operationFailed'))\n setLoading(false)\n if (!res.ok && throwOnError) throw new Error(res.message ?? t('card.operationFailed'))\n }\n useEffect(() => {\n void loadCharacters()\n return () => { loadSequence.current += 1 }\n }, [])\n useEffect(() => { if (!loading) props.onReady?.() }, [loading, props.onReady])\n\n // 角色 JSON 导入复用与预设包相同的预览流程:等待确认时按钮可用,只有提交阶段禁用。\n const flow = useImportPreviewFlow({\n directoryTooLarge: t('assetImport.directoryTooLarge'),\n preview: (request) => previewAsset('charactersImport', request),\n commit: (preview) => commitAsset('charactersImport', preview),\n onCommitted: async (label) => {\n store.showNotice('ok', t('characters.notice.stored', { name: label ?? '' }))\n await loadCharacters(true)\n },\n onError: (message, stale) => {\n store.showNotice('error', t('characters.notice.submitFailed', { reason: stale ? t('importPreview.stale') : message }))\n },\n })\n\n /** 角色卡参数导入当前预设(合并 promptConfigs + params,重建后生效)。 */\n const applyCard = async (id: string): Promise<void> => {\n setBusy(id)\n try {\n const res = await bridgeCall('charactersApply', { id })\n if (res.ok) {\n store.showNotice('ok', t('characters.notice.applied', { count: res.value.count }))\n await store.load()\n await loadCharacters()\n } else {\n store.showNotice('error', t('characters.notice.applyFailed', { reason: res.message ?? 'settings bridge unavailable' }))\n }\n } finally {\n setBusy(undefined)\n }\n }\n\n /** 从当前预设移除该角色卡参数。 */\n const removeCard = async (id: string): Promise<void> => {\n setBusy(id)\n try {\n const res = await bridgeCall('charactersRemove', { id })\n if (res.ok) {\n store.showNotice('ok', t('characters.notice.removed', { count: res.value.count }))\n await store.load()\n await loadCharacters()\n } else {\n store.showNotice('error', t('characters.notice.removeFailed', { reason: res.message ?? 'settings bridge unavailable' }))\n }\n } finally {\n setBusy(undefined)\n }\n }\n\n const deleteCard = async (id: string): Promise<void> => {\n const res = await bridgeCall('charactersDelete', { id })\n if (res.ok) {\n store.showNotice('ok', t('characters.notice.deleted', { id }))\n await loadCharacters()\n setConfirmingDelete((current) => current === id ? undefined : current)\n } else {\n throw new Error(t('characters.notice.deleteFailed', { reason: res.message ?? 'settings bridge unavailable' }))\n }\n }\n\n const openLocation = async (id: string): Promise<void> => {\n const res = await bridgeCall('presetOpen', { id: `/.characters/${id}` })\n if (res.ok) store.showNotice('ok', t('characters.notice.opened', { path: res.value.path }))\n else store.showNotice('error', t('characters.notice.openFailed', { reason: res.message ?? 'settings bridge unavailable' }))\n }\n\n return (\n <section className={ui.section} aria-label={t('characters.aria')}>\n {importOpen && <ImportDialog t={t} destination=\"character\" {...flow} targets={characters}\n onFiles={(files, directory) => { void flow.run(files, directory ? 'package' : 'files') }} onChoices={flow.updateChoices}\n onConfirm={() => { void flow.confirm() }} onClose={() => { flow.cancel(); setImportOpen(false) }} onReset={flow.cancel}\n onSkip={flow.skip} onEnd={flow.end} onRepreview={() => { void flow.repreview() }} onRefresh={() => { void flow.retryRefresh() }}\n onUse={flow.resultLabel === undefined ? undefined : () => { void applyCard(flow.resultLabel!); flow.cancel(); setImportOpen(false) }} />}\n <div ref={importArea} className={ui.rowGroup}>\n <div className={ui.settingRowStack}>\n <span className={ui.settingCopy}>\n <strong>{t('characters.library.title')}</strong>\n <small>{t('characters.library.hint')}</small>\n </span>\n <span className={ui.inlineControls}>\n <button type=\"button\" className={ui.primaryPill} onClick={() => setImportOpen(true)}>{t('assetImport.characterTitle')}…</button>\n </span>\n </div>\n </div>\n\n {loadError && <p className={ui.noticeError} role=\"alert\">{loadError} <button type=\"button\" className={ui.pillButton} onClick={() => void loadCharacters()}>{t('workspace.retry')}</button></p>}\n {loading && <p role=\"status\">{t('app.loading')}</p>}\n {!loading && !loadError && characters.length === 0 ? (\n <div className={ui.emptyState}>\n <span className={ui.emptyGlyph} aria-hidden=\"true\">⌁</span>\n <div>\n <h3>{t('characters.empty.title')}</h3>\n <p>{t('characters.empty.hint')}</p>\n <button type=\"button\" className={ui.pillButton} onClick={() => setImportOpen(true)}>{t('assetImport.characterTitle')}…</button>\n </div>\n </div>\n ) : (\n <div className={ui.presetGrid}>\n {characters.map((card) => {\n const confirming = confirmingDelete === card.id\n return (\n <article key={card.id} className={ui.presetCard}>\n <div className={ui.presetCardBody}>\n <span className={ui.presetCardHead}>\n <strong className={ui.presetCardName}>{card.name}</strong>\n {card.imported && <StatusBadge className={ui.presetHeadBadge} tone=\"success\" label={t('characters.badge.imported')} />}\n </span>\n {card.description !== undefined && card.description.length > 0\n && <p className={ui.presetCardDesc}>{card.description}</p>}\n <code className={ui.presetCardId}>{card.id}</code>\n </div>\n <span className={ui.presetCardFooter}>\n {card.imported ? (\n <button type=\"button\" className={ui.pillButton} data-variant=\"secondary\" disabled={busy === card.id}\n onClick={() => void removeCard(card.id)}>\n {busy === card.id ? t('characters.removing') : t('characters.remove')}\n </button>\n ) : (\n <button type=\"button\" className={ui.primaryPill} disabled={busy === card.id}\n onClick={() => void applyCard(card.id)}>\n {busy === card.id ? t('characters.importing') : t('characters.apply')}\n </button>\n )}\n <HintTooltip label={t('characters.openDir.label')}>\n <button type=\"button\" className={ui.presetIconButton}\n aria-label={t('characters.openDir.aria', { name: card.name })}\n onClick={() => void openLocation(card.id)}>\n <IconFolderOpenOutlineRegular />\n </button>\n </HintTooltip>\n {confirming && (\n <ConfirmDialog title={t('card.deleteTitle', { name: card.name })}\n description={t('characters.delete.description', { name: card.name })}\n confirmLabel={t('characters.confirmDelete')} cancelLabel={t('characters.cancel')}\n onConfirm={() => deleteCard(card.id)} onCancel={() => setConfirmingDelete((current) => current === card.id ? undefined : current)} />\n )}\n {(\n <HintTooltip label={t('characters.delete.label')}>\n <button type=\"button\" className={ui.presetIconButton}\n aria-label={t('characters.delete.aria', { name: card.name })}\n onClick={() => setConfirmingDelete(card.id)}>\n <IconTrashOutlineRegular />\n </button>\n </HintTooltip>\n )}\n </span>\n </article>\n )\n })}\n </div>\n )}\n </section>\n )\n})\n","/** fields 订阅式选择器(L3 selector 化):\n * 组件通过 useSyncExternalStore 订阅 store.fields 的引用变化,仅在所选切片\n * 变化时重渲染——配合 React.memo 组件,父级重渲染不再级联触发子组件。\n * 注意 selector 只在 fields 引用变化时执行一次,返回引用由组件 ref 缓存。\n */\nimport { useRef, useSyncExternalStore } from 'react'\nimport type { Fields } from './prompt-tool-fields.ts'\nimport type { PromptToolStore } from './use-prompt-tool-store.ts'\n\nexport function usePromptToolFields<T>(store: PromptToolStore, selector: (fields: Fields) => T): T {\n const fields = useSyncExternalStore(store.subscribeFields, store.getFields, store.getFields)\n const cache = useRef<{ fields: Fields | undefined; value: T }>({ fields: undefined, value: undefined as unknown as T })\n if (cache.current.fields !== fields) {\n cache.current = { fields, value: selector(fields) }\n }\n return cache.current.value\n}","import { useEffect, useId, useRef, useState, type ReactNode } from 'react'\nimport type { PresetExportResult } from '../../../shared/asset-transfer.ts'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport { bridgeCall, errorMessage } from '../../data/bridge-client.ts'\nimport { DialogSurface } from '../../ui/DialogSurface.tsx'\nimport shared from '../../ui/controls.module.css'\nimport css from './presets.module.css'\n\nexport function PresetExportDialog(props: { preset: { id: string; name: string }; t: PromptToolTranslate; onClose: () => void }): ReactNode {\n const { t, preset } = props\n const id = useId()\n const [mode, setMode] = useState<'zip' | 'definition'>('zip')\n const [memoryChoices, setMemoryChoices] = useState<Record<string, 'include' | 'exclude'>>({})\n const [preview, setPreview] = useState<PresetExportResult>()\n const [phase, setPhase] = useState<'reading' | 'ready' | 'downloading' | 'done' | 'error'>('reading')\n const [error, setError] = useState('')\n const [retry, setRetry] = useState(0)\n const version = useRef(0)\n const ready = useRef(false)\n const pending = useRef(false)\n const errorRef = useRef<HTMLParagraphElement>(null)\n useEffect(() => { if (error) errorRef.current?.focus() }, [error])\n useEffect(() => {\n const sequence = ++version.current\n ready.current = false\n setPhase('reading')\n setError('')\n void bridgeCall('exportPreset', { id: preset.id, mode, memoryChoices, preview: true }).then((response) => {\n if (sequence !== version.current) return\n if (!response.ok) { setError(response.message ?? t('card.operationFailed')); setPhase('error'); return }\n setPreview(response.value)\n setPhase('ready')\n ready.current = true\n })\n return () => { version.current += 1; ready.current = false }\n }, [preset.id, mode, memoryChoices, retry, t])\n const invalidate = (): void => { ready.current = false; version.current += 1; setPhase('reading') }\n const unresolved = (preview?.memoryConflicts ?? []).some((entry) => memoryChoices[entry.id] === undefined)\n const blocked = mode === 'zip' && (preview?.blockers?.length ?? 0) > 0\n const canDownload = phase === 'ready' && !unresolved && !blocked && preview?.revision !== undefined\n const download = async (): Promise<void> => {\n if (!ready.current || !canDownload || pending.current) return\n pending.current = true\n ready.current = false\n const sequence = version.current\n setPhase('downloading')\n try {\n const response = await bridgeCall('exportPreset', { id: preset.id, mode, memoryChoices, expectedRevision: preview.revision })\n if (sequence !== version.current) return\n if (!response.ok) throw new Error(response.message ?? t('card.operationFailed'))\n const exported = response.value\n const bytes = exported.encoding === 'base64' ? Uint8Array.from(atob(exported.content), (char) => char.charCodeAt(0)) : exported.content\n const url = URL.createObjectURL(new Blob([bytes], { type: mode === 'zip' ? 'application/zip' : 'application/yaml' }))\n const anchor = document.createElement('a')\n anchor.href = url\n anchor.download = exported.filename ?? `${preset.id}.${mode === 'zip' ? 'zip' : 'preset.yml'}`\n document.body.append(anchor)\n anchor.click()\n anchor.remove()\n // 宽限期远长于浏览器默认下载:桌面版走 Electron 默认下载流程(原生「另存为」\n // 对话框),用户可能长时间停留在那里;blob 数据在下载启动时已被读取,这里只是\n // 冗余保险,避免对话框尚未确认时 URL 先被回收。每次导出是一条待回收 URL。\n setTimeout(() => URL.revokeObjectURL(url), 60_000)\n setPhase('done')\n } catch (reason) { if (sequence === version.current) { setError(errorMessage(reason)); setPhase('error') } }\n finally { pending.current = false }\n }\n const close = (): void => { if (!pending.current) props.onClose() }\n return <DialogSurface title={t('assetExport.title', { name: preset.name })} closeLabel={t('assetImport.close')} onClose={close}\n footer={<>\n <button type=\"button\" className={shared.pillButton} disabled={phase === 'downloading'} onClick={close}>{t(phase === 'done' ? 'assetImport.done' : 'assetImport.cancel')}</button>\n {phase === 'error' ? <button type=\"button\" className={shared.primaryPill} onClick={() => setRetry((value) => value + 1)}>{t('assetExport.preview')}</button>\n : phase !== 'done' && <button type=\"button\" className={shared.primaryPill} disabled={!canDownload} onClick={() => { void download() }}>{t(mode === 'zip' ? 'assetExport.downloadZip' : 'assetExport.downloadYaml')}</button>}\n </>}>\n <div className={css.exportContent}>\n <p><code>{preset.id}</code></p>\n <fieldset disabled={phase === 'downloading'}>\n <legend>{t('assetExport.scope')}</legend>\n {(['zip', 'definition'] as const).map((option) => <label key={option} className={css.exportOption}>\n <input type=\"radio\" name={`${id}-mode`} checked={mode === option} onChange={() => { invalidate(); setMode(option) }} />\n <span><strong>{t(`assetExport.${option}`)}</strong><small>{t(`assetExport.${option}Hint`)}</small></span>\n </label>)}\n </fieldset>\n {(phase === 'reading' || phase === 'downloading') && <p role=\"status\">{t('assetImport.reading')}</p>}\n {error && <p ref={errorRef} tabIndex={-1} role=\"alert\" className={shared.confirmError}>{error}</p>}\n {phase === 'done' && <p role=\"status\">{t('assetExport.downloaded')}</p>}\n {preview && <>\n {(preview.memoryConflicts?.length ?? 0) > 0 && <fieldset disabled={phase === 'downloading'}>\n <legend>{t('assetExport.conflicts')}</legend>\n {preview.memoryConflicts!.map((entry) => <div key={entry.id}>\n <strong>{entry.name} · {entry.id}</strong>\n {(['include', 'exclude'] as const).map((choice) => <label className={css.exportOption} key={choice}><input type=\"radio\" name={`${id}-${entry.id}`} checked={memoryChoices[entry.id] === choice}\n onChange={() => { invalidate(); setMemoryChoices((current) => ({ ...current, [entry.id]: choice })) }} />{t(`assetExport.${choice}`)}</label>)}\n </div>)}\n </fieldset>}\n {Object.values(memoryChoices).includes('include') && <p>{t('assetExport.included')}</p>}\n <details><summary>{t('assetImport.files', { count: preview.files?.length ?? 0 })}</summary><ul>{preview.files?.map((file) => <li key={file.path}>{file.path} · {file.bytes} B</li>)}</ul></details>\n <p>{t('assetExport.excluded', { count: preview.excludedMemoryCount ?? 0 })}</p>\n <p>{t('assetExport.boundary')}</p>\n {(preview.blockers?.length ?? 0) > 0 && <div role={blocked ? 'alert' : undefined}>{blocked && <p>{t('assetExport.blocked')}</p>}<ul>{preview.blockers!.map((item, index) => <li key={index}>{item}</li>)}</ul></div>}\n {(preview.warnings?.length ?? 0) > 0 && <details open><summary>{t('assetImport.warnings')}</summary><ul>{preview.warnings!.map((item, index) => <li key={index}>{item}</li>)}</ul></details>}\n </>}\n </div>\n </DialogSurface>\n}\n","/** 预设切换器:预设全部在用户目录(首次启动种子化),列表点击切换;新建 = 从内置模板复制还原。 */\nimport { memo, useRef, useState, type ReactNode } from 'react'\nimport { usePromptToolFields } from '../../data/use-prompt-tool-fields.ts'\nimport { EMPTY_FIELDS } from '../../data/prompt-tool-fields.ts'\nimport clsx from 'clsx'\nimport { IconCopyOutlineRegular, IconFolderOpenOutlineRegular, IconTrashOutlineRegular } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { bridgeCall } from '../../data/bridge-client.ts'\nimport { previewAsset, commitAsset } from '../../data/asset-import.ts'\nimport { hasWorkspaceDrafts } from '../../data/workspace-drafts.ts'\nimport { deepEqual } from '../../data/dirty-state.ts'\nimport type { PromptToolStore } from '../../data/use-prompt-tool-store.ts'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport { DialogSurface } from '../../ui/DialogSurface.tsx'\nimport { ConfirmDialog } from '../../ui/ConfirmDialog.tsx'\nimport { HintTooltip } from '../../ui/HintTooltip.tsx'\nimport { ImportDialog } from '../../ui/ImportDialog.tsx'\nimport { PresetExportDialog } from './PresetExportDialog.tsx'\nimport { useImportPreviewFlow } from '../../data/use-import-preview-flow.ts'\nimport { StatusBadge } from '../../ui/StatusBadge.tsx'\nimport sharedCss from '../../ui/controls.module.css'\nimport featureCss from './presets.module.css'\n\nconst styles = { ...sharedCss, ...featureCss }\n\nexport const PresetSwitcher = memo(function PresetSwitcher(props: { store: PromptToolStore; t: PromptToolTranslate }): ReactNode {\n const { store, t } = props\n const fields = usePromptToolFields(store, (value) => value)\n const presets = store.meta.presets ?? []\n const templates = store.meta.builtinTemplates ?? []\n const [confirmingDelete, setConfirmingDelete] = useState<string | undefined>(undefined)\n const [pickerOpen, setPickerOpen] = useState(false)\n const [importOpen, setImportOpen] = useState(false)\n const [exportTarget, setExportTarget] = useState<{ id: string; name: string }>()\n const pickerAnchorRef = useRef<HTMLButtonElement>(null)\n\n // 预览流程(与角色卡 JSON 导入共用同一状态机):确认回传来源摘要 + 预览版本。\n const flow = useImportPreviewFlow({\n directoryTooLarge: t('assetImport.directoryTooLarge'),\n preview: (request) => previewAsset('importPresetPackage', request),\n commit: async (preview) => {\n if (preview.overwrite && preview.summary?.targetId === store.fields.presetTemplate) {\n if (hasWorkspaceDrafts(store.editorDrafts, store.fields.presetTemplate)) return { ok: false, message: t('assetImport.draftBlocked') }\n const presetConfigs = store.fields.promptConfigs.filter((config) => config.origin?.kind !== 'instruction-file')\n const savedConfigs = store.savedConfigs.filter((config) => config.origin?.kind !== 'instruction-file')\n if (!deepEqual(presetConfigs, savedConfigs)) {\n if (!await store.persistConfigs(store.fields.promptConfigs, { includeInstructions: false, reload: false, rebuild: false })) return { ok: false, message: t('assetImport.draftBlocked') }\n return { ok: false, stale: true, message: t('importPreview.stale') }\n }\n if (store.dirtySwitches) return { ok: false, message: t('assetImport.draftBlocked') }\n }\n return commitAsset('importPresetPackage', preview)\n },\n onCommitted: async (label) => {\n store.showNotice('ok', t('presetSwitcher.notice.imported', { id: label ?? '' }))\n if (await store.load() === EMPTY_FIELDS) throw new Error(t('card.operationFailed'))\n },\n onError: (message, stale) => {\n store.showNotice('error', t('presetSwitcher.notice.importFailed', { reason: stale ? t('importPreview.stale') : message }))\n },\n })\n\n /** 删除预设(物理删除用户目录副本;插件目录模板保留,可经「新建预设」还原)。 */\n const deletePreset = async (id: string): Promise<void> => {\n const res = await bridgeCall('presetDelete', { id })\n if (res.ok) {\n store.showNotice('ok', t('presetSwitcher.notice.deleted', { id }))\n await store.load()\n setConfirmingDelete((current) => current === id ? undefined : current)\n } else {\n throw new Error(t('presetSwitcher.notice.deleteFailed', { reason: res.message ?? 'settings bridge unavailable' }))\n }\n }\n\n /** 复制预设:用户目录完整副本,id 自动递增(<id>-copy / <id>-copy-2 / …)。 */\n const duplicatePreset = async (id: string): Promise<void> => {\n const res = await bridgeCall('presetDuplicate', { id })\n if (res.ok) {\n store.showNotice('ok', t('presetSwitcher.notice.duplicated', { id: res.value.id }))\n await store.load()\n } else {\n store.showNotice('error', t('presetSwitcher.notice.duplicateFailed', { reason: res.message ?? 'settings bridge unavailable' }))\n }\n }\n\n /** 打开预设文件夹(宿主系统文件管理器;失败时提示路径)。 */\n const openLocation = async (id: string): Promise<void> => {\n const res = await bridgeCall('presetOpen', { id })\n if (res.ok) {\n store.showNotice('ok', t('presetSwitcher.notice.opened', { path: res.value.path }))\n } else {\n store.showNotice('error', t('presetSwitcher.notice.openFailed', { reason: res.message ?? 'settings bridge unavailable' }))\n }\n }\n\n /** 新建:从插件目录模板复制到用户目录(还原/自定义起点);自定义入口重名自动递增。 */\n const clonePreset = async (id: string, autoSuffix = false): Promise<void> => {\n const res = await bridgeCall('presetClone', { id, autoSuffix })\n if (res.ok) {\n setPickerOpen(false)\n store.showNotice('ok', t('presetSwitcher.notice.cloned', { id: res.value.id }))\n await store.load()\n } else {\n store.showNotice('error', t('presetSwitcher.notice.cloneFailed', { reason: res.message ?? 'settings bridge unavailable' }))\n }\n }\n\n return (\n <div className={styles.rowGroup}>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>{t('presetSwitcher.title')}</strong>\n <small>{t('presetSwitcher.hint')}</small>\n </span>\n <span className={styles.inlineControls}>\n <button ref={pickerAnchorRef} type=\"button\" className={styles.primaryPill} onClick={() => setPickerOpen(true)}>{t('presetSwitcher.new')}</button>\n <button type=\"button\" className={styles.pillButton} onClick={() => setImportOpen(true)}>{t('assetImport.presetTitle')}…</button>\n </span>\n </div>\n {importOpen && <ImportDialog t={t} destination=\"preset\" {...flow} targets={presets}\n onFiles={(files) => { void flow.run(files) }} onChoices={flow.updateChoices} onConfirm={() => { void flow.confirm() }}\n onClose={() => { flow.cancel(); setImportOpen(false) }} onReset={flow.cancel} onSkip={flow.skip} onEnd={flow.end}\n onRepreview={() => { void flow.repreview() }} onRefresh={() => { void flow.retryRefresh() }}\n onUse={flow.resultLabel === undefined ? undefined : () => { store.setPresetTemplate(flow.resultLabel!); flow.cancel(); setImportOpen(false) }} />}\n {exportTarget && <PresetExportDialog t={t} preset={exportTarget} onClose={() => setExportTarget(undefined)} />}\n <div className={styles.presetGrid}>\n {presets.length === 0 ? (\n <p className={styles.readOnly} role=\"status\">{t('presetSwitcher.empty')}</p>\n ) : presets.map((preset) => renderCard(preset))}\n </div>\n {pickerOpen && (\n <DialogSurface title={t('presetSwitcher.dialog.title')} closeLabel={t('presetSwitcher.dialog.close')} anchorRef={pickerAnchorRef} onClose={() => setPickerOpen(false)}>\n {templates.length === 0 && <p className={styles.configFieldHint}>{t('presetSwitcher.dialog.noTemplates')}</p>}\n <HintTooltip label={t('presetSwitcher.custom.hint')}>\n <button type=\"button\" className={styles.templateModalItem} data-custom\n onClick={() => void clonePreset('pt-custom', true)}>\n <strong>{t('presetSwitcher.custom.title')}</strong>\n <small>{t('presetSwitcher.custom.detail')}</small>\n </button>\n </HintTooltip>\n {templates.map((template) => (\n <HintTooltip key={template.id} label={t('presetSwitcher.template.hint', { id: template.id })}>\n <button type=\"button\" className={styles.templateModalItem} onClick={() => void clonePreset(template.id)}>\n <strong>{template.name}</strong>\n <small>{template.id}</small>\n </button>\n </HintTooltip>\n ))}\n </DialogSurface>\n )}\n </div>\n )\n\n function renderCard(preset: { id: string; name: string; description?: string; renderable?: boolean }): ReactNode {\n const active = fields.presetTemplate === preset.id\n const confirming = confirmingDelete === preset.id\n // 不可渲染(缺 modules/组合文件,包内也无同名模板可回退):灰显禁切换,\n // 提示还原路径——避免点击后宿主挂载失败的哑弹。\n const blocked = preset.renderable === false\n return (\n <article key={preset.id} className={clsx(styles.presetCard, blocked && styles.presetCardBlocked)}\n data-active={active ? '' : undefined}>\n <HintTooltip label={blocked\n ? t('presetSwitcher.card.blocked.hint')\n : active ? t('presetSwitcher.card.active.hint') : t('presetSwitcher.card.switch.hint', { name: preset.name })}>\n <button type=\"button\" className={styles.presetCardMain} disabled={blocked}\n onClick={() => store.setPresetTemplate(preset.id)}>\n <span className={styles.presetCardHead}>\n <strong className={styles.presetCardName}>{preset.name}</strong>\n {active && <StatusBadge className={styles.presetHeadBadge} tone=\"success\" label={t('presetSwitcher.badge.active')} />}\n {blocked && <span className={styles.presetBlocked}>{t('presetSwitcher.blocked')}</span>}\n </span>\n {preset.description !== undefined && preset.description.length > 0\n && <p className={styles.presetCardDesc}>{preset.description}</p>}\n <code className={styles.presetCardId}>{preset.id}</code>\n </button>\n </HintTooltip>\n <span className={styles.presetCardFooter}>\n <button type=\"button\" className={styles.pillButton} onClick={() => setExportTarget({ id: preset.id, name: preset.name })}>{t('presetSwitcher.export')}…</button>\n <HintTooltip label={t('presetSwitcher.duplicate.label')}>\n <button type=\"button\" className={styles.presetIconButton}\n aria-label={t('presetSwitcher.duplicate.aria', { name: preset.name })}\n onClick={() => void duplicatePreset(preset.id)}>\n <IconCopyOutlineRegular />\n </button>\n </HintTooltip>\n <HintTooltip label={t('presetSwitcher.open.label')}>\n <button type=\"button\" className={styles.presetIconButton}\n aria-label={t('presetSwitcher.open.aria', { name: preset.name })}\n onClick={() => void openLocation(preset.id)}>\n <IconFolderOpenOutlineRegular />\n </button>\n </HintTooltip>\n {confirming && (\n <ConfirmDialog title={t('card.deleteTitle', { name: preset.name })}\n description={t('presetSwitcher.delete.description', { name: preset.name })}\n confirmLabel={t('presetSwitcher.delete.confirm')} cancelLabel={t('presetSwitcher.delete.cancel')}\n onConfirm={() => deletePreset(preset.id)} onCancel={() => setConfirmingDelete((current) => current === preset.id ? undefined : current)} />\n )}\n {(\n <HintTooltip label={active ? t('presetSwitcher.delete.hintActive') : t('presetSwitcher.delete.hint')}>\n <button type=\"button\" className={styles.presetIconButton}\n aria-label={t('presetSwitcher.delete.aria', { name: preset.name })}\n disabled={active}\n onClick={() => setConfirmingDelete(preset.id)}>\n <IconTrashOutlineRegular />\n </button>\n </HintTooltip>\n )}\n </span>\n </article>\n )\n }\n})\n","/** 通用折叠卡片:设置区块统一折叠入口(除模块列表外全部卡片化)。 */\nimport { useId, useState, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { IconChevronDownOutlineRegular } from '@deepseek-ai/dsh-client-ui-primitives'\nimport styles from './controls.module.css'\n\nexport function CollapsibleCard(props: {\n id: string\n title: string\n meta?: string\n children: ReactNode\n defaultOpen?: boolean\n}): ReactNode {\n const [open, setOpen] = useState(props.defaultOpen ?? false)\n const panelId = useId()\n return (\n <article className={clsx(styles.configCard, open && styles.configCardOpen)}>\n <header className={styles.configHeader}>\n <button type=\"button\" className={styles.configToggle} aria-expanded={open} aria-controls={panelId} onClick={() => setOpen((value) => !value)}>\n <span className={styles.configTitle}>\n <span className={styles.configName}>{props.title}</span>\n {props.meta !== undefined && <span className={styles.configMeta}>{props.meta}</span>}\n </span>\n <IconChevronDownOutlineRegular className={clsx(styles.chevron, open && styles.chevronOpen)} />\n </button>\n </header>\n <div id={panelId} hidden={!open} className={styles.configForm}>{open && props.children}</div>\n </article>\n )\n}\n","/** 设置输入行:编辑框失焦即保存(与 anchor 文本一致)。 */\nimport type { ReactNode } from 'react'\nimport ui from './controls.module.css'\n\nexport function SettingInputRow(props: {\n id: string\n label: string\n hint: string\n value: string\n type?: 'text' | 'number'\n placeholder?: string\n disabled?: boolean\n onInput: (value: string) => void\n onCommit: () => void\n}): ReactNode {\n return (\n <div className={ui.rowGroup}>\n <div className={ui.settingRowStack}>\n <span className={ui.settingCopy}><strong>{props.label}</strong><small>{props.hint}</small></span>\n <div className={ui.directoryControl}>\n <input\n id={props.id}\n className={ui.directoryInput}\n type={props.type ?? 'text'}\n value={props.value}\n aria-label={props.label}\n placeholder={props.placeholder}\n disabled={props.disabled}\n spellCheck={false}\n autoComplete=\"off\"\n onChange={(event) => props.onInput(event.target.value)}\n onBlur={props.onCommit}\n />\n </div>\n </div>\n </div>\n )\n}\n","/** 「预设和配置」页:全局开关 + 预设切换/导入 + 提示词配置列表统一管理。 */\nimport { memo, type ReactNode } from 'react'\nimport { usePromptToolFields } from '../../data/use-prompt-tool-fields.ts'\nimport { PresetSwitcher } from './PresetSwitcher.tsx'\nimport { ToggleRow } from '../../ui/ToggleRow.tsx'\nimport { CollapsibleCard } from '../../ui/CollapsibleCard.tsx'\nimport { SettingInputRow } from '../../ui/SettingInputRow.tsx'\nimport sharedCss from '../../ui/controls.module.css'\nimport featureCss from './presets.module.css'\n\nconst ui = { ...sharedCss, ...featureCss }\nimport type { PromptToolStore } from '../../data/use-prompt-tool-store.ts'\nimport type { PromptToolTranslate } from '../../locales.ts'\n\nexport const PresetsPage = memo(function PresetsPage(props: { store: PromptToolStore; t: PromptToolTranslate }): ReactNode {\n const { store, t } = props\n const fields = usePromptToolFields(store, (value) => value)\n return (\n <>\n {!fields.writePreset && <p className={ui.configFieldHint}>{t('configs.readOnly.disabled')}</p>}\n <PresetSwitcher store={store} t={t} />\n <section className={ui.section} aria-label={t('presets.aria')}>\n <div className={ui.rowGroup}>\n <ToggleRow id=\"pt-write-preset\" label={t('presets.writePreset.label')} hint={t('presets.writePreset.hint')}\n checked={fields.writePreset} onChange={() => store.toggle('writePreset')} />\n </div>\n </section>\n <CollapsibleCard id=\"pt-host-generated\" title={t('presets.agents.title')} meta={t('presets.agents.meta')}>\n <SettingInputRow id=\"pt-preset-order\" label={t('presets.order.label')} hint={t('presets.order.hint')}\n type=\"number\" value={String(fields.presetOrder)}\n onInput={(value) => store.patch({ presetOrder: Number(value) || 0 })}\n onCommit={store.persistSwitches} />\n </CollapsibleCard>\n </>\n )\n})\n","import type { SkillCatalogEntry } from '../../data/prompt-tool-fields.ts'\nimport { SKILL_SOURCES, type SkillPolicyChange, type SkillSourceKind } from '../../../shared/skills.ts'\nimport type { StatusBadgeTone } from '../../ui/StatusBadge.tsx'\nimport type { PromptToolTranslate } from '../../locales.ts'\n\nexport type SkillStatusTab = 'all' | 'model' | 'user' | 'blocked'\n\n/** 会话可用必须同时满足「未被同名遮蔽」与文件调用策略。 */\nexport const skillEnabled = (skill: SkillCatalogEntry): boolean =>\n skill.valid && !skillShadowed(skill) && (skill.modelInvocable || skill.userInvocable)\n\n/** 模型端可用:会话已注册且文件允许模型调用。 */\nexport const skillModelAvailable = (skill: SkillCatalogEntry): boolean => skillEnabled(skill) && skill.modelInvocable\n\n/** 用户端可用:会话已注册且文件允许用户调用。 */\nexport const skillUserAvailable = (skill: SkillCatalogEntry): boolean => skillEnabled(skill) && skill.userInvocable\n\n/** 两端都不可用:插件写入的两端停用与技能自身声明都走同一套事实,不再区分来源。 */\nexport const skillUnavailable = (skill: SkillCatalogEntry): boolean =>\n skill.valid && !skill.modelInvocable && !skill.userInvocable\n\n/** 遮蔽来自当前会话注册表,客户端不重新裁决优先级。 */\nexport const skillShadowed = (skill: SkillCatalogEntry): boolean => skill.valid && skill.availability === 'shadowed'\n\n/** 只提交用户点击的端,不把另一端的陈旧快照带回服务端。 */\nexport const policyAfterToggle = (\n skill: Pick<SkillCatalogEntry, 'modelInvocable' | 'userInvocable'>,\n side: 'model' | 'user',\n): Extract<SkillPolicyChange, { side: string }> => ({ side, enabled: !(side === 'model' ? skill.modelInvocable : skill.userInvocable) })\n\nexport function matchesSkillStatus(skill: SkillCatalogEntry, tab: SkillStatusTab): boolean {\n if (tab === 'model') return skillModelAvailable(skill)\n if (tab === 'user') return skillUserAvailable(skill)\n if (tab === 'blocked') return skillUnavailable(skill)\n return true\n}\n\nexport interface SkillGroup {\n source: SkillSourceKind\n rank: number\n skills: SkillCatalogEntry[]\n}\n\n/** 按来源分组,顺序与官方优先级一致(项目 > 引用目录 > 用户 > 内置);空分组不返回。\n * 分组只回传来源类型,标题文案由界面按 `skills.source.<kind>` 取,避免把中文写进共享常量。 */\nexport function groupBySource(catalog: readonly SkillCatalogEntry[]): SkillGroup[] {\n const kinds = (Object.keys(SKILL_SOURCES) as SkillSourceKind[])\n .sort((left, right) => SKILL_SOURCES[left].rank - SKILL_SOURCES[right].rank)\n return kinds.flatMap((source) => {\n const skills = catalog\n .filter((skill) => skill.source === source)\n .sort((left, right) => left.name.localeCompare(right.name))\n return skills.length === 0 ? [] : [{ source, rank: SKILL_SOURCES[source].rank, skills }]\n })\n}\n\n/** 先说明会话注册状态,已注册条目再显示调用策略。 */\nexport function skillStatusLabel(skill: SkillCatalogEntry, t: PromptToolTranslate): string {\n if (!skill.valid) return t('skills.status.invalid')\n if (skillShadowed(skill)) return t('skills.status.shadowed')\n if (!skill.modelInvocable && !skill.userInvocable) return t('skills.status.blocked')\n // 只关一端时列出【仍可用的那一端】,而不是被关掉的那一端:状态行要回答的是\n // 「这个技能现在还能怎么用」,报「模型端已停用」会让一端仍可用的技能读起来像坏了。\n const audiences = [\n skill.modelInvocable ? t('skills.status.audience.model') : '',\n skill.userInvocable ? t('skills.status.audience.user') : '',\n ].filter(Boolean)\n return t('skills.status.callable', { audiences: audiences.join('/') })\n}\n\n/** 只有已确认的会话可用状态显示绿色。 */\nexport function skillStatusTone(skill: SkillCatalogEntry): StatusBadgeTone {\n if (!skill.valid) return 'danger'\n return skillEnabled(skill) ? 'success' : 'neutral'\n}\n","import { memo, useEffect, useId, useMemo, useReducer, useState, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { IconChevronDownOutlineRegular, Switch } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { SkillCatalogEntry } from '../../data/prompt-tool-fields.ts'\nimport type { SkillPolicyChange } from '../../../shared/skills.ts'\nimport type { SkillEditorDraft } from '../../data/workspace-drafts.ts'\nimport type { PromptToolStore } from '../../data/use-prompt-tool-store.ts'\nimport { HintTooltip } from '../../ui/HintTooltip.tsx'\nimport { ConfirmDialog } from '../../ui/ConfirmDialog.tsx'\nimport { StatusBadge } from '../../ui/StatusBadge.tsx'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport sharedCss from '../../ui/controls.module.css'\nimport featureCss from './skills.module.css'\nimport { policyAfterToggle, skillShadowed, skillStatusLabel, skillStatusTone, skillUnavailable } from './skill-status.ts'\n\nconst ui = { ...sharedCss, ...featureCss }\n\nexport interface SkillRowProps {\n skill: SkillCatalogEntry\n t: PromptToolTranslate\n busy: boolean\n store: PromptToolStore\n sessionId: string | undefined\n onSetPolicy: (name: string, path: string, change: SkillPolicyChange) => Promise<boolean>\n onDelete: (skill: SkillCatalogEntry) => void\n}\n\n/** 三行摘要与卡内编辑;草稿按会话和文件身份保留,不随折叠、筛选或切页丢失。 */\nexport const SkillRow = memo(function SkillRow(props: SkillRowProps): ReactNode {\n const { skill, t, busy, store, sessionId } = props\n const panelId = useId()\n const key = JSON.stringify([sessionId, skill.id, skill.path])\n const editor = useMemo((): SkillEditorDraft => {\n const retained = store.editorDrafts.skills.get(key)\n if (retained) return retained\n const next = { text: '', description: '', error: '', loading: false, saving: false }\n store.editorDrafts.skills.set(key, next)\n return next\n }, [store.editorDrafts, key])\n const [, render] = useReducer((value: number) => value + 1, 0)\n const [expanded, setExpanded] = useState(store.editorDrafts.expanded.get(key) ?? false)\n const [confirmReload, setConfirmReload] = useState(false)\n useEffect(() => { editor.refresh = render; return () => { editor.refresh = undefined } }, [editor])\n const dirty = editor.saved !== undefined && (editor.text !== editor.saved.content || editor.description !== editor.saved.description)\n const editable = skill.canEdit === true && skill.path !== undefined\n const load = async (): Promise<void> => {\n if (editor.loading || editor.saving) return\n editor.loading = true\n editor.error = ''\n editor.refresh?.()\n try {\n const result = await store.readSkill(skill, sessionId)\n if (result.ok) { editor.saved = result.value; editor.text = result.value.content; editor.description = result.value.description }\n else editor.error = result.message ?? t('skills.edit.readFailed')\n } catch (error) {\n editor.error = error instanceof Error ? error.message : t('skills.edit.readFailed')\n } finally { editor.loading = false; editor.refresh?.() }\n }\n useEffect(() => { if (expanded && editable && !editor.saved && !editor.error) void load() }, [expanded, editable, editor])\n const save = async (): Promise<void> => {\n if (!editor.saved || editor.saving || editor.loading || busy || !editable || !dirty) return\n editor.saving = true\n editor.error = ''\n const submitted = editor.text\n const description = editor.description\n editor.refresh?.()\n try {\n const result = await store.saveSkill(skill, submitted, description, editor.saved.revision, sessionId)\n if (result.ok) {\n editor.saved = result.value\n if (editor.text === submitted) editor.text = result.value.content\n if (editor.description === description) editor.description = result.value.description\n } else editor.error = result.message ?? t('skills.edit.saveFailed')\n } catch (error) {\n editor.error = error instanceof Error ? error.message : t('skills.edit.saveFailed')\n } finally { editor.saving = false; editor.refresh?.() }\n }\n const toggle = async (side: 'model' | 'user'): Promise<void> => {\n if (skill.path !== undefined && await props.onSetPolicy(skill.name, skill.path, policyAfterToggle(skill, side))\n && editable && (!editor.saved || (editor.text === editor.saved.content && editor.description === editor.saved.description))) await load()\n }\n const status = skillStatusLabel(skill, t)\n const hint = skill.path ?? (skill.dir.length > 0 ? `${skill.dir}/${skill.folder}` : skill.provider ?? '')\n // 两个开关只表示文件声明;实际会话注册状态单独显示在徽章里。\n const modelInvocable = skill.modelInvocable\n const userInvocable = skill.userInvocable\n // 无有效 frontmatter 或没有可写路径(例如来源未提供标记文件)时不给写入口。\n const writable = !busy && !dirty && !editor.loading && !editor.saving && skill.canSetPolicy === true && skill.valid && skill.path !== undefined\n return (\n <article className={clsx(ui.configCard, ui.skillEntry, expanded && ui.configCardOpen)} data-skill-card={skill.id} data-blocked={skillUnavailable(skill) ? '' : undefined} data-invalid={!skill.valid ? '' : undefined}>\n <header className={ui.configHeader}>\n <button type=\"button\" className={ui.configToggle} data-skill-expand=\"\" aria-expanded={expanded} aria-controls={panelId}\n aria-label={t('skills.row.expand', { name: skill.name })}\n onClick={() => { setExpanded(!expanded); store.editorDrafts.expanded.set(key, !expanded) }}>\n <span className={ui.configTitle}>\n <span className={ui.skillCardTitleRow} data-skill-heading=\"\">\n <strong className={ui.skillName}>{skill.name}</strong>\n <StatusBadge tone={skillStatusTone(skill)} label={status} ariaLabel={t('skills.row.status.aria', { status })} />\n {dirty && <span className={ui.skillDraftMark}>{t('skills.edit.dirty')}</span>}\n </span>\n <span className={ui.skillCardMeta} data-skill-description=\"\">{skill.description || t('skills.row.noDescription')}</span>\n <span className={ui.skillSourceLine} data-skill-source=\"\">\n <span className={ui.skillCardSource}>{hint}</span>\n <span className={ui.skillPriority}>{t('skills.row.priorityShort', { rank: skill.rank })}</span>\n </span>\n </span>\n <IconChevronDownOutlineRegular className={clsx(ui.chevron, expanded && ui.chevronOpen)} />\n </button>\n </header>\n <div id={panelId} hidden={!expanded} className={ui.configForm}>\n {expanded && <>\n {skillShadowed(skill) && <span className={ui.skillIssue} role=\"note\">{t('skills.row.shadowedHint')}</span>}\n {!skill.valid && skill.issue && <span className={ui.skillIssue} role=\"note\">{skill.issue}</span>}\n {skill.readonlyReason && <span className={ui.skillCardSource} role=\"note\">{skill.readonlyReason}</span>}\n {/* 调用策略只改官方两个键;正文和其余字段不动。 */}\n <div className={ui.skillRowActions} data-skill-block-group=\"\">\n <span className={ui.skillPolicyGroup} role=\"group\" aria-label={t('skills.row.toggles.aria', { name: skill.name })}>\n <HintTooltip label={t('skills.row.modelToggle.hint')}>\n <span className={ui.skillPolicyItem} data-skill-policy=\"model\">\n <span>{t('skills.row.modelToggle')}</span>\n <Switch checked={modelInvocable} disabled={!writable}\n label={t('skills.row.modelToggle.aria', { name: skill.name })}\n onChange={() => { void toggle('model') }} />\n </span>\n </HintTooltip>\n <HintTooltip label={t('skills.row.userToggle.hint')}>\n <span className={ui.skillPolicyItem} data-skill-policy=\"user\">\n <span>{t('skills.row.userToggle')}</span>\n <Switch checked={userInvocable} disabled={!writable}\n label={t('skills.row.userToggle.aria', { name: skill.name })}\n onChange={() => { void toggle('user') }} />\n </span>\n </HintTooltip>\n </span>\n </div>\n {editable && <>\n <label className={ui.skillCreateField}>\n <span>{t('skills.edit.description')}</span>\n <input className={ui.configInput} data-skill-description-editor=\"\" aria-label={t('skills.edit.description')}\n value={editor.description} disabled={!editor.saved || editor.loading}\n onChange={(event) => { editor.description = event.target.value; editor.refresh?.() }} />\n </label>\n <label className={ui.skillCreateField}>\n <span>{t('skills.edit.content')}</span>\n <textarea className={clsx(ui.configInput, ui.skillEditor)} data-skill-editor=\"\" aria-label={t('skills.edit.content')}\n spellCheck={false} rows={14} value={editor.text} disabled={!editor.saved || editor.loading}\n onChange={(event) => { editor.text = event.target.value; editor.refresh?.() }} />\n </label>\n <p className={ui.configFieldHint}>{t('skills.edit.hint')}</p>\n {editor.error && <p className={ui.skillIssue} role=\"alert\">{editor.error}</p>}\n </>}\n <div className={clsx(ui.skillRowActions, ui.skillFooter)} data-skill-actions=\"\">\n {editable && <>\n <button type=\"button\" className={ui.pillButton} data-skill-save=\"\" disabled={!dirty || busy || editor.loading || editor.saving} onClick={() => { void save() }}>\n {t(editor.saving ? 'skills.edit.saving' : 'skills.edit.save')}\n </button>\n <button type=\"button\" className={ui.pillButton} data-skill-reload=\"\" disabled={busy || editor.loading || editor.saving}\n onClick={() => { if (dirty) setConfirmReload(true); else void load() }}>{t('skills.edit.reload')}</button>\n </>}\n {editable && <span className={ui.configFieldHint} role=\"status\">{t(editor.loading ? 'skills.edit.loading' : dirty ? 'skills.edit.dirty' : editor.saved ? 'skills.edit.saved' : 'skills.edit.unloaded')}</span>}\n {skill.canDelete === true && skill.path !== undefined && (\n <HintTooltip label={t('skills.row.delete.hint')}>\n <button type=\"button\" className={clsx(ui.pillButton, ui.skillDelete)} data-danger data-skill-delete={skill.folder}\n data-skill-path={skill.path} disabled={busy || editor.saving} onClick={() => props.onDelete(skill)}>\n {t('skills.row.delete')}\n </button>\n </HintTooltip>\n )}\n </div>\n </>}\n </div>\n {confirmReload && <ConfirmDialog title={t('skills.edit.reload')} description={t('skills.edit.reloadConfirm')}\n confirmLabel={t('skills.edit.reload')} cancelLabel={t('skills.dir.cancel')}\n onConfirm={async () => { await load(); setConfirmReload(false) }} onCancel={() => setConfirmReload(false)} />}\n </article>\n )\n})\n","/** 技能设置页:来源清单、文件编辑、调用策略与资产管理。 */\nimport { memo, useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport type { SkillCatalogEntry } from '../../data/prompt-tool-fields.ts'\nimport type { PromptToolStore } from '../../data/use-prompt-tool-store.ts'\nimport type { PromptToolHostApi } from '../../data/host-api.ts'\nimport type { PromptToolLocaleKey, PromptToolTranslate } from '../../locales.ts'\nimport type { SkillPolicyChange } from '../../../shared/skills.ts'\nimport { usePromptToolFields } from '../../data/use-prompt-tool-fields.ts'\nimport { CollapsibleCard } from '../../ui/CollapsibleCard.tsx'\nimport { ConfirmDialog } from '../../ui/ConfirmDialog.tsx'\nimport { HintTooltip } from '../../ui/HintTooltip.tsx'\nimport { MenuSelect } from '../../ui/MenuSelect.tsx'\nimport { SkillRow } from './SkillRow.tsx'\nimport sharedCss from '../../ui/controls.module.css'\nimport featureCss from './skills.module.css'\nimport { groupBySource, matchesSkillStatus, type SkillStatusTab } from './skill-status.ts'\n\nconst ui = { ...sharedCss, ...featureCss }\n\nconst SKILL_STATUS_TABS: Array<{ id: SkillStatusTab; labelKey: PromptToolLocaleKey }> = [\n { id: 'all', labelKey: 'skills.tabs.all' },\n { id: 'model', labelKey: 'skills.tabs.model' },\n { id: 'user', labelKey: 'skills.tabs.user' },\n { id: 'blocked', labelKey: 'skills.tabs.blocked' },\n]\n\n/** 创建表单的本地校验:与官方 `SKILL_NAME` 同规则(kebab-case)。 */\nconst SKILL_NAME_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/\n\nexport const SkillsPage = memo(function SkillsPage(props: { store: PromptToolStore; api: PromptToolHostApi; t: PromptToolTranslate; browse?: { query: string; status: SkillStatusTab } }): ReactNode {\n const { store, api, t } = props\n const fields = usePromptToolFields(store, (value) => value)\n const [skillFilter, setSkillFilter] = useState(props.browse?.query ?? '')\n const [statusTab, setStatusTab] = useState<SkillStatusTab>(props.browse?.status ?? 'all')\n const [sourceFilter, setSourceFilter] = useState('')\n const [picking, setPicking] = useState<'import' | 'reference'>()\n const pickerBusy = useRef(false)\n const [creating, setCreating] = useState(false)\n const [createDraft, setCreateDraft] = useState({ name: '', description: '', content: '' })\n const [pendingDelete, setPendingDelete] = useState<SkillCatalogEntry | undefined>(undefined)\n const [overwriteNames, setOverwriteNames] = useState<string[]>()\n const overwriteDecision = useRef<((confirmed: boolean) => void) | undefined>(undefined)\n const mounted = useRef(true)\n useEffect(() => {\n mounted.current = true\n return () => {\n mounted.current = false\n overwriteDecision.current?.(false)\n overwriteDecision.current = undefined\n }\n }, [])\n const confirmOverwrite = useCallback((names: string[]): Promise<boolean> => {\n if (!mounted.current) return Promise.resolve(false)\n overwriteDecision.current?.(false)\n setOverwriteNames(names)\n return new Promise((resolve) => { overwriteDecision.current = resolve })\n }, [])\n const settleOverwrite = (confirmed: boolean): void => {\n const decide = overwriteDecision.current\n overwriteDecision.current = undefined\n setOverwriteNames(undefined)\n decide?.(confirmed)\n }\n\n const keyword = skillFilter.trim().toLowerCase()\n const visible = useMemo(() => fields.skillCatalog.filter((skill) => {\n if (!matchesSkillStatus(skill, statusTab)) return false\n if (sourceFilter.length > 0 && skill.source !== sourceFilter) return false\n if (keyword.length === 0) return true\n return [skill.name, skill.folder, skill.description, skill.dir].join(' ').toLowerCase().includes(keyword)\n }), [fields.skillCatalog, statusTab, sourceFilter, keyword])\n const groups = useMemo(() => groupBySource(visible), [visible])\n const counts: Record<SkillStatusTab, number> = {\n all: fields.skillCatalog.length,\n model: fields.skillCatalog.filter((skill) => matchesSkillStatus(skill, 'model')).length,\n user: fields.skillCatalog.filter((skill) => matchesSkillStatus(skill, 'user')).length,\n blocked: fields.skillCatalog.filter((skill) => matchesSkillStatus(skill, 'blocked')).length,\n }\n const sourceOptions = useMemo(() => {\n const present = groupBySource(fields.skillCatalog).map((group) => group.source)\n return [\n { value: '', label: t('skills.source.all') },\n ...present.map((source) => ({ value: source, label: t(`skills.source.${source}` as never) })),\n ]\n }, [fields.skillCatalog, t])\n useEffect(() => {\n if (props.browse) Object.assign(props.browse, { query: skillFilter, status: statusTab })\n }, [skillFilter, statusTab, props.browse])\n\n const onSetPolicy = useCallback((name: string, path: string, change: SkillPolicyChange) => {\n return store.setSkillPolicy(name, path, change)\n }, [store])\n const onDelete = useCallback((skill: SkillCatalogEntry) => { setPendingDelete(skill) }, [])\n\n /** 两个明确操作共用目录选择;目录内容不决定复制还是引用。 */\n const pickDirectory = async (action: 'import' | 'reference'): Promise<void> => {\n if (pickerBusy.current || store.skillsBusy) return\n pickerBusy.current = true\n setPicking(action)\n try {\n const path = await api.pickDirectory()\n if (path === null || !mounted.current) return\n if (action === 'import') {\n await store.importSkillsDirectory(path, confirmOverwrite)\n return\n }\n const folders = store.getFields().skillFolders\n if (folders.includes(path)) {\n store.showNotice('error', t('skills.folders.duplicate'))\n return\n }\n await store.patchSkillFolders([...folders, path])\n } catch (error) {\n if (mounted.current) store.showNotice('error', t('skills.notice.dirPickFailed', { reason: error instanceof Error ? error.message : String(error) }))\n } finally {\n pickerBusy.current = false\n if (mounted.current) setPicking(undefined)\n }\n }\n\n const submitCreate = async (): Promise<void> => {\n const name = createDraft.name.trim()\n if (!SKILL_NAME_RE.test(name) || createDraft.description.trim().length === 0) {\n store.showNotice('error', t('skills.create.invalid'))\n return\n }\n if (await store.createSkill({ name, description: createDraft.description.trim(), content: createDraft.content })) {\n setCreateDraft({ name: '', description: '', content: '' })\n setCreating(false)\n }\n }\n\n return (\n <section className={ui.section} aria-label={t('skills.aria')}>\n {!fields.skillsComplete && <p className={ui.readOnly} role=\"status\">{t('skills.incomplete')}</p>}\n {fields.skillCatalog.length > 0 && (\n <div className={ui.skillStatsRow}>\n <div className={ui.skillStats} role=\"group\" aria-label={t('skills.tabs.aria')}>\n {SKILL_STATUS_TABS.map((tab) => (\n <button\n key={tab.id}\n id={`pt-skills-tab-${tab.id}`}\n type=\"button\"\n aria-pressed={statusTab === tab.id}\n data-active={statusTab === tab.id ? '' : undefined}\n onClick={() => setStatusTab(tab.id)}\n >\n <i className={clsx(ui.skillStatDot,\n tab.id === 'model' ? ui.skillStatusModel\n : tab.id === 'user' ? ui.skillStatusUser\n : tab.id === 'blocked' ? ui.skillStatusOff\n : ui.skillStatAll)} aria-hidden=\"true\" />\n <strong>{counts[tab.id]}</strong>\n <small>{t(tab.labelKey)}</small>\n </button>\n ))}\n </div>\n <button type=\"button\" className={ui.pillButton} disabled={store.skillsBusy} onClick={() => void store.refreshSkills()}>{t('skills.refresh')}</button>\n </div>\n )}\n\n <CollapsibleCard id=\"pt-skills-library\" title={t('skills.library.title')}\n meta={t('skills.library.meta', { count: fields.skillCatalog.length })}>\n <div className={ui.dirCard} data-invalid={fields.skillsRoot.length === 0 ? '' : undefined}>\n <div className={ui.dirCardBody}>\n <span className={ui.dirCardTitle}>\n <code className={ui.dirPath}>{fields.skillsRoot || t('skills.library.unknown')}</code>\n </span>\n <span className={ui.dirCardMeta}>{t('skills.library.hint')}</span>\n </div>\n <div className={ui.dirCardActions}>\n <button type=\"button\" className={ui.pillButton} disabled={fields.skillsRoot.length === 0}\n onClick={() => void store.openSkillsDir()}>{t('skills.library.open')}</button>\n <button type=\"button\" className={ui.pillButton} disabled={store.skillsBusy} onClick={() => void store.refreshSkills()}>{t('skills.dir.rescan')}</button>\n </div>\n </div>\n <div className={ui.dirAddBar} data-skill-directory-actions=\"\">\n <HintTooltip label={t('skills.import.pick.hint')}>\n <button\n type=\"button\"\n className={ui.primaryPill}\n disabled={picking !== undefined || store.skillsBusy}\n onClick={() => void pickDirectory('import')}\n >\n {picking === 'import' && <span className={ui.spinner} aria-hidden=\"true\" />}\n {t('skills.import.pick')}\n </button>\n </HintTooltip>\n <HintTooltip label={t('skills.folders.hint')}>\n <button type=\"button\" className={ui.pillButton} disabled={picking !== undefined || store.skillsBusy}\n onClick={() => void pickDirectory('reference')}>\n {picking === 'reference' && <span className={ui.spinner} aria-hidden=\"true\" />}\n {t('skills.folders.pick')}\n </button>\n </HintTooltip>\n </div>\n <p className={ui.readOnly}>{t('skills.library.footnote')}</p>\n <div className={ui.cardDivider} />\n <div className={ui.dirAddBar}>\n <button type=\"button\" className={ui.pillButton} aria-expanded={creating}\n onClick={() => setCreating((value) => !value)}>\n {creating ? t('skills.create.close') : t('skills.create.open')}\n </button>\n </div>\n {creating && (\n <div className={ui.skillCreateForm}>\n <label className={ui.skillCreateField}>\n <span>{t('skills.create.name')}</span>\n <input\n className={ui.configInput}\n value={createDraft.name}\n aria-label={t('skills.create.name')}\n aria-invalid={createDraft.name.length > 0 && !SKILL_NAME_RE.test(createDraft.name.trim())}\n placeholder={t('skills.create.namePlaceholder')}\n spellCheck={false}\n onChange={(event) => setCreateDraft((draft) => ({ ...draft, name: event.target.value }))}\n />\n </label>\n <label className={ui.skillCreateField}>\n <span>{t('skills.create.description')}</span>\n <input\n className={ui.configInput}\n value={createDraft.description}\n aria-label={t('skills.create.description')}\n placeholder={t('skills.create.descriptionPlaceholder')}\n onChange={(event) => setCreateDraft((draft) => ({ ...draft, description: event.target.value }))}\n />\n </label>\n <label className={ui.skillCreateField}>\n <span>{t('skills.create.content')}</span>\n <textarea\n className={ui.configInput}\n rows={6}\n value={createDraft.content}\n aria-label={t('skills.create.content')}\n placeholder={t('skills.create.contentPlaceholder')}\n spellCheck={false}\n onChange={(event) => setCreateDraft((draft) => ({ ...draft, content: event.target.value }))}\n />\n </label>\n <div className={ui.dirCardActions}>\n <button type=\"button\" className={ui.primaryPill} disabled={store.skillsBusy} onClick={() => void submitCreate()}>\n {store.skillsBusy && <span className={ui.spinner} aria-hidden=\"true\" />}\n {t('skills.create.submit')}\n </button>\n <button type=\"button\" className={ui.pillButton} onClick={() => { setCreating(false); setCreateDraft({ name: '', description: '', content: '' }) }}>\n {t('skills.dir.cancel')}\n </button>\n </div>\n <p className={ui.configFieldHint}>{t('skills.create.hint')}</p>\n </div>\n )}\n <div className={ui.cardDivider} />\n {fields.skillFolders.length === 0\n ? <p className={ui.readOnly}>{t('skills.folders.empty')}</p>\n : (\n <div className={ui.dirCardList}>\n {fields.skillFolders.map((path) => (\n <div key={path} className={ui.dirCard}>\n <div className={ui.dirCardBody}><code className={ui.dirPath}>{path}</code></div>\n <div className={ui.dirCardActions}>\n <button type=\"button\" className={ui.pillButton} disabled={store.skillsBusy}\n onClick={() => void store.patchSkillFolders(fields.skillFolders.filter((item) => item !== path))}>\n {t('skills.folders.remove')}\n </button>\n </div>\n </div>\n ))}\n </div>\n )}\n </CollapsibleCard>\n\n {fields.skillCatalog.length > 0 && (\n <div className={ui.listFilterRow}>\n <input\n type=\"search\"\n className={ui.listFilter}\n value={skillFilter}\n aria-label={t('skills.filter.aria')}\n placeholder={t('skills.filter.placeholder')}\n spellCheck={false}\n onChange={(event) => setSkillFilter(event.target.value)}\n />\n <MenuSelect\n value={sourceFilter}\n options={sourceOptions}\n onChange={setSourceFilter}\n ariaLabel={t('skills.source.aria')}\n placeholder={t('skills.source.all')}\n className={ui.listFilter}\n compact\n />\n <span className={ui.selectionCount} role=\"status\">{t('skills.visible', { count: visible.length })}</span>\n </div>\n )}\n\n {fields.skillCatalog.length === 0 ? (\n <div className={ui.emptyState}>\n <span className={ui.emptyGlyph} aria-hidden=\"true\">◇</span>\n <div>\n <h3>{t('skills.empty.title')}</h3>\n <p>{t('skills.empty.hint')}</p>\n <button type=\"button\" className={ui.pillButton} disabled={picking !== undefined || store.skillsBusy} onClick={() => void pickDirectory('import')}>{t('skills.import.pick')}</button>\n </div>\n </div>\n ) : visible.length === 0 ? (\n <p className={ui.readOnly} role=\"status\">\n {t('skills.noMatch')}\n <button type=\"button\" className={ui.pillButton} onClick={() => { setSkillFilter(''); setStatusTab('all'); setSourceFilter('') }}>{t('configs.clearFilters')}</button>\n </p>\n ) : (\n groups.map((group) => (\n <section key={group.source} className={ui.skillGroup} aria-label={t(`skills.source.${group.source}` as never)}>\n <header className={ui.skillGroupHead}>\n <strong>{t(`skills.source.${group.source}` as never)}</strong>\n <span className={ui.configFieldHint}>{t('skills.group.meta', { count: group.skills.length, rank: group.rank })}</span>\n </header>\n <div className={ui.skillCardList}>\n {group.skills.map((skill) => (\n <SkillRow\n key={JSON.stringify([api.currentSessionId(), skill.id, skill.path])}\n skill={skill}\n t={t}\n busy={store.skillsBusy}\n store={store}\n sessionId={api.currentSessionId()}\n onSetPolicy={onSetPolicy}\n onDelete={onDelete}\n />\n ))}\n </div>\n </section>\n ))\n )}\n\n {overwriteNames !== undefined && (\n <ConfirmDialog\n title={t('skills.overwrite.title')}\n description={t('skills.overwrite.description', { names: overwriteNames.join('、') })}\n confirmLabel={t('skills.overwrite.confirm')}\n cancelLabel={t('skills.dir.cancel')}\n onConfirm={() => settleOverwrite(true)}\n onCancel={() => settleOverwrite(false)}\n />\n )}\n {pendingDelete && (\n <ConfirmDialog\n title={t('skills.delete.title', { name: pendingDelete.name })}\n description={t('skills.delete.description', { path: pendingDelete.path ?? pendingDelete.dir })}\n confirmLabel={t('skills.delete.confirm')}\n cancelLabel={t('skills.dir.cancel')}\n onConfirm={async () => { if (!await store.deleteSkill(pendingDelete)) throw new Error(t('skills.delete.failed')) }}\n onCancel={() => setPendingDelete(undefined)}\n />\n )}\n </section>\n )\n})\n","import type { BridgeRequestMap, BridgeValueMap } from '../../../shared/bridge-contract.ts'\nimport { bridgeCall, type BridgeResult } from '../../data/bridge-client.ts'\n\nexport type ToolSurfaceSource = BridgeRequestMap['toolSurface']\nexport type ToolSurfaceResult = BridgeResult<BridgeValueMap['toolSurface']>\nexport type ToolSurfaceEntry = BridgeValueMap['toolSurface']['tools'][number]\n\n/** 每次读取独占一个生命周期;切换来源、刷新和卸载后不接收旧响应。 */\nexport function loadToolSurface(source: ToolSurfaceSource, accept: (result: ToolSurfaceResult) => void): () => void {\n let active = true\n if ((source.sessionId ?? source.presetId ?? '').length > 0) {\n void bridgeCall('toolSurface', source).then((result) => {\n if (active) accept(result)\n })\n }\n return () => { active = false }\n}\n","import { useEffect, useId, useState, type ReactNode } from 'react'\nimport { IconChevronDownOutlineRegular } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { StatusBadge } from '../../ui/StatusBadge.tsx'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport { loadToolSurface, type ToolSurfaceEntry, type ToolSurfaceResult, type ToolSurfaceSource } from './tool-surface-request.ts'\nimport css from './tools.module.css'\n\ntype ToolSurfaceProps = ToolSurfaceSource & { label: string; t: PromptToolTranslate; query?: string; headerAction?: ReactNode; children?: ReactNode; expandedState?: Record<string, boolean>; onReady?: () => void }\nconst matches = (entry: ToolSurfaceEntry, query: string): boolean =>\n entry.name.toLowerCase().includes(query) || entry.description.toLowerCase().includes(query)\n\n/** 一工具一卡;公开事实只到名称/描述/来源视角,不伪造插件配置或运行状态。 */\nexport function ToolSurfaceList({ tools, filter, t, sourceLabel, sourceId = '', expandedName }: {\n tools: readonly ToolSurfaceEntry[]; filter: string; t: PromptToolTranslate; sourceLabel?: string; sourceId?: string; expandedName?: string\n}): ReactNode {\n const sourceLabelText = sourceLabel ?? t('tools.surface.sourceLabel')\n const prefix = useId()\n const [expanded, setExpanded] = useState<string | null>(expandedName ?? null)\n const visible = tools.filter((entry) => matches(entry, filter.trim().toLowerCase()))\n return <>\n <p className={css.toolSurfaceHint} role=\"status\">{t('tools.surface.count', { visible: visible.length, total: tools.length })}</p>\n {visible.length === 0 ? <p className={css.toolSurfaceHint}>{tools.length === 0 ? t('tools.surface.emptySource') : t('tools.surface.emptyFilter')}</p> : (\n <ul className={css.toolSurfaceCards} aria-label={t('tools.surface.list.aria')}>\n {visible.map((entry, index) => {\n const key = `${entry.name}:${index}`\n const open = expanded === key || expanded === entry.name\n const detailId = `${prefix}-tool-${index}`\n return <li key={key} className={css.toolSurfaceCard} data-tool-card=\"true\" data-open={open || undefined}>\n <button type=\"button\" className={css.toolCardToggle} aria-expanded={open} aria-controls={detailId}\n aria-label={t('tools.surface.card.aria', { name: entry.name })} onClick={() => setExpanded(open ? null : key)}>\n <strong className={css.toolCardTitle}>{entry.name}</strong>\n <span className={css.toolCardTrailing}><StatusBadge tone=\"success\" label={t('tools.surface.badge.visible')} /><IconChevronDownOutlineRegular className={css.toolChevron} aria-hidden=\"true\" /></span>\n </button>\n {open && <div id={detailId} className={css.toolCardDetails}>\n <code className={css.toolEntryValue}>{entry.name}</code>\n <dl className={css.toolFacts}>\n <dt>{t('tools.surface.detail.name')}</dt><dd>{entry.name}</dd>\n <dt>{t('tools.surface.detail.from')}</dt><dd>{sourceLabelText}{sourceId && <> · <code>{sourceId}</code></>}</dd>\n <dt>{t('tools.surface.detail.status')}</dt><dd>{t('tools.surface.badge.visible')}</dd>\n <dt>{t('tools.surface.detail.description')}</dt><dd>{entry.description || t('tools.surface.detail.noDescription')}</dd>\n </dl>\n </div>}\n </li>\n })}\n </ul>\n )}\n </>\n}\n\nexport function ToolSurfaceView(props: ToolSurfaceProps): ReactNode {\n const key = props.sessionId !== undefined ? `session:${props.sessionId}` : `preset:${props.presetId}`\n return <ToolSurfaceContent key={key} {...props} />\n}\n\nfunction ToolSurfaceContent(props: ToolSurfaceProps): ReactNode {\n const { t } = props\n const { sessionId, presetId, query = '' } = props\n const [result, setResult] = useState<ToolSurfaceResult | null>(null)\n const [revision, setRevision] = useState(0)\n const groupKey = sessionId !== undefined ? `session:${sessionId}` : `preset:${presetId}`\n const [expanded, setExpanded] = useState(props.expandedState?.[groupKey] ?? true)\n const contentId = useId()\n const sourceId = sessionId ?? presetId ?? ''\n const loading = sourceId.length > 0 && result === null\n const open = expanded || query.trim().length > 0\n useEffect(() => { if (!loading) props.onReady?.() }, [loading, props.onReady])\n useEffect(() => loadToolSurface(sessionId !== undefined ? { sessionId } : { presetId: presetId! }, setResult), [sessionId, presetId, revision])\n const count = result?.ok ? result.value.tools.filter((entry) => matches(entry, query.trim().toLowerCase())).length : undefined\n\n return <section className={css.toolGroup} aria-label={props.label} aria-busy={loading}>\n <div className={css.toolGroupHeading}>\n <button type=\"button\" className={css.toolGroupToggle} aria-expanded={open} aria-controls={contentId} onClick={() => {\n setExpanded(!open)\n if (props.expandedState) props.expandedState[groupKey] = !open\n }}>\n <IconChevronDownOutlineRegular className={css.toolChevron} aria-hidden=\"true\" /><span>{props.label}</span>\n </button>\n <div className={css.toolHeaderAction}>{props.headerAction}</div>\n </div>\n <p className={css.toolGroupSub}>{sessionId !== undefined ? t('tools.surface.sub.session') : t('tools.surface.sub.preset')}{count !== undefined && t('tools.surface.sub.count', { count })}</p>\n {open && <div className={css.toolGroupBody} id={contentId}>\n {props.children}\n {sourceId.length === 0 ? <p className={css.toolSurfaceHint}>{sessionId !== undefined ? t('tools.surface.noSession') : t('tools.surface.noPreset')}</p> : <>\n <div className={css.toolSurfaceControls}>\n <p className={css.toolSurfaceHint}>{t('tools.surface.origin')}<code>{sourceId}</code></p>\n <button type=\"button\" className={css.toolRefresh} disabled={loading} onClick={() => { setResult(null); setRevision((value) => value + 1) }}>{t('tools.surface.refresh')}</button>\n </div>\n {loading && <p className={css.toolSurfaceHint} role=\"status\">{t('tools.surface.loading')}</p>}\n {result !== null && (result.ok\n ? <ToolSurfaceList tools={result.value.tools} filter={query} t={t} sourceLabel={props.label} sourceId={sourceId} />\n : <p className={css.toolSurfaceError} role=\"alert\">{result.message || t('tools.surface.readFailed')}{t('tools.surface.retrySuffix')}</p>)}\n </>}\n <p className={css.toolSurfaceHint}>{sessionId !== undefined\n ? t('tools.surface.note.session')\n : t('tools.surface.note.preset')}</p>\n </div>}\n </section>\n}\n","import { useCallback, useEffect, useState, useSyncExternalStore, type ReactNode } from 'react'\nimport { IconSearchOutlineRegular } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { PromptToolHostApi } from '../../data/host-api.ts'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport { MenuSelect } from '../../ui/MenuSelect.tsx'\nimport { ToolSurfaceView } from './ToolSurfaceView.tsx'\nimport css from './tools.module.css'\n\n/** 参考官方 plugin-inventory 的搜索、分组与详情卡;数据仍是模型工具面。 */\nexport function ToolsPreviewPage({ api, presetId, t, browse, onNavigate, onReady }: { api: PromptToolHostApi; presetId?: string; t: PromptToolTranslate; browse?: { query: string; selectedId: string; expanded: Record<string, boolean> }; onNavigate?: (page: 'presets') => void; onReady?: () => void }): ReactNode {\n const [query, setQuery] = useState(browse?.query ?? '')\n const [revision, setRevision] = useState(0)\n const [selectedId, setSelectedId] = useState(browse?.selectedId ?? '')\n const [presets, setPresets] = useState<Awaited<ReturnType<PromptToolHostApi['listAgentPresets']>>>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState('')\n const face = api.sessionModel\n const { sessionId } = useSyncExternalStore(face.subscribe, face.snapshot, face.snapshot)\n const [readySession, setReadySession] = useState<string>()\n const [readyPreset, setReadyPreset] = useState<string>()\n const sessionReady = useCallback(() => setReadySession(sessionId ?? ''), [sessionId])\n const presetReady = useCallback(() => setReadyPreset(selectedId), [selectedId])\n useEffect(() => {\n if (!loading && readySession === (sessionId ?? '') && readyPreset === selectedId) onReady?.()\n }, [loading, readySession, readyPreset, sessionId, selectedId, onReady])\n useEffect(() => { if (browse) Object.assign(browse, { query, selectedId }) }, [browse, query, selectedId])\n\n useEffect(() => {\n let active = true\n setLoading(true)\n setError('')\n void Promise.resolve().then(() => api.listAgentPresets()).then((options) => {\n if (!active) return\n setPresets(options)\n setSelectedId((current) => options.some((preset) => preset.id === current)\n ? current : options.some((preset) => preset.id === presetId) ? presetId! : options[0]?.id ?? '')\n setLoading(false)\n }, (reason: unknown) => {\n if (!active) return\n setError(reason instanceof Error ? reason.message : t('tools.loadFailed'))\n setLoading(false)\n })\n return () => { active = false }\n }, [api.listAgentPresets, presetId, revision, t])\n\n return <section className={css.toolsPreviewPage} aria-label={t('tools.aria')}>\n <label className={css.toolSearch}>\n <IconSearchOutlineRegular aria-hidden=\"true\" />\n <input type=\"search\" aria-label={t('tools.search.aria')} placeholder={t('tools.search.placeholder')} value={query}\n onChange={(event) => setQuery(event.target.value)} />\n </label>\n <ToolSurfaceView sessionId={sessionId ?? ''} onReady={sessionReady} expandedState={browse?.expanded} label={t('tools.surface.session')} t={t} query={query} />\n <ToolSurfaceView presetId={selectedId} onReady={presetReady} expandedState={browse?.expanded} label={t('tools.surface.preset')} t={t} query={query} headerAction={\n <MenuSelect ariaLabel={t('tools.surface.source.aria')} value={selectedId} placeholder={t('tools.surface.source.placeholder')}\n disabled={loading || presets.length === 0} className={css.toolPresetSelect} onChange={setSelectedId}\n options={presets.map((preset) => ({ value: preset.id, label: preset.name ?? preset.id }))} />\n }>\n <div className={css.toolSurfaceControls}>\n <button type=\"button\" className={css.toolRefresh} disabled={loading} onClick={() => setRevision((value) => value + 1)}>{t('tools.refreshPresets')}</button>\n {loading && <span className={css.toolSurfaceHint} role=\"status\">{t('tools.loadingPresets')}</span>}\n {error && <span className={css.toolSurfaceError} role=\"alert\">{error}</span>}\n {!loading && !error && presets.length === 0 && <span className={css.toolSurfaceHint}>{t('tools.noPresets')} {onNavigate && <button type=\"button\" className={css.toolRefresh} onClick={() => onNavigate('presets')}>{t('configs.chooseEditable')}</button>}</span>}\n </div>\n </ToolSurfaceView>\n <p className={css.toolSurfaceHint}>{t('tools.footnote')}</p>\n </section>\n}\n","/** 新建对象后的滚动定位(与\"过滤\"彻底分离)。\n *\n * 纪律:过滤下拉与搜索词只由用户手动改变;新建动作只做两件事——\n * ① 展开新卡(由调用方设置展开状态);② 滚动定位到新卡(本模块)。\n * 因此这里只读取目标锚点,绝不改动任何筛选状态;锚点选择器由调用方内联给出。\n */\n\n/** 滚动重试间隔与上限:节点由异步描述符驱动,尚未渲染时按固定间隔重试,超时静默退出。 */\nconst SCROLL_RETRY_MS = 80\nconst SCROLL_MAX_ATTEMPTS = 25\n\n/**\n * 转义 id 以安全嵌入 CSS 属性选择器。\n *\n * @param id - 目录配置 id 或引擎能力 id。\n * @returns 可安全用于 `[data-*=\"…\"]` 的转义结果。\n */\nexport const cssEscapeId = (id: string): string => CSS.escape(id)\n\n/**\n * 滚动定位到指定锚点;节点尚未渲染时按固定间隔重试,超时静默退出。\n *\n * @param selector - 目标卡片的 CSS 选择器。\n * @returns 清理函数:取消尚未触发的重试与待执行的滚动。\n */\nexport function scrollToCreatedCard(selector: string): () => void {\n let attempts = 0\n let timer: ReturnType<typeof setTimeout> | undefined\n let frame: number | undefined\n const attempt = (): void => {\n const target = document.querySelector(selector)\n if (target === null) {\n attempts += 1\n if (attempts <= SCROLL_MAX_ATTEMPTS) timer = setTimeout(attempt, SCROLL_RETRY_MS)\n return\n }\n // 等一帧再滚:让展开后的内容完成布局,避免定位到未展开高度。\n frame = requestAnimationFrame(() => {\n // 无效的块级对齐在实现上等价于 auto(可能整页跳动);先试 nearest,失败再退化为整体滚动。\n try {\n target.scrollIntoView({ block: 'nearest', inline: 'nearest' })\n } catch {\n target.scrollIntoView()\n }\n })\n }\n attempt()\n return () => {\n if (timer !== undefined) clearTimeout(timer)\n if (frame !== undefined) cancelAnimationFrame(frame)\n }\n}\n","import { cloneElement, isValidElement, useId, type ReactElement, type ReactNode } from 'react'\nimport { HintTooltip } from './HintTooltip.tsx'\nimport styles from './controls.module.css'\n\n/** 共享表单字段:生成 label/id 关联并渲染可选说明。 */\nexport function FormField(props: { label: string; hint?: string; error?: string; hintMode?: 'inline' | 'tooltip'; className?: string; children: ReactNode }): ReactNode {\n const id = useId()\n const errorId = `${id}-error`\n const hintId = `${id}-hint`\n const control = isValidElement(props.children)\n ? cloneElement(props.children as ReactElement<{ id?: string; 'aria-invalid'?: boolean; 'aria-describedby'?: string }>, {\n id,\n ...(props.error ? { 'aria-invalid': true } : {}),\n 'aria-describedby': [props.children.props['aria-describedby'], props.error ? errorId : undefined, props.hintMode !== 'tooltip' && props.hint ? hintId : undefined].filter(Boolean).join(' ') || undefined,\n })\n : props.children\n return (\n <div className={props.className === undefined ? styles.configField : `${styles.configField} ${props.className}`}>\n <label className={styles.configFieldLabel} htmlFor={id}>{props.label}</label>\n {props.hintMode === 'tooltip' && props.hint !== undefined\n ? <HintTooltip label={props.hint}><div className={styles.configFieldControlAnchor}>{control}</div></HintTooltip>\n : control}\n {props.hintMode !== 'tooltip' && props.hint && <p id={hintId} className={styles.configFieldHint}>{props.hint}</p>}\n {props.error && <p id={errorId} className={styles.configFieldError} role=\"alert\">{props.error}</p>}\n </div>\n )\n}\n","/** 标签输入:chip 增删 + 回车/逗号添加;底层仍为逗号分隔字符串,零数据层改动。 */\nimport { useState, type ReactNode } from 'react'\nimport { HintTooltip } from './HintTooltip.tsx'\nimport styles from './controls.module.css'\n\nexport function TagInput(props: {\n id: string\n label: string\n hint: string\n value: string\n placeholder?: string\n disabled?: boolean\n hintMode?: 'inline' | 'tooltip'\n onChange: (value: string) => void\n onCommit: () => void\n}): ReactNode {\n const { id, label, hint, hintMode, value, placeholder, disabled, onChange, onCommit } = props\n const [draft, setDraft] = useState('')\n const tags = value.split(',').map((tag) => tag.trim()).filter((tag) => tag.length > 0)\n\n const commitDraft = () => {\n const next = draft.trim()\n setDraft('')\n if (next.length === 0 || tags.includes(next)) return\n onChange([...tags, next].join(', '))\n onCommit()\n }\n\n const remove = (tag: string) => {\n onChange(tags.filter((item) => item !== tag).join(', '))\n onCommit()\n }\n\n const control = (\n <div className={styles.tagInput} data-disabled={disabled ? '' : undefined}>\n {tags.map((tag) => (\n <span key={tag} className={styles.tagChip}>\n {tag}\n {!disabled && (\n <button type=\"button\" className={styles.tagChipRemove} aria-label={`移除 ${tag}`} onClick={() => remove(tag)}>×</button>\n )}\n </span>\n ))}\n <input\n id={id}\n className={styles.tagInputField}\n value={draft}\n aria-label={label}\n placeholder={tags.length === 0 ? (placeholder ?? '输入后回车添加') : undefined}\n disabled={disabled}\n spellCheck={false}\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter' || event.key === ',') {\n event.preventDefault()\n commitDraft()\n } else if (event.key === 'Backspace' && draft.length === 0 && tags.length > 0) {\n remove(tags[tags.length - 1]!)\n }\n }}\n onBlur={commitDraft}\n />\n </div>\n )\n const field = (\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}><strong>{label}</strong>{hintMode !== 'tooltip' && <small>{hint}</small>}</span>\n {hintMode === 'tooltip' ? <HintTooltip label={hint}>{control}</HintTooltip> : control}\n </div>\n )\n return (\n <div className={styles.rowGroup}>\n {field}\n </div>\n )\n}\n","/** textarea 随内容自适应高度(field-sizing 的 JS 兜底:不支持的内核手动调整)。 */\nimport type { ChangeEvent } from 'react'\n\nexport function autoResizeTextarea(event: ChangeEvent<HTMLTextAreaElement>): void {\n const el = event.currentTarget\n if (typeof CSS !== 'undefined' && typeof CSS.supports === 'function' && CSS.supports('field-sizing', 'content')) return\n el.style.height = 'auto'\n el.style.height = `${el.scrollHeight}px`\n}\n","/** 客户端共享类型:提示词配置草稿、层能力矩阵与引擎 /meta 载荷。 */\nimport type { EngineMetaLayerContract, PromptConfigSourceView, StConversionReport, StOrderGroupCandidate } from '../shared/bridge-contract.ts'\nimport type { OfficialOrdersView } from '../shared/official-orders.ts'\nimport type { AssetImportRequest, AssetSummary } from '../shared/asset-transfer.ts'\n\n/**\n * 导入预览态(预设包与角色卡 JSON 共用):文件与凭据在确认时原样回传。\n * `previewRevision` 是服务端算的版本(绑定文件、选组、转换器与目标身份),\n * 客户端不计算、只回传;凭据本身不是写入授权。\n */\nexport interface ImportPreviewState extends AssetImportRequest {\n sourceDigest: string\n previewRevision?: string\n report?: StConversionReport\n groupCharacterId?: string\n summary?: AssetSummary\n}\n\n/** 顺序组候选(多 prompt_order 组无法明确对应时先让用户选组,再重新预览)。 */\nexport interface ImportOrderCandidates {\n sourceName?: string\n candidates: StOrderGroupCandidate[]\n}\n\n/** 卡片来源:预设卡,或指向用户磁盘指令文件的文件卡(服务端生成,客户端只读)。 */\nexport type CardOrigin =\n | { kind: 'preset'; presetId: string }\n | { kind: 'instruction-file'; fileId: string; contextId: string | null }\n\n/**\n * 条件判定的组合逻辑取值域:与 engine/anchor-match.mjs 的 MATCH_LOGIC 同域。\n * 下拉的取值与展示顺序表在 prompt-config-policy.ts 的 MATCH_LOGICS(同一取值域);\n * 与引擎的逐值对拍守卫见 test/client/prompt-config-form-layout.test.mjs。\n */\nexport type MatchLogic = 'any' | 'all' | 'not' | 'notAny'\n\n/**\n * 条件判定的匹配段(与引擎 match 同构,字段全部可选):\n * 键默认按字面文本匹配(正则元字符自动转义),`/pattern/flags` 形态或 `useRegex` 才走正则;\n * 引擎要求主键与副键至少有一个非空,`logic` 缺省 any。\n */\nexport interface PromptConfigMatch {\n keys: string[]\n secondaryKeys?: string[]\n logic?: MatchLogic\n caseSensitive?: boolean\n wholeWords?: boolean\n useRegex?: boolean\n}\n\n/** 客户端侧的提示词配置草稿:与宿主 PromptConfigSpec 同构,字段全部宽松。 */\nexport interface PromptConfigDraft extends PromptConfigSourceView {\n id: string\n name?: string\n enabled?: boolean\n layer?: string\n /** 条件判定的匹配对象(缺省由层决定);仅条件层可写,其余层声明即引擎报错。 */\n subject?: string\n /** 条件判定的匹配段;缺省 = 无条件命中。仅条件层可写。 */\n match?: PromptConfigMatch\n strategy?: string\n position?: string\n dedupe?: string\n promotion?: string\n /** 消息受众:缺省/null = 公用;main=仅主会话;subagent=仅子代理。 */\n audience?: string | null\n modelScope?: string\n configKind?: string\n order?: number\n role?: string\n group?: string\n exclusive?: boolean\n mergeMode?: string\n sourceKind?: string\n form?: string\n summary?: string\n text?: string\n texts?: string[]\n templateFile?: string\n fill?: string\n variables?: Record<string, string>\n params?: Record<string, unknown>\n identity?: { field: string; value: string }\n /** 视图元数据:来源归属;不写进 preset.yml,也不参与预设序列化。 */\n origin?: CardOrigin\n /** 视图元数据:指令文件读取状态(ready 之外不可编辑、不可保存)。 */\n contentStatus?: 'ready' | 'missing' | 'unreadable' | 'too-large'\n /** 视图元数据:读取失败或保存失败的诊断信息。 */\n contentMessage?: string\n /** 视图元数据:正文相对基线已改动(文件卡)。 */\n contentDirty?: boolean\n /** 视图元数据:外部编辑造成版本冲突,必须先重新读取。 */\n contentConflict?: boolean\n /** 视图元数据:该会话装配仍由官方指令行负责,独立来源本次不注入正文。 */\n contentOwnerConflict?: boolean\n /** 视图元数据:该文件正在保存。 */\n contentSaving?: boolean\n}\n\n/** 包内内置模板条目:文件 + 原文 + 解析后的单条配置(与生成目录 prompt-configs/*.yml 同构)。 */\nexport interface PromptConfigTemplateEntry {\n file: string\n content: string\n spec: PromptConfigDraft\n}\n\n/**\n * 层字段能力矩阵(11 项)的**唯一常量表**:{@link LayerFieldPolicy} 与\n * prompt-config-policy.ts 的 EMPTY_POLICY 都从本表派生,两处不再各自数一遍字段。\n * 取值与 engine/schema.mjs 每层 `fields` 的键集一致(对拍守卫见 test/client/mirror-guards.test.mjs)。\n */\nexport const LAYER_FIELD_POLICY_KEYS = [\n 'position', 'dedupe', 'promotion', 'audience', 'modelScope', 'merge',\n 'order', 'role', 'placeholder', 'subject', 'match',\n] as const\nexport type LayerFieldPolicyKey = (typeof LAYER_FIELD_POLICY_KEYS)[number]\n\n/** 每个注入层可用的字段开关(键集由 {@link LAYER_FIELD_POLICY_KEYS} 派生)。 */\nexport type LayerFieldPolicy = Record<LayerFieldPolicyKey, boolean>\n\n/** settings bridge /meta 返回的引擎能力矩阵。层行为、顺序和编辑组见 {@link EngineMetaLayerContract}。 */\nexport interface EngineMeta extends EngineMetaLayerContract {\n /**\n * 官方装配档位的区段刻度(B8 W2):`from`/`to` 都是**运行期**从官方服务求得的值,\n * 客户端不得硬编码任何档位数值。只用于 `system-section` / `runtime-context` 两层的\n * order 快捷填值;服务降级或官方档位名不匹配时整张表缺席,此时**不渲染**刻度下拉\n * (数字输入仍是唯一真相与唯一写入通道)。\n */\n officialOrders?: OfficialOrdersView\n /** 可用预设模板清单(UI 预设切换器)。 */\n presets?: Array<{ id: string; name: string; user?: boolean; renderable?: boolean; description?: string; meta?: Record<string, unknown> }>\n /** 插件目录内置模板清单(「新建预设」选择器数据源)。 */\n builtinTemplates?: Array<{ id: string; name: string }>\n layers: string[]\n strategies: string[]\n slotKinds: string[]\n positions: string[]\n dedupes: string[]\n promotions: string[]\n audienceModes: string[]\n modelScopes: string[]\n /** 实际可发出的注入角色(pre-step 只接受 user);表单只提供这些值。 */\n roles: string[]\n mergeModes: string[]\n fills: string[]\n /** 条件判定的匹配对象清单。 */\n subjects: string[]\n /** 层 → 缺省匹配对象映射(「层缺省」选项的说明文本)。 */\n layerDefaultSubjects: Record<string, string>\n layerFieldPolicies: Record<string, LayerFieldPolicy>\n layerLabels: Record<string, { title: string; detail: string }>\n}\n\n/** 配置校验错误条目(编辑器导入失败展示与列表校验共用)。 */\nexport interface ValidationErrorEntry {\n index: number\n id: string\n message: string\n}\n","import type { PromptToolLocaleKey, PromptToolTranslate } from '../../locales.ts'\nimport { ENGINE_LAYER_ORDER, engineGroupParamKeys, type EngineLayer } from '../../../shared/engine-capabilities.ts'\nimport { LAYER_FIELD_POLICY_KEYS, type EngineMeta, type LayerFieldPolicy, type LayerFieldPolicyKey, type MatchLogic, type PromptConfigDraft, type PromptConfigMatch } from '../../prompt-tool-types.ts'\nimport type { LayerContract } from '../../../shared/bridge-contract.ts'\n/**\n * sourceKind / form 是少量固定语义值,用下拉选择;**UI 专有,引擎无对应枚举**——\n * 引擎把两者当自由字符串收(schema.mjs:605-606 只做非空与缺省 'notice'),\n * 下列取值是客户端下拉的约定集合,引擎不校验、也不下发。引擎不设枚举故额外保留当前值。\n */\nexport const SOURCE_KINDS = ['', 'plugin', 'instruction-hint', 'instruction-file', 'skill-catalog', 'env-facts'] as const\nexport const SOURCE_FORMS = ['notice', 'hint', 'instructions', ''] as const\n\n/**\n * 层序的唯一来源是宿主 meta.layerOrder(运行时由引擎 schema 下发)。\n * 共享契约里的九层用于加载快照与模板菜单。\n */\nexport const INSERTION_LAYERS = ENGINE_LAYER_ORDER\n\n/**\n * 宿主层序在前,配置中的其他层追加在末尾,便于展示校验错误。\n */\nexport function displayLayers(layerOrder: readonly string[], layers: readonly string[]): string[] {\n return [...layerOrder, ...layers.filter((layer) => !layerOrder.includes(layer))]\n}\n\n/**\n * 枚举显示标签只存字典键(文案归 `prompt-tool` 字典):\n * 值 → 键映射 + {@link translateLabel} 求值,未知值回退原始值(旧配置仍可读)。\n */\nexport function translateLabel(\n t: PromptToolTranslate,\n keys: Record<string, PromptToolLocaleKey>,\n value: string,\n): string {\n const key = keys[value]\n return key === undefined ? value : t(key)\n}\n\n/** audience:空值=公用(缺省,通用参数默认);main=仅主会话;subagent=仅子代理。 */\nexport const AUDIENCE_LABEL_KEYS: Record<string, PromptToolLocaleKey> = { '': 'audience.none', main: 'audience.main', subagent: 'audience.subagent' }\n/**\n * 层显示标签的字典键:键集由共享契约的 {@link EngineLayer} 联合在编译期约束(九层穷尽、禁多余键),\n * 与引擎下发的 layerLabels 的键集对拍见 test/client/mirror-guards.test.mjs。\n * 文案仍归 `prompt-tool` 字典(zh/en 双份),不消费 /meta 的 layerLabels.title(引擎只下发中文单份)。\n */\nexport const LAYER_LABEL_KEYS: Record<EngineLayer, PromptToolLocaleKey> = {\n 'pre-step': 'layer.pre-step',\n 'system-section': 'layer.system-section',\n 'runtime-context': 'layer.runtime-context',\n 'agent-request': 'layer.agent-request',\n 'llm-stream': 'layer.llm-stream',\n 'tool-pipeline': 'layer.tool-pipeline',\n 'turn-stop': 'layer.turn-stop',\n 'subagent-start': 'layer.subagent-start',\n 'subagent-end': 'layer.subagent-end',\n}\nexport const STRATEGY_LABEL_KEYS: Record<string, PromptToolLocaleKey> = {\n static: 'strategy.static',\n placeholder: 'strategy.placeholder',\n 'first-turn-anchor': 'strategy.firstTurnAnchor',\n 'guide-auto': 'strategy.guideAuto',\n 'custom-fallback': 'strategy.customFallback',\n 'world-book': 'strategy.worldBook',\n}\nexport const SLOT_KIND_LABEL_KEYS: Record<string, PromptToolLocaleKey> = { ordered: 'slotKind.ordered', anchor: 'slotKind.anchor' }\nexport const ROLE_LABEL_KEYS: Record<string, PromptToolLocaleKey> = { user: 'role.user' }\nexport const POSITION_LABEL_KEYS: Record<string, PromptToolLocaleKey> = { 'after-user': 'position.afterUser', 'before-all': 'position.beforeAll', 'after-all': 'position.afterAll' }\nexport const MERGE_MODE_LABEL_KEYS: Record<string, PromptToolLocaleKey> = { separate: 'merge.separate', merged: 'merge.merged' }\nexport const DEDUPE_LABEL_KEYS: Record<string, PromptToolLocaleKey> = { none: 'dedupe.none', session: 'dedupe.session', batch: 'dedupe.batch' }\nexport const PROMOTION_LABEL_KEYS: Record<string, PromptToolLocaleKey> = { none: 'promotion.none', main: 'promotion.main', 'include-subagents': 'promotion.subagents' }\nexport const MODEL_SCOPE_LABEL_KEYS: Record<string, PromptToolLocaleKey> = { all: 'modelScope.all', pro: 'modelScope.pro', flash: 'modelScope.flash' }\n/** 官方装配刻度的区段显示名(id 来自 src/shared/official-orders.ts;这里只有名字,没有数值)。 */\nexport const OFFICIAL_ORDER_GROUP_LABEL_KEYS: Record<string, PromptToolLocaleKey> = {\n identity: 'orderGroup.identity',\n policy: 'orderGroup.policy',\n tools: 'orderGroup.tools',\n sdk: 'orderGroup.sdk',\n deliverable: 'orderGroup.deliverable',\n closing: 'orderGroup.closing',\n 'runtime-policy': 'orderGroup.runtimePolicy',\n}\n/** 只有把 order 原样交给官方 `section()` / `context()` 的两层才展示官方刻度。 */\nexport const OFFICIAL_ORDER_LAYERS: readonly EngineLayer[] = ['system-section', 'runtime-context']\nexport const FILL_LABEL_KEYS: Record<string, PromptToolLocaleKey> = { '': 'fill.none', 'instruction-hint': 'fill.instructionHint', 'env-facts': 'fill.envFacts', 'skill-catalog': 'fill.skillCatalog' }\n/** 上述两个 UI 专有取值集的标签键:没有引擎值可对拍,只给本地下拉用。 */\nexport const SOURCE_KIND_LABEL_KEYS: Record<string, PromptToolLocaleKey> = { '': 'sourceKind.default', plugin: 'sourceKind.plugin', 'instruction-hint': 'sourceKind.instructionHint', 'instruction-file': 'sourceKind.instructionFile', 'skill-catalog': 'sourceKind.skillCatalog', 'env-facts': 'sourceKind.envFacts' }\nexport const SOURCE_FORM_LABEL_KEYS: Record<string, PromptToolLocaleKey> = { notice: 'sourceForm.notice', hint: 'sourceForm.hint', instructions: 'sourceForm.instructions', '': 'sourceForm.default' }\n/**\n * identity.field:引擎只接受 'plugin'(schema.mjs:450,kind 模式已与 sourceKind 归一),\n * 表单也只提供 ['plugin'](PromptConfigForm 的 IdentityFields);'kind' 是历史遗留标签键,\n * 当前没有消费点,保留不改动(删它属于 UI 面收紧,不在本次零行为变更范围内)。\n */\nexport const IDENTITY_FIELD_LABEL_KEYS: Record<string, PromptToolLocaleKey> = { plugin: 'identity.plugin', kind: 'identity.kind' }\n/**\n * emptyBehavior:引擎消费点内联取 'text',其余一律按 'skip'(fillers.mjs),\n * schema 未声明枚举,因此这里同样不引用 /meta。\n */\nexport const EMPTY_BEHAVIOR_LABEL_KEYS: Record<string, PromptToolLocaleKey> = { skip: 'emptyBehavior.skip', text: 'emptyBehavior.text' }\n/** 条件判定的匹配对象(''= 层缺省,不写 subject 字段)。 */\nexport const SUBJECT_LABEL_KEYS: Record<string, PromptToolLocaleKey> = {\n '': 'subject.layerDefault',\n toolArgs: 'subject.toolArgs',\n toolResult: 'subject.toolResult',\n userMessage: 'subject.userMessage',\n assistantText: 'subject.assistantText',\n subagentInfo: 'subject.subagentInfo',\n}\n/**\n * 组合逻辑取值(引擎 MATCH_LOGIC 的四个值),顺序即下拉展示顺序;取值域由 {@link MatchLogic} 约束。\n * 不做运行期派生:产品代码不 import engine/*.mjs(无既有先例),\n * 与 engine/anchor-match.mjs 的逐值对拍守卫见 test/client/prompt-config-form-layout.test.mjs。\n */\nexport const MATCH_LOGICS: readonly MatchLogic[] = ['any', 'all', 'not', 'notAny']\nexport const MATCH_LOGIC_LABEL_KEYS: Record<MatchLogic, PromptToolLocaleKey> = {\n any: 'match.any',\n all: 'match.all',\n not: 'match.not',\n notAny: 'match.notAny',\n}\n/**\n * useRegex 是三态而非开关:缺省(自动识别 `/pattern/flags`)、强制正则、强制字面。\n * 做成开关会把用户手写的 `useRegex: false`(强制字面)在编辑后静默变成自动识别。\n * 这三态是 **UI 专有**编辑形态(引擎只收 useRegex 布尔值),无对应引擎枚举。\n */\nexport const MATCH_REGEX_MODES = ['auto', 'force', 'literal'] as const\nexport const MATCH_REGEX_MODE_LABEL_KEYS: Record<string, PromptToolLocaleKey> = {\n auto: 'form.match.useRegex.auto',\n force: 'form.match.useRegex.force',\n literal: 'form.match.useRegex.literal',\n}\n\n/** 从引擎 /meta 中读取某层的字段能力;未知层回退 pre-step。空策略按键表派生,全 false。 */\n// Object.fromEntries 只能给索引签名,故此处断言:键集由 LAYER_FIELD_POLICY_KEYS 保证(不得手写第二份)。\nconst EMPTY_POLICY = Object.fromEntries(\n LAYER_FIELD_POLICY_KEYS.map((key): [LayerFieldPolicyKey, boolean] => [key, false]),\n) as LayerFieldPolicy\n\nexport function fieldPolicyFor(meta: EngineMeta, layer: string | undefined): LayerFieldPolicy {\n return meta.layerFieldPolicies[(layer ?? 'pre-step')] ?? EMPTY_POLICY\n}\n\nexport function layerContractFor(meta: EngineMeta, layer: string | undefined): LayerContract | undefined {\n return (meta.layerContracts as Record<string, LayerContract> | undefined)?.[layer ?? 'pre-step']\n}\n\n/** 只有用户明确换层才清理目标层拒绝的字段;隐藏正文、未知 params 不被删除。 */\nexport function layerChangePatch(meta: EngineMeta, config: PromptConfigDraft, layer: string): Partial<PromptConfigDraft> {\n const policy = fieldPolicyFor(meta, layer)\n const contract = layerContractFor(meta, layer)\n const patch: Partial<PromptConfigDraft> = { layer, ...clearedConditionPatch(meta, layer) }\n for (const field of ['position', 'dedupe', 'promotion', 'audience', 'modelScope', 'role'] as const) {\n if (!policy[field] && config[field] != null) Object.assign(patch, { [field]: undefined })\n }\n if (!policy.merge && config.mergeMode !== undefined) patch.mergeMode = undefined\n if (config.subject !== undefined && contract !== undefined && !contract.subjects.includes(config.subject)) patch.subject = undefined\n if (contract !== undefined && !contract.strategies.includes(config.strategy ?? 'static')) {\n patch.strategy = 'static'\n patch.fill = undefined\n }\n return patch\n}\n\n/**\n * 切换注入层的补丁:目标层不支持 subject/match 时清空旧值。\n * 引擎对不支持这两个字段的层直接 fail loud(整个预设无法挂载),\n * 所以「切过去顺手清掉」是唯一安全的层切换语义。\n */\nexport function clearedConditionPatch(meta: EngineMeta, layer: string): Pick<PromptConfigDraft, 'subject' | 'match'> {\n const policy = fieldPolicyFor(meta, layer)\n return {\n ...(policy.subject ? {} : { subject: undefined }),\n ...(policy.match ? {} : { match: undefined }),\n }\n}\n\n/**\n * 归一化 match 草稿:去空白键、丢缺省值(logic=any 与未开启的开关不落盘)。\n * 没有任何有效主/副键时返回 undefined——引擎的 match 要求至少一个非空键,\n * 半成品(只填了逻辑或开关)写进配置会让挂载期直接失败,因此不落盘。\n */\nexport function normalizeMatch(match: Partial<PromptConfigMatch> | undefined): PromptConfigMatch | undefined {\n const keys = (match?.keys ?? []).map((key) => key.trim()).filter((key) => key.length > 0)\n const secondaryKeys = (match?.secondaryKeys ?? []).map((key) => key.trim()).filter((key) => key.length > 0)\n if (keys.length === 0 && secondaryKeys.length === 0) return undefined\n // 非法 logic(手写 yml / 旧数据)回落缺省 any,而不是把非法值继续写回去。\n const logic = MATCH_LOGICS.find((value) => value === match?.logic)\n return {\n keys,\n ...(secondaryKeys.length > 0 ? { secondaryKeys } : {}),\n ...(logic !== undefined && logic !== 'any' ? { logic } : {}),\n ...(match?.caseSensitive === true ? { caseSensitive: true } : {}),\n ...(match?.wholeWords === true ? { wholeWords: true } : {}),\n ...(match?.useRegex !== undefined ? { useRegex: match.useRegex === true } : {}),\n }\n}\n\n/**\n * 统一搜索:同时覆盖「中文名」与「技术键」,只拼可搜索文本,不改变过滤语义\n * (过滤仍然只影响展示,不写盘、不改变保存载荷,也不把匹配结果合并成一张层结果)。\n */\nfunction matchesKeyword(text: string, keyword: string): boolean {\n return keyword.length === 0 || text.toLowerCase().includes(keyword)\n}\n\n/** 配置实例的搜索文本:标识、名称、枚举技术值与其中文标签、局部参数键。 */\nexport function configSearchText(config: PromptConfigDraft, t: PromptToolTranslate): string {\n const params = Object.keys(config.params ?? {})\n return [\n config.id,\n config.name ?? '',\n config.layer ?? '',\n config.strategy ?? '',\n config.position ?? '',\n config.dedupe ?? '',\n config.mergeMode ?? '',\n config.fill ?? '',\n config.sourceKind ?? '',\n config.form ?? '',\n config.role ?? '',\n config.audience ?? '',\n config.modelScope ?? '',\n ...params,\n translateLabel(t, LAYER_LABEL_KEYS, config.layer ?? 'pre-step'),\n translateLabel(t, STRATEGY_LABEL_KEYS, config.strategy ?? ''),\n translateLabel(t, POSITION_LABEL_KEYS, config.position ?? ''),\n translateLabel(t, FILL_LABEL_KEYS, config.fill ?? ''),\n translateLabel(t, SOURCE_KIND_LABEL_KEYS, config.sourceKind ?? ''),\n translateLabel(t, SOURCE_FORM_LABEL_KEYS, config.form ?? ''),\n translateLabel(t, AUDIENCE_LABEL_KEYS, config.audience ?? ''),\n translateLabel(t, MODEL_SCOPE_LABEL_KEYS, config.modelScope ?? ''),\n ].join(' ')\n}\n\n/** 该配置实例是否命中搜索词(配置名、标识、注入层与参数名)。 */\nexport function matchesConfigKeyword(config: PromptConfigDraft, keyword: string, t: PromptToolTranslate): boolean {\n return matchesKeyword(configSearchText(config, t), keyword)\n}\n\n/**\n * 编辑组 / 能力卡是否命中搜索词:能力 id(技术键)+ 该组参数键 + 参数中文标签。\n * 参数键取自 shared 派生,与能力卡侧的判定同一口径(本文件不反向依赖其他 feature)。\n */\nexport function matchesEditorGroup(id: string, keyword: string, t: PromptToolTranslate): boolean {\n if (keyword.length === 0) return true\n const keys = engineGroupParamKeys(id)\n return [id, ...keys, ...keys.map((key) => t(`param.${key}`))].join(' ').toLowerCase().includes(keyword)\n}\n","import { useEffect, useId, useMemo, useState, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { Switch } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { FieldDraft } from '../../data/workspace-drafts.ts'\nimport { FormField } from '../../ui/FormField.tsx'\nimport { HintTooltip } from '../../ui/HintTooltip.tsx'\nimport { MenuSelect, type MenuSelectOption } from '../../ui/MenuSelect.tsx'\nimport { TagInput } from '../../ui/TagInput.tsx'\nimport type { PromptToolLocaleKey, PromptToolTranslate } from '../../locales.ts'\nimport type { PromptConfigMatch } from '../../prompt-tool-types.ts'\nimport type { LayerContract } from '../../../shared/bridge-contract.ts'\nimport { managedConfigSpec, managedFieldValue, type ConfigFieldSources, type ManagedConfigSpec } from '../../../shared/managed-config-fields.ts'\nimport { autoResizeTextarea } from './textarea-resize.ts'\nimport { EMPTY_BEHAVIOR_LABEL_KEYS, MATCH_LOGIC_LABEL_KEYS, MATCH_LOGICS, MATCH_REGEX_MODE_LABEL_KEYS, MATCH_REGEX_MODES, normalizeMatch, translateLabel } from './prompt-config-policy.ts'\nimport sharedCss from '../../ui/controls.module.css'\nimport featureCss from './prompts.module.css'\n\nconst styles = { ...sharedCss, ...featureCss }\n\n/** 世界书触发逻辑(selectiveLogic 0-3)的显示键。 */\nconst SELECTIVE_LOGIC_LABEL_KEYS: Record<string, PromptToolLocaleKey> = {\n '0': 'selectiveLogic.0',\n '1': 'selectiveLogic.1',\n '2': 'selectiveLogic.2',\n '3': 'selectiveLogic.3',\n}\n\n/**\n * 层专属实例字段的键清单(与 engine/layers.mjs 的真实消费一一对应):\n * 末尾的 JSON 兜底按此剔除已结构化的键,同一取值不会同时出现两份输入。\n * turn-stop(续跑上限是引擎常量)与 subagent-end(只观察、无注入通道)没有可写\n * 实例字段,故不在此表——它们只拿到只读说明。\n */\nconst LAYER_PARAM_KEYS: Record<string, readonly string[]> = {\n 'runtime-context': ['contextName'],\n 'agent-request': ['patch', 'replace'],\n 'llm-stream': ['mode'],\n 'tool-pipeline': ['toolNames', 'preDecision', 'denyReason', 'postAction'],\n 'subagent-end': ['action'],\n}\n\n/** 只读层的说明键:没有可写参数是设计事实,用一句说明代替空白的策略区。 */\nconst LAYER_READ_ONLY_NOTES: Record<string, PromptToolLocaleKey> = {\n 'turn-stop': 'strategyParam.turnStopNote',\n 'subagent-end': 'strategyParam.subagentEndNote',\n}\n\n/** 引擎枚举 → 显示键:未知旧值仍由 OptionField 自己保留,避免旧配置无法编辑。 */\nconst LLM_STREAM_MODE_LABEL_KEYS: Record<string, PromptToolLocaleKey> = {\n pass: 'strategyParam.mode.pass',\n replace: 'strategyParam.mode.replace',\n}\nconst PRE_DECISION_LABEL_KEYS: Record<string, PromptToolLocaleKey> = {\n allow: 'strategyParam.preDecision.allow',\n deny: 'strategyParam.preDecision.deny',\n ask: 'strategyParam.preDecision.ask',\n}\nconst POST_ACTION_LABEL_KEYS: Record<string, PromptToolLocaleKey> = {\n accept: 'strategyParam.postAction.accept',\n replace: 'strategyParam.postAction.replace',\n block: 'strategyParam.postAction.block',\n}\nconst SUBAGENT_END_ACTION_LABEL_KEYS: Record<string, PromptToolLocaleKey> = {\n observe: 'strategyParam.endAction.observe',\n 'inject-main': 'strategyParam.endAction.injectMain',\n}\n\nfunction selectOptions(t: PromptToolTranslate, options: readonly string[], value: string | undefined): Array<{ value: string; label: string }> {\n const current = value ?? ''\n const entries = options.map((item) => ({ value: item, label: item === '' ? t('field.default') : item }))\n if (current !== '' && !options.includes(current)) entries.push({ value: current, label: t('field.current', { value: current }) })\n return entries\n}\n\n/** 共享枚举下拉:保持未知当前值可见,避免旧配置无法编辑。 */\nexport function OptionField(props: { t: PromptToolTranslate; label: string; hint?: string; className?: string; value: string | undefined; options: readonly string[]; fallback: string; onChange: (value: string) => void; keepCurrent?: boolean; labelKeys?: Record<string, PromptToolLocaleKey>; disabled?: boolean }): ReactNode {\n const options = selectOptions(props.t, props.options, props.value)\n return (\n <FormField label={props.label} hint={props.hint} hintMode=\"tooltip\" className={props.className}>\n <MenuSelect\n className={clsx(styles.configInput, styles.fieldControl)}\n ariaLabel={props.label}\n disabled={props.disabled}\n value={props.value ?? props.fallback}\n options={options.map((item) => ({ ...item, label: props.labelKeys === undefined ? item.label : translateLabel(props.t, props.labelKeys, item.value) }))}\n onChange={props.onChange}\n />\n </FormField>\n )\n}\n/** JSON 对象文本域:解析失败只在本地标红,不污染草稿。 */\nexport function JsonField(props: { t: PromptToolTranslate; label: string; value: Record<string, unknown> | undefined; onChange: (value: Record<string, unknown> | undefined) => void; fieldDrafts?: Map<string, FieldDraft>; draftKey?: string; disabled?: boolean }): ReactNode {\n // 依赖序列化结果而非对象引用:父级 patch 会让 params 产生新引用(即使内容未变),\n // 旧写法会把用户未提交的编辑重置;引用不变时 useMemo 不再重复序列化。\n const serialized = useMemo(() => JSON.stringify(props.value ?? {}, null, 2), [props.value])\n const [draft, updateDraft] = useFieldDraft(props.fieldDrafts, props.draftKey, serialized)\n const { text, error } = draft\n const commit = () => {\n try {\n const parsed = JSON.parse(text) as unknown\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {\n updateDraft({ ...draft, error: props.t('field.json.mustBeObject') })\n return\n }\n props.onChange(parsed as Record<string, unknown>)\n const canonical = JSON.stringify(parsed, null, 2)\n updateDraft({ source: canonical, text: canonical, error: '' })\n } catch {\n updateDraft({ ...draft, error: props.t('field.json.invalid') })\n }\n }\n return (\n <FormField className={styles.fieldFull} label={props.label} error={error}>\n <textarea\n className={clsx(styles.configTextarea, styles.configJsonInput, error && styles.configInputError)}\n aria-label={props.label}\n value={text}\n readOnly={props.disabled}\n spellCheck={false}\n onChange={(e) => { autoResizeTextarea(e); updateDraft({ ...draft, text: e.target.value, error: '' }) }}\n onBlur={commit}\n />\n </FormField>\n )\n}\n\n/** 原始输入归工作台;视图卸载不清理尚未接受的 JSON 或数字中间态。 */\nfunction useFieldDraft(fields: Map<string, FieldDraft> | undefined, key: string | undefined, source: string): [FieldDraft, (next: FieldDraft) => void] {\n const [draft, setDraft] = useState<FieldDraft>(() => (key === undefined ? undefined : fields?.get(key)) ?? { source, text: source, error: '' })\n const update = (next: FieldDraft): void => { if (key !== undefined) fields?.set(key, next); setDraft(next) }\n useEffect(() => {\n if (draft.source !== source && draft.text === draft.source && !draft.error) update({ source, text: source, error: '' })\n }, [source])\n return [draft, update]\n}\n\nexport function NumberField(props: { t: PromptToolTranslate; label: string; hint?: string; className?: string; value: number | string | undefined; fallback?: number | string; integer?: boolean; min?: number; disabled?: boolean; fieldDrafts?: Map<string, FieldDraft>; draftKey?: string; quickOptions?: readonly MenuSelectOption[]; quickLabel?: string; onChange: (value: number | string | undefined) => void }): ReactNode {\n const [draft, update] = useFieldDraft(props.fieldDrafts, props.draftKey, String(props.value ?? props.fallback ?? ''))\n const accept = (next: number | string | undefined): void => {\n if (props.disabled) return\n if (typeof next === 'number' && (!Number.isFinite(next) || (props.integer && !Number.isSafeInteger(next)) || (props.min !== undefined && next < props.min))) {\n update({ ...draft, error: props.t(props.integer ? 'field.number.integer' : 'field.number.invalid') })\n return\n }\n props.onChange(next)\n const accepted = String(next ?? '')\n update({ source: accepted, text: accepted, error: '' })\n }\n const quickOptions = props.quickOptions\n const field = <FormField label={props.label} hint={props.hint} hintMode=\"tooltip\" className={quickOptions === undefined ? props.className : undefined} error={draft.error}>\n <input className={clsx(styles.configInput, styles.fieldControl, styles.configNumberInput)} inputMode={props.integer ? 'numeric' : 'decimal'}\n value={draft.text} readOnly={props.disabled} onChange={(event) => update({ ...draft, text: event.target.value, error: '' })}\n onBlur={() => accept(draft.text.trim() === '' ? props.fallback : Number(draft.text))} />\n </FormField>\n if (quickOptions === undefined) return field\n const label = props.quickLabel ?? props.label\n return <div className={clsx(styles.orderField, props.className)}>\n {field}\n <FormField label={label}>\n <MenuSelect ariaLabel={label} placeholder={label} className={styles.fieldControl} disabled={props.disabled}\n value={draft.error === '' && quickOptions.some((option) => option.value === draft.text) ? draft.text : ''}\n options={quickOptions} onChange={(value) => accept(Number(value))} />\n </FormField>\n </div>\n}\n\n/** 布尔开关行(params 结构化编辑与条件判定开关共用);disabled 只用于条件判定区(策略区整体在 fieldset 内)。 */\nfunction ParamToggle(props: { label: string; hint?: string; className?: string; checked: boolean; disabled?: boolean; onChange: (checked: boolean) => void }): ReactNode {\n const control = (\n <span className={styles.configEnable}><Switch label={props.label} checked={props.checked} disabled={props.disabled} onChange={props.onChange} /></span>\n )\n return (\n <div className={clsx(styles.configToggleField, props.className)}>\n <span className={styles.configFieldLabel}>{props.label}</span>\n {props.hint === undefined ? control : <HintTooltip label={props.hint}>{control}</HintTooltip>}\n </div>\n )\n}\n\n/**\n * 条件判定的 match 编辑器(网格片段,由表单的注入规则区承载):\n * 主键 / 副键集合 + 组合逻辑 + 三个匹配开关。键按字面文本匹配,`/pattern/flags`\n * 形态或「正则匹配」开关才走正则;每次编辑都经 {@link normalizeMatch} 归一,\n * 无有效键时整段 match 被清空(引擎要求至少一个非空键)。\n */\nexport function MatchFields(props: { t: PromptToolTranslate; value: PromptConfigMatch | undefined; disabled?: boolean; onChange: (value: PromptConfigMatch | undefined) => void }): ReactNode {\n const t = props.t\n const value = props.value\n const keyId = useId()\n const listOf = (key: 'keys' | 'secondaryKeys'): string => (value?.[key] ?? []).join(', ')\n const setKeys = (key: 'keys' | 'secondaryKeys', next: string): void => {\n // TagInput 以逗号分隔字符串承载键集合(与世界书参数编辑器同形态)。\n props.onChange(normalizeMatch({ ...value, [key]: next.split(',').map((item) => item.trim()).filter((item) => item.length > 0) }))\n }\n const setFlag = (key: 'caseSensitive' | 'wholeWords', next: boolean): void => {\n props.onChange(normalizeMatch({ ...value, [key]: next }))\n }\n const regexMode = value?.useRegex === undefined ? 'auto' : (value.useRegex === true ? 'force' : 'literal')\n return (\n <>\n <p className={clsx(styles.configFieldHint, styles.fieldFull)}>{t('form.match.hint')}</p>\n <div className={styles.fieldSpan6}><TagInput id={`${keyId}-match-keys`} label={t('form.match.keys.label')} hint={t('form.match.keys.hint')} hintMode=\"tooltip\" disabled={props.disabled} onCommit={() => {}}\n value={listOf('keys')} placeholder={t('form.match.keys.placeholder')} onChange={(next) => setKeys('keys', next)} /></div>\n <div className={styles.fieldSpan6}><TagInput id={`${keyId}-match-secondary-keys`} label={t('form.match.secondaryKeys.label')} hint={t('form.match.secondaryKeys.hint')} hintMode=\"tooltip\" disabled={props.disabled} onCommit={() => {}}\n value={listOf('secondaryKeys')} placeholder={t('form.match.secondaryKeys.placeholder')} onChange={(next) => setKeys('secondaryKeys', next)} /></div>\n <OptionField t={t} className={styles.fieldSpan3} label={t('form.match.logic.label')} hint={t('form.match.logic.hint')}\n value={value?.logic} options={MATCH_LOGICS} fallback=\"any\" labelKeys={MATCH_LOGIC_LABEL_KEYS} disabled={props.disabled}\n onChange={(next) => props.onChange(normalizeMatch({ ...value, logic: next as PromptConfigMatch['logic'] }))} />\n <ParamToggle className={styles.fieldSpan3} label={t('form.match.caseSensitive.label')} hint={t('form.match.caseSensitive.hint')} disabled={props.disabled}\n checked={value?.caseSensitive === true} onChange={(next) => setFlag('caseSensitive', next)} />\n <ParamToggle className={styles.fieldSpan3} label={t('form.match.wholeWords.label')} hint={t('form.match.wholeWords.hint')} disabled={props.disabled}\n checked={value?.wholeWords === true} onChange={(next) => setFlag('wholeWords', next)} />\n <OptionField t={t} className={styles.fieldSpan3} label={t('form.match.useRegex.label')} hint={t('form.match.useRegex.hint')}\n value={regexMode} options={MATCH_REGEX_MODES} fallback=\"auto\" labelKeys={MATCH_REGEX_MODE_LABEL_KEYS} disabled={props.disabled}\n onChange={(next) => props.onChange(normalizeMatch({\n ...value,\n useRegex: next === 'auto' ? undefined : next === 'force',\n }))} />\n </>\n )\n}\n\n/** params 文本域(结构化编辑用):失焦写入草稿 params。 */\nfunction ParamTextarea(props: { label: string; hint?: string; className?: string; value: string; onChange: (value: string) => void }): ReactNode {\n return (\n <FormField label={props.label} hint={props.hint} hintMode=\"tooltip\" className={props.className}>\n <textarea\n className={styles.configTextarea}\n aria-label={props.label}\n value={props.value}\n spellCheck={false}\n onChange={(e) => { autoResizeTextarea(e); props.onChange(e.target.value) }}\n />\n </FormField>\n )\n}\n\n/** params 单行文本域(结构化编辑用)。 */\nfunction ParamInput(props: { label: string; hint?: string; className?: string; value: string; onChange: (value: string) => void }): ReactNode {\n return (\n <FormField label={props.label} hint={props.hint} hintMode=\"tooltip\" className={props.className}>\n <input className={clsx(styles.configInput, styles.fieldControl)} value={props.value} spellCheck={false} onChange={(e) => props.onChange(e.target.value)} />\n </FormField>\n )\n}\n\n/** 官方 LlmCallConfig 的六个可写字段;实例 patch 与预设共享模型参数保持不同所有者。 */\nfunction RequestPatchFields(props: { t: PromptToolTranslate; value: Record<string, unknown>; onChange: (value: Record<string, unknown>) => void; fieldDrafts?: Map<string, FieldDraft>; draftScope?: string }): ReactNode {\n const { t, value } = props\n const set = (key: string, next: unknown): void => {\n const patch = { ...value }\n if (next === '' || next === undefined || (Array.isArray(next) && next.length === 0)) delete patch[key]\n else patch[key] = next\n props.onChange(patch)\n }\n const keys = ['provider', 'model', 'reasoningEffort', 'temperature', 'maxTokens', 'stop']\n const extra = Object.fromEntries(Object.entries(value).filter(([key]) => !keys.includes(key)))\n const covered = Object.fromEntries(Object.entries(value).filter(([key]) => keys.includes(key)))\n return <>\n <p className={clsx(styles.configFieldHint, styles.fieldFull)}>{t('strategyParam.request.hint')}</p>\n {(['provider', 'model', 'reasoningEffort'] as const).map((key) => <ParamInput key={key} className={styles.fieldSpan4}\n label={t(`strategyParam.request.${key}`)} value={typeof value[key] === 'string' ? value[key] : ''} onChange={(next) => set(key, next)} />)}\n {(['temperature', 'maxTokens'] as const).map((key) => <NumberField key={key} t={t} className={styles.fieldSpan6}\n label={t(`strategyParam.request.${key}`)} value={typeof value[key] === 'number' || typeof value[key] === 'string' ? value[key] : ''}\n fallback=\"\" integer={key === 'maxTokens'} min={key === 'maxTokens' ? 1 : undefined} fieldDrafts={props.fieldDrafts}\n draftKey={`${props.draftScope}:params.patch.${key}`} onChange={(next) => set(key, next)} />)}\n <ParamTextarea className={styles.fieldFull} label={t('strategyParam.request.stop')} hint={t('strategyParam.request.stopHint')}\n value={Array.isArray(value.stop) ? value.stop.map(String).join('\\n') : ''}\n onChange={(next) => set('stop', next.split('\\n').filter((item) => item.length > 0))} />\n {Object.keys(extra).length > 0 && <JsonField t={t} label={t('field.json.advanced')} value={extra}\n fieldDrafts={props.fieldDrafts} draftKey={`${props.draftScope}:params.patch.extra`}\n onChange={(next) => props.onChange({ ...covered, ...next })} />}\n </>\n}\n\n/** 仅展示 host 确认来自参数投影的字段;白名单提供来源参数标签。 */\nfunction ManagedFieldsPanel(props: {\n t: PromptToolTranslate\n spec: ManagedConfigSpec\n config: { enabled?: boolean; modelScope?: string; params?: Record<string, unknown> }\n}): ReactNode {\n const { t, spec } = props\n return (\n <div className={clsx(styles.configFieldHint, styles.fieldFull)} data-managed-config={spec.configId}>\n <p>{t(spec.configId === 'near-anchor' ? 'strategyParam.anchorManaged' : 'strategyParam.guideManaged')}</p>\n <ul>\n {spec.fields.map((field) => {\n const value = managedFieldValue(field, props.config)\n const shown = value === undefined || value === null || value === ''\n ? t('strategyParam.managed.empty')\n : typeof value === 'boolean' ? t(value ? 'param.on' : 'param.off') : String(value)\n const note = field.derived === true\n ? t('strategyParam.managed.derived')\n : field.fallbackNote === 'followsCustom' ? t('strategyParam.managed.followsCustom') : undefined\n return (\n <li key={field.path} data-managed-path={field.path} data-managed-source={field.sourceParam}>\n {t(`param.${field.sourceParam}`)} · {t('strategyParam.managed.source', { param: field.sourceParam })} · {shown}\n {note === undefined ? undefined : <> · {note}</>}\n </li>\n )\n })}\n </ul>\n </div>\n )\n}\n\n/**\n * 按 layer / strategy 拆解 params 为结构化编辑框(替代裸 JSON):\n * 层专属 → system-section(段名/独占/动态抑制)、runtime-context(注册名)、\n * agent-request(patch/replace)、llm-stream(mode)、tool-pipeline(toolNames/裁决);\n * first-turn-anchor → near-anchor 锚点参数(开关/锚文本/任务正则/引导句);\n * guide-auto → router-guide 每轮引导参数(开关/文本/复杂正则/强弱引导句);\n * custom-fallback → prompt-injector 锚定词(params.text 为运行时注入内容,不暴露编辑);\n * placeholder → fill 模板参数(text/envKeys/limit/fields/providers/emptyBehavior/emptyText);\n * 无固定字段的策略回退 JSON 编辑(保留任意 params 能力)。\n */\nexport function StrategyParamsFields(props: { t: PromptToolTranslate; strategy: string; layer?: string; contract?: LayerContract; params: Record<string, unknown> | undefined; onPatch: (params: Record<string, unknown>) => void; id?: string; fieldSources?: ConfigFieldSources; enabled?: boolean; modelScope?: string; fieldDrafts?: Map<string, FieldDraft>; draftScope?: string }): ReactNode {\n const { strategy, layer, params, onPatch, id } = props\n const t = props.t\n const value = params ?? {}\n const keyId = useId()\n const str = (key: string): string => (typeof value[key] === 'string' ? value[key] as string : '')\n const bool = (key: string): boolean => value[key] === true\n const set = (key: string, next: unknown): void => onPatch({ ...value, [key]: next })\n const options = (key: string, fallback: readonly string[]): readonly string[] => props.contract?.params[key]?.values ?? fallback\n if (layer === 'system-section') {\n // system-section 层参数:段名(空则引擎回退 id 注册为普通段)与 complete(独占\n // system prompt)。人设不走本层:preset.yml 顶层 persona 段(官方\n // @deepseek-ai/dsh-persona 行同构)由「人设」卡编辑。\n // 未结构化的键仍走高级 JSON:手写/导入的其它 params(例如 stMacros)不被吞掉,\n // 提交时把结构化值并回,避免保存一次丢掉段名与 complete。\n const sectionKeys = ['sectionName', 'complete', 'suppressRuntimeContext']\n const sectionRest = Object.fromEntries(Object.entries(value).filter(([key]) => !sectionKeys.includes(key)))\n const sectionCovered = Object.fromEntries(Object.entries(value).filter(([key]) => sectionKeys.includes(key)))\n return (\n <>\n <ParamInput className={styles.fieldSpan3} label={t('strategyParam.sectionName.label')} hint={t('strategyParam.sectionName.hint')} value={str('sectionName')} onChange={(next) => set('sectionName', next)} />\n <ParamToggle className={styles.fieldSpan3} label={t('strategyParam.complete.label')} hint={t('strategyParam.complete.hint')}\n checked={bool('complete')} onChange={(next) => set('complete', next)} />\n <ParamToggle className={styles.fieldSpan3} label={t('strategyParam.suppressRuntimeContext.label')} hint={t('strategyParam.suppressRuntimeContext.hint')}\n checked={bool('suppressRuntimeContext')} onChange={(next) => set('suppressRuntimeContext', next)} />\n {Object.keys(sectionRest).length > 0 && (\n <JsonField t={t} label={t('field.json.advanced')} value={sectionRest} fieldDrafts={props.fieldDrafts}\n draftKey={`${props.draftScope}:params`} onChange={(next) => { if (next !== undefined) onPatch({ ...sectionCovered, ...next }) }} />\n )}\n </>\n )\n }\n const objectOf = (key: string): Record<string, unknown> | undefined => {\n const raw = value[key]\n return raw !== null && typeof raw === 'object' && !Array.isArray(raw) ? raw as Record<string, unknown> : undefined\n }\n /**\n * 层专属实例字段:只暴露 engine/layers.mjs 真实消费的 params(留空即引擎缺省),\n * 让此前只能写高级 JSON 的四层有可发现入口。层字段与 strategy 字段正交\n * (runtime-context 的 placeholder 是唯一交集),故先渲染层字段再落到策略分支。\n */\n const layerFields: ReactNode = layer === 'runtime-context' ? (\n <ParamInput className={styles.fieldSpan3} label={t('strategyParam.contextName.label')} hint={t('strategyParam.contextName.hint')}\n value={str('contextName')} onChange={(next) => set('contextName', next)} />\n ) : layer === 'agent-request' ? (\n <>\n <RequestPatchFields t={t} value={objectOf('patch') ?? {}} onChange={(next) => set('patch', next)}\n fieldDrafts={props.fieldDrafts} draftScope={props.draftScope} />\n <ParamToggle className={styles.fieldSpan3} label={t('strategyParam.replace.label')} hint={t('strategyParam.replace.hint')}\n checked={bool('replace')} onChange={(next) => set('replace', next)} />\n </>\n ) : layer === 'llm-stream' ? (\n <OptionField t={t} className={styles.fieldSpan3} label={t('strategyParam.mode.label')} hint={t('strategyParam.mode.hint')}\n value={str('mode') || 'pass'} options={options('mode', ['pass', 'replace'])} fallback=\"pass\" labelKeys={LLM_STREAM_MODE_LABEL_KEYS}\n onChange={(next) => set('mode', next)} />\n ) : layer === 'tool-pipeline' ? (\n <>\n {/* toolNames 只能按逗号串写:引擎 parseToolNames 只认字符串,数组会被解析成空\n = 匹配所有工具,把定向门扩大成全工具门。旧数组数据按同形态回显,编辑即写成字符串。 */}\n <ParamInput className={styles.fieldSpan6} label={t('strategyParam.toolNames.label')} hint={t('strategyParam.toolNames.hint')}\n value={Array.isArray(value['toolNames']) ? (value['toolNames'] as unknown[]).map(String).join(', ') : str('toolNames')}\n onChange={(next) => set('toolNames', next)} />\n <OptionField t={t} className={styles.fieldSpan3} label={t('strategyParam.preDecision.label')} hint={t('strategyParam.preDecision.hint')}\n value={str('preDecision') || 'allow'} options={options('preDecision', ['allow', 'deny', 'ask'])} fallback=\"allow\" labelKeys={PRE_DECISION_LABEL_KEYS}\n onChange={(next) => set('preDecision', next)} />\n {str('preDecision') === 'deny' && <ParamInput className={styles.fieldSpan6} label={t('strategyParam.denyReason.label')} hint={t('strategyParam.denyReason.hint')}\n value={str('denyReason')} onChange={(next) => set('denyReason', next)} />}\n <OptionField t={t} className={styles.fieldSpan3} label={t('strategyParam.postAction.label')} hint={t('strategyParam.postAction.hint')}\n value={str('postAction') || 'accept'} options={options('postAction', ['accept', 'replace', 'block'])} fallback=\"accept\" labelKeys={POST_ACTION_LABEL_KEYS}\n onChange={(next) => set('postAction', next)} />\n </>\n ) : layer === 'subagent-end' ? (\n <OptionField t={t} className={styles.fieldSpan6} label={t('strategyParam.endAction.label')} hint={t('strategyParam.endAction.hint')}\n value={str('action') || 'observe'} options={options('action', ['observe', 'inject-main'])} fallback=\"observe\" labelKeys={SUBAGENT_END_ACTION_LABEL_KEYS}\n onChange={(next) => set('action', next)} />\n ) : undefined\n const known = props.contract === undefined ? LAYER_PARAM_KEYS[layer ?? ''] ?? [] : Object.keys(props.contract.params)\n const rest = Object.fromEntries(Object.entries(value).filter(([key]) => !known.includes(key)))\n const covered = Object.fromEntries(Object.entries(value).filter(([key]) => known.includes(key)))\n const readOnlyNote = LAYER_READ_ONLY_NOTES[layer ?? '']\n\n const managed = managedConfigSpec(id, props.fieldSources)\n const projected = (key: string): boolean => managed?.fields.some((field) => field.path === `params.${key}`) === true\n if (strategy === 'first-turn-anchor' || strategy === 'guide-auto') {\n const anchor = strategy === 'first-turn-anchor'\n return (\n <>\n {managed !== undefined && <ManagedFieldsPanel t={t} spec={managed} config={{ enabled: props.enabled, modelScope: props.modelScope, params: value }} />}\n {props.fieldSources?.configId === id && props.fieldSources?.fields.some((field) => field.source === 'prompt-config') && (\n <p className={clsx(styles.configFieldHint, styles.fieldFull)} data-config-source=\"prompt-config\">{t('strategyParam.managed.local')}</p>\n )}\n {!projected('useCustom') && <ParamToggle className={styles.fieldSpan4} label={t('strategyParam.custom.label')} hint={t('strategyParam.custom.hint')}\n checked={bool('useCustom')} onChange={(next) => set('useCustom', next)} />}\n {!projected('text') && <ParamTextarea className={styles.fieldFull} label={t(anchor ? 'strategyParam.anchorText.label' : 'strategyParam.guideText.label')}\n hint={t(anchor ? 'strategyParam.anchorText.hint' : 'strategyParam.guideText.hint')} value={str('text')} onChange={(next) => set('text', next)} />}\n {anchor && !projected('buildPattern') && <ParamInput className={styles.fieldSpan6} label={t('strategyParam.buildPattern.label')} hint={t('strategyParam.buildPattern.hint')}\n value={str('buildPattern')} onChange={(next) => set('buildPattern', next)} />}\n {!projected('complexPattern') && <ParamInput className={styles.fieldSpan6} label={t('strategyParam.complexPattern.label')} hint={t('strategyParam.complexPattern.hint')}\n value={str('complexPattern')} onChange={(next) => set('complexPattern', next)} />}\n {anchor && !projected('firstTurnBuild') && <ParamTextarea className={styles.fieldFull} label={t('strategyParam.firstTurnBuild')} value={str('firstTurnBuild')} onChange={(next) => set('firstTurnBuild', next)} />}\n {anchor && !projected('firstTurnInspect') && <ParamTextarea className={styles.fieldFull} label={t('strategyParam.firstTurnInspect')} value={str('firstTurnInspect')} onChange={(next) => set('firstTurnInspect', next)} />}\n {!anchor && !projected('guideWeak') && <ParamTextarea className={styles.fieldFull} label={t('strategyParam.guideWeak')} value={str('guideWeak')} onChange={(next) => set('guideWeak', next)} />}\n {!projected(anchor ? 'firstTurnDeep' : 'guideDeep') && <ParamTextarea className={styles.fieldFull} label={t('strategyParam.deepGuide')}\n value={str(anchor ? 'firstTurnDeep' : 'guideDeep')} onChange={(next) => set(anchor ? 'firstTurnDeep' : 'guideDeep', next)} />}\n </>\n )\n }\n if (strategy === 'custom-fallback') {\n return (\n <>\n <ParamInput className={styles.fieldSpan6} label={t('strategyParam.firstTurnWord.label')} hint={t('strategyParam.firstTurnWord.hint')}\n value={str('firstTurnWord')} onChange={(next) => set('firstTurnWord', next)} />\n </>\n )\n }\n if (strategy === 'world-book') {\n const list = (key: string): string => Array.isArray(value[key])\n ? (value[key] as unknown[]).map(String).join(', ') : str(key)\n const setList = (key: string, next: string): void => set(key, next.split(',').map((item) => item.trim()).filter((item) => item.length > 0))\n return (\n <>\n <ParamToggle className={styles.fieldSpan3} label={t('strategyParam.constant.label')} hint={t('strategyParam.constant.hint')}\n checked={bool('constant')} onChange={(next) => set('constant', next)} />\n <div className={styles.fieldSpan6}><TagInput id={`${keyId}-keys`} label={t('strategyParam.keys.label')} hint={t('strategyParam.keys.hint')} hintMode=\"tooltip\" onCommit={() => {}}\n value={list('keys')} placeholder={t('strategyParam.keys.placeholder')} onChange={(next) => setList('keys', next)} /></div>\n <div className={styles.fieldSpan6}><TagInput id={`${keyId}-secondary-keys`} label={t('strategyParam.secondaryKeys.label')} hint={t('strategyParam.secondaryKeys.hint')} hintMode=\"tooltip\" onCommit={() => {}}\n value={list('secondaryKeys')} placeholder={t('strategyParam.secondaryKeys.placeholder')} onChange={(next) => setList('secondaryKeys', next)} /></div>\n <ParamToggle className={styles.fieldSpan3} label={t('strategyParam.caseSensitive.label')} hint={t('strategyParam.caseSensitive.hint')}\n checked={bool('caseSensitive')} onChange={(next) => set('caseSensitive', next)} />\n <ParamToggle className={styles.fieldSpan3} label={t('strategyParam.wholeWords.label')} hint={t('strategyParam.wholeWords.hint')}\n checked={bool('wholeWords')} onChange={(next) => set('wholeWords', next)} />\n <ParamToggle className={styles.fieldSpan3} label={t('strategyParam.useRegex.label')} hint={t('strategyParam.useRegex.hint')}\n checked={bool('useRegex')} onChange={(next) => set('useRegex', next)} />\n <OptionField\n t={t}\n className={styles.fieldSpan6}\n label={t('strategyParam.selectiveLogic.label')}\n hint={t('strategyParam.selectiveLogic.hint')}\n value={value['selectiveLogic'] !== undefined ? String(value['selectiveLogic']) : '0'}\n options={['0', '1', '2', '3']}\n fallback=\"0\"\n labelKeys={SELECTIVE_LOGIC_LABEL_KEYS}\n onChange={(next) => set('selectiveLogic', Number(next))}\n />\n </>\n )\n }\n if (strategy === 'placeholder') {\n const emptyBehavior = str('emptyBehavior') || 'skip'\n return (\n <>\n {layerFields}\n <ParamTextarea className={styles.fieldFull} label={t('strategyParam.fillText.label')} hint={t('strategyParam.fillText.hint')}\n value={str('text')} onChange={(next) => set('text', next)} />\n <ParamInput className={styles.fieldSpan5} label={t('strategyParam.envKeys.label')} hint={t('strategyParam.envKeys.hint')}\n value={str('envKeys')} onChange={(next) => set('envKeys', next)} />\n <NumberField t={t} className={styles.fieldSpan2} label={t('strategyParam.limit.label')} hint={t('strategyParam.limit.hint')}\n value={typeof value.limit === 'number' || typeof value.limit === 'string' ? value.limit : ''} fallback=\"\"\n fieldDrafts={props.fieldDrafts} draftKey={`${props.draftScope}:params.limit`} onChange={(next) => set('limit', next)} />\n <ParamInput className={styles.fieldSpan5} label={t('strategyParam.fields.label')} hint={t('strategyParam.fields.hint')}\n value={str('fields')} onChange={(next) => set('fields', next)} />\n <ParamInput className={styles.fieldSpan6} label={t('strategyParam.providers.label')} hint={t('strategyParam.providers.hint')}\n value={str('providers')} onChange={(next) => set('providers', next)} />\n <OptionField t={t} className={styles.fieldSpan3} label={t('strategyParam.emptyBehavior.label')} hint={t('strategyParam.emptyBehavior.hint')}\n value={emptyBehavior} options={['skip', 'text']} fallback=\"skip\" labelKeys={EMPTY_BEHAVIOR_LABEL_KEYS} onChange={(next) => set('emptyBehavior', next)} />\n {emptyBehavior === 'text' && (\n <ParamTextarea className={styles.fieldFull} label={t('strategyParam.emptyText')} value={str('emptyText')} onChange={(next) => set('emptyText', next)} />\n )}\n </>\n )\n }\n // 无策略参数的配置(static 等):预设级内容变量已展开进 variables(官方插值\n // 机制,由上方 VariablesEditor 结构化编辑),params 为空时不再渲染 JSON 框。\n if (Object.keys(value).length === 0) {\n return (\n <>\n {layerFields}\n {/* 有层字段时不喊「无参数」:可编辑实例参数就在上面,提示只会与界面自相矛盾。 */}\n {layerFields === undefined && <p className={styles.configFieldHint}>{t('strategyParam.noParams')}</p>}\n {readOnlyNote !== undefined && <p className={styles.configFieldHint}>{t(readOnlyNote)}</p>}\n </>\n )\n }\n // 层字段之外仍有 params(未知键 / 旧数据)时继续走高级 JSON:新增分支既不吞未知\n // 资产,也不把已结构化的键重复渲染一遍;JSON 提交时把结构化值原样并回,避免丢字段。\n if (layerFields !== undefined) {\n return (\n <>\n {layerFields}\n {readOnlyNote !== undefined && <p className={styles.configFieldHint}>{t(readOnlyNote)}</p>}\n {Object.keys(rest).length > 0 && (\n <JsonField t={t} label={t('field.json.advanced')} value={rest} fieldDrafts={props.fieldDrafts}\n draftKey={`${props.draftScope}:params`} onChange={(next) => { if (next !== undefined) onPatch({ ...covered, ...next }) }} />\n )}\n </>\n )\n }\n return <JsonField t={t} label={t('field.json.advanced')} value={value} fieldDrafts={props.fieldDrafts} draftKey={`${props.draftScope}:params`} onChange={(next) => { if (next !== undefined) onPatch(next) }} />\n}\n\n/** 模板变量键值对编辑器(替代 JSON):每行 key + value,可增删。工作台「模板变量」卡片复用。 */\nexport function VariablesEditor(props: { t: PromptToolTranslate; value: Record<string, string> | undefined; disabled?: boolean; onChange: (value: Record<string, string> | undefined) => void }): ReactNode {\n const t = props.t\n const entries = Object.entries(props.value ?? {})\n const commit = (next: Array<[string, string]>) => {\n // 保留空 key 行(「添加变量」新增的待编辑行);空 key 由保存端(savePresetParams)\n // 统一清理,避免新增行被立即过滤导致按钮失效。\n props.onChange(next.length > 0 ? Object.fromEntries(next) : undefined)\n }\n const setEntry = (index: number, key: string, value: string) => {\n commit(entries.map((entry, at): [string, string] => at === index ? [key, value] : entry))\n }\n return (\n <span className={styles.configFieldStack}>\n <span className={styles.variableHeader}>\n <span className={styles.variableHeaderCopy}>\n <span className={styles.configFieldLabel}>{t('variables.title')}</span>\n {entries.length === 0 && <span className={styles.configFieldHint}>{t('variables.empty')}</span>}\n </span>\n <button type=\"button\" className={styles.pillButton} disabled={props.disabled} onClick={() => commit([...entries, ['', '']])}>{t('variables.add')}</button>\n </span>\n {entries.map(([key, value], index) => (\n <span key={`${key}-${index}`} className={styles.variableRow}>\n <input className={styles.configInput} aria-label={t('variables.nameAria')} value={key} spellCheck={false} placeholder={t('variables.namePlaceholder')} readOnly={props.disabled}\n onChange={(e) => setEntry(index, e.target.value, value)} />\n <input className={styles.configInput} aria-label={t('variables.valueAria')} value={value} spellCheck={false} placeholder={t('variables.valuePlaceholder')} readOnly={props.disabled}\n onChange={(e) => setEntry(index, key, e.target.value)} />\n <button type=\"button\" className={styles.pillButton} data-danger aria-label={t('variables.removeAria', { name: key || index })} disabled={props.disabled}\n onClick={() => commit(entries.filter((_, at) => at !== index))}>{t('variables.delete')}</button>\n </span>\n ))}\n </span>\n )\n}\n","/** ARIA tabs 键盘导航:左右切换、Home/End 跳首尾,并把焦点移到新 tab。 */\nimport type { KeyboardEvent as ReactKeyboardEvent } from 'react'\n\n/** 纯索引算法:无效索引、空列表或非导航键均不产生目标。 */\nexport function nextTabIndex(length: number, current: number, key: string): number | undefined {\n if (length <= 0 || current < 0 || current >= length) return undefined\n if (key === 'ArrowRight') return (current + 1) % length\n if (key === 'ArrowLeft') return (current - 1 + length) % length\n if (key === 'Home') return 0\n if (key === 'End') return length - 1\n return undefined\n}\n\nexport function tabKeyHandler<T>(\n items: readonly T[],\n current: T,\n onSelect: (item: T) => void,\n): (event: ReactKeyboardEvent<HTMLElement>) => void {\n return (event) => {\n const next = nextTabIndex(items.length, items.indexOf(current), event.key)\n if (next === undefined) return\n event.preventDefault()\n onSelect(items[next]!)\n event.currentTarget.parentElement?.querySelectorAll<HTMLElement>('[role=\"tab\"]')[next]?.focus()\n }\n}\n","import { Children, isValidElement, useEffect, useId, useRef, useState, type ReactNode } from 'react'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport { nextTabIndex } from '../../ui/tab-key.ts'\nimport styles from './prompts.module.css'\n\n/** 本卡的编辑视图;普通面板保持挂载,层共享设置在首次进入后保留。 */\nexport function PromptConfigNavigation(props: {\n t: PromptToolTranslate\n children: ReactNode\n layer: string\n renderLayerSettings?: () => ReactNode\n}): ReactNode {\n const id = useId()\n const root = useRef<HTMLDivElement>(null)\n const [selected, setSelected] = useState('conditions')\n const [visitedSettings, setVisitedSettings] = useState<string>()\n const [horizontal, setHorizontal] = useState(false)\n const [invalid, setInvalid] = useState<string[]>([])\n const panels = Children.toArray(props.children).filter(isValidElement<{ 'data-config-panel': string; 'aria-label': string }>).map(child => ({\n key: child.props['data-config-panel'], label: child.props['aria-label'], content: child,\n }))\n if (props.renderLayerSettings !== undefined) panels.push({ key: 'settings', label: props.t('form.navigation.settings'), content: <></> })\n const active = panels.some(panel => panel.key === selected) ? selected : panels[0]?.key\n const refreshInvalid = () => {\n const next = [...root.current?.querySelectorAll<HTMLElement>('[data-config-view]') ?? []]\n .filter(panel => panel.querySelector('[aria-invalid=\"true\"], [role=\"alert\"]') !== null)\n .map(panel => panel.dataset.configView!)\n setInvalid(previous => previous.join() === next.join() ? previous : next)\n }\n useEffect(refreshInvalid)\n useEffect(() => {\n if (root.current === null) return\n const observer = new ResizeObserver(([entry]) => setHorizontal((entry?.contentRect.width ?? 0) <= 620))\n observer.observe(root.current)\n return () => observer.disconnect()\n }, [])\n useEffect(() => {\n if (active === 'settings') setVisitedSettings(props.layer)\n }, [active, props.layer])\n const select = (key: string) => {\n refreshInvalid()\n if (key === 'settings') setVisitedSettings(props.layer)\n setSelected(key)\n }\n return <div ref={root} className={styles.configNavigation}>\n <div role=\"tablist\" aria-label={props.t('form.navigation.label')} aria-orientation={horizontal ? 'horizontal' : 'vertical'} className={styles.configTabs}>\n {panels.map((panel, index) => <button key={panel.key} type=\"button\" role=\"tab\" id={`${id}-tab-${panel.key}`}\n data-config-tab={panel.key} aria-controls={`${id}-panel-${panel.key}`} aria-selected={active === panel.key}\n tabIndex={active === panel.key ? 0 : -1} className={styles.configTab}\n onClick={() => select(panel.key)} onKeyDown={event => {\n const key = event.key === 'ArrowDown' ? 'ArrowRight' : event.key === 'ArrowUp' ? 'ArrowLeft' : event.key\n const next = nextTabIndex(panels.length, index, key)\n if (next === undefined) return\n event.preventDefault()\n select(panels[next]!.key)\n event.currentTarget.parentElement?.querySelectorAll<HTMLButtonElement>('[role=\"tab\"]')[next]?.focus()\n }}>\n {panel.label}{invalid.includes(panel.key) && <span className={styles.configTabError} aria-label={props.t('form.navigation.invalid')}>!</span>}\n </button>)}\n </div>\n <div className={styles.configPanels}>\n {panels.map(panel => <div key={panel.key} role=\"tabpanel\" id={`${id}-panel-${panel.key}`}\n aria-labelledby={`${id}-tab-${panel.key}`} hidden={active !== panel.key} tabIndex={0}\n data-config-view={panel.key} data-layer-settings={panel.key === 'settings' ? props.layer : undefined} className={styles.configPanel}>\n {panel.key === 'settings'\n ? (active === 'settings' || visitedSettings === props.layer) && props.renderLayerSettings?.()\n : panel.content}\n </div>)}\n </div>\n </div>\n}\n","import type { ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { Switch } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { FieldDraft } from '../../data/workspace-drafts.ts'\nimport { FormField } from '../../ui/FormField.tsx'\nimport { HintTooltip } from '../../ui/HintTooltip.tsx'\nimport type { PromptToolLocaleKey, PromptToolTranslate } from '../../locales.ts'\nimport type { EngineMeta, PromptConfigDraft } from '../../prompt-tool-types.ts'\nimport type { InstructionPolicyFileOverride } from '../../../shared/instructions.ts'\nimport { MatchFields, NumberField, OptionField, StrategyParamsFields, VariablesEditor } from './PromptConfigFields.tsx'\nimport { autoResizeTextarea } from './textarea-resize.ts'\nimport { PromptConfigNavigation } from './PromptConfigNavigation.tsx'\nimport { instructionFileIdOf } from '../../data/prompt-config-content.ts'\nimport { isManagedConfigField } from '../../../shared/managed-config-fields.ts'\nimport {\n AUDIENCE_LABEL_KEYS,\n DEDUPE_LABEL_KEYS,\n FILL_LABEL_KEYS,\n IDENTITY_FIELD_LABEL_KEYS,\n LAYER_LABEL_KEYS,\n MERGE_MODE_LABEL_KEYS,\n MODEL_SCOPE_LABEL_KEYS,\n OFFICIAL_ORDER_GROUP_LABEL_KEYS,\n OFFICIAL_ORDER_LAYERS,\n POSITION_LABEL_KEYS,\n PROMOTION_LABEL_KEYS,\n ROLE_LABEL_KEYS,\n SLOT_KIND_LABEL_KEYS,\n SOURCE_FORM_LABEL_KEYS,\n SOURCE_FORMS,\n SOURCE_KIND_LABEL_KEYS,\n SOURCE_KINDS,\n STRATEGY_LABEL_KEYS,\n SUBJECT_LABEL_KEYS,\n fieldPolicyFor,\n layerChangePatch,\n layerContractFor,\n translateLabel,\n} from './prompt-config-policy.ts'\nimport sharedCss from '../../ui/controls.module.css'\nimport featureCss from './prompts.module.css'\n\nconst styles = { ...sharedCss, ...featureCss }\nconst inputClass = clsx(styles.configInput, styles.fieldControl)\n/** identity 结构化编辑(替代 JSON):field 下拉 + value 输入;value 留空 = 使用默认(等于配置 id)。 */\nfunction IdentityFields(props: { t: PromptToolTranslate; identity: { field: string; value: string } | undefined; disabled?: boolean; onPatch: (identity: { field: 'plugin'; value: string } | undefined) => void }): ReactNode {\n const t = props.t\n const field = props.identity?.field ?? 'plugin'\n const value = props.identity?.value ?? ''\n return (\n <>\n <OptionField t={t} className={styles.fieldSpan3} label={t('form.identity.scope.label')} hint={t('form.identity.scope.hint')}\n value={field} options={['plugin']} fallback=\"plugin\" labelKeys={IDENTITY_FIELD_LABEL_KEYS} disabled={props.disabled} onChange={() => props.onPatch({ field: 'plugin', value })} />\n <FormField className={styles.fieldSpan9} label={t('form.identity.value.label')} hint={t('form.identity.value.hint')} hintMode=\"tooltip\">\n <input className={inputClass} value={value} spellCheck={false} readOnly={props.disabled}\n onChange={(e) => props.onPatch(e.target.value.length > 0 ? { field: 'plugin', value: e.target.value } : undefined)} />\n </FormField>\n </>\n )\n}\n\n/** 单条提示词配置表单:按注入层级的能力矩阵过滤字段,只显示本层生效的参数。\n * 指令文件卡(AGENTS.md / CLAUDE.md)复用同一套分区与字段:来源固定的绑定项置灰只读,\n * 名称与顺序、位置、晋升、受众、模型范围写独立指令策略,正文写文件草稿。 */\nexport function PromptConfigForm(props: {\n t: PromptToolTranslate\n meta: EngineMeta\n config: PromptConfigDraft\n disabled?: boolean\n fieldDrafts?: Map<string, FieldDraft>\n draftScope?: string\n onPatch: (patch: Partial<PromptConfigDraft>) => void\n /** 指令文件卡:行为策略写独立策略存储(不写 preset.yml)。 */\n onPatchPolicy?: (patch: InstructionPolicyFileOverride) => void\n /**\n * 本层引擎设置的内容(由 app 层注入):参数、已装配能力的装配状态与移除、按层归属的资产编辑器。\n * 只在首次进入本层设置时求值,切换视图后保留已挂载草稿。\n */\n renderLayerSettings?: (layer: string, config: PromptConfigDraft) => ReactNode\n}): ReactNode {\n const { t, meta, config, onPatch: patchConfig, onPatchPolicy } = props\n // 指令文件卡:正文对应磁盘上的原文件;读取失败或磁盘已变时不得继续编辑覆盖。\n // 与写盘路径共用同一身份判定:origin 或 sourceKind+params.fileId 都算指令文件卡。\n const isInstructionFile = config.contentStatus !== undefined || instructionFileIdOf(config) !== undefined\n const locked = isInstructionFile\n const disabled = props.disabled === true\n const filePath = typeof config.params?.displayPath === 'string' && config.params.displayPath.length > 0\n ? config.params.displayPath\n : typeof config.params?.file === 'string' ? config.params.file : ''\n const textReadOnly = isInstructionFile\n && ((config.contentStatus !== undefined && config.contentStatus !== 'ready') || config.contentConflict === true)\n /** 普通卡写 preset 卡字段;指令文件卡的绑定由文件来源固定,只有策略字段落到独立策略。 */\n const onPatch = (patch: Partial<PromptConfigDraft>): void => {\n if (disabled) return\n if (!locked) {\n patchConfig(patch)\n return\n }\n if (typeof patch.text === 'string') {\n patchConfig({ text: patch.text })\n return\n }\n const next: InstructionPolicyFileOverride = {}\n if (typeof patch.name === 'string') next.name = patch.name\n if (typeof patch.order === 'number' && Number.isSafeInteger(patch.order) && patch.order >= 0) next.order = patch.order\n if (typeof patch.position === 'string') next.position = patch.position\n if (typeof patch.promotion === 'string') next.promotion = patch.promotion\n if (patch.audience !== undefined) next.audience = patch.audience\n if (typeof patch.modelScope === 'string') next.modelScope = patch.modelScope\n if (Object.keys(next).length > 0) onPatchPolicy?.(next)\n }\n const policy = fieldPolicyFor(meta, config.layer)\n const contract = layerContractFor(meta, config.layer)\n // 官方装配刻度(B8 W2):只有把 order 原样交给官方 `section()` / `context()` 的两层才有刻度。\n // 其余层只给说明——展示档位数值会让人以为可与官方装配位置比较。\n const layerShowsOfficialOrder = OFFICIAL_ORDER_LAYERS.some((layer) => layer === (config.layer ?? ''))\n const officialSegments = config.layer === 'system-section'\n ? meta.officialOrders?.sections\n : config.layer === 'runtime-context' ? meta.officialOrders?.contexts : undefined\n const officialOrderOptions = officialSegments === undefined || officialSegments.length === 0 ? undefined : [\n ...officialSegments.map((segment) => ({\n value: String(segment.from - 1),\n label: translateLabel(t, OFFICIAL_ORDER_GROUP_LABEL_KEYS, segment.id),\n })),\n {\n value: String(Math.max(...officialSegments.map((segment) => segment.to)) + 1),\n label: t('form.order.insertLast'),\n },\n ]\n const contentKind = contract?.content ?? 'text'\n const showContent = locked || contentKind === 'text'\n || (contentKind === 'stream' && config.params?.mode === 'replace')\n || (contentKind === 'tool-result' && ['replace', 'block'].includes(String(config.params?.postAction)))\n || (contentKind === 'subagent-result' && config.params?.action === 'inject-main')\n const contentLabel: PromptToolLocaleKey = contentKind === 'stream' ? 'form.text.stream'\n : contentKind === 'tool-result' ? 'form.text.toolResult'\n : contentKind === 'subagent-result' ? 'form.text.mainSession' : 'form.text.label'\n const showMetadata = locked || contract?.messageMetadata !== false\n const strategies = contract?.strategies ?? meta.strategies\n // 条件判定(subject / match)只在引擎字段矩阵允许的层可编辑;指令文件卡的绑定不可改,\n // 且独立指令策略不承载这两项,故整块隐藏,避免做出被 onPatch 静默丢弃的假入口。\n const conditional = !locked && (policy.subject || policy.match)\n const defaultSubject = meta.layerDefaultSubjects?.[config.layer ?? 'pre-step']\n const strategy = config.strategy ?? 'static'\n const placeholder = strategy === 'placeholder' && policy.placeholder\n const fillOptions = ['', ...meta.fills]\n return (\n <div className={clsx(styles.configForm, styles.configFormLayout)} data-config-layer={config.layer ?? 'pre-step'}>\n <section className={styles.configIdentity} aria-label={t('form.section.basic')}>\n <div className={styles.configGrid}>\n <FormField className={styles.fieldSpan4} label={t('form.id.label')} hint={t('form.id.hint')} hintMode=\"tooltip\">\n <input className={inputClass} value={config.id} spellCheck={false} readOnly={locked || disabled} onChange={(e) => onPatch({ id: e.target.value })} />\n </FormField>\n <FormField className={styles.fieldSpan4} label={t('form.name.label')} hint={t('form.name.hint')} hintMode=\"tooltip\">\n <input className={inputClass} value={config.name ?? ''} spellCheck={false} readOnly={disabled} onChange={(e) => onPatch({ name: e.target.value })} />\n </FormField>\n <OptionField t={t} className={styles.fieldSpan4} label={t('form.layer.label')} hint={t('form.layer.hint')} value={config.layer} options={meta.layers} fallback=\"pre-step\" labelKeys={LAYER_LABEL_KEYS} disabled={locked || disabled} onChange={(value) => onPatch(layerChangePatch(meta, config, value))} />\n </div>\n {locked && (\n <>\n <p className={styles.configFieldHint}>{t('form.text.fileTarget', { path: filePath })}</p>\n <p className={styles.configFieldHint}>{t('file.bindingLocked')}</p>\n <p className={styles.configFieldHint}>{t('file.policyNote')}</p>\n </>\n )}\n </section>\n\n <PromptConfigNavigation t={t} layer={config.layer ?? 'pre-step'} renderLayerSettings={props.renderLayerSettings === undefined ? undefined : () => <>\n <h4 className={styles.configSectionTitle}>{t('form.layerSettings.label', { layer: translateLabel(t, LAYER_LABEL_KEYS, config.layer ?? 'pre-step') })}</h4>\n <p className={styles.configFieldHint}>{t('form.layerSettings.hint', { layer: translateLabel(t, LAYER_LABEL_KEYS, config.layer ?? 'pre-step') })}</p>\n <div className={styles.configGrid}>{props.renderLayerSettings?.(config.layer ?? 'pre-step', config)}</div>\n </>}>\n {(conditional || policy.promotion || policy.audience || policy.modelScope) && <section className={styles.configSection} data-config-panel=\"conditions\" aria-label={t('form.navigation.conditions')}>\n <h4 className={styles.configSectionTitle}>{t('form.navigation.conditions')}</h4>\n <div className={styles.configGrid}>\n {policy.promotion && <OptionField t={t} className={styles.fieldSpan6} label={t('form.promotion.label')} hint={t('form.promotion.hint')} value={config.promotion} options={meta.promotions} fallback=\"none\" labelKeys={PROMOTION_LABEL_KEYS} disabled={disabled} onChange={(value) => onPatch({ promotion: value })} />}\n {policy.audience && <OptionField t={t} className={styles.fieldSpan6} label={t('form.audience.label')} hint={t('form.audience.hint')} value={config.audience ?? undefined} options={['', ...meta.audienceModes]} fallback=\"\" labelKeys={AUDIENCE_LABEL_KEYS} disabled={disabled} onChange={(value) => onPatch(value === '' ? { audience: null } : { audience: value })} />}\n {policy.modelScope && <OptionField t={t} className={styles.fieldSpan6} label={t('form.modelScope.label')} hint={t('form.modelScope.hint')} value={config.modelScope} options={meta.modelScopes} fallback=\"all\" labelKeys={MODEL_SCOPE_LABEL_KEYS} disabled={disabled || isManagedConfigField(config, 'modelScope')} onChange={(value) => { if (!isManagedConfigField(config, 'modelScope')) onPatch({ modelScope: value }) }} />}\n {conditional && <>\n <p className={clsx(styles.configFieldLabel, styles.fieldFull)}>{t('form.match.group')}</p>\n <OptionField t={t} className={styles.fieldSpan6} label={t('form.subject.label')} hint={t('form.subject.hint')}\n value={config.subject} options={['', ...(contract?.subjects ?? meta.subjects ?? [])]} fallback=\"\" labelKeys={SUBJECT_LABEL_KEYS} disabled={disabled}\n onChange={(value) => onPatch({ subject: value === '' ? undefined : value })} />\n {config.subject === undefined && defaultSubject !== undefined && <p className={clsx(styles.configFieldHint, styles.fieldFull)}>{t('form.subject.defaultHint', { value: translateLabel(t, SUBJECT_LABEL_KEYS, defaultSubject) })}</p>}\n <MatchFields t={t} value={config.match} disabled={disabled} onChange={(value) => onPatch({ match: value })} />\n </>}\n </div>\n </section>}\n <section className={styles.configSection} data-config-panel=\"execution\" aria-label={t('form.navigation.execution')}>\n <h4 className={styles.configSectionTitle}>{t('form.navigation.execution')}</h4>\n <div className={styles.configGrid}>\n <OptionField t={t} className={styles.fieldSpan6} label={t('form.strategy.label')} hint={t('form.strategy.hint')} value={strategy} options={strategies} fallback=\"static\" labelKeys={STRATEGY_LABEL_KEYS} disabled={locked || disabled} onChange={(value) => onPatch({ strategy: value, fill: value === 'placeholder' ? (config.fill ?? 'env-facts') : undefined })} />\n <OptionField t={t} className={styles.fieldSpan3} label={t('form.kind.label')} hint={t('form.kind.hint')} value={config.configKind} options={meta.slotKinds} fallback=\"ordered\" labelKeys={SLOT_KIND_LABEL_KEYS} disabled={locked || disabled} onChange={(value) => onPatch({ configKind: value })} />\n {policy.position && <OptionField t={t} className={styles.fieldSpan3} label={t('form.position.label')} hint={t('form.position.hint')} value={config.position} options={meta.positions} fallback=\"after-user\" labelKeys={POSITION_LABEL_KEYS} disabled={disabled} onChange={(value) => onPatch({ position: value })} />}\n {policy.merge && <OptionField t={t} className={styles.fieldSpan2} label={t('form.merge.label')} hint={t('form.merge.hint')} value={config.mergeMode} options={meta.mergeModes} fallback=\"separate\" labelKeys={MERGE_MODE_LABEL_KEYS} disabled={locked || disabled} onChange={(value) => onPatch({ mergeMode: value })} />}\n {policy.order && <NumberField t={t} className={officialOrderOptions === undefined ? styles.fieldSpan2 : styles.fieldSpan6} label={t('form.order.label')} hint={t('form.order.hint')}\n value={config.order} fallback={locked ? 30 : 0} integer min={locked ? 0 : undefined} disabled={disabled}\n quickOptions={officialOrderOptions} quickLabel={t('form.order.insert')}\n fieldDrafts={props.fieldDrafts} draftKey={`${props.draftScope}:order`} onChange={(value) => { if (typeof value === 'number') onPatch({ order: value }) }} />}\n {policy.order && !layerShowsOfficialOrder && (\n <p className={clsx(styles.configFieldHint, styles.fieldSpan9)}>{t('form.order.layerOnly')}</p>\n )}\n <FormField className={styles.fieldSpan4} label={t('form.group.label')} hint={t('form.group.hint')} hintMode=\"tooltip\"><input className={inputClass} value={config.group ?? ''} spellCheck={false} readOnly={locked || disabled} onChange={(e) => onPatch({ group: e.target.value })} /></FormField>\n <div className={clsx(styles.configToggleField, styles.fieldSpan3)}>\n <span className={styles.configFieldLabel}>{t('form.exclusive.label')}</span>\n <HintTooltip label={t('form.exclusive.hint')}>\n <span className={styles.configEnable}><Switch label={t('form.exclusive.label')} checked={config.exclusive === true} disabled={locked || disabled} onChange={(next) => onPatch({ exclusive: next })} /></span>\n </HintTooltip>\n </div>\n {policy.dedupe && <OptionField t={t} className={styles.fieldSpan4} label={t('form.dedupe.label')} hint={t('form.dedupe.hint')} value={config.dedupe} options={meta.dedupes} fallback=\"none\" labelKeys={DEDUPE_LABEL_KEYS} disabled={locked || disabled} onChange={(value) => onPatch({ dedupe: value })} />}\n </div>\n <h4 className={styles.configSectionTitle}>{t('form.section.strategy')}</h4>\n <fieldset disabled={disabled} className={clsx(styles.configGrid, styles.strategyGrid, styles.configFieldset)}>\n {placeholder && (\n <OptionField t={t} className={styles.fieldSpan3} label={t('form.fill.label')} hint={t('form.fill.hint')} value={config.fill} options={fillOptions} fallback=\"\" labelKeys={FILL_LABEL_KEYS} disabled={locked || disabled} onChange={(value) => onPatch({ fill: value || undefined })} />\n )}\n {!locked && <StrategyParamsFields t={t} strategy={strategy} layer={config.layer} contract={contract} params={config.params} id={config.id} fieldSources={config.fieldSources} enabled={config.enabled} modelScope={config.modelScope} fieldDrafts={props.fieldDrafts} draftScope={props.draftScope} onPatch={(value) => onPatch({ params: value })} />}\n </fieldset>\n </section>\n\n {(showContent || showMetadata) && <section className={styles.configSection} data-config-panel=\"content\" aria-label={t('form.section.content')}>\n <h4 className={styles.configSectionTitle}>{t('form.section.content')}</h4>\n {showContent && <>\n {locked && textReadOnly && <p className={styles.configFieldHint}>{t('form.text.fileReadOnly')}</p>}\n <FormField label={t(contentLabel)} hint={t(contentKind === 'text' ? 'form.text.hint' : 'form.text.actionHint')} hintMode=\"tooltip\">\n <textarea\n className={styles.configTextarea}\n aria-label={t('form.text.aria')}\n value={[config.text ?? '', ...(config.texts ?? [])].filter((item) => item.length > 0).join('\\n')}\n spellCheck={false}\n readOnly={disabled || (locked && textReadOnly)}\n onChange={(e) => {\n autoResizeTextarea(e)\n const next = e.target.value\n // 内容资产(prompt-injector)走生成目录文件通道(text → params.text 由写盘端接管);\n // 指令文件卡:正文始终按字符串写草稿(允许清空),焦点离开卡片时自动写回原文件。\n // 其余配置单段写 text(对齐官方 PromptSection.text 单字符串语义,texts 仅多段/旧数据兼容读取)。\n if (locked || config.id === 'prompt-injector') {\n onPatch({ text: next, texts: [] })\n } else {\n onPatch({ text: next.trim().length > 0 ? next : undefined, texts: [] })\n }\n }}\n />\n </FormField>\n {!locked && contract?.variables !== false && <VariablesEditor t={t} value={config.variables} disabled={disabled} onChange={(value) => onPatch({ variables: value })} />}\n </>}\n <h4 className={styles.configSectionTitle}>{t('form.advanced.label')}</h4>\n <div className={styles.configGrid}>\n {policy.role && <OptionField t={t} className={styles.fieldSpan3} label={t('form.role.label')} hint={t('form.role.hint')} value={config.role} options={meta.roles} fallback=\"user\" labelKeys={ROLE_LABEL_KEYS} disabled={locked || disabled} onChange={(value) => onPatch({ role: value })} />}\n {showMetadata && <OptionField t={t} className={styles.fieldSpan3} label={t('form.sourceKind.label')} hint={t('form.sourceKind.hint')} value={config.sourceKind} options={SOURCE_KINDS} fallback=\"\" keepCurrent labelKeys={SOURCE_KIND_LABEL_KEYS} disabled={locked || disabled} onChange={(value) => onPatch({ sourceKind: value || undefined })} />}\n {showMetadata && <OptionField t={t} className={styles.fieldSpan3} label={t('form.form.label')} hint={t('form.form.hint')} value={config.form} options={SOURCE_FORMS} fallback=\"notice\" keepCurrent labelKeys={SOURCE_FORM_LABEL_KEYS} disabled={locked || disabled} onChange={(value) => onPatch({ form: value || undefined })} />}\n {!locked && (\n <>\n {showMetadata && <FormField className={styles.fieldSpan3} label={t('form.summary.label')} hint={t('form.summary.hint')} hintMode=\"tooltip\">\n <input className={inputClass} value={config.summary ?? ''} spellCheck={false} readOnly={disabled} onChange={(e) => onPatch({ summary: e.target.value })} />\n </FormField>}\n {showContent && <FormField className={styles.fieldSpan6} label={t('form.templateFile.label')} hint={t('form.templateFile.hint')} hintMode=\"tooltip\">\n <input className={inputClass} value={config.templateFile ?? ''} spellCheck={false} readOnly={disabled} onChange={(e) => onPatch({ templateFile: e.target.value })} />\n </FormField>}\n {showMetadata && <IdentityFields t={t} identity={config.identity} disabled={disabled} onPatch={(value) => onPatch({ identity: value })} />}\n </>\n )}\n </div>\n </section>}\n </PromptConfigNavigation>\n </div>\n )\n}\n","import { memo, useEffect, useId, useRef, useState, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { Button, IconChevronDownOutlineRegular, Menu, Switch, type MenuEntry } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport type { EngineMeta, PromptConfigDraft } from '../../prompt-tool-types.ts'\nimport type { InstructionPolicyFileOverride } from '../../../shared/instructions.ts'\nimport type { FieldDraft } from '../../data/workspace-drafts.ts'\nimport { HintTooltip } from '../../ui/HintTooltip.tsx'\nimport { ConfirmDialog } from '../../ui/ConfirmDialog.tsx'\nimport { StatusBadge } from '../../ui/StatusBadge.tsx'\nimport { useMenuFocus } from '../../ui/menu-focus.ts'\nimport { PromptConfigForm } from './PromptConfigForm.tsx'\nimport { instructionFileIdOf } from '../../data/prompt-config-content.ts'\nimport { isManagedConfigField } from '../../../shared/managed-config-fields.ts'\nimport { AUDIENCE_LABEL_KEYS, LAYER_LABEL_KEYS, POSITION_LABEL_KEYS, STRATEGY_LABEL_KEYS, fieldPolicyFor, translateLabel } from './prompt-config-policy.ts'\nimport sharedCss from '../../ui/controls.module.css'\nimport featureCss from './prompts.module.css'\n\nconst styles = { ...sharedCss, ...featureCss }\nexport type { PromptConfigDraft, LayerFieldPolicy } from '../../prompt-tool-types.ts'\n\n/** 卡片拥有正文及其 portal 的逻辑焦点边界,真正离开时才提交指令正文。 */\nexport const PromptConfigCard = memo(function PromptConfigCard(props: {\n t: PromptToolTranslate\n meta: EngineMeta\n config: PromptConfigDraft\n expanded: boolean\n canMoveUp: boolean\n canMoveDown: boolean\n disabled?: boolean\n readOnlyReason?: string\n fieldDrafts?: Map<string, FieldDraft>\n draftScope?: string\n dragging?: boolean\n dropBefore?: boolean\n dropAfter?: boolean\n onToggleExpanded: (id: string) => void\n onToggleEnabled: (id: string, enabled: boolean) => void\n onPatch: (id: string, patch: Partial<PromptConfigDraft>) => void\n onMoveUp: (id: string) => void\n onMoveDown: (id: string) => void\n onDuplicate: (id: string) => void\n onDelete: (id: string) => void | Promise<void>\n onSaveInstructionFile?: (fileId: string) => void\n onReloadInstructionFile?: (fileId: string) => void | Promise<void>\n onPatchInstructionPolicy?: (fileId: string, override: InstructionPolicyFileOverride) => void\n onDragStart?: (id: string, event: React.DragEvent<HTMLElement>) => void\n onDragOver?: (id: string, event: React.DragEvent<HTMLElement>) => void\n onDrop?: (id: string, event: React.DragEvent<HTMLElement>) => void\n onDragEnd?: () => void\n /** 本层引擎设置内容(app 层注入):同层每张卡显示同一份值,展开才渲染。 */\n renderLayerSettings?: (layer: string, config: PromptConfigDraft) => ReactNode\n}): ReactNode {\n const { t, meta, config } = props\n const [confirmation, setConfirmation] = useState<'delete' | 'reload'>()\n const [menuOpen, setMenuOpen] = useState(false)\n const firstItemRef = useMenuFocus(menuOpen)\n useEffect(() => { setMenuOpen(false); setConfirmation(undefined) }, [props.draftScope, config.id])\n const cardRef = useRef<HTMLElement>(null)\n const actionRef = useRef<HTMLSpanElement>(null)\n const reloadRef = useRef<HTMLSpanElement>(null)\n const ownsFocus = useRef(false)\n const panelId = useId()\n const enabled = config.enabled !== false\n const name = config.name || config.id\n const instructionFileId = instructionFileIdOf(config)\n const fileNotWritable = config.contentStatus !== undefined && config.contentStatus !== 'ready'\n const focusAction = (): void => { actionRef.current?.querySelector('button')?.focus() }\n const policy = fieldPolicyFor(meta, config.layer)\n const strategy = config.strategy ?? 'static'\n const chips = [translateLabel(t, LAYER_LABEL_KEYS, config.layer ?? 'pre-step'), translateLabel(t, STRATEGY_LABEL_KEYS, strategy)]\n if (policy.position) chips.push(t('card.chip.position', { value: translateLabel(t, POSITION_LABEL_KEYS, config.position ?? 'after-user') }))\n if (config.audience && config.audience !== 'all') chips.push(t('card.chip.audience', { value: translateLabel(t, AUDIENCE_LABEL_KEYS, config.audience) }))\n const status = config.contentConflict === true ? t('card.chip.fileConflict')\n : fileNotWritable ? (config.contentStatus === 'missing' ? t('card.fileMissing') : config.contentStatus === 'too-large' ? t('card.fileTooLarge') : t('card.chip.fileUnavailable'))\n : config.contentSaving === true ? t('card.chip.fileSaving') : config.contentDirty === true ? t('card.chip.fileDirty') : undefined\n const menuItems: MenuEntry[] = [\n { id: 'up', label: t('card.moveUp'), disabled: props.disabled || !props.canMoveUp },\n { id: 'down', label: t('card.moveDown'), disabled: props.disabled || !props.canMoveDown },\n ...(instructionFileId === undefined ? [\n { id: 'duplicate', label: t('card.duplicate'), disabled: props.disabled },\n { id: 'delete', label: <span className={styles.configFieldError}>{t('card.delete')}</span>, danger: true, disabled: props.disabled },\n ] : []),\n ]\n const firstItem = menuItems.find((item) => !('type' in item) && !item.disabled)\n if (firstItem && !('type' in firstItem)) firstItem.label = <span ref={firstItemRef}>{firstItem.label}</span>\n const reload = (): void => {\n if (instructionFileId === undefined) return\n if (config.contentDirty) setConfirmation('reload')\n else void props.onReloadInstructionFile?.(instructionFileId)\n }\n // 主动请求保存当前指令文件。\n //\n // 唯一不能读的是 contentDirty:失焦时字段的 commit 刚 setState、重渲染尚未发生,\n // rAF 回调读到的还是上一帧的 false——那正是「点卡片外面不保存」的原因。是否真的\n // 有东西要写交给 store 判断(无未保存草稿的调用直接返回 true)。\n // contentSaving/contentConflict 与本次编辑无关,不会因 commit 落后一帧,保留作并发保护。\n const flushInstructionSave = (): void => {\n if (instructionFileId === undefined || props.disabled || fileNotWritable || confirmation !== undefined) return\n if (config.contentSaving === true || config.contentConflict === true) return\n props.onSaveInstructionFile?.(instructionFileId)\n }\n return <article ref={cardRef} className={clsx(styles.configCard, props.expanded && styles.configCardOpen)}\n data-config-id={config.id} data-dragging={props.dragging ? '' : undefined}\n data-drop-before={props.dropBefore ? '' : undefined} data-drop-after={props.dropAfter ? '' : undefined}\n onFocus={() => { ownsFocus.current = true }}\n onBlur={() => {\n ownsFocus.current = false\n requestAnimationFrame(() => {\n if (ownsFocus.current) return\n setMenuOpen(false)\n flushInstructionSave()\n })\n }}\n onDragOver={props.onDragOver === undefined ? undefined : (event) => props.onDragOver!(config.id, event)}\n onDrop={props.onDrop === undefined ? undefined : (event) => props.onDrop!(config.id, event)} onDragEnd={props.onDragEnd}>\n <span className={styles.visuallyHidden} role=\"status\" aria-atomic=\"true\">{status && !fileNotWritable && !config.contentConflict ? `${name}:${status}` : ''}</span>\n <header className={styles.configHeader}>\n {props.onDragStart !== undefined && <HintTooltip label={t('card.dragHint')}>\n <span className={styles.dragHandle} aria-hidden=\"true\" draggable onDragStart={(event) => props.onDragStart!(config.id, event)}>⠿</span>\n </HintTooltip>}\n <button type=\"button\" className={styles.configToggle} aria-expanded={props.expanded} aria-controls={panelId}\n onClick={() => {\n // 折叠会让编辑区卸载、焦点仍留在卡片内,失焦保存不会触发;先落盘再切换。\n if (props.expanded) flushInstructionSave()\n props.onToggleExpanded(config.id)\n }}>\n <span className={styles.configTitle}>\n <span className={styles.configTitleRow}><span className={styles.configName}>{name}</span></span>\n <span className={styles.configMeta}>{chips.join(' · ')}</span>\n </span>\n <IconChevronDownOutlineRegular className={clsx(styles.chevron, props.expanded && styles.chevronOpen)} />\n </button>\n {status && <StatusBadge tone={config.contentConflict ? 'warning' : fileNotWritable ? 'danger' : 'neutral'} label={status} />}\n <span className={styles.configHeaderActions}>\n <Switch className={styles.configEnable} checked={enabled} label={t('card.enableAria', { name })} disabled={props.disabled || isManagedConfigField(config, 'enabled') || (instructionFileId !== undefined && config.contentSaving === true)}\n onChange={(next) => {\n if (props.disabled || isManagedConfigField(config, 'enabled')) return\n if (instructionFileId !== undefined) props.onPatchInstructionPolicy?.(instructionFileId, { enabled: next })\n else props.onToggleEnabled(config.id, next)\n }} />\n <span ref={actionRef} tabIndex={-1} onKeyDown={(event) => {\n if (!menuOpen || (event.key !== 'Escape' && event.key !== 'Tab')) return\n event.stopPropagation()\n if (event.key === 'Escape') event.preventDefault()\n focusAction()\n setMenuOpen(false)\n }}>\n <Menu open={menuOpen} portal autoFocus compact align=\"end\" items={menuItems} onClose={() => setMenuOpen(false)}\n onSelect={(action) => {\n setMenuOpen(false)\n focusAction()\n if (action === 'delete') setConfirmation('delete')\n else if (action === 'up') props.onMoveUp(config.id)\n else if (action === 'down') props.onMoveDown(config.id)\n else if (action === 'duplicate') props.onDuplicate(config.id)\n }}\n anchor={<Button size=\"sm\" variant=\"ghost\" aria-label={t('card.actionsAria', { name })} aria-haspopup=\"menu\" aria-expanded={menuOpen} onClick={() => setMenuOpen(!menuOpen)}>⋯</Button>} />\n </span>\n </span>\n </header>\n {(config.contentConflict || fileNotWritable || config.contentMessage || props.readOnlyReason) && <div className={styles.configStatus}>\n {config.contentConflict && <p>{t('card.fileConflictDetail')}</p>}\n {config.contentDirty && (config.contentConflict || fileNotWritable) && <p>{t('card.chip.fileDirty')}</p>}\n {config.contentMessage && <p>{t('card.fileStatusDetail', { message: config.contentMessage })}</p>}\n {props.readOnlyReason && <p>{props.readOnlyReason}</p>}\n {instructionFileId !== undefined && (config.contentConflict || fileNotWritable) && <span ref={reloadRef} tabIndex={-1}>\n <Button size=\"sm\" variant=\"outline\" disabled={config.contentSaving} onClick={reload}>{t('card.reloadFile')}</Button>\n </span>}\n </div>}\n <div id={panelId} hidden={!props.expanded}>\n {props.expanded && <>\n <PromptConfigForm t={t} meta={meta} config={config} disabled={props.disabled} fieldDrafts={props.fieldDrafts} draftScope={`${props.draftScope}:${config.id}`}\n renderLayerSettings={props.renderLayerSettings}\n onPatch={(patch) => props.onPatch(config.id, patch)}\n {...(instructionFileId === undefined ? {} : { onPatchPolicy: (patch: InstructionPolicyFileOverride) => props.onPatchInstructionPolicy?.(instructionFileId, patch) })} />\n </>}\n </div>\n {confirmation && <ConfirmDialog title={t(confirmation === 'delete' ? 'card.deleteTitle' : 'card.reloadTitle', { name })}\n description={t(confirmation === 'delete' ? 'card.deleteDescription' : 'card.reloadDescription', { name })}\n confirmLabel={t(confirmation === 'delete' ? 'card.confirmDelete' : 'card.reloadFile')} cancelLabel={t('card.cancel')}\n failureMessage={t('card.operationFailed')} returnFocusRef={confirmation === 'delete' ? actionRef : reloadRef}\n onCancel={() => { setConfirmation(undefined); if (confirmation === 'delete') focusAction(); else reloadRef.current?.querySelector('button')?.focus() }}\n onConfirm={() => confirmation === 'delete' ? props.onDelete(config.id) : props.onReloadInstructionFile?.(instructionFileId!)} />}\n </article>\n})\n","import type { PromptConfigDraft } from '../../prompt-tool-types.ts'\n\nexport const promptConfigLayer = (config: PromptConfigDraft): string => config.layer ?? 'pre-step'\n/** 与列表一致的显示视图排序:按(层序, order, 声明序)稳定排序,返回排序后 id 序列。\n * strategy 传入时(世界书筛选视图)只在该策略子集内移动/排序,避免与不可见配置交换。 */\nexport function viewOrderedIds(\n all: PromptConfigDraft[],\n layer: string | undefined,\n layers: readonly string[],\n strategy?: string,\n visibleIds?: readonly string[],\n): string[] {\n const layerRank = (config: PromptConfigDraft): number => {\n const index = layers.indexOf(promptConfigLayer(config))\n return index < 0 ? layers.length : index\n }\n return all\n .map((config, index) => ({ config, index }))\n .filter((entry) => layer === undefined || promptConfigLayer(entry.config) === layer)\n .filter((entry) => strategy === undefined || entry.config.strategy === strategy)\n .filter((entry) => visibleIds === undefined || visibleIds.includes(entry.config.id))\n .sort((a, b) => {\n const byLayer = layerRank(a.config) - layerRank(b.config)\n if (byLayer !== 0) return byLayer\n const byOrder = (a.config.order ?? 0) - (b.config.order ?? 0)\n if (byOrder !== 0) return byOrder\n return a.index - b.index\n })\n .map((entry) => entry.config.id)\n}\n\n/**\n * 在显示视图中向上/向下移动:目标 = 当前项的显示相邻项(层序/order/声明序),\n * 交换两者的 order 与数组位置——显示顺序与引擎注入顺序(数组序)同步变化。\n * 修复:此前按数组相邻交换,跨层配置混合时数组顺序 ≠ 显示顺序,上移/下移视觉失效。\n */\nexport function moveWithinLayer(\n all: PromptConfigDraft[],\n globalIndex: number,\n delta: -1 | 1,\n layer?: string,\n layers?: readonly string[],\n strategy?: string,\n visibleIds?: readonly string[],\n): PromptConfigDraft[] {\n const source = all[globalIndex]\n if (source === undefined || (layer !== undefined && promptConfigLayer(source) !== layer)) return all\n const currentId = source.id\n const view = viewOrderedIds(all, promptConfigLayer(source), layers ?? [], strategy, visibleIds)\n const viewIndex = view.indexOf(currentId)\n const targetViewIndex = viewIndex + delta\n if (viewIndex < 0 || targetViewIndex < 0 || targetViewIndex >= view.length) return all\n const targetId = view[targetViewIndex]!\n const currentIndex = all.findIndex((config) => config.id === currentId)\n const targetIndex = all.findIndex((config) => config.id === targetId)\n if (currentIndex < 0 || targetIndex < 0) return all\n const next = [...all]\n const current = next[currentIndex]\n const targetCard = next[targetIndex]\n // 引擎按 order 升序渲染(executor pre-step / layers 同规则):层内移动必须同步\n // 交换 order,否则拖拽后实际注入顺序不变(显示与引擎脱节 = 排序混乱)。\n if (current === undefined || targetCard === undefined) return all\n next[currentIndex] = { ...targetCard, order: current.order ?? 0 }\n next[targetIndex] = { ...current, order: targetCard.order ?? 0 }\n return next\n}\n\n/** 拖拽移动到目标显示位置:把 source 移到 target 前/后,用显示视图相邻交换逐步到位\n * (order 链式交换,与连续点击上移/下移等价)。 */\nexport function moveToView(\n all: PromptConfigDraft[],\n sourceId: string,\n targetId: string,\n before: boolean,\n layer?: string,\n layers?: readonly string[],\n strategy?: string,\n visibleIds?: readonly string[],\n): PromptConfigDraft[] {\n const source = all.find((config) => config.id === sourceId)\n if (source === undefined || (layer !== undefined && promptConfigLayer(source) !== layer)) return all\n const view = viewOrderedIds(all, promptConfigLayer(source), layers ?? [], strategy, visibleIds)\n const sourceIndex = view.indexOf(sourceId)\n if (sourceIndex < 0) return all\n const rest = view.filter((id) => id !== sourceId)\n const targetIndex = rest.indexOf(targetId)\n if (targetIndex < 0) return all\n const targetViewIndex = targetIndex + (before ? 0 : 1)\n if (targetViewIndex === sourceIndex) return all\n const steps = targetViewIndex - sourceIndex\n const delta: -1 | 1 = steps > 0 ? 1 : -1\n let current = all\n for (let step = 0; step < Math.abs(steps); step++) {\n const globalIndex = current.findIndex((config) => config.id === sourceId)\n if (globalIndex < 0) break\n current = moveWithinLayer(current, globalIndex, delta, layer, layers, strategy, visibleIds)\n }\n return current\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, type ComponentProps, type ReactNode } from 'react'\nimport { scrollToCreatedCard, cssEscapeId } from '../../ui/reveal-card.ts'\nimport { bridgeCall, errorMessage } from '../../data/bridge-client.ts'\nimport { isManagedConfigField } from '../../../shared/managed-config-fields.ts'\nimport { instructionFileIdOf } from '../../data/prompt-config-content.ts'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport { MenuSelect } from '../../ui/MenuSelect.tsx'\nimport { ToggleRow } from '../../ui/ToggleRow.tsx'\nimport { PromptConfigCard } from './PromptConfigCard.tsx'\nimport { moveToView, moveWithinLayer, promptConfigLayer, viewOrderedIds } from './prompt-config-order.ts'\nimport { displayLayers, LAYER_LABEL_KEYS, matchesConfigKeyword, translateLabel } from './prompt-config-policy.ts'\nimport type { EngineMeta, PromptConfigDraft, ValidationErrorEntry } from '../../prompt-tool-types.ts'\nimport type { InstructionPolicyFileOverride, InstructionPolicySnapshot } from '../../../shared/instructions.ts'\nimport sharedCss from '../../ui/controls.module.css'\nimport featureCss from './prompts.module.css'\n\nconst styles = { ...sharedCss, ...featureCss }\n\nexport interface PromptConfigListProps {\n t: PromptToolTranslate\n meta: EngineMeta\n configs: PromptConfigDraft[]\n browse?: { filter: string; expanded?: string; feedback?: { kind: 'ok' | 'error'; message: string } }\n fieldDrafts?: ComponentProps<typeof PromptConfigCard>['fieldDrafts']\n draftScope?: string\n commonCards?: ReactNode\n notice?: string\n noticeKind?: 'ok' | 'error'\n readOnlyReason?: string\n onCreate?: () => void\n onChoosePreset?: () => void\n createdHidden?: boolean\n onShowCreated?: () => void\n /** 传入 layer 时只展示该层配置;不传展示全部配置。 */\n layer?: string\n /** 传入 scope 时按 audience 作用域过滤:main = 非仅子代理(主会话可见);subagent = 非仅主会话(子代理可见;缺省公用两边都可见)。 */\n scope?: 'main' | 'subagent'\n /** 列表工具栏追加操作(如「新建模板」)。 */\n extraActions?: ReactNode\n /** 列表头部之后、配置卡片之前渲染的固定卡片(如模板变量——归类于配置列表下)。 */\n beforeCards?: ReactNode\n /** 模块卡(引擎能力、自定义工具):视觉上排在层级配置卡之前;世界书视图不渲染。 */\n moduleCards?: ReactNode\n /** 工具栏中的非提示词配置操作(如能力创建)。 */\n toolbarActions?: ReactNode\n /** 受控层筛选(全部/世界书/层级);未传时内部 state 兜底(子代理页等独立实例)。 */\n viewFilter?: string\n onViewFilterChange?: (value: string) => void\n /** 受控搜索词:页面持有搜索词时(例如同时过滤能力卡与共享设置区)由页面下发并接收改动。 */\n keyword?: string\n onKeywordChange?: (value: string) => void\n /** 只响应明确的创建动作;后台读取已有配置不抢占筛选或展开状态。 */\n createdConfigId?: string\n /** 空状态追加提示(如「当前预设模板该层无配置」)。 */\n emptyHint?: string\n onPatchConfigs: (configs: PromptConfigDraft[]) => void\n onSaveConfigs: (configs: PromptConfigDraft[]) => Promise<boolean>\n onSaveInstructions?: () => Promise<boolean>\n instructionPolicy?: InstructionPolicySnapshot\n onToggleInstructionSource?: (enabled: boolean) => Promise<boolean>\n /** 指令文件卡:显式写盘与重新读取(不经预设保存路径)。 */\n onSaveInstructionFile?: (fileId: string) => void\n onReloadInstructionFile?: (fileId: string) => void\n /** 指令文件卡的行为策略改动(独立策略存储)。 */\n onPatchInstructionPolicy?: (fileId: string, override: InstructionPolicyFileOverride) => void\n /**\n * 本层引擎设置内容(app 层注入,逐层下发到每张实例卡):\n * 同层每张卡显示同一份值,折叠区默认折叠且展开才渲染内容。\n */\n renderLayerSettings?: (layer: string, config: PromptConfigDraft) => ReactNode\n /** 该层有可编辑设置时,在现有实例卡内提供设置区。 */\n hasLayerSettings?: (layer: string) => boolean\n matchesLayerSettings?: (layer: string, keyword: string) => boolean\n onNotice: (kind: 'ok' | 'error', message: string) => void\n}\n\n/** 共享的提示词配置列表:校验、保存、脏检测、复制、删除、层内移动。 */\nexport function PromptConfigList(props: PromptConfigListProps): ReactNode {\n const { t, meta, configs, layer, scope, extraActions, beforeCards, moduleCards, toolbarActions, viewFilter: viewFilterProp, onViewFilterChange, emptyHint, onPatchConfigs, onSaveConfigs, onSaveInstructionFile, onReloadInstructionFile, onPatchInstructionPolicy, onNotice } = props\n const [expanded, setExpanded] = useState<string | undefined>(props.browse?.expanded)\n const [errors, setErrors] = useState<ValidationErrorEntry[]>([])\n const [validating, setValidating] = useState(false)\n const [saving, setSaving] = useState(false)\n const [savingSource, setSavingSource] = useState(false)\n const [filterState, setFilterState] = useState(props.browse?.filter ?? '')\n const changeFilter = (value: string): void => {\n if (props.browse !== undefined) props.browse.filter = value\n props.onKeywordChange?.(value)\n setFilterState(value)\n }\n const [createdId, setCreatedId] = useState<string>()\n const busyRef = useRef(false)\n const [feedback, setFeedback] = useState<{ kind: 'ok' | 'error'; message: string } | undefined>(props.browse?.feedback)\n const lastNotice = useRef(props.notice)\n const report = (kind: 'ok' | 'error', message: string): void => {\n setFeedback({ kind, message })\n onNotice(kind, message)\n }\n useEffect(() => {\n if (props.notice && props.notice !== lastNotice.current) setFeedback({ kind: props.noticeKind ?? 'ok', message: props.notice })\n lastNotice.current = props.notice\n }, [props.notice, props.noticeKind])\n useEffect(() => {\n if (props.browse !== undefined) props.browse.feedback = feedback\n }, [feedback, props.browse])\n useEffect(() => {\n if (props.browse !== undefined) props.browse.expanded = expanded\n }, [expanded, props.browse])\n /** 拖拽排序状态:源卡片 id + 落点(目标 id + 前/后)。 */\n const [dragId, setDragId] = useState<string | undefined>(undefined)\n const [dropTarget, setDropTarget] = useState<{ id: string; before: boolean } | undefined>(undefined)\n /** 过滤下拉:全部 / 世界书(策略)/ 各注入层级。外部 layer prop 传入时固定该层。 */\n const [innerViewFilter, setInnerViewFilter] = useState<string>('all')\n const viewFilter = viewFilterProp ?? innerViewFilter\n const changeViewFilter = (value: string): void => {\n if (onViewFilterChange !== undefined) onViewFilterChange(value)\n else setInnerViewFilter(value)\n }\n useEffect(() => {\n const created = configs.find((config) => config.id === props.createdConfigId)\n if (created === undefined) return\n setCreatedId(created.id)\n // 只展开并定位新建的卡:不改动用户的层级筛选与搜索词。\n setExpanded(created.id)\n return scrollToCreatedCard(`[data-config-id=\"${cssEscapeId(created.id)}\"]`)\n }, [props.createdConfigId])\n\n const effectiveLayer = layer ?? (viewFilter !== 'all' && viewFilter !== 'world-book' ? viewFilter : undefined)\n const allLayers = displayLayers(meta.layerOrder, [...meta.layers, ...configs.map(promptConfigLayer)])\n const visible = effectiveLayer === undefined\n ? configs\n : configs.filter((config) => promptConfigLayer(config) === effectiveLayer)\n const scoped = scope === undefined\n ? visible\n : visible.filter((config) => {\n const mode = config.audience\n return scope === 'main' ? mode !== 'subagent' : mode !== 'main'\n })\n const byStrategy = viewFilter !== 'world-book'\n ? scoped\n : scoped.filter((config) => config.strategy === 'world-book')\n // 搜索词:受控时取页面下发值(同一搜索词同时过滤能力卡与共享设置区),否则用内部 state。\n const filter = props.keyword ?? filterState\n const keyword = filter.trim().toLowerCase()\n const configMatches = byStrategy.filter((config) => matchesConfigKeyword(config, keyword, t))\n const batchConfigs = configMatches.filter((config) => !isManagedConfigField(config, 'enabled'))\n const filtered = keyword.length === 0 ? byStrategy : byStrategy.filter((config) =>\n configMatches.includes(config) || (viewFilter !== 'world-book' && props.matchesLayerSettings?.(promptConfigLayer(config), keyword) === true))\n // 插入点分组只用于阅读;order 仅在同一插入点内比较。\n const layerRank = (config: PromptConfigDraft): number => {\n const index = allLayers.indexOf(promptConfigLayer(config))\n return index < 0 ? allLayers.length : index\n }\n const ordered = filtered\n .map((config, index) => ({ config, index }))\n .sort((a, b) => {\n const byLayer = layerRank(a.config) - layerRank(b.config)\n if (byLayer !== 0) return byLayer\n const byOrder = (a.config.order ?? 0) - (b.config.order ?? 0)\n if (byOrder !== 0) return byOrder\n return a.index - b.index\n })\n .map((entry) => entry.config)\n useEffect(() => {\n if (expanded !== undefined && !configs.some((config) => config.id === expanded)) setExpanded(undefined)\n }, [configs, expanded])\n /** 按过滤后可见配置一次性启用/禁用(批量开关)。 */\n const batchSetEnabled = (enabled: boolean): void => {\n if (props.readOnlyReason !== undefined) return\n const visibleIds = new Set(batchConfigs.map((config) => config.id))\n onPatchConfigs(configs.map((config) => visibleIds.has(config.id) ? { ...config, enabled } : config))\n }\n\n const runValidate = async (target: PromptConfigDraft[], announceSuccess = true): Promise<boolean> => {\n setValidating(true)\n try {\n const res = await bridgeCall('configsValidate', { promptConfigs: target })\n if (!res.ok) {\n report('error', t('configs.notice.validateFailed', { reason: res.message ?? 'settings bridge unavailable' }))\n return false\n }\n setErrors(res.value.valid ? [] : res.value.errors ?? [])\n if (!res.value.valid || announceSuccess) report(res.value.valid ? 'ok' : 'error', res.value.valid ? t('configs.notice.valid') : t('configs.notice.validateFailed', { reason: (res.value.errors ?? []).map((error) => error.message).join(';') }))\n return res.value.valid\n } catch (error) {\n report('error', t('configs.notice.validateFailed', { reason: errorMessage(error) }))\n return false\n } finally {\n setValidating(false)\n }\n }\n\n const save = async (): Promise<boolean> => {\n if (busyRef.current || (props.readOnlyReason !== undefined && props.onSaveInstructions === undefined)) return false\n busyRef.current = true\n setSaving(true)\n try {\n if (props.readOnlyReason !== undefined) {\n const saved = await props.onSaveInstructions!()\n report(saved ? 'ok' : 'error', t(saved ? 'configs.notice.savedSnapshot' : 'configs.notice.saveIncomplete'))\n return saved\n }\n if (!await runValidate(configs, false)) return false\n setErrors([])\n const saved = await onSaveConfigs(configs)\n if (saved) report('ok', t('configs.notice.savedSnapshot'))\n else setFeedback({ kind: 'error', message: t('configs.notice.saveIncomplete') })\n return saved\n } catch (error) {\n report('error', t('configs.notice.saveFailed', { reason: errorMessage(error) }))\n return false\n } finally {\n setSaving(false)\n busyRef.current = false\n }\n }\n\n // 显示顺序(层序/order/声明序)一次计算:position map 供每张卡判断上移/下移,\n // 此前每张卡各自调 viewOrderedIds(O(n log n) × n)。\n // 世界书筛选视图:移动/排序只作用于可见子集(strategy=world-book),\n // 避免与不可见配置交换顺序。\n const viewStrategy = viewFilter === 'world-book' ? 'world-book' : undefined\n const viewIds = useMemo(\n () => viewOrderedIds(configs, effectiveLayer, allLayers, viewStrategy, ordered.map((config) => config.id)),\n [configs, effectiveLayer, allLayers, viewStrategy, ordered],\n )\n\n /** 卡片稳定回调(memo 生效前提):经 liveRef 读最新列表状态,回调引用跨渲染不变。 */\n const liveRef = useRef({ configs, layer: effectiveLayer, metaLayers: allLayers, strategy: viewStrategy, dragId, dropTarget, viewIds, keyword, readOnly: props.readOnlyReason !== undefined })\n liveRef.current = { configs, layer: effectiveLayer, metaLayers: allLayers, strategy: viewStrategy, dragId, dropTarget, viewIds, keyword, readOnly: props.readOnlyReason !== undefined }\n const handleToggleExpanded = useCallback((id: string) => {\n setExpanded((current) => current === id ? undefined : id)\n }, [])\n const handleToggleEnabled = useCallback((id: string, enabled: boolean) => {\n const index = liveRef.current.configs.findIndex((item) => item.id === id)\n if (index >= 0) onPatchConfigs(liveRef.current.configs.map((item, at) => at === index ? { ...item, enabled } : item))\n }, [onPatchConfigs])\n const handlePatch = useCallback((id: string, patch: Partial<PromptConfigDraft>) => {\n if (patch.id !== undefined && patch.id !== id) {\n const prefix = `${props.draftScope}:${id}:`\n const previousFields = [...(props.fieldDrafts ?? [])] // Map迭代器会看到新键;改名必须使用旧条目的快照。\n for (const [key, field] of previousFields) if (key.startsWith(prefix)) {\n props.fieldDrafts?.set(`${props.draftScope}:${patch.id}:${key.slice(prefix.length)}`, field)\n props.fieldDrafts?.delete(key)\n }\n }\n const index = liveRef.current.configs.findIndex((item) => item.id === id)\n if (index >= 0) onPatchConfigs(liveRef.current.configs.map((item, at) => at === index ? { ...item, ...patch } : item))\n }, [onPatchConfigs, props.draftScope, props.fieldDrafts])\n const handleMove = useCallback((id: string, delta: -1 | 1) => {\n const { configs: current, layer: currentLayer, metaLayers, strategy, viewIds: ids, keyword: query, readOnly } = liveRef.current\n if (query || readOnly) return\n const index = current.findIndex((item) => item.id === id)\n if (index >= 0) onPatchConfigs(moveWithinLayer(current, index, delta, currentLayer, metaLayers, strategy, ids))\n }, [onPatchConfigs])\n const handleDuplicate = useCallback((id: string) => {\n const current = liveRef.current.configs\n const source = current.find((item) => item.id === id)\n if (source === undefined) return\n let nextId = `${source.id}-copy`\n let suffix = 2\n while (current.some((item) => item.id === nextId)) {\n nextId = `${source.id}-copy${suffix}`\n suffix += 1\n }\n const clone = JSON.parse(JSON.stringify(source)) as PromptConfigDraft\n clone.id = nextId\n onPatchConfigs([...current, clone])\n setExpanded(nextId)\n setCreatedId(nextId)\n onNotice('ok', t('configs.notice.copied'))\n }, [onNotice, onPatchConfigs, t])\n const handleDelete = useCallback((id: string) => {\n const current = liveRef.current.configs\n const ids = liveRef.current.viewIds\n const index = ids.indexOf(id)\n const nextId = ids[index + 1] ?? ids[index - 1]\n const prefix = `${props.draftScope}:${id}:`\n for (const key of props.fieldDrafts?.keys() ?? []) {\n if (key.startsWith(prefix)) props.fieldDrafts?.delete(key)\n }\n onPatchConfigs(current.filter((item) => item.id !== id))\n setExpanded((value) => value === id ? undefined : value)\n onNotice('ok', t('configs.notice.deleted'))\n requestAnimationFrame(() => {\n const target = nextId === undefined ? document.querySelector<HTMLElement>('[data-module-toolbar] button') : document.querySelector<HTMLElement>(`[data-config-id=\"${cssEscapeId(nextId)}\"] button[aria-expanded]`)\n target?.focus()\n })\n }, [onNotice, onPatchConfigs, props.draftScope, props.fieldDrafts, t])\n const handleDragStart = useCallback((id: string, event: React.DragEvent<HTMLElement>) => {\n setDragId(id)\n event.dataTransfer.effectAllowed = 'move'\n }, [])\n const handleDragOver = useCallback((id: string, event: React.DragEvent<HTMLElement>) => {\n event.preventDefault()\n const { dragId: currentDrag } = liveRef.current\n if (currentDrag === undefined || currentDrag === id) return\n const rect = event.currentTarget.getBoundingClientRect()\n setDropTarget({ id, before: event.clientY < rect.top + rect.height / 2 })\n }, [])\n const handleDrop = useCallback((id: string, event: React.DragEvent<HTMLElement>) => {\n event.preventDefault()\n const { configs: current, layer: currentLayer, metaLayers, strategy, dragId: source, dropTarget: target, viewIds: ids, keyword: query, readOnly } = liveRef.current\n if (query || readOnly) return\n if (source !== undefined && target !== undefined && source !== id) {\n onPatchConfigs(moveToView(current, source, target.id, target.before, currentLayer, metaLayers, strategy, ids))\n }\n setDragId(undefined)\n setDropTarget(undefined)\n }, [onPatchConfigs])\n const handleDragEnd = useCallback(() => {\n setDragId(undefined)\n setDropTarget(undefined)\n }, [])\n const handleMoveUp = useCallback((id: string) => handleMove(id, -1), [handleMove])\n const handleMoveDown = useCallback((id: string) => handleMove(id, 1), [handleMove])\n\n const renderCard = (config: PromptConfigDraft) => {\n const layerIds = ordered.filter((item) => promptConfigLayer(item) === promptConfigLayer(config)).map((item) => item.id)\n const position = layerIds.indexOf(config.id)\n const sorting = keyword.length === 0 && props.readOnlyReason === undefined\n return (\n <PromptConfigCard\n key={config.id}\n t={t}\n meta={meta}\n config={config}\n fieldDrafts={props.fieldDrafts}\n draftScope={props.draftScope}\n disabled={props.readOnlyReason !== undefined && instructionFileIdOf(config) === undefined}\n readOnlyReason={instructionFileIdOf(config) !== undefined ? undefined : props.readOnlyReason}\n expanded={expanded === config.id}\n canMoveUp={sorting && position > 0}\n canMoveDown={sorting && position >= 0 && position < layerIds.length - 1}\n dragging={dragId === config.id}\n dropBefore={dropTarget?.id === config.id && dropTarget.before}\n dropAfter={dropTarget?.id === config.id && !dropTarget.before}\n onToggleExpanded={handleToggleExpanded}\n onToggleEnabled={handleToggleEnabled}\n onPatch={handlePatch}\n onMoveUp={handleMoveUp}\n onMoveDown={handleMoveDown}\n onDuplicate={handleDuplicate}\n onDelete={handleDelete}\n onSaveInstructionFile={onSaveInstructionFile}\n onReloadInstructionFile={onReloadInstructionFile}\n onPatchInstructionPolicy={onPatchInstructionPolicy}\n onDragStart={sorting ? handleDragStart : undefined}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onDragEnd={handleDragEnd}\n renderLayerSettings={props.hasLayerSettings?.(promptConfigLayer(config)) === false ? undefined : props.renderLayerSettings}\n />\n )\n }\n\n const clearFilters = (): void => {\n changeFilter('')\n changeViewFilter('all')\n }\n const hiddenCreated = props.createdHidden === true || (createdId !== undefined && configs.some((config) => config.id === createdId) && !ordered.some((config) => config.id === createdId))\n /** 选中的是九层之一(world-book 是策略筛选,保持原有的「无匹配 + 清除筛选」提示)。 */\n const worldBookView = viewFilter === 'world-book'\n const layerView = viewFilter !== 'all' && !worldBookView\n\n return (\n <section className={styles.section} aria-labelledby=\"prompt-tool-configs-heading\">\n <div className={styles.pageActions} data-workspace-sticky>\n <div className={styles.sectionHeading}>\n <div><h3 id=\"prompt-tool-configs-heading\">{layer === undefined ? t('configs.heading.all') : t('configs.heading.layer')}</h3><p>{t('configs.meta', { total: scoped.length, enabled: scoped.filter((config) => config.enabled !== false).length })}</p></div>\n <div className={styles.sectionActions} data-module-toolbar=\"true\">\n {extraActions}\n {toolbarActions}\n <button type=\"button\" className={styles.pillButton} disabled={validating || saving} onClick={() => void runValidate(configs)}>{validating && <span className={styles.spinner} aria-hidden=\"true\" />}{validating ? t('configs.validating') : t('configs.validate')}</button>\n <button type=\"button\" className={styles.primaryPill} disabled={saving || validating || (props.readOnlyReason !== undefined && props.onSaveInstructions === undefined)} onClick={save}>{saving && <span className={styles.spinner} aria-hidden=\"true\" />}{saving ? t('configs.saving') : t('configs.save')}</button>\n </div>\n </div>\n <div className={styles.listFilterRow}>\n <input type=\"search\" className={styles.listFilter} value={filter}\n aria-label={t('configs.filter.aria')} placeholder={t('configs.filter.placeholder')}\n spellCheck={false} onChange={(event) => changeFilter(event.target.value)} />\n {layer === undefined && <MenuSelect className={styles.listFilter} value={viewFilter} ariaLabel={t('configs.view.aria')}\n options={[\n { value: 'all', label: t('configs.view.all') },\n { value: 'world-book', label: t('configs.view.worldBook'), group: t('configs.view.strategy') },\n ...allLayers.map((item) => ({ value: item, label: t('configs.view.layer', { layer: translateLabel(t, LAYER_LABEL_KEYS, item) }), group: t('configs.view.insertion') })),\n ]} onChange={changeViewFilter} />}\n <span className={styles.batchControls}>\n <button type=\"button\" className={styles.pillButton} disabled={batchConfigs.length === 0 || props.readOnlyReason !== undefined}\n onClick={() => batchSetEnabled(true)}>{t('configs.batch.enableVisible', { count: batchConfigs.length })}</button>\n <button type=\"button\" className={styles.pillButton} disabled={batchConfigs.length === 0 || props.readOnlyReason !== undefined}\n onClick={() => batchSetEnabled(false)}>{t('configs.batch.disableVisible', { count: batchConfigs.length })}</button>\n </span>\n </div>\n <p className={styles.actionHint}>{t('configs.saveScope')}</p>\n {props.readOnlyReason !== undefined && <p className={styles.actionHint}>{props.readOnlyReason} <button type=\"button\" className={styles.pillButton} onClick={props.onChoosePreset}>{t('configs.chooseEditable')}</button></p>}\n {keyword.length > 0 && <p className={styles.actionHint}>{t('configs.searchSorting')}</p>}\n {feedback !== undefined && <p className={feedback.kind === 'error' ? styles.noticeError : styles.actionFeedback} role=\"status\">{feedback.message}</p>}\n {hiddenCreated && <p className={styles.actionHint}>{t('configs.createdHidden')} <button type=\"button\" className={styles.pillButton} onClick={() => {\n clearFilters()\n props.onShowCreated?.()\n if (createdId !== undefined) scrollToCreatedCard(`[data-config-id=\"${cssEscapeId(createdId)}\"]`)\n }}>{t('configs.showAll')}</button></p>}\n {errors.length > 0 && <div className={styles.configErrorBox}>\n {errors.map((error, index) => <div key={`${error.index}-${index}`} className={styles.configErrorLine}>[{error.index}] {error.id || t('configs.error.missingId')}:{error.message}</div>)}\n </div>}\n </div>\n\n {props.commonCards}\n {props.instructionPolicy !== undefined && props.onToggleInstructionSource !== undefined && (\n <ToggleRow\n id=\"prompt-tool-instruction-source\"\n label={t('instructions.source.label')}\n checked={props.instructionPolicy.policy.enabled}\n disabled={savingSource || props.instructionPolicy.error !== undefined}\n hint={[\n props.instructionPolicy.error !== undefined\n ? t('instructions.source.unavailable', { reason: props.instructionPolicy.error })\n : t(props.instructionPolicy.policy.enabled ? 'instructions.source.enabled' : 'instructions.source.disabled'),\n ...(configs.some((config) => config.contentOwnerConflict === true) ? [t('instructions.source.ownerConflict')] : []),\n ].join(';')}\n onChange={async (enabled) => {\n if (savingSource || props.instructionPolicy?.error !== undefined) return false\n setSavingSource(true)\n try {\n return await props.onToggleInstructionSource!(enabled)\n } catch (error) {\n onNotice('error', t('configs.notice.saveFailed', { reason: errorMessage(error) }))\n return false\n } finally {\n setSavingSource(false)\n }\n }}\n />\n )}\n {/* 配置列表下的置顶固定卡片(人设、模板变量等单例配置,不参与层过滤与搜索)。 */}\n {beforeCards}\n\n {/* 模块卡(引擎能力、自定义工具):与层级配置卡同款列表间距(configList),\n 这里只定义展示分组,不建立插入点间运行顺序。 */}\n {moduleCards !== undefined && <div className={styles.configList} hidden={viewFilter === 'world-book'}>{moduleCards}</div>}\n\n {ordered.length === 0 ? (keyword.length > 0 || worldBookView) ? (\n <p className={styles.readOnly}>{t('configs.noMatch', { keyword: filter.trim() || translateLabel(t, LAYER_LABEL_KEYS, viewFilter) })} <button type=\"button\" className={styles.pillButton} onClick={clearFilters}>{t('configs.clearFilters')}</button></p>\n ) : layerView ? (\n // 没有真实实例就显示空状态与新增入口,不根据引擎设置自动补卡。\n <div className={styles.emptyState}><span className={styles.emptyGlyph} aria-hidden=\"true\">⌁</span><div>\n <h3>{t('configs.empty.layer.title', { layer: translateLabel(t, LAYER_LABEL_KEYS, viewFilter) })}</h3>\n <p>{t('configs.empty.layer.desc')}</p>\n {emptyHint !== undefined && <p className={styles.readOnly}>{emptyHint}</p>}\n {props.readOnlyReason === undefined && props.onCreate !== undefined && <button type=\"button\" className={styles.pillButton} onClick={props.onCreate}>{t('configs.createFirst')}</button>}\n {props.readOnlyReason !== undefined && props.onChoosePreset !== undefined && <button type=\"button\" className={styles.pillButton} onClick={props.onChoosePreset}>{t('configs.chooseEditable')}</button>}\n </div></div>\n ) : (\n <div className={styles.emptyState}><span className={styles.emptyGlyph} aria-hidden=\"true\">⌁</span><div>\n <h3>{scope === 'subagent' ? t('configs.empty.subagent.title') : t('configs.empty.all.title')}</h3>\n <p>{scope === 'subagent' ? t('configs.empty.subagent.desc') : t('configs.empty.all.desc')}</p>\n {emptyHint !== undefined && <p className={styles.readOnly}>{emptyHint}</p>}\n {props.readOnlyReason === undefined && props.onCreate !== undefined && <button type=\"button\" className={styles.pillButton} onClick={props.onCreate}>{t('configs.createFirst')}</button>}\n {props.readOnlyReason !== undefined && props.onChoosePreset !== undefined && <button type=\"button\" className={styles.pillButton} onClick={props.onChoosePreset}>{t('configs.chooseEditable')}</button>}\n </div></div>\n ) : <div className={styles.configList}>\n {ordered.map((config) => renderCard(config))}\n </div>}\n\n </section>\n )\n}\n","import { useId, useRef, useState, type FocusEvent, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { IconChevronDownOutlineRegular, Switch } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport { PromptConfigList, type PromptConfigListProps } from './PromptConfigList.tsx'\nimport { HintTooltip } from '../../ui/HintTooltip.tsx'\nimport { ConfirmDialog } from '../../ui/ConfirmDialog.tsx'\nimport { VariablesEditor } from './PromptConfigFields.tsx'\nimport sharedCss from '../../ui/controls.module.css'\nimport featureCss from './prompts.module.css'\n\nconst styles = { ...sharedCss, ...featureCss }\n\nimport type { EngineMeta, PromptConfigDraft } from '../../prompt-tool-types.ts'\nimport type { InstructionPolicyFileOverride, InstructionPolicySnapshot } from '../../../shared/instructions.ts'\n\nexport type { PromptConfigDraft, LayerFieldPolicy } from '../../prompt-tool-types.ts'\nexport type { ValidationErrorEntry } from '../../prompt-tool-types.ts'\nexport { JsonField } from './PromptConfigFields.tsx'\nexport { PromptConfigCard } from './PromptConfigCard.tsx'\nexport { PromptConfigForm } from './PromptConfigForm.tsx'\nexport { SOURCE_FORMS, SOURCE_KINDS, fieldPolicyFor } from './prompt-config-policy.ts'\n\nexport type { PromptConfigTemplateEntry } from '../../prompt-tool-types.ts'\n\nexport interface PromptConfigsEditorProps extends Pick<PromptConfigListProps, 'browse' | 'fieldDrafts' | 'draftScope' | 'notice' | 'noticeKind' | 'readOnlyReason' | 'onChoosePreset' | 'onCreate' | 'createdHidden' | 'onShowCreated'> {\n t: PromptToolTranslate\n meta: EngineMeta\n configs: PromptConfigDraft[]\n onPatchConfigs: (configs: PromptConfigDraft[]) => void\n onSaveConfigs: (configs: PromptConfigDraft[]) => Promise<boolean>\n onSaveInstructions?: () => Promise<boolean>\n instructionPolicy?: InstructionPolicySnapshot\n onToggleInstructionSource?: (enabled: boolean) => Promise<boolean>\n /** 指令文件卡:显式写盘 / 重新读取(不经预设保存路径)。 */\n onSaveInstructionFile?: (fileId: string) => void\n onReloadInstructionFile?: (fileId: string) => void\n /** 指令文件卡的行为策略改动(独立策略存储)。 */\n onPatchInstructionPolicy?: (fileId: string, override: InstructionPolicyFileOverride) => void\n onNotice: (kind: 'ok' | 'error', message: string) => void\n viewFilter: string\n onViewFilterChange: (value: string) => void\n /** 统一搜索词(页面持有):同一搜索词过滤配置实例、能力卡、共享设置区与单例卡。 */\n keyword?: string\n onKeywordChange?: (value: string) => void\n /** 本层引擎设置内容(页面注入):同层每张实例卡显示同一份值,展开才渲染。 */\n renderLayerSettings?: (layer: string, config: PromptConfigDraft) => ReactNode\n /** 该层是否有可编辑设置:决定真实实例卡内是否显示设置区。 */\n hasLayerSettings?: (layer: string) => boolean\n matchesLayerSettings?: (layer: string, keyword: string) => boolean\n createdConfigId?: string\n /** 公共配置:模型、模板变量以外的预设级默认值等,不属于任何插入点。 */\n commonCards?: ReactNode\n /** 模块列表置顶卡片:脱离「公共配置」分组的单例配置(人设),不参与层过滤。 */\n beforeCards?: ReactNode\n /** 模块卡(引擎能力、自定义工具):视觉上排在层级配置卡之前。 */\n moduleCards?: ReactNode\n /** 模块列表工具栏中的合并创建菜单。 */\n toolbarActions?: ReactNode\n}\n\n/** 预设级模板变量模块卡片(归类于配置列表下):{{key}} 插值源,非 promptConfig——\n * 不进配置保存路径,保存走 /preset-variables 写 preset.yml 顶层 variables 段。\n * 可折叠(chevron)/ 可删除(清空全部变量,两段式确认)/ 可新建(VariablesEditor 添加变量)。 */\n/** 模板变量卡(模块列表置顶单例);子代理页的「添加模板变量」入口复用同一实现。 */\nexport function TemplateVariablesModuleCard(props: {\n t: PromptToolTranslate\n templateVariables: Record<string, string>\n setTemplateVariables: (value: Record<string, string>) => void\n templateVariablesEnabled: boolean\n setTemplateVariablesEnabled: (value: boolean) => void\n saveTemplateVariables: (next?: Record<string, string>, enabled?: boolean) => Promise<boolean | void>\n expanded: boolean\n disabled?: boolean\n onToggleExpanded: () => void\n}): ReactNode {\n const t = props.t\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const cardRef = useRef<HTMLElement>(null)\n const deleteRef = useRef<HTMLButtonElement>(null)\n const panelId = useId()\n const count = Object.keys(props.templateVariables).length\n const enabled = props.templateVariablesEnabled\n const addRef = useRef<HTMLButtonElement>(null)\n // 空态也保留本层创建入口,不依赖已退场的顶部变量菜单。\n const clearAll = async (): Promise<void> => {\n if (props.disabled) return\n if (await props.saveTemplateVariables({}) === false) throw new Error(t('variables.deleteFailed'))\n props.setTemplateVariables({})\n setConfirmingDelete(false)\n if (props.expanded) props.onToggleExpanded()\n requestAnimationFrame(() => addRef.current?.focus())\n }\n /** 失焦自动保存:焦点离开卡片容器(含收起/切换开关/点击删除)即持久化。 */\n const autoSaveOnBlur = (event: FocusEvent<HTMLElement>): void => {\n if (confirmingDelete || props.disabled) return\n const next = event.relatedTarget\n if (next === null || !cardRef.current?.contains(next as Node)) {\n void props.saveTemplateVariables()\n }\n }\n return (\n <article ref={cardRef} className={styles.configCard} onBlur={autoSaveOnBlur}>\n <header className={styles.configHeader}>\n <button type=\"button\" className={styles.configToggle} aria-expanded={props.expanded} aria-controls={props.expanded ? panelId : undefined} onClick={props.onToggleExpanded}>\n <span className={styles.configTitle}>\n <span className={styles.configName}>{t('variables.title')}</span>\n <span className={styles.configMeta}>{t('variables.cardMeta', { count })}</span>\n </span>\n <IconChevronDownOutlineRegular className={clsx(styles.chevron, props.expanded && styles.chevronOpen)} />\n </button>\n <span className={styles.configHeaderActions}>\n <HintTooltip label={enabled ? t('variables.toggleDisable') : t('variables.toggleEnable')}>\n <Switch label={t('variables.enableAria')} checked={enabled} disabled={props.disabled} onChange={(value) => {\n if (props.disabled) return\n props.setTemplateVariablesEnabled(value)\n void props.saveTemplateVariables(undefined, value)\n }} />\n </HintTooltip>\n <span className={styles.configActions}>\n {count === 0 && <button ref={addRef} type=\"button\" disabled={props.disabled} className={styles.pillButton} onClick={() => {\n if (props.disabled) return\n props.setTemplateVariables({ '': '' })\n if (!props.expanded) props.onToggleExpanded()\n requestAnimationFrame(() => cardRef.current?.querySelector<HTMLInputElement>('input')?.focus())\n }}>{t('variables.add')}</button>}\n {count > 0 && <button ref={deleteRef} type=\"button\" disabled={props.disabled} className={styles.pillButton} data-danger onClick={() => setConfirmingDelete(true)}>{t('variables.delete')}</button>}\n </span>\n </span>\n </header>\n {props.expanded && (\n <div id={panelId} className={styles.configForm}>\n {!enabled && <p className={styles.configFieldHint}>{t('variables.disabledHint')}</p>}\n {count === 0 ? <p className={styles.configFieldHint}>{t('variables.empty')}</p> : <VariablesEditor t={t} value={props.templateVariables} disabled={props.disabled} onChange={(next) => { if (!props.disabled) props.setTemplateVariables(next ?? {}) }} />}\n </div>\n )}\n {confirmingDelete && <ConfirmDialog title={t('variables.deleteTitle')} description={t('variables.deleteDescription')}\n confirmLabel={t('variables.confirmClear')} cancelLabel={t('variables.cancel')} failureMessage={t('variables.deleteFailed')}\n returnFocusRef={deleteRef} onConfirm={clearAll} onCancel={() => setConfirmingDelete(false)} />}\n </article>\n )\n}\n\n\n/** 提示词配置编辑器:配置列表(策略过滤已并入列表)+ 公共配置卡 + 保存前权威校验。 */\nexport function PromptConfigsEditor(props: PromptConfigsEditorProps): ReactNode {\n const t = props.t\n return (\n <section className={styles.page} aria-label={t('configs.editor.aria')} data-module-list=\"true\">\n <PromptConfigList\n t={t}\n scope=\"main\"\n browse={props.browse}\n fieldDrafts={props.fieldDrafts}\n draftScope={props.draftScope}\n notice={props.notice}\n noticeKind={props.noticeKind}\n readOnlyReason={props.readOnlyReason}\n onChoosePreset={props.onChoosePreset}\n onCreate={props.onCreate}\n createdHidden={props.createdHidden}\n onShowCreated={props.onShowCreated}\n commonCards={props.commonCards === undefined ? undefined : <div className={styles.commonCards} aria-label={t('configs.common.aria')} data-module-category=\"common\">\n {props.commonCards}\n </div>}\n meta={props.meta}\n configs={props.configs}\n viewFilter={props.viewFilter}\n onViewFilterChange={props.onViewFilterChange}\n keyword={props.keyword}\n onKeywordChange={props.onKeywordChange}\n renderLayerSettings={props.renderLayerSettings}\n hasLayerSettings={props.hasLayerSettings}\n matchesLayerSettings={props.matchesLayerSettings}\n createdConfigId={props.createdConfigId}\n toolbarActions={props.toolbarActions}\n beforeCards={props.beforeCards}\n moduleCards={props.moduleCards}\n onPatchConfigs={props.onPatchConfigs}\n onSaveConfigs={props.onSaveConfigs}\n onSaveInstructions={props.onSaveInstructions}\n instructionPolicy={props.instructionPolicy}\n onToggleInstructionSource={props.onToggleInstructionSource}\n onSaveInstructionFile={props.onSaveInstructionFile}\n onReloadInstructionFile={props.onReloadInstructionFile}\n onPatchInstructionPolicy={props.onPatchInstructionPolicy}\n onNotice={props.onNotice}\n />\n\n <p className={styles.settingsNote}>{t('configs.note.preset')}</p>\n <p className={styles.settingsNote}>{t('configs.note.variables')}</p>\n </section>\n )\n}\n","/** 模板库加载与插入:两页共用,顶部注入模板与层内工具按钮分别提供真实锚点。 */\nimport { useRef, useState, type RefObject } from 'react'\nimport { bridgeCall, errorMessage } from '../../data/bridge-client.ts'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport type { PromptConfigDraft, PromptConfigTemplateEntry } from '../../prompt-tool-types.ts'\n\n/** 自定义工具模板条目:与提示词模板同一次 /templates 返回。 */\nexport type ToolTemplateEntry = { file: string; spec: Record<string, unknown> }\n\n/** 列表作用域:决定新建配置的消息受众代入方向(过滤状态一律不动)。 */\nexport type TemplatePickerScope = 'main' | 'subagent'\n\n/**\n * 由模板条目派生一条新配置草稿(纯函数:不改动任何过滤/展开状态)。\n *\n * 规则:\n * 1. id 与模板重复时追加 `-2`、`-3`… 后缀,且同名 identity 跟随新 id;\n * 2. 受众按列表作用域代入——子代理列表 → 仅子代理;主会话列表 → 清除模板自带的\n * 「仅子代理」限制(缺省 = 公用,两侧都可见),从而\"新建即可见\"。\n *\n * @param entry - 模板条目(来自 `/templates`)。\n * @param configs - 当前列表已有配置,用于 id 去重。\n * @param scope - 列表作用域;不传则不改动模板自带受众。\n * @returns 可直接追加进列表的新配置草稿。\n */\nexport function createConfigFromTemplate(\n entry: PromptConfigTemplateEntry,\n configs: readonly PromptConfigDraft[],\n scope?: TemplatePickerScope,\n): PromptConfigDraft {\n const clone = JSON.parse(JSON.stringify(entry.spec)) as PromptConfigDraft\n let suffix = 2\n while (configs.some((config) => config.id === clone.id)) clone.id = `${entry.spec.id}-${suffix++}`\n if (clone.identity?.value === entry.spec.id) clone.identity = { ...clone.identity, value: clone.id }\n if (scope === 'subagent') clone.audience = 'subagent'\n else if (scope === 'main' && clone.audience === 'subagent') clone.audience = null\n return clone\n}\n\nexport function useTemplatePicker(\n configs: PromptConfigDraft[],\n onPickConfig: (config: PromptConfigDraft) => void,\n onNotice: (kind: 'ok' | 'error', message: string) => void,\n t: PromptToolTranslate,\n /** 传入列表作用域时,新建配置代入该受众,保证\"新建即可见\";不传 = 不改动模板受众。 */\n scope?: TemplatePickerScope,\n): {\n anchorRef: RefObject<HTMLButtonElement>\n popoverAnchorRef: RefObject<HTMLButtonElement>\n templates: PromptConfigTemplateEntry[]\n toolTemplates: ToolTemplateEntry[]\n open: boolean\n /** 当前浮层的插入点层级过滤;undefined 表示按层分组展示全部模板。 */\n layer: string | undefined\n /** 只展示工具模板(菜单「添加工具模板」入口)。 */\n toolsOnly: boolean\n createdConfigId: string | undefined\n /** 打开模板浮层;传入插入点层级时只列该层模板(无分组标题)。 */\n openPicker: (layer?: string) => void\n /** 打开只含工具模板的浮层。 */\n openTools: (anchor: HTMLButtonElement) => void\n closePicker: () => void\n pickTemplate: (entry: PromptConfigTemplateEntry) => void\n} {\n const anchorRef = useRef<HTMLButtonElement>(null)\n const popoverAnchorRef = useRef<HTMLButtonElement | null>(null)\n const [templates, setTemplates] = useState<PromptConfigTemplateEntry[]>([])\n const [toolTemplates, setToolTemplates] = useState<ToolTemplateEntry[]>([])\n const [open, setOpen] = useState(false)\n const [layer, setLayer] = useState<string | undefined>(undefined)\n const [toolsOnly, setToolsOnly] = useState(false)\n const [createdConfigId, setCreatedConfigId] = useState<string>()\n\n const loadTemplates = async (): Promise<void> => {\n if (templates.length > 0) return\n try {\n const res = await bridgeCall('templates')\n if (!res.ok) {\n onNotice('error', t('templates.loadFailed', { reason: res.message ?? 'settings bridge unavailable' }))\n return\n }\n if (!Array.isArray(res.value.templates)) {\n onNotice('error', t('templates.emptyList'))\n return\n }\n setTemplates(res.value.templates as PromptConfigTemplateEntry[])\n setToolTemplates((res.value.toolTemplates ?? []) as ToolTemplateEntry[])\n } catch (error) {\n onNotice('error', t('templates.loadFailed', { reason: errorMessage(error) }))\n }\n }\n\n const openPicker = (target?: string): void => {\n popoverAnchorRef.current = anchorRef.current\n setLayer(target)\n setToolsOnly(false)\n setOpen(true)\n void loadTemplates()\n }\n\n const openTools = (anchor: HTMLButtonElement): void => {\n popoverAnchorRef.current = anchor\n anchor.focus()\n setLayer(undefined)\n setToolsOnly(true)\n setOpen(true)\n void loadTemplates()\n }\n\n const closePicker = (): void => setOpen(false)\n\n const pickTemplate = (entry: PromptConfigTemplateEntry): void => {\n // 纯函数派生草稿(id 去重 + 策略降级 + 受众代入);本 hook 只负责通知与展开信号。\n const clone = createConfigFromTemplate(entry, configs, scope)\n onPickConfig(clone)\n setCreatedConfigId(clone.id)\n onNotice('ok', t('templates.inserted', { file: entry.file, id: clone.id }))\n setOpen(false)\n }\n\n return { anchorRef, popoverAnchorRef, templates, toolTemplates, open, layer, toolsOnly, createdConfigId, openPicker, openTools, closePicker, pickTemplate }\n}\n","import { useEffect, useId, useRef, useState, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { IconChevronDownOutlineRegular, IconTrashOutlineRegular, Switch } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { HintTooltip } from './HintTooltip.tsx'\nimport { ConfirmDialog } from './ConfirmDialog.tsx'\nimport styles from './controls.module.css'\n/** 引擎模块可折叠卡片:与模块列表(PromptConfigList)同款形态——\n * configCard + configToggle + chevron,点击展开 configForm 编辑组合行 config\n * (经 params 参数桥扁平键落 preset.yml)。归类于配置列表下(beforeCards)。\n * layer:卡片主归属的官方注入层(九层之一,归属来自 ENGINE_CAPABILITIES /\n * ENGINE_EDITOR_GROUPS 共享契约),由统一模块列表按插入点组织展示;不参与运行时 hook 排序。 */\nexport function EngineModuleCard(props: {\n name: string\n meta: string\n layer?: string\n children?: ReactNode\n onDelete?: () => void | Promise<void>\n deleteLabels?: { title: string; description: string; confirm: string; cancel: string; failure: string }\n readOnlyReason?: string\n expanded?: boolean\n defaultExpanded?: boolean\n onExpandedChange?: (expanded: boolean) => void\n /** 创建或选择另一个行为时展开;不因普通字段编辑反复展开。 */\n revealKey?: string\n /** 稳定定位锚点(能力 id):创建后滚动定位用,与展开状态无关。 */\n anchorId?: string\n /** 纯开关卡:开关直接渲染在 header 顶层(右侧),卡片不展开、不折叠。 */\n topSwitch?: {\n id: string\n label: string\n hint: string\n checked: boolean\n disabled?: boolean\n onToggle: () => void\n }\n}): ReactNode {\n const [localExpanded, setLocalExpanded] = useState(props.defaultExpanded ?? props.revealKey !== undefined)\n const expanded = props.expanded ?? localExpanded\n const setExpanded = (next: boolean): void => { setLocalExpanded(next); props.onExpandedChange?.(next) }\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const deleteRef = useRef<HTMLButtonElement>(null)\n const panelId = useId()\n useEffect(() => {\n if (props.revealKey !== undefined) setExpanded(true)\n setConfirmingDelete(false)\n }, [props.revealKey])\n const compact = props.topSwitch !== undefined\n const title = <span className={styles.configTitle}>\n <span className={styles.configTitleRow}>\n <span className={styles.configName}>{props.name}</span>\n {props.layer !== undefined && <span className={styles.configChip}>{props.layer}</span>}\n </span>\n <span className={styles.configMeta}>{props.meta}</span>\n </span>\n return (\n <article className={clsx(styles.configCard, styles.moduleCard, !compact && expanded && styles.configCardOpen)} data-module-card=\"true\" data-module-card-id={props.anchorId}>\n <header className={styles.configHeader}>\n {compact ? <span className={styles.configToggle} data-static>{title}</span> :\n <button type=\"button\" className={styles.configToggle} aria-expanded={expanded} aria-controls={panelId} onClick={() => setExpanded(!expanded)}>\n {title}<IconChevronDownOutlineRegular className={clsx(styles.chevron, expanded && styles.chevronOpen)} />\n </button>}\n {(props.topSwitch !== undefined || props.onDelete !== undefined) && (\n <span className={styles.configHeaderActions}>\n {props.topSwitch !== undefined && <HintTooltip label={props.topSwitch.hint}>\n <span className={styles.configEnable}>\n <Switch\n checked={props.topSwitch.checked}\n disabled={props.topSwitch.disabled}\n label={props.topSwitch.label}\n onChange={props.topSwitch.onToggle}\n />\n </span>\n </HintTooltip>}\n {props.onDelete !== undefined && (\n <HintTooltip label={props.deleteLabels?.title ?? `删除 ${props.name}`}>\n <button ref={deleteRef} type=\"button\" className={styles.pillButton} data-danger aria-label={props.deleteLabels?.title ?? `删除引擎能力 ${props.name}`}\n onClick={() => setConfirmingDelete(true)}><IconTrashOutlineRegular /></button>\n </HintTooltip>\n )}\n </span>\n )}\n </header>\n {props.readOnlyReason && <p className={styles.configFieldHint}>{props.readOnlyReason}</p>}\n {!compact && <div id={panelId} hidden={!expanded} className={styles.configForm}>{expanded && props.children}</div>}\n {confirmingDelete && props.onDelete && <ConfirmDialog\n title={props.deleteLabels?.title ?? `删除 ${props.name}`} description={props.deleteLabels?.description ?? `从当前预设移除“${props.name}”能力。`}\n confirmLabel={props.deleteLabels?.confirm ?? '确认删除'} cancelLabel={props.deleteLabels?.cancel ?? '取消'}\n failureMessage={props.deleteLabels?.failure} returnFocusRef={deleteRef} onConfirm={props.onDelete} onCancel={() => setConfirmingDelete(false)} />}\n </article>\n )\n}\n","import { useSyncExternalStore, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { Switch } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { ENGINE_PARAM_DEFINITIONS, ENGINE_PARAM_KEYS, type EngineParamKey } from '../../../shared/engine-params.ts'\nimport { engineGroupParamKeys } from '../../../shared/engine-capabilities.ts'\nimport type { PromptToolStore } from '../../data/use-prompt-tool-store.ts'\nimport type { FieldDraft } from '../../data/workspace-drafts.ts'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport { MenuSelect } from '../../ui/MenuSelect.tsx'\nimport { TagInput } from '../../ui/TagInput.tsx'\nimport { HintTooltip } from '../../ui/HintTooltip.tsx'\nimport styles from '../../ui/controls.module.css'\n\n/** 未提供草稿通道的 store(单测桩)退化订阅:不广播,字段仍按当前草稿读一次。 */\nconst subscribeNothing = (): (() => void) => () => {}\nconst getZero = (): number => 0\n\n/**\n * 编辑组 / 能力卡的搜索文本:能力 id(技术键)+ 该组参数键 + 参数中文标签。\n * 参数键来自 shared 派生(`engineGroupParamKeys`),中文标签来自 `param.<键>` 字典;\n * 与配置实例的搜索共用「中文名 + 技术键」口径,都只影响展示过滤,不改变写通道。\n */\nexport function editorGroupSearchText(id: string, t: PromptToolTranslate): string {\n const keys = engineGroupParamKeys(id)\n return [id, ...keys.flatMap((key) => [key, t(`param.${key}`)])].join(' ')\n}\n\n/** 该编辑组是否命中搜索词(没有登记扁平参数的能力按能力 id 匹配)。 */\nexport function matchesEditorGroup(id: string, keyword: string, t: PromptToolTranslate): boolean {\n return keyword.length === 0 || editorGroupSearchText(id, t).toLowerCase().includes(keyword)\n}\n\n/**\n * 简单字段由共享定义驱动;阶段继续使用结构化编辑,不暴露任意 JSON 配置。\n *\n * 显示标签不进 shared:shared 只给参数键,UI 按 `param.<键>` 查 prompt-tool 字典\n * (键类型由 ENGINE_PARAM_KEY 的模板字面量约束,新增参数缺词条即编译失败)。\n */\nexport function EngineParamFields({ store, card, t, instanceId }: { store: PromptToolStore; card: string; t: PromptToolTranslate; instanceId?: string }): ReactNode {\n const keys = ENGINE_PARAM_KEYS.filter((key) => ENGINE_PARAM_DEFINITIONS[key].card === card)\n const primary = keys.find((key) => ENGINE_PARAM_DEFINITIONS[key].module?.key === 'enabled')\n const subagents = keys.find((key) => ENGINE_PARAM_DEFINITIONS[key].module?.key === 'includeSubagents')\n const paired = primary !== undefined && subagents !== undefined ? [primary, subagents] : []\n const renderField = (key: EngineParamKey): ReactNode => (\n <EngineParamField key={`${store.fields.presetTemplate}:${key}`} store={store} param={key} t={t} instanceId={instanceId} />\n )\n return <>\n {paired.length > 0 && <fieldset data-param-pair={primary} aria-label={t(`param.${primary!}`)}>{paired.map(renderField)}</fieldset>}\n {keys.filter((key) => !paired.includes(key)).map(renderField)}\n </>\n}\n\n/**\n * 同一个引擎参数可以在多个位置渲染(层卡内的能力卡 + 工具管线的共享设置区,含跨层相关设置):\n * 它们绑定同一 `store.fields[param]` 与同一草稿键,天然同源,不需要同步服务;\n * `instanceId` 只用来给每个渲染点一份独立的 DOM id / aria 关联,避免镜像控件\n * 出现重复 id 与标签错配。\n *\n * 未完成的数字输入与字段错误也属于这份共享草稿:渲染点订阅同一草稿修订号后一起重渲染,\n * 因此一个渲染点里的半成品输入或错误提示会立即出现在其他渲染点,且不各留一份本地 state。\n */\nexport function EngineParamField({ store, param, t, instanceId }: { store: PromptToolStore; param: EngineParamKey; t: PromptToolTranslate; instanceId?: string }): ReactNode {\n const definition = ENGINE_PARAM_DEFINITIONS[param]\n const value = store.fields[param]\n const disabled = !store.fields.writePreset || store.moduleFacts?.editable !== true\n const draftKey = `${store.fields.presetTemplate}:param:${param}`\n const getDraftRevision = store.getDraftRevision ?? getZero\n useSyncExternalStore(store.subscribeDrafts ?? subscribeNothing, getDraftRevision, getDraftRevision)\n const draft = store.editorDrafts?.fields.get(draftKey)\n const draftText = draft?.text\n const error = draft !== undefined && draft.error.length > 0 ? draft.error : undefined\n const writeDraft = (next: FieldDraft | undefined): void => {\n if (next === undefined) store.editorDrafts?.fields.delete(draftKey)\n else store.editorDrafts?.fields.set(draftKey, next)\n store.publishDrafts?.()\n }\n const save = (): void => { void store.persistParamOverrides() }\n const patch = (next: unknown): void => { store.patch({ [param]: next }) }\n // 默认渲染点沿用 `pt-param-<键>`(层卡内唯一);镜像渲染点带实例前缀,DOM id 不重复。\n const id = instanceId === undefined ? `pt-param-${param}` : `pt-param-${instanceId}-${param}`\n const label = t(`param.${param}`)\n const hint = t('param.hint', { param, label })\n const optionLabels: Record<string, string> = {\n either: t('param.option.either'),\n 'tool-call': t('param.option.tool-call'),\n 'assistant-message': t('param.option.assistant-message'),\n }\n const menuField = definition.kind === 'string' && definition.options !== undefined\n if (definition.kind === 'string-list') {\n return <div data-param-key={param} data-param-kind={definition.kind} data-control=\"list\">\n <TagInput id={id} label={label} hint={hint} value={String(value ?? '')} disabled={disabled}\n onChange={patch} onCommit={save} />\n </div>\n }\n let control: ReactNode\n if (definition.kind === 'string' && definition.options !== undefined) {\n control = <MenuSelect compact ariaLabel={label} value={String(value ?? '')} disabled={disabled}\n options={[{ value: '', label: t('param.inheritPresetDefault') }, ...definition.options.map((item) => ({ value: item, label: optionLabels[item] ?? item }))]}\n onChange={(next) => { patch(next); save() }} />\n } else if (definition.kind === 'boolean') {\n control = <Switch className={styles.configEnable} checked={value === true} disabled={disabled} label={label}\n onChange={(next) => { patch(next); save() }} />\n } else if (definition.kind === 'number') {\n control = <input id={id} className={clsx(styles.configInput, styles.configNumberInput)} inputMode=\"decimal\" aria-label={label}\n aria-invalid={error !== undefined} aria-describedby={error === undefined ? undefined : `${id}-error`}\n value={draftText ?? String(value ?? '')} readOnly={disabled}\n onChange={(event) => writeDraft({ source: String(value ?? ''), text: event.target.value, error: '' })}\n onBlur={() => {\n if (draftText === undefined || disabled) return\n const next = draftText.trim() === '' ? definition.defaultValue : Number(draftText)\n const reason = typeof next === 'number' ? definition.check(next) : undefined\n if (reason !== undefined) {\n writeDraft({ source: String(value ?? ''), text: draftText, error: reason })\n return\n }\n patch(next)\n writeDraft(undefined)\n save()\n }} />\n } else {\n control = <textarea id={id} className={styles.configTextarea} rows={2} aria-label={label} value={String(value ?? '')}\n readOnly={disabled} onChange={(event) => patch(event.target.value)} onBlur={() => { if (!disabled) save() }} />\n }\n return <div className={styles.settingRowStack} data-param-key={param} data-param-kind={definition.kind}\n data-control={menuField ? 'select' : definition.kind === 'boolean' ? 'switch' : definition.kind === 'number' ? 'number' : 'text'}>\n <HintTooltip label={hint}><span className={styles.settingCopy}>\n {menuField || definition.kind === 'boolean' ? <span>{label}</span> : <label htmlFor={id}>{label}</label>}\n </span></HintTooltip>\n {control}\n {error !== undefined && <small id={`${id}-error`} role=\"alert\">{error}</small>}\n </div>\n}\n","import { useEffect, useRef, useState, type ReactNode, type RefObject } from 'react'\nimport { IconChevronDownOutlineRegular, Menu } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { PromptToolStore } from '../../data/use-prompt-tool-store.ts'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport { EngineModuleCard } from '../../ui/EngineModuleCard.tsx'\nimport { useMenuFocus } from '../../ui/menu-focus.ts'\nimport { cssEscapeId, scrollToCreatedCard } from '../../ui/reveal-card.ts'\nimport { ENGINE_CAPABILITIES, ENGINE_RECIPES, engineRecipe, isEngineCapabilityPresent } from '../../../shared/engine-capabilities.ts'\nimport { EngineParamFields, matchesEditorGroup } from './EngineParamFields.tsx'\nimport styles from '../../ui/controls.module.css'\n\n/** 能力卡内的附加编辑器插槽上下文(跨 feature 的自定义编辑器由页面注入,模块层不反向依赖)。 */\nexport interface CapabilityEditorSlot {\n capabilityId: string\n store: PromptToolStore\n t: PromptToolTranslate\n}\n\n/** 合并进「添加能力 / 工具模块」菜单的创建项(提示词配置、自定义工具)。 */\nexport interface ModuleCreateItem {\n id: string\n label: string\n}\n\nexport function EngineCapabilityCreateMenu(props: {\n store: PromptToolStore\n t: PromptToolTranslate\n /** 菜单按钮 ref:模板浮层锚定到该按钮。 */\n anchorRef?: RefObject<HTMLButtonElement>\n /** 合并入口:排在能力模块项之前的创建项。 */\n extraItems?: readonly ModuleCreateItem[]\n templatesOnly?: boolean\n layer?: string\n onExtraSelect?: (id: string) => void\n onCreated?: (capabilityId: string) => void\n /** 该页面不提供创建的能力(受众视图差异,如仅主对话生效的能力)。 */\n excludeCapabilities?: readonly string[]\n}): ReactNode {\n const { store, t, anchorRef, extraItems = [], onExtraSelect, excludeCapabilities = [] } = props\n const [open, setOpen] = useState(false)\n const firstItemRef = useMenuFocus(open)\n const fallbackAnchor = useRef<HTMLButtonElement>(null)\n const trigger = anchorRef ?? fallbackAnchor\n const editable = store.fields.writePreset && store.moduleFacts?.editable === true\n const excluded = new Set(excludeCapabilities)\n if (!editable && extraItems.length === 0) return null\n const items = [\n ...extraItems,\n ...(editable && !props.templatesOnly\n ? [\n ...ENGINE_CAPABILITIES.filter(({ id, displayLayer }) => !excluded.has(id) && !isEngineCapabilityPresent(id, store.moduleFacts)\n && (props.layer === undefined || displayLayer === props.layer))\n .map(({ id }) => ({ id: `cap:${id}`, label: t('modules.addCapabilityItem', { id }) })),\n ...ENGINE_RECIPES.filter(({ capabilities }) => !capabilities.some((id) => excluded.has(id))\n && (props.layer === undefined || ENGINE_CAPABILITIES.find(({ id }) => id === capabilities[0])?.displayLayer === props.layer))\n .map(({ id }) => ({ id: `recipe:${id}`, label: t('modules.createRecipeItem', { id }) })),\n ]\n : []),\n ]\n if (items.length === 0) return null\n return <span data-engine-create-layer={props.layer} onKeyDown={(event) => {\n if (!open || !['Escape', 'Tab'].includes(event.key)) return\n event.stopPropagation()\n if (event.key === 'Escape') event.preventDefault()\n trigger.current?.focus()\n setOpen(false)\n }}><Menu open={open} onClose={() => setOpen(false)} items={items.map((item, index) => ({ ...item, label: <span ref={index === 0 ? firstItemRef : undefined}>{item.label}</span> }))} align=\"end\" portal compact autoFocus\n onSelect={(id) => {\n setOpen(false)\n trigger.current?.focus()\n if (!editable || !items.some((item) => item.id === id)) return\n const [kind, value] = id.split(':', 2)\n if (kind === 'cap' || kind === 'recipe') {\n if (value !== undefined) void store.createEngineCapability(kind === 'recipe' ? 'create-recipe' : 'create', value).then((created) => {\n const capabilityId = kind === 'recipe' ? engineRecipe(value)?.capabilities[0] : value\n if (created && capabilityId !== undefined) props.onCreated?.(capabilityId)\n })\n } else onExtraSelect?.(id)\n }}\n anchor={<button ref={trigger} type=\"button\" className={styles.pillButton} disabled={!editable} aria-haspopup=\"menu\" aria-expanded={open} onClick={() => setOpen(!open)}>\n {t(props.templatesOnly ? 'modules.addTemplates' : 'modules.addCapability')}<IconChevronDownOutlineRegular />\n </button>} /></span>\n}\n\nexport function EngineModuleActions(props: {\n store: PromptToolStore\n t: PromptToolTranslate\n anchorRef?: RefObject<HTMLButtonElement>\n extraItems?: readonly ModuleCreateItem[]\n templatesOnly?: boolean\n layer?: string\n onExtraSelect?: (id: string) => void\n onCreated?: (capabilityId: string) => void\n /** 该页面不提供创建的能力。 */\n excludeCapabilities?: readonly string[]\n}): ReactNode {\n // 工具栏只放按钮:说明文字由 EngineModuleCards 渲染在卡片列表上方,\n // 避免挤进 .configActions(flex + margin-left:auto)导致按钮偏移。\n return <div className={styles.configActions}><EngineCapabilityCreateMenu {...props} /></div>\n}\n\nexport function EnginePromptDefaultsCard({ store, t }: { store: PromptToolStore; t: PromptToolTranslate }): ReactNode {\n return (\n <EngineModuleCard name={t('modules.promptDefaults.name')} meta={t('modules.promptDefaults.meta')}\n defaultExpanded={store.editorDrafts?.expanded.get(`${store.fields.presetTemplate}:prompt-defaults`)}\n onExpandedChange={(value) => store.editorDrafts?.expanded.set(`${store.fields.presetTemplate}:prompt-defaults`, value)}>\n <EngineParamFields store={store} card=\"prompt-defaults\" t={t} />\n </EngineModuleCard>\n )\n}\n\n/** 能力存在性来自实际装配;一项已装配能力一张卡,直接编辑自身参数(无编辑目标选择器)。 */\nexport function EngineModuleCards({\n store,\n t,\n layerFilter = 'all',\n keyword = '',\n showActions = true,\n showPromptDefaults = true,\n showStatus = true,\n focusCapability,\n excludeCapabilities,\n emptyHint,\n hint,\n renderCapabilityExtra,\n}: {\n store: PromptToolStore\n t: PromptToolTranslate\n layerFilter?: string\n /** 统一搜索词:能力 id、参数键与参数中文标签都参与匹配(只影响展示)。 */\n keyword?: string\n showActions?: boolean\n showPromptDefaults?: boolean\n showStatus?: boolean\n /** 新建能力后的定位信号:token 每次创建都变化,保证同一能力重复创建仍会再次展开并跳转。 */\n focusCapability?: { id: string; token: number }\n /** 该页面不渲染的能力卡(受众视图差异,如仅主对话生效的能力)。 */\n excludeCapabilities?: readonly string[]\n /** 无卡片时的替代说明(默认按层级给通用空状态)。 */\n emptyHint?: string\n /** 卡片列表上方的说明(工具栏只放按钮,说明文字不挤进按钮行)。 */\n hint?: string\n /** 能力卡内的附加编辑器(由页面注入,避免 feature 间反向依赖)。 */\n renderCapabilityExtra?: (slot: CapabilityEditorSlot) => ReactNode\n}): ReactNode {\n const excluded = new Set(excludeCapabilities ?? [])\n const search = keyword.trim().toLowerCase()\n const capabilities = ENGINE_CAPABILITIES.filter(({ id, displayLayer }) =>\n !excluded.has(id)\n && (layerFilter === 'all' || layerFilter === displayLayer)\n && matchesEditorGroup(id, search, t)\n && isEngineCapabilityPresent(id, store.moduleFacts))\n const editable = store.fields.writePreset && store.moduleFacts?.editable === true\n const focus = focusCapability\n const focusToken = focus?.token\n const focusId = focus?.id\n useEffect(() => {\n if (focusId === undefined) return\n // 新建只做两件事:展开(revealKey)与滚动定位;过滤状态一律不动。\n // 依赖只取 token:避免同一信号因父级重渲染(新对象引用)反复触发滚动。\n return scrollToCreatedCard(`[data-module-card-id=\"${cssEscapeId(focusId)}\"]`)\n }, [focusToken, focusId])\n return <>\n {showActions && <EngineModuleActions store={store} t={t} />}\n {hint !== undefined && <p className={styles.configFieldHint}>{hint}</p>}\n {capabilities.map((capability) => (\n <EngineModuleCard key={capability.id} name={capability.id} layer={capability.displayLayer}\n meta={capability.moduleKeys.join(' · ')}\n revealKey={capability.id === focus?.id ? String(focus.token) : undefined}\n anchorId={capability.id}\n defaultExpanded={store.editorDrafts?.expanded.get(`${store.fields.presetTemplate}:capability:${capability.id}`)}\n onExpandedChange={(value) => store.editorDrafts?.expanded.set(`${store.fields.presetTemplate}:capability:${capability.id}`, value)}\n deleteLabels={{ title: t('card.deleteTitle', { name: capability.id }), description: t('card.deleteDescription', { name: capability.id }), confirm: t('toolEditor.confirmRemove'), cancel: t('toolEditor.cancel'), failure: t('card.operationFailed') }}\n readOnlyReason={!editable ? t('configs.readOnly.system') : undefined}\n onDelete={editable ? async () => { if (!await store.removeEngineCapability(capability.id)) throw new Error(t('card.operationFailed')) } : undefined}>\n <EngineParamFields store={store} card={capability.id} t={t} />\n {renderCapabilityExtra?.({ capabilityId: capability.id, store, t })}\n </EngineModuleCard>\n ))}\n {showPromptDefaults && (layerFilter === 'all' || layerFilter === 'pre-step') && matchesEditorGroup('prompt-defaults', search, t) && <EnginePromptDefaultsCard store={store} t={t} />}\n {showStatus && store.moduleFacts === undefined && <p className={styles.configFieldHint} role=\"status\">{t('modules.status.reading')}</p>}\n {showStatus && store.moduleFacts !== undefined && capabilities.length === 0 && (\n <p className={styles.configFieldHint} role=\"status\">\n {search.length > 0\n ? t('modules.status.emptySearch', { keyword: keyword.trim() })\n : emptyHint ?? (layerFilter === 'all' ? t('modules.status.emptyAll') : t('modules.status.emptyFiltered'))}\n </p>\n )}\n </>\n}\n","import { useState, useSyncExternalStore, type ReactNode } from 'react'\nimport type { PromptToolStore } from '../../data/use-prompt-tool-store.ts'\nimport { EngineModuleCard } from '../../ui/EngineModuleCard.tsx'\nimport { MenuSelect } from '../../ui/MenuSelect.tsx'\nimport styles from '../../ui/controls.module.css'\nimport { buildEffortOptions, buildModelOptions, modelChoiceValue, parseModelChoice } from './model-options.ts'\n/** 模型路由模块卡(主模型走当前预设请求覆盖,子代理走委派参数):\n * 主对话/子代理共用同一配置源(缺省继承宿主默认);模型路由与人设按作用域完全分离\n * (main=主对话模型、subagent=子代理模型,参数各自独立)。 */\nexport function ModelRouteModuleCard(props: { store: PromptToolStore; scope: 'main' | 'subagent' }): ReactNode {\n const { store } = props\n const fields = store.fields\n const disabled = !fields.writePreset || store.moduleFacts?.editable !== true\n const host = store.hostDefaultModel\n // 当前会话模型选择(官方 session 投影 + selectModel 通道):会话切换即换显,\n // 宿主侧切换经投影帧实时回流;投影缺省时回退宿主默认(对齐官方目录 current 语义)。\n const sessionFace = store.api.sessionModel\n const sessionView = useSyncExternalStore(sessionFace.subscribe, sessionFace.snapshot)\n const [selecting, setSelecting] = useState(false)\n const sessionProvider = sessionView.selection?.provider ?? host?.provider ?? ''\n const sessionModelName = sessionView.selection?.model ?? host?.model ?? ''\n const sessionEffort = sessionView.selection?.reasoningEffort ?? host?.reasoningEffort ?? ''\n // 宿主默认模型回显:插件参数未设置(空 = 继承宿主)时,下拉可见宿主当前\n // agent-default-model 的可选项(模型目录查询失败/未公布时也能选择与回显)。\n const provider = props.scope === 'main' ? fields.modelProvider : fields.subagentModelProvider\n const modelName = props.scope === 'main' ? fields.modelName : fields.subagentModelName\n // 宿主默认思维程度回显(agent-default-model settings reasoningEffort;官方档位同源)。\n const hostEffort = host?.reasoningEffort !== undefined && host.reasoningEffort.length > 0\n ? host.reasoningEffort\n : undefined\n const active = provider.length > 0 && modelName.length > 0\n const modelOptions = buildModelOptions(store.modelCatalog, [\n ...(provider.length > 0 && modelName.length > 0 ? [{ provider, model: modelName }] : []),\n ...(host?.provider !== undefined && host.provider.length > 0 && host.model !== undefined && host.model.length > 0\n ? [{ provider: host.provider, model: host.model }]\n : []),\n ])\n const sessionModelOptions = buildModelOptions(store.modelCatalog, [\n ...(sessionProvider.length > 0 && sessionModelName.length > 0\n ? [{ provider: sessionProvider, model: sessionModelName }]\n : []),\n ...(host?.provider !== undefined && host.provider.length > 0 && host.model !== undefined && host.model.length > 0\n ? [{ provider: host.provider, model: host.model }]\n : []),\n ]).filter((option) => option.value.length > 0)\n const reasoningEffort = props.scope === 'main' ? fields.modelReasoningEffort : fields.subagentReasoningEffort\n // 思维程度档位来自官方元数据(store.modelReasoning 按 provider/model 路由查得):\n // 未查到或该路由不提供推理档位时不展示固定列表,存量值仍保留回显(M-12)。\n const sessionReasoning = store.modelReasoning[modelChoiceValue(sessionProvider, sessionModelName)]\n const presetReasoning = store.modelReasoning[modelChoiceValue(provider, modelName)]\n const sessionEffortOptions = buildEffortOptions(sessionReasoning, sessionEffort)\n const presetEffortOptions = buildEffortOptions(presetReasoning, reasoningEffort)\n const temperature = props.scope === 'main' ? fields.modelTemperature : fields.subagentTemperature\n const maxTokens = props.scope === 'main' ? fields.modelMaxTokens : fields.subagentMaxTokens\n const patchModelParam = (key: 'modelReasoningEffort' | 'modelTemperature' | 'modelMaxTokens' | 'subagentReasoningEffort' | 'subagentTemperature' | 'subagentMaxTokens', value: string): void => {\n if (disabled) return\n store.patch({ [key]: value } as Partial<typeof fields>)\n void store.persistParamOverrides()\n }\n // 会话级切换:官方 selectModel 需要完整 provider+model;单项改动与其余当前值合并提交。\n const applySessionSelection = (patch: { provider?: string; model?: string; reasoningEffort?: string }): void => {\n const nextProvider = patch.provider ?? sessionProvider\n const nextModel = patch.model ?? sessionModelName\n const nextEffort = patch.reasoningEffort ?? sessionEffort\n if (nextProvider.length === 0 || nextModel.length === 0) {\n store.showNotice('error', '会话模型切换需要服务商与模型名:当前会话尚无完整选择')\n return\n }\n setSelecting(true)\n void sessionFace.select({ provider: nextProvider, model: nextModel, ...(nextEffort.length > 0 ? { reasoningEffort: nextEffort } : {}) })\n .then(() => {\n store.showNotice('ok', '已切换当前会话模型选择(宿主默认同步更新)')\n // 宿主默认已随 selectModel 更新:刷新桥回显(hostDefaultModel)。\n void store.load()\n })\n .catch((error: unknown) => {\n store.showNotice('error', '会话模型切换失败:' + (error instanceof Error ? error.message : String(error)))\n })\n .finally(() => setSelecting(false))\n }\n const scopeMeta = props.scope === 'main'\n ? { title: '模型路由', idle: '未设置:展开选择模型(留空 = 继承当前会话)', active: '固定模型路由已设置(仅当前预设请求)' }\n : { title: '子代理模型', idle: '未设置:展开选择模型(留空 = 继承主会话)', active: '子代理固定模型路由已设置' }\n // 主对话卡片:宿主默认模型名回显(子代理默认继承主会话,不回显宿主)。\n const idleMeta = props.scope === 'main' && host?.model !== undefined && host.model.length > 0\n ? `未设置:展开选择模型(当前继承宿主默认 ${host.model})`\n : scopeMeta.idle\n return (\n <EngineModuleCard name={scopeMeta.title} meta={active ? scopeMeta.active : idleMeta}\n defaultExpanded={store.editorDrafts?.expanded.get(`${fields.presetTemplate}:model:${props.scope}`)}\n onExpandedChange={(value) => store.editorDrafts?.expanded.set(`${fields.presetTemplate}:model:${props.scope}`, value)}>\n {props.scope === 'main' && (\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>当前会话</strong>\n <small>{sessionView.sessionId === undefined\n ? '无活动会话:打开会话后此处显示其模型选择并可切换。'\n : sessionView.selectable\n ? '与官方模型选择器同源(session.selectModel):切换即对当前会话生效,并保存为宿主新会话默认。下方预设参数非空时按请求覆盖会话选择。'\n : '子代理会话不支持会话级切换(走子代理固定路由)。'}</small>\n </span>\n <div className={styles.sessionModelRow}>\n <MenuSelect\n className={styles.configInput}\n compact\n ariaLabel=\"会话模型\"\n value={sessionProvider.length > 0 && sessionModelName.length > 0 ? modelChoiceValue(sessionProvider, sessionModelName) : ''}\n disabled={!sessionView.selectable || selecting}\n options={sessionModelOptions}\n onChange={(value) => {\n const selection = parseModelChoice(value)\n if (selection !== undefined) applySessionSelection(selection)\n }}\n />\n <MenuSelect\n className={styles.configInput}\n compact\n ariaLabel=\"会话思维程度\"\n value={sessionEffort}\n disabled={!sessionView.selectable || selecting}\n options={sessionEffortOptions}\n onChange={(reasoningEffort) => applySessionSelection({ reasoningEffort })}\n />\n </div>\n </div>\n )}\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>预设模型</strong>\n <small>{props.scope === 'main'\n ? `选择模型后保存到当前预设;思维程度档位按所选模型声明展示,不改写宿主全局默认模型。留空 = 继承宿主默认${hostEffort !== undefined ? `(思维程度当前为 ${hostEffort})` : ''}。`\n : '选择模型后自动绑定对应服务商(agentOptions 注入 tool-subagent),调用方显式模型优先;思维程度档位按所选模型声明展示,留空 = 不设置(模型默认)。'}</small>\n </span>\n <div className={styles.sessionModelRow}>\n <MenuSelect\n className={styles.configInput}\n compact\n ariaLabel=\"预设模型\"\n value={active ? modelChoiceValue(provider, modelName) : ''}\n disabled={disabled}\n options={modelOptions}\n onChange={(value) => {\n const selection = parseModelChoice(value)\n const patch = selection === undefined\n ? (props.scope === 'main' ? { modelProvider: '', modelName: '' } : { subagentModelProvider: '', subagentModelName: '' })\n : (props.scope === 'main'\n ? { modelProvider: selection.provider, modelName: selection.model }\n : { subagentModelProvider: selection.provider, subagentModelName: selection.model })\n store.patch(patch)\n void store.persistParamOverrides()\n }}\n />\n <MenuSelect\n className={styles.configInput}\n compact\n ariaLabel=\"思维程度\"\n value={reasoningEffort}\n disabled={disabled}\n options={presetEffortOptions}\n onChange={(value) => patchModelParam(\n props.scope === 'main' ? 'modelReasoningEffort' : 'subagentReasoningEffort',\n value,\n )}\n />\n </div>\n </div>\n <div className={styles.settingRowStack}>\n <span className={styles.settingCopy}>\n <strong>采样参数</strong>\n <small>temperature(数字 0–2)与 maxTokens(正整数)经 agent-request patch 生效;留空 = 不设置(模型默认)。失焦保存。</small>\n </span>\n <div className={styles.sessionModelRow}>\n <input\n className={styles.configInput}\n type=\"number\"\n min={0}\n max={2}\n step={0.1}\n aria-label=\"采样温度\"\n value={temperature}\n disabled={disabled}\n placeholder=\"温度(不设置)\"\n onChange={(event) => patchModelParam(\n props.scope === 'main' ? 'modelTemperature' : 'subagentTemperature',\n event.target.value,\n )}\n onBlur={() => { if (!disabled) void store.persistParamOverrides() }}\n />\n <input\n className={styles.configInput}\n type=\"number\"\n min={1}\n step={1}\n aria-label=\"输出上限\"\n value={maxTokens}\n disabled={disabled}\n placeholder=\"输出上限(不设置)\"\n onChange={(event) => patchModelParam(\n props.scope === 'main' ? 'modelMaxTokens' : 'subagentMaxTokens',\n event.target.value,\n )}\n onBlur={() => { if (!disabled) void store.persistParamOverrides() }}\n />\n </div>\n </div>\n </EngineModuleCard>\n )\n}\n","/** preset.yml 顶层 persona 段编辑卡(官方 @deepseek-ai/dsh-persona 行 config 同构)。\n * 数据源 = /persona:无载荷读、带 persona 写,host 侧走 readPersonaSpec 校验 +\n * savePresetPersona 原子写盘并重建。prefix/suffix 取代旧 promptConfigs\n * params.sectionName + text 的人设承载方式;complete 与提示词配置的「独占」互斥,\n * 由 bridge 写盘前 fail loud。 */\nimport { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { Button } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { PersonaDraft, PersonaEditorDraft, WorkspaceDrafts } from '../../data/workspace-drafts.ts'\nimport { bridgeCall } from '../../data/bridge-client.ts'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport { EngineModuleCard } from '../../ui/EngineModuleCard.tsx'\nimport { ToggleRow } from '../../ui/ToggleRow.tsx'\nimport { ConfirmDialog } from '../../ui/ConfirmDialog.tsx'\nimport styles from '../../ui/controls.module.css'\n\ntype Notice = (kind: 'ok' | 'error', message: string) => void\n\nconst EMPTY_PERSONA: PersonaDraft = { prefix: '', suffix: '', complete: false, includeRuntimeContext: true }\n\nexport function PresetPersonaCard(props: { t: PromptToolTranslate; presetId?: string; disabled?: boolean; drafts?: WorkspaceDrafts; onNotice: Notice }): ReactNode {\n const { t, onNotice } = props\n const editor = useMemo((): PersonaEditorDraft => {\n const key = props.presetId ?? ''\n const retained = props.drafts?.persona.get(key)\n if (retained) return retained\n const next = { value: EMPTY_PERSONA, saved: EMPTY_PERSONA, declared: false, loaded: false, error: '', saving: false }\n props.drafts?.persona.set(key, next)\n return next\n }, [props.drafts, props.presetId])\n const [draft, setDraft] = useState<PersonaDraft>(editor.value)\n const [declared, setDeclared] = useState(editor.declared)\n const [loaded, setLoaded] = useState(editor.loaded)\n const [dirty, setDirty] = useState(editor.value !== editor.saved)\n const [saving, setSaving] = useState(false)\n const [loadError, setLoadError] = useState(editor.error)\n const [confirmingRemove, setConfirmingRemove] = useState(false)\n const active = useRef<PersonaEditorDraft | null>(editor)\n\n const load = useCallback(() => {\n setLoadError('')\n const readingDraft = editor.value\n void bridgeCall('persona', { expectedPresetId: props.presetId }).then((result) => {\n if (active.current !== editor) return\n if (editor.value !== readingDraft) return\n if (result.ok) {\n const persona = result.value.persona\n const next = persona === null ? EMPTY_PERSONA : {\n prefix: persona.prefix,\n suffix: persona.suffix ?? '',\n complete: persona.complete === true,\n includeRuntimeContext: persona.includeRuntimeContext !== false,\n }\n editor.value = next\n editor.saved = next\n editor.declared = persona !== null\n editor.loaded = true\n editor.error = ''\n setDraft(next)\n setDirty(false)\n setDeclared(persona !== null)\n } else {\n editor.error = result.message ?? t('persona.notice.loadFailed')\n setLoadError(editor.error)\n onNotice('error', editor.error)\n }\n setLoaded(true)\n })\n }, [editor, props.presetId, onNotice, t])\n useEffect(() => {\n active.current = editor\n const refresh = (): void => {\n setDraft(editor.value); setDeclared(editor.declared); setLoaded(editor.loaded)\n setDirty(editor.value !== editor.saved); setLoadError(editor.error); setSaving(editor.saving)\n }\n editor.refresh = refresh\n refresh()\n if (!editor.loaded || (editor.value === editor.saved && !editor.saving)) load()\n return () => { active.current = null; if (editor.refresh === refresh) editor.refresh = undefined }\n }, [editor, load])\n\n const patch = (next: Partial<PersonaDraft>): void => {\n editor.value = { ...editor.value, ...next }\n setDraft(editor.value)\n setDirty(true)\n }\n const write = async (persona: { prefix: string; suffix?: string; complete?: boolean; includeRuntimeContext?: boolean } | null): Promise<void> => {\n if (editor.saving || !editor.loaded || props.disabled || loadError) return\n const submitted = persona === null ? EMPTY_PERSONA : editor.value\n editor.saving = true\n setSaving(true)\n await bridgeCall('persona', { persona, expectedPresetId: props.presetId }).then((result) => {\n editor.saving = false\n if (result.ok) {\n editor.saved = submitted\n editor.declared = persona !== null\n if (persona === null && editor.value === draft) editor.value = EMPTY_PERSONA\n }\n editor.refresh?.()\n if (active.current !== editor) return\n setSaving(false)\n if (result.ok) {\n setDeclared(editor.declared)\n setDraft(editor.value)\n setDirty(editor.value !== editor.saved)\n setConfirmingRemove(false)\n onNotice('ok', persona === null ? t('persona.notice.removed') : t('persona.notice.saved'))\n } else {\n onNotice('error', result.message ?? t('persona.notice.saveFailed'))\n if (persona === null) throw new Error(result.message ?? t('persona.notice.saveFailed'))\n }\n })\n }\n const save = (): void => {\n const untouched = draft.prefix === '' && draft.suffix === '' && !draft.complete && draft.includeRuntimeContext\n void write(!declared && untouched ? null : {\n prefix: draft.prefix,\n ...(draft.suffix.length > 0 ? { suffix: draft.suffix } : {}),\n ...(draft.complete ? { complete: true } : {}),\n ...(draft.includeRuntimeContext ? {} : { includeRuntimeContext: false }),\n })\n }\n const busy = props.disabled === true || saving || !loaded || loadError.length > 0\n return (\n <EngineModuleCard\n name={t('persona.name')}\n meta={declared ? t('persona.meta.declared') : t('persona.meta.inherited')}\n layer=\"system-section\"\n defaultExpanded={props.drafts?.expanded.get(`${props.presetId ?? ''}:persona`)}\n onExpandedChange={(value) => props.drafts?.expanded.set(`${props.presetId ?? ''}:persona`, value)}\n >\n {loadError && <p className={styles.noticeError} role=\"alert\">{loadError} <Button size=\"sm\" onClick={load}>{t('workspace.retry')}</Button></p>}\n {dirty && <p className={styles.configFieldHint} role=\"status\">{t('card.unsaved')}</p>}\n {confirmingRemove && <ConfirmDialog title={t('persona.remove')} description={t('persona.removeDescription')}\n confirmLabel={t('persona.remove')} cancelLabel={t('toolEditor.cancel')}\n onConfirm={() => write(null)} onCancel={() => setConfirmingRemove(false)} />}\n <span className={styles.configFieldStack}>\n <span className={styles.configFieldLabel}>{t('persona.prefix.label')}</span>\n <textarea\n className={styles.configTextarea}\n aria-label={t('persona.prefix.aria')}\n value={draft.prefix}\n spellCheck={false}\n readOnly={props.disabled || !loaded || !!loadError}\n onChange={(event) => patch({ prefix: event.target.value })}\n />\n <span className={styles.configFieldHint}>{t('persona.prefix.hint')}</span>\n </span>\n <span className={styles.configFieldStack}>\n <span className={styles.configFieldLabel}>{t('persona.suffix.label')}</span>\n <textarea\n className={styles.configTextarea}\n aria-label={t('persona.suffix.aria')}\n value={draft.suffix}\n spellCheck={false}\n readOnly={props.disabled || !loaded || !!loadError}\n onChange={(event) => patch({ suffix: event.target.value })}\n />\n <span className={styles.configFieldHint}>{t('persona.suffix.hint')}</span>\n </span>\n <ToggleRow\n id=\"persona-complete\"\n label={t('persona.complete.label')}\n hint={t('persona.complete.hint')}\n checked={draft.complete}\n disabled={props.disabled || !loaded || !!loadError}\n onChange={(next) => patch({ complete: next })}\n />\n <ToggleRow\n id=\"persona-runtime-context\"\n label={t('persona.runtimeContext.label')}\n hint={t('persona.runtimeContext.hint')}\n checked={draft.includeRuntimeContext}\n disabled={props.disabled || !loaded || !!loadError}\n onChange={(next) => patch({ includeRuntimeContext: next })}\n />\n <div className={styles.configActions}>\n <Button size=\"sm\" disabled={busy || !dirty} onClick={save}>{saving ? t('persona.saving') : t('persona.save')}</Button>\n {declared && (\n <button type=\"button\" className={styles.pillButton} data-danger disabled={busy} onClick={() => setConfirmingRemove(true)}>{t('persona.remove')}</button>\n )}\n </div>\n </EngineModuleCard>\n )\n}\n","import clsx from 'clsx'\nimport type { ReactNode } from 'react'\nimport type { PromptToolStore } from '../../data/use-prompt-tool-store.ts'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport { HintTooltip } from '../../ui/HintTooltip.tsx'\nimport { MenuSelect } from '../../ui/MenuSelect.tsx'\nimport { EngineModuleCard } from '../../ui/EngineModuleCard.tsx'\nimport sharedCss from '../../ui/controls.module.css'\nimport featureCss from './subagents.module.css'\n\nconst styles = { ...sharedCss, ...featureCss }\n/** 工具与深度模块卡(子代理作用域配置;参数经 params 桥扁平键,与主会话引擎模块卡同一来源)。 */\nexport function DelegationToolsModuleCard(props: {\n store: PromptToolStore\n t: PromptToolTranslate\n}): ReactNode {\n const { store, t } = props\n const fields = store.fields\n const maxDepthOptions = ['', 'provider-managed', '0', '1', '2', '3', '5']\n return (\n <EngineModuleCard name={t('policy.delegation.name')} meta={t('policy.delegation.meta')}\n defaultExpanded={store.editorDrafts?.expanded.get(`${fields.presetTemplate}:delegation`)}\n onExpandedChange={(value) => store.editorDrafts?.expanded.set(`${fields.presetTemplate}:delegation`, value)}>\n <p className={styles.configFieldHint}>{t('policy.delegation.hint')}</p>\n <div className={styles.settingRowStack}>\n <div className={styles.switchGrid}>\n <HintTooltip label={t('policy.delegation.depthHint')}>\n <span className={clsx(styles.switchGridItem, styles.switchGridField)}>\n <span className={styles.switchGridLabel}>{t('param.maxDepth')}</span>\n <MenuSelect\n className={styles.configInput}\n compact\n ariaLabel={t('param.maxDepth')}\n value={fields.maxDepth}\n disabled={!fields.writePreset}\n options={maxDepthOptions.map((item) => ({ value: item, label: item === '' ? t('policy.delegation.depthUnset') : item }))}\n onChange={(value) => {\n store.patch({ maxDepth: value })\n void store.persistParamOverrides()\n }}\n />\n </span>\n </HintTooltip>\n </div>\n </div>\n {/* 子代理工具策略已改为模块类型能力:编辑器住在能力卡内,此处只给出入口指引,避免双入口。 */}\n <div className={styles.configSectionTitle}>{t('policy.delegation.section')}</div>\n <p className={styles.configFieldHint}>{t('policy.delegation.policyMoved')}</p>\n </EngineModuleCard>\n )\n}\n","import type { PolicyDraft } from '../../data/workspace-drafts.ts'\nexport type { PolicyDraft } from '../../data/workspace-drafts.ts'\n\nexport const asList = (value: unknown): string[] => Array.isArray(value) ? value.map(String) : []\nexport const asBool = (value: unknown): boolean => value === true\nexport const asNum = (value: unknown): number => Number.isSafeInteger(value) ? value as number : 0\nexport const splitList = (value: string): string[] => value.split(',').map((item) => item.trim()).filter((item) => item.length > 0)\n\n/** 空策略骨架(首次启用的一键初始化:`seedAllow` 由调用方给出,如能力卡当前的授权上限)。 */\nexport function createEmptyPolicy(seedAllow: string): PolicyDraft {\n return {\n defaultProfile: 'base',\n ceiling: { allow: ['read', 'write', 'edit', 'glob', 'grep', 'bash', 'web_search'], deny: [] },\n profiles: [{\n id: 'base',\n name: '基础',\n allow: splitList(seedAllow),\n deny: [],\n modelSelectable: false,\n }],\n characterBindings: [],\n taskRules: [],\n modelExpansion: { enabled: false, allow: [], maxAdditionalTools: 2, requireApproval: true },\n }\n}\n","/** 子代理实例级工具策略(subagentToolPolicy)编辑区。\n * 数据源 = preset.yml 顶层 subagentToolPolicy 段(/subagent-tool-policy)。\n * 交互:**只有一个启用开关**——打开即写入可用骨架并逐次自动保存;关闭即删除策略段\n * (模块声明保留,引擎在策略文件缺失时降级为官方委派行为),卡内所有内容只读。\n * 实例解析预览走 /subagent-tool-policy-preview seam(不复制解析算法)。\n * 既有子代理不变,策略只影响后续新实例。 */\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type FocusEvent, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { Switch } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { FieldDraft, PolicyEditorDraft, WorkspaceDrafts } from '../../data/workspace-drafts.ts'\nimport { bridgeCall } from '../../data/bridge-client.ts'\nimport { deepEqual } from '../../data/dirty-state.ts'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport { HintTooltip } from '../../ui/HintTooltip.tsx'\nimport { MenuSelect } from '../../ui/MenuSelect.tsx'\nimport { TagInput } from '../../ui/TagInput.tsx'\nimport { SUBAGENT_TOOL_POLICY_SKELETON } from '../../../shared/engine-capabilities.ts'\nimport { asBool, asList, asNum, splitList, type PolicyDraft } from './subagent-policy-draft.ts'\nimport sharedCss from '../../ui/controls.module.css'\nimport featureCss from './subagents.module.css'\n\nconst styles = { ...sharedCss, ...featureCss }\n\ntype Notice = (kind: 'ok' | 'error', message: string) => void\ninterface CharacterItem { id: string; name: string }\n\nfunction PolicyNumberInput(props: { value: number; label: string; draftKey: string; drafts?: Map<string, FieldDraft>; t: PromptToolTranslate; min?: number; onChange: (value: number) => void }): ReactNode {\n const retained = props.drafts?.get(props.draftKey)\n const initial = retained && (retained.error || retained.text !== retained.source) ? retained : { source: String(props.value), text: String(props.value), error: '' }\n const [draft, setDraft] = useState(initial)\n const errorId = useId()\n const update = (next: FieldDraft): void => { props.drafts?.set(props.draftKey, next); setDraft(next) }\n useEffect(() => {\n setDraft((current) => current.error || current.text !== current.source ? current : { source: String(props.value), text: String(props.value), error: '' })\n }, [props.value])\n return <span className={styles.configFieldStack}>\n <input className={styles.configInput} inputMode=\"numeric\" aria-label={props.label} value={draft.text}\n aria-invalid={!!draft.error} aria-describedby={draft.error ? errorId : undefined}\n onChange={(event) => update({ ...draft, text: event.target.value, error: '' })}\n onBlur={() => {\n const value = Number(draft.text)\n if (!draft.text.trim() || !Number.isSafeInteger(value) || (props.min !== undefined && value < props.min)) {\n update({ ...draft, error: props.t('field.number.integer') }); return\n }\n update({ source: String(value), text: String(value), error: '' })\n props.drafts?.delete(props.draftKey)\n props.onChange(value)\n }} />\n {draft.error && <small id={errorId} role=\"alert\">{draft.error}</small>}\n </span>\n}\n\nexport function SubagentToolPolicyCard(props: {\n t: PromptToolTranslate\n onNotice: Notice\n presetId?: string\n drafts?: WorkspaceDrafts\n disabled?: boolean\n}): ReactNode {\n const { onNotice, t } = props\n const [policy, setPolicy] = useState<PolicyDraft | null>(null)\n const [loaded, setLoaded] = useState(false)\n /** 读取失败不能降级成「无策略」:否则再次打开开关会用新骨架整体覆盖磁盘中的既有策略。 */\n const [loadError, setLoadError] = useState('')\n const [saving, setSaving] = useState(false)\n const [preview, setPreview] = useState<unknown>(null)\n const [previewInput, setPreviewInput] = useState<Record<string, string | string[]>>({})\n const [characters, setCharacters] = useState<CharacterItem[]>([])\n /** 策略编辑区:焦点离开整块时自动写盘(与指令文件卡同款设计,无保存按钮)。 */\n const scopeRef = useRef<HTMLFieldSetElement>(null)\n const scopeFocused = useRef(false)\n // 子控件 onBlur 会先提交标签,再冒泡到整卡;ref 同步更新,不等 React 完成下一次渲染。\n const editorRef = useRef<PolicyEditorDraft | null>(null)\n\n const load = useCallback(() => {\n const editor = props.drafts?.policies.get(props.presetId ?? '') ?? { draft: null, saved: null, saving: false, loaded: false }\n editorRef.current = editor\n props.drafts?.policies.set(props.presetId ?? '', editor)\n editor.refresh = () => { setPolicy(editor.draft); setSaving(editor.saving); setLoaded(editor.loaded) }\n editor.report = onNotice\n const rawDirty = [...(props.drafts?.fields ?? [])].some(([key, field]) => key.startsWith(`${props.presetId ?? ''}:policy:`) && (field.error || field.text !== field.source))\n if (editor.loaded && (editor.saving || !deepEqual(editor.draft, editor.saved) || rawDirty)) {\n setPolicy(editor.draft)\n setLoaded(true)\n setSaving(editor.saving)\n setLoadError('')\n return\n }\n setLoaded(false)\n setPolicy(null)\n setSaving(false)\n setPreview(null)\n setPreviewInput({})\n setLoadError('')\n void bridgeCall('subagentToolPolicy', { expectedPresetId: props.presetId }).then((result) => {\n if (editorRef.current !== editor) return\n if (!result.ok) {\n setLoadError(result.message ?? t('policy.loadFailed'))\n setLoaded(true)\n return\n }\n const next = (result.value.policy ?? null) as PolicyDraft | null\n editor.draft = next\n editor.saved = next\n editor.loaded = true\n setPolicy(next)\n setLoaded(true)\n })\n }, [onNotice, props.drafts, props.presetId, t])\n\n useEffect(() => {\n load()\n return () => {\n const editor = editorRef.current\n if (editor !== null) { editor.pending = undefined; editor.refresh = undefined; editor.report = undefined }\n editorRef.current = null\n }\n }, [load])\n useEffect(() => {\n let active = true\n void bridgeCall('charactersList').then((result) => {\n if (active && result.ok) setCharacters(result.value.characters)\n })\n return () => { active = false }\n }, [])\n\n /** 只确认实际提交的快照;在途再次失焦保留最新待存快照,按顺序写入。 */\n const persist = useCallback((): void => {\n const editor = editorRef.current\n if (editor === null || props.disabled || deepEqual(editor.draft, editor.saved)) return\n editor.pending = editor.draft\n if (editor.saving) return\n editor.saving = true\n setSaving(true)\n void (async () => {\n while (editor.pending !== undefined) {\n const submitted = editor.pending\n editor.pending = undefined\n if (deepEqual(submitted, editor.saved)) continue\n const result = await bridgeCall('subagentToolPolicy', { policy: submitted, expectedPresetId: props.presetId })\n // 已发请求只确认自身快照;卸载取消未发队列,同预设重挂仍共享串行状态。\n if (result.ok) {\n editor.saved = submitted\n if (editor.draft === submitted) editor.report?.('ok', t('policy.notice.autosaved'))\n } else {\n editor.report?.('error', result.message ?? t('policy.notice.saveFailed'))\n }\n if (editor.refresh === undefined) editor.pending = undefined\n }\n editor.saving = false\n editor.refresh?.()\n })()\n }, [props.disabled, props.presetId, t])\n\n const patch = (next: PolicyDraft | null): void => {\n if (editorRef.current === null || props.disabled) return\n editorRef.current.draft = next\n setPolicy(next)\n }\n /** 单一开关:打开写入可用骨架并落盘;关闭删除策略段并落盘。 */\n const toggle = (next: boolean): void => {\n if (props.disabled) return\n if (!next) for (const key of props.drafts?.fields.keys() ?? []) {\n if (key.startsWith(`${props.presetId ?? ''}:policy:`)) props.drafts?.fields.delete(key)\n }\n const draft = next ? structuredClone(SUBAGENT_TOOL_POLICY_SKELETON) : null\n patch(draft)\n persist()\n }\n\n const runPreview = (): void => {\n const editor = editorRef.current\n void bridgeCall('subagentToolPolicyPreview', previewInput).then((result) => {\n if (editorRef.current !== editor) return\n if (result.ok) setPreview(result.value.result)\n else onNotice('error', ('message' in result ? result.message : undefined) ?? t('policy.notice.previewFailed'))\n })\n }\n const enabled = policy !== null\n /** 关闭开关时整卡只读:所有可编辑控件(含开关键与表单按钮)统一禁用。 */\n const locked = !enabled || props.disabled === true\n const profiles = useMemo(() => policy?.profiles ?? [], [policy])\n const profileIds = profiles.map((profile) => profile.id)\n const ceilingAllow = asList(policy?.ceiling?.allow)\n const invalidCharacterBindings = (policy?.characterBindings ?? []).filter((binding) =>\n binding.characterId.length === 0 || !characters.some((item) => item.id === binding.characterId))\n /** 失焦自动保存(复用既有设计):焦点离开策略编辑区才落盘,内部换控件不触发。 */\n const autoSaveOnBlur = (event: FocusEvent<HTMLElement>): void => {\n const next = event.relatedTarget\n if (next !== null && scopeRef.current?.contains(next as Node)) return\n scopeFocused.current = false\n requestAnimationFrame(() => {\n if (scopeFocused.current) return\n if ([...(props.drafts?.fields ?? [])].some(([key, field]) => key.startsWith(`${props.presetId ?? ''}:policy:`) && (field.error || field.text !== field.source))) return\n const draft = editorRef.current?.draft\n if (draft === undefined || draft === null || loadError.length > 0) return\n // 存在无效角色卡绑定时端点会拒绝,先不写盘;用户修正后失焦即保存。\n if ((draft.characterBindings ?? []).some((binding) =>\n binding.characterId.length === 0 || !characters.some((item) => item.id === binding.characterId))) return\n persist()\n })\n }\n const moveProfile = (index: number, offset: -1 | 1): void => {\n if (policy === null) return\n const next = [...profiles]\n const target = index + offset\n if (target < 0 || target >= next.length) return\n ;[next[index], next[target]] = [next[target]!, next[index]!]\n patch({ ...policy, profiles: next })\n }\n const removeProfile = (id: string): void => {\n if (policy === null) return\n const refs = [\n ...(policy.defaultProfile === id ? ['defaultProfile'] : []),\n ...(policy.characterBindings ?? []).filter((item) => item.profile === id).map((item) => t('policy.ref.character', { id: item.characterId })),\n ...(policy.taskRules ?? []).filter((item) => item.profile === id).map((item) => t('policy.ref.task', { id: item.id })),\n ]\n if (refs.length > 0) {\n onNotice('error', t('policy.removeBlocked', { id, refs: refs.join(t('policy.ref.separator')) }))\n return\n }\n patch({ ...policy, profiles: profiles.filter((item) => item.id !== id) })\n }\n\n // 密集行内联项:标签 + 开关/控件同一 flex 项(与本插件工作台合并行范式一致)。\n const policyChip = (label: string, hint: string, checked: boolean, onToggle: (next: boolean) => void, ariaLabel?: string): ReactNode => (\n <HintTooltip label={hint}>\n <span className={styles.switchGridItem}>\n <span className={styles.switchGridLabel}>{label}</span>\n <Switch checked={checked} label={ariaLabel ?? label} onChange={onToggle} disabled={locked} />\n </span>\n </HintTooltip>\n )\n const inlineField = (label: string, hint: string, control: ReactNode, wide = false): ReactNode => (\n <HintTooltip key={label} label={hint}>\n <span className={clsx(styles.switchGridItem, wide && styles.sessionModelRowWide)}>\n <span className={styles.switchGridLabel}>{label}</span>\n {control}\n </span>\n </HintTooltip>\n )\n\n return (\n <>\n {/* 单一开关:打开即启用并自动保存,关闭即删除策略段(模块声明保留、内容只读)。 */}\n <div className={styles.settingRowStack}>\n <div className={styles.sessionModelRow}>\n <HintTooltip label={t('policy.titleHint')}>\n <span className={styles.switchGridItem}>\n <span className={styles.switchGridLabel}>{t('policy.toggleLabel')}</span>\n </span>\n </HintTooltip>\n <Switch checked={enabled} label={t('policy.toggleLabel')}\n disabled={props.disabled || !loaded || loadError.length > 0 || saving} onChange={toggle} />\n {loaded && loadError.length === 0 && (\n <small className={styles.switchGridHint}>\n {enabled ? t('policy.status.enabled', { count: profiles.length }) : t('policy.status.disabled')}\n </small>\n )}\n </div>\n </div>\n {!loaded && <p className={styles.configFieldHint}>{t('policy.loading')}</p>}\n {loaded && loadError.length > 0 && (\n <p className={styles.noticeError} role=\"alert\">\n {t('policy.loadFailed')}\n <button type=\"button\" className={styles.pillButton} onClick={() => { setLoaded(false); load() }}>{t('policy.retry')}</button>\n </p>\n )}\n {loaded && loadError.length === 0 && locked && (\n <p className={styles.configFieldHint}>{t('policy.disabledHint')}</p>\n )}\n {loaded && loadError.length === 0 && (\n <fieldset ref={scopeRef} className={styles.policyScope} disabled={locked} onFocus={() => { scopeFocused.current = true }} onBlur={autoSaveOnBlur} aria-label={t('policy.title')}>\n {enabled && policy !== null && (\n <>\n {invalidCharacterBindings.length > 0 && <p className={styles.noticeError}>{t('policy.invalidBindings')}</p>}\n {/* 总览:default + ceiling */}\n <div className={styles.settingRowStack}>\n <div className={styles.sessionModelRow}>\n {inlineField(t('policy.defaultProfile.label'), t('policy.defaultProfile.hint'), (\n <MenuSelect className={styles.configInput} compact ariaLabel={t('policy.defaultProfile.label')} placeholder={t('policy.menu.empty')} value={policy.defaultProfile ?? ''}\n options={profileIds.map((id) => ({ value: id, label: id }))}\n onChange={(value) => patch({ ...policy, defaultProfile: value })} />\n ))}\n </div>\n </div>\n <TagInput id=\"pt-sp-ceiling-allow\" label={t('policy.ceiling.allow.label')} hint={t('policy.ceiling.allow.hint')}\n value={ceilingAllow.join(', ')} placeholder=\"read, write, bash\" disabled={false}\n onChange={(value) => patch({ ...policy, ceiling: { ...policy.ceiling, allow: splitList(value) } })}\n onCommit={() => {}} />\n <TagInput id=\"pt-sp-ceiling-deny\" label={t('policy.ceiling.deny.label')} hint={t('policy.ceiling.deny.hint')}\n value={asList(policy.ceiling?.deny).join(', ')} placeholder=\"dangerous_tool\" disabled={false}\n onChange={(value) => patch({ ...policy, ceiling: { ...policy.ceiling, deny: splitList(value) } })}\n onCommit={() => {}} />\n {/* 工具档 */}\n <p className={styles.configFieldHint}>{t('policy.profiles.hint')}</p>\n {profiles.map((profile, index) => (\n <div key={`${profile.id}-${index}`} className={styles.policyGroup}>\n <div className={styles.sessionModelRow}>\n {inlineField('id', t('policy.profile.id.hint'), (\n <input className={styles.configInput} aria-label=\"profile id\" value={profile.id} placeholder=\"id\" spellCheck={false}\n onChange={(event) => patch({ ...policy, profiles: profiles.map((item, at) => at === index ? { ...item, id: event.target.value } : item) })} />\n ))}\n {inlineField(t('policy.profile.name'), t('policy.profile.name.hint'), (\n <input className={styles.configInput} aria-label=\"profile name\" value={profile.name ?? ''} placeholder={t('policy.profile.namePlaceholder')} spellCheck={false}\n onChange={(event) => patch({ ...policy, profiles: profiles.map((item, at) => at === index ? { ...item, name: event.target.value } : item) })} />\n ))}\n {policyChip(t('policy.profile.modelSelectable'), t('policy.profile.modelSelectable.hint'), asBool(profile.modelSelectable), (next) => patch({ ...policy, profiles: profiles.map((item, at) => at === index ? { ...item, modelSelectable: next } : item) }))}\n <span className={styles.configActions}>\n <HintTooltip label={t('policy.moveUp')}><button type=\"button\" className={styles.pillButton} aria-label={t('policy.moveUp')} disabled={index === 0} onClick={() => moveProfile(index, -1)}>↑</button></HintTooltip>\n <HintTooltip label={t('policy.moveDown')}><button type=\"button\" className={styles.pillButton} aria-label={t('policy.moveDown')} disabled={index === profiles.length - 1} onClick={() => moveProfile(index, 1)}>↓</button></HintTooltip>\n <HintTooltip label={t('policy.duplicate')}><button type=\"button\" className={styles.pillButton} aria-label={t('policy.duplicate')} onClick={() => patch({ ...policy, profiles: [...profiles, { ...structuredClone(profile), id: `${profile.id}-copy`, name: t('policy.profile.copySuffix', { name: profile.name ?? profile.id }) }] })}>⧉</button></HintTooltip>\n <HintTooltip label={t('policy.remove')}><button type=\"button\" className={styles.pillButton} data-danger aria-label={t('policy.profile.removeAria', { id: profile.id || index })}\n onClick={() => removeProfile(profile.id)}>×</button></HintTooltip>\n </span>\n </div>\n <TagInput id={`pt-sp-allow-${index}`} label=\"allow\" hint=\"\" value={asList(profile.allow).join(', ')} placeholder={ceilingAllow.join(', ') || t('policy.tagPlaceholder')}\n onChange={(value) => patch({ ...policy, profiles: profiles.map((item, at) => at === index ? { ...item, allow: splitList(value) } : item) })}\n onCommit={() => {}} />\n <TagInput id={`pt-sp-deny-${index}`} label=\"deny\" hint=\"\" value={asList(profile.deny).join(', ')} placeholder=\"bash\"\n onChange={(value) => patch({ ...policy, profiles: profiles.map((item, at) => at === index ? { ...item, deny: splitList(value) } : item) })}\n onCommit={() => {}} />\n </div>\n ))}\n <span className={styles.configActions}>\n <button type=\"button\" className={styles.pillButton} onClick={() => patch({ ...policy, profiles: [...profiles, { id: `profile-${profiles.length + 1}`, name: '', allow: [], deny: [], modelSelectable: true }] })}>{t('policy.addProfile')}</button>\n </span>\n {/* 角色卡绑定 */}\n <p className={styles.configFieldHint}>{t('policy.bindings.hint')}</p>\n {(policy.characterBindings ?? []).map((binding, index) => (\n <div key={`${binding.characterId}-${index}`} className={styles.policyGroup}>\n <div className={styles.sessionModelRow}>\n {inlineField(t('policy.binding.character'), t('policy.binding.character.hint'), (\n <MenuSelect className={styles.configInput} compact ariaLabel={t('policy.binding.characterAria')} placeholder={t('policy.menu.empty')} value={binding.characterId}\n options={[\n { value: '', label: t('policy.binding.empty') },\n ...(!characters.some((item) => item.id === binding.characterId) && binding.characterId.length > 0\n ? [{ value: binding.characterId, label: t('policy.binding.missing', { id: binding.characterId }) }]\n : []),\n ...characters.map((item) => ({ value: item.id, label: t('policy.binding.option', { name: item.name, id: item.id }) })),\n ]}\n onChange={(value) => patch({ ...policy, characterBindings: (policy.characterBindings ?? []).map((item, at) => at === index ? { ...item, characterId: value } : item) })} />\n ), true)}\n {inlineField(t('policy.binding.profile'), t('policy.binding.profile.hint'), (\n <MenuSelect className={styles.configInput} compact ariaLabel={t('policy.binding.profileAria')} placeholder={t('policy.menu.empty')} value={binding.profile}\n options={profileIds.map((id) => ({ value: id, label: id }))}\n onChange={(value) => patch({ ...policy, characterBindings: (policy.characterBindings ?? []).map((item, at) => at === index ? { ...item, profile: value } : item) })} />\n ))}\n {policyChip(t('policy.profile.modelSelectable'), t('policy.binding.modelSelectable.hint'), asBool(binding.modelSelectable), (next) => patch({ ...policy, characterBindings: (policy.characterBindings ?? []).map((item, at) => at === index ? { ...item, modelSelectable: next } : item) }), t('policy.binding.modelSelectableAria'))}\n <HintTooltip label={t('policy.remove')}><button type=\"button\" className={styles.pillButton} data-danger aria-label={t('policy.binding.removeAria')}\n onClick={() => patch({ ...policy, characterBindings: (policy.characterBindings ?? []).filter((_, at) => at !== index) })}>×</button></HintTooltip>\n </div>\n </div>\n ))}\n <span className={styles.configActions}>\n <button type=\"button\" className={styles.pillButton}\n onClick={() => patch({ ...policy, characterBindings: [...(policy.characterBindings ?? []), { characterId: '', profile: policy.defaultProfile ?? '', modelSelectable: true }] })}>{t('policy.addBinding')}</button>\n </span>\n {/* 任务规则 */}\n <p className={styles.configFieldHint}>{t('policy.rules.hint')}</p>\n {(policy.taskRules ?? []).map((rule, index) => (\n <div key={`${rule.id}-${index}`} className={styles.policyGroup}>\n <div className={styles.sessionModelRow}>\n {inlineField('id', t('policy.rule.id.hint'), (\n <input className={styles.configInput} aria-label={t('policy.rule.idAria')} value={rule.id} placeholder=\"id\" spellCheck={false}\n onChange={(event) => {\n const oldKey = `${props.presetId ?? ''}:policy:rule:${rule.id}:order`\n const retained = props.drafts?.fields.get(oldKey)\n if (retained !== undefined) {\n props.drafts?.fields.set(`${props.presetId ?? ''}:policy:rule:${event.target.value}:order`, retained)\n props.drafts?.fields.delete(oldKey)\n }\n patch({ ...policy, taskRules: (policy.taskRules ?? []).map((item, at) => at === index ? { ...item, id: event.target.value } : item) })\n }} />\n ))}\n {inlineField(t('policy.rule.name'), t('policy.rule.name.hint'), (\n <input className={styles.configInput} aria-label={t('policy.rule.nameAria')} value={rule.name ?? ''} placeholder={t('policy.rule.name')} spellCheck={false}\n onChange={(event) => patch({ ...policy, taskRules: (policy.taskRules ?? []).map((item, at) => at === index ? { ...item, name: event.target.value } : item) })} />\n ))}\n {inlineField(t('policy.rule.pattern'), t('policy.rule.pattern.hint'), (\n <input className={styles.configInput} aria-label={t('policy.rule.patternAria')} value={rule.pattern} placeholder={t('policy.rule.patternPlaceholder')} spellCheck={false}\n onChange={(event) => patch({ ...policy, taskRules: (policy.taskRules ?? []).map((item, at) => at === index ? { ...item, pattern: event.target.value } : item) })} />\n ))}\n {inlineField('order', t('policy.rule.order.hint'), (\n <PolicyNumberInput label=\"order\" value={rule.order ?? 100} t={t} drafts={props.drafts?.fields}\n draftKey={`${props.presetId ?? ''}:policy:rule:${rule.id}:order`}\n onChange={(value) => patch({ ...policy, taskRules: (policy.taskRules ?? []).map((item, at) => at === index ? { ...item, order: value } : item) })} />\n ))}\n {inlineField(t('policy.rule.profile'), t('policy.rule.profile.hint'), (\n <MenuSelect className={styles.configInput} compact ariaLabel={t('policy.rule.profileAria')} placeholder={t('policy.menu.empty')} value={rule.profile}\n options={profileIds.map((id) => ({ value: id, label: id }))}\n onChange={(value) => patch({ ...policy, taskRules: (policy.taskRules ?? []).map((item, at) => at === index ? { ...item, profile: value } : item) })} />\n ))}\n {policyChip(t('policy.profile.modelSelectable'), t('policy.rule.modelSelectable.hint'), asBool(rule.modelSelectable), (next) => patch({ ...policy, taskRules: (policy.taskRules ?? []).map((item, at) => at === index ? { ...item, modelSelectable: next } : item) }), t('policy.rule.modelSelectableAria'))}\n {rule.pattern.length > 0 && (() => { try { new RegExp(rule.pattern); return null } catch { return <small className={styles.noticeError}>{t('policy.rule.invalidPattern')}</small> } })()}\n <HintTooltip label={t('policy.remove')}><button type=\"button\" className={styles.pillButton} data-danger aria-label={t('policy.rule.removeAria')}\n onClick={() => {\n props.drafts?.fields.delete(`${props.presetId ?? ''}:policy:rule:${rule.id}:order`)\n patch({ ...policy, taskRules: (policy.taskRules ?? []).filter((_, at) => at !== index) })\n }}>×</button></HintTooltip>\n </div>\n </div>\n ))}\n <span className={styles.configActions}>\n <button type=\"button\" className={styles.pillButton}\n onClick={() => patch({ ...policy, taskRules: [...(policy.taskRules ?? []), { id: `rule-${(policy.taskRules ?? []).length + 1}`, name: '', pattern: '', profile: policy.defaultProfile ?? '', order: 100, modelSelectable: true }] })}>{t('policy.addRule')}</button>\n </span>\n {/* 模型扩权 */}\n <div className={styles.settingRowStack}>\n <div className={styles.sessionModelRow}>\n {policyChip(t('policy.expansion.enabled'), t('policy.expansion.enabled.hint'), asBool(policy.modelExpansion?.enabled), (next) => patch({ ...policy, modelExpansion: { ...policy.modelExpansion, enabled: next } }), t('policy.expansion.enabledAria'))}\n {policyChip(t('policy.expansion.approval'), t('policy.expansion.approval.hint'), asBool(policy.modelExpansion?.requireApproval), (next) => patch({ ...policy, modelExpansion: { ...policy.modelExpansion, requireApproval: next } }))}\n {inlineField(t('policy.expansion.max'), t('policy.expansion.max.hint'), (\n <PolicyNumberInput min={0} label={t('policy.expansion.maxAria')} value={asNum(policy.modelExpansion?.maxAdditionalTools)}\n t={t} drafts={props.drafts?.fields} draftKey={`${props.presetId ?? ''}:policy:maxAdditionalTools`}\n onChange={(value) => patch({ ...policy, modelExpansion: { ...policy.modelExpansion, maxAdditionalTools: value } })} />\n ))}\n </div>\n </div>\n <TagInput id=\"pt-sp-expand-allow\" label={t('policy.expansion.allow.label')} hint={t('policy.expansion.allow.hint')}\n value={asList(policy.modelExpansion?.allow).join(', ')} placeholder=\"web_search, bash\"\n onChange={(value) => patch({ ...policy, modelExpansion: { ...policy.modelExpansion, allow: splitList(value) } })}\n onCommit={() => {}} />\n {/* 实例预览 */}\n <div className={styles.policyGroup}>\n <span className={styles.settingCopy}><strong>{t('policy.preview.title')}</strong><small>{t('policy.preview.hint')}</small></span>\n <div className={styles.sessionModelRow}>\n <MenuSelect className={styles.configInput} compact ariaLabel={t('policy.preview.toolAria')} value={String(previewInput.tool ?? 'subagent')}\n options={[\n { value: 'subagent', label: 'subagent' },\n { value: 'subagent_fork', label: 'subagent_fork' },\n ]}\n onChange={(value) => setPreviewInput({ ...previewInput, tool: value })} />\n <input className={styles.configInput} aria-label={t('policy.preview.descriptionAria')} placeholder=\"description\" value={String(previewInput.description ?? '')} spellCheck={false}\n onChange={(event) => setPreviewInput({ ...previewInput, description: event.target.value })} />\n <input className={styles.configInput} aria-label={t('policy.preview.promptAria')} placeholder=\"prompt\" value={String(previewInput.prompt ?? '')} spellCheck={false}\n onChange={(event) => setPreviewInput({ ...previewInput, prompt: event.target.value })} />\n <MenuSelect className={styles.configInput} compact ariaLabel={t('policy.preview.profileAria')} value={String(previewInput.tool_profile ?? '')}\n options={[\n { value: '', label: t('policy.preview.profileEmpty') },\n ...profiles.filter((profile) => asBool(profile.modelSelectable)).map((profile) => ({ value: profile.id, label: profile.id })),\n ]}\n onChange={(value) => setPreviewInput({ ...previewInput, tool_profile: value })} />\n <MenuSelect className={styles.configInput} compact ariaLabel={t('policy.preview.characterAria')} value={String(previewInput.character_id ?? '')}\n options={[\n { value: '', label: t('policy.preview.characterEmpty') },\n ...(policy.characterBindings ?? []).filter((item) => asBool(item.modelSelectable)).map((item) => ({ value: item.characterId, label: item.characterId })),\n ]}\n onChange={(value) => setPreviewInput({ ...previewInput, character_id: value })} />\n <MenuSelect className={styles.configInput} compact ariaLabel={t('policy.preview.taskAria')} value={String(previewInput.task_type ?? '')}\n options={[\n { value: '', label: t('policy.preview.taskEmpty') },\n ...(policy.taskRules ?? []).filter((item) => asBool(item.modelSelectable)).map((item) => ({ value: item.id, label: item.id })),\n ]}\n onChange={(value) => setPreviewInput({ ...previewInput, task_type: value })} />\n <TagInput id=\"pt-sp-preview-add\" label=\"additional_tools\" hint=\"\" placeholder={t('policy.tagPlaceholder')} value={Array.isArray(previewInput.additional_tools) ? previewInput.additional_tools.join(', ') : ''}\n onChange={(value) => setPreviewInput({ ...previewInput, additional_tools: splitList(value) })}\n onCommit={() => {}} />\n <TagInput id=\"pt-sp-preview-restrict\" label=\"restrict_tools\" hint=\"\" placeholder={t('policy.tagPlaceholder')} value={Array.isArray(previewInput.restrict_tools) ? previewInput.restrict_tools.join(', ') : ''}\n onChange={(value) => setPreviewInput({ ...previewInput, restrict_tools: splitList(value) })}\n onCommit={() => {}} />\n <button type=\"button\" className={styles.primaryPill} onClick={runPreview}>{t('policy.preview.run')}</button>\n </div>\n {preview !== null && (\n <pre className={styles.configFieldHint} style={{ whiteSpace: 'pre-wrap' }}>{JSON.stringify(preview, null, 2)}</pre>\n )}\n </div>\n </>\n )}\n </fieldset>\n )}\n </>\n )\n}\n","/** 世界书诊断卡(只读):读取当前会话最近一次选择记录,解释候选/入选/已注入与真实拒绝原因。\n * 只在用户点击或挂载时读取一次,不触发求值、抽样或时间窗推进。 */\nimport { memo, useCallback, useEffect, useState, type ReactNode } from 'react'\nimport { bridgeCall } from '../../data/bridge-client.ts'\nimport type { PromptToolStore } from '../../data/use-prompt-tool-store.ts'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport type { WorldBookDiagnosticRecord } from '../../../shared/bridge-contract.ts'\nimport ui from '../../ui/controls.module.css'\n\nexport const WorldBookDiagnosticsCard = memo(function WorldBookDiagnosticsCard(props: {\n store: PromptToolStore\n t: PromptToolTranslate\n}): ReactNode {\n const { store, t } = props\n const [records, setRecords] = useState<WorldBookDiagnosticRecord[]>([])\n const [truncated, setTruncated] = useState(false)\n const [error, setError] = useState<string | undefined>(undefined)\n const [loading, setLoading] = useState(false)\n\n const refresh = useCallback(async (): Promise<void> => {\n const sessionId = store.api.currentSessionId()\n setLoading(true)\n try {\n const res = await bridgeCall('worldBookDiagnostics', sessionId === undefined ? {} : { sessionId })\n if (res.ok) {\n // 防御畸形载荷:只认数组记录,避免异常响应把整页渲染打断。\n setRecords(Array.isArray(res.value.records) ? res.value.records : [])\n setTruncated(res.value.truncated === true)\n setError(undefined)\n } else {\n setError(res.message ?? 'settings bridge unavailable')\n }\n } finally {\n setLoading(false)\n }\n }, [store])\n\n useEffect(() => { void refresh() }, [refresh])\n\n return (\n <div className={ui.section}>\n <div className={ui.sectionHeading}>\n <div>\n <h2>{t('worldBookDiag.title')}</h2>\n <p>{t('worldBookDiag.hint')}</p>\n </div>\n <button type=\"button\" className={ui.pillButton} disabled={loading} onClick={() => void refresh()}>\n {t('worldBookDiag.refresh')}\n </button>\n </div>\n {error !== undefined && <p>{t('worldBookDiag.failed', { reason: error })}</p>}\n {error === undefined && records.length === 0 && <p>{t('worldBookDiag.empty')}</p>}\n {records.length > 0 && (\n <ul>\n {records.map((record, index) => (\n <li key={`${record.id}:${record.stage}:${record.reason}:${index}`}>\n <strong>{record.id}</strong>{' '}\n <span>{t(`worldBookDiag.stage.${record.stage}` as 'worldBookDiag.stage.excluded')}</span>{' '}\n <small>{record.reason}</small>\n </li>\n ))}\n </ul>\n )}\n {truncated && <p>{t('worldBookDiag.truncated')}</p>}\n </div>\n )\n})\n","/** 行编辑只改指定字段;高级 Schema 和模板未知字段保持原样。 */\nexport function patchToolParameter(\n spec: Record<string, unknown>,\n patch: { type?: string; required?: boolean; description?: string },\n): Record<string, unknown> {\n const next: Record<string, unknown> = { ...spec, ...patch }\n if (patch.type !== undefined) {\n const currentType = spec.type ?? (Array.isArray(spec.oneOf) ? 'oneOf' : undefined)\n if (currentType !== patch.type) {\n // 用户明确切换类型时移除旧类型约束;改名称/描述/必填不走此分支。\n for (const key of ['properties', 'additionalProperties', 'items', 'oneOf', 'enum', 'const']) delete next[key]\n }\n if (patch.type === 'object') next.additionalProperties ??= true\n if (patch.type === 'array') next.items ??= { type: 'json' }\n if (patch.type === 'oneOf') {\n delete next.type\n next.oneOf ??= [{ type: 'string' }, { type: 'number' }]\n }\n }\n return next\n}\n","import { useEffect, useId, useRef, useState, type ReactNode } from 'react'\nimport clsx from 'clsx'\nimport { Button, IconChevronDownOutlineRegular, Menu, Switch } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { FieldDraft } from '../../data/workspace-drafts.ts'\nimport { ConfirmDialog } from '../../ui/ConfirmDialog.tsx'\nimport { useMenuFocus } from '../../ui/menu-focus.ts'\nimport { FormField } from '../../ui/FormField.tsx'\nimport { HintTooltip } from '../../ui/HintTooltip.tsx'\nimport { MenuSelect } from '../../ui/MenuSelect.tsx'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport { patchToolParameter } from './custom-tool-parameters.ts'\nimport sharedCss from '../../ui/controls.module.css'\nimport featureCss from './tools.module.css'\n\nconst styles = { ...sharedCss, ...featureCss }\n/** 内置工具名(delegate 提示)。 */\nconst BUILTIN_TOOL_NAMES = ['character_list', 'character_import', 'character_apply', 'character_remove', 'character_delete',\n 'world_book_list', 'world_book_upsert', 'world_book_delete', 'session_var']\n\n/**\n * execute.kind 下拉取值:必须与 engine/tool-definition.mjs:79 的校验列表逐值一致\n * (对拍守卫见 test/client/mirror-guards.test.mjs,那里 import 引擎模块做行为对拍)。\n */\nexport const KIND_OPTIONS = ['shell', 'http', 'delegate', 'fs', 'ask-user'] as const\n/** fs 的 action 取值:与 engine/tool-definition.mjs:92 的 read/write/append/list/delete 同域(引擎另收 {{args.*}} 模板,UI 不提供)。 */\nexport const FS_ACTIONS = ['read', 'write', 'append', 'list', 'delete'] as const\nconst HTTP_METHODS = ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'] as const\nconst SHELLS = ['pwsh', 'powershell', 'cmd', 'sh', 'bash'] as const\n/**\n * parameters 行的 type 下拉:前 7 项 = engine/tool-definition.mjs:4 `JSON_SCHEMA_TYPES`(物化后的类型集)。\n * 末两项 `json` / `oneOf` 是 **UI 专有**的作者侧形态:引擎只校验物化结果,`type: 'json'` / `type: 'oneOf'`\n * 会被直接拒绝(tool-definition.mjs:17 的报错即为此而写);二者由 host 保存前的\n * parameterSchemaSpecToJsonSchema 物化——`json` → 仅注释节点(任意 JSON),`oneOf` → 分支联合。\n * 因此行编辑器必须把「无 type 的节点」显示为 json、把 oneOf 节点显示为 oneOf(见下方 type 推导),\n * 不能把这两个值当成引擎类型。对拍守卫见 test/client/mirror-guards.test.mjs。\n */\nexport const SCHEMA_TYPES = ['string', 'number', 'integer', 'boolean', 'null', 'array', 'object', 'json', 'oneOf'] as const\n\nexport type ToolDraft = Record<string, unknown>\n\nexport function asRecord(value: unknown): Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {}\n}\n\n/** parameters 行式编辑:key + type 下拉 + required 开关 + description,可增删。 */\nfunction ParameterRowsEditor(props: { t: PromptToolTranslate; value: ToolDraft | undefined; onChange: (value: ToolDraft | undefined) => void }): ReactNode {\n const { t } = props\n const params = asRecord(props.value)\n const rows = Object.entries(params)\n const commit = (next: Array<[string, unknown]>): void => {\n props.onChange(next.length > 0 ? Object.fromEntries(next) : undefined)\n }\n const setRow = (index: number, patch: Partial<{ key: string; type: string; required: boolean; description: string }>): void => {\n const { key, ...changes } = patch\n commit(rows.map(([name, spec], at) => at === index ? [key ?? name, patchToolParameter(asRecord(spec), changes)] : [name, spec]))\n }\n return (\n <span className={styles.configFieldStack}>\n <span className={styles.configFieldLabel}>{t('toolEditor.params.label')}</span>\n {rows.length === 0 && <p className={styles.configFieldHint}>{t('toolEditor.params.empty')}</p>}\n {rows.map(([key, spec], index) => {\n const record = asRecord(spec)\n const type = typeof record.type === 'string' ? record.type : Array.isArray(record.oneOf) ? 'oneOf' : 'json'\n return <span key={index} className={styles.variableRow}>\n <input className={styles.configInput} aria-label={t('toolEditor.params.nameAria')} value={key} spellCheck={false} placeholder={t('toolEditor.params.namePlaceholder')}\n onChange={(e) => setRow(index, { key: e.target.value })} />\n <MenuSelect className={styles.configInput} compact ariaLabel={t('toolEditor.params.typeAria')} value={type}\n options={SCHEMA_TYPES.map((type) => ({ value: type, label: type }))}\n onChange={(type) => setRow(index, { type })} />\n <HintTooltip label={t('toolEditor.params.requiredHint')}>\n <Switch label={t('toolEditor.params.requiredAria')} checked={record.required === true}\n onChange={(checked) => setRow(index, { required: checked })} />\n </HintTooltip>\n <input className={styles.configInput} aria-label={t('toolEditor.params.descriptionAria')} value={typeof record.description === 'string' ? record.description : ''} spellCheck={false} placeholder={t('toolEditor.params.descriptionPlaceholder')}\n onChange={(e) => setRow(index, { description: e.target.value })} />\n <button type=\"button\" className={styles.pillButton} data-danger aria-label={t('toolEditor.params.removeAria', { key: key || index })}\n onClick={() => commit(rows.filter((_, at) => at !== index))}>{t('toolEditor.params.remove')}</button>\n </span>\n })}\n <span>\n <button type=\"button\" className={styles.pillButton} onClick={() => commit([...rows, ['', { type: 'string' }]])}>\n {t('toolEditor.params.add')}\n </button>\n </span>\n </span>\n )\n}\n\n/** 本 feature 内的 JSON 草稿:非法中间态不回弹,失焦后只提交对象。 */\nfunction ToolJsonField(props: { t: PromptToolTranslate; label: string; value: ToolDraft; drafts?: Map<string, FieldDraft>; draftKey: string; onChange: (value: ToolDraft) => void }): ReactNode {\n const { t } = props\n const serialized = JSON.stringify(props.value, null, 2)\n const retained = props.drafts?.get(props.draftKey)\n const [text, setText] = useState(retained?.text ?? serialized)\n const [error, setError] = useState(retained?.error ?? '')\n const errorId = useId()\n const remember = (nextText: string, nextError: string, source = serialized): void => {\n props.drafts?.set(props.draftKey, { source, text: nextText, error: nextError })\n setText(nextText); setError(nextError)\n }\n useEffect(() => {\n const field = props.drafts?.get(props.draftKey)\n if (field !== undefined && field.text !== field.source) return\n remember(serialized, '')\n }, [serialized, props.draftKey])\n return <FormField label={props.label} hint={t('toolEditor.json.hint')}>\n <textarea className={styles.configTextarea} rows={5} aria-label={props.label} aria-invalid={error.length > 0}\n aria-describedby={error ? errorId : undefined}\n value={text} spellCheck={false} onChange={(event) => remember(event.target.value, '')}\n onBlur={() => {\n try {\n const value: unknown = JSON.parse(text.trim() || '{}')\n if (value === null || typeof value !== 'object' || Array.isArray(value)) { remember(text, t('toolEditor.json.mustBeObject')); return }\n const accepted = JSON.stringify(value, null, 2)\n remember(accepted, '', accepted)\n props.onChange(value as ToolDraft)\n } catch { remember(text, t('toolEditor.json.invalid')) }\n }} />\n {error && <small id={errorId} role=\"alert\">{error}</small>}\n </FormField>\n}\n\n/** 单张工具卡片(对齐模块列表卡片形态):header(enabled 开关 + chips + 上移/下移/复制/两段式删除)+ Field 表单。 */\nexport function CustomToolCard(props: {\n t: PromptToolTranslate\n tool: ToolDraft\n fieldDrafts?: Map<string, FieldDraft>\n index: number\n expanded: boolean\n /** 只读(system 预设或关闭 writePreset):禁掉写操作,但保留卡片展开/折叠。 */\n disabled?: boolean\n onToggleExpanded: () => void\n onPatch: (patch: Partial<ToolDraft>) => void\n onToggleEnabled: (enabled: boolean) => void\n onMoveUp: () => void\n onMoveDown: () => void\n onDuplicate: () => void\n onRemove: () => void\n canMoveUp: boolean\n canMoveDown: boolean\n}): ReactNode {\n const { tool, index, t } = props\n const [confirmingDelete, setConfirmingDelete] = useState(false)\n const [menuOpen, setMenuOpen] = useState(false)\n const firstItemRef = useMenuFocus(menuOpen)\n const actionRef = useRef<HTMLSpanElement>(null)\n const focusAction = (): void => { actionRef.current?.querySelector('button')?.focus() }\n const bodyId = useId()\n const timeoutKey = `${String(tool.id ?? index)}:timeout`\n const timeoutRetained = props.fieldDrafts?.get(timeoutKey)\n const [timeoutDraft, setTimeoutDraft] = useState<string | undefined>(timeoutRetained?.text)\n const [timeoutError, setTimeoutError] = useState(timeoutRetained?.error ?? '')\n const timeoutErrorId = useId()\n useEffect(() => { if (props.disabled) { setMenuOpen(false); setConfirmingDelete(false) } }, [props.disabled])\n const execute = asRecord(tool.execute)\n const kind = typeof execute.kind === 'string' ? execute.kind : 'shell'\n const name = typeof tool.name === 'string' ? tool.name : ''\n const id = typeof tool.id === 'string' ? tool.id : `tool-${index + 1}`\n const description = typeof tool.description === 'string' ? tool.description : ''\n const enabled = tool.enabled !== false\n const paramCount = Object.keys(asRecord(tool.parameters)).length\n const chips = [kind]\n if (paramCount > 0) chips.push(t('toolEditor.chip.params', { count: paramCount }))\n if (Number.isSafeInteger(tool.timeoutMs) && (tool.timeoutMs as number) > 0) chips.push(`timeout=${tool.timeoutMs}`)\n const patchExecute = (patch: Record<string, unknown>): void => {\n props.onPatch({ execute: { ...execute, ...patch } })\n }\n return (\n <article className={clsx(styles.configCard, styles.toolCard, props.expanded && styles.configCardOpen)} data-tool-card=\"true\">\n <header className={styles.configHeader}>\n <button type=\"button\" className={styles.configToggle} aria-expanded={props.expanded} aria-controls={bodyId} onClick={props.onToggleExpanded}>\n <span className={styles.configTitle}>\n <span className={styles.configTitleRow}>\n <span className={styles.configName}>{name.length > 0 ? `${id} · ${name}` : id}</span>\n <span className={styles.configChip}>{kind}</span>\n </span>\n <span className={styles.configMeta}>{description || t('tools.surface.detail.noDescription')}{chips.length > 1 && ` · ${chips.slice(1).join(' · ')}`}</span>\n </span>\n <IconChevronDownOutlineRegular className={clsx(styles.chevron, props.expanded && styles.chevronOpen)} />\n </button>\n <div className={styles.configHeaderActions}>\n <fieldset className={styles.cardScopeActions} disabled={props.disabled === true}>\n <HintTooltip label={enabled ? t('toolEditor.enable.hint.on') : t('toolEditor.enable.hint.off')}>\n <Switch label={t('toolEditor.enable.aria', { id })} checked={enabled} disabled={props.disabled}\n onChange={props.onToggleEnabled} />\n </HintTooltip>\n <span ref={actionRef} tabIndex={-1} onKeyDown={(event) => {\n if (!menuOpen || !['Escape', 'Tab'].includes(event.key)) return\n event.stopPropagation()\n if (event.key === 'Escape') event.preventDefault()\n focusAction()\n setMenuOpen(false)\n }}><Menu open={menuOpen && !props.disabled} portal autoFocus compact\n anchor={<Button size=\"sm\" variant=\"ghost\" aria-label={t('card.actionsAria', { name: name || id })}\n aria-haspopup=\"menu\" aria-expanded={menuOpen} disabled={props.disabled} onClick={() => setMenuOpen((open) => !open)}>⋯</Button>}\n onClose={() => setMenuOpen(false)}\n items={[\n { id: 'up', label: <span ref={props.canMoveUp ? firstItemRef : undefined}>{t('toolEditor.moveUp')}</span>, disabled: !props.canMoveUp },\n { id: 'down', label: <span ref={!props.canMoveUp && props.canMoveDown ? firstItemRef : undefined}>{t('toolEditor.moveDown')}</span>, disabled: !props.canMoveDown },\n { id: 'copy', label: <span ref={!props.canMoveUp && !props.canMoveDown ? firstItemRef : undefined}>{t('toolEditor.duplicate')}</span> },\n { id: 'delete', label: t('toolEditor.remove'), danger: true },\n ]}\n onSelect={(action) => {\n setMenuOpen(false)\n focusAction()\n if (action === 'up') props.onMoveUp()\n else if (action === 'down') props.onMoveDown()\n else if (action === 'copy') props.onDuplicate()\n else setConfirmingDelete(true)\n }} /></span>\n </fieldset>\n </div>\n </header>\n {confirmingDelete && <ConfirmDialog title={t('card.deleteTitle', { name: name || id })}\n description={t('card.deleteDescription', { name: name || id })}\n confirmLabel={t('toolEditor.confirmRemove')} cancelLabel={t('toolEditor.cancel')}\n returnFocusRef={actionRef}\n onConfirm={props.onRemove} onCancel={() => setConfirmingDelete(false)} />}\n <div id={bodyId} hidden={!props.expanded}>\n {props.expanded && (\n <fieldset className={styles.configForm} disabled={props.disabled === true}>\n <span className={styles.variableRow}>\n <FormField label={t('toolEditor.field.id')}>\n <input className={styles.configInput} aria-label={t('toolEditor.field.idAria')} value={id} spellCheck={false}\n onChange={(e) => props.onPatch({ id: e.target.value })} />\n </FormField>\n <FormField label={t('toolEditor.field.name')}>\n <input className={styles.configInput} aria-label={t('toolEditor.field.nameAria')} value={name} spellCheck={false} placeholder=\"my_tool\"\n onChange={(e) => props.onPatch({ name: e.target.value })} />\n </FormField>\n </span>\n <FormField label={t('toolEditor.field.description')}>\n <textarea className={styles.configTextarea} rows={2} aria-label={t('toolEditor.field.descriptionAria')} value={description} spellCheck={false}\n placeholder={t('toolEditor.field.descriptionPlaceholder')}\n onChange={(e) => props.onPatch({ description: e.target.value })} />\n </FormField>\n <FormField label={t('toolEditor.field.kind')} hint={t('toolEditor.field.kind.hint')}>\n <MenuSelect className={styles.configInput} compact ariaLabel={t('toolEditor.field.kindAria')} value={kind}\n options={KIND_OPTIONS.map((option) => ({ value: option, label: option }))}\n onChange={(value) => patchExecute({ kind: value, ...(value === 'fs' && execute.action === undefined ? { action: 'read' } : {}) })} />\n </FormField>\n {kind === 'shell' && (\n <>\n <FormField label=\"command\" hint={t('toolEditor.field.command.hint')}>\n <textarea className={styles.configTextarea} rows={3} aria-label={t('toolEditor.field.commandAria')} spellCheck={false}\n value={typeof execute.command === 'string' ? execute.command : ''} placeholder=\"Write-Output {{args.x}}\"\n onChange={(e) => patchExecute({ command: e.target.value })} />\n </FormField>\n <FormField label=\"shell\" hint={t('toolEditor.field.shell.hint')}>\n <MenuSelect className={styles.configInput} compact ariaLabel=\"shell\"\n value={typeof execute.shell === 'string' ? execute.shell : 'pwsh'}\n options={SHELLS.map((shell) => ({ value: shell, label: shell }))}\n onChange={(value) => patchExecute({ shell: value })} />\n </FormField>\n </>\n )}\n {kind === 'http' && (\n <>\n <FormField label=\"url\" hint={t('toolEditor.field.url.hint')}>\n <input className={styles.configInput} aria-label={t('toolEditor.field.urlAria')} spellCheck={false}\n value={typeof execute.url === 'string' ? execute.url : ''} placeholder=\"https://…/{{args.q}}\"\n onChange={(e) => patchExecute({ url: e.target.value })} />\n </FormField>\n <FormField label=\"method\">\n <MenuSelect className={styles.configInput} compact ariaLabel={t('toolEditor.field.methodAria')}\n value={typeof execute.method === 'string' ? execute.method : 'GET'}\n options={HTTP_METHODS.map((method) => ({ value: method, label: method }))}\n onChange={(value) => patchExecute({ method: value })} />\n </FormField>\n </>\n )}\n {kind === 'delegate' && (\n <FormField label={t('toolEditor.field.delegate')} hint={t('toolEditor.field.delegate.hint', { names: BUILTIN_TOOL_NAMES.join(' / ') })}>\n <input className={styles.configInput} aria-label={t('toolEditor.field.delegateAria')} spellCheck={false}\n value={typeof execute.tool === 'string' ? execute.tool : ''} placeholder=\"world_book_upsert\"\n onChange={(e) => patchExecute({ tool: e.target.value })} />\n </FormField>\n )}\n {kind === 'fs' && (\n <>\n <FormField label=\"action\">\n <MenuSelect className={styles.configInput} compact ariaLabel={t('toolEditor.field.fsActionAria')}\n value={typeof execute.action === 'string' && (FS_ACTIONS as readonly string[]).includes(execute.action) ? execute.action : 'read'}\n options={FS_ACTIONS.map((action) => ({ value: action, label: action }))}\n onChange={(value) => patchExecute({ action: value })} />\n </FormField>\n <FormField label=\"path\" hint={t('toolEditor.field.path.hint')}>\n <input className={styles.configInput} aria-label={t('toolEditor.field.pathAria')} spellCheck={false}\n value={typeof execute.path === 'string' ? execute.path : ''} placeholder=\"data/{{args.name}}.json\"\n onChange={(e) => patchExecute({ path: e.target.value })} />\n </FormField>\n {(execute.action === 'write' || execute.action === 'append' || String(execute.action).includes('{{args.')) && (\n <FormField label=\"content\" hint={t('toolEditor.field.content.hint')}>\n <textarea className={styles.configTextarea} rows={4} aria-label={t('toolEditor.field.contentAria')} spellCheck={false}\n value={typeof execute.content === 'string' ? execute.content : ''}\n onChange={(event) => patchExecute({ content: event.target.value })} />\n </FormField>\n )}\n </>\n )}\n {kind === 'ask-user' && (\n <FormField label={t('toolEditor.field.question')}>\n <input className={styles.configInput} aria-label={t('toolEditor.field.questionAria')} spellCheck={false}\n value={typeof execute.question === 'string' ? execute.question : ''} placeholder={t('toolEditor.field.questionPlaceholder')}\n onChange={(e) => patchExecute({ question: e.target.value })} />\n </FormField>\n )}\n <ParameterRowsEditor\n t={t}\n value={asRecord(tool.parameters)}\n onChange={(next) => props.onPatch({ parameters: next })}\n />\n <ToolJsonField t={t} drafts={props.fieldDrafts} draftKey={`${id}:parameters`} label={t('toolEditor.json.advanced')} value={asRecord(tool.parameters)} onChange={(parameters) => props.onPatch({ parameters })} />\n <ToolJsonField t={t} drafts={props.fieldDrafts} draftKey={`${id}:output`} label={t('toolEditor.json.output')} value={asRecord(tool.output)} onChange={(output) => props.onPatch({\n output: Object.keys(output).length > 0 ? output : { schema: { type: 'object', additionalProperties: true } },\n })} />\n <FormField label=\"timeoutMs\" hint={t('toolEditor.timeout.hint')}>\n <input className={styles.configInput} type=\"text\" inputMode=\"decimal\" aria-label={t('toolEditor.timeoutAria')}\n aria-invalid={timeoutError.length > 0} aria-describedby={timeoutError ? timeoutErrorId : undefined} value={timeoutDraft ?? String(tool.timeoutMs ?? '')}\n onChange={(event) => { setTimeoutDraft(event.target.value); setTimeoutError(''); props.fieldDrafts?.set(timeoutKey, { source: String(tool.timeoutMs ?? ''), text: event.target.value, error: '' }) }}\n onBlur={() => {\n if (timeoutDraft === undefined) return\n const timeoutMs = timeoutDraft.trim() === '' ? undefined : Number(timeoutDraft)\n if (timeoutMs !== undefined && (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0 || timeoutMs > 2_147_483_647)) {\n const error = t('toolEditor.timeout.invalid')\n setTimeoutError(error)\n props.fieldDrafts?.set(timeoutKey, { source: String(tool.timeoutMs ?? ''), text: timeoutDraft, error })\n return\n }\n props.onPatch({ timeoutMs })\n props.fieldDrafts?.delete(timeoutKey)\n setTimeoutDraft(undefined)\n }} />\n {timeoutError && <small id={timeoutErrorId} role=\"alert\">{timeoutError}</small>}\n </FormField>\n </fieldset>\n )}\n </div>\n </article>\n )\n}\n","/** 工具管理(tool-pipeline 层):自定义工具定义。 */\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { Button } from '@deepseek-ai/dsh-client-ui-primitives'\nimport { bridgeCall } from '../../data/bridge-client.ts'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport type { ToolsEditorDraft, WorkspaceDrafts } from '../../data/workspace-drafts.ts'\nimport { CustomToolCard, asRecord, type ToolDraft } from './CustomToolEditor.tsx'\nimport sharedCss from '../../ui/controls.module.css'\nimport featureCss from './tools.module.css'\n\nconst styles = { ...sharedCss, ...featureCss }\n\n/** 所属层按钮直接提交的创建请求;草稿由常驻页面立即建立。 */\nexport type ToolCreateIntent = { kind: 'blank' | 'template'; spec?: ToolDraft; presetId?: string }\n\n/** 工具草稿与保存由常驻页面持有;设置区只渲染同一份编辑内容。 */\nexport function useCustomToolsEditor(props: {\n t: PromptToolTranslate\n onNotice: (kind: 'ok' | 'error', message: string) => void\n disabled?: boolean\n presetId?: string\n drafts?: WorkspaceDrafts\n onChooseTemplate?: (anchor: HTMLButtonElement) => void\n}): { createTool: (intent: ToolCreateIntent) => void; content: ReactNode } {\n const { t } = props\n const editor = useMemo((): ToolsEditorDraft => {\n const key = props.presetId ?? ''\n const retained = props.drafts?.tools.get(key)\n if (retained !== undefined) return retained\n const next: ToolsEditorDraft = { tools: [], saved: [], expanded: new Set(), fields: new Map(), loaded: false, error: '', saving: false }\n props.drafts?.tools.set(key, next)\n return next\n }, [props.drafts, props.presetId])\n const [tools, renderTools] = useState<ToolDraft[]>(editor.tools)\n const setTools = (next: ToolDraft[]): void => { editor.tools = next; renderTools(next) }\n const [expandedCards, renderExpanded] = useState(editor.expanded)\n const setExpandedCards = (next: Set<number>): void => { editor.expanded = next; renderExpanded(next) }\n const [hasPersistedTools, setHasPersistedTools] = useState(editor.saved.length > 0)\n const [saving, setSaving] = useState(false)\n const [loading, setLoading] = useState(!editor.loaded)\n const [loadError, setLoadError] = useState(editor.error)\n const [revision, setRevision] = useState(0)\n const disabled = props.disabled === true || loading || loadError.length > 0\n const activeEditor = useRef<ToolsEditorDraft | null>(editor)\n useEffect(() => {\n let active = true\n activeEditor.current = editor\n const refresh = (): void => {\n renderTools(editor.tools)\n renderExpanded(editor.expanded)\n setHasPersistedTools(editor.saved.length > 0)\n setSaving(editor.saving)\n }\n editor.refresh = refresh\n refresh()\n const cleanup = (): void => {\n active = false\n activeEditor.current = null\n if (editor.refresh === refresh) editor.refresh = undefined\n }\n const dirty = JSON.stringify(editor.tools) !== JSON.stringify(editor.saved)\n || [...editor.fields.values()].some((field) => field.text !== field.source || !!field.error)\n if (editor.loaded && (dirty || editor.saving) && revision === 0) {\n setLoading(false)\n setLoadError(editor.error)\n return cleanup\n }\n setLoading(!editor.loaded)\n setLoadError('')\n const readingTools = editor.tools\n void (async () => {\n const customResult = await bridgeCall('customTools', { expectedPresetId: props.presetId })\n if (!active) return\n if (!customResult.ok) {\n editor.error = customResult.message ?? t('customTools.loadFailed')\n setLoadError(editor.error)\n setLoading(false)\n return\n }\n if (dirty || editor.tools !== readingTools || [...editor.fields.values()].some((field) => field.text !== field.source || !!field.error)) {\n editor.error = ''\n setLoadError('')\n setLoading(false)\n return\n }\n const loadedTools = (customResult.ok ? customResult.value?.customTools ?? [] : []).map((tool) => asRecord(tool))\n setTools(loadedTools)\n editor.saved = loadedTools\n editor.loaded = true\n editor.error = ''\n setHasPersistedTools(loadedTools.length > 0)\n setLoading(false)\n })()\n return cleanup\n }, [editor, revision])\n const updateTools = (next: ToolDraft[]): void => {\n if (!disabled) setTools(next)\n }\n const save = (): void => {\n if (disabled || editor.saving) return\n if ([...editor.fields.values()].some((field) => field.error || field.text !== field.source)) {\n props.onNotice('error', t('customTools.invalidDraft'))\n return\n }\n // 保存前清理:工具 parameters 的空 key 待编辑行(与 presetVariables 保存端清理对齐)。\n const cleanTools = tools.map((tool) => {\n const params = asRecord(tool.parameters)\n const clean: ToolDraft = {}\n for (const [key, value] of Object.entries(params)) {\n if (key.trim().length === 0) continue\n clean[key] = value\n }\n const next = { ...tool }\n if (Object.keys(clean).length > 0) next.parameters = clean\n else delete next.parameters\n return next\n })\n setSaving(true)\n editor.saving = true\n void bridgeCall('customTools', { customTools: cleanTools, expectedPresetId: props.presetId }).then((customResult) => {\n editor.saving = false\n if (customResult.ok) editor.saved = tools\n editor.refresh?.()\n if (activeEditor.current !== editor) return\n setSaving(false)\n if (customResult.ok) {\n setHasPersistedTools(cleanTools.length > 0)\n props.onNotice('ok', t('customTools.saved', { count: cleanTools.length }))\n } else {\n props.onNotice('error', ('message' in customResult ? customResult.message : undefined) ?? t('customTools.saveFailed'))\n }\n })\n }\n const patchTool = (index: number, patch: Partial<ToolDraft>): void => {\n const previousId = String(tools[index]?.id ?? index)\n if (patch.id !== undefined && String(patch.id) !== previousId) {\n const prefix = `${previousId}:`\n const previousFields = [...editor.fields] // 重命名会向Map写入,必须遍历快照以免再次遍历新键。\n for (const [key, field] of previousFields) if (key.startsWith(prefix)) {\n editor.fields.set(`${String(patch.id)}:${key.slice(prefix.length)}`, field)\n editor.fields.delete(key)\n }\n }\n updateTools(tools.map((tool, at) => at === index ? { ...tool, ...patch } : tool))\n }\n const toggleCard = (index: number): void => {\n const next = new Set(expandedCards)\n if (next.has(index)) next.delete(index)\n else next.add(index)\n setExpandedCards(next)\n }\n /** 创建使用草稿当前值,连续点击即使尚未重渲染也不会相互覆盖。 */\n const createTool = (intent: ToolCreateIntent): void => {\n if (intent.presetId !== undefined && intent.presetId !== props.presetId) return\n if (disabled || !editor.loaded) {\n props.onNotice('error', t(props.disabled ? 'customTools.readonly' : editor.error ? 'customTools.loadFailed' : 'customTools.loading'))\n return\n }\n const tools = editor.tools\n if (intent.kind === 'template' && intent.spec !== undefined) {\n const spec = intent.spec\n if (tools.some((tool) => tool.id === spec.id)) {\n props.onNotice('error', t('customTools.duplicateId', { id: String(spec.id) }))\n return\n }\n const clone = JSON.parse(JSON.stringify(spec)) as ToolDraft\n updateTools([...tools, clone])\n setExpandedCards(new Set([...editor.expanded, tools.length]))\n props.onNotice('ok', t('customTools.templateInserted', { id: String(spec.id) }))\n return\n }\n let suffix = 1\n while (tools.some((tool) => tool.id === `tool-${suffix}` || (tool.name ?? tool.id) === (suffix === 1 ? 'my_tool' : `my_tool_${suffix}`))) suffix += 1\n updateTools([...tools, {\n id: `tool-${suffix}`,\n name: suffix === 1 ? 'my_tool' : `my_tool_${suffix}`,\n description: '',\n output: { schema: { type: 'object', additionalProperties: true } },\n execute: { kind: 'shell', command: '' },\n }])\n setExpandedCards(new Set([...editor.expanded, tools.length]))\n }\n return { createTool, content: (\n <section aria-label={t('customTools.aria')}>\n <p className={styles.configFieldHint}>{t('customTools.hint')}</p>\n {props.disabled && <p className={styles.configFieldHint} role=\"status\">{t('customTools.readonly')}</p>}\n {loading && <p className={styles.configFieldHint} role=\"status\">{t('customTools.loading')}</p>}\n {loadError && <p role=\"alert\">{loadError} <button type=\"button\" className={styles.pillButton} onClick={() => setRevision((value) => value + 1)}>{t('customTools.retry')}</button></p>}\n <fieldset className={styles.customToolsFields} aria-label={t('customTools.fieldsAria')}>\n <div className={styles.configActions}>\n <button type=\"button\" className={styles.pillButton} disabled={disabled} onClick={() => createTool({ kind: 'blank', presetId: props.presetId })}>{t('main.newBlankTool')}</button>\n {props.onChooseTemplate !== undefined && <button type=\"button\" className={styles.pillButton} disabled={disabled}\n onClick={(event) => { if (!disabled) props.onChooseTemplate?.(event.currentTarget) }}>{t('main.addToolTemplate')}</button>}\n {(tools.length > 0 || hasPersistedTools) && (\n <Button type=\"button\" variant=\"primary\" size=\"sm\" disabled={disabled || saving} onClick={save}>\n {saving ? t('customTools.saving') : t('customTools.save')}\n </Button>\n )}\n </div>\n {tools.length > 0 && (\n <div className={`${styles.configList} ${styles.customToolList}`}>\n {tools.map((tool, index) => (\n <CustomToolCard\n t={t}\n key={`${String(tool.id ?? '')}-${index}`}\n tool={tool}\n fieldDrafts={editor.fields}\n index={index}\n disabled={disabled}\n expanded={expandedCards.has(index)}\n onToggleExpanded={() => toggleCard(index)}\n onPatch={(patch) => patchTool(index, patch)}\n onToggleEnabled={(enabled) => patchTool(index, { enabled })}\n onMoveUp={() => updateTools(tools.map((item, at) => {\n if (at === index) return tools[index - 1]!\n if (at === index - 1) return tools[index]!\n return item\n }))}\n onMoveDown={() => updateTools(tools.map((item, at) => {\n if (at === index) return tools[index + 1]!\n if (at === index + 1) return tools[index]!\n return item\n }))}\n onDuplicate={() => updateTools([...tools.slice(0, index + 1), {\n ...JSON.parse(JSON.stringify(tool)) as ToolDraft,\n id: `${String(tool.id ?? 'tool')}-copy`,\n }, ...tools.slice(index + 1)])}\n onRemove={() => {\n const prefix = `${String(tool.id ?? index)}:`\n for (const key of editor.fields.keys()) if (key.startsWith(prefix)) editor.fields.delete(key)\n updateTools(tools.filter((_, at) => at !== index))\n }}\n canMoveUp={index > 0}\n canMoveDown={index < tools.length - 1}\n />\n ))}\n </div>\n )}\n </fieldset>\n </section>\n ) }\n}\n\n/** 独立使用时仍由当前组件持有草稿,工作台通过页面钩子持有。 */\nexport function CustomToolsCard(props: Parameters<typeof useCustomToolsEditor>[0]): ReactNode {\n return useCustomToolsEditor(props).content\n}\n","import type { ReactNode } from 'react'\nimport type { FieldDraft } from '../../data/workspace-drafts.ts'\nimport { deepEqual } from '../../data/dirty-state.ts'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport { FormField } from '../../ui/FormField.tsx'\nimport ui from '../../ui/controls.module.css'\n\nexport const asTriggerRecord = (value: unknown): Record<string, unknown> => value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {}\n\n/** 干净字段随外部快照更新;未完成输入仍归用户所有。 */\nexport function triggerJsonText(fields: Map<string, FieldDraft>, key: string, value: unknown): FieldDraft {\n const existing = fields.get(key)\n if (existing !== undefined) {\n if (existing.text !== existing.source || existing.error) return existing\n try { if (deepEqual(JSON.parse(existing.text), value)) return existing } catch { /* 使用当前值 */ }\n }\n const text = JSON.stringify(value, null, 2) ?? '{}'\n return { source: text, text, error: '' }\n}\n\nexport function editTriggerJson(fields: Map<string, FieldDraft>, key: string, value: unknown, text: string, shape: 'object' | 'array', invalid: string, onChange: (value: unknown) => void): void {\n const previous = triggerJsonText(fields, key, value)\n try {\n const parsed: unknown = JSON.parse(text)\n if (shape === 'array' ? !Array.isArray(parsed) : parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) throw new Error(invalid)\n fields.set(key, { source: text, text, error: '' })\n onChange(parsed)\n } catch {\n fields.set(key, { source: previous.source, text, error: invalid })\n }\n}\n\nexport function TriggerJsonField(props: {\n t: PromptToolTranslate; label: string; value: unknown; shape: 'object' | 'array'\n fields: Map<string, FieldDraft>; fieldKey: string; disabled?: boolean\n onChange: (value: unknown) => void; onDraft: () => void\n}): ReactNode {\n const draft = triggerJsonText(props.fields, props.fieldKey, props.value)\n return <FormField label={props.label} error={draft.error}>\n <textarea className={ui.configTextarea} aria-label={props.label} rows={8} spellCheck={false} readOnly={props.disabled}\n value={draft.text} onChange={(event) => {\n if (props.disabled) return\n editTriggerJson(props.fields, props.fieldKey, props.value, event.target.value, props.shape, props.t('triggers.invalidJson'), props.onChange)\n props.onDraft()\n }} />\n </FormField>\n}\n","/** 判断与执行声明编辑文案;引擎标识仍按协议原文显示。 */\nexport const TRIGGERS_ZH = {\n 'triggers.selectedRule': '当前规则',\n 'triggers.structured': '可视编辑',\n 'triggers.open': '编辑行为规则',\n 'triggers.backToSettings': '返回本层参数',\n 'triggers.label.text': '文本',\n 'triggers.label.phase': '阶段',\n 'triggers.label.source': '消息来源',\n 'triggers.label.count': '事件计数',\n 'triggers.label.names': '名称名单',\n 'triggers.label.session': '会话状态',\n 'triggers.label.preset': '当前预设',\n 'triggers.label.any': '任意条件满足',\n 'triggers.label.all': '全部条件满足',\n 'triggers.label.not': '条件不满足',\n 'triggers.label.notAny': '所有条件不满足',\n 'triggers.label.inject-text': '注入文本',\n 'triggers.label.assembly': '调整装配',\n 'triggers.label.decision': '工具裁决',\n 'triggers.label.append-context': '追加上下文',\n 'triggers.label.guard': '执行防护',\n 'triggers.label.sdk-strip': '裁剪工具声明',\n 'triggers.label.request-params': '请求参数',\n 'triggers.label.inbox-prepend': '前置收件消息',\n 'triggers.label.pre-step-filter': '过滤注入消息',\n 'triggers.label.default': '默认位置',\n 'triggers.label.outermost': '最外层',\n 'triggers.label.subject': '匹配对象',\n 'triggers.label.keys': '关键词',\n 'triggers.label.promoted': '已晋升',\n 'triggers.label.kind': '来源类型',\n 'triggers.label.of': '统计事件',\n 'triggers.label.per': '计数窗口',\n 'triggers.label.min': '最小次数',\n 'triggers.label.max': '最大次数',\n 'triggers.label.allow': '允许名单',\n 'triggers.label.deny': '拒绝名单',\n 'triggers.label.type': '事件类型',\n 'triggers.label.present': '事件已存在',\n 'triggers.label.presetId': '预设标识',\n 'triggers.label.config': '提示词配置',\n 'triggers.label.id': '标识',\n 'triggers.label.layer': '插入点',\n 'triggers.label.modelScope': '模型范围',\n 'triggers.label.target': '目标',\n 'triggers.label.sections': '系统段',\n 'triggers.label.add': '添加',\n 'triggers.label.mode': '执行方式',\n 'triggers.label.mask': '工具过滤',\n 'triggers.label.reason': '拒绝原因',\n 'triggers.label.patch': '参数覆盖',\n 'triggers.label.maxTokens': '输出上限',\n 'triggers.label.blockPlugins': '屏蔽来源',\n 'triggers.label.channelOrder': '通道内顺序',\n 'triggers.title': '判断 → 执行',\n 'triggers.hint': '为当前预设定义何时判断、满足什么条件、执行什么动作。主会话与子代理共享这些规则,受众由规则自身决定。',\n 'triggers.count': '{count} 条规则',\n 'triggers.empty': '还没有行为规则。选择一个动作作为起点,再按需添加条件。',\n 'triggers.create': '新建规则',\n 'triggers.duplicate': '复制规则',\n 'triggers.delete': '删除规则',\n 'triggers.deleteHint': '删除 {id} 的草稿;保存后才从预设移除。',\n 'triggers.discard': '放弃本地修改',\n 'triggers.discardHint': '放弃未保存的规则和字段输入;存在远端冲突时改用已读取的远端规则。',\n 'triggers.cancel': '取消',\n 'triggers.reload': '重新读取',\n 'triggers.validate': '校验规则',\n 'triggers.save': '保存规则',\n 'triggers.saved': '规则已保存',\n 'triggers.validated': '规则校验通过,尚未保存',\n 'triggers.dirty': '有未保存修改',\n 'triggers.clean': '已与预设同步',\n 'triggers.loading': '正在读取规则…',\n 'triggers.saving': '正在保存…',\n 'triggers.failed': '规则操作失败,请重新读取或重试。',\n 'triggers.conflict': '预设已发生变化。本地输入已保留,请重新读取;规则本身存在冲突时不会自动覆盖。',\n 'triggers.remoteConflict': '磁盘中的规则也已修改。本地草稿已保留;可复制高级声明备份,再放弃本地修改以读取远端版本。',\n 'triggers.invalidJson': '请输入有效的 JSON 对象或数组,并与此字段的结构一致。',\n 'triggers.fixDrafts': '请先修正未完成的字段;其原始输入已保留。',\n 'triggers.advanced': '完整声明 · JSON',\n 'triggers.id': '规则标识',\n 'triggers.when': '判断条件',\n 'triggers.unconditional': '无条件',\n 'triggers.conditionType': '条件类型',\n 'triggers.conditionJson': '完整判断条件',\n 'triggers.action': '执行动作',\n 'triggers.actionType': '动作类型',\n 'triggers.actionJson': '完整动作参数',\n 'triggers.multiActions': '动作序列 · JSON',\n 'triggers.channel': '执行通道',\n 'triggers.phase': '执行阶段',\n 'triggers.order': '通道内顺序',\n 'triggers.waterfall': '通道注册位置',\n 'triggers.unsupportedWhen': '此动作不支持顶层判断条件。请在动作自身支持的配置中限制作用范围;已有条件须手动移除。',\n 'triggers.removeWhen': '移除顶层条件',\n 'triggers.complex': '嵌套条件与多动作使用 JSON 编辑,保存前由引擎完整校验。',\n 'triggers.executionHint': '动作类型会填入默认执行点。修改动作内部的 phase、mode 或 layer 后,请同步核对通道与阶段;校验会拒绝不一致配置。',\n 'triggers.parameter': '参数 · {name}',\n 'triggers.number': '请输入有限数值。',\n 'triggers.listHint': '每行一个值,空白表示空列表。',\n} as const\n\nexport const TRIGGERS_EN: Record<keyof typeof TRIGGERS_ZH, string> = {\n 'triggers.selectedRule': 'Selected rule',\n 'triggers.structured': 'Visual editor',\n 'triggers.open': 'Edit behavior rules',\n 'triggers.backToSettings': 'Back to layer parameters',\n 'triggers.label.text': 'Text',\n 'triggers.label.phase': 'Phase',\n 'triggers.label.source': 'Message source',\n 'triggers.label.count': 'Event count',\n 'triggers.label.names': 'Name list',\n 'triggers.label.session': 'Session state',\n 'triggers.label.preset': 'Current preset',\n 'triggers.label.any': 'Any condition matches',\n 'triggers.label.all': 'All conditions match',\n 'triggers.label.not': 'Condition does not match',\n 'triggers.label.notAny': 'No conditions match',\n 'triggers.label.inject-text': 'Inject text',\n 'triggers.label.assembly': 'Adjust assembly',\n 'triggers.label.decision': 'Tool decision',\n 'triggers.label.append-context': 'Append context',\n 'triggers.label.guard': 'Execution guard',\n 'triggers.label.sdk-strip': 'Strip tool declarations',\n 'triggers.label.request-params': 'Request parameters',\n 'triggers.label.inbox-prepend': 'Prepend inbox message',\n 'triggers.label.pre-step-filter': 'Filter injected messages',\n 'triggers.label.default': 'Default position',\n 'triggers.label.outermost': 'Outermost',\n 'triggers.label.subject': 'Match subject',\n 'triggers.label.keys': 'Keywords',\n 'triggers.label.promoted': 'Promoted',\n 'triggers.label.kind': 'Source kind',\n 'triggers.label.of': 'Counted event',\n 'triggers.label.per': 'Count window',\n 'triggers.label.min': 'Minimum count',\n 'triggers.label.max': 'Maximum count',\n 'triggers.label.allow': 'Allowed names',\n 'triggers.label.deny': 'Denied names',\n 'triggers.label.type': 'Event type',\n 'triggers.label.present': 'Event present',\n 'triggers.label.presetId': 'Preset ID',\n 'triggers.label.config': 'Prompt configuration',\n 'triggers.label.id': 'Identifier',\n 'triggers.label.layer': 'Insertion point',\n 'triggers.label.modelScope': 'Model scope',\n 'triggers.label.target': 'Target',\n 'triggers.label.sections': 'System sections',\n 'triggers.label.add': 'Add',\n 'triggers.label.mode': 'Execution mode',\n 'triggers.label.mask': 'Tool filter',\n 'triggers.label.reason': 'Denial reason',\n 'triggers.label.patch': 'Parameter overrides',\n 'triggers.label.maxTokens': 'Output limit',\n 'triggers.label.blockPlugins': 'Blocked sources',\n 'triggers.label.channelOrder': 'Order within channel',\n 'triggers.title': 'Condition → Action',\n 'triggers.hint': 'Define when to evaluate, what to match, and what to do for this preset. Main and delegated sessions share these rules; each rule defines its audience.',\n 'triggers.count': '{count} rules',\n 'triggers.empty': 'No behavior rules yet. Choose an action, then add conditions as needed.',\n 'triggers.create': 'New rule',\n 'triggers.duplicate': 'Duplicate rule',\n 'triggers.delete': 'Delete rule',\n 'triggers.deleteHint': 'Remove draft {id}; the preset changes only after saving.',\n 'triggers.discard': 'Discard local changes',\n 'triggers.discardHint': 'Discard unsaved rules and field input. If a remote conflict exists, use the remote rules already loaded.',\n 'triggers.cancel': 'Cancel',\n 'triggers.reload': 'Reload',\n 'triggers.validate': 'Validate rules',\n 'triggers.save': 'Save rules',\n 'triggers.saved': 'Rules saved',\n 'triggers.validated': 'Rules validated; not saved yet',\n 'triggers.dirty': 'Unsaved changes',\n 'triggers.clean': 'Synced with preset',\n 'triggers.loading': 'Loading rules…',\n 'triggers.saving': 'Saving…',\n 'triggers.failed': 'Rule operation failed. Reload or retry.',\n 'triggers.conflict': 'The preset changed. Your input is preserved. Reload to compare; conflicting rules will not be overwritten automatically.',\n 'triggers.remoteConflict': 'The rules on disk also changed. Your draft is preserved. Copy the advanced declaration as a backup, then discard local changes to use the remote version.',\n 'triggers.invalidJson': 'Enter a valid JSON object or array matching this field’s structure.',\n 'triggers.fixDrafts': 'Correct unfinished fields first; their original input is preserved.',\n 'triggers.advanced': 'Full declaration · JSON',\n 'triggers.id': 'Rule ID',\n 'triggers.when': 'Condition',\n 'triggers.unconditional': 'Unconditional',\n 'triggers.conditionType': 'Condition type',\n 'triggers.conditionJson': 'Full condition',\n 'triggers.action': 'Action',\n 'triggers.actionType': 'Action type',\n 'triggers.actionJson': 'Full action parameters',\n 'triggers.multiActions': 'Action sequence · JSON',\n 'triggers.channel': 'Execution channel',\n 'triggers.phase': 'Execution phase',\n 'triggers.order': 'Channel order',\n 'triggers.waterfall': 'Registration position',\n 'triggers.unsupportedWhen': 'This action does not support a top-level condition. Limit its scope using supported action options; remove any existing condition explicitly.',\n 'triggers.removeWhen': 'Remove top-level condition',\n 'triggers.complex': 'Edit nested conditions and multiple actions as JSON. The engine validates the full declaration before saving.',\n 'triggers.executionHint': 'Choosing an action fills its default execution point. After changing its phase, mode, or layer, check the channel and phase; validation rejects mismatches.',\n 'triggers.parameter': 'Parameter · {name}',\n 'triggers.number': 'Enter a finite number.',\n 'triggers.listHint': 'One value per line; leave blank for an empty list.',\n}\n","import type { PromptToolLocaleKey, PromptToolTranslate } from '../../locales.ts'\nimport { TRIGGERS_ZH } from '../../locales-triggers.ts'\n\n/** 内部协议名只作未知扩展的兜底;已知选项以本地化名称呈现。 */\nexport function triggerLabel(t: PromptToolTranslate, name: string): string {\n const key = `triggers.label.${name}` as PromptToolLocaleKey\n return Object.hasOwn(TRIGGERS_ZH, key) ? t(key) : name\n}\n","import type { ReactNode } from 'react'\nimport type { TriggerEditorMeta } from '../../../shared/bridge-contract.ts'\nimport type { FieldDraft } from '../../data/workspace-drafts.ts'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport { FormField } from '../../ui/FormField.tsx'\nimport { MenuSelect } from '../../ui/MenuSelect.tsx'\nimport { asTriggerRecord, TriggerJsonField } from './TriggerJsonField.tsx'\nimport { triggerLabel } from './trigger-labels.ts'\nimport ui from '../../ui/controls.module.css'\nimport css from './triggers.module.css'\n\ninterface ParameterProps {\n t: PromptToolTranslate; value: Record<string, unknown>; example: Record<string, unknown>\n fields: Map<string, FieldDraft>; fieldKey: string; disabled?: boolean\n omit?: string[]; depth?: number\n onChange: (value: Record<string, unknown>) => void; onDraft: () => void\n}\n\n/** 示例提供常用字段,已有扩展字段仍可编辑;最终合法值由服务端编译器决定。 */\nexport function TriggerParameterFields(props: ParameterProps): ReactNode {\n return Object.entries({ ...props.example, ...props.value }).map(([key, value]) => {\n if (props.omit?.includes(key)) return null\n const fieldKey = `${props.fieldKey}:${key}`\n const label = triggerLabel(props.t, key)\n const patch = (next: unknown): void => props.onChange({ ...props.value, [key]: next })\n if (value !== null && typeof value === 'object' && !Array.isArray(value)) {\n if ((props.depth ?? 0) >= 2) return <TriggerJsonField key={key} {...props} value={value} shape=\"object\" fieldKey={fieldKey} label={label} onChange={patch} />\n return <fieldset key={key} className={css.fieldset}><legend>{label}</legend>\n <TriggerParameterFields {...props} omit={undefined} depth={(props.depth ?? 0) + 1} fieldKey={fieldKey} example={asTriggerRecord(props.example[key])} value={asTriggerRecord(props.value[key])} onChange={patch} />\n </fieldset>\n }\n if (Array.isArray(value) && !value.every((item) => typeof item === 'string')) {\n return <TriggerJsonField key={key} {...props} value={value} shape=\"array\" fieldKey={fieldKey} label={label} onChange={patch} />\n }\n if (typeof value === 'number') {\n const stored = props.fields.get(fieldKey)\n const field = stored !== undefined && (stored.error || stored.text !== stored.source || Number(stored.text) === value) ? stored : undefined\n return <FormField key={key} label={label} error={field?.error}>\n <input className={ui.configInput} aria-label={label} inputMode=\"decimal\" readOnly={props.disabled} value={field?.text ?? String(value)} onChange={(event) => {\n if (props.disabled) return\n const text = event.target.value\n const valid = text.trim().length > 0 && Number.isFinite(Number(text))\n props.fields.set(fieldKey, { source: valid ? text : String(value), text, error: valid ? '' : props.t('triggers.number') })\n if (valid) patch(Number(text))\n props.onDraft()\n }} />\n </FormField>\n }\n if (typeof value === 'boolean') return <FormField key={key} label={label}>\n <input type=\"checkbox\" aria-label={label} checked={value} disabled={props.disabled} onChange={(event) => patch(event.target.checked)} />\n </FormField>\n if (Array.isArray(value)) return <FormField key={key} label={label} hint={props.t('triggers.listHint')}>\n <textarea className={ui.configTextarea} aria-label={label} rows={2} readOnly={props.disabled} value={value.join('\\n')}\n onChange={(event) => patch(event.target.value === '' ? [] : event.target.value.split('\\n'))} />\n </FormField>\n return <FormField key={key} label={label}>\n <textarea className={ui.configTextarea} aria-label={label} rows={key === 'text' ? 3 : 1} readOnly={props.disabled} value={String(value ?? '')} onChange={(event) => patch(event.target.value)} />\n </FormField>\n })\n}\n\nexport function replaceTriggerAction(rule: Record<string, unknown>, action: TriggerEditorMeta['actions'][number]): Record<string, unknown> {\n return { ...rule, channel: action.channel, phase: action.phase, do: structuredClone(action.example) }\n}\n\nexport interface TriggerRuleFieldsProps extends Omit<ParameterProps, 'value' | 'example'> {\n rule: Record<string, unknown>\n meta: TriggerEditorMeta\n}\n\nexport function TriggerRuleFields(props: TriggerRuleFieldsProps): ReactNode {\n const { rule, meta, t } = props\n const multi = Array.isArray(rule.do)\n const actions = multi ? rule.do as unknown[] : [rule.do]\n const action = asTriggerRecord(actions[0])\n const entry = meta.actions.find(({ kind }) => kind === action.kind)\n const unsupported = actions.some((item) => meta.actions.find(({ kind }) => kind === asTriggerRecord(item).kind)?.supportsWhen === false)\n const condition = asTriggerRecord(rule.when)\n const conditionKind = Object.keys(condition)[0] ?? ''\n const conditionEntry = meta.predicates.find(({ kind }) => kind === conditionKind)\n const patch = (next: Record<string, unknown>): void => props.onChange({ ...rule, ...next })\n const removeCondition = (): void => { const next = { ...rule }; delete next.when; props.onChange(next) }\n const clearDrafts = (suffix: string, keepJson = false): void => {\n for (const key of props.fields.keys()) if (key.startsWith(`${props.fieldKey}:${suffix}`) && (!keepJson || key !== `${props.fieldKey}:${suffix}:json`)) props.fields.delete(key)\n }\n const selectOptions = (entries: Array<{ kind: string }>, current: string) => [\n ...entries.map(({ kind }) => ({ value: kind, label: triggerLabel(t, kind) })),\n ...(current !== '' && !entries.some(({ kind }) => kind === current) ? [{ value: current, label: current }] : []),\n ]\n const base = { t, fields: props.fields, disabled: props.disabled, onDraft: props.onDraft }\n return <div data-trigger-fields>\n <fieldset className={css.fieldset}><legend>{t('triggers.when')}</legend>\n {unsupported && <p role=\"note\">{t('triggers.unsupportedWhen')}</p>}\n <FormField label={t('triggers.conditionType')}>\n <MenuSelect ariaLabel={t('triggers.conditionType')} value={conditionKind} disabled={props.disabled || unsupported}\n options={[{ value: '', label: t('triggers.unconditional') }, ...selectOptions(meta.predicates, conditionKind)]}\n onChange={(kind) => {\n clearDrafts('when')\n if (kind === '') removeCondition()\n else { const next = meta.predicates.find((item) => item.kind === kind); if (next !== undefined) patch({ when: structuredClone(next.example) }) }\n }} />\n </FormField>\n {unsupported && rule.when != null && <button type=\"button\" className={ui.pillButton} disabled={props.disabled} onClick={() => { clearDrafts('when'); removeCondition() }}>{t('triggers.removeWhen')}</button>}\n {!unsupported && conditionEntry !== undefined && !meta.composites.includes(conditionKind) && <TriggerParameterFields {...base}\n fieldKey={`${props.fieldKey}:when:${conditionKind}`} value={asTriggerRecord(condition[conditionKind])} example={asTriggerRecord(conditionEntry.example[conditionKind])}\n onChange={(next) => patch({ when: { ...condition, [conditionKind]: next } })} />}\n {rule.when != null && <TriggerJsonField {...base} label={t('triggers.conditionJson')} value={rule.when} shape=\"object\" fieldKey={`${props.fieldKey}:when:json`} onChange={(when) => { clearDrafts('when', true); patch({ when }) }} />}\n </fieldset>\n <fieldset className={css.fieldset}><legend>{t('triggers.action')}</legend>\n {multi ? <p>{t('triggers.complex')}</p> : <FormField label={t('triggers.actionType')}>\n <MenuSelect ariaLabel={t('triggers.actionType')} value={String(action.kind ?? '')} disabled={props.disabled}\n options={selectOptions(meta.actions, String(action.kind ?? ''))} onChange={(kind) => {\n const next = meta.actions.find((item) => item.kind === kind)\n if (next !== undefined) { clearDrafts('do'); props.onChange(replaceTriggerAction(rule, next)) }\n }} />\n </FormField>}\n {!multi && <TriggerParameterFields {...base} omit={['kind']} fieldKey={`${props.fieldKey}:do`} value={action} example={entry?.example ?? {}} onChange={(next) => patch({ do: next })} />}\n <TriggerJsonField {...base} label={t(multi ? 'triggers.multiActions' : 'triggers.actionJson')} value={rule.do} shape={multi ? 'array' : 'object'} fieldKey={`${props.fieldKey}:do:json`} onChange={(next) => { clearDrafts('do', true); patch({ do: next }) }} />\n </fieldset>\n <p className={ui.configFieldHint}>{t('triggers.executionHint')}</p>\n <div data-trigger-execution>\n <FormField label={t('triggers.channel')}><input className={ui.configInput} aria-label={t('triggers.channel')} value={String(rule.channel ?? '')} readOnly={props.disabled} onChange={(event) => patch({ channel: event.target.value })} /></FormField>\n <FormField label={t('triggers.phase')}><input className={ui.configInput} aria-label={t('triggers.phase')} value={String(rule.phase ?? '')} readOnly={props.disabled} onChange={(event) => patch({ phase: event.target.value || undefined })} /></FormField>\n <FormField label={t('triggers.waterfall')}><MenuSelect ariaLabel={t('triggers.waterfall')} value={String(rule.waterfallPosition ?? 'default')} disabled={props.disabled}\n options={meta.waterfallPositions.map((value) => ({ value, label: triggerLabel(t, value) }))} onChange={(next) => patch({ waterfallPosition: next })} /></FormField>\n <TriggerParameterFields {...base} value={rule.channelOrder === undefined ? {} : { channelOrder: rule.channelOrder }} example={{ channelOrder: 0 }} fieldKey={props.fieldKey} onChange={(next) => patch(next)} />\n </div>\n </div>\n}\n","import { useEffect, useMemo, useState, useSyncExternalStore, type ReactNode } from 'react'\nimport type { TriggerEditorMeta } from '../../../shared/bridge-contract.ts'\nimport { bridgeCall } from '../../data/bridge-client.ts'\nimport { createTriggerEditor, getTriggerDraft, hasTriggerFieldDrafts, triggerDraftDirty, type TriggerEditor, type TriggerEditorDraft } from '../../data/trigger-drafts.ts'\nimport type { PromptToolStore } from '../../data/use-prompt-tool-store.ts'\nimport { usePromptToolFields } from '../../data/use-prompt-tool-fields.ts'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport { ConfirmDialog } from '../../ui/ConfirmDialog.tsx'\nimport { FormField } from '../../ui/FormField.tsx'\nimport { MenuSelect } from '../../ui/MenuSelect.tsx'\nimport { asTriggerRecord, TriggerJsonField } from './TriggerJsonField.tsx'\nimport { TriggerRuleFields } from './TriggerRuleFields.tsx'\nimport { triggerLabel } from './trigger-labels.ts'\nimport ui from '../../ui/controls.module.css'\nimport css from './triggers.module.css'\n\nexport function newTriggerRule(values: unknown[], action: TriggerEditorMeta['actions'][number], source?: unknown): Record<string, unknown> {\n const ids = new Set(values.map((value) => asTriggerRecord(value).id))\n const prefix = source === undefined ? 'rule' : `${String(asTriggerRecord(source).id ?? 'rule')}-copy`\n let index = 1\n while (ids.has(`${prefix}-${index}`)) index++\n return source === undefined\n ? { id: `${prefix}-${index}`, channel: action.channel, phase: action.phase, do: structuredClone(action.example) }\n : { ...structuredClone(asTriggerRecord(source)), id: `${prefix}-${index}` }\n}\n\n/** 删除只移动对应行的字段键;其他未完成 JSON 输入不能随索引变化丢失。 */\nexport function removeTriggerRule(draft: TriggerEditorDraft, index: number): unknown[] {\n const fields = Array.from(draft.fields)\n for (const [key] of fields) {\n const match = /^rule:(\\d+)(:.*)$/.exec(key)\n if (match === null || Number(match[1]) < index) continue\n draft.fields.delete(key)\n }\n for (const [key, value] of fields) {\n const match = /^rule:(\\d+)(:.*)$/.exec(key)\n if (match === null) continue\n if (Number(match[1]) > index) draft.fields.set(`rule:${Number(match[1]) - 1}${match[2]}`, value)\n }\n return draft.value.filter((_, at) => at !== index)\n}\n\ninterface TriggerRulesListProps {\n draft: TriggerEditorDraft; editor: TriggerEditor; t: PromptToolTranslate; disabled?: boolean; onDraft: () => void\n renderFields?: (rule: Record<string, unknown>, index: number, onChange: (value: Record<string, unknown>) => void) => ReactNode\n}\n\nexport function TriggerRulesList({ draft, editor, t, disabled, onDraft, renderFields }: TriggerRulesListProps): ReactNode {\n const [createKind, setCreateKind] = useState('')\n const [confirm, setConfirm] = useState<number | 'discard'>()\n const [selected, setSelected] = useState(0)\n const [advanced, setAdvanced] = useState(false)\n const [saved, setSaved] = useState(false)\n const actions = draft.meta?.actions ?? []\n const action = actions.find(({ kind }) => kind === createKind) ?? actions[0]\n const dirty = triggerDraftDirty(draft)\n const pending = draft.busy !== undefined\n const blocked = disabled || !draft.loaded\n const patch = (values: unknown[]): void => { setSaved(false); editor.patch(values) }\n const patchRule = (index: number, value: unknown): void => patch(draft.value.map((rule, at) => at === index ? value : rule))\n const error = draft.error === undefined ? undefined : t(draft.remote !== undefined ? 'triggers.remoteConflict' : draft.error.code === 'triggers-conflict' ? 'triggers.conflict' : 'triggers.failed')\n return <section className={ui.section} aria-label={t('triggers.title')} data-trigger-editor aria-busy={pending}>\n <header className={ui.configActions}><h3>{t('triggers.title')}</h3><span>{t('triggers.count', { count: draft.value.length })}</span></header>\n <p className={ui.configFieldHint}>{t('triggers.hint')}</p>\n <div className={ui.configActions}>\n <MenuSelect ariaLabel={t('triggers.actionType')} value={action?.kind ?? ''} options={actions.map(({ kind }) => ({ value: kind, label: triggerLabel(t, kind) }))} disabled={blocked || pending} onChange={setCreateKind} />\n <button type=\"button\" className={ui.pillButton} disabled={blocked || pending || action === undefined} onClick={() => {\n if (action === undefined) return\n setSelected(draft.value.length); patch([...draft.value, newTriggerRule(draft.value, action)])\n }}>{t('triggers.create')}</button>\n <button type=\"button\" className={ui.pillButton} disabled={pending} onClick={() => { setSaved(false); void editor.load() }}>{t('triggers.reload')}</button>\n <button type=\"button\" className={ui.pillButton} disabled={blocked || pending || hasTriggerFieldDrafts(draft) || draft.remote !== undefined} onClick={() => { void editor.submit(true) }}>{t('triggers.validate')}</button>\n <button type=\"button\" className={ui.pillButton} disabled={blocked || pending || !dirty || hasTriggerFieldDrafts(draft) || draft.remote !== undefined} onClick={() => {\n void editor.submit().then((ok) => { if (ok) setSaved(true) })\n }}>{t(draft.busy === 'save' ? 'triggers.saving' : 'triggers.save')}</button>\n {(dirty || draft.remote !== undefined) && <button type=\"button\" className={ui.pillButton} data-danger disabled={pending} onClick={() => setConfirm('discard')}>{t('triggers.discard')}</button>}\n </div>\n {error !== undefined && <div role=\"alert\"><p>{error}</p>{draft.error?.message && <p>{draft.error.message}</p>}</div>}\n {hasTriggerFieldDrafts(draft) && <p role=\"alert\">{t('triggers.fixDrafts')}</p>}\n <p role=\"status\">{t(!draft.loaded ? 'triggers.loading' : dirty ? 'triggers.dirty' : saved ? 'triggers.saved' : draft.validated ? 'triggers.validated' : 'triggers.clean')}</p>\n {draft.loaded && draft.value.length === 0 && <p>{t('triggers.empty')}</p>}\n {draft.value.length > 0 && <FormField label={t('triggers.selectedRule')}><MenuSelect ariaLabel={t('triggers.selectedRule')}\n value={String(Math.min(selected, draft.value.length - 1))} options={draft.value.map((value, index) => ({ value: String(index), label: String(asTriggerRecord(value).id ?? index + 1) }))}\n onChange={(value) => setSelected(Number(value))} /></FormField>}\n {draft.value.flatMap((value, index) => {\n if (index !== Math.min(selected, draft.value.length - 1)) return []\n const rule = asTriggerRecord(value)\n const list = Array.isArray(rule.do) ? rule.do : [rule.do]\n const summary = `${rule.when == null ? t('triggers.unconditional') : Object.keys(asTriggerRecord(rule.when)).map(kind => triggerLabel(t, kind)).join(' + ')} → ${list.map((item) => triggerLabel(t, String(asTriggerRecord(item).kind ?? ''))).join(' + ')}`\n return [<div key={index} className={css.rule} data-trigger-rule={index}>\n <p className={css.summary}>{summary}</p>\n <FormField label={t('triggers.id')}><input className={ui.configInput} aria-label={t('triggers.id')} value={String(rule.id ?? '')} readOnly={blocked} onChange={(event) => patchRule(index, { ...rule, id: event.target.value })} /></FormField>\n <div className={ui.configActions}>\n <button type=\"button\" className={ui.pillButton} aria-pressed={!advanced} onClick={() => setAdvanced(false)}>{t('triggers.structured')}</button>\n <button type=\"button\" className={ui.pillButton} aria-pressed={advanced} onClick={() => setAdvanced(true)}>{t('triggers.advanced')}</button>\n </div>\n <div hidden={advanced}>{renderFields?.(rule, index, (next) => patchRule(index, next))}</div>\n <div hidden={!advanced}>\n <TriggerJsonField t={t} label={t('triggers.advanced')} value={value} shape=\"object\" fields={draft.fields} fieldKey={`rule:${index}:full`} disabled={blocked}\n onChange={(next) => {\n for (const key of draft.fields.keys()) if (key.startsWith(`rule:${index}:`) && key !== `rule:${index}:full`) draft.fields.delete(key)\n patchRule(index, next)\n }} onDraft={onDraft} />\n </div>\n <div className={ui.configActions}>\n <button type=\"button\" className={ui.pillButton} disabled={blocked || pending || action === undefined || hasTriggerFieldDrafts(draft)} onClick={() => {\n if (action !== undefined) { setSelected(draft.value.length); patch([...draft.value, newTriggerRule(draft.value, action, value)]) }\n }}>{t('triggers.duplicate')}</button>\n <button type=\"button\" className={ui.pillButton} data-danger disabled={blocked || pending} onClick={() => setConfirm(index)}>{t('triggers.delete')}</button>\n </div>\n </div>]\n })}\n {confirm !== undefined && <ConfirmDialog title={t(confirm === 'discard' ? 'triggers.discard' : 'triggers.delete')}\n description={t(confirm === 'discard' ? 'triggers.discardHint' : 'triggers.deleteHint', { id: confirm === 'discard' ? '' : String(asTriggerRecord(draft.value[confirm]).id ?? '') })}\n confirmLabel={t(confirm === 'discard' ? 'triggers.discard' : 'triggers.delete')} cancelLabel={t('triggers.cancel')}\n onCancel={() => setConfirm(undefined)} onConfirm={() => { if (confirm === 'discard') editor.discard(); else patch(removeTriggerRule(draft, confirm)); setSaved(false) }} />}\n </section>\n}\n\nexport function TriggerRulesEditor(props: { store: PromptToolStore; t: PromptToolTranslate; renderFields?: TriggerRulesListProps['renderFields'] }): ReactNode {\n const { store, t } = props\n const fields = usePromptToolFields(store, (value) => value)\n const presetId = fields.presetTemplate\n useSyncExternalStore(store.subscribeDrafts, store.getDraftRevision, store.getDraftRevision)\n const draft = getTriggerDraft(store.editorDrafts, presetId)\n const editor = useMemo(() => createTriggerEditor(presetId, draft, {\n request: (body) => bridgeCall('triggers', body), enqueue: store.enqueuePresetTask,\n isCurrent: () => store.getFields().presetTemplate === presetId,\n changed: store.publishDrafts,\n }), [draft, presetId, store])\n useEffect(() => { if (presetId) void editor.load() }, [editor, presetId])\n return <TriggerRulesList draft={draft} editor={editor} t={t} disabled={!fields.writePreset || store.moduleFacts?.editable !== true}\n onDraft={() => { draft.validated = false; store.publishDrafts() }} renderFields={props.renderFields ?? ((rule, index, onChange) => draft.meta && <TriggerRuleFields\n t={t} rule={rule} meta={draft.meta} fields={draft.fields} fieldKey={`rule:${index}`} disabled={!fields.writePreset || store.moduleFacts?.editable !== true}\n onChange={onChange} onDraft={() => { draft.validated = false; store.publishDrafts() }} />)} />\n}\n","/**\n * 九层编辑面的唯一页面级装配入口。\n *\n * 归属来自 shared 契约(`ENGINE_EDITOR_GROUP_MAP` 的 `displayLayer` / `relatedLayers`),\n * 与 host `/meta` 下发的 `editorGroups` 同源;页面只声明受众视图与页面专属编排\n * (创建菜单、模板浮层、指令回调),不再各自手写层名判断。\n *\n * 展示归属只是导航:这里不新增第二份映射,也不改变任何运行时 hook、注册顺序或保存通道。\n */\nimport { useEffect, useRef, useState, type ReactNode } from 'react'\nimport { ENGINE_CAPABILITIES, ENGINE_EDITOR_GROUP_MAP, engineCapability, engineGroupParamKeys, isEditorGroupVisible, isEngineCapabilityPresent } from '../../../../shared/engine-capabilities.ts'\nimport type { PromptConfigDraft } from '../../../prompt-tool-types.ts'\nimport type { PromptToolStore } from '../../../data/use-prompt-tool-store.ts'\nimport type { PromptToolLocaleKey, PromptToolTranslate } from '../../../locales.ts'\nimport { ConfirmDialog } from '../../../ui/ConfirmDialog.tsx'\nimport { EngineParamFields, matchesEditorGroup } from '../../../features/modules/EngineParamFields.tsx'\nimport { EngineCapabilityCreateMenu } from '../../../features/modules/EngineModuleList.tsx'\nimport { ModelRouteModuleCard } from '../../../features/models/ModelRouteCard.tsx'\nimport { PresetPersonaCard } from '../../../features/persona/PresetPersonaCard.tsx'\nimport { DelegationToolsModuleCard } from '../../../features/subagents/DelegationToolsCard.tsx'\nimport { SubagentToolPolicyCard } from '../../../features/subagents/SubagentToolPolicyCard.tsx'\nimport { WorldBookDiagnosticsCard } from '../../../features/prompts/WorldBookDiagnosticsCard.tsx'\nimport { TemplateVariablesModuleCard } from '../../../features/prompts/PromptConfigsEditor.tsx'\nimport { CustomToolsCard } from '../../../features/tools/CustomToolsCard.tsx'\nimport { TriggerRulesEditor } from '../../../features/triggers/TriggerRulesEditor.tsx'\nimport { cssEscapeId, scrollToCreatedCard } from '../../../ui/reveal-card.ts'\nimport ui from '../../../ui/controls.module.css'\nimport css from './layer-settings.module.css'\n\nexport { isEditorGroupVisible }\n\n/** card → 参数分组标题词条:分组标题按 card 派生,不另抄一份参数归属。 */\nconst CARD_LABEL_KEYS: Record<string, PromptToolLocaleKey> = {\n 'persona': 'persona.name',\n 'variables': 'variables.title',\n 'custom-tools': 'customTools.aria',\n 'subagent-tool-policy': 'policy.title',\n 'prompt-defaults': 'modules.group.prompt-defaults',\n 'main-model': 'modules.group.main-model',\n 'subagent-model': 'modules.group.subagent-model',\n 'subagent-tools': 'modules.group.subagent-delegation',\n 'str-replace-editor': 'modules.group.str-replace-editor',\n 'tool-config-engine': 'modules.group.tool-config-engine',\n}\n\n/**\n * 该层在共享契约里拥有扁平参数、且当前确实可编辑的编辑组:\n * 能力组要求真实装配(未装配的能力参数写了不生效,不显示假入口);\n * 专用编辑组(提示词生成默认值等)不依赖模块装配,始终可编辑。\n * 参数键仍由 `ENGINE_PARAM_DEFINITIONS` 给出,这里不另抄键表,也不按层硬编码。\n */\nexport function layerParamCards(store: PromptToolStore, layer: string, exclude: readonly string[] = []): readonly string[] {\n const excluded = new Set(exclude)\n return ENGINE_EDITOR_GROUP_MAP\n .filter((group) => group.displayLayer === layer\n && !excluded.has(group.id)\n // 已有专属编辑器的组(模型路由卡、资产卡)不再进通用分组:同一批字段只留一个编辑入口。\n && !isLayerAsset(group.id)\n && engineGroupParamKeys(group.id).length > 0\n && (engineCapability(group.id) === undefined || isEngineCapabilityPresent(group.id, store.moduleFacts)))\n .map((group) => group.id)\n}\n\n/** 该层已装配的能力(装配事实来自 `store.moduleFacts`,不是前端开关)。 */\nexport function layerAssembledCapabilities(store: PromptToolStore, layer: string): readonly string[] {\n return ENGINE_CAPABILITIES\n .filter(({ id, displayLayer }) => displayLayer === layer && isEngineCapabilityPresent(id, store.moduleFacts))\n .map(({ id }) => id)\n}\n\n/** 该层是否有可编辑的引擎设置:参数组或已装配能力任一存在即为真。 */\nexport function layerHasSettings(store: PromptToolStore, layer: string): boolean {\n return layerParamCards(store, layer).length > 0 || layerAssembledCapabilities(store, layer).length > 0\n}\n\n/** 单个已装配能力:装配状态 + 移除入口(二次确认沿用统一对话框)。 */\nfunction LayerCapabilityRow(props: { store: PromptToolStore; t: PromptToolTranslate; capabilityId: string }): ReactNode {\n const { store, t, capabilityId } = props\n const [confirming, setConfirming] = useState(false)\n const buttonRef = useRef<HTMLButtonElement>(null)\n const editable = store.fields.writePreset && store.moduleFacts?.editable === true\n return (\n <li className={css.capabilityRow} data-layer-capability={capabilityId}>\n <span>{t('modules.layer.capability', { id: capabilityId })}</span>\n {editable && (\n <button ref={buttonRef} type=\"button\" className={ui.pillButton} data-danger aria-label={t('modules.layer.removeTitle', { id: capabilityId })} onClick={() => setConfirming(true)}>\n {t('modules.layer.remove')}\n </button>\n )}\n {confirming && (\n <ConfirmDialog\n title={t('modules.layer.removeTitle', { id: capabilityId })}\n description={t('modules.layer.removeDesc')}\n confirmLabel={t('toolEditor.confirmRemove')}\n cancelLabel={t('toolEditor.cancel')}\n failureMessage={t('card.operationFailed')}\n returnFocusRef={buttonRef}\n onConfirm={async () => { if (!await store.removeEngineCapability(capabilityId)) throw new Error(t('card.operationFailed')) }}\n onCancel={() => setConfirming(false)}\n />\n )}\n </li>\n )\n}\n\n/**\n * 结构化资产编辑器按主归属层渲染(人设、模板变量、模型路由、委派深度、自定义工具、子代理策略):\n * 层归属来自共享契约,不在这里硬编码层名;每个资产复用各自专用编辑器、草稿池与写端点。\n */\nconst LAYER_ASSET_IDS = ['persona', 'variables', 'main-model', 'subagent-model', 'subagent-tools', 'custom-tools', 'subagent-tool-policy'] as const\n\n/** 该组已有专属编辑器(模型路由卡、资产编辑器):参数不再走通用控件渲染,避免同一批字段两遍。 */\nfunction isLayerAsset(id: string): boolean {\n return (LAYER_ASSET_IDS as readonly string[]).includes(id)\n}\n\nfunction layerAssets(layer: string, excluded: readonly string[]): string[] {\n return ENGINE_EDITOR_GROUP_MAP.filter((group) => group.displayLayer === layer\n && !excluded.includes(group.id) && (LAYER_ASSET_IDS as readonly string[]).includes(group.id)).map((group) => group.id)\n}\n\nfunction matchesLayerGroup(id: string, keyword: string, t: PromptToolTranslate): boolean {\n return matchesEditorGroup(id, keyword, t)\n || (CARD_LABEL_KEYS[id] !== undefined && t(CARD_LABEL_KEYS[id]).toLowerCase().includes(keyword))\n}\n\n/**\n * 本层引擎设置内容:参数分组(按共享契约派生)+ 已装配能力的装配状态与移除入口 +\n * 该层归属的结构化资产编辑器。由 `engineLayerSlots` 注入到每张本层实例卡的折叠区\n * 中;无实例时不生成独立卡,同层多处渲染共用同一 `store.fields` 与同一草稿键。\n */\nexport function LayerSettingsContent(props: {\n store: PromptToolStore\n t: PromptToolTranslate\n layer: string\n configId?: string\n excludeCapabilities?: readonly string[]\n toolEditor?: ReactNode\n onCreated?: (capabilityId: string) => void\n keyword?: string\n}): ReactNode {\n const { store, t, layer } = props\n const excluded = props.excludeCapabilities ?? []\n const cards = layerParamCards(store, layer, excluded)\n const capabilities = layerAssembledCapabilities(store, layer).filter((id) => !excluded.includes(id))\n // 同层每张实例卡各渲染一份设置内容:instanceId 带上卡身份,DOM id 才不会互相冲突。\n const instanceId = `layer-${layer}-${props.configId ?? 'standalone'}`\n const canEditPreset = store.fields.writePreset && store.moduleFacts?.editable === true\n const presetId = store.fields.presetTemplate\n const assets = layerAssets(layer, excluded)\n const keyword = (props.keyword ?? '').trim().toLowerCase()\n const matches = (id: string): boolean => matchesLayerGroup(id, keyword, t)\n // 变量折叠保留到草稿池,并由当前设置实例触发渲染。\n const variablesExpandedKey = `${presetId}:layer-variables-${props.configId ?? 'standalone'}`\n const [variablesExpanded, setVariablesExpanded] = useState(() => store.editorDrafts?.expanded.get(variablesExpandedKey) ?? true)\n const [editingRules, setEditingRules] = useState(false)\n if (editingRules) return <div className={css.settings} data-layer-settings-content={layer}>\n <button type=\"button\" className={ui.pillButton} onClick={() => setEditingRules(false)}>{t('triggers.backToSettings')}</button>\n <TriggerRulesEditor store={store} t={t} />\n </div>\n if (cards.length === 0 && capabilities.length === 0 && assets.length === 0) return null\n return (\n <div className={css.settings} data-layer-settings-content={layer}>\n <EngineCapabilityCreateMenu store={store} t={t} layer={layer} excludeCapabilities={excluded} onCreated={props.onCreated} />\n <button type=\"button\" className={ui.pillButton} onClick={() => setEditingRules(true)}>{t('triggers.open')}</button>\n {cards.map((card) => (\n <section key={card} hidden={!matches(card)} className={css.group} data-layer-param-group={card}\n aria-label={t(CARD_LABEL_KEYS[card] ?? 'modules.group.other')}>\n <h4 className={css.groupTitle}>{t(CARD_LABEL_KEYS[card] ?? 'modules.group.other')}</h4>\n <div className={css.paramFields} data-layer-param-fields={card}>\n <EngineParamFields store={store} card={card} t={t} instanceId={`${instanceId}-${card}`} />\n </div>\n </section>\n ))}\n {capabilities.some(matches) && (\n <section className={css.group} data-layer-capabilities={layer} aria-label={t('modules.layer.assembled')}>\n <h4 className={css.groupTitle}>{t('modules.layer.assembled')}</h4>\n <ul className={css.capabilities}>{capabilities.filter(matches).map((id) => <LayerCapabilityRow key={id} store={store} t={t} capabilityId={id} />)}</ul>\n </section>\n )}\n {assets.map((id) => (\n <section key={id} hidden={!matches(id)} className={css.asset} data-layer-asset={id} aria-label={t(CARD_LABEL_KEYS[id] ?? 'modules.layer.asset')}>\n {id === 'persona' && <PresetPersonaCard t={t} presetId={presetId} disabled={!canEditPreset} onNotice={store.showNotice} drafts={store.editorDrafts} />}\n {id === 'variables' && (\n <TemplateVariablesModuleCard\n t={t}\n templateVariables={store.templateVariables}\n setTemplateVariables={store.setTemplateVariables}\n templateVariablesEnabled={store.templateVariablesEnabled}\n setTemplateVariablesEnabled={store.setTemplateVariablesEnabled}\n saveTemplateVariables={store.saveTemplateVariables}\n expanded={variablesExpanded}\n disabled={!canEditPreset}\n onToggleExpanded={() => {\n store.editorDrafts?.expanded.set(variablesExpandedKey, !variablesExpanded)\n setVariablesExpanded(!variablesExpanded)\n }}\n />\n )}\n {id === 'main-model' && <ModelRouteModuleCard store={store} scope=\"main\" />}\n {id === 'subagent-model' && <ModelRouteModuleCard store={store} scope=\"subagent\" />}\n {id === 'subagent-tools' && <DelegationToolsModuleCard store={store} t={t} />}\n {id === 'custom-tools' && (props.toolEditor ?? (\n <CustomToolsCard key={presetId} presetId={presetId} t={t} onNotice={store.showNotice}\n drafts={store.editorDrafts} disabled={!canEditPreset} />\n ))}\n {id === 'subagent-tool-policy' && (\n <SubagentToolPolicyCard key={presetId} presetId={presetId} disabled={!canEditPreset} t={t} onNotice={store.showNotice} drafts={store.editorDrafts} />\n )}\n </section>\n ))}\n </div>\n )\n}\n\n/** 新建能力后的定位:滚动到该层实例卡内的设置折叠区(能力卡已退场,锚点改在设置区)。 */\nfunction LayerSettingsFocus(props: { layer?: string; token: number }): ReactNode {\n const { layer, token } = props\n useEffect(() => {\n if (layer === undefined) return\n return scrollToCreatedCard(`[data-layer-settings=\"${cssEscapeId(layer)}\"]`)\n }, [layer, token])\n return null\n}\n\nexport interface EngineLayerSlots {\n beforeCards: ReactNode\n commonCards: ReactNode\n moduleCards: ReactNode\n /** 本层引擎设置内容,仅由真实实例卡内的设置区承载。 */\n renderLayerSettings: (layer: string, config: PromptConfigDraft) => ReactNode\n /** 该层是否有可编辑设置,控制真实实例卡内的设置区。 */\n hasLayerSettings: (layer: string) => boolean\n matchesLayerSettings: (layer: string, keyword: string) => boolean\n}\n\nexport interface EngineLayerSlotsInput {\n store: PromptToolStore\n t: PromptToolTranslate\n /** 当前层筛选(`all` / `world-book` / 九层之一);过滤只影响展示,不改变保存语义。 */\n viewFilter: string\n /** 统一搜索词:同时过滤配置实例、能力卡、共享设置区与单例卡(只影响展示)。 */\n keyword?: string\n /** 受众视图:主会话与子代理是同源视图,不改 audience,也不隐式启用 includeSubagents。 */\n audience: 'main' | 'subagent'\n /** 新建能力后的定位信号(token 递增;layer 用于滚动到该层实例卡内的设置区)。 */\n focusCapability?: { id: string; token: number; layer?: string }\n /** 自定义工具由常驻页面持有,设置区只渲染。 */\n toolEditor?: ReactNode\n onCreated?: (capabilityId: string) => void\n /** 本页既不创建也不渲染的能力(受众视图差异,如仅主对话生效的能力)。 */\n excludeCapabilities?: readonly string[]\n moduleHint?: string\n moduleEmptyHint?: string\n}\n\n/**\n * 按受众视图装配层内卡片:主归属与 `relatedLayers` 命中的层才显示,\n * 不可见的卡用 `LayerCard` 的 `hidden` 隐藏而不卸载,所以切层不丢草稿、不重跑读取。\n */\nexport function engineLayerSlots(input: EngineLayerSlotsInput): EngineLayerSlots {\n const { store, t, viewFilter, audience } = input\n // 主会话页保留世界书只读诊断卡(策略视图);其余单例卡与资产编辑器都进本层设置区。\n const beforeCards = audience === 'main'\n ? <div hidden={viewFilter !== 'world-book'}><WorldBookDiagnosticsCard store={store} t={t} /></div>\n : null\n const commonCards = null\n const moduleCards = (\n <>\n {/* 独立卡片(能力卡、单例参数卡与资产卡)已全部退场:参数、装配状态、资产编辑器\n 都由本层实例卡内的设置区承载。页面级提示仍在这里渲染,不进工具栏按钮行。 */}\n {input.moduleHint !== undefined && <p className={ui.configFieldHint}>{input.moduleHint}</p>}\n {input.moduleEmptyHint !== undefined && !ENGINE_CAPABILITIES.some(({ id }) => !(input.excludeCapabilities ?? []).includes(id) && isEngineCapabilityPresent(id, store.moduleFacts))\n && <p className={ui.configFieldHint} role=\"status\">{input.moduleEmptyHint}</p>}\n <LayerSettingsFocus layer={input.focusCapability?.layer} token={input.focusCapability?.token ?? 0} />\n </>\n )\n return {\n beforeCards,\n commonCards,\n moduleCards,\n renderLayerSettings: (layer: string, config: PromptConfigDraft) => (\n <LayerSettingsContent\n key={`${store.fields.presetTemplate}:${config.id}`}\n store={store}\n t={t}\n layer={layer}\n configId={config?.id}\n excludeCapabilities={input.excludeCapabilities}\n toolEditor={input.toolEditor}\n onCreated={input.onCreated}\n keyword={input.keyword}\n />\n ),\n hasLayerSettings: (layer: string) => layerParamCards(store, layer, input.excludeCapabilities ?? []).length > 0\n || layerAssembledCapabilities(store, layer).some((id) => !(input.excludeCapabilities ?? []).includes(id))\n || layerAssets(layer, input.excludeCapabilities ?? []).length > 0,\n matchesLayerSettings: (layer, keyword) => [\n ...layerParamCards(store, layer, input.excludeCapabilities ?? []),\n ...layerAssembledCapabilities(store, layer).filter((id) => !(input.excludeCapabilities ?? []).includes(id)),\n ...layerAssets(layer, input.excludeCapabilities ?? []),\n ].some((id) => matchesLayerGroup(id, keyword, t)),\n }\n}\n","/** 内置模板选择浮层:body 顶层 portal,并持续跟随触发按钮。 */\nimport type { ReactNode, RefObject } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Button, useDismissOnOutsidePointer } from '@deepseek-ai/dsh-client-ui-primitives'\nimport type { PromptToolLocaleKey, PromptToolTranslate } from '../locales.ts'\nimport { useAnchoredPopoverStyle } from './anchored-popover.ts'\nimport { useDialogFocus } from './dialog-focus.ts'\nimport styles from './controls.module.css'\nimport type { PromptConfigTemplateEntry } from '../prompt-tool-types.ts'\n\n/** 模板分组标题(模板库按官方批次命名,与配置卡的注入层标签分开)。 */\nconst TEMPLATE_LAYER_LABEL_KEYS: Record<string, PromptToolLocaleKey> = {\n 'pre-step': 'templates.layer.pre-step',\n 'system-section': 'templates.layer.system-section',\n 'runtime-context': 'templates.layer.runtime-context',\n 'agent-request': 'templates.layer.agent-request',\n 'llm-stream': 'templates.layer.llm-stream',\n 'tool-pipeline': 'templates.layer.tool-pipeline',\n 'turn-stop': 'templates.layer.turn-stop',\n 'subagent-start': 'templates.layer.subagent-start',\n 'subagent-end': 'templates.layer.subagent-end',\n}\n\nexport function TemplatePicker(props: {\n t: PromptToolTranslate\n anchorRef: RefObject<HTMLElement | null>\n templates: PromptConfigTemplateEntry[]\n /** 传入 layer 时只显示该层模板(无分组标题);不传按层分组展示全部。 */\n layer?: string\n onPick: (entry: PromptConfigTemplateEntry) => void\n /** 可选:自定义工具模板(「工具」分组;点击经 onPickTool 回调工具定义)。 */\n toolTemplates?: Array<{ file: string; spec: Record<string, unknown> }>\n onPickTool?: (spec: Record<string, unknown>) => void\n /** 可选:「模板变量(Variables)」固定入口——点击不插入配置,由宿主展开模板变量卡片。 */\n onPickVariables?: () => void\n onClose: () => void\n}): ReactNode {\n const { t, anchorRef, templates, layer, onPick, toolTemplates, onPickTool, onPickVariables, onClose } = props\n const layerTitle = (value: string): string => {\n const key = TEMPLATE_LAYER_LABEL_KEYS[value]\n return key === undefined ? value : t(key)\n }\n const { dialogRef, onDialogKeyDown } = useDialogFocus<HTMLDivElement>(true, onClose)\n const portalRef = dialogRef as RefObject<HTMLElement | null>\n const position = useAnchoredPopoverStyle({\n open: true,\n anchorRef,\n panelRef: portalRef,\n gap: 8,\n margin: 12,\n })\n useDismissOnOutsidePointer(anchorRef, true, (open) => { if (!open) onClose() }, portalRef)\n\n const visible = layer === undefined\n ? templates\n : templates.filter((template) => (template.spec.layer ?? 'pre-step') === layer)\n const groups = new Map<string, PromptConfigTemplateEntry[]>()\n for (const template of visible) {\n const key = template.spec.layer ?? 'pre-step'\n const items = groups.get(key)\n if (items === undefined) groups.set(key, [template])\n else items.push(template)\n }\n\n const surface = (\n <div\n ref={dialogRef}\n className={styles.templatePopover}\n style={position ?? { visibility: 'hidden' }}\n role=\"dialog\"\n aria-label={t('templates.aria')}\n onClick={(event) => event.stopPropagation()}\n onKeyDown={onDialogKeyDown}\n >\n <div className={styles.templateModalHead}>\n <strong>{layer !== undefined ? t('templates.title', { layer: layerTitle(layer) }) : t('templates.aria')}</strong>\n <Button variant=\"ghost\" size=\"sm\" className={styles.dialogClose} aria-label={t('templates.closeAria')} onClick={onClose}>×</Button>\n </div>\n <div className={styles.templateModalList}>\n {onPickVariables !== undefined && (\n <div className={styles.templateGroup}>\n <strong className={styles.templateGroupTitle}>{t('templates.group.variables')}</strong>\n <button type=\"button\" className={styles.templateModalItem} onClick={onPickVariables}>\n <strong>Variables</strong>\n <small>{t('templates.variables.hint')}</small>\n </button>\n </div>\n )}\n {visible.length === 0 && (toolTemplates?.length ?? 0) === 0\n && <p className={styles.configFieldHint}>{t('templates.empty')}</p>}\n {[...groups.entries()].map(([groupLayer, items]) => (\n <div key={groupLayer} className={styles.templateGroup}>\n {layer === undefined && <strong className={styles.templateGroupTitle}>{layerTitle(groupLayer)}</strong>}\n {items.map((template) => (\n <button key={template.file} type=\"button\" className={styles.templateModalItem} onClick={() => onPick(template)}>\n <strong>{template.file}</strong>\n <small>{template.spec.name ?? template.spec.id}</small>\n </button>\n ))}\n </div>\n ))}\n {toolTemplates !== undefined && toolTemplates.length > 0 && (\n <div className={styles.templateGroup}>\n <strong className={styles.templateGroupTitle}>{t('templates.group.tools')}</strong>\n {toolTemplates.map((template) => (\n <button key={template.file} type=\"button\" className={styles.templateModalItem}\n onClick={() => onPickTool?.(template.spec)}>\n <strong>{template.file}</strong>\n <small>{String(template.spec.name ?? template.spec.id ?? '')}</small>\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n )\n return typeof document === 'undefined' || document.body === null ? surface : createPortal(surface, document.body)\n}\n","import { memo, useCallback, useState, type ReactNode } from 'react'\nimport type { PromptToolStore } from '../../../data/use-prompt-tool-store.ts'\nimport { usePromptToolFields } from '../../../data/use-prompt-tool-fields.ts'\nimport type { PromptToolTranslate } from '../../../locales.ts'\nimport { PromptConfigsEditor } from '../../../features/prompts/PromptConfigsEditor.tsx'\nimport { useTemplatePicker } from '../../../features/prompts/useTemplatePicker.ts'\nimport { INSERTION_LAYERS, LAYER_LABEL_KEYS, translateLabel } from '../../../features/prompts/prompt-config-policy.ts'\nimport { EngineModuleActions } from '../../../features/modules/EngineModuleList.tsx'\nimport { engineCapability } from '../../../../shared/engine-capabilities.ts'\nimport { engineLayerSlots } from './EngineLayersPanel.tsx'\nimport { TemplatePicker } from '../../../ui/TemplatePicker.tsx'\nimport { useCustomToolsEditor } from '../../../features/tools/CustomToolsCard.tsx'\nimport ui from '../../../ui/controls.module.css'\nimport type { InstructionPolicyFileOverride } from '../../../../shared/instructions.ts'\nimport type { ConfigPageBrowse } from '../workspace-browse-state.ts'\nimport type { WorkspacePage } from '../workspace-pages.ts'\n/** 主会话页:公共配置 + 平铺模块列表 + 合并创建菜单(提示词配置 / 工具 / 能力模块)。 */\nexport const MainSessionPage = memo(function MainSessionPage(props: { store: PromptToolStore; t: PromptToolTranslate; browse?: ConfigPageBrowse; onNavigate?: (page: WorkspacePage) => void }): ReactNode {\n const { store, t } = props\n // L3 selector 化:fields 引用变化才重渲染(父级 loading/notice/page 变化不再级联)。\n const fields = usePromptToolFields(store, (value) => value)\n const [viewFilter, setViewFilter] = useState(props.browse?.viewFilter ?? 'all')\n const changeViewFilter = useCallback((value: string) => {\n if (props.browse !== undefined) props.browse.viewFilter = value\n setViewFilter(value)\n }, [props.browse])\n // 搜索词由页面持有:同一搜索词同时过滤配置实例、层设置区与本层资产。\n const [keyword, setKeyword] = useState(props.browse?.filter ?? '')\n /** 新建能力后的定位信号:token 递增;layer 用于滚动到该层实例卡内的设置区。 */\n const [focusCapability, setFocusCapability] = useState<{ id: string; token: number; layer?: string }>()\n const [createdHidden, setCreatedHidden] = useState(false)\n // 创建后只定位并展开新卡,不改动用户选定的列表筛选。\n const revealCapability = useCallback((id: string) => {\n setCreatedHidden(viewFilter !== 'all')\n // 能力卡已退场:定位锚改到该层实例卡内的设置区(层从共享契约派生)。\n const layer = engineCapability(id)?.displayLayer\n setFocusCapability((current) => ({ id, layer, token: (current?.token ?? 0) + 1 }))\n }, [viewFilter])\n // 稳定回调:卡片 memo 的生效前提(store 引用已稳定)。\n const patchConfigs = useCallback((configs: PromptToolStore['fields']['promptConfigs']) => {\n store.patch({ promptConfigs: configs })\n }, [store])\n const saveConfigs = useCallback((configs: PromptToolStore['fields']['promptConfigs']) => {\n return store.persistConfigs(configs)\n }, [store])\n // 指令文件卡:正文只显式写盘(不随预设 debounce),冲突时用重新读取恢复。\n const saveInstructionFile = useCallback((fileId: string) => {\n void store.persistInstructionFiles([fileId])\n }, [store])\n const reloadInstructionFile = useCallback((fileId: string) => {\n void store.reloadInstructionFile(fileId)\n }, [store])\n // 指令卡行为策略:独立存储,改动按 revision 乐观提交(不写 preset.yml)。\n const patchInstructionPolicy = useCallback((fileId: string, override: InstructionPolicyFileOverride) => {\n void store.updateInstructionPolicy(fileId, override)\n }, [store])\n const canEditPreset = store.fields.writePreset && store.moduleFacts?.editable === true\n // 顶部只提供九层注入模板;其它创建由所属层设置承载。\n // 作用域 = 主会话:新建配置清除模板自带的「仅子代理」限制(缺省 = 公用,两侧都可见)。\n const picker = useTemplatePicker(\n fields.promptConfigs,\n (config) => { if (canEditPreset) patchConfigs([...store.getFields().promptConfigs, config]) },\n store.showNotice,\n t,\n 'main',\n )\n const toolEditor = useCustomToolsEditor({ t, presetId: fields.presetTemplate, disabled: !canEditPreset, drafts: store.editorDrafts, onNotice: store.showNotice, onChooseTemplate: picker.openTools })\n const createItems = INSERTION_LAYERS.map((layer) => ({ id: `tpl:${layer}`, label: t('main.addTemplate', { layer: translateLabel(t, LAYER_LABEL_KEYS, layer) }) }))\n const onCreateSelect = useCallback((id: string) => {\n if (canEditPreset && id.startsWith('tpl:')) picker.openPicker(id.slice(4))\n }, [canEditPreset, picker])\n const insertToolTemplate = useCallback((spec: Record<string, unknown>) => {\n setCreatedHidden(viewFilter !== 'all' && viewFilter !== 'tool-pipeline')\n toolEditor.createTool({ kind: 'template', spec, presetId: fields.presetTemplate })\n picker.closePicker()\n }, [fields.presetTemplate, picker, viewFilter, toolEditor.createTool])\n // 九层归位、层内设置与资产编辑器统一由 EngineLayersPanel 提供:本页只声明受众视图与\n // 页面编排(创建菜单、模板浮层、指令回调),不再自己手写层名判断或注入单例卡。\n const layers = engineLayerSlots({\n store,\n t,\n viewFilter,\n audience: 'main',\n keyword,\n focusCapability,\n onCreated: revealCapability,\n toolEditor: toolEditor.content,\n })\n return (\n <section className={ui.section} aria-label={t('main.aria')}>\n <PromptConfigsEditor\n t={t}\n meta={store.meta}\n configs={fields.promptConfigs}\n browse={props.browse}\n fieldDrafts={store.editorDrafts?.fields}\n draftScope={fields.presetTemplate}\n notice={store.notice}\n noticeKind={store.noticeKind}\n readOnlyReason={!canEditPreset ? t(fields.writePreset ? 'configs.readOnly.system' : 'configs.readOnly.disabled') : undefined}\n onChoosePreset={() => props.onNavigate?.('presets')}\n onCreate={() => picker.openPicker(INSERTION_LAYERS.find((layer) => layer === viewFilter) ?? 'pre-step')}\n createdHidden={createdHidden}\n onShowCreated={() => { changeViewFilter('all'); setCreatedHidden(false) }}\n createdConfigId={picker.createdConfigId}\n onPatchConfigs={patchConfigs}\n onSaveConfigs={saveConfigs}\n onSaveInstructions={store.persistInstructionFiles}\n instructionPolicy={store.instructionPolicy}\n onToggleInstructionSource={store.setInstructionSourceEnabled}\n onSaveInstructionFile={saveInstructionFile}\n onReloadInstructionFile={reloadInstructionFile}\n onPatchInstructionPolicy={patchInstructionPolicy}\n onNotice={store.showNotice}\n viewFilter={viewFilter}\n onViewFilterChange={changeViewFilter}\n keyword={keyword}\n onKeywordChange={setKeyword}\n renderLayerSettings={layers.renderLayerSettings}\n hasLayerSettings={layers.hasLayerSettings}\n matchesLayerSettings={layers.matchesLayerSettings}\n beforeCards={layers.beforeCards}\n commonCards={layers.commonCards}\n toolbarActions={<EngineModuleActions store={store} t={t} anchorRef={picker.anchorRef} extraItems={createItems} templatesOnly onExtraSelect={onCreateSelect} />}\n moduleCards={layers.moduleCards}\n />\n {picker.open && (\n <TemplatePicker\n t={t}\n anchorRef={picker.popoverAnchorRef}\n templates={picker.toolsOnly ? [] : picker.templates}\n layer={picker.layer}\n toolTemplates={picker.layer === undefined ? picker.toolTemplates : undefined}\n onPick={picker.pickTemplate}\n onPickTool={insertToolTemplate}\n onClose={picker.closePicker}\n />\n )}\n </section>\n )\n})\n","import { memo, useCallback, type ReactNode } from 'react'\nimport type { PromptToolStore } from '../../../data/use-prompt-tool-store.ts'\nimport { usePromptToolFields } from '../../../data/use-prompt-tool-fields.ts'\nimport type { PromptToolTranslate } from '../../../locales.ts'\nimport { PromptConfigList, type PromptConfigListProps } from '../../../features/prompts/PromptConfigList.tsx'\nimport type { PromptConfigDraft } from '../../../prompt-tool-types.ts'\nimport type { InstructionPolicyFileOverride } from '../../../../shared/instructions.ts'\n/** 子代理配置列表(按 scope 过滤:subagent 只列子代理可见配置)。\n * 纪律:过滤状态只由用户手动改变;新建只做「展开新卡 + 滚动定位」两件事。\n *\n * 本组件不再提供独立的「新建」按钮:创建入口统一收敛到工具栏的合并菜单\n * (`EngineModuleActions` 的「添加模板 · 层级」/「添加工具模板…」/「添加模板变量」),\n * 避免同一列表出现两个创建入口。 */\nexport const ConfigListWithTemplates = memo(function ConfigListWithTemplates(props: Pick<PromptConfigListProps, 'browse' | 'commonCards' | 'onCreate' | 'onChoosePreset' | 'createdHidden' | 'onShowCreated'> & {\n store: PromptToolStore\n t: PromptToolTranslate\n layer?: string\n scope?: 'main' | 'subagent'\n beforeCards?: ReactNode\n /** 工具栏中的非提示词配置操作(如能力模块创建菜单)。 */\n toolbarActions?: ReactNode\n /** 模块卡(引擎能力、自定义工具):渲染在层级配置卡之前。 */\n moduleCards?: ReactNode\n /** 受控视图过滤(页面持有):不传时列表内部维护。 */\n viewFilter?: string\n onViewFilterChange?: (value: string) => void\n /** 受控搜索词(页面持有):同一搜索词同时过滤配置实例与层内卡片。 */\n keyword?: string\n onKeywordChange?: (value: string) => void\n /** 本层引擎设置内容(页面注入):同层每张实例卡显示同一份值。 */\n renderLayerSettings?: (layer: string, config: PromptConfigDraft) => ReactNode\n /** 该层是否有可编辑设置:决定真实实例卡内是否显示设置区。 */\n hasLayerSettings?: (layer: string) => boolean\n matchesLayerSettings?: (layer: string, keyword: string) => boolean\n /** 与页面合并创建入口使用同一定位信号。 */\n createdConfigId?: string\n}): ReactNode {\n const { store, t, layer, scope, beforeCards, toolbarActions, moduleCards, viewFilter, onViewFilterChange, keyword, onKeywordChange, renderLayerSettings, hasLayerSettings, createdConfigId } = props\n const fields = usePromptToolFields(store, (value) => value)\n // 稳定回调:卡片 memo 的生效前提(store 引用已稳定)。\n const patchConfigs = useCallback((configs: PromptToolStore['fields']['promptConfigs']) => {\n store.patch({ promptConfigs: configs })\n }, [store])\n const saveConfigs = useCallback((configs: PromptToolStore['fields']['promptConfigs']) => {\n return store.persistConfigs(configs)\n }, [store])\n // 指令文件卡:显式写盘与重新读取(与预设保存分流)。指令文件是主会话概念,\n // 只在主会话作用域下发,避免子代理页重复挂载产生同一文件的双编辑入口。\n const instructionScope = scope === undefined || scope === 'main'\n const saveInstructionFile = useCallback((fileId: string) => {\n void store.persistInstructionFiles([fileId])\n }, [store])\n const reloadInstructionFile = useCallback((fileId: string) => {\n void store.reloadInstructionFile(fileId)\n }, [store])\n const patchInstructionPolicy = useCallback((fileId: string, override: InstructionPolicyFileOverride) => {\n void store.updateInstructionPolicy(fileId, override)\n }, [store])\n // 当前预设模板消息批层无配置时,pre-step 层空状态追加提示(列表仍可自定义:\n // 新建配置写入激活预设 preset.yml 的 promptConfigs,随预设走、不随切换保留)。\n const preStepEmpty = store.templatePreStepCount === 0 && (layer === undefined || layer === 'pre-step')\n return (\n <PromptConfigList\n t={t}\n meta={store.meta}\n configs={fields.promptConfigs}\n browse={props.browse}\n commonCards={props.commonCards}\n fieldDrafts={store.editorDrafts?.fields}\n draftScope={fields.presetTemplate}\n notice={store.notice}\n noticeKind={store.noticeKind}\n readOnlyReason={!fields.writePreset ? t('configs.readOnly.disabled') : store.moduleFacts?.editable !== true ? t('configs.readOnly.system') : undefined}\n onCreate={props.onCreate}\n onChoosePreset={props.onChoosePreset}\n createdHidden={props.createdHidden}\n onShowCreated={props.onShowCreated}\n createdConfigId={createdConfigId}\n layer={layer}\n scope={scope}\n beforeCards={beforeCards}\n moduleCards={moduleCards}\n toolbarActions={toolbarActions}\n viewFilter={viewFilter}\n onViewFilterChange={onViewFilterChange}\n keyword={keyword}\n onKeywordChange={onKeywordChange}\n renderLayerSettings={renderLayerSettings}\n hasLayerSettings={hasLayerSettings}\n matchesLayerSettings={props.matchesLayerSettings}\n emptyHint={preStepEmpty ? t('configList.emptyPreStep') : undefined}\n onPatchConfigs={patchConfigs}\n onSaveConfigs={saveConfigs}\n onSaveInstructions={instructionScope ? store.persistInstructionFiles : undefined}\n instructionPolicy={instructionScope ? store.instructionPolicy : undefined}\n onToggleInstructionSource={instructionScope ? store.setInstructionSourceEnabled : undefined}\n onSaveInstructionFile={instructionScope ? saveInstructionFile : undefined}\n onReloadInstructionFile={instructionScope ? reloadInstructionFile : undefined}\n onPatchInstructionPolicy={instructionScope ? patchInstructionPolicy : undefined}\n onNotice={store.showNotice}\n />\n )\n})\n","import { memo, useCallback, useState, type ReactNode } from 'react'\nimport type { PromptToolStore } from '../../../data/use-prompt-tool-store.ts'\nimport type { PromptToolTranslate } from '../../../locales.ts'\nimport { EngineModuleActions } from '../../../features/modules/EngineModuleList.tsx'\nimport { INSERTION_LAYERS, LAYER_LABEL_KEYS, translateLabel } from '../../../features/prompts/prompt-config-policy.ts'\nimport { useTemplatePicker } from '../../../features/prompts/useTemplatePicker.ts'\nimport { useCustomToolsEditor } from '../../../features/tools/CustomToolsCard.tsx'\nimport { TemplatePicker } from '../../../ui/TemplatePicker.tsx'\nimport { engineCapability } from '../../../../shared/engine-capabilities.ts'\nimport { engineLayerSlots } from './EngineLayersPanel.tsx'\nimport { ConfigListWithTemplates } from './ConfigListWithTemplates.tsx'\nimport ui from '../../../ui/controls.module.css'\nimport type { ConfigPageBrowse } from '../workspace-browse-state.ts'\nimport type { WorkspacePage } from '../workspace-pages.ts'\n/** 子代理页:子代理引擎模块区块(列表上方,与主会话同构)+ 子代理配置列表\n * (audience != main 即公用或仅子代理)。\n *\n * 入口对等(与主会话同款创建能力,只改作用域):\n * - 顶部只提供九层注入模板;能力/组合、工具和变量在所属层内创建;\n * - 能力模块卡与自定义工具卡(与主会话同一份激活预设,视图过滤联动);\n * - 子代理独有:子代理模型、递归深度(子代理工具策略 / maxDepth)。\n *\n * 例外:仅主对话生效的能力**不在本页创建、也不在本页显示卡片**;\n * 子代理工具面由「工具与深度」卡里的实例级「子代理工具策略」授权。\n *\n * 纪律:过滤抽屉与搜索词只由用户手动改变;新建只做「展开新卡 + 滚动定位」两件事。 */\nexport const SubagentPage = memo(function SubagentPage(props: { store: PromptToolStore; t: PromptToolTranslate; browse?: ConfigPageBrowse; onNavigate?: (page: WorkspacePage) => void }): ReactNode {\n const { store, t } = props\n const [viewFilter, setViewFilter] = useState(props.browse?.viewFilter ?? 'all')\n const changeViewFilter = (value: string): void => {\n if (props.browse !== undefined) props.browse.viewFilter = value\n setViewFilter(value)\n }\n /** 新建能力后的定位信号:token 递增,保证重复创建同一能力仍会再次展开并跳转。 */\n const [focusCapability, setFocusCapability] = useState<{ id: string; token: number }>()\n const [createdHidden, setCreatedHidden] = useState(false)\n // 搜索词由页面持有:同一搜索词同时过滤配置实例、能力卡、共享设置区与单例卡。\n const [keyword, setKeyword] = useState(props.browse?.filter ?? '')\n const canEditPreset = store.fields.writePreset && store.moduleFacts?.editable === true\n /** 仅主对话生效的能力:本页既不提供创建,也不渲染卡片。B7 T3 后暂无此类能力,清单留待重构。 */\n const mainSessionOnly: readonly string[] = []\n // 合并创建菜单:按插入点层级平铺「添加模板 · 层级」入口,浮层只列该层模板。\n const picker = useTemplatePicker(\n store.fields.promptConfigs,\n (config) => { if (canEditPreset) store.patch({ promptConfigs: [...store.getFields().promptConfigs, config] }) },\n store.showNotice,\n t,\n 'subagent',\n )\n const toolEditor = useCustomToolsEditor({ t, presetId: store.fields.presetTemplate, disabled: !canEditPreset, drafts: store.editorDrafts, onNotice: store.showNotice, onChooseTemplate: picker.openTools })\n const createItems = INSERTION_LAYERS.map((layer) => ({ id: `tpl:${layer}`, label: t('main.addTemplate', { layer: translateLabel(t, LAYER_LABEL_KEYS, layer) }) }))\n const onCreateSelect = useCallback((id: string) => {\n if (canEditPreset && id.startsWith('tpl:')) picker.openPicker(id.slice(4))\n }, [canEditPreset, picker])\n const insertToolTemplate = useCallback((spec: Record<string, unknown>) => {\n setCreatedHidden(viewFilter !== 'all' && viewFilter !== 'tool-pipeline')\n toolEditor.createTool({ kind: 'template', spec, presetId: store.fields.presetTemplate })\n picker.closePicker()\n }, [picker, store, viewFilter, toolEditor.createTool])\n // 能力创建成功后只定位并展开新卡;不改动用户选定的视图过滤。\n const revealCapability = useCallback((id: string) => {\n setCreatedHidden(viewFilter !== 'all')\n // 能力卡已退场:定位锚改到该层实例卡内的设置区(层从共享契约派生)。\n const layer = engineCapability(id)?.displayLayer\n setFocusCapability((current) => ({ id, layer, token: (current?.token ?? 0) + 1 }))\n }, [viewFilter])\n // 与主会话同源的层内装配:本页只声明受众视图与子代理专属编排。\n const layers = engineLayerSlots({\n store,\n t,\n viewFilter,\n audience: 'subagent',\n keyword,\n focusCapability,\n onCreated: revealCapability,\n toolEditor: toolEditor.content,\n excludeCapabilities: mainSessionOnly,\n moduleHint: t('modules.subagentScopeHint'),\n moduleEmptyHint: t('modules.subagentEmptyHint'),\n })\n return (\n <>\n <section className={ui.section} aria-label={t('subagent.aria')}>\n <ConfigListWithTemplates\n store={store}\n t={t}\n scope=\"subagent\"\n browse={props.browse}\n onChoosePreset={() => props.onNavigate?.('presets')}\n onCreate={() => picker.openPicker(INSERTION_LAYERS.find((layer) => layer === viewFilter) ?? 'pre-step')}\n createdHidden={createdHidden}\n onShowCreated={() => { changeViewFilter('all'); setCreatedHidden(false) }}\n createdConfigId={picker.createdConfigId}\n commonCards={layers.commonCards}\n beforeCards={layers.beforeCards}\n toolbarActions={\n <EngineModuleActions\n store={store}\n t={t}\n anchorRef={picker.anchorRef}\n extraItems={createItems}\n templatesOnly\n onExtraSelect={onCreateSelect}\n excludeCapabilities={mainSessionOnly}\n />\n }\n moduleCards={layers.moduleCards}\n viewFilter={viewFilter}\n onViewFilterChange={changeViewFilter}\n keyword={keyword}\n onKeywordChange={setKeyword}\n renderLayerSettings={layers.renderLayerSettings}\n hasLayerSettings={layers.hasLayerSettings}\n matchesLayerSettings={layers.matchesLayerSettings}\n />\n </section>\n {picker.open && (\n <TemplatePicker\n t={t}\n anchorRef={picker.popoverAnchorRef}\n templates={picker.toolsOnly ? [] : picker.templates}\n layer={picker.layer}\n toolTemplates={picker.layer === undefined ? picker.toolTemplates : undefined}\n onPick={picker.pickTemplate}\n onPickTool={insertToolTemplate}\n onClose={picker.closePicker}\n />\n )}\n </>\n )\n})\n","import type { PromptToolLocaleKey } from '../../locales.ts'\n\nexport type WorkspacePage = 'features' | 'subagent' | 'tools' | 'skills' | 'presets' | 'characters'\n\n/**\n * 六页定义:只存字典键,文案在渲染时经翻译函数求值(语言切换跟随刷新)。\n * 页面 id 是稳定契约(tab/panel 的 DOM id 依赖它),不参与翻译。\n */\nexport const WORKSPACE_PAGES: ReadonlyArray<{\n id: WorkspacePage\n labelKey: PromptToolLocaleKey\n}> = [\n {\n id: 'features',\n labelKey: 'page.features.label',\n },\n {\n id: 'subagent',\n labelKey: 'page.subagent.label',\n },\n {\n id: 'tools',\n labelKey: 'page.tools.label',\n },\n {\n id: 'skills',\n labelKey: 'page.skills.label',\n },\n {\n id: 'presets',\n labelKey: 'page.presets.label',\n },\n {\n id: 'characters',\n labelKey: 'page.characters.label',\n },\n]\n\nexport const WORKSPACE_PAGE_IDS = WORKSPACE_PAGES.map((page) => page.id)\nexport const workspacePageMeta = (id: WorkspacePage) => WORKSPACE_PAGES.find((page) => page.id === id)!\n","import { useEffect, useRef, type ReactNode } from 'react'\nimport { tabKeyHandler } from '../../ui/tab-key.ts'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport { WORKSPACE_PAGE_IDS, WORKSPACE_PAGES, type WorkspacePage } from './workspace-pages.ts'\nimport css from './PromptWorkspace.module.css'\n\nexport function WorkspaceNavigation(props: { page: WorkspacePage; onChange: (page: WorkspacePage) => void; t: PromptToolTranslate }): ReactNode {\n const navRef = useRef<HTMLDivElement>(null)\n useEffect(() => {\n navRef.current?.querySelector('[aria-selected=\"true\"]')?.scrollIntoView({ block: 'nearest', inline: 'nearest' })\n }, [props.page])\n return (\n <div className={css.topNavigation}>\n <div ref={navRef} className={css.nav} role=\"tablist\" aria-label={props.t('nav.aria')}>\n {WORKSPACE_PAGES.map((item) => {\n const active = props.page === item.id\n return (\n <button\n key={item.id}\n id={`pt-workspace-tab-${item.id}`}\n type=\"button\"\n role=\"tab\"\n tabIndex={active ? 0 : -1}\n aria-selected={active}\n aria-controls={`pt-workspace-panel-${item.id}`}\n data-active={active ? '' : undefined}\n onClick={() => props.onChange(item.id)}\n onKeyDown={tabKeyHandler(WORKSPACE_PAGE_IDS, props.page, props.onChange)}\n >\n <span><strong>{props.t(item.labelKey)}</strong></span>\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n","import clsx from 'clsx'\nimport { useLayoutEffect, useRef, type ReactNode } from 'react'\nimport type { PromptToolStore } from '../../data/use-prompt-tool-store.ts'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport { WorkspaceNavigation } from './WorkspaceNavigation.tsx'\nimport { WORKSPACE_PAGES, type WorkspacePage } from './workspace-pages.ts'\nimport { StatusDot } from '../../ui/StatusDot.tsx'\nimport ui from '../../ui/controls.module.css'\nimport css from './PromptWorkspace.module.css'\n\nexport function WorkspaceFrame(props: {\n store: PromptToolStore\n page: WorkspacePage\n t: PromptToolTranslate\n onPageChange: (page: WorkspacePage) => void\n scrollKey?: string\n scrollPositions?: Map<string, number>\n focusPage?: number\n contentReady?: boolean\n onClose: () => void\n children: ReactNode\n}): ReactNode {\n const { store, t } = props\n const canvasRef = useRef<HTMLElement>(null)\n const restoredKey = useRef<string>()\n const lastFocusPage = useRef(props.focusPage)\n const scrollKey = props.scrollKey ?? props.page\n const enabledCount = store.fields.promptConfigs.filter((config) => config.enabled !== false).length\n // 角色库与工具面拥有独立请求,不能以全局配置数量判定它们的加载/空态。\n const usesBootstrap = props.page !== 'characters' && props.page !== 'tools'\n const loadingInitial = usesBootstrap && store.loading && store.meta.layers.length === 0\n const loadFailed = usesBootstrap && !store.loading && store.meta.layers.length === 0 && store.noticeKind === 'error'\n useLayoutEffect(() => {\n const canvas = canvasRef.current\n if (restoredKey.current !== scrollKey) restoredKey.current = undefined\n if (canvas === null || loadingInitial || props.contentReady === false) return\n const focusPanel = props.focusPage !== lastFocusPage.current\n if (restoredKey.current === scrollKey && !focusPanel) return\n restoredKey.current = undefined\n const frame = requestAnimationFrame(() => {\n canvas.scrollTop = focusPanel ? 0 : (props.scrollPositions?.get(scrollKey) ?? 0)\n if (focusPanel) canvas.querySelector<HTMLElement>('[role=\"tabpanel\"]:not([hidden])')?.focus({ preventScroll: true })\n lastFocusPage.current = props.focusPage\n restoredKey.current = scrollKey\n })\n return () => cancelAnimationFrame(frame)\n }, [scrollKey, loadingInitial, props.contentReady, props.scrollPositions, props.focusPage])\n useLayoutEffect(() => {\n const canvas = canvasRef.current\n const toolbar = canvas?.querySelector<HTMLElement>('[data-workspace-sticky]')\n if (canvas == null) return\n if (toolbar == null) { canvas.style.setProperty('--pt-sticky-height', '0px'); return }\n const measure = (): void => {\n const height = toolbar.getBoundingClientRect().height\n // 保留至少同样高的正文编辑空间;软键盘/窄视口使操作区过高时回归文档流。\n const disabled = height * 2 >= canvas.clientHeight\n canvas.dataset.stickyDisabled = String(disabled)\n canvas.style.setProperty('--pt-sticky-height', `${disabled ? 0 : height}px`)\n }\n const observer = new ResizeObserver(measure)\n observer.observe(toolbar)\n observer.observe(canvas)\n measure()\n return () => observer.disconnect()\n }, [scrollKey, loadingInitial])\n return (\n <div className={css.shell}>\n <header className={css.masthead}>\n <div className={css.brand}>\n <span className={css.brandLogo} aria-hidden=\"true\">⌁</span>\n <h1>{t('app.title')}</h1>\n </div>\n <div className={css.statusCluster}>\n <StatusDot tone={store.loading ? 'neutral' : 'success'} />\n <span>{store.loading\n ? t('app.loading')\n : t('app.statusSummary', { configs: store.fields.promptConfigs.length, enabled: enabledCount })}</span>\n </div>\n <button type=\"button\" className={css.backButton} onClick={props.onClose}>{t('app.backToChat')}</button>\n </header>\n\n <WorkspaceNavigation page={props.page} onChange={(page) => {\n if (canvasRef.current !== null && restoredKey.current === scrollKey) props.scrollPositions?.set(scrollKey, canvasRef.current.scrollTop)\n props.onPageChange(page)\n }} t={t} />\n\n <main ref={canvasRef} className={css.canvas} data-workspace-canvas onScroll={(event) => {\n if (restoredKey.current === scrollKey) props.scrollPositions?.set(scrollKey, event.currentTarget.scrollTop)\n }}>\n {WORKSPACE_PAGES.map((item) => {\n const active = item.id === props.page\n return (\n <div\n key={item.id}\n id={`pt-workspace-panel-${item.id}`}\n role=\"tabpanel\"\n aria-labelledby={`pt-workspace-tab-${item.id}`}\n tabIndex={active ? 0 : undefined}\n hidden={!active}\n >\n {active && (\n <>\n {loadFailed ? <div className={ui.actionFeedback}>\n <p className={ui.noticeError} role=\"status\">{store.notice}</p>\n <button type=\"button\" className={ui.pillButton} onClick={() => void store.load()}>{t('workspace.retry')}</button>\n </div> : loadingInitial ? (\n <div aria-busy=\"true\" aria-label={t('app.loading')}>\n <div className={props.page === 'presets' ? ui.presetGrid : ui.skeletonStack} aria-hidden=\"true\">\n {[0, 1, 2, 3].map((row) => <div key={row} className={ui.skeletonRow} />)}\n </div>\n </div>\n ) : props.children}\n {store.notice && !loadFailed && props.page !== 'features' && props.page !== 'subagent' && <p className={clsx(ui.notice, store.noticeKind === 'error' && ui.noticeError)} role=\"status\">{store.notice}</p>}\n </>\n )}\n </div>\n )\n })}\n </main>\n </div>\n )\n}\n","import type { SkillStatusTab } from '../../features/skills/skill-status.ts'\n\n/** 仅保留可恢复的浏览上下文;确认、导入、拖拽与业务草稿仍由各自 owner 管理。 */\nexport interface ConfigPageBrowse {\n filter: string\n viewFilter: string\n expanded?: string\n variablesExpanded: boolean\n feedback?: { kind: 'ok' | 'error'; message: string }\n}\n\nexport function createWorkspaceBrowseState() {\n return {\n configs: new Map<string, ConfigPageBrowse>(),\n scroll: new Map<string, number>(),\n skills: { query: '', status: 'all' as SkillStatusTab },\n tools: { query: '', selectedId: '', expanded: {} as Record<string, boolean> },\n }\n}\n\nexport function configPageBrowse(state: ReturnType<typeof createWorkspaceBrowseState>, key: string): ConfigPageBrowse {\n let value = state.configs.get(key)\n if (value === undefined) {\n value = { filter: '', viewFilter: 'all', variablesExpanded: false }\n state.configs.set(key, value)\n }\n return value\n}\n","import { useCallback, useEffect, useRef, useState, useSyncExternalStore, type ReactNode } from 'react'\nimport type { PromptToolHostApi } from '../../data/host-api.ts'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport { usePromptToolStore, type PromptToolSettingsTransport } from '../../data/use-prompt-tool-store.ts'\nimport type { PromptToolWorkspaceController } from '../workbench/workspace-controller.ts'\nimport { CharactersPage } from '../../features/characters/CharactersPage.tsx'\nimport { PresetsPage } from '../../features/presets/PresetsPage.tsx'\nimport { SkillsPage } from '../../features/skills/SkillsPage.tsx'\nimport { ToolsPreviewPage } from '../../features/tools/ToolsPreviewPage.tsx'\nimport { MainSessionPage } from './pages/MainSessionPage.tsx'\nimport { SubagentPage } from './pages/SubagentPage.tsx'\nimport { WorkspaceFrame } from './WorkspaceFrame.tsx'\nimport type { WorkspacePage } from './workspace-pages.ts'\nimport { configPageBrowse, createWorkspaceBrowseState } from './workspace-browse-state.ts'\n\nexport interface PromptWorkspaceProps {\n api: PromptToolHostApi\n settings: PromptToolSettingsTransport\n /** 悬浮入口抽屉的开关。 */\n controller: PromptToolWorkspaceController\n /** 命名空间翻译函数(调用时读当前语言)。 */\n t: PromptToolTranslate\n onClose: () => void\n}\n\nexport function PromptWorkspace(props: PromptWorkspaceProps): ReactNode {\n const { t } = props\n const store = usePromptToolStore(props.api, props.settings)\n const [page, setPage] = useState<WorkspacePage>('features')\n const browse = useRef(createWorkspaceBrowseState()).current\n const [focusPage, setFocusPage] = useState(0)\n const [readyPage, setReadyPage] = useState<WorkspacePage>()\n const changePage = (target: WorkspacePage): void => {\n if (target !== page) setReadyPage(undefined)\n setPage(target)\n }\n const markReady = useCallback(() => setReadyPage(page), [page])\n const navigate = (target: WorkspacePage): void => {\n changePage(target)\n setFocusPage((value) => value + 1)\n }\n const presetId = store.fields.presetTemplate\n const scrollKey = page === 'features' || page === 'subagent' ? `${page}:${presetId}` : page\n const open = useSyncExternalStore(\n props.controller.subscribe,\n props.controller.getSnapshot,\n props.controller.getSnapshot,\n ).open\n\n useEffect(() => {\n if (open) void store.load()\n }, [open, store.load])\n\n const content = page === 'features'\n ? <MainSessionPage key={presetId} store={store} t={t} browse={configPageBrowse(browse, scrollKey)} onNavigate={navigate} />\n : page === 'subagent'\n ? <SubagentPage key={presetId} store={store} t={t} browse={configPageBrowse(browse, scrollKey)} onNavigate={navigate} />\n : page === 'tools'\n ? <ToolsPreviewPage api={props.api} presetId={presetId} t={t} browse={browse.tools} onNavigate={navigate} onReady={markReady} />\n : page === 'skills'\n ? <SkillsPage store={store} api={props.api} t={t} browse={browse.skills} />\n : page === 'presets'\n ? <PresetsPage store={store} t={t} />\n : <CharactersPage store={store} t={t} onReady={markReady} />\n\n return (\n <WorkspaceFrame\n store={store}\n page={page}\n t={t}\n onPageChange={changePage}\n scrollKey={scrollKey}\n scrollPositions={browse.scroll}\n focusPage={focusPage}\n contentReady={page !== 'characters' && page !== 'tools' || readyPage === page}\n onClose={props.onClose}\n >\n {content}\n </WorkspaceFrame>\n )\n}\n","/**\n * 悬浮入口的位置模型:只处理视口坐标与夹取,不触碰任何宿主 DOM。\n *\n * 位置是纯客户端界面偏好(不是预设行为、也不是部署轴),因此存在浏览器\n * localStorage:既不加 host bridge 写端点,也不往 settings descriptor 里塞 UI 噪音。\n * 存取失败(无 localStorage、隐私模式、配额)时静默退回默认位置。\n */\n\nexport interface TriggerPoint {\n x: number\n y: number\n}\n\nexport interface TriggerBounds {\n width: number\n height: number\n}\n\n/** 默认位置:侧栏轨道右缘(折叠 56px)再往右 8px,垂直居中偏上。 */\nexport const DEFAULT_TRIGGER: TriggerPoint = { x: 64, y: 64 }\n/** 拖动判定阈值(px):小于它视为单击,避免抖动吞掉开合。 */\nexport const DRAG_THRESHOLD_PX = 4\n/** 视口边缘留白(px):夹取后按钮整体离边缘至少这么远,避免贴边难以点中。 */\nexport const TRIGGER_MARGIN_PX = 8\n/** 悬浮按钮尺寸(px):与 Workbench.module.css 的 .floatingTrigger 保持一致。 */\nexport const TRIGGER_SIZE_PX = 28\n\nconst STORAGE_KEY = 'dsh-plugin-prompt-tool:trigger-position'\n/** 早期提交写过的键:读到就沿用,避免用户位置偏好丢失。 */\nconst LEGACY_STORAGE_KEY = 'dsh-plugin-prompt-tool:floating-trigger'\n\n/** 单轴夹取:先保留边缘留白,留白放不下时退化为「按钮完整可见」。 */\nfunction clampAxis(value: number, limit: number): number {\n const max = Math.max(0, limit - TRIGGER_MARGIN_PX)\n const min = Math.min(TRIGGER_MARGIN_PX, max)\n return Math.min(Math.max(value, min), max)\n}\n\n/**\n * 夹取到视口内:按钮必须完整可见。\n * 尺寸取实际渲染尺寸(窄屏断点下按钮是 40px),缺省用设计尺寸 28px。\n */\nexport function clampPoint(\n point: TriggerPoint,\n bounds: TriggerBounds,\n size: Partial<TriggerBounds> = {},\n): TriggerPoint {\n const width = size.width ?? TRIGGER_SIZE_PX\n const height = size.height ?? TRIGGER_SIZE_PX\n return {\n x: clampAxis(point.x, bounds.width - width),\n y: clampAxis(point.y, bounds.height - height),\n }\n}\n\n/** 拖动等价判定:位移超过阈值才算拖动(拖动结束必须吞掉尾随 click)。 */\nexport function isDragGesture(start: TriggerPoint, current: TriggerPoint): boolean {\n return Math.abs(current.x - start.x) > DRAG_THRESHOLD_PX || Math.abs(current.y - start.y) > DRAG_THRESHOLD_PX\n}\n\nexport function readStoredTriggerPosition(): TriggerPoint | undefined {\n try {\n const raw = window.localStorage.getItem(STORAGE_KEY) ?? window.localStorage.getItem(LEGACY_STORAGE_KEY)\n if (raw === null) return undefined\n const parsed: unknown = JSON.parse(raw)\n if (parsed === null || typeof parsed !== 'object') return undefined\n const record = parsed as Record<string, unknown>\n if (typeof record.x !== 'number' || typeof record.y !== 'number') return undefined\n if (!Number.isFinite(record.x) || !Number.isFinite(record.y)) return undefined\n return { x: record.x, y: record.y }\n } catch {\n return undefined\n }\n}\n\nexport function storeTriggerPosition(point: TriggerPoint): void {\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify({ x: Math.round(point.x), y: Math.round(point.y) }))\n } catch {\n // 存不下就不存:位置偏好丢失不影响功能。\n }\n}\n","import { useCallback, useEffect, useRef, useState, useSyncExternalStore, type CSSProperties, type MutableRefObject, type PointerEvent as ReactPointerEvent, type ReactNode } from 'react'\nimport { HintTooltip } from '../../ui/HintTooltip.tsx'\nimport type { PromptToolTranslate } from '../../locales.ts'\nimport type { PromptToolWorkspaceController } from './workspace-controller.ts'\nimport {\n DEFAULT_TRIGGER,\n clampPoint,\n isDragGesture,\n readStoredTriggerPosition,\n storeTriggerPosition,\n type TriggerPoint,\n} from './floating-trigger-position.ts'\nimport css from './Workbench.module.css'\n\n/**\n * 可拖动悬浮触发器:透过 body portal 落在对话界面层。\n *\n * 位置由本插件自己的 localStorage 偏好 + 视口夹取决定,不读宿主 DOM 几何\n * (不再依赖侧栏 grid-template-columns、祖先爬链或针对宿主的 ResizeObserver)。\n * 位移超过阈值视为拖动并吞掉尾随 click;单击与键盘仍开合工作台。\n */\nexport function FloatingTrigger(props: { controller: PromptToolWorkspaceController; triggerRef?: MutableRefObject<HTMLButtonElement | null>; t: PromptToolTranslate }): ReactNode {\n const { controller, triggerRef, t } = props\n // 宿主(WorkbenchOverlay)只读地用这个 ref 归还焦点;这里写入自身节点。\n const writableTriggerRef = triggerRef as MutableRefObject<HTMLButtonElement | null> | undefined\n const open = useSyncExternalStore(controller.subscribe, controller.getSnapshot, controller.getSnapshot).open\n // useRef<T>(null) 在 @types/react 18 走 readonly 的 RefObject 重载:显式标注可变 ref。\n const localRef = useRef<HTMLButtonElement | null>(null) as MutableRefObject<HTMLButtonElement | null>\n const [position, setPosition] = useState<TriggerPoint>(() => readStoredTriggerPosition() ?? DEFAULT_TRIGGER)\n const dragRef = useRef<{ pointerId: number; startPointer: TriggerPoint; startPosition: TriggerPoint; moved: boolean } | null>(null)\n const suppressClickRef = useRef(false)\n\n // 窗口变化(含窄屏断点改变按钮尺寸)后把按钮夹回可见区域。\n useEffect(() => {\n const clampToViewport = (): void => {\n setPosition((current) => {\n const rect = localRef.current?.getBoundingClientRect()\n const next = clampPoint(\n current,\n { width: window.innerWidth, height: window.innerHeight },\n rect === undefined ? {} : { width: rect.width, height: rect.height },\n )\n return next.x === current.x && next.y === current.y ? current : next\n })\n }\n clampToViewport()\n window.addEventListener('resize', clampToViewport)\n return () => window.removeEventListener('resize', clampToViewport)\n }, [])\n\n const onPointerDown = useCallback((event: ReactPointerEvent<HTMLButtonElement>) => {\n if (event.button !== 0) return\n dragRef.current = {\n pointerId: event.pointerId,\n startPointer: { x: event.clientX, y: event.clientY },\n startPosition: position,\n moved: false,\n }\n }, [position])\n\n const onPointerMove = useCallback((event: ReactPointerEvent<HTMLButtonElement>) => {\n const drag = dragRef.current\n if (drag === null || drag.pointerId !== event.pointerId) return\n const delta = { x: event.clientX - drag.startPointer.x, y: event.clientY - drag.startPointer.y }\n if (!drag.moved && !isDragGesture(drag.startPointer, { x: event.clientX, y: event.clientY })) return\n if (!drag.moved) {\n drag.moved = true\n // 指针捕获:拖出按钮范围仍持续收到 move/up,也避免拖动选中文本。\n event.currentTarget.setPointerCapture(event.pointerId)\n }\n setPosition(clampPoint(\n { x: drag.startPosition.x + delta.x, y: drag.startPosition.y + delta.y },\n { width: window.innerWidth, height: window.innerHeight },\n { width: event.currentTarget.offsetWidth, height: event.currentTarget.offsetHeight },\n ))\n }, [])\n\n const endDrag = useCallback((event: ReactPointerEvent<HTMLButtonElement>) => {\n const drag = dragRef.current\n if (drag === null || drag.pointerId !== event.pointerId) return\n dragRef.current = null\n if (!drag.moved) return\n suppressClickRef.current = true\n // 拖动后解除捕获,并把最终位置写成偏好。\n if (event.currentTarget.hasPointerCapture(event.pointerId)) event.currentTarget.releasePointerCapture(event.pointerId)\n setPosition((current) => {\n storeTriggerPosition(current)\n return current\n })\n }, [])\n\n const onClick = useCallback(() => {\n // 拖动收尾会派发一次 click:这里吞掉,拖动不触发开合。\n if (suppressClickRef.current) {\n suppressClickRef.current = false\n return\n }\n controller.toggle()\n }, [controller])\n\n const style = { left: `${position.x}px`, top: `${position.y}px` } satisfies CSSProperties\n const label = open ? t('app.close') : t('app.open')\n return (\n <div className={css.floatingTriggerLayer} data-dsh-part=\"floating-trigger-layer\" style={style}>\n <HintTooltip label={label}>\n <button\n ref={(node: HTMLButtonElement | null) => {\n localRef.current = node\n if (writableTriggerRef !== undefined) writableTriggerRef.current = node\n }}\n type=\"button\"\n className={css.floatingTrigger}\n data-open={open ? '' : undefined}\n data-dsh-plugin=\"prompt-tool\"\n data-dsh-part=\"floating-trigger\"\n aria-label={label}\n aria-pressed={open}\n aria-expanded={open}\n aria-controls=\"pt-workbench-drawer\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onClick={onClick}\n >\n <svg viewBox=\"0 0 16 16\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3.5 2.5h6l3 3v8h-9zM9.5 2.5v3h3M6 8.5h4M8 6.5v4\" />\n </svg>\n </button>\n </HintTooltip>\n </div>\n )\n}\n","import { useEffect, useRef, useSyncExternalStore, type KeyboardEvent as ReactKeyboardEvent, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport type {} from '@deepseek-ai/dsh-client-ui-layout/client'\nimport type { InjectFace, PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots'\nimport { PromptWorkspace } from '../workspace/PromptWorkspace.tsx'\nimport { FloatingTrigger } from './FloatingTrigger.tsx'\nimport type { PromptToolWorkbenchFace } from './workbench-face.ts'\nimport { FOCUSABLE, nextDialogFocusIndex } from '../../ui/dialog-focus.ts'\nimport css from './Workbench.module.css'\n\ntype OverlayProps = PropsRuntime<'shell.overlay'> & InjectFace<PromptToolWorkbenchFace> & PropsLocale<'prompt-tool'>\n/** shell.overlay:顶层触发器 + 右侧抽屉工作台;store 状态跨开关保留。 */\nexport function WorkbenchOverlay(props: OverlayProps): ReactNode {\n const { controller, api, settings, t } = props\n const open = useSyncExternalStore(controller.subscribe, controller.getSnapshot, controller.getSnapshot).open\n useEffect(() => {\n if (!open) return\n const onKey = (event: KeyboardEvent): void => {\n if (event.key === 'Escape' && !event.defaultPrevented) { event.preventDefault(); controller.close() }\n }\n // 与其他面板互斥:兼容仍在 DOM 面板上的 taskboard / ssh 事件总线。\n const onOther = (event: Event): void => {\n const detail = (event as CustomEvent<unknown>).detail\n if (detail === 'taskboard' || detail === 'ssh') controller.close()\n }\n document.addEventListener('keydown', onKey)\n document.addEventListener('dsh-panel-activate', onOther)\n document.dispatchEvent(new CustomEvent('dsh-panel-activate', { detail: 'prompt-tool' }))\n return () => {\n document.removeEventListener('keydown', onKey)\n document.removeEventListener('dsh-panel-activate', onOther)\n }\n }, [open, controller])\n // 关闭后焦点还给触发器(可访问性:焦点不得悬空在 body 上;经 ref 拿自己的按钮,\n // 只拿自己的按钮 ref,不触达宿主 DOM 结构。\n const triggerRef = useRef<HTMLButtonElement>(null)\n const drawerRef = useRef<HTMLElement>(null)\n const prevOpenRef = useRef(open)\n useEffect(() => {\n const wasOpen = prevOpenRef.current\n prevOpenRef.current = open\n if (!wasOpen && open) drawerRef.current?.focus()\n if (wasOpen && !open) triggerRef.current?.focus()\n }, [open])\n /** aria-modal 抽屉的首尾 Tab 循环:焦点不得越过抽屉进入宿主页面。\n * 弹窗(DialogSurface/TemplatePicker)是 body portal,不在抽屉 DOM 内——\n * 焦点在弹窗内时交给弹窗自己的循环管理,这里不拦截。 */\n const onDrawerKeyDown = (event: ReactKeyboardEvent<HTMLElement>): void => {\n if (event.key !== 'Tab' || drawerRef.current === null) return\n const active = document.activeElement\n if (!(active instanceof HTMLElement) || !drawerRef.current.contains(active)) return\n const focusables = [...drawerRef.current.querySelectorAll<HTMLElement>(FOCUSABLE)]\n .filter((element) => !element.hasAttribute('disabled') && element.getClientRects().length > 0)\n const next = nextDialogFocusIndex(focusables.length, focusables.indexOf(active), event.shiftKey)\n if (next === undefined) return\n event.preventDefault()\n focusables[next]?.focus()\n }\n const trigger = <FloatingTrigger controller={controller} triggerRef={triggerRef} t={t} />\n // 抽屉同样 body portal + fixed 顶层:宿主「对话/轨迹」顶部导航栏处于更高层级,\n // 只挂在 shell.overlay slot 内会被导航栏遮挡(不是最顶层);portal 到 body 后\n // 用高 z-index 保证抽屉背板/面板与悬浮按钮始终在导航栏之上。\n const drawer = (\n <div className={css.drawerLayer} data-open={open ? '' : undefined}>\n <div className={css.drawerBackdrop} onClick={() => controller.close()} aria-hidden=\"true\" />\n <section id=\"pt-workbench-drawer\" ref={drawerRef} className={css.drawerPanel} data-dsh-part=\"workspace-drawer\" role=\"dialog\" aria-modal=\"true\" aria-label={t('app.panelAria')} tabIndex={-1} onKeyDown={onDrawerKeyDown}>\n <PromptWorkspace api={api} settings={settings} controller={controller} t={t} onClose={() => controller.close()} />\n </section>\n </div>\n )\n return (\n <>\n {typeof document === 'undefined' || document.body === null ? trigger : createPortal(trigger, document.body)}\n {typeof document === 'undefined' || document.body === null ? drawer : createPortal(drawer, document.body)}\n </>\n )\n}\n","/**\n * 引擎参数卡、模块列表与通用 UI 控件相关的 UI 文案分区(命名空间 `prompt-tool`)。\n *\n * 约定(与 locales.ts 相同):zh 是键类型事实源,en 用 Record<keyof typeof zh, string>\n * 强制键集一致;只放用户可见文案,provider/model id、路径、用户内容、协议 code 不进字典。\n */\nexport const PARAMS_ZH = {\n // 共享参数目录(shared/engine-params.ts)只给键名,显示标签一律 `param.<键>`。\n 'param.firstTurnAnchor': '首轮锚定',\n 'param.firstTurnText': '首轮锚定文本',\n 'param.firstTurnCustom': '使用自定义锚定文本',\n 'param.guideText': '每轮引导文本',\n 'param.guideCustom': '使用自定义引导文本',\n 'param.guideEnabled': '每轮引导',\n 'param.injectPrompt': '锚定确认后注入内容',\n 'param.modelProvider': '模型服务商',\n 'param.modelName': '模型',\n 'param.subagentModelProvider': '子代理模型服务商',\n 'param.subagentModelName': '子代理模型',\n 'param.modelReasoningEffort': '思维程度',\n 'param.modelTemperature': '采样温度',\n 'param.modelMaxTokens': '输出上限',\n 'param.subagentReasoningEffort': '子代理思维程度',\n 'param.subagentTemperature': '子代理采样温度',\n 'param.subagentMaxTokens': '子代理输出上限',\n 'param.maxDepth': '递归深度',\n 'param.firstTurnWord': '锚定确认词',\n 'param.buildPattern': '构建任务正则',\n 'param.complexPattern': '复杂任务正则',\n 'param.firstTurnBuild': '构建档锚句',\n 'param.firstTurnInspect': '排查档锚句',\n 'param.firstTurnDeep': '深度档锚句',\n 'param.guideWeak': '简短引导正文',\n 'param.guideDeep': '深度引导正文',\n 'param.instructionHint': '指令路径提示',\n 'param.strReplaceEditorMaxOutputChars': '编辑器输出上限',\n 'param.toolGitBashEnabled': '启用 Git Bash 工具',\n 'param.customToolRequireApproval': '执行前需用户批准的工具种类',\n\n // 参数卡通用文案。\n 'param.hint': '{param}:{label}。空文本/列表回落预设默认;保存后用于后续 generation。',\n 'param.inheritPresetDefault': '继承预设默认',\n 'param.on': '开启',\n 'param.off': '关闭',\n 'param.option.either': '工具调用或助手消息',\n 'param.option.tool-call': '工具调用',\n 'param.option.assistant-message': '助手消息',\n\n // 模块列表(EngineModuleList)。\n 'modules.addTemplates': '添加注入模板',\n 'modules.addCapability': '添加能力 / 工具模块',\n 'modules.addCapabilityItem': '添加模块 · {id}',\n 'modules.createRecipeItem': '连锁创建 · {id}',\n 'modules.promptDefaults.name': '提示词生成默认值',\n 'modules.promptDefaults.meta': '预设级提示词生成默认值;不自动添加能力模块。',\n 'modules.status.reading': '正在读取当前预设模块事实…',\n 'modules.status.emptyAll': '当前预设无已装配的引擎能力;可按需添加模块。',\n 'modules.status.emptyFiltered': '当前分类无已装配的引擎能力;可按需添加模块。',\n 'modules.status.emptySearch': '没有匹配「{keyword}」的能力模块;提示词配置按各自层级另计。',\n // 子代理页不提供「仅主对话」能力的创建与卡片:引导到实例级策略能力卡。\n 'modules.subagentScopeHint': '子代理工具面由「subagent-tool-policy」能力管理,可在工具链层的设置区创建。',\n 'modules.subagentEmptyHint': '子代理页不显示「仅主对话」的引擎能力;子代理工具面请启用「subagent-tool-policy」能力。',\n // 共享设置区的能力参数分组标题(按真实能力 card 分组,不另抄键表)。\n 'modules.group.str-replace-editor': '编辑器',\n 'modules.group.tool-config-engine': '工具配置',\n 'modules.group.subagent-delegation': '子代理授权',\n // 层设置区:参数分组标题按 card 派生,能力装配状态与移除入口都在本层设置区内。\n 'modules.group.prompt-defaults': '提示词生成默认值',\n 'modules.group.main-model': '主模型',\n 'modules.group.subagent-model': '子代理模型',\n 'modules.group.other': '其他设置',\n 'modules.layer.assembled': '本层已装配的能力',\n 'modules.layer.asset': '本层的预设资产',\n 'modules.layer.capability': '能力:{id}',\n 'modules.layer.remove': '移除能力',\n 'modules.layer.removeTitle': '移除「{id}」能力?',\n 'modules.layer.removeDesc': '从当前预设移除该能力:模块声明与行配置一起移除,它的参数不再生效;其他能力与本层配置不受影响。',\n}\n\nexport const PARAMS_EN: Record<keyof typeof PARAMS_ZH, string> = {\n 'param.firstTurnAnchor': 'First-turn anchor',\n 'param.firstTurnText': 'First-turn anchor text',\n 'param.firstTurnCustom': 'Use custom anchor text',\n 'param.guideText': 'Per-turn guide text',\n 'param.guideCustom': 'Use custom guide text',\n 'param.guideEnabled': 'Per-turn guide',\n 'param.injectPrompt': 'Inject content after anchor confirmation',\n 'param.modelProvider': 'Model provider',\n 'param.modelName': 'Model',\n 'param.subagentModelProvider': 'Subagent model provider',\n 'param.subagentModelName': 'Subagent model',\n 'param.modelReasoningEffort': 'Reasoning effort',\n 'param.modelTemperature': 'Sampling temperature',\n 'param.modelMaxTokens': 'Output limit',\n 'param.subagentReasoningEffort': 'Subagent reasoning effort',\n 'param.subagentTemperature': 'Subagent sampling temperature',\n 'param.subagentMaxTokens': 'Subagent output limit',\n 'param.maxDepth': 'Recursion depth',\n 'param.firstTurnWord': 'Anchor confirmation word',\n 'param.buildPattern': 'Build task pattern',\n 'param.complexPattern': 'Complex task pattern',\n 'param.firstTurnBuild': 'Build anchor line',\n 'param.firstTurnInspect': 'Inspect anchor line',\n 'param.firstTurnDeep': 'Deep anchor line',\n 'param.guideWeak': 'Short guide text',\n 'param.guideDeep': 'Deep guide text',\n 'param.instructionHint': 'Instruction path hint',\n 'param.strReplaceEditorMaxOutputChars': 'Editor output limit',\n 'param.toolGitBashEnabled': 'Enable Git Bash tool',\n 'param.customToolRequireApproval': 'Tool kinds that need user approval before running',\n\n 'param.hint': '{param}: {label}. Empty text or list falls back to the preset default; used for later generations once saved.',\n 'param.inheritPresetDefault': 'Inherit preset default',\n 'param.on': 'On',\n 'param.off': 'Off',\n 'param.option.either': 'Tool call or assistant message',\n 'param.option.tool-call': 'Tool call',\n 'param.option.assistant-message': 'Assistant message',\n\n 'modules.addTemplates': 'Add injection template',\n 'modules.addCapability': 'Add capability / tool module',\n 'modules.addCapabilityItem': 'Add module · {id}',\n 'modules.createRecipeItem': 'Create chained modules · {id}',\n 'modules.promptDefaults.name': 'Prompt generation defaults',\n 'modules.promptDefaults.meta': 'Preset-level prompt generation defaults; no capability module is added automatically.',\n 'modules.status.reading': 'Reading the current preset module facts…',\n 'modules.status.emptyAll': 'This preset has no mounted engine capability; add modules as needed.',\n 'modules.status.emptyFiltered': 'No mounted engine capability in this category; add modules as needed.',\n 'modules.status.emptySearch': 'No capability module matches \"{keyword}\"; prompt configs are counted per layer.',\n // Subagent page omits main-session-only capabilities and points at the per-instance policy capability card.\n 'modules.subagentScopeHint': 'The subagent tool surface is managed by the \"subagent-tool-policy\" capability, created in the tool-pipeline layer settings.',\n 'modules.subagentEmptyHint': 'Main-session-only engine capabilities are not shown on the subagent page; enable the \"subagent-tool-policy\" capability for the subagent tool surface.',\n 'modules.group.str-replace-editor': 'Editor',\n 'modules.group.tool-config-engine': 'Tool config',\n 'modules.group.subagent-delegation': 'Subagent delegation',\n 'modules.group.prompt-defaults': 'Prompt generation defaults',\n 'modules.group.main-model': 'Main model',\n 'modules.group.subagent-model': 'Subagent model',\n 'modules.group.other': 'Other settings',\n 'modules.layer.assembled': 'Capabilities mounted in this layer',\n 'modules.layer.asset': 'Preset assets of this layer',\n 'modules.layer.capability': 'Capability: {id}',\n 'modules.layer.remove': 'Remove capability',\n 'modules.layer.removeTitle': 'Remove the \"{id}\" capability?',\n 'modules.layer.removeDesc': 'Removes this capability from the current preset: the module declaration and its row config go away and its parameters stop applying; other capabilities and this layer configs are unaffected.',\n}\n","/**\n * 提示词配置与人设相关的 UI 文案分区(官方 locale 命名空间 `prompt-tool`)。\n *\n * 约定(与 locales.ts 相同):zh 是键类型事实源,en 用 Record<keyof typeof zh, string>\n * 强制键集一致;只放用户可见文案,provider/model id、路径、用户内容、协议 code 不进字典。\n *\n * 键前缀分区:`configs.`(列表与编辑器)、`card.`(配置卡)、`form.`(表单字段)、\n * `field.`(通用控件)、枚举显示标签(`layer.` / `strategy.` / …)、`strategyParam.`\n * (按内容策略拆解的参数)、`variables.`(模板变量)、`templates.`(模板浮层)、\n * `persona.`(人设卡)。枚举标签由 prompt-config-policy.ts 的值 → 键映射查表,\n * 未知值回退原始值,不误译。\n */\nexport const PROMPTS_ZH = {\n 'variables.deleteTitle': '清空模板变量?',\n 'variables.deleteDescription': '清空当前预设的全部模板变量;提示词配置仍保留。',\n 'variables.deleteFailed': '模板变量清空失败,请重试。',\n 'card.actionsAria': '{name} 的操作',\n 'card.deleteTitle': '删除 {name}',\n 'card.deleteDescription': '从当前预设移除“{name}”及其配置。',\n 'card.reloadTitle': '重新读取 {name}',\n 'card.reloadDescription': '重新读取将丢弃“{name}”的未保存草稿,并采用当前磁盘内容。',\n 'card.operationFailed': '操作失败,请重试',\n 'card.fileConflictDetail': '磁盘版本已变化,本地草稿保留。',\n 'card.fileMissing': '文件不存在',\n 'card.fileTooLarge': '文件超过读取上限',\n 'card.chip.audience': '受众:{value}',\n 'card.unsaved': '有未保存的修改',\n 'field.number.invalid': '请输入有效数字',\n 'field.number.integer': '请输入有效整数',\n 'customTools.invalidDraft': '请先修正工具的 JSON 或数字输入,再保存。',\n 'persona.removeDescription': '移除当前预设的人设,并丢弃此处未保存的修改。',\n 'presetSwitcher.delete.description': '删除预设“{name}”的用户目录副本,无法撤销。指令文件正文不受影响。',\n 'characters.delete.description': '从角色库永久删除“{name}”。已应用到预设的内容不会一并移除。',\n 'configs.saveScope': '配置自动保存;此处校验并保存配置及已改动指令文件。工具、人设、参数与策略分别保存。',\n 'configs.notice.savedSnapshot': '已保存本次配置快照;后续修改继续保留。',\n 'configs.notice.saveIncomplete': '部分配置或指令文件尚未保存,请查看错误后重试。',\n 'configs.notice.valid': '配置校验通过',\n 'configs.clearFilters': '清除筛选',\n 'configs.showAll': '显示全部',\n 'configs.createdHidden': '新建对象被当前筛选隐藏。',\n 'configs.searchSorting': '搜索期间暂停排序;清除搜索后可调整同一插入点内顺序。',\n 'configs.batch.enableVisible': '启用可见 {count} 项',\n 'configs.batch.disableVisible': '停用可见 {count} 项',\n 'configs.view.insertion': '插入点',\n 'configs.view.strategy': '内容策略',\n 'configs.createFirst': '创建第一条配置',\n 'configs.chooseEditable': '选择或新建可编辑预设',\n 'configs.readOnly.disabled': '预设写入已关闭,请在预设配置中开启。',\n 'configs.readOnly.system': '当前预设只读,请选择可编辑预设。',\n 'workspace.refreshing': '正在刷新,保留当前数据',\n 'workspace.retry': '重新读取',\n // 配置列表与编辑器(PromptConfigList / PromptConfigsEditor)。\n 'configs.heading.all': '模块列表',\n 'configs.heading.layer': '本层配置',\n 'configs.meta': '{total} 条配置 · {enabled} 条启用;上下移动控制同层顺序。',\n 'configs.validate': '校验',\n 'configs.validating': '校验中…',\n 'configs.save': '保存配置',\n 'configs.saving': '保存中…',\n 'configs.filter.aria': '过滤提示词配置',\n 'configs.filter.placeholder': '过滤提示词配置:按标识 / 名称…',\n 'configs.view.aria': '按层级或策略过滤',\n 'configs.view.all': '全部',\n 'configs.view.worldBook': '世界书',\n 'worldBookDiag.title': '世界书诊断(最近一次注入)',\n 'worldBookDiag.hint': '只读观测:候选、入选与真实提交的原因来自引擎实际求值,不改变筛选结果与时间窗。',\n 'worldBookDiag.refresh': '刷新诊断',\n 'worldBookDiag.empty': '本次会话还没有可显示的世界书记录(先发送一条命中世界书的消息)。',\n 'worldBookDiag.truncated': '记录超出上限,仅展示前 200 条。',\n 'worldBookDiag.failed': '读取诊断失败:{reason}',\n 'worldBookDiag.stage.excluded': '未参与',\n 'worldBookDiag.stage.rejected': '被拒',\n 'worldBookDiag.stage.candidate': '候选',\n 'worldBookDiag.stage.selected': '入选',\n 'worldBookDiag.stage.committed': '已注入',\n 'configs.view.layer': '层级:{layer}',\n 'configs.batch.enable': '启用',\n 'configs.batch.disable': '禁用',\n 'configs.error.missingId': '(缺 id)',\n 'configs.empty.subagent.title': '还没有子代理可见的配置',\n 'configs.empty.subagent.desc': '从上方「新建」插入一条(插入后可在卡片「消息受众」下拉自由切换仅主会话/公用/仅子代理),或到主设置「配置」从目录导入。',\n 'configs.empty.all.title': '还没有自定义配置',\n 'configs.empty.all.desc': '从上方模板插入一条,或从本地目录导入;默认四条内置配置不受影响。',\n 'configs.empty.layer.title': '「{layer}」层还没有内容',\n 'configs.empty.layer.desc': '用顶部「添加注入模板」在本层新建配置;能力与组合可在本层设置区添加。不会自动创建空卡片。',\n 'configs.noMatch': '没有匹配「{keyword}」的配置。',\n 'configs.noMatch.modules': '没有匹配「{keyword}」的提示词配置;能力模块不受此搜索影响。',\n 'configs.notice.validateFailed': '校验请求失败:{reason}',\n 'configs.notice.saved': '已校验并保存({count} 条提示词配置)',\n 'configs.notice.saveFailed': '保存失败:{reason}',\n 'instructions.source.label': '独立指令文件来源',\n 'instructions.source.disabled': '已关闭:文件开关不会生效,需显式开启独立来源',\n 'instructions.source.enabled': '已开启:按独立策略参与后续注入,不撤回已进入会话的内容',\n 'instructions.source.unavailable': '指令策略读取失败,来源开关不可写:{reason}',\n 'instructions.source.ownerConflict': '官方指令仍负责,独立来源本次不注入;此开关不会接管官方负责人',\n 'configs.notice.copied': '已复制',\n 'configs.notice.deleted': '已删除',\n 'configs.editor.aria': '主会话模块列表',\n 'configs.common.aria': '公共配置',\n 'configs.note.preset': '提示词配置写入激活预设的 preset.yml(随预设存储,不占用 settings);外部提示词配置可经「预设配置 → 导入预设」引入。',\n 'configs.note.variables': '模板变量空字符串是合法占位值({{key}} 动态引用),不会被当作「删键」处理。',\n\n // 配置卡(PromptConfigCard)。\n 'card.dragHint': '拖动调整顺序',\n 'card.enableHint': '点击启用',\n 'card.disableHint': '点击关闭',\n 'card.enableAria': '启用 {name}',\n 'card.moveUp': '上移',\n 'card.moveDown': '下移',\n 'card.duplicate': '复制',\n 'card.delete': '删除',\n 'card.confirmDelete': '确认删除',\n 'card.cancel': '取消',\n 'card.chip.position': '位置:{value}',\n 'card.chip.merged': '合并发送',\n 'card.chip.order': '顺序:{order}',\n 'card.chip.group': '分组:{name}',\n 'card.chip.exclusiveGroup': '互斥组:{name}',\n 'card.chip.fileDirty': '未保存',\n 'card.chip.fileSaving': '保存中',\n 'card.chip.fileConflict': '磁盘已变,需重新读取',\n 'card.chip.fileUnavailable': '文件不可读',\n 'card.fileStatusDetail': '指令文件状态:{message}',\n 'card.saveFile': '保存到文件',\n 'card.reloadFile': '重新读取',\n\n // 表单字段(PromptConfigForm)。\n 'form.section.basic': '基础信息',\n 'form.navigation.label': '编辑配置',\n 'form.navigation.conditions': '条件',\n 'form.navigation.execution': '执行',\n 'form.navigation.settings': '设置',\n 'form.navigation.invalid': '有未修正的输入错误',\n 'form.section.rules': '注入规则',\n 'form.section.scope': '作用范围',\n 'form.section.content': '内容',\n 'form.section.strategy': '本条规则的行为',\n 'form.text.stream': '替代模型输出',\n 'form.text.toolResult': '工具结果或拦截反馈',\n 'form.text.mainSession': '注入主会话的文本',\n 'form.text.actionHint': '仅在上方选择的行为生效时使用此文本。',\n 'form.layerSettings.label': '本层共享设置({layer})',\n 'form.layerSettings.hint': '作用于当前预设的「{layer}」相关能力,同层所有规则共用。修改这里会影响其他卡片;其他视图仅编辑当前规则。',\n 'form.advanced.label': '高级元数据',\n 'form.advanced.setCount': '高级元数据 · 已设置 {count} 项',\n 'form.id.label': '标识',\n 'form.id.hint': '配置的唯一标识,不能为空',\n 'form.name.label': '名称',\n 'form.name.hint': '模块列表中显示的名称',\n 'form.layer.label': '注入层',\n 'form.layer.hint': '决定提示内容注入的位置',\n 'form.strategy.label': '内容策略',\n 'form.strategy.hint': '决定提示内容的生成方式',\n 'form.kind.label': '配置类型',\n 'form.kind.hint': '顺序配置按顺序值排列;固定锚点优先',\n 'form.role.label': '消息角色',\n 'form.role.hint': '选择注入消息使用的角色;消息批只接受「用户」',\n 'form.position.label': '拼接位置',\n 'form.position.hint': '决定内容在同层消息中的位置',\n 'form.merge.label': '合并方式',\n 'form.merge.hint': '决定同位置内容是否合并发送',\n 'form.order.label': '顺序',\n 'form.order.hint': '数值越小越靠前',\n 'form.order.insert': '插入到官方位置…',\n 'form.order.insertLast': '全部官方位置之后',\n 'form.order.layerOnly': '本层 order 只决定同层配置的执行顺序,不对应官方装配位置',\n 'orderGroup.identity': '身份与人设前',\n 'orderGroup.policy': '策略与引用',\n 'orderGroup.tools': '工具指导',\n 'orderGroup.sdk': 'SDK 与外部面',\n 'orderGroup.deliverable': '产出与结构化',\n 'orderGroup.closing': '人设后收尾',\n 'orderGroup.runtimePolicy': '运行策略',\n 'form.group.label': '互斥组',\n 'form.group.hint': '同组启用互斥后,只执行排序最前的启用配置',\n 'form.exclusive.label': '互斥',\n 'form.exclusive.hint': '开启后,同一互斥组只执行排序最前的启用配置',\n 'form.dedupe.label': '去重方式',\n 'form.dedupe.hint': '控制配置的重复执行范围',\n 'form.promotion.label': '晋升范围',\n 'form.promotion.hint': '决定配置是否要求会话晋升',\n 'form.audience.label': '消息受众',\n 'form.audience.hint': '缺省(通用)=主会话与子代理都注入',\n 'form.modelScope.label': '模型范围',\n 'form.modelScope.hint': '限制配置生效的模型类型',\n 'form.text.label': '注入内容',\n 'form.text.hint': '留空时不注入;支持使用 {{key}} 引用模板变量',\n 'form.text.aria': '注入内容(空 = 不注入)',\n 'form.text.fileTarget': '该编辑框直接对应磁盘文件:{path};保存后写入原文件,不经预设。',\n 'form.text.fileReadOnly': '文件当前不可读或磁盘版本已变化:正文保持只读,重新读取后再编辑或保存。',\n 'file.bindingLocked': '插入点、角色、消息表单、填充来源与去重规则由指令文件来源固定:卡片不可改这些绑定,改绑定请调整预设或独立策略。',\n 'file.policyNote': '卡内的启停、顺序、位置、晋升、受众与模型范围写独立指令策略($DSH_HOME/.prompt-tool/instructions.yml),不写 preset.yml,并直接决定后续注入(默认关闭)。策略只影响未来的注入,不撤回已进入会话历史的内容;文件内容变化会在下一个合适时机注入一次新版本。',\n 'form.fill.label': '填充来源',\n 'form.fill.hint': '选择动态内容的来源',\n 'form.sourceKind.label': '来源类型',\n 'form.sourceKind.hint': '设置注入消息的来源标记;默认使用配置标识',\n 'form.form.label': '消息形式',\n 'form.form.hint': '设置注入消息的呈现形式',\n 'form.summary.label': '摘要',\n 'form.summary.hint': '注入消息的简短说明',\n 'form.templateFile.label': '模板文件',\n 'form.templateFile.hint': '从预设目录读取内容模板',\n 'form.identity.scope.label': '幂等范围',\n 'form.identity.scope.hint': '决定重复配置的识别范围',\n 'form.identity.value.label': '幂等值',\n 'form.identity.value.hint': '留空时使用配置标识',\n 'form.subject.label': '匹配对象',\n 'form.subject.hint': '条件判定读取的文本;选「层缺省」时不写该字段,由所在层决定',\n 'form.subject.defaultHint': '当前未声明匹配对象:本层缺省使用「{value}」。',\n 'form.match.group': '条件判定',\n 'form.match.hint': '匹配键按字面文本匹配(正则元字符自动转义);要按正则匹配请写成 /pattern/flags,或开启「正则匹配」。至少填一个主键或副键才会生效;留空 = 无条件命中。',\n 'form.match.keys.label': '主键',\n 'form.match.keys.hint': '主键命中即参与组合逻辑判定',\n 'form.match.keys.placeholder': '匹配键,回车添加',\n 'form.match.secondaryKeys.label': '副键',\n 'form.match.secondaryKeys.hint': '与主键共同参与组合逻辑判定',\n 'form.match.secondaryKeys.placeholder': '副键,回车添加',\n 'form.match.logic.label': '组合逻辑',\n 'form.match.logic.hint': '主键与副键的组合判定方式',\n 'form.match.caseSensitive.label': '区分大小写',\n 'form.match.caseSensitive.hint': '开启后匹配区分大小写',\n 'form.match.wholeWords.label': '整词匹配',\n 'form.match.wholeWords.hint': '开启后键必须作为完整词出现',\n 'form.match.useRegex.label': '键的匹配方式',\n 'form.match.useRegex.hint': '键默认按字面文本匹配(正则元字符会被转义);「自动」只在键写成 /pattern/flags 时按正则',\n 'form.match.useRegex.auto': '自动(键为 /…/ 时按正则)',\n 'form.match.useRegex.force': '强制正则',\n 'form.match.useRegex.literal': '强制字面',\n\n // 通用字段控件(OptionField / JsonField)。\n 'field.default': '(默认)',\n 'field.current': '{value}(当前值)',\n 'field.json.invalid': 'JSON 无效',\n 'field.json.mustBeObject': '必须是 JSON 对象',\n 'field.json.advanced': '高级参数(JSON)',\n\n // 注入层显示标签(PromptConfigList 筛选、配置卡 chips 与创建菜单)。\n 'layer.pre-step': '前置步骤',\n 'layer.system-section': '系统提示段',\n 'layer.runtime-context': '运行上下文',\n 'layer.agent-request': '代理请求',\n 'layer.llm-stream': '模型流',\n 'layer.tool-pipeline': '工具链',\n 'layer.turn-stop': '轮次停止层',\n 'layer.subagent-start': '子代理启动层',\n 'layer.subagent-end': '子代理结束层',\n\n // 枚举显示标签(值 → 键映射在 prompt-config-policy.ts)。\n 'audience.none': '公用(缺省)',\n 'audience.main': '仅主会话',\n 'audience.subagent': '仅子代理',\n // 条件判定的匹配对象与组合逻辑。\n 'subject.layerDefault': '层缺省',\n 'subject.toolArgs': '工具入参(toolArgs)',\n 'subject.toolResult': '工具结果(toolResult)',\n 'subject.userMessage': '用户消息(userMessage)',\n 'subject.assistantText': '助手输出(assistantText)',\n 'subject.subagentInfo': '子代理信息(subagentInfo)',\n 'match.any': '任一主键命中(any)',\n 'match.all': '主键命中且副键全命中(all)',\n 'match.not': '主键命中且副键全未命中(not)',\n 'match.notAny': '主键命中且至少一个副键未命中(notAny)',\n 'strategy.static': '固定文本',\n 'strategy.placeholder': '动态填充',\n 'strategy.firstTurnAnchor': '首轮锚定',\n 'strategy.guideAuto': '自动引导',\n 'strategy.customFallback': '自定义回退',\n 'strategy.worldBook': '世界书',\n 'slotKind.ordered': '顺序配置',\n 'slotKind.anchor': '固定锚点',\n 'role.user': '用户',\n 'position.afterUser': '用户消息后',\n 'position.beforeAll': '全部消息前',\n 'position.afterAll': '全部消息后',\n 'merge.separate': '分开发送',\n 'merge.merged': '合并发送',\n 'dedupe.none': '不去重',\n 'dedupe.session': '每会话一次',\n 'dedupe.batch': '当前批次',\n 'promotion.none': '不晋升',\n 'promotion.main': '主会话',\n 'promotion.subagents': '包含子代理',\n 'modelScope.all': '全部模型',\n 'modelScope.pro': '专业模型',\n 'modelScope.flash': '快速模型',\n 'fill.none': '未选择',\n 'fill.instructionHint': '指令提示',\n 'fill.envFacts': '环境信息',\n 'fill.skillCatalog': '技能目录',\n 'sourceKind.default': '默认',\n 'sourceKind.plugin': '插件',\n 'sourceKind.instructionHint': '指令提示',\n 'sourceKind.skillCatalog': '技能目录',\n 'sourceKind.envFacts': '环境信息',\n 'sourceKind.instructionFile': '指令文件正文',\n 'sourceForm.notice': '通知',\n 'sourceForm.hint': '提示',\n 'sourceForm.instructions': '指令正文',\n 'sourceForm.default': '默认',\n 'identity.plugin': '按插件',\n 'identity.kind': '按注入类型',\n 'emptyBehavior.skip': '跳过',\n 'emptyBehavior.text': '使用提示文本',\n 'selectiveLogic.0': '0 · 任一命中(默认)',\n 'selectiveLogic.1': '1 · 副键全排除',\n 'selectiveLogic.2': '2 · 部分排除',\n 'selectiveLogic.3': '3 · 副键全包含',\n\n // 按内容策略拆解的参数(StrategyParamsFields)。\n 'strategyParam.sectionName.label': '段名',\n 'strategyParam.sectionName.hint': '留空时使用配置标识;同名段会覆盖已有段',\n 'strategyParam.complete.label': '独占',\n 'strategyParam.complete.hint': '开启后系统提示只保留本段;同一预设只能启用一个',\n 'strategyParam.suppressRuntimeContext.label': '动态抑制',\n 'strategyParam.suppressRuntimeContext.hint': '开启后不附加运行时上下文',\n 'strategyParam.contextName.label': '注册名',\n 'strategyParam.contextName.hint': '注册到运行上下文的段名;留空时使用配置标识',\n 'strategyParam.patch.label': '请求配置补丁',\n 'strategyParam.patch.hint': '浅合并进本次调用的 LlmCallConfig(JSON 对象);空对象等于不改动',\n 'strategyParam.replace.label': '整体替换',\n 'strategyParam.replace.hint': '开启后丢弃基线调用配置,只用上方补丁',\n 'strategyParam.mode.label': '模型流模式',\n 'strategyParam.mode.hint': '透传时不改动模型流;替换时用本配置正文替代整个模型流',\n 'strategyParam.mode.pass': '透传',\n 'strategyParam.mode.replace': '替换',\n 'strategyParam.toolNames.label': '生效工具',\n 'strategyParam.toolNames.hint': '工具名逗号分隔;留空等于匹配所有已注册工具,做定向门时不要留空',\n 'strategyParam.preDecision.label': '执行前裁决',\n 'strategyParam.preDecision.hint': '命中条件的工具调用在 pre-execute 如何裁决',\n 'strategyParam.preDecision.allow': '放行',\n 'strategyParam.preDecision.deny': '拒绝',\n 'strategyParam.preDecision.ask': '询问',\n 'strategyParam.denyReason.label': '拒绝理由',\n 'strategyParam.denyReason.hint': '拒绝时回给模型的原因;留空使用引擎默认文案',\n 'strategyParam.postAction.label': '执行后裁决',\n 'strategyParam.postAction.hint': '命中条件的工具结果如何处理',\n 'strategyParam.postAction.accept': '接受',\n 'strategyParam.postAction.replace': '替换',\n 'strategyParam.postAction.block': '阻断',\n 'strategyParam.turnStopNote': '本层没有可写实例参数:续跑上限由引擎固定,不开放配置。',\n 'strategyParam.subagentEndNote': '结束事件本身只通知结果。可选择仅记录,或向所属主会话投递上下文;不改写子代理结果,也不唤醒空闲主会话。',\n 'strategyParam.endAction.label': '结束后的行为',\n 'strategyParam.endAction.hint': '向主会话注入时,文本在该主会话下一次处理输入时生效;同一次子代理运行只投递一次。',\n 'strategyParam.endAction.observe': '仅记录结束',\n 'strategyParam.endAction.injectMain': '向主会话注入文本',\n 'strategyParam.request.hint': '本条规则修改模型调用配置,留空字段继承原请求。正文、工具列表与消息历史不属于此接口。',\n 'strategyParam.request.provider': '提供商标识',\n 'strategyParam.request.model': '模型标识',\n 'strategyParam.request.reasoningEffort': '思维程度',\n 'strategyParam.request.temperature': '采样温度',\n 'strategyParam.request.maxTokens': '最大输出 Token',\n 'strategyParam.request.stop': '停止序列',\n 'strategyParam.request.stopHint': '每行一条,保留序列内的空格;留空时继承原请求。',\n 'strategyParam.anchorManaged': '以下字段在当前产物中来自预设参数,这里只读回显;来源参数位于「本层引擎设置」。显式局部配置仍保留更高覆盖优先级,重建后按实际来源刷新。',\n 'strategyParam.managed.local': '当前产物使用此配置的局部覆盖;下方字段可在此编辑,未声明的字段使用配置缺省值。',\n 'strategyParam.managed.source': '来源参数:{param}',\n 'strategyParam.managed.derived': '计算结果',\n 'strategyParam.managed.empty': '空(引擎缺省)',\n 'strategyParam.managed.followsCustom': '随自定义引导开关切换模型范围',\n 'strategyParam.guideManaged': '以下字段在当前产物中来自预设参数,这里只读回显;来源参数位于「本层引擎设置」。显式局部配置仍保留更高覆盖优先级,重建后按实际来源刷新。',\n 'strategyParam.custom.label': '自定义',\n 'strategyParam.custom.hint': '开启后固定使用自定义文本;关闭后按任务自动选择',\n 'strategyParam.anchorText.label': '自定义锚文本',\n 'strategyParam.anchorText.hint': '启用自定义时固定注入此文本',\n 'strategyParam.buildPattern.label': '构建任务规则',\n 'strategyParam.buildPattern.hint': '命中后使用构建引导',\n 'strategyParam.complexPattern.label': '复杂任务规则',\n 'strategyParam.complexPattern.hint': '命中后使用深度引导',\n 'strategyParam.firstTurnBuild': '构建引导',\n 'strategyParam.firstTurnInspect': '排查引导',\n 'strategyParam.deepGuide': '深度引导',\n 'strategyParam.guideText.label': '自定义引导',\n 'strategyParam.guideText.hint': '启用自定义时固定注入此文本',\n 'strategyParam.guideReuse': '复杂任务沿用锚定模块的复杂任务规则。',\n 'strategyParam.guideWeak': '简短引导',\n 'strategyParam.firstTurnWord.label': '触发词',\n 'strategyParam.firstTurnWord.hint': '晋升后的首个推理内容命中此词时注入',\n 'strategyParam.constant.label': '常驻',\n 'strategyParam.constant.hint': '开启后每轮注入;关闭后仅关键词命中时注入',\n 'strategyParam.keys.label': '主关键词',\n 'strategyParam.keys.hint': '消息命中任一关键词时注入',\n 'strategyParam.keys.placeholder': '关键字,回车添加',\n 'strategyParam.secondaryKeys.label': '次关键词',\n 'strategyParam.secondaryKeys.hint': '与主关键词共同参与触发判断',\n 'strategyParam.secondaryKeys.placeholder': '次级关键字,回车添加',\n 'strategyParam.caseSensitive.label': '区分大小写',\n 'strategyParam.caseSensitive.hint': '开启后关键词必须匹配大小写',\n 'strategyParam.wholeWords.label': '整词匹配',\n 'strategyParam.wholeWords.hint': '开启后关键词必须作为完整词出现',\n 'strategyParam.useRegex.label': '正则匹配',\n 'strategyParam.useRegex.hint': '开启后主次关键词按正则表达式匹配',\n 'strategyParam.selectiveLogic.label': '触发逻辑',\n 'strategyParam.selectiveLogic.hint': '控制主关键词与次关键词的组合判断方式',\n 'strategyParam.fillText.label': '自定义提示',\n 'strategyParam.fillText.hint': '覆盖文件和动态探测内容;留空时使用默认值',\n 'strategyParam.envKeys.label': '环境变量',\n 'strategyParam.envKeys.hint': '允许读取的环境变量;逗号分隔,留空时使用默认值',\n 'strategyParam.limit.label': '数量上限',\n 'strategyParam.limit.hint': '填写正整数;留空时不限制',\n 'strategyParam.fields.label': '返回字段',\n 'strategyParam.fields.hint': '技能目录返回的字段;逗号分隔',\n 'strategyParam.providers.label': '来源白名单',\n 'strategyParam.providers.hint': '允许使用的技能来源;逗号分隔,留空时允许全部',\n 'strategyParam.emptyBehavior.label': '空结果处理',\n 'strategyParam.emptyBehavior.hint': '无内容时选择跳过或注入提示文本',\n 'strategyParam.emptyText': '空结果提示',\n 'strategyParam.noParams': '本策略无额外参数;模板变量可在上方编辑。',\n\n // 模板变量编辑器与预设级变量卡(VariablesEditor / PromptConfigsEditor)。\n 'variables.title': '模板变量',\n 'variables.cardMeta': '预设级 {{key}} 插值 · {count} 个变量',\n 'variables.toggleDisable': '点击停用模板变量插值',\n 'variables.toggleEnable': '点击启用模板变量插值',\n 'variables.enableAria': '启用模板变量插值',\n 'variables.confirmClear': '确认清空',\n 'variables.cancel': '取消',\n 'variables.delete': '删除',\n 'variables.disabledHint': '模板变量插值已停用:{{key}} 将不再被替换(预设级变量文件不生成)。',\n 'variables.add': '添加',\n 'variables.empty': '暂无变量;可使用 {{key}} 引用。',\n 'variables.nameAria': '模板变量名',\n 'variables.valueAria': '模板变量值',\n 'variables.namePlaceholder': '变量名',\n 'variables.valuePlaceholder': '变量值',\n 'variables.removeAria': '删除变量 {name}',\n\n // 内置模板浮层(TemplatePicker)。\n 'templates.aria': '选择内置模板',\n 'templates.title': '选择内置模板({layer})',\n 'templates.closeAria': '关闭模板选择',\n 'templates.group.variables': '变量',\n 'templates.variables.hint': '模板变量(预设级 {{key}} 插值)',\n 'templates.empty': '本层暂无内置模板。',\n 'templates.group.tools': '工具',\n 'templates.loadFailed': '读取模板库失败:{reason}',\n 'templates.emptyList': '读取模板库失败:模板列表为空',\n 'templates.duplicateId': 'id 已存在:{id}(请先改名或删除同 id 配置)',\n 'templates.inserted': '已插入模板 {file}(id={id})',\n 'templates.layer.pre-step': '消息批层',\n 'templates.layer.system-section': '系统段层',\n 'templates.layer.runtime-context': '运行上下文',\n 'templates.layer.agent-request': '调用配置层',\n 'templates.layer.llm-stream': '模型流层',\n 'templates.layer.tool-pipeline': '工具管线层',\n 'templates.layer.turn-stop': '轮次停止层',\n 'templates.layer.subagent-start': '子代理启动层',\n 'templates.layer.subagent-end': '子代理结束层',\n\n // 人设卡(PresetPersonaCard)。\n 'persona.name': '人设',\n 'persona.meta.declared': 'preset.yml 顶层 persona · 官方 @deepseek-ai/dsh-persona 行同构',\n 'persona.meta.inherited': '未声明:继承宿主部署人设',\n 'persona.prefix.label': '前缀 prefix',\n 'persona.prefix.aria': '人设前缀',\n 'persona.prefix.hint': '渲染为 deployment:persona-prefix(第一方指导之前,官方 order 0);支持 {{model}} / {{cwd}} 等官方变量;留空 = 该段渲染时丢弃。',\n 'persona.suffix.label': '后缀 suffix',\n 'persona.suffix.aria': '人设后缀',\n 'persona.suffix.hint': '渲染为 deployment:persona-suffix(第一方指导之后,官方 order 10200);留空 = 遮蔽宿主后缀。',\n 'persona.complete.label': '独占',\n 'persona.complete.hint': 'prefix 成为唯一系统提示段;与提示词配置的「独占」互斥',\n 'persona.runtimeContext.label': '动态运行时上下文',\n 'persona.runtimeContext.hint': '关闭 = 该 scope 不附加动态快照(官方 includeRuntimeContext:false)',\n 'persona.saving': '保存中…',\n 'persona.save': '保存人设',\n 'persona.remove': '移除人设段',\n 'persona.notice.loadFailed': '人设读取失败',\n 'persona.notice.saved': '人设已保存并重建',\n 'persona.notice.removed': '已移除人设段(回落宿主部署人设)',\n 'persona.notice.saveFailed': '人设保存失败',\n} as const\n\nexport const PROMPTS_EN: Record<keyof typeof PROMPTS_ZH, string> = {\n 'variables.deleteTitle': 'Clear template variables?',\n 'variables.deleteDescription': 'Clear all template variables in this preset. Prompt configurations are retained.',\n 'variables.deleteFailed': 'Could not clear template variables. Try again.',\n 'card.actionsAria': 'Actions for {name}',\n 'card.deleteTitle': 'Delete {name}',\n 'card.deleteDescription': 'Remove “{name}” and its configuration from this preset.',\n 'card.reloadTitle': 'Reload {name}',\n 'card.reloadDescription': 'Reload discards the unsaved draft of “{name}” and uses the current disk content.',\n 'card.operationFailed': 'Operation failed. Try again.',\n 'card.fileConflictDetail': 'The disk version changed. Your local draft is preserved.',\n 'card.fileMissing': 'File missing',\n 'card.fileTooLarge': 'File exceeds the read limit',\n 'card.chip.audience': 'Audience: {value}',\n 'card.unsaved': 'Unsaved changes',\n 'field.number.invalid': 'Enter a valid number',\n 'field.number.integer': 'Enter a valid integer',\n 'customTools.invalidDraft': 'Correct the JSON or numeric tool input before saving.',\n 'persona.removeDescription': 'Remove the persona from this preset and discard its unsaved edits.',\n 'presetSwitcher.delete.description': 'Permanently delete the user copy of preset “{name}”. Instruction files are unaffected.',\n 'characters.delete.description': 'Permanently delete “{name}” from the character library. Content already applied to presets is retained.',\n 'configs.saveScope': 'Configurations save automatically. This action validates and saves configurations and edited instruction files. Tools, persona, parameters and policies save separately.',\n 'configs.notice.savedSnapshot': 'This configuration snapshot was saved. Later edits remain in your draft.',\n 'configs.notice.saveIncomplete': 'Some configurations or instruction files were not saved. Review the errors and retry.',\n 'configs.notice.valid': 'Configuration validation passed',\n 'configs.clearFilters': 'Clear filters',\n 'configs.showAll': 'Show all',\n 'configs.createdHidden': 'The new item is hidden by the current filters.',\n 'configs.searchSorting': 'Sorting is paused during search. Clear the search to reorder within an insertion point.',\n 'configs.batch.enableVisible': 'Enable {count} visible',\n 'configs.batch.disableVisible': 'Disable {count} visible',\n 'configs.view.insertion': 'Insertion point',\n 'configs.view.strategy': 'Content strategy',\n 'configs.createFirst': 'Create your first configuration',\n 'configs.chooseEditable': 'Select or create an editable preset',\n 'configs.readOnly.disabled': 'Preset writing is off. Enable it in preset settings.',\n 'configs.readOnly.system': 'This preset is read-only. Select an editable preset.',\n 'workspace.refreshing': 'Refreshing; current data is retained',\n 'workspace.retry': 'Reload',\n 'configs.heading.all': 'Module list',\n 'configs.heading.layer': 'Layer configs',\n 'configs.meta': '{total} configs · {enabled} enabled; move up/down to reorder within the layer.',\n 'configs.validate': 'Validate',\n 'configs.validating': 'Validating…',\n 'configs.save': 'Save configurations',\n 'configs.saving': 'Saving…',\n 'configs.filter.aria': 'Filter prompt configs',\n 'configs.filter.placeholder': 'Filter prompt configs by id / name…',\n 'configs.view.aria': 'Filter by layer or strategy',\n 'configs.view.all': 'All',\n 'configs.view.worldBook': 'World book',\n 'worldBookDiag.title': 'World book diagnostics (last injection)',\n 'worldBookDiag.hint': 'Read-only: candidate, selected and committed reasons come from the engine itself and never change the selection or timers.',\n 'worldBookDiag.refresh': 'Refresh diagnostics',\n 'worldBookDiag.empty': 'No world book records for this session yet (send a message that hits a world book entry first).',\n 'worldBookDiag.truncated': 'Records exceed the limit; showing the first 200.',\n 'worldBookDiag.failed': 'Failed to read diagnostics: {reason}',\n 'worldBookDiag.stage.excluded': 'Not considered',\n 'worldBookDiag.stage.rejected': 'Rejected',\n 'worldBookDiag.stage.candidate': 'Candidate',\n 'worldBookDiag.stage.selected': 'Selected',\n 'worldBookDiag.stage.committed': 'Injected',\n 'configs.view.layer': 'Layer: {layer}',\n 'configs.batch.enable': 'Enable',\n 'configs.batch.disable': 'Disable',\n 'configs.error.missingId': '(missing id)',\n 'configs.empty.subagent.title': 'No config is visible to subagents yet',\n 'configs.empty.subagent.desc': 'Insert one with \"New\" above (then use the card\\'s audience menu to switch between main-only / shared / subagent-only), or import a directory under \"Configs\" in the main settings.',\n 'configs.empty.all.title': 'No custom configs yet',\n 'configs.empty.all.desc': 'Insert one from a template above, or import from a local directory; the four built-in configs are unaffected.',\n 'configs.empty.layer.title': 'No content in the \"{layer}\" layer yet',\n 'configs.empty.layer.desc': 'Use \"Add injection template\" above to add a config here. Add capabilities and chained modules in this layer’s settings; empty cards are never created automatically.',\n 'configs.noMatch': 'No config matches \"{keyword}\".',\n 'configs.noMatch.modules': 'No prompt config matches \"{keyword}\"; capability modules are not affected by this search.',\n 'configs.notice.validateFailed': 'Validation request failed: {reason}',\n 'configs.notice.saved': 'Validated and saved ({count} prompt configs)',\n 'configs.notice.saveFailed': 'Save failed: {reason}',\n 'instructions.source.label': 'Independent instruction-file source',\n 'instructions.source.disabled': 'Off: file switches have no effect until you explicitly enable the independent source',\n 'instructions.source.enabled': 'On: independent policy applies to future injections; content already in the session is not removed',\n 'instructions.source.unavailable': 'Instruction policy could not be read; source switch is unavailable: {reason}',\n 'instructions.source.ownerConflict': 'Official instructions still own injection; the independent source skips this injection. This switch does not take over ownership',\n 'configs.notice.copied': 'Copied',\n 'configs.notice.deleted': 'Deleted',\n 'configs.editor.aria': 'Main-session module list',\n 'configs.common.aria': 'Shared configuration',\n 'configs.note.preset': 'Prompt configs are written into the active preset\\'s preset.yml (stored with the preset, not in settings); external prompt configs can be brought in via \"Presets → Import preset\".',\n 'configs.note.variables': 'An empty template-variable value is a valid placeholder ({{key}} dynamic reference) and is never treated as deleting the key.',\n\n 'card.dragHint': 'Drag to reorder',\n 'card.enableHint': 'Click to enable',\n 'card.disableHint': 'Click to disable',\n 'card.enableAria': 'Enable {name}',\n 'card.moveUp': 'Move up',\n 'card.moveDown': 'Move down',\n 'card.duplicate': 'Duplicate',\n 'card.delete': 'Delete',\n 'card.confirmDelete': 'Confirm delete',\n 'card.cancel': 'Cancel',\n 'card.chip.position': 'Position: {value}',\n 'card.chip.merged': 'Merged send',\n 'card.chip.order': 'Order: {order}',\n 'card.chip.group': 'Group: {name}',\n 'card.chip.exclusiveGroup': 'Exclusive group: {name}',\n 'card.chip.fileDirty': 'Unsaved',\n 'card.chip.fileSaving': 'Saving',\n 'card.chip.fileConflict': 'Changed on disk — reload required',\n 'card.chip.fileUnavailable': 'File unreadable',\n 'card.fileStatusDetail': 'Instruction file status: {message}',\n 'card.saveFile': 'Save to file',\n 'card.reloadFile': 'Reload',\n\n 'form.section.basic': 'Basics',\n 'form.navigation.label': 'Edit configuration',\n 'form.navigation.conditions': 'Conditions',\n 'form.navigation.execution': 'Execution',\n 'form.navigation.settings': 'Settings',\n 'form.navigation.invalid': 'Unresolved input errors',\n 'form.section.rules': 'Injection rules',\n 'form.section.scope': 'Scope',\n 'form.section.content': 'Content',\n 'form.section.strategy': 'Rule behavior',\n 'form.text.stream': 'Replacement model output',\n 'form.text.toolResult': 'Tool result or blocking feedback',\n 'form.text.mainSession': 'Text injected into the main session',\n 'form.text.actionHint': 'This text is used only by the selected behavior above.',\n 'form.layerSettings.label': 'Shared layer settings ({layer})',\n 'form.layerSettings.hint': 'These settings control the current preset’s capabilities associated with {layer} and are shared by all rules in the layer. Changes affect other cards; other views edit only this rule.',\n 'form.advanced.label': 'Advanced metadata',\n 'form.advanced.setCount': 'Advanced metadata · {count} set',\n 'form.id.label': 'ID',\n 'form.id.hint': 'Unique identifier of the config; must not be empty',\n 'form.name.label': 'Name',\n 'form.name.hint': 'Name shown in the module list',\n 'form.layer.label': 'Injection layer',\n 'form.layer.hint': 'Where the prompt content is injected',\n 'form.strategy.label': 'Content strategy',\n 'form.strategy.hint': 'How the prompt content is produced',\n 'form.kind.label': 'Config kind',\n 'form.kind.hint': 'Ordered configs sort by their order value; a fixed anchor takes precedence',\n 'form.role.label': 'Message role',\n 'form.role.hint': 'Role used by the injected message; the message batch only accepts User',\n 'form.position.label': 'Insert position',\n 'form.position.hint': 'Where the content sits among same-layer messages',\n 'form.merge.label': 'Merge mode',\n 'form.merge.hint': 'Whether same-position content is sent as one message',\n 'form.order.label': 'Order',\n 'form.order.hint': 'Smaller values come first',\n 'form.order.insert': 'Insert at an official position…',\n 'form.order.insertLast': 'After all official positions',\n 'form.order.layerOnly': 'Order here only sorts configs within this layer; it does not map to an official assembly position',\n 'orderGroup.identity': 'Before identity and persona',\n 'orderGroup.policy': 'Policy and references',\n 'orderGroup.tools': 'Tool guidance',\n 'orderGroup.sdk': 'SDK and external surface',\n 'orderGroup.deliverable': 'Deliverables and structured output',\n 'orderGroup.closing': 'Persona closing',\n 'orderGroup.runtimePolicy': 'Runtime policy',\n 'form.group.label': 'Exclusive group',\n 'form.group.hint': 'With exclusivity on, only the first enabled config of the group runs',\n 'form.exclusive.label': 'Exclusive',\n 'form.exclusive.hint': 'When on, only the first enabled config of the same exclusive group runs',\n 'form.dedupe.label': 'Dedupe mode',\n 'form.dedupe.hint': 'Scope in which the config may run only once',\n 'form.promotion.label': 'Promotion scope',\n 'form.promotion.hint': 'Whether the config requires the session to be promoted',\n 'form.audience.label': 'Audience',\n 'form.audience.hint': 'Unset (shared) = injected for both the main session and subagents',\n 'form.modelScope.label': 'Model scope',\n 'form.modelScope.hint': 'Restrict the config to a model class',\n 'form.text.label': 'Injected content',\n 'form.text.hint': 'Empty means no injection; {{key}} references a template variable',\n 'form.text.aria': 'Injected content (empty = no injection)',\n 'form.text.fileTarget': 'This editor maps to the file on disk: {path}; saving writes that file, not the preset.',\n 'form.text.fileReadOnly': 'The file is unreadable or changed on disk: the body stays read-only until you reload it.',\n 'file.bindingLocked': 'Injection point, role, message form, fill source and dedupe are fixed by the instruction-file origin; edit the preset or the independent policy to change them.',\n 'file.policyNote': 'The enable switch, order, position, promotion, audience and model scope live in the independent instruction policy ($DSH_HOME/.prompt-tool/instructions.yml), not in preset.yml, and they drive subsequent injection (disabled by default). The policy never retracts what was already sent; a changed file is injected once at the next suitable step.',\n 'form.fill.label': 'Fill source',\n 'form.fill.hint': 'Source of the dynamic content',\n 'form.sourceKind.label': 'Source kind',\n 'form.sourceKind.hint': 'Source tag of the injected message; defaults to the config ID',\n 'form.form.label': 'Message form',\n 'form.form.hint': 'Presentation form of the injected message',\n 'form.summary.label': 'Summary',\n 'form.summary.hint': 'Short description of the injected message',\n 'form.templateFile.label': 'Template file',\n 'form.templateFile.hint': 'Read the content template from the preset directory',\n 'form.identity.scope.label': 'Idempotency scope',\n 'form.identity.scope.hint': 'How duplicate configs are recognized',\n 'form.identity.value.label': 'Idempotency value',\n 'form.identity.value.hint': 'Defaults to the config ID when empty',\n 'form.subject.label': 'Match subject',\n 'form.subject.hint': 'Text the condition reads; \"layer default\" writes no subject and lets the layer decide',\n 'form.subject.defaultHint': 'No subject is declared: this layer defaults to \"{value}\".',\n 'form.match.group': 'Condition',\n 'form.match.hint': 'Keys match literal text (regular-expression metacharacters are escaped); write /pattern/flags or turn on \"Regular expressions\" to match by regex. At least one primary or secondary key is required; empty means the condition always hits.',\n 'form.match.keys.label': 'Primary keys',\n 'form.match.keys.hint': 'A hit on any primary key enters the combination logic',\n 'form.match.keys.placeholder': 'Type a key and press Enter',\n 'form.match.secondaryKeys.label': 'Secondary keys',\n 'form.match.secondaryKeys.hint': 'Combined with the primary keys by the combination logic',\n 'form.match.secondaryKeys.placeholder': 'Type a secondary key and press Enter',\n 'form.match.logic.label': 'Combination logic',\n 'form.match.logic.hint': 'How primary and secondary keys combine',\n 'form.match.caseSensitive.label': 'Case sensitive',\n 'form.match.caseSensitive.hint': 'When on, matching is case sensitive',\n 'form.match.wholeWords.label': 'Whole words',\n 'form.match.wholeWords.hint': 'When on, keys must appear as whole words',\n 'form.match.useRegex.label': 'Key matching',\n 'form.match.useRegex.hint': 'Keys match literally by default (regex metacharacters are escaped); Auto treats /pattern/flags keys as regex',\n 'form.match.useRegex.auto': 'Auto (/…/ keys as regex)',\n 'form.match.useRegex.force': 'Force regex',\n 'form.match.useRegex.literal': 'Force literal',\n\n 'field.default': '(default)',\n 'field.current': '{value} (current)',\n 'field.json.invalid': 'Invalid JSON',\n 'field.json.mustBeObject': 'Must be a JSON object',\n 'field.json.advanced': 'Advanced parameters (JSON)',\n\n 'layer.pre-step': 'Pre-step',\n 'layer.system-section': 'System section',\n 'layer.runtime-context': 'Runtime context',\n 'layer.agent-request': 'Agent request',\n 'layer.llm-stream': 'Model stream',\n 'layer.tool-pipeline': 'Tool pipeline',\n 'layer.turn-stop': 'Turn stop',\n 'layer.subagent-start': 'Subagent start',\n 'layer.subagent-end': 'Subagent end',\n\n 'audience.none': 'Shared (default)',\n 'audience.main': 'Main session only',\n 'audience.subagent': 'Subagents only',\n 'subject.layerDefault': 'Layer default',\n 'subject.toolArgs': 'Tool arguments (toolArgs)',\n 'subject.toolResult': 'Tool result (toolResult)',\n 'subject.userMessage': 'User message (userMessage)',\n 'subject.assistantText': 'Assistant text (assistantText)',\n 'subject.subagentInfo': 'Subagent info (subagentInfo)',\n 'match.any': 'Any primary key hits (any)',\n 'match.all': 'Primary key plus all secondary keys hit (all)',\n 'match.not': 'Primary key hits and no secondary key hits (not)',\n 'match.notAny': 'Primary key hits and at least one secondary key misses (notAny)',\n 'strategy.static': 'Static text',\n 'strategy.placeholder': 'Dynamic fill',\n 'strategy.firstTurnAnchor': 'First-turn anchor',\n 'strategy.guideAuto': 'Automatic guide',\n 'strategy.customFallback': 'Custom fallback',\n 'strategy.worldBook': 'World book',\n 'slotKind.ordered': 'Ordered config',\n 'slotKind.anchor': 'Fixed anchor',\n 'role.user': 'User',\n 'position.afterUser': 'After the user message',\n 'position.beforeAll': 'Before all messages',\n 'position.afterAll': 'After all messages',\n 'merge.separate': 'Send separately',\n 'merge.merged': 'Merge into one message',\n 'dedupe.none': 'No dedupe',\n 'dedupe.session': 'Once per session',\n 'dedupe.batch': 'Current batch',\n 'promotion.none': 'No promotion',\n 'promotion.main': 'Main session',\n 'promotion.subagents': 'Include subagents',\n 'modelScope.all': 'All models',\n 'modelScope.pro': 'Pro models',\n 'modelScope.flash': 'Flash models',\n 'fill.none': 'Not selected',\n 'fill.instructionHint': 'Instruction hint',\n 'fill.envFacts': 'Environment facts',\n 'fill.skillCatalog': 'Skill catalog',\n 'sourceKind.default': 'Default',\n 'sourceKind.plugin': 'Plugin',\n 'sourceKind.instructionHint': 'Instruction hint',\n 'sourceKind.skillCatalog': 'Skill catalog',\n 'sourceKind.envFacts': 'Environment facts',\n 'sourceKind.instructionFile': 'Instruction file',\n 'sourceForm.notice': 'Notice',\n 'sourceForm.hint': 'Hint',\n 'sourceForm.instructions': 'Instructions',\n 'sourceForm.default': 'Default',\n 'identity.plugin': 'By plugin',\n 'identity.kind': 'By injection kind',\n 'emptyBehavior.skip': 'Skip',\n 'emptyBehavior.text': 'Use the hint text',\n 'selectiveLogic.0': '0 · Any key matches (default)',\n 'selectiveLogic.1': '1 · No secondary key matches',\n 'selectiveLogic.2': '2 · Partial exclusion',\n 'selectiveLogic.3': '3 · All secondary keys match',\n\n 'strategyParam.sectionName.label': 'Section name',\n 'strategyParam.sectionName.hint': 'Defaults to the config ID; a same-name section replaces the existing one',\n 'strategyParam.complete.label': 'Exclusive',\n 'strategyParam.complete.hint': 'When on, the system prompt keeps only this section; one per preset',\n 'strategyParam.suppressRuntimeContext.label': 'Suppress runtime context',\n 'strategyParam.suppressRuntimeContext.hint': 'When on, no runtime context is attached',\n 'strategyParam.contextName.label': 'Registration name',\n 'strategyParam.contextName.hint': 'Section name registered as runtime context; empty uses the config ID',\n 'strategyParam.patch.label': 'Request config patch',\n 'strategyParam.patch.hint': 'Shallow-merged into the LlmCallConfig of this call (JSON object); an empty object changes nothing',\n 'strategyParam.replace.label': 'Replace wholesale',\n 'strategyParam.replace.hint': 'When on, the baseline call config is dropped and only the patch above is used',\n 'strategyParam.mode.label': 'Stream mode',\n 'strategyParam.mode.hint': 'Pass leaves the model stream untouched; replace substitutes this config text for the whole stream',\n 'strategyParam.mode.pass': 'Pass through',\n 'strategyParam.mode.replace': 'Replace',\n 'strategyParam.toolNames.label': 'Target tools',\n 'strategyParam.toolNames.hint': 'Comma-separated tool names; empty matches every registered tool, so leave it filled for a targeted gate',\n 'strategyParam.preDecision.label': 'Pre-execute decision',\n 'strategyParam.preDecision.hint': 'How a matching tool call is decided before execution',\n 'strategyParam.preDecision.allow': 'Allow',\n 'strategyParam.preDecision.deny': 'Deny',\n 'strategyParam.preDecision.ask': 'Ask',\n 'strategyParam.denyReason.label': 'Deny reason',\n 'strategyParam.denyReason.hint': 'Reason returned to the model on deny; empty uses the engine default',\n 'strategyParam.postAction.label': 'Post-execute decision',\n 'strategyParam.postAction.hint': 'How a matching tool result is handled',\n 'strategyParam.postAction.accept': 'Accept',\n 'strategyParam.postAction.replace': 'Replace',\n 'strategyParam.postAction.block': 'Block',\n 'strategyParam.turnStopNote': 'This layer has no writable instance parameters: the continuation cap is fixed by the engine and not configurable.',\n 'strategyParam.subagentEndNote': 'The end event reports an outcome. Choose to record it or inject context into the owning main session; this neither rewrites the child result nor wakes an idle main session.',\n 'strategyParam.endAction.label': 'On completion',\n 'strategyParam.endAction.hint': 'Injected text is consumed when the main session next processes input. Each child run is delivered once.',\n 'strategyParam.endAction.observe': 'Record completion only',\n 'strategyParam.endAction.injectMain': 'Inject text into the main session',\n 'strategyParam.request.hint': 'This rule changes the model call configuration. Empty fields inherit the original request. Text, tool lists, and message history are outside this interface.',\n 'strategyParam.request.provider': 'Provider ID',\n 'strategyParam.request.model': 'Model ID',\n 'strategyParam.request.reasoningEffort': 'Reasoning effort',\n 'strategyParam.request.temperature': 'Temperature',\n 'strategyParam.request.maxTokens': 'Maximum output tokens',\n 'strategyParam.request.stop': 'Stop sequences',\n 'strategyParam.request.stopHint': 'One sequence per line; spaces within a sequence are preserved. Leave empty to inherit.',\n 'strategyParam.anchorManaged': 'These fields in the current generated config come from preset parameters and are read-only here. Edit the parameters in this layer’s engine settings. Explicit local configs retain higher priority; rebuilding refreshes the actual sources.',\n 'strategyParam.managed.local': 'The current generated config uses this config’s local override. Edit the fields below; omitted fields use config defaults.',\n 'strategyParam.managed.source': 'Source parameter: {param}',\n 'strategyParam.managed.derived': 'computed',\n 'strategyParam.managed.empty': 'empty (engine default)',\n 'strategyParam.managed.followsCustom': 'model scope follows the custom-guide switch',\n 'strategyParam.guideManaged': 'These fields in the current generated config come from preset parameters and are read-only here. Edit the parameters in this layer’s engine settings. Explicit local configs retain higher priority; rebuilding refreshes the actual sources.',\n 'strategyParam.custom.label': 'Custom',\n 'strategyParam.custom.hint': 'When on, always use the custom text; when off, pick by task',\n 'strategyParam.anchorText.label': 'Custom anchor text',\n 'strategyParam.anchorText.hint': 'Injected as-is when the custom anchor is enabled',\n 'strategyParam.buildPattern.label': 'Build task pattern',\n 'strategyParam.buildPattern.hint': 'Matching tasks use the build guide',\n 'strategyParam.complexPattern.label': 'Complex task pattern',\n 'strategyParam.complexPattern.hint': 'Matching tasks use the deep guide',\n 'strategyParam.firstTurnBuild': 'Build guide',\n 'strategyParam.firstTurnInspect': 'Inspect guide',\n 'strategyParam.deepGuide': 'Deep guide',\n 'strategyParam.guideText.label': 'Custom guide',\n 'strategyParam.guideText.hint': 'Injected as-is when the custom guide is enabled',\n 'strategyParam.guideReuse': 'Complex tasks reuse the complex-task pattern of the anchor module.',\n 'strategyParam.guideWeak': 'Short guide',\n 'strategyParam.firstTurnWord.label': 'Trigger word',\n 'strategyParam.firstTurnWord.hint': 'Injected when the first reasoning after promotion contains this word',\n 'strategyParam.constant.label': 'Always on',\n 'strategyParam.constant.hint': 'When on, inject every turn; when off, only on keyword hits',\n 'strategyParam.keys.label': 'Primary keywords',\n 'strategyParam.keys.hint': 'Injected when any keyword hits the message',\n 'strategyParam.keys.placeholder': 'Type a keyword and press Enter',\n 'strategyParam.secondaryKeys.label': 'Secondary keywords',\n 'strategyParam.secondaryKeys.hint': 'Combined with the primary keywords for triggering',\n 'strategyParam.secondaryKeys.placeholder': 'Type a secondary keyword and press Enter',\n 'strategyParam.caseSensitive.label': 'Case sensitive',\n 'strategyParam.caseSensitive.hint': 'When on, keywords must match letter case',\n 'strategyParam.wholeWords.label': 'Whole words',\n 'strategyParam.wholeWords.hint': 'When on, keywords must appear as whole words',\n 'strategyParam.useRegex.label': 'Regular expressions',\n 'strategyParam.useRegex.hint': 'When on, keywords are matched as regular expressions',\n 'strategyParam.selectiveLogic.label': 'Trigger logic',\n 'strategyParam.selectiveLogic.hint': 'How primary and secondary keywords combine',\n 'strategyParam.fillText.label': 'Custom hint',\n 'strategyParam.fillText.hint': 'Overrides files and dynamic probing; empty uses the default',\n 'strategyParam.envKeys.label': 'Environment variables',\n 'strategyParam.envKeys.hint': 'Environment variables that may be read; comma-separated, empty uses the default',\n 'strategyParam.limit.label': 'Entry limit',\n 'strategyParam.limit.hint': 'A positive integer; empty means unlimited',\n 'strategyParam.fields.label': 'Returned fields',\n 'strategyParam.fields.hint': 'Fields returned by the skill catalog; comma-separated',\n 'strategyParam.providers.label': 'Source allowlist',\n 'strategyParam.providers.hint': 'Skill sources that may be used; comma-separated, empty allows all',\n 'strategyParam.emptyBehavior.label': 'Empty result',\n 'strategyParam.emptyBehavior.hint': 'Skip, or inject the hint text when nothing is found',\n 'strategyParam.emptyText': 'Empty-result hint',\n 'strategyParam.noParams': 'This strategy has no extra parameters; template variables are edited above.',\n\n 'variables.title': 'Template variables',\n 'variables.cardMeta': 'Preset-level {{key}} interpolation · {count} variables',\n 'variables.toggleDisable': 'Click to disable template-variable interpolation',\n 'variables.toggleEnable': 'Click to enable template-variable interpolation',\n 'variables.enableAria': 'Enable template-variable interpolation',\n 'variables.confirmClear': 'Confirm clear',\n 'variables.cancel': 'Cancel',\n 'variables.delete': 'Delete',\n 'variables.disabledHint': 'Template-variable interpolation is disabled: {{key}} is no longer replaced (no preset-level variable file is generated).',\n 'variables.add': 'Add',\n 'variables.empty': 'No variables yet; use {{key}} to reference one.',\n 'variables.nameAria': 'Template variable name',\n 'variables.valueAria': 'Template variable value',\n 'variables.namePlaceholder': 'Name',\n 'variables.valuePlaceholder': 'Value',\n 'variables.removeAria': 'Delete variable {name}',\n\n 'templates.aria': 'Choose a built-in template',\n 'templates.title': 'Choose a built-in template ({layer})',\n 'templates.closeAria': 'Close the template picker',\n 'templates.group.variables': 'Variables',\n 'templates.variables.hint': 'Template variables (preset-level {{key}} interpolation)',\n 'templates.empty': 'No built-in template in this layer.',\n 'templates.group.tools': 'Tools',\n 'templates.loadFailed': 'Failed to read the template library: {reason}',\n 'templates.emptyList': 'Failed to read the template library: the template list is empty',\n 'templates.duplicateId': 'The id already exists: {id} (rename or delete the config with the same id first)',\n 'templates.inserted': 'Inserted template {file} (id={id})',\n 'templates.layer.pre-step': 'Message batch',\n 'templates.layer.system-section': 'System section',\n 'templates.layer.runtime-context': 'Runtime context',\n 'templates.layer.agent-request': 'Agent request',\n 'templates.layer.llm-stream': 'Model stream',\n 'templates.layer.tool-pipeline': 'Tool pipeline',\n 'templates.layer.turn-stop': 'Turn stop',\n 'templates.layer.subagent-start': 'Subagent start',\n 'templates.layer.subagent-end': 'Subagent end',\n\n 'persona.name': 'Persona',\n 'persona.meta.declared': 'Top-level persona in preset.yml · same shape as the official @deepseek-ai/dsh-persona row',\n 'persona.meta.inherited': 'Not declared: inherits the host deployment persona',\n 'persona.prefix.label': 'Prefix',\n 'persona.prefix.aria': 'Persona prefix',\n 'persona.prefix.hint': 'Rendered as deployment:persona-prefix (before the first-party guidance, official order 0); supports official variables such as {{model}} / {{cwd}}; empty = dropped at render time.',\n 'persona.suffix.label': 'Suffix',\n 'persona.suffix.aria': 'Persona suffix',\n 'persona.suffix.hint': 'Rendered as deployment:persona-suffix (after the first-party guidance, official order 10200); empty = masks the host suffix.',\n 'persona.complete.label': 'Exclusive',\n 'persona.complete.hint': 'The prefix becomes the only system-prompt section; mutually exclusive with the prompt-config \"exclusive\" flag',\n 'persona.runtimeContext.label': 'Dynamic runtime context',\n 'persona.runtimeContext.hint': 'Off = this scope attaches no dynamic snapshot (official includeRuntimeContext:false)',\n 'persona.saving': 'Saving…',\n 'persona.save': 'Save persona',\n 'persona.remove': 'Remove persona section',\n 'persona.notice.loadFailed': 'Failed to read the persona',\n 'persona.notice.saved': 'Persona saved and rebuilt',\n 'persona.notice.removed': 'Persona section removed (falls back to the host deployment persona)',\n 'persona.notice.saveFailed': 'Failed to save the persona',\n}\n","/**\n * 子代理工具策略、自定义工具与角色卡相关的 UI 文案分区(命名空间 `prompt-tool`)。\n *\n * 约定(与 locales.ts 相同):zh 是键类型事实源,en 用 Record<keyof typeof zh, string>\n * 强制键集一致;只放用户可见文案,provider/model id、路径、用户内容、协议 code 不进字典。\n * 键前缀分区:`policy.`(工具与深度模块卡 + 实例级工具策略编辑器)、\n * `customTools.`(自定义工具列表容器)、`toolEditor.`(单张工具卡与字段编辑器)。\n * 角色卡页面(CharactersPage)文案在核心字典的 `characters.` 前缀;character-card.ts\n * 的解析错误不直接面向用户(PNG 走 host 上传),不进字典。\n */\nexport const CARDS_ZH = {\n // 子代理「工具与深度」模块卡(DelegationToolsCard;深度标签复用 param.maxDepth)。\n 'policy.delegation.name': '工具与深度',\n 'policy.delegation.meta': '委派递归深度(工具授权已归「subagent-tool-policy」能力卡)',\n 'policy.delegation.hint': '工具授权由「subagent-tool-policy」能力卡统一维护(授权上限、工具档与模型扩权);此处只保留子代理递归深度。',\n 'policy.delegation.policyMoved': '子代理工具策略已改为模块类型能力:在模块列表里启用/删除「subagent-tool-policy」能力卡,卡内编辑授权上限、工具档与模型扩权。',\n 'policy.delegation.depthHint': '0 表示禁止委派;服务商管理表示由服务商决定;正整数限制递归层数;留空使用默认值',\n 'policy.delegation.depthUnset': '(不设置)',\n 'policy.delegation.section': '子代理工具策略(subagentToolPolicy · 实例级授权)',\n\n // 实例级工具策略编辑器(SubagentToolPolicyCard):单一开关 + 自动保存。\n 'policy.title': '子代理工具策略',\n 'policy.titleHint': '模型只能在用户授权上限内选择工具;策略只影响后续新实例',\n 'policy.toggleLabel': '启用子代理工具策略',\n 'policy.status.enabled': '已启用({count} 档)',\n 'policy.status.disabled': '已关闭',\n 'policy.loading': '加载中…',\n 'policy.loadFailed': '子代理工具策略读取失败,请重试后再编辑。',\n 'policy.retry': '重试',\n 'policy.disabledHint': '策略已关闭:下方内容只读;打开开关即写入可用骨架并自动保存(模块声明保留,子代理回落到官方委派行为)。',\n 'policy.invalidBindings': '存在未选择或已失效的角色卡绑定,请删除或改绑。',\n 'policy.notice.autosaved': '子代理工具策略已自动保存并重建(既有子代理不变,仅影响新实例)',\n 'policy.notice.saveFailed': '策略保存失败',\n 'policy.notice.previewFailed': '预览失败',\n 'policy.removeBlocked': '不能删除工具档 {id}:仍被 {refs} 引用',\n 'policy.ref.character': '角色 {id}',\n 'policy.ref.task': '任务 {id}',\n 'policy.ref.separator': '、',\n 'policy.defaultProfile.label': '默认工具档',\n 'policy.defaultProfile.hint': '未命中任何 selector 时使用的 profile;须引用已存在 profile。',\n 'policy.ceiling.allow.label': '能力上限 allow',\n 'policy.ceiling.allow.hint': 'ceiling.allow:任何 profile/角色/任务/扩权都不能越界。',\n 'policy.ceiling.deny.label': '能力上限 deny',\n 'policy.ceiling.deny.hint': 'ceiling.deny:永远优先,不能通过任何 selector 或 additional_tools 恢复。',\n 'policy.profiles.hint': '工具档(profile):每个档位是模型可选的授权集合;模型可选=false 不进模型参数 enum。',\n 'policy.profile.id.hint': '工具档 id(模型参数 enum 值)。',\n 'policy.profile.name': '名称',\n 'policy.profile.name.hint': '工具档显示名称。',\n 'policy.profile.namePlaceholder': '名称',\n 'policy.profile.modelSelectable': '模型可选',\n 'policy.profile.modelSelectable.hint': '模型可选择:false 不进模型参数 enum。',\n 'policy.profile.copySuffix': '{name} 副本',\n 'policy.profile.removeAria': '删除 profile {id}',\n 'policy.addProfile': '添加工具档',\n 'policy.moveUp': '上移',\n 'policy.moveDown': '下移',\n 'policy.duplicate': '复制',\n 'policy.remove': '删除',\n 'policy.bindings.hint': '角色卡绑定:相同角色卡在不同预设可拥有不同权限;只决定工具档,不改变 persona/世界书。',\n 'policy.binding.character': '角色卡',\n 'policy.binding.character.hint': '绑定角色卡 id;失效绑定须删除或改绑后才能保存。',\n 'policy.binding.characterAria': '角色卡 id',\n 'policy.binding.empty': '(选择角色卡)',\n 'policy.binding.option': '{name}({id})',\n 'policy.binding.missing': '失效:{id}',\n 'policy.binding.profile': '工具档',\n 'policy.binding.profile.hint': '该角色卡使用的 profile。',\n 'policy.binding.profileAria': '绑定 profile',\n 'policy.binding.modelSelectable.hint': '模型可选择该角色绑定。',\n 'policy.binding.modelSelectableAria': '角色绑定模型可选择',\n 'policy.binding.removeAria': '删除绑定',\n 'policy.addBinding': '添加角色绑定',\n 'policy.rules.hint': '任务规则:order 升序、首个匹配获胜;输入 = description + prompt;无匹配回落 default。',\n 'policy.rule.id.hint': '任务规则 id。',\n 'policy.rule.idAria': '任务规则 id',\n 'policy.rule.name': '名称',\n 'policy.rule.name.hint': '任务规则显示名。',\n 'policy.rule.nameAria': '任务规则名',\n 'policy.rule.pattern': '正则',\n 'policy.rule.pattern.hint': '匹配 description + prompt 的正则表达式。',\n 'policy.rule.patternAria': '正则',\n 'policy.rule.patternPlaceholder': '(research|调研)',\n 'policy.rule.order.hint': 'order 升序、首个匹配获胜。',\n 'policy.rule.profile': '工具档',\n 'policy.rule.profile.hint': '命中后使用的 profile。',\n 'policy.rule.profileAria': '规则 profile',\n 'policy.rule.modelSelectable.hint': '模型可选择该任务类型。',\n 'policy.rule.modelSelectableAria': '任务规则模型可选择',\n 'policy.rule.invalidPattern': '正则无效',\n 'policy.rule.removeAria': '删除规则',\n 'policy.addRule': '添加任务规则',\n 'policy.expansion.enabled': '模型扩权',\n 'policy.expansion.enabled.hint': '启用模型扩权(additional_tools):additional_tools 严格限制在 expansion.allow ∩ ceiling.allow ∩ preset 可见工具内。',\n 'policy.expansion.enabledAria': '启用模型扩权',\n 'policy.expansion.approval': '扩权需人工批准',\n 'policy.expansion.approval.hint': '扩权前人工批准(无批准通道 fail closed)。',\n 'policy.expansion.max': '最大扩权数',\n 'policy.expansion.max.hint': 'maxAdditionalTools;0 = 关闭扩权参数。',\n 'policy.expansion.maxAria': '最大扩权数',\n 'policy.expansion.allow.label': '扩权 allow',\n 'policy.expansion.allow.hint': '模型可请求的附加工具(须在 ceiling 内)。',\n 'policy.preview.title': '实例解析预览',\n 'policy.preview.hint': '输入 description/prompt 与 selector,调用 host 同一 resolve seam 预览有效工具集;只读,不创建子代理。',\n 'policy.preview.toolAria': '预览工具',\n 'policy.preview.descriptionAria': '预览 description',\n 'policy.preview.promptAria': '预览 prompt',\n 'policy.preview.profileAria': '预览 tool_profile',\n 'policy.preview.profileEmpty': '(不指定 tool_profile)',\n 'policy.preview.characterAria': '预览 character_id',\n 'policy.preview.characterEmpty': '(不指定 character_id)',\n 'policy.preview.taskAria': '预览 task_type',\n 'policy.preview.taskEmpty': '(不指定 task_type)',\n 'policy.preview.run': '预览',\n 'policy.menu.empty': '(未选择)',\n 'policy.tagPlaceholder': '输入后回车添加',\n\n // 自定义工具容器(CustomToolsCard)。\n 'customTools.aria': '自定义工具编辑',\n 'customTools.fieldsAria': '自定义工具配置',\n 'customTools.hint': '在此新建空白工具或从模板插入;保存后生效。模型可见工具请到「工具预览」查看。',\n 'customTools.readonly': '当前预设工具只读;system 预设或未启用预设写入时不能编辑或保存。',\n 'customTools.loading': '正在读取自定义工具…',\n 'customTools.loadFailed': '自定义工具读取失败',\n 'customTools.retry': '重试读取',\n 'customTools.save': '保存',\n 'customTools.saving': '保存中…',\n 'customTools.saveFailed': '保存失败',\n 'customTools.saved': '已保存 {count} 个自定义工具(已重建)',\n 'customTools.duplicateId': '工具 id 已存在:{id}',\n 'customTools.templateInserted': '已插入工具模板 {id}(保存后生效)',\n\n // 单张工具卡与字段编辑器(CustomToolEditor)。\n 'toolEditor.params.label': 'parameters(模型可见参数 schema)',\n 'toolEditor.params.empty': '无参数;下方添加。required=true 时模型必须提供该参数。',\n 'toolEditor.params.nameAria': '参数名',\n 'toolEditor.params.namePlaceholder': '参数名',\n 'toolEditor.params.typeAria': '参数类型',\n 'toolEditor.params.requiredHint': '模型必须填写此参数',\n 'toolEditor.params.requiredAria': '必填',\n 'toolEditor.params.descriptionAria': '参数描述',\n 'toolEditor.params.descriptionPlaceholder': '描述',\n 'toolEditor.params.removeAria': '删除参数 {key}',\n 'toolEditor.params.remove': '删除',\n 'toolEditor.params.add': '添加参数',\n 'toolEditor.json.hint': '失焦提交合法 JSON;嵌套属性、items、oneOf、enum 等在此编辑。',\n 'toolEditor.json.mustBeObject': '必须是 JSON 对象',\n 'toolEditor.json.invalid': 'JSON 无效;修正后再保存工具',\n 'toolEditor.json.advanced': '高级参数 JSON',\n 'toolEditor.json.output': '输出 schema JSON',\n 'toolEditor.chip.params': '{count} 参数',\n 'toolEditor.enable.hint.on': '点击停用;停用后不注册工具',\n 'toolEditor.enable.hint.off': '点击启用',\n 'toolEditor.enable.aria': '启用工具 {id}',\n 'toolEditor.moveUp': '上移',\n 'toolEditor.moveDown': '下移',\n 'toolEditor.duplicate': '复制',\n 'toolEditor.remove': '删除',\n 'toolEditor.confirmRemove': '确认删除',\n 'toolEditor.cancel': '取消',\n 'toolEditor.field.id': 'id(文件标识)',\n 'toolEditor.field.idAria': '工具 id',\n 'toolEditor.field.name': 'name(模型可见名)',\n 'toolEditor.field.nameAria': '工具名',\n 'toolEditor.field.description': 'description(模型可见描述)',\n 'toolEditor.field.descriptionAria': '工具描述',\n 'toolEditor.field.descriptionPlaceholder': '描述该工具给模型看',\n 'toolEditor.field.kind': 'execute.kind(执行器)',\n 'toolEditor.field.kind.hint': 'shell=命令;http=请求;delegate=委托内置/已注册工具;fs=工作区文件;ask-user=询问用户',\n 'toolEditor.field.kindAria': '执行器',\n 'toolEditor.field.command.hint': '{{args.x}} 参数插值;env 白名单;cwd=会话工作区',\n 'toolEditor.field.commandAria': 'shell 命令',\n 'toolEditor.field.shell.hint': 'pwsh 强制 UTF-8 输出(中文不乱码)',\n 'toolEditor.field.url.hint': '{{args.x}} 参数插值',\n 'toolEditor.field.urlAria': '请求 URL',\n 'toolEditor.field.methodAria': '请求方法',\n 'toolEditor.field.delegate.hint': '内置工具:{names}',\n 'toolEditor.field.delegate': 'tool(委托目标)',\n 'toolEditor.field.delegateAria': '委托目标工具',\n 'toolEditor.field.fsActionAria': 'fs 动作',\n 'toolEditor.field.path.hint': '相对工作区路径;越界拒绝',\n 'toolEditor.field.pathAria': '文件路径',\n 'toolEditor.field.content.hint': '写入或追加的文本;支持 {{args.x}},空文本会写入空内容',\n 'toolEditor.field.contentAria': '文件内容',\n 'toolEditor.field.question': 'question(向用户确认的问题)',\n 'toolEditor.field.questionAria': '询问问题',\n 'toolEditor.field.questionPlaceholder': '是否继续执行该操作?',\n 'toolEditor.timeout.hint': '正整数毫秒,留空使用执行器默认;最大 2147483647。',\n 'toolEditor.timeoutAria': '工具超时毫秒',\n 'toolEditor.timeout.invalid': '超时必须是 1–2147483647 的整数',\n 'importPreview.title': '导入预览(先确认再写入)',\n 'importPreview.summary': '来源条目 {inputs} · 生成配置 {converted} · 禁用 {disabled} · 降级 {degraded} · 不支持 {unsupported} · 被排除 {excluded}',\n 'importPreview.review': '需要确认:{count} 项',\n 'importPreview.reviewAria': '需要确认的有损信息,共 {count} 项',\n 'importPreview.info': '提示(不改变写入结果):{count} 项',\n 'importPreview.infoAria': '提示级降级信息,共 {count} 项',\n 'importPreview.excluded': '被排除条目:{count} 项',\n 'importPreview.excludedAria': '被排除条目,共 {count} 项',\n 'importPreview.excludedItem': '来源条目 {source}({codes})',\n 'importPreview.diagSource': '来源 {source}',\n 'importPreview.diagTarget': '目标 {target}',\n 'importPreview.none': '未发现降级、不支持或排除项',\n 'importPreview.truncated': '报告已达服务端上限:已展示 {entries} 条条目、{diagnostics} 条诊断,来源条目共 {inputs} 条;需要完整复核时请拆分导入。',\n 'importPreview.groups': '顺序组(选择要应用的 prompt_order 分组)',\n 'importPreview.groupsAria': '选择顺序组',\n 'importPreview.pickGroup': '请选择顺序组',\n 'importPreview.needsGroup': '{source} 含多个 prompt_order 分组,无法确定使用哪个角色:先选择顺序组,确认后会重新预览。',\n 'importPreview.groupOption': '角色 {id}({entries} 条)',\n 'importPreview.confirm': '确认导入',\n 'importPreview.cancel': '取消预览',\n 'importPreview.noReport': '该来源没有可转换的 SillyTavern 内容,确认后按原样导入',\n 'importPreview.stale': '预览已过期(文件、顺序组或目标已变化),请重新预览后再导入',\n 'assetImport.presetTitle': '导入预设',\n 'assetImport.characterTitle': '导入角色卡',\n 'assetImport.select': '选择来源',\n 'assetImport.inspect': '检查内容',\n 'assetImport.result': '导入结果',\n 'assetImport.steps': '导入步骤',\n 'assetImport.close': '关闭导入',\n 'assetImport.formats': '支持 ZIP、JSON、PNG、YML、YAML,也可选择预设文件夹。',\n 'assetImport.noWrite': '选择后自动识别和预览;确认前不会写入预设或角色库。',\n 'assetImport.file': '选择文件',\n 'assetImport.folder': '选择文件夹',\n 'assetImport.queue': '第 {index} / {total} 张',\n 'assetImport.source': '来源:{name}',\n 'assetImport.avatar': '{name} 的原图预览',\n 'assetImport.avatarUnavailable': '无法显示图片预览,仍将检查原始文件。',\n 'assetImport.reading': '正在读取和检查;旧预览暂不可确认。',\n 'assetImport.submitting': '正在安装,请稍候。',\n 'assetImport.target': '保存到',\n 'assetImport.name': '名称',\n 'assetImport.id': '标识',\n 'assetImport.invalidId': '标识以小写字母或数字开头,仅可包含小写字母、数字和短横线,最多 128 字符。',\n 'assetImport.new': '另存为新项目',\n 'assetImport.existing': '更新现有项目',\n 'assetImport.newHint': '将新增一个项目;导入完成后可显式切换或应用。',\n 'assetImport.presetReplace': '替换:预设定义和此次提供的自有资源。保留:角色记忆和不归本次导入所有的文件。',\n 'assetImport.characterReplace': '替换:角色来源、转换配置和此次提供的头像。保留:角色记忆和其他文件。',\n 'assetImport.summary': '{files} 个文件 · {bytes} 字节 · {configs} 条提示词配置',\n 'assetImport.files': '文件与资源({count})',\n 'assetImport.add': '新增',\n 'assetImport.replace': '替换/合并',\n 'assetImport.warnings': '需要检查',\n 'assetImport.kind': '选择来源类型',\n 'assetImport.kind.native-preset': '原生预设',\n 'assetImport.kind.native-character': '原生角色片段',\n 'assetImport.kind.st-preset': 'SillyTavern 预设',\n 'assetImport.kind.st-character': 'SillyTavern 角色卡',\n 'assetImport.kind.world-book': '世界书',\n 'assetImport.chooseFirst': '请完成来源、顺序组或目标选择后再确认。',\n 'assetImport.createPreset': '创建预设',\n 'assetImport.createFromCharacter': '从角色卡创建预设',\n 'assetImport.createCharacter': '保存为新角色',\n 'assetImport.update': '更新项目',\n 'assetImport.overwriteTitle': '确认更新“{name}”',\n 'assetImport.back': '返回检查',\n 'assetImport.done': '完成',\n 'assetImport.cancel': '取消',\n 'assetImport.end': '结束本次导入',\n 'assetImport.skip': '跳过这张',\n 'assetImport.reselect': '重新选择',\n 'assetImport.repreview': '重新预览',\n 'assetImport.stale': '预览已过期,尚未提交。已保留所选文件,请重新预览。',\n 'assetImport.counts': '已导入 {imported} 项 · 跳过 {skipped} 项 · 失败 {failed} 项',\n 'assetImport.refreshFailed': '已导入,但列表刷新失败:{reason}。请重试刷新,无需重新导入。',\n 'assetImport.refresh': '重试刷新',\n 'assetImport.switch': '切换到该预设',\n 'assetImport.apply': '应用到当前预设',\n 'assetImport.directoryTooLarge': '文件夹超过传输上限,请压缩为 ZIP 后导入。',\n 'assetImport.draftBlocked': '当前预设仍有未保存草稿,请先保存或修正草稿,再重新预览覆盖操作。',\n 'assetExport.title': '导出预设 · {name}',\n 'assetExport.scope': '导出范围',\n 'assetExport.zip': '完整预设 ZIP',\n 'assetExport.zipHint': '包含定义、正文、图片与自有模块;运行需兼容的 Prompt Tool 与宿主版本。',\n 'assetExport.definition': '仅预设定义 YAML',\n 'assetExport.definitionHint': '用于查看或分享配置,不包含引用的附件。',\n 'assetExport.excluded': '已排除 {count} 条经核验的自动记忆配置。',\n 'assetExport.boundary': '不包含角色记忆文件、工作区指令、技能库和机器配置。',\n 'assetExport.conflicts': '以下配置的记忆来源不明,请逐项选择后重新检查。',\n 'assetExport.include': '保留内容',\n 'assetExport.exclude': '排除内容',\n 'assetExport.included': '此次导出包含你选择保留的疑似记忆内容。',\n 'assetExport.preview': '重新检查',\n 'assetExport.blocked': '无法生成完整包,请修复以下资源或改为仅预设定义。',\n 'assetExport.downloadZip': '导出 ZIP',\n 'assetExport.downloadYaml': '导出 YAML',\n 'assetExport.downloaded': '已生成,浏览器已开始下载。',\n}\n\nexport const CARDS_EN: Record<keyof typeof CARDS_ZH, string> = {\n 'policy.delegation.name': 'Tools & depth',\n 'policy.delegation.meta': 'Delegation recursion depth (tool grants live in the \"subagent-tool-policy\" card)',\n 'policy.delegation.hint': 'Tool grants are maintained by the \"subagent-tool-policy\" capability card (ceiling, profiles and model expansion); only subagent recursion depth lives here.',\n 'policy.delegation.policyMoved': 'The subagent tool policy is now a module-type capability: enable or remove the \"subagent-tool-policy\" card in the module list and edit the ceiling, profiles and model expansion inside it.',\n 'policy.delegation.depthHint': '0 forbids delegation; provider-managed leaves it to the provider; a positive integer limits recursion depth; empty uses the default',\n 'policy.delegation.depthUnset': '(Not set)',\n 'policy.delegation.section': 'Subagent tool policy (subagentToolPolicy · per-instance grants)',\n\n 'policy.title': 'Subagent tool policy',\n 'policy.titleHint': 'The model can only pick tools within the user-authorized ceiling; the policy affects new instances only',\n 'policy.status.enabled': 'Enabled ({count} profiles)',\n 'policy.status.disabled': 'Disabled',\n 'policy.toggleLabel': 'Enable subagent tool policy',\n 'policy.loading': 'Loading…',\n 'policy.loadFailed': 'Failed to load the subagent tool policy. Retry before editing.',\n 'policy.retry': 'Retry',\n 'policy.disabledHint': 'Policy is off: the content below is read-only. Turning the switch on writes a usable skeleton and saves it automatically (the module declaration stays; subagents fall back to official delegation behavior).',\n 'policy.invalidBindings': 'Some character bindings are empty or stale; remove or re-point them.',\n 'policy.notice.autosaved': 'Subagent tool policy auto-saved and rebuilt (existing subagents unchanged; only new instances are affected)',\n 'policy.notice.saveFailed': 'Failed to save the policy',\n 'policy.notice.previewFailed': 'Preview failed',\n 'policy.removeBlocked': 'Cannot delete tool profile {id}: still referenced by {refs}',\n 'policy.ref.character': 'character {id}',\n 'policy.ref.task': 'task {id}',\n 'policy.ref.separator': ', ',\n 'policy.defaultProfile.label': 'Default profile',\n 'policy.defaultProfile.hint': 'Profile used when no selector matches; must reference an existing profile.',\n 'policy.ceiling.allow.label': 'Ceiling allow',\n 'policy.ceiling.allow.hint': 'ceiling.allow: no profile, character, task or expansion may cross this boundary.',\n 'policy.ceiling.deny.label': 'Ceiling deny',\n 'policy.ceiling.deny.hint': 'ceiling.deny: always wins; no selector or additional_tools can restore it.',\n 'policy.profiles.hint': 'Tool profiles: each profile is a grant set the model may pick; modelSelectable=false stays out of the model parameter enum.',\n 'policy.profile.id.hint': 'Tool profile id (the model parameter enum value).',\n 'policy.profile.name': 'Name',\n 'policy.profile.name.hint': 'Display name of the tool profile.',\n 'policy.profile.namePlaceholder': 'Name',\n 'policy.profile.modelSelectable': 'Model selectable',\n 'policy.profile.modelSelectable.hint': 'Model selectable: false stays out of the model parameter enum.',\n 'policy.profile.copySuffix': '{name} copy',\n 'policy.profile.removeAria': 'Delete profile {id}',\n 'policy.addProfile': 'Add tool profile',\n 'policy.moveUp': 'Move up',\n 'policy.moveDown': 'Move down',\n 'policy.duplicate': 'Duplicate',\n 'policy.remove': 'Delete',\n 'policy.bindings.hint': 'Character bindings: the same character card may hold different grants per preset; they only pick a tool profile and never change persona or world book.',\n 'policy.binding.character': 'Character',\n 'policy.binding.character.hint': 'Bind a character card id; stale bindings must be removed or re-pointed before saving.',\n 'policy.binding.characterAria': 'Character card id',\n 'policy.binding.empty': '(Select a character)',\n 'policy.binding.option': '{name} ({id})',\n 'policy.binding.missing': 'Missing: {id}',\n 'policy.binding.profile': 'Tool profile',\n 'policy.binding.profile.hint': 'Profile used by this character card.',\n 'policy.binding.profileAria': 'Bound profile',\n 'policy.binding.modelSelectable.hint': 'The model may select this character binding.',\n 'policy.binding.modelSelectableAria': 'Character binding model selectable',\n 'policy.binding.removeAria': 'Delete binding',\n 'policy.addBinding': 'Add character binding',\n 'policy.rules.hint': 'Task rules: ascending order, first match wins; input = description + prompt; no match falls back to default.',\n 'policy.rule.id.hint': 'Task rule id.',\n 'policy.rule.idAria': 'Task rule id',\n 'policy.rule.name': 'Name',\n 'policy.rule.name.hint': 'Display name of the task rule.',\n 'policy.rule.nameAria': 'Task rule name',\n 'policy.rule.pattern': 'Pattern',\n 'policy.rule.pattern.hint': 'Regular expression matched against description + prompt.',\n 'policy.rule.patternAria': 'Pattern',\n 'policy.rule.patternPlaceholder': '(research|analysis)',\n 'policy.rule.order.hint': 'Ascending order; first match wins.',\n 'policy.rule.profile': 'Tool profile',\n 'policy.rule.profile.hint': 'Profile used after a match.',\n 'policy.rule.profileAria': 'Rule profile',\n 'policy.rule.modelSelectable.hint': 'The model may select this task type.',\n 'policy.rule.modelSelectableAria': 'Task rule model selectable',\n 'policy.rule.invalidPattern': 'Invalid pattern',\n 'policy.rule.removeAria': 'Delete rule',\n 'policy.addRule': 'Add task rule',\n 'policy.expansion.enabled': 'Model expansion',\n 'policy.expansion.enabled.hint': 'Enable model expansion (additional_tools): additional_tools is strictly limited to expansion.allow ∩ ceiling.allow ∩ preset-visible tools.',\n 'policy.expansion.enabledAria': 'Enable model expansion',\n 'policy.expansion.approval': 'Expansion needs approval',\n 'policy.expansion.approval.hint': 'Require manual approval before expansion (fails closed without an approval channel).',\n 'policy.expansion.max': 'Max expansions',\n 'policy.expansion.max.hint': 'maxAdditionalTools; 0 = disable the expansion parameter.',\n 'policy.expansion.maxAria': 'Max expansions',\n 'policy.expansion.allow.label': 'Expansion allow',\n 'policy.expansion.allow.hint': 'Additional tools the model may request (must stay within the ceiling).',\n 'policy.preview.title': 'Instance resolution preview',\n 'policy.preview.hint': 'Enter description/prompt and selectors to preview the effective tool set through the same host resolve seam; read-only, no subagent is created.',\n 'policy.preview.toolAria': 'Preview tool',\n 'policy.preview.descriptionAria': 'Preview description',\n 'policy.preview.promptAria': 'Preview prompt',\n 'policy.preview.profileAria': 'Preview tool_profile',\n 'policy.preview.profileEmpty': '(No tool_profile)',\n 'policy.preview.characterAria': 'Preview character_id',\n 'policy.preview.characterEmpty': '(No character_id)',\n 'policy.preview.taskAria': 'Preview task_type',\n 'policy.preview.taskEmpty': '(No task_type)',\n 'policy.preview.run': 'Preview',\n 'policy.menu.empty': '(Not selected)',\n 'policy.tagPlaceholder': 'Press Enter to add',\n\n 'customTools.aria': 'Custom tool editor',\n 'customTools.fieldsAria': 'Custom tool configuration',\n 'customTools.hint': 'Create a blank tool or insert a template here, then save to apply. Inspect model-visible tools on the Tools preview page.',\n 'customTools.readonly': 'Tools of the current preset are read-only; system presets or presets without write access cannot be edited or saved.',\n 'customTools.loading': 'Reading custom tools…',\n 'customTools.loadFailed': 'Failed to read custom tools',\n 'customTools.retry': 'Retry',\n 'customTools.save': 'Save',\n 'customTools.saving': 'Saving…',\n 'customTools.saveFailed': 'Save failed',\n 'customTools.saved': 'Saved {count} custom tools (rebuilt)',\n 'customTools.duplicateId': 'Tool id already exists: {id}',\n 'customTools.templateInserted': 'Inserted tool template {id} (applies after saving)',\n\n 'toolEditor.params.label': 'parameters (model-visible parameter schema)',\n 'toolEditor.params.empty': 'No parameters yet; add them below. required=true forces the model to provide the parameter.',\n 'toolEditor.params.nameAria': 'Parameter name',\n 'toolEditor.params.namePlaceholder': 'Name',\n 'toolEditor.params.typeAria': 'Parameter type',\n 'toolEditor.params.requiredHint': 'The model must provide this parameter',\n 'toolEditor.params.requiredAria': 'Required',\n 'toolEditor.params.descriptionAria': 'Parameter description',\n 'toolEditor.params.descriptionPlaceholder': 'Description',\n 'toolEditor.params.removeAria': 'Delete parameter {key}',\n 'toolEditor.params.remove': 'Delete',\n 'toolEditor.params.add': 'Add parameter',\n 'toolEditor.json.hint': 'Committed on blur when the JSON is valid; nested properties, items, oneOf, enum are edited here.',\n 'toolEditor.json.mustBeObject': 'Must be a JSON object',\n 'toolEditor.json.invalid': 'Invalid JSON; fix it before saving the tool',\n 'toolEditor.json.advanced': 'Advanced parameters JSON',\n 'toolEditor.json.output': 'Output schema JSON',\n 'toolEditor.chip.params': '{count} params',\n 'toolEditor.enable.hint.on': 'Click to disable; a disabled tool is not registered',\n 'toolEditor.enable.hint.off': 'Click to enable',\n 'toolEditor.enable.aria': 'Enable tool {id}',\n 'toolEditor.moveUp': 'Move up',\n 'toolEditor.moveDown': 'Move down',\n 'toolEditor.duplicate': 'Duplicate',\n 'toolEditor.remove': 'Delete',\n 'toolEditor.confirmRemove': 'Confirm delete',\n 'toolEditor.cancel': 'Cancel',\n 'toolEditor.field.id': 'id (file identifier)',\n 'toolEditor.field.idAria': 'Tool id',\n 'toolEditor.field.name': 'name (model-visible name)',\n 'toolEditor.field.nameAria': 'Tool name',\n 'toolEditor.field.description': 'description (model-visible description)',\n 'toolEditor.field.descriptionAria': 'Tool description',\n 'toolEditor.field.descriptionPlaceholder': 'Describe the tool for the model',\n 'toolEditor.field.kind': 'execute.kind (executor)',\n 'toolEditor.field.kind.hint': 'shell=command; http=request; delegate=delegate to a built-in or registered tool; fs=workspace files; ask-user=ask the user',\n 'toolEditor.field.kindAria': 'Executor',\n 'toolEditor.field.command.hint': '{{args.x}} interpolation; env allowlist; cwd=session workspace',\n 'toolEditor.field.commandAria': 'Shell command',\n 'toolEditor.field.shell.hint': 'pwsh forces UTF-8 output (no CJK mojibake)',\n 'toolEditor.field.url.hint': '{{args.x}} interpolation',\n 'toolEditor.field.urlAria': 'Request URL',\n 'toolEditor.field.methodAria': 'Request method',\n 'toolEditor.field.delegate.hint': 'Built-in tools: {names}',\n 'toolEditor.field.delegate': 'tool (delegate target)',\n 'toolEditor.field.delegateAria': 'Delegate target tool',\n 'toolEditor.field.fsActionAria': 'fs action',\n 'toolEditor.field.path.hint': 'Path relative to the workspace; escapes are rejected',\n 'toolEditor.field.pathAria': 'File path',\n 'toolEditor.field.content.hint': 'Text to write or append; supports {{args.x}}; empty text writes empty content',\n 'toolEditor.field.contentAria': 'File content',\n 'toolEditor.field.question': 'question (asks the user to confirm)',\n 'toolEditor.field.questionAria': 'Question',\n 'toolEditor.field.questionPlaceholder': 'Continue with this operation?',\n 'toolEditor.timeout.hint': 'Positive integer milliseconds; empty uses the executor default; max 2147483647.',\n 'toolEditor.timeoutAria': 'Tool timeout milliseconds',\n 'toolEditor.timeout.invalid': 'Timeout must be an integer between 1 and 2147483647',\n 'importPreview.title': 'Import preview (confirm before writing)',\n 'importPreview.summary': 'Source entries {inputs} · configs {converted} · disabled {disabled} · degraded {degraded} · unsupported {unsupported} · excluded {excluded}',\n 'importPreview.review': 'Needs review: {count}',\n 'importPreview.reviewAria': 'Lossy items that need review, {count} in total',\n 'importPreview.info': 'Notes (do not change the result): {count}',\n 'importPreview.infoAria': 'Informational downgrades, {count} in total',\n 'importPreview.excluded': 'Excluded entries: {count}',\n 'importPreview.excludedAria': 'Excluded entries, {count} in total',\n 'importPreview.excludedItem': 'Source entry {source} ({codes})',\n 'importPreview.diagSource': 'Source {source}',\n 'importPreview.diagTarget': 'Target {target}',\n 'importPreview.none': 'No degraded, unsupported or excluded items',\n 'importPreview.truncated': 'The report hit the server limit: showing {entries} entries and {diagnostics} diagnostics out of {inputs} source entries; split the import to review everything.',\n 'importPreview.groups': 'Order group (pick the prompt_order group to apply)',\n 'importPreview.groupsAria': 'Choose order group',\n 'importPreview.pickGroup': 'Pick an order group',\n 'importPreview.needsGroup': '{source} contains several prompt_order groups, so the character cannot be determined: pick an order group and the preview runs again.',\n 'importPreview.groupOption': 'Character {id} ({entries} entries)',\n 'importPreview.confirm': 'Confirm import',\n 'importPreview.cancel': 'Cancel preview',\n 'importPreview.noReport': 'No SillyTavern content to convert in this source; confirm to import as-is',\n 'importPreview.stale': 'Preview is stale (file, order group or target changed); preview again',\n 'assetImport.presetTitle': 'Import preset',\n 'assetImport.characterTitle': 'Import character cards',\n 'assetImport.select': 'Select source',\n 'assetImport.inspect': 'Check contents',\n 'assetImport.result': 'Import result',\n 'assetImport.steps': 'Import steps',\n 'assetImport.close': 'Close import',\n 'assetImport.formats': 'Supports ZIP, JSON, PNG, YML, YAML and preset folders.',\n 'assetImport.noWrite': 'Files are detected and previewed before confirmation. No preset or character is written yet.',\n 'assetImport.file': 'Choose files',\n 'assetImport.folder': 'Choose folder',\n 'assetImport.queue': 'Card {index} / {total}',\n 'assetImport.source': 'Source: {name}',\n 'assetImport.avatar': 'Original image preview for {name}',\n 'assetImport.avatarUnavailable': 'Image preview unavailable; the original file will still be checked.',\n 'assetImport.reading': 'Reading and checking; the previous preview cannot be confirmed.',\n 'assetImport.submitting': 'Installing, please wait.',\n 'assetImport.target': 'Save to',\n 'assetImport.name': 'Name',\n 'assetImport.id': 'Identifier',\n 'assetImport.invalidId': 'Start with a lowercase letter or number; use lowercase letters, numbers and hyphens, up to 128 characters.',\n 'assetImport.new': 'Save as a new item',\n 'assetImport.existing': 'Update an existing item',\n 'assetImport.newHint': 'Creates a new item. Switch or apply explicitly after importing.',\n 'assetImport.presetReplace': 'Replaces the preset definition and supplied owned resources. Preserves character memory and files not owned by this import.',\n 'assetImport.characterReplace': 'Replaces the character source, converted configuration and supplied avatar. Preserves character memory and other files.',\n 'assetImport.summary': '{files} files · {bytes} bytes · {configs} prompt configurations',\n 'assetImport.files': 'Files and resources ({count})',\n 'assetImport.add': 'Add',\n 'assetImport.replace': 'Replace / merge',\n 'assetImport.warnings': 'Needs review',\n 'assetImport.kind': 'Choose source type',\n 'assetImport.kind.native-preset': 'Native preset',\n 'assetImport.kind.native-character': 'Native character fragment',\n 'assetImport.kind.st-preset': 'SillyTavern preset',\n 'assetImport.kind.st-character': 'SillyTavern character card',\n 'assetImport.kind.world-book': 'World book',\n 'assetImport.chooseFirst': 'Finish choosing the source, order group or target before confirming.',\n 'assetImport.createPreset': 'Create preset',\n 'assetImport.createFromCharacter': 'Create preset from character',\n 'assetImport.createCharacter': 'Save as new character',\n 'assetImport.update': 'Update item',\n 'assetImport.overwriteTitle': 'Confirm updating “{name}”',\n 'assetImport.back': 'Back to review',\n 'assetImport.done': 'Done',\n 'assetImport.cancel': 'Cancel',\n 'assetImport.end': 'End this import',\n 'assetImport.skip': 'Skip this card',\n 'assetImport.reselect': 'Choose again',\n 'assetImport.repreview': 'Preview again',\n 'assetImport.stale': 'The preview expired; nothing was submitted. Files are retained. Preview again.',\n 'assetImport.counts': 'Imported {imported} · skipped {skipped} · failed {failed}',\n 'assetImport.refreshFailed': 'Imported, but refreshing the list failed: {reason}. Retry refresh without importing again.',\n 'assetImport.refresh': 'Retry refresh',\n 'assetImport.switch': 'Switch to this preset',\n 'assetImport.apply': 'Apply to current preset',\n 'assetImport.directoryTooLarge': 'The folder exceeds the transfer limit. Compress it as ZIP and import again.',\n 'assetImport.draftBlocked': 'The current preset has unsaved drafts. Save or fix them, then preview the replacement again.',\n 'assetExport.title': 'Export preset · {name}',\n 'assetExport.scope': 'Export scope',\n 'assetExport.zip': 'Complete preset ZIP',\n 'assetExport.zipHint': 'Includes definition, text, images and owned modules. Requires compatible Prompt Tool and host versions.',\n 'assetExport.definition': 'Preset definition YAML only',\n 'assetExport.definitionHint': 'For viewing or sharing configuration; referenced attachments are not included.',\n 'assetExport.excluded': 'Excluded {count} verified automatic memory configurations.',\n 'assetExport.boundary': 'Excludes character memory files, workspace instructions, skill libraries and machine configuration.',\n 'assetExport.conflicts': 'The memory origin of these entries is unclear. Choose each entry, then check again.',\n 'assetExport.include': 'Keep contents',\n 'assetExport.exclude': 'Exclude contents',\n 'assetExport.included': 'This export includes the possible memory contents you chose to keep.',\n 'assetExport.preview': 'Check again',\n 'assetExport.blocked': 'Cannot create a complete package. Fix these resources or choose the definition only.',\n 'assetExport.downloadZip': 'Export ZIP',\n 'assetExport.downloadYaml': 'Export YAML',\n 'assetExport.downloaded': 'Generated; the browser has started the download.',\n}\n","/**\n * 提示词工具 UI 文案字典(官方 locale 命名空间 `prompt-tool`)。\n *\n * 约定:\n * - 只放用户可见文案;provider/model id、文件路径、用户内容、协议 code 不进字典。\n * - zh 是唯一事实源:键类型由它派生,en 用 Record<Key, string> 强制键集一致\n * (缺键/多键都是编译错误,等价于官方类型化 register 的运行时校验)。\n * - 渲染时经 {@link Translate} 求值(调用时读当前语言),不在模块顶层缓存译文。\n */\nimport type { Translate } from '@deepseek-ai/dsh-client-ui-slots'\nimport { PARAMS_EN, PARAMS_ZH } from './locales-params.ts'\nimport { PROMPTS_EN, PROMPTS_ZH } from './locales-prompts.ts'\nimport { CARDS_EN, CARDS_ZH } from './locales-cards.ts'\nimport { TRIGGERS_EN, TRIGGERS_ZH } from './locales-triggers.ts'\n\n/** 官方 locale 服务注册用的命名空间。 */\nexport const PROMPT_TOOL_NS = 'prompt-tool'\n\nconst ZH_CORE = {\n 'app.title': '提示词工具',\n 'app.backToChat': '返回对话',\n 'app.loading': '读取中',\n 'app.statusSummary': '{configs} 配置 · {enabled} 启用',\n 'app.open': '打开提示词工具',\n 'app.close': '关闭提示词工具',\n 'app.panelAria': '提示词工具',\n 'nav.aria': '提示词工具页面',\n 'tab.label': '提示词工具',\n\n 'settings.aria': '提示词工具基础设置',\n 'settings.saveRejected': '设置未保存,请检查当前权限或重新读取后重试。',\n 'settings.writePreset.label': '生成提示词注入预设',\n 'settings.writePreset.hint': '关闭后移除各预设目录的生成物,参数与内容不再物化。',\n 'settings.presetTemplate.title': '预设模板',\n 'settings.presetTemplate.hint': '新会话默认挂载的预设;在官方界面给空白会话切换预设时,工作台会自动跟随该预设。完整预设管理与提示词配置请点左上角的悬浮按钮(可拖动)打开「提示词工具」工作台。',\n 'settings.switched': '已切换到 {id},当前空会话已重组。',\n 'settings.switchDefaultOnly': '默认预设已更新为 {id};当前会话未切换:{reason}',\n 'settings.switchPending': '默认预设已更新为 {id};当前没有可重组的空会话。',\n 'settings.switchFailed': '切换预设失败:{reason}',\n 'settings.switchReason.sessionNotBlank': '当前会话已有内容,官方只允许空会话切换;本次只更新后续会话默认预设',\n\n\n 'page.features.label': '主会话',\n 'page.subagent.label': '子代理',\n 'page.tools.label': '工具预览',\n 'page.skills.label': '技能设置',\n 'page.presets.label': '预设配置',\n 'page.characters.label': '角色管理',\n\n 'main.aria': '主会话与全局',\n 'main.addTemplate': '添加模板 · {layer}',\n 'main.addToolTemplate': '添加工具模板…',\n 'main.addVariables': '添加模板变量',\n 'main.newBlankTool': '新建空白工具',\n 'subagent.aria': '子代理',\n 'configList.create': '新建',\n 'configList.emptyPreStep': '当前预设模板消息批层无配置;可新建自定义配置(写入激活预设 preset.yml,随预设走)。',\n\n 'tools.aria': '工具预览',\n 'tools.search.aria': '搜索工具',\n 'tools.search.placeholder': '搜索工具名或描述',\n 'tools.surface.session': '当前会话工具',\n 'tools.surface.preset': '预设工具能力',\n 'tools.surface.source.aria': '预设工具能力来源',\n 'tools.surface.source.placeholder': '选择预设',\n 'tools.refreshPresets': '刷新预设列表',\n 'tools.loadingPresets': '正在读取预设…',\n 'tools.loadFailed': '预设列表读取失败',\n 'tools.noPresets': '暂无可用预设。',\n 'tools.footnote': '仅预览模型工具;添加和编辑仍在「主会话」模块配置卡,不提供 MCP/插件安装管理。',\n 'tools.surface.sourceLabel': '工具面',\n 'tools.surface.count': '显示 {visible} / {total} 个工具',\n 'tools.surface.emptySource': '该来源暂无可见工具。',\n 'tools.surface.emptyFilter': '无匹配工具,请调整搜索。',\n 'tools.surface.list.aria': '模型可见工具',\n 'tools.surface.card.aria': '查看工具 {name}',\n 'tools.surface.badge.visible': '模型可见',\n 'tools.surface.detail.name': '完整名称',\n 'tools.surface.detail.from': '来自',\n 'tools.surface.detail.status': '可见状态',\n 'tools.surface.detail.description': '工具描述',\n 'tools.surface.detail.noDescription': '(无描述)',\n 'tools.surface.sub.session': '当前存活会话 · 冻结 generation',\n 'tools.surface.sub.preset': '所选预设 · 后续 generation',\n 'tools.surface.sub.count': ' · {count} 个',\n 'tools.surface.noSession': '尚未选择当前会话;不会自动创建或恢复会话。',\n 'tools.surface.noPreset': '请选择预设后读取工具能力。',\n 'tools.surface.origin': '来源:',\n 'tools.surface.refresh': '刷新工具',\n 'tools.surface.loading': '正在读取工具…',\n 'tools.surface.readFailed': '工具面读取失败',\n 'tools.surface.retrySuffix': ';可刷新重试。',\n 'tools.surface.note.session': '刷新不升级既有会话的 generation,也不会自动 resume 会话。',\n 'tools.surface.note.preset': '预设能力不代表当前会话;修改预设不替换既有会话的冻结 generation。',\n\n 'characters.aria': '角色管理',\n 'characters.library.title': '角色卡库',\n 'characters.library.hint': '导入角色卡到独立库,逐张检查后保存;支持 PNG、JSON、YAML 和资源包。入库后可显式应用到当前预设,也可随时移除。',\n 'characters.importImage': '导入角色卡图片',\n 'characters.importJson': '导入角色卡 JSON',\n 'characters.importing': '导入中…',\n 'characters.pickImage.aria': '选择 SillyTavern 角色卡图片',\n 'characters.pickJson.aria': '选择角色卡 JSON',\n 'characters.empty.title': '角色卡库为空',\n 'characters.empty.hint': '从上方导入 SillyTavern 角色卡(PNG / JSON),然后点击「导入到当前预设」应用到正在使用的预设。',\n 'characters.badge.imported': '已导入当前预设',\n 'characters.remove': '从当前预设移除',\n 'characters.removing': '移除中…',\n 'characters.apply': '导入到当前预设',\n 'characters.openDir.label': '打开角色卡目录',\n 'characters.openDir.aria': '打开角色卡目录:{name}',\n 'characters.delete.label': '删除角色卡',\n 'characters.delete.aria': '删除角色卡:{name}',\n 'characters.confirmDelete': '确认删除',\n 'characters.cancel': '取消',\n 'characters.notice.stored': '角色卡「{name}」已入库',\n 'characters.notice.storeFailed': '角色卡入库失败:{reason}',\n 'characters.notice.unsupported': '不支持的文件类型:{name}(仅 PNG 角色卡或 JSON)',\n 'characters.notice.importFailed': '角色卡导入失败:{reason}',\n 'characters.notice.targetChanged': '当前预设已切换,旧预览不再提交:请重新选择文件导入',\n 'characters.notice.submitFailed': '提交失败(文件与预览已保留,可再次确认或取消):{reason}',\n 'characters.notice.applied': '已导入到当前预设({count} 条配置)',\n 'characters.notice.applyFailed': '导入到当前预设失败:{reason}',\n 'characters.notice.removed': '已从当前预设移除({count} 条配置)',\n 'characters.notice.removeFailed': '移除失败:{reason}',\n 'characters.notice.deleted': '角色卡 {id} 已删除(已导入当前预设的参数不受影响)',\n 'characters.notice.deleteFailed': '删除失败:{reason}',\n 'characters.notice.opened': '已打开角色卡目录:{path}',\n 'characters.notice.openFailed': '打开目录失败:{reason}',\n\n 'skills.aria': '技能设置',\n 'skills.tabs.aria': '技能状态筛选',\n 'skills.tabs.all': '全部',\n 'skills.tabs.model': '模型可用',\n 'skills.tabs.user': '用户可用',\n 'skills.tabs.blocked': '两端关闭',\n 'skills.incomplete': '当前会话的技能发现尚未完成,注册状态未确认;文件调用策略仍可按权限修改。',\n 'skills.refresh': '刷新技能列表',\n 'skills.library.title': '技能目录与资产',\n 'skills.library.meta': '{count} 个技能 · 来自官方各类技能根',\n 'skills.library.hint': '技能实体留在各自的技能根里,本插件不搬迁、不建链接;停用/恢复只改写该技能 SKILL.md 的调用策略键。',\n 'skills.library.unknown': '(用户技能目录未知,请重新读取配置)',\n 'skills.library.open': '打开用户技能目录',\n 'skills.library.footnote': '停用 = 改写该技能 SKILL.md 的官方两个键(disable-model-invocation / user-invocable):模型目录、skill 工具与斜杠命令各自独立开关;正文、注释与其余字段逐字保留,写回 false/true 即恢复。只读来源(如官方内置包目录)写入失败会如实报错。',\n 'skills.dir.rescan': '重扫',\n 'skills.dir.cancel': '取消',\n 'skills.import.pick': '导入技能',\n 'skills.import.pick.hint': '选择宿主机目录并把它的内容复制到用户技能目录(复制,不是引用)',\n 'skills.folders.pick': '引用文件夹',\n 'skills.folders.remove': '移除引用',\n 'skills.folders.empty': '还没有引用任何技能文件夹。',\n 'skills.folders.duplicate': '该文件夹已在引用列表里',\n 'skills.folders.hint': '引用只登记路径,不复制文件;移除引用不会删除源文件。引用技能的开关写入原文件,删除操作会移动对应源文件到回收站。',\n 'skills.source.aria': '按来源筛选技能',\n 'skills.source.all': '全部来源',\n 'skills.source.project-dsh': '项目 .dsh/skills',\n 'skills.source.project-agents': '项目 .agents/skills',\n 'skills.source.custom': '技能文件夹',\n 'skills.source.user-dsh': '用户技能目录',\n 'skills.source.user-agents': '用户 .agents/skills',\n 'skills.source.bundled': '官方内置',\n 'skills.source.other': '其他提供者',\n 'skills.create.open': '创建技能',\n 'skills.create.close': '收起创建表单',\n 'skills.create.name': '技能名(kebab-case)',\n 'skills.create.namePlaceholder': '例如 my-skill',\n 'skills.create.description': '描述',\n 'skills.create.descriptionPlaceholder': '模型据此判断何时使用该技能',\n 'skills.create.content': '正文(Markdown)',\n 'skills.create.contentPlaceholder': '# 使用说明…',\n 'skills.create.submit': '创建',\n 'skills.create.invalid': '技能名须为 kebab-case 且描述必填',\n 'skills.create.hint': '创建即写入用户技能目录,官方提供者立刻能发现。',\n 'skills.delete.title': '删除技能 {name}?',\n 'skills.delete.description': '将删除此路径对应的技能并移入回收站,可人工恢复:{path}。引用目录里的技能会直接移动源文件;仅移除文件夹引用不会删除文件。',\n 'skills.delete.confirm': '删除',\n 'skills.delete.failed': '删除失败,请查看错误提示后重试。',\n 'skills.filter.aria': '过滤技能列表',\n 'skills.filter.placeholder': '过滤技能:名称 / 目录 / 描述…',\n 'skills.visible': '可见 {count} 个',\n 'skills.group.meta': '{count} 个技能 · 优先级 {rank}',\n 'skills.empty.title': '没有发现任何技能',\n 'skills.empty.hint': '展开上方目录与资产,选择「导入技能」复制技能,或选择「引用文件夹」使用已有目录;也可以创建新技能。',\n 'skills.noMatch': '没有匹配当前筛选的技能。',\n 'skills.notice.dirPickFailed': '选择目录失败:{reason}',\n 'skills.notice.imported': '已复制 {count} 个技能文件到 {path}',\n 'skills.notice.importedOverwrite': '已复制 {count} 个技能文件到 {path},覆盖 {overwritten} 个已确认的同名技能',\n 'skills.overwrite.title': '覆盖同名技能?',\n 'skills.overwrite.description': '以下技能目录已存在:{names}。确认后替换目录内容,不保留历史版本。',\n 'skills.overwrite.confirm': '确认覆盖',\n 'skills.notice.importFailed': '导入技能目录失败:{reason}',\n 'skills.status.invalid': '无效',\n 'skills.status.blocked': '已停用(两端)',\n 'skills.status.shadowed': '被同名技能遮蔽',\n 'skills.status.callable': '可调用:{audiences}',\n 'skills.status.notCallable': '不可调用',\n 'skills.row.toggles.aria': '{name} 的调用策略开关',\n 'skills.row.modelToggle': '模型',\n 'skills.row.userToggle': '用户',\n 'skills.row.modelToggle.aria': '{name} 的模型调用(frontmatter 声明)',\n 'skills.row.userToggle.aria': '{name} 的用户调用(frontmatter 声明)',\n 'skills.row.modelToggle.hint': '改写该技能 SKILL.md 的 disable-model-invocation:关掉后模型看不到它、skill 工具也拒绝加载;正文与其余字段逐字保留',\n 'skills.row.userToggle.hint': '改写该技能 SKILL.md 的 user-invocable:关掉后用户斜杠命令无法调用该技能;正文与其余字段逐字保留',\n 'skills.status.audience.model': '模型',\n 'skills.status.audience.user': '用户',\n 'skills.row.status.aria': '技能状态:{status}',\n 'skills.row.priority': '来源优先级 {rank}(仅在同一作用域内比较)',\n 'skills.row.priorityShort': '优先级 {rank}',\n 'skills.row.expand': '展开或收起技能 {name}',\n 'skills.edit.content': '技能文件内容',\n 'skills.edit.description': '描述',\n 'skills.edit.hint': '这里只编辑 Markdown 正文,名称、描述和调用设置不属于正文。请先保存未保存的修改,再切换调用开关。',\n 'skills.edit.save': '保存技能',\n 'skills.edit.saving': '保存中…',\n 'skills.edit.saved': '已同步',\n 'skills.edit.dirty': '未保存',\n 'skills.edit.loading': '读取中…',\n 'skills.edit.unloaded': '尚未读取',\n 'skills.edit.reload': '重新读取',\n 'skills.edit.reloadConfirm': '重新读取将丢弃此技能的未保存修改,是否继续?',\n 'skills.edit.readFailed': '技能读取失败,请重试',\n 'skills.edit.saveFailed': '技能保存失败,修改已保留',\n 'skills.row.noDescription': '(frontmatter 未提供描述)',\n 'skills.row.shadowedHint': '当前会话实际使用另一个同名技能;下方开关仅修改此文件的调用策略。',\n 'skills.row.delete': '删除',\n 'skills.row.delete.hint': '将此技能的源文件或目录移入回收站,确认时显示准确路径',\n\n 'presets.aria': '全局开关',\n 'presets.writePreset.label': '全局开关',\n 'presets.writePreset.hint': '预设生成总开关,作用于全部九个层级:开启时生成并刷新生成目录;关闭时清空各预设组合为空(预设保持可用,仅停止注入,工具注入随之关闭)。关闭/开启后自动重新加载模块卡片。',\n 'presets.agents.title': '生成目录与显示顺序',\n 'presets.agents.meta': 'AGENTS.md 探测卡在模块列表;这里只控制生成目录与显示顺序',\n 'presets.order.label': 'preset 显示顺序',\n 'presets.order.hint': '生成 preset.yml 的 order;数值小的 preset 在宿主列表中靠前。',\n\n 'presetSwitcher.title': '预设模板',\n 'presetSwitcher.hint': '管理预设及其自有资源。导入支持 ZIP、JSON、PNG、YAML 和文件夹,确认后创建或更新;每个预设可导出完整 ZIP 或仅定义 YAML。',\n 'presetSwitcher.new': '新建预设',\n 'presetSwitcher.import': '导入预设',\n 'presetSwitcher.importing': '导入中…',\n 'presetSwitcher.import.aria': '选择 preset.yml / SillyTavern JSON 配置文件',\n 'presetSwitcher.importDir': '导入文件夹',\n 'presetSwitcher.importDir.aria': '选择预设文件夹',\n 'presetSwitcher.export': '导出预设',\n 'presetSwitcher.empty': '暂无预设;点击上方「新建预设」从内置模板创建,或「导入预设」添加。',\n 'presetSwitcher.dialog.title': '从内置模板新建预设',\n 'presetSwitcher.dialog.close': '关闭新建预设',\n 'presetSwitcher.dialog.noTemplates': '插件目录无内置模板。',\n 'presetSwitcher.custom.hint': '新建一份所有参数为空的自定义预设;重名时自动加序号',\n 'presetSwitcher.custom.title': '自定义预设',\n 'presetSwitcher.custom.detail': 'custom · 所有参数为空(空白起点,重名自动加序号)',\n 'presetSwitcher.template.hint': '新建到用户目录:{id}',\n 'presetSwitcher.card.blocked.hint': '预设不可渲染(缺模块清单/组合文件):可删除后经「新建预设」从内置模板还原,或检查 preset.yml',\n 'presetSwitcher.card.active.hint': '当前预设',\n 'presetSwitcher.card.switch.hint': '切换到 {name}',\n 'presetSwitcher.badge.active': '使用中',\n 'presetSwitcher.blocked': '不可用',\n 'presetSwitcher.duplicate.label': '复制预设',\n 'presetSwitcher.duplicate.aria': '复制预设:{name}',\n 'presetSwitcher.open.label': '打开预设文件夹',\n 'presetSwitcher.open.aria': '打开预设文件夹:{name}',\n 'presetSwitcher.delete.confirmHint': '删除后可从内置模板重新创建',\n 'presetSwitcher.delete.confirm': '确认删除',\n 'presetSwitcher.delete.cancel': '取消',\n 'presetSwitcher.delete.hintActive': '先切换其他预设再删除',\n 'presetSwitcher.delete.hint': '删除用户目录副本;内置模板仍可重新创建',\n 'presetSwitcher.delete.aria': '删除预设:{name}',\n 'presetSwitcher.notice.imported': '预设 {id} 已导入,点击卡片即可切换',\n 'presetSwitcher.notice.importFailed': '导入预设失败:{reason}',\n 'presetSwitcher.notice.exportFailed': '导出预设失败:{reason}',\n 'presetSwitcher.notice.exported': '已导出 {file}(单文件配置,可保存到任意目录)',\n 'presetSwitcher.notice.deleted': '预设 {id} 已删除(可经「新建预设」从内置模板还原)',\n 'presetSwitcher.notice.deleteFailed': '删除预设失败:{reason}',\n 'presetSwitcher.notice.duplicated': '已复制为预设 {id}',\n 'presetSwitcher.notice.duplicateFailed': '复制预设失败:{reason}',\n 'presetSwitcher.notice.opened': '已打开预设文件夹:{path}',\n 'presetSwitcher.notice.openFailed': '打开预设文件夹失败:{reason}',\n 'presetSwitcher.notice.cloned': '已从内置模板新建预设 {id}',\n 'presetSwitcher.notice.cloneFailed': '新建预设失败:{reason}',\n} as const\n\n/**\n * 字典键(zh 为唯一事实源;新增文案先加 zh,en 缺键即编译失败)。\n *\n * 文本量大的 feature 按归档计划 §8.3.1 分词典:核心词条留在本文件,其余按 feature\n * 放进 locales-params / locales-prompts / locales-cards,注册时合并为同一命名空间,\n * 不复制第二套翻译框架。\n */\nexport type PromptToolLocaleKey =\n | keyof typeof ZH_CORE\n | keyof typeof PARAMS_ZH\n | keyof typeof PROMPTS_ZH\n | keyof typeof CARDS_ZH\n | keyof typeof TRIGGERS_ZH\n\nconst EN_CORE: Record<keyof typeof ZH_CORE, string> = {\n 'app.title': 'Prompt Tool',\n 'app.backToChat': 'Back to chat',\n 'app.loading': 'Loading',\n 'app.statusSummary': '{configs} configs · {enabled} enabled',\n 'app.open': 'Open prompt tool',\n 'app.close': 'Close prompt tool',\n 'app.panelAria': 'Prompt tool',\n 'nav.aria': 'Prompt tool pages',\n 'tab.label': 'Prompt Tool',\n\n 'settings.aria': 'Prompt tool basic settings',\n 'settings.saveRejected': 'Settings were not saved. Check your permissions or reload and retry.',\n 'settings.writePreset.label': 'Materialize prompt-tool injection presets',\n 'settings.writePreset.hint': 'When off, generated preset files are removed and parameters/content stop being materialized.',\n 'settings.presetTemplate.title': 'Preset template',\n 'settings.presetTemplate.hint': 'Preset mounted by default for new sessions; when the host switches a blank session to another preset, the workbench follows it. Open the draggable floating button at the top-left for full preset management and prompt configs.',\n 'settings.switched': 'Switched to {id}; the current blank session was recomposed.',\n 'settings.switchDefaultOnly': 'Default preset updated to {id}; current session not switched: {reason}',\n 'settings.switchPending': 'Default preset updated to {id}; there is no blank session to recompose.',\n 'settings.switchFailed': 'Failed to switch preset: {reason}',\n 'settings.switchReason.sessionNotBlank': 'The current session already has content and the host only switches presets on a blank session, so only the default for later sessions was updated',\n\n\n 'page.features.label': 'Main session',\n 'page.subagent.label': 'Subagent',\n 'page.tools.label': 'Tool preview',\n 'page.skills.label': 'Skills',\n 'page.presets.label': 'Presets',\n 'page.characters.label': 'Characters',\n\n 'main.aria': 'Main session and global',\n 'main.addTemplate': 'Add template · {layer}',\n 'main.addToolTemplate': 'Add tool template…',\n 'main.addVariables': 'Add template variables',\n 'main.newBlankTool': 'New blank tool',\n 'subagent.aria': 'Subagent',\n 'configList.create': 'New',\n 'configList.emptyPreStep': 'The current preset template has no message-batch configs; you can create a custom config (written into the active preset preset.yml, so it travels with that preset).',\n\n 'tools.aria': 'Tool preview',\n 'tools.search.aria': 'Search tools',\n 'tools.search.placeholder': 'Search tool name or description',\n 'tools.surface.session': 'Current session tools',\n 'tools.surface.preset': 'Preset tool capabilities',\n 'tools.surface.source.aria': 'Preset tool capability source',\n 'tools.surface.source.placeholder': 'Select a preset',\n 'tools.refreshPresets': 'Refresh preset list',\n 'tools.loadingPresets': 'Loading presets…',\n 'tools.loadFailed': 'Failed to load the preset list',\n 'tools.noPresets': 'No presets available.',\n 'tools.footnote': 'Preview only: model tools are shown read-only; adding and editing stay in the Main session module cards and MCP/plugin installation is not managed here.',\n 'tools.surface.sourceLabel': 'Tool surface',\n 'tools.surface.count': 'Showing {visible} / {total} tools',\n 'tools.surface.emptySource': 'No visible tools for this source.',\n 'tools.surface.emptyFilter': 'No matching tools; adjust the search.',\n 'tools.surface.list.aria': 'Model-visible tools',\n 'tools.surface.card.aria': 'View tool {name}',\n 'tools.surface.badge.visible': 'Model-visible',\n 'tools.surface.detail.name': 'Full name',\n 'tools.surface.detail.from': 'From',\n 'tools.surface.detail.status': 'Visibility',\n 'tools.surface.detail.description': 'Tool description',\n 'tools.surface.detail.noDescription': '(no description)',\n 'tools.surface.sub.session': 'Live session · frozen generation',\n 'tools.surface.sub.preset': 'Selected preset · next generation',\n 'tools.surface.sub.count': ' · {count}',\n 'tools.surface.noSession': 'No current session selected; sessions are never created or resumed automatically.',\n 'tools.surface.noPreset': 'Select a preset to read its tool capabilities.',\n 'tools.surface.origin': 'Source: ',\n 'tools.surface.refresh': 'Refresh tools',\n 'tools.surface.loading': 'Loading tools…',\n 'tools.surface.readFailed': 'Failed to read the tool surface',\n 'tools.surface.retrySuffix': '; refresh to retry.',\n 'tools.surface.note.session': 'Refreshing does not upgrade the generation of an existing session and never resumes it.',\n 'tools.surface.note.preset': 'Preset capabilities do not describe the current session; editing a preset does not replace a frozen generation.',\n\n 'characters.aria': 'Characters',\n 'characters.library.title': 'Character card library',\n 'characters.library.hint': 'Review and import character cards one at a time into the library. Supports PNG, JSON, YAML and resource packages. Apply explicitly to the current preset after importing, or remove at any time.',\n 'characters.importImage': 'Import card image',\n 'characters.importJson': 'Import card JSON',\n 'characters.importing': 'Importing…',\n 'characters.pickImage.aria': 'Choose a SillyTavern character card image',\n 'characters.pickJson.aria': 'Choose a character card JSON',\n 'characters.empty.title': 'The character library is empty',\n 'characters.empty.hint': 'Import SillyTavern cards (PNG / JSON) above, then use \"Import to current preset\" to apply one to the preset in use.',\n 'characters.badge.imported': 'Imported to current preset',\n 'characters.remove': 'Remove from current preset',\n 'characters.removing': 'Removing…',\n 'characters.apply': 'Import to current preset',\n 'characters.openDir.label': 'Open character card folder',\n 'characters.openDir.aria': 'Open character card folder: {name}',\n 'characters.delete.label': 'Delete character card',\n 'characters.delete.aria': 'Delete character card: {name}',\n 'characters.confirmDelete': 'Confirm delete',\n 'characters.cancel': 'Cancel',\n 'characters.notice.stored': 'Character card \"{name}\" stored',\n 'characters.notice.storeFailed': 'Failed to store the character card: {reason}',\n 'characters.notice.unsupported': 'Unsupported file type: {name} (PNG character card or JSON only)',\n 'characters.notice.importFailed': 'Character card import failed: {reason}',\n 'characters.notice.targetChanged': 'The active preset changed, so the old preview was not submitted: pick the file again to import',\n 'characters.notice.submitFailed': 'Submit failed (files and preview kept; confirm again or cancel): {reason}',\n 'characters.notice.applied': 'Imported to the current preset ({count} configs)',\n 'characters.notice.applyFailed': 'Failed to import into the current preset: {reason}',\n 'characters.notice.removed': 'Removed from the current preset ({count} configs)',\n 'characters.notice.removeFailed': 'Failed to remove: {reason}',\n 'characters.notice.deleted': 'Character card {id} deleted (parameters already imported into the current preset are unaffected)',\n 'characters.notice.deleteFailed': 'Failed to delete: {reason}',\n 'characters.notice.opened': 'Opened character card folder: {path}',\n 'characters.notice.openFailed': 'Failed to open the folder: {reason}',\n\n 'skills.aria': 'Skills',\n 'skills.tabs.aria': 'Skill status filter',\n 'skills.tabs.all': 'All',\n 'skills.tabs.model': 'Model available',\n 'skills.tabs.user': 'User available',\n 'skills.tabs.blocked': 'Both disabled',\n 'skills.incomplete': 'Skill discovery for this session is incomplete. Registration is unconfirmed; permitted file policy changes remain available.',\n 'skills.refresh': 'Refresh skill list',\n 'skills.library.title': 'Skill directories and assets',\n 'skills.library.meta': '{count} skills · from the official skill roots',\n 'skills.library.hint': 'Skill entities stay in their own roots; this plugin never moves or links them — disabling only rewrites the invocation keys in that skill SKILL.md.',\n 'skills.library.unknown': '(user skills directory unknown; reload the configuration)',\n 'skills.library.open': 'Open user skills directory',\n 'skills.library.footnote': 'Disabling rewrites the two official keys in that skill SKILL.md (disable-model-invocation / user-invocable): the model catalog, the skill tool and slash commands are toggled independently. Body, comments and every other field stay byte-identical, and writing false/true restores them. Read-only sources (for example packaged bundled roots) report the write failure instead of failing silently.',\n 'skills.dir.rescan': 'Rescan',\n 'skills.dir.cancel': 'Cancel',\n 'skills.import.pick': 'Import skills',\n 'skills.import.pick.hint': 'Choose a host directory and copy its contents into the user skills directory (copy, not reference)',\n 'skills.folders.pick': 'Reference folder',\n 'skills.folders.remove': 'Remove reference',\n 'skills.folders.empty': 'No skill folder is referenced yet.',\n 'skills.folders.duplicate': 'That folder is already referenced',\n 'skills.folders.hint': 'References record paths without copying. Removing a reference leaves its files intact. Policy switches edit the original skill file; deleting a referenced skill moves its source to the recycle bin.',\n 'skills.source.aria': 'Filter skills by source',\n 'skills.source.all': 'All sources',\n 'skills.source.project-dsh': 'Project .dsh/skills',\n 'skills.source.project-agents': 'Project .agents/skills',\n 'skills.source.custom': 'Skill folders',\n 'skills.source.user-dsh': 'User skills directory',\n 'skills.source.user-agents': 'User .agents/skills',\n 'skills.source.bundled': 'Official bundled',\n 'skills.source.other': 'Other providers',\n 'skills.create.open': 'Create skill',\n 'skills.create.close': 'Collapse the create form',\n 'skills.create.name': 'Skill name (kebab-case)',\n 'skills.create.namePlaceholder': 'for example my-skill',\n 'skills.create.description': 'Description',\n 'skills.create.descriptionPlaceholder': 'The model uses it to decide when the skill applies',\n 'skills.create.content': 'Body (Markdown)',\n 'skills.create.contentPlaceholder': '# Usage…',\n 'skills.create.submit': 'Create',\n 'skills.create.invalid': 'The skill name must be kebab-case and the description is required',\n 'skills.create.hint': 'Creating writes into the user skills directory, where the official provider discovers it immediately.',\n 'skills.delete.title': 'Delete skill {name}?',\n 'skills.delete.description': 'Move the skill at this path to the recycle bin for manual recovery: {path}. Deleting a referenced skill moves its source files; removing only the folder reference leaves those files intact.',\n 'skills.delete.confirm': 'Delete',\n 'skills.delete.failed': 'Deletion failed. Review the error and retry.',\n 'skills.filter.aria': 'Filter the skill list',\n 'skills.filter.placeholder': 'Filter skills: name / folder / description…',\n 'skills.visible': '{count} visible',\n 'skills.group.meta': '{count} skills · priority {rank}',\n 'skills.empty.title': 'No skills discovered',\n 'skills.empty.hint': 'Expand directories and assets above, then choose \"Import skills\" to copy skills or \"Reference folder\" to use an existing directory. You can also create a new skill.',\n 'skills.noMatch': 'No skills match the current filter.',\n 'skills.notice.dirPickFailed': 'Failed to choose the directory: {reason}',\n 'skills.notice.imported': 'Copied {count} skill files into {path}',\n 'skills.notice.importedOverwrite': 'Copied {count} skill files into {path}, replacing {overwritten} confirmed skills',\n 'skills.overwrite.title': 'Overwrite existing skills?',\n 'skills.overwrite.description': 'These skill folders already exist: {names}. Confirm to replace their contents without keeping version history.',\n 'skills.overwrite.confirm': 'Confirm overwrite',\n 'skills.notice.importFailed': 'Failed to import the skills directory: {reason}',\n 'skills.status.invalid': 'Invalid',\n 'skills.status.blocked': 'Disabled (both ends)',\n 'skills.status.shadowed': 'Shadowed by a same-name skill',\n 'skills.status.callable': 'Callable: {audiences}',\n 'skills.status.notCallable': 'Not callable',\n 'skills.row.toggles.aria': 'Invocation policy switches for {name}',\n 'skills.row.modelToggle': 'Model',\n 'skills.row.userToggle': 'User',\n 'skills.row.modelToggle.aria': 'Model invocation for {name} (frontmatter)',\n 'skills.row.userToggle.aria': 'User invocation for {name} (frontmatter)',\n 'skills.row.modelToggle.hint': 'Rewrites disable-model-invocation in this skill SKILL.md: when off the model cannot see the skill and the skill tool refuses to load it; body and every other field stay untouched',\n 'skills.row.userToggle.hint': 'Rewrites user-invocable in this skill SKILL.md: when off the user slash command cannot invoke it; body and every other field stay untouched',\n 'skills.status.audience.model': 'Model',\n 'skills.status.audience.user': 'User',\n 'skills.row.status.aria': 'Skill status: {status}',\n 'skills.row.priority': 'Source priority {rank} (compared within the same scope)',\n 'skills.row.priorityShort': 'Priority {rank}',\n 'skills.row.expand': 'Expand or collapse skill {name}',\n 'skills.edit.content': 'Skill file content',\n 'skills.edit.description': 'Description',\n 'skills.edit.hint': 'Edit only the Markdown body here; name, description and invocation settings are separate. Save pending edits before changing invocation switches.',\n 'skills.edit.save': 'Save skill',\n 'skills.edit.saving': 'Saving…',\n 'skills.edit.saved': 'Synced',\n 'skills.edit.dirty': 'Unsaved',\n 'skills.edit.loading': 'Loading…',\n 'skills.edit.unloaded': 'Not loaded',\n 'skills.edit.reload': 'Reload',\n 'skills.edit.reloadConfirm': 'Reloading discards unsaved changes to this skill. Continue?',\n 'skills.edit.readFailed': 'Unable to read the skill. Try again.',\n 'skills.edit.saveFailed': 'Unable to save the skill. Your edits are retained.',\n 'skills.row.noDescription': '(frontmatter provides no description)',\n 'skills.row.shadowedHint': 'This session uses another skill with the same name. These switches change only this file’s invocation policy.',\n 'skills.row.delete': 'Delete',\n 'skills.row.delete.hint': 'Move this skill’s source file or directory to the recycle bin; confirmation shows the exact path',\n\n 'presets.aria': 'Global switches',\n 'presets.writePreset.label': 'Global switch',\n 'presets.writePreset.hint': 'Master switch for preset materialization across all nine layers: when on, generated directories are written and refreshed; when off, every preset composition is emptied (presets stay usable but stop injecting, and tool injection stops with them). Module cards reload automatically after toggling.',\n 'presets.agents.title': 'Generated directories and order',\n 'presets.agents.meta': 'AGENTS.md file cards live in the module list; this controls output paths and display order',\n 'presets.order.label': 'Preset display order',\n 'presets.order.hint': 'The order written into preset.yml; smaller values appear earlier in the host preset list.',\n\n 'presetSwitcher.title': 'Preset templates',\n 'presetSwitcher.hint': 'Manage presets and their owned resources. Import ZIP, JSON, PNG, YAML or folders, then confirm creation or update. Export each preset as a complete ZIP or definition YAML.',\n 'presetSwitcher.new': 'New preset',\n 'presetSwitcher.import': 'Import preset',\n 'presetSwitcher.importing': 'Importing…',\n 'presetSwitcher.import.aria': 'Choose a preset.yml / SillyTavern JSON config file',\n 'presetSwitcher.importDir': 'Import folder',\n 'presetSwitcher.importDir.aria': 'Choose a preset folder',\n 'presetSwitcher.export': 'Export preset',\n 'presetSwitcher.empty': 'No presets yet; create one from a built-in template with \"New preset\" above, or add one with \"Import preset\".',\n 'presetSwitcher.dialog.title': 'New preset from a built-in template',\n 'presetSwitcher.dialog.close': 'Close new preset dialog',\n 'presetSwitcher.dialog.noTemplates': 'The plugin directory has no built-in templates.',\n 'presetSwitcher.custom.hint': 'Create a custom preset with every parameter empty; duplicate names get a numeric suffix',\n 'presetSwitcher.custom.title': 'Custom preset',\n 'presetSwitcher.custom.detail': 'custom · every parameter empty (blank start, duplicate names get a suffix)',\n 'presetSwitcher.template.hint': 'Create in the user directory: {id}',\n 'presetSwitcher.card.blocked.hint': 'Preset cannot be rendered (missing module list/composition files): delete it and restore a built-in template, or inspect preset.yml',\n 'presetSwitcher.card.active.hint': 'Current preset',\n 'presetSwitcher.card.switch.hint': 'Switch to {name}',\n 'presetSwitcher.badge.active': 'In use',\n 'presetSwitcher.blocked': 'Unavailable',\n 'presetSwitcher.duplicate.label': 'Duplicate preset',\n 'presetSwitcher.duplicate.aria': 'Duplicate preset: {name}',\n 'presetSwitcher.open.label': 'Open preset folder',\n 'presetSwitcher.open.aria': 'Open preset folder: {name}',\n 'presetSwitcher.delete.confirmHint': 'You can recreate it from a built-in template afterwards',\n 'presetSwitcher.delete.confirm': 'Confirm delete',\n 'presetSwitcher.delete.cancel': 'Cancel',\n 'presetSwitcher.delete.hintActive': 'Switch to another preset before deleting this one',\n 'presetSwitcher.delete.hint': 'Delete the user-directory copy; the built-in template can still recreate it',\n 'presetSwitcher.delete.aria': 'Delete preset: {name}',\n 'presetSwitcher.notice.imported': 'Preset {id} imported; click its card to switch',\n 'presetSwitcher.notice.importFailed': 'Failed to import the preset: {reason}',\n 'presetSwitcher.notice.exportFailed': 'Failed to export the preset: {reason}',\n 'presetSwitcher.notice.exported': 'Exported {file} (single-file config, save it anywhere)',\n 'presetSwitcher.notice.deleted': 'Preset {id} deleted (restore it from a built-in template with \"New preset\")',\n 'presetSwitcher.notice.deleteFailed': 'Failed to delete the preset: {reason}',\n 'presetSwitcher.notice.duplicated': 'Duplicated as preset {id}',\n 'presetSwitcher.notice.duplicateFailed': 'Failed to duplicate the preset: {reason}',\n 'presetSwitcher.notice.opened': 'Opened preset folder: {path}',\n 'presetSwitcher.notice.openFailed': 'Failed to open the preset folder: {reason}',\n 'presetSwitcher.notice.cloned': 'Created preset {id} from a built-in template',\n 'presetSwitcher.notice.cloneFailed': 'Failed to create the preset: {reason}',\n}\n\nconst ZH: Record<PromptToolLocaleKey, string> = { ...ZH_CORE, ...PARAMS_ZH, ...PROMPTS_ZH, ...CARDS_ZH, ...TRIGGERS_ZH }\nconst EN: Record<PromptToolLocaleKey, string> = { ...EN_CORE, ...PARAMS_EN, ...PROMPTS_EN, ...CARDS_EN, ...TRIGGERS_EN }\n\n/** 官方 locale 服务的最小使用面(便于 node:test 用 mock 覆盖注册/释放)。 */\nexport interface PromptToolLocaleRegistry {\n register(\n ns: typeof PROMPT_TOOL_NS,\n dicts: { zh: Record<PromptToolLocaleKey, string>; en: Record<PromptToolLocaleKey, string> },\n ): () => void\n}\n\n/** 命名空间翻译函数(调用时读当前语言)。 */\nexport type PromptToolTranslate = Translate<PromptToolLocaleKey>\n\ndeclare module '@deepseek-ai/dsh-client-ui-slots' {\n interface LocaleNamespaceMap {\n 'prompt-tool': PromptToolLocaleKey\n }\n}\n\nexport const PROMPT_TOOL_DICTS: { zh: Record<PromptToolLocaleKey, string>; en: Record<PromptToolLocaleKey, string> } = {\n zh: ZH,\n en: EN,\n}\n\n/** 注册 zh/en 字典;返回官方 locale 服务的幂等 disposer。 */\nexport function registerPromptToolLocale(locale: PromptToolLocaleRegistry): () => void {\n return locale.register(PROMPT_TOOL_NS, PROMPT_TOOL_DICTS)\n}\n","import type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-layout/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings-plugins/client'\nimport { SettingsTab } from './SettingsTab.tsx'\nimport { WorkbenchOverlay } from './WorkbenchOverlay.tsx'\nimport type { PromptToolWorkbenchFace } from './workbench-face.ts'\nimport { PROMPT_TOOL_NS } from '../../locales.ts'\n\n/**\n * 注册官方槽位:settings.plugins.tab 基础设置 + shell.overlay 可拖动悬浮入口\n * (触发器 + body portal 抽屉)。\n *\n * 入口位置由插件自己的位置偏好与视口夹取决定;不再占用官方侧栏 footer 槽位做\n * 几何探针——那需要读宿主布局树,随上游改版即失效。\n */\nexport function registerWorkbenchSlots(ctx: ClientContext, face: PromptToolWorkbenchFace): () => void {\n const disposeTab = ctx.slots.inject('settings.plugins.tab', () => ctx.slots.register({\n name: 'settings.plugins.tab', id: 'prompt-tool', order: 40,\n // label 用 thunk:语言切换后宿主重读 label 时取当前语言,注册期不冻结文案。\n label: () => face.t('tab.label'),\n locale: PROMPT_TOOL_NS,\n inject: () => face,\n }, SettingsTab))\n const disposeOverlay = ctx.slots.inject('shell.overlay', () => ctx.slots.register({\n name: 'shell.overlay', id: 'prompt-tool-workbench', order: 50,\n locale: PROMPT_TOOL_NS,\n inject: () => face,\n }, WorkbenchOverlay))\n return () => { disposeOverlay(); disposeTab() }\n}\n","export interface PromptToolWorkspaceSnapshot {\n open: boolean\n}\n\n/** 悬浮入口与右侧栏入口共享的轻量开关状态。 */\nexport class PromptToolWorkspaceController {\n private snapshot: PromptToolWorkspaceSnapshot = { open: false }\n private readonly listeners = new Set<() => void>()\n\n getSnapshot = (): PromptToolWorkspaceSnapshot => this.snapshot\n\n subscribe = (listener: () => void): (() => void) => {\n this.listeners.add(listener)\n return () => { this.listeners.delete(listener) }\n }\n\n open(): void { this.setOpen(true) }\n close(): void { this.setOpen(false) }\n toggle(): void { this.setOpen(!this.snapshot.open) }\n\n private setOpen(open: boolean): void {\n if (this.snapshot.open === open) return\n this.snapshot = { open }\n for (const listener of this.listeners) listener()\n }\n}\n","import type { Context as ClientContext } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-client-locale/client'\nimport type {} from '@deepseek-ai/dsh-client-connection/client'\nimport type {} from '@deepseek-ai/dsh-api-session-controller/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-settings/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-workspace/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-renderer/client'\nimport type {} from '@deepseek-ai/dsh-client-ui-session/client'\nimport type {} from '@deepseek-ai/dsh-api-remotes/client'\nimport type { PromptToolSettingsTransport } from './data/use-prompt-tool-store.ts'\nimport { createSessionModelFace } from './data/session-model-face.ts'\nimport { createSessionPresetFace } from './data/session-preset-face.ts'\nimport { readCurrentSessionId, subscribeSessionIdChange } from './data/session-id-source.ts'\nimport { bridgeCall } from './data/bridge-client.ts'\nimport { registerWorkbenchSlots } from './app/workbench/register-workbench.tsx'\nimport { PromptToolWorkspaceController } from './app/workbench/workspace-controller.ts'\nimport type { PromptToolWorkbenchFace } from './app/workbench/workbench-face.ts'\nimport type { PromptToolHostApi } from './data/host-api.ts'\nimport { PROMPT_TOOL_NS as LOCALE_NS, registerPromptToolLocale } from './locales.ts'\n\nexport const inject = [\n 'locale',\n 'slots',\n 'configForms',\n 'uiWorkspace',\n 'uiSession',\n 'remote',\n 'remote.agentPresets',\n 'remote.session',\n 'sessions',\n]\n\n/** 与宿主 settings namespace 相同的字符串;client 侧不依赖 host 包,按契约字面拼写。 */\nconst PROMPT_TOOL_NS = 'prompt-tool'\n\nexport function apply(ctx: ClientContext): void {\n // 官方 locale 字典:注册挂 effect(卸载/重挂自动释放,不会重复注册同一命名空间)。\n // 命名空间在 locales.ts 里并入官方 LocaleNamespaceMap,slot 注册据此拿到 typed t。\n ctx.effect(() => registerPromptToolLocale(ctx.locale))\n const t = ctx.locale.bind(LOCALE_NS)\n // 官方连接世代重建(connection/reset)后,宿主的模型目录缓存可能已过期:\n // 显式刷新一次(越过 10 分钟 TTL),下一次打开工作台即命中新目录。\n // 目录刷新不是关键路径,失败静默。\n ctx.effect(() => ctx.on('connection/reset', () => {\n void bridgeCall('models', { refresh: true }).catch(() => undefined)\n }))\n // 0.1.7 ui-settings:标准字段读写复用 ConfigForms 的共享镜像与写入队列。\n const scope = ctx.configForms.get<Record<string, unknown>>(PROMPT_TOOL_NS)\n const settings: PromptToolSettingsTransport = {\n scope,\n ensure: () => ctx.configForms.describe().ensure(),\n mutate: async (ops, expectedRevision) => {\n if (!await scope.mutate(ops, expectedRevision)) throw new Error(t('settings.saveRejected'))\n },\n }\n // 当前会话 id:官方在 alpha.2 把「当前选中会话」移出 Session Controller\n // (ISessions 注释:navigation belongs to view owners),SessionListState 不再\n // 有 current;改由 ui-session 的作用域绑定读取。\n const currentSessionId = (): string | undefined => readCurrentSessionId(ctx.uiSession.adapter, ctx.sessions)\n const hostApi: PromptToolHostApi = {\n currentSessionId,\n subscribeSessionChange: (listener) => subscribeSessionIdChange(ctx.uiSession.adapter, ctx.sessions, listener),\n listAgentPresets: async () => {\n try {\n const result = await ctx.remote.agentPresets.list()\n if (!result.ok) return []\n const presets = (result.value as { presets?: readonly { id: string; name?: string; description?: string; trust?: 'system' | 'user'; broken?: string }[] }).presets\n return (presets ?? []).filter((preset) => preset.broken === undefined).map(({ id, name, description, trust }) => ({\n id,\n ...(name === undefined ? {} : { name }),\n ...(description === undefined ? {} : { description }),\n ...(trust === undefined ? {} : { trust }),\n }))\n } catch {\n return []\n }\n },\n pickDirectory: () => ctx.uiWorkspace.pickDirectory(),\n openPath: async (path) => {\n const result = await ctx.remote.session.openWorkspacePath({ path })\n if (!result.ok) throw new Error(result.error.message)\n },\n // 当前会话模型选择:投影 modelSelection.next ?? 宿主默认(UI 回退);\n // 写入走官方 session.selectModel(对当前会话生效 + 宿主持久化为新会话默认)。\n sessionModel: createSessionModelFace(\n {\n currentSessionId,\n subscribeCurrent: (listener) => ctx.uiSession.adapter.current.subscribe(listener),\n // sessionId 是官方 brand 字符串:结构同源,按官方签名断言对齐。\n binding: (id) => ctx.sessions.binding(id as Parameters<typeof ctx.sessions.binding>[0]),\n subagentAddress: (id) => ctx.sessions.subagentAddress(id as Parameters<typeof ctx.sessions.subagentAddress>[0]),\n },\n (request) => ctx.remote.session.selectModel(request as Parameters<typeof ctx.remote.session.selectModel>[0]),\n ),\n // 官方会话级预设切换(新建会话 chip)只改那个空白会话,不改宿主默认预设:\n // 工作台据此跟随(见 session-preset-follow)。\n sessionPreset: createSessionPresetFace({\n currentSessionId,\n subscribeCurrent: (listener) => ctx.uiSession.adapter.current.subscribe(listener),\n binding: (id) => ctx.sessions.binding(id as Parameters<typeof ctx.sessions.binding>[0]),\n }),\n switchPreset: async (id) => {\n const sessionId = currentSessionId()\n const list = ctx.sessions.list.getSnapshot()\n const session = sessionId === undefined ? undefined : list.byId[sessionId as keyof typeof list.byId]\n if (session === undefined) return { applied: false }\n if (!session.blank) {\n return { applied: false, message: t('settings.switchReason.sessionNotBlank') }\n }\n const result = await ctx.remote.agentPresets.select(session.id, id)\n if (!result.ok) {\n const failure = result.error as { message: string; details?: { reason?: unknown } }\n const reason = failure.details?.reason\n return {\n applied: false,\n message: typeof reason === 'string' ? reason : failure.message,\n }\n }\n return { applied: true }\n },\n }\n\n // 悬浮入口:shell.overlay(可拖动触发器 + body portal 抽屉);\n // settings.plugins.tab 基础设置共享同一注入面。\n // 位置由插件自己的位置偏好 + 视口夹取决定,不读宿主布局树。\n // 注册全部走官方 SlotRegistry,不手工挂载 DOM。\n const face: PromptToolWorkbenchFace = { controller: new PromptToolWorkspaceController(), api: hostApi, settings, t }\n registerWorkbenchSlots(ctx, face)\n}\n"],"x_google_ignoreList":[6],"mappings":";;;;;;;;;;;;EA6CA,SAAS,oBAAoB,OAAmD;GAC9E,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU,OAAO,KAAA;GACxD,MAAM,OAAQ,MAA6B;GAC3C,IAAI,SAAS,QAAQ,SAAS,KAAA,KAAa,OAAO,SAAS,UAAU,OAAO,KAAA;GAC5E,MAAM,SAAS;GACf,MAAM,WAAW,OAAO,OAAO,aAAa,YAAY,OAAO,SAAS,SAAS,IAAI,OAAO,WAAW,KAAA;GACvG,MAAM,QAAQ,OAAO,OAAO,UAAU,YAAY,OAAO,MAAM,SAAS,IAAI,OAAO,QAAQ,KAAA;GAC3F,IAAI,aAAa,KAAA,KAAa,UAAU,KAAA,GAAW,OAAO,KAAA;GAC1D,OAAO;IACL;IACA;IACA,GAAI,OAAO,OAAO,oBAAoB,YAAY,OAAO,gBAAgB,SAAS,IAC9E,EAAE,iBAAiB,OAAO,gBAAgB,IAC1C,CAAC;GACP;EACF;;EAGA,SAAgB,uBAAuB,UAAoC,aAAqD;GAC9H,IAAI,SAA+B,EAAE,YAAY,MAAM;GACvD,MAAM,iBAAuC;IAC3C,MAAM,YAAY,SAAS,iBAAiB;IAC5C,MAAM,aAAa,cAAc,KAAA,KAAa,SAAS,gBAAgB,SAAS,MAAM,KAAA;IACtF,MAAM,YAAY,cAAc,KAAA,IAC5B,KAAA,IACA,oBAAoB,SAAS,QAAQ,SAAS,CAAC,EAAE,QAAQ,YAAY,OAAO,gBAAgB,CAAC,CAAC,YAAY,CAAC;IAE/G,IAAI,OAAO,cAAc,aAAa,OAAO,eAAe,cACvD,OAAO,WAAW,aAAa,WAAW,YAC1C,OAAO,WAAW,UAAU,WAAW,SACvC,OAAO,WAAW,oBAAoB,WAAW,iBAAiB,OAAO;IAC9E,SAAS;KACP,GAAI,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU;KAC/C;KACA,GAAI,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU;IACjD;IACA,OAAO;GACT;GACA,OAAO;IACL;IACA,UAAU,UAAU;KAClB,IAAI;KACJ,IAAI;KACJ,MAAM,qBAA2B;MAC/B,MAAM,KAAK,SAAS,iBAAiB;MACrC,IAAI,OAAO,SAAS;MACpB,UAAU;MACV,iBAAiB;MACjB,iBAAiB,KAAA;MACjB,IAAI,OAAO,KAAA,GACT,iBAAiB,SAAS,QAAQ,EAAE,CAAC,EAAE,QAAQ,YAAY,OAAO,gBAAgB,CAAC,CAAC,UAAU,QAAQ;KAE1G;KACA,aAAa;KACb,MAAM,WAAW,SAAS,uBAAuB;MAC/C,aAAa;MACb,SAAS;KACX,CAAC;KACD,aAAa;MACX,SAAS;MACT,iBAAiB;KACnB;IACF;IACA,MAAM,OAAO,WAAW;KACtB,MAAM,YAAY,SAAS,iBAAiB;KAC5C,IAAI,cAAc,KAAA,GAAW,MAAM,IAAI,MAAM,UAAU;KACvD,MAAM,SAAS,MAAM,YAAY;MAAE;MAAW,GAAG;KAAU,CAAC;KAC5D,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,GAAG,OAAO,MAAM,QAAQ,4BAA4B,IAAI,OAAO,MAAM,WAAW,sBAAsB;IACxI;GACF;EACF;;;;ECpFA,SAAS,WAAW,OAAoC;GACtD,OAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ,KAAA;EACjE;;EAGA,SAAgB,wBAAwB,UAAwD;;GAE9F,MAAM,UAAU,OAAkD;IAChE,IAAI;KACF,OAAO,SAAS,QAAQ,EAAE,CAAC,EAAE,QAAQ,YAAY,OAAO,aAAa;IACvE,QAAQ;KACN;IACF;GACF;GACA,MAAM,YAAY,OAChB,OAAO,KAAA,IAAY,KAAA,IAAY,WAAW,OAAO,EAAE,CAAC,EAAE,YAAY,CAAC;GACrE,OAAO;IACL,gBAAgB,SAAS,SAAS,iBAAiB,CAAC;IACpD,UAAU,UAAU;KAClB,IAAI;KACJ,IAAI;KACJ,MAAM,qBAA2B;MAC/B,MAAM,KAAK,SAAS,iBAAiB;MACrC,IAAI,OAAO,SAAS;MACpB,UAAU;MACV,iBAAiB;MACjB,iBAAiB,KAAA;MACjB,IAAI,OAAO,KAAA,GAAW,iBAAiB,OAAO,EAAE,CAAC,EAAE,UAAU,QAAQ;KACvE;KACA,aAAa;KACb,MAAM,WAAW,SAAS,uBAAuB;MAC/C,aAAa;MACb,SAAS;KACX,CAAC;KACD,aAAa;MACX,SAAS;MACT,iBAAiB;KACnB;IACF;GACF;EACF;;;;;;;;;;EC5BA,SAAgB,qBAAqB,SAA+B,UAAqD;GACvH,MAAM,UAAU,QAAQ,QAAQ,YAAY;GAC5C,MAAM,WAAW,QAAQ;GACzB,IAAI,OAAO,aAAa,YAAY,aAAa,MAAM;IACrD,MAAM,WAAW,SAAS,QAAQ,QAAQ;IAC1C,IAAI,aAAa,KAAA,KAAa,SAAS,SAAS,GAAG,OAAO;GAC5D;GACA,MAAM,MAAM,QAAQ;GACpB,OAAO,QAAQ,KAAA,KAAa,IAAI,WAAW,IAAI,KAAA,IAAY;EAC7D;;;;;;;;;;;;;;EAeA,SAAgB,yBACd,SACA,UACA,UACY;GACZ,IAAI,OAAO,qBAAqB,SAAS,QAAQ;GACjD,OAAO,QAAQ,QAAQ,gBAAgB;IACrC,MAAM,OAAO,qBAAqB,SAAS,QAAQ;IACnD,IAAI,SAAS,MAAM;IACnB,OAAO;IACP,SAAS;GACX,CAAC;EACH;;;EC5DA,MAAa,yBAAyB;;EAQtC,MAAa,mBAAmB;GAC9B,MAAM;GACN,WAAW;GACX,UAAU;GACV,QAAQ;GACR,gBAAgB;GAChB,QAAQ;GACR,iBAAiB;GACjB,YAAY;GACZ,aAAa;GACb,WAAW;GACX,YAAY;GACZ,eAAe;GACf,cAAc;GACd,uBAAuB;GACvB,aAAa;GACb,aAAa;GACb,WAAW;GACX,eAAe;GACf,YAAY;GACZ,oBAAoB;GACpB,eAAe;GACf,cAAc;GACd,gBAAgB;GAChB,UAAU;GACV,SAAS;GACT,iBAAiB;GACjB,aAAa;GACb,qBAAqB;GACrB,aAAa;GACb,cAAc;GACd,cAAc;GACd,cAAc;GACd,aAAa;GACb,iBAAiB;GACjB,YAAY;GACZ,kBAAkB;GAClB,wBAAwB;GACxB,gBAAgB;GAChB,kBAAkB;GAClB,iBAAiB;GACjB,kBAAkB;GAClB,oBAAoB;GACpB,2BAA2B;GAC3B,aAAa;GACb,kBAAkB;GAClB,sBAAsB;EACxB;;;ECvCA,MAAa,gBAAgB,UAA2B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EAE7G,MAAM,yBAAyB,YAAuD;GACpF,IAAI,YAAY,QAAQ,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,GAAG,OAAO;GACtF,MAAM,SAAS;GACf,IAAI,OAAO,OAAO,OAAO,WAAW,OAAO;GAC3C,OAAO,CAAC,OAAO,MAAM,WAAW;EAClC;;;;;EAMA,eAAe,mBAAsB,UAA8C;GACjF,MAAM,OAAO,MAAM,SAAS,KAAK;GACjC,IAAI,KAAK,KAAK,CAAC,CAAC,WAAW,GACzB,OAAO;IAAE,IAAI;IAAO,SAAS,kBAAkB,SAAS,OAAO;GAAG;GAEpE,IAAI;GACJ,IAAI;IACF,UAAU,KAAK,MAAM,IAAI;GAC3B,QAAQ;IACN,MAAM,UAAU,KAAK,KAAK,CAAC,CAAC,QAAQ,QAAQ,GAAG,CAAC,CAAC,MAAM,GAAG,EAAE;IAC5D,OAAO;KAAE,IAAI;KAAO,SAAS,wBAAwB,SAAS,OAAO,GAAG,QAAQ;IAAG;GACrF;GACA,IAAI,sBAAsB,OAAO,GAAG,OAAO;GAC3C,OAAO;IAAE,IAAI;IAAO,SAAS,yCAAyC,SAAS,OAAO;GAAG;EAC3F;EAEA,eAAsB,WAAc,MAAc,MAAyC;GACzF,IAAI;IAMF,OAAO,MAAM,mBAAsB,MALZ,MAAM,yBAAyB,MAAM;KAC1D,QAAQ;KACR,SAAS,EAAE,gBAAgB,mBAAmB;KAC9C,MAAM,KAAK,UAAU,QAAQ,CAAC,CAAC;IACjC,CAAC,CAC0C;GAC7C,SAAS,OAAO;IACd,OAAO;KAAE,IAAI;KAAO,SAAS,aAAa,KAAK;IAAE;GACnD;EACF;;EAGA,eAAsB,aAAgB,MAAc,MAAY,UAA4C;GAC1G,IAAI;IASF,OAAO,MAAM,mBAAsB,MARZ,MAAM,yBAAyB,MAAM;KAC1D,QAAQ;KACR,SAAS;MACP,gBAAgB,KAAK,QAAQ;MAC7B,eAAe,mBAAmB,QAAQ;KAC5C;KACA,MAAM;IACR,CAAC,CAC0C;GAC7C,SAAS,OAAO;IACd,OAAO;KAAE,IAAI;KAAO,SAAS,aAAa,KAAK;IAAE;GACnD;EACF;;;;EC9EA,SAAgB,WACd,UAEA,GAAG,MACuC;GAC1C,OAAO,WAA8B,iBAAiB,WAAW,KAAK,EAAE;EAC1E;EAEA,SAAgB,aAAa,MAAY,UAAwE;GAC/G,OAAO,aAA4C,iBAAiB,aAAa,MAAM,QAAQ;EACjG;;;ECxBA,SAAS,EAAE,GAAE;GAAC,IAAI,GAAE,GAAE,IAAE;GAAG,IAAG,YAAU,OAAO,KAAG,YAAU,OAAO,GAAE,KAAG;QAAO,IAAG,YAAU,OAAO,GAAE,IAAG,MAAM,QAAQ,CAAC,GAAE;IAAC,IAAI,IAAE,EAAE;IAAO,KAAI,IAAE,GAAE,IAAE,GAAE,KAAI,EAAE,OAAK,IAAE,EAAE,EAAE,EAAE,OAAK,MAAI,KAAG,MAAK,KAAG;GAAE,OAAM,KAAI,KAAK,GAAE,EAAE,OAAK,MAAI,KAAG,MAAK,KAAG;GAAG,OAAO;EAAC;EAAC,SAAgB,OAAM;GAAC,KAAI,IAAI,GAAE,GAAE,IAAE,GAAE,IAAE,IAAG,IAAE,UAAU,QAAO,IAAE,GAAE,KAAI,CAAC,IAAE,UAAU,QAAM,IAAE,EAAE,CAAC,OAAK,MAAI,KAAG,MAAK,KAAG;GAAG,OAAO;EAAC;;;;ECG/W,SAAgB,aAAa,MAA2C;GACtE,MAAM,YAAA,GAAWA,MAAAA,OAAAA,CAAwB,IAAI;GAC7C,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,MAAM;IACX,MAAM,QAAQ,4BAA4B;KAAE,SAAS,SAAS,QAAQ,QAAQ,CAAC,EAAE,MAAM;IAAE,CAAC;IAC1F,aAAa,qBAAqB,KAAK;GACzC,GAAG,CAAC,IAAI,CAAC;GACT,OAAO;EACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECIA,SAAgB,WAAW,OAab;GACZ,MAAM,CAAC,MAAM,YAAA,GAAWC,MAAAA,SAAAA,CAAS,KAAK;GACtC,MAAM,cAAA,GAAaC,MAAAA,OAAAA,CAA0B,IAAI;GACjD,MAAM,aAAA,GAAYA,MAAAA,OAAAA,CAAO,KAAK;GAC9B,MAAM,WAAW,MAAM,aAAa;GACpC,MAAM,UAAU,MAAM,YAAY;GAClC,MAAM,eAAe,aAAa,QAAQ,CAAC,QAAQ;GACnD,MAAM,oBAAoB,MAAM,QAAQ,WAAW,WAAW,CAAC,OAAO,QAAQ;GAC9E,MAAM,WAAW,MAAM,QAAQ,MAAM,WAAW,OAAO,UAAU,MAAM,KAAK;GAC5E,IAAI;GACJ,MAAM,QAAqB,MAAM,QAAQ,SAAS,QAAQ,UAAU;IAClE,MAAM,UAAuB,CAAC;IAC9B,IAAI,OAAO,UAAU,KAAA,KAAa,OAAO,MAAM,SAAS,KAAK,OAAO,UAAU,eAC5E,QAAQ,KAAK;KAAE,MAAM;KAAS,IAAI,SAAS;KAAS,MAAM,OAAO;IAAM,CAAC;IAE1E,gBAAgB,OAAO;IACvB,QAAQ,KAAK;KACX,IAAI,OAAO;KACX,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,KAAK,UAAU,oBAAoB,eAAe,KAAA;MAAY,UAAA,OAAO;KAAY,CAAA;KAC9F,GAAI,OAAO,aAAa,KAAA,IAAY,EAAE,UAAU,OAAO,SAAS,IAAI,CAAC;IACvE,CAAC;IACD,OAAO;GACT,CAAC;GAED,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,UAAU,QAAQ,KAAK;GAC7B,GAAG,CAAC,QAAQ,CAAC;GAEb,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;IAAM,WAAWC,4BAAO;IAAiB,YAAY,UAAU;KAC7D,IAAI,CAAC,QAAS,MAAM,QAAQ,YAAY,MAAM,QAAQ,OAAQ;KAC9D,MAAM,gBAAgB;KACtB,IAAI,MAAM,QAAQ,UAAU,MAAM,eAAe;KACjD,WAAW,SAAS,MAAM;KAC1B,QAAQ,KAAK;IACf;IAAG,SAAS,UAAU;KACpB,MAAM,OAAO,MAAM;KACnB,IAAI,gBAAgB,SAAS,MAAM,cAAc,SAAS,IAAI,KAAK,aAAa,SAAS,QAAQ,iBAAe,CAAC,EAAE,SAAS,IAAI,IAAI;KACpI,UAAU,UAAU;KAEpB,4BAA4B;MAAE,IAAI,CAAC,UAAU,SAAS,QAAQ,KAAK;KAAE,CAAC;IACxE;IAAG,eAAe;KAAE,UAAU,UAAU;IAAK;IAC7C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,MAAD;KACE,MAAM,QAAQ,CAAC;KACN;KACT,QAAA;KACA,WAAA;KACA,OAAO,MAAM,SAAS;KACtB,WAAW,KAAKD,4BAAO,YAAY,UAAUA,4BAAO,oBAAoBA,4BAAO,oBAAoB,MAAM,SAAS;KAC3G;KACP,YAAY,MAAM;KAClB,eAAe,QAAQ,KAAK;KAC5B,WAAW,UAAU;MACnB,QAAQ,KAAK;MACb,WAAW,SAAS,MAAM;MAC1B,IAAI,WAAW,SAAS,QAAQ,WAAW,GAAG;MAC9C,IAAI,UAAU,MAAM,OAAO,MAAM,SAAS,KAAK;KACjD;KACA,QACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MACE,KAAK;MACL,IAAI,MAAM;MACV,MAAK;MACL,WAAW,KAAKA,4BAAO,mBAAmB,UAAUA,4BAAO,2BAA2BA,4BAAO,yBAAyB;MACtH,cAAY,MAAM;MAClB,iBAAc;MACd,iBAAe,QAAQ,CAAC;MACxB,gBAAc,MAAM;MACpB,oBAAkB,MAAM;MACd;MACV,eAAe,SAAS,UAAU,CAAC,KAAK;MAX1C,UAAA,CAaE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,4BAAO;OACrB,UAAA,UAAU,UAAU,MAAM,MAAM,SAAS,IAAI,MAAM,QAAQ,MAAM,eAAe;MAC7E,CAAA,GACN,iBAAA,GAAA,kBAAA,IAAA,CAACE,sCAAAA,+BAAD,EAA+B,WAAWF,4BAAO,kBAAoB,CAAA,CAC/D;;IAEX,CAAA;GACK,CAAA;EAEV;;;ECxGA,SAAgB,UAAU,OAA4J;GACpL,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWG,4BAAO;IAAvB,UAAA;KACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MAAM,WAAWA,4BAAO;MAAa,IAAI,MAAM;MAA/C,UAAA,CAAmD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,MAAM,MAAc,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,MAAM,KAAY,CAAA,CAAO;;KACjH,MAAM;KACP,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,QAAD;MAAQ,SAAS,MAAM;MAAS,UAAU,MAAM;MAAU,OAAO,MAAM;MAAO,UAAU,MAAM;KAAW,CAAA;IACtG;;EAET;;;ECDA,SAAgB,YAAY,OAA4B;GACtD,MAAM,EAAE,MAAM;GACd,MAAM,QAAQ,MAAM,SAAS;GAE7B,MAAM,aAAA,GAAYC,MAAAA,YAAAA,EAAa,aAAyB,MAAM,UAAU,QAAQ,GAAG,CAAC,KAAK,CAAC;GAC1F,MAAM,eAAA,GAAcA,MAAAA,YAAAA,OAAkB,MAAM,YAAY,GAAG,CAAC,KAAK,CAAC;GAClE,MAAM,YAAA,GAAWC,MAAAA,qBAAAA,CAAqB,WAAW,aAAa,WAAW;GACzE,MAAM,QAAS,SAAS,SAAS,CAAC;GAClC,MAAM,CAAC,SAAS,eAAA,GAAcC,MAAAA,SAAAA,CAA8C,CAAC,CAAC;GAC9E,MAAM,CAAC,iBAAiB,uBAAA,GAAsBA,MAAAA,SAAAA,CAAS,KAAK;GAC5D,MAAM,CAAC,cAAc,oBAAA,GAAmBA,MAAAA,SAAAA,CAAoD;GAC5F,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,WAAgB,MAAM,CAAC,CACpB,MAAM,QAAQ;KACb,IAAI,CAAC,IAAI,IAAI;KACb,MAAM,OAAO,IAAI,MAAM;KACvB,IAAI,KAAK,YAAY,KAAA,GAAW,WAAW,KAAK,OAAO;IACzD,CAAC,CAAC,CACD,YAAY,CAAC,CAAC;GACnB,GAAG,CAAC,CAAC;GACL,MAAM,OAAO,OAAe,SAAwB;IAAE,MAAW,IAAI,OAAO,IAAI;GAAE;GAClF,MAAM,eAAe,OAAO,OAA8B;IACxD,IAAI,mBAAmB,OAAO,MAAM,gBAAgB;IACpD,mBAAmB,IAAI;IACvB,gBAAgB,KAAA,CAAS;IACzB,IAAI;KAGF,MAAM,MAAM,IAAI,kBAAkB,EAAE;KACpC,MAAM,SAAS,MAAM,MAAM,IAAI,aAAa,EAAE;KAC9C,IAAI,OAAO,SACT,gBAAgB;MAAE,MAAM;MAAM,SAAS,EAAE,qBAAqB,EAAE,GAAG,CAAC;KAAE,CAAC;UAClE,IAAI,OAAO,YAAY,KAAA,GAC5B,gBAAgB;MAAE,MAAM;MAAS,SAAS,EAAE,8BAA8B;OAAE;OAAI,QAAQ,OAAO;MAAQ,CAAC;KAAE,CAAC;UAE3G,gBAAgB;MAAE,MAAM;MAAM,SAAS,EAAE,0BAA0B,EAAE,GAAG,CAAC;KAAE,CAAC;IAEhF,SAAS,OAAO;KACd,gBAAgB;MAAE,MAAM;MAAS,SAAS,EAAE,yBAAyB,EAAE,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,CAAC;KAAE,CAAC;IAC5I,UAAU;KACR,mBAAmB,KAAK;IAC1B;GACF;GAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAWC,4BAAG;IAAS,cAAY,EAAE,eAAe;IAA7D,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;KAAW,IAAG;KAAiB,OAAO,EAAE,4BAA4B;KAAG,MAAM,EAAE,2BAA2B;KAAG,SAAS,MAAM,gBAAgB;KAAM,WAAW,MAAM,IAAI,eAAe,CAAC;IAAI,CAAA,GAC3L,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAWA,4BAAG;KACjB,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,4BAAG;MAAnB,UAAA;OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;QAAM,WAAWA,4BAAG;QAApB,UAAA,CAAiC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,+BAA+B,EAAU,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,EAAE,8BAA8B,EAAS,CAAA,CAAO;;OAC9I,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;QAAY,WAAWA,4BAAG;QAAgB,WAAW,EAAE,+BAA+B;QACpF,OAAO,OAAO,MAAM,mBAAmB,WAAW,MAAM,iBAAiB;QACzE,UAAU,CAAC,SAAS,YAAY;QAChC,SAAS;QACT,SAAS,QAAQ,KAAK,YAAY;SAAE,OAAO,OAAO;SAAI,OAAO,OAAO;QAAK,EAAE;QAC3E,WAAW,OAAO;SAAE,aAAkB,EAAE;QAAE;OAAI,CAAA;OAC/C,iBAAiB,KAAA,KAChB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAW,aAAa,SAAS,UAAUA,4BAAG,cAAcA,4BAAG;QAAQ,MAAK;QAC5E,UAAA,aAAa;OACb,CAAA;MAEF;;IACF,CAAA,CACE;;EAEb;;;;ECtEA,eAAsB,mBACpB,QACA,SACuB;GACvB,MAAM,2BAAW,IAAI,IAAY;GACjC,IAAI,SAAS,MAAM,OAAO;GAC1B,OAAO,CAAC,OAAO,MAAM,OAAO,SAAS,+BAA+B,OAAO,WAAW,QAAQ;IAC5F,IAAI,YAAY,KAAA,GAAW,OAAO;IAClC,IAAI,CAAC,MAAM,QAAQ,OAAO,SAAS,GAAG,OAAO;KAAE,IAAI;KAAO,MAAM;IAA0B;IAC1F,KAAK,MAAM,QAAQ,OAAO,WAAW,SAAS,IAAI,IAAI;IACtD,SAAS,MAAM,OAAO,CAAC,GAAG,QAAQ,CAAC;GACrC;GACA,OAAO;EACT;;;;ECkBA,SAAgB,8BAAqD;GACnE,IAAI,OAAO;GACX,IAAI;GACJ,OAAO,EACL,MAAM,MAAM,UAAU;IACpB,IAAI,MAAM;IACV,MAAM,SAAS,SAAS;IAExB,IAAI,WAAW,KAAA,KAAa,WAAW,SAAS,eAAe;IAE/D,IAAI,SAAS,iBAAiB,SAAS,eAAe;IACtD,IAAI,CAAC,SAAS,WAAW,MAAM,GAAG;KAChC,IAAI,WAAW,QAAQ;MACrB,SAAS;MACT,SAAS,KAAK,MAAM;KACtB;KACA;IACF;IACA,SAAS,KAAA;IAET,IAAI,SAAS,QAAQ,SAAS,aAAa,GAAG;IAC9C,OAAO;IACP,IAAI;KACF,MAAM,SAAS,MAAM,MAAM;IAC7B,UAAU;KACR,OAAO;IACT;GACF,EACF;EACF;;;EC0DA,MAAM,iBAAwD,UAC5D,OAAO,SAAS,KAAK,IAAI,KAAA,IAAY;EACvC,MAAM,oBAA2D,UAC/D,OAAO,cAAc,KAAK,KAAK,QAAQ,IAAI,KAAA,IAAY;;EAczD,MAAa,2BAA0E;GACrF,iBAAiB;IAAE,MAAM;IAAW,cAAc;IAAO,MAAM;GAAkB;GACjF,eAAe;IAAE,MAAM;IAAU,cAAc;IAAI,MAAM;GAAkB;GAC3E,iBAAiB;IAAE,MAAM;IAAW,cAAc;IAAO,MAAM;GAAkB;GACjF,WAAW;IAAE,MAAM;IAAU,cAAc;IAAI,MAAM;GAAkB;GACvE,aAAa;IAAE,MAAM;IAAW,cAAc;IAAO,MAAM;GAAkB;GAC7E,cAAc;IAAE,MAAM;IAAW,cAAc;IAAO,MAAM;GAAkB;GAC9E,cAAc;IAAE,MAAM;IAAW,cAAc;IAAM,MAAM;GAAkB;GAC7E,eAAe;IAAE,MAAM;IAAU,cAAc;IAAI,MAAM;GAAa;GACtE,WAAW;IAAE,MAAM;IAAU,cAAc;IAAI,MAAM;GAAa;GAClE,uBAAuB;IAAE,MAAM;IAAU,cAAc;IAAI,MAAM;GAAiB;GAClF,mBAAmB;IAAE,MAAM;IAAU,cAAc;IAAI,MAAM;GAAiB;GAC9E,sBAAsB;IAAE,MAAM;IAAU,cAAc;IAAI,MAAM;GAAa;GAC7E,kBAAkB;IAAE,MAAM;IAAU,OAAO;IAAe,cAAc;IAAI,MAAM;GAAa;GAC/F,gBAAgB;IAAE,MAAM;IAAU,OAAO;IAAkB,cAAc;IAAI,MAAM;GAAa;GAChG,yBAAyB;IAAE,MAAM;IAAU,cAAc;IAAI,MAAM;GAAiB;GACpF,qBAAqB;IAAE,MAAM;IAAU,OAAO;IAAe,cAAc;IAAI,MAAM;GAAiB;GACtG,mBAAmB;IAAE,MAAM;IAAU,OAAO;IAAkB,cAAc;IAAI,MAAM;GAAiB;GACvG,UAAU;IAAE,MAAM;IAAa,cAAc;IAAI,MAAM;GAAiB;GACxE,eAAe;IAAE,MAAM;IAAU,cAAc;IAAI,MAAM;GAAkB;GAC3E,cAAc;IAAE,MAAM;IAAW,cAAc;IAAI,MAAM;GAAkB;GAC3E,gBAAgB;IAAE,MAAM;IAAW,cAAc;IAAI,MAAM;GAAkB;GAC7E,gBAAgB;IAAE,MAAM;IAAU,cAAc;IAAI,MAAM;GAAkB;GAC5E,kBAAkB;IAAE,MAAM;IAAU,cAAc;IAAI,MAAM;GAAkB;GAC9E,eAAe;IAAE,MAAM;IAAU,cAAc;IAAI,MAAM;GAAkB;GAC3E,WAAW;IAAE,MAAM;IAAU,cAAc;IAAI,MAAM;GAAkB;GACvE,WAAW;IAAE,MAAM;IAAU,cAAc;IAAI,MAAM;GAAkB;GAGvE,iBAAiB;IAAE,MAAM;IAAW,cAAc;IAAO,MAAM;IAAmB,QAAQ;KAAE,KAAK;KAAoB,KAAK;IAAU;GAAE;GACtI,gCAAgC;IAAE,MAAM;IAAU,OAAO;IAAkB,cAAc;IAAO,MAAM;IAAsB,QAAQ;KAAE,KAAK;KAAsB,KAAK;KAAkB,MAAM;IAAiB;GAAE;GACjN,oBAAoB;IAAE,MAAM;IAAW,cAAc;IAAM,MAAM;IAAiB,QAAQ;KAAE,KAAK;KAAiB,KAAK;IAAU;GAAE;GACnI,2BAA2B;IAAE,MAAM;IAAe,SAAS;KAAC;KAAS;KAAQ;KAAY;KAAM;IAAU;IAAG,cAAc;IAAI,MAAM;IAAsB,QAAQ;KAAE,KAAK;KAAsB,KAAK;IAAkB;GAAE;EAC1N;EAEA,MAAa,oBAAoB,OAAO,KAAK,wBAAwB;;EASrE,SAAgB,gBAAgB,OAA0B;GACxD,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,MAAM,IAAI,MAAM,CAAC,CAAC,QAAQ,SAAS,KAAK,SAAS,CAAC;GACnF,IAAI,OAAO,UAAU,UAAU,OAAO,CAAC;GACvC,MAAM,OAAO,MAAM,KAAK;GAExB,QADc,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI,KAAA,CAClE,MAAM,GAAG,CAAC,CAAC,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,OAAO;EACnE;;;;;EC5LA,SAAgB,qBAAqB,IAAuC;GAC1E,OAAO,kBAAkB,QAAQ,QAAQ,yBAAyB,IAAI,CAAC,SAAS,EAAE;EACpF;;;;;EAoBA,MAAa,qBAA6C;GACxD;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;;EA+BA,MAAa,gCAAmE;GAC9E,gBAAgB;GAChB,SAAS;IAAE,OAAO;KAAC;KAAQ;KAAS;KAAQ;KAAQ;KAAQ;IAAM;IAAG,MAAM,CAAC;GAAE;GAC9E,UAAU,CACR;IACE,IAAI;IACJ,MAAM;IACN,OAAO;KAAC;KAAQ;KAAS;KAAQ;KAAQ;KAAQ;IAAM;IACvD,MAAM,CAAC;IACP,iBAAiB;GACnB,CACF;GAEA,gBAAgB;IACd,SAAS;IACT,OAAO;KAAC;KAAS;KAAQ;KAAQ;IAAM;IACvC,oBAAoB;IACpB,iBAAiB;GACnB;EACF;;EAGA,MAAa,sBAAmD;GAI9D;IACE,IAAI;IACJ,YAAY,CAAC,sBAAsB;IACnC,QAAQ,CAAC,sBAAsB;IAC/B,cAAc;IACd,YAAY;KAAE,KAAK;KAAsB,UAAU;IAA8B;GACnF;GAEA;IAAE,IAAI;IAAsB,YAAY,CAAC,mBAAmB;IAAG,QAAQ,CAAC,oBAAoB;IAAG,cAAc;GAAgB;GAC7H;IAAE,IAAI;IAAsB,YAAY,CAAC,oBAAoB;IAAG,QAAQ,CAAC,oBAAoB;IAAG,cAAc;GAAgB;GAG9H;IAAE,IAAI;IAAiB,YAAY,CAAC,eAAe;IAAG,QAAQ,CAAC,eAAe;IAAG,cAAc;GAAgB;EACjH;;;;;EAoBA,MAAa,uBAAqD;GAEhE;IAAE,IAAI;IAAmB,cAAc;IAAY,MAAM;GAAW;GAEpE;IAAE,IAAI;IAAW,cAAc;IAAkB,eAAe,CAAC,iBAAiB;IAAG,MAAM;GAAiB;GAE5G;IAAE,IAAI;IAAa,cAAc;IAAmB,MAAM;GAAkB;GAE5E;IAAE,IAAI;IAAc,cAAc;IAAiB,MAAM;GAAgB;GAGzE;IAAE,IAAI;IAAkB,cAAc;IAAkB,eAAe,CAAC,eAAe;IAAG,MAAM;GAAiB;GAGjH;IAAE,IAAI;IAAkB,cAAc;IAAkB,MAAM;GAAiB;GAE/E;IAAE,IAAI;IAAgB,cAAc;IAAiB,MAAM;GAAgB;EAC7E;;;;;EAMA,MAAa,0BAAwD,CACnE,GAAG,oBAAoB,KAAK,EAAE,IAAI,cAAc,qBAAqB;GAAE;GAAI;GAAc;GAAe,MAAM;EAAa,EAAE,GAC7H,GAAG,oBACL;;;;;;;;;EA4BA,MAAa,iBAA0C,CAAC;EAExD,SAAgB,iBAAiB,IAA0C;GACzE,OAAO,oBAAoB,MAAM,eAAe,WAAW,OAAO,EAAE;EACtE;EAEA,SAAgB,aAAa,IAAsC;GACjE,OAAO,eAAe,MAAM,WAAW,OAAO,OAAO,EAAE;EACzD;;;EAyCA,SAAgB,0BAA0B,IAAY,OAA+C;GACnG,IAAI,UAAU,KAAA,KAAa,MAAM,eAAe,YAAY,OAAO;GACnE,MAAM,aAAa,iBAAiB,EAAE;GACtC,IAAI,eAAe,KAAA,GAAW,OAAO;GACrC,MAAM,UAAU,MAAM,oBAAoB,MAAM;GAChD,IAAI,YAAY,MAAM,OAAO;GAC7B,OAAO,WAAW,WAAW,MAAM,QAAQ,QAAQ,SAAS,GAAG,CAAC;EAClE;;;;EC3OA,MAAa,oBAAoB;;;;;;;;;;ECgDjC,MAAM,iBAAiB;GACrB;GAAU;GAAc;GAAa;GAAa;GAAW;GAC7D;GAAiB;GAAe;GAAS;GAAc;GAAS;EAClE;;;;;EASA,MAAM,cAAqC,SACzC,OAAO,YAAY,KAAK,KAAK,QAAuB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;EAEhE,MAAa,aAAyB;GAEpC,YAAY;GACZ,GAAG,WAAW,cAAc;GAC5B,cAAc,CAAC;GACf,sBAAsB,CAAC;GACvB,gBAAgB,CAAC;GACjB,oBAAoB,CAAC;GACrB,aAAa,CAAC;EAChB;EACA,MAAa,eAAuB;GAClC,GAAG,OAAO,YAAY,kBAAkB,KAAK,QAAQ,CAAC,KAAK,yBAAyB,IAAI,CAAC,YAAY,CAAC,CAAC;GACvG,YAAY;GACZ,YAAY;GACZ,YAAY;GACZ,YAAY;GACZ,cAAc,CAAC;GACf,gBAAgB;GAChB,cAAc,CAAC;GACf,YAAY;GACZ,aAAa;GACb,cAAc;GACd,aAAa;GACb,gBAAgB;GAChB,eAAe,CAAC;EAClB;;;ECpFA,MAAM,yBAAyB;GAC7B;GAAe;GAAgB;EACjC;;EAIA,SAAgB,iBAAiB,QAAgC;GAC/D,OAAO,gBAAgB,OAAO,YAAY,CAAC,GAAG,mBAAmB,GAAG,sBAAsB,CAAC,CACxF,KAAK,QAAQ,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;EACtC;EAEA,MAAa,iBAAiB,iBAAiB,YAAY;;EAG3D,MAAa,sBAAsB,SAA8B,UAC/D,YAAY,SAAS,EAAE,QAAQ,WAAW,KAAK,MAAM,WAAW;;;EAIlE,MAAa,0BAA0B,YACrC,QAAQ,MAAM,WAAW,OAAO,KAAK,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,IAAI,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC;EAErG,MAAM,iBAAiB,UACrB,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;;EAGrE,MAAa,aAAa,GAAY,MAAwB;GAC5D,IAAI,MAAM,GAAG,OAAO;GACpB,IAAI,MAAM,QAAQ,CAAC,KAAK,MAAM,QAAQ,CAAC,GAAG;IACxC,IAAI,CAAC,MAAM,QAAQ,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,OAAO;IAC5E,OAAO,EAAE,OAAO,MAAM,UAAU,UAAU,MAAM,EAAE,MAAM,CAAC;GAC3D;GACA,IAAI,cAAc,CAAC,KAAK,cAAc,CAAC,GAAG;IACxC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,OAAO;IACnD,MAAM,uBAAO,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,CAAC,GAAG,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC;IAC3D,KAAK,MAAM,OAAO,MAAM,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO;IAC/D,OAAO;GACT;GACA,OAAO;EACT;EAEA,MAAa,iBAAiB,GAAmB,MAA+B,UAAU,GAAG,CAAC;;EAG9F,MAAa,8BAA8B,SAAyB,UAClE,cAAc,SAAS,KAAK;;EAG9B,MAAa,+BACX,mBACA,qBACA,qBACY,sBAAsB,uBAAuB;;;;ECpD3D,SAAgB,wBAAwB,QAAkD;GACxF,MAAM,QAAiC,CAAC;GACxC,KAAK,MAAM,OAAO,mBAAmB;IACnC,MAAM,QAAQ,OAAO;IACrB,MAAM,aAAa,yBAAyB;IAC5C,IAAI,UAAU,KAAA,KAAa,UAAU,MAAM;IAC3C,QAAQ,WAAW,MAAnB;KACE,KAAK;MACH,IAAI,OAAO,UAAU,WAAW,MAAM,OAAO;MAC7C;KACF,KAAK,UAAU;MACb,MAAM,SAAS,OAAO,UAAU,WAAW,QAAQ,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,KAAK,OAAO,KAAK,IAAI,KAAA;MACtH,IAAI,WAAW,KAAA,KAAa,WAAW,MAAM,MAAM,MAAM,KAAA,GACvD,MAAM,OAAO,OAAO,WAAW,iBAAiB,WAAW,OAAO,MAAM,IAAI;MAE9E;KACF;KACA,KAAK;MACH,IAAI,OAAO,UAAU,UAAU,MAAM,OAAO;MAC5C;KAEF,KAAK;MACH,IAAI,OAAO,UAAU,UAAU,MAAM,OAAO;MAC5C;KACF,KAAK;MACH,IAAI,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG,MAAM,OAAO,gBAAgB,KAAK,CAAC,CAAC,KAAK,IAAI;MACpG;KACF,KAAK,aACH,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,UAAU,MAAM,OAAO,OAAO,KAAK;IAEzF;GACF;GACA,OAAO;EACT;;EAWA,SAAgB,sBAAsB,YAAyB,WAAoD;GACjH,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,SAAS,GACjD,IAAI,UAAU,MAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAI,WAAW,OAAO,GAAG;QAClF,IAAI,UAAU,KAAA,KAAa,UAAU,MAAM,WAAW,IAAI,GAAG;EAEtE;EAEA,SAAS,gBAAgB,KAAqB,OAAyB;GACrE,QAAQ,yBAAyB,IAAI,CAAC,MAAtC;IACE,KAAK,eAAe,OAAO,gBAAgB,KAAK;IAChD,KAAK,aAAa,OAAO,UAAU,MAAM,UAAU,qBAAqB,QAAQ,OAAO,KAAK;IAC5F,SAAS,OAAO;GAClB;EACF;;EAGA,SAAgB,oBAAoB,QAAgB,SAA6D;GAC/G,MAAM,YAAqC,CAAC;GAC5C,KAAK,MAAM,OAAO,mBAAmB;IACnC,MAAM,QAAQ,gBAAgB,KAAK,OAAO,IAAI;IAC9C,MAAM,QAAQ,gBAAgB,KAAK,QAAQ,aAAa,KAAA,KAAa,OAAO,OAAO,QAAQ,UAAU,GAAG,IACpG,QAAQ,SAAS,OAAO,yBAAyB,IAAI,CAAC,YAAY;IACtE,IAAI,QAAQ,WAAW,IAAI,GAAG,KAAK,CAAC,UAAU,OAAO,KAAK,GAAG,UAAU,OAAO,SAAS;GACzF;GACA,MAAM,6BAA6B,CAAC,QAAQ,WAAW,IAAI,eAAe,KACrE,OAAO,UAAU,WAAW,KAAK,OAAO,kBAAkB,QAAQ;GACvE,MAAM,gCAAgC,CAAC,QAAQ,WAAW,IAAI,uBAAuB,KAChF,OAAO,kBAAkB,WAAW,KAAK,OAAO,0BAA0B,QAAQ;GACvF,IAAI,4BAA4B,OAAO,UAAU;GACjD,IAAI,+BAA+B,OAAO,UAAU;GAEpD,IAAI,OAAO,OAAO,WAAW,WAAW,KAAK,OAAO,cAAc,MAAM,OAAO,kBAAkB,IAAI,UAAU,gBAAgB,OAAO;GACtI,IAAI,OAAO,OAAO,WAAW,mBAAmB,KAAK,OAAO,sBAAsB,MAAM,OAAO,0BAA0B,IAAI,UAAU,wBAAwB,OAAO;GACtK,OAAO;EACT;;EAGA,MAAa,wBAAwB,OAAuC,YAC1E,MAAM,mBAAmB,QAAQ;;;;;ECtDnC,MAAa,gBAA2D;GACtE,eAAe,EAAE,MAAM,IAAI;GAC3B,kBAAkB,EAAE,MAAM,IAAI;GAC9B,QAAQ,EAAE,MAAM,IAAI;GACpB,YAAY,EAAE,MAAM,IAAI;GACxB,eAAe,EAAE,MAAM,IAAI;GAC3B,SAAS,EAAE,MAAM,IAAI;GACrB,OAAO,EAAE,MAAM,IAAI;EACrB;;;;ECjBA,MAAa,wBAAsD,CACjE;GACE,UAAU;GACV,QAAQ;IACN;KAAE,MAAM;KAAW,aAAa;IAAkB;IAClD;KAAE,MAAM;KAAoB,aAAa;IAAkB;IAC3D;KAAE,MAAM;KAAe,aAAa;IAAgB;IACpD;KAAE,MAAM;KAAuB,aAAa;IAAe;IAC3D;KAAE,MAAM;KAAyB,aAAa;IAAiB;IAC/D;KAAE,MAAM;KAAyB,aAAa;IAAiB;IAC/D;KAAE,MAAM;KAA2B,aAAa;IAAmB;IACnE;KAAE,MAAM;KAAwB,aAAa;IAAgB;GAC/D;EACF,GACA;GACE,UAAU;GACV,QAAQ;IACN;KAAE,MAAM;KAAW,aAAa;IAAe;IAE/C;KAAE,MAAM;KAAc,aAAa;KAAe,SAAS;KAAM,cAAc;IAAgB;IAC/F;KAAE,MAAM;KAAoB,aAAa;KAAe,SAAS;IAAK;IACtE;KAAE,MAAM;KAAe,aAAa;IAAY;IAChD;KAAE,MAAM;KAAyB,aAAa;IAAiB;IAC/D;KAAE,MAAM;KAAoB,aAAa;IAAY;IACrD;KAAE,MAAM;KAAoB,aAAa;IAAY;GACvD;EACF,CACF;;EAQA,SAAgB,uBAAuB,UAAkB,KAA8C;GACrG,MAAM,OAAO,sBAAsB,MAAM,UAAU,MAAM,aAAa,QAAQ;GAC9E,IAAI,SAAS,KAAA,KAAa,QAAQ,QAAQ,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,GAAG,OAAO,KAAA;GAChG,MAAM,SAAS;GACf,IAAI,OAAO,aAAa,YAAY,CAAC,MAAM,QAAQ,OAAO,MAAM,GAAG,OAAO,KAAA;GAO1E,OAAO;IAAE;IAAU,QANJ,KAAK,OAAO,SAAS,EAAE,WAAW;KAG/C,MAAM,SAFS,OAAO,OAAqB,MAAM,SAAS,SAAS,QAAQ,OAAO,SAAS,YACrF,KAAiC,SAAS,IAC7B,CAAC,EAAE;KACtB,OAAO,WAAW,kBAAkB,WAAW,kBAAkB,CAAC;MAAE;MAAM;KAAO,CAAgD,IAAI,CAAC;IACxI,CACwB;GAAE;EAC5B;;EAGA,SAAgB,kBAAkB,UAA8B,SAA6D;GAC3H,IAAI,aAAa,KAAA,KAAa,SAAS,aAAa,UAAU,OAAO,KAAA;GAErE,MAAM,SADO,sBAAsB,MAAM,UAAU,MAAM,aAAa,QACpD,CAAC,EAAE,OAAO,QAAQ,UAAU,QAAQ,OAAO,MAAM,UAAU,MAAM,SAAS,MAAM,QAAQ,MAAM,WAAW,cAAc,CAAC,KAAK,CAAC;GAChJ,OAAO,OAAO,SAAS,IAAI;IAAE;IAAU;GAAO,IAAI,KAAA;EACpD;EAEA,SAAgB,qBAAqB,QAA2D,MAAuB;GACrH,OAAO,kBAAkB,OAAO,IAAI,OAAO,YAAY,CAAC,EAAE,OAAO,MAAM,UAAU,MAAM,SAAS,IAAI,MAAM;EAC5G;;EAGA,SAAgB,wBAA8D,QAAoC;GAChH,MAAM,EAAE,cAAc,eAAe,GAAG,eAAe;GACvD,OAAO;EACT;;EAGA,SAAgB,kBACd,OACA,QACS;GACT,IAAI,MAAM,SAAS,WAAW,OAAO,OAAO;GAC5C,IAAI,MAAM,SAAS,cAAc,OAAO,OAAO;GAC/C,MAAM,MAAM,MAAM,KAAK,QAAQ,aAAa,EAAE;GAC9C,OAAO,OAAO,SAAS;EACzB;;;;ECzFA,SAAgB,uBAAuB,QAA8C;GACnF,MAAM,eAAe,uBAAuB,OAAO,IAAI,OAAO,YAAY;GAC1E,OAAO;IAAE,GAAG,wBAAwB,MAAM;IAAG,GAAI,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa;GAAG;EACvG;EAEA,MAAMC,cAAY,UAChB,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAAI,QAAmC,CAAC;EAE7G,MAAM,cAAc,QAAiC,QAAoC;GACvF,MAAM,QAAQ,OAAO;GACrB,OAAO,OAAO,UAAU,WAAW,QAAQ,KAAA;EAC7C;EAEA,MAAM,mBAAmB,QAAiC,QAA0B;GAClF,MAAM,QAAQ,OAAO;GACrB,OAAO,MAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,UAA2B,OAAO,UAAU,QAAQ,IAAI,CAAC;EACvG;EAEA,MAAM,eAAe,QAAiC,KAAa,aAA+B;GAChG,MAAM,QAAQ,OAAO;GACrB,OAAO,OAAO,UAAU,YAAY,QAAQ;EAC9C;EAEA,MAAM,cAAc,QAAiC,KAAa,aAA6B;GAC7F,MAAM,QAAQ,OAAO;GACrB,OAAO,OAAO,UAAU,YAAY,OAAO,cAAc,KAAK,KAAK,SAAS,IAAI,QAAQ;EAC1F;EAEA,MAAM,oBAAoB,QAAiC,QAAqC;GAC9F,MAAM,QAAQ,OAAO;GACrB,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,OAAO,CAAC;GACnC,OAAO,MAAM,SAAS,UAAU;IAC9B,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU,OAAO,CAAC;IACzD,MAAM,SAAS;IACf,MAAM,KAAK,WAAW,QAAQ,IAAI;IAClC,MAAM,OAAO,WAAW,QAAQ,MAAM;IACtC,MAAM,SAAS,WAAW,QAAQ,QAAQ;IAC1C,MAAM,MAAM,WAAW,QAAQ,KAAK;IACpC,MAAM,OAAO,WAAW,QAAQ,QAAQ;IACxC,IAAI,OAAO,KAAA,KAAa,SAAS,KAAA,KAAa,WAAW,KAAA,KAAa,QAAQ,KAAA,KAAa,SAAS,KAAA,GAAW,OAAO,CAAC;IACvH,OAAO,CAAC;KACN;KACA;KACA;KACA;KACA,QAAQ,OAAO,OAAO,eAAe,IAAI,IAAI,OAAsC;KACnF,MAAM,WAAW,QAAQ,QAAQ,CAAC;KAClC,aAAa,WAAW,QAAQ,aAAa,KAAK;KAClD,OAAO,YAAY,QAAQ,SAAS,KAAK;KACzC,gBAAgB,YAAY,QAAQ,kBAAkB,IAAI;KAC1D,eAAe,YAAY,QAAQ,iBAAiB,IAAI;KACxD,GAAI,WAAW,QAAQ,OAAO,MAAM,KAAA,IAAY,EAAE,OAAO,WAAW,QAAQ,OAAO,EAAG,IAAI,CAAC;KAC3F,GAAI,WAAW,QAAQ,UAAU,MAAM,KAAA,IAAY,EAAE,UAAU,WAAW,QAAQ,UAAU,EAAG,IAAI,CAAC;KACpG,GAAI,WAAW,QAAQ,MAAM,MAAM,KAAA,IAAY,EAAE,MAAM,WAAW,QAAQ,MAAM,EAAG,IAAI,CAAC;KAExF,cAAc,OAAO,iBAAiB,aAAa,aAAa;KAChE,GAAI,OAAO,OAAO,iBAAiB,YAAY,EAAE,cAAc,OAAO,aAAa,IAAI,CAAC;KACxF,GAAI,OAAO,OAAO,YAAY,YAAY,EAAE,SAAS,OAAO,QAAQ,IAAI,CAAC;KACzE,GAAI,OAAO,OAAO,cAAc,YAAY,EAAE,WAAW,OAAO,UAAU,IAAI,CAAC;KAC/E,GAAI,WAAW,QAAQ,UAAU,MAAM,KAAA,IAAY,EAAE,UAAU,WAAW,QAAQ,UAAU,EAAG,IAAI,CAAC;KACpG,GAAI,WAAW,QAAQ,gBAAgB,MAAM,KAAA,IAAY,EAAE,gBAAgB,WAAW,QAAQ,gBAAgB,EAAG,IAAI,CAAC;IACxH,CAAC;GACH,CAAC;EACH;EAEA,MAAM,qBAAqB,QAAiC,QAAqC;GAC/F,MAAM,QAAQ,OAAO;GACrB,IAAI,CAAC,MAAM,QAAQ,KAAK,GAAG,OAAO,CAAC;GACnC,OAAO,MAAM,SAAS,UAAU;IAC9B,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU,OAAO,CAAC;IACzD,MAAM,SAAS;IACf,OAAO,OAAO,OAAO,OAAO,YAAY,OAAO,GAAG,SAAS,IAAI,CAAC,KAA0B,IAAI,CAAC;GACjG,CAAC;EACH;;EAIA,SAAgB,wBAAwB,UAAyH;GAE/J,OAAO;IAKL,cANc,iBAAiB,EAAE,QAAQ,SAAS,OAAO,GAAG,QAMxC;IACpB,gBAAgB,SAAS,aAAa;IACtC,cAAc,gBAAgB,EAAE,SAAS,SAAS,QAAQ,GAAG,SAAS;IACtE,YAAY,gBAAgB,EAAE,OAAO,SAAS,MAAM,GAAG,OAAO,CAAC,CAAC,MAAM;GACxE;EACF;EAEA,SAAgB,eAAe,KAA+C;GAC5E,MAAM,KAAK,IAAI,KAAK,IAAI,QAAQ,KAAA;GAChC,MAAM,QAAQA,WAAS,IAAI,KAAK;GAChC,MAAM,OAAOA,WAAS,IAAI,IAAI;GAqB9B,OAAO;IAnBL,GAAG;IACH,YAAY,WAAW,OAAO,YAAY,KAAK,WAAW,MAAM,YAAY,KAAK;IACjF,YAAY,WAAW,OAAO,YAAY,KAAK,WAAW,MAAM,YAAY,KAAK;IACjF,YAAY,WAAW,OAAO,YAAY,KAAK,WAAW,MAAM,YAAY,KAAK;IACjF,YAAY,WAAW,OAAO,YAAY,KAAK,WAAW,MAAM,YAAY,KAAK;IACjF,GAAG,wBAAwB;KACzB,QAAQ,IAAI,KAAK,IAAI,gBAAgB,CAAC,IAAI,CAAC;KAC3C,UAAU,IAAI,MAAM,IAAI,mBAAmB;KAC3C,SAAS,IAAI,KAAK,IAAI,gBAAgB,CAAC,IAAI,CAAC;KAC5C,OAAO,IAAI,KAAK,IAAI,oBAAoB,CAAC,IAAI,CAAC;IAChD,CAAC;IACD,aAAa,WAAW,OAAO,eAAe,WAAW,MAAM,eAAe,CAAC,CAAC;IAChF,cAAc,WAAW,OAAO,cAAc,KAAK,WAAW,MAAM,cAAc,KAAK;IACvF,aAAa,YAAY,OAAO,eAAe,YAAY,MAAM,eAAe,IAAI,CAAC;IACrF,gBAAgB,WAAW,OAAO,gBAAgB,KAAK,WAAW,MAAM,gBAAgB,KAAA;IACxF,eAAe,MAAM,kBAAkB,KAAA,IACnC,kBAAkB,OAAO,eAAe,IACxC,kBAAkB,MAAM,eAAe;GAEnC;EACZ;;EAEA,SAAgB,mBAAmB,MAA0E;GAC3G,IAAI,CAAC,KAAK,IAAI,OAAO;GACrB,OAAO;IACL,IAAI;IACJ,OAAO;KACL,IAAI;KACJ,OAAO,KAAK,MAAM;KAClB,MAAM,KAAK,MAAM;KACjB,UAAU,KAAK,MAAM;IACvB;IACA,WAAW,KAAK;IAChB,cAAc,KAAK;IACnB,kBAAkB,KAAK;IACvB,cAAc,KAAK;IACnB,gBAAgB,KAAK;IACrB,cAAc,KAAK;IACnB,sBAAsB,KAAK;IAC3B,cAAc,KAAK;IACnB,kBAAkB,KAAK;IACvB,aAAa,KAAK;GACpB;EACF;;EAGA,SAAgB,kBAAkB,QAAgB,QAAqD;GACrG,OAAO,WAAW,KAAA,IAAY,SAAS;IAAE,GAAG;IAAQ,GAAG,wBAAwB,MAAM;GAAE;EACzF;;;;;;;ECpJA,MAAa,kBAAkB,WAC7B,OAAO,OAAO;;;;;EAMhB,MAAa,uBAAuB,WAAkD;GACpF,MAAM,SAAS,OAAO;GACtB,IAAI,WAAW,KAAA,KAAa,OAAO,SAAS,oBAAoB,OAAO,OAAO;GAC9E,MAAM,SAAS,OAAO,QAAQ;GAC9B,OAAO,OAAO,eAAe,sBAAsB,OAAO,WAAW,YAAY,OAAO,SAAS,IAC7F,SACA,KAAA;EACN;;EAGA,MAAa,oBAAoB,WAAuC,oBAAoB,MAAM,MAAM,KAAA;;EAGxG,MAAa,gBAAgB,WAAuC,CAAC,iBAAiB,MAAM;;;;;EAM5F,MAAa,oBAAoB,WAAiD;GAChF,IAAI,CAAC,eAAe,MAAM,GAAG,OAAO;GACpC,MAAM,OAA0B,EAAE,GAAG,OAAO;GAC5C,OAAO,KAAK;GACZ,IAAI,KAAK,WAAW,KAAA,GAAW;IAC7B,MAAM,SAAS,EAAE,GAAG,KAAK,OAAO;IAChC,OAAO,OAAO;IACd,KAAK,SAAS;GAChB;GACA,OAAO;EACT;;EAGA,MAAa,mBAAmB,WAAiD;GAC/E,IAAI,CAAC,eAAe,MAAM,MAAM,OAAO,QAAQ,QAAQ,IAAI,OAAO;GAClE,MAAM,OAAO,OAAO,OAAO,QAAQ,SAAS,WAAW,OAAO,OAAO,OAAO;GAC5E,OAAO,KAAK,SAAS,IAAI;IAAE,GAAG;IAAQ;GAAK,IAAI;EACjD;;;ECiBA,MAAa,yBAA+C;GAC1D,WAAW;GACX,KAAK;GACL,QAAQ;GACR,KAAK;GACL,QAAQ,CAAC;GACT,OAAO,EAAE,sBAAsB,KAAK;EACtC;;;;;EAMA,MAAa,6BAAgD;GAC3D;GACA;GACA;GAEA;EACF;EAEA,MAAa,6BAA6B,SACxC,SAAS,KAAA,KAAa,2BAA2B,SAAS,IAAI;EAEhE,MAAM,qBAAqB,MAA+B,eAAgD;GACxG,QAAQ,KAAK;GACb;GACA,MAAM,KAAK;GACX,aAAa,KAAK;GAClB,OAAO,KAAK;GACZ,QAAQ,KAAK;GACb,GAAI,KAAK,YAAY,KAAA,IAAY,CAAC,IAAI,EAAE,SAAS,KAAK,QAAQ;GAC9D,UAAU,KAAK;GACf,cAAc,KAAK,WAAW,UAAU,KAAK,OAAO;GACpD,SAAS,KAAK,WAAW,UAAU,KAAK,OAAO;EACjD;;EAGA,SAAS,WAAW,OAAyB,MAA+B,WAA4C;GACtH,IAAI,KAAK,WAAW,SAElB,OAAO;IACL,GAAG;IACH;IACA,MAAM,KAAK;IACX,aAAa,KAAK;IAClB,OAAO,KAAK;IACZ,QAAQ,KAAK;IACb,SAAS,KAAK;IACd,QAAQ;IACR,UAAU;GACZ;GAEF,MAAM,QAAQ,MAAM,YAAY,MAAM;GACtC,MAAM,cAAc,KAAK,aAAa,MAAM;GAC5C,IAAI,SAAS,aAEX,OAAO;IACL,GAAG;IACH;IACA,MAAM,KAAK;IACX,aAAa,KAAK;IAClB,OAAO,KAAK;IACZ,QAAQ;IACR,SAAS,KAAK;IACd,QAAQ;IACR,UAAU;GACZ;GAEF,IAAI,OAAO,OAAO;IAAE,GAAG;IAAO;IAAW,MAAM,KAAK;IAAM,aAAa,KAAK;IAAa,OAAO,KAAK;IAAO,QAAQ;IAAS,SAAS,KAAK;IAAS,QAAQ;GAAM;GAClK,OAAO,kBAAkB,MAAM,SAAS;EAC1C;;;;;EAMA,SAAgB,iBACd,UACA,KACA,UACsB;GACtB,MAAM,OAAO,YAAY;GACzB,MAAM,YAAY,SAAS,QAAQ;GACnC,MAAM,SAAS,SAAS,MAAM,KAAK,SAAS;IAC1C,MAAM,WAAW,KAAK,OAAO,MAAM,UAAU,MAAM,WAAW,KAAK,MAAM;IACzE,OAAO,aAAa,KAAA,IAAY,kBAAkB,MAAM,SAAS,IAAI,WAAW,UAAU,MAAM,SAAS;GAC3G,CAAC;GACD,KAAK,MAAM,SAAS,KAAK,QAAQ;IAC/B,IAAI,SAAS,MAAM,MAAM,SAAS,KAAK,WAAW,MAAM,MAAM,GAAG;IACjE,OAAO,KAAK;KAAE,GAAG;KAAO,WAAW;KAAM,QAAQ;KAAW,QAAQ;KAAO,SAAS;IAAmB,CAAC;GAC1G;GACA,OAAO;IACL;IACA,KAAK,SAAS,QAAQ;IACtB,QAAQ,SAAS,QAAQ;IACzB;IACA;IAEA,OAAO,SAAS,SAAS,EAAE,sBAAsB,KAAK;GACxD;EACF;;EAGA,SAAgB,yBAAyB,MAA4B,KAAmC;GACtG,OAAO;IAAE,GAAG;IAAM,WAAW;IAAM,KAAK;IAAM,QAAQ;IAAe;IAAK,QAAQ,KAAK,OAAO,KAAK,WAAW;KAAE,GAAG;KAAO,QAAQ;IAAM,EAAE;IAAG,OAAO,EAAE,sBAAsB,KAAK;GAAE;EACrL;;EAGA,MAAa,2BAA2B,MAA4B,QAAyB,KAAK,QAAQ;EAE1G,SAAgB,gBAAgB,MAA4B,QAAgB,SAAuC;GACjH,OAAO;IACL,GAAG;IACH,QAAQ,KAAK,OAAO,KAAK,UACvB,MAAM,WAAW,SAAS;KAAE,GAAG;KAAO;KAAS,OAAO,KAAA;IAAU,IAAI,KACrE;GACH;EACF;;EAGA,SAAgB,uBAAuB,MAA4B,MAAqD;GACtH,MAAM,WAAW,KAAK,OAAO,MAAM,UAAU,MAAM,WAAW,KAAK,MAAM;GACzE,MAAM,OAAO,kBAAkB,MAAM,KAAK,SAAS;GACnD,OAAO;IACL,GAAG;IACH,QAAQ,aAAa,KAAA,IACjB,CAAC,GAAG,KAAK,QAAQ,IAAI,IACrB,KAAK,OAAO,KAAK,UAAW,MAAM,WAAW,KAAK,SAAS,OAAO,KAAM;GAC9E;EACF;;EAGA,MAAa,4BAA4B,SACvC,KAAK,OAAO,QAAQ,UAAU,MAAM,YAAY,MAAM,YAAY;;EAGpE,MAAa,gBAAgB,MAA4B,UACvD,MAAM,WAAW,WACd,MAAM,cAAc,QACpB,MAAM,cAAc,KAAK,aACzB,MAAM,aAAa,QACnB,MAAM,aAAa,QACnB,MAAM,WAAW,QACjB,MAAM,YAAY,MAAM;EAE7B,MAAa,6BAA6B,SACxC,KAAK,OAAO,QAAQ,UAAU,aAAa,MAAM,KAAK,CAAC;;EAGzD,SAAgB,uBACd,MACA,QACA,WACoC;GACpC,MAAM,QAAQ,KAAK,OAAO,MAAM,UAAU,MAAM,WAAW,MAAM;GACjE,IAAI,UAAU,KAAA,KAAa,KAAK,cAAc,QAAQ,CAAC,aAAa,MAAM,KAAK,GAAG,OAAO,KAAA;GACzF,OAAO;IACL,GAAI,cAAc,KAAA,KAAa,UAAU,WAAW,IAAI,CAAC,IAAI,EAAE,UAAU;IACzE,WAAW,KAAK;IAChB,QAAQ,MAAM;IACd,kBAAkB,MAAM;IACxB,SAAS,MAAM;GACjB;EACF;EAEA,SAAgB,gBAAgB,MAA4B,QAAgB,QAAuC;GACjH,OAAO;IACL,GAAG;IACH,QAAQ,KAAK,OAAO,KAAK,UACvB,MAAM,WAAW,SAAS;KAAE,GAAG;KAAO;KAAQ,GAAI,SAAS,EAAE,OAAO,KAAA,EAAU,IAAI,CAAC;IAAG,IAAI,KAC3F;GACH;EACF;;EAGA,SAAgB,iBACd,MACA,QACA,SACA,UACsB;GACtB,OAAO;IACL,GAAG;IACH,QAAQ,KAAK,OAAO,KAAK,UACvB,MAAM,WAAW,SACb;KAAE,GAAG;KAAO,cAAc,QAAQ;KAAS;KAAU,QAAQ;KAAO,OAAO,KAAA;KAAW,UAAU,KAAA;IAAU,IAC1G,KACL;GACH;EACF;;EAGA,SAAgB,iBACd,MACA,QACA,SACA,UAAkC,CAAC,GACb;GACtB,OAAO;IACL,GAAG;IACH,QAAQ,KAAK,OAAO,KAAK,UACvB,MAAM,WAAW,SACb;KAAE,GAAG;KAAO,QAAQ;KAAO,OAAO;KAAS,GAAI,QAAQ,aAAa,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IAAG,IACpG,KACL;GACH;EACF;;EAGA,SAAgB,kBACd,MACA,SACA,UACsB;GACtB,IAAI,OAAO;GACX,KAAK,MAAM,UAAU,SACnB,IAAI,OAAO,MAAM,OAAO,aAAa,KAAA,GAAW;IAC9C,MAAM,UAAU,SAAS,IAAI,OAAO,MAAM;IAC1C,IAAI,YAAY,KAAA,GAAW,OAAO,iBAAiB,MAAM,OAAO,QAAQ,SAAS,OAAO,QAAQ;SAC3F,OAAO,gBAAgB,MAAM,OAAO,QAAQ,KAAK;GACxD,OACE,OAAO,iBAAiB,MAAM,OAAO,QAAQ,OAAO,WAAW,QAAQ,EAAE,UAAU,OAAO,aAAa,KAAK,CAAC;GAGjH,OAAO;EACT;;;;ECxRA,MAAa,oCAA6D;GACxE,OAAO;GACP,UAAU;GACV,WAAW;GACX,UAAU;GACV,YAAY;EACd;EAEA,MAAa,oCAA+D;GAC1E,QAAQ;IAAE,SAAS;IAAO,UAAU,EAAE,GAAG,kCAAkC;IAAG,OAAO,CAAC;GAAE;GACxF,UAAU;GACV,QAAQ;EACV;;EAGA,SAAgB,6BACd,QACA,QAC+D;GAE/D,MAAM,WAAW,OAAO,QAAQ,WAAW,CAAC;GAC5C,OAAO;IACL,GAAG;IACH,GAAG,OAAO;IACV,GAAG;IACH,SAAS,OAAO,WAAW,SAAS,YAAY;GAClD;EACF;;EAGA,SAAgB,8BACd,QACA,UACwB;GACxB,OAAO,EAAE,OAAO,GAAG,SAAS,SAAS,EAAE;EACzC;;;EC3CA,SAAgB,wBAAyC;GACvD,IAAI,OAAyB,QAAQ,QAAQ;GAC7C,OAAO,EACL,QAAQ,MAAM;IACZ,MAAM,UAAU,KAAK,KAAK,IAAI;IAC9B,OAAO,QAAQ,YAAY,CAAC,CAAC;IAC7B,OAAO;GACT,EACF;EACF;;;ECOA,MAAa,yBAAyB,UAAuC,CAAC,GAAG,MAAM,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,UAAU,MAAM,SAAS,MAAM,UAAU,MAAM,MAAM,SAAS,CAAC;EAC7K,MAAa,qBAAqB,UAAuC,CAAC,UAAU,MAAM,OAAO,MAAM,KAAK,KAAK,sBAAsB,KAAK;EAE5I,SAAgB,gBAAgB,QAAyB,UAAsC;GAC7F,IAAI,QAAQ,OAAO,SAAS,IAAI,QAAQ;GACxC,IAAI,UAAU,KAAA,GAAW;IACvB,QAAQ;KAAE,OAAO,CAAC;KAAG,OAAO,CAAC;KAAG,wBAAQ,IAAI,IAAI;KAAG,QAAQ;KAAO,WAAW;KAAO,UAAU;IAAE;IAChG,OAAO,SAAS,IAAI,UAAU,KAAK;GACrC;GACA,OAAO;EACT;EASA,SAAgB,oBAAoB,UAAkB,OAA2B,MAAiC;GAChH,MAAM,WAAW,aAA8B,aAAa,MAAM,YAAY,KAAK,UAAU;GAC7F,MAAM,WAAW,WAAwC;IAAE,IAAI;IAAO,MAAM;IAA0B,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;GAAE;GACtK,MAAM,UAAU,aAA2B;IACzC,IAAI,aAAa,MAAM,UAAU;KAAE,MAAM,OAAO,KAAA;KAAW,KAAK,QAAQ;IAAE;GAC5E;GACA,MAAM,SAAS,UAA2B;IACxC,MAAM,QAAQ,gBAAgB,KAAK;IACnC,MAAM,YAAY;IAClB,IAAI,MAAM,WAAW,KAAA,GAAW,MAAM,QAAQ,KAAA;IAC9C,KAAK,QAAQ;GACf;GACA,MAAM,OAAO,YAA8B;IACzC,IAAI,CAAC,KAAK,UAAU,KAAK,MAAM,SAAS,UAAU,MAAM,SAAS,YAAY,OAAO;IACpF,MAAM,WAAW,EAAE,MAAM;IACzB,MAAM,OAAO;IACb,KAAK,QAAQ;IACb,IAAI;KACF,MAAM,SAAS,MAAM,KAAK,QAAQ,EAAE,kBAAkB,SAAS,CAAC;KAChE,IAAI,CAAC,QAAQ,QAAQ,GAAG,OAAO;KAC/B,IAAI,CAAC,OAAO,IAAI;MAAE,MAAM,QAAQ;MAAQ,OAAO;KAAM;KACrD,MAAM,WAAW,OAAO;KACxB,MAAM,OAAO,SAAS;KAEtB,IAAI,kBAAkB,KAAK,KAAK,CAAC,UAAU,SAAS,UAAU,MAAM,KAAK,GAAG;MAC1E,MAAM,SAAS;MACf,MAAM,QAAQ;OAAE,IAAI;OAAO,MAAM;MAAwB;MACzD,OAAO;KACT;KACA,IAAI,CAAC,kBAAkB,KAAK,GAAG,MAAM,QAAQ,gBAAgB,SAAS,QAAQ;KAC9E,MAAM,QAAQ,gBAAgB,SAAS,QAAQ;KAC/C,MAAM,WAAW,SAAS;KAC1B,MAAM,SAAS;KACf,MAAM,SAAS,KAAA;KACf,MAAM,QAAQ,KAAA;KACd,MAAM,YAAY;KAClB,OAAO;IACT,SAAS,OAAO;KACd,IAAI,QAAQ,QAAQ,GAAG,MAAM,QAAQ,QAAQ,KAAK;KAClD,OAAO;IACT,UAAU;KAAE,OAAO,QAAQ;IAAE;GAC/B;GACA,MAAM,SAAS,OAAO,eAAe,UAA4B;IAC/D,IAAI,CAAC,KAAK,UAAU,KAAK,CAAC,MAAM,UAAU,MAAM,SAAS,KAAA,KAAa,MAAM,WAAW,KAAA,KAAa,MAAM,aAAa,KAAA,KAAa,sBAAsB,KAAK,GAAG,OAAO;IACzK,MAAM,WAAW,EAAE,MAAM;IACzB,MAAM,YAAY,gBAAgB,MAAM,KAAK;IAC7C,MAAM,mBAAmB,MAAM;IAC/B,MAAM,OAAO,eAAe,aAAa;IACzC,MAAM,YAAY;IAClB,MAAM,QAAQ,KAAA;IACd,KAAK,QAAQ;IACb,IAAI;KACF,MAAM,SAAS,MAAM,KAAK,QAAQ,UAAU,YAAY;MACtD,IAAI,CAAC,QAAQ,QAAQ,GAAG,OAAO,KAAA;MAC/B,OAAO,KAAK,QAAQ;OAAE,kBAAkB;OAAU;OAAkB,UAAU;OAAW,GAAI,eAAe,EAAE,cAAc,KAAK,IAAI,CAAC;MAAG,CAAC;KAC5I,CAAC;KACD,IAAI,CAAC,QAAQ,QAAQ,KAAK,WAAW,KAAA,GAAW,OAAO;KACvD,IAAI,CAAC,OAAO,IAAI;MAAE,MAAM,QAAQ;MAAQ,OAAO;KAAM;KACrD,IAAI,cACF,MAAM,YAAY,UAAU,MAAM,OAAO,SAAS,KAAK,CAAC,sBAAsB,KAAK;UAC9E;MACL,MAAM,QAAQ,gBAAgB,SAAS;MACvC,MAAM,WAAW,OAAO,MAAM;MAC9B,MAAM,OAAO,OAAO,MAAM;KAC5B;KACA,OAAO;IACT,SAAS,OAAO;KACd,IAAI,QAAQ,QAAQ,GAAG,MAAM,QAAQ,QAAQ,KAAK;KAClD,OAAO;IACT,UAAU;KAAE,OAAO,QAAQ;IAAE;GAC/B;;GAEA,MAAM,gBAAsB;IAC1B,IAAI,MAAM,SAAS,KAAA,GAAW;IAC9B,IAAI,MAAM,WAAW,KAAA,GAAW;KAC9B,MAAM,QAAQ,gBAAgB,MAAM,OAAO,QAAQ;KACnD,MAAM,WAAW,MAAM,OAAO;KAC9B,MAAM,OAAO,MAAM,OAAO;KAC1B,MAAM,SAAS;IACjB;IACA,MAAM,QAAQ,gBAAgB,MAAM,KAAK;IACzC,MAAM,OAAO,MAAM;IACnB,MAAM,SAAS,KAAA;IACf,MAAM,QAAQ,KAAA;IACd,MAAM,YAAY;IAClB,KAAK,QAAQ;GACf;GACA,OAAO;IAAE;IAAO;IAAM;IAAQ;GAAQ;EACxC;;;;ECpDA,SAAgB,wBAAyC;GACvD,OAAO;IAAE,wBAAQ,IAAI,IAAI;IAAG,0BAAU,IAAI,IAAI;IAAG,uBAAO,IAAI,IAAI;IAAG,yBAAS,IAAI,IAAI;IAAG,0BAAU,IAAI,IAAI;IAAG,wBAAQ,IAAI,IAAI;IAAG,0BAAU,IAAI,IAAI;GAAE;EACrJ;;EAGA,SAAgB,mBAAmB,QAAyB,UAA2B;GACrF,MAAM,WAAW,OAAO,SAAS,IAAI,QAAQ;GAC7C,MAAM,QAAQ,OAAO,MAAM,IAAI,QAAQ;GACvC,MAAM,UAAU,OAAO,QAAQ,IAAI,QAAQ;GAC3C,MAAM,SAAS,OAAO,SAAS,IAAI,QAAQ;GAC3C,OAAQ,aAAa,KAAA,MAAc,SAAS,SAAS,UAAU,kBAAkB,QAAQ,MACnF,UAAU,KAAA,MAAc,MAAM,UAAU,KAAK,UAAU,MAAM,KAAK,MAAM,KAAK,UAAU,MAAM,KAAK,KACnG,CAAC,GAAG,MAAM,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,UAAU,MAAM,SAAS,MAAM,UAAU,MAAM,MAAM,SAAS,CAAC,MAC/F,YAAY,KAAA,MAAc,QAAQ,UAAU,KAAK,UAAU,QAAQ,KAAK,MAAM,KAAK,UAAU,QAAQ,KAAK,MAC1G,WAAW,KAAA,MAAc,OAAO,UAAU,KAAK,UAAU,OAAO,KAAK,MAAM,KAAK,UAAU,OAAO,KAAK,MACvG,CAAC,GAAG,OAAO,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,WAAW,IAAI,WAAW,GAAG,SAAS,EAAE,MAAM,MAAM,SAAS,MAAM,UAAU,MAAM,MAAM,SAAS,EAAE;EAC1I;;;;ECnFA,MAAa,oBAAoB,UAAkB,UACjD,KAAK,UAAU,CAAC,UAAU,KAAK,CAAC;EAElC,SAAgB,iBAAiB,OAA2C;GAC1E,IAAI,MAAM,WAAW,GAAG,OAAO,KAAA;GAC/B,IAAI;IACF,MAAM,SAAkB,KAAK,MAAM,KAAK;IACxC,IAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,KAC3C,OAAO,OAAO,OAAO,YAAY,OAAO,EAAE,CAAC,WAAW,KACtD,OAAO,OAAO,OAAO,YAAY,OAAO,EAAE,CAAC,WAAW,GAAG,OAAO,KAAA;IACrE,OAAO;KAAE,UAAU,OAAO;KAAI,OAAO,OAAO;IAAG;GACjD,QAAQ;IACN;GACF;EACF;;EAGA,SAAgB,kBACd,SACA,SAAoC,CAAC,GACjB;GACpB,MAAM,UAA8B,CAAC;IAAE,OAAO;IAAI,OAAO;GAAa,CAAC;GACvE,MAAM,uBAAO,IAAI,IAAY;GAC7B,MAAM,OAAO,UAAkB,UAAwB;IACrD,IAAI,SAAS,WAAW,KAAK,MAAM,WAAW,GAAG;IACjD,MAAM,QAAQ,iBAAiB,UAAU,KAAK;IAC9C,IAAI,KAAK,IAAI,KAAK,GAAG;IACrB,KAAK,IAAI,KAAK;IACd,QAAQ,KAAK;KAAE;KAAO,OAAO;KAAO,OAAO;IAAS,CAAC;GACvD;GAEA,KAAK,MAAM,CAAC,UAAU,WAAW,OAAO,QAAQ,OAAO,GAAG;IACxD,IAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;IAC5B,KAAK,MAAM,SAAS,QAClB,IAAI,OAAO,UAAU,UAAU,IAAI,UAAU,KAAK;GAEtD;GACA,KAAK,MAAM,aAAa,QAAQ,IAAI,UAAU,UAAU,UAAU,KAAK;GACvE,OAAO;EACT;;;;;;;;;;;;;EAcA,SAAgB,mBAAmB,MAAsC,SAAqC;GAE5G,MAAM,WADQ,MAAM,UAAU,QACJ,MAAM,QAAQ,KAAK,OAAO,IAAI,KAAK,UAAU,CAAC;GACxE,MAAM,UAA8B,CAAC;GACrC,MAAM,uBAAO,IAAI,IAAY;GAC7B,KAAK,MAAM,UAAU,UAAU;IAC7B,IAAI,OAAO,QAAQ,OAAO,YAAY,OAAO,GAAG,WAAW,KAAK,KAAK,IAAI,OAAO,EAAE,GAAG;IACrF,KAAK,IAAI,OAAO,EAAE;IAClB,MAAM,QAAQ,OAAO,OAAO,SAAS,YAAY,OAAO,KAAK,SAAS,IAAI,OAAO,OAAO,OAAO;IAC/F,QAAQ,KAAK;KAAE,OAAO,OAAO;KAAI;IAAM,CAAC;GAC1C;GACA,IAAI,QAAQ,SAAS,KAAK,CAAC,KAAK,IAAI,OAAO,GACzC,QAAQ,KAAK;IAAE,OAAO;IAAS,OAAO,GAAG,QAAQ;GAAa,CAAC;GAEjE,IAAI,QAAQ,SAAS,KAAK,QAAQ,WAAW,KAAK,CAAC,QAAQ,MAAM,WAAW,OAAO,UAAU,EAAE,GAC7F,QAAQ,QAAQ;IAAE,OAAO;IAAI,OAAO;GAAS,CAAC;GAEhD,OAAO;EACT;;;;ECTA,MAAM,oCAA4C,IAAI,IAAI;GAAC;GAAmB;GAAmB;GAAe;GAAgB;EAAiB,CAAC;;EAGlJ,MAAM,yBAAyB;;EAgG/B,SAAS,aAAa,OAAkG;GACtH,MAAM,UAAU,MAAM,YAAY;GAClC,IAAI,QAAQ,WAAW,WAAW,OAAO,QAAQ,QAAQ,OAAO;GAChE,OAAO,IAAI,SAAS,YAAY;IAC9B,IAAI,UAAU;IACd,MAAM,UAAU,MAAM,gBAAgB;KACpC,MAAM,OAAO,MAAM,YAAY;KAC/B,IAAI,KAAK,WAAW,WAAW;KAC/B,IAAI,SAAS;KACb,UAAU;KACV,QAAQ;KACR,QAAQ,IAAI;IACd,CAAC;IAED,iBAAiB;KACf,IAAI,SAAS;KACb,UAAU;KACV,QAAQ;KACR,QAAQ,MAAM,YAAY,CAAC;IAC7B,GAAG,GAAI;GACT,CAAC;EACH;;;;;EAMA,SAAS,qBACP,SACA,MACA,QACqB;GACrB,OAAO,QAAQ,KAAK,WAAW;IAC7B,MAAM,SAAS,oBAAoB,MAAM;IACzC,IAAI,WAAW,KAAA,GAAW,OAAO;IAEjC,MAAM,WAAW,6BAA6B,OAAO,QAAQ,MAAM;IACnE,MAAM,QAAQ,KAAK,OAAO,MAAM,UAAU,MAAM,WAAW,MAAM;IACjE,IAAI,UAAU,KAAA,GAEZ,OAAO;KACL,GAAG;KACH,GAAG,aAAa,QAAQ;KACxB,MAAM;KACN,eAAe;KACf,gBAAgB;IAClB;IAEF,MAAM,UAAU,MAAM,SAAS,MAAM;IACrC,OAAO;KACL,GAAG;KACH,GAAG,aAAa,QAAQ;KACxB,MAAM,MAAM;KACZ,eAAe,MAAM;KAErB,gBAAgB;KAChB,cAAc,MAAM,YAAY,MAAM;KACtC,iBAAiB,MAAM,aAAa,OAAO,OAAO,KAAA;KAElD,sBAAsB,KAAK,OAAO,yBAAyB,OAAO,OAAO,KAAA;KACzE,eAAe,MAAM,WAAW,OAAO,OAAO,KAAA;IAChD;GACF,CAAC;EACH;;EAGA,SAAS,aACP,UAC4B;GAC5B,OAAO;IACL,SAAS,SAAS;IAClB,OAAO,SAAS;IAChB,UAAU,SAAS;IACnB,WAAW,SAAS;IACpB,UAAU,SAAS;IACnB,YAAY,SAAS;IACrB,GAAI,SAAS,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM,SAAS,KAAK;GAC/D;EACF;EAEA,SAAgB,mBAAmB,KAAwB,UAAwD;GACjH,MAAM,gBAAA,GAAeC,MAAAA,OAAAA,CAAO,sBAAsB,CAAC,CAAC,CAAC;GACrD,MAAM,CAAC,cAAc,oBAAA,GAAmBC,MAAAA,SAAAA,CAAmC,CAAC,CAAC;GAC7E,MAAM,CAAC,gBAAgB,sBAAA,GAAqBA,MAAAA,SAAAA,CAA6C,CAAC,CAAC;GAC3F,MAAM,CAAC,kBAAkB,wBAAA,GAAuBA,MAAAA,SAAAA,CAAuC,KAAA,CAAS;GAChG,MAAM,CAAC,aAAa,mBAAA,GAAkBA,MAAAA,SAAAA,CAAwC,KAAA,CAAS;GACvF,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAiB,YAAY;GACzD,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAqB,UAAU;GACvD,MAAM,CAAC,sBAAsB,4BAAA,GAA2BA,MAAAA,SAAAA,CAAS,CAAC;GAClE,MAAM,CAAC,eAAe,qBAAA,GAAoBA,MAAAA,SAAAA,CAAyB,cAAc;GACjF,MAAM,CAAC,cAAc,yBAAA,GAAwBA,MAAAA,SAAAA,CAA8B,CAAC,CAAC;GAC7E,MAAM,mBAAA,GAAkBD,MAAAA,OAAAA,CAA4B,CAAC,CAAC;GACtD,MAAM,mBAAA,GAAkBE,MAAAA,YAAAA,EAAa,SAA8B;IACjE,gBAAgB,UAAU;IAC1B,qBAAqB,IAAI;GAC3B,GAAG,CAAC,CAAC;GACL,MAAM,CAAC,iBAAiB,uBAAA,GAAsBD,MAAAA,SAAAA,CAA+B,sBAAsB;GACnG,MAAM,CAAC,mBAAmB,yBAAA,GAAwBA,MAAAA,SAAAA,CAAoC,iCAAiC;GACvH,MAAM,CAAC,mBAAmB,8BAAA,GAA6BA,MAAAA,SAAAA,CAAiC,CAAC,CAAC;GAC1F,MAAM,wBAAA,GAAuBD,MAAAA,OAAAA,CAA+B,CAAC,CAAC;GAC9D,MAAM,6BAAA,GAA4BA,MAAAA,OAAAA,CAA+B,CAAC,CAAC;GACnE,MAAM,CAAC,0BAA0B,gCAAA,GAA+BC,MAAAA,SAAAA,CAAS,IAAI;GAC7E,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAS,KAAK;GAC5C,MAAM,CAAC,YAAY,kBAAA,GAAiBA,MAAAA,SAAAA,CAAS,KAAK;GAElD,MAAM,iBAAA,GAAgBD,MAAAA,OAAAA,CAAO,KAAK;GAClC,MAAM,CAAC,QAAQ,cAAA,GAAaC,MAAAA,SAAAA,CAAS,EAAE;GACvC,MAAM,CAAC,YAAY,kBAAA,GAAiBA,MAAAA,SAAAA,CAAyB,IAAI;GACjE,MAAM,aAAA,GAAYD,MAAAA,OAAAA,CAAe,YAAY;;;GAG7C,MAAM,sBAAA,GAAqBA,MAAAA,OAAAA,iBAAO,IAAI,IAAgB,CAAC;GACvD,MAAM,iBAAA,GAAgBE,MAAAA,YAAAA,EAAa,SAAiB;IAClD,UAAU,UAAU;IACpB,UAAU,IAAI;IACd,KAAK,MAAM,YAAY,mBAAmB,SAAS,SAAS;GAC9D,GAAG,CAAC,CAAC;GACL,MAAM,aAAA,GAAYA,MAAAA,YAAAA,OAAkB,UAAU,SAAS,CAAC,CAAC;GACzD,MAAM,mBAAA,GAAkBA,MAAAA,YAAAA,EAAa,aAAyB;IAC5D,mBAAmB,QAAQ,IAAI,QAAQ;IACvC,aAAa;KAAE,mBAAmB,QAAQ,OAAO,QAAQ;IAAE;GAC7D,GAAG,CAAC,CAAC;;;;GAIL,MAAM,qBAAA,GAAoBF,MAAAA,OAAAA,iBAAO,IAAI,IAAgB,CAAC;GACtD,MAAM,oBAAA,GAAmBA,MAAAA,OAAAA,CAAO,CAAC;GACjC,MAAM,oBAAA,GAAmBE,MAAAA,YAAAA,OAAkB,iBAAiB,SAAS,CAAC,CAAC;GACvE,MAAM,iBAAA,GAAgBA,MAAAA,YAAAA,OAAkB;IACtC,iBAAiB,WAAW;IAC5B,KAAK,MAAM,YAAY,kBAAkB,SAAS,SAAS;GAC7D,GAAG,CAAC,CAAC;GACL,MAAM,mBAAA,GAAkBA,MAAAA,YAAAA,EAAa,aAAyB;IAC5D,kBAAkB,QAAQ,IAAI,QAAQ;IACtC,aAAa;KAAE,kBAAkB,QAAQ,OAAO,QAAQ;IAAE;GAC5D,GAAG,CAAC,CAAC;;GAEL,MAAM,sBAAA,GAAqBF,MAAAA,OAAAA,CAA6B,sBAAsB;GAC9E,MAAM,wBAAA,GAAuBA,MAAAA,OAAAA,CAAkC,iCAAiC;GAChG,MAAM,qBAAA,GAAoBA,MAAAA,OAAAA,CAAO,CAAC;;GAElC,MAAM,yBAAA,GAAwBA,MAAAA,OAAAA,CAA2B,KAAA,CAAS;GAClE,MAAM,uBAAA,GAAsBE,MAAAA,YAAAA,EAAa,SAA+B;IACtE,mBAAmB,UAAU;IAC7B,mBAAmB,IAAI;GACzB,GAAG,CAAC,CAAC;;GAEL,MAAM,wBAAA,GAAuBA,MAAAA,YAAAA,EAAa,SAA+B;IACvE,MAAM,UAAU,UAAU;IAC1B,cAAc;KAAE,GAAG;KAAS,eAAe,qBAAqB,QAAQ,eAAe,MAAM,qBAAqB,OAAO;IAAE,CAAC;GAC9H,GAAG,CAAC,aAAa,CAAC;GAClB,MAAM,4BAAA,GAA2BA,MAAAA,YAAAA,EAAa,SAAoC;IAChF,qBAAqB,UAAU;IAC/B,qBAAqB,IAAI;GAC3B,GAAG,CAAC,CAAC;GACL,MAAM,eAAA,GAAcF,MAAAA,OAAAA,CAA2B,KAAA,CAAS;GACxD,MAAM,gBAAA,GAAeA,MAAAA,OAAAA,CAAO,sBAAsB,CAAC;GACnD,MAAM,sBAAA,GAAqBA,MAAAA,OAAAA,CAAO,sBAAsB,CAAC;GACzD,MAAM,cAAA,GAAaA,MAAAA,OAAAA,CAAO,CAAC;GAC3B,MAAM,gBAAA,GAAeA,MAAAA,OAAAA,CAAO,CAAC;GAC7B,MAAM,oBAAA,GAAmBA,MAAAA,OAAAA,CAA2B,KAAA,CAAS;;;GAG7D,MAAM,mBAAA,GAAkBA,MAAAA,OAAAA,CAAO,CAAC;GAChC,MAAM,wBAAA,GAAuBE,MAAAA,YAAAA,EAAa,SAAiC;IACzE,gBAAgB,WAAW;IAC3B,qBAAqB,UAAU;IAC/B,0BAA0B,IAAI;GAChC,GAAG,CAAC,CAAC;;;GAGL,MAAM,mBAAA,GAAkBF,MAAAA,OAAAA,CAA2B,KAAA,CAAS;GAC5D,MAAM,qBAAA,GAAoBE,MAAAA,YAAAA,EAAiB,UAAkB,SAAuC,mBAAmB,QAAQ,QAAQ,YAAY;IACjJ,IAAI,UAAU,QAAQ,mBAAmB,YAAY,gBAAgB,YAAY,UAAU,MAAM,IAAI,MAAM,sBAAsB;IACjI,OAAO,KAAK;GACd,CAAC,GAAG,CAAC,CAAC;;GAEN,MAAM,qBAAA,GAAoBF,MAAAA,OAAAA,CAA0C,KAAA,CAAS;GAC7E,IAAI,kBAAkB,YAAY,KAAA,GAAW,kBAAkB,UAAU,4BAA4B;;GAErG,MAAM,kBAAA,GAAiBA,MAAAA,OAAAA,OAAyB,CAAC,CAAC;;GAElD,MAAM,wBAAA,GAAuBA,MAAAA,OAAAA,CAA2B,KAAA,CAAS;GACjE,MAAM,gCAAA,GAA+BA,MAAAA,OAAAA,CAA2B,KAAA,CAAS;;;GAGzE,MAAM,iBAAA,GAAgBA,MAAAA,OAAAA,iBAAoB,IAAI,IAAI,CAAC;GACnD,MAAM,oBAAA,GAAmBA,MAAAA,OAAAA,CAAuB,cAAc;GAE9D,MAAM,cAAA,GAAaE,MAAAA,YAAAA,EAAa,MAAsB,YAAoB;IACxE,UAAU,OAAO;IACjB,cAAc,IAAI;GACpB,GAAG,CAAC,CAAC;;;GAIL,MAAM,cAAA,GAAaA,MAAAA,YAAAA,CAAY,OAAO,UAAU,UAAyB;IACvE,MAAM,MAAM,UAAU,MAAM,WAAW,UAAU,EAAE,SAAS,KAAK,CAAC,IAAI,MAAM,WAAW,QAAQ;IAC/F,IAAI,IAAI,IAAI,gBAAgB,IAAI,MAAM,gBAAgB,CAAC,CAAC;GAC1D,GAAG,CAAC,CAAC;;GAGL,MAAM,yBAAA,GAAwBF,MAAAA,OAAAA,iBAAO,IAAI,IAAY,CAAC;GACtD,MAAM,wBAAA,GAAuBE,MAAAA,YAAAA,EAAa,UAAkB,UAAwB;IAClF,IAAI,SAAS,WAAW,KAAK,MAAM,WAAW,GAAG;IACjD,MAAM,MAAM,iBAAiB,UAAU,KAAK;IAC5C,IAAI,sBAAsB,QAAQ,IAAI,GAAG,GAAG;IAC5C,sBAAsB,QAAQ,IAAI,GAAG;IACrC,CAAM,YAAY;KAChB,MAAM,MAAM,MAAM,WAAW,kBAAkB;MAAE;MAAU;KAAM,CAAC;KAElE,IAAI,CAAC,IAAI,IAAI;KACb,mBAAmB,cAAc;MAAE,GAAG;OAAW,MAAM,IAAI,MAAM;KAAU,EAAE;IAC/E,EAAA,CAAG;GACL,GAAG,CAAC,CAAC;GAEL,MAAM,aAAA,GAAYA,MAAAA,YAAAA,EAAa,KAAuC,cAA8B;IAClG,wBAAwB,IAAI,MAAM,OAAO,IAAI,yBAAyB,WAAW,IAAI,uBAAuB,CAAC;IAC7G,gBAAgB,IAAI,KAAK,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACpD,oBAAoB,IAAI,KAAK,IAAI,mBAAmB,KAAA,CAAS;IAC7D,eAAe,IAAI,KAAK,IAAI,cAAc,KAAA,CAAS;IACnD,MAAM,OAAO,kBAAkB,eAAe,GAAG,GAAG,IAAI,KAAK,IAAI,eAAe,KAAA,CAAS;IACzF,IAAI,cAAc,aAAa,SAAS;KACtC,MAAM,UAAU,UAAU;KAC1B,OAAO,OAAO,MAAM;MAAE,cAAc,QAAQ;MAAc,gBAAgB,QAAQ;MAAgB,cAAc,QAAQ;MAAc,YAAY,QAAQ;KAAW,CAAC;IACxK;IAIA,qBAAqB,UAAU,KAAA;IAC/B,IAAI,IAAI,MAAM,KAAK,kBAAkB,OAAO,IAAI,WAAW,UAAU,KAAK,GAAG;KAC3E,qBAAqB,UAAU,IAAI,UAAW;KAC9C,KAAK,gBAAgB,qBAAqB;IAC5C;IAEA,6BAA6B,UAAU,KAAA;IACvC,IAAI,IAAI,MAAM,KAAK,0BAA0B,OAAO,IAAI,WAAW,UAAU,KAAK,GAAG;KACnF,6BAA6B,UAAU,IAAI,UAAW;KACtD,KAAK,wBAAwB,6BAA6B;IAC5D;IACA,cAAc,IAAI;IAClB,iBAAiB,iBAAiB,IAAI,CAAC;IACvC,gBAAgB,KAAK,aAAa;IAGlC,IAAI,IAAI,MAAM,YAAY,YAAY,KAAA,GAAW,YAAY,UAAU,IAAI,MAAM;IACjF,OAAO;GACT,GAAG,CAAC,CAAC;GAEL,MAAM,QAAA,GAAOA,MAAAA,YAAAA,CAAY,OAAO,YAAwE;IAEtG,MAAM,MAAM,EAAE,WAAW;IACzB,MAAM,YAAY,aAAa;IAC/B,MAAM,eAAe,gBAAgB;IACrC,MAAM,aAAa,gBAAgB,YAAY,UAAU,QAAQ;IACjE,MAAM,eAAe,UAAU,QAAQ,cAAc,OAAO,YAAY;IAExE,MAAM,kBAAkB,SAAS,kBAAkB,cAAc,CAAC,UAAU,cAAc,gBAAgB,QAAQ,OAAO,YAAY,CAAC,IAAI,eAAe,KAAA;IACzJ,MAAM,kBAAkB,cAAc,CAAC,UAAU,qBAAqB,SAAS,0BAA0B,OAAO;IAChH,MAAM,YAAY,IAAI,iBAAiB;IAEvC,IAAI,CAAC,SAAS,QAAQ,WAAW,IAAI;IACrC,IAAI;KAMF,IAAI,cAAc,sBAAsB,SAAS;MAC/C,sBAAsB,UAAU;MAChC,oBAAoB,yBAAyB,mBAAmB,SAAS,EAAE,kBAAkB,OAAO,CAAC;MACrG,cAAc;OAAE,GAAG,UAAU;OAAS,eAAe,UAAU,QAAQ,cAAc,QAAQ,WAAW,oBAAoB,MAAM,MAAM,KAAA,CAAS;MAAE,CAAC;KACtJ;KACA,MAAM,sBAAsB,mBAAmB;KAC/C,MAAM,iBAAiB,qBAAqB;KAC5C,MAAM,OAAO,MAAM,WAAW,aAAa,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,CAAC;KACvF,IAAI,QAAQ,WAAW,WAAW,cAAc,IAAI,iBAAiB,GAAG,OAAO;KAE/E,IAAI,gBAAgB,YAAY,cAAc,OAAO,UAAU;KAC/D,IAAI,CAAC,KAAK,IAAI;MACZ,WAAW,SAAS,aAAa,KAAK,WAAW,wBAAwB;MACzE,OAAO;KACT;KAEA,MAAM,YAAY,MAAM,WAAW,oBAAoB;KACvD,IAAI,QAAQ,WAAW,WAAW,cAAc,IAAI,iBAAiB,GAAG,OAAO;KAC/E,IAAI,gBAAgB,YAAY,gBAAgB,mBAAmB,YAAY,qBAAqB,OAAO,UAAU;KACrH,IAAI,KAAK,SAAS,KAAA,GAAW,QAAQ,KAAK,KAAK,IAAI;KAInD,MAAM,MAAM,mBAAmB,IAAI;KACnC,UAAU,KAAK,SAAS;KACxB,IAAI,cAAc,aAAa,SAAS,iBAAiB,UAAU;KAEnE,IAAI,KAAK,MAAM,KAAK,cAAc,KAAA,GAAW;MAC3C,MAAM,IAAI,KAAK,UAAU;MACzB,cAAc,UAAU,IAAI,IAAI,OAAO,KAAK,CAAC,CAAC;MAC9C,MAAM,aAAa,wBAAwB,CAAC;MAC5C,IAAI,OAAO,KAAK,UAAU,CAAC,CAAC,SAAS,GAAG;OACtC,MAAM,OAAO;QAAE,GAAG,UAAU;QAAS,GAAG;OAAW;OACnD,cAAc,IAAI;OAClB,iBAAiB,iBAAiB,IAAI,CAAC;MACzC;KACF;KAEA,IAAI,KAAK,MAAM,KAAK,iBAAiB,KAAA,GAAW;MAC9C,oBAAoB,iBAAiB,KAAK,cAAc,EAAE,kBAAkB,SAAS,mBAAmB,OAAO,CAAC;MAEhH,MAAM,UAAU,IAAI,IAAI,KAAK,aAAa,MAAM,KAAK,SAAS,KAAK,MAAM,CAAC;MAC1E,MAAM,WAAW,yBAAyB,mBAAmB,OAAO,CAAC,CAAC,QAAQ,UAAU,CAAC,QAAQ,IAAI,MAAM,MAAM,CAAC;MAClH,IAAI,SAAS,SAAS,GACpB,WAAW,SAAS,KAAK,SAAS,OAAO,sBAAsB,SAAS,KAAK,UAAU,MAAM,WAAW,CAAC,CAAC,KAAK,GAAG,EAAE,mBAAmB;KAE3I;KAEA,MAAM,cAAc,UAAU,KAAK,UAAU,QAAQ,KAAA;KAErD,IAAI,qBAAqB,YAAY,gBAAgB,yBAAyB,aAAa,WAAW,KAAA,IAClG;MAAE,GAAG;MAAmC,OAAO,YAAY,UAAU,KAAK,aAAa,UAAU,WAAW;KAAgC,IAC5I;MACA,QAAQ,YAAY;MACpB,UAAU,YAAY,YAAY;MAClC,QAAQ,YAAY,WAAW;MAC/B,GAAI,YAAY,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,OAAO,YAAY,MAAM;KACxE,CAAC;KAEH,IAAI,KAAK,MAAM,KAAK,cAAc,KAAA,GAAW;MAC3C,0BAA0B,UAAU,KAAK,UAAU;MACnD,IAAI,CAAC,iBAAiB;OACpB,qBAAqB,UAAU,KAAK,UAAU;OAC9C,0BAA0B,KAAK,UAAU,SAAS;MACpD;MACA,4BAA4B,KAAK,UAAU,YAAY,KAAK;KAC9D;KAGA,IAAI,KAAK,MAAM,KAAK,kBAAkB,KAAA,KACjC,MAAM,QAAQ,KAAK,cAAc,aAAa,KAAK,KAAK,cAAc,cAAc,SAAS,GAAG;MAGnG,MAAM,kCAAkB,IAAI,IAAI,CAAC,gBAAgB,uBAAuB,CAAC;MAIzE,MAAM,SAAS,qBAHK,KAAK,cAAc,cAAc,QAAQ,WAAW,CAAC,gBAAgB,IAAI,OAAO,EAAE,CAGxD,CAAC,CAAC,IAAI,sBAAsB,CAAC,CAAC,IAAI,eAAe,GAAG,mBAAmB,SAAS,qBAAqB,OAAO;MAC1J,MAAM,OAAO;OAAE,GAAG,UAAU;OAAS,eAAe;MAAO;MAC3D,cAAc,IAAI;MAClB,gBAAgB,MAAM;KACxB;KACA,IAAI,oBAAoB,KAAA,GAAW;MACjC,MAAM,YAAY,IAAI,IAAI,UAAU,QAAQ,cAAc,KAAK,WAAW,CAAC,OAAO,IAAI,OAAO,YAAY,CAAC,CAAC;MAC3G,MAAM,WAAW,CAAC,GAAG,gBAAgB,KAAK,WAAW,uBAAuB;OAAE,GAAG;OAAQ,cAAc,UAAU,IAAI,OAAO,EAAE;MAAE,CAAC,CAAC,GAAG,GAAG,UAAU,QAAQ,cAAc,QAAQ,WAAW,CAAC,aAAa,MAAM,CAAC,CAAC;MACjN,cAAc;OAAE,GAAG,UAAU;OAAS,eAAe;MAAS,CAAC;MAE/D,IAAI,SAAS,kBAAkB,KAAA,GAAW,gBAAgB,QAAQ;KACpE;KAEA,gBAAgB,UAAU,UAAU,QAAQ;KAC5C,iBAAiB,UAAU,iBAAiB,UAAU,OAAO;KAC7D,UAAU,EAAE;KAGZ,eAAe,QAAQ;KACvB,OAAO,UAAU;IACnB,SAAS,OAAO;KACd,IAAI,QAAQ,WAAW,WAAW,cAAc,IAAI,iBAAiB,KAAK,gBAAgB,YAAY,cAAc,WAAW,SAAS,UAAU,aAAa,KAAK,CAAC;KACrK,OAAO;IACT,UAAU;KACR,IAAI,QAAQ,WAAW,WAAW,CAAC,SAAS,QAAQ,WAAW,KAAK;IACtE;GACF,GAAG;IAAC;IAAK;IAAW;IAA0B;IAAqB;IAAU;GAAU,CAAC;GAGxF,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,WAAgB;GAClB,GAAG,CAAC,UAAU,CAAC;GAMf,CAAA,GAAA,MAAA,UAAA,OAAgB,IAAI,6BAA6B;IAAE,KAAU;GAAE,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;GAI9E,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,sBAAsB,QAAQ,MAAM;IACpC,MAAM,UAAU,UAAU;IAE1B,MAAM,mBADO,IAAI,aAAa,SACF,CAAC,CAAC;IAC9B,MAAM,SAAuD;KAC3D;MAAE,UAAU,kBAAkB;MAAU,OAAO,kBAAkB;KAAM;KACvE;MAAE,UAAU,QAAQ;MAAe,OAAO,QAAQ;KAAU;KAC5D;MAAE,UAAU,QAAQ;MAAuB,OAAO,QAAQ;KAAkB;KAC5E;MAAE,UAAU,kBAAkB;MAAU,OAAO,kBAAkB;KAAM;IACzE;IACA,KAAK,MAAM,SAAS,QAClB,IAAI,MAAM,aAAa,KAAA,KAAa,MAAM,UAAU,KAAA,GAClD,qBAAqB,MAAM,UAAU,MAAM,KAAK;GAGtD,GAAG;IAAC;IAAK;IAAsB,kBAAkB;IAAO,kBAAkB;IAAU;GAAY,CAAC;GAEjG,MAAM,mBAAA,GAAkBA,MAAAA,YAAAA,CAAY,YAAY;IAC9C,IAAI;KACF,MAAM,SAAS,OAAO;KACtB,MAAM,WAAW,MAAM,aAAa,SAAS,KAAK;KAClD,IAAI,SAAS,aAAa,KAAA,GAAW,YAAY,UAAU,SAAS;IACtE,QAAQ,CAER;GACF,GAAG,CAAC,QAAQ,CAAC;GAEb,MAAM,SAAA,GAAQA,MAAAA,YAAAA,EAAa,YAA6B;IACtD,gBAAgB,WAAW;IAC3B,IAAI,OAAO;KAAE,GAAG,UAAU;KAAS,GAAG;IAAQ;IAE9C,IAAI,MAAM,QAAQ,QAAQ,aAAa,GAAG;KACxC,IAAI,OAAO,mBAAmB;KAC9B,KAAK,MAAM,UAAU,QAAQ,eAAe;MAC1C,MAAM,SAAS,oBAAoB,MAAM;MACzC,IAAI,WAAW,KAAA,KAAa,OAAO,OAAO,SAAS,UAAU;MAC7D,MAAM,QAAQ,KAAK,OAAO,MAAM,UAAU,MAAM,WAAW,MAAM;MACjE,IAAI,UAAU,KAAA,KAAa,MAAM,YAAY,OAAO,MAAM;MAC1D,OAAO,gBAAgB,MAAM,QAAQ,OAAO,IAAI;KAClD;KACA,IAAI,SAAS,mBAAmB,SAAS,oBAAoB,IAAI;KAEjE,OAAO;MAAE,GAAG;MAAM,eAAe,qBAAqB,KAAK,eAAe,mBAAmB,SAAS,qBAAqB,OAAO;KAAE;IACtI;IAKA,IAAI,MAAM,QAAQ,KAAK,aAAa,GAAG;KACrC,MAAM,kBAAkB,WAAuC,OAAO,YAAY,SAAS,OAAO,QAAQ,aAAa;KAEvH,IADwB,KAAK,cAAc,KAAK,cAC9B,GAAG;MACnB,MAAM,OAAO,KAAK,cAAc,UAAU,cAAc;MACxD,OAAO;OACL,GAAG;OACH,eAAe,KAAK,cAAc,KAAK,QAAQ,UAC7C,UAAU,QAAQ,OAAO,YAAY,QACjC,SACA;QAAE,GAAG;QAAQ,QAAQ;SAAE,GAAG,OAAO;SAAQ,UAAU;QAAM;OAAE,CAAC;MACpE;KACF;IACF;IACA,cAAc,IAAI;GACpB,GAAG,CAAC,eAAe,mBAAmB,CAAC;GAEvC,MAAM,eAAA,GAAcA,MAAAA,YAAAA,EAAa,KAA2B,WAA+B,SAAqB,YAAwD;IACtK,UAAU,IAAI;IACd,OAAO,aAAa,QAAQ,QAAQ,YAAY;KAC9C,IAAI;MACF,MAAM,SAAS,OAAO,KAAK,YAAY,OAAO;MAC9C,YAAY,UAAU,SAAS,MAAM,YAAY,CAAC,CAAC;MACnD,QAAQ;MACR,IAAI,WAAW,WAAW,MAAM,SAAS;MACzC,OAAO;KACT,SAAS,OAAO;MAId,MAAM,UAAU,aAAa,KAAK;MAClC,IAAI,+CAA+C,KAAK,OAAO,GAC7D,IAAI;OACF,MAAM,SAAS,OAAO,GAAG;OACzB,YAAY,UAAU,SAAS,MAAM,YAAY,CAAC,CAAC;OACnD,QAAQ;OACR,IAAI,WAAW,WAAW,MAAM,SAAS;OACzC,OAAO;MACT,SAAS,YAAY;OACnB,MAAM,gBAAgB;OACtB,WAAW,SAAS,UAAU,aAAa,UAAU,IAAI,eAAe;MAC1E;WACK;OACL,MAAM,gBAAgB;OACtB,WAAW,SAAS,UAAU,UAAU,eAAe;MACzD;MACA,OAAO;KACT,UAAU;MACR,UAAU,KAAK;KACjB;IACF,CAAC;GACH,GAAG;IAAC;IAAiB;IAAU;GAAU,CAAC;;GAG1C,MAAM,mBAAA,GAAkBA,MAAAA,YAAAA,EAAa,YAA2C;IAC9E,MAAM,gBAAgB,iBAAiB,UAAU,OAAO;IACxD,OAAO,YACL;KACE;MAAE,IAAI;MAAO,MAAM,CAAC,aAAa;MAAG,OAAO,UAAU,QAAQ;KAAY;KACzE;MAAE,IAAI;MAAO,MAAM,CAAC,cAAc;MAAG,OAAO,UAAU,QAAQ;KAAa;KAC3E;MAAE,IAAI;MAAO,MAAM,CAAC,aAAa;MAAG,OAAO,UAAU,QAAQ;KAAY;IAC3E,GACA,KAAA,SACM;KACJ,iBAAiB,aAAa;KAC9B,UAAU;IACZ,CACF;GACF,GAAG,CAAC,WAAW,CAAC;;;;GAKhB,MAAM,yBAAA,GAAwBA,MAAAA,YAAAA,CAAY,YAAY;IACpD,MAAM,IAAI,UAAU;IACpB,MAAM,gBAAgB,iBAAiB,CAAC;IACxC,MAAM,eAAe,gBAAgB;IAErC,MAAM,mBAAmB,CAAC,mBAAmB,EAAE,eAAe,YAAY,KACrE,CAAC,uBAAuB,EAAE,aAAa;IAC5C,MAAM,oBAAoB,qBAAqB;IAC/C,MAAM,4BAA4B,6BAA6B;IAC/D,MAAM,mBAAmB,QAAQ,QAAQ,YAAY;KAEnD,IAAI,gBAAgB,YAAY,KAAA,KAAa,gBAAgB,YAAY,UAAU,QAAQ,gBAAgB;MACzG,WAAW,SAAS,sBAAsB;MAC1C;KACF;KACA,IAAI,CAAC,qBAAqB,GAAG,UAAU,OAAO,GAAG;MAC/C,WAAW,SAAS,gBAAgB;MACpC;KACF;KACA,MAAM,YAAY,oBAAoB,GAAG;MACvC,YAAY,cAAc;MAC1B,UAAU,iBAAiB;MAC3B;MACA;KACF,CAAC;KACD,MAAM,MAAM,MAAM,WAAW,kBAAkB;MAAE;MAAW,kBAAkB,EAAE;KAAe,CAAC;KAChG,IAAI,CAAC,qBAAqB,GAAG,UAAU,OAAO,GAAG;KACjD,IAAI,IAAI,IAAI;MACV,sBAAsB,cAAc,SAAS,SAAS;MACtD,iBAAiB,UAAU;MAE3B,iBAAiB,aAAa;MAC9B,MAAM,kBAAkB,iBAAiB,UAAU,OAAO;MAE1D,IAAI,4BACF,cACA,gBAAgB,SAChB,oBAAoB,2BAA2B,iBAAiB,aAAa,CAC/E,GAEE,MAAM,KAAK,EAAE,QAAQ,KAAK,CAAC;KAE/B,OACE,WAAW,SAAS,aAAa,IAAI,WAAW,8BAA8B;IAElF,CAAC;GACH,GAAG;IAAC;IAAM;IAAc;GAAU,CAAC;;;;;GAMnC,MAAM,2BAAA,GAA0BA,MAAAA,YAAAA,CAAY,OAAO,YAAkD;IACnG,MAAM,OAAO,mBAAmB;IAChC,MAAM,UAAU,yBAAyB,IAAI,CAAC,CAAC,QAAQ,UAAU,YAAY,KAAA,KAAa,QAAQ,SAAS,MAAM,MAAM,CAAC;IACxH,IAAI,QAAQ,WAAW,GAAG,OAAO;IACjC,MAAM,UAAU,0BAA0B,IAAI,CAAC,CAC5C,QAAQ,UAAU,YAAY,KAAA,KAAa,QAAQ,SAAS,MAAM,MAAM,CAAC;IAC5E,MAAM,YAAY,IAAI,iBAAiB;IACvC,MAAM,kBAA2B,wBAAwB,mBAAmB,SAAS,KAAK,GAAG,KACxF,mBAAmB,QAAQ,cAAc,KAAK,aAC9C,cAAc,IAAI,iBAAiB,KAAK,cAAc,sBAAsB;IACjF,IAAI,CAAC,UAAU,GAAG,OAAO;IACzB,MAAM,WAAW,IAAI,IAAI,QAAQ,SAAS,UAAU;KAClD,MAAM,UAAU,uBAAuB,mBAAmB,SAAS,MAAM,QAAQ,SAAS;KAC1F,OAAO,YAAY,KAAA,IAAY,CAAC,IAAI,CAAC,CAAC,MAAM,QAAQ,OAAO,CAAU;IACvE,CAAC,CAAC;IACF,KAAK,MAAM,UAAU,SAAS,KAAK,GAAG;KACpC,MAAM,SAAS,gBAAgB,mBAAmB,SAAS,QAAQ,IAAI;KACvE,oBAAoB,MAAM;KAC1B,qBAAqB,MAAM;IAC7B;IACA,MAAM,UAAoC,QAAQ,QAAQ,UAAU,CAAC,SAAS,IAAI,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,WAAW;KAC/G,QAAQ,MAAM;KAAQ,IAAI;KAAO,SAAS,MAAM,SAAS,MAAM,WAAW;IAC5E,EAAE;IACF,KAAK,MAAM,CAAC,QAAQ,YAAY,UAAU;KAExC,IAAI,CAAC,UAAU,GAAG,OAAO;KACzB,MAAM,UAAU,mBAAmB,QAAQ,OAAO,MAAM,UAAU,MAAM,WAAW,MAAM;KACzF,IAAI,SAAS,WAAW,QAAQ,QAAQ,aAAa,QAAQ,oBAAoB,QAAQ,cAAc,QAAQ,WAAW;MACxH,QAAQ,KAAK;OAAE;OAAQ,IAAI;OAAO,SAAS;MAAqB,CAAC;MACjE;KACF;KACA,MAAM,MAAM,MAAM,WAAW,cAAc,OAAO;KAClD,IAAI,CAAC,UAAU,GAAG,OAAO;KACzB,MAAM,SAAS,mBAAmB,QAAQ,OAAO,MAAM,UAAU,MAAM,WAAW,MAAM;KACxF,IAAI,QAAQ,WAAW,QAAQ,OAAO,aAAa,QAAQ,oBAAoB,OAAO,cAAc,QAAQ,WAAW;MACrH,QAAQ,KAAK;OAAE;OAAQ,IAAI;OAAO,SAAS;MAAoB,CAAC;MAChE;KACF;KACA,MAAM,SAAiC,IAAI,MAAM,OAAO,IAAI,MAAM,aAAa,WAC3E;MAAE;MAAQ,IAAI;MAAM,UAAU,IAAI,MAAM;KAAS,IACjD;MAAE;MAAQ,IAAI;MAAO,SAAS,IAAI,KAAK,eAAe,IAAI,WAAW;MAAQ,UAAU,CAAC,IAAI,MAAM,0BAA0B,IAAI,IAAI;KAAE;KAC1I,QAAQ,KAAK,MAAM;KAEnB,MAAM,UAAU,kBAAkB,mBAAmB,SAAS,CAAC,MAAM,GAAG,QAAQ;KAChF,oBAAoB,OAAO;KAC3B,qBAAqB,OAAO;IAC9B;IACA,MAAM,WAAW,QAAQ,QAAQ,WAAW,CAAC,OAAO,EAAE;IACtD,IAAI,SAAS,SAAS,GAAG;KACvB,MAAM,SAAS,WAA2B,mBAAmB,QAAQ,OAAO,MAAM,UAAU,MAAM,WAAW,MAAM,CAAC,EAAE,eAAe;KACrI,WAAW,SAAS,YAAY,SAAS,OAAO,GAAG,QAAQ,OAAO,IAAI,SAAS,KAAK,YAAY,GAAG,MAAM,QAAQ,MAAM,EAAE,GAAG,QAAQ,WAAW,QAAQ,CAAC,CAAC,KAAK,GAAG,GAAG;KACpK,OAAO;IACT;IACA,WAAW,MAAM,WAAW,QAAQ,OAAO,GAAG;IAC9C,OAAO;GACT,GAAG;IAAC;IAAK;IAAqB;IAAY;GAAoB,CAAC;;;;;GAM/D,MAAM,4BAAA,GAA2BA,MAAAA,YAAAA,EAAa,WAAqD,aAAa,QAAQ,QAAQ,YAAY;IAC1I,MAAM,UAAU,qBAAqB;IACrC,IAAI,QAAQ,UAAU,KAAA,GAAW;KAC/B,WAAW,SAAS,WAAW,QAAQ,OAAO;KAC9C,OAAO;IACT;IACA,MAAM,MAAM,MAAM,WAAW,sBAAsB;KACjD;KACA,kBAAkB,QAAQ;IAC5B,CAAC;IACD,IAAI,qBAAqB,YAAY,SAAS,OAAO;IACrD,IAAI,CAAC,IAAI,MAAM,IAAI,MAAM,WAAW,KAAA,KAAa,IAAI,MAAM,UAAU,KAAA,GAAW;KAC9E,WAAW,SAAS,eAAe,IAAI,KAAK,IAAI,MAAM,SAAS,aAAa,IAAI,WAAW,8BAA8B;KACzH,OAAO;IACT;IACA,yBAAyB;KAAE,QAAQ,IAAI,MAAM;KAAQ,UAAU,IAAI,MAAM;KAAU,QAAQ,IAAI,MAAM;IAAO,CAAC;IAC7G,qBAAqB,mBAAmB,OAAO;IAC/C,WAAW,MAAM,6BAA6B;IAC9C,OAAO;GACT,CAAC,GAAG;IAAC;IAA0B;IAAY;GAAoB,CAAC;GAEhE,MAAM,2BAAA,GAA0BA,MAAAA,YAAAA,EAAa,QAAgB,aAC3D,yBAAyB,8BAA8B,QAAQ,QAAQ,CAAC,GACvE,CAAC,wBAAwB,CAAC;GAC7B,MAAM,+BAAA,GAA8BA,MAAAA,YAAAA,EAAa,YAC/C,yBAAyB,EAAE,QAAQ,CAAC,GACnC,CAAC,wBAAwB,CAAC;;GAG7B,MAAM,yBAAA,GAAwBA,MAAAA,YAAAA,CAAY,OAAO,WAAkC;IACjF,MAAM,YAAY,IAAI,iBAAiB;IACvC,MAAM,OAAO,mBAAmB;IAChC,MAAM,QAAQ,KAAK,OAAO,MAAM,UAAU,MAAM,WAAW,MAAM;IACjE,IAAI,KAAK,cAAc,QAAQ,OAAO,cAAc,KAAK,aAAa,cAAc,sBAAsB,SAAS;IACnH,MAAM,MAAM,MAAM,WAAW,iBAAiB,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1F,IAAI,cAAc,IAAI,iBAAiB,KAAK,CAAC,wBAAwB,mBAAmB,SAAS,KAAK,GAAG,KACpG,mBAAmB,QAAQ,cAAc,KAAK,WAAW;IAC9D,IAAI,mBAAmB,QAAQ,OAAO,MAAM,UAAU,MAAM,WAAW,MAAM,MAAM,OAAO;KACxF,WAAW,SAAS,0BAA0B;KAC9C;IACF;IACA,IAAI,CAAC,IAAI,MAAM,IAAI,MAAM,iBAAiB,KAAA,GAAW;KACnD,WAAW,SAAS,cAAc,IAAI,KAAK,cAAc,IAAI,WAAW,+BAA+B;KACvG;IACF;IACA,IAAI,IAAI,MAAM,aAAa,QAAQ,cAAc,KAAK,WAAW;KAC/D,WAAW,SAAS,6BAA6B;KACjD;IACF;IACA,MAAM,OAAO,IAAI,MAAM,aAAa,MAAM,MAAM,UAAU,MAAM,WAAW,MAAM;IACjF,IAAI,SAAS,KAAA,GAAW;KACtB,WAAW,SAAS,6BAA6B;KACjD;IACF;IACA,MAAM,QAAQ,uBAAuB,mBAAmB,SAAS,IAAI;IACrE,oBAAoB,KAAK;IACzB,qBAAqB,KAAK;IAC1B,WAAW,MAAM,aAAa,KAAK,aAAa;GAClD,GAAG;IAAC;IAAK;IAAqB;IAAY;GAAoB,CAAC;;;;GAK/D,MAAM,kBAAA,GAAiBA,MAAAA,YAAAA,EAAa,SAA8B,YAAuG;IACvK,MAAM,mBAAmB,UAAU,QAAQ;IAC3C,MAAM,iBAAiB,QAAQ,OAAO,cAAc;IACpD,MAAM,eAAe,gBAAgB;IACrC,MAAM,oBAAoB,cAAc,iBAAiB,UAAU,OAAO,GAAG,aAAa;IAG1F,MAAM,sBAAsB,uBAAuB,OAAO;IAC1D,OAAO,mBAAmB,QAAQ,QAAQ,YAAY;KAEpD,IAAI,gBAAgB,YAAY,KAAA,KAAa,gBAAgB,YAAY,UAAU,QAAQ,gBAAgB;MACzG,WAAW,SAAS,sBAAsB;MAC1C,OAAO;KACT;KACA,IAAI,qBAAqB,UAAU,QAAQ,gBAAgB;MACzD,WAAW,SAAS,iBAAiB;MACrC,OAAO;KACT;KAEA,IAAI,eAAe,SAAS,GAAG;MAK7B,MAAM,MAAM,MAAM,WAAW,gBAAgB;OAAE,UAJ9B,eAAe,KAAK,YAAY;QAC/C,OAAO;QACP,SAAS,OAAO,QAAQ;OAC1B,EAC+C;OAAU;MAAiB,CAAC;MAC3E,IAAI,qBAAqB,UAAU,QAAQ,gBAAgB,OAAO;MAClE,IAAI,CAAC,IAAI,IAAI;OACX,WAAW,SAAS,qBAAqB,IAAI,WAAW,8BAA8B;OACtF,OAAO;MACT;KACF;KAGA,MAAM,oBAAoB,SAAS,wBAAwB,SAAS,MAAM,wBAAwB;KAClG,IAAI,qBAAqB,UAAU,QAAQ,gBAAgB,OAAO;KAIlE,IAAI,QAAQ,WAAW,KAAK,aAAa,WAAW,GAAG,OAAO;KAC9D,MAAM,MAAM,MAAM,WAAW,kBAAkB;MAC7C;MAEA,eAAe,QAAQ,OAAO,YAAY,CAAC,CAAC,IAAI,uBAAuB,CAAC,CAAC,IAAI,gBAAgB;MAC7F,GAAI,SAAS,YAAY,QAAQ,EAAE,SAAS,MAAM,IAAI,CAAC;KACzD,CAAC;KACD,IAAI,qBAAqB,UAAU,QAAQ,gBAAgB,OAAO;KAClE,IAAI,IAAI,IAAI;MACV,gBAAgB,OAAO;MACvB,IAAI,qBAAqB,SAAS,WAAW,SAAS,CAAC,uBAAuB,4BAC5E,cACA,gBAAgB,SAChB,qBAAqB,CAAC,mBAAmB,UAAU,QAAQ,eAAe,OAAO,CACnF,GACE,MAAM,KAAK;OAAE,QAAQ;OAAM,eAAe,QAAQ,OAAO,YAAY;MAAE,CAAC;MAE1E,OAAO;KACT,OAAO;MACL,WAAW,SAAS,gBAAgB,IAAI,WAAW,8BAA8B;MACjF,OAAO;KACT;IACF,CAAC;GACH,GAAG;IAAC;IAAK;IAAM;IAAyB;IAAc;IAAe;GAAU,CAAC;;GAGhF,MAAM,yBAAA,GAAwBA,MAAAA,YAAAA,CAAY,OAAO,MAA+B,oBAAgD;IAE9H,IAAI,gBAAgB,YAAY,KAAA,KAAa,gBAAgB,YAAY,UAAU,QAAQ,gBAAgB;KACzG,WAAW,SAAS,sBAAsB;KAC1C,OAAO;IACT;IACA,MAAM,mBAAmB,UAAU,QAAQ;IAE3C,MAAM,UAAU,OAAO,YACrB,OAAO,QAAQ,QAAQ,qBAAqB,OAAO,CAAC,CAAC,QAAQ,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,SAAS,CAAC,CAC9F;IACA,MAAM,MAAM,MAAM,WAAW,mBAAmB;KAC9C;KACA,WAAW;KAEX,SAAS,mBAAmB;IAC9B,CAAC;IACD,IAAI,CAAC,IAAI,IAAI;KACX,WAAW,SAAS,YAAY,IAAI,WAAW,QAAQ;KACvD,OAAO;IACT;IACA,IAAI,qBAAqB,UAAU,QAAQ,gBAAgB,0BAA0B,UAAU;IAC/F,OAAO,qBAAqB,UAAU,QAAQ;GAChD,GAAG,CAAC,0BAA0B,UAAU,CAAC;GAEzC,MAAM,UAAA,GAASA,MAAAA,YAAAA,EAAa,QAAmB;IAC7C,MAAM,GAAG,MAAM,CAAC,UAAU,QAAQ,KAAK,CAAC;IACxC,IAAI,kBAAkB,IAAI,GAAG,GAAG,sBAA2B;SAGtD,IAAI,QAAQ,eAAe,sBAA2B;KAAE,KAAU,EAAE,QAAQ,KAAK,CAAC;IAAE,CAAC;SACrF,gBAAqB;GAC5B,GAAG;IAAC;IAAO;IAAuB;IAAiB;GAAI,CAAC;;;;;;;;;GAUxD,MAAM,uBAAA,GAAsBA,MAAAA,YAAAA,CAAY,OAAO,IAAY,eAAwB,WAAmC;IACpH,IAAI,UAAU,QAAQ,mBAAmB,IAAI;IAC7C,IAAI,mBAAmB,cAAc,UAAU,QAAQ,cAAc,GAAG;KACtE,WAAW,SAAS,6CAA6C;KACjE;IACF;IACA,MAAM,mBAAmB,QAAQ,QAAQ,YAAY,CAAC,CAAC;IAKvD,IADqB,mBAAmB,UAAU,QAAQ,eAAe,gBAAgB,OAC1E,GAKT;SAAA,CAAC,MADoB,eAAe,UAAU,QAAQ,eAAe;MAAE,QAAQ;MAAO,SAAS;MAAO,qBAAqB;KAAM,CAAC,GACrH;MACf,WAAW,SAAS,uBAAuB;MAC3C;KACF;;IAEF,MAAM,eAAe,gBAAgB,MAAM,IAAI,aAAa,EAAE,IAAI,EAAE,SAAS,MAAM;IACnF,MAAM,EAAE,gBAAgB,GAAG,CAAC;IAC5B,MAAM,YACJ,CAAC;KAAE,IAAI;KAAO,MAAM,CAAC,gBAAgB;KAAG,OAAO;IAAG,CAAC,GACnD,WAAW,aAAa,UACpB,WAAW,GAAG,cACd,aAAa,aACX;KACJ,IAAI,aAAa,YAAY,KAAA,GAC3B,WAAW,SAAS,aAAa,OAAO;IAE5C,CACF;IAEA,MAAM,KAAK,EAAE,QAAQ,KAAK,CAAC;GAC7B,GAAG;IAAC;IAAK;IAAc;IAAa;IAAM;IAAO;IAAgB;GAAU,CAAC;GAG5E,MAAM,qBAAA,GAAoBA,MAAAA,YAAAA,EAAa,OAA8B,oBAAoB,IAAI,IAAI,GAAG,CAAC,mBAAmB,CAAC;;;;;;GAOzH,MAAM,eAAA,GAAcA,MAAAA,YAAAA,OAAwB;IAC1C,MAAM,WAAW,kBAAkB;IACnC,IAAI,aAAa,KAAA,GAAW;IAC5B,SAAc,MAAM;KAClB,eAAe,IAAI,cAAc,SAAS;KAC1C,eAAe,UAAU,QAAQ;KACjC,cAAc,gBAAgB;KAE9B,aAAa,cAAc,KAAK,WAAW,CAAC,EAAA,CACzC,MAAM,WAAW,OAAO,OAAO,YAAY,OAAO,eAAe,KAAK;KACzE,UAAU,aAAa,mBAAmB,cAAc,QAAQ;KAChE,QAAQ,aAAa,oBAAoB,UAAU,OAAO,aAAa,UAAU;KACjF,OAAO,aAAa,WAAW,SAAS,UAAU,SAAS,qBAAqB;IAClF,CAAC;GACH,GAAG;IAAC;IAAK;IAAqB;IAAc,KAAK;IAAS;GAAU,CAAC;GACrE,eAAe,UAAU;GAGzB,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,cAAc,IAAI,cAAc,UAAU,WAAW;IAC3D,YAAY;IACZ,OAAO;GACT,GAAG,CAAC,KAAK,WAAW,CAAC;;GAGrB,MAAM,0BAAA,GAAyBA,MAAAA,YAAAA,EAAa,QAA+C,OAAiC;IAC1H,MAAM,mBAAmB,UAAU,QAAQ;IAC3C,OAAO,mBAAmB,QAAQ,QAAQ,YAAY;KACpD,IAAI,qBAAqB,UAAU,QAAQ,kBAAkB,gBAAgB,YAAY,kBAAkB;MACzG,WAAW,SAAS,sBAAsB;MAC1C,OAAO;KACT;KAEA,MAAM,SAAS,MAAM,WAAW,oBAAoB;MAAE,GADtC,WAAW,kBAAkB;OAAE;OAAQ,UAAU;MAAG,IAAI;OAAE;OAAQ,cAAc;MAAG;MACjC;KAAiB,CAAC;KACpF,IAAI,qBAAqB,UAAU,QAAQ,gBAAgB,OAAO;KAClE,IAAI,CAAC,OAAO,IAAI;MACd,WAAW,SAAS,eAAe,OAAO,WAAW,8BAA8B;MACnF,OAAO;KACT;KACA,MAAM,KAAK,EAAE,QAAQ,KAAK,CAAC;KAC3B,WAAW,MAAM,WAAW,WAAW,WAAW,OAAO,WAAW,IAAI;KACxE,OAAO;IACT,CAAC;GACH,GAAG,CAAC,MAAM,UAAU,CAAC;GACrB,MAAM,0BAAA,GAAyBA,MAAAA,YAAAA,EAAa,QAAoC,OAAe,uBAAuB,QAAQ,EAAE,GAAG,CAAC,sBAAsB,CAAC;GAC3J,MAAM,0BAAA,GAAyBA,MAAAA,YAAAA,EAAa,OAAe,uBAAuB,UAAU,EAAE,GAAG,CAAC,sBAAsB,CAAC;GAEzH,MAAM,iBAAA,GAAgBA,MAAAA,YAAAA,CAAY,YAA8B;IAC9D,MAAM,MAAM,EAAE,aAAa;IAC3B,MAAM,YAAY,IAAI,iBAAiB;IACvC,MAAM,MAAM,MAAM,WAAW,cAAc,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,CAAC;IACvF,IAAI,QAAQ,aAAa,WAAW,cAAc,IAAI,iBAAiB,GAAG,OAAO;IACjF,IAAI,CAAC,IAAI,IAAI;KACX,WAAW,SAAS,eAAe,IAAI,WAAW,8BAA8B;KAChF,OAAO;IACT;IACA,iBAAiB,UAAU;IAC3B,aAAa,WAAW;IACxB,cAAc;KAAE,GAAG,UAAU;KAAS,GAAG,wBAAwB,IAAI,KAAK;IAAE,CAAC;IAC7E,OAAO;GACT,GAAG;IAAC;IAAK;IAAe;GAAU,CAAC;;GAGnC,MAAM,cAAA,GAAaA,MAAAA,YAAAA,CAAY,OAC7B,QAAwC,SAA+B,YAClD;IACrB,IAAI,cAAc,SAAS;KAAE,WAAW,SAAS,cAAc;KAAG,OAAO;IAAM;IAC/E,cAAc,UAAU;IACxB,cAAc,IAAI;IAClB,IAAI;KACF,MAAM,MAAM,MAAM,OAAO;KACzB,IAAI,CAAC,IAAI,IAAI;MACX,IAAI,IAAI,SAAS,2BAA2B,WAAW,SAAS,UAAU,OAAO,IAAI,WAAW,8BAA8B;MAC9H,OAAO;KACT;KACA,MAAM,YAAY,MAAM,cAAc;KACtC,WAAW,YAAY,OAAO,SAAS,QAAQ,IAAI,KAAK,KAAK,YAAY,KAAK,kBAAkB;KAChG,OAAO;IACT,SAAS,OAAO;KACd,WAAW,SAAS,UAAU,MAAM,aAAa,KAAK,CAAC;KACvD,OAAO;IACT,UAAU;KACR,cAAc,UAAU;KACxB,cAAc,KAAK;IACrB;GACF,GAAG,CAAC,eAAe,UAAU,CAAC;GAE9B,MAAM,gBAAA,GAAeA,MAAAA,YAAAA,EAAa,QAAkD,YAClF,iBAAiB,mBAAmB,QAAQ,OAAO,IAAI,EAAE,OAAO,MAAM,aAAa,cACjF,OAAO,MAAM,UAAU,UAAU,cAAc,IAAI,OAAO,YAAY,cAAc,OACjF,UAAU,eAAe,YAAY,KAAK,UAAU,GAAG,CAAC,UAAU,CAAC;GAE1E,MAAM,yBAAA,GAAwBA,MAAAA,YAAAA,EAAa,MAAc,YAAsD;IAC7G,MAAM,SAAS,KAAK,KAAK;IACzB,IAAI,OAAO,WAAW,GAAG;KAAE,WAAW,SAAS,WAAW;KAAG,OAAO,QAAQ,QAAQ,KAAK;IAAE;IAC3F,OAAO,cAAc,cAAc,WAAW,yBAAyB;KAAE,MAAM;KAAQ,GAAI,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU;IAAG,CAAC,GAAG,OAAO;GACtJ,GAAG,CAAC,cAAc,UAAU,CAAC;GAE7B,MAAM,eAAA,GAAcA,MAAAA,YAAAA,EAAa,UAC/B,iBAAiB,WAAW,eAAe,KAAK,IAAI,EAAE,SAAS,SAAS,MAAM,QAAQ,GAAG,CAAC,UAAU,CAAC;GAEvG,MAAM,aAAA,GAAYA,MAAAA,YAAAA,CAAY,OAAO,OAA0B,cAA+E;IAC5I,IAAI,MAAM,SAAS,KAAA,KAAa,cAAc,IAAI,iBAAiB,KAAK,cAAc,iBAAiB,SACrG,OAAO;KAAE,IAAI;KAAO,SAAS;IAAkB;IAEjD,MAAM,SAAS,MAAM,WAAW,aAAa;KAAE,MAAM,MAAM;KAAM,MAAM,MAAM;KAAM,GAAI,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU;IAAG,CAAC;IACtI,OAAO,cAAc,IAAI,iBAAiB,IAAI,SAAS;KAAE,IAAI;KAAO,SAAS;IAAkB;GACjG,GAAG,CAAC,GAAG,CAAC;GAER,MAAM,aAAA,GAAYA,MAAAA,YAAAA,CAAY,OAAO,OAA0B,SAAiB,aAAqB,kBAA0B,cAA+E;IAC5M,MAAM,OAAO,MAAM;IACnB,IAAI,SAAS,KAAA,KAAa,cAAc,IAAI,iBAAiB,KAAK,cAAc,iBAAiB,SAC/F,OAAO;KAAE,IAAI;KAAO,SAAS;IAAkB;IAEjD,IAAI,SAA6C;KAAE,IAAI;KAAO,SAAS;IAAe;IACtF,MAAM,WAAW,YAAY;KAC3B,SAAS,MAAM,WAAW,cAAc;MAAE,MAAM,MAAM;MAAM;MAAM;MAAS;MAAa;MAAkB,GAAI,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU;KAAG,CAAC;KAC7J,OAAO;IACT,SAAS,SAAS,MAAM,QAAQ,QAAQ;IACxC,OAAO;GACT,GAAG,CAAC,KAAK,UAAU,CAAC;GAEpB,MAAM,eAAA,GAAcA,MAAAA,YAAAA,EAAa,UAAsE;IACrG,MAAM,YAAY,IAAI,iBAAiB;IACvC,MAAM,OAAO,MAAM;IACnB,IAAI,SAAS,KAAA,KAAa,cAAc,iBAAiB,SAAS;KAChE,WAAW,SAAS,iBAAiB;KACrC,OAAO,QAAQ,QAAQ,KAAK;IAC9B;IACA,OAAO,iBAAiB,WAAW,eAAe;KAAE,MAAM,MAAM;KAAM;KAAM,GAAI,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU;IAAG,CAAC,IAC5H,EAAE,WAAW,SAAS,MAAM,KAAK,YAAY,KAAK,SAAS,QAAQ,MAAM,KAAK,IAAI;GACvF,GAAG;IAAC;IAAK;IAAY;GAAU,CAAC;GAEhC,MAAM,kBAAA,GAAiBA,MAAAA,YAAAA,EAAa,MAAc,MAAc,WAAgD;IAC9G,MAAM,YAAY,IAAI,iBAAiB;IACvC,IAAI,cAAc,iBAAiB,SAAS;KAC1C,WAAW,SAAS,iBAAiB;KACrC,OAAO,QAAQ,QAAQ,KAAK;IAC9B;IACA,OAAO,iBAAiB,WAAW,eAAe;KAAE;KAAM;KAAM,GAAG;KAAQ,GAAI,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU;IAAG,CAAC,SACtH,SAAS,KAAK,SAAS,MAAM,KAAK,UAAU;GACtD,GAAG;IAAC;IAAK;IAAY;GAAU,CAAC;GAEhC,MAAM,qBAAA,GAAoBA,MAAAA,YAAAA,EAAa,YAAsB;IAC3D,MAAM,YAAY,IAAI,iBAAiB;IACvC,OAAO,iBAAiB,WAAW,iBAAiB;KAAE;KAAS,GAAI,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU;IAAG,CAAC,SAC1G,cAAc,QAAQ,OAAO,MAAM,WAAW;GACxD,GAAG,CAAC,KAAK,UAAU,CAAC;GAEpB,MAAM,iBAAA,GAAgBA,MAAAA,YAAAA,CAAY,OAAO,SAAkB;IACzD,MAAM,SAAS,QAAQ,UAAU,QAAQ;IACzC,IAAI,CAAC,QAAQ;KAAE,WAAW,SAAS,mBAAmB;KAAG;IAAO;IAChE,IAAI;KACF,MAAM,IAAI,SAAS,MAAM;KACzB,WAAW,MAAM,aAAa,MAAM;IACtC,SAAS,OAAO;KACd,WAAW,SAAS,UAAU,aAAa,KAAK,CAAC;IACnD;GACF,GAAG,CAAC,KAAK,UAAU,CAAC;GAEpB,MAAM,kBAAkB,iBAAiB,MAAM;GAC/C,MAAM,gBAAgB,CAAC,cAAc,iBAAiB,aAAa;GAEnE,MAAM,cAAc,OAAO,cAAc,OAAO,YAAY;GAC5D,MAAM,mBAAmB,aAAa,OAAO,YAAY;GACzD,MAAM,qBAAqB,YAAY,WAAW,iBAAiB,UAC9D,YAAY,MAAM,QAAQ,UAAU,WAAW,iBAAiB,MAAM;GAC3E,MAAM,oBAAoB,yBAAyB,eAAe,CAAC,CAAC,SAAS;GAC7E,MAAM,eAAe,sBAAsB;GAC3C,MAAM,QAAQ,iBAAiB;GAM/B,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,oBAAoB;IACzB,MAAM,QAAQ,iBAAiB;KAAE,eAAoB,OAAO,eAAe,EAAE,qBAAqB,MAAM,CAAC;IAAE,GAAG,GAAG;IACjH,aAAa,aAAa,KAAK;GACjC,GAAG;IAAC;IAAoB,OAAO;IAAe;GAAc,CAAC;GAI7D,MAAM,YAAA,GAAWF,MAAAA,OAAAA,CAAwB;GACzC,SAAS,UAAU;IACjB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,0BAA0B,mBAAmB;IAC7C;IACA;IACA;IACA;IACA,4BAA4B,qBAAqB;IACjD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACF;GACA,OAAO,SAAS;EAClB;;;EC7tCA,eAAsB,aAAa,UAA0B,SAA4D;GACvH,MAAM,WAAW,MAAM,WAAW,UAAU;IAAE,GAAG;IAAS,SAAS;GAAK,CAAC;GACzE,IAAI,CAAC,SAAS,IAAI,OAAO;IAAE,MAAM;IAAS,SAAS,SAAS,WAAW;GAA8B;GACrG,MAAM,QAAQ,SAAS;GACvB,IAAI,MAAM,UAAU,yBAAyB,OAAO;IAAE,MAAM;IAAc,YAAY,MAAM,cAAc,CAAC;IAAG,YAAY,gBAAgB,QAAQ,MAAM,aAAa,KAAA;GAAU;GAC/K,IAAI,MAAM,UAAU,wBAAwB,OAAO;IAAE,MAAM;IAAS,OAAO,MAAM,SAAS,CAAC;GAAE;GAC7F,OAAO;IAAE,MAAM;IAAS,cAAc,MAAM;IAAc,iBAAiB,MAAM;IAAiB,QAAQ,MAAM;IAAQ,SAAS,MAAM;GAAQ;EACjJ;EACA,eAAsB,YAAY,UAA0B,SAA0D;GACpH,MAAM,EAAE,OAAO,UAAU,UAAU,YAAY,WAAW,YAAY,wBAAwB,cAAc,oBAAoB;GAChI,MAAM,WAAW,MAAM,WAAW,UAAU;IAAE;IAAO;IAAU;IAAU;IAAY;IAAW;IAAY;IAAwB,sBAAsB;IAAc,yBAAyB;GAAgB,CAAC;GAClN,OAAO,SAAS,KAAK;IAAE,IAAI;IAAM,OAAO,SAAS,MAAM;IAAI,gBAAgB,oBAAoB,SAAS,QAAQ,SAAS,MAAM,iBAAiB,KAAA;GAAU,IAAI;IAAE,IAAI;IAAO,OAAO,SAAS,MAAM,SAAS,eAAe;IAAG,SAAS,SAAS,WAAW;GAA8B;EACzR;;;ECXA,SAAS,SAAS,MAAY,UAA8C;GAC1E,IAAI,aAAa,QAAQ,OAAO,KAAK,KAAK;GAC1C,OAAO,IAAI,SAAS,SAAS,WAAW;IACtC,MAAM,SAAS,IAAI,WAAW;IAC9B,OAAO,eAAe;KACpB,MAAM,SAAS,OAAO;KACtB,IAAI,OAAO,WAAW,UAAU;MAC9B,uBAAO,IAAI,MAAM,UAAU,KAAK,MAAM,CAAC;MACvC;KACF;KACA,MAAM,QAAQ,OAAO,QAAQ,GAAG;KAChC,QAAQ,SAAS,IAAI,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE;IACnD;IACA,OAAO,gBAAgB,OAAO,OAAO,yBAAS,IAAI,MAAM,UAAU,KAAK,MAAM,CAAC;IAC9E,OAAO,cAAc,IAAI;GAC3B,CAAC;EACH;EAEA,eAAsB,gBACpB,OACA,UAC4B;GAC5B,OAAO,QAAQ,IAAI,MAAM,IAAI,OAAO,UAAU;IAC5C,MAAM,KAAK,sBAAsB,KAAK;IACtC,SAAS,MAAM,SAAS,MAAM,QAAQ;IACtC,UAAU,aAAa,SAAS,SAAS;GAC3C,EAAE,CAAC;EACL;;;;ECVA,MAAM,gBAAgC;GAAE,OAAO;GAAG,OAAO;GAAG,UAAU;GAAG,SAAS;GAAG,QAAQ;GAAG,UAAU,CAAC;EAAE;EAE7G,SAAgB,qBAAqB,UAA8B;GACjE,MAAM,CAAC,OAAO,aAAA,GAAYG,MAAAA,SAAAA,CAA0B,MAAM;GAC1D,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAA6B;GAC3D,MAAM,CAAC,YAAY,kBAAA,GAAiBA,MAAAA,SAAAA,CAAgC;GACpE,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAuB;GACjD,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAwB,CAAC,CAAC;GACxD,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAS,EAAE;GACrC,MAAM,CAAC,YAAY,kBAAA,GAAiBA,MAAAA,SAAAA,CAAS,EAAE;GAC/C,MAAM,CAAC,aAAa,mBAAA,GAAkBA,MAAAA,SAAAA,CAAiB;GACvD,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS,aAAa;GACtD,MAAM,CAAC,aAAa,mBAAA,GAAkBA,MAAAA,SAAAA,CAAiB;GACvD,MAAM,CAAC,cAAc,oBAAA,GAAmBA,MAAAA,SAAAA,CAAS,EAAE;GACnD,MAAM,OAAA,GAAMC,MAAAA,OAAAA,CAAO,QAAQ;GAC3B,IAAI,UAAU;GACd,MAAM,SAAA,GAAQA,MAAAA,OAAAA,CAAO,IAAI;GACzB,MAAM,YAAA,GAAWA,MAAAA,OAAAA,CAAO,CAAC;GACzB,MAAM,UAAA,GAASA,MAAAA,OAAAA,CAAO,KAAK;GAC3B,MAAM,cAAA,GAAaA,MAAAA,OAAAA,CAAO,KAAK;GAC/B,MAAM,UAAA,GAASA,MAAAA,OAAAA,CAA2B;GAC1C,MAAM,SAAA,GAAQA,MAAAA,OAAAA,CAAoC,CAAC,CAAC;GACpD,MAAM,SAAA,GAAQA,MAAAA,OAAAA,CAAO,CAAC;GACtB,MAAM,YAAA,GAAWA,MAAAA,OAAAA,CAAsB,CAAC,CAAC;GACzC,MAAM,SAAA,GAAQA,MAAAA,OAAAA,CAA2B;GACzC,MAAM,UAAA,GAASA,MAAAA,OAAAA,CAAe;GAC9B,MAAM,YAAA,GAAWA,MAAAA,OAAAA,CAAe;GAEhC,MAAM,WAAA,GAAUC,MAAAA,YAAAA,OAAkB;IAChC,MAAM,KAAK,OAAO,SAAS;IAC3B,OAAO,UAAU,KAAA;IACjB,IAAI,SAAS,YAAY,KAAA,GAAW,IAAI,gBAAgB,SAAS,OAAO;IACxE,SAAS,UAAU,KAAA;IACnB,IAAI,OAAO,KAAA,GAAW,WAAgB,gBAAgB,EAAE,UAAU,GAAG,CAAC;GACxE,GAAG,CAAC,CAAC;GACL,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,UAAU;IAChB,aAAa;KAAE,MAAM,UAAU;KAAO,SAAS,WAAW;KAAG,QAAQ;IAAE;GACzE,GAAG,CAAC,OAAO,CAAC;GAEZ,MAAM,WAAA,GAAUA,MAAAA,YAAAA,CAAY,YAA2B;IACrD,IAAI,CAAC,MAAM,WAAW,WAAW,SAAS;IAC1C,MAAM,MAAM,EAAE,SAAS;IACvB,MAAM,UAAU,KAAA;IAChB,SAAS,SAAS;IAClB,SAAS,EAAE;IACX,IAAI;KACF,IAAI,OAAO,YAAY,KAAA,GAAW;MAChC,MAAM,QAAQ,MAAM,QAAQ,MAAM;MAClC,IAAI,UAAU,KAAA,GAAW;MACzB,MAAM,QAAQ,MAAM;MACpB,IAAI,iBAAiB,MAAM;OACzB,IAAI,MAAM,WAAW,KAAK,CAAC,MAAM,oBAAoB;QACnD,MAAM,WAAW,MAAM,aAAa,OAAO,MAAM,IAAI;QACrD,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,SAAS,OAAO;QAClD,IAAI,CAAC,MAAM,WAAW,QAAQ,SAAS,SAAS;SAC9C,WAAgB,gBAAgB,EAAE,UAAU,SAAS,MAAM,SAAS,CAAC;SACrE;QACF;QACA,OAAO,UAAU,EAAE,UAAU,SAAS,MAAM,SAAS;OACvD,OAAO;QACL,MAAM,QAAQ;QACd,IAAI,MAAM,QAAQ,OAAO,SAAS,QAAQ,KAAK,KAAK,KAAK,OAAO,CAAC,IAAI,IAAI,KAAK,mBAAmB,SAAS,IAAI,KAAK,IAAI,KAAA,UAA4B,MAAM,IAAI,MAAM,IAAI,QAAQ,iBAAiB;QAChM,MAAM,UAAU,MAAM,gBAAgB,OAAO,QAAQ;QACrD,IAAI,CAAC,MAAM,WAAW,QAAQ,SAAS,SAAS;QAChD,OAAO,UAAU,EAAE,OAAO,QAAQ;OACpC;MACF,OAAO,OAAO,UAAU,EAAE,OAAO,MAAqB;KACxD;KACA,MAAM,UAAU;MAAE,GAAG,OAAO;MAAS,GAAG,SAAS;KAAQ;KACzD,MAAM,WAAW,MAAM,IAAI,QAAQ,QAAQ,OAAO;KAClD,IAAI,CAAC,MAAM,WAAW,QAAQ,SAAS,SAAS;KAChD,IAAI,SAAS,SAAS,SAAS;MAC7B,SAAS,SAAS,QAAQ,UAAU,OAAO;MAC3C,SAAS,SAAS,OAAO;MACzB,IAAI,QAAQ,QAAQ,SAAS,SAAS,SAAS,UAAU,IAAI;MAC7D;KACF;KACA,cAAc,SAAS,SAAS,eAAe,WAAW,KAAA,CAAS;KACnE,SAAS,SAAS,SAAS,UAAU,SAAS,QAAQ,KAAA,CAAS;KAC/D,IAAI,SAAS,SAAS,SAAS;MAC7B,MAAM,QAA4B;OAAE,GAAG;OAAS,cAAc,SAAS,gBAAgB;OAAI,iBAAiB,SAAS;OAAiB,QAAQ,SAAS;OAAQ,SAAS,SAAS;OAAS,kBAAkB,SAAS,QAAQ;MAAuB;MAEpP,SAAS,UAAU;OAAE,GAAG,SAAS;OAAS,UAAU,SAAS,SAAS,YAAY,SAAS,QAAQ;OAAU,YAAY,SAAS,SAAS,cAAc,SAAS,QAAQ;MAAW;MACrL,WAAW,SAAS,OAAO;MAC3B,MAAM,UAAU;MAChB,WAAW,KAAK;KAClB,OAAO,WAAW,KAAA,CAAS;KAC3B,SAAS,YAAY;IACvB,SAAS,QAAQ;KACf,IAAI,CAAC,MAAM,WAAW,QAAQ,SAAS,SAAS;KAChD,MAAM,UAAU,aAAa,MAAM;KACnC,SAAS,OAAO;KAChB,SAAS,OAAO;KAChB,IAAI,QAAQ,QAAQ,SAAS,KAAK;IACpC;GACF,GAAG,CAAC,CAAC;GAEL,MAAM,aAAA,GAAYA,MAAAA,YAAAA,CAAY,YAA2B;IACvD,QAAQ;IACR,SAAS,UAAU,CAAC;IACpB,MAAM,UAAU,KAAA;IAChB,WAAW,CAAC,CAAC;IACb,WAAW,KAAA,CAAS;IACpB,cAAc,KAAA,CAAS;IACvB,SAAS,KAAA,CAAS;IAClB,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,GAAG;IAC7C,cAAc,iBAAiB,OAAO,MAAM,OAAO,OAAO,QAAQ,EAAE;IACpE,SAAS,UAAU,iBAAiB,SAAS,MAAM,SAAS,eAAe,UAAU,KAAK,MAAM,IAAI,KAAK,IAAI,gBAAgB,KAAK,IAAI,KAAA;IACtI,eAAe,SAAS,OAAO;IAC/B,aAAa,cAAc;KAAE,GAAG;KAAU,OAAO,MAAM,UAAU;IAAE,EAAE;IACrE,MAAM,QAAQ;GAChB,GAAG,CAAC,SAAS,OAAO,CAAC;GAErB,MAAM,OAAA,GAAMA,MAAAA,YAAAA,CAAY,OAAO,OAA6B,OAA4B,cAA6B;IACnH,IAAI,MAAM,WAAW,KAAK,OAAO,SAAS;IAC1C,OAAO,UAAU;IACjB,MAAM,UAAU,SAAS,UAAU,MAAM,KAAK,SAAS,CAAC,IAAI,CAAyB,IAAI,CAAC,KAAK;IAC/F,MAAM,UAAU;IAChB,YAAY;KAAE,GAAG;KAAe,OAAO,MAAM,QAAQ;IAAO,CAAC;IAC7D,eAAe,KAAA,CAAS;IACxB,gBAAgB,EAAE;IAClB,MAAM,UAAU;GAClB,GAAG,CAAC,SAAS,CAAC;GAEd,MAAM,WAAA,GAAUA,MAAAA,YAAAA,CAAY,YAA2B;IACrD,QAAQ;IACR,MAAM,WAAW;IACjB,IAAI,MAAM,UAAU,MAAM,QAAQ,QAAQ,MAAM,UAAU;SACrD;KACH,MAAM,UAAU,KAAA;KAChB,WAAW,KAAA,CAAS;KACpB,cAAc,KAAA,CAAS;KACvB,SAAS,KAAA,CAAS;KAClB,SAAS,EAAE;KACX,SAAS,UAAU;IACrB;GACF,GAAG,CAAC,SAAS,SAAS,CAAC;GAEvB,MAAM,iBAAA,GAAgBA,MAAAA,YAAAA,EAAa,UAA+B;IAChE,IAAI,WAAW,SAAS;IACxB,SAAS,UAAU;KAAE,GAAG,SAAS;KAAS,GAAG;IAAM;IACnD,WAAW,SAAS,OAAO;IAC3B,QAAa;GACf,GAAG,CAAC,OAAO,CAAC;GAEZ,MAAM,WAAA,GAAUA,MAAAA,YAAAA,CAAY,YAA2B;IACrD,MAAM,QAAQ,MAAM;IACpB,IAAI,UAAU,KAAA,KAAa,WAAW,SAAS;IAC/C,MAAM,UAAU,KAAA;IAChB,WAAW,UAAU;IACrB,SAAS,YAAY;IACrB,SAAS,EAAE;IACX,IAAI;KACF,MAAM,YAAY,MAAM,IAAI,QAAQ,OAAO,KAAK;KAChD,IAAI,CAAC,MAAM,SAAS;KACpB,IAAI,CAAC,UAAU,IAAI;MACjB,SAAS,UAAU,WAAW,EAAE;MAChC,SAAS,UAAU,QAAQ,UAAU,OAAO;MAC5C,IAAI,QAAQ,QAAQ,UAAU,WAAW,IAAI,UAAU,UAAU,IAAI;MACrE;KACF;KACA,OAAO,UAAU,UAAU;KAC3B,eAAe,UAAU,KAAK;KAC9B,aAAa,cAAc;MAAE,GAAG;MAAU,UAAU,SAAS,WAAW;KAAE,EAAE;KAC5E,IAAI;MACF,MAAM,IAAI,QAAQ,cAAc,UAAU,KAAK;MAC/C,IAAI,UAAU,gBAAgB,MAAM,IAAI,MAAM,UAAU,cAAc;KACxE,SAAS,QAAQ;MACf,IAAI,CAAC,MAAM,SAAS;MACpB,gBAAgB,aAAa,MAAM,CAAC;MACpC,MAAM,YAAY,MAAM,QAAQ,SAAS,MAAM,UAAU;MACzD,aAAa,cAAc;OAAE,GAAG;OAAU,SAAS,SAAS,UAAU;MAAU,EAAE;MAClF,MAAM,UAAU,CAAC;MACjB,SAAS,UAAU;MACnB,QAAQ;MACR;KACF;KACA,IAAI,MAAM,SAAS;MAAE,WAAW,UAAU;MAAO,MAAM,QAAQ;KAAE;IACnE,SAAS,QAAQ;KACf,IAAI,CAAC,MAAM,SAAS;KACpB,SAAS,aAAa,MAAM,CAAC;KAC7B,SAAS,OAAO;KAChB,IAAI,QAAQ,QAAQ,aAAa,MAAM,GAAG,KAAK;IACjD,UAAU;KAAE,WAAW,UAAU;IAAM;GACzC,GAAG,CAAC,SAAS,OAAO,CAAC;GAErB,MAAM,QAAA,GAAOA,MAAAA,YAAAA,OAAwB;IACnC,IAAI,WAAW,WAAW,MAAM,YAAY,SAAS,QAAQ,KAAK,MAAM,QAAQ,WAAW,GAAG;IAC9F,SAAS,WAAW;IACpB,aAAa,cAAc;KAAE,GAAG;KAAU,SAAS,SAAS,WAAW,QAAQ,IAAI;KAAI,QAAQ,SAAS,UAAU,QAAQ,IAAI;KAAI,UAAU,QAAQ,CAAC,GAAG,SAAS,UAAU,GAAG,WAAW,IAAI,OAAO,IAAI,SAAS;IAAS,EAAE;IAC5N,QAAa;GACf,GAAG;IAAC;IAAS;IAAO;IAAY,SAAS;GAAK,CAAC;GAC/C,MAAM,UAAA,GAASA,MAAAA,YAAAA,OAAwB;IACrC,IAAI,WAAW,SAAS;IACxB,SAAS,WAAW;IACpB,OAAO,UAAU;IACjB,MAAM,UAAU,KAAA;IAChB,QAAQ;IACR,MAAM,UAAU,CAAC;IACjB,WAAW,KAAA,CAAS;IACpB,cAAc,KAAA,CAAS;IACvB,SAAS,KAAA,CAAS;IAClB,SAAS,EAAE;IACX,SAAS,MAAM;GACjB,GAAG,CAAC,OAAO,CAAC;GACZ,MAAM,gBAAA,GAAeA,MAAAA,YAAAA,CAAY,YAA2B;IAC1D,IAAI,WAAW,SAAS;IACxB,WAAW,UAAU;IACrB,IAAI;KAAE,MAAM,IAAI,QAAQ,cAAc,OAAO,OAAO;KAAG,IAAI,MAAM,SAAS,gBAAgB,EAAE;IAAE,SACvF,QAAQ;KAAE,IAAI,MAAM,SAAS,gBAAgB,aAAa,MAAM,CAAC;IAAE,UAClE;KAAE,WAAW,UAAU;IAAM;GACvC,GAAG,CAAC,CAAC;GAYL,OAAO;IAAE;IAAO;IAAS;IAAY;IAAO;IAAS;IAAO;IAAY;IAAa;IAAU;IAAa;IAAc;IAAK;IAAe,cAAc,gBAAwB,cAAc,EAAE,wBAAwB,YAAY,CAAC;IAAG;IAAS;IAAQ,MAAA,GAXjPA,MAAAA,YAAAA,OAAwB;KAClC,IAAI,WAAW,WAAW,MAAM,QAAQ,WAAW,GAAG;KACtD,SAAS,WAAW;KACpB,MAAM,UAAU,KAAA;KAChB,QAAQ;KACR,MAAM,YAAY,MAAM,QAAQ,SAAS,MAAM;KAC/C,aAAa,cAAc;MAAE,GAAG;MAAU,SAAS,SAAS,UAAU,aAAa,QAAQ,IAAI;MAAI,QAAQ,SAAS,UAAU,QAAQ,IAAI;MAAI,UAAU,QAAQ,CAAC,GAAG,SAAS,UAAU,GAAG,WAAW,IAAI,OAAO,IAAI,SAAS;KAAS,EAAE;KACxO,MAAM,UAAU,CAAC;KACjB,WAAW,KAAA,CAAS;KACpB,SAAS,UAAU;IACrB,GAAG;KAAC;KAAO;KAAS;IAAU,CACiO;IAAG;IAAM,WAAW;IAAS;GAAa;EAC3S;;;;ECnPA,SAAgB,0BAA0B,OAOnB;GACrB,MAAM,QAAQ,KAAK,IAAI,GAAG,MAAM,iBAAiB,MAAM,eAAe,MAAM,MAAM,MAAM,MAAM;GAC9F,MAAM,QAAQ,KAAK,IAAI,GAAG,MAAM,YAAY,MAAM,MAAM,MAAM,MAAM;GACpE,MAAM,OAAO,SAAS,MAAM,iBAAiB,SAAS,QAAQ,WAAW;GAGzE,OAAO;IAAE;IAAM,WAAW,SAAS,WAAW,QAAQ;GAAM;EAC9D;;;;EAKA,SAAgB,0BAA0B,OAI/B;GACT,MAAM,UAAU,MAAM,MAAM;GAC5B,MAAM,MAAM,YAAY;GACxB,MAAM,SAAS,KAAK,IAAI,MAAM,cAAc,MAAM,YAAY;GAC9D,MAAM,MAAM,YAAY;GACxB,OAAO;EACT;;;;EC7BA,SAAgB,wBAAwB,SAOf;GACvB,MAAM,EAAE,MAAM,WAAW,UAAU,MAAM,GAAG,SAAS,IAAI,mBAAmB,QAAS;GACrF,MAAM,CAAC,KAAK,WAAA,GAAUC,MAAAA,SAAAA,CAAoC,IAAI;;GAE9D,MAAM,cAAA,GAAaC,MAAAA,OAAAA,OAAyB,CAAC,CAAC;GAE9C,CAAA,GAAA,MAAA,gBAAA,OAAsB;IACpB,IAAI,CAAC,MAAM;KACT,WAAW,gBAAgB,CAAC;KAC5B,OAAO,IAAI;KACX;IACF;IACA,MAAM,gBAAsB;KAC1B,MAAM,SAAS,UAAU,SAAS,sBAAsB;KACxD,MAAM,QAAQ,SAAS;KACvB,IAAI,WAAW,KAAA,KAAa,UAAU,MAAM;KAC5C,MAAM,MAAM,KAAK,MAAM,OAAO,cAAc,gBAAgB;KAC5D,MAAM,gBAAgB,KAAK,IAAI,0BAA0B,KAAK,GAAG,GAAG;KACpE,MAAM,OAAO,0BAA0B;MACrC,WAAW,OAAO;MAClB,cAAc,OAAO;MACrB;MACA,gBAAgB,OAAO;MACvB;MACA;KACF,CAAC;KACD,MAAM,YAAY,KAAK,IAAI,KAAK,WAAW,GAAG;KAC9C,QAAQ,YAAY,SAAS,SAAS,KAAK,QAAQ,QAAQ,cAAc,YAAY,UAAU;MAAE,MAAM,KAAK;MAAM;KAAU,CAAC;IAC/H;IACA,WAAW,UAAU;IACrB,QAAQ;IACR,OAAO,iBAAiB,UAAU,SAAS,IAAI;IAC/C,OAAO,iBAAiB,UAAU,OAAO;IACzC,MAAM,WAAW,OAAO,mBAAmB,cAAc,KAAA,IAAY,IAAI,eAAe,OAAO;IAC/F,IAAI,UAAU,YAAY,MAAM,UAAU,QAAQ,UAAU,OAAO;IACnE,IAAI,SAAS,YAAY,MAAM,UAAU,QAAQ,SAAS,OAAO;IACjE,aAAa;KACX,UAAU,WAAW;KACrB,OAAO,oBAAoB,UAAU,SAAS,IAAI;KAClD,OAAO,oBAAoB,UAAU,OAAO;IAC9C;GACF,GAAG;IAAC;IAAM;IAAW;IAAU;IAAK;IAAQ;GAAgB,CAAC;GAI7D,CAAA,GAAA,MAAA,gBAAA,OAAsB;IACpB,WAAW,QAAQ;GACrB,CAAC;GAED,MAAM,YAAA,GAAWC,sCAAAA,oBAAAA,CAAoB;IACnC,MAAM,QAAQ,QAAQ;IACtB;IACA;IACA,MAAM,KAAK,QAAQ;IACnB;IACA;GACF,CAAC;GACD,IAAI,QAAQ,MAAM,OAAO;GACzB,OAAO,aAAa,OAChB;IAAE,YAAY;IAAU,WAAW,IAAI;GAAU,IACjD;IAAE,GAAG;IAAU,WAAW,IAAI;GAAU;EAC9C;;;ECxEA,MAAa,YAAY;;EAGzB,SAAgB,qBAAqB,QAAgB,SAAiB,UAAuC;GAC3G,IAAI,UAAU,GAAG,OAAO,KAAA;GACxB,IAAI,UAAU,GAAG,OAAO,WAAW,SAAS,IAAI;GAChD,IAAI,YAAY,YAAY,GAAG,OAAO,SAAS;GAC/C,IAAI,CAAC,YAAY,YAAY,SAAS,GAAG,OAAO;EAElD;EAEA,SAAgB,eAAsC,MAAe,SAAqB,SAMxF;GACA,MAAM,aAAA,GAAYC,MAAAA,OAAAA,CAAU,IAAI;GAChC,MAAM,cAAA,GAAaA,MAAAA,OAAAA,CAA2B,IAAI;GAElD,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,MAAM;IACX,MAAM,eAAe,SAAS,gBAAgB;IAC9C,WAAW,UAAU,cAAc,cAAA,qFAAoC,KAAK,iBAAiB,SAAS,yBAAyB,cAAc,SAAS,gBAAgB;IACtK,MAAM,OAAO,WAAW,SAAS,QAAQ,SAAS;IAClD,MAAM,WAAW,MAAM,kBAAkB,QAAQ,MAAM,kBAAkB,KAAA,IAAY,CAAC,IAAI,CAAC,GAAG,KAAK,cAAc,QAAQ;IACzH,MAAM,KAAK,SAAS,QAAQ,SAAS,KAAA,IAAY,KAAK,SAAS,QAAQ,IAAI;IAC3E,MAAM,YAAY,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,MAAM,KAAK,CAAC,GAAG,GAAG,SAAS,MAAM,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAC5F,KAAK,YAAY,QAAQ,cAA2B,SAAS,CAAC,CAAC,CAAC,QAAQ,YAAY,YAAY,IAAI;IACvG,MAAM,SAAS,MAAM;IAErB,MAAM,QAAQ,4BAA4B;KAGvC,CAFe,SAAS,iBAAiB,WAAW,CAAC,GAAI,UAAU,SAAS,iBAAA,qFAAuC,KAAK,CAAC,CAAE,CAAC,CAC1H,MAAM,YAAY,CAAC,QAAQ,QAAQ,WAAW,KAAK,QAAQ,eAAe,CAAC,CAAC,SAAS,CAAC,KAC5E,UAAU,QAAA,EAAU,MAAM;IACzC,CAAC;IACD,aAAa;KACX,qBAAqB,KAAK;KAC1B,IAAI,WAAW,SAAS,aAAa;MAAE,WAAW,QAAQ,MAAM;MAAG;KAAO;KAE1E,IAAI,SAAS,kBAAkB,SAAS,QAAQ,SAAS,eAAe,aAAa;KAGrF,CAFe,UAAU,MAAM,YAAY,QAAQ,eAAe,CAAC,QAAQ,QAAQ,WAAW,CAAC,KAC1F,QAAQ,cAA2B,4CAA4C,EAAA,EAC5E,MAAM;IAChB;GACF,GAAG,CAAC,IAAI,CAAC;GAsBT,OAAO;IAAE;IAAW,kBAAA,GApBIC,MAAAA,YAAAA,EAAa,UAAuC;KAC1E,IAAI,CAAC,QAAQ,MAAM,kBAAkB;KAErC,IAAI,MAAM,kBAAkB,QAAQ,CAAC,UAAU,SAAS,SAAS,MAAM,MAAM,GAAG;KAChF,IAAI,MAAM,QAAQ,UAAU;MAC1B,MAAM,eAAe;MACrB,MAAM,gBAAgB;MACtB,QAAQ;MACR;KACF;KACA,IAAI,MAAM,QAAQ,SAAS,UAAU,YAAY,MAAM;KACvD,MAAM,aAAa,CAAC,GAAG,UAAU,QAAQ,iBAA8B,SAAS,CAAC,CAAC,CAC/E,QAAQ,YAAY,CAAC,QAAQ,QAAQ,WAAW,KAAK,QAAQ,eAAe,CAAC,CAAC,SAAS,CAAC;KAC3F,MAAM,UAAU,SAAS,yBAAyB,cAAc,WAAW,QAAQ,SAAS,aAAa,IAAI;KAC7G,MAAM,OAAO,qBAAqB,WAAW,QAAQ,SAAS,MAAM,QAAQ;KAC5E,IAAI,SAAS,KAAA,GAAW;KACxB,MAAM,eAAe;KACrB,WAAW,KAAK,EAAE,MAAM;IAC1B,GAAG,CAAC,MAAM,OAAO,CAEiB;GAAE;EACtC;;;;EC/DA,SAAgB,cAAc,OAahB;GACZ,MAAM,EAAE,WAAW,oBAAoB,eAA+B,MAAM,MAAM,SAAS,KAAK;GAChG,MAAM,WAAA,GAAUC,MAAAA,MAAAA,CAAM;GACtB,MAAM,iBAAA,GAAgBA,MAAAA,MAAAA,CAAM;GAC5B,MAAM,qBAAA,GAAoBC,MAAAA,OAAAA,CAAoB,IAAI;GAClD,MAAM,YAAY,MAAM,aAAa;GACrC,MAAM,WAAW;GACjB,MAAM,WAAW,MAAM,cAAc,KAAA;GACrC,MAAM,WAAW,wBAAwB;IACvC,MAAM;IACN;IACA;IACA,KAAK;IACL,QAAQ;GACV,CAAC;GACD,CAAA,GAAA,sCAAA,2BAAA,CAA2B,WAAW,WAAW,SAAS;IAAE,IAAI,CAAC,MAAM,MAAM,QAAQ;GAAE,GAAG,QAAQ;GAElG,MAAM,QACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IACE,KAAK;IACL,WAAW,GAAG,WAAWC,4BAAO,kBAAkBA,4BAAO,gBAAgB,MAAM,SAAS,SAAS,IAAIA,4BAAO,sBAAsB;IAClI,OAAO,WAAW,YAAY,EAAE,YAAY,SAAS,IAAI,KAAA;IACzD,MAAM,MAAM,QAAQ;IACpB,UAAU;IACV,cAAY,WAAW,KAAA,IAAY;IACnC,cAAY,MAAM;IAClB,mBAAiB,MAAM,cAAc,KAAA,IAAY,UAAU,KAAA;IAC3D,oBAAkB,MAAM,gBAAgB,KAAA,IAAY,KAAA,IAAY;IAChE,UAAU,UAAU,MAAM,gBAAgB;IAC1C,WAAW;IAXb,UAAA;KAaE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,4BAAO;MAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,IAAI;OAAU,UAAA,MAAM;MAAc,CAAA,GAC1C,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,QAAD;OACE,SAAQ;OACR,MAAK;OACL,WAAWD,4BAAO;OAClB,cAAY,MAAM,cAAc;OAChC,SAAS,MAAM;OAChB,UAAA;MAEO,CAAA,CACL;;KACJ,MAAM,gBAAgB,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,IAAI;MAAe,WAAWA,4BAAO;MAAqB,UAAA,MAAM;KAAe,CAAA;KACtH,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,4BAAO;MAAoB,UAAA,MAAM;KAAc,CAAA;KAC9D,MAAM,WAAW,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,4BAAO;MAAe,UAAA,MAAM;KAAY,CAAA;IACpF;;GAEP,MAAM,UAAU,WAAW,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,WAAWA,4BAAO;IAAe,SAAS,MAAM;IAAU,UAAA;GAAW,CAAA;GAC7G,OAAO,OAAO,aAAa,eAAe,SAAS,SAAS,OAAO,WAAA,GAAUE,UAAAA,aAAAA,CAAa,SAAS,SAAS,IAAI;EAClH;;;;;;;EC/DA,SAAgB,cAAc,OAShB;GACZ,MAAM,aAAA,GAAYC,MAAAA,OAAAA,CAA0B,IAAI;GAChD,MAAM,WAAA,GAAUA,MAAAA,OAAAA,CAAO,KAAK;GAC5B,MAAM,CAAC,MAAM,YAAA,GAAWC,MAAAA,SAAAA,CAAS,KAAK;GACtC,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAiB;GAC3C,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,IAAI,MAAM,UAAU,SAAS,MAAM;GAAE,GAAG,CAAC,IAAI,CAAC;GAChE,MAAM,eAAqB;IAAE,IAAI,CAAC,QAAQ,SAAS,MAAM,SAAS;GAAE;GACpE,MAAM,UAAU,YAA2B;IACzC,IAAI,QAAQ,SAAS;IACrB,QAAQ,UAAU;IAClB,QAAQ,IAAI;IACZ,SAAS,KAAA,CAAS;IAClB,IAAI;KACF,MAAM,MAAM,UAAU;KACtB,MAAM,SAAS;IACjB,SAAS,QAAQ;KACf,SAAS,kBAAkB,QAAQ,OAAO,UAAU,MAAM,kBAAkB,OAAO,MAAM,CAAC;IAC5F,UAAU;KACR,QAAQ,UAAU;KAClB,QAAQ,KAAK;IACf;GACF;GACA,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,eAAD;IAAe,OAAO,MAAM;IAAO,aAAa,MAAM;IAAa,MAAK;IAC7E,iBAAiB;IAAW,gBAAgB,MAAM;IAAgB,YAAY,MAAM;IAAa,SAAS;IADrG,UAAA,CAEJ,UAAU,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,WAAWC,4BAAO;KAAc,MAAK;KAAS,UAAA;IAAS,CAAA,GAClF,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAWA,4BAAO;KAAgB,aAAW;KAAlD,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,KAAK;MAAW,MAAK;MAAS,WAAWA,4BAAO;MAAY,iBAAe;MAAM,SAAS;MAAS,UAAA,MAAM;KAAoB,CAAA,GACrI,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,WAAWA,4BAAO;MAAY,eAAA;MAAY,UAAU;MAAM,eAAe;OAAE,QAAa;MAAE;MAAI,UAAA,MAAM;KAAqB,CAAA,CAC5I;IACQ,CAAA,CAAA;;EACjB;;;;;;;;;;;;;;;;;;EC3CA,MAAM,SAAS,OAAe,KAAa,QACzC,MAAM,MAAM,MAAM,KAAK,IAAI,KAAK,IAAI,OAAO,GAAG,GAAG,GAAG;;EAGtD,SAAgB,uBACd,UACA,QACA,UAC+B;GAC/B,MAAM,OAAO;GACb,MAAM,MAAM;GACZ,IAAI,OAAO,SAAS,SAAS,YAAY,SAAS,IAAI,MAAM,SAAS,QAAQ;GAC7E,IAAI,MAAM,SAAS,SAAS,YAAY,SAAS,IAAI,MAAM,SAAS,UAAU,OAAO,SAAS;GAC9F,IAAI,OAAO,OAAO,QAAQ,SAAS,QAAQ,MACzC,OAAO,SAAS,SAAS,YAAY,SAAS,IAAI,OAAO,QAAQ,MAAM,SAAS,OAAO,OAAO,QAAQ;GAExG,IAAI,MAAM,OAAO,SAAS,SAAS,SAAS,QAAQ,SAAS,SAAS,WACpE,MAAM,SAAS,IAAI,OAAO,SAAS;GAErC,OAAO;IACL,MAAM,MAAM,MAAM,MAAM,SAAS,QAAQ,OAAO,OAAO,KAAK;IAC5D,KAAK,MAAM,KAAK,MAAM,SAAS,SAAS,OAAO,OAAO,MAAM;GAC9D;EACF;;;;ECrBA,SAAgB,gBAAgB,SAA+D;GAC7F,IAAI,OAAO,QAAQ,YAAY,YAAY,OAAO;GAClD,IAAI;IACF,OAAO,QAAQ,QAAQ,gBAAgB;GACzC,QAAQ;IACN,OAAO;GACT;EACF;;;EAIA,SAAgB,gBAAgB,SAIpB;GACV,IAAI,QAAQ,MAAM,QAAQ,gBAAA,KAAyC,OAAO;GAC1E,OAAO,gBAAgB,QAAQ,OAAO;EACxC;;;;ECjBA,MAAM,iBAAiB;;EAcvB,SAAgB,YAAY,OAA8E;GACxG,MAAM,MAAA,GAAKC,MAAAA,MAAAA,CAAM;GACjB,MAAM,UAAA,GAASC,MAAAA,OAAAA,CAA2B,IAAI;GAC9C,MAAM,UAAA,GAASA,MAAAA,OAAAA,CAA+B,IAAI;GAClD,MAAM,aAAA,GAAYA,MAAAA,OAAAA,CAA6C,IAAI;GACnE,MAAM,aAAA,GAAYA,MAAAA,OAAAA,CAA6C,IAAI;GACnE,MAAM,WAAA,GAAUA,MAAAA,OAAAA,CAAO;IAAE,GAAG;IAAG,GAAG;GAAE,CAAC;GACrC,MAAM,iBAAA,GAAgBA,MAAAA,OAAAA,CAAO,CAAC;GAC9B,MAAM,YAAA,GAAWA,MAAAA,OAAAA,CAAO;IAAE,OAAO;IAAO,OAAO;GAAM,CAAC;GACtD,MAAM,CAAC,UAAU,gBAAA,GAAeC,MAAAA,SAAAA,CAAqC,IAAI;GAEzE,MAAM,SAAwC,OAAO,MAAM,SAAS,SAAS,WACzE,MAAM,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,MAAM,SAAe,CAAA;GACjD,MAAM,WAAY,OAAsE;GACxF,MAAM,eAAA,GAAcD,MAAAA,OAAAA,CAA2B,IAAI;GACnD,MAAM,aAAA,GAAYE,MAAAA,YAAAA,EAAa,YAAgC;IAC7D,OAAO,UAAU;IACjB,IAAI,OAAO,aAAa,YAAY,SAAS,OAAO;SAC/C,IAAI,YAAY,MAAM,SAAmD,UAAU;GAC1F,GAAG,CAAC,QAAQ,CAAC;GACb,MAAM,cAAA,GAAaA,MAAAA,YAAAA,OAAkB;IACnC,IAAI,UAAU,YAAY,MAAM;IAChC,aAAa,UAAU,OAAO;IAC9B,UAAU,UAAU;GACtB,GAAG,CAAC,CAAC;GACL,MAAM,cAAA,GAAaA,MAAAA,YAAAA,OAAkB;IACnC,IAAI,UAAU,YAAY,MAAM,aAAa,UAAU,OAAO;IAC9D,UAAU,UAAU;GACtB,GAAG,CAAC,CAAC;GACL,MAAM,QAAA,GAAOA,MAAAA,YAAAA,OAAkB;IAC7B,WAAW;IACX,UAAU,UAAU,iBAAiB;KAAE,IAAI,CAAC,SAAS,QAAQ,OAAO,YAAY,IAAI;IAAE,GAAG,GAAG;GAC9F,GAAG,CAAC,UAAU,CAAC;GACf,MAAM,eAAA,GAAcA,MAAAA,YAAAA,OAAkB;IACpC,MAAM,OAAO,OAAO,SAAS,sBAAsB;IACnD,IAAI,SAAS,KAAA,GAAW;IACxB,YAAY;KAAE,MAAM;KAAS,MAAM,KAAK;KAAM,OAAO,KAAK;KAAO,SAAS,KAAK,MAAM,KAAK,SAAS;IAAE,CAAC;GACxG,GAAG,CAAC,CAAC;GACL,MAAM,iBAAA,GAAgBA,MAAAA,YAAAA,OAAkB;IACtC,WAAW;IACX,IAAI,CAAC,SAAS,QAAQ,OAAO;KAC3B,YAAY,IAAI;KAChB;IACF;IAEA,UAAU,UAAU,iBAAiB;KACnC,UAAU,UAAU;KACpB,YAAY;MAAE,MAAM;MAAW,GAAG,QAAQ;KAAQ,CAAC;IACrD,GAAG,cAAc;GACnB,GAAG,CAAC,UAAU,CAAC;GAEf,CAAA,GAAA,MAAA,UAAA,aAAsB;IAAE,WAAW;IAAG,WAAW;GAAE,GAAG,CAAC,YAAY,UAAU,CAAC;GAC9E,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,aAAa,MAAM;IACvB,MAAM,WAAW,UAA+B;KAC9C,IAAI,MAAM,QAAQ,UAAU;KAC5B,MAAM,eAAe;KACrB,MAAM,yBAAyB;KAC/B,WAAW;KACX,WAAW;KACX,YAAY,IAAI;IAClB;IACA,SAAS,iBAAiB,WAAW,SAAS,IAAI;IAClD,aAAa,SAAS,oBAAoB,WAAW,SAAS,IAAI;GACpE,GAAG;IAAC,aAAa;IAAM;IAAY;GAAU,CAAC;GAC9C,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,UAAU,SAAS,SAAS;IAChC,MAAM,SAAS,YAAY;IAC3B,MAAM,WAAW,QAAQ,aAAa,kBAAkB;IACxD,IAAI,WAAW,MAAM,OAAO,aAAa,oBAAoB,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,YAAY,GAAA,CAAI,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;IACzI,MAAM,eAAe,YAAY;IACjC,OAAO,iBAAiB,UAAU,MAAM;IACxC,OAAO,iBAAiB,UAAU,QAAQ,IAAI;IAC9C,aAAa;KACX,OAAO,oBAAoB,UAAU,MAAM;KAC3C,OAAO,oBAAoB,UAAU,QAAQ,IAAI;KACjD,IAAI,WAAW,MAAM;MACnB,MAAM,aAAa,OAAO,aAAa,kBAAkB,KAAK,GAAA,CAAI,MAAM,GAAG,CAAC,CAAC,QAAQ,UAAU,UAAU,MAAM,MAAM,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG;MACzI,IAAI,WAAW,OAAO,aAAa,oBAAoB,SAAS;WAC3D,OAAO,gBAAgB,kBAAkB;KAChD;IACF;GACF,GAAG,CAAC,UAAU,MAAM,WAAW,CAAC;GAEhC,CAAA,GAAA,MAAA,gBAAA,OAAsB;IACpB,IAAI,aAAa,QAAQ,OAAO,YAAY,MAAM;IAClD,MAAM,UAAU,OAAO;IACvB,MAAM,OAAO,QAAQ,sBAAsB;IAC3C,MAAM,SAAS,uBAAuB,UAAU,MAAM;KAAE,OAAO,OAAO;KAAY,QAAQ,OAAO;IAAY,CAAC;IAC9G,QAAQ,MAAM,OAAO,GAAG,OAAO,KAAK;IACpC,QAAQ,MAAM,MAAM,GAAG,OAAO,IAAI;GACpC,GAAG,CAAC,UAAU,MAAM,KAAK,CAAC;GAE1B,MAAM,SAAA,GAAQC,MAAAA,aAAAA,CAAa,QAAQ;IACjC,KAAK;IACL,oBAAoB,aAAa,OAC7B,OAAO,MAAM,sBACb,CAAC,OAAO,MAAM,qBAAqB,EAAE,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;IACnE,eAAe,UAAU;KACvB,OAAO,MAAM,eAAe,KAAK;KACjC,SAAS,QAAQ,QAAQ;KACzB,WAAW;KACX,QAAQ,UAAU;MAAE,GAAG,MAAM;MAAS,GAAG,MAAM;KAAQ;KACvD,IAAI,SAAS,QAAQ,OAAO;KAC5B,WAAW;KACX,UAAU,UAAU,iBAAiB;MACnC,UAAU,UAAU;MACpB,YAAY;OAAE,MAAM;OAAW,GAAG,QAAQ;MAAQ,CAAC;KACrD,GAAG,cAAc;IACnB;IACA,cAAc,UAAU;KACtB,OAAO,MAAM,cAAc,KAAK;KAChC,QAAQ,UAAU;MAAE,GAAG,MAAM;MAAS,GAAG,MAAM;KAAQ;KACvD,IAAI,UAAU,SAAS,WAAW,YAAY;MAAE,MAAM;MAAW,GAAG,QAAQ;KAAQ,CAAC;IACvF;IACA,eAAe,UAAU;KACvB,OAAO,MAAM,eAAe,KAAK;KACjC,SAAS,QAAQ,QAAQ;KACzB,WAAW;KACX,IAAI,CAAC,SAAS,QAAQ,OAAO,KAAK;IACpC;IACA,gBAAgB,UAAU;KACxB,OAAO,MAAM,gBAAgB,KAAK;KAClC,cAAc,UAAU,KAAK,IAAI;KACjC,WAAW;KACX,WAAW;KACX,YAAY,IAAI;IAClB;IACA,UAAU,UAAU;KAClB,OAAO,MAAM,UAAU,KAAK;KAC5B,IAAI,MAAM,kBAAkB,QAAQ,CAAC,MAAM,cAAc,SAAS,MAAM,MAAM,GAAG;MAC/E,SAAS,QAAQ,QAAQ;MACzB,WAAW;MACX,YAAY,IAAI;MAChB;KACF;KACA,YAAY,UAAU,MAAM,kBAAkB,cAAc,MAAM,SAAS;KAG3E,MAAM,WAAW,gBAAgB;MAAE,SAAS,YAAY,WAAW,MAAM;MAAe,eAAe,cAAc;MAAS,KAAK,KAAK,IAAI;KAAE,CAAC;KAC/I,SAAS,QAAQ,QAAQ;KACzB,WAAW;KACX,IAAI,UAAU,YAAY;IAC5B;IACA,SAAS,UAAU;KACjB,OAAO,MAAM,SAAS,KAAK;KAC3B,SAAS,QAAQ,QAAQ;KACzB,cAAc;IAChB;GACF,CAAC;GACD,MAAM,UAAU,aAAa,QAAQ,OAAO,aAAa,eAAe,SAAS,SAAS,QAAA,GACtFC,UAAAA,aAAAA,CAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;IAAM,KAAK;IAAY;IAAI,WAAWC,+BAAI;IAAQ,MAAK;IACpE,cAAc;IAAY,cAAc;IAAO,UAAA,MAAM;GAAY,CAAA,GAAG,SAAS,IAAI,IACjF;GACJ,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CAAG,OAAO,OAAU,EAAA,CAAA;EAC7B;;;;EC3KA,SAAgB,iBAAiB,OAYnB;GACZ,MAAM,YAAA,GAAWC,MAAAA,OAAAA,CAAyB,IAAI;GAC9C,MAAM,iBAAiB,MAAM,cAAc,OACvC,EAAE,iBAAiB,GAAG,IACtB,KAAA;GACJ,MAAM,OAAO,MAAM,SAAS;GAC5B,MAAM,SACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;IACE,MAAK;IACL,WAAW,MAAM,aAAaC,4BAAG;IACjC,UAAU,MAAM,aAAa,QAAQ;IACrC,eAAe,SAAS,SAAS,MAAM;IAJzC,UAAA,CAMG,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,WAAWA,4BAAG;KAAS,eAAY;IAAQ,CAAA,GACzD,OAAO,MAAM,aAAa,MAAM,QAAQ,MAAM,KACzC;;GAEV,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;IACE,KAAK;IACL,MAAK;IACL,QAAQ,MAAM;IACd,UAAU,MAAM,aAAa,QAAQ,MAAM,cAAc;IACzD,cAAY,MAAM;IAClB,UAAU;IACV,UAAU,MAAM,aAAa,QAAQ;IACrC,WAAWA,4BAAG;IACd,GAAI;IACJ,WAAW,UAAU;KACnB,MAAM,QAAQ,MAAM,KAAK,MAAM,OAAO,SAAS,CAAC,CAAC;KACjD,MAAM,OAAO,QAAQ;KACrB,IAAI,MAAM,SAAS,GAAG,MAAM,QAAQ,KAAK;IAC3C;GACD,CAAA,GACA,MAAM,UAAU,KAAA,IAAY,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;IAAa,OAAO,MAAM;IAAQ,UAAA;GAAoB,CAAA,CAC5F,EAAA,CAAA;EAEN;;;;;;;EC3CA,MAAa,qBAAA,GAAoBC,MAAAA,KAAAA,CAAK,SAAS,kBAAkB,OAYnD;GACZ,MAAM,EAAE,GAAG,SAAS,YAAY,SAAS;GACzC,MAAM,gBAAgB,eAAe,KAAA;GACrC,MAAM,kBAAkB,QAAQ,MAAM,oBAAoB,QAAQ;GAClE,MAAM,SAAS,SAAS;GACxB,MAAM,SAAS,QAAQ,eAAe,CAAC;GACvC,MAAM,WAAW,QAAQ,YAAY,QAAQ,SAAS,KAAK,aAAa,SAAS,KAAK,CAAC;GACvF,MAAM,QAAQ,QAAQ,YAAY,QAAQ,SAAS,KAAK,aAAa,MAAM,KAAK,CAAC;GACjF,MAAM,WAAW,QAAQ,QAAQ,QAAQ,UAAU,MAAM,mBAAmB,UAAU,KAAK,CAAC;GAC5F,MAAM,gBAAgB,SAAS,oBAAoB,OAAO,MAAM,UAAU,MAAM,QAAQ,CAAC,EAAE,eAAe,OAAO,EAAE,EAAE,eAAe;GAEpI,MAAM,SAAS,QAAQ,QAAQ,YAAY,MAAM,QAAQ,QAAQ,eAAe,MAAM,QAAQ,QAAQ,YAAY;GAClH,MAAM,cAAc,SAAS,SAAS,KAAK,MAAM,SAAS,KAAK,SAAS,SAAS,KAAK,QAAQ;GAC9F,MAAM,eAAe,IAAY,aAC9B;IAAE,OAAO;IAAI,OAAO,EAAE,6BAA6B;KAAE;KAAI;IAAQ,CAAC;GAAE;;GAEvE,MAAM,YAAY,QAAiB,WAChC,WAAW,KAAA,KAAa,WAAW,KAAA,IAChC,OAEA,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;IAAO,WAAWC,4BAAU;IAA5B,UAAA;KACG,WAAW,KAAA,IAAY,OAAO,EAAE,4BAA4B,EAAE,OAAO,CAAC;KACtE,WAAW,KAAA,KAAa,WAAW,KAAA,IAAY,QAAQ;KACvD,WAAW,KAAA,IAAY,OAAO,EAAE,4BAA4B,EAAE,OAAO,CAAC;IAClE;;GAEb,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWA,4BAAU;IAA1B,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,4BAAU;MACxB,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,qBAAqB,EAAM,CAAA,GACjC,gBACG,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,4BAA4B,EAAE,QAAQ,WAAW,cAAc,GAAG,CAAC,EAAK,CAAA,IAE9E,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UACG,WAAW,KAAA,IACR,OACA,EAAE,yBAAyB;OAC3B,QAAQ,OAAO,QAAQ;OAAQ,WAAW,OAAO,QAAQ;OAAW,UAAU,OAAO,QAAQ;OAC7F,UAAU,OAAO,QAAQ;OAAU,aAAa,OAAO,QAAQ;OAAa,UAAU,OAAO,QAAQ;MACvG,CAAC,EACF,CAAA,CAEJ,EAAA,CAAA;KACF,CAAA;KACJ,iBACC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,sBAAsB,EAAQ,CAAA,GACvC,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;MACE,OAAM;MACN,SAAS,WAAW,WAAW,KAAK,cAAc,YAAY,UAAU,aAAa,UAAU,OAAO,CAAC;MACvG,UAAU,MAAM;MAChB,WAAW,EAAE,0BAA0B;MACvC,aAAa,EAAE,yBAAyB;MACxC,UAAU;KACX,CAAA,CACE,EAAA,CAAA;KAEN,CAAC,iBAAiB,OAAO,SAAS,KACjC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,sBAAsB,EAAQ,CAAA,GACvC,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;MAAY,OAAO;MAAe,SAAS,OAAO,KAAK,UAAU,YAAY,MAAM,aAAa,MAAM,OAAO,CAAC;MAC5G,UAAU,MAAM;MAAe,WAAW,EAAE,0BAA0B;MAAG,UAAU;KAAO,CAAA,CACzF,EAAA,CAAA;KAEN,CAAC,iBAAiB,WAAW,KAAA,KAAa,SAAS,SAAS,KAC3D,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,4BAAU;MAA1B,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWA,4BAAU;OAAoB,UAAA,EAAE,wBAAwB,EAAE,OAAO,SAAS,OAAO,CAAC;MAAK,CAAA,GAErG,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAI,WAAWA,4BAAU;OAAa,yBAAA;OAAsB,UAAU;OAAG,cAAY,EAAE,4BAA4B,EAAE,OAAO,SAAS,OAAO,CAAC;OAC1I,UAAA,SAAS,KAAK,SACb,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;QAAI,WAAWA,4BAAU;QAAzB,UAAA,CACG,KAAK,SACL,SAAS,KAAK,SAAS,KAAK,QAAQ,CACnC;OAHuC,GAAA,GAAG,KAAK,KAAK,GAAG,KAAK,WAAW,IAGvE,CACL;MACC,CAAA,CACD;;KAEN,CAAC,iBAAiB,WAAW,KAAA,KAAa,MAAM,SAAS,KACxD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,4BAAU;MAA1B,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWA,4BAAU;OAAoB,UAAA,EAAE,sBAAsB,EAAE,OAAO,MAAM,OAAO,CAAC;MAAK,CAAA,GAChG,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAI,WAAWA,4BAAU;OAAa,sBAAA;OAAmB,UAAU;OAAG,cAAY,EAAE,0BAA0B,EAAE,OAAO,MAAM,OAAO,CAAC;OAClI,UAAA,MAAM,KAAK,SACV,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;QAAI,WAAWA,4BAAU;QAAzB,UAAA,CACG,KAAK,SACL,SAAS,KAAK,SAAS,KAAK,QAAQ,CACnC;OAHuC,GAAA,GAAG,KAAK,KAAK,GAAG,KAAK,WAAW,IAGvE,CACL;MACC,CAAA,CACD;;KAEN,CAAC,iBAAiB,WAAW,KAAA,KAAa,SAAS,SAAS,KAC3D,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,4BAAU;MAA1B,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWA,4BAAU;OAAoB,UAAA,EAAE,0BAA0B,EAAE,OAAO,SAAS,OAAO,CAAC;MAAK,CAAA,GACvG,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAI,WAAWA,4BAAU;OAAa,yBAAA;OAAsB,UAAU;OAAG,cAAY,EAAE,8BAA8B,EAAE,OAAO,SAAS,OAAO,CAAC;OAC5I,UAAA,SAAS,KAAK,OAAO,UACpB,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;QAAI,WAAWA,4BAAU;QAAzB,UAAA,CACG,EAAE,8BAA8B;SAAE,QAAQ,MAAM;SAAU,OAAO,MAAM,MAAM,KAAK,IAAI;QAAE,CAAC,GACzF,SAAS,MAAM,UAAU,CACxB;OAHuC,GAAA,GAAG,MAAM,SAAS,GAAG,OAG5D,CACL;MACC,CAAA,CACD;;KAEN,CAAC,iBAAiB,WAAW,KAAA,KAAa,CAAC,eAAe,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,oBAAoB,EAAK,CAAA;KACzF,CAAC,iBAAiB,QAAQ,cAAc,QACvC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UACG,EAAE,2BAA2B;MAC5B,SAAS,OAAO,QAAQ;MACxB,aAAa,OAAO,YAAY;MAChC,QAAQ,OAAO,QAAQ;KACzB,CAAC,EACA,CAAA;KAEJ,CAAC,MAAM,eAAe,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACrB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,WAAWA,4BAAU;MAAa,UAAU;MAAiB,SAAS,MAAM;MAC/F,UAAA,EAAE,uBAAuB;KACpB,CAAA,GACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,WAAWA,4BAAU;MAAY,UAAU;MAAM,SAAS,MAAM;MACnF,UAAA,EAAE,sBAAsB;KACnB,CAAA,CACL,EAAA,CAAA;IACF;;EAET,CAAC;;;;;;;;;;;;;;;;;;;;;;;;ECzID,SAAgB,aAAa,OAwBf;GACZ,MAAM,EAAE,GAAG,OAAO,SAAS,SAAS,aAAa;GACjD,MAAM,CAAC,YAAY,kBAAA,GAAiBC,MAAAA,SAAAA,CAAS,KAAK;GAClD,MAAM,CAAC,aAAa,mBAAA,GAAkBA,MAAAA,SAAAA,CAAS,KAAK;GACpD,MAAM,YAAA,GAAWC,MAAAA,OAAAA,CAA6B,IAAI;GAClD,MAAM,cAAA,GAAaA,MAAAA,OAAAA,CAA2B,IAAI;GAClD,MAAM,MAAA,GAAKC,MAAAA,MAAAA,CAAM;GACjB,MAAM,UAAU,SAAS;GACzB,MAAM,OAAO,UAAU;GACvB,MAAM,WAAW,UAAU;GAC3B,MAAM,UAAU,QAAQ,aAAa,KAAA,KAAc,QAAQ,SAAS,UAAU,OAAO,uBAAuB,KAAK,QAAQ,QAAQ;GACjI,MAAM,QAAQ,UAAU,gBAAgB,YAAY,KAAA,KAAa,YAAY,QAAQ,eAAe,KAAA,KAAa,QAAQ,WAAW,KAAK,CAAC,CAAC,SAAS;GACpJ,MAAM,cAAoB;IAAE,IAAI,CAAC,MAAM,MAAM,QAAQ;GAAE;GACvD,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,IAAI,MAAM,OAAO,SAAS,SAAS,MAAM;GAAE,GAAG,CAAC,MAAM,KAAK,CAAC;GAC7E,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,cAAc,KAAK;GAAE,GAAG,CAAC,SAAS,iBAAiB,KAAK,CAAC;GAC3E,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,eAAe,KAAK;GAAE,GAAG,CAAC,MAAM,WAAW,CAAC;GAC9D,MAAM,gBAAgB,SAAS,SAAS,sBAAsB,SAAS,SAAS;GAChF,MAAM,eAAe,QAAQ,cAAc,OAAO,EAAE,oBAAoB,IAAI,EAAE,MAAM,gBAAgB,WAAW,gBAAgB,oCAAoC,6BAA6B,6BAA6B;GAC7N,IAAI,YAAY,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;IAAe,OAAO,EAAE,8BAA8B,EAAE,MAAM,SAAS,cAAc,QAAQ,cAAc,GAAG,CAAC;IACpI,aAAa,EAAE,MAAM,gBAAgB,cAAc,iCAAiC,2BAA2B;IACjG;IAAc,aAAa,EAAE,kBAAkB;IAC7D,gBAAgB,cAAc,KAAK;IAAG,iBAAiB;KAAE,cAAc,KAAK;KAAG,MAAM,UAAU;IAAE;GAAI,CAAA;GACvG,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;IAAe,OAAO,EAAE,MAAM,gBAAgB,WAAW,4BAA4B,4BAA4B;IACtH,YAAY,EAAE,mBAAmB;IAAG,SAAS;IAAO,MAAK;IAAO,iBAAiB;IACjF,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAA,kBAAA,UAAA,EAAA,UACL,WAAW,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACV,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAQ,MAAK;KAAS,WAAWC,4BAAU;KAAY,SAAS;KAAQ,UAAA,EAAE,kBAAkB;IAAU,CAAA,GACrG,MAAM,eAAe,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAQ,MAAK;KAAS,WAAWA,4BAAU;KAAa,SAAS,MAAM;KAAY,UAAA,EAAE,qBAAqB;IAAU,CAAA,IACtI,MAAM,SAAS,SAAS,WAAW,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAQ,MAAK;KAAS,WAAWA,4BAAU;KAAa,SAAS,MAAM;KAAQ,UAAA,EAAE,MAAM,gBAAgB,WAAW,uBAAuB,mBAAmB;IAAU,CAAA,IAAI,IACrN,EAAA,CAAA,IAAI,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;KACH,UAAU,UAAU,SAAS,SAAS,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,WAAWA,4BAAU;MAAY,UAAU;MAAM,SAAS,MAAM;MAAU,UAAA,EAAE,sBAAsB;KAAU,CAAA;KAC7K,SAAS,QAAQ,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,WAAWA,4BAAU;MAAY,UAAU;MAAM,SAAS,MAAM;MAAS,UAAA,EAAE,kBAAkB;KAAU,CAAA;KACpJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,WAAWA,4BAAU;MAAY,UAAU;MAAM,SAAS,SAAS,QAAQ,IAAI,MAAM,QAAQ;MAAQ,UAAA,EAAE,SAAS,QAAQ,IAAI,oBAAoB,oBAAoB;KAAU,CAAA;KAClM,UAAU,WAAW,UAAU,UAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,WAAWA,4BAAU;MAAa,SAAS,MAAM;MAAc,UAAA,EAAE,uBAAuB;KAAU,CAAA,IAChK,UAAU,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,WAAWA,4BAAU;MAAa,UAAU,CAAC;MAAO,eAAe,QAAQ,YAAY,cAAc,IAAI,IAAI,MAAM,UAAU;MAAI,UAAA;KAAqB,CAAA;IACpM,EAAA,CAAA,EACF,CAAA;IACF,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAWC,gCAAI;KAAS,aAAW,UAAU,aAAa;KAA/D,UAAA;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAI,KAAK;OAAY,UAAU;OAAI,WAAWA,gCAAI;OAAU,UAAA,EAAE,WAAW,uBAAuB,UAAU,SAAS,uBAAuB,qBAAqB;MAAM,CAAA;MACrK,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAI,WAAWA,gCAAI;OAAO,cAAY,EAAE,mBAAmB;OACvD,UAAA;QAAC;QAAsB;QAAuB;OAAoB,CAAC,CAAW,KAAK,KAAK,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;QAAc,gBAAc,UAAU,WAAW,IAAI,UAAU,SAAS,IAAI,KAAK,SAAS,KAAA;QAAY,UAAA,EAAE,GAAG;OAAM,GAAxG,GAAwG,CAAC;MACnN,CAAA;MACH,SAAS,QAAQ,KAAK,CAAC,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,qBAAqB;OAAE,OAAO,SAAS;OAAO,OAAO,SAAS;MAAM,CAAC,EAAK,CAAA;MACnH,UAAU,SAAS,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;OAClB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,qBAAqB,EAAK,CAAA;OAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,qBAAqB,EAAK,CAAA;OACjE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,gCAAI;QAApB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;SAAkB,OAAO,EAAE,kBAAkB;SAAG,WAAW,EAAE,kBAAkB;SAAG,QAAO;SAA6B,UAAU,MAAM,gBAAgB;SAAa,UAAU,UAAU,MAAM,QAAQ,OAAO,KAAK;QAAI,CAAA,GACrN,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;SAAkB,OAAO,EAAE,oBAAoB;SAAG,WAAW,EAAE,oBAAoB;SAAG,WAAA;SAAU,UAAU,UAAU,MAAM,QAAQ,OAAO,IAAI;QAAI,CAAA,CAC9I;;MACL,EAAA,CAAA,IAAI,WAAW,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;OACf,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,MAAK;QAAU,UAAA,EAAE,sBAAsB;SAAE,UAAU,SAAS;SAAU,SAAS,SAAS;SAAS,QAAQ,SAAS;QAAO,CAAC;OAAK,CAAA;OACjI,SAAS,SAAS,SAAS,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,SAAS,SAAS,KAAK,SAAS,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAiB,QAAY,GAApB,KAAoB,CAAC,EAAM,CAAA;OACnH,MAAM,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,MAAK;QAAS,UAAA,EAAE,6BAA6B,EAAE,QAAQ,MAAM,aAAa,CAAC;OAAK,CAAA;MAC1G,EAAA,CAAA,IAAI,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;OACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,sBAAsB,EAAE,MAAM,SAAS,cAAc,MAAM,WAAW,CAAC,EAAK,CAAA;OACjF,MAAM,gBAAgB,cAAc,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,+BAA+B,EAAK,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAWA,gCAAI;QAAQ,KAAK,MAAM;QAAa,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,cAAc,MAAM,WAAW,CAAC;QAAG,eAAe,eAAe,IAAI;OAAI,CAAA;QAC5P,UAAU,aAAa,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,MAAK;QAAU,UAAA,EAAE,OAAO,2BAA2B,qBAAqB;OAAK,CAAA;OACjH,MAAM,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,KAAK;QAAU,UAAU;QAAI,MAAK;QAAQ,WAAWD,4BAAU;QAAe,UAAA,UAAU,UAAU,GAAG,EAAE,mBAAmB,EAAE,GAAG,MAAM,UAAU,MAAM;OAAS,CAAA;OAChL,MAAM,UAAU,KAAA,KAAa,iBAAA,GAAA,kBAAA,KAAA,CAAC,YAAD,EAAA,UAAA,CAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,kBAAkB,EAAU,CAAA,GAAE,MAAM,MAAM,KAAK,SAAS,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;QAAkB,WAAWC,gCAAI;QAAjC,UAAA,CAAyC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;SAAO,MAAK;SAAQ,MAAM,GAAG,GAAG;SAAQ,SAAS,QAAQ,eAAe;SAAM,gBAAgB,MAAM,UAAU,EAAE,YAAY,KAAK,CAAC;QAAI,CAAA,GAAE,EAAE,oBAAoB,MAAM,CAAS;OAA1M,GAAA,IAA0M,CAAC,CAAY,EAAA,CAAA;OAC7U,YAAY,KAAA,KAAa,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;QACxB,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;SAAI,EAAE,oBAAoB,QAAQ,MAAM;SAAE;SAAI,EAAE,uBAAuB;UAAE,OAAO,QAAQ,MAAM;UAAQ,OAAO,QAAQ,MAAM,QAAQ,OAAO,SAAS,QAAQ,KAAK,OAAO,CAAC;UAAG,SAAS,QAAQ;SAAY,CAAC;QAAK,EAAA,CAAA;QAC9M,iBAAA,GAAA,kBAAA,KAAA,CAAC,YAAD;SAAU,UAAU;SAAM,WAAWA,gCAAI;SAAzC,UAAA;UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,oBAAoB,EAAU,CAAA;UACzC,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,EAAE,kBAAkB,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;WAAO,OAAO,QAAQ,cAAc,QAAQ;WAAY,WAAW,UAAU,MAAM,UAAU,EAAE,YAAY,MAAM,OAAO,MAAM,CAAC;WAAG,gBAAc,QAAQ,YAAY,KAAK,MAAM;UAAK,CAAA,CAAQ,EAAA,CAAA;UAC1N,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CAAQ,EAAE,gBAAgB,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;WAAO,OAAO,QAAQ,YAAY,QAAQ;WAAU,WAAW,UAAU,MAAM,UAAU,EAAE,UAAU,MAAM,OAAO,MAAM,CAAC;WAAG,gBAAc,CAAC;WAAS,oBAAkB,CAAC,UAAU,GAAG,GAAG,YAAY,KAAA;UAAY,CAAA,CAAQ,EAAA,CAAA;UAClP,CAAC,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;WAAG,IAAI,GAAG,GAAG;WAAW,MAAK;WAAS,UAAA,EAAE,uBAAuB;UAAK,CAAA;UACjF,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;WAAO,WAAWA,gCAAI;WAAtB,UAAA,CAA8B,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YAAO,MAAK;YAAQ,MAAM,GAAG,GAAG;YAAU,SAAS,CAAC,QAAQ;YAAW,gBAAgB,MAAM,UAAU;aAAE,WAAW;aAAO,UAAU,KAAA;YAAU,CAAC;WAAI,CAAA,GAAE,EAAE,iBAAiB,CAAS;;UAChN,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;WAAO,WAAWA,gCAAI;WAAtB,UAAA,CAA8B,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YAAO,MAAK;YAAQ,MAAM,GAAG,GAAG;YAAU,SAAS,QAAQ,cAAc;YAAM,UAAU,MAAM,QAAQ,WAAW;YAAG,gBAAgB,MAAM,UAAU;aAAE,WAAW;aAAM,UAAU,MAAM,QAAQ,EAAE,EAAE;YAAG,CAAC;WAAI,CAAA,GAAE,EAAE,sBAAsB,CAAS;;UAC5Q,QAAQ,aAAa,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CAAM,EAAE,sBAAsB,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;WAAY,OAAO,QAAQ,YAAY;WAAI,WAAW,EAAE,sBAAsB;WAAG,UAAU;WAAM,WAAW,aAAa,MAAM,UAAU,EAAE,SAAS,CAAC;WAAG,SAAS,MAAM,QAAQ,KAAK,YAAY;YAAE,OAAO,OAAO;YAAI,OAAO,GAAG,OAAO,KAAK,KAAK,OAAO;WAAK,EAAE;UAAI,CAAA,CAAM,EAAA,CAAA;SACrT;;QACV,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,QAAQ,YAAY,MAAM,gBAAgB,cAAc,iCAAiC,8BAA8B,qBAAqB,EAAK,CAAA;QACvJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD,EAAA,UAAA,CAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD,EAAA,UAAU,EAAE,qBAAqB,EAAE,OAAO,QAAQ,MAAM,OAAO,CAAC,EAAW,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;SAAI,WAAWA,gCAAI;SAAQ,UAAA,QAAQ,MAAM,KAAK,SAAS,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA,CAAoB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,KAAK,KAAW,CAAA,GAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA;UAAO,KAAK;UAAM;UAAM,EAAE,QAAQ,YAAY,wBAAwB,iBAAiB;SAAQ,EAAA,CAAA,CAAK,EAAA,GAAvI,KAAK,IAAkI,CAAC;QAAM,CAAA,CAAU,EAAA,CAAA;QAC5S,QAAQ,SAAS,SAAS,KAAK,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;SAAS,MAAA;SAAT,UAAA,CAAc,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD,EAAA,UAAU,EAAE,sBAAsB,EAAW,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,QAAQ,SAAS,KAAK,SAAS,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAiB,QAAY,GAApB,KAAoB,CAAC,EAAM,CAAA,CAAU;;OACxL,EAAA,CAAA;QACA,YAAY,KAAA,KAAa,MAAM,eAAe,KAAA,MAAc,iBAAA,GAAA,kBAAA,IAAA,CAAC,mBAAD;QAAsB;QAAG,SAAS,YAAY,KAAA,IAAY,KAAA,IAAY;SAAE,GAAG;SAAS,kBAAkB,QAAQ,0BAA0B,QAAQ;QAAiB;QAAG,YAAY,MAAM;QAAkB;QAAM,aAAA;QAAY,gBAAgB,gBAAgB,MAAM,UAAU,EAAE,wBAAwB,YAAY,CAAC;QAAG,WAAW,MAAM;QAAW,UAAU;OAAQ,CAAA;OAC/Z,CAAC,SAAS,UAAU,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,MAAK;QAAU,UAAA,EAAE,yBAAyB;OAAK,CAAA;MACvF,EAAA,CAAA;KACC;;GACQ,CAAA;EACjB;;;;;;;;;;;;;;;;EC5GA,SAAgB,UAAU,OAA2C;GACnE,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IAAG,WAAWC,6BAAI;IAAK,aAAW,MAAM;IAAM,eAAY;GAAQ,CAAA;EAC3E;;;;;;;;;;;;;;;;ECCA,SAAgB,YAAY,OAKd;GACZ,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;IAAM,WAAW,KAAKC,+BAAI,OAAO,MAAM,SAAS;IAAG,cAAY,MAAM;IAArE,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD,EAAW,MAAM,MAAM,KAAO,CAAA,GAC9B,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,KAAD;KAAK,MAAM,MAAM;KAAO,UAAA,MAAM;IAAW,CAAA,CACrC;;EAEV;;;;;;;;;;;;;;;;;;;ECJA,MAAMC,OAAK;GAAE,GAAGC;GAAW,GAAGC;EAAW;EAUzC,MAAa,kBAAA,GAAiBC,MAAAA,KAAAA,CAAK,SAAS,eAAe,OAA4F;GACrJ,MAAM,EAAE,OAAO,MAAM;GACrB,MAAM,CAAC,kBAAkB,wBAAA,GAAuBC,MAAAA,SAAAA,CAA6B,KAAA,CAAS;GACtF,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAA6B,KAAA,CAAS;GAC9D,MAAM,CAAC,YAAY,kBAAA,GAAiBA,MAAAA,SAAAA,CAAS,KAAK;GAClD,MAAM,CAAC,YAAY,kBAAA,GAAiBA,MAAAA,SAAAA,CAA8B,CAAC,CAAC;GACpE,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAS,IAAI;GAC3C,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAS,EAAE;GAC7C,MAAM,gBAAA,GAAeC,MAAAA,OAAAA,CAAO,CAAC;GAC7B,MAAM,cAAA,GAAaA,MAAAA,OAAAA,CAAuB,IAAI;GAE9C,MAAM,iBAAiB,OAAO,eAAe,UAAyB;IACpE,MAAM,WAAW,EAAE,aAAa;IAChC,WAAW,IAAI;IACf,aAAa,EAAE;IACf,MAAM,MAAM,MAAM,WAAW,gBAAgB;IAC7C,IAAI,aAAa,aAAa,SAAS;IACvC,IAAI,IAAI,IAAI,cAAc,IAAI,MAAM,UAAU;SACzC,aAAa,IAAI,WAAW,EAAE,sBAAsB,CAAC;IAC1D,WAAW,KAAK;IAChB,IAAI,CAAC,IAAI,MAAM,cAAc,MAAM,IAAI,MAAM,IAAI,WAAW,EAAE,sBAAsB,CAAC;GACvF;GACA,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,eAAoB;IACpB,aAAa;KAAE,aAAa,WAAW;IAAE;GAC3C,GAAG,CAAC,CAAC;GACL,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,IAAI,CAAC,SAAS,MAAM,UAAU;GAAE,GAAG,CAAC,SAAS,MAAM,OAAO,CAAC;GAG7E,MAAM,OAAO,qBAAqB;IAChC,mBAAmB,EAAE,+BAA+B;IACpD,UAAU,YAAY,aAAa,oBAAoB,OAAO;IAC9D,SAAS,YAAY,YAAY,oBAAoB,OAAO;IAC5D,aAAa,OAAO,UAAU;KAC5B,MAAM,WAAW,MAAM,EAAE,4BAA4B,EAAE,MAAM,SAAS,GAAG,CAAC,CAAC;KAC3E,MAAM,eAAe,IAAI;IAC3B;IACA,UAAU,SAAS,UAAU;KAC3B,MAAM,WAAW,SAAS,EAAE,kCAAkC,EAAE,QAAQ,QAAQ,EAAE,qBAAqB,IAAI,QAAQ,CAAC,CAAC;IACvH;GACF,CAAC;;GAGD,MAAM,YAAY,OAAO,OAA8B;IACrD,QAAQ,EAAE;IACV,IAAI;KACF,MAAM,MAAM,MAAM,WAAW,mBAAmB,EAAE,GAAG,CAAC;KACtD,IAAI,IAAI,IAAI;MACV,MAAM,WAAW,MAAM,EAAE,6BAA6B,EAAE,OAAO,IAAI,MAAM,MAAM,CAAC,CAAC;MACjF,MAAM,MAAM,KAAK;MACjB,MAAM,eAAe;KACvB,OACE,MAAM,WAAW,SAAS,EAAE,iCAAiC,EAAE,QAAQ,IAAI,WAAW,8BAA8B,CAAC,CAAC;IAE1H,UAAU;KACR,QAAQ,KAAA,CAAS;IACnB;GACF;;GAGA,MAAM,aAAa,OAAO,OAA8B;IACtD,QAAQ,EAAE;IACV,IAAI;KACF,MAAM,MAAM,MAAM,WAAW,oBAAoB,EAAE,GAAG,CAAC;KACvD,IAAI,IAAI,IAAI;MACV,MAAM,WAAW,MAAM,EAAE,6BAA6B,EAAE,OAAO,IAAI,MAAM,MAAM,CAAC,CAAC;MACjF,MAAM,MAAM,KAAK;MACjB,MAAM,eAAe;KACvB,OACE,MAAM,WAAW,SAAS,EAAE,kCAAkC,EAAE,QAAQ,IAAI,WAAW,8BAA8B,CAAC,CAAC;IAE3H,UAAU;KACR,QAAQ,KAAA,CAAS;IACnB;GACF;GAEA,MAAM,aAAa,OAAO,OAA8B;IACtD,MAAM,MAAM,MAAM,WAAW,oBAAoB,EAAE,GAAG,CAAC;IACvD,IAAI,IAAI,IAAI;KACV,MAAM,WAAW,MAAM,EAAE,6BAA6B,EAAE,GAAG,CAAC,CAAC;KAC7D,MAAM,eAAe;KACrB,qBAAqB,YAAY,YAAY,KAAK,KAAA,IAAY,OAAO;IACvE,OACE,MAAM,IAAI,MAAM,EAAE,kCAAkC,EAAE,QAAQ,IAAI,WAAW,8BAA8B,CAAC,CAAC;GAEjH;GAEA,MAAM,eAAe,OAAO,OAA8B;IACxD,MAAM,MAAM,MAAM,WAAW,cAAc,EAAE,IAAI,gBAAgB,KAAK,CAAC;IACvE,IAAI,IAAI,IAAI,MAAM,WAAW,MAAM,EAAE,4BAA4B,EAAE,MAAM,IAAI,MAAM,KAAK,CAAC,CAAC;SACrF,MAAM,WAAW,SAAS,EAAE,gCAAgC,EAAE,QAAQ,IAAI,WAAW,8BAA8B,CAAC,CAAC;GAC5H;GAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAWL,KAAG;IAAS,cAAY,EAAE,iBAAiB;IAA/D,UAAA;KACG,cAAc,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;MAAiB;MAAG,aAAY;MAAY,GAAI;MAAM,SAAS;MAC5E,UAAU,OAAO,cAAc;OAAE,KAAU,IAAI,OAAO,YAAY,YAAY,OAAO;MAAE;MAAG,WAAW,KAAK;MAC1G,iBAAiB;OAAE,KAAU,QAAQ;MAAE;MAAG,eAAe;OAAE,KAAK,OAAO;OAAG,cAAc,KAAK;MAAE;MAAG,SAAS,KAAK;MAChH,QAAQ,KAAK;MAAM,OAAO,KAAK;MAAK,mBAAmB;OAAE,KAAU,UAAU;MAAE;MAAG,iBAAiB;OAAE,KAAU,aAAa;MAAE;MAC9H,OAAO,KAAK,gBAAgB,KAAA,IAAY,KAAA,UAAkB;OAAE,UAAe,KAAK,WAAY;OAAG,KAAK,OAAO;OAAG,cAAc,KAAK;MAAE;KAAI,CAAA;KACzI,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,KAAK;MAAY,WAAWA,KAAG;MAClC,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,KAAG;OAAnB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;QAAM,WAAWA,KAAG;QAApB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,0BAA0B,EAAU,CAAA,GAC/C,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,EAAE,yBAAyB,EAAS,CAAA,CACxC;OACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,KAAG;QAClB,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAWA,KAAG;SAAa,eAAe,cAAc,IAAI;SAAlF,UAAA,CAAsF,EAAE,4BAA4B,GAAE,GAAS;;OAC3H,CAAA,CACH;;KACF,CAAA;KAEJ,aAAa,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;MAAG,WAAWA,KAAG;MAAa,MAAK;MAAnC,UAAA;OAA4C;OAAU;OAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,KAAG;QAAY,eAAe,KAAK,eAAe;QAAI,UAAA,EAAE,iBAAiB;OAAU,CAAA;MAAI;;KAC5L,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;MAAU,UAAA,EAAE,aAAa;KAAK,CAAA;KACjD,CAAC,WAAW,CAAC,aAAa,WAAW,WAAW,IAC/C,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,KAAG;MAAnB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,KAAG;OAAY,eAAY;OAAO,UAAA;MAAO,CAAA,GAC1D,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,wBAAwB,EAAM,CAAA;OACrC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,uBAAuB,EAAK,CAAA;OAClC,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,KAAG;QAAY,eAAe,cAAc,IAAI;QAAjF,UAAA,CAAqF,EAAE,4BAA4B,GAAE,GAAS;;MAC3H,EAAA,CAAA,CACF;KAEL,CAAA,IAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,KAAG;MAChB,UAAA,WAAW,KAAK,SAAS;OACxB,MAAM,aAAa,qBAAqB,KAAK;OAC7C,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;QAAuB,WAAWA,KAAG;QAArC,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAWA,KAAG;SAAnB,UAAA;UACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;WAAM,WAAWA,KAAG;WAApB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,WAAWA,KAAG;YAAiB,UAAA,KAAK;WAAa,CAAA,GACxD,KAAK,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;YAAa,WAAWA,KAAG;YAAiB,MAAK;YAAU,OAAO,EAAE,2BAA2B;WAAI,CAAA,CACjH;;UACL,KAAK,gBAAgB,KAAA,KAAa,KAAK,YAAY,SAAS,KACxD,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;WAAG,WAAWA,KAAG;WAAiB,UAAA,KAAK;UAAe,CAAA;UAC3D,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,KAAG;WAAe,UAAA,KAAK;UAAS,CAAA;SAC9C;QACL,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;SAAM,WAAWA,KAAG;SAApB,UAAA;UACG,KAAK,WACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,MAAK;WAAS,WAAWA,KAAG;WAAY,gBAAa;WAAY,UAAU,SAAS,KAAK;WAC/F,eAAe,KAAK,WAAW,KAAK,EAAE;WACrC,UAAA,SAAS,KAAK,KAAK,EAAE,qBAAqB,IAAI,EAAE,mBAAmB;UAC9D,CAAA,IAER,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,MAAK;WAAS,WAAWA,KAAG;WAAa,UAAU,SAAS,KAAK;WACvE,eAAe,KAAK,UAAU,KAAK,EAAE;WACpC,UAAA,SAAS,KAAK,KAAK,EAAE,sBAAsB,IAAI,EAAE,kBAAkB;UAC9D,CAAA;UAEV,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;WAAa,OAAO,EAAE,0BAA0B;WAC9C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,MAAK;YAAS,WAAWA,KAAG;YAClC,cAAY,EAAE,2BAA2B,EAAE,MAAM,KAAK,KAAK,CAAC;YAC5D,eAAe,KAAK,aAAa,KAAK,EAAE;YACxC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACM,sCAAAA,8BAAD,CAA+B,CAAA;WACzB,CAAA;UACG,CAAA;UACZ,cACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;WAAe,OAAO,EAAE,oBAAoB,EAAE,MAAM,KAAK,KAAK,CAAC;WAC7D,aAAa,EAAE,iCAAiC,EAAE,MAAM,KAAK,KAAK,CAAC;WACnE,cAAc,EAAE,0BAA0B;WAAG,aAAa,EAAE,mBAAmB;WAC/E,iBAAiB,WAAW,KAAK,EAAE;WAAG,gBAAgB,qBAAqB,YAAY,YAAY,KAAK,KAAK,KAAA,IAAY,OAAO;UAAI,CAAA;UAGtI,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;WAAa,OAAO,EAAE,yBAAyB;WAC7C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,MAAK;YAAS,WAAWN,KAAG;YAClC,cAAY,EAAE,0BAA0B,EAAE,MAAM,KAAK,KAAK,CAAC;YAC3D,eAAe,oBAAoB,KAAK,EAAE;YAC1C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACO,sCAAAA,yBAAD,CAA0B,CAAA;WACpB,CAAA;UACG,CAAA;SAEX;QACC,CAAA,CAAA;OA7CK,GAAA,KAAK,EA6CV;MAEb,CAAC;KACE,CAAA;IAEA;;EAEb,CAAC;;;;;;;;ECvMD,SAAgB,oBAAuB,OAAwB,UAAoC;GACjG,MAAM,UAAA,GAASC,MAAAA,qBAAAA,CAAqB,MAAM,iBAAiB,MAAM,WAAW,MAAM,SAAS;GAC3F,MAAM,SAAA,GAAQC,MAAAA,OAAAA,CAAiD;IAAE,QAAQ,KAAA;IAAW,OAAO,KAAA;GAA0B,CAAC;GACtH,IAAI,MAAM,QAAQ,WAAW,QAC3B,MAAM,UAAU;IAAE;IAAQ,OAAO,SAAS,MAAM;GAAE;GAEpD,OAAO,MAAM,QAAQ;EACvB;;;;;;;;;;;;;;;;;;;;;;ECRA,SAAgB,mBAAmB,OAAyG;GAC1I,MAAM,EAAE,GAAG,WAAW;GACtB,MAAM,MAAA,GAAKC,MAAAA,MAAAA,CAAM;GACjB,MAAM,CAAC,MAAM,YAAA,GAAWC,MAAAA,SAAAA,CAA+B,KAAK;GAC5D,MAAM,CAAC,eAAe,qBAAA,GAAoBA,MAAAA,SAAAA,CAAgD,CAAC,CAAC;GAC5F,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAA6B;GAC3D,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAiE,SAAS;GACpG,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAS,EAAE;GACrC,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAS,CAAC;GACpC,MAAM,WAAA,GAAUC,MAAAA,OAAAA,CAAO,CAAC;GACxB,MAAM,SAAA,GAAQA,MAAAA,OAAAA,CAAO,KAAK;GAC1B,MAAM,WAAA,GAAUA,MAAAA,OAAAA,CAAO,KAAK;GAC5B,MAAM,YAAA,GAAWA,MAAAA,OAAAA,CAA6B,IAAI;GAClD,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,IAAI,OAAO,SAAS,SAAS,MAAM;GAAE,GAAG,CAAC,KAAK,CAAC;GACjE,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,WAAW,EAAE,QAAQ;IAC3B,MAAM,UAAU;IAChB,SAAS,SAAS;IAClB,SAAS,EAAE;IACX,WAAgB,gBAAgB;KAAE,IAAI,OAAO;KAAI;KAAM;KAAe,SAAS;IAAK,CAAC,CAAC,CAAC,MAAM,aAAa;KACxG,IAAI,aAAa,QAAQ,SAAS;KAClC,IAAI,CAAC,SAAS,IAAI;MAAE,SAAS,SAAS,WAAW,EAAE,sBAAsB,CAAC;MAAG,SAAS,OAAO;MAAG;KAAO;KACvG,WAAW,SAAS,KAAK;KACzB,SAAS,OAAO;KAChB,MAAM,UAAU;IAClB,CAAC;IACD,aAAa;KAAE,QAAQ,WAAW;KAAG,MAAM,UAAU;IAAM;GAC7D,GAAG;IAAC,OAAO;IAAI;IAAM;IAAe;IAAO;GAAC,CAAC;GAC7C,MAAM,mBAAyB;IAAE,MAAM,UAAU;IAAO,QAAQ,WAAW;IAAG,SAAS,SAAS;GAAE;GAClG,MAAM,cAAc,SAAS,mBAAmB,CAAC,EAAA,CAAG,MAAM,UAAU,cAAc,MAAM,QAAQ,KAAA,CAAS;GACzG,MAAM,UAAU,SAAS,UAAU,SAAS,UAAU,UAAU,KAAK;GACrE,MAAM,cAAc,UAAU,WAAW,CAAC,cAAc,CAAC,WAAW,SAAS,aAAa,KAAA;GAC1F,MAAM,WAAW,YAA2B;IAC1C,IAAI,CAAC,MAAM,WAAW,CAAC,eAAe,QAAQ,SAAS;IACvD,QAAQ,UAAU;IAClB,MAAM,UAAU;IAChB,MAAM,WAAW,QAAQ;IACzB,SAAS,aAAa;IACtB,IAAI;KACF,MAAM,WAAW,MAAM,WAAW,gBAAgB;MAAE,IAAI,OAAO;MAAI;MAAM;MAAe,kBAAkB,QAAQ;KAAS,CAAC;KAC5H,IAAI,aAAa,QAAQ,SAAS;KAClC,IAAI,CAAC,SAAS,IAAI,MAAM,IAAI,MAAM,SAAS,WAAW,EAAE,sBAAsB,CAAC;KAC/E,MAAM,WAAW,SAAS;KAC1B,MAAM,QAAQ,SAAS,aAAa,WAAW,WAAW,KAAK,KAAK,SAAS,OAAO,IAAI,SAAS,KAAK,WAAW,CAAC,CAAC,IAAI,SAAS;KAChI,MAAM,MAAM,IAAI,gBAAgB,IAAI,KAAK,CAAC,KAAK,GAAG,EAAE,MAAM,SAAS,QAAQ,oBAAoB,mBAAmB,CAAC,CAAC;KACpH,MAAM,SAAS,SAAS,cAAc,GAAG;KACzC,OAAO,OAAO;KACd,OAAO,WAAW,SAAS,YAAY,GAAG,OAAO,GAAG,GAAG,SAAS,QAAQ,QAAQ;KAChF,SAAS,KAAK,OAAO,MAAM;KAC3B,OAAO,MAAM;KACb,OAAO,OAAO;KAId,iBAAiB,IAAI,gBAAgB,GAAG,GAAG,GAAM;KACjD,SAAS,MAAM;IACjB,SAAS,QAAQ;KAAE,IAAI,aAAa,QAAQ,SAAS;MAAE,SAAS,aAAa,MAAM,CAAC;MAAG,SAAS,OAAO;KAAE;IAAE,UACnG;KAAE,QAAQ,UAAU;IAAM;GACpC;GACA,MAAM,cAAoB;IAAE,IAAI,CAAC,QAAQ,SAAS,MAAM,QAAQ;GAAE;GAClE,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;IAAe,OAAO,EAAE,qBAAqB,EAAE,MAAM,OAAO,KAAK,CAAC;IAAG,YAAY,EAAE,mBAAmB;IAAG,SAAS;IACvH,QAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAQ,MAAK;KAAS,WAAWC,4BAAO;KAAY,UAAU,UAAU;KAAe,SAAS;KAAQ,UAAA,EAAE,UAAU,SAAS,qBAAqB,oBAAoB;IAAU,CAAA,GAC/K,UAAU,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAQ,MAAK;KAAS,WAAWA,4BAAO;KAAa,eAAe,UAAU,UAAU,QAAQ,CAAC;KAAI,UAAA,EAAE,qBAAqB;IAAU,CAAA,IACvJ,UAAU,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAQ,MAAK;KAAS,WAAWA,4BAAO;KAAa,UAAU,CAAC;KAAa,eAAe;MAAE,SAAc;KAAE;KAAI,UAAA,EAAE,SAAS,QAAQ,4BAA4B,0BAA0B;IAAU,CAAA,CAC7N,EAAA,CAAA;IACF,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAWC,2BAAI;KAApB,UAAA;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAG,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,OAAO,GAAS,CAAA,EAAI,CAAA;MAC9B,iBAAA,GAAA,kBAAA,KAAA,CAAC,YAAD;OAAU,UAAU,UAAU;OAA9B,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,mBAAmB,EAAU,CAAA,GACtC,CAAC,OAAO,YAAY,CAAC,CAAW,KAAK,WAAW,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;QAAoB,WAAWA,2BAAI;QAAnC,UAAA,CAChD,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;SAAO,MAAK;SAAQ,MAAM,GAAG,GAAG;SAAQ,SAAS,SAAS;SAAQ,gBAAgB;UAAE,WAAW;UAAG,QAAQ,MAAM;SAAE;QAAI,CAAA,GACtH,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD,EAAA,UAAA,CAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,eAAe,QAAQ,EAAU,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,EAAE,eAAe,OAAO,KAAK,EAAS,CAAA,CAAO,EAAA,CAAA,CACnG;OAHuD,GAAA,MAGvD,CAAC,CACA;;OACR,UAAU,aAAa,UAAU,kBAAkB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,MAAK;OAAU,UAAA,EAAE,qBAAqB;MAAK,CAAA;MAClG,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,KAAK;OAAU,UAAU;OAAI,MAAK;OAAQ,WAAWD,4BAAO;OAAe,UAAA;MAAS,CAAA;MAChG,UAAU,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,MAAK;OAAU,UAAA,EAAE,wBAAwB;MAAK,CAAA;MACrE,WAAW,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;QACR,QAAQ,iBAAiB,UAAU,KAAK,KAAK,iBAAA,GAAA,kBAAA,KAAA,CAAC,YAAD;QAAU,UAAU,UAAU;QAA9B,UAAA,CAC7C,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,uBAAuB,EAAU,CAAA,GAC3C,QAAQ,gBAAiB,KAAK,UAAU,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACvC,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD,EAAA,UAAA;SAAS,MAAM;SAAK;SAAI,MAAM;QAAW,EAAA,CAAA,GACvC,CAAC,WAAW,SAAS,CAAC,CAAW,KAAK,WAAW,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;SAAO,WAAWC,2BAAI;SAAtB,UAAA,CAAiD,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAO,MAAK;UAAQ,MAAM,GAAG,GAAG,GAAG,MAAM;UAAM,SAAS,cAAc,MAAM,QAAQ;UACtL,gBAAgB;WAAE,WAAW;WAAG,kBAAkB,aAAa;YAAE,GAAG;aAAU,MAAM,KAAK;WAAO,EAAE;UAAE;SAAI,CAAA,GAAE,EAAE,eAAe,QAAQ,CAAS;QADlD,GAAA,MACkD,CAAC,CAC5I,EAAA,GAJ8C,MAAM,EAIpD,CAAC,CACE;;OACT,OAAO,OAAO,aAAa,CAAC,CAAC,SAAS,SAAS,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,sBAAsB,EAAK,CAAA;OACtF,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD,EAAA,UAAA,CAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD,EAAA,UAAU,EAAE,qBAAqB,EAAE,OAAO,QAAQ,OAAO,UAAU,EAAE,CAAC,EAAW,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,QAAQ,OAAO,KAAK,SAAS,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;QAAqB,KAAK;QAAK;QAAI,KAAK;QAAM;OAAM,EAAA,GAA3C,KAAK,IAAsC,CAAC,EAAM,CAAA,CAAU,EAAA,CAAA;OAClM,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,wBAAwB,EAAE,OAAO,QAAQ,uBAAuB,EAAE,CAAC,EAAK,CAAA;OAC9E,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,sBAAsB,EAAK,CAAA;QAC/B,QAAQ,UAAU,UAAU,KAAK,KAAK,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,MAAM,UAAU,UAAU,KAAA;QAA/B,UAAA,CAA2C,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,qBAAqB,EAAK,CAAA,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,QAAQ,SAAU,KAAK,MAAM,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAiB,KAAS,GAAjB,KAAiB,CAAC,EAAM,CAAA,CAAM;;QACjN,QAAQ,UAAU,UAAU,KAAK,KAAK,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;QAAS,MAAA;QAAT,UAAA,CAAc,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD,EAAA,UAAU,EAAE,sBAAsB,EAAW,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,QAAQ,SAAU,KAAK,MAAM,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAiB,KAAS,GAAjB,KAAiB,CAAC,EAAM,CAAA,CAAU;;MAC3L,EAAA,CAAA;KACC;;GACQ,CAAA;EACjB;;;;EClFA,MAAMC,WAAS;GAAE,GAAGC;GAAW,GAAGC;EAAW;EAE7C,MAAa,kBAAA,GAAiBC,MAAAA,KAAAA,CAAK,SAAS,eAAe,OAAsE;GAC/H,MAAM,EAAE,OAAO,MAAM;GACrB,MAAM,SAAS,oBAAoB,QAAQ,UAAU,KAAK;GAC1D,MAAM,UAAU,MAAM,KAAK,WAAW,CAAC;GACvC,MAAM,YAAY,MAAM,KAAK,oBAAoB,CAAC;GAClD,MAAM,CAAC,kBAAkB,wBAAA,GAAuBC,MAAAA,SAAAA,CAA6B,KAAA,CAAS;GACtF,MAAM,CAAC,YAAY,kBAAA,GAAiBA,MAAAA,SAAAA,CAAS,KAAK;GAClD,MAAM,CAAC,YAAY,kBAAA,GAAiBA,MAAAA,SAAAA,CAAS,KAAK;GAClD,MAAM,CAAC,cAAc,oBAAA,GAAmBA,MAAAA,SAAAA,CAAuC;GAC/E,MAAM,mBAAA,GAAkBC,MAAAA,OAAAA,CAA0B,IAAI;GAGtD,MAAM,OAAO,qBAAqB;IAChC,mBAAmB,EAAE,+BAA+B;IACpD,UAAU,YAAY,aAAa,uBAAuB,OAAO;IACjE,QAAQ,OAAO,YAAY;KACzB,IAAI,QAAQ,aAAa,QAAQ,SAAS,aAAa,MAAM,OAAO,gBAAgB;MAClF,IAAI,mBAAmB,MAAM,cAAc,MAAM,OAAO,cAAc,GAAG,OAAO;OAAE,IAAI;OAAO,SAAS,EAAE,0BAA0B;MAAE;MACpI,MAAM,gBAAgB,MAAM,OAAO,cAAc,QAAQ,WAAW,OAAO,QAAQ,SAAS,kBAAkB;MAC9G,MAAM,eAAe,MAAM,aAAa,QAAQ,WAAW,OAAO,QAAQ,SAAS,kBAAkB;MACrG,IAAI,CAAC,UAAU,eAAe,YAAY,GAAG;OAC3C,IAAI,CAAC,MAAM,MAAM,eAAe,MAAM,OAAO,eAAe;QAAE,qBAAqB;QAAO,QAAQ;QAAO,SAAS;OAAM,CAAC,GAAG,OAAO;QAAE,IAAI;QAAO,SAAS,EAAE,0BAA0B;OAAE;OACvL,OAAO;QAAE,IAAI;QAAO,OAAO;QAAM,SAAS,EAAE,qBAAqB;OAAE;MACrE;MACA,IAAI,MAAM,eAAe,OAAO;OAAE,IAAI;OAAO,SAAS,EAAE,0BAA0B;MAAE;KACtF;KACA,OAAO,YAAY,uBAAuB,OAAO;IACnD;IACA,aAAa,OAAO,UAAU;KAC5B,MAAM,WAAW,MAAM,EAAE,kCAAkC,EAAE,IAAI,SAAS,GAAG,CAAC,CAAC;KAC/E,IAAI,MAAM,MAAM,KAAK,MAAM,cAAc,MAAM,IAAI,MAAM,EAAE,sBAAsB,CAAC;IACpF;IACA,UAAU,SAAS,UAAU;KAC3B,MAAM,WAAW,SAAS,EAAE,sCAAsC,EAAE,QAAQ,QAAQ,EAAE,qBAAqB,IAAI,QAAQ,CAAC,CAAC;IAC3H;GACF,CAAC;;GAGD,MAAM,eAAe,OAAO,OAA8B;IACxD,MAAM,MAAM,MAAM,WAAW,gBAAgB,EAAE,GAAG,CAAC;IACnD,IAAI,IAAI,IAAI;KACV,MAAM,WAAW,MAAM,EAAE,iCAAiC,EAAE,GAAG,CAAC,CAAC;KACjE,MAAM,MAAM,KAAK;KACjB,qBAAqB,YAAY,YAAY,KAAK,KAAA,IAAY,OAAO;IACvE,OACE,MAAM,IAAI,MAAM,EAAE,sCAAsC,EAAE,QAAQ,IAAI,WAAW,8BAA8B,CAAC,CAAC;GAErH;;GAGA,MAAM,kBAAkB,OAAO,OAA8B;IAC3D,MAAM,MAAM,MAAM,WAAW,mBAAmB,EAAE,GAAG,CAAC;IACtD,IAAI,IAAI,IAAI;KACV,MAAM,WAAW,MAAM,EAAE,oCAAoC,EAAE,IAAI,IAAI,MAAM,GAAG,CAAC,CAAC;KAClF,MAAM,MAAM,KAAK;IACnB,OACE,MAAM,WAAW,SAAS,EAAE,yCAAyC,EAAE,QAAQ,IAAI,WAAW,8BAA8B,CAAC,CAAC;GAElI;;GAGA,MAAM,eAAe,OAAO,OAA8B;IACxD,MAAM,MAAM,MAAM,WAAW,cAAc,EAAE,GAAG,CAAC;IACjD,IAAI,IAAI,IACN,MAAM,WAAW,MAAM,EAAE,gCAAgC,EAAE,MAAM,IAAI,MAAM,KAAK,CAAC,CAAC;SAElF,MAAM,WAAW,SAAS,EAAE,oCAAoC,EAAE,QAAQ,IAAI,WAAW,8BAA8B,CAAC,CAAC;GAE7H;;GAGA,MAAM,cAAc,OAAO,IAAY,aAAa,UAAyB;IAC3E,MAAM,MAAM,MAAM,WAAW,eAAe;KAAE;KAAI;IAAW,CAAC;IAC9D,IAAI,IAAI,IAAI;KACV,cAAc,KAAK;KACnB,MAAM,WAAW,MAAM,EAAE,gCAAgC,EAAE,IAAI,IAAI,MAAM,GAAG,CAAC,CAAC;KAC9E,MAAM,MAAM,KAAK;IACnB,OACE,MAAM,WAAW,SAAS,EAAE,qCAAqC,EAAE,QAAQ,IAAI,WAAW,8BAA8B,CAAC,CAAC;GAE9H;GAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWL,SAAO;IAAvB,UAAA;KACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,SAAO;MAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAWA,SAAO;OAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,sBAAsB,EAAU,CAAA,GAC3C,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,EAAE,qBAAqB,EAAS,CAAA,CACpC;MACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAWA,SAAO;OAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,KAAK;QAAiB,MAAK;QAAS,WAAWA,SAAO;QAAa,eAAe,cAAc,IAAI;QAAI,UAAA,EAAE,oBAAoB;OAAU,CAAA,GAChJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,SAAO;QAAY,eAAe,cAAc,IAAI;QAArF,UAAA,CAAyF,EAAE,yBAAyB,GAAE,GAAS;OAC3H,CAAA,CAAA;MACH,CAAA,CAAA;;KACJ,cAAc,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;MAAiB;MAAG,aAAY;MAAS,GAAI;MAAM,SAAS;MACzE,UAAU,UAAU;OAAE,KAAU,IAAI,KAAK;MAAE;MAAG,WAAW,KAAK;MAAe,iBAAiB;OAAE,KAAU,QAAQ;MAAE;MACpH,eAAe;OAAE,KAAK,OAAO;OAAG,cAAc,KAAK;MAAE;MAAG,SAAS,KAAK;MAAQ,QAAQ,KAAK;MAAM,OAAO,KAAK;MAC7G,mBAAmB;OAAE,KAAU,UAAU;MAAE;MAAG,iBAAiB;OAAE,KAAU,aAAa;MAAE;MAC1F,OAAO,KAAK,gBAAgB,KAAA,IAAY,KAAA,UAAkB;OAAE,MAAM,kBAAkB,KAAK,WAAY;OAAG,KAAK,OAAO;OAAG,cAAc,KAAK;MAAE;KAAI,CAAA;KACjJ,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAAC,oBAAD;MAAuB;MAAG,QAAQ;MAAc,eAAe,gBAAgB,KAAA,CAAS;KAAI,CAAA;KAC7G,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,SAAO;MACpB,UAAA,QAAQ,WAAW,IAClB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWA,SAAO;OAAU,MAAK;OAAU,UAAA,EAAE,sBAAsB;MAAK,CAAA,IACzE,QAAQ,KAAK,WAAW,WAAW,MAAM,CAAC;KAC3C,CAAA;KACJ,cACC,iBAAA,GAAA,kBAAA,KAAA,CAAC,eAAD;MAAe,OAAO,EAAE,6BAA6B;MAAG,YAAY,EAAE,6BAA6B;MAAG,WAAW;MAAiB,eAAe,cAAc,KAAK;MAApK,UAAA;OACG,UAAU,WAAW,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAWA,SAAO;QAAkB,UAAA,EAAE,mCAAmC;OAAK,CAAA;OAC5G,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;QAAa,OAAO,EAAE,4BAA4B;QAChD,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAWA,SAAO;SAAmB,eAAA;SACzD,eAAe,KAAK,YAAY,aAAa,IAAI;SADnD,UAAA,CAEE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,6BAA6B,EAAU,CAAA,GAClD,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,EAAE,8BAA8B,EAAS,CAAA,CAC3C;;OACG,CAAA;OACZ,UAAU,KAAK,aACd,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;QAA+B,OAAO,EAAE,gCAAgC,EAAE,IAAI,SAAS,GAAG,CAAC;QACzF,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAWA,SAAO;SAAmB,eAAe,KAAK,YAAY,SAAS,EAAE;SAAtG,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,SAAS,KAAa,CAAA,GAC/B,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,SAAS,GAAU,CAAA,CACrB;;OACG,GALK,SAAS,EAKd,CACd;MACY;;IAEd;;GAGP,SAAS,WAAW,QAA6F;IAC/G,MAAM,SAAS,OAAO,mBAAmB,OAAO;IAChD,MAAM,aAAa,qBAAqB,OAAO;IAG/C,MAAM,UAAU,OAAO,eAAe;IACtC,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;KAAyB,WAAW,KAAKA,SAAO,YAAY,WAAWA,SAAO,iBAAiB;KAC7F,eAAa,SAAS,KAAK,KAAA;KAD7B,UAAA,CAEE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;MAAa,OAAO,UACd,EAAE,kCAAkC,IACpC,SAAS,EAAE,iCAAiC,IAAI,EAAE,mCAAmC,EAAE,MAAM,OAAO,KAAK,CAAC;MAC9G,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAWA,SAAO;OAAgB,UAAU;OAChE,eAAe,MAAM,kBAAkB,OAAO,EAAE;OADlD,UAAA;QAEE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;SAAM,WAAWA,SAAO;SAAxB,UAAA;UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,WAAWA,SAAO;WAAiB,UAAA,OAAO;UAAa,CAAA;UAC9D,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;WAAa,WAAWA,SAAO;WAAiB,MAAK;WAAU,OAAO,EAAE,6BAA6B;UAAI,CAAA;UACnH,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,SAAO;WAAgB,UAAA,EAAE,wBAAwB;UAAQ,CAAA;SAClF;;QACL,OAAO,gBAAgB,KAAA,KAAa,OAAO,YAAY,SAAS,KAC5D,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAWA,SAAO;SAAiB,UAAA,OAAO;QAAe,CAAA;QACjE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAWA,SAAO;SAAe,UAAA,OAAO;QAAS,CAAA;OACjD;;KACG,CAAA,GACb,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MAAM,WAAWA,SAAO;MAAxB,UAAA;OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,SAAO;QAAY,eAAe,gBAAgB;SAAE,IAAI,OAAO;SAAI,MAAM,OAAO;QAAK,CAAC;QAAvH,UAAA,CAA2H,EAAE,uBAAuB,GAAE,GAAS;;OAC/J,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;QAAa,OAAO,EAAE,gCAAgC;QACpD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAWA,SAAO;SACtC,cAAY,EAAE,iCAAiC,EAAE,MAAM,OAAO,KAAK,CAAC;SACpE,eAAe,KAAK,gBAAgB,OAAO,EAAE;SAC7C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACM,sCAAAA,wBAAD,CAAyB,CAAA;QACnB,CAAA;OACG,CAAA;OACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;QAAa,OAAO,EAAE,2BAA2B;QAC/C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAWN,SAAO;SACtC,cAAY,EAAE,4BAA4B,EAAE,MAAM,OAAO,KAAK,CAAC;SAC/D,eAAe,KAAK,aAAa,OAAO,EAAE;SAC1C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACO,sCAAAA,8BAAD,CAA+B,CAAA;QACzB,CAAA;OACG,CAAA;OACZ,cACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;QAAe,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,KAAK,CAAC;QAC/D,aAAa,EAAE,qCAAqC,EAAE,MAAM,OAAO,KAAK,CAAC;QACzE,cAAc,EAAE,+BAA+B;QAAG,aAAa,EAAE,8BAA8B;QAC/F,iBAAiB,aAAa,OAAO,EAAE;QAAG,gBAAgB,qBAAqB,YAAY,YAAY,OAAO,KAAK,KAAA,IAAY,OAAO;OAAI,CAAA;OAG5I,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;QAAa,OAAO,SAAS,EAAE,kCAAkC,IAAI,EAAE,4BAA4B;QACjG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAWP,SAAO;SACtC,cAAY,EAAE,8BAA8B,EAAE,MAAM,OAAO,KAAK,CAAC;SACjE,UAAU;SACV,eAAe,oBAAoB,OAAO,EAAE;SAC5C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACQ,sCAAAA,yBAAD,CAA0B,CAAA;QACpB,CAAA;OACG,CAAA;MAEX;KACC,CAAA,CAAA;IAlDK,GAAA,OAAO,EAkDZ;GAEb;EACF,CAAC;;;;EC9MD,SAAgB,gBAAgB,OAMlB;GACZ,MAAM,CAAC,MAAM,YAAA,GAAWC,MAAAA,SAAAA,CAAS,MAAM,eAAe,KAAK;GAC3D,MAAM,WAAA,GAAUC,MAAAA,MAAAA,CAAM;GACtB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAW,KAAKC,4BAAO,YAAY,QAAQA,4BAAO,cAAc;IAAzE,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAQ,WAAWA,4BAAO;KACxB,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,WAAWA,4BAAO;MAAc,iBAAe;MAAM,iBAAe;MAAS,eAAe,SAAS,UAAU,CAAC,KAAK;MAA3I,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAWA,4BAAO;OAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,4BAAO;QAAa,UAAA,MAAM;OAAY,CAAA,GACtD,MAAM,SAAS,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,4BAAO;QAAa,UAAA,MAAM;OAAW,CAAA,CAC/E;MACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,+BAAD,EAA+B,WAAW,KAAKD,4BAAO,SAAS,QAAQA,4BAAO,WAAW,EAAI,CAAA,CACvF;;IACF,CAAA,GACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,IAAI;KAAS,QAAQ,CAAC;KAAM,WAAWA,4BAAO;KAAa,UAAA,QAAQ,MAAM;IAAc,CAAA,CACrF;;EAEb;;;ECzBA,SAAgB,gBAAgB,OAUlB;GACZ,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,WAAWE,4BAAG;IACjB,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAWA,4BAAG;KAAnB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MAAM,WAAWA,4BAAG;MAApB,UAAA,CAAiC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,MAAM,MAAc,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,MAAM,KAAY,CAAA,CAAO;KAChG,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,4BAAG;MACjB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;OACE,IAAI,MAAM;OACV,WAAWA,4BAAG;OACd,MAAM,MAAM,QAAQ;OACpB,OAAO,MAAM;OACb,cAAY,MAAM;OAClB,aAAa,MAAM;OACnB,UAAU,MAAM;OAChB,YAAY;OACZ,cAAa;OACb,WAAW,UAAU,MAAM,QAAQ,MAAM,OAAO,KAAK;OACrD,QAAQ,MAAM;MACf,CAAA;KACE,CAAA,CACF;;GACF,CAAA;EAET;;;;EC3BA,MAAMC,OAAK;GAAE,GAAGC;GAAW,GAAGC;EAAW;EAIzC,MAAa,eAAA,GAAcC,MAAAA,KAAAA,CAAK,SAAS,YAAY,OAAsE;GACzH,MAAM,EAAE,OAAO,MAAM;GACrB,MAAM,SAAS,oBAAoB,QAAQ,UAAU,KAAK;GAC1D,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;IACG,CAAC,OAAO,eAAe,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,WAAWH,KAAG;KAAkB,UAAA,EAAE,2BAA2B;IAAK,CAAA;IAC7F,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD;KAAuB;KAAU;IAAI,CAAA;IACrC,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;KAAS,WAAWA,KAAG;KAAS,cAAY,EAAE,cAAc;KAC1D,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,KAAG;MACjB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;OAAW,IAAG;OAAkB,OAAO,EAAE,2BAA2B;OAAG,MAAM,EAAE,0BAA0B;OACvG,SAAS,OAAO;OAAa,gBAAgB,MAAM,OAAO,aAAa;MAAI,CAAA;KAC1E,CAAA;IACE,CAAA;IACT,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD;KAAiB,IAAG;KAAoB,OAAO,EAAE,sBAAsB;KAAG,MAAM,EAAE,qBAAqB;KACrG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD;MAAiB,IAAG;MAAkB,OAAO,EAAE,qBAAqB;MAAG,MAAM,EAAE,oBAAoB;MACjG,MAAK;MAAS,OAAO,OAAO,OAAO,WAAW;MAC9C,UAAU,UAAU,MAAM,MAAM,EAAE,aAAa,OAAO,KAAK,KAAK,EAAE,CAAC;MACnE,UAAU,MAAM;KAAkB,CAAA;IACrB,CAAA;GACjB,EAAA,CAAA;EAEN,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EC3BD,MAAa,gBAAgB,UAC3B,MAAM,SAAS,CAAC,cAAc,KAAK,MAAM,MAAM,kBAAkB,MAAM;;EAGzE,MAAa,uBAAuB,UAAsC,aAAa,KAAK,KAAK,MAAM;;EAGvG,MAAa,sBAAsB,UAAsC,aAAa,KAAK,KAAK,MAAM;;EAGtG,MAAa,oBAAoB,UAC/B,MAAM,SAAS,CAAC,MAAM,kBAAkB,CAAC,MAAM;;EAGjD,MAAa,iBAAiB,UAAsC,MAAM,SAAS,MAAM,iBAAiB;;EAG1G,MAAa,qBACX,OACA,UACkD;GAAE;GAAM,SAAS,EAAE,SAAS,UAAU,MAAM,iBAAiB,MAAM;EAAe;EAEtI,SAAgB,mBAAmB,OAA0B,KAA8B;GACzF,IAAI,QAAQ,SAAS,OAAO,oBAAoB,KAAK;GACrD,IAAI,QAAQ,QAAQ,OAAO,mBAAmB,KAAK;GACnD,IAAI,QAAQ,WAAW,OAAO,iBAAiB,KAAK;GACpD,OAAO;EACT;;;EAUA,SAAgB,cAAc,SAAqD;GAGjF,OAFe,OAAO,KAAK,aAAa,CAAC,CACtC,MAAM,MAAM,UAAU,cAAc,KAAK,CAAC,OAAO,cAAc,MAAM,CAAC,IAC9D,CAAC,CAAC,SAAS,WAAW;IAC/B,MAAM,SAAS,QACZ,QAAQ,UAAU,MAAM,WAAW,MAAM,CAAC,CAC1C,MAAM,MAAM,UAAU,KAAK,KAAK,cAAc,MAAM,IAAI,CAAC;IAC5D,OAAO,OAAO,WAAW,IAAI,CAAC,IAAI,CAAC;KAAE;KAAQ,MAAM,cAAc,OAAO,CAAC;KAAM;IAAO,CAAC;GACzF,CAAC;EACH;;EAGA,SAAgB,iBAAiB,OAA0B,GAAgC;GACzF,IAAI,CAAC,MAAM,OAAO,OAAO,EAAE,uBAAuB;GAClD,IAAI,cAAc,KAAK,GAAG,OAAO,EAAE,wBAAwB;GAC3D,IAAI,CAAC,MAAM,kBAAkB,CAAC,MAAM,eAAe,OAAO,EAAE,uBAAuB;GAOnF,OAAO,EAAE,0BAA0B,EAAE,WAJnB,CAChB,MAAM,iBAAiB,EAAE,8BAA8B,IAAI,IAC3D,MAAM,gBAAgB,EAAE,6BAA6B,IAAI,EAC3D,CAAC,CAAC,OAAO,OAC+C,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;EACvE;;EAGA,SAAgB,gBAAgB,OAA2C;GACzE,IAAI,CAAC,MAAM,OAAO,OAAO;GACzB,OAAO,aAAa,KAAK,IAAI,YAAY;EAC3C;;;EC3DA,MAAMI,OAAK;GAAE,GAAGC;GAAW,GAAGC;EAAW;;EAazC,MAAa,YAAA,GAAWC,MAAAA,KAAAA,CAAK,SAAS,SAAS,OAAiC;GAC9E,MAAM,EAAE,OAAO,GAAG,MAAM,OAAO,cAAc;GAC7C,MAAM,WAAA,GAAUC,MAAAA,MAAAA,CAAM;GACtB,MAAM,MAAM,KAAK,UAAU;IAAC;IAAW,MAAM;IAAI,MAAM;GAAI,CAAC;GAC5D,MAAM,UAAA,GAASC,MAAAA,QAAAA,OAAgC;IAC7C,MAAM,WAAW,MAAM,aAAa,OAAO,IAAI,GAAG;IAClD,IAAI,UAAU,OAAO;IACrB,MAAM,OAAO;KAAE,MAAM;KAAI,aAAa;KAAI,OAAO;KAAI,SAAS;KAAO,QAAQ;IAAM;IACnF,MAAM,aAAa,OAAO,IAAI,KAAK,IAAI;IACvC,OAAO;GACT,GAAG,CAAC,MAAM,cAAc,GAAG,CAAC;GAC5B,MAAM,GAAG,WAAA,GAAUC,MAAAA,WAAAA,EAAY,UAAkB,QAAQ,GAAG,CAAC;GAC7D,MAAM,CAAC,UAAU,gBAAA,GAAeC,MAAAA,SAAAA,CAAS,MAAM,aAAa,SAAS,IAAI,GAAG,KAAK,KAAK;GACtF,MAAM,CAAC,eAAe,qBAAA,GAAoBA,MAAAA,SAAAA,CAAS,KAAK;GACxD,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,OAAO,UAAU;IAAQ,aAAa;KAAE,OAAO,UAAU,KAAA;IAAU;GAAE,GAAG,CAAC,MAAM,CAAC;GAClG,MAAM,QAAQ,OAAO,UAAU,KAAA,MAAc,OAAO,SAAS,OAAO,MAAM,WAAW,OAAO,gBAAgB,OAAO,MAAM;GACzH,MAAM,WAAW,MAAM,YAAY,QAAQ,MAAM,SAAS,KAAA;GAC1D,MAAM,OAAO,YAA2B;IACtC,IAAI,OAAO,WAAW,OAAO,QAAQ;IACrC,OAAO,UAAU;IACjB,OAAO,QAAQ;IACf,OAAO,UAAU;IACjB,IAAI;KACF,MAAM,SAAS,MAAM,MAAM,UAAU,OAAO,SAAS;KACrD,IAAI,OAAO,IAAI;MAAE,OAAO,QAAQ,OAAO;MAAO,OAAO,OAAO,OAAO,MAAM;MAAS,OAAO,cAAc,OAAO,MAAM;KAAY,OAC3H,OAAO,QAAQ,OAAO,WAAW,EAAE,wBAAwB;IAClE,SAAS,OAAO;KACd,OAAO,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,EAAE,wBAAwB;IACpF,UAAU;KAAE,OAAO,UAAU;KAAO,OAAO,UAAU;IAAE;GACzD;GACA,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,IAAI,YAAY,YAAY,CAAC,OAAO,SAAS,CAAC,OAAO,OAAO,KAAU;GAAE,GAAG;IAAC;IAAU;IAAU;GAAM,CAAC;GACzH,MAAM,OAAO,YAA2B;IACtC,IAAI,CAAC,OAAO,SAAS,OAAO,UAAU,OAAO,WAAW,QAAQ,CAAC,YAAY,CAAC,OAAO;IACrF,OAAO,SAAS;IAChB,OAAO,QAAQ;IACf,MAAM,YAAY,OAAO;IACzB,MAAM,cAAc,OAAO;IAC3B,OAAO,UAAU;IACjB,IAAI;KACF,MAAM,SAAS,MAAM,MAAM,UAAU,OAAO,WAAW,aAAa,OAAO,MAAM,UAAU,SAAS;KACpG,IAAI,OAAO,IAAI;MACb,OAAO,QAAQ,OAAO;MACtB,IAAI,OAAO,SAAS,WAAW,OAAO,OAAO,OAAO,MAAM;MAC1D,IAAI,OAAO,gBAAgB,aAAa,OAAO,cAAc,OAAO,MAAM;KAC5E,OAAO,OAAO,QAAQ,OAAO,WAAW,EAAE,wBAAwB;IACpE,SAAS,OAAO;KACd,OAAO,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,EAAE,wBAAwB;IACpF,UAAU;KAAE,OAAO,SAAS;KAAO,OAAO,UAAU;IAAE;GACxD;GACA,MAAM,SAAS,OAAO,SAA0C;IAC9D,IAAI,MAAM,SAAS,KAAA,KAAa,MAAM,MAAM,YAAY,MAAM,MAAM,MAAM,MAAM,kBAAkB,OAAO,IAAI,CAAC,KACzG,aAAa,CAAC,OAAO,SAAU,OAAO,SAAS,OAAO,MAAM,WAAW,OAAO,gBAAgB,OAAO,MAAM,cAAe,MAAM,KAAK;GAC5I;GACA,MAAM,SAAS,iBAAiB,OAAO,CAAC;GACxC,MAAM,OAAO,MAAM,SAAS,MAAM,IAAI,SAAS,IAAI,GAAG,MAAM,IAAI,GAAG,MAAM,WAAW,MAAM,YAAY;GAEtG,MAAM,iBAAiB,MAAM;GAC7B,MAAM,gBAAgB,MAAM;GAE5B,MAAM,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,WAAW,CAAC,OAAO,UAAU,MAAM,iBAAiB,QAAQ,MAAM,SAAS,MAAM,SAAS,KAAA;GACtI,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAW,KAAKP,KAAG,YAAYA,KAAG,YAAY,YAAYA,KAAG,cAAc;IAAG,mBAAiB,MAAM;IAAI,gBAAc,iBAAiB,KAAK,IAAI,KAAK,KAAA;IAAW,gBAAc,CAAC,MAAM,QAAQ,KAAK,KAAA;IAA5M,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,WAAWA,KAAG;MACpB,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAWA,KAAG;OAAc,qBAAkB;OAAG,iBAAe;OAAU,iBAAe;OAC7G,cAAY,EAAE,qBAAqB,EAAE,MAAM,MAAM,KAAK,CAAC;OACvD,eAAe;QAAE,YAAY,CAAC,QAAQ;QAAG,MAAM,aAAa,SAAS,IAAI,KAAK,CAAC,QAAQ;OAAE;OAF3F,UAAA,CAGE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;QAAM,WAAWA,KAAG;QAApB,UAAA;SACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;UAAM,WAAWA,KAAG;UAAmB,sBAAmB;UAA1D,UAAA;WACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;YAAQ,WAAWA,KAAG;YAAY,UAAA,MAAM;WAAa,CAAA;WACrD,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;YAAa,MAAM,gBAAgB,KAAK;YAAG,OAAO;YAAQ,WAAW,EAAE,0BAA0B,EAAE,OAAO,CAAC;WAAI,CAAA;WAC9G,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;YAAM,WAAWA,KAAG;YAAiB,UAAA,EAAE,mBAAmB;WAAQ,CAAA;UACxE;;SACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,KAAG;UAAe,0BAAuB;UAAI,UAAA,MAAM,eAAe,EAAE,0BAA0B;SAAQ,CAAA;SACvH,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;UAAM,WAAWA,KAAG;UAAiB,qBAAkB;UAAvD,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,KAAG;WAAkB,UAAA;UAAW,CAAA,GACjD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,KAAG;WAAgB,UAAA,EAAE,4BAA4B,EAAE,MAAM,MAAM,KAAK,CAAC;UAAQ,CAAA,CAC1F;;QACF;OACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAACQ,sCAAAA,+BAAD,EAA+B,WAAW,KAAKR,KAAG,SAAS,YAAYA,KAAG,WAAW,EAAI,CAAA,CACnF;;KACF,CAAA;KACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,IAAI;MAAS,QAAQ,CAAC;MAAU,WAAWA,KAAG;MAChD,UAAA,YAAY,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;OACV,cAAc,KAAK,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,KAAG;QAAY,MAAK;QAAQ,UAAA,EAAE,yBAAyB;OAAQ,CAAA;OACxG,CAAC,MAAM,SAAS,MAAM,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,KAAG;QAAY,MAAK;QAAQ,UAAA,MAAM;OAAY,CAAA;OAC9F,MAAM,kBAAkB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,KAAG;QAAiB,MAAK;QAAQ,UAAA,MAAM;OAAqB,CAAA;OAEtG,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAWA,KAAG;QAAiB,0BAAuB;QACzD,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;SAAM,WAAWA,KAAG;SAAkB,MAAK;SAAQ,cAAY,EAAE,2BAA2B,EAAE,MAAM,MAAM,KAAK,CAAC;SAAhH,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;UAAa,OAAO,EAAE,6BAA6B;UACjD,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;WAAM,WAAWA,KAAG;WAAiB,qBAAkB;WAAvD,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,wBAAwB,EAAQ,CAAA,GACzC,iBAAA,GAAA,kBAAA,IAAA,CAACS,sCAAAA,QAAD;YAAQ,SAAS;YAAgB,UAAU,CAAC;YAC1C,OAAO,EAAE,+BAA+B,EAAE,MAAM,MAAM,KAAK,CAAC;YAC5D,gBAAgB;aAAE,OAAY,OAAO;YAAE;WAAI,CAAA,CACzC;;SACK,CAAA,GACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;UAAa,OAAO,EAAE,4BAA4B;UAChD,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;WAAM,WAAWT,KAAG;WAAiB,qBAAkB;WAAvD,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,uBAAuB,EAAQ,CAAA,GACxC,iBAAA,GAAA,kBAAA,IAAA,CAACS,sCAAAA,QAAD;YAAQ,SAAS;YAAe,UAAU,CAAC;YACzC,OAAO,EAAE,8BAA8B,EAAE,MAAM,MAAM,KAAK,CAAC;YAC3D,gBAAgB;aAAE,OAAY,MAAM;YAAE;WAAI,CAAA,CACxC;;SACK,CAAA,CACT;;OACH,CAAA;OACJ,YAAY,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;QACX,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;SAAO,WAAWT,KAAG;SAArB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,yBAAyB,EAAQ,CAAA,GAC1C,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAO,WAAWA,KAAG;UAAa,iCAA8B;UAAG,cAAY,EAAE,yBAAyB;UACxG,OAAO,OAAO;UAAa,UAAU,CAAC,OAAO,SAAS,OAAO;UAC7D,WAAW,UAAU;WAAE,OAAO,cAAc,MAAM,OAAO;WAAO,OAAO,UAAU;UAAE;SAAI,CAAA,CACpF;;QACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;SAAO,WAAWA,KAAG;SAArB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,qBAAqB,EAAQ,CAAA,GACtC,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;UAAU,WAAW,KAAKA,KAAG,aAAaA,KAAG,WAAW;UAAG,qBAAkB;UAAG,cAAY,EAAE,qBAAqB;UACjH,YAAY;UAAO,MAAM;UAAI,OAAO,OAAO;UAAM,UAAU,CAAC,OAAO,SAAS,OAAO;UACnF,WAAW,UAAU;WAAE,OAAO,OAAO,MAAM,OAAO;WAAO,OAAO,UAAU;UAAE;SAAI,CAAA,CAC7E;;QACP,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAWA,KAAG;SAAkB,UAAA,EAAE,kBAAkB;QAAK,CAAA;QAC3D,OAAO,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAWA,KAAG;SAAY,MAAK;SAAS,UAAA,OAAO;QAAS,CAAA;OAC5E,EAAA,CAAA;OACF,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAW,KAAKA,KAAG,iBAAiBA,KAAG,WAAW;QAAG,sBAAmB;QAA7E,UAAA;SACG,YAAY,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACX,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,WAAWA,KAAG;UAAY,mBAAgB;UAAG,UAAU,CAAC,SAAS,QAAQ,OAAO,WAAW,OAAO;UAAQ,eAAe;WAAE,KAAU;UAAE;UAC1J,UAAA,EAAE,OAAO,SAAS,uBAAuB,kBAAkB;SACtD,CAAA,GACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,WAAWA,KAAG;UAAY,qBAAkB;UAAG,UAAU,QAAQ,OAAO,WAAW,OAAO;UAC9G,eAAe;WAAE,IAAI,OAAO,iBAAiB,IAAI;gBAAQ,KAAU;UAAE;UAAI,UAAA,EAAE,oBAAoB;SAAU,CAAA,CAC3G,EAAA,CAAA;SACD,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,KAAG;UAAiB,MAAK;UAAU,UAAA,EAAE,OAAO,UAAU,wBAAwB,QAAQ,sBAAsB,OAAO,QAAQ,sBAAsB,sBAAsB;SAAQ,CAAA;SAC5M,MAAM,cAAc,QAAQ,MAAM,SAAS,KAAA,KAC1C,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;UAAa,OAAO,EAAE,wBAAwB;UAC5C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,MAAK;WAAS,WAAW,KAAKA,KAAG,YAAYA,KAAG,WAAW;WAAG,eAAA;WAAY,qBAAmB,MAAM;WACzG,mBAAiB,MAAM;WAAM,UAAU,QAAQ,OAAO;WAAQ,eAAe,MAAM,SAAS,KAAK;WAChG,UAAA,EAAE,mBAAmB;UAChB,CAAA;SACG,CAAA;QAEZ;;MACL,EAAA,CAAA;KACC,CAAA;KACJ,iBAAiB,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;MAAe,OAAO,EAAE,oBAAoB;MAAG,aAAa,EAAE,2BAA2B;MACzG,cAAc,EAAE,oBAAoB;MAAG,aAAa,EAAE,mBAAmB;MACzE,WAAW,YAAY;OAAE,MAAM,KAAK;OAAG,iBAAiB,KAAK;MAAE;MAAG,gBAAgB,iBAAiB,KAAK;KAAI,CAAA;IACvG;;EAEb,CAAC;;;;EC9JD,MAAM,KAAK;GAAE,GAAGU;GAAW,GAAGC;EAAW;EAEzC,MAAM,oBAAkF;GACtF;IAAE,IAAI;IAAO,UAAU;GAAkB;GACzC;IAAE,IAAI;IAAS,UAAU;GAAoB;GAC7C;IAAE,IAAI;IAAQ,UAAU;GAAmB;GAC3C;IAAE,IAAI;IAAW,UAAU;GAAsB;EACnD;;EAGA,MAAM,gBAAgB;EAEtB,MAAa,cAAA,GAAaC,MAAAA,KAAAA,CAAK,SAAS,WAAW,OAAkJ;GACnM,MAAM,EAAE,OAAO,KAAK,MAAM;GAC1B,MAAM,SAAS,oBAAoB,QAAQ,UAAU,KAAK;GAC1D,MAAM,CAAC,aAAa,mBAAA,GAAkBC,MAAAA,SAAAA,CAAS,MAAM,QAAQ,SAAS,EAAE;GACxE,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAyB,MAAM,QAAQ,UAAU,KAAK;GACxF,MAAM,CAAC,cAAc,oBAAA,GAAmBA,MAAAA,SAAAA,CAAS,EAAE;GACnD,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAiC;GAC/D,MAAM,cAAA,GAAaC,MAAAA,OAAAA,CAAO,KAAK;GAC/B,MAAM,CAAC,UAAU,gBAAA,GAAeD,MAAAA,SAAAA,CAAS,KAAK;GAC9C,MAAM,CAAC,aAAa,mBAAA,GAAkBA,MAAAA,SAAAA,CAAS;IAAE,MAAM;IAAI,aAAa;IAAI,SAAS;GAAG,CAAC;GACzF,MAAM,CAAC,eAAe,qBAAA,GAAoBA,MAAAA,SAAAA,CAAwC,KAAA,CAAS;GAC3F,MAAM,CAAC,gBAAgB,sBAAA,GAAqBA,MAAAA,SAAAA,CAAmB;GAC/D,MAAM,qBAAA,GAAoBC,MAAAA,OAAAA,CAAmD,KAAA,CAAS;GACtF,MAAM,WAAA,GAAUA,MAAAA,OAAAA,CAAO,IAAI;GAC3B,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,QAAQ,UAAU;IAClB,aAAa;KACX,QAAQ,UAAU;KAClB,kBAAkB,UAAU,KAAK;KACjC,kBAAkB,UAAU,KAAA;IAC9B;GACF,GAAG,CAAC,CAAC;GACL,MAAM,oBAAA,GAAmBC,MAAAA,YAAAA,EAAa,UAAsC;IAC1E,IAAI,CAAC,QAAQ,SAAS,OAAO,QAAQ,QAAQ,KAAK;IAClD,kBAAkB,UAAU,KAAK;IACjC,kBAAkB,KAAK;IACvB,OAAO,IAAI,SAAS,YAAY;KAAE,kBAAkB,UAAU;IAAQ,CAAC;GACzE,GAAG,CAAC,CAAC;GACL,MAAM,mBAAmB,cAA6B;IACpD,MAAM,SAAS,kBAAkB;IACjC,kBAAkB,UAAU,KAAA;IAC5B,kBAAkB,KAAA,CAAS;IAC3B,SAAS,SAAS;GACpB;GAEA,MAAM,UAAU,YAAY,KAAK,CAAC,CAAC,YAAY;GAC/C,MAAM,WAAA,GAAUC,MAAAA,QAAAA,OAAc,OAAO,aAAa,QAAQ,UAAU;IAClE,IAAI,CAAC,mBAAmB,OAAO,SAAS,GAAG,OAAO;IAClD,IAAI,aAAa,SAAS,KAAK,MAAM,WAAW,cAAc,OAAO;IACrE,IAAI,QAAQ,WAAW,GAAG,OAAO;IACjC,OAAO;KAAC,MAAM;KAAM,MAAM;KAAQ,MAAM;KAAa,MAAM;IAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,OAAO;GAC1G,CAAC,GAAG;IAAC,OAAO;IAAc;IAAW;IAAc;GAAO,CAAC;GAC3D,MAAM,UAAA,GAASA,MAAAA,QAAAA,OAAc,cAAc,OAAO,GAAG,CAAC,OAAO,CAAC;GAC9D,MAAM,SAAyC;IAC7C,KAAK,OAAO,aAAa;IACzB,OAAO,OAAO,aAAa,QAAQ,UAAU,mBAAmB,OAAO,OAAO,CAAC,CAAC,CAAC;IACjF,MAAM,OAAO,aAAa,QAAQ,UAAU,mBAAmB,OAAO,MAAM,CAAC,CAAC,CAAC;IAC/E,SAAS,OAAO,aAAa,QAAQ,UAAU,mBAAmB,OAAO,SAAS,CAAC,CAAC,CAAC;GACvF;GACA,MAAM,iBAAA,GAAgBA,MAAAA,QAAAA,OAAc;IAClC,MAAM,UAAU,cAAc,OAAO,YAAY,CAAC,CAAC,KAAK,UAAU,MAAM,MAAM;IAC9E,OAAO,CACL;KAAE,OAAO;KAAI,OAAO,EAAE,mBAAmB;IAAE,GAC3C,GAAG,QAAQ,KAAK,YAAY;KAAE,OAAO;KAAQ,OAAO,EAAE,iBAAiB,QAAiB;IAAE,EAAE,CAC9F;GACF,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC;GAC3B,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,MAAM,QAAQ,OAAO,OAAO,MAAM,QAAQ;KAAE,OAAO;KAAa,QAAQ;IAAU,CAAC;GACzF,GAAG;IAAC;IAAa;IAAW,MAAM;GAAM,CAAC;GAEzC,MAAM,eAAA,GAAcD,MAAAA,YAAAA,EAAa,MAAc,MAAc,WAA8B;IACzF,OAAO,MAAM,eAAe,MAAM,MAAM,MAAM;GAChD,GAAG,CAAC,KAAK,CAAC;GACV,MAAM,YAAA,GAAWA,MAAAA,YAAAA,EAAa,UAA6B;IAAE,iBAAiB,KAAK;GAAE,GAAG,CAAC,CAAC;;GAG1F,MAAM,gBAAgB,OAAO,WAAkD;IAC7E,IAAI,WAAW,WAAW,MAAM,YAAY;IAC5C,WAAW,UAAU;IACrB,WAAW,MAAM;IACjB,IAAI;KACF,MAAM,OAAO,MAAM,IAAI,cAAc;KACrC,IAAI,SAAS,QAAQ,CAAC,QAAQ,SAAS;KACvC,IAAI,WAAW,UAAU;MACvB,MAAM,MAAM,sBAAsB,MAAM,gBAAgB;MACxD;KACF;KACA,MAAM,UAAU,MAAM,UAAU,CAAC,CAAC;KAClC,IAAI,QAAQ,SAAS,IAAI,GAAG;MAC1B,MAAM,WAAW,SAAS,EAAE,0BAA0B,CAAC;MACvD;KACF;KACA,MAAM,MAAM,kBAAkB,CAAC,GAAG,SAAS,IAAI,CAAC;IAClD,SAAS,OAAO;KACd,IAAI,QAAQ,SAAS,MAAM,WAAW,SAAS,EAAE,+BAA+B,EAAE,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE,CAAC,CAAC;IACrJ,UAAU;KACR,WAAW,UAAU;KACrB,IAAI,QAAQ,SAAS,WAAW,KAAA,CAAS;IAC3C;GACF;GAEA,MAAM,eAAe,YAA2B;IAC9C,MAAM,OAAO,YAAY,KAAK,KAAK;IACnC,IAAI,CAAC,cAAc,KAAK,IAAI,KAAK,YAAY,YAAY,KAAK,CAAC,CAAC,WAAW,GAAG;KAC5E,MAAM,WAAW,SAAS,EAAE,uBAAuB,CAAC;KACpD;IACF;IACA,IAAI,MAAM,MAAM,YAAY;KAAE;KAAM,aAAa,YAAY,YAAY,KAAK;KAAG,SAAS,YAAY;IAAQ,CAAC,GAAG;KAChH,eAAe;MAAE,MAAM;MAAI,aAAa;MAAI,SAAS;KAAG,CAAC;KACzD,YAAY,KAAK;IACnB;GACF;GAEA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAW,GAAG;IAAS,cAAY,EAAE,aAAa;IAA3D,UAAA;KACG,CAAC,OAAO,kBAAkB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAW,GAAG;MAAU,MAAK;MAAU,UAAA,EAAE,mBAAmB;KAAK,CAAA;KAC9F,OAAO,aAAa,SAAS,KAC5B,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAW,GAAG;MAAnB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAW,GAAG;OAAY,MAAK;OAAQ,cAAY,EAAE,kBAAkB;OACzE,UAAA,kBAAkB,KAAK,QACtB,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QAEE,IAAI,iBAAiB,IAAI;QACzB,MAAK;QACL,gBAAc,cAAc,IAAI;QAChC,eAAa,cAAc,IAAI,KAAK,KAAK,KAAA;QACzC,eAAe,aAAa,IAAI,EAAE;QANpC,UAAA;SAQE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;UAAG,WAAW,KAAK,GAAG,cACpB,IAAI,OAAO,UAAU,GAAG,mBACpB,IAAI,OAAO,SAAS,GAAG,kBACrB,IAAI,OAAO,YAAY,GAAG,iBACxB,GAAG,YAAY;UAAG,eAAY;SAAQ,CAAA;SAChD,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,OAAO,IAAI,IAAY,CAAA;SAChC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,EAAE,IAAI,QAAQ,EAAS,CAAA;QACzB;OAdD,GAAA,IAAI,EAcH,CACT;MACE,CAAA,GACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAW,GAAG;OAAY,UAAU,MAAM;OAAY,eAAe,KAAK,MAAM,cAAc;OAAI,UAAA,EAAE,gBAAgB;MAAU,CAAA,CACjJ;;KAGP,iBAAA,GAAA,kBAAA,KAAA,CAAC,iBAAD;MAAiB,IAAG;MAAoB,OAAO,EAAE,sBAAsB;MACrE,MAAM,EAAE,uBAAuB,EAAE,OAAO,OAAO,aAAa,OAAO,CAAC;MADtE,UAAA;OAEE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAW,GAAG;QAAS,gBAAc,OAAO,WAAW,WAAW,IAAI,KAAK,KAAA;QAAhF,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAW,GAAG;SAAnB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAW,GAAG;UAClB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAW,GAAG;WAAU,UAAA,OAAO,cAAc,EAAE,wBAAwB;UAAQ,CAAA;SACjF,CAAA,GACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAW,GAAG;UAAc,UAAA,EAAE,qBAAqB;SAAQ,CAAA,CAC9D;QACL,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAW,GAAG;SAAnB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,WAAW,GAAG;UAAY,UAAU,OAAO,WAAW,WAAW;UACrF,eAAe,KAAK,MAAM,cAAc;UAAI,UAAA,EAAE,qBAAqB;SAAU,CAAA,GAC/E,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,WAAW,GAAG;UAAY,UAAU,MAAM;UAAY,eAAe,KAAK,MAAM,cAAc;UAAI,UAAA,EAAE,mBAAmB;SAAU,CAAA,CACpJ;QACF,CAAA,CAAA;;OACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAW,GAAG;QAAW,gCAA6B;QAA3D,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;SAAa,OAAO,EAAE,yBAAyB;SAC7C,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;UACE,MAAK;UACL,WAAW,GAAG;UACd,UAAU,YAAY,KAAA,KAAa,MAAM;UACzC,eAAe,KAAK,cAAc,QAAQ;UAJ5C,UAAA,CAMG,YAAY,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAW,GAAG;WAAS,eAAY;UAAQ,CAAA,GACzE,EAAE,oBAAoB,CACjB;;QACG,CAAA,GACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;SAAa,OAAO,EAAE,qBAAqB;SACzC,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,WAAW,GAAG;UAAY,UAAU,YAAY,KAAA,KAAa,MAAM;UACvF,eAAe,KAAK,cAAc,WAAW;UAD/C,UAAA,CAEG,YAAY,eAAe,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAW,GAAG;WAAS,eAAY;UAAQ,CAAA,GAC5E,EAAE,qBAAqB,CAClB;;QACG,CAAA,CACV;;OACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAW,GAAG;QAAW,UAAA,EAAE,yBAAyB;OAAK,CAAA;OAC5D,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD,EAAK,WAAW,GAAG,YAAc,CAAA;OACjC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAW,GAAG;QACjB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAW,GAAG;SAAY,iBAAe;SAC7D,eAAe,aAAa,UAAU,CAAC,KAAK;SAC3C,UAAA,WAAW,EAAE,qBAAqB,IAAI,EAAE,oBAAoB;QACvD,CAAA;OACL,CAAA;OACJ,YACC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAW,GAAG;QAAnB,UAAA;SACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;UAAO,WAAW,GAAG;UAArB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,oBAAoB,EAAQ,CAAA,GACrC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;WACE,WAAW,GAAG;WACd,OAAO,YAAY;WACnB,cAAY,EAAE,oBAAoB;WAClC,gBAAc,YAAY,KAAK,SAAS,KAAK,CAAC,cAAc,KAAK,YAAY,KAAK,KAAK,CAAC;WACxF,aAAa,EAAE,+BAA+B;WAC9C,YAAY;WACZ,WAAW,UAAU,gBAAgB,WAAW;YAAE,GAAG;YAAO,MAAM,MAAM,OAAO;WAAM,EAAE;UACxF,CAAA,CACI;;SACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;UAAO,WAAW,GAAG;UAArB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,2BAA2B,EAAQ,CAAA,GAC5C,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;WACE,WAAW,GAAG;WACd,OAAO,YAAY;WACnB,cAAY,EAAE,2BAA2B;WACzC,aAAa,EAAE,sCAAsC;WACrD,WAAW,UAAU,gBAAgB,WAAW;YAAE,GAAG;YAAO,aAAa,MAAM,OAAO;WAAM,EAAE;UAC/F,CAAA,CACI;;SACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;UAAO,WAAW,GAAG;UAArB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,uBAAuB,EAAQ,CAAA,GACxC,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;WACE,WAAW,GAAG;WACd,MAAM;WACN,OAAO,YAAY;WACnB,cAAY,EAAE,uBAAuB;WACrC,aAAa,EAAE,kCAAkC;WACjD,YAAY;WACZ,WAAW,UAAU,gBAAgB,WAAW;YAAE,GAAG;YAAO,SAAS,MAAM,OAAO;WAAM,EAAE;UAC3F,CAAA,CACI;;SACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;UAAK,WAAW,GAAG;UAAnB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;WAAQ,MAAK;WAAS,WAAW,GAAG;WAAa,UAAU,MAAM;WAAY,eAAe,KAAK,aAAa;WAA9G,UAAA,CACG,MAAM,cAAc,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;YAAM,WAAW,GAAG;YAAS,eAAY;WAAQ,CAAA,GACrE,EAAE,sBAAsB,CACnB;UACR,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,MAAK;WAAS,WAAW,GAAG;WAAY,eAAe;YAAE,YAAY,KAAK;YAAG,eAAe;aAAE,MAAM;aAAI,aAAa;aAAI,SAAS;YAAG,CAAC;WAAE;WAC7I,UAAA,EAAE,mBAAmB;UAChB,CAAA,CACL;;SACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;UAAG,WAAW,GAAG;UAAkB,UAAA,EAAE,oBAAoB;SAAK,CAAA;QAC3D;;OAEP,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD,EAAK,WAAW,GAAG,YAAc,CAAA;OAChC,OAAO,aAAa,WAAW,IAC5B,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAW,GAAG;QAAW,UAAA,EAAE,sBAAsB;OAAK,CAAA,IAEzD,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAW,GAAG;QAChB,UAAA,OAAO,aAAa,KAAK,SACxB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAgB,WAAW,GAAG;SAA9B,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;UAAK,WAAW,GAAG;UAAa,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAW,GAAG;WAAU,UAAA;UAAW,CAAA;SAAM,CAAA,GAC/E,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;UAAK,WAAW,GAAG;UACjB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,MAAK;WAAS,WAAW,GAAG;WAAY,UAAU,MAAM;WAC9D,eAAe,KAAK,MAAM,kBAAkB,OAAO,aAAa,QAAQ,SAAS,SAAS,IAAI,CAAC;WAC9F,UAAA,EAAE,uBAAuB;UACpB,CAAA;SACL,CAAA,CACF;QARK,GAAA,IAQL,CACN;OACE,CAAA;MAEM;;KAEhB,OAAO,aAAa,SAAS,KAC5B,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAW,GAAG;MAAnB,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QACE,MAAK;QACL,WAAW,GAAG;QACd,OAAO;QACP,cAAY,EAAE,oBAAoB;QAClC,aAAa,EAAE,2BAA2B;QAC1C,YAAY;QACZ,WAAW,UAAU,eAAe,MAAM,OAAO,KAAK;OACvD,CAAA;OACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;QACE,OAAO;QACP,SAAS;QACT,UAAU;QACV,WAAW,EAAE,oBAAoB;QACjC,aAAa,EAAE,mBAAmB;QAClC,WAAW,GAAG;QACd,SAAA;OACD,CAAA;OACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAW,GAAG;QAAgB,MAAK;QAAU,UAAA,EAAE,kBAAkB,EAAE,OAAO,QAAQ,OAAO,CAAC;OAAQ,CAAA;MACrG;;KAGN,OAAO,aAAa,WAAW,IAC9B,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAW,GAAG;MAAnB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAW,GAAG;OAAY,eAAY;OAAO,UAAA;MAAO,CAAA,GAC1D,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,oBAAoB,EAAM,CAAA;OACjC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,mBAAmB,EAAK,CAAA;OAC9B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAW,GAAG;QAAY,UAAU,YAAY,KAAA,KAAa,MAAM;QAAY,eAAe,KAAK,cAAc,QAAQ;QAAI,UAAA,EAAE,oBAAoB;OAAU,CAAA;MAChL,EAAA,CAAA,CACF;KACH,CAAA,IAAA,QAAQ,WAAW,IACrB,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;MAAG,WAAW,GAAG;MAAU,MAAK;MAAhC,UAAA,CACG,EAAE,gBAAgB,GACnB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAW,GAAG;OAAY,eAAe;QAAE,eAAe,EAAE;QAAG,aAAa,KAAK;QAAG,gBAAgB,EAAE;OAAE;OAAI,UAAA,EAAE,sBAAsB;MAAU,CAAA,CACnK;KAEH,CAAA,IAAA,OAAO,KAAK,UACV,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;MAA4B,WAAW,GAAG;MAAY,cAAY,EAAE,iBAAiB,MAAM,QAAiB;MAA5G,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;OAAQ,WAAW,GAAG;OAAtB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,iBAAiB,MAAM,QAAiB,EAAU,CAAA,GAC7D,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAW,GAAG;QAAkB,UAAA,EAAE,qBAAqB;SAAE,OAAO,MAAM,OAAO;SAAQ,MAAM,MAAM;QAAK,CAAC;OAAQ,CAAA,CAC/G;MACR,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAW,GAAG;OAChB,UAAA,MAAM,OAAO,KAAK,UACjB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAES;QACJ;QACH,MAAM,MAAM;QACL;QACP,WAAW,IAAI,iBAAiB;QACnB;QACH;OACX,GARM,KAAK,UAAU;QAAC,IAAI,iBAAiB;QAAG,MAAM;QAAI,MAAM;OAAI,CAAC,CAQnE,CACF;MACE,CAAA,CACE;KAnBK,GAAA,MAAM,MAmBX,CACV;KAGF,mBAAmB,KAAA,KAClB,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;MACE,OAAO,EAAE,wBAAwB;MACjC,aAAa,EAAE,gCAAgC,EAAE,OAAO,eAAe,KAAK,GAAG,EAAE,CAAC;MAClF,cAAc,EAAE,0BAA0B;MAC1C,aAAa,EAAE,mBAAmB;MAClC,iBAAiB,gBAAgB,IAAI;MACrC,gBAAgB,gBAAgB,KAAK;KACtC,CAAA;KAEF,iBACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;MACE,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,KAAK,CAAC;MAC5D,aAAa,EAAE,6BAA6B,EAAE,MAAM,cAAc,QAAQ,cAAc,IAAI,CAAC;MAC7F,cAAc,EAAE,uBAAuB;MACvC,aAAa,EAAE,mBAAmB;MAClC,WAAW,YAAY;OAAE,IAAI,CAAC,MAAM,MAAM,YAAY,aAAa,GAAG,MAAM,IAAI,MAAM,EAAE,sBAAsB,CAAC;MAAE;MACjH,gBAAgB,iBAAiB,KAAA,CAAS;KAC3C,CAAA;IAEI;;EAEb,CAAC;;;;EC9VD,SAAgB,gBAAgB,QAA2B,QAAyD;GAClH,IAAI,SAAS;GACb,KAAK,OAAO,aAAa,OAAO,YAAY,GAAA,CAAI,SAAS,GACvD,WAAgB,eAAe,MAAM,CAAC,CAAC,MAAM,WAAW;IACtD,IAAI,QAAQ,OAAO,MAAM;GAC3B,CAAC;GAEH,aAAa;IAAE,SAAS;GAAM;EAChC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECRA,MAAM,WAAW,OAAyB,UACxC,MAAM,KAAK,YAAY,CAAC,CAAC,SAAS,KAAK,KAAK,MAAM,YAAY,YAAY,CAAC,CAAC,SAAS,KAAK;;EAG5F,SAAgB,gBAAgB,EAAE,OAAO,QAAQ,GAAG,aAAa,WAAW,IAAI,gBAElE;GACZ,MAAM,kBAAkB,eAAe,EAAE,2BAA2B;GACpE,MAAM,UAAA,GAASE,MAAAA,MAAAA,CAAM;GACrB,MAAM,CAAC,UAAU,gBAAA,GAAeC,MAAAA,SAAAA,CAAwB,gBAAgB,IAAI;GAC5E,MAAM,UAAU,MAAM,QAAQ,UAAU,QAAQ,OAAO,OAAO,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC;GACnF,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IAAG,WAAWC,yBAAI;IAAiB,MAAK;IAAU,UAAA,EAAE,uBAAuB;KAAE,SAAS,QAAQ;KAAQ,OAAO,MAAM;IAAO,CAAC;GAAK,CAAA,GAC/H,QAAQ,WAAW,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IAAG,WAAWA,yBAAI;IAAkB,UAAA,MAAM,WAAW,IAAI,EAAE,2BAA2B,IAAI,EAAE,2BAA2B;GAAK,CAAA,IAClJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;IAAI,WAAWA,yBAAI;IAAkB,cAAY,EAAE,yBAAyB;IACzE,UAAA,QAAQ,KAAK,OAAO,UAAU;KAC7B,MAAM,MAAM,GAAG,MAAM,KAAK,GAAG;KAC7B,MAAM,OAAO,aAAa,OAAO,aAAa,MAAM;KACpD,MAAM,WAAW,GAAG,OAAO,QAAQ;KACnC,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;MAAc,WAAWA,yBAAI;MAAiB,kBAAe;MAAO,aAAW,QAAQ,KAAA;MAAvF,UAAA,CACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAWA,yBAAI;OAAgB,iBAAe;OAAM,iBAAe;OACvF,cAAY,EAAE,2BAA2B,EAAE,MAAM,MAAM,KAAK,CAAC;OAAG,eAAe,YAAY,OAAO,OAAO,GAAG;OAD9G,UAAA,CAEE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,WAAWA,yBAAI;QAAgB,UAAA,MAAM;OAAa,CAAA,GAC1D,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;QAAM,WAAWA,yBAAI;QAArB,UAAA,CAAuC,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;SAAa,MAAK;SAAU,OAAO,EAAE,6BAA6B;QAAI,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,+BAAD;SAA+B,WAAWD,yBAAI;SAAa,eAAY;QAAQ,CAAA,CAAO;OAC9L,CAAA,CAAA;MACP,CAAA,GAAA,QAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,IAAI;OAAU,WAAWA,yBAAI;OAAlC,UAAA,CACP,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,yBAAI;QAAiB,UAAA,MAAM;OAAW,CAAA,GACvD,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;QAAI,WAAWA,yBAAI;QAAnB,UAAA;SACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,2BAA2B,EAAM,CAAA;SAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,MAAM,KAAS,CAAA;SAC7D,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,2BAA2B,EAAM,CAAA;SAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA,CAAK,iBAAiB,YAAY,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CAAE,OAAG,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,SAAe,CAAA,CAAG,EAAA,CAAA,CAAM,EAAA,CAAA;SAC/G,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,6BAA6B,EAAM,CAAA;SAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,6BAA6B,EAAM,CAAA;SACrF,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,kCAAkC,EAAM,CAAA;SAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,MAAM,eAAe,EAAE,oCAAoC,EAAM,CAAA;QACpH;OACD,CAAA,CAAA;MACH,CAAA,CAAA;KAfY,GAAA,GAeZ;IACN,CAAC;GACC,CAAA,CAEN,EAAA,CAAA;EACJ;EAEA,SAAgB,gBAAgB,OAAoC;GAClE,MAAM,MAAM,MAAM,cAAc,KAAA,IAAY,WAAW,MAAM,cAAc,UAAU,MAAM;GAC3F,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,oBAAD,EAA8B,GAAI,MAAQ,GAAjB,GAAiB;EACnD;EAEA,SAAS,mBAAmB,OAAoC;GAC9D,MAAM,EAAE,MAAM;GACd,MAAM,EAAE,WAAW,UAAU,QAAQ,OAAO;GAC5C,MAAM,CAAC,QAAQ,cAAA,GAAaD,MAAAA,SAAAA,CAAmC,IAAI;GACnE,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS,CAAC;GAC1C,MAAM,WAAW,cAAc,KAAA,IAAY,WAAW,cAAc,UAAU;GAC9E,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS,MAAM,gBAAgB,aAAa,IAAI;GAChF,MAAM,aAAA,GAAYD,MAAAA,MAAAA,CAAM;GACxB,MAAM,WAAW,aAAa,YAAY;GAC1C,MAAM,UAAU,SAAS,SAAS,KAAK,WAAW;GAClD,MAAM,OAAO,YAAY,MAAM,KAAK,CAAC,CAAC,SAAS;GAC/C,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,IAAI,CAAC,SAAS,MAAM,UAAU;GAAE,GAAG,CAAC,SAAS,MAAM,OAAO,CAAC;GAC7E,CAAA,GAAA,MAAA,UAAA,OAAgB,gBAAgB,cAAc,KAAA,IAAY,EAAE,UAAU,IAAI,EAAY,SAAU,GAAG,SAAS,GAAG;IAAC;IAAW;IAAU;GAAQ,CAAC;GAC9I,MAAM,QAAQ,QAAQ,KAAK,OAAO,MAAM,MAAM,QAAQ,UAAU,QAAQ,OAAO,MAAM,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,KAAA;GAErH,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAWE,yBAAI;IAAW,cAAY,MAAM;IAAO,aAAW;IAAvE,UAAA;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,yBAAI;MAApB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAWA,yBAAI;OAAiB,iBAAe;OAAM,iBAAe;OAAW,eAAe;QAClH,YAAY,CAAC,IAAI;QACjB,IAAI,MAAM,eAAe,MAAM,cAAc,YAAY,CAAC;OAC5D;OAHA,UAAA,CAIE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,+BAAD;QAA+B,WAAWD,yBAAI;QAAa,eAAY;OAAQ,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,MAAM,MAAY,CAAA,CACnG;MACR,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWA,yBAAI;OAAmB,UAAA,MAAM;MAAkB,CAAA,CAC5D;;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;MAAG,WAAWA,yBAAI;MAAlB,UAAA,CAAiC,cAAc,KAAA,IAAY,EAAE,2BAA2B,IAAI,EAAE,0BAA0B,GAAG,UAAU,KAAA,KAAa,EAAE,2BAA2B,EAAE,MAAM,CAAC,CAAK;;KAC5L,QAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,yBAAI;MAAe,IAAI;MAAvC,UAAA;OACN,MAAM;OACN,SAAS,WAAW,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAWA,yBAAI;QAAkB,UAAA,cAAc,KAAA,IAAY,EAAE,yBAAyB,IAAI,EAAE,wBAAwB;OAAK,CAAA,IAAI,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;QACvJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAWA,yBAAI;SAApB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;UAAG,WAAWA,yBAAI;UAAlB,UAAA,CAAoC,EAAE,sBAAsB,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,SAAe,CAAA,CAAI;SACxF,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,WAAWA,yBAAI;UAAa,UAAU;UAAS,eAAe;WAAE,UAAU,IAAI;WAAG,aAAa,UAAU,QAAQ,CAAC;UAAE;UAAI,UAAA,EAAE,uBAAuB;SAAU,CAAA,CAC7K;;QACJ,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAWA,yBAAI;SAAiB,MAAK;SAAU,UAAA,EAAE,uBAAuB;QAAK,CAAA;QAC3F,WAAW,SAAS,OAAO,KACxB,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD;SAAiB,OAAO,OAAO,MAAM;SAAO,QAAQ;SAAU;SAAG,aAAa,MAAM;SAAiB;QAAW,CAAA,IAChH,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;SAAG,WAAWA,yBAAI;SAAkB,MAAK;SAAzC,UAAA,CAAkD,OAAO,WAAW,EAAE,0BAA0B,GAAG,EAAE,2BAA2B,CAAK;;OACzI,EAAA,CAAA;OACF,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAWA,yBAAI;QAAkB,UAAA,cAAc,KAAA,IAC9C,EAAE,4BAA4B,IAC9B,EAAE,2BAA2B;OAAK,CAAA;MACnC;;IACE;;EACX;;;;ECxFA,SAAgB,iBAAiB,EAAE,KAAK,UAAU,GAAG,QAAQ,YAAY,WAA8O;GACrT,MAAM,CAAC,OAAO,aAAA,GAAYE,MAAAA,SAAAA,CAAS,QAAQ,SAAS,EAAE;GACtD,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS,CAAC;GAC1C,MAAM,CAAC,YAAY,kBAAA,GAAiBA,MAAAA,SAAAA,CAAS,QAAQ,cAAc,EAAE;GACrE,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAqE,CAAC,CAAC;GACrG,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAS,IAAI;GAC3C,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAS,EAAE;GACrC,MAAM,OAAO,IAAI;GACjB,MAAM,EAAE,eAAA,GAAcC,MAAAA,qBAAAA,CAAqB,KAAK,WAAW,KAAK,UAAU,KAAK,QAAQ;GACvF,MAAM,CAAC,cAAc,oBAAA,GAAmBD,MAAAA,SAAAA,CAAiB;GACzD,MAAM,CAAC,aAAa,mBAAA,GAAkBA,MAAAA,SAAAA,CAAiB;GACvD,MAAM,gBAAA,GAAeE,MAAAA,YAAAA,OAAkB,gBAAgB,aAAa,EAAE,GAAG,CAAC,SAAS,CAAC;GACpF,MAAM,eAAA,GAAcA,MAAAA,YAAAA,OAAkB,eAAe,UAAU,GAAG,CAAC,UAAU,CAAC;GAC9E,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,WAAW,kBAAkB,aAAa,OAAO,gBAAgB,YAAY,UAAU;GAC9F,GAAG;IAAC;IAAS;IAAc;IAAa;IAAW;IAAY;GAAO,CAAC;GACvE,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,IAAI,QAAQ,OAAO,OAAO,QAAQ;KAAE;KAAO;IAAW,CAAC;GAAE,GAAG;IAAC;IAAQ;IAAO;GAAU,CAAC;GAEzG,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,SAAS;IACb,WAAW,IAAI;IACf,SAAS,EAAE;IACX,QAAa,QAAQ,CAAC,CAAC,WAAW,IAAI,iBAAiB,CAAC,CAAC,CAAC,MAAM,YAAY;KAC1E,IAAI,CAAC,QAAQ;KACb,WAAW,OAAO;KAClB,eAAe,YAAY,QAAQ,MAAM,WAAW,OAAO,OAAO,OAAO,IACrE,UAAU,QAAQ,MAAM,WAAW,OAAO,OAAO,QAAQ,IAAI,WAAY,QAAQ,EAAE,EAAE,MAAM,EAAE;KACjG,WAAW,KAAK;IAClB,IAAI,WAAoB;KACtB,IAAI,CAAC,QAAQ;KACb,SAAS,kBAAkB,QAAQ,OAAO,UAAU,EAAE,kBAAkB,CAAC;KACzE,WAAW,KAAK;IAClB,CAAC;IACD,aAAa;KAAE,SAAS;IAAM;GAChC,GAAG;IAAC,IAAI;IAAkB;IAAU;IAAU;GAAC,CAAC;GAEhD,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAWC,yBAAI;IAAkB,cAAY,EAAE,YAAY;IAApE,UAAA;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;MAAO,WAAWA,yBAAI;MAAtB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,0BAAD,EAA0B,eAAY,OAAQ,CAAA,GAC9C,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;OAAO,MAAK;OAAS,cAAY,EAAE,mBAAmB;OAAG,aAAa,EAAE,0BAA0B;OAAG,OAAO;OAC1G,WAAW,UAAU,SAAS,MAAM,OAAO,KAAK;MAAI,CAAA,CACjD;;KACP,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD;MAAiB,WAAW,aAAa;MAAI,SAAS;MAAc,eAAe,QAAQ;MAAU,OAAO,EAAE,uBAAuB;MAAM;MAAU;KAAQ,CAAA;KAC7J,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD;MAAiB,UAAU;MAAY,SAAS;MAAa,eAAe,QAAQ;MAAU,OAAO,EAAE,sBAAsB;MAAM;MAAU;MAAO,cAClJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;OAAY,WAAW,EAAE,2BAA2B;OAAG,OAAO;OAAY,aAAa,EAAE,kCAAkC;OACzH,UAAU,WAAW,QAAQ,WAAW;OAAG,WAAWD,yBAAI;OAAkB,UAAU;OACtF,SAAS,QAAQ,KAAK,YAAY;QAAE,OAAO,OAAO;QAAI,OAAO,OAAO,QAAQ,OAAO;OAAG,EAAE;MAAI,CAAA;MAE9F,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,yBAAI;OAApB,UAAA;QACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAWA,yBAAI;SAAa,UAAU;SAAS,eAAe,aAAa,UAAU,QAAQ,CAAC;SAAI,UAAA,EAAE,sBAAsB;QAAU,CAAA;QACzJ,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAWA,yBAAI;SAAiB,MAAK;SAAU,UAAA,EAAE,sBAAsB;QAAQ,CAAA;QAChG,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAWA,yBAAI;SAAkB,MAAK;SAAS,UAAA;QAAY,CAAA;QAC1E,CAAC,WAAW,CAAC,SAAS,QAAQ,WAAW,KAAK,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;SAAM,WAAWA,yBAAI;SAArB,UAAA;UAAuC,EAAE,iBAAiB;UAAE;UAAE,cAAc,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,MAAK;WAAS,WAAWA,yBAAI;WAAa,eAAe,WAAW,SAAS;WAAI,UAAA,EAAE,wBAAwB;UAAU,CAAA;SAAQ;;OAC7P;;KACU,CAAA;KACjB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAWA,yBAAI;MAAkB,UAAA,EAAE,gBAAgB;KAAK,CAAA;IACpD;;EACX;;;;;;;;;;EC1DA,MAAM,kBAAkB;EACxB,MAAM,sBAAsB;;;;;;;EAQ5B,MAAa,eAAe,OAAuB,IAAI,OAAO,EAAE;;;;;;;EAQhE,SAAgB,oBAAoB,UAA8B;GAChE,IAAI,WAAW;GACf,IAAI;GACJ,IAAI;GACJ,MAAM,gBAAsB;IAC1B,MAAM,SAAS,SAAS,cAAc,QAAQ;IAC9C,IAAI,WAAW,MAAM;KACnB,YAAY;KACZ,IAAI,YAAY,qBAAqB,QAAQ,WAAW,SAAS,eAAe;KAChF;IACF;IAEA,QAAQ,4BAA4B;KAElC,IAAI;MACF,OAAO,eAAe;OAAE,OAAO;OAAW,QAAQ;MAAU,CAAC;KAC/D,QAAQ;MACN,OAAO,eAAe;KACxB;IACF,CAAC;GACH;GACA,QAAQ;GACR,aAAa;IACX,IAAI,UAAU,KAAA,GAAW,aAAa,KAAK;IAC3C,IAAI,UAAU,KAAA,GAAW,qBAAqB,KAAK;GACrD;EACF;;;;EC9CA,SAAgB,UAAU,OAA8I;GACtK,MAAM,MAAA,GAAKE,MAAAA,MAAAA,CAAM;GACjB,MAAM,UAAU,GAAG,GAAG;GACtB,MAAM,SAAS,GAAG,GAAG;GACrB,MAAM,WAAA,GAAUC,MAAAA,eAAAA,CAAe,MAAM,QAAQ,KAAA,GACzCC,MAAAA,aAAAA,CAAa,MAAM,UAAkG;IACrH;IACA,GAAI,MAAM,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC9C,oBAAoB;KAAC,MAAM,SAAS,MAAM;KAAqB,MAAM,QAAQ,UAAU,KAAA;KAAW,MAAM,aAAa,aAAa,MAAM,OAAO,SAAS,KAAA;IAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,KAAK,KAAA;GAClM,CAAC,IACC,MAAM;GACV,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAW,MAAM,cAAc,KAAA,IAAYC,4BAAO,cAAc,GAAGA,4BAAO,YAAY,GAAG,MAAM;IAApG,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;MAAO,WAAWA,4BAAO;MAAkB,SAAS;MAAK,UAAA,MAAM;KAAa,CAAA;KAC3E,MAAM,aAAa,aAAa,MAAM,SAAS,KAAA,IAC5C,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;MAAa,OAAO,MAAM;MAAM,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWA,4BAAO;OAA2B,UAAA;MAAa,CAAA;KAAc,CAAA,IAC7G;KACH,MAAM,aAAa,aAAa,MAAM,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,IAAI;MAAQ,WAAWA,4BAAO;MAAkB,UAAA,MAAM;KAAQ,CAAA;KAC/G,MAAM,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,IAAI;MAAS,WAAWA,4BAAO;MAAkB,MAAK;MAAS,UAAA,MAAM;KAAS,CAAA;IAC9F;;EAET;;;;ECrBA,SAAgB,SAAS,OAUX;GACZ,MAAM,EAAE,IAAI,OAAO,MAAM,UAAU,OAAO,aAAa,UAAU,UAAU,aAAa;GACxF,MAAM,CAAC,OAAO,aAAA,GAAYC,MAAAA,SAAAA,CAAS,EAAE;GACrC,MAAM,OAAO,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,QAAQ,IAAI,SAAS,CAAC;GAErF,MAAM,oBAAoB;IACxB,MAAM,OAAO,MAAM,KAAK;IACxB,SAAS,EAAE;IACX,IAAI,KAAK,WAAW,KAAK,KAAK,SAAS,IAAI,GAAG;IAC9C,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC;IACnC,SAAS;GACX;GAEA,MAAM,UAAU,QAAgB;IAC9B,SAAS,KAAK,QAAQ,SAAS,SAAS,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC;IACvD,SAAS;GACX;GAEA,MAAM,UACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWC,4BAAO;IAAU,iBAAe,WAAW,KAAK,KAAA;IAAhE,UAAA,CACK,KAAK,KAAK,QACT,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;KAAgB,WAAWA,4BAAO;KAAlC,UAAA,CACG,KACA,CAAC,YACA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,WAAWA,4BAAO;MAAe,cAAY,MAAM;MAAO,eAAe,OAAO,GAAG;MAAG,UAAA;KAAS,CAAA,CAEnH;IALK,GAAA,GAKL,CACP,GACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;KACM;KACJ,WAAWA,4BAAO;KAClB,OAAO;KACP,cAAY;KACZ,aAAa,KAAK,WAAW,IAAK,eAAe,YAAa,KAAA;KACpD;KACV,YAAY;KACZ,WAAW,UAAU,SAAS,MAAM,OAAO,KAAK;KAChD,YAAY,UAAU;MACpB,IAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;OAC9C,MAAM,eAAe;OACrB,YAAY;MACd,OAAO,IAAI,MAAM,QAAQ,eAAe,MAAM,WAAW,KAAK,KAAK,SAAS,GAC1E,OAAO,KAAK,KAAK,SAAS,EAAG;KAEjC;KACA,QAAQ;IACT,CAAA,CACA;;GAEP,MAAM,QACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWA,4BAAO;IAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;KAAM,WAAWA,4BAAO;KAAxB,UAAA,CAAqC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,MAAc,CAAA,GAAE,aAAa,aAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,KAAY,CAAA,CAAQ;IACnH,CAAA,GAAA,aAAa,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;KAAa,OAAO;KAAO,UAAA;IAAqB,CAAA,IAAI,OAC3E;;GAEP,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,WAAWA,4BAAO;IACpB,UAAA;GACE,CAAA;EAET;;;ECxEA,SAAgB,mBAAmB,OAA+C;GAChF,MAAM,KAAK,MAAM;GACjB,IAAI,OAAO,QAAQ,eAAe,OAAO,IAAI,aAAa,cAAc,IAAI,SAAS,gBAAgB,SAAS,GAAG;GACjH,GAAG,MAAM,SAAS;GAClB,GAAG,MAAM,SAAS,GAAG,GAAG,aAAa;EACvC;;;;;;;;ECuGA,MAAa,0BAA0B;GACrC;GAAY;GAAU;GAAa;GAAY;GAAc;GAC7D;GAAS;GAAQ;GAAe;GAAW;EAC7C;;;;;;;;ECzGA,MAAa,eAAe;GAAC;GAAI;GAAU;GAAoB;GAAoB;GAAiB;EAAW;EAC/G,MAAa,eAAe;GAAC;GAAU;GAAQ;GAAgB;EAAE;;;;;EAMjE,MAAa,mBAAmB;;;;EAKhC,SAAgB,cAAc,YAA+B,QAAqC;GAChG,OAAO,CAAC,GAAG,YAAY,GAAG,OAAO,QAAQ,UAAU,CAAC,WAAW,SAAS,KAAK,CAAC,CAAC;EACjF;;;;;EAMA,SAAgB,eACd,GACA,MACA,OACQ;GACR,MAAM,MAAM,KAAK;GACjB,OAAO,QAAQ,KAAA,IAAY,QAAQ,EAAE,GAAG;EAC1C;;EAGA,MAAa,sBAA2D;GAAE,IAAI;GAAiB,MAAM;GAAiB,UAAU;EAAoB;;;;;;EAMpJ,MAAa,mBAA6D;GACxE,YAAY;GACZ,kBAAkB;GAClB,mBAAmB;GACnB,iBAAiB;GACjB,cAAc;GACd,iBAAiB;GACjB,aAAa;GACb,kBAAkB;GAClB,gBAAgB;EAClB;EACA,MAAa,sBAA2D;GACtE,QAAQ;GACR,aAAa;GACb,qBAAqB;GACrB,cAAc;GACd,mBAAmB;GACnB,cAAc;EAChB;EACA,MAAa,uBAA4D;GAAE,SAAS;GAAoB,QAAQ;EAAkB;EAClI,MAAa,kBAAuD,EAAE,MAAM,YAAY;EACxF,MAAa,sBAA2D;GAAE,cAAc;GAAsB,cAAc;GAAsB,aAAa;EAAoB;EACnL,MAAa,wBAA6D;GAAE,UAAU;GAAkB,QAAQ;EAAe;EAC/H,MAAa,oBAAyD;GAAE,MAAM;GAAe,SAAS;GAAkB,OAAO;EAAe;EAC9I,MAAa,uBAA4D;GAAE,MAAM;GAAkB,MAAM;GAAkB,qBAAqB;EAAsB;EACtK,MAAa,yBAA8D;GAAE,KAAK;GAAkB,KAAK;GAAkB,OAAO;EAAmB;;EAErJ,MAAa,kCAAuE;GAClF,UAAU;GACV,QAAQ;GACR,OAAO;GACP,KAAK;GACL,aAAa;GACb,SAAS;GACT,kBAAkB;EACpB;;EAEA,MAAa,wBAAgD,CAAC,kBAAkB,iBAAiB;EACjG,MAAa,kBAAuD;GAAE,IAAI;GAAa,oBAAoB;GAAwB,aAAa;GAAiB,iBAAiB;EAAoB;;EAEtM,MAAa,yBAA8D;GAAE,IAAI;GAAsB,QAAQ;GAAqB,oBAAoB;GAA8B,oBAAoB;GAA8B,iBAAiB;GAA2B,aAAa;EAAsB;EACvT,MAAa,yBAA8D;GAAE,QAAQ;GAAqB,MAAM;GAAmB,cAAc;GAA2B,IAAI;EAAqB;;;;;;EAMrM,MAAa,4BAAiE;GAAE,QAAQ;GAAmB,MAAM;EAAgB;;;;;EAKjI,MAAa,4BAAiE;GAAE,MAAM;GAAsB,MAAM;EAAqB;;EAEvI,MAAa,qBAA0D;GACrE,IAAI;GACJ,UAAU;GACV,YAAY;GACZ,aAAa;GACb,eAAe;GACf,cAAc;EAChB;;;;;;EAMA,MAAa,eAAsC;GAAC;GAAO;GAAO;GAAO;EAAQ;EACjF,MAAa,yBAAkE;GAC7E,KAAK;GACL,KAAK;GACL,KAAK;GACL,QAAQ;EACV;;;;;;EAMA,MAAa,oBAAoB;GAAC;GAAQ;GAAS;EAAS;EAC5D,MAAa,8BAAmE;GAC9E,MAAM;GACN,OAAO;GACP,SAAS;EACX;;EAIA,MAAM,eAAe,OAAO,YAC1B,wBAAwB,KAAK,QAAwC,CAAC,KAAK,KAAK,CAAC,CACnF;EAEA,SAAgB,eAAe,MAAkB,OAA6C;GAC5F,OAAO,KAAK,mBAAoB,SAAS,eAAgB;EAC3D;EAEA,SAAgB,iBAAiB,MAAkB,OAAsD;GACvG,OAAQ,KAAK,iBAA+D,SAAS;EACvF;;EAGA,SAAgB,iBAAiB,MAAkB,QAA2B,OAA2C;GACvH,MAAM,SAAS,eAAe,MAAM,KAAK;GACzC,MAAM,WAAW,iBAAiB,MAAM,KAAK;GAC7C,MAAM,QAAoC;IAAE;IAAO,GAAG,sBAAsB,MAAM,KAAK;GAAE;GACzF,KAAK,MAAM,SAAS;IAAC;IAAY;IAAU;IAAa;IAAY;IAAc;GAAM,GACtF,IAAI,CAAC,OAAO,UAAU,OAAO,UAAU,MAAM,OAAO,OAAO,OAAO,GAAG,QAAQ,KAAA,EAAU,CAAC;GAE1F,IAAI,CAAC,OAAO,SAAS,OAAO,cAAc,KAAA,GAAW,MAAM,YAAY,KAAA;GACvE,IAAI,OAAO,YAAY,KAAA,KAAa,aAAa,KAAA,KAAa,CAAC,SAAS,SAAS,SAAS,OAAO,OAAO,GAAG,MAAM,UAAU,KAAA;GAC3H,IAAI,aAAa,KAAA,KAAa,CAAC,SAAS,WAAW,SAAS,OAAO,YAAY,QAAQ,GAAG;IACxF,MAAM,WAAW;IACjB,MAAM,OAAO,KAAA;GACf;GACA,OAAO;EACT;;;;;;EAOA,SAAgB,sBAAsB,MAAkB,OAA6D;GACnH,MAAM,SAAS,eAAe,MAAM,KAAK;GACzC,OAAO;IACL,GAAI,OAAO,UAAU,CAAC,IAAI,EAAE,SAAS,KAAA,EAAU;IAC/C,GAAI,OAAO,QAAQ,CAAC,IAAI,EAAE,OAAO,KAAA,EAAU;GAC7C;EACF;;;;;;EAOA,SAAgB,eAAe,OAA8E;GAC3G,MAAM,QAAQ,OAAO,QAAQ,CAAC,EAAA,CAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,QAAQ,IAAI,SAAS,CAAC;GACxF,MAAM,iBAAiB,OAAO,iBAAiB,CAAC,EAAA,CAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,QAAQ,QAAQ,IAAI,SAAS,CAAC;GAC1G,IAAI,KAAK,WAAW,KAAK,cAAc,WAAW,GAAG,OAAO,KAAA;GAE5D,MAAM,QAAQ,aAAa,MAAM,UAAU,UAAU,OAAO,KAAK;GACjE,OAAO;IACL;IACA,GAAI,cAAc,SAAS,IAAI,EAAE,cAAc,IAAI,CAAC;IACpD,GAAI,UAAU,KAAA,KAAa,UAAU,QAAQ,EAAE,MAAM,IAAI,CAAC;IAC1D,GAAI,OAAO,kBAAkB,OAAO,EAAE,eAAe,KAAK,IAAI,CAAC;IAC/D,GAAI,OAAO,eAAe,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IACzD,GAAI,OAAO,aAAa,KAAA,IAAY,EAAE,UAAU,MAAM,aAAa,KAAK,IAAI,CAAC;GAC/E;EACF;;;;;EAMA,SAAS,eAAe,MAAc,SAA0B;GAC9D,OAAO,QAAQ,WAAW,KAAK,KAAK,YAAY,CAAC,CAAC,SAAS,OAAO;EACpE;;EAGA,SAAgB,iBAAiB,QAA2B,GAAgC;GAC1F,MAAM,SAAS,OAAO,KAAK,OAAO,UAAU,CAAC,CAAC;GAC9C,OAAO;IACL,OAAO;IACP,OAAO,QAAQ;IACf,OAAO,SAAS;IAChB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,OAAO,UAAU;IACjB,OAAO,aAAa;IACpB,OAAO,QAAQ;IACf,OAAO,cAAc;IACrB,OAAO,QAAQ;IACf,OAAO,QAAQ;IACf,OAAO,YAAY;IACnB,OAAO,cAAc;IACrB,GAAG;IACH,eAAe,GAAG,kBAAkB,OAAO,SAAS,UAAU;IAC9D,eAAe,GAAG,qBAAqB,OAAO,YAAY,EAAE;IAC5D,eAAe,GAAG,qBAAqB,OAAO,YAAY,EAAE;IAC5D,eAAe,GAAG,iBAAiB,OAAO,QAAQ,EAAE;IACpD,eAAe,GAAG,wBAAwB,OAAO,cAAc,EAAE;IACjE,eAAe,GAAG,wBAAwB,OAAO,QAAQ,EAAE;IAC3D,eAAe,GAAG,qBAAqB,OAAO,YAAY,EAAE;IAC5D,eAAe,GAAG,wBAAwB,OAAO,cAAc,EAAE;GACnE,CAAC,CAAC,KAAK,GAAG;EACZ;;EAGA,SAAgB,qBAAqB,QAA2B,SAAiB,GAAiC;GAChH,OAAO,eAAe,iBAAiB,QAAQ,CAAC,GAAG,OAAO;EAC5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EC3NA,MAAMC,WAAS;GAAE,GAAGC;GAAW,GAAGC;EAAW;;EAG7C,MAAM,6BAAkE;GACtE,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;EACP;;;;;;;EAQA,MAAM,mBAAsD;GAC1D,mBAAmB,CAAC,aAAa;GACjC,iBAAiB,CAAC,SAAS,SAAS;GACpC,cAAc,CAAC,MAAM;GACrB,iBAAiB;IAAC;IAAa;IAAe;IAAc;GAAY;GACxE,gBAAgB,CAAC,QAAQ;EAC3B;;EAGA,MAAM,wBAA6D;GACjE,aAAa;GACb,gBAAgB;EAClB;;EAGA,MAAM,6BAAkE;GACtE,MAAM;GACN,SAAS;EACX;EACA,MAAM,0BAA+D;GACnE,OAAO;GACP,MAAM;GACN,KAAK;EACP;EACA,MAAM,yBAA8D;GAClE,QAAQ;GACR,SAAS;GACT,OAAO;EACT;EACA,MAAM,iCAAsE;GAC1E,SAAS;GACT,eAAe;EACjB;EAEA,SAAS,cAAc,GAAwB,SAA4B,OAAoE;GAC7I,MAAM,UAAU,SAAS;GACzB,MAAM,UAAU,QAAQ,KAAK,UAAU;IAAE,OAAO;IAAM,OAAO,SAAS,KAAK,EAAE,eAAe,IAAI;GAAK,EAAE;GACvG,IAAI,YAAY,MAAM,CAAC,QAAQ,SAAS,OAAO,GAAG,QAAQ,KAAK;IAAE,OAAO;IAAS,OAAO,EAAE,iBAAiB,EAAE,OAAO,QAAQ,CAAC;GAAE,CAAC;GAChI,OAAO;EACT;;EAGA,SAAgB,YAAY,OAAwS;GAClU,MAAM,UAAU,cAAc,MAAM,GAAG,MAAM,SAAS,MAAM,KAAK;GACjE,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;IAAW,OAAO,MAAM;IAAO,MAAM,MAAM;IAAM,UAAS;IAAU,WAAW,MAAM;IACnF,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;KACE,WAAW,KAAKF,SAAO,aAAaA,SAAO,YAAY;KACvD,WAAW,MAAM;KACjB,UAAU,MAAM;KAChB,OAAO,MAAM,SAAS,MAAM;KAC5B,SAAS,QAAQ,KAAK,UAAU;MAAE,GAAG;MAAM,OAAO,MAAM,cAAc,KAAA,IAAY,KAAK,QAAQ,eAAe,MAAM,GAAG,MAAM,WAAW,KAAK,KAAK;KAAE,EAAE;KACtJ,UAAU,MAAM;IACjB,CAAA;GACQ,CAAA;EAEf;;EAEA,SAAgB,UAAU,OAAuP;GAG/Q,MAAM,cAAA,GAAaG,MAAAA,QAAAA,OAAc,KAAK,UAAU,MAAM,SAAS,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;GAC1F,MAAM,CAAC,OAAO,eAAe,cAAc,MAAM,aAAa,MAAM,UAAU,UAAU;GACxF,MAAM,EAAE,MAAM,UAAU;GACxB,MAAM,eAAe;IACnB,IAAI;KACF,MAAM,SAAS,KAAK,MAAM,IAAI;KAC9B,IAAI,WAAW,QAAQ,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;MAC1E,YAAY;OAAE,GAAG;OAAO,OAAO,MAAM,EAAE,yBAAyB;MAAE,CAAC;MACnE;KACF;KACA,MAAM,SAAS,MAAiC;KAChD,MAAM,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC;KAChD,YAAY;MAAE,QAAQ;MAAW,MAAM;MAAW,OAAO;KAAG,CAAC;IAC/D,QAAQ;KACN,YAAY;MAAE,GAAG;MAAO,OAAO,MAAM,EAAE,oBAAoB;KAAE,CAAC;IAChE;GACF;GACA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;IAAW,WAAWH,SAAO;IAAW,OAAO,MAAM;IAAc;IACjE,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;KACE,WAAW,KAAKA,SAAO,gBAAgBA,SAAO,iBAAiB,SAASA,SAAO,gBAAgB;KAC/F,cAAY,MAAM;KAClB,OAAO;KACP,UAAU,MAAM;KAChB,YAAY;KACZ,WAAW,MAAM;MAAE,mBAAmB,CAAC;MAAG,YAAY;OAAE,GAAG;OAAO,MAAM,EAAE,OAAO;OAAO,OAAO;MAAG,CAAC;KAAE;KACrG,QAAQ;IACT,CAAA;GACQ,CAAA;EAEf;;EAGA,SAAS,cAAc,QAA6C,KAAyB,QAA0D;GACrJ,MAAM,CAAC,OAAO,aAAA,GAAYI,MAAAA,SAAAA,QAA4B,QAAQ,KAAA,IAAY,KAAA,IAAY,QAAQ,IAAI,GAAG,MAAM;IAAE;IAAQ,MAAM;IAAQ,OAAO;GAAG,CAAC;GAC9I,MAAM,UAAU,SAA2B;IAAE,IAAI,QAAQ,KAAA,GAAW,QAAQ,IAAI,KAAK,IAAI;IAAG,SAAS,IAAI;GAAE;GAC3G,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,MAAM,WAAW,UAAU,MAAM,SAAS,MAAM,UAAU,CAAC,MAAM,OAAO,OAAO;KAAE;KAAQ,MAAM;KAAQ,OAAO;IAAG,CAAC;GACxH,GAAG,CAAC,MAAM,CAAC;GACX,OAAO,CAAC,OAAO,MAAM;EACvB;EAEA,SAAgB,YAAY,OAAwY;GACla,MAAM,CAAC,OAAO,UAAU,cAAc,MAAM,aAAa,MAAM,UAAU,OAAO,MAAM,SAAS,MAAM,YAAY,EAAE,CAAC;GACpH,MAAM,UAAU,SAA4C;IAC1D,IAAI,MAAM,UAAU;IACpB,IAAI,OAAO,SAAS,aAAa,CAAC,OAAO,SAAS,IAAI,KAAM,MAAM,WAAW,CAAC,OAAO,cAAc,IAAI,KAAO,MAAM,QAAQ,KAAA,KAAa,OAAO,MAAM,MAAO;KAC3J,OAAO;MAAE,GAAG;MAAO,OAAO,MAAM,EAAE,MAAM,UAAU,yBAAyB,sBAAsB;KAAE,CAAC;KACpG;IACF;IACA,MAAM,SAAS,IAAI;IACnB,MAAM,WAAW,OAAO,QAAQ,EAAE;IAClC,OAAO;KAAE,QAAQ;KAAU,MAAM;KAAU,OAAO;IAAG,CAAC;GACxD;GACA,MAAM,eAAe,MAAM;GAC3B,MAAM,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;IAAW,OAAO,MAAM;IAAO,MAAM,MAAM;IAAM,UAAS;IAAU,WAAW,iBAAiB,KAAA,IAAY,MAAM,YAAY,KAAA;IAAW,OAAO,MAAM;IAClK,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;KAAO,WAAW,KAAKJ,SAAO,aAAaA,SAAO,cAAcA,SAAO,iBAAiB;KAAG,WAAW,MAAM,UAAU,YAAY;KAChI,OAAO,MAAM;KAAM,UAAU,MAAM;KAAU,WAAW,UAAU,OAAO;MAAE,GAAG;MAAO,MAAM,MAAM,OAAO;MAAO,OAAO;KAAG,CAAC;KAC1H,cAAc,OAAO,MAAM,KAAK,KAAK,MAAM,KAAK,MAAM,WAAW,OAAO,MAAM,IAAI,CAAC;IAAI,CAAA;GAChF,CAAA;GACX,IAAI,iBAAiB,KAAA,GAAW,OAAO;GACvC,MAAM,QAAQ,MAAM,cAAc,MAAM;GACxC,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAW,KAAKA,SAAO,YAAY,MAAM,SAAS;IAAvD,UAAA,CACJ,OACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;KAAkB;KAChB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;MAAY,WAAW;MAAO,aAAa;MAAO,WAAWA,SAAO;MAAc,UAAU,MAAM;MAChG,OAAO,MAAM,UAAU,MAAM,aAAa,MAAM,WAAW,OAAO,UAAU,MAAM,IAAI,IAAI,MAAM,OAAO;MACvG,SAAS;MAAc,WAAW,UAAU,OAAO,OAAO,KAAK,CAAC;KAAI,CAAA;IAC7D,CAAA,CACR;;EACP;;EAGA,SAAS,YAAY,OAAoJ;GACvK,MAAM,UACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;IAAM,WAAWA,SAAO;IAAc,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACK,sCAAAA,QAAD;KAAQ,OAAO,MAAM;KAAO,SAAS,MAAM;KAAS,UAAU,MAAM;KAAU,UAAU,MAAM;IAAW,CAAA;GAAO,CAAA;GAExJ,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAW,KAAKL,SAAO,mBAAmB,MAAM,SAAS;IAA9D,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,WAAWA,SAAO;KAAmB,UAAA,MAAM;IAAY,CAAA,GAC5D,MAAM,SAAS,KAAA,IAAY,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;KAAa,OAAO,MAAM;KAAO,UAAA;IAAqB,CAAA,CACzF;;EAET;;;;;;;EAQA,SAAgB,YAAY,OAAkK;GAC5L,MAAM,IAAI,MAAM;GAChB,MAAM,QAAQ,MAAM;GACpB,MAAM,SAAA,GAAQM,MAAAA,MAAAA,CAAM;GACpB,MAAM,UAAU,SAA2C,QAAQ,QAAQ,CAAC,EAAA,CAAG,KAAK,IAAI;GACxF,MAAM,WAAW,KAA+B,SAAuB;IAErE,MAAM,SAAS,eAAe;KAAE,GAAG;MAAQ,MAAM,KAAK,MAAM,GAAG,CAAC,CAAC,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,SAAS,KAAK,SAAS,CAAC;IAAE,CAAC,CAAC;GAClI;GACA,MAAM,WAAW,KAAqC,SAAwB;IAC5E,MAAM,SAAS,eAAe;KAAE,GAAG;MAAQ,MAAM;IAAK,CAAC,CAAC;GAC1D;GACA,MAAM,YAAY,OAAO,aAAa,KAAA,IAAY,SAAU,MAAM,aAAa,OAAO,UAAU;GAChG,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;IACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,WAAW,KAAKN,SAAO,iBAAiBA,SAAO,SAAS;KAAI,UAAA,EAAE,iBAAiB;IAAK,CAAA;IACvF,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAWA,SAAO;KAAY,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAU,IAAI,GAAG,MAAM;MAAc,OAAO,EAAE,uBAAuB;MAAG,MAAM,EAAE,sBAAsB;MAAG,UAAS;MAAU,UAAU,MAAM;MAAU,gBAAgB,CAAC;MACxM,OAAO,OAAO,MAAM;MAAG,aAAa,EAAE,6BAA6B;MAAG,WAAW,SAAS,QAAQ,QAAQ,IAAI;KAAI,CAAA;IAAM,CAAA;IAC1H,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAWA,SAAO;KAAY,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAU,IAAI,GAAG,MAAM;MAAwB,OAAO,EAAE,gCAAgC;MAAG,MAAM,EAAE,+BAA+B;MAAG,UAAS;MAAU,UAAU,MAAM;MAAU,gBAAgB,CAAC;MACpO,OAAO,OAAO,eAAe;MAAG,aAAa,EAAE,sCAAsC;MAAG,WAAW,SAAS,QAAQ,iBAAiB,IAAI;KAAI,CAAA;IAAM,CAAA;IACrJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;KAAgB;KAAG,WAAWA,SAAO;KAAY,OAAO,EAAE,wBAAwB;KAAG,MAAM,EAAE,uBAAuB;KAClH,OAAO,OAAO;KAAO,SAAS;KAAc,UAAS;KAAM,WAAW;KAAwB,UAAU,MAAM;KAC9G,WAAW,SAAS,MAAM,SAAS,eAAe;MAAE,GAAG;MAAO,OAAO;KAAmC,CAAC,CAAC;IAAI,CAAA;IAChH,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;KAAa,WAAWA,SAAO;KAAY,OAAO,EAAE,gCAAgC;KAAG,MAAM,EAAE,+BAA+B;KAAG,UAAU,MAAM;KAC/I,SAAS,OAAO,kBAAkB;KAAM,WAAW,SAAS,QAAQ,iBAAiB,IAAI;IAAI,CAAA;IAC/F,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;KAAa,WAAWA,SAAO;KAAY,OAAO,EAAE,6BAA6B;KAAG,MAAM,EAAE,4BAA4B;KAAG,UAAU,MAAM;KACzI,SAAS,OAAO,eAAe;KAAM,WAAW,SAAS,QAAQ,cAAc,IAAI;IAAI,CAAA;IACzF,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;KAAgB;KAAG,WAAWA,SAAO;KAAY,OAAO,EAAE,2BAA2B;KAAG,MAAM,EAAE,0BAA0B;KACxH,OAAO;KAAW,SAAS;KAAmB,UAAS;KAAO,WAAW;KAA6B,UAAU,MAAM;KACtH,WAAW,SAAS,MAAM,SAAS,eAAe;MAChD,GAAG;MACH,UAAU,SAAS,SAAS,KAAA,IAAY,SAAS;KACnD,CAAC,CAAC;IAAI,CAAA;GACR,EAAA,CAAA;EAEN;;EAGA,SAAS,cAAc,OAA0H;GAC/I,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;IAAW,OAAO,MAAM;IAAO,MAAM,MAAM;IAAM,UAAS;IAAU,WAAW,MAAM;IACnF,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;KACE,WAAWA,SAAO;KAClB,cAAY,MAAM;KAClB,OAAO,MAAM;KACb,YAAY;KACZ,WAAW,MAAM;MAAE,mBAAmB,CAAC;MAAG,MAAM,SAAS,EAAE,OAAO,KAAK;KAAE;IAC1E,CAAA;GACQ,CAAA;EAEf;;EAGA,SAAS,WAAW,OAA0H;GAC5I,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;IAAW,OAAO,MAAM;IAAO,MAAM,MAAM;IAAM,UAAS;IAAU,WAAW,MAAM;IACnF,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;KAAO,WAAW,KAAKA,SAAO,aAAaA,SAAO,YAAY;KAAG,OAAO,MAAM;KAAO,YAAY;KAAO,WAAW,MAAM,MAAM,SAAS,EAAE,OAAO,KAAK;IAAI,CAAA;GACjJ,CAAA;EAEf;;EAGA,SAAS,mBAAmB,OAA8L;GACxN,MAAM,EAAE,GAAG,UAAU;GACrB,MAAM,OAAO,KAAa,SAAwB;IAChD,MAAM,QAAQ,EAAE,GAAG,MAAM;IACzB,IAAI,SAAS,MAAM,SAAS,KAAA,KAAc,MAAM,QAAQ,IAAI,KAAK,KAAK,WAAW,GAAI,OAAO,MAAM;SAC7F,MAAM,OAAO;IAClB,MAAM,SAAS,KAAK;GACtB;GACA,MAAM,OAAO;IAAC;IAAY;IAAS;IAAmB;IAAe;IAAa;GAAM;GACxF,MAAM,QAAQ,OAAO,YAAY,OAAO,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,SAAS,GAAG,CAAC,CAAC;GAC7F,MAAM,UAAU,OAAO,YAAY,OAAO,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,KAAK,SAAS,GAAG,CAAC,CAAC;GAC9F,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;IACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,WAAW,KAAKA,SAAO,iBAAiBA,SAAO,SAAS;KAAI,UAAA,EAAE,4BAA4B;IAAK,CAAA;IAChG;KAAC;KAAY;KAAS;IAAiB,CAAC,CAAW,KAAK,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;KAAsB,WAAWA,SAAO;KACxG,OAAO,EAAE,yBAAyB,KAAK;KAAG,OAAO,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;KAAI,WAAW,SAAS,IAAI,KAAK,IAAI;IAAI,GADvD,GACuD,CAAC;IACzI,CAAC,eAAe,WAAW,CAAC,CAAW,KAAK,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;KAA0B;KAAG,WAAWA,SAAO;KACnG,OAAO,EAAE,yBAAyB,KAAK;KAAG,OAAO,OAAO,MAAM,SAAS,YAAY,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;KACjI,UAAS;KAAG,SAAS,QAAQ;KAAa,KAAK,QAAQ,cAAc,IAAI,KAAA;KAAW,aAAa,MAAM;KACvG,UAAU,GAAG,MAAM,WAAW,gBAAgB;KAAO,WAAW,SAAS,IAAI,KAAK,IAAI;IAAI,GAHpB,GAGoB,CAAC;IAC7F,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;KAAe,WAAWA,SAAO;KAAW,OAAO,EAAE,4BAA4B;KAAG,MAAM,EAAE,gCAAgC;KAC1H,OAAO,MAAM,QAAQ,MAAM,IAAI,IAAI,MAAM,KAAK,IAAI,MAAM,CAAC,CAAC,KAAK,IAAI,IAAI;KACvE,WAAW,SAAS,IAAI,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,QAAQ,SAAS,KAAK,SAAS,CAAC,CAAC;IAAI,CAAA;IACvF,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;KAAc;KAAG,OAAO,EAAE,qBAAqB;KAAG,OAAO;KACzF,aAAa,MAAM;KAAa,UAAU,GAAG,MAAM,WAAW;KAC9D,WAAW,SAAS,MAAM,SAAS;MAAE,GAAG;MAAS,GAAG;KAAK,CAAC;IAAI,CAAA;GAChE,EAAA,CAAA;EACJ;;EAGA,SAAS,mBAAmB,OAId;GACZ,MAAM,EAAE,GAAG,SAAS;GACpB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAW,KAAKA,SAAO,iBAAiBA,SAAO,SAAS;IAAG,uBAAqB,KAAK;IAA1F,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,KAAK,aAAa,gBAAgB,gCAAgC,4BAA4B,EAAK,CAAA,GACzG,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UACG,KAAK,OAAO,KAAK,UAAU;KAC1B,MAAM,QAAQ,kBAAkB,OAAO,MAAM,MAAM;KACnD,MAAM,QAAQ,UAAU,KAAA,KAAa,UAAU,QAAQ,UAAU,KAC7D,EAAE,6BAA6B,IAC/B,OAAO,UAAU,YAAY,EAAE,QAAQ,aAAa,WAAW,IAAI,OAAO,KAAK;KACnF,MAAM,OAAO,MAAM,YAAY,OAC3B,EAAE,+BAA+B,IACjC,MAAM,iBAAiB,kBAAkB,EAAE,qCAAqC,IAAI,KAAA;KACxF,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;MAAqB,qBAAmB,MAAM;MAAM,uBAAqB,MAAM;MAA/E,UAAA;OACG,EAAE,SAAS,MAAM,aAAa;OAAE;OAAI,EAAE,gCAAgC,EAAE,OAAO,MAAM,YAAY,CAAC;OAAE;OAAI;OACxG,SAAS,KAAA,IAAY,KAAA,IAAY,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CAAE,OAAI,IAAO,EAAA,CAAA;MAC7C;KAHK,GAAA,MAAM,IAGX;IAER,CAAC,EACC,CAAA,CACD;;EAET;;;;;;;;;;;EAYA,SAAgB,qBAAqB,OAA+V;GAClY,MAAM,EAAE,UAAU,OAAO,QAAQ,SAAS,OAAO;GACjD,MAAM,IAAI,MAAM;GAChB,MAAM,QAAQ,UAAU,CAAC;GACzB,MAAM,SAAA,GAAQM,MAAAA,MAAAA,CAAM;GACpB,MAAM,OAAO,QAAyB,OAAO,MAAM,SAAS,WAAW,MAAM,OAAiB;GAC9F,MAAM,QAAQ,QAAyB,MAAM,SAAS;GACtD,MAAM,OAAO,KAAa,SAAwB,QAAQ;IAAE,GAAG;KAAQ,MAAM;GAAK,CAAC;GACnF,MAAM,WAAW,KAAa,aAAmD,MAAM,UAAU,OAAO,IAAI,EAAE,UAAU;GACxH,IAAI,UAAU,kBAAkB;IAM9B,MAAM,cAAc;KAAC;KAAe;KAAY;IAAwB;IACxE,MAAM,cAAc,OAAO,YAAY,OAAO,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,SAAS,GAAG,CAAC,CAAC;IAC1G,MAAM,iBAAiB,OAAO,YAAY,OAAO,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,YAAY,SAAS,GAAG,CAAC,CAAC;IAC5G,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;MAAY,WAAWN,SAAO;MAAY,OAAO,EAAE,iCAAiC;MAAG,MAAM,EAAE,gCAAgC;MAAG,OAAO,IAAI,aAAa;MAAG,WAAW,SAAS,IAAI,eAAe,IAAI;KAAI,CAAA;KAC5M,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;MAAa,WAAWA,SAAO;MAAY,OAAO,EAAE,8BAA8B;MAAG,MAAM,EAAE,6BAA6B;MACxH,SAAS,KAAK,UAAU;MAAG,WAAW,SAAS,IAAI,YAAY,IAAI;KAAI,CAAA;KACzE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;MAAa,WAAWA,SAAO;MAAY,OAAO,EAAE,4CAA4C;MAAG,MAAM,EAAE,2CAA2C;MACpJ,SAAS,KAAK,wBAAwB;MAAG,WAAW,SAAS,IAAI,0BAA0B,IAAI;KAAI,CAAA;KACpG,OAAO,KAAK,WAAW,CAAC,CAAC,SAAS,KACjC,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;MAAc;MAAG,OAAO,EAAE,qBAAqB;MAAG,OAAO;MAAa,aAAa,MAAM;MACvF,UAAU,GAAG,MAAM,WAAW;MAAU,WAAW,SAAS;OAAE,IAAI,SAAS,KAAA,GAAW,QAAQ;QAAE,GAAG;QAAgB,GAAG;OAAK,CAAC;MAAE;KAAI,CAAA;IAEtI,EAAA,CAAA;GAEN;GACA,MAAM,YAAY,QAAqD;IACrE,MAAM,MAAM,MAAM;IAClB,OAAO,QAAQ,QAAQ,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,GAAG,IAAI,MAAiC,KAAA;GAC3G;;;;;;GAMA,MAAM,cAAyB,UAAU,oBACvC,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;IAAY,WAAWA,SAAO;IAAY,OAAO,EAAE,iCAAiC;IAAG,MAAM,EAAE,gCAAgC;IAC7H,OAAO,IAAI,aAAa;IAAG,WAAW,SAAS,IAAI,eAAe,IAAI;GAAI,CAAA,IAC1E,UAAU,kBACZ,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,oBAAD;IAAuB;IAAG,OAAO,SAAS,OAAO,KAAK,CAAC;IAAG,WAAW,SAAS,IAAI,SAAS,IAAI;IAC7F,aAAa,MAAM;IAAa,YAAY,MAAM;GAAa,CAAA,GACjE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;IAAa,WAAWA,SAAO;IAAY,OAAO,EAAE,6BAA6B;IAAG,MAAM,EAAE,4BAA4B;IACtH,SAAS,KAAK,SAAS;IAAG,WAAW,SAAS,IAAI,WAAW,IAAI;GAAI,CAAA,CACvE,EAAA,CAAA,IACA,UAAU,eACZ,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;IAAgB;IAAG,WAAWA,SAAO;IAAY,OAAO,EAAE,0BAA0B;IAAG,MAAM,EAAE,yBAAyB;IACtH,OAAO,IAAI,MAAM,KAAK;IAAQ,SAAS,QAAQ,QAAQ,CAAC,QAAQ,SAAS,CAAC;IAAG,UAAS;IAAO,WAAW;IACxG,WAAW,SAAS,IAAI,QAAQ,IAAI;GAAI,CAAA,IACxC,UAAU,kBACZ,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;IAGE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;KAAY,WAAWA,SAAO;KAAY,OAAO,EAAE,+BAA+B;KAAG,MAAM,EAAE,8BAA8B;KACzH,OAAO,MAAM,QAAQ,MAAM,YAAY,IAAK,MAAM,YAAY,CAAe,IAAI,MAAM,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,WAAW;KACrH,WAAW,SAAS,IAAI,aAAa,IAAI;IAAI,CAAA;IAC/C,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;KAAgB;KAAG,WAAWA,SAAO;KAAY,OAAO,EAAE,iCAAiC;KAAG,MAAM,EAAE,gCAAgC;KACpI,OAAO,IAAI,aAAa,KAAK;KAAS,SAAS,QAAQ,eAAe;MAAC;MAAS;MAAQ;KAAK,CAAC;KAAG,UAAS;KAAQ,WAAW;KAC7H,WAAW,SAAS,IAAI,eAAe,IAAI;IAAI,CAAA;IAChD,IAAI,aAAa,MAAM,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;KAAY,WAAWA,SAAO;KAAY,OAAO,EAAE,gCAAgC;KAAG,MAAM,EAAE,+BAA+B;KAC7J,OAAO,IAAI,YAAY;KAAG,WAAW,SAAS,IAAI,cAAc,IAAI;IAAI,CAAA;IAC1E,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;KAAgB;KAAG,WAAWA,SAAO;KAAY,OAAO,EAAE,gCAAgC;KAAG,MAAM,EAAE,+BAA+B;KAClI,OAAO,IAAI,YAAY,KAAK;KAAU,SAAS,QAAQ,cAAc;MAAC;MAAU;MAAW;KAAO,CAAC;KAAG,UAAS;KAAS,WAAW;KACnI,WAAW,SAAS,IAAI,cAAc,IAAI;IAAI,CAAA;GAChD,EAAA,CAAA,IACA,UAAU,iBACZ,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;IAAgB;IAAG,WAAWA,SAAO;IAAY,OAAO,EAAE,+BAA+B;IAAG,MAAM,EAAE,8BAA8B;IAChI,OAAO,IAAI,QAAQ,KAAK;IAAW,SAAS,QAAQ,UAAU,CAAC,WAAW,aAAa,CAAC;IAAG,UAAS;IAAU,WAAW;IACzH,WAAW,SAAS,IAAI,UAAU,IAAI;GAAI,CAAA,IAC1C,KAAA;GACJ,MAAM,QAAQ,MAAM,aAAa,KAAA,IAAY,iBAAiB,SAAS,OAAO,CAAC,IAAI,OAAO,KAAK,MAAM,SAAS,MAAM;GACpH,MAAM,OAAO,OAAO,YAAY,OAAO,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;GAC7F,MAAM,UAAU,OAAO,YAAY,OAAO,QAAQ,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,MAAM,SAAS,GAAG,CAAC,CAAC;GAC/F,MAAM,eAAe,sBAAsB,SAAS;GAEpD,MAAM,UAAU,kBAAkB,IAAI,MAAM,YAAY;GACxD,MAAM,aAAa,QAAyB,SAAS,OAAO,MAAM,UAAU,MAAM,SAAS,UAAU,KAAK,MAAM;GAChH,IAAI,aAAa,uBAAuB,aAAa,cAAc;IACjE,MAAM,SAAS,aAAa;IAC5B,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;KACG,YAAY,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,oBAAD;MAAuB;MAAG,MAAM;MAAS,QAAQ;OAAE,SAAS,MAAM;OAAS,YAAY,MAAM;OAAY,QAAQ;MAAM;KAAI,CAAA;KACpJ,MAAM,cAAc,aAAa,MAAM,MAAM,cAAc,OAAO,MAAM,UAAU,MAAM,WAAW,eAAe,KACjH,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAW,KAAKA,SAAO,iBAAiBA,SAAO,SAAS;MAAG,sBAAmB;MAAiB,UAAA,EAAE,6BAA6B;KAAK,CAAA;KAEvI,CAAC,UAAU,WAAW,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;MAAa,WAAWA,SAAO;MAAY,OAAO,EAAE,4BAA4B;MAAG,MAAM,EAAE,2BAA2B;MAChJ,SAAS,KAAK,WAAW;MAAG,WAAW,SAAS,IAAI,aAAa,IAAI;KAAI,CAAA;KAC1E,CAAC,UAAU,MAAM,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;MAAe,WAAWA,SAAO;MAAW,OAAO,EAAE,SAAS,mCAAmC,+BAA+B;MACrJ,MAAM,EAAE,SAAS,kCAAkC,8BAA8B;MAAG,OAAO,IAAI,MAAM;MAAG,WAAW,SAAS,IAAI,QAAQ,IAAI;KAAI,CAAA;KACjJ,UAAU,CAAC,UAAU,cAAc,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;MAAY,WAAWA,SAAO;MAAY,OAAO,EAAE,kCAAkC;MAAG,MAAM,EAAE,iCAAiC;MACxK,OAAO,IAAI,cAAc;MAAG,WAAW,SAAS,IAAI,gBAAgB,IAAI;KAAI,CAAA;KAC7E,CAAC,UAAU,gBAAgB,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;MAAY,WAAWA,SAAO;MAAY,OAAO,EAAE,oCAAoC;MAAG,MAAM,EAAE,mCAAmC;MACpK,OAAO,IAAI,gBAAgB;MAAG,WAAW,SAAS,IAAI,kBAAkB,IAAI;KAAI,CAAA;KACjF,UAAU,CAAC,UAAU,gBAAgB,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;MAAe,WAAWA,SAAO;MAAW,OAAO,EAAE,8BAA8B;MAAG,OAAO,IAAI,gBAAgB;MAAG,WAAW,SAAS,IAAI,kBAAkB,IAAI;KAAI,CAAA;KAChN,UAAU,CAAC,UAAU,kBAAkB,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;MAAe,WAAWA,SAAO;MAAW,OAAO,EAAE,gCAAgC;MAAG,OAAO,IAAI,kBAAkB;MAAG,WAAW,SAAS,IAAI,oBAAoB,IAAI;KAAI,CAAA;KACxN,CAAC,UAAU,CAAC,UAAU,WAAW,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;MAAe,WAAWA,SAAO;MAAW,OAAO,EAAE,yBAAyB;MAAG,OAAO,IAAI,WAAW;MAAG,WAAW,SAAS,IAAI,aAAa,IAAI;KAAI,CAAA;KAC7L,CAAC,UAAU,SAAS,kBAAkB,WAAW,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;MAAe,WAAWA,SAAO;MAAW,OAAO,EAAE,yBAAyB;MACnI,OAAO,IAAI,SAAS,kBAAkB,WAAW;MAAG,WAAW,SAAS,IAAI,SAAS,kBAAkB,aAAa,IAAI;KAAI,CAAA;IAC9H,EAAA,CAAA;GAEN;GACA,IAAI,aAAa,mBACf,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAA,kBAAA,UAAA,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;IAAY,WAAWA,SAAO;IAAY,OAAO,EAAE,mCAAmC;IAAG,MAAM,EAAE,kCAAkC;IACjI,OAAO,IAAI,eAAe;IAAG,WAAW,SAAS,IAAI,iBAAiB,IAAI;GAAI,CAAA,EAChF,CAAA;GAGN,IAAI,aAAa,cAAc;IAC7B,MAAM,QAAQ,QAAwB,MAAM,QAAQ,MAAM,IAAI,IACzD,MAAM,IAAI,CAAe,IAAI,MAAM,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,GAAG;IAC9D,MAAM,WAAW,KAAa,SAAuB,IAAI,KAAK,KAAK,MAAM,GAAG,CAAC,CAAC,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,SAAS,KAAK,SAAS,CAAC,CAAC;IAC1I,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;MAAa,WAAWA,SAAO;MAAY,OAAO,EAAE,8BAA8B;MAAG,MAAM,EAAE,6BAA6B;MACxH,SAAS,KAAK,UAAU;MAAG,WAAW,SAAS,IAAI,YAAY,IAAI;KAAI,CAAA;KACzE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,SAAO;MAAY,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAU,IAAI,GAAG,MAAM;OAAQ,OAAO,EAAE,0BAA0B;OAAG,MAAM,EAAE,yBAAyB;OAAG,UAAS;OAAU,gBAAgB,CAAC;OAC9K,OAAO,KAAK,MAAM;OAAG,aAAa,EAAE,gCAAgC;OAAG,WAAW,SAAS,QAAQ,QAAQ,IAAI;MAAI,CAAA;KAAM,CAAA;KAC3H,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,SAAO;MAAY,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAU,IAAI,GAAG,MAAM;OAAkB,OAAO,EAAE,mCAAmC;OAAG,MAAM,EAAE,kCAAkC;OAAG,UAAS;OAAU,gBAAgB,CAAC;OAC1M,OAAO,KAAK,eAAe;OAAG,aAAa,EAAE,yCAAyC;OAAG,WAAW,SAAS,QAAQ,iBAAiB,IAAI;MAAI,CAAA;KAAM,CAAA;KACtJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;MAAa,WAAWA,SAAO;MAAY,OAAO,EAAE,mCAAmC;MAAG,MAAM,EAAE,kCAAkC;MAClI,SAAS,KAAK,eAAe;MAAG,WAAW,SAAS,IAAI,iBAAiB,IAAI;KAAI,CAAA;KACnF,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;MAAa,WAAWA,SAAO;MAAY,OAAO,EAAE,gCAAgC;MAAG,MAAM,EAAE,+BAA+B;MAC5H,SAAS,KAAK,YAAY;MAAG,WAAW,SAAS,IAAI,cAAc,IAAI;KAAI,CAAA;KAC7E,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;MAAa,WAAWA,SAAO;MAAY,OAAO,EAAE,8BAA8B;MAAG,MAAM,EAAE,6BAA6B;MACxH,SAAS,KAAK,UAAU;MAAG,WAAW,SAAS,IAAI,YAAY,IAAI;KAAI,CAAA;KACzE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;MACK;MACH,WAAWA,SAAO;MAClB,OAAO,EAAE,oCAAoC;MAC7C,MAAM,EAAE,mCAAmC;MAC3C,OAAO,MAAM,sBAAsB,KAAA,IAAY,OAAO,MAAM,iBAAiB,IAAI;MACjF,SAAS;OAAC;OAAK;OAAK;OAAK;MAAG;MAC5B,UAAS;MACT,WAAW;MACX,WAAW,SAAS,IAAI,kBAAkB,OAAO,IAAI,CAAC;KACvD,CAAA;IACD,EAAA,CAAA;GAEN;GACA,IAAI,aAAa,eAAe;IAC9B,MAAM,gBAAgB,IAAI,eAAe,KAAK;IAC9C,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;KACG;KACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;MAAe,WAAWA,SAAO;MAAW,OAAO,EAAE,8BAA8B;MAAG,MAAM,EAAE,6BAA6B;MACzH,OAAO,IAAI,MAAM;MAAG,WAAW,SAAS,IAAI,QAAQ,IAAI;KAAI,CAAA;KAC9D,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;MAAY,WAAWA,SAAO;MAAY,OAAO,EAAE,6BAA6B;MAAG,MAAM,EAAE,4BAA4B;MACrH,OAAO,IAAI,SAAS;MAAG,WAAW,SAAS,IAAI,WAAW,IAAI;KAAI,CAAA;KACpE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;MAAgB;MAAG,WAAWA,SAAO;MAAY,OAAO,EAAE,2BAA2B;MAAG,MAAM,EAAE,0BAA0B;MACxH,OAAO,OAAO,MAAM,UAAU,YAAY,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;MAAI,UAAS;MACvG,aAAa,MAAM;MAAa,UAAU,GAAG,MAAM,WAAW;MAAgB,WAAW,SAAS,IAAI,SAAS,IAAI;KAAI,CAAA;KACzH,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;MAAY,WAAWA,SAAO;MAAY,OAAO,EAAE,4BAA4B;MAAG,MAAM,EAAE,2BAA2B;MACnH,OAAO,IAAI,QAAQ;MAAG,WAAW,SAAS,IAAI,UAAU,IAAI;KAAI,CAAA;KAClE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;MAAY,WAAWA,SAAO;MAAY,OAAO,EAAE,+BAA+B;MAAG,MAAM,EAAE,8BAA8B;MACzH,OAAO,IAAI,WAAW;MAAG,WAAW,SAAS,IAAI,aAAa,IAAI;KAAI,CAAA;KACxE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;MAAgB;MAAG,WAAWA,SAAO;MAAY,OAAO,EAAE,mCAAmC;MAAG,MAAM,EAAE,kCAAkC;MACxI,OAAO;MAAe,SAAS,CAAC,QAAQ,MAAM;MAAG,UAAS;MAAO,WAAW;MAA2B,WAAW,SAAS,IAAI,iBAAiB,IAAI;KAAI,CAAA;KACzJ,kBAAkB,UACjB,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;MAAe,WAAWA,SAAO;MAAW,OAAO,EAAE,yBAAyB;MAAG,OAAO,IAAI,WAAW;MAAG,WAAW,SAAS,IAAI,aAAa,IAAI;KAAI,CAAA;IAEzJ,EAAA,CAAA;GAEN;GAGA,IAAI,OAAO,KAAK,KAAK,CAAC,CAAC,WAAW,GAChC,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;IACG;IAEA,gBAAgB,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,WAAWA,SAAO;KAAkB,UAAA,EAAE,wBAAwB;IAAK,CAAA;IACnG,iBAAiB,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,WAAWA,SAAO;KAAkB,UAAA,EAAE,YAAY;IAAK,CAAA;GACzF,EAAA,CAAA;GAKN,IAAI,gBAAgB,KAAA,GAClB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;IACG;IACA,iBAAiB,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,WAAWA,SAAO;KAAkB,UAAA,EAAE,YAAY;IAAK,CAAA;IACxF,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,KAC1B,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;KAAc;KAAG,OAAO,EAAE,qBAAqB;KAAG,OAAO;KAAM,aAAa,MAAM;KAChF,UAAU,GAAG,MAAM,WAAW;KAAU,WAAW,SAAS;MAAE,IAAI,SAAS,KAAA,GAAW,QAAQ;OAAE,GAAG;OAAS,GAAG;MAAK,CAAC;KAAE;IAAI,CAAA;GAE/H,EAAA,CAAA;GAGN,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;IAAc;IAAG,OAAO,EAAE,qBAAqB;IAAU;IAAO,aAAa,MAAM;IAAa,UAAU,GAAG,MAAM,WAAW;IAAU,WAAW,SAAS;KAAE,IAAI,SAAS,KAAA,GAAW,QAAQ,IAAI;IAAE;GAAI,CAAA;EACjN;;EAGA,SAAgB,gBAAgB,OAA4K;GAC1M,MAAM,IAAI,MAAM;GAChB,MAAM,UAAU,OAAO,QAAQ,MAAM,SAAS,CAAC,CAAC;GAChD,MAAM,UAAU,SAAkC;IAGhD,MAAM,SAAS,KAAK,SAAS,IAAI,OAAO,YAAY,IAAI,IAAI,KAAA,CAAS;GACvE;GACA,MAAM,YAAY,OAAe,KAAa,UAAkB;IAC9D,OAAO,QAAQ,KAAK,OAAO,OAAyB,OAAO,QAAQ,CAAC,KAAK,KAAK,IAAI,KAAK,CAAC;GAC1F;GACA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;IAAM,WAAWA,SAAO;IAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;KAAM,WAAWA,SAAO;KAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MAAM,WAAWA,SAAO;MAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,SAAO;OAAmB,UAAA,EAAE,iBAAiB;MAAQ,CAAA,GACrE,QAAQ,WAAW,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,SAAO;OAAkB,UAAA,EAAE,iBAAiB;MAAQ,CAAA,CAC1F;KACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,WAAWA,SAAO;MAAY,UAAU,MAAM;MAAU,eAAe,OAAO,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;MAAI,UAAA,EAAE,eAAe;KAAU,CAAA,CACrJ;IACL,CAAA,GAAA,QAAQ,KAAK,CAAC,KAAK,QAAQ,UAC1B,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;KAA8B,WAAWA,SAAO;KAAhD,UAAA;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;OAAO,WAAWA,SAAO;OAAa,cAAY,EAAE,oBAAoB;OAAG,OAAO;OAAK,YAAY;OAAO,aAAa,EAAE,2BAA2B;OAAG,UAAU,MAAM;OACrK,WAAW,MAAM,SAAS,OAAO,EAAE,OAAO,OAAO,KAAK;MAAI,CAAA;MAC5D,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;OAAO,WAAWA,SAAO;OAAa,cAAY,EAAE,qBAAqB;OAAU;OAAO,YAAY;OAAO,aAAa,EAAE,4BAA4B;OAAG,UAAU,MAAM;OACzK,WAAW,MAAM,SAAS,OAAO,KAAK,EAAE,OAAO,KAAK;MAAI,CAAA;MAC1D,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAWA,SAAO;OAAY,eAAA;OAAY,cAAY,EAAE,wBAAwB,EAAE,MAAM,OAAO,MAAM,CAAC;OAAG,UAAU,MAAM;OAC7I,eAAe,OAAO,QAAQ,QAAQ,GAAG,OAAO,OAAO,KAAK,CAAC;OAAI,UAAA,EAAE,kBAAkB;MAAU,CAAA;KAC7F;IAPK,GAAA,GAAG,IAAI,GAAG,OAOf,CACP,CACG;;EAEV;;;;ECjiBA,SAAgB,aAAa,QAAgB,SAAiB,KAAiC;GAC7F,IAAI,UAAU,KAAK,UAAU,KAAK,WAAW,QAAQ,OAAO,KAAA;GAC5D,IAAI,QAAQ,cAAc,QAAQ,UAAU,KAAK;GACjD,IAAI,QAAQ,aAAa,QAAQ,UAAU,IAAI,UAAU;GACzD,IAAI,QAAQ,QAAQ,OAAO;GAC3B,IAAI,QAAQ,OAAO,OAAO,SAAS;EAErC;EAEA,SAAgB,cACd,OACA,SACA,UACkD;GAClD,QAAQ,UAAU;IAChB,MAAM,OAAO,aAAa,MAAM,QAAQ,MAAM,QAAQ,OAAO,GAAG,MAAM,GAAG;IACzE,IAAI,SAAS,KAAA,GAAW;IACxB,MAAM,eAAe;IACrB,SAAS,MAAM,KAAM;IACrB,MAAM,cAAc,eAAe,iBAA8B,gBAAc,CAAC,CAAC,KAAK,EAAE,MAAM;GAChG;EACF;;;;ECnBA,SAAgB,uBAAuB,OAKzB;GACZ,MAAM,MAAA,GAAKO,MAAAA,MAAAA,CAAM;GACjB,MAAM,QAAA,GAAOC,MAAAA,OAAAA,CAAuB,IAAI;GACxC,MAAM,CAAC,UAAU,gBAAA,GAAeC,MAAAA,SAAAA,CAAS,YAAY;GACrD,MAAM,CAAC,iBAAiB,uBAAA,GAAsBA,MAAAA,SAAAA,CAAiB;GAC/D,MAAM,CAAC,YAAY,kBAAA,GAAiBA,MAAAA,SAAAA,CAAS,KAAK;GAClD,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAmB,CAAC,CAAC;GACnD,MAAM,SAASC,MAAAA,SAAS,QAAQ,MAAM,QAAQ,CAAC,CAAC,OAAOC,MAAAA,cAAqE,CAAC,CAAC,KAAI,WAAU;IAC1I,KAAK,MAAM,MAAM;IAAsB,OAAO,MAAM,MAAM;IAAe,SAAS;GACpF,EAAE;GACF,IAAI,MAAM,wBAAwB,KAAA,GAAW,OAAO,KAAK;IAAE,KAAK;IAAY,OAAO,MAAM,EAAE,0BAA0B;IAAG,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAA,kBAAA,UAAA,CAAI,CAAA;GAAE,CAAC;GACxI,MAAM,SAAS,OAAO,MAAK,UAAS,MAAM,QAAQ,QAAQ,IAAI,WAAW,OAAO,EAAE,EAAE;GACpF,MAAM,uBAAuB;IAC3B,MAAM,OAAO,CAAC,GAAG,KAAK,SAAS,iBAA8B,oBAAoB,KAAK,CAAC,CAAC,CAAC,CACtF,QAAO,UAAS,MAAM,cAAc,2CAAuC,MAAM,IAAI,CAAC,CACtF,KAAI,UAAS,MAAM,QAAQ,UAAW;IACzC,YAAW,aAAY,SAAS,KAAK,MAAM,KAAK,KAAK,IAAI,WAAW,IAAI;GAC1E;GACA,CAAA,GAAA,MAAA,UAAA,CAAU,cAAc;GACxB,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,KAAK,YAAY,MAAM;IAC3B,MAAM,WAAW,IAAI,gBAAgB,CAAC,WAAW,eAAe,OAAO,YAAY,SAAS,MAAM,GAAG,CAAC;IACtG,SAAS,QAAQ,KAAK,OAAO;IAC7B,aAAa,SAAS,WAAW;GACnC,GAAG,CAAC,CAAC;GACL,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,WAAW,YAAY,mBAAmB,MAAM,KAAK;GAC3D,GAAG,CAAC,QAAQ,MAAM,KAAK,CAAC;GACxB,MAAM,UAAU,QAAgB;IAC9B,eAAe;IACf,IAAI,QAAQ,YAAY,mBAAmB,MAAM,KAAK;IACtD,YAAY,GAAG;GACjB;GACA,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,KAAK;IAAM,WAAWC,2BAAO;IAAlC,UAAA,CACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,MAAK;KAAU,cAAY,MAAM,EAAE,uBAAuB;KAAG,oBAAkB,aAAa,eAAe;KAAY,WAAWA,2BAAO;KAC3I,UAAA,OAAO,KAAK,OAAO,UAAU,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MAAwB,MAAK;MAAS,MAAK;MAAM,IAAI,GAAG,GAAG,OAAO,MAAM;MACpG,mBAAiB,MAAM;MAAK,iBAAe,GAAG,GAAG,SAAS,MAAM;MAAO,iBAAe,WAAW,MAAM;MACvG,UAAU,WAAW,MAAM,MAAM,IAAI;MAAI,WAAWA,2BAAO;MAC3D,eAAe,OAAO,MAAM,GAAG;MAAG,YAAW,UAAS;OACpD,MAAM,MAAM,MAAM,QAAQ,cAAc,eAAe,MAAM,QAAQ,YAAY,cAAc,MAAM;OACrG,MAAM,OAAO,aAAa,OAAO,QAAQ,OAAO,GAAG;OACnD,IAAI,SAAS,KAAA,GAAW;OACxB,MAAM,eAAe;OACrB,OAAO,OAAO,KAAK,CAAE,GAAG;OACxB,MAAM,cAAc,eAAe,iBAAoC,gBAAc,CAAC,CAAC,KAAK,EAAE,MAAM;MACtG;MAV4B,UAAA,CAW3B,MAAM,OAAO,QAAQ,SAAS,MAAM,GAAG,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,2BAAO;OAAgB,cAAY,MAAM,EAAE,yBAAyB;OAAG,UAAA;MAAO,CAAA,CACtI;KAZmC,GAAA,MAAM,GAYzC,CAAC;IACN,CAAA,GACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAWA,2BAAO;KACpB,UAAA,OAAO,KAAI,UAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAqB,MAAK;MAAW,IAAI,GAAG,GAAG,SAAS,MAAM;MACjF,mBAAiB,GAAG,GAAG,OAAO,MAAM;MAAO,QAAQ,WAAW,MAAM;MAAK,UAAU;MACnF,oBAAkB,MAAM;MAAK,uBAAqB,MAAM,QAAQ,aAAa,MAAM,QAAQ,KAAA;MAAW,WAAWA,2BAAO;MACvH,UAAA,MAAM,QAAQ,cACV,WAAW,cAAc,oBAAoB,MAAM,UAAU,MAAM,sBAAsB,IAC1F,MAAM;KACP,GAN0B,MAAM,GAMhC,CAAC;IACH,CAAA,CACF;;EACP;;;EC5BA,MAAMC,WAAS;GAAE,GAAGC;GAAW,GAAGC;EAAW;EAC7C,MAAM,aAAa,KAAKF,SAAO,aAAaA,SAAO,YAAY;;EAE/D,SAAS,eAAe,OAAuM;GAC7N,MAAM,IAAI,MAAM;GAChB,MAAM,QAAQ,MAAM,UAAU,SAAS;GACvC,MAAM,QAAQ,MAAM,UAAU,SAAS;GACvC,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;IAAgB;IAAG,WAAWA,SAAO;IAAY,OAAO,EAAE,2BAA2B;IAAG,MAAM,EAAE,0BAA0B;IACxH,OAAO;IAAO,SAAS,CAAC,QAAQ;IAAG,UAAS;IAAS,WAAW;IAA2B,UAAU,MAAM;IAAU,gBAAgB,MAAM,QAAQ;KAAE,OAAO;KAAU;IAAM,CAAC;GAAI,CAAA,GACnL,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;IAAW,WAAWA,SAAO;IAAY,OAAO,EAAE,2BAA2B;IAAG,MAAM,EAAE,0BAA0B;IAAG,UAAS;IAC5H,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;KAAO,WAAW;KAAmB;KAAO,YAAY;KAAO,UAAU,MAAM;KAC7E,WAAW,MAAM,MAAM,QAAQ,EAAE,OAAO,MAAM,SAAS,IAAI;MAAE,OAAO;MAAU,OAAO,EAAE,OAAO;KAAM,IAAI,KAAA,CAAS;IAAI,CAAA;GAC9G,CAAA,CACX,EAAA,CAAA;EAEN;;;;EAKA,SAAgB,iBAAiB,OAenB;GACZ,MAAM,EAAE,GAAG,MAAM,QAAQ,SAAS,aAAa,kBAAkB;GAGjE,MAAM,oBAAoB,OAAO,kBAAkB,KAAA,KAAa,oBAAoB,MAAM,MAAM,KAAA;GAChG,MAAM,SAAS;GACf,MAAM,WAAW,MAAM,aAAa;GACpC,MAAM,WAAW,OAAO,OAAO,QAAQ,gBAAgB,YAAY,OAAO,OAAO,YAAY,SAAS,IAClG,OAAO,OAAO,cACd,OAAO,OAAO,QAAQ,SAAS,WAAW,OAAO,OAAO,OAAO;GACnE,MAAM,eAAe,sBACd,OAAO,kBAAkB,KAAA,KAAa,OAAO,kBAAkB,WAAY,OAAO,oBAAoB;;GAE7G,MAAM,WAAW,UAA4C;IAC3D,IAAI,UAAU;IACd,IAAI,CAAC,QAAQ;KACX,YAAY,KAAK;KACjB;IACF;IACA,IAAI,OAAO,MAAM,SAAS,UAAU;KAClC,YAAY,EAAE,MAAM,MAAM,KAAK,CAAC;KAChC;IACF;IACA,MAAM,OAAsC,CAAC;IAC7C,IAAI,OAAO,MAAM,SAAS,UAAU,KAAK,OAAO,MAAM;IACtD,IAAI,OAAO,MAAM,UAAU,YAAY,OAAO,cAAc,MAAM,KAAK,KAAK,MAAM,SAAS,GAAG,KAAK,QAAQ,MAAM;IACjH,IAAI,OAAO,MAAM,aAAa,UAAU,KAAK,WAAW,MAAM;IAC9D,IAAI,OAAO,MAAM,cAAc,UAAU,KAAK,YAAY,MAAM;IAChE,IAAI,MAAM,aAAa,KAAA,GAAW,KAAK,WAAW,MAAM;IACxD,IAAI,OAAO,MAAM,eAAe,UAAU,KAAK,aAAa,MAAM;IAClE,IAAI,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,GAAG,gBAAgB,IAAI;GACxD;GACA,MAAM,SAAS,eAAe,MAAM,OAAO,KAAK;GAChD,MAAM,WAAW,iBAAiB,MAAM,OAAO,KAAK;GAGpD,MAAM,0BAA0B,sBAAsB,MAAM,UAAU,WAAW,OAAO,SAAS,GAAG;GACpG,MAAM,mBAAmB,OAAO,UAAU,mBACtC,KAAK,gBAAgB,WACrB,OAAO,UAAU,oBAAoB,KAAK,gBAAgB,WAAW,KAAA;GACzE,MAAM,uBAAuB,qBAAqB,KAAA,KAAa,iBAAiB,WAAW,IAAI,KAAA,IAAY,CACzG,GAAG,iBAAiB,KAAK,aAAa;IACpC,OAAO,OAAO,QAAQ,OAAO,CAAC;IAC9B,OAAO,eAAe,GAAG,iCAAiC,QAAQ,EAAE;GACtE,EAAE,GACF;IACE,OAAO,OAAO,KAAK,IAAI,GAAG,iBAAiB,KAAK,YAAY,QAAQ,EAAE,CAAC,IAAI,CAAC;IAC5E,OAAO,EAAE,uBAAuB;GAClC,CACF;GACA,MAAM,cAAc,UAAU,WAAW;GACzC,MAAM,cAAc,UAAU,gBAAgB,UACxC,gBAAgB,YAAY,OAAO,QAAQ,SAAS,aACpD,gBAAgB,iBAAiB,CAAC,WAAW,OAAO,CAAC,CAAC,SAAS,OAAO,OAAO,QAAQ,UAAU,CAAC,KAChG,gBAAgB,qBAAqB,OAAO,QAAQ,WAAW;GACrE,MAAM,eAAoC,gBAAgB,WAAW,qBACjE,gBAAgB,gBAAgB,yBAC9B,gBAAgB,oBAAoB,0BAA0B;GACpE,MAAM,eAAe,UAAU,UAAU,oBAAoB;GAC7D,MAAM,aAAa,UAAU,cAAc,KAAK;GAGhD,MAAM,cAAc,CAAC,WAAW,OAAO,WAAW,OAAO;GACzD,MAAM,iBAAiB,KAAK,uBAAuB,OAAO,SAAS;GACnE,MAAM,WAAW,OAAO,YAAY;GACpC,MAAM,cAAc,aAAa,iBAAiB,OAAO;GACzD,MAAM,cAAc,CAAC,IAAI,GAAG,KAAK,KAAK;GACtC,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAW,KAAKA,SAAO,YAAYA,SAAO,gBAAgB;IAAG,qBAAmB,OAAO,SAAS;IAArG,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;KAAS,WAAWA,SAAO;KAAgB,cAAY,EAAE,oBAAoB;KAA7E,UAAA,CACA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,SAAO;MAAvB,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;QAAW,WAAWA,SAAO;QAAY,OAAO,EAAE,eAAe;QAAG,MAAM,EAAE,cAAc;QAAG,UAAS;QACpG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;SAAO,WAAW;SAAY,OAAO,OAAO;SAAI,YAAY;SAAO,UAAU,UAAU;SAAU,WAAW,MAAM,QAAQ,EAAE,IAAI,EAAE,OAAO,MAAM,CAAC;QAAI,CAAA;OAC3I,CAAA;OACX,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;QAAW,WAAWA,SAAO;QAAY,OAAO,EAAE,iBAAiB;QAAG,MAAM,EAAE,gBAAgB;QAAG,UAAS;QACxG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;SAAO,WAAW;SAAY,OAAO,OAAO,QAAQ;SAAI,YAAY;SAAO,UAAU;SAAU,WAAW,MAAM,QAAQ,EAAE,MAAM,EAAE,OAAO,MAAM,CAAC;QAAI,CAAA;OAC3I,CAAA;OACX,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;QAAgB;QAAG,WAAWA,SAAO;QAAY,OAAO,EAAE,kBAAkB;QAAG,MAAM,EAAE,iBAAiB;QAAG,OAAO,OAAO;QAAO,SAAS,KAAK;QAAQ,UAAS;QAAW,WAAW;QAAkB,UAAU,UAAU;QAAU,WAAW,UAAU,QAAQ,iBAAiB,MAAM,QAAQ,KAAK,CAAC;OAAI,CAAA;MACxS;KACJ,CAAA,GAAA,UACC,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWA,SAAO;OAAkB,UAAA,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;MAAK,CAAA;MACxF,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWA,SAAO;OAAkB,UAAA,EAAE,oBAAoB;MAAK,CAAA;MAClE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWA,SAAO;OAAkB,UAAA,EAAE,iBAAiB;MAAK,CAAA;KAC/D,EAAA,CAAA,CAEK;IAET,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,wBAAD;KAA2B;KAAG,OAAO,OAAO,SAAS;KAAY,qBAAqB,MAAM,wBAAwB,KAAA,IAAY,KAAA,UAAkB,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;MAChJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAI,WAAWA,SAAO;OAAqB,UAAA,EAAE,4BAA4B,EAAE,OAAO,eAAe,GAAG,kBAAkB,OAAO,SAAS,UAAU,EAAE,CAAC;MAAM,CAAA;MACzJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWA,SAAO;OAAkB,UAAA,EAAE,2BAA2B,EAAE,OAAO,eAAe,GAAG,kBAAkB,OAAO,SAAS,UAAU,EAAE,CAAC;MAAK,CAAA;MACnJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWA,SAAO;OAAa,UAAA,MAAM,sBAAsB,OAAO,SAAS,YAAY,MAAM;MAAO,CAAA;KACzG,EAAA,CAAA;KAJF,UAAA;OAKE,eAAe,OAAO,aAAa,OAAO,YAAY,OAAO,eAAe,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;OAAS,WAAWA,SAAO;OAAe,qBAAkB;OAAa,cAAY,EAAE,4BAA4B;OAAnH,UAAA,CAC5E,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;QAAI,WAAWA,SAAO;QAAqB,UAAA,EAAE,4BAA4B;OAAM,CAAA,GAC/E,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,SAAO;QAAvB,UAAA;SACG,OAAO,aAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;UAAgB;UAAG,WAAWA,SAAO;UAAY,OAAO,EAAE,sBAAsB;UAAG,MAAM,EAAE,qBAAqB;UAAG,OAAO,OAAO;UAAW,SAAS,KAAK;UAAY,UAAS;UAAO,WAAW;UAAgC;UAAU,WAAW,UAAU,QAAQ,EAAE,WAAW,MAAM,CAAC;SAAI,CAAA;SACpT,OAAO,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;UAAgB;UAAG,WAAWA,SAAO;UAAY,OAAO,EAAE,qBAAqB;UAAG,MAAM,EAAE,oBAAoB;UAAG,OAAO,OAAO,YAAY,KAAA;UAAW,SAAS,CAAC,IAAI,GAAG,KAAK,aAAa;UAAG,UAAS;UAAG,WAAW;UAA+B;UAAU,WAAW,UAAU,QAAQ,UAAU,KAAK,EAAE,UAAU,KAAK,IAAI,EAAE,UAAU,MAAM,CAAC;SAAI,CAAA;SACvW,OAAO,cAAc,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;UAAgB;UAAG,WAAWA,SAAO;UAAY,OAAO,EAAE,uBAAuB;UAAG,MAAM,EAAE,sBAAsB;UAAG,OAAO,OAAO;UAAY,SAAS,KAAK;UAAa,UAAS;UAAM,WAAW;UAAwB,UAAU,YAAY,qBAAqB,QAAQ,YAAY;UAAG,WAAW,UAAU;WAAE,IAAI,CAAC,qBAAqB,QAAQ,YAAY,GAAG,QAAQ,EAAE,YAAY,MAAM,CAAC;UAAE;SAAI,CAAA;SAC9Z,eAAe,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;UACd,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;WAAG,WAAW,KAAKA,SAAO,kBAAkBA,SAAO,SAAS;WAAI,UAAA,EAAE,kBAAkB;UAAK,CAAA;UACzF,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;WAAgB;WAAG,WAAWA,SAAO;WAAY,OAAO,EAAE,oBAAoB;WAAG,MAAM,EAAE,mBAAmB;WAC1G,OAAO,OAAO;WAAS,SAAS,CAAC,IAAI,GAAI,UAAU,YAAY,KAAK,YAAY,CAAC,CAAE;WAAG,UAAS;WAAG,WAAW;WAA8B;WAC3I,WAAW,UAAU,QAAQ,EAAE,SAAS,UAAU,KAAK,KAAA,IAAY,MAAM,CAAC;UAAI,CAAA;UAC/E,OAAO,YAAY,KAAA,KAAa,mBAAmB,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;WAAG,WAAW,KAAKA,SAAO,iBAAiBA,SAAO,SAAS;WAAI,UAAA,EAAE,4BAA4B,EAAE,OAAO,eAAe,GAAG,oBAAoB,cAAc,EAAE,CAAC;UAAK,CAAA;UACnO,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;WAAgB;WAAG,OAAO,OAAO;WAAiB;WAAU,WAAW,UAAU,QAAQ,EAAE,OAAO,MAAM,CAAC;UAAI,CAAA;SAC7G,EAAA,CAAA;QACC;OACE,CAAA,CAAA;;MACT,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;OAAS,WAAWA,SAAO;OAAe,qBAAkB;OAAY,cAAY,EAAE,2BAA2B;OAAjH,UAAA;QACA,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;SAAI,WAAWA,SAAO;SAAqB,UAAA,EAAE,2BAA2B;QAAM,CAAA;QAC9E,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAWA,SAAO;SAAvB,UAAA;UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;WAAgB;WAAG,WAAWA,SAAO;WAAY,OAAO,EAAE,qBAAqB;WAAG,MAAM,EAAE,oBAAoB;WAAG,OAAO;WAAU,SAAS;WAAY,UAAS;WAAS,WAAW;WAAqB,UAAU,UAAU;WAAU,WAAW,UAAU,QAAQ;YAAE,UAAU;YAAO,MAAM,UAAU,gBAAiB,OAAO,QAAQ,cAAe,KAAA;WAAU,CAAC;UAAI,CAAA;UACrW,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;WAAgB;WAAG,WAAWA,SAAO;WAAY,OAAO,EAAE,iBAAiB;WAAG,MAAM,EAAE,gBAAgB;WAAG,OAAO,OAAO;WAAY,SAAS,KAAK;WAAW,UAAS;WAAU,WAAW;WAAsB,UAAU,UAAU;WAAU,WAAW,UAAU,QAAQ,EAAE,YAAY,MAAM,CAAC;UAAI,CAAA;UACnS,OAAO,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;WAAgB;WAAG,WAAWA,SAAO;WAAY,OAAO,EAAE,qBAAqB;WAAG,MAAM,EAAE,oBAAoB;WAAG,OAAO,OAAO;WAAU,SAAS,KAAK;WAAW,UAAS;WAAa,WAAW;WAA+B;WAAU,WAAW,UAAU,QAAQ,EAAE,UAAU,MAAM,CAAC;UAAI,CAAA;UACnT,OAAO,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;WAAgB;WAAG,WAAWA,SAAO;WAAY,OAAO,EAAE,kBAAkB;WAAG,MAAM,EAAE,iBAAiB;WAAG,OAAO,OAAO;WAAW,SAAS,KAAK;WAAY,UAAS;WAAW,WAAW;WAAuB,UAAU,UAAU;WAAU,WAAW,UAAU,QAAQ,EAAE,WAAW,MAAM,CAAC;UAAI,CAAA;UACvT,OAAO,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;WAAgB;WAAG,WAAW,yBAAyB,KAAA,IAAYA,SAAO,aAAaA,SAAO;WAAY,OAAO,EAAE,kBAAkB;WAAG,MAAM,EAAE,iBAAiB;WAChL,OAAO,OAAO;WAAO,UAAU,SAAS,KAAK;WAAG,SAAA;WAAQ,KAAK,SAAS,IAAI,KAAA;WAAqB;WAC/F,cAAc;WAAsB,YAAY,EAAE,mBAAmB;WACrE,aAAa,MAAM;WAAa,UAAU,GAAG,MAAM,WAAW;WAAS,WAAW,UAAU;YAAE,IAAI,OAAO,UAAU,UAAU,QAAQ,EAAE,OAAO,MAAM,CAAC;WAAE;UAAI,CAAA;UAC5J,OAAO,SAAS,CAAC,2BAChB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;WAAG,WAAW,KAAKA,SAAO,iBAAiBA,SAAO,UAAU;WAAI,UAAA,EAAE,sBAAsB;UAAK,CAAA;UAE/F,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;WAAW,WAAWA,SAAO;WAAY,OAAO,EAAE,kBAAkB;WAAG,MAAM,EAAE,iBAAiB;WAAG,UAAS;WAAU,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YAAO,WAAW;YAAY,OAAO,OAAO,SAAS;YAAI,YAAY;YAAO,UAAU,UAAU;YAAU,WAAW,MAAM,QAAQ,EAAE,OAAO,EAAE,OAAO,MAAM,CAAC;WAAI,CAAA;UAAY,CAAA;UAClS,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;WAAK,WAAW,KAAKA,SAAO,mBAAmBA,SAAO,UAAU;WAAhE,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;YAAM,WAAWA,SAAO;YAAmB,UAAA,EAAE,sBAAsB;WAAQ,CAAA,GAC3E,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;YAAa,OAAO,EAAE,qBAAqB;YACzC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;aAAM,WAAWA,SAAO;aAAc,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACG,sCAAAA,QAAD;cAAQ,OAAO,EAAE,sBAAsB;cAAG,SAAS,OAAO,cAAc;cAAM,UAAU,UAAU;cAAU,WAAW,SAAS,QAAQ,EAAE,WAAW,KAAK,CAAC;aAAI,CAAA;YAAO,CAAA;WACjM,CAAA,CACV;;UACJ,OAAO,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;WAAgB;WAAG,WAAWH,SAAO;WAAY,OAAO,EAAE,mBAAmB;WAAG,MAAM,EAAE,kBAAkB;WAAG,OAAO,OAAO;WAAQ,SAAS,KAAK;WAAS,UAAS;WAAO,WAAW;WAAmB,UAAU,UAAU;WAAU,WAAW,UAAU,QAAQ,EAAE,QAAQ,MAAM,CAAC;UAAI,CAAA;SACvS;;QACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;SAAI,WAAWA,SAAO;SAAqB,UAAA,EAAE,uBAAuB;QAAM,CAAA;QAC1E,iBAAA,GAAA,kBAAA,KAAA,CAAC,YAAD;SAAoB;SAAU,WAAW,KAAKA,SAAO,YAAYA,SAAO,cAAcA,SAAO,cAAc;SAA3G,UAAA,CACG,eACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;UAAgB;UAAG,WAAWA,SAAO;UAAY,OAAO,EAAE,iBAAiB;UAAG,MAAM,EAAE,gBAAgB;UAAG,OAAO,OAAO;UAAM,SAAS;UAAa,UAAS;UAAG,WAAW;UAAiB,UAAU,UAAU;UAAU,WAAW,UAAU,QAAQ,EAAE,MAAM,SAAS,KAAA,EAAU,CAAC;SAAI,CAAA,GAEvR,CAAC,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,sBAAD;UAAyB;UAAa;UAAU,OAAO,OAAO;UAAiB;UAAU,QAAQ,OAAO;UAAQ,IAAI,OAAO;UAAI,cAAc,OAAO;UAAc,SAAS,OAAO;UAAS,YAAY,OAAO;UAAY,aAAa,MAAM;UAAa,YAAY,MAAM;UAAY,UAAU,UAAU,QAAQ,EAAE,QAAQ,MAAM,CAAC;SAAI,CAAA,CAC7U;;OACD;;OAEP,eAAe,iBAAiB,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;OAAS,WAAWA,SAAO;OAAe,qBAAkB;OAAU,cAAY,EAAE,sBAAsB;OAA1G,UAAA;QAClC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;SAAI,WAAWA,SAAO;SAAqB,UAAA,EAAE,sBAAsB;QAAM,CAAA;QACxE,eAAe,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;SACf,UAAU,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;UAAG,WAAWA,SAAO;UAAkB,UAAA,EAAE,wBAAwB;SAAK,CAAA;SACjG,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;UAAW,OAAO,EAAE,YAAY;UAAG,MAAM,EAAE,gBAAgB,SAAS,mBAAmB,sBAAsB;UAAG,UAAS;UACvH,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;WACE,WAAWA,SAAO;WAClB,cAAY,EAAE,gBAAgB;WAC9B,OAAO,CAAC,OAAO,QAAQ,IAAI,GAAI,OAAO,SAAS,CAAC,CAAE,CAAC,CAAC,QAAQ,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI;WAC/F,YAAY;WACZ,UAAU,YAAa,UAAU;WACjC,WAAW,MAAM;YACf,mBAAmB,CAAC;YACpB,MAAM,OAAO,EAAE,OAAO;YAItB,IAAI,UAAU,OAAO,OAAO,mBAC1B,QAAQ;aAAE,MAAM;aAAM,OAAO,CAAC;YAAE,CAAC;iBAEjC,QAAQ;aAAE,MAAM,KAAK,KAAK,CAAC,CAAC,SAAS,IAAI,OAAO,KAAA;aAAW,OAAO,CAAC;YAAE,CAAC;WAE1E;UACD,CAAA;SACQ,CAAA;SACV,CAAC,UAAU,UAAU,cAAc,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD;UAAoB;UAAG,OAAO,OAAO;UAAqB;UAAU,WAAW,UAAU,QAAQ,EAAE,WAAW,MAAM,CAAC;SAAI,CAAA;QACpK,EAAA,CAAA;QACF,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;SAAI,WAAWA,SAAO;SAAqB,UAAA,EAAE,qBAAqB;QAAM,CAAA;QACtE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAWA,SAAO;SAAvB,UAAA;UACG,OAAO,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;WAAgB;WAAG,WAAWA,SAAO;WAAY,OAAO,EAAE,iBAAiB;WAAG,MAAM,EAAE,gBAAgB;WAAG,OAAO,OAAO;WAAM,SAAS,KAAK;WAAO,UAAS;WAAO,WAAW;WAAiB,UAAU,UAAU;WAAU,WAAW,UAAU,QAAQ,EAAE,MAAM,MAAM,CAAC;UAAI,CAAA;UAC3R,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;WAAgB;WAAG,WAAWA,SAAO;WAAY,OAAO,EAAE,uBAAuB;WAAG,MAAM,EAAE,sBAAsB;WAAG,OAAO,OAAO;WAAY,SAAS;WAAc,UAAS;WAAG,aAAA;WAAY,WAAW;WAAwB,UAAU,UAAU;WAAU,WAAW,UAAU,QAAQ,EAAE,YAAY,SAAS,KAAA,EAAU,CAAC;UAAI,CAAA;UAClV,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;WAAgB;WAAG,WAAWA,SAAO;WAAY,OAAO,EAAE,iBAAiB;WAAG,MAAM,EAAE,gBAAgB;WAAG,OAAO,OAAO;WAAM,SAAS;WAAc,UAAS;WAAS,aAAA;WAAY,WAAW;WAAwB,UAAU,UAAU;WAAU,WAAW,UAAU,QAAQ,EAAE,MAAM,SAAS,KAAA,EAAU,CAAC;UAAI,CAAA;UAChU,CAAC,UACA,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;WACG,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;YAAW,WAAWA,SAAO;YAAY,OAAO,EAAE,oBAAoB;YAAG,MAAM,EAAE,mBAAmB;YAAG,UAAS;YAC/H,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;aAAO,WAAW;aAAY,OAAO,OAAO,WAAW;aAAI,YAAY;aAAO,UAAU;aAAU,WAAW,MAAM,QAAQ,EAAE,SAAS,EAAE,OAAO,MAAM,CAAC;YAAI,CAAA;WACjJ,CAAA;WACV,eAAe,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;YAAW,WAAWA,SAAO;YAAY,OAAO,EAAE,yBAAyB;YAAG,MAAM,EAAE,wBAAwB;YAAG,UAAS;YACxI,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;aAAO,WAAW;aAAY,OAAO,OAAO,gBAAgB;aAAI,YAAY;aAAO,UAAU;aAAU,WAAW,MAAM,QAAQ,EAAE,cAAc,EAAE,OAAO,MAAM,CAAC;YAAI,CAAA;WAC3J,CAAA;WACV,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD;YAAmB;YAAG,UAAU,OAAO;YAAoB;YAAU,UAAU,UAAU,QAAQ,EAAE,UAAU,MAAM,CAAC;WAAI,CAAA;UACzI,EAAA,CAAA;SAED;;OACE;;KACe;IACrB,CAAA,CAAA;;EAET;;;EC1PA,MAAMI,WAAS;GAAE,GAAGC;GAAW,GAAGC;EAAW;;EAI7C,MAAa,oBAAA,GAAmBC,MAAAA,KAAAA,CAAK,SAAS,iBAAiB,OA8BjD;GACZ,MAAM,EAAE,GAAG,MAAM,WAAW;GAC5B,MAAM,CAAC,cAAc,oBAAA,GAAmBC,MAAAA,SAAAA,CAA8B;GACtE,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS,KAAK;GAC9C,MAAM,eAAe,aAAa,QAAQ;GAC1C,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,YAAY,KAAK;IAAG,gBAAgB,KAAA,CAAS;GAAE,GAAG,CAAC,MAAM,YAAY,OAAO,EAAE,CAAC;GACjG,MAAM,WAAA,GAAUC,MAAAA,OAAAA,CAAoB,IAAI;GACxC,MAAM,aAAA,GAAYA,MAAAA,OAAAA,CAAwB,IAAI;GAC9C,MAAM,aAAA,GAAYA,MAAAA,OAAAA,CAAwB,IAAI;GAC9C,MAAM,aAAA,GAAYA,MAAAA,OAAAA,CAAO,KAAK;GAC9B,MAAM,WAAA,GAAUC,MAAAA,MAAAA,CAAM;GACtB,MAAM,UAAU,OAAO,YAAY;GACnC,MAAM,OAAO,OAAO,QAAQ,OAAO;GACnC,MAAM,oBAAoB,oBAAoB,MAAM;GACpD,MAAM,kBAAkB,OAAO,kBAAkB,KAAA,KAAa,OAAO,kBAAkB;GACvF,MAAM,oBAA0B;IAAE,UAAU,SAAS,cAAc,QAAQ,CAAC,EAAE,MAAM;GAAE;GACtF,MAAM,SAAS,eAAe,MAAM,OAAO,KAAK;GAChD,MAAM,WAAW,OAAO,YAAY;GACpC,MAAM,QAAQ,CAAC,eAAe,GAAG,kBAAkB,OAAO,SAAS,UAAU,GAAG,eAAe,GAAG,qBAAqB,QAAQ,CAAC;GAChI,IAAI,OAAO,UAAU,MAAM,KAAK,EAAE,sBAAsB,EAAE,OAAO,eAAe,GAAG,qBAAqB,OAAO,YAAY,YAAY,EAAE,CAAC,CAAC;GAC3I,IAAI,OAAO,YAAY,OAAO,aAAa,OAAO,MAAM,KAAK,EAAE,sBAAsB,EAAE,OAAO,eAAe,GAAG,qBAAqB,OAAO,QAAQ,EAAE,CAAC,CAAC;GACxJ,MAAM,SAAS,OAAO,oBAAoB,OAAO,EAAE,wBAAwB,IACvE,kBAAmB,OAAO,kBAAkB,YAAY,EAAE,kBAAkB,IAAI,OAAO,kBAAkB,cAAc,EAAE,mBAAmB,IAAI,EAAE,2BAA2B,IAC3K,OAAO,kBAAkB,OAAO,EAAE,sBAAsB,IAAI,OAAO,iBAAiB,OAAO,EAAE,qBAAqB,IAAI,KAAA;GAC5H,MAAM,YAAyB;IAC7B;KAAE,IAAI;KAAM,OAAO,EAAE,aAAa;KAAG,UAAU,MAAM,YAAY,CAAC,MAAM;IAAU;IAClF;KAAE,IAAI;KAAQ,OAAO,EAAE,eAAe;KAAG,UAAU,MAAM,YAAY,CAAC,MAAM;IAAY;IACxF,GAAI,sBAAsB,KAAA,IAAY,CACpC;KAAE,IAAI;KAAa,OAAO,EAAE,gBAAgB;KAAG,UAAU,MAAM;IAAS,GACxE;KAAE,IAAI;KAAU,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAWN,SAAO;MAAmB,UAAA,EAAE,aAAa;KAAQ,CAAA;KAAG,QAAQ;KAAM,UAAU,MAAM;IAAS,CACrI,IAAI,CAAC;GACP;GACA,MAAM,YAAY,UAAU,MAAM,SAAS,EAAE,UAAU,SAAS,CAAC,KAAK,QAAQ;GAC9E,IAAI,aAAa,EAAE,UAAU,YAAY,UAAU,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;IAAM,KAAK;IAAe,UAAA,UAAU;GAAY,CAAA;GAC3G,MAAM,eAAqB;IACzB,IAAI,sBAAsB,KAAA,GAAW;IACrC,IAAI,OAAO,cAAc,gBAAgB,QAAQ;SAC5C,MAAW,0BAA0B,iBAAiB;GAC7D;GAOA,MAAM,6BAAmC;IACvC,IAAI,sBAAsB,KAAA,KAAa,MAAM,YAAY,mBAAmB,iBAAiB,KAAA,GAAW;IACxG,IAAI,OAAO,kBAAkB,QAAQ,OAAO,oBAAoB,MAAM;IACtE,MAAM,wBAAwB,iBAAiB;GACjD;GACA,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,KAAK;IAAS,WAAW,KAAKA,SAAO,YAAY,MAAM,YAAYA,SAAO,cAAc;IACtG,kBAAgB,OAAO;IAAI,iBAAe,MAAM,WAAW,KAAK,KAAA;IAChE,oBAAkB,MAAM,aAAa,KAAK,KAAA;IAAW,mBAAiB,MAAM,YAAY,KAAK,KAAA;IAC7F,eAAe;KAAE,UAAU,UAAU;IAAK;IAC1C,cAAc;KACZ,UAAU,UAAU;KACpB,4BAA4B;MAC1B,IAAI,UAAU,SAAS;MACvB,YAAY,KAAK;MACjB,qBAAqB;KACvB,CAAC;IACH;IACA,YAAY,MAAM,eAAe,KAAA,IAAY,KAAA,KAAa,UAAU,MAAM,WAAY,OAAO,IAAI,KAAK;IACtG,QAAQ,MAAM,WAAW,KAAA,IAAY,KAAA,KAAa,UAAU,MAAM,OAAQ,OAAO,IAAI,KAAK;IAAG,WAAW,MAAM;IAbzG,UAAA;KAcL,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAWA,SAAO;MAAgB,MAAK;MAAS,eAAY;MAAQ,UAAA,UAAU,CAAC,mBAAmB,CAAC,OAAO,kBAAkB,GAAG,KAAK,GAAG,WAAW;KAAS,CAAA;KACjK,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MAAQ,WAAWA,SAAO;MAA1B,UAAA;OACG,MAAM,gBAAgB,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;QAAa,OAAO,EAAE,eAAe;QACvE,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAWA,SAAO;SAAY,eAAY;SAAO,WAAA;SAAU,cAAc,UAAU,MAAM,YAAa,OAAO,IAAI,KAAK;SAAG,UAAA;QAAO,CAAA;OAC3H,CAAA;OACb,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,SAAO;QAAc,iBAAe,MAAM;QAAU,iBAAe;QAClG,eAAe;SAEb,IAAI,MAAM,UAAU,qBAAqB;SACzC,MAAM,iBAAiB,OAAO,EAAE;QAClC;QALF,UAAA,CAME,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;SAAM,WAAWA,SAAO;SAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,SAAO;UAAgB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;WAAM,WAAWA,SAAO;WAAa,UAAA;UAAW,CAAA;SAAO,CAAA,GAC/F,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,SAAO;UAAa,UAAA,MAAM,KAAK,KAAK;SAAQ,CAAA,CACzD;QACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAACO,sCAAAA,+BAAD,EAA+B,WAAW,KAAKP,SAAO,SAAS,MAAM,YAAYA,SAAO,WAAW,EAAI,CAAA,CACjG;;OACP,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;QAAa,MAAM,OAAO,kBAAkB,YAAY,kBAAkB,WAAW;QAAW,OAAO;OAAS,CAAA;OAC3H,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;QAAM,WAAWA,SAAO;QAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACQ,sCAAAA,QAAD;SAAQ,WAAWR,SAAO;SAAc,SAAS;SAAS,OAAO,EAAE,mBAAmB,EAAE,KAAK,CAAC;SAAG,UAAU,MAAM,YAAY,qBAAqB,QAAQ,SAAS,KAAM,sBAAsB,KAAA,KAAa,OAAO,kBAAkB;SACnO,WAAW,SAAS;UAClB,IAAI,MAAM,YAAY,qBAAqB,QAAQ,SAAS,GAAG;UAC/D,IAAI,sBAAsB,KAAA,GAAW,MAAM,2BAA2B,mBAAmB,EAAE,SAAS,KAAK,CAAC;eACrG,MAAM,gBAAgB,OAAO,IAAI,IAAI;SAC5C;QAAI,CAAA,GACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,KAAK;SAAW,UAAU;SAAI,YAAY,UAAU;UACxD,IAAI,CAAC,YAAa,MAAM,QAAQ,YAAY,MAAM,QAAQ,OAAQ;UAClE,MAAM,gBAAgB;UACtB,IAAI,MAAM,QAAQ,UAAU,MAAM,eAAe;UACjD,YAAY;UACZ,YAAY,KAAK;SACnB;SACE,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACS,sCAAAA,MAAD;UAAM,MAAM;UAAU,QAAA;UAAO,WAAA;UAAU,SAAA;UAAQ,OAAM;UAAM,OAAO;UAAW,eAAe,YAAY,KAAK;UAC3G,WAAW,WAAW;WACpB,YAAY,KAAK;WACjB,YAAY;WACZ,IAAI,WAAW,UAAU,gBAAgB,QAAQ;gBAC5C,IAAI,WAAW,MAAM,MAAM,SAAS,OAAO,EAAE;gBAC7C,IAAI,WAAW,QAAQ,MAAM,WAAW,OAAO,EAAE;gBACjD,IAAI,WAAW,aAAa,MAAM,YAAY,OAAO,EAAE;UAC9D;UACA,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,QAAD;WAAQ,MAAK;WAAK,SAAQ;WAAQ,cAAY,EAAE,oBAAoB,EAAE,KAAK,CAAC;WAAG,iBAAc;WAAO,iBAAe;WAAU,eAAe,YAAY,CAAC,QAAQ;WAAG,UAAA;UAAS,CAAA;SAAI,CAAA;QACvL,CAAA,CACF;;MACA;;MACN,OAAO,mBAAmB,mBAAmB,OAAO,kBAAkB,MAAM,mBAAmB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWV,SAAO;MAAvB,UAAA;OAC9F,OAAO,mBAAmB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,yBAAyB,EAAK,CAAA;OAC9D,OAAO,iBAAiB,OAAO,mBAAmB,oBAAoB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,qBAAqB,EAAK,CAAA;OACtG,OAAO,kBAAkB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,yBAAyB,EAAE,SAAS,OAAO,eAAe,CAAC,EAAK,CAAA;OAC/F,MAAM,kBAAkB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,MAAM,eAAkB,CAAA;OACpD,sBAAsB,KAAA,MAAc,OAAO,mBAAmB,oBAAoB,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,KAAK;QAAW,UAAU;QACjH,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACU,sCAAAA,QAAD;SAAQ,MAAK;SAAK,SAAQ;SAAU,UAAU,OAAO;SAAe,SAAS;SAAS,UAAA,EAAE,iBAAiB;QAAU,CAAA;OAC/G,CAAA;MACH;;KACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,IAAI;MAAS,QAAQ,CAAC,MAAM;MAC9B,UAAA,MAAM,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAAA,kBAAA,UAAA,EAAA,UACjB,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;OAAqB;OAAS;OAAc;OAAQ,UAAU,MAAM;OAAU,aAAa,MAAM;OAAa,YAAY,GAAG,MAAM,WAAW,GAAG,OAAO;OACtJ,qBAAqB,MAAM;OAC3B,UAAU,UAAU,MAAM,QAAQ,OAAO,IAAI,KAAK;OAClD,GAAK,sBAAsB,KAAA,IAAY,CAAC,IAAI,EAAE,gBAAgB,UAAyC,MAAM,2BAA2B,mBAAmB,KAAK,EAAE;MAAK,CAAA,EACzK,CAAA;KACC,CAAA;KACJ,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;MAAe,OAAO,EAAE,iBAAiB,WAAW,qBAAqB,oBAAoB,EAAE,KAAK,CAAC;MACpH,aAAa,EAAE,iBAAiB,WAAW,2BAA2B,0BAA0B,EAAE,KAAK,CAAC;MACxG,cAAc,EAAE,iBAAiB,WAAW,uBAAuB,iBAAiB;MAAG,aAAa,EAAE,aAAa;MACnH,gBAAgB,EAAE,sBAAsB;MAAG,gBAAgB,iBAAiB,WAAW,YAAY;MACnG,gBAAgB;OAAE,gBAAgB,KAAA,CAAS;OAAG,IAAI,iBAAiB,UAAU,YAAY;YAAQ,UAAU,SAAS,cAAc,QAAQ,CAAC,EAAE,MAAM;MAAE;MACrJ,iBAAiB,iBAAiB,WAAW,MAAM,SAAS,OAAO,EAAE,IAAI,MAAM,0BAA0B,iBAAkB;KAAI,CAAA;IAC1H;;EACX,CAAC;;;ECvLD,MAAa,qBAAqB,WAAsC,OAAO,SAAS;;;EAGxF,SAAgB,eACd,KACA,OACA,QACA,UACA,YACU;GACV,MAAM,aAAa,WAAsC;IACvD,MAAM,QAAQ,OAAO,QAAQ,kBAAkB,MAAM,CAAC;IACtD,OAAO,QAAQ,IAAI,OAAO,SAAS;GACrC;GACA,OAAO,IACJ,KAAK,QAAQ,WAAW;IAAE;IAAQ;GAAM,EAAE,CAAC,CAC3C,QAAQ,UAAU,UAAU,KAAA,KAAa,kBAAkB,MAAM,MAAM,MAAM,KAAK,CAAC,CACnF,QAAQ,UAAU,aAAa,KAAA,KAAa,MAAM,OAAO,aAAa,QAAQ,CAAC,CAC/E,QAAQ,UAAU,eAAe,KAAA,KAAa,WAAW,SAAS,MAAM,OAAO,EAAE,CAAC,CAAC,CACnF,MAAM,GAAG,MAAM;IACd,MAAM,UAAU,UAAU,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM;IACxD,IAAI,YAAY,GAAG,OAAO;IAC1B,MAAM,WAAW,EAAE,OAAO,SAAS,MAAM,EAAE,OAAO,SAAS;IAC3D,IAAI,YAAY,GAAG,OAAO;IAC1B,OAAO,EAAE,QAAQ,EAAE;GACrB,CAAC,CAAC,CACD,KAAK,UAAU,MAAM,OAAO,EAAE;EACnC;;;;;;EAOA,SAAgB,gBACd,KACA,aACA,OACA,OACA,QACA,UACA,YACqB;GACrB,MAAM,SAAS,IAAI;GACnB,IAAI,WAAW,KAAA,KAAc,UAAU,KAAA,KAAa,kBAAkB,MAAM,MAAM,OAAQ,OAAO;GACjG,MAAM,YAAY,OAAO;GACzB,MAAM,OAAO,eAAe,KAAK,kBAAkB,MAAM,GAAG,UAAU,CAAC,GAAG,UAAU,UAAU;GAC9F,MAAM,YAAY,KAAK,QAAQ,SAAS;GACxC,MAAM,kBAAkB,YAAY;GACpC,IAAI,YAAY,KAAK,kBAAkB,KAAK,mBAAmB,KAAK,QAAQ,OAAO;GACnF,MAAM,WAAW,KAAK;GACtB,MAAM,eAAe,IAAI,WAAW,WAAW,OAAO,OAAO,SAAS;GACtE,MAAM,cAAc,IAAI,WAAW,WAAW,OAAO,OAAO,QAAQ;GACpE,IAAI,eAAe,KAAK,cAAc,GAAG,OAAO;GAChD,MAAM,OAAO,CAAC,GAAG,GAAG;GACpB,MAAM,UAAU,KAAK;GACrB,MAAM,aAAa,KAAK;GAGxB,IAAI,YAAY,KAAA,KAAa,eAAe,KAAA,GAAW,OAAO;GAC9D,KAAK,gBAAgB;IAAE,GAAG;IAAY,OAAO,QAAQ,SAAS;GAAE;GAChE,KAAK,eAAe;IAAE,GAAG;IAAS,OAAO,WAAW,SAAS;GAAE;GAC/D,OAAO;EACT;;;EAIA,SAAgB,WACd,KACA,UACA,UACA,QACA,OACA,QACA,UACA,YACqB;GACrB,MAAM,SAAS,IAAI,MAAM,WAAW,OAAO,OAAO,QAAQ;GAC1D,IAAI,WAAW,KAAA,KAAc,UAAU,KAAA,KAAa,kBAAkB,MAAM,MAAM,OAAQ,OAAO;GACjG,MAAM,OAAO,eAAe,KAAK,kBAAkB,MAAM,GAAG,UAAU,CAAC,GAAG,UAAU,UAAU;GAC9F,MAAM,cAAc,KAAK,QAAQ,QAAQ;GACzC,IAAI,cAAc,GAAG,OAAO;GAE5B,MAAM,cADO,KAAK,QAAQ,OAAO,OAAO,QACjB,CAAC,CAAC,QAAQ,QAAQ;GACzC,IAAI,cAAc,GAAG,OAAO;GAC5B,MAAM,kBAAkB,eAAe,SAAS,IAAI;GACpD,IAAI,oBAAoB,aAAa,OAAO;GAC5C,MAAM,QAAQ,kBAAkB;GAChC,MAAM,QAAgB,QAAQ,IAAI,IAAI;GACtC,IAAI,UAAU;GACd,KAAK,IAAI,OAAO,GAAG,OAAO,KAAK,IAAI,KAAK,GAAG,QAAQ;IACjD,MAAM,cAAc,QAAQ,WAAW,WAAW,OAAO,OAAO,QAAQ;IACxE,IAAI,cAAc,GAAG;IACrB,UAAU,gBAAgB,SAAS,aAAa,OAAO,OAAO,QAAQ,UAAU,UAAU;GAC5F;GACA,OAAO;EACT;;;EClFA,MAAMC,WAAS;GAAE,GAAGC;GAAW,GAAGC;EAAW;;EA6D7C,SAAgB,iBAAiB,OAAyC;GACxE,MAAM,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,cAAc,aAAa,aAAa,gBAAgB,YAAY,gBAAgB,oBAAoB,WAAW,gBAAgB,eAAe,uBAAuB,yBAAyB,0BAA0B,aAAa;GACjR,MAAM,CAAC,UAAU,gBAAA,GAAeC,MAAAA,SAAAA,CAA6B,MAAM,QAAQ,QAAQ;GACnF,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAiC,CAAC,CAAC;GAC/D,MAAM,CAAC,YAAY,kBAAA,GAAiBA,MAAAA,SAAAA,CAAS,KAAK;GAClD,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAS,KAAK;GAC1C,MAAM,CAAC,cAAc,oBAAA,GAAmBA,MAAAA,SAAAA,CAAS,KAAK;GACtD,MAAM,CAAC,aAAa,mBAAA,GAAkBA,MAAAA,SAAAA,CAAS,MAAM,QAAQ,UAAU,EAAE;GACzE,MAAM,gBAAgB,UAAwB;IAC5C,IAAI,MAAM,WAAW,KAAA,GAAW,MAAM,OAAO,SAAS;IACtD,MAAM,kBAAkB,KAAK;IAC7B,eAAe,KAAK;GACtB;GACA,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAiB;GACnD,MAAM,WAAA,GAAUC,MAAAA,OAAAA,CAAO,KAAK;GAC5B,MAAM,CAAC,UAAU,gBAAA,GAAeD,MAAAA,SAAAA,CAAgE,MAAM,QAAQ,QAAQ;GACtH,MAAM,cAAA,GAAaC,MAAAA,OAAAA,CAAO,MAAM,MAAM;GACtC,MAAM,UAAU,MAAsB,YAA0B;IAC9D,YAAY;KAAE;KAAM;IAAQ,CAAC;IAC7B,SAAS,MAAM,OAAO;GACxB;GACA,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,MAAM,UAAU,MAAM,WAAW,WAAW,SAAS,YAAY;KAAE,MAAM,MAAM,cAAc;KAAM,SAAS,MAAM;IAAO,CAAC;IAC9H,WAAW,UAAU,MAAM;GAC7B,GAAG,CAAC,MAAM,QAAQ,MAAM,UAAU,CAAC;GACnC,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,MAAM,WAAW,KAAA,GAAW,MAAM,OAAO,WAAW;GAC1D,GAAG,CAAC,UAAU,MAAM,MAAM,CAAC;GAC3B,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,MAAM,WAAW,KAAA,GAAW,MAAM,OAAO,WAAW;GAC1D,GAAG,CAAC,UAAU,MAAM,MAAM,CAAC;;GAE3B,MAAM,CAAC,QAAQ,cAAA,GAAaD,MAAAA,SAAAA,CAA6B,KAAA,CAAS;GAClE,MAAM,CAAC,YAAY,kBAAA,GAAiBA,MAAAA,SAAAA,CAAsD,KAAA,CAAS;;GAEnG,MAAM,CAAC,iBAAiB,uBAAA,GAAsBA,MAAAA,SAAAA,CAAiB,KAAK;GACpE,MAAM,aAAa,kBAAkB;GACrC,MAAM,oBAAoB,UAAwB;IAChD,IAAI,uBAAuB,KAAA,GAAW,mBAAmB,KAAK;SACzD,mBAAmB,KAAK;GAC/B;GACA,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,UAAU,QAAQ,MAAM,WAAW,OAAO,OAAO,MAAM,eAAe;IAC5E,IAAI,YAAY,KAAA,GAAW;IAC3B,aAAa,QAAQ,EAAE;IAEvB,YAAY,QAAQ,EAAE;IACtB,OAAO,oBAAoB,oBAAoB,YAAY,QAAQ,EAAE,EAAE,GAAG;GAC5E,GAAG,CAAC,MAAM,eAAe,CAAC;GAE1B,MAAM,iBAAiB,UAAU,eAAe,SAAS,eAAe,eAAe,aAAa,KAAA;GACpG,MAAM,YAAY,cAAc,KAAK,YAAY,CAAC,GAAG,KAAK,QAAQ,GAAG,QAAQ,IAAI,iBAAiB,CAAC,CAAC;GACpG,MAAM,UAAU,mBAAmB,KAAA,IAC/B,UACA,QAAQ,QAAQ,WAAW,kBAAkB,MAAM,MAAM,cAAc;GAC3E,MAAM,SAAS,UAAU,KAAA,IACrB,UACA,QAAQ,QAAQ,WAAW;IAC3B,MAAM,OAAO,OAAO;IACpB,OAAO,UAAU,SAAS,SAAS,aAAa,SAAS;GAC3D,CAAC;GACH,MAAM,aAAa,eAAe,eAC9B,SACA,OAAO,QAAQ,WAAW,OAAO,aAAa,YAAY;GAE9D,MAAM,SAAS,MAAM,WAAW;GAChC,MAAM,UAAU,OAAO,KAAK,CAAC,CAAC,YAAY;GAC1C,MAAM,gBAAgB,WAAW,QAAQ,WAAW,qBAAqB,QAAQ,SAAS,CAAC,CAAC;GAC5F,MAAM,eAAe,cAAc,QAAQ,WAAW,CAAC,qBAAqB,QAAQ,SAAS,CAAC;GAC9F,MAAM,WAAW,QAAQ,WAAW,IAAI,aAAa,WAAW,QAAQ,WACtE,cAAc,SAAS,MAAM,KAAM,eAAe,gBAAgB,MAAM,uBAAuB,kBAAkB,MAAM,GAAG,OAAO,MAAM,IAAK;GAE9I,MAAM,aAAa,WAAsC;IACvD,MAAM,QAAQ,UAAU,QAAQ,kBAAkB,MAAM,CAAC;IACzD,OAAO,QAAQ,IAAI,UAAU,SAAS;GACxC;GACA,MAAM,UAAU,SACb,KAAK,QAAQ,WAAW;IAAE;IAAQ;GAAM,EAAE,CAAC,CAC3C,MAAM,GAAG,MAAM;IACd,MAAM,UAAU,UAAU,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM;IACxD,IAAI,YAAY,GAAG,OAAO;IAC1B,MAAM,WAAW,EAAE,OAAO,SAAS,MAAM,EAAE,OAAO,SAAS;IAC3D,IAAI,YAAY,GAAG,OAAO;IAC1B,OAAO,EAAE,QAAQ,EAAE;GACrB,CAAC,CAAC,CACD,KAAK,UAAU,MAAM,MAAM;GAC9B,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,aAAa,KAAA,KAAa,CAAC,QAAQ,MAAM,WAAW,OAAO,OAAO,QAAQ,GAAG,YAAY,KAAA,CAAS;GACxG,GAAG,CAAC,SAAS,QAAQ,CAAC;;GAEtB,MAAM,mBAAmB,YAA2B;IAClD,IAAI,MAAM,mBAAmB,KAAA,GAAW;IACxC,MAAM,aAAa,IAAI,IAAI,aAAa,KAAK,WAAW,OAAO,EAAE,CAAC;IAClE,eAAe,QAAQ,KAAK,WAAW,WAAW,IAAI,OAAO,EAAE,IAAI;KAAE,GAAG;KAAQ;IAAQ,IAAI,MAAM,CAAC;GACrG;GAEA,MAAM,cAAc,OAAO,QAA6B,kBAAkB,SAA2B;IACnG,cAAc,IAAI;IAClB,IAAI;KACF,MAAM,MAAM,MAAM,WAAW,mBAAmB,EAAE,eAAe,OAAO,CAAC;KACzE,IAAI,CAAC,IAAI,IAAI;MACX,OAAO,SAAS,EAAE,iCAAiC,EAAE,QAAQ,IAAI,WAAW,8BAA8B,CAAC,CAAC;MAC5G,OAAO;KACT;KACA,UAAU,IAAI,MAAM,QAAQ,CAAC,IAAI,IAAI,MAAM,UAAU,CAAC,CAAC;KACvD,IAAI,CAAC,IAAI,MAAM,SAAS,iBAAiB,OAAO,IAAI,MAAM,QAAQ,OAAO,SAAS,IAAI,MAAM,QAAQ,EAAE,sBAAsB,IAAI,EAAE,iCAAiC,EAAE,SAAS,IAAI,MAAM,UAAU,CAAC,EAAA,CAAG,KAAK,UAAU,MAAM,OAAO,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;KAChP,OAAO,IAAI,MAAM;IACnB,SAAS,OAAO;KACd,OAAO,SAAS,EAAE,iCAAiC,EAAE,QAAQ,aAAa,KAAK,EAAE,CAAC,CAAC;KACnF,OAAO;IACT,UAAU;KACR,cAAc,KAAK;IACrB;GACF;GAEA,MAAM,OAAO,YAA8B;IACzC,IAAI,QAAQ,WAAY,MAAM,mBAAmB,KAAA,KAAa,MAAM,uBAAuB,KAAA,GAAY,OAAO;IAC9G,QAAQ,UAAU;IAClB,UAAU,IAAI;IACd,IAAI;KACF,IAAI,MAAM,mBAAmB,KAAA,GAAW;MACtC,MAAM,QAAQ,MAAM,MAAM,mBAAoB;MAC9C,OAAO,QAAQ,OAAO,SAAS,EAAE,QAAQ,iCAAiC,+BAA+B,CAAC;MAC1G,OAAO;KACT;KACA,IAAI,CAAC,MAAM,YAAY,SAAS,KAAK,GAAG,OAAO;KAC/C,UAAU,CAAC,CAAC;KACZ,MAAM,QAAQ,MAAM,cAAc,OAAO;KACzC,IAAI,OAAO,OAAO,MAAM,EAAE,8BAA8B,CAAC;UACpD,YAAY;MAAE,MAAM;MAAS,SAAS,EAAE,+BAA+B;KAAE,CAAC;KAC/E,OAAO;IACT,SAAS,OAAO;KACd,OAAO,SAAS,EAAE,6BAA6B,EAAE,QAAQ,aAAa,KAAK,EAAE,CAAC,CAAC;KAC/E,OAAO;IACT,UAAU;KACR,UAAU,KAAK;KACf,QAAQ,UAAU;IACpB;GACF;GAMA,MAAM,eAAe,eAAe,eAAe,eAAe,KAAA;GAClE,MAAM,WAAA,GAAUE,MAAAA,QAAAA,OACR,eAAe,SAAS,gBAAgB,WAAW,cAAc,QAAQ,KAAK,WAAW,OAAO,EAAE,CAAC,GACzG;IAAC;IAAS;IAAgB;IAAW;IAAc;GAAO,CAC5D;;GAGA,MAAM,WAAA,GAAUD,MAAAA,OAAAA,CAAO;IAAE;IAAS,OAAO;IAAgB,YAAY;IAAW,UAAU;IAAc;IAAQ;IAAY;IAAS;IAAS,UAAU,MAAM,mBAAmB,KAAA;GAAU,CAAC;GAC5L,QAAQ,UAAU;IAAE;IAAS,OAAO;IAAgB,YAAY;IAAW,UAAU;IAAc;IAAQ;IAAY;IAAS;IAAS,UAAU,MAAM,mBAAmB,KAAA;GAAU;GACtL,MAAM,wBAAA,GAAuBE,MAAAA,YAAAA,EAAa,OAAe;IACvD,aAAa,YAAY,YAAY,KAAK,KAAA,IAAY,EAAE;GAC1D,GAAG,CAAC,CAAC;GACL,MAAM,uBAAA,GAAsBA,MAAAA,YAAAA,EAAa,IAAY,YAAqB;IACxE,MAAM,QAAQ,QAAQ,QAAQ,QAAQ,WAAW,SAAS,KAAK,OAAO,EAAE;IACxE,IAAI,SAAS,GAAG,eAAe,QAAQ,QAAQ,QAAQ,KAAK,MAAM,OAAO,OAAO,QAAQ;KAAE,GAAG;KAAM;IAAQ,IAAI,IAAI,CAAC;GACtH,GAAG,CAAC,cAAc,CAAC;GACnB,MAAM,eAAA,GAAcA,MAAAA,YAAAA,EAAa,IAAY,UAAsC;IACjF,IAAI,MAAM,OAAO,KAAA,KAAa,MAAM,OAAO,IAAI;KAC7C,MAAM,SAAS,GAAG,MAAM,WAAW,GAAG,GAAG;KACzC,MAAM,iBAAiB,CAAC,GAAI,MAAM,eAAe,CAAC,CAAE;KACpD,KAAK,MAAM,CAAC,KAAK,UAAU,gBAAgB,IAAI,IAAI,WAAW,MAAM,GAAG;MACrE,MAAM,aAAa,IAAI,GAAG,MAAM,WAAW,GAAG,MAAM,GAAG,GAAG,IAAI,MAAM,OAAO,MAAM,KAAK,KAAK;MAC3F,MAAM,aAAa,OAAO,GAAG;KAC/B;IACF;IACA,MAAM,QAAQ,QAAQ,QAAQ,QAAQ,WAAW,SAAS,KAAK,OAAO,EAAE;IACxE,IAAI,SAAS,GAAG,eAAe,QAAQ,QAAQ,QAAQ,KAAK,MAAM,OAAO,OAAO,QAAQ;KAAE,GAAG;KAAM,GAAG;IAAM,IAAI,IAAI,CAAC;GACvH,GAAG;IAAC;IAAgB,MAAM;IAAY,MAAM;GAAW,CAAC;GACxD,MAAM,cAAA,GAAaA,MAAAA,YAAAA,EAAa,IAAY,UAAkB;IAC5D,MAAM,EAAE,SAAS,SAAS,OAAO,cAAc,YAAY,UAAU,SAAS,KAAK,SAAS,OAAO,aAAa,QAAQ;IACxH,IAAI,SAAS,UAAU;IACvB,MAAM,QAAQ,QAAQ,WAAW,SAAS,KAAK,OAAO,EAAE;IACxD,IAAI,SAAS,GAAG,eAAe,gBAAgB,SAAS,OAAO,OAAO,cAAc,YAAY,UAAU,GAAG,CAAC;GAChH,GAAG,CAAC,cAAc,CAAC;GACnB,MAAM,mBAAA,GAAkBA,MAAAA,YAAAA,EAAa,OAAe;IAClD,MAAM,UAAU,QAAQ,QAAQ;IAChC,MAAM,SAAS,QAAQ,MAAM,SAAS,KAAK,OAAO,EAAE;IACpD,IAAI,WAAW,KAAA,GAAW;IAC1B,IAAI,SAAS,GAAG,OAAO,GAAG;IAC1B,IAAI,SAAS;IACb,OAAO,QAAQ,MAAM,SAAS,KAAK,OAAO,MAAM,GAAG;KACjD,SAAS,GAAG,OAAO,GAAG,OAAO;KAC7B,UAAU;IACZ;IACA,MAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,MAAM,CAAC;IAC/C,MAAM,KAAK;IACX,eAAe,CAAC,GAAG,SAAS,KAAK,CAAC;IAClC,YAAY,MAAM;IAClB,aAAa,MAAM;IACnB,SAAS,MAAM,EAAE,uBAAuB,CAAC;GAC3C,GAAG;IAAC;IAAU;IAAgB;GAAC,CAAC;GAChC,MAAM,gBAAA,GAAeA,MAAAA,YAAAA,EAAa,OAAe;IAC/C,MAAM,UAAU,QAAQ,QAAQ;IAChC,MAAM,MAAM,QAAQ,QAAQ;IAC5B,MAAM,QAAQ,IAAI,QAAQ,EAAE;IAC5B,MAAM,SAAS,IAAI,QAAQ,MAAM,IAAI,QAAQ;IAC7C,MAAM,SAAS,GAAG,MAAM,WAAW,GAAG,GAAG;IACzC,KAAK,MAAM,OAAO,MAAM,aAAa,KAAK,KAAK,CAAC,GAC9C,IAAI,IAAI,WAAW,MAAM,GAAG,MAAM,aAAa,OAAO,GAAG;IAE3D,eAAe,QAAQ,QAAQ,SAAS,KAAK,OAAO,EAAE,CAAC;IACvD,aAAa,UAAU,UAAU,KAAK,KAAA,IAAY,KAAK;IACvD,SAAS,MAAM,EAAE,wBAAwB,CAAC;IAC1C,4BAA4B;KAE1B,CADe,WAAW,KAAA,IAAY,SAAS,cAA2B,8BAA8B,IAAI,SAAS,cAA2B,oBAAoB,YAAY,MAAM,EAAE,yBAAyB,EAAA,EACzM,MAAM;IAChB,CAAC;GACH,GAAG;IAAC;IAAU;IAAgB,MAAM;IAAY,MAAM;IAAa;GAAC,CAAC;GACrE,MAAM,mBAAA,GAAkBA,MAAAA,YAAAA,EAAa,IAAY,UAAwC;IACvF,UAAU,EAAE;IACZ,MAAM,aAAa,gBAAgB;GACrC,GAAG,CAAC,CAAC;GACL,MAAM,kBAAA,GAAiBA,MAAAA,YAAAA,EAAa,IAAY,UAAwC;IACtF,MAAM,eAAe;IACrB,MAAM,EAAE,QAAQ,gBAAgB,QAAQ;IACxC,IAAI,gBAAgB,KAAA,KAAa,gBAAgB,IAAI;IACrD,MAAM,OAAO,MAAM,cAAc,sBAAsB;IACvD,cAAc;KAAE;KAAI,QAAQ,MAAM,UAAU,KAAK,MAAM,KAAK,SAAS;IAAE,CAAC;GAC1E,GAAG,CAAC,CAAC;GACL,MAAM,cAAA,GAAaA,MAAAA,YAAAA,EAAa,IAAY,UAAwC;IAClF,MAAM,eAAe;IACrB,MAAM,EAAE,SAAS,SAAS,OAAO,cAAc,YAAY,UAAU,QAAQ,QAAQ,YAAY,QAAQ,SAAS,KAAK,SAAS,OAAO,aAAa,QAAQ;IAC5J,IAAI,SAAS,UAAU;IACvB,IAAI,WAAW,KAAA,KAAa,WAAW,KAAA,KAAa,WAAW,IAC7D,eAAe,WAAW,SAAS,QAAQ,OAAO,IAAI,OAAO,QAAQ,cAAc,YAAY,UAAU,GAAG,CAAC;IAE/G,UAAU,KAAA,CAAS;IACnB,cAAc,KAAA,CAAS;GACzB,GAAG,CAAC,cAAc,CAAC;GACnB,MAAM,iBAAA,GAAgBA,MAAAA,YAAAA,OAAkB;IACtC,UAAU,KAAA,CAAS;IACnB,cAAc,KAAA,CAAS;GACzB,GAAG,CAAC,CAAC;GACL,MAAM,gBAAA,GAAeA,MAAAA,YAAAA,EAAa,OAAe,WAAW,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC;GACjF,MAAM,kBAAA,GAAiBA,MAAAA,YAAAA,EAAa,OAAe,WAAW,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;GAElF,MAAM,cAAc,WAA8B;IAChD,MAAM,WAAW,QAAQ,QAAQ,SAAS,kBAAkB,IAAI,MAAM,kBAAkB,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,KAAK,EAAE;IACtH,MAAM,WAAW,SAAS,QAAQ,OAAO,EAAE;IAC3C,MAAM,UAAU,QAAQ,WAAW,KAAK,MAAM,mBAAmB,KAAA;IACjE,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;KAEK;KACG;KACE;KACR,aAAa,MAAM;KACnB,YAAY,MAAM;KAClB,UAAU,MAAM,mBAAmB,KAAA,KAAa,oBAAoB,MAAM,MAAM,KAAA;KAChF,gBAAgB,oBAAoB,MAAM,MAAM,KAAA,IAAY,KAAA,IAAY,MAAM;KAC9E,UAAU,aAAa,OAAO;KAC9B,WAAW,WAAW,WAAW;KACjC,aAAa,WAAW,YAAY,KAAK,WAAW,SAAS,SAAS;KACtE,UAAU,WAAW,OAAO;KAC5B,YAAY,YAAY,OAAO,OAAO,MAAM,WAAW;KACvD,WAAW,YAAY,OAAO,OAAO,MAAM,CAAC,WAAW;KACvD,kBAAkB;KAClB,iBAAiB;KACjB,SAAS;KACT,UAAU;KACV,YAAY;KACZ,aAAa;KACb,UAAU;KACa;KACE;KACC;KAC1B,aAAa,UAAU,kBAAkB,KAAA;KACzC,YAAY;KACZ,QAAQ;KACR,WAAW;KACX,qBAAqB,MAAM,mBAAmB,kBAAkB,MAAM,CAAC,MAAM,QAAQ,KAAA,IAAY,MAAM;IACxG,GA7BM,OAAO,EA6Bb;GAEL;GAEA,MAAM,qBAA2B;IAC/B,aAAa,EAAE;IACf,iBAAiB,KAAK;GACxB;GACA,MAAM,gBAAgB,MAAM,kBAAkB,QAAS,cAAc,KAAA,KAAa,QAAQ,MAAM,WAAW,OAAO,OAAO,SAAS,KAAK,CAAC,QAAQ,MAAM,WAAW,OAAO,OAAO,SAAS;;GAExL,MAAM,gBAAgB,eAAe;GACrC,MAAM,YAAY,eAAe,SAAS,CAAC;GAE3C,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAWN,SAAO;IAAS,mBAAgB;IAApD,UAAA;KACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,SAAO;MAAa,yBAAA;MAApC,UAAA;OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,SAAO;QAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;SAAI,IAAG;SAA+B,UAAA,UAAU,KAAA,IAAY,EAAE,qBAAqB,IAAI,EAAE,uBAAuB;QAAM,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,gBAAgB;SAAE,OAAO,OAAO;SAAQ,SAAS,OAAO,QAAQ,WAAW,OAAO,YAAY,KAAK,CAAC,CAAC;QAAO,CAAC,EAAK,CAAA,CAAM,EAAA,CAAA,GAC1P,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAWA,SAAO;SAAgB,uBAAoB;SAA3D,UAAA;UACG;UACA;UACD,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;WAAQ,MAAK;WAAS,WAAWA,SAAO;WAAY,UAAU,cAAc;WAAQ,eAAe,KAAK,YAAY,OAAO;WAA3H,UAAA,CAA+H,cAAc,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;YAAM,WAAWA,SAAO;YAAS,eAAY;WAAQ,CAAA,GAAG,aAAa,EAAE,oBAAoB,IAAI,EAAE,kBAAkB,CAAU;;UAC1Q,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;WAAQ,MAAK;WAAS,WAAWA,SAAO;WAAa,UAAU,UAAU,cAAe,MAAM,mBAAmB,KAAA,KAAa,MAAM,uBAAuB,KAAA;WAAY,SAAS;WAAhL,UAAA,CAAuL,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;YAAM,WAAWA,SAAO;YAAS,eAAY;WAAQ,CAAA,GAAG,SAAS,EAAE,gBAAgB,IAAI,EAAE,cAAc,CAAU;;SAC/S;QACF,CAAA,CAAA;;OACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,SAAO;QAAvB,UAAA;SACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAO,MAAK;UAAS,WAAWA,SAAO;UAAY,OAAO;UACxD,cAAY,EAAE,qBAAqB;UAAG,aAAa,EAAE,4BAA4B;UACjF,YAAY;UAAO,WAAW,UAAU,aAAa,MAAM,OAAO,KAAK;SAAI,CAAA;SAC5E,UAAU,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;UAAY,WAAWA,SAAO;UAAY,OAAO;UAAY,WAAW,EAAE,mBAAmB;UACnH,SAAS;WACP;YAAE,OAAO;YAAO,OAAO,EAAE,kBAAkB;WAAE;WAC7C;YAAE,OAAO;YAAc,OAAO,EAAE,wBAAwB;YAAG,OAAO,EAAE,uBAAuB;WAAE;WAC7F,GAAG,UAAU,KAAK,UAAU;YAAE,OAAO;YAAM,OAAO,EAAE,sBAAsB,EAAE,OAAO,eAAe,GAAG,kBAAkB,IAAI,EAAE,CAAC;YAAG,OAAO,EAAE,wBAAwB;WAAE,EAAE;UACxK;UAAG,UAAU;SAAmB,CAAA;SAClC,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;UAAM,WAAWA,SAAO;UAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,MAAK;WAAS,WAAWA,SAAO;WAAY,UAAU,aAAa,WAAW,KAAK,MAAM,mBAAmB,KAAA;WAClH,eAAe,gBAAgB,IAAI;WAAI,UAAA,EAAE,+BAA+B,EAAE,OAAO,aAAa,OAAO,CAAC;UAAU,CAAA,GAClH,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,MAAK;WAAS,WAAWA,SAAO;WAAY,UAAU,aAAa,WAAW,KAAK,MAAM,mBAAmB,KAAA;WAClH,eAAe,gBAAgB,KAAK;WAAI,UAAA,EAAE,gCAAgC,EAAE,OAAO,aAAa,OAAO,CAAC;UAAU,CAAA,CAChH;;QACH;;OACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAWA,SAAO;QAAa,UAAA,EAAE,mBAAmB;OAAK,CAAA;OAC3D,MAAM,mBAAmB,KAAA,KAAa,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;QAAG,WAAWA,SAAO;QAArB,UAAA;SAAkC,MAAM;SAAe;SAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,WAAWA,SAAO;UAAY,SAAS,MAAM;UAAiB,UAAA,EAAE,wBAAwB;SAAU,CAAA;QAAI;;OAC1N,QAAQ,SAAS,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAWA,SAAO;QAAa,UAAA,EAAE,uBAAuB;OAAK,CAAA;OACtF,aAAa,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAW,SAAS,SAAS,UAAUA,SAAO,cAAcA,SAAO;QAAgB,MAAK;QAAU,UAAA,SAAS;OAAW,CAAA;OACnJ,iBAAiB,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;QAAG,WAAWA,SAAO;QAArB,UAAA;SAAkC,EAAE,uBAAuB;SAAE;SAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,WAAWA,SAAO;UAAY,eAAe;WACjJ,aAAa;WACb,MAAM,gBAAgB;WACtB,IAAI,cAAc,KAAA,GAAW,oBAAoB,oBAAoB,YAAY,SAAS,EAAE,GAAG;UACjG;UAAI,UAAA,EAAE,iBAAiB;SAAU,CAAA;QAAI;;OACpC,OAAO,SAAS,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAWA,SAAO;QAC1C,UAAA,OAAO,KAAK,OAAO,UAAU,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAqC,WAAWA,SAAO;SAAvD,UAAA;UAAwE;UAAE,MAAM;UAAM;UAAG,MAAM,MAAM,EAAE,yBAAyB;UAAE;UAAE,MAAM;SAAa;QAA7I,GAAA,GAAG,MAAM,MAAM,GAAG,OAA2H,CAAC;OACnL,CAAA;MACF;;KAEJ,MAAM;KACN,MAAM,sBAAsB,KAAA,KAAa,MAAM,8BAA8B,KAAA,KAC5E,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;MACE,IAAG;MACH,OAAO,EAAE,2BAA2B;MACpC,SAAS,MAAM,kBAAkB,OAAO;MACxC,UAAU,gBAAgB,MAAM,kBAAkB,UAAU,KAAA;MAC5D,MAAM,CACJ,MAAM,kBAAkB,UAAU,KAAA,IAC9B,EAAE,mCAAmC,EAAE,QAAQ,MAAM,kBAAkB,MAAM,CAAC,IAC9E,EAAE,MAAM,kBAAkB,OAAO,UAAU,gCAAgC,8BAA8B,GAC7G,GAAI,QAAQ,MAAM,WAAW,OAAO,yBAAyB,IAAI,IAAI,CAAC,EAAE,mCAAmC,CAAC,IAAI,CAAC,CACnH,CAAC,CAAC,KAAK,GAAG;MACV,UAAU,OAAO,YAAY;OAC3B,IAAI,gBAAgB,MAAM,mBAAmB,UAAU,KAAA,GAAW,OAAO;OACzE,gBAAgB,IAAI;OACpB,IAAI;QACF,OAAO,MAAM,MAAM,0BAA2B,OAAO;OACvD,SAAS,OAAO;QACd,SAAS,SAAS,EAAE,6BAA6B,EAAE,QAAQ,aAAa,KAAK,EAAE,CAAC,CAAC;QACjF,OAAO;OACT,UAAU;QACR,gBAAgB,KAAK;OACvB;MACF;KACD,CAAA;KAGF;KAIA,gBAAgB,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,SAAO;MAAY,QAAQ,eAAe;MAAe,UAAA;KAAiB,CAAA;KAEvH,QAAQ,WAAW,IAAK,QAAQ,SAAS,KAAK,gBAC7C,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;MAAG,WAAWA,SAAO;MAArB,UAAA;OAAgC,EAAE,mBAAmB,EAAE,SAAS,OAAO,KAAK,KAAK,eAAe,GAAG,kBAAkB,UAAU,EAAE,CAAC;OAAE;OAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,SAAO;QAAY,SAAS;QAAe,UAAA,EAAE,sBAAsB;OAAU,CAAA;MAAI;KACrP,CAAA,IAAA,YAEF,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,SAAO;MAAvB,UAAA,CAAmC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,SAAO;OAAY,eAAY;OAAO,UAAA;MAAO,CAAA,GAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA;OAChG,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,6BAA6B,EAAE,OAAO,eAAe,GAAG,kBAAkB,UAAU,EAAE,CAAC,EAAM,CAAA;OACpG,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,0BAA0B,EAAK,CAAA;OACpC,cAAc,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAWA,SAAO;QAAW,UAAA;OAAa,CAAA;OACxE,MAAM,mBAAmB,KAAA,KAAa,MAAM,aAAa,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,SAAO;QAAY,SAAS,MAAM;QAAW,UAAA,EAAE,qBAAqB;OAAU,CAAA;OACrL,MAAM,mBAAmB,KAAA,KAAa,MAAM,mBAAmB,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,SAAO;QAAY,SAAS,MAAM;QAAiB,UAAA,EAAE,wBAAwB;OAAU,CAAA;MAClM,EAAA,CAAA,CAAM;KAEX,CAAA,IAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,SAAO;MAAvB,UAAA,CAAmC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,SAAO;OAAY,eAAY;OAAO,UAAA;MAAO,CAAA,GAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA;OAChG,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,UAAU,aAAa,EAAE,8BAA8B,IAAI,EAAE,yBAAyB,EAAM,CAAA;OACjG,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,UAAU,aAAa,EAAE,6BAA6B,IAAI,EAAE,wBAAwB,EAAK,CAAA;OAC5F,cAAc,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,WAAWA,SAAO;QAAW,UAAA;OAAa,CAAA;OACxE,MAAM,mBAAmB,KAAA,KAAa,MAAM,aAAa,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,SAAO;QAAY,SAAS,MAAM;QAAW,UAAA,EAAE,qBAAqB;OAAU,CAAA;OACrL,MAAM,mBAAmB,KAAA,KAAa,MAAM,mBAAmB,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,SAAO;QAAY,SAAS,MAAM;QAAiB,UAAA,EAAE,wBAAwB;OAAU,CAAA;MAClM,EAAA,CAAA,CAAM;KACT,CAAA,IAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,SAAO;MACxB,UAAA,QAAQ,KAAK,WAAW,WAAW,MAAM,CAAC;KACxC,CAAA;IAEE;;EAEb;;;ECxcA,MAAMO,WAAS;GAAE,GAAGC;GAAW,GAAGC;EAAW;;;;;EAsD7C,SAAgB,4BAA4B,OAU9B;GACZ,MAAM,IAAI,MAAM;GAChB,MAAM,CAAC,kBAAkB,wBAAA,GAAuBC,MAAAA,SAAAA,CAAS,KAAK;GAC9D,MAAM,WAAA,GAAUC,MAAAA,OAAAA,CAAoB,IAAI;GACxC,MAAM,aAAA,GAAYA,MAAAA,OAAAA,CAA0B,IAAI;GAChD,MAAM,WAAA,GAAUC,MAAAA,MAAAA,CAAM;GACtB,MAAM,QAAQ,OAAO,KAAK,MAAM,iBAAiB,CAAC,CAAC;GACnD,MAAM,UAAU,MAAM;GACtB,MAAM,UAAA,GAASD,MAAAA,OAAAA,CAA0B,IAAI;GAE7C,MAAM,WAAW,YAA2B;IAC1C,IAAI,MAAM,UAAU;IACpB,IAAI,MAAM,MAAM,sBAAsB,CAAC,CAAC,MAAM,OAAO,MAAM,IAAI,MAAM,EAAE,wBAAwB,CAAC;IAChG,MAAM,qBAAqB,CAAC,CAAC;IAC7B,oBAAoB,KAAK;IACzB,IAAI,MAAM,UAAU,MAAM,iBAAiB;IAC3C,4BAA4B,OAAO,SAAS,MAAM,CAAC;GACrD;;GAEA,MAAM,kBAAkB,UAAyC;IAC/D,IAAI,oBAAoB,MAAM,UAAU;IACxC,MAAM,OAAO,MAAM;IACnB,IAAI,SAAS,QAAQ,CAAC,QAAQ,SAAS,SAAS,IAAY,GAC1D,MAAW,sBAAsB;GAErC;GACA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,KAAK;IAAS,WAAWJ,SAAO;IAAY,QAAQ;IAA7D,UAAA;KACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MAAQ,WAAWA,SAAO;MAA1B,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAWA,SAAO;OAAc,iBAAe,MAAM;OAAU,iBAAe,MAAM,WAAW,UAAU,KAAA;OAAW,SAAS,MAAM;OAAzJ,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;QAAM,WAAWA,SAAO;QAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAWA,SAAO;SAAa,UAAA,EAAE,iBAAiB;QAAQ,CAAA,GAChE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAWA,SAAO;SAAa,UAAA,EAAE,sBAAsB,EAAE,MAAM,CAAC;QAAQ,CAAA,CAC1E;OACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAACM,sCAAAA,+BAAD,EAA+B,WAAW,KAAKN,SAAO,SAAS,MAAM,YAAYA,SAAO,WAAW,EAAI,CAAA,CACjG;MACR,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAWA,SAAO;OAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;QAAa,OAAO,UAAU,EAAE,yBAAyB,IAAI,EAAE,wBAAwB;QACrF,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACO,sCAAAA,QAAD;SAAQ,OAAO,EAAE,sBAAsB;SAAG,SAAS;SAAS,UAAU,MAAM;SAAU,WAAW,UAAU;UACzG,IAAI,MAAM,UAAU;UACpB,MAAM,4BAA4B,KAAK;UACvC,MAAW,sBAAsB,KAAA,GAAW,KAAK;SACnD;QAAI,CAAA;OACO,CAAA,GACb,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;QAAM,WAAWP,SAAO;QAAxB,UAAA,CACG,UAAU,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,KAAK;SAAQ,MAAK;SAAS,UAAU,MAAM;SAAU,WAAWA,SAAO;SAAY,eAAe;UACxH,IAAI,MAAM,UAAU;UACpB,MAAM,qBAAqB,EAAE,IAAI,GAAG,CAAC;UACrC,IAAI,CAAC,MAAM,UAAU,MAAM,iBAAiB;UAC5C,4BAA4B,QAAQ,SAAS,cAAgC,OAAO,CAAC,EAAE,MAAM,CAAC;SAChG;SAAI,UAAA,EAAE,eAAe;QAAU,CAAA,GAC9B,QAAQ,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,KAAK;SAAW,MAAK;SAAS,UAAU,MAAM;SAAU,WAAWA,SAAO;SAAY,eAAA;SAAY,eAAe,oBAAoB,IAAI;SAAI,UAAA,EAAE,kBAAkB;QAAU,CAAA,CAC7L;OACF,CAAA,CAAA;MACA,CAAA,CAAA;;KACP,MAAM,YACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,IAAI;MAAS,WAAWA,SAAO;MAApC,UAAA,CACG,CAAC,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWA,SAAO;OAAkB,UAAA,EAAE,wBAAwB;MAAK,CAAA,GAClF,UAAU,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWA,SAAO;OAAkB,UAAA,EAAE,iBAAiB;MAAK,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD;OAAoB;OAAG,OAAO,MAAM;OAAmB,UAAU,MAAM;OAAU,WAAW,SAAS;QAAE,IAAI,CAAC,MAAM,UAAU,MAAM,qBAAqB,QAAQ,CAAC,CAAC;OAAE;MAAI,CAAA,CACtP;;KAEN,oBAAoB,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;MAAe,OAAO,EAAE,uBAAuB;MAAG,aAAa,EAAE,6BAA6B;MACjH,cAAc,EAAE,wBAAwB;MAAG,aAAa,EAAE,kBAAkB;MAAG,gBAAgB,EAAE,wBAAwB;MACzH,gBAAgB;MAAW,WAAW;MAAU,gBAAgB,oBAAoB,KAAK;KAAI,CAAA;IACxF;;EAEb;;EAIA,SAAgB,oBAAoB,OAA4C;GAC9E,MAAM,IAAI,MAAM;GAChB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAWA,SAAO;IAAM,cAAY,EAAE,qBAAqB;IAAG,oBAAiB;IAAxF,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;MACK;MACH,OAAM;MACN,QAAQ,MAAM;MACd,aAAa,MAAM;MACnB,YAAY,MAAM;MAClB,QAAQ,MAAM;MACd,YAAY,MAAM;MAClB,gBAAgB,MAAM;MACtB,gBAAgB,MAAM;MACtB,UAAU,MAAM;MAChB,eAAe,MAAM;MACrB,eAAe,MAAM;MACrB,aAAa,MAAM,gBAAgB,KAAA,IAAY,KAAA,IAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWA,SAAO;OAAa,cAAY,EAAE,qBAAqB;OAAG,wBAAqB;OACvJ,UAAA,MAAM;MACJ,CAAA;MACL,MAAM,MAAM;MACZ,SAAS,MAAM;MACf,YAAY,MAAM;MAClB,oBAAoB,MAAM;MAC1B,SAAS,MAAM;MACf,iBAAiB,MAAM;MACvB,qBAAqB,MAAM;MAC3B,kBAAkB,MAAM;MACxB,sBAAsB,MAAM;MAC5B,iBAAiB,MAAM;MACvB,gBAAgB,MAAM;MACtB,aAAa,MAAM;MACnB,aAAa,MAAM;MACnB,gBAAgB,MAAM;MACtB,eAAe,MAAM;MACrB,oBAAoB,MAAM;MAC1B,mBAAmB,MAAM;MACzB,2BAA2B,MAAM;MACjC,uBAAuB,MAAM;MAC7B,yBAAyB,MAAM;MAC/B,0BAA0B,MAAM;MAChC,UAAU,MAAM;KACjB,CAAA;KAED,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAWA,SAAO;MAAe,UAAA,EAAE,qBAAqB;KAAK,CAAA;KAChE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAWA,SAAO;MAAe,UAAA,EAAE,wBAAwB;KAAK,CAAA;IAC5D;;EAEb;;;;;;;;;;;;;;;;;ECxKA,SAAgB,yBACd,OACA,SACA,OACmB;GACnB,MAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,MAAM,IAAI,CAAC;GACnD,IAAI,SAAS;GACb,OAAO,QAAQ,MAAM,WAAW,OAAO,OAAO,MAAM,EAAE,GAAG,MAAM,KAAK,GAAG,MAAM,KAAK,GAAG,GAAG;GACxF,IAAI,MAAM,UAAU,UAAU,MAAM,KAAK,IAAI,MAAM,WAAW;IAAE,GAAG,MAAM;IAAU,OAAO,MAAM;GAAG;GACnG,IAAI,UAAU,YAAY,MAAM,WAAW;QACtC,IAAI,UAAU,UAAU,MAAM,aAAa,YAAY,MAAM,WAAW;GAC7E,OAAO;EACT;EAEA,SAAgB,kBACd,SACA,cACA,UACA,GAEA,OAkBA;GACA,MAAM,aAAA,GAAYQ,MAAAA,OAAAA,CAA0B,IAAI;GAChD,MAAM,oBAAA,GAAmBA,MAAAA,OAAAA,CAAiC,IAAI;GAC9D,MAAM,CAAC,WAAW,iBAAA,GAAgBC,MAAAA,SAAAA,CAAsC,CAAC,CAAC;GAC1E,MAAM,CAAC,eAAe,qBAAA,GAAoBA,MAAAA,SAAAA,CAA8B,CAAC,CAAC;GAC1E,MAAM,CAAC,MAAM,YAAA,GAAWA,MAAAA,SAAAA,CAAS,KAAK;GACtC,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAA6B,KAAA,CAAS;GAChE,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAS,KAAK;GAChD,MAAM,CAAC,iBAAiB,uBAAA,GAAsBA,MAAAA,SAAAA,CAAiB;GAE/D,MAAM,gBAAgB,YAA2B;IAC/C,IAAI,UAAU,SAAS,GAAG;IAC1B,IAAI;KACF,MAAM,MAAM,MAAM,WAAW,WAAW;KACxC,IAAI,CAAC,IAAI,IAAI;MACX,SAAS,SAAS,EAAE,wBAAwB,EAAE,QAAQ,IAAI,WAAW,8BAA8B,CAAC,CAAC;MACrG;KACF;KACA,IAAI,CAAC,MAAM,QAAQ,IAAI,MAAM,SAAS,GAAG;MACvC,SAAS,SAAS,EAAE,qBAAqB,CAAC;MAC1C;KACF;KACA,aAAa,IAAI,MAAM,SAAwC;KAC/D,iBAAkB,IAAI,MAAM,iBAAiB,CAAC,CAAyB;IACzE,SAAS,OAAO;KACd,SAAS,SAAS,EAAE,wBAAwB,EAAE,QAAQ,aAAa,KAAK,EAAE,CAAC,CAAC;IAC9E;GACF;GAEA,MAAM,cAAc,WAA0B;IAC5C,iBAAiB,UAAU,UAAU;IACrC,SAAS,MAAM;IACf,aAAa,KAAK;IAClB,QAAQ,IAAI;IACZ,cAAmB;GACrB;GAEA,MAAM,aAAa,WAAoC;IACrD,iBAAiB,UAAU;IAC3B,OAAO,MAAM;IACb,SAAS,KAAA,CAAS;IAClB,aAAa,IAAI;IACjB,QAAQ,IAAI;IACZ,cAAmB;GACrB;GAEA,MAAM,oBAA0B,QAAQ,KAAK;GAE7C,MAAM,gBAAgB,UAA2C;IAE/D,MAAM,QAAQ,yBAAyB,OAAO,SAAS,KAAK;IAC5D,aAAa,KAAK;IAClB,mBAAmB,MAAM,EAAE;IAC3B,SAAS,MAAM,EAAE,sBAAsB;KAAE,MAAM,MAAM;KAAM,IAAI,MAAM;IAAG,CAAC,CAAC;IAC1E,QAAQ,KAAK;GACf;GAEA,OAAO;IAAE;IAAW;IAAkB;IAAW;IAAe;IAAM;IAAO;IAAW;IAAiB;IAAY;IAAW;IAAa;GAAa;EAC5J;;;;;;;;EC9GA,SAAgB,iBAAiB,OAwBnB;GACZ,MAAM,CAAC,eAAe,qBAAA,GAAoBC,MAAAA,SAAAA,CAAS,MAAM,mBAAmB,MAAM,cAAc,KAAA,CAAS;GACzG,MAAM,WAAW,MAAM,YAAY;GACnC,MAAM,eAAe,SAAwB;IAAE,iBAAiB,IAAI;IAAG,MAAM,mBAAmB,IAAI;GAAE;GACtG,MAAM,CAAC,kBAAkB,wBAAA,GAAuBA,MAAAA,SAAAA,CAAS,KAAK;GAC9D,MAAM,aAAA,GAAYC,MAAAA,OAAAA,CAA0B,IAAI;GAChD,MAAM,WAAA,GAAUC,MAAAA,MAAAA,CAAM;GACtB,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,MAAM,cAAc,KAAA,GAAW,YAAY,IAAI;IACnD,oBAAoB,KAAK;GAC3B,GAAG,CAAC,MAAM,SAAS,CAAC;GACpB,MAAM,UAAU,MAAM,cAAc,KAAA;GACpC,MAAM,QAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;IAAM,WAAWC,4BAAO;IAAxB,UAAA,CACZ,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;KAAM,WAAWA,4BAAO;KAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAWA,4BAAO;MAAa,UAAA,MAAM;KAAW,CAAA,GACrD,MAAM,UAAU,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAWA,4BAAO;MAAa,UAAA,MAAM;KAAY,CAAA,CACjF;IACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;KAAM,WAAWA,4BAAO;KAAa,UAAA,MAAM;IAAW,CAAA,CAClD;;GACN,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAW,KAAKA,4BAAO,YAAYA,4BAAO,YAAY,CAAC,WAAW,YAAYA,4BAAO,cAAc;IAAG,oBAAiB;IAAO,uBAAqB,MAAM;IAAlK,UAAA;KACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MAAQ,WAAWA,4BAAO;MAA1B,UAAA,CACG,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,4BAAO;OAAc,eAAA;OAAa,UAAA;MAAY,CAAA,IACxE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAWA,4BAAO;OAAc,iBAAe;OAAU,iBAAe;OAAS,eAAe,YAAY,CAAC,QAAQ;OAA3I,UAAA,CACG,OAAM,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,+BAAD,EAA+B,WAAW,KAAKD,4BAAO,SAAS,YAAYA,4BAAO,WAAW,EAAI,CAAA,CAClG;MACR,CAAA,IAAA,MAAM,cAAc,KAAA,KAAa,MAAM,aAAa,KAAA,MACpD,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAWA,4BAAO;OAAxB,UAAA,CACG,MAAM,cAAc,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;QAAa,OAAO,MAAM,UAAU;QACpE,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAWA,4BAAO;SACtB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACE,sCAAAA,QAAD;UACE,SAAS,MAAM,UAAU;UACzB,UAAU,MAAM,UAAU;UAC1B,OAAO,MAAM,UAAU;UACvB,UAAU,MAAM,UAAU;SAC3B,CAAA;QACG,CAAA;OACK,CAAA,GACZ,MAAM,aAAa,KAAA,KAClB,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;QAAa,OAAO,MAAM,cAAc,SAAS,MAAM,MAAM;QAC3D,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,KAAK;SAAW,MAAK;SAAS,WAAWF,4BAAO;SAAY,eAAA;SAAY,cAAY,MAAM,cAAc,SAAS,UAAU,MAAM;SACvI,eAAe,oBAAoB,IAAI;SAAG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACG,sCAAAA,yBAAD,CAA0B,CAAA;QAAS,CAAA;OACpE,CAAA,CAEX;MAEF,CAAA,CAAA;;KACP,MAAM,kBAAkB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAWH,4BAAO;MAAkB,UAAA,MAAM;KAAkB,CAAA;KACvF,CAAC,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,IAAI;MAAS,QAAQ,CAAC;MAAU,WAAWA,4BAAO;MAAa,UAAA,YAAY,MAAM;KAAc,CAAA;KAChH,oBAAoB,MAAM,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;MACrC,OAAO,MAAM,cAAc,SAAS,MAAM,MAAM;MAAQ,aAAa,MAAM,cAAc,eAAe,WAAW,MAAM,KAAK;MAC9H,cAAc,MAAM,cAAc,WAAW;MAAQ,aAAa,MAAM,cAAc,UAAU;MAChG,gBAAgB,MAAM,cAAc;MAAS,gBAAgB;MAAW,WAAW,MAAM;MAAU,gBAAgB,oBAAoB,KAAK;KAAI,CAAA;IAC3I;;EAEb;;;;EC5EA,MAAM,+BAA6C,CAAC;EACpD,MAAM,gBAAwB;;;;;;EAO9B,SAAgB,sBAAsB,IAAY,GAAgC;GAEhF,OAAO,CAAC,IAAI,GADC,qBAAqB,EAChB,CAAC,CAAC,SAAS,QAAQ,CAAC,KAAK,EAAE,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG;EAC1E;;EAGA,SAAgB,mBAAmB,IAAY,SAAiB,GAAiC;GAC/F,OAAO,QAAQ,WAAW,KAAK,sBAAsB,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,OAAO;EAC5F;;;;;;;EAQA,SAAgB,kBAAkB,EAAE,OAAO,MAAM,GAAG,cAAgH;GAClK,MAAM,OAAO,kBAAkB,QAAQ,QAAQ,yBAAyB,IAAI,CAAC,SAAS,IAAI;GAC1F,MAAM,UAAU,KAAK,MAAM,QAAQ,yBAAyB,IAAI,CAAC,QAAQ,QAAQ,SAAS;GAC1F,MAAM,YAAY,KAAK,MAAM,QAAQ,yBAAyB,IAAI,CAAC,QAAQ,QAAQ,kBAAkB;GACrG,MAAM,SAAS,YAAY,KAAA,KAAa,cAAc,KAAA,IAAY,CAAC,SAAS,SAAS,IAAI,CAAC;GAC1F,MAAM,eAAe,QACnB,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;IAAuE;IAAO,OAAO;IAAQ;IAAe;GAAa,GAAlG,GAAG,MAAM,OAAO,eAAe,GAAG,KAAgE;GAE3H,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACJ,OAAO,SAAS,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;IAAU,mBAAiB;IAAS,cAAY,EAAE,SAAS,SAAU;IAAI,UAAA,OAAO,IAAI,WAAW;GAAY,CAAA,GAChI,KAAK,QAAQ,QAAQ,CAAC,OAAO,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAC5D,EAAA,CAAA;EACJ;;;;;;;;;;EAWA,SAAgB,iBAAiB,EAAE,OAAO,OAAO,GAAG,cAAyH;GAC3K,MAAM,aAAa,yBAAyB;GAC5C,MAAM,QAAQ,MAAM,OAAO;GAC3B,MAAM,WAAW,CAAC,MAAM,OAAO,eAAe,MAAM,aAAa,aAAa;GAC9E,MAAM,WAAW,GAAG,MAAM,OAAO,eAAe,SAAS;GACzD,MAAM,mBAAmB,MAAM,oBAAoB;GACnD,CAAA,GAAA,MAAA,qBAAA,CAAqB,MAAM,mBAAmB,kBAAkB,kBAAkB,gBAAgB;GAClG,MAAM,QAAQ,MAAM,cAAc,OAAO,IAAI,QAAQ;GACrD,MAAM,YAAY,OAAO;GACzB,MAAM,QAAQ,UAAU,KAAA,KAAa,MAAM,MAAM,SAAS,IAAI,MAAM,QAAQ,KAAA;GAC5E,MAAM,cAAc,SAAuC;IACzD,IAAI,SAAS,KAAA,GAAW,MAAM,cAAc,OAAO,OAAO,QAAQ;SAC7D,MAAM,cAAc,OAAO,IAAI,UAAU,IAAI;IAClD,MAAM,gBAAgB;GACxB;GACA,MAAM,aAAmB;IAAE,MAAW,sBAAsB;GAAE;GAC9D,MAAM,SAAS,SAAwB;IAAE,MAAM,MAAM,GAAG,QAAQ,KAAK,CAAC;GAAE;GAExE,MAAM,KAAK,eAAe,KAAA,IAAY,YAAY,UAAU,YAAY,WAAW,GAAG;GACtF,MAAM,QAAQ,EAAE,SAAS,OAAO;GAChC,MAAM,OAAO,EAAE,cAAc;IAAE;IAAO;GAAM,CAAC;GAC7C,MAAM,eAAuC;IAC3C,QAAQ,EAAE,qBAAqB;IAC/B,aAAa,EAAE,wBAAwB;IACvC,qBAAqB,EAAE,gCAAgC;GACzD;GACA,MAAM,YAAY,WAAW,SAAS,YAAY,WAAW,YAAY,KAAA;GACzE,IAAI,WAAW,SAAS,eACtB,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,kBAAgB;IAAO,mBAAiB,WAAW;IAAM,gBAAa;IAChF,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAc;KAAW;KAAa;KAAM,OAAO,OAAO,SAAS,EAAE;KAAa;KAChF,UAAU;KAAO,UAAU;IAAO,CAAA;GACjC,CAAA;GAEP,IAAI;GACJ,IAAI,WAAW,SAAS,YAAY,WAAW,YAAY,KAAA,GACzD,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;IAAY,SAAA;IAAQ,WAAW;IAAO,OAAO,OAAO,SAAS,EAAE;IAAa;IACpF,SAAS,CAAC;KAAE,OAAO;KAAI,OAAO,EAAE,4BAA4B;IAAE,GAAG,GAAG,WAAW,QAAQ,KAAK,UAAU;KAAE,OAAO;KAAM,OAAO,aAAa,SAAS;IAAK,EAAE,CAAC;IAC1J,WAAW,SAAS;KAAE,MAAM,IAAI;KAAG,KAAK;IAAE;GAAI,CAAA;QAC3C,IAAI,WAAW,SAAS,WAC7B,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAACI,sCAAAA,QAAD;IAAQ,WAAWC,4BAAO;IAAc,SAAS,UAAU;IAAgB;IAAiB;IACpG,WAAW,SAAS;KAAE,MAAM,IAAI;KAAG,KAAK;IAAE;GAAI,CAAA;QAC3C,IAAI,WAAW,SAAS,UAC7B,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;IAAW;IAAI,WAAW,KAAKA,4BAAO,aAAaA,4BAAO,iBAAiB;IAAG,WAAU;IAAU,cAAY;IACtH,gBAAc,UAAU,KAAA;IAAW,oBAAkB,UAAU,KAAA,IAAY,KAAA,IAAY,GAAG,GAAG;IAC7F,OAAO,aAAa,OAAO,SAAS,EAAE;IAAG,UAAU;IACnD,WAAW,UAAU,WAAW;KAAE,QAAQ,OAAO,SAAS,EAAE;KAAG,MAAM,MAAM,OAAO;KAAO,OAAO;IAAG,CAAC;IACpG,cAAc;KACZ,IAAI,cAAc,KAAA,KAAa,UAAU;KACzC,MAAM,OAAO,UAAU,KAAK,MAAM,KAAK,WAAW,eAAe,OAAO,SAAS;KACjF,MAAM,SAAS,OAAO,SAAS,WAAW,WAAW,MAAM,IAAI,IAAI,KAAA;KACnE,IAAI,WAAW,KAAA,GAAW;MACxB,WAAW;OAAE,QAAQ,OAAO,SAAS,EAAE;OAAG,MAAM;OAAW,OAAO;MAAO,CAAC;MAC1E;KACF;KACA,MAAM,IAAI;KACV,WAAW,KAAA,CAAS;KACpB,KAAK;IACP;GAAI,CAAA;QAEN,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;IAAc;IAAI,WAAWA,4BAAO;IAAgB,MAAM;IAAG,cAAY;IAAO,OAAO,OAAO,SAAS,EAAE;IACjH,UAAU;IAAU,WAAW,UAAU,MAAM,MAAM,OAAO,KAAK;IAAG,cAAc;KAAE,IAAI,CAAC,UAAU,KAAK;IAAE;GAAI,CAAA;GAElH,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWA,4BAAO;IAAiB,kBAAgB;IAAO,mBAAiB,WAAW;IAChG,gBAAc,YAAY,WAAW,WAAW,SAAS,YAAY,WAAW,WAAW,SAAS,WAAW,WAAW;IADrH,UAAA;KAEL,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;MAAa,OAAO;MAAM,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,4BAAO;OAC/C,UAAA,aAAa,WAAW,SAAS,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,MAAY,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QAAO,SAAS;QAAK,UAAA;OAAa,CAAA;MACnG,CAAA;KAAc,CAAA;KACnB;KACA,UAAU,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;MAAO,IAAI,GAAG,GAAG;MAAS,MAAK;MAAS,UAAA;KAAa,CAAA;IAC1E;;EACP;;;EC3GA,SAAgB,2BAA2B,OAa7B;GACZ,MAAM,EAAE,OAAO,GAAG,WAAW,aAAa,CAAC,GAAG,eAAe,sBAAsB,CAAC,MAAM;GAC1F,MAAM,CAAC,MAAM,YAAA,GAAWC,MAAAA,SAAAA,CAAS,KAAK;GACtC,MAAM,eAAe,aAAa,IAAI;GACtC,MAAM,kBAAA,GAAiBC,MAAAA,OAAAA,CAA0B,IAAI;GACrD,MAAM,UAAU,aAAa;GAC7B,MAAM,WAAW,MAAM,OAAO,eAAe,MAAM,aAAa,aAAa;GAC7E,MAAM,WAAW,IAAI,IAAI,mBAAmB;GAC5C,IAAI,CAAC,YAAY,WAAW,WAAW,GAAG,OAAO;GACjD,MAAM,QAAQ,CACZ,GAAG,YACH,GAAI,YAAY,CAAC,MAAM,gBACnB,CACA,GAAG,oBAAoB,QAAQ,EAAE,IAAI,mBAAmB,CAAC,SAAS,IAAI,EAAE,KAAK,CAAC,0BAA0B,IAAI,MAAM,WAAW,MACvH,MAAM,UAAU,KAAA,KAAa,iBAAiB,MAAM,MAAM,CAAC,CAC9D,KAAK,EAAE,UAAU;IAAE,IAAI,OAAO;IAAM,OAAO,EAAE,6BAA6B,EAAE,GAAG,CAAC;GAAE,EAAE,GACvF,GAAG,eAAe,QAAQ,EAAE,mBAAmB,CAAC,aAAa,MAAM,OAAO,SAAS,IAAI,EAAE,CAAC,MACpF,MAAM,UAAU,KAAA,KAAa,oBAAoB,MAAM,EAAE,SAAS,OAAO,aAAa,EAAE,CAAC,EAAE,iBAAiB,MAAM,MAAM,CAAC,CAC5H,KAAK,EAAE,UAAU;IAAE,IAAI,UAAU;IAAM,OAAO,EAAE,4BAA4B,EAAE,GAAG,CAAC;GAAE,EAAE,CAC3F,IACE,CAAC,CACP;GACA,IAAI,MAAM,WAAW,GAAG,OAAO;GAC/B,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;IAAM,4BAA0B,MAAM;IAAO,YAAY,UAAU;KACxE,IAAI,CAAC,QAAQ,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG;KACrD,MAAM,gBAAgB;KACtB,IAAI,MAAM,QAAQ,UAAU,MAAM,eAAe;KACjD,QAAQ,SAAS,MAAM;KACvB,QAAQ,KAAK;IACf;IAAG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,MAAD;KAAY;KAAM,eAAe,QAAQ,KAAK;KAAG,OAAO,MAAM,KAAK,MAAM,WAAW;MAAE,GAAG;MAAM,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,KAAK,UAAU,IAAI,eAAe,KAAA;OAAY,UAAA,KAAK;MAAY,CAAA;KAAE,EAAE;KAAG,OAAM;KAAM,QAAA;KAAO,SAAA;KAAQ,WAAA;KAC9M,WAAW,OAAO;MAChB,QAAQ,KAAK;MACb,QAAQ,SAAS,MAAM;MACvB,IAAI,CAAC,YAAY,CAAC,MAAM,MAAM,SAAS,KAAK,OAAO,EAAE,GAAG;MACxD,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC;MACrC,IAAI,SAAS,SAAS,SAAS,UACzB;WAAA,UAAU,KAAA,GAAW,MAAW,uBAAuB,SAAS,WAAW,kBAAkB,UAAU,KAAK,CAAC,CAAC,MAAM,YAAY;QAClI,MAAM,eAAe,SAAS,WAAW,aAAa,KAAK,CAAC,EAAE,aAAa,KAAK;QAChF,IAAI,WAAW,iBAAiB,KAAA,GAAW,MAAM,YAAY,YAAY;OAC3E,CAAC;MAAA,OACI,gBAAgB,EAAE;KAC3B;KACA,QAAQ,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MAAQ,KAAK;MAAS,MAAK;MAAS,WAAWC,4BAAO;MAAY,UAAU,CAAC;MAAU,iBAAc;MAAO,iBAAe;MAAM,eAAe,QAAQ,CAAC,IAAI;MAA7J,UAAA,CACL,EAAE,MAAM,gBAAgB,yBAAyB,uBAAuB,GAAE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,+BAAD,CAAgC,CAAA,CACrG;;IAAI,CAAA;GAAO,CAAA;EACvB;EAEA,SAAgB,oBAAoB,OAWtB;GAGZ,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,WAAWD,4BAAO;IAAe,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,4BAAD,EAA4B,GAAI,MAAQ,CAAA;GAAM,CAAA;EAC7F;;;;;;EC1FA,SAAgB,qBAAqB,OAA0E;GAC7G,MAAM,EAAE,UAAU;GAClB,MAAM,SAAS,MAAM;GACrB,MAAM,WAAW,CAAC,OAAO,eAAe,MAAM,aAAa,aAAa;GACxE,MAAM,OAAO,MAAM;GAGnB,MAAM,cAAc,MAAM,IAAI;GAC9B,MAAM,eAAA,GAAcE,MAAAA,qBAAAA,CAAqB,YAAY,WAAW,YAAY,QAAQ;GACpF,MAAM,CAAC,WAAW,iBAAA,GAAgBC,MAAAA,SAAAA,CAAS,KAAK;GAChD,MAAM,kBAAkB,YAAY,WAAW,YAAY,MAAM,YAAY;GAC7E,MAAM,mBAAmB,YAAY,WAAW,SAAS,MAAM,SAAS;GACxE,MAAM,gBAAgB,YAAY,WAAW,mBAAmB,MAAM,mBAAmB;GAGzF,MAAM,WAAW,MAAM,UAAU,SAAS,OAAO,gBAAgB,OAAO;GACxE,MAAM,YAAY,MAAM,UAAU,SAAS,OAAO,YAAY,OAAO;GAErE,MAAM,aAAa,MAAM,oBAAoB,KAAA,KAAa,KAAK,gBAAgB,SAAS,IACpF,KAAK,kBACL,KAAA;GACJ,MAAM,SAAS,SAAS,SAAS,KAAK,UAAU,SAAS;GACzD,MAAM,eAAe,kBAAkB,MAAM,cAAc,CACzD,GAAI,SAAS,SAAS,KAAK,UAAU,SAAS,IAAI,CAAC;IAAE;IAAU,OAAO;GAAU,CAAC,IAAI,CAAC,GACtF,GAAI,MAAM,aAAa,KAAA,KAAa,KAAK,SAAS,SAAS,KAAK,KAAK,UAAU,KAAA,KAAa,KAAK,MAAM,SAAS,IAC5G,CAAC;IAAE,UAAU,KAAK;IAAU,OAAO,KAAK;GAAM,CAAC,IAC/C,CAAC,CACP,CAAC;GACD,MAAM,sBAAsB,kBAAkB,MAAM,cAAc,CAChE,GAAI,gBAAgB,SAAS,KAAK,iBAAiB,SAAS,IACxD,CAAC;IAAE,UAAU;IAAiB,OAAO;GAAiB,CAAC,IACvD,CAAC,GACL,GAAI,MAAM,aAAa,KAAA,KAAa,KAAK,SAAS,SAAS,KAAK,KAAK,UAAU,KAAA,KAAa,KAAK,MAAM,SAAS,IAC5G,CAAC;IAAE,UAAU,KAAK;IAAU,OAAO,KAAK;GAAM,CAAC,IAC/C,CAAC,CACP,CAAC,CAAC,CAAC,QAAQ,WAAW,OAAO,MAAM,SAAS,CAAC;GAC7C,MAAM,kBAAkB,MAAM,UAAU,SAAS,OAAO,uBAAuB,OAAO;GAGtF,MAAM,mBAAmB,MAAM,eAAe,iBAAiB,iBAAiB,gBAAgB;GAChG,MAAM,kBAAkB,MAAM,eAAe,iBAAiB,UAAU,SAAS;GACjF,MAAM,uBAAuB,mBAAmB,kBAAkB,aAAa;GAC/E,MAAM,sBAAsB,mBAAmB,iBAAiB,eAAe;GAC/E,MAAM,cAAc,MAAM,UAAU,SAAS,OAAO,mBAAmB,OAAO;GAC9E,MAAM,YAAY,MAAM,UAAU,SAAS,OAAO,iBAAiB,OAAO;GAC1E,MAAM,mBAAmB,KAA+I,UAAwB;IAC9L,IAAI,UAAU;IACd,MAAM,MAAM,GAAG,MAAM,MAAM,CAA2B;IACtD,MAAW,sBAAsB;GACnC;GAEA,MAAM,yBAAyB,UAAiF;IAC9G,MAAM,eAAe,MAAM,YAAY;IACvC,MAAM,YAAY,MAAM,SAAS;IACjC,MAAM,aAAa,MAAM,mBAAmB;IAC5C,IAAI,aAAa,WAAW,KAAK,UAAU,WAAW,GAAG;KACvD,MAAM,WAAW,SAAS,4BAA4B;KACtD;IACF;IACA,aAAa,IAAI;IACjB,YAAiB,OAAO;KAAE,UAAU;KAAc,OAAO;KAAW,GAAI,WAAW,SAAS,IAAI,EAAE,iBAAiB,WAAW,IAAI,CAAC;IAAG,CAAC,CAAC,CACrI,WAAW;KACV,MAAM,WAAW,MAAM,uBAAuB;KAE9C,MAAW,KAAK;IAClB,CAAC,CAAC,CACD,OAAO,UAAmB;KACzB,MAAM,WAAW,SAAS,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;IAClG,CAAC,CAAC,CACD,cAAc,aAAa,KAAK,CAAC;GACtC;GACA,MAAM,YAAY,MAAM,UAAU,SAC9B;IAAE,OAAO;IAAQ,MAAM;IAA2B,QAAQ;GAAqB,IAC/E;IAAE,OAAO;IAAS,MAAM;IAA0B,QAAQ;GAAe;GAE7E,MAAM,WAAW,MAAM,UAAU,UAAU,MAAM,UAAU,KAAA,KAAa,KAAK,MAAM,SAAS,IACxF,uBAAuB,KAAK,MAAM,KAClC,UAAU;GACd,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,kBAAD;IAAkB,MAAM,UAAU;IAAO,MAAM,SAAS,UAAU,SAAS;IACzE,iBAAiB,MAAM,cAAc,SAAS,IAAI,GAAG,OAAO,eAAe,SAAS,MAAM,OAAO;IACjG,mBAAmB,UAAU,MAAM,cAAc,SAAS,IAAI,GAAG,OAAO,eAAe,SAAS,MAAM,SAAS,KAAK;IAFtH,UAAA;KAGG,MAAM,UAAU,UACf,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWC,4BAAO;MAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAWA,4BAAO;OAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAQ,OAAY,CAAA,GACpB,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,YAAY,cAAc,KAAA,IAC9B,8BACA,YAAY,aACV,+EACA,2BAAkC,CAAA,CACpC;MACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,4BAAO;OAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;QACE,WAAWA,4BAAO;QAClB,SAAA;QACA,WAAU;QACV,OAAO,gBAAgB,SAAS,KAAK,iBAAiB,SAAS,IAAI,iBAAiB,iBAAiB,gBAAgB,IAAI;QACzH,UAAU,CAAC,YAAY,cAAc;QACrC,SAAS;QACT,WAAW,UAAU;SACnB,MAAM,YAAY,iBAAiB,KAAK;SACxC,IAAI,cAAc,KAAA,GAAW,sBAAsB,SAAS;QAC9D;OACD,CAAA,GACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;QACE,WAAWA,4BAAO;QAClB,SAAA;QACA,WAAU;QACV,OAAO;QACP,UAAU,CAAC,YAAY,cAAc;QACrC,SAAS;QACT,WAAW,oBAAoB,sBAAsB,EAAE,gBAAgB,CAAC;OACzE,CAAA,CACE;MACF,CAAA,CAAA;;KAEP,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,4BAAO;MAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAWA,4BAAO;OAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAQ,OAAY,CAAA,GACpB,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,MAAM,UAAU,SACpB,uDAAuD,eAAe,KAAA,IAAY,YAAY,WAAW,KAAK,GAAG,KACjH,0FAAiG,CAAA,CACjG;MACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,4BAAO;OAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;QACE,WAAWA,4BAAO;QAClB,SAAA;QACA,WAAU;QACV,OAAO,SAAS,iBAAiB,UAAU,SAAS,IAAI;QAC9C;QACV,SAAS;QACT,WAAW,UAAU;SACnB,MAAM,YAAY,iBAAiB,KAAK;SACxC,MAAM,QAAQ,cAAc,KAAA,IACvB,MAAM,UAAU,SAAS;UAAE,eAAe;UAAI,WAAW;SAAG,IAAI;UAAE,uBAAuB;UAAI,mBAAmB;SAAG,IACnH,MAAM,UAAU,SACf;UAAE,eAAe,UAAU;UAAU,WAAW,UAAU;SAAM,IAChE;UAAE,uBAAuB,UAAU;UAAU,mBAAmB,UAAU;SAAM;SACtF,MAAM,MAAM,KAAK;SACjB,MAAW,sBAAsB;QACnC;OACD,CAAA,GACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;QACE,WAAWA,4BAAO;QAClB,SAAA;QACA,WAAU;QACV,OAAO;QACG;QACV,SAAS;QACT,WAAW,UAAU,gBACnB,MAAM,UAAU,SAAS,yBAAyB,2BAClD,KACF;OACD,CAAA,CACE;MACF,CAAA,CAAA;;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,4BAAO;MAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAM,WAAWA,4BAAO;OAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAQ,OAAY,CAAA,GACpB,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAO,mFAAuF,CAAA,CAC1F;MACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,4BAAO;OAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QACE,WAAWA,4BAAO;QAClB,MAAK;QACL,KAAK;QACL,KAAK;QACL,MAAM;QACN,cAAW;QACX,OAAO;QACG;QACV,aAAY;QACZ,WAAW,UAAU,gBACnB,MAAM,UAAU,SAAS,qBAAqB,uBAC9C,MAAM,OAAO,KACf;QACA,cAAc;SAAE,IAAI,CAAC,UAAU,MAAW,sBAAsB;QAAE;OACnE,CAAA,GACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QACE,WAAWA,4BAAO;QAClB,MAAK;QACL,KAAK;QACL,MAAM;QACN,cAAW;QACX,OAAO;QACG;QACV,aAAY;QACZ,WAAW,UAAU,gBACnB,MAAM,UAAU,SAAS,mBAAmB,qBAC5C,MAAM,OAAO,KACf;QACA,cAAc;SAAE,IAAI,CAAC,UAAU,MAAW,sBAAsB;QAAE;OACnE,CAAA,CACE;MACF,CAAA,CAAA;;IACW;;EAEtB;;;;;;;;EC9LA,MAAM,gBAA8B;GAAE,QAAQ;GAAI,QAAQ;GAAI,UAAU;GAAO,uBAAuB;EAAK;EAE3G,SAAgB,kBAAkB,OAAiI;GACjK,MAAM,EAAE,GAAG,aAAa;GACxB,MAAM,UAAA,GAASC,MAAAA,QAAAA,OAAkC;IAC/C,MAAM,MAAM,MAAM,YAAY;IAC9B,MAAM,WAAW,MAAM,QAAQ,QAAQ,IAAI,GAAG;IAC9C,IAAI,UAAU,OAAO;IACrB,MAAM,OAAO;KAAE,OAAO;KAAe,OAAO;KAAe,UAAU;KAAO,QAAQ;KAAO,OAAO;KAAI,QAAQ;IAAM;IACpH,MAAM,QAAQ,QAAQ,IAAI,KAAK,IAAI;IACnC,OAAO;GACT,GAAG,CAAC,MAAM,QAAQ,MAAM,QAAQ,CAAC;GACjC,MAAM,CAAC,OAAO,aAAA,GAAYC,MAAAA,SAAAA,CAAuB,OAAO,KAAK;GAC7D,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS,OAAO,QAAQ;GACxD,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAS,OAAO,MAAM;GAClD,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAS,OAAO,UAAU,OAAO,KAAK;GAChE,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAS,KAAK;GAC1C,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAS,OAAO,KAAK;GACvD,MAAM,CAAC,kBAAkB,wBAAA,GAAuBA,MAAAA,SAAAA,CAAS,KAAK;GAC9D,MAAM,UAAA,GAASC,MAAAA,OAAAA,CAAkC,MAAM;GAEvD,MAAM,QAAA,GAAOC,MAAAA,YAAAA,OAAkB;IAC7B,aAAa,EAAE;IACf,MAAM,eAAe,OAAO;IAC5B,WAAgB,WAAW,EAAE,kBAAkB,MAAM,SAAS,CAAC,CAAC,CAAC,MAAM,WAAW;KAChF,IAAI,OAAO,YAAY,QAAQ;KAC/B,IAAI,OAAO,UAAU,cAAc;KACnC,IAAI,OAAO,IAAI;MACb,MAAM,UAAU,OAAO,MAAM;MAC7B,MAAM,OAAO,YAAY,OAAO,gBAAgB;OAC9C,QAAQ,QAAQ;OAChB,QAAQ,QAAQ,UAAU;OAC1B,UAAU,QAAQ,aAAa;OAC/B,uBAAuB,QAAQ,0BAA0B;MAC3D;MACA,OAAO,QAAQ;MACf,OAAO,QAAQ;MACf,OAAO,WAAW,YAAY;MAC9B,OAAO,SAAS;MAChB,OAAO,QAAQ;MACf,SAAS,IAAI;MACb,SAAS,KAAK;MACd,YAAY,YAAY,IAAI;KAC9B,OAAO;MACL,OAAO,QAAQ,OAAO,WAAW,EAAE,2BAA2B;MAC9D,aAAa,OAAO,KAAK;MACzB,SAAS,SAAS,OAAO,KAAK;KAChC;KACA,UAAU,IAAI;IAChB,CAAC;GACH,GAAG;IAAC;IAAQ,MAAM;IAAU;IAAU;GAAC,CAAC;GACxC,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,OAAO,UAAU;IACjB,MAAM,gBAAsB;KAC1B,SAAS,OAAO,KAAK;KAAG,YAAY,OAAO,QAAQ;KAAG,UAAU,OAAO,MAAM;KAC7E,SAAS,OAAO,UAAU,OAAO,KAAK;KAAG,aAAa,OAAO,KAAK;KAAG,UAAU,OAAO,MAAM;IAC9F;IACA,OAAO,UAAU;IACjB,QAAQ;IACR,IAAI,CAAC,OAAO,UAAW,OAAO,UAAU,OAAO,SAAS,CAAC,OAAO,QAAS,KAAK;IAC9E,aAAa;KAAE,OAAO,UAAU;KAAM,IAAI,OAAO,YAAY,SAAS,OAAO,UAAU,KAAA;IAAU;GACnG,GAAG,CAAC,QAAQ,IAAI,CAAC;GAEjB,MAAM,SAAS,SAAsC;IACnD,OAAO,QAAQ;KAAE,GAAG,OAAO;KAAO,GAAG;IAAK;IAC1C,SAAS,OAAO,KAAK;IACrB,SAAS,IAAI;GACf;GACA,MAAM,QAAQ,OAAO,YAA4H;IAC/I,IAAI,OAAO,UAAU,CAAC,OAAO,UAAU,MAAM,YAAY,WAAW;IACpE,MAAM,YAAY,YAAY,OAAO,gBAAgB,OAAO;IAC5D,OAAO,SAAS;IAChB,UAAU,IAAI;IACd,MAAM,WAAW,WAAW;KAAE;KAAS,kBAAkB,MAAM;IAAS,CAAC,CAAC,CAAC,MAAM,WAAW;KAC1F,OAAO,SAAS;KAChB,IAAI,OAAO,IAAI;MACb,OAAO,QAAQ;MACf,OAAO,WAAW,YAAY;MAC9B,IAAI,YAAY,QAAQ,OAAO,UAAU,OAAO,OAAO,QAAQ;KACjE;KACA,OAAO,UAAU;KACjB,IAAI,OAAO,YAAY,QAAQ;KAC/B,UAAU,KAAK;KACf,IAAI,OAAO,IAAI;MACb,YAAY,OAAO,QAAQ;MAC3B,SAAS,OAAO,KAAK;MACrB,SAAS,OAAO,UAAU,OAAO,KAAK;MACtC,oBAAoB,KAAK;MACzB,SAAS,MAAM,YAAY,OAAO,EAAE,wBAAwB,IAAI,EAAE,sBAAsB,CAAC;KAC3F,OAAO;MACL,SAAS,SAAS,OAAO,WAAW,EAAE,2BAA2B,CAAC;MAClE,IAAI,YAAY,MAAM,MAAM,IAAI,MAAM,OAAO,WAAW,EAAE,2BAA2B,CAAC;KACxF;IACF,CAAC;GACH;GACA,MAAM,aAAmB;IACvB,MAAM,YAAY,MAAM,WAAW,MAAM,MAAM,WAAW,MAAM,CAAC,MAAM,YAAY,MAAM;IACzF,MAAW,CAAC,YAAY,YAAY,OAAO;KACzC,QAAQ,MAAM;KACd,GAAI,MAAM,OAAO,SAAS,IAAI,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;KAC1D,GAAI,MAAM,WAAW,EAAE,UAAU,KAAK,IAAI,CAAC;KAC3C,GAAI,MAAM,wBAAwB,CAAC,IAAI,EAAE,uBAAuB,MAAM;IACxE,CAAC;GACH;GACA,MAAM,OAAO,MAAM,aAAa,QAAQ,UAAU,CAAC,UAAU,UAAU,SAAS;GAChF,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,kBAAD;IACE,MAAM,EAAE,cAAc;IACtB,MAAM,WAAW,EAAE,uBAAuB,IAAI,EAAE,wBAAwB;IACxE,OAAM;IACN,iBAAiB,MAAM,QAAQ,SAAS,IAAI,GAAG,MAAM,YAAY,GAAG,SAAS;IAC7E,mBAAmB,UAAU,MAAM,QAAQ,SAAS,IAAI,GAAG,MAAM,YAAY,GAAG,WAAW,KAAK;IALlG,UAAA;KAOG,aAAa,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;MAAG,WAAWC,4BAAO;MAAa,MAAK;MAAvC,UAAA;OAAgD;OAAU;OAAC,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,QAAD;QAAQ,MAAK;QAAK,SAAS;QAAO,UAAA,EAAE,iBAAiB;OAAU,CAAA;MAAI;;KAC3I,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAWD,4BAAO;MAAiB,MAAK;MAAU,UAAA,EAAE,cAAc;KAAK,CAAA;KACnF,oBAAoB,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;MAAe,OAAO,EAAE,gBAAgB;MAAG,aAAa,EAAE,2BAA2B;MACxG,cAAc,EAAE,gBAAgB;MAAG,aAAa,EAAE,mBAAmB;MACrE,iBAAiB,MAAM,IAAI;MAAG,gBAAgB,oBAAoB,KAAK;KAAI,CAAA;KAC7E,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MAAM,WAAWA,4BAAO;MAAxB,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,4BAAO;QAAmB,UAAA,EAAE,sBAAsB;OAAQ,CAAA;OAC3E,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;QACE,WAAWA,4BAAO;QAClB,cAAY,EAAE,qBAAqB;QACnC,OAAO,MAAM;QACb,YAAY;QACZ,UAAU,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;QACzC,WAAW,UAAU,MAAM,EAAE,QAAQ,MAAM,OAAO,MAAM,CAAC;OAC1D,CAAA;OACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,4BAAO;QAAkB,UAAA,EAAE,qBAAqB;OAAQ,CAAA;MACrE;;KACN,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;MAAM,WAAWA,4BAAO;MAAxB,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,4BAAO;QAAmB,UAAA,EAAE,sBAAsB;OAAQ,CAAA;OAC3E,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;QACE,WAAWA,4BAAO;QAClB,cAAY,EAAE,qBAAqB;QACnC,OAAO,MAAM;QACb,YAAY;QACZ,UAAU,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;QACzC,WAAW,UAAU,MAAM,EAAE,QAAQ,MAAM,OAAO,MAAM,CAAC;OAC1D,CAAA;OACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;QAAM,WAAWA,4BAAO;QAAkB,UAAA,EAAE,qBAAqB;OAAQ,CAAA;MACrE;;KACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;MACE,IAAG;MACH,OAAO,EAAE,wBAAwB;MACjC,MAAM,EAAE,uBAAuB;MAC/B,SAAS,MAAM;MACf,UAAU,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;MACzC,WAAW,SAAS,MAAM,EAAE,UAAU,KAAK,CAAC;KAC7C,CAAA;KACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;MACE,IAAG;MACH,OAAO,EAAE,8BAA8B;MACvC,MAAM,EAAE,6BAA6B;MACrC,SAAS,MAAM;MACf,UAAU,MAAM,YAAY,CAAC,UAAU,CAAC,CAAC;MACzC,WAAW,SAAS,MAAM,EAAE,uBAAuB,KAAK,CAAC;KAC1D,CAAA;KACD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,4BAAO;MAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,QAAD;OAAQ,MAAK;OAAK,UAAU,QAAQ,CAAC;OAAO,SAAS;OAAO,UAAA,SAAS,EAAE,gBAAgB,IAAI,EAAE,cAAc;MAAU,CAAA,GACpH,YACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAWD,4BAAO;OAAY,eAAA;OAAY,UAAU;OAAM,eAAe,oBAAoB,IAAI;OAAI,UAAA,EAAE,gBAAgB;MAAU,CAAA,CAEtJ;;IACW;;EAEtB;;;;;;;;;;;;;;;;;;;EC7KA,MAAME,WAAS;GAAE,GAAGC;GAAW,GAAGC;EAAW;;EAE7C,SAAgB,0BAA0B,OAG5B;GACZ,MAAM,EAAE,OAAO,MAAM;GACrB,MAAM,SAAS,MAAM;GAErB,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,kBAAD;IAAkB,MAAM,EAAE,wBAAwB;IAAG,MAAM,EAAE,wBAAwB;IACnF,iBAAiB,MAAM,cAAc,SAAS,IAAI,GAAG,OAAO,eAAe,YAAY;IACvF,mBAAmB,UAAU,MAAM,cAAc,SAAS,IAAI,GAAG,OAAO,eAAe,cAAc,KAAK;IAF5G,UAAA;KAGE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAWF,SAAO;MAAkB,UAAA,EAAE,wBAAwB;KAAK,CAAA;KACtE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,SAAO;MACrB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWA,SAAO;OACrB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;QAAa,OAAO,EAAE,6BAA6B;QACjD,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;SAAM,WAAW,KAAKA,SAAO,gBAAgBA,SAAO,eAAe;SAAnE,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,SAAO;UAAkB,UAAA,EAAE,gBAAgB;SAAQ,CAAA,GACpE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;UACE,WAAWA,SAAO;UAClB,SAAA;UACA,WAAW,EAAE,gBAAgB;UAC7B,OAAO,OAAO;UACd,UAAU,CAAC,OAAO;UAClB,SAAS;WAjBE;WAAI;WAAoB;WAAK;WAAK;WAAK;WAAK;UAiBhC,CAAC,CAAC,KAAK,UAAU;WAAE,OAAO;WAAM,OAAO,SAAS,KAAK,EAAE,8BAA8B,IAAI;UAAK,EAAE;UACvH,WAAW,UAAU;WACnB,MAAM,MAAM,EAAE,UAAU,MAAM,CAAC;WAC/B,MAAW,sBAAsB;UACnC;SACD,CAAA,CACG;;OACK,CAAA;MACV,CAAA;KACF,CAAA;KAEL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,WAAWA,SAAO;MAAqB,UAAA,EAAE,2BAA2B;KAAO,CAAA;KAChF,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAWA,SAAO;MAAkB,UAAA,EAAE,+BAA+B;KAAK,CAAA;IAC7D;;EAEtB;;;EC/CA,MAAa,UAAU,UAA6B,MAAM,QAAQ,KAAK,IAAI,MAAM,IAAI,MAAM,IAAI,CAAC;EAChG,MAAa,UAAU,UAA4B,UAAU;EAC7D,MAAa,SAAS,UAA2B,OAAO,cAAc,KAAK,IAAI,QAAkB;EACjG,MAAa,aAAa,UAA4B,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,SAAS,KAAK,SAAS,CAAC;;;;;;;;;ECelI,MAAMG,WAAS;GAAE,GAAGC;GAAW,GAAGC;EAAW;EAK7C,SAAS,kBAAkB,OAAiL;GAC1M,MAAM,WAAW,MAAM,QAAQ,IAAI,MAAM,QAAQ;GACjD,MAAM,UAAU,aAAa,SAAS,SAAS,SAAS,SAAS,SAAS,UAAU,WAAW;IAAE,QAAQ,OAAO,MAAM,KAAK;IAAG,MAAM,OAAO,MAAM,KAAK;IAAG,OAAO;GAAG;GACnK,MAAM,CAAC,OAAO,aAAA,GAAYC,MAAAA,SAAAA,CAAS,OAAO;GAC1C,MAAM,WAAA,GAAUC,MAAAA,MAAAA,CAAM;GACtB,MAAM,UAAU,SAA2B;IAAE,MAAM,QAAQ,IAAI,MAAM,UAAU,IAAI;IAAG,SAAS,IAAI;GAAE;GACrG,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,UAAU,YAAY,QAAQ,SAAS,QAAQ,SAAS,QAAQ,SAAS,UAAU;KAAE,QAAQ,OAAO,MAAM,KAAK;KAAG,MAAM,OAAO,MAAM,KAAK;KAAG,OAAO;IAAG,CAAC;GAC1J,GAAG,CAAC,MAAM,KAAK,CAAC;GAChB,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;IAAM,WAAWJ,SAAO;IAAxB,UAAA,CACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;KAAO,WAAWA,SAAO;KAAa,WAAU;KAAU,cAAY,MAAM;KAAO,OAAO,MAAM;KAC9F,gBAAc,CAAC,CAAC,MAAM;KAAO,oBAAkB,MAAM,QAAQ,UAAU,KAAA;KACvE,WAAW,UAAU,OAAO;MAAE,GAAG;MAAO,MAAM,MAAM,OAAO;MAAO,OAAO;KAAG,CAAC;KAC7E,cAAc;MACZ,MAAM,QAAQ,OAAO,MAAM,IAAI;MAC/B,IAAI,CAAC,MAAM,KAAK,KAAK,KAAK,CAAC,OAAO,cAAc,KAAK,KAAM,MAAM,QAAQ,KAAA,KAAa,QAAQ,MAAM,KAAM;OACxG,OAAO;QAAE,GAAG;QAAO,OAAO,MAAM,EAAE,sBAAsB;OAAE,CAAC;OAAG;MAChE;MACA,OAAO;OAAE,QAAQ,OAAO,KAAK;OAAG,MAAM,OAAO,KAAK;OAAG,OAAO;MAAG,CAAC;MAChE,MAAM,QAAQ,OAAO,MAAM,QAAQ;MACnC,MAAM,SAAS,KAAK;KACtB;IAAI,CAAA,GACL,MAAM,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;KAAO,IAAI;KAAS,MAAK;KAAS,UAAA,MAAM;IAAa,CAAA,CACjE;;EACR;EAEA,SAAgB,uBAAuB,OAMzB;GACZ,MAAM,EAAE,UAAU,MAAM;GACxB,MAAM,CAAC,QAAQ,cAAA,GAAaG,MAAAA,SAAAA,CAA6B,IAAI;GAC7D,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAS,KAAK;;GAE1C,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAS,EAAE;GAC7C,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAS,KAAK;GAC1C,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAkB,IAAI;GACpD,MAAM,CAAC,cAAc,oBAAA,GAAmBA,MAAAA,SAAAA,CAA4C,CAAC,CAAC;GACtF,MAAM,CAAC,YAAY,kBAAA,GAAiBA,MAAAA,SAAAA,CAA0B,CAAC,CAAC;;GAEhE,MAAM,YAAA,GAAWE,MAAAA,OAAAA,CAA4B,IAAI;GACjD,MAAM,gBAAA,GAAeA,MAAAA,OAAAA,CAAO,KAAK;GAEjC,MAAM,aAAA,GAAYA,MAAAA,OAAAA,CAAiC,IAAI;GAEvD,MAAM,QAAA,GAAOC,MAAAA,YAAAA,OAAkB;IAC7B,MAAM,SAAS,MAAM,QAAQ,SAAS,IAAI,MAAM,YAAY,EAAE,KAAK;KAAE,OAAO;KAAM,OAAO;KAAM,QAAQ;KAAO,QAAQ;IAAM;IAC5H,UAAU,UAAU;IACpB,MAAM,QAAQ,SAAS,IAAI,MAAM,YAAY,IAAI,MAAM;IACvD,OAAO,gBAAgB;KAAE,UAAU,OAAO,KAAK;KAAG,UAAU,OAAO,MAAM;KAAG,UAAU,OAAO,MAAM;IAAE;IACrG,OAAO,SAAS;IAChB,MAAM,WAAW,CAAC,GAAI,MAAM,QAAQ,UAAU,CAAC,CAAE,CAAC,CAAC,MAAM,CAAC,KAAK,WAAW,IAAI,WAAW,GAAG,MAAM,YAAY,GAAG,SAAS,MAAM,MAAM,SAAS,MAAM,SAAS,MAAM,OAAO;IAC3K,IAAI,OAAO,WAAW,OAAO,UAAU,CAAC,UAAU,OAAO,OAAO,OAAO,KAAK,KAAK,WAAW;KAC1F,UAAU,OAAO,KAAK;KACtB,UAAU,IAAI;KACd,UAAU,OAAO,MAAM;KACvB,aAAa,EAAE;KACf;IACF;IACA,UAAU,KAAK;IACf,UAAU,IAAI;IACd,UAAU,KAAK;IACf,WAAW,IAAI;IACf,gBAAgB,CAAC,CAAC;IAClB,aAAa,EAAE;IACf,WAAgB,sBAAsB,EAAE,kBAAkB,MAAM,SAAS,CAAC,CAAC,CAAC,MAAM,WAAW;KAC3F,IAAI,UAAU,YAAY,QAAQ;KAClC,IAAI,CAAC,OAAO,IAAI;MACd,aAAa,OAAO,WAAW,EAAE,mBAAmB,CAAC;MACrD,UAAU,IAAI;MACd;KACF;KACA,MAAM,OAAQ,OAAO,MAAM,UAAU;KACrC,OAAO,QAAQ;KACf,OAAO,QAAQ;KACf,OAAO,SAAS;KAChB,UAAU,IAAI;KACd,UAAU,IAAI;IAChB,CAAC;GACH,GAAG;IAAC;IAAU,MAAM;IAAQ,MAAM;IAAU;GAAC,CAAC;GAE9C,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,KAAK;IACL,aAAa;KACX,MAAM,SAAS,UAAU;KACzB,IAAI,WAAW,MAAM;MAAE,OAAO,UAAU,KAAA;MAAW,OAAO,UAAU,KAAA;MAAW,OAAO,SAAS,KAAA;KAAU;KACzG,UAAU,UAAU;IACtB;GACF,GAAG,CAAC,IAAI,CAAC;GACT,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,SAAS;IACb,WAAgB,gBAAgB,CAAC,CAAC,MAAM,WAAW;KACjD,IAAI,UAAU,OAAO,IAAI,cAAc,OAAO,MAAM,UAAU;IAChE,CAAC;IACD,aAAa;KAAE,SAAS;IAAM;GAChC,GAAG,CAAC,CAAC;;GAGL,MAAM,WAAA,GAAUA,MAAAA,YAAAA,OAAwB;IACtC,MAAM,SAAS,UAAU;IACzB,IAAI,WAAW,QAAQ,MAAM,YAAY,UAAU,OAAO,OAAO,OAAO,KAAK,GAAG;IAChF,OAAO,UAAU,OAAO;IACxB,IAAI,OAAO,QAAQ;IACnB,OAAO,SAAS;IAChB,UAAU,IAAI;IACd,CAAM,YAAY;KAChB,OAAO,OAAO,YAAY,KAAA,GAAW;MACnC,MAAM,YAAY,OAAO;MACzB,OAAO,UAAU,KAAA;MACjB,IAAI,UAAU,WAAW,OAAO,KAAK,GAAG;MACxC,MAAM,SAAS,MAAM,WAAW,sBAAsB;OAAE,QAAQ;OAAW,kBAAkB,MAAM;MAAS,CAAC;MAE7G,IAAI,OAAO,IAAI;OACb,OAAO,QAAQ;OACf,IAAI,OAAO,UAAU,WAAW,OAAO,SAAS,MAAM,EAAE,yBAAyB,CAAC;MACpF,OACE,OAAO,SAAS,SAAS,OAAO,WAAW,EAAE,0BAA0B,CAAC;MAE1E,IAAI,OAAO,YAAY,KAAA,GAAW,OAAO,UAAU,KAAA;KACrD;KACA,OAAO,SAAS;KAChB,OAAO,UAAU;IACnB,EAAA,CAAG;GACL,GAAG;IAAC,MAAM;IAAU,MAAM;IAAU;GAAC,CAAC;GAEtC,MAAM,SAAS,SAAmC;IAChD,IAAI,UAAU,YAAY,QAAQ,MAAM,UAAU;IAClD,UAAU,QAAQ,QAAQ;IAC1B,UAAU,IAAI;GAChB;;GAEA,MAAM,UAAU,SAAwB;IACtC,IAAI,MAAM,UAAU;IACpB,IAAI,CAAC,MAAW;UAAA,MAAM,OAAO,MAAM,QAAQ,OAAO,KAAK,KAAK,CAAC,GAC3D,IAAI,IAAI,WAAW,GAAG,MAAM,YAAY,GAAG,SAAS,GAAG,MAAM,QAAQ,OAAO,OAAO,GAAG;IAAA;IAExF,MAAM,QAAQ,OAAO,gBAAgB,6BAA6B,IAAI;IACtE,MAAM,KAAK;IACX,QAAQ;GACV;GAEA,MAAM,mBAAyB;IAC7B,MAAM,SAAS,UAAU;IACzB,WAAgB,6BAA6B,YAAY,CAAC,CAAC,MAAM,WAAW;KAC1E,IAAI,UAAU,YAAY,QAAQ;KAClC,IAAI,OAAO,IAAI,WAAW,OAAO,MAAM,MAAM;UACxC,SAAS,UAAU,aAAa,SAAS,OAAO,UAAU,KAAA,MAAc,EAAE,6BAA6B,CAAC;IAC/G,CAAC;GACH;GACA,MAAM,UAAU,WAAW;;GAE3B,MAAM,SAAS,CAAC,WAAW,MAAM,aAAa;GAC9C,MAAM,YAAA,GAAWC,MAAAA,QAAAA,OAAc,QAAQ,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;GAC/D,MAAM,aAAa,SAAS,KAAK,YAAY,QAAQ,EAAE;GACvD,MAAM,eAAe,OAAO,QAAQ,SAAS,KAAK;GAClD,MAAM,4BAA4B,QAAQ,qBAAqB,CAAC,EAAA,CAAG,QAAQ,YACzE,QAAQ,YAAY,WAAW,KAAK,CAAC,WAAW,MAAM,SAAS,KAAK,OAAO,QAAQ,WAAW,CAAC;;GAEjG,MAAM,kBAAkB,UAAyC;IAC/D,MAAM,OAAO,MAAM;IACnB,IAAI,SAAS,QAAQ,SAAS,SAAS,SAAS,IAAY,GAAG;IAC/D,aAAa,UAAU;IACvB,4BAA4B;KAC5B,IAAI,aAAa,SAAS;KAC1B,IAAI,CAAC,GAAI,MAAM,QAAQ,UAAU,CAAC,CAAE,CAAC,CAAC,MAAM,CAAC,KAAK,WAAW,IAAI,WAAW,GAAG,MAAM,YAAY,GAAG,SAAS,MAAM,MAAM,SAAS,MAAM,SAAS,MAAM,OAAO,GAAG;KACjK,MAAM,QAAQ,UAAU,SAAS;KACjC,IAAI,UAAU,KAAA,KAAa,UAAU,QAAQ,UAAU,SAAS,GAAG;KAEnE,KAAK,MAAM,qBAAqB,CAAC,EAAA,CAAG,MAAM,YACxC,QAAQ,YAAY,WAAW,KAAK,CAAC,WAAW,MAAM,SAAS,KAAK,OAAO,QAAQ,WAAW,CAAC,GAAG;KACpG,QAAQ;IACR,CAAC;GACH;GACA,MAAM,eAAe,OAAe,WAAyB;IAC3D,IAAI,WAAW,MAAM;IACrB,MAAM,OAAO,CAAC,GAAG,QAAQ;IACzB,MAAM,SAAS,QAAQ;IACvB,IAAI,SAAS,KAAK,UAAU,KAAK,QAAQ;IACxC,CAAC,KAAK,QAAQ,KAAK,WAAW,CAAC,KAAK,SAAU,KAAK,MAAO;IAC3D,MAAM;KAAE,GAAG;KAAQ,UAAU;IAAK,CAAC;GACrC;GACA,MAAM,iBAAiB,OAAqB;IAC1C,IAAI,WAAW,MAAM;IACrB,MAAM,OAAO;KACX,GAAI,OAAO,mBAAmB,KAAK,CAAC,gBAAgB,IAAI,CAAC;KACzD,IAAI,OAAO,qBAAqB,CAAC,EAAA,CAAG,QAAQ,SAAS,KAAK,YAAY,EAAE,CAAC,CAAC,KAAK,SAAS,EAAE,wBAAwB,EAAE,IAAI,KAAK,YAAY,CAAC,CAAC;KAC3I,IAAI,OAAO,aAAa,CAAC,EAAA,CAAG,QAAQ,SAAS,KAAK,YAAY,EAAE,CAAC,CAAC,KAAK,SAAS,EAAE,mBAAmB,EAAE,IAAI,KAAK,GAAG,CAAC,CAAC;IACvH;IACA,IAAI,KAAK,SAAS,GAAG;KACnB,SAAS,SAAS,EAAE,wBAAwB;MAAE;MAAI,MAAM,KAAK,KAAK,EAAE,sBAAsB,CAAC;KAAE,CAAC,CAAC;KAC/F;IACF;IACA,MAAM;KAAE,GAAG;KAAQ,UAAU,SAAS,QAAQ,SAAS,KAAK,OAAO,EAAE;IAAE,CAAC;GAC1E;GAGA,MAAM,cAAc,OAAe,MAAc,SAAkB,UAAmC,cACpG,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;IAAa,OAAO;IAClB,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;KAAM,WAAWP,SAAO;KAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAWA,SAAO;MAAkB,UAAA;KAAY,CAAA,GACtD,iBAAA,GAAA,kBAAA,IAAA,CAACQ,sCAAAA,QAAD;MAAiB;MAAS,OAAO,aAAa;MAAO,UAAU;MAAU,UAAU;KAAS,CAAA,CACxF;;GACK,CAAA;GAEf,MAAM,eAAe,OAAe,MAAc,SAAoB,OAAO,UAC3E,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;IAAyB,OAAO;IAC9B,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;KAAM,WAAW,KAAKR,SAAO,gBAAgB,QAAQA,SAAO,mBAAmB;KAA/E,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAWA,SAAO;MAAkB,UAAA;KAAY,CAAA,GACrD,OACG;;GACK,GALK,KAKL;GAGf,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;IAEE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAWA,SAAO;KACrB,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,SAAO;MAAvB,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;QAAa,OAAO,EAAE,kBAAkB;QACtC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAWA,SAAO;SACtB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,SAAO;UAAkB,UAAA,EAAE,oBAAoB;SAAQ,CAAA;QACpE,CAAA;OACK,CAAA;OACb,iBAAA,GAAA,kBAAA,IAAA,CAACQ,sCAAAA,QAAD;QAAQ,SAAS;QAAS,OAAO,EAAE,oBAAoB;QACrD,UAAU,MAAM,YAAY,CAAC,UAAU,UAAU,SAAS,KAAK;QAAQ,UAAU;OAAS,CAAA;OAC3F,UAAU,UAAU,WAAW,KAC9B,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;QAAO,WAAWR,SAAO;QACtB,UAAA,UAAU,EAAE,yBAAyB,EAAE,OAAO,SAAS,OAAO,CAAC,IAAI,EAAE,wBAAwB;OACzF,CAAA;MAEN;;IACF,CAAA;IACJ,CAAC,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,WAAWA,SAAO;KAAkB,UAAA,EAAE,gBAAgB;IAAK,CAAA;IACzE,UAAU,UAAU,SAAS,KAC5B,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;KAAG,WAAWA,SAAO;KAAa,MAAK;KAAvC,UAAA,CACG,EAAE,mBAAmB,GACtB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,WAAWA,SAAO;MAAY,eAAe;OAAE,UAAU,KAAK;OAAG,KAAK;MAAE;MAAI,UAAA,EAAE,cAAc;KAAU,CAAA,CAC3H;;IAEJ,UAAU,UAAU,WAAW,KAAK,UACnC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,WAAWA,SAAO;KAAkB,UAAA,EAAE,qBAAqB;IAAK,CAAA;IAEpE,UAAU,UAAU,WAAW,KAC9B,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;KAAU,KAAK;KAAU,WAAWA,SAAO;KAAa,UAAU;KAAQ,eAAe;MAAE,aAAa,UAAU;KAAK;KAAG,QAAQ;KAAgB,cAAY,EAAE,cAAc;KAC7K,UAAA,WAAW,WAAW,QACvB,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;MACG,yBAAyB,SAAS,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWA,SAAO;OAAc,UAAA,EAAE,wBAAwB;MAAK,CAAA;MAE1G,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWA,SAAO;OACrB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAWA,SAAO;QACpB,UAAA,YAAY,EAAE,6BAA6B,GAAG,EAAE,4BAA4B,GACzE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;SAAY,WAAWA,SAAO;SAAa,SAAA;SAAQ,WAAW,EAAE,6BAA6B;SAAG,aAAa,EAAE,mBAAmB;SAAG,OAAO,OAAO,kBAAkB;SACrK,SAAS,WAAW,KAAK,QAAQ;UAAE,OAAO;UAAI,OAAO;SAAG,EAAE;SAC1D,WAAW,UAAU,MAAM;UAAE,GAAG;UAAQ,gBAAgB;SAAM,CAAC;QAAI,CAAA,CACtE;OACE,CAAA;MACF,CAAA;MACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAU,IAAG;OAAsB,OAAO,EAAE,4BAA4B;OAAG,MAAM,EAAE,2BAA2B;OAC5G,OAAO,aAAa,KAAK,IAAI;OAAG,aAAY;OAAoB,UAAU;OAC1E,WAAW,UAAU,MAAM;QAAE,GAAG;QAAQ,SAAS;SAAE,GAAG,OAAO;SAAS,OAAO,UAAU,KAAK;QAAE;OAAE,CAAC;OACjG,gBAAgB,CAAC;MAAI,CAAA;MACvB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAU,IAAG;OAAqB,OAAO,EAAE,2BAA2B;OAAG,MAAM,EAAE,0BAA0B;OACzG,OAAO,OAAO,OAAO,SAAS,IAAI,CAAC,CAAC,KAAK,IAAI;OAAG,aAAY;OAAiB,UAAU;OACvF,WAAW,UAAU,MAAM;QAAE,GAAG;QAAQ,SAAS;SAAE,GAAG,OAAO;SAAS,MAAM,UAAU,KAAK;QAAE;OAAE,CAAC;OAChG,gBAAgB,CAAC;MAAI,CAAA;MAEvB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWA,SAAO;OAAkB,UAAA,EAAE,sBAAsB;MAAK,CAAA;MACnE,SAAS,KAAK,SAAS,UACtB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAoC,WAAWA,SAAO;OAAtD,UAAA;QACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAWA,SAAO;SAAvB,UAAA;UACG,YAAY,MAAM,EAAE,wBAAwB,GAC3C,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;WAAO,WAAWA,SAAO;WAAa,cAAW;WAAa,OAAO,QAAQ;WAAI,aAAY;WAAK,YAAY;WAC5G,WAAW,UAAU,MAAM;YAAE,GAAG;YAAQ,UAAU,SAAS,KAAK,MAAM,OAAO,OAAO,QAAQ;aAAE,GAAG;aAAM,IAAI,MAAM,OAAO;YAAM,IAAI,IAAI;WAAE,CAAC;UAAI,CAAA,CAChJ;UACA,YAAY,EAAE,qBAAqB,GAAG,EAAE,0BAA0B,GACjE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;WAAO,WAAWA,SAAO;WAAa,cAAW;WAAe,OAAO,QAAQ,QAAQ;WAAI,aAAa,EAAE,gCAAgC;WAAG,YAAY;WACvJ,WAAW,UAAU,MAAM;YAAE,GAAG;YAAQ,UAAU,SAAS,KAAK,MAAM,OAAO,OAAO,QAAQ;aAAE,GAAG;aAAM,MAAM,MAAM,OAAO;YAAM,IAAI,IAAI;WAAE,CAAC;UAAI,CAAA,CAClJ;UACA,WAAW,EAAE,gCAAgC,GAAG,EAAE,qCAAqC,GAAG,OAAO,QAAQ,eAAe,IAAI,SAAS,MAAM;WAAE,GAAG;WAAQ,UAAU,SAAS,KAAK,MAAM,OAAO,OAAO,QAAQ;YAAE,GAAG;YAAM,iBAAiB;WAAK,IAAI,IAAI;UAAE,CAAC,CAAC;UAC1P,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;WAAM,WAAWA,SAAO;WAAxB,UAAA;YACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;aAAa,OAAO,EAAE,eAAe;aAAG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;cAAQ,MAAK;cAAS,WAAWA,SAAO;cAAY,cAAY,EAAE,eAAe;cAAG,UAAU,UAAU;cAAG,eAAe,YAAY,OAAO,EAAE;cAAG,UAAA;aAAS,CAAA;YAAc,CAAA;YACjN,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;aAAa,OAAO,EAAE,iBAAiB;aAAG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;cAAQ,MAAK;cAAS,WAAWA,SAAO;cAAY,cAAY,EAAE,iBAAiB;cAAG,UAAU,UAAU,SAAS,SAAS;cAAG,eAAe,YAAY,OAAO,CAAC;cAAG,UAAA;aAAS,CAAA;YAAc,CAAA;YACtO,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;aAAa,OAAO,EAAE,kBAAkB;aAAG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;cAAQ,MAAK;cAAS,WAAWA,SAAO;cAAY,cAAY,EAAE,kBAAkB;cAAG,eAAe,MAAM;eAAE,GAAG;eAAQ,UAAU,CAAC,GAAG,UAAU;gBAAE,GAAG,gBAAgB,OAAO;gBAAG,IAAI,GAAG,QAAQ,GAAG;gBAAQ,MAAM,EAAE,6BAA6B,EAAE,MAAM,QAAQ,QAAQ,QAAQ,GAAG,CAAC;eAAE,CAAC;cAAE,CAAC;cAAG,UAAA;aAAS,CAAA;YAAc,CAAA;YAC9V,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;aAAa,OAAO,EAAE,eAAe;aAAG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;cAAQ,MAAK;cAAS,WAAWA,SAAO;cAAY,eAAA;cAAY,cAAY,EAAE,6BAA6B,EAAE,IAAI,QAAQ,MAAM,MAAM,CAAC;cAC5K,eAAe,cAAc,QAAQ,EAAE;cAAG,UAAA;aAAS,CAAA;YAAc,CAAA;WAC/D;;SACH;;QACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAU,IAAI,eAAe;SAAS,OAAM;SAAQ,MAAK;SAAG,OAAO,OAAO,QAAQ,KAAK,CAAC,CAAC,KAAK,IAAI;SAAG,aAAa,aAAa,KAAK,IAAI,KAAK,EAAE,uBAAuB;SACpK,WAAW,UAAU,MAAM;UAAE,GAAG;UAAQ,UAAU,SAAS,KAAK,MAAM,OAAO,OAAO,QAAQ;WAAE,GAAG;WAAM,OAAO,UAAU,KAAK;UAAE,IAAI,IAAI;SAAE,CAAC;SAC1I,gBAAgB,CAAC;QAAI,CAAA;QACvB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAU,IAAI,cAAc;SAAS,OAAM;SAAO,MAAK;SAAG,OAAO,OAAO,QAAQ,IAAI,CAAC,CAAC,KAAK,IAAI;SAAG,aAAY;SAC5G,WAAW,UAAU,MAAM;UAAE,GAAG;UAAQ,UAAU,SAAS,KAAK,MAAM,OAAO,OAAO,QAAQ;WAAE,GAAG;WAAM,MAAM,UAAU,KAAK;UAAE,IAAI,IAAI;SAAE,CAAC;SACzI,gBAAgB,CAAC;QAAI,CAAA;OACpB;MAzBK,GAAA,GAAG,QAAQ,GAAG,GAAG,OAyBtB,CACN;MACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,SAAO;OACtB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,SAAO;QAAY,eAAe,MAAM;SAAE,GAAG;SAAQ,UAAU,CAAC,GAAG,UAAU;UAAE,IAAI,WAAW,SAAS,SAAS;UAAK,MAAM;UAAI,OAAO,CAAC;UAAG,MAAM,CAAC;UAAG,iBAAiB;SAAK,CAAC;QAAE,CAAC;QAAI,UAAA,EAAE,mBAAmB;OAAU,CAAA;MAC9O,CAAA;MAEN,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWA,SAAO;OAAkB,UAAA,EAAE,sBAAsB;MAAK,CAAA;OAClE,OAAO,qBAAqB,CAAC,EAAA,CAAG,KAAK,SAAS,UAC9C,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAA6C,WAAWA,SAAO;OAC7D,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,SAAO;QAAvB,UAAA;SACG,YAAY,EAAE,0BAA0B,GAAG,EAAE,+BAA+B,GAC3E,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;UAAY,WAAWA,SAAO;UAAa,SAAA;UAAQ,WAAW,EAAE,8BAA8B;UAAG,aAAa,EAAE,mBAAmB;UAAG,OAAO,QAAQ;UACnJ,SAAS;WACP;YAAE,OAAO;YAAI,OAAO,EAAE,sBAAsB;WAAE;WAC9C,GAAI,CAAC,WAAW,MAAM,SAAS,KAAK,OAAO,QAAQ,WAAW,KAAK,QAAQ,YAAY,SAAS,IAC5F,CAAC;YAAE,OAAO,QAAQ;YAAa,OAAO,EAAE,0BAA0B,EAAE,IAAI,QAAQ,YAAY,CAAC;WAAE,CAAC,IAChG,CAAC;WACL,GAAG,WAAW,KAAK,UAAU;YAAE,OAAO,KAAK;YAAI,OAAO,EAAE,yBAAyB;aAAE,MAAM,KAAK;aAAM,IAAI,KAAK;YAAG,CAAC;WAAE,EAAE;UACvH;UACA,WAAW,UAAU,MAAM;WAAE,GAAG;WAAQ,oBAAoB,OAAO,qBAAqB,CAAC,EAAA,CAAG,KAAK,MAAM,OAAO,OAAO,QAAQ;YAAE,GAAG;YAAM,aAAa;WAAM,IAAI,IAAI;UAAE,CAAC;SAAI,CAAA,GAC3K,IAAI;SACN,YAAY,EAAE,wBAAwB,GAAG,EAAE,6BAA6B,GACvE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;UAAY,WAAWA,SAAO;UAAa,SAAA;UAAQ,WAAW,EAAE,4BAA4B;UAAG,aAAa,EAAE,mBAAmB;UAAG,OAAO,QAAQ;UACjJ,SAAS,WAAW,KAAK,QAAQ;WAAE,OAAO;WAAI,OAAO;UAAG,EAAE;UAC1D,WAAW,UAAU,MAAM;WAAE,GAAG;WAAQ,oBAAoB,OAAO,qBAAqB,CAAC,EAAA,CAAG,KAAK,MAAM,OAAO,OAAO,QAAQ;YAAE,GAAG;YAAM,SAAS;WAAM,IAAI,IAAI;UAAE,CAAC;SAAI,CAAA,CACzK;SACA,WAAW,EAAE,gCAAgC,GAAG,EAAE,qCAAqC,GAAG,OAAO,QAAQ,eAAe,IAAI,SAAS,MAAM;UAAE,GAAG;UAAQ,oBAAoB,OAAO,qBAAqB,CAAC,EAAA,CAAG,KAAK,MAAM,OAAO,OAAO,QAAQ;WAAE,GAAG;WAAM,iBAAiB;UAAK,IAAI,IAAI;SAAE,CAAC,GAAG,EAAE,oCAAoC,CAAC;SACpU,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;UAAa,OAAO,EAAE,eAAe;UAAG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,MAAK;WAAS,WAAWA,SAAO;WAAY,eAAA;WAAY,cAAY,EAAE,2BAA2B;WAC/I,eAAe,MAAM;YAAE,GAAG;YAAQ,oBAAoB,OAAO,qBAAqB,CAAC,EAAA,CAAG,QAAQ,GAAG,OAAO,OAAO,KAAK;WAAE,CAAC;WAAG,UAAA;UAAS,CAAA;SAAc,CAAA;QAChJ;;MACF,GAtBK,GAAG,QAAQ,YAAY,GAAG,OAsB/B,CACN;MACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,SAAO;OACtB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,SAAO;QACtC,eAAe,MAAM;SAAE,GAAG;SAAQ,mBAAmB,CAAC,GAAI,OAAO,qBAAqB,CAAC,GAAI;UAAE,aAAa;UAAI,SAAS,OAAO,kBAAkB;UAAI,iBAAiB;SAAK,CAAC;QAAE,CAAC;QAAI,UAAA,EAAE,mBAAmB;OAAU,CAAA;MAC/M,CAAA;MAEN,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWA,SAAO;OAAkB,UAAA,EAAE,mBAAmB;MAAK,CAAA;OAC/D,OAAO,aAAa,CAAC,EAAA,CAAG,KAAK,MAAM,UACnC,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAiC,WAAWA,SAAO;OACjD,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,SAAO;QAAvB,UAAA;SACG,YAAY,MAAM,EAAE,qBAAqB,GACxC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAO,WAAWA,SAAO;UAAa,cAAY,EAAE,oBAAoB;UAAG,OAAO,KAAK;UAAI,aAAY;UAAK,YAAY;UACtH,WAAW,UAAU;WACnB,MAAM,SAAS,GAAG,MAAM,YAAY,GAAG,eAAe,KAAK,GAAG;WAC9D,MAAM,WAAW,MAAM,QAAQ,OAAO,IAAI,MAAM;WAChD,IAAI,aAAa,KAAA,GAAW;YAC1B,MAAM,QAAQ,OAAO,IAAI,GAAG,MAAM,YAAY,GAAG,eAAe,MAAM,OAAO,MAAM,SAAS,QAAQ;YACpG,MAAM,QAAQ,OAAO,OAAO,MAAM;WACpC;WACA,MAAM;YAAE,GAAG;YAAQ,YAAY,OAAO,aAAa,CAAC,EAAA,CAAG,KAAK,MAAM,OAAO,OAAO,QAAQ;aAAE,GAAG;aAAM,IAAI,MAAM,OAAO;YAAM,IAAI,IAAI;WAAE,CAAC;UACvI;SAAI,CAAA,CACP;SACA,YAAY,EAAE,kBAAkB,GAAG,EAAE,uBAAuB,GAC3D,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAO,WAAWA,SAAO;UAAa,cAAY,EAAE,sBAAsB;UAAG,OAAO,KAAK,QAAQ;UAAI,aAAa,EAAE,kBAAkB;UAAG,YAAY;UACnJ,WAAW,UAAU,MAAM;WAAE,GAAG;WAAQ,YAAY,OAAO,aAAa,CAAC,EAAA,CAAG,KAAK,MAAM,OAAO,OAAO,QAAQ;YAAE,GAAG;YAAM,MAAM,MAAM,OAAO;WAAM,IAAI,IAAI;UAAE,CAAC;SAAI,CAAA,CACnK;SACA,YAAY,EAAE,qBAAqB,GAAG,EAAE,0BAA0B,GACjE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAO,WAAWA,SAAO;UAAa,cAAY,EAAE,yBAAyB;UAAG,OAAO,KAAK;UAAS,aAAa,EAAE,gCAAgC;UAAG,YAAY;UACjK,WAAW,UAAU,MAAM;WAAE,GAAG;WAAQ,YAAY,OAAO,aAAa,CAAC,EAAA,CAAG,KAAK,MAAM,OAAO,OAAO,QAAQ;YAAE,GAAG;YAAM,SAAS,MAAM,OAAO;WAAM,IAAI,IAAI;UAAE,CAAC;SAAI,CAAA,CACtK;SACA,YAAY,SAAS,EAAE,wBAAwB,GAC9C,iBAAA,GAAA,kBAAA,IAAA,CAAC,mBAAD;UAAmB,OAAM;UAAQ,OAAO,KAAK,SAAS;UAAQ;UAAG,QAAQ,MAAM,QAAQ;UACrF,UAAU,GAAG,MAAM,YAAY,GAAG,eAAe,KAAK,GAAG;UACzD,WAAW,UAAU,MAAM;WAAE,GAAG;WAAQ,YAAY,OAAO,aAAa,CAAC,EAAA,CAAG,KAAK,MAAM,OAAO,OAAO,QAAQ;YAAE,GAAG;YAAM,OAAO;WAAM,IAAI,IAAI;UAAE,CAAC;SAAI,CAAA,CACvJ;SACA,YAAY,EAAE,qBAAqB,GAAG,EAAE,0BAA0B,GACjE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;UAAY,WAAWA,SAAO;UAAa,SAAA;UAAQ,WAAW,EAAE,yBAAyB;UAAG,aAAa,EAAE,mBAAmB;UAAG,OAAO,KAAK;UAC3I,SAAS,WAAW,KAAK,QAAQ;WAAE,OAAO;WAAI,OAAO;UAAG,EAAE;UAC1D,WAAW,UAAU,MAAM;WAAE,GAAG;WAAQ,YAAY,OAAO,aAAa,CAAC,EAAA,CAAG,KAAK,MAAM,OAAO,OAAO,QAAQ;YAAE,GAAG;YAAM,SAAS;WAAM,IAAI,IAAI;UAAE,CAAC;SAAI,CAAA,CACzJ;SACA,WAAW,EAAE,gCAAgC,GAAG,EAAE,kCAAkC,GAAG,OAAO,KAAK,eAAe,IAAI,SAAS,MAAM;UAAE,GAAG;UAAQ,YAAY,OAAO,aAAa,CAAC,EAAA,CAAG,KAAK,MAAM,OAAO,OAAO,QAAQ;WAAE,GAAG;WAAM,iBAAiB;UAAK,IAAI,IAAI;SAAE,CAAC,GAAG,EAAE,iCAAiC,CAAC;SAC1S,KAAK,QAAQ,SAAS,YAAY;UAAE,IAAI;WAAE,IAAI,OAAO,KAAK,OAAO;WAAG,OAAO;UAAK,QAAQ;WAAE,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;YAAO,WAAWA,SAAO;YAAc,UAAA,EAAE,4BAA4B;WAAS,CAAA;UAAE;SAAE,EAAA,CAAG;SACvL,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;UAAa,OAAO,EAAE,eAAe;UAAG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,MAAK;WAAS,WAAWA,SAAO;WAAY,eAAA;WAAY,cAAY,EAAE,wBAAwB;WAC5I,eAAe;YACb,MAAM,QAAQ,OAAO,OAAO,GAAG,MAAM,YAAY,GAAG,eAAe,KAAK,GAAG,OAAO;YAClF,MAAM;aAAE,GAAG;aAAQ,YAAY,OAAO,aAAa,CAAC,EAAA,CAAG,QAAQ,GAAG,OAAO,OAAO,KAAK;YAAE,CAAC;WAC1F;WAAG,UAAA;UAAS,CAAA;SAAc,CAAA;QACzB;;MACF,GAxCK,GAAG,KAAK,GAAG,GAAG,OAwCnB,CACN;MACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;OAAM,WAAWA,SAAO;OACtB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,SAAO;QACtC,eAAe,MAAM;SAAE,GAAG;SAAQ,WAAW,CAAC,GAAI,OAAO,aAAa,CAAC,GAAI;UAAE,IAAI,SAAS,OAAO,aAAa,CAAC,EAAA,CAAG,SAAS;UAAK,MAAM;UAAI,SAAS;UAAI,SAAS,OAAO,kBAAkB;UAAI,OAAO;UAAK,iBAAiB;SAAK,CAAC;QAAE,CAAC;QAAI,UAAA,EAAE,gBAAgB;OAAU,CAAA;MACjQ,CAAA;MAEN,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWA,SAAO;OACrB,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,SAAO;QAAvB,UAAA;SACG,WAAW,EAAE,0BAA0B,GAAG,EAAE,+BAA+B,GAAG,OAAO,OAAO,gBAAgB,OAAO,IAAI,SAAS,MAAM;UAAE,GAAG;UAAQ,gBAAgB;WAAE,GAAG,OAAO;WAAgB,SAAS;UAAK;SAAE,CAAC,GAAG,EAAE,8BAA8B,CAAC;SACpP,WAAW,EAAE,2BAA2B,GAAG,EAAE,gCAAgC,GAAG,OAAO,OAAO,gBAAgB,eAAe,IAAI,SAAS,MAAM;UAAE,GAAG;UAAQ,gBAAgB;WAAE,GAAG,OAAO;WAAgB,iBAAiB;UAAK;SAAE,CAAC,CAAC;SACnO,YAAY,EAAE,sBAAsB,GAAG,EAAE,2BAA2B,GACnE,iBAAA,GAAA,kBAAA,IAAA,CAAC,mBAAD;UAAmB,KAAK;UAAG,OAAO,EAAE,0BAA0B;UAAG,OAAO,MAAM,OAAO,gBAAgB,kBAAkB;UAClH;UAAG,QAAQ,MAAM,QAAQ;UAAQ,UAAU,GAAG,MAAM,YAAY,GAAG;UACtE,WAAW,UAAU,MAAM;WAAE,GAAG;WAAQ,gBAAgB;YAAE,GAAG,OAAO;YAAgB,oBAAoB;WAAM;UAAE,CAAC;SAAI,CAAA,CACxH;QACE;;MACF,CAAA;MACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAU,IAAG;OAAqB,OAAO,EAAE,8BAA8B;OAAG,MAAM,EAAE,6BAA6B;OAC/G,OAAO,OAAO,OAAO,gBAAgB,KAAK,CAAC,CAAC,KAAK,IAAI;OAAG,aAAY;OACpE,WAAW,UAAU,MAAM;QAAE,GAAG;QAAQ,gBAAgB;SAAE,GAAG,OAAO;SAAgB,OAAO,UAAU,KAAK;QAAE;OAAE,CAAC;OAC/G,gBAAgB,CAAC;MAAI,CAAA;MAEvB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,SAAO;OAAvB,UAAA;QACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;SAAM,WAAWA,SAAO;SAAxB,UAAA,CAAqC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,sBAAsB,EAAU,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,EAAE,qBAAqB,EAAS,CAAA,CAAO;;QAChI,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAWA,SAAO;SAAvB,UAAA;UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;WAAY,WAAWA,SAAO;WAAa,SAAA;WAAQ,WAAW,EAAE,yBAAyB;WAAG,OAAO,OAAO,aAAa,QAAQ,UAAU;WACvI,SAAS,CACP;YAAE,OAAO;YAAY,OAAO;WAAW,GACvC;YAAE,OAAO;YAAiB,OAAO;WAAgB,CACnD;WACA,WAAW,UAAU,gBAAgB;YAAE,GAAG;YAAc,MAAM;WAAM,CAAC;UAAI,CAAA;UAC3E,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;WAAO,WAAWA,SAAO;WAAa,cAAY,EAAE,gCAAgC;WAAG,aAAY;WAAc,OAAO,OAAO,aAAa,eAAe,EAAE;WAAG,YAAY;WAC1K,WAAW,UAAU,gBAAgB;YAAE,GAAG;YAAc,aAAa,MAAM,OAAO;WAAM,CAAC;UAAI,CAAA;UAC/F,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;WAAO,WAAWA,SAAO;WAAa,cAAY,EAAE,2BAA2B;WAAG,aAAY;WAAS,OAAO,OAAO,aAAa,UAAU,EAAE;WAAG,YAAY;WAC3J,WAAW,UAAU,gBAAgB;YAAE,GAAG;YAAc,QAAQ,MAAM,OAAO;WAAM,CAAC;UAAI,CAAA;UAC1F,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;WAAY,WAAWA,SAAO;WAAa,SAAA;WAAQ,WAAW,EAAE,4BAA4B;WAAG,OAAO,OAAO,aAAa,gBAAgB,EAAE;WAC1I,SAAS,CACP;YAAE,OAAO;YAAI,OAAO,EAAE,6BAA6B;WAAE,GACrD,GAAG,SAAS,QAAQ,YAAY,OAAO,QAAQ,eAAe,CAAC,CAAC,CAAC,KAAK,aAAa;YAAE,OAAO,QAAQ;YAAI,OAAO,QAAQ;WAAG,EAAE,CAC9H;WACA,WAAW,UAAU,gBAAgB;YAAE,GAAG;YAAc,cAAc;WAAM,CAAC;UAAI,CAAA;UACnF,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;WAAY,WAAWA,SAAO;WAAa,SAAA;WAAQ,WAAW,EAAE,8BAA8B;WAAG,OAAO,OAAO,aAAa,gBAAgB,EAAE;WAC5I,SAAS,CACP;YAAE,OAAO;YAAI,OAAO,EAAE,+BAA+B;WAAE,GACvD,IAAI,OAAO,qBAAqB,CAAC,EAAA,CAAG,QAAQ,SAAS,OAAO,KAAK,eAAe,CAAC,CAAC,CAAC,KAAK,UAAU;YAAE,OAAO,KAAK;YAAa,OAAO,KAAK;WAAY,EAAE,CACzJ;WACA,WAAW,UAAU,gBAAgB;YAAE,GAAG;YAAc,cAAc;WAAM,CAAC;UAAI,CAAA;UACnF,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;WAAY,WAAWA,SAAO;WAAa,SAAA;WAAQ,WAAW,EAAE,yBAAyB;WAAG,OAAO,OAAO,aAAa,aAAa,EAAE;WACpI,SAAS,CACP;YAAE,OAAO;YAAI,OAAO,EAAE,0BAA0B;WAAE,GAClD,IAAI,OAAO,aAAa,CAAC,EAAA,CAAG,QAAQ,SAAS,OAAO,KAAK,eAAe,CAAC,CAAC,CAAC,KAAK,UAAU;YAAE,OAAO,KAAK;YAAI,OAAO,KAAK;WAAG,EAAE,CAC/H;WACA,WAAW,UAAU,gBAAgB;YAAE,GAAG;YAAc,WAAW;WAAM,CAAC;UAAI,CAAA;UAChF,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAU,IAAG;WAAoB,OAAM;WAAmB,MAAK;WAAG,aAAa,EAAE,uBAAuB;WAAG,OAAO,MAAM,QAAQ,aAAa,gBAAgB,IAAI,aAAa,iBAAiB,KAAK,IAAI,IAAI;WAC1M,WAAW,UAAU,gBAAgB;YAAE,GAAG;YAAc,kBAAkB,UAAU,KAAK;WAAE,CAAC;WAC5F,gBAAgB,CAAC;UAAI,CAAA;UACvB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAU,IAAG;WAAyB,OAAM;WAAiB,MAAK;WAAG,aAAa,EAAE,uBAAuB;WAAG,OAAO,MAAM,QAAQ,aAAa,cAAc,IAAI,aAAa,eAAe,KAAK,IAAI,IAAI;WACzM,WAAW,UAAU,gBAAgB;YAAE,GAAG;YAAc,gBAAgB,UAAU,KAAK;WAAE,CAAC;WAC1F,gBAAgB,CAAC;UAAI,CAAA;UACvB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;WAAQ,MAAK;WAAS,WAAWA,SAAO;WAAa,SAAS;WAAa,UAAA,EAAE,oBAAoB;UAAU,CAAA;SACxG;;QACJ,YAAY,QACX,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAK,WAAWA,SAAO;SAAiB,OAAO,EAAE,YAAY,WAAW;SAAI,UAAA,KAAK,UAAU,SAAS,MAAM,CAAC;QAAO,CAAA;OAEjH;;KACL,EAAA,CAAA;IAEQ,CAAA;GAEZ,EAAA,CAAA;EAEN;;;;;EChdA,MAAa,4BAAA,GAA2BS,MAAAA,KAAAA,CAAK,SAAS,yBAAyB,OAGjE;GACZ,MAAM,EAAE,OAAO,MAAM;GACrB,MAAM,CAAC,SAAS,eAAA,GAAcC,MAAAA,SAAAA,CAAsC,CAAC,CAAC;GACtE,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAS,KAAK;GAChD,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAA6B,KAAA,CAAS;GAChE,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAS,KAAK;GAE5C,MAAM,WAAA,GAAUC,MAAAA,YAAAA,CAAY,YAA2B;IACrD,MAAM,YAAY,MAAM,IAAI,iBAAiB;IAC7C,WAAW,IAAI;IACf,IAAI;KACF,MAAM,MAAM,MAAM,WAAW,wBAAwB,cAAc,KAAA,IAAY,CAAC,IAAI,EAAE,UAAU,CAAC;KACjG,IAAI,IAAI,IAAI;MAEV,WAAW,MAAM,QAAQ,IAAI,MAAM,OAAO,IAAI,IAAI,MAAM,UAAU,CAAC,CAAC;MACpE,aAAa,IAAI,MAAM,cAAc,IAAI;MACzC,SAAS,KAAA,CAAS;KACpB,OACE,SAAS,IAAI,WAAW,6BAA6B;IAEzD,UAAU;KACR,WAAW,KAAK;IAClB;GACF,GAAG,CAAC,KAAK,CAAC;GAEV,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,QAAa;GAAE,GAAG,CAAC,OAAO,CAAC;GAE7C,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWC,4BAAG;IAAnB,UAAA;KACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,4BAAG;MAAnB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,qBAAqB,EAAM,CAAA,GAClC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,oBAAoB,EAAK,CAAA,CAC5B,EAAA,CAAA,GACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAWA,4BAAG;OAAY,UAAU;OAAS,eAAe,KAAK,QAAQ;OAC5F,UAAA,EAAE,uBAAuB;MACpB,CAAA,CACL;;KACJ,UAAU,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,wBAAwB,EAAE,QAAQ,MAAM,CAAC,EAAK,CAAA;KAC3E,UAAU,KAAA,KAAa,QAAQ,WAAW,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,qBAAqB,EAAK,CAAA;KAC/E,QAAQ,SAAS,KAChB,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UACG,QAAQ,KAAK,QAAQ,UACpB,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD,EAAA,UAAA;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,OAAO,GAAW,CAAA;MAAE;MAC7B,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,uBAAuB,OAAO,OAAyC,EAAQ,CAAA;MAAE;MAC1F,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,OAAO,OAAc,CAAA;KAC3B,EAAA,GAJK,GAAG,OAAO,GAAG,GAAG,OAAO,MAAM,GAAG,OAAO,OAAO,GAAG,OAItD,CACL,EACC,CAAA;KAEL,aAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,yBAAyB,EAAK,CAAA;IAC/C;;EAET,CAAC;;;;ECjED,SAAgB,mBACd,MACA,OACyB;GACzB,MAAM,OAAgC;IAAE,GAAG;IAAM,GAAG;GAAM;GAC1D,IAAI,MAAM,SAAS,KAAA,GAAW;IAE5B,KADoB,KAAK,SAAS,MAAM,QAAQ,KAAK,KAAK,IAAI,UAAU,KAAA,QACpD,MAAM,MAExB,KAAK,MAAM,OAAO;KAAC;KAAc;KAAwB;KAAS;KAAS;KAAQ;IAAO,GAAG,OAAO,KAAK;IAE3G,IAAI,MAAM,SAAS,UAAU,KAAK,yBAAyB;IAC3D,IAAI,MAAM,SAAS,SAAS,KAAK,UAAU,EAAE,MAAM,OAAO;IAC1D,IAAI,MAAM,SAAS,SAAS;KAC1B,OAAO,KAAK;KACZ,KAAK,UAAU,CAAC,EAAE,MAAM,SAAS,GAAG,EAAE,MAAM,SAAS,CAAC;IACxD;GACF;GACA,OAAO;EACT;;;ECNA,MAAMC,WAAS;GAAE,GAAGC;GAAW,GAAGC;EAAW;;EAE7C,MAAM,qBAAqB;GAAC;GAAkB;GAAoB;GAAmB;GAAoB;GACvG;GAAmB;GAAqB;GAAqB;EAAa;;;;;EAM5E,MAAa,eAAe;GAAC;GAAS;GAAQ;GAAY;GAAM;EAAU;;EAE1E,MAAa,aAAa;GAAC;GAAQ;GAAS;GAAU;GAAQ;EAAQ;EACtE,MAAM,eAAe;GAAC;GAAO;GAAQ;GAAO;GAAU;EAAO;EAC7D,MAAM,SAAS;GAAC;GAAQ;GAAc;GAAO;GAAM;EAAM;;;;;;;;;EASzD,MAAa,eAAe;GAAC;GAAU;GAAU;GAAW;GAAW;GAAQ;GAAS;GAAU;GAAQ;EAAO;EAIjH,SAAgB,SAAS,OAAyC;GAChE,OAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAAI,QAAmC,CAAC;EACpH;;EAGA,SAAS,oBAAoB,OAA8H;GACzJ,MAAM,EAAE,MAAM;GACd,MAAM,SAAS,SAAS,MAAM,KAAK;GACnC,MAAM,OAAO,OAAO,QAAQ,MAAM;GAClC,MAAM,UAAU,SAAyC;IACvD,MAAM,SAAS,KAAK,SAAS,IAAI,OAAO,YAAY,IAAI,IAAI,KAAA,CAAS;GACvE;GACA,MAAM,UAAU,OAAe,UAAgG;IAC7H,MAAM,EAAE,KAAK,GAAG,YAAY;IAC5B,OAAO,KAAK,KAAK,CAAC,MAAM,OAAO,OAAO,OAAO,QAAQ,CAAC,OAAO,MAAM,mBAAmB,SAAS,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;GACjI;GACA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;IAAM,WAAWF,SAAO;IAAxB,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,WAAWA,SAAO;MAAmB,UAAA,EAAE,yBAAyB;KAAQ,CAAA;KAC7E,KAAK,WAAW,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAWA,SAAO;MAAkB,UAAA,EAAE,yBAAyB;KAAK,CAAA;KAC5F,KAAK,KAAK,CAAC,KAAK,OAAO,UAAU;MAChC,MAAM,SAAS,SAAS,IAAI;MAC5B,MAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO,MAAM,QAAQ,OAAO,KAAK,IAAI,UAAU;MACrG,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;OAAkB,WAAWA,SAAO;OAApC,UAAA;QACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;SAAO,WAAWA,SAAO;SAAa,cAAY,EAAE,4BAA4B;SAAG,OAAO;SAAK,YAAY;SAAO,aAAa,EAAE,mCAAmC;SAClK,WAAW,MAAM,OAAO,OAAO,EAAE,KAAK,EAAE,OAAO,MAAM,CAAC;QAAI,CAAA;QAC5D,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;SAAY,WAAWA,SAAO;SAAa,SAAA;SAAQ,WAAW,EAAE,4BAA4B;SAAG,OAAO;SACpG,SAAS,aAAa,KAAK,UAAU;UAAE,OAAO;UAAM,OAAO;SAAK,EAAE;SAClE,WAAW,SAAS,OAAO,OAAO,EAAE,KAAK,CAAC;QAAI,CAAA;QAChD,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;SAAa,OAAO,EAAE,gCAAgC;SACpD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACG,sCAAAA,QAAD;UAAQ,OAAO,EAAE,gCAAgC;UAAG,SAAS,OAAO,aAAa;UAC/E,WAAW,YAAY,OAAO,OAAO,EAAE,UAAU,QAAQ,CAAC;SAAI,CAAA;QACrD,CAAA;QACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;SAAO,WAAWH,SAAO;SAAa,cAAY,EAAE,mCAAmC;SAAG,OAAO,OAAO,OAAO,gBAAgB,WAAW,OAAO,cAAc;SAAI,YAAY;SAAO,aAAa,EAAE,0CAA0C;SAC7O,WAAW,MAAM,OAAO,OAAO,EAAE,aAAa,EAAE,OAAO,MAAM,CAAC;QAAI,CAAA;QACpE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAWA,SAAO;SAAY,eAAA;SAAY,cAAY,EAAE,gCAAgC,EAAE,KAAK,OAAO,MAAM,CAAC;SACjI,eAAe,OAAO,KAAK,QAAQ,GAAG,OAAO,OAAO,KAAK,CAAC;SAAI,UAAA,EAAE,0BAA0B;QAAU,CAAA;OAClG;MAdY,GAAA,KAcZ;KACR,CAAC;KACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,WAAWA,SAAO;MAAY,eAAe,OAAO,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,SAAS,CAAC,CAAC,CAAC;MAC1G,UAAA,EAAE,uBAAuB;KACpB,CAAA,EACJ,CAAA;IACF;;EAEV;;EAGA,SAAS,cAAc,OAAyK;GAC9L,MAAM,EAAE,MAAM;GACd,MAAM,aAAa,KAAK,UAAU,MAAM,OAAO,MAAM,CAAC;GACtD,MAAM,WAAW,MAAM,QAAQ,IAAI,MAAM,QAAQ;GACjD,MAAM,CAAC,MAAM,YAAA,GAAWI,MAAAA,SAAAA,CAAS,UAAU,QAAQ,UAAU;GAC7D,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAS,UAAU,SAAS,EAAE;GACxD,MAAM,WAAA,GAAUC,MAAAA,MAAAA,CAAM;GACtB,MAAM,YAAY,UAAkB,WAAmB,SAAS,eAAqB;IACnF,MAAM,QAAQ,IAAI,MAAM,UAAU;KAAE;KAAQ,MAAM;KAAU,OAAO;IAAU,CAAC;IAC9E,QAAQ,QAAQ;IAAG,SAAS,SAAS;GACvC;GACA,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,QAAQ;IAC9C,IAAI,UAAU,KAAA,KAAa,MAAM,SAAS,MAAM,QAAQ;IACxD,SAAS,YAAY,EAAE;GACzB,GAAG,CAAC,YAAY,MAAM,QAAQ,CAAC;GAC/B,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAW,OAAO,MAAM;IAAO,MAAM,EAAE,sBAAsB;IAA7D,UAAA,CACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;KAAU,WAAWL,SAAO;KAAgB,MAAM;KAAG,cAAY,MAAM;KAAO,gBAAc,MAAM,SAAS;KACzG,oBAAkB,QAAQ,UAAU,KAAA;KACpC,OAAO;KAAM,YAAY;KAAO,WAAW,UAAU,SAAS,MAAM,OAAO,OAAO,EAAE;KACpF,cAAc;MACZ,IAAI;OACF,MAAM,QAAiB,KAAK,MAAM,KAAK,KAAK,KAAK,IAAI;OACrD,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;QAAE,SAAS,MAAM,EAAE,8BAA8B,CAAC;QAAG;OAAO;OACrI,MAAM,WAAW,KAAK,UAAU,OAAO,MAAM,CAAC;OAC9C,SAAS,UAAU,IAAI,QAAQ;OAC/B,MAAM,SAAS,KAAkB;MACnC,QAAQ;OAAE,SAAS,MAAM,EAAE,yBAAyB,CAAC;MAAE;KACzD;IAAI,CAAA,GACL,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;KAAO,IAAI;KAAS,MAAK;KAAS,UAAA;IAAa,CAAA,CAChD;;EACb;;EAGA,SAAgB,eAAe,OAiBjB;GACZ,MAAM,EAAE,MAAM,OAAO,MAAM;GAC3B,MAAM,CAAC,kBAAkB,wBAAA,GAAuBI,MAAAA,SAAAA,CAAS,KAAK;GAC9D,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS,KAAK;GAC9C,MAAM,eAAe,aAAa,QAAQ;GAC1C,MAAM,aAAA,GAAYE,MAAAA,OAAAA,CAAwB,IAAI;GAC9C,MAAM,oBAA0B;IAAE,UAAU,SAAS,cAAc,QAAQ,CAAC,EAAE,MAAM;GAAE;GACtF,MAAM,UAAA,GAASD,MAAAA,MAAAA,CAAM;GACrB,MAAM,aAAa,GAAG,OAAO,KAAK,MAAM,KAAK,EAAE;GAC/C,MAAM,kBAAkB,MAAM,aAAa,IAAI,UAAU;GACzD,MAAM,CAAC,cAAc,oBAAA,GAAmBD,MAAAA,SAAAA,CAA6B,iBAAiB,IAAI;GAC1F,MAAM,CAAC,cAAc,oBAAA,GAAmBA,MAAAA,SAAAA,CAAS,iBAAiB,SAAS,EAAE;GAC7E,MAAM,kBAAA,GAAiBC,MAAAA,MAAAA,CAAM;GAC7B,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,IAAI,MAAM,UAAU;KAAE,YAAY,KAAK;KAAG,oBAAoB,KAAK;IAAE;GAAE,GAAG,CAAC,MAAM,QAAQ,CAAC;GAC5G,MAAM,UAAU,SAAS,KAAK,OAAO;GACrC,MAAM,OAAO,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO;GAC/D,MAAM,OAAO,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;GACzD,MAAM,KAAK,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK,QAAQ,QAAQ;GACnE,MAAM,cAAc,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc;GAC9E,MAAM,UAAU,KAAK,YAAY;GACjC,MAAM,aAAa,OAAO,KAAK,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC;GAC1D,MAAM,QAAQ,CAAC,IAAI;GACnB,IAAI,aAAa,GAAG,MAAM,KAAK,EAAE,0BAA0B,EAAE,OAAO,WAAW,CAAC,CAAC;GACjF,IAAI,OAAO,cAAc,KAAK,SAAS,KAAM,KAAK,YAAuB,GAAG,MAAM,KAAK,WAAW,KAAK,WAAW;GAClH,MAAM,gBAAgB,UAAyC;IAC7D,MAAM,QAAQ,EAAE,SAAS;KAAE,GAAG;KAAS,GAAG;IAAM,EAAE,CAAC;GACrD;GACA,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAW,KAAKL,SAAO,YAAYA,SAAO,UAAU,MAAM,YAAYA,SAAO,cAAc;IAAG,kBAAe;IAAtH,UAAA;KACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MAAQ,WAAWA,SAAO;MAA1B,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;OAAQ,MAAK;OAAS,WAAWA,SAAO;OAAc,iBAAe,MAAM;OAAU,iBAAe;OAAQ,SAAS,MAAM;OAA3H,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;QAAM,WAAWA,SAAO;QAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;SAAM,WAAWA,SAAO;SAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,SAAO;UAAa,UAAA,KAAK,SAAS,IAAI,GAAG,GAAG,KAAK,SAAS;SAAS,CAAA,GACpF,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;UAAM,WAAWA,SAAO;UAAa,UAAA;SAAW,CAAA,CAC5C;QACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;SAAM,WAAWA,SAAO;SAAxB,UAAA,CAAqC,eAAe,EAAE,oCAAoC,GAAG,MAAM,SAAS,KAAK,MAAM,MAAM,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,GAAU;QACtJ,CAAA,CAAA;OACN,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAACO,sCAAAA,+BAAD,EAA+B,WAAW,KAAKP,SAAO,SAAS,MAAM,YAAYA,SAAO,WAAW,EAAI,CAAA,CACjG;MACR,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWA,SAAO;OACrB,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,YAAD;QAAU,WAAWA,SAAO;QAAkB,UAAU,MAAM,aAAa;QAA3E,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;SAAa,OAAO,UAAU,EAAE,2BAA2B,IAAI,EAAE,4BAA4B;SAC3F,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACG,sCAAAA,QAAD;UAAQ,OAAO,EAAE,0BAA0B,EAAE,GAAG,CAAC;UAAG,SAAS;UAAS,UAAU,MAAM;UACpF,UAAU,MAAM;SAAkB,CAAA;QACzB,CAAA,GACb,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,KAAK;SAAW,UAAU;SAAI,YAAY,UAAU;UACxD,IAAI,CAAC,YAAY,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,SAAS,MAAM,GAAG,GAAG;UACzD,MAAM,gBAAgB;UACtB,IAAI,MAAM,QAAQ,UAAU,MAAM,eAAe;UACjD,YAAY;UACZ,YAAY,KAAK;SACnB;SAAG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAACK,sCAAAA,MAAD;UAAM,MAAM,YAAY,CAAC,MAAM;UAAU,QAAA;UAAO,WAAA;UAAU,SAAA;UAC3D,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,QAAD;WAAQ,MAAK;WAAK,SAAQ;WAAQ,cAAY,EAAE,oBAAoB,EAAE,MAAM,QAAQ,GAAG,CAAC;WAC9F,iBAAc;WAAO,iBAAe;WAAU,UAAU,MAAM;WAAU,eAAe,aAAa,SAAS,CAAC,IAAI;WAAG,UAAA;UAAS,CAAA;UAChI,eAAe,YAAY,KAAK;UAChC,OAAO;WACL;YAAE,IAAI;YAAM,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;aAAM,KAAK,MAAM,YAAY,eAAe,KAAA;aAAY,UAAA,EAAE,mBAAmB;YAAQ,CAAA;YAAG,UAAU,CAAC,MAAM;WAAU;WACtI;YAAE,IAAI;YAAQ,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;aAAM,KAAK,CAAC,MAAM,aAAa,MAAM,cAAc,eAAe,KAAA;aAAY,UAAA,EAAE,qBAAqB;YAAQ,CAAA;YAAG,UAAU,CAAC,MAAM;WAAY;WAClK;YAAE,IAAI;YAAQ,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;aAAM,KAAK,CAAC,MAAM,aAAa,CAAC,MAAM,cAAc,eAAe,KAAA;aAAY,UAAA,EAAE,sBAAsB;YAAQ,CAAA;WAAE;WACtI;YAAE,IAAI;YAAU,OAAO,EAAE,mBAAmB;YAAG,QAAQ;WAAK;UAC9D;UACA,WAAW,WAAW;WACpB,YAAY,KAAK;WACjB,YAAY;WACZ,IAAI,WAAW,MAAM,MAAM,SAAS;gBAC/B,IAAI,WAAW,QAAQ,MAAM,WAAW;gBACxC,IAAI,WAAW,QAAQ,MAAM,YAAY;gBACzC,oBAAoB,IAAI;UAC/B;SAAI,CAAA;QAAO,CAAA,CACL;;MACP,CAAA,CACC;;KACP,oBAAoB,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;MAAe,OAAO,EAAE,oBAAoB,EAAE,MAAM,QAAQ,GAAG,CAAC;MACnF,aAAa,EAAE,0BAA0B,EAAE,MAAM,QAAQ,GAAG,CAAC;MAC7D,cAAc,EAAE,0BAA0B;MAAG,aAAa,EAAE,mBAAmB;MAC/E,gBAAgB;MAChB,WAAW,MAAM;MAAU,gBAAgB,oBAAoB,KAAK;KAAI,CAAA;KAC1E,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;MAAK,IAAI;MAAQ,QAAQ,CAAC,MAAM;MAC/B,UAAA,MAAM,YACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,YAAD;OAAU,WAAWT,SAAO;OAAY,UAAU,MAAM,aAAa;OAArE,UAAA;QACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;SAAM,WAAWA,SAAO;SAAxB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;UAAW,OAAO,EAAE,qBAAqB;UACvC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;WAAO,WAAWA,SAAO;WAAa,cAAY,EAAE,yBAAyB;WAAG,OAAO;WAAI,YAAY;WACrG,WAAW,MAAM,MAAM,QAAQ,EAAE,IAAI,EAAE,OAAO,MAAM,CAAC;UAAI,CAAA;SAClD,CAAA,GACX,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;UAAW,OAAO,EAAE,uBAAuB;UACzC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;WAAO,WAAWA,SAAO;WAAa,cAAY,EAAE,2BAA2B;WAAG,OAAO;WAAM,YAAY;WAAO,aAAY;WAC5H,WAAW,MAAM,MAAM,QAAQ,EAAE,MAAM,EAAE,OAAO,MAAM,CAAC;UAAI,CAAA;SACpD,CAAA,CACP;;QACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;SAAW,OAAO,EAAE,8BAA8B;SAChD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;UAAU,WAAWA,SAAO;UAAgB,MAAM;UAAG,cAAY,EAAE,kCAAkC;UAAG,OAAO;UAAa,YAAY;UACtI,aAAa,EAAE,yCAAyC;UACxD,WAAW,MAAM,MAAM,QAAQ,EAAE,aAAa,EAAE,OAAO,MAAM,CAAC;SAAI,CAAA;QAC3D,CAAA;QACX,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;SAAW,OAAO,EAAE,uBAAuB;SAAG,MAAM,EAAE,4BAA4B;SAChF,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;UAAY,WAAWA,SAAO;UAAa,SAAA;UAAQ,WAAW,EAAE,2BAA2B;UAAG,OAAO;UACnG,SAAS,aAAa,KAAK,YAAY;WAAE,OAAO;WAAQ,OAAO;UAAO,EAAE;UACxE,WAAW,UAAU,aAAa;WAAE,MAAM;WAAO,GAAI,UAAU,QAAQ,QAAQ,WAAW,KAAA,IAAY,EAAE,QAAQ,OAAO,IAAI,CAAC;UAAG,CAAC;SAAI,CAAA;QAC7H,CAAA;QACV,SAAS,WACR,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;SAAW,OAAM;SAAU,MAAM,EAAE,+BAA+B;SAChE,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;UAAU,WAAWA,SAAO;UAAgB,MAAM;UAAG,cAAY,EAAE,8BAA8B;UAAG,YAAY;UAC9G,OAAO,OAAO,QAAQ,YAAY,WAAW,QAAQ,UAAU;UAAI,aAAY;UAC/E,WAAW,MAAM,aAAa,EAAE,SAAS,EAAE,OAAO,MAAM,CAAC;SAAI,CAAA;QACtD,CAAA,GACX,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;SAAW,OAAM;SAAQ,MAAM,EAAE,6BAA6B;SAC5D,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;UAAY,WAAWA,SAAO;UAAa,SAAA;UAAQ,WAAU;UAC3D,OAAO,OAAO,QAAQ,UAAU,WAAW,QAAQ,QAAQ;UAC3D,SAAS,OAAO,KAAK,WAAW;WAAE,OAAO;WAAO,OAAO;UAAM,EAAE;UAC/D,WAAW,UAAU,aAAa,EAAE,OAAO,MAAM,CAAC;SAAI,CAAA;QAC/C,CAAA,CACX,EAAA,CAAA;QAEH,SAAS,UACR,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;SAAW,OAAM;SAAM,MAAM,EAAE,2BAA2B;SACxD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAO,WAAWA,SAAO;UAAa,cAAY,EAAE,0BAA0B;UAAG,YAAY;UAC3F,OAAO,OAAO,QAAQ,QAAQ,WAAW,QAAQ,MAAM;UAAI,aAAY;UACvE,WAAW,MAAM,aAAa,EAAE,KAAK,EAAE,OAAO,MAAM,CAAC;SAAI,CAAA;QAClD,CAAA,GACX,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;SAAW,OAAM;SACf,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;UAAY,WAAWA,SAAO;UAAa,SAAA;UAAQ,WAAW,EAAE,6BAA6B;UAC3F,OAAO,OAAO,QAAQ,WAAW,WAAW,QAAQ,SAAS;UAC7D,SAAS,aAAa,KAAK,YAAY;WAAE,OAAO;WAAQ,OAAO;UAAO,EAAE;UACxE,WAAW,UAAU,aAAa,EAAE,QAAQ,MAAM,CAAC;SAAI,CAAA;QAChD,CAAA,CACX,EAAA,CAAA;QAEH,SAAS,cACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;SAAW,OAAO,EAAE,2BAA2B;SAAG,MAAM,EAAE,kCAAkC,EAAE,OAAO,mBAAmB,KAAK,KAAK,EAAE,CAAC;SACnI,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAO,WAAWA,SAAO;UAAa,cAAY,EAAE,+BAA+B;UAAG,YAAY;UAChG,OAAO,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO;UAAI,aAAY;UACzE,WAAW,MAAM,aAAa,EAAE,MAAM,EAAE,OAAO,MAAM,CAAC;SAAI,CAAA;QACnD,CAAA;QAEZ,SAAS,QACR,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA;SACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;UAAW,OAAM;UACf,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;WAAY,WAAWA,SAAO;WAAa,SAAA;WAAQ,WAAW,EAAE,+BAA+B;WAC7F,OAAO,OAAO,QAAQ,WAAW,YAAa,WAAiC,SAAS,QAAQ,MAAM,IAAI,QAAQ,SAAS;WAC3H,SAAS,WAAW,KAAK,YAAY;YAAE,OAAO;YAAQ,OAAO;WAAO,EAAE;WACtE,WAAW,UAAU,aAAa,EAAE,QAAQ,MAAM,CAAC;UAAI,CAAA;SAChD,CAAA;SACX,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;UAAW,OAAM;UAAO,MAAM,EAAE,4BAA4B;UAC1D,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;WAAO,WAAWA,SAAO;WAAa,cAAY,EAAE,2BAA2B;WAAG,YAAY;WAC5F,OAAO,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO;WAAI,aAAY;WACzE,WAAW,MAAM,aAAa,EAAE,MAAM,EAAE,OAAO,MAAM,CAAC;UAAI,CAAA;SACnD,CAAA;UACT,QAAQ,WAAW,WAAW,QAAQ,WAAW,YAAY,OAAO,QAAQ,MAAM,CAAC,CAAC,SAAS,SAAS,MACtG,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;UAAW,OAAM;UAAU,MAAM,EAAE,+BAA+B;UAChE,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;WAAU,WAAWA,SAAO;WAAgB,MAAM;WAAG,cAAY,EAAE,8BAA8B;WAAG,YAAY;WAC9G,OAAO,OAAO,QAAQ,YAAY,WAAW,QAAQ,UAAU;WAC/D,WAAW,UAAU,aAAa,EAAE,SAAS,MAAM,OAAO,MAAM,CAAC;UAAI,CAAA;SAC9D,CAAA;QAEb,EAAA,CAAA;QAEH,SAAS,cACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;SAAW,OAAO,EAAE,2BAA2B;SAC7C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAO,WAAWA,SAAO;UAAa,cAAY,EAAE,+BAA+B;UAAG,YAAY;UAChG,OAAO,OAAO,QAAQ,aAAa,WAAW,QAAQ,WAAW;UAAI,aAAa,EAAE,sCAAsC;UAC1H,WAAW,MAAM,aAAa,EAAE,UAAU,EAAE,OAAO,MAAM,CAAC;SAAI,CAAA;QACvD,CAAA;QAEb,iBAAA,GAAA,kBAAA,IAAA,CAAC,qBAAD;SACK;SACH,OAAO,SAAS,KAAK,UAAU;SAC/B,WAAW,SAAS,MAAM,QAAQ,EAAE,YAAY,KAAK,CAAC;QACvD,CAAA;QACD,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;SAAkB;SAAG,QAAQ,MAAM;SAAa,UAAU,GAAG,GAAG;SAAc,OAAO,EAAE,0BAA0B;SAAG,OAAO,SAAS,KAAK,UAAU;SAAG,WAAW,eAAe,MAAM,QAAQ,EAAE,WAAW,CAAC;QAAI,CAAA;QAChN,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;SAAkB;SAAG,QAAQ,MAAM;SAAa,UAAU,GAAG,GAAG;SAAU,OAAO,EAAE,wBAAwB;SAAG,OAAO,SAAS,KAAK,MAAM;SAAG,WAAW,WAAW,MAAM,QAAQ,EAC9K,QAAQ,OAAO,KAAK,MAAM,CAAC,CAAC,SAAS,IAAI,SAAS,EAAE,QAAQ;UAAE,MAAM;UAAU,sBAAsB;SAAK,EAAE,EAC7G,CAAC;QAAI,CAAA;QACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;SAAW,OAAM;SAAY,MAAM,EAAE,yBAAyB;SAA9D,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAO,WAAWA,SAAO;UAAa,MAAK;UAAO,WAAU;UAAU,cAAY,EAAE,wBAAwB;UAC1G,gBAAc,aAAa,SAAS;UAAG,oBAAkB,eAAe,iBAAiB,KAAA;UAAW,OAAO,gBAAgB,OAAO,KAAK,aAAa,EAAE;UACtJ,WAAW,UAAU;WAAE,gBAAgB,MAAM,OAAO,KAAK;WAAG,gBAAgB,EAAE;WAAG,MAAM,aAAa,IAAI,YAAY;YAAE,QAAQ,OAAO,KAAK,aAAa,EAAE;YAAG,MAAM,MAAM,OAAO;YAAO,OAAO;WAAG,CAAC;UAAE;UACnM,cAAc;WACZ,IAAI,iBAAiB,KAAA,GAAW;WAChC,MAAM,YAAY,aAAa,KAAK,MAAM,KAAK,KAAA,IAAY,OAAO,YAAY;WAC9E,IAAI,cAAc,KAAA,MAAc,CAAC,OAAO,cAAc,SAAS,KAAK,aAAa,KAAK,YAAY,aAAgB;YAChH,MAAM,QAAQ,EAAE,4BAA4B;YAC5C,gBAAgB,KAAK;YACrB,MAAM,aAAa,IAAI,YAAY;aAAE,QAAQ,OAAO,KAAK,aAAa,EAAE;aAAG,MAAM;aAAc;YAAM,CAAC;YACtG;WACF;WACA,MAAM,QAAQ,EAAE,UAAU,CAAC;WAC3B,MAAM,aAAa,OAAO,UAAU;WACpC,gBAAgB,KAAA,CAAS;UAC3B;SAAI,CAAA,GACL,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAO,IAAI;UAAgB,MAAK;UAAS,UAAA;SAAoB,CAAA,CACrE;;OACH;;KAEP,CAAA;IACE;;EAEb;;;;EC1UA,MAAM,SAAS;GAAE,GAAGU;GAAW,GAAGC;EAAW;;EAM7C,SAAgB,qBAAqB,OAOsC;GACzE,MAAM,EAAE,MAAM;GACd,MAAM,UAAA,GAASC,MAAAA,QAAAA,OAAgC;IAC7C,MAAM,MAAM,MAAM,YAAY;IAC9B,MAAM,WAAW,MAAM,QAAQ,MAAM,IAAI,GAAG;IAC5C,IAAI,aAAa,KAAA,GAAW,OAAO;IACnC,MAAM,OAAyB;KAAE,OAAO,CAAC;KAAG,OAAO,CAAC;KAAG,0BAAU,IAAI,IAAI;KAAG,wBAAQ,IAAI,IAAI;KAAG,QAAQ;KAAO,OAAO;KAAI,QAAQ;IAAM;IACvI,MAAM,QAAQ,MAAM,IAAI,KAAK,IAAI;IACjC,OAAO;GACT,GAAG,CAAC,MAAM,QAAQ,MAAM,QAAQ,CAAC;GACjC,MAAM,CAAC,OAAO,gBAAA,GAAeC,MAAAA,SAAAA,CAAsB,OAAO,KAAK;GAC/D,MAAM,YAAY,SAA4B;IAAE,OAAO,QAAQ;IAAM,YAAY,IAAI;GAAE;GACvF,MAAM,CAAC,eAAe,mBAAA,GAAkBA,MAAAA,SAAAA,CAAS,OAAO,QAAQ;GAChE,MAAM,oBAAoB,SAA4B;IAAE,OAAO,WAAW;IAAM,eAAe,IAAI;GAAE;GACrG,MAAM,CAAC,mBAAmB,yBAAA,GAAwBA,MAAAA,SAAAA,CAAS,OAAO,MAAM,SAAS,CAAC;GAClF,MAAM,CAAC,QAAQ,cAAA,GAAaA,MAAAA,SAAAA,CAAS,KAAK;GAC1C,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAS,CAAC,OAAO,MAAM;GACrD,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAS,OAAO,KAAK;GACvD,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS,CAAC;GAC1C,MAAM,WAAW,MAAM,aAAa,QAAQ,WAAW,UAAU,SAAS;GAC1E,MAAM,gBAAA,GAAeC,MAAAA,OAAAA,CAAgC,MAAM;GAC3D,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,SAAS;IACb,aAAa,UAAU;IACvB,MAAM,gBAAsB;KAC1B,YAAY,OAAO,KAAK;KACxB,eAAe,OAAO,QAAQ;KAC9B,qBAAqB,OAAO,MAAM,SAAS,CAAC;KAC5C,UAAU,OAAO,MAAM;IACzB;IACA,OAAO,UAAU;IACjB,QAAQ;IACR,MAAM,gBAAsB;KAC1B,SAAS;KACT,aAAa,UAAU;KACvB,IAAI,OAAO,YAAY,SAAS,OAAO,UAAU,KAAA;IACnD;IACA,MAAM,QAAQ,KAAK,UAAU,OAAO,KAAK,MAAM,KAAK,UAAU,OAAO,KAAK,KACrE,CAAC,GAAG,OAAO,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,UAAU,MAAM,SAAS,MAAM,UAAU,CAAC,CAAC,MAAM,KAAK;IAC7F,IAAI,OAAO,WAAW,SAAS,OAAO,WAAW,aAAa,GAAG;KAC/D,WAAW,KAAK;KAChB,aAAa,OAAO,KAAK;KACzB,OAAO;IACT;IACA,WAAW,CAAC,OAAO,MAAM;IACzB,aAAa,EAAE;IACf,MAAM,eAAe,OAAO;IAC5B,CAAM,YAAY;KAChB,MAAM,eAAe,MAAM,WAAW,eAAe,EAAE,kBAAkB,MAAM,SAAS,CAAC;KACzF,IAAI,CAAC,QAAQ;KACb,IAAI,CAAC,aAAa,IAAI;MACpB,OAAO,QAAQ,aAAa,WAAW,EAAE,wBAAwB;MACjE,aAAa,OAAO,KAAK;MACzB,WAAW,KAAK;MAChB;KACF;KACA,IAAI,SAAS,OAAO,UAAU,gBAAgB,CAAC,GAAG,OAAO,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,UAAU,MAAM,SAAS,MAAM,UAAU,CAAC,CAAC,MAAM,KAAK,GAAG;MACvI,OAAO,QAAQ;MACf,aAAa,EAAE;MACf,WAAW,KAAK;MAChB;KACF;KACA,MAAM,eAAe,aAAa,KAAK,aAAa,OAAO,eAAe,CAAC,IAAI,CAAC,EAAA,CAAG,KAAK,SAAS,SAAS,IAAI,CAAC;KAC/G,SAAS,WAAW;KACpB,OAAO,QAAQ;KACf,OAAO,SAAS;KAChB,OAAO,QAAQ;KACf,qBAAqB,YAAY,SAAS,CAAC;KAC3C,WAAW,KAAK;IAClB,EAAA,CAAG;IACH,OAAO;GACT,GAAG,CAAC,QAAQ,QAAQ,CAAC;GACrB,MAAM,eAAe,SAA4B;IAC/C,IAAI,CAAC,UAAU,SAAS,IAAI;GAC9B;GACA,MAAM,aAAmB;IACvB,IAAI,YAAY,OAAO,QAAQ;IAC/B,IAAI,CAAC,GAAG,OAAO,OAAO,OAAO,CAAC,CAAC,CAAC,MAAM,UAAU,MAAM,SAAS,MAAM,SAAS,MAAM,MAAM,GAAG;KAC3F,MAAM,SAAS,SAAS,EAAE,0BAA0B,CAAC;KACrD;IACF;IAEA,MAAM,aAAa,MAAM,KAAK,SAAS;KACrC,MAAM,SAAS,SAAS,KAAK,UAAU;KACvC,MAAM,QAAmB,CAAC;KAC1B,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAAG;MACjD,IAAI,IAAI,KAAK,CAAC,CAAC,WAAW,GAAG;MAC7B,MAAM,OAAO;KACf;KACA,MAAM,OAAO,EAAE,GAAG,KAAK;KACvB,IAAI,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,GAAG,KAAK,aAAa;UAChD,OAAO,KAAK;KACjB,OAAO;IACT,CAAC;IACD,UAAU,IAAI;IACd,OAAO,SAAS;IAChB,WAAgB,eAAe;KAAE,aAAa;KAAY,kBAAkB,MAAM;IAAS,CAAC,CAAC,CAAC,MAAM,iBAAiB;KACnH,OAAO,SAAS;KAChB,IAAI,aAAa,IAAI,OAAO,QAAQ;KACpC,OAAO,UAAU;KACjB,IAAI,aAAa,YAAY,QAAQ;KACrC,UAAU,KAAK;KACf,IAAI,aAAa,IAAI;MACnB,qBAAqB,WAAW,SAAS,CAAC;MAC1C,MAAM,SAAS,MAAM,EAAE,qBAAqB,EAAE,OAAO,WAAW,OAAO,CAAC,CAAC;KAC3E,OACE,MAAM,SAAS,UAAU,aAAa,eAAe,aAAa,UAAU,KAAA,MAAc,EAAE,wBAAwB,CAAC;IAEzH,CAAC;GACH;GACA,MAAM,aAAa,OAAe,UAAoC;IACpE,MAAM,aAAa,OAAO,MAAM,MAAM,EAAE,MAAM,KAAK;IACnD,IAAI,MAAM,OAAO,KAAA,KAAa,OAAO,MAAM,EAAE,MAAM,YAAY;KAC7D,MAAM,SAAS,GAAG,WAAW;KAC7B,MAAM,iBAAiB,CAAC,GAAG,OAAO,MAAM;KACxC,KAAK,MAAM,CAAC,KAAK,UAAU,gBAAgB,IAAI,IAAI,WAAW,MAAM,GAAG;MACrE,OAAO,OAAO,IAAI,GAAG,OAAO,MAAM,EAAE,EAAE,GAAG,IAAI,MAAM,OAAO,MAAM,KAAK,KAAK;MAC1E,OAAO,OAAO,OAAO,GAAG;KAC1B;IACF;IACA,YAAY,MAAM,KAAK,MAAM,OAAO,OAAO,QAAQ;KAAE,GAAG;KAAM,GAAG;IAAM,IAAI,IAAI,CAAC;GAClF;GACA,MAAM,cAAc,UAAwB;IAC1C,MAAM,OAAO,IAAI,IAAI,aAAa;IAClC,IAAI,KAAK,IAAI,KAAK,GAAG,KAAK,OAAO,KAAK;SACjC,KAAK,IAAI,KAAK;IACnB,iBAAiB,IAAI;GACvB;;GAEA,MAAM,cAAc,WAAmC;IACrD,IAAI,OAAO,aAAa,KAAA,KAAa,OAAO,aAAa,MAAM,UAAU;IACzE,IAAI,YAAY,CAAC,OAAO,QAAQ;KAC9B,MAAM,SAAS,SAAS,EAAE,MAAM,WAAW,yBAAyB,OAAO,QAAQ,2BAA2B,qBAAqB,CAAC;KACpI;IACF;IACA,MAAM,QAAQ,OAAO;IACrB,IAAI,OAAO,SAAS,cAAc,OAAO,SAAS,KAAA,GAAW;KAC3D,MAAM,OAAO,OAAO;KACpB,IAAI,MAAM,MAAM,SAAS,KAAK,OAAO,KAAK,EAAE,GAAG;MAC7C,MAAM,SAAS,SAAS,EAAE,2BAA2B,EAAE,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC,CAAC;MAC7E;KACF;KACA,MAAM,QAAQ,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC;KAC7C,YAAY,CAAC,GAAG,OAAO,KAAK,CAAC;KAC7B,iCAAiB,IAAI,IAAI,CAAC,GAAG,OAAO,UAAU,MAAM,MAAM,CAAC,CAAC;KAC5D,MAAM,SAAS,MAAM,EAAE,gCAAgC,EAAE,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC,CAAC;KAC/E;IACF;IACA,IAAI,SAAS;IACb,OAAO,MAAM,MAAM,SAAS,KAAK,OAAO,QAAQ,aAAa,KAAK,QAAQ,KAAK,SAAS,WAAW,IAAI,YAAY,WAAW,SAAS,GAAG,UAAU;IACpJ,YAAY,CAAC,GAAG,OAAO;KACrB,IAAI,QAAQ;KACZ,MAAM,WAAW,IAAI,YAAY,WAAW;KAC5C,aAAa;KACb,QAAQ,EAAE,QAAQ;MAAE,MAAM;MAAU,sBAAsB;KAAK,EAAE;KACjE,SAAS;MAAE,MAAM;MAAS,SAAS;KAAG;IACxC,CAAC,CAAC;IACF,iCAAiB,IAAI,IAAI,CAAC,GAAG,OAAO,UAAU,MAAM,MAAM,CAAC,CAAC;GAC9D;GACA,OAAO;IAAE;IAAY,SACnB,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;KAAS,cAAY,EAAE,kBAAkB;KAAzC,UAAA;MACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAW,OAAO;OAAkB,UAAA,EAAE,kBAAkB;MAAK,CAAA;MAC/D,MAAM,YAAY,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAW,OAAO;OAAiB,MAAK;OAAU,UAAA,EAAE,sBAAsB;MAAK,CAAA;MACpG,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAW,OAAO;OAAiB,MAAK;OAAU,UAAA,EAAE,qBAAqB;MAAK,CAAA;MAC5F,aAAa,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD;OAAG,MAAK;OAAR,UAAA;QAAiB;QAAU;QAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;SAAQ,MAAK;SAAS,WAAW,OAAO;SAAY,eAAe,aAAa,UAAU,QAAQ,CAAC;SAAI,UAAA,EAAE,mBAAmB;QAAU,CAAA;OAAI;;MACpL,iBAAA,GAAA,kBAAA,KAAA,CAAC,YAAD;OAAU,WAAW,OAAO;OAAmB,cAAY,EAAE,wBAAwB;OAArF,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAW,OAAO;QAAvB,UAAA;SACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,WAAW,OAAO;UAAsB;UAAU,eAAe,WAAW;WAAE,MAAM;WAAS,UAAU,MAAM;UAAS,CAAC;UAAI,UAAA,EAAE,mBAAmB;SAAU,CAAA;SAC/K,MAAM,qBAAqB,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,WAAW,OAAO;UAAsB;UACrG,UAAU,UAAU;WAAE,IAAI,CAAC,UAAU,MAAM,mBAAmB,MAAM,aAAa;UAAE;UAAI,UAAA,EAAE,sBAAsB;SAAU,CAAA;UACzH,MAAM,SAAS,KAAK,sBACpB,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,QAAD;UAAQ,MAAK;UAAS,SAAQ;UAAU,MAAK;UAAK,UAAU,YAAY;UAAQ,SAAS;UACtF,UAAA,SAAS,EAAE,oBAAoB,IAAI,EAAE,kBAAkB;SAClD,CAAA;QAEP;OACJ,CAAA,GAAA,MAAM,SAAS,KACd,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAAK,WAAW,GAAG,OAAO,WAAW,GAAG,OAAO;QAC5C,UAAA,MAAM,KAAK,MAAM,UAChB,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD;SACK;SAEG;SACN,aAAa,OAAO;SACb;SACG;SACV,UAAU,cAAc,IAAI,KAAK;SACjC,wBAAwB,WAAW,KAAK;SACxC,UAAU,UAAU,UAAU,OAAO,KAAK;SAC1C,kBAAkB,YAAY,UAAU,OAAO,EAAE,QAAQ,CAAC;SAC1D,gBAAgB,YAAY,MAAM,KAAK,MAAM,OAAO;UAClD,IAAI,OAAO,OAAO,OAAO,MAAM,QAAQ;UACvC,IAAI,OAAO,QAAQ,GAAG,OAAO,MAAM;UACnC,OAAO;SACT,CAAC,CAAC;SACF,kBAAkB,YAAY,MAAM,KAAK,MAAM,OAAO;UACpD,IAAI,OAAO,OAAO,OAAO,MAAM,QAAQ;UACvC,IAAI,OAAO,QAAQ,GAAG,OAAO,MAAM;UACnC,OAAO;SACT,CAAC,CAAC;SACF,mBAAmB,YAAY;UAAC,GAAG,MAAM,MAAM,GAAG,QAAQ,CAAC;UAAG;WAC5D,GAAG,KAAK,MAAM,KAAK,UAAU,IAAI,CAAC;WAClC,IAAI,GAAG,OAAO,KAAK,MAAM,MAAM,EAAE;UACnC;UAAG,GAAG,MAAM,MAAM,QAAQ,CAAC;SAAC,CAAC;SAC7B,gBAAgB;UACd,MAAM,SAAS,GAAG,OAAO,KAAK,MAAM,KAAK,EAAE;UAC3C,KAAK,MAAM,OAAO,OAAO,OAAO,KAAK,GAAG,IAAI,IAAI,WAAW,MAAM,GAAG,OAAO,OAAO,OAAO,GAAG;UAC5F,YAAY,MAAM,QAAQ,GAAG,OAAO,OAAO,KAAK,CAAC;SACnD;SACA,WAAW,QAAQ;SACnB,aAAa,QAAQ,MAAM,SAAS;QACrC,GA9BM,GAAG,OAAO,KAAK,MAAM,EAAE,EAAE,GAAG,OA8BlC,CACF;OACE,CAAA,CAEC;;KACH;;GACT;EACJ;;EAGA,SAAgB,gBAAgB,OAA8D;GAC5F,OAAO,qBAAqB,KAAK,CAAC,CAAC;EACrC;;;EC/OA,MAAa,mBAAmB,UAA4C,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAAI,QAAmC,CAAC;;EAGvL,SAAgB,gBAAgB,QAAiC,KAAa,OAA4B;GACxG,MAAM,WAAW,OAAO,IAAI,GAAG;GAC/B,IAAI,aAAa,KAAA,GAAW;IAC1B,IAAI,SAAS,SAAS,SAAS,UAAU,SAAS,OAAO,OAAO;IAChE,IAAI;KAAE,IAAI,UAAU,KAAK,MAAM,SAAS,IAAI,GAAG,KAAK,GAAG,OAAO;IAAS,QAAQ,CAAc;GAC/F;GACA,MAAM,OAAO,KAAK,UAAU,OAAO,MAAM,CAAC,KAAK;GAC/C,OAAO;IAAE,QAAQ;IAAM;IAAM,OAAO;GAAG;EACzC;EAEA,SAAgB,gBAAgB,QAAiC,KAAa,OAAgB,MAAc,OAA2B,SAAiB,UAA0C;GAChM,MAAM,WAAW,gBAAgB,QAAQ,KAAK,KAAK;GACnD,IAAI;IACF,MAAM,SAAkB,KAAK,MAAM,IAAI;IACvC,IAAI,UAAU,UAAU,CAAC,MAAM,QAAQ,MAAM,IAAI,WAAW,QAAQ,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG,MAAM,IAAI,MAAM,OAAO;IAChJ,OAAO,IAAI,KAAK;KAAE,QAAQ;KAAM;KAAM,OAAO;IAAG,CAAC;IACjD,SAAS,MAAM;GACjB,QAAQ;IACN,OAAO,IAAI,KAAK;KAAE,QAAQ,SAAS;KAAQ;KAAM,OAAO;IAAQ,CAAC;GACnE;EACF;EAEA,SAAgB,iBAAiB,OAInB;GACZ,MAAM,QAAQ,gBAAgB,MAAM,QAAQ,MAAM,UAAU,MAAM,KAAK;GACvE,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;IAAW,OAAO,MAAM;IAAO,OAAO,MAAM;IACjD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;KAAU,WAAWC,4BAAG;KAAgB,cAAY,MAAM;KAAO,MAAM;KAAG,YAAY;KAAO,UAAU,MAAM;KAC3G,OAAO,MAAM;KAAM,WAAW,UAAU;MACtC,IAAI,MAAM,UAAU;MACpB,gBAAgB,MAAM,QAAQ,MAAM,UAAU,MAAM,OAAO,MAAM,OAAO,OAAO,MAAM,OAAO,MAAM,EAAE,sBAAsB,GAAG,MAAM,QAAQ;MAC3I,MAAM,QAAQ;KAChB;IAAI,CAAA;GACG,CAAA;EACb;;;;EC7CA,MAAa,cAAc;GACzB,yBAAyB;GACzB,uBAAuB;GACvB,iBAAiB;GACjB,2BAA2B;GAC3B,uBAAuB;GACvB,wBAAwB;GACxB,yBAAyB;GACzB,wBAAwB;GACxB,wBAAwB;GACxB,0BAA0B;GAC1B,yBAAyB;GACzB,sBAAsB;GACtB,sBAAsB;GACtB,sBAAsB;GACtB,yBAAyB;GACzB,8BAA8B;GAC9B,2BAA2B;GAC3B,2BAA2B;GAC3B,iCAAiC;GACjC,wBAAwB;GACxB,4BAA4B;GAC5B,iCAAiC;GACjC,gCAAgC;GAChC,kCAAkC;GAClC,0BAA0B;GAC1B,4BAA4B;GAC5B,0BAA0B;GAC1B,uBAAuB;GACvB,2BAA2B;GAC3B,uBAAuB;GACvB,qBAAqB;GACrB,sBAAsB;GACtB,sBAAsB;GACtB,sBAAsB;GACtB,wBAAwB;GACxB,uBAAuB;GACvB,uBAAuB;GACvB,0BAA0B;GAC1B,2BAA2B;GAC3B,yBAAyB;GACzB,qBAAqB;GACrB,wBAAwB;GACxB,6BAA6B;GAC7B,yBAAyB;GACzB,2BAA2B;GAC3B,sBAAsB;GACtB,uBAAuB;GACvB,uBAAuB;GACvB,yBAAyB;GACzB,wBAAwB;GACxB,4BAA4B;GAC5B,+BAA+B;GAC/B,+BAA+B;GAC/B,kBAAkB;GAClB,iBAAiB;GACjB,kBAAkB;GAClB,kBAAkB;GAClB,mBAAmB;GACnB,sBAAsB;GACtB,mBAAmB;GACnB,uBAAuB;GACvB,oBAAoB;GACpB,wBAAwB;GACxB,mBAAmB;GACnB,mBAAmB;GACnB,qBAAqB;GACrB,iBAAiB;GACjB,kBAAkB;GAClB,sBAAsB;GACtB,kBAAkB;GAClB,kBAAkB;GAClB,oBAAoB;GACpB,mBAAmB;GACnB,mBAAmB;GACnB,qBAAqB;GACrB,2BAA2B;GAC3B,wBAAwB;GACxB,sBAAsB;GACtB,qBAAqB;GACrB,eAAe;GACf,iBAAiB;GACjB,0BAA0B;GAC1B,0BAA0B;GAC1B,0BAA0B;GAC1B,mBAAmB;GACnB,uBAAuB;GACvB,uBAAuB;GACvB,yBAAyB;GACzB,oBAAoB;GACpB,kBAAkB;GAClB,kBAAkB;GAClB,sBAAsB;GACtB,4BAA4B;GAC5B,uBAAuB;GACvB,oBAAoB;GACpB,0BAA0B;GAC1B,sBAAsB;GACtB,mBAAmB;GACnB,qBAAqB;EACvB;EAEA,MAAa,cAAwD;GACnE,yBAAyB;GACzB,uBAAuB;GACvB,iBAAiB;GACjB,2BAA2B;GAC3B,uBAAuB;GACvB,wBAAwB;GACxB,yBAAyB;GACzB,wBAAwB;GACxB,wBAAwB;GACxB,0BAA0B;GAC1B,yBAAyB;GACzB,sBAAsB;GACtB,sBAAsB;GACtB,sBAAsB;GACtB,yBAAyB;GACzB,8BAA8B;GAC9B,2BAA2B;GAC3B,2BAA2B;GAC3B,iCAAiC;GACjC,wBAAwB;GACxB,4BAA4B;GAC5B,iCAAiC;GACjC,gCAAgC;GAChC,kCAAkC;GAClC,0BAA0B;GAC1B,4BAA4B;GAC5B,0BAA0B;GAC1B,uBAAuB;GACvB,2BAA2B;GAC3B,uBAAuB;GACvB,qBAAqB;GACrB,sBAAsB;GACtB,sBAAsB;GACtB,sBAAsB;GACtB,wBAAwB;GACxB,uBAAuB;GACvB,uBAAuB;GACvB,0BAA0B;GAC1B,2BAA2B;GAC3B,yBAAyB;GACzB,qBAAqB;GACrB,wBAAwB;GACxB,6BAA6B;GAC7B,yBAAyB;GACzB,2BAA2B;GAC3B,sBAAsB;GACtB,uBAAuB;GACvB,uBAAuB;GACvB,yBAAyB;GACzB,wBAAwB;GACxB,4BAA4B;GAC5B,+BAA+B;GAC/B,+BAA+B;GAC/B,kBAAkB;GAClB,iBAAiB;GACjB,kBAAkB;GAClB,kBAAkB;GAClB,mBAAmB;GACnB,sBAAsB;GACtB,mBAAmB;GACnB,uBAAuB;GACvB,oBAAoB;GACpB,wBAAwB;GACxB,mBAAmB;GACnB,mBAAmB;GACnB,qBAAqB;GACrB,iBAAiB;GACjB,kBAAkB;GAClB,sBAAsB;GACtB,kBAAkB;GAClB,kBAAkB;GAClB,oBAAoB;GACpB,mBAAmB;GACnB,mBAAmB;GACnB,qBAAqB;GACrB,2BAA2B;GAC3B,wBAAwB;GACxB,sBAAsB;GACtB,qBAAqB;GACrB,eAAe;GACf,iBAAiB;GACjB,0BAA0B;GAC1B,0BAA0B;GAC1B,0BAA0B;GAC1B,mBAAmB;GACnB,uBAAuB;GACvB,uBAAuB;GACvB,yBAAyB;GACzB,oBAAoB;GACpB,kBAAkB;GAClB,kBAAkB;GAClB,sBAAsB;GACtB,4BAA4B;GAC5B,uBAAuB;GACvB,oBAAoB;GACpB,0BAA0B;GAC1B,sBAAsB;GACtB,mBAAmB;GACnB,qBAAqB;EACvB;;;;ECvMA,SAAgB,aAAa,GAAwB,MAAsB;GACzE,MAAM,MAAM,kBAAkB;GAC9B,OAAO,OAAO,OAAO,aAAa,GAAG,IAAI,EAAE,GAAG,IAAI;EACpD;;;;;;;;;;;;;;;;;;;;;ECYA,SAAgB,uBAAuB,OAAkC;GACvE,OAAO,OAAO,QAAQ;IAAE,GAAG,MAAM;IAAS,GAAG,MAAM;GAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW;IAChF,IAAI,MAAM,MAAM,SAAS,GAAG,GAAG,OAAO;IACtC,MAAM,WAAW,GAAG,MAAM,SAAS,GAAG;IACtC,MAAM,QAAQ,aAAa,MAAM,GAAG,GAAG;IACvC,MAAM,SAAS,SAAwB,MAAM,SAAS;KAAE,GAAG,MAAM;MAAQ,MAAM;IAAK,CAAC;IACrF,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;KACxE,KAAK,MAAM,SAAS,MAAM,GAAG,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;MAA4B,GAAI;MAAc;MAAO,OAAM;MAAmB;MAAiB;MAAO,UAAU;KAAQ,GAAjG,GAAiG;KAC5J,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,YAAD;MAAoB,WAAWC,4BAAI;MAAnC,UAAA,CAA6C,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,MAAc,CAAA,GACzE,iBAAA,GAAA,kBAAA,IAAA,CAAC,wBAAD;OAAwB,GAAI;OAAO,MAAM,KAAA;OAAW,QAAQ,MAAM,SAAS,KAAK;OAAa;OAAU,SAAS,gBAAgB,MAAM,QAAQ,IAAI;OAAG,OAAO,gBAAgB,MAAM,MAAM,IAAI;OAAG,UAAU;MAAQ,CAAA,CACzM;KAFY,GAAA,GAEZ;IACZ;IACA,IAAI,MAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,OAAO,SAAS,OAAO,SAAS,QAAQ,GACzE,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;KAA4B,GAAI;KAAc;KAAO,OAAM;KAAkB;KAAiB;KAAO,UAAU;IAAQ,GAAhG,GAAgG;IAEhI,IAAI,OAAO,UAAU,UAAU;KAC7B,MAAM,SAAS,MAAM,OAAO,IAAI,QAAQ;KACxC,MAAM,QAAQ,WAAW,KAAA,MAAc,OAAO,SAAS,OAAO,SAAS,OAAO,UAAU,OAAO,OAAO,IAAI,MAAM,SAAS,SAAS,KAAA;KAClI,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;MAA4B;MAAO,OAAO,OAAO;MACtD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;OAAO,WAAWC,4BAAG;OAAa,cAAY;OAAO,WAAU;OAAU,UAAU,MAAM;OAAU,OAAO,OAAO,QAAQ,OAAO,KAAK;OAAG,WAAW,UAAU;QAC3J,IAAI,MAAM,UAAU;QACpB,MAAM,OAAO,MAAM,OAAO;QAC1B,MAAM,QAAQ,KAAK,KAAK,CAAC,CAAC,SAAS,KAAK,OAAO,SAAS,OAAO,IAAI,CAAC;QACpE,MAAM,OAAO,IAAI,UAAU;SAAE,QAAQ,QAAQ,OAAO,OAAO,KAAK;SAAG;SAAM,OAAO,QAAQ,KAAK,MAAM,EAAE,iBAAiB;QAAE,CAAC;QACzH,IAAI,OAAO,MAAM,OAAO,IAAI,CAAC;QAC7B,MAAM,QAAQ;OAChB;MAAI,CAAA;KACK,GATY,GASZ;IACb;IACA,IAAI,OAAO,UAAU,WAAW,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;KAA4B;KACjE,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;MAAO,MAAK;MAAW,cAAY;MAAO,SAAS;MAAO,UAAU,MAAM;MAAU,WAAW,UAAU,MAAM,MAAM,OAAO,OAAO;KAAI,CAAA;IAC9H,GAF4C,GAE5C;IACX,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;KAA4B;KAAO,MAAM,MAAM,EAAE,mBAAmB;KACnG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;MAAU,WAAWA,4BAAG;MAAgB,cAAY;MAAO,MAAM;MAAG,UAAU,MAAM;MAAU,OAAO,MAAM,KAAK,IAAI;MAClH,WAAW,UAAU,MAAM,MAAM,OAAO,UAAU,KAAK,CAAC,IAAI,MAAM,OAAO,MAAM,MAAM,IAAI,CAAC;KAAI,CAAA;IACvF,GAHsC,GAGtC;IACX,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;KAA4B;KACjC,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;MAAU,WAAWA,4BAAG;MAAgB,cAAY;MAAO,MAAM,QAAQ,SAAS,IAAI;MAAG,UAAU,MAAM;MAAU,OAAO,OAAO,SAAS,EAAE;MAAG,WAAW,UAAU,MAAM,MAAM,OAAO,KAAK;KAAI,CAAA;IACvL,GAFY,GAEZ;GACb,CAAC;EACH;EAEA,SAAgB,qBAAqB,MAA+B,QAAuE;GACzI,OAAO;IAAE,GAAG;IAAM,SAAS,OAAO;IAAS,OAAO,OAAO;IAAO,IAAI,gBAAgB,OAAO,OAAO;GAAE;EACtG;EAOA,SAAgB,kBAAkB,OAA0C;GAC1E,MAAM,EAAE,MAAM,MAAM,MAAM;GAC1B,MAAM,QAAQ,MAAM,QAAQ,KAAK,EAAE;GACnC,MAAM,UAAU,QAAQ,KAAK,KAAkB,CAAC,KAAK,EAAE;GACvD,MAAM,SAAS,gBAAgB,QAAQ,EAAE;GACzC,MAAM,QAAQ,KAAK,QAAQ,MAAM,EAAE,WAAW,SAAS,OAAO,IAAI;GAClE,MAAM,cAAc,QAAQ,MAAM,SAAS,KAAK,QAAQ,MAAM,EAAE,WAAW,SAAS,gBAAgB,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,iBAAiB,KAAK;GACvI,MAAM,YAAY,gBAAgB,KAAK,IAAI;GAC3C,MAAM,gBAAgB,OAAO,KAAK,SAAS,CAAC,CAAC,MAAM;GACnD,MAAM,iBAAiB,KAAK,WAAW,MAAM,EAAE,WAAW,SAAS,aAAa;GAChF,MAAM,SAAS,SAAwC,MAAM,SAAS;IAAE,GAAG;IAAM,GAAG;GAAK,CAAC;GAC1F,MAAM,wBAA8B;IAAE,MAAM,OAAO,EAAE,GAAG,KAAK;IAAG,OAAO,KAAK;IAAM,MAAM,SAAS,IAAI;GAAE;GACvG,MAAM,eAAe,QAAgB,WAAW,UAAgB;IAC9D,KAAK,MAAM,OAAO,MAAM,OAAO,KAAK,GAAG,IAAI,IAAI,WAAW,GAAG,MAAM,SAAS,GAAG,QAAQ,MAAM,CAAC,YAAY,QAAQ,GAAG,MAAM,SAAS,GAAG,OAAO,SAAS,MAAM,OAAO,OAAO,GAAG;GAChL;GACA,MAAM,iBAAiB,SAAkC,YAAoB,CAC3E,GAAG,QAAQ,KAAK,EAAE,YAAY;IAAE,OAAO;IAAM,OAAO,aAAa,GAAG,IAAI;GAAE,EAAE,GAC5E,GAAI,YAAY,MAAM,CAAC,QAAQ,MAAM,EAAE,WAAW,SAAS,OAAO,IAAI,CAAC;IAAE,OAAO;IAAS,OAAO;GAAQ,CAAC,IAAI,CAAC,CAChH;GACA,MAAM,OAAO;IAAE;IAAG,QAAQ,MAAM;IAAQ,UAAU,MAAM;IAAU,SAAS,MAAM;GAAQ;GACzF,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,uBAAA;IAAL,UAAA;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,YAAD;MAAU,WAAWD,4BAAI;MAAzB,UAAA;OAAmC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,eAAe,EAAU,CAAA;OACpE,eAAe,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;QAAG,MAAK;QAAQ,UAAA,EAAE,0BAA0B;OAAK,CAAA;OACjE,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;QAAW,OAAO,EAAE,wBAAwB;QAC1C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;SAAY,WAAW,EAAE,wBAAwB;SAAG,OAAO;SAAe,UAAU,MAAM,YAAY;SACpG,SAAS,CAAC;UAAE,OAAO;UAAI,OAAO,EAAE,wBAAwB;SAAE,GAAG,GAAG,cAAc,KAAK,YAAY,aAAa,CAAC;SAC7G,WAAW,SAAS;UAClB,YAAY,MAAM;UAClB,IAAI,SAAS,IAAI,gBAAgB;eAC5B;WAAE,MAAM,OAAO,KAAK,WAAW,MAAM,SAAS,KAAK,SAAS,IAAI;WAAG,IAAI,SAAS,KAAA,GAAW,MAAM,EAAE,MAAM,gBAAgB,KAAK,OAAO,EAAE,CAAC;UAAE;SACjJ;QAAI,CAAA;OACG,CAAA;OACV,eAAe,KAAK,QAAQ,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWC,4BAAG;QAAY,UAAU,MAAM;QAAU,eAAe;SAAE,YAAY,MAAM;SAAG,gBAAgB;QAAE;QAAI,UAAA,EAAE,qBAAqB;OAAU,CAAA;OAC3M,CAAC,eAAe,mBAAmB,KAAA,KAAa,CAAC,KAAK,WAAW,SAAS,aAAa,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,wBAAD;QAAwB,GAAI;QACvH,UAAU,GAAG,MAAM,SAAS,QAAQ;QAAiB,OAAO,gBAAgB,UAAU,cAAc;QAAG,SAAS,gBAAgB,eAAe,QAAQ,cAAc;QACrK,WAAW,SAAS,MAAM,EAAE,MAAM;SAAE,GAAG;UAAY,gBAAgB;QAAK,EAAE,CAAC;OAAI,CAAA;OAChF,KAAK,QAAQ,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;QAAkB,GAAI;QAAM,OAAO,EAAE,wBAAwB;QAAG,OAAO,KAAK;QAAM,OAAM;QAAS,UAAU,GAAG,MAAM,SAAS;QAAa,WAAW,SAAS;SAAE,YAAY,QAAQ,IAAI;SAAG,MAAM,EAAE,KAAK,CAAC;QAAE;OAAI,CAAA;MAC7N;;KACV,iBAAA,GAAA,kBAAA,KAAA,CAAC,YAAD;MAAU,WAAWD,4BAAI;MAAzB,UAAA;OAAmC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,EAAE,iBAAiB,EAAU,CAAA;OACtE,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,kBAAkB,EAAK,CAAA,IAAI,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;QAAW,OAAO,EAAE,qBAAqB;QACjF,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;SAAY,WAAW,EAAE,qBAAqB;SAAG,OAAO,OAAO,OAAO,QAAQ,EAAE;SAAG,UAAU,MAAM;SACjG,SAAS,cAAc,KAAK,SAAS,OAAO,OAAO,QAAQ,EAAE,CAAC;SAAG,WAAW,SAAS;UACnF,MAAM,OAAO,KAAK,QAAQ,MAAM,SAAS,KAAK,SAAS,IAAI;UAC3D,IAAI,SAAS,KAAA,GAAW;WAAE,YAAY,IAAI;WAAG,MAAM,SAAS,qBAAqB,MAAM,IAAI,CAAC;UAAE;SAChG;QAAI,CAAA;OACG,CAAA;OACV,CAAC,SAAS,iBAAA,GAAA,kBAAA,IAAA,CAAC,wBAAD;QAAwB,GAAI;QAAM,MAAM,CAAC,MAAM;QAAG,UAAU,GAAG,MAAM,SAAS;QAAM,OAAO;QAAQ,SAAS,OAAO,WAAW,CAAC;QAAG,WAAW,SAAS,MAAM,EAAE,IAAI,KAAK,CAAC;OAAI,CAAA;OACvL,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;QAAkB,GAAI;QAAM,OAAO,EAAE,QAAQ,0BAA0B,qBAAqB;QAAG,OAAO,KAAK;QAAI,OAAO,QAAQ,UAAU;QAAU,UAAU,GAAG,MAAM,SAAS;QAAW,WAAW,SAAS;SAAE,YAAY,MAAM,IAAI;SAAG,MAAM,EAAE,IAAI,KAAK,CAAC;QAAE;OAAI,CAAA;MACxP;;KACV,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAWC,4BAAG;MAAkB,UAAA,EAAE,wBAAwB;KAAK,CAAA;KAClE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,0BAAA;MAAL,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;QAAW,OAAO,EAAE,kBAAkB;QAAG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;SAAO,WAAWA,4BAAG;SAAa,cAAY,EAAE,kBAAkB;SAAG,OAAO,OAAO,KAAK,WAAW,EAAE;SAAG,UAAU,MAAM;SAAU,WAAW,UAAU,MAAM,EAAE,SAAS,MAAM,OAAO,MAAM,CAAC;QAAI,CAAA;OAAY,CAAA;OACrP,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;QAAW,OAAO,EAAE,gBAAgB;QAAG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;SAAO,WAAWA,4BAAG;SAAa,cAAY,EAAE,gBAAgB;SAAG,OAAO,OAAO,KAAK,SAAS,EAAE;SAAG,UAAU,MAAM;SAAU,WAAW,UAAU,MAAM,EAAE,OAAO,MAAM,OAAO,SAAS,KAAA,EAAU,CAAC;QAAI,CAAA;OAAY,CAAA;OAC1P,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;QAAW,OAAO,EAAE,oBAAoB;QAAG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;SAAY,WAAW,EAAE,oBAAoB;SAAG,OAAO,OAAO,KAAK,qBAAqB,SAAS;SAAG,UAAU,MAAM;SAC7J,SAAS,KAAK,mBAAmB,KAAK,WAAW;UAAE;UAAO,OAAO,aAAa,GAAG,KAAK;SAAE,EAAE;SAAG,WAAW,SAAS,MAAM,EAAE,mBAAmB,KAAK,CAAC;QAAI,CAAA;OAAY,CAAA;OACpK,iBAAA,GAAA,kBAAA,IAAA,CAAC,wBAAD;QAAwB,GAAI;QAAM,OAAO,KAAK,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAc,KAAK,aAAa;QAAG,SAAS,EAAE,cAAc,EAAE;QAAG,UAAU,MAAM;QAAU,WAAW,SAAS,MAAM,IAAI;OAAI,CAAA;MAC5M;;IACF;;EACP;;;EChHA,SAAgB,eAAe,QAAmB,QAA8C,QAA2C;GACzI,MAAM,MAAM,IAAI,IAAI,OAAO,KAAK,UAAU,gBAAgB,KAAK,CAAC,CAAC,EAAE,CAAC;GACpE,MAAM,SAAS,WAAW,KAAA,IAAY,SAAS,GAAG,OAAO,gBAAgB,MAAM,CAAC,CAAC,MAAM,MAAM,EAAE;GAC/F,IAAI,QAAQ;GACZ,OAAO,IAAI,IAAI,GAAG,OAAO,GAAG,OAAO,GAAG;GACtC,OAAO,WAAW,KAAA,IACd;IAAE,IAAI,GAAG,OAAO,GAAG;IAAS,SAAS,OAAO;IAAS,OAAO,OAAO;IAAO,IAAI,gBAAgB,OAAO,OAAO;GAAE,IAC9G;IAAE,GAAG,gBAAgB,gBAAgB,MAAM,CAAC;IAAG,IAAI,GAAG,OAAO,GAAG;GAAQ;EAC9E;;EAGA,SAAgB,kBAAkB,OAA2B,OAA0B;GACrF,MAAM,SAAS,MAAM,KAAK,MAAM,MAAM;GACtC,KAAK,MAAM,CAAC,QAAQ,QAAQ;IAC1B,MAAM,QAAQ,oBAAoB,KAAK,GAAG;IAC1C,IAAI,UAAU,QAAQ,OAAO,MAAM,EAAE,IAAI,OAAO;IAChD,MAAM,OAAO,OAAO,GAAG;GACzB;GACA,KAAK,MAAM,CAAC,KAAK,UAAU,QAAQ;IACjC,MAAM,QAAQ,oBAAoB,KAAK,GAAG;IAC1C,IAAI,UAAU,MAAM;IACpB,IAAI,OAAO,MAAM,EAAE,IAAI,OAAO,MAAM,OAAO,IAAI,QAAQ,OAAO,MAAM,EAAE,IAAI,IAAI,MAAM,MAAM,KAAK;GACjG;GACA,OAAO,MAAM,MAAM,QAAQ,GAAG,OAAO,OAAO,KAAK;EACnD;EAOA,SAAgB,iBAAiB,EAAE,OAAO,QAAQ,GAAG,UAAU,SAAS,gBAAkD;GACxH,MAAM,CAAC,YAAY,kBAAA,GAAiBC,MAAAA,SAAAA,CAAS,EAAE;GAC/C,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAA6B;GAC3D,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS,CAAC;GAC1C,MAAM,CAAC,UAAU,gBAAA,GAAeA,MAAAA,SAAAA,CAAS,KAAK;GAC9C,MAAM,CAAC,OAAO,aAAA,GAAYA,MAAAA,SAAAA,CAAS,KAAK;GACxC,MAAM,UAAU,MAAM,MAAM,WAAW,CAAC;GACxC,MAAM,SAAS,QAAQ,MAAM,EAAE,WAAW,SAAS,UAAU,KAAK,QAAQ;GAC1E,MAAM,QAAQ,kBAAkB,KAAK;GACrC,MAAM,UAAU,MAAM,SAAS,KAAA;GAC/B,MAAM,UAAU,YAAY,CAAC,MAAM;GACnC,MAAM,SAAS,WAA4B;IAAE,SAAS,KAAK;IAAG,OAAO,MAAM,MAAM;GAAE;GACnF,MAAM,aAAa,OAAe,UAAyB,MAAM,MAAM,MAAM,KAAK,MAAM,OAAO,OAAO,QAAQ,QAAQ,IAAI,CAAC;GAC3H,MAAM,QAAQ,MAAM,UAAU,KAAA,IAAY,KAAA,IAAY,EAAE,MAAM,WAAW,KAAA,IAAY,4BAA4B,MAAM,MAAM,SAAS,sBAAsB,sBAAsB,iBAAiB;GACnM,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAWC,4BAAG;IAAS,cAAY,EAAE,gBAAgB;IAAG,uBAAA;IAAoB,aAAW;IAAhG,UAAA;KACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MAAQ,WAAWA,4BAAG;MAAtB,UAAA,CAAqC,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,gBAAgB,EAAM,CAAA,GAAC,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,kBAAkB,EAAE,OAAO,MAAM,MAAM,OAAO,CAAC,EAAQ,CAAA,CAAS;;KAC5I,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAWA,4BAAG;MAAkB,UAAA,EAAE,eAAe;KAAK,CAAA;KACzD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,WAAWA,4BAAG;MAAnB,UAAA;OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;QAAY,WAAW,EAAE,qBAAqB;QAAG,OAAO,QAAQ,QAAQ;QAAI,SAAS,QAAQ,KAAK,EAAE,YAAY;SAAE,OAAO;SAAM,OAAO,aAAa,GAAG,IAAI;QAAE,EAAE;QAAG,UAAU,WAAW;QAAS,UAAU;OAAgB,CAAA;OACzN,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,4BAAG;QAAY,UAAU,WAAW,WAAW,WAAW,KAAA;QAAW,eAAe;SACnH,IAAI,WAAW,KAAA,GAAW;SAC1B,YAAY,MAAM,MAAM,MAAM;SAAG,MAAM,CAAC,GAAG,MAAM,OAAO,eAAe,MAAM,OAAO,MAAM,CAAC,CAAC;QAC9F;QAAI,UAAA,EAAE,iBAAiB;OAAU,CAAA;OACjC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,4BAAG;QAAY,UAAU;QAAS,eAAe;SAAE,SAAS,KAAK;SAAG,OAAY,KAAK;QAAE;QAAI,UAAA,EAAE,iBAAiB;OAAU,CAAA;OACzJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,4BAAG;QAAY,UAAU,WAAW,WAAW,sBAAsB,KAAK,KAAK,MAAM,WAAW,KAAA;QAAW,eAAe;SAAE,OAAY,OAAO,IAAI;QAAE;QAAI,UAAA,EAAE,mBAAmB;OAAU,CAAA;OACzN,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,4BAAG;QAAY,UAAU,WAAW,WAAW,CAAC,SAAS,sBAAsB,KAAK,KAAK,MAAM,WAAW,KAAA;QAAW,eAAe;SACnK,OAAY,OAAO,CAAC,CAAC,MAAM,OAAO;UAAE,IAAI,IAAI,SAAS,IAAI;SAAE,CAAC;QAC9D;QAAI,UAAA,EAAE,MAAM,SAAS,SAAS,oBAAoB,eAAe;OAAU,CAAA;QACzE,SAAS,MAAM,WAAW,KAAA,MAAc,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,4BAAG;QAAY,eAAA;QAAY,UAAU;QAAS,eAAe,WAAW,SAAS;QAAI,UAAA,EAAE,kBAAkB;OAAU,CAAA;MAC3L;;KACJ,UAAU,KAAA,KAAa,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAK,MAAK;MAAV,UAAA,CAAkB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,MAAS,CAAA,GAAE,MAAM,OAAO,WAAW,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,MAAM,MAAM,QAAW,CAAA,CAAO;;KAClH,sBAAsB,KAAK,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;MAAS,UAAA,EAAE,oBAAoB;KAAK,CAAA;KAC7E,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,MAAK;MAAU,UAAA,EAAE,CAAC,MAAM,SAAS,qBAAqB,QAAQ,mBAAmB,QAAQ,mBAAmB,MAAM,YAAY,uBAAuB,gBAAgB;KAAK,CAAA;KAC5K,MAAM,UAAU,MAAM,MAAM,WAAW,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD,EAAA,UAAI,EAAE,gBAAgB,EAAK,CAAA;KACvE,MAAM,MAAM,SAAS,KAAK,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;MAAW,OAAO,EAAE,uBAAuB;MAAG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;OAAY,WAAW,EAAE,uBAAuB;OACvH,OAAO,OAAO,KAAK,IAAI,UAAU,MAAM,MAAM,SAAS,CAAC,CAAC;OAAG,SAAS,MAAM,MAAM,KAAK,OAAO,WAAW;QAAE,OAAO,OAAO,KAAK;QAAG,OAAO,OAAO,gBAAgB,KAAK,CAAC,CAAC,MAAM,QAAQ,CAAC;OAAE,EAAE;OACvL,WAAW,UAAU,YAAY,OAAO,KAAK,CAAC;MAAI,CAAA;KAAY,CAAA;KAC/D,MAAM,MAAM,SAAS,OAAO,UAAU;MACrC,IAAI,UAAU,KAAK,IAAI,UAAU,MAAM,MAAM,SAAS,CAAC,GAAG,OAAO,CAAC;MAClE,MAAM,OAAO,gBAAgB,KAAK;MAClC,MAAM,OAAO,MAAM,QAAQ,KAAK,EAAE,IAAI,KAAK,KAAK,CAAC,KAAK,EAAE;MACxD,MAAM,UAAU,GAAG,KAAK,QAAQ,OAAO,EAAE,wBAAwB,IAAI,OAAO,KAAK,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,KAAI,SAAQ,aAAa,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,KAAK,KAAK,KAAK,SAAS,aAAa,GAAG,OAAO,gBAAgB,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK;MACzP,OAAO,CAAC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAiB,WAAWC,4BAAI;OAAM,qBAAmB;OAAzD,UAAA;QACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAWA,4BAAI;SAAU,UAAA;QAAW,CAAA;QACvC,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;SAAW,OAAO,EAAE,aAAa;SAAG,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;UAAO,WAAWD,4BAAG;UAAa,cAAY,EAAE,aAAa;UAAG,OAAO,OAAO,KAAK,MAAM,EAAE;UAAG,UAAU;UAAS,WAAW,UAAU,UAAU,OAAO;WAAE,GAAG;WAAM,IAAI,MAAM,OAAO;UAAM,CAAC;SAAI,CAAA;QAAY,CAAA;QAC9O,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAWA,4BAAG;SAAnB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,WAAWA,4BAAG;UAAY,gBAAc,CAAC;UAAU,eAAe,YAAY,KAAK;UAAI,UAAA,EAAE,qBAAqB;SAAU,CAAA,GAC9I,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,WAAWA,4BAAG;UAAY,gBAAc;UAAU,eAAe,YAAY,IAAI;UAAI,UAAA,EAAE,mBAAmB;SAAU,CAAA,CACvI;;QACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAK,QAAQ;SAAW,UAAA,eAAe,MAAM,QAAQ,SAAS,UAAU,OAAO,IAAI,CAAC;QAAO,CAAA;QAC3F,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAK,QAAQ,CAAC;SACZ,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;UAAqB;UAAG,OAAO,EAAE,mBAAmB;UAAU;UAAO,OAAM;UAAS,QAAQ,MAAM;UAAQ,UAAU,QAAQ,MAAM;UAAQ,UAAU;UAClJ,WAAW,SAAS;WAClB,KAAK,MAAM,OAAO,MAAM,OAAO,KAAK,GAAG,IAAI,IAAI,WAAW,QAAQ,MAAM,EAAE,KAAK,QAAQ,QAAQ,MAAM,QAAQ,MAAM,OAAO,OAAO,GAAG;WACpI,UAAU,OAAO,IAAI;UACvB;UAAY;SAAU,CAAA;QACrB,CAAA;QACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAWA,4BAAG;SAAnB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,WAAWA,4BAAG;UAAY,UAAU,WAAW,WAAW,WAAW,KAAA,KAAa,sBAAsB,KAAK;UAAG,eAAe;WACnJ,IAAI,WAAW,KAAA,GAAW;YAAE,YAAY,MAAM,MAAM,MAAM;YAAG,MAAM,CAAC,GAAG,MAAM,OAAO,eAAe,MAAM,OAAO,QAAQ,KAAK,CAAC,CAAC;WAAE;UACnI;UAAI,UAAA,EAAE,oBAAoB;SAAU,CAAA,GACpC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,WAAWA,4BAAG;UAAY,eAAA;UAAY,UAAU,WAAW;UAAS,eAAe,WAAW,KAAK;UAAI,UAAA,EAAE,iBAAiB;SAAU,CAAA,CACvJ;;OACF;MArBa,GAAA,KAqBb,CAAC;KACR,CAAC;KACA,YAAY,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;MAAe,OAAO,EAAE,YAAY,YAAY,qBAAqB,iBAAiB;MAC9G,aAAa,EAAE,YAAY,YAAY,yBAAyB,uBAAuB,EAAE,IAAI,YAAY,YAAY,KAAK,OAAO,gBAAgB,MAAM,MAAM,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;MAClL,cAAc,EAAE,YAAY,YAAY,qBAAqB,iBAAiB;MAAG,aAAa,EAAE,iBAAiB;MACjH,gBAAgB,WAAW,KAAA,CAAS;MAAG,iBAAiB;OAAE,IAAI,YAAY,WAAW,OAAO,QAAQ;YAAQ,MAAM,kBAAkB,OAAO,OAAO,CAAC;OAAG,SAAS,KAAK;MAAE;KAAI,CAAA;IACrK;;EACX;EAEA,SAAgB,mBAAmB,OAA4H;GAC7J,MAAM,EAAE,OAAO,MAAM;GACrB,MAAM,SAAS,oBAAoB,QAAQ,UAAU,KAAK;GAC1D,MAAM,WAAW,OAAO;GACxB,CAAA,GAAA,MAAA,qBAAA,CAAqB,MAAM,iBAAiB,MAAM,kBAAkB,MAAM,gBAAgB;GAC1F,MAAM,QAAQ,gBAAgB,MAAM,cAAc,QAAQ;GAC1D,MAAM,UAAA,GAASE,MAAAA,QAAAA,OAAc,oBAAoB,UAAU,OAAO;IAChE,UAAU,SAAS,WAAW,YAAY,IAAI;IAAG,SAAS,MAAM;IAChE,iBAAiB,MAAM,UAAU,CAAC,CAAC,mBAAmB;IACtD,SAAS,MAAM;GACjB,CAAC,GAAG;IAAC;IAAO;IAAU;GAAK,CAAC;GAC5B,CAAA,GAAA,MAAA,UAAA,OAAgB;IAAE,IAAI,UAAU,OAAY,KAAK;GAAE,GAAG,CAAC,QAAQ,QAAQ,CAAC;GACxE,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;IAAyB;IAAe;IAAW;IAAG,UAAU,CAAC,OAAO,eAAe,MAAM,aAAa,aAAa;IAC5H,eAAe;KAAE,MAAM,YAAY;KAAO,MAAM,cAAc;IAAE;IAAG,cAAc,MAAM,kBAAkB,MAAM,OAAO,aAAa,MAAM,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,mBAAD;KAC5I;KAAS;KAAM,MAAM,MAAM;KAAM,QAAQ,MAAM;KAAQ,UAAU,QAAQ;KAAS,UAAU,CAAC,OAAO,eAAe,MAAM,aAAa,aAAa;KAC5I;KAAU,eAAe;MAAE,MAAM,YAAY;MAAO,MAAM,cAAc;KAAE;IAAI,CAAA;GAAK,CAAA;EACnG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECvGA,MAAM,kBAAuD;GAC3D,WAAW;GACX,aAAa;GACb,gBAAgB;GAChB,wBAAwB;GACxB,mBAAmB;GACnB,cAAc;GACd,kBAAkB;GAClB,kBAAkB;GAClB,sBAAsB;GACtB,sBAAsB;EACxB;;;;;;;EAQA,SAAgB,gBAAgB,OAAwB,OAAe,UAA6B,CAAC,GAAsB;GACzH,MAAM,WAAW,IAAI,IAAI,OAAO;GAChC,OAAO,wBACJ,QAAQ,UAAU,MAAM,iBAAiB,SACrC,CAAC,SAAS,IAAI,MAAM,EAAE,KAEtB,CAAC,aAAa,MAAM,EAAE,KACtB,qBAAqB,MAAM,EAAE,CAAC,CAAC,SAAS,MACvC,iBAAiB,MAAM,EAAE,MAAM,KAAA,KAAa,0BAA0B,MAAM,IAAI,MAAM,WAAW,EAAE,CAAC,CACzG,KAAK,UAAU,MAAM,EAAE;EAC5B;;EAGA,SAAgB,2BAA2B,OAAwB,OAAkC;GACnG,OAAO,oBACJ,QAAQ,EAAE,IAAI,mBAAmB,iBAAiB,SAAS,0BAA0B,IAAI,MAAM,WAAW,CAAC,CAAC,CAC5G,KAAK,EAAE,SAAS,EAAE;EACvB;;EAQA,SAAS,mBAAmB,OAA4F;GACtH,MAAM,EAAE,OAAO,GAAG,iBAAiB;GACnC,MAAM,CAAC,YAAY,kBAAA,GAAiBC,MAAAA,SAAAA,CAAS,KAAK;GAClD,MAAM,aAAA,GAAYC,MAAAA,OAAAA,CAA0B,IAAI;GAChD,MAAM,WAAW,MAAM,OAAO,eAAe,MAAM,aAAa,aAAa;GAC7E,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,MAAD;IAAI,WAAWC,kCAAI;IAAe,yBAAuB;IAAzD,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,EAAE,4BAA4B,EAAE,IAAI,aAAa,CAAC,EAAQ,CAAA;KAChE,YACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,KAAK;MAAW,MAAK;MAAS,WAAWC,4BAAG;MAAY,eAAA;MAAY,cAAY,EAAE,6BAA6B,EAAE,IAAI,aAAa,CAAC;MAAG,eAAe,cAAc,IAAI;MAC5K,UAAA,EAAE,sBAAsB;KACnB,CAAA;KAET,cACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,eAAD;MACE,OAAO,EAAE,6BAA6B,EAAE,IAAI,aAAa,CAAC;MAC1D,aAAa,EAAE,0BAA0B;MACzC,cAAc,EAAE,0BAA0B;MAC1C,aAAa,EAAE,mBAAmB;MAClC,gBAAgB,EAAE,sBAAsB;MACxC,gBAAgB;MAChB,WAAW,YAAY;OAAE,IAAI,CAAC,MAAM,MAAM,uBAAuB,YAAY,GAAG,MAAM,IAAI,MAAM,EAAE,sBAAsB,CAAC;MAAE;MAC3H,gBAAgB,cAAc,KAAK;KACpC,CAAA;IAED;;EAER;;;;;EAMA,MAAM,kBAAkB;GAAC;GAAW;GAAa;GAAc;GAAkB;GAAkB;GAAgB;EAAsB;;EAGzI,SAAS,aAAa,IAAqB;GACzC,OAAQ,gBAAsC,SAAS,EAAE;EAC3D;EAEA,SAAS,YAAY,OAAe,UAAuC;GACzE,OAAO,wBAAwB,QAAQ,UAAU,MAAM,iBAAiB,SACnE,CAAC,SAAS,SAAS,MAAM,EAAE,KAAM,gBAAsC,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC,KAAK,UAAU,MAAM,EAAE;EACzH;EAEA,SAAS,kBAAkB,IAAY,SAAiB,GAAiC;GACvF,OAAO,mBAAmB,IAAI,SAAS,CAAC,KAClC,gBAAgB,QAAQ,KAAA,KAAa,EAAE,gBAAgB,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,SAAS,OAAO;EAClG;;;;;;EAOA,SAAgB,qBAAqB,OASvB;GACZ,MAAM,EAAE,OAAO,GAAG,UAAU;GAC5B,MAAM,WAAW,MAAM,uBAAuB,CAAC;GAC/C,MAAM,QAAQ,gBAAgB,OAAO,OAAO,QAAQ;GACpD,MAAM,eAAe,2BAA2B,OAAO,KAAK,CAAC,CAAC,QAAQ,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC;GAEnG,MAAM,aAAa,SAAS,MAAM,GAAG,MAAM,YAAY;GACvD,MAAM,gBAAgB,MAAM,OAAO,eAAe,MAAM,aAAa,aAAa;GAClF,MAAM,WAAW,MAAM,OAAO;GAC9B,MAAM,SAAS,YAAY,OAAO,QAAQ;GAC1C,MAAM,WAAW,MAAM,WAAW,GAAA,CAAI,KAAK,CAAC,CAAC,YAAY;GACzD,MAAM,WAAW,OAAwB,kBAAkB,IAAI,SAAS,CAAC;GAEzE,MAAM,uBAAuB,GAAG,SAAS,mBAAmB,MAAM,YAAY;GAC9E,MAAM,CAAC,mBAAmB,yBAAA,GAAwBH,MAAAA,SAAAA,OAAe,MAAM,cAAc,SAAS,IAAI,oBAAoB,KAAK,IAAI;GAC/H,MAAM,CAAC,cAAc,oBAAA,GAAmBA,MAAAA,SAAAA,CAAS,KAAK;GACtD,IAAI,cAAc,OAAO,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWE,kCAAI;IAAU,+BAA6B;IAA3D,UAAA,CACvB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAQ,MAAK;KAAS,WAAWC,4BAAG;KAAY,eAAe,gBAAgB,KAAK;KAAI,UAAA,EAAE,yBAAyB;IAAU,CAAA,GAC7H,iBAAA,GAAA,kBAAA,IAAA,CAAC,oBAAD;KAA2B;KAAU;IAAI,CAAA,CACtC;;GACL,IAAI,MAAM,WAAW,KAAK,aAAa,WAAW,KAAK,OAAO,WAAW,GAAG,OAAO;GACnF,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWD,kCAAI;IAAU,+BAA6B;IAA3D,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,4BAAD;MAAmC;MAAU;MAAU;MAAO,qBAAqB;MAAU,WAAW,MAAM;KAAY,CAAA;KAC1H,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MAAQ,MAAK;MAAS,WAAWC,4BAAG;MAAY,eAAe,gBAAgB,IAAI;MAAI,UAAA,EAAE,eAAe;KAAU,CAAA;KACjH,MAAM,KAAK,SACV,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;MAAoB,QAAQ,CAAC,QAAQ,IAAI;MAAG,WAAWD,kCAAI;MAAO,0BAAwB;MACxF,cAAY,EAAE,gBAAgB,SAAS,qBAAqB;MAD9D,UAAA,CAEE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAI,WAAWA,kCAAI;OAAa,UAAA,EAAE,gBAAgB,SAAS,qBAAqB;MAAM,CAAA,GACtF,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,WAAWA,kCAAI;OAAa,2BAAyB;OACxD,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,mBAAD;QAA0B;QAAa;QAAS;QAAG,YAAY,GAAG,WAAW,GAAG;OAAS,CAAA;MACtF,CAAA,CACE;KANK,GAAA,IAML,CACV;KACA,aAAa,KAAK,OAAO,KACxB,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;MAAS,WAAWA,kCAAI;MAAO,2BAAyB;MAAO,cAAY,EAAE,yBAAyB;MAAtG,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAI,WAAWA,kCAAI;OAAa,UAAA,EAAE,yBAAyB;MAAM,CAAA,GACjE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;OAAI,WAAWA,kCAAI;OAAe,UAAA,aAAa,OAAO,OAAO,CAAC,CAAC,KAAK,OAAO,iBAAA,GAAA,kBAAA,IAAA,CAAC,oBAAD;QAAoC;QAAU;QAAG,cAAc;OAAK,GAA3C,EAA2C,CAAC;MAAM,CAAA,CAC/I;;KAEV,OAAO,KAAK,OACX,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;MAAkB,QAAQ,CAAC,QAAQ,EAAE;MAAG,WAAWA,kCAAI;MAAO,oBAAkB;MAAI,cAAY,EAAE,gBAAgB,OAAO,qBAAqB;MAA9I,UAAA;OACG,OAAO,aAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,mBAAD;QAAsB;QAAa;QAAU,UAAU,CAAC;QAAe,UAAU,MAAM;QAAY,QAAQ,MAAM;OAAe,CAAA;OACpJ,OAAO,eACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,6BAAD;QACK;QACH,mBAAmB,MAAM;QACzB,sBAAsB,MAAM;QAC5B,0BAA0B,MAAM;QAChC,6BAA6B,MAAM;QACnC,uBAAuB,MAAM;QAC7B,UAAU;QACV,UAAU,CAAC;QACX,wBAAwB;SACtB,MAAM,cAAc,SAAS,IAAI,sBAAsB,CAAC,iBAAiB;SACzE,qBAAqB,CAAC,iBAAiB;QACzC;OACD,CAAA;OAEF,OAAO,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAAC,sBAAD;QAA6B;QAAO,OAAM;OAAQ,CAAA;OACzE,OAAO,oBAAoB,iBAAA,GAAA,kBAAA,IAAA,CAAC,sBAAD;QAA6B;QAAO,OAAM;OAAY,CAAA;OACjF,OAAO,oBAAoB,iBAAA,GAAA,kBAAA,IAAA,CAAC,2BAAD;QAAkC;QAAU;OAAI,CAAA;OAC3E,OAAO,mBAAmB,MAAM,cAC/B,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD;QAA0C;QAAa;QAAG,UAAU,MAAM;QACxE,QAAQ,MAAM;QAAc,UAAU,CAAC;OAAgB,GADnC,QACmC;OAE1D,OAAO,0BACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,wBAAD;QAAiD;QAAU,UAAU,CAAC;QAAkB;QAAG,UAAU,MAAM;QAAY,QAAQ,MAAM;OAAe,GAAvH,QAAuH;MAE/I;KA5BK,GAAA,EA4BL,CACV;IACE;;EAET;;EAGA,SAAS,mBAAmB,OAAqD;GAC/E,MAAM,EAAE,OAAO,UAAU;GACzB,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,UAAU,KAAA,GAAW;IACzB,OAAO,oBAAoB,yBAAyB,YAAY,KAAK,EAAE,GAAG;GAC5E,GAAG,CAAC,OAAO,KAAK,CAAC;GACjB,OAAO;EACT;;;;;EAqCA,SAAgB,iBAAiB,OAAgD;GAC/E,MAAM,EAAE,OAAO,GAAG,YAAY,aAAa;GAgB3C,OAAO;IACL,aAfkB,aAAa,SAC7B,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,QAAQ,eAAe;KAAc,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,0BAAD;MAAiC;MAAU;KAAI,CAAA;IAAM,CAAA,IAC/F;IAcF,aAAA;IACA,aAAA,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAZA,EAAA,UAAA;KAGG,MAAM,eAAe,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAWC,4BAAG;MAAkB,UAAA,MAAM;KAAc,CAAA;KACzF,MAAM,oBAAoB,KAAA,KAAa,CAAC,oBAAoB,MAAM,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC,EAAA,CAAG,SAAS,EAAE,KAAK,0BAA0B,IAAI,MAAM,WAAW,CAAC,KAC5K,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAWA,4BAAG;MAAiB,MAAK;MAAU,UAAA,MAAM;KAAmB,CAAA;KAC/E,iBAAA,GAAA,kBAAA,IAAA,CAAC,oBAAD;MAAoB,OAAO,MAAM,iBAAiB;MAAO,OAAO,MAAM,iBAAiB,SAAS;KAAI,CAAA;IACpG,EAAA,CAKQ;IACV,sBAAsB,OAAe,WACnC,iBAAA,GAAA,kBAAA,IAAA,CAAC,sBAAD;KAES;KACJ;KACI;KACP,UAAU,QAAQ;KAClB,qBAAqB,MAAM;KAC3B,YAAY,MAAM;KAClB,WAAW,MAAM;KACjB,SAAS,MAAM;IAChB,GATM,GAAG,MAAM,OAAO,eAAe,GAAG,OAAO,IAS/C;IAEH,mBAAmB,UAAkB,gBAAgB,OAAO,OAAO,MAAM,uBAAuB,CAAC,CAAC,CAAC,CAAC,SAAS,KACxG,2BAA2B,OAAO,KAAK,CAAC,CAAC,MAAM,OAAO,EAAE,MAAM,uBAAuB,CAAC,EAAA,CAAG,SAAS,EAAE,CAAC,KACrG,YAAY,OAAO,MAAM,uBAAuB,CAAC,CAAC,CAAC,CAAC,SAAS;IAClE,uBAAuB,OAAO,YAAY;KACxC,GAAG,gBAAgB,OAAO,OAAO,MAAM,uBAAuB,CAAC,CAAC;KAChE,GAAG,2BAA2B,OAAO,KAAK,CAAC,CAAC,QAAQ,OAAO,EAAE,MAAM,uBAAuB,CAAC,EAAA,CAAG,SAAS,EAAE,CAAC;KAC1G,GAAG,YAAY,OAAO,MAAM,uBAAuB,CAAC,CAAC;IACvD,CAAC,CAAC,MAAM,OAAO,kBAAkB,IAAI,SAAS,CAAC,CAAC;GAClD;EACF;;;;ECpSA,MAAM,4BAAiE;GACrE,YAAY;GACZ,kBAAkB;GAClB,mBAAmB;GACnB,iBAAiB;GACjB,cAAc;GACd,iBAAiB;GACjB,aAAa;GACb,kBAAkB;GAClB,gBAAgB;EAClB;EAEA,SAAgB,eAAe,OAajB;GACZ,MAAM,EAAE,GAAG,WAAW,WAAW,OAAO,QAAQ,eAAe,YAAY,iBAAiB,YAAY;GACxG,MAAM,cAAc,UAA0B;IAC5C,MAAM,MAAM,0BAA0B;IACtC,OAAO,QAAQ,KAAA,IAAY,QAAQ,EAAE,GAAG;GAC1C;GACA,MAAM,EAAE,WAAW,oBAAoB,eAA+B,MAAM,OAAO;GACnF,MAAM,YAAY;GAClB,MAAM,WAAW,wBAAwB;IACvC,MAAM;IACN;IACA,UAAU;IACV,KAAK;IACL,QAAQ;GACV,CAAC;GACD,CAAA,GAAA,sCAAA,2BAAA,CAA2B,WAAW,OAAO,SAAS;IAAE,IAAI,CAAC,MAAM,QAAQ;GAAE,GAAG,SAAS;GAEzF,MAAM,UAAU,UAAU,KAAA,IACtB,YACA,UAAU,QAAQ,cAAc,SAAS,KAAK,SAAS,gBAAgB,KAAK;GAChF,MAAM,yBAAS,IAAI,IAAyC;GAC5D,KAAK,MAAM,YAAY,SAAS;IAC9B,MAAM,MAAM,SAAS,KAAK,SAAS;IACnC,MAAM,QAAQ,OAAO,IAAI,GAAG;IAC5B,IAAI,UAAU,KAAA,GAAW,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC;SAC9C,MAAM,KAAK,QAAQ;GAC1B;GAEA,MAAM,UACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IACE,KAAK;IACL,WAAWC,4BAAO;IAClB,OAAO,YAAY,EAAE,YAAY,SAAS;IAC1C,MAAK;IACL,cAAY,EAAE,gBAAgB;IAC9B,UAAU,UAAU,MAAM,gBAAgB;IAC1C,WAAW;IAPb,UAAA,CASE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAWA,4BAAO;KAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,UAAU,KAAA,IAAY,EAAE,mBAAmB,EAAE,OAAO,WAAW,KAAK,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAU,CAAA,GAChH,iBAAA,GAAA,kBAAA,IAAA,CAACC,sCAAAA,QAAD;MAAQ,SAAQ;MAAQ,MAAK;MAAK,WAAWD,4BAAO;MAAa,cAAY,EAAE,qBAAqB;MAAG,SAAS;MAAS,UAAA;KAAS,CAAA,CAC/H;IACL,CAAA,GAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAWA,4BAAO;KAAvB,UAAA;MACG,oBAAoB,KAAA,KACnB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,4BAAO;OAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,WAAWA,4BAAO;QAAqB,UAAA,EAAE,2BAA2B;OAAU,CAAA,GACtF,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,4BAAO;QAAmB,SAAS;QAApE,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAQ,YAAiB,CAAA,GACzB,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,EAAE,0BAA0B,EAAS,CAAA,CACvC;OACL,CAAA,CAAA;;MAEN,QAAQ,WAAW,MAAM,eAAe,UAAU,OAAO,KACrD,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;OAAG,WAAWA,4BAAO;OAAkB,UAAA,EAAE,iBAAiB;MAAK,CAAA;MACnE,CAAC,GAAG,OAAO,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,WACvC,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAsB,WAAWA,4BAAO;OAAxC,UAAA,CACG,UAAU,KAAA,KAAa,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,WAAWA,4BAAO;QAAqB,UAAA,WAAW,UAAU;OAAU,CAAA,GACrG,MAAM,KAAK,aACV,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QAA4B,MAAK;QAAS,WAAWA,4BAAO;QAAmB,eAAe,OAAO,QAAQ;QAA7G,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,SAAS,KAAa,CAAA,GAC/B,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,SAAS,KAAK,QAAQ,SAAS,KAAK,GAAU,CAAA,CAChD;OAHK,GAAA,SAAS,IAGd,CACT,CACE;MARK,GAAA,UAQL,CACN;MACA,kBAAkB,KAAA,KAAa,cAAc,SAAS,KACrD,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;OAAK,WAAWA,4BAAO;OAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,WAAWA,4BAAO;QAAqB,UAAA,EAAE,uBAAuB;OAAU,CAAA,GACjF,cAAc,KAAK,aAClB,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;QAA4B,MAAK;QAAS,WAAWA,4BAAO;QAC1D,eAAe,aAAa,SAAS,IAAI;QAD3C,UAAA,CAEE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,SAAS,KAAa,CAAA,GAC/B,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD,EAAA,UAAQ,OAAO,SAAS,KAAK,QAAQ,SAAS,KAAK,MAAM,EAAE,EAAS,CAAA,CAC9D;OAJK,GAAA,SAAS,IAId,CACT,CACE;;KAEJ;IACF,CAAA,CAAA;;GAEP,OAAO,OAAO,aAAa,eAAe,SAAS,SAAS,OAAO,WAAA,GAAUE,UAAAA,aAAAA,CAAa,SAAS,SAAS,IAAI;EAClH;;;;ECpGA,MAAa,mBAAA,GAAkBC,MAAAA,KAAAA,CAAK,SAAS,gBAAgB,OAA6I;GACxM,MAAM,EAAE,OAAO,MAAM;GAErB,MAAM,SAAS,oBAAoB,QAAQ,UAAU,KAAK;GAC1D,MAAM,CAAC,YAAY,kBAAA,GAAiBC,MAAAA,SAAAA,CAAS,MAAM,QAAQ,cAAc,KAAK;GAC9E,MAAM,oBAAA,GAAmBC,MAAAA,YAAAA,EAAa,UAAkB;IACtD,IAAI,MAAM,WAAW,KAAA,GAAW,MAAM,OAAO,aAAa;IAC1D,cAAc,KAAK;GACrB,GAAG,CAAC,MAAM,MAAM,CAAC;GAEjB,MAAM,CAAC,SAAS,eAAA,GAAcD,MAAAA,SAAAA,CAAS,MAAM,QAAQ,UAAU,EAAE;;GAEjE,MAAM,CAAC,iBAAiB,uBAAA,GAAsBA,MAAAA,SAAAA,CAAwD;GACtG,MAAM,CAAC,eAAe,qBAAA,GAAoBA,MAAAA,SAAAA,CAAS,KAAK;GAExD,MAAM,oBAAA,GAAmBC,MAAAA,YAAAA,EAAa,OAAe;IACnD,iBAAiB,eAAe,KAAK;IAErC,MAAM,QAAQ,iBAAiB,EAAE,CAAC,EAAE;IACpC,oBAAoB,aAAa;KAAE;KAAI;KAAO,QAAQ,SAAS,SAAS,KAAK;IAAE,EAAE;GACnF,GAAG,CAAC,UAAU,CAAC;GAEf,MAAM,gBAAA,GAAeA,MAAAA,YAAAA,EAAa,YAAwD;IACxF,MAAM,MAAM,EAAE,eAAe,QAAQ,CAAC;GACxC,GAAG,CAAC,KAAK,CAAC;GACV,MAAM,eAAA,GAAcA,MAAAA,YAAAA,EAAa,YAAwD;IACvF,OAAO,MAAM,eAAe,OAAO;GACrC,GAAG,CAAC,KAAK,CAAC;GAEV,MAAM,uBAAA,GAAsBA,MAAAA,YAAAA,EAAa,WAAmB;IAC1D,MAAW,wBAAwB,CAAC,MAAM,CAAC;GAC7C,GAAG,CAAC,KAAK,CAAC;GACV,MAAM,yBAAA,GAAwBA,MAAAA,YAAAA,EAAa,WAAmB;IAC5D,MAAW,sBAAsB,MAAM;GACzC,GAAG,CAAC,KAAK,CAAC;GAEV,MAAM,0BAAA,GAAyBA,MAAAA,YAAAA,EAAa,QAAgB,aAA4C;IACtG,MAAW,wBAAwB,QAAQ,QAAQ;GACrD,GAAG,CAAC,KAAK,CAAC;GACV,MAAM,gBAAgB,MAAM,OAAO,eAAe,MAAM,aAAa,aAAa;GAGlF,MAAM,SAAS,kBACb,OAAO,gBACN,WAAW;IAAE,IAAI,eAAe,aAAa,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC,eAAe,MAAM,CAAC;GAAE,GAC5F,MAAM,YACN,GACA,MACF;GACA,MAAM,aAAa,qBAAqB;IAAE;IAAG,UAAU,OAAO;IAAgB,UAAU,CAAC;IAAe,QAAQ,MAAM;IAAc,UAAU,MAAM;IAAY,kBAAkB,OAAO;GAAU,CAAC;GACpM,MAAM,cAAc,iBAAiB,KAAK,WAAW;IAAE,IAAI,OAAO;IAAS,OAAO,EAAE,oBAAoB,EAAE,OAAO,eAAe,GAAG,kBAAkB,KAAK,EAAE,CAAC;GAAE,EAAE;GACjK,MAAM,kBAAA,GAAiBA,MAAAA,YAAAA,EAAa,OAAe;IACjD,IAAI,iBAAiB,GAAG,WAAW,MAAM,GAAG,OAAO,WAAW,GAAG,MAAM,CAAC,CAAC;GAC3E,GAAG,CAAC,eAAe,MAAM,CAAC;GAC1B,MAAM,sBAAA,GAAqBA,MAAAA,YAAAA,EAAa,SAAkC;IACxE,iBAAiB,eAAe,SAAS,eAAe,eAAe;IACvE,WAAW,WAAW;KAAE,MAAM;KAAY;KAAM,UAAU,OAAO;IAAe,CAAC;IACjF,OAAO,YAAY;GACrB,GAAG;IAAC,OAAO;IAAgB;IAAQ;IAAY,WAAW;GAAU,CAAC;GAGrE,MAAM,SAAS,iBAAiB;IAC9B;IACA;IACA;IACA,UAAU;IACV;IACA;IACA,WAAW;IACX,YAAY,WAAW;GACzB,CAAC;GACD,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAWC,4BAAG;IAAS,cAAY,EAAE,WAAW;IAAzD,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,qBAAD;KACK;KACH,MAAM,MAAM;KACZ,SAAS,OAAO;KAChB,QAAQ,MAAM;KACd,aAAa,MAAM,cAAc;KACjC,YAAY,OAAO;KACnB,QAAQ,MAAM;KACd,YAAY,MAAM;KAClB,gBAAgB,CAAC,gBAAgB,EAAE,OAAO,cAAc,4BAA4B,2BAA2B,IAAI,KAAA;KACnH,sBAAsB,MAAM,aAAa,SAAS;KAClD,gBAAgB,OAAO,WAAW,iBAAiB,MAAM,UAAU,UAAU,UAAU,KAAK,UAAU;KACvF;KACf,qBAAqB;MAAE,iBAAiB,KAAK;MAAG,iBAAiB,KAAK;KAAE;KACxE,iBAAiB,OAAO;KACxB,gBAAgB;KAChB,eAAe;KACf,oBAAoB,MAAM;KAC1B,mBAAmB,MAAM;KACzB,2BAA2B,MAAM;KACjC,uBAAuB;KACvB,yBAAyB;KACzB,0BAA0B;KAC1B,UAAU,MAAM;KACJ;KACZ,oBAAoB;KACX;KACT,iBAAiB;KACjB,qBAAqB,OAAO;KAC5B,kBAAkB,OAAO;KACzB,sBAAsB,OAAO;KAC7B,aAAa,OAAO;KACpB,aAAa,OAAO;KACpB,gBAAgB,iBAAA,GAAA,kBAAA,IAAA,CAAC,qBAAD;MAA4B;MAAU;MAAG,WAAW,OAAO;MAAW,YAAY;MAAa,eAAA;MAAc,eAAe;KAAiB,CAAA;KAC7J,aAAa,OAAO;IACrB,CAAA,GACA,OAAO,QACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD;KACK;KACH,WAAW,OAAO;KAClB,WAAW,OAAO,YAAY,CAAC,IAAI,OAAO;KAC1C,OAAO,OAAO;KACd,eAAe,OAAO,UAAU,KAAA,IAAY,OAAO,gBAAgB,KAAA;KACnE,QAAQ,OAAO;KACf,YAAY;KACZ,SAAS,OAAO;IACjB,CAAA,CAEI;;EAEb,CAAC;;;;;;;;;EC/HD,MAAa,2BAAA,GAA0BC,MAAAA,KAAAA,CAAK,SAAS,wBAAwB,OAuB/D;GACZ,MAAM,EAAE,OAAO,GAAG,OAAO,OAAO,aAAa,gBAAgB,aAAa,YAAY,oBAAoB,SAAS,iBAAiB,qBAAqB,kBAAkB,oBAAoB;GAC/L,MAAM,SAAS,oBAAoB,QAAQ,UAAU,KAAK;GAE1D,MAAM,gBAAA,GAAeC,MAAAA,YAAAA,EAAa,YAAwD;IACxF,MAAM,MAAM,EAAE,eAAe,QAAQ,CAAC;GACxC,GAAG,CAAC,KAAK,CAAC;GACV,MAAM,eAAA,GAAcA,MAAAA,YAAAA,EAAa,YAAwD;IACvF,OAAO,MAAM,eAAe,OAAO;GACrC,GAAG,CAAC,KAAK,CAAC;GAGV,MAAM,mBAAmB,UAAU,KAAA,KAAa,UAAU;GAC1D,MAAM,uBAAA,GAAsBA,MAAAA,YAAAA,EAAa,WAAmB;IAC1D,MAAW,wBAAwB,CAAC,MAAM,CAAC;GAC7C,GAAG,CAAC,KAAK,CAAC;GACV,MAAM,yBAAA,GAAwBA,MAAAA,YAAAA,EAAa,WAAmB;IAC5D,MAAW,sBAAsB,MAAM;GACzC,GAAG,CAAC,KAAK,CAAC;GACV,MAAM,0BAAA,GAAyBA,MAAAA,YAAAA,EAAa,QAAgB,aAA4C;IACtG,MAAW,wBAAwB,QAAQ,QAAQ;GACrD,GAAG,CAAC,KAAK,CAAC;GAGV,MAAM,eAAe,MAAM,yBAAyB,MAAM,UAAU,KAAA,KAAa,UAAU;GAC3F,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;IACK;IACH,MAAM,MAAM;IACZ,SAAS,OAAO;IAChB,QAAQ,MAAM;IACd,aAAa,MAAM;IACnB,aAAa,MAAM,cAAc;IACjC,YAAY,OAAO;IACnB,QAAQ,MAAM;IACd,YAAY,MAAM;IAClB,gBAAgB,CAAC,OAAO,cAAc,EAAE,2BAA2B,IAAI,MAAM,aAAa,aAAa,OAAO,EAAE,yBAAyB,IAAI,KAAA;IAC7I,UAAU,MAAM;IAChB,gBAAgB,MAAM;IACtB,eAAe,MAAM;IACrB,eAAe,MAAM;IACJ;IACV;IACA;IACM;IACA;IACG;IACJ;IACQ;IACX;IACQ;IACI;IACH;IAClB,sBAAsB,MAAM;IAC5B,WAAW,eAAe,EAAE,yBAAyB,IAAI,KAAA;IACzD,gBAAgB;IAChB,eAAe;IACf,oBAAoB,mBAAmB,MAAM,0BAA0B,KAAA;IACvE,mBAAmB,mBAAmB,MAAM,oBAAoB,KAAA;IAChE,2BAA2B,mBAAmB,MAAM,8BAA8B,KAAA;IAClF,uBAAuB,mBAAmB,sBAAsB,KAAA;IAChE,yBAAyB,mBAAmB,wBAAwB,KAAA;IACpE,0BAA0B,mBAAmB,yBAAyB,KAAA;IACtE,UAAU,MAAM;GACjB,CAAA;EAEL,CAAC;;;;;;;;;;;;;;;EC5ED,MAAa,gBAAA,GAAeC,MAAAA,KAAAA,CAAK,SAAS,aAAa,OAA6I;GAClM,MAAM,EAAE,OAAO,MAAM;GACrB,MAAM,CAAC,YAAY,kBAAA,GAAiBC,MAAAA,SAAAA,CAAS,MAAM,QAAQ,cAAc,KAAK;GAC9E,MAAM,oBAAoB,UAAwB;IAChD,IAAI,MAAM,WAAW,KAAA,GAAW,MAAM,OAAO,aAAa;IAC1D,cAAc,KAAK;GACrB;;GAEA,MAAM,CAAC,iBAAiB,uBAAA,GAAsBA,MAAAA,SAAAA,CAAwC;GACtF,MAAM,CAAC,eAAe,qBAAA,GAAoBA,MAAAA,SAAAA,CAAS,KAAK;GAExD,MAAM,CAAC,SAAS,eAAA,GAAcA,MAAAA,SAAAA,CAAS,MAAM,QAAQ,UAAU,EAAE;GACjE,MAAM,gBAAgB,MAAM,OAAO,eAAe,MAAM,aAAa,aAAa;;GAElF,MAAM,kBAAqC,CAAC;GAE5C,MAAM,SAAS,kBACb,MAAM,OAAO,gBACZ,WAAW;IAAE,IAAI,eAAe,MAAM,MAAM,EAAE,eAAe,CAAC,GAAG,MAAM,UAAU,CAAC,CAAC,eAAe,MAAM,EAAE,CAAC;GAAE,GAC9G,MAAM,YACN,GACA,UACF;GACA,MAAM,aAAa,qBAAqB;IAAE;IAAG,UAAU,MAAM,OAAO;IAAgB,UAAU,CAAC;IAAe,QAAQ,MAAM;IAAc,UAAU,MAAM;IAAY,kBAAkB,OAAO;GAAU,CAAC;GAC1M,MAAM,cAAc,iBAAiB,KAAK,WAAW;IAAE,IAAI,OAAO;IAAS,OAAO,EAAE,oBAAoB,EAAE,OAAO,eAAe,GAAG,kBAAkB,KAAK,EAAE,CAAC;GAAE,EAAE;GACjK,MAAM,kBAAA,GAAiBC,MAAAA,YAAAA,EAAa,OAAe;IACjD,IAAI,iBAAiB,GAAG,WAAW,MAAM,GAAG,OAAO,WAAW,GAAG,MAAM,CAAC,CAAC;GAC3E,GAAG,CAAC,eAAe,MAAM,CAAC;GAC1B,MAAM,sBAAA,GAAqBA,MAAAA,YAAAA,EAAa,SAAkC;IACxE,iBAAiB,eAAe,SAAS,eAAe,eAAe;IACvE,WAAW,WAAW;KAAE,MAAM;KAAY;KAAM,UAAU,MAAM,OAAO;IAAe,CAAC;IACvF,OAAO,YAAY;GACrB,GAAG;IAAC;IAAQ;IAAO;IAAY,WAAW;GAAU,CAAC;GASrD,MAAM,SAAS,iBAAiB;IAC9B;IACA;IACA;IACA,UAAU;IACV;IACA;IACA,YAdI,GAAmBA,MAAAA,YAAAA,EAAa,OAAe;KACnD,iBAAiB,eAAe,KAAK;KAErC,MAAM,QAAQ,iBAAiB,EAAE,CAAC,EAAE;KACpC,oBAAoB,aAAa;MAAE;MAAI;MAAO,QAAQ,SAAS,SAAS,KAAK;KAAE,EAAE;IACnF,GAAG,CAAC,UAAU,CASD;IACX,YAAY,WAAW;IACvB,qBAAqB;IACrB,YAAY,EAAE,2BAA2B;IACzC,iBAAiB,EAAE,2BAA2B;GAChD,CAAC;GACD,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;IAAS,WAAWC,4BAAG;IAAS,cAAY,EAAE,eAAe;IAC3D,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,yBAAD;KACS;KACJ;KACH,OAAM;KACN,QAAQ,MAAM;KACd,sBAAsB,MAAM,aAAa,SAAS;KAClD,gBAAgB,OAAO,WAAW,iBAAiB,MAAM,UAAU,UAAU,UAAU,KAAK,UAAU;KACvF;KACf,qBAAqB;MAAE,iBAAiB,KAAK;MAAG,iBAAiB,KAAK;KAAE;KACxE,iBAAiB,OAAO;KACxB,aAAa,OAAO;KACpB,aAAa,OAAO;KACpB,gBACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,qBAAD;MACS;MACJ;MACH,WAAW,OAAO;MAClB,YAAY;MACZ,eAAA;MACA,eAAe;MACf,qBAAqB;KACtB,CAAA;KAEH,aAAa,OAAO;KACR;KACZ,oBAAoB;KACX;KACT,iBAAiB;KACjB,qBAAqB,OAAO;KAC5B,kBAAkB,OAAO;KACzB,sBAAsB,OAAO;IAC9B,CAAA;GACM,CAAA,GACR,OAAO,QACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD;IACK;IACH,WAAW,OAAO;IAClB,WAAW,OAAO,YAAY,CAAC,IAAI,OAAO;IAC1C,OAAO,OAAO;IACd,eAAe,OAAO,UAAU,KAAA,IAAY,OAAO,gBAAgB,KAAA;IACnE,QAAQ,OAAO;IACf,YAAY;IACZ,SAAS,OAAO;GACjB,CAAA,CAEH,EAAA,CAAA;EAEN,CAAC;;;;;;;EC1HD,MAAa,kBAGR;GACH;IACE,IAAI;IACJ,UAAU;GACZ;GACA;IACE,IAAI;IACJ,UAAU;GACZ;GACA;IACE,IAAI;IACJ,UAAU;GACZ;GACA;IACE,IAAI;IACJ,UAAU;GACZ;GACA;IACE,IAAI;IACJ,UAAU;GACZ;GACA;IACE,IAAI;IACJ,UAAU;GACZ;EACF;EAEA,MAAa,qBAAqB,gBAAgB,KAAK,SAAS,KAAK,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;EChCvE,SAAgB,oBAAoB,OAA4G;GAC9I,MAAM,UAAA,GAASC,MAAAA,OAAAA,CAAuB,IAAI;GAC1C,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,OAAO,SAAS,cAAc,0BAAwB,CAAC,EAAE,eAAe;KAAE,OAAO;KAAW,QAAQ;IAAU,CAAC;GACjH,GAAG,CAAC,MAAM,IAAI,CAAC;GACf,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,WAAWC,mCAAI;IAClB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,KAAK;KAAQ,WAAWA,mCAAI;KAAK,MAAK;KAAU,cAAY,MAAM,EAAE,UAAU;KAChF,UAAA,gBAAgB,KAAK,SAAS;MAC7B,MAAM,SAAS,MAAM,SAAS,KAAK;MACnC,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;OAEE,IAAI,oBAAoB,KAAK;OAC7B,MAAK;OACL,MAAK;OACL,UAAU,SAAS,IAAI;OACvB,iBAAe;OACf,iBAAe,sBAAsB,KAAK;OAC1C,eAAa,SAAS,KAAK,KAAA;OAC3B,eAAe,MAAM,SAAS,KAAK,EAAE;OACrC,WAAW,cAAc,oBAAoB,MAAM,MAAM,MAAM,QAAQ;OAEvE,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAM,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,MAAM,EAAE,KAAK,QAAQ,EAAU,CAAA,EAAO,CAAA;MAC/C,GAZD,KAAK,EAYJ;KAEZ,CAAC;IACE,CAAA;GACF,CAAA;EAET;;;EC1BA,SAAgB,eAAe,OAWjB;GACZ,MAAM,EAAE,OAAO,MAAM;GACrB,MAAM,aAAA,GAAYC,MAAAA,OAAAA,CAAoB,IAAI;GAC1C,MAAM,eAAA,GAAcA,MAAAA,OAAAA,CAAe;GACnC,MAAM,iBAAA,GAAgBA,MAAAA,OAAAA,CAAO,MAAM,SAAS;GAC5C,MAAM,YAAY,MAAM,aAAa,MAAM;GAC3C,MAAM,eAAe,MAAM,OAAO,cAAc,QAAQ,WAAW,OAAO,YAAY,KAAK,CAAC,CAAC;GAE7F,MAAM,gBAAgB,MAAM,SAAS,gBAAgB,MAAM,SAAS;GACpE,MAAM,iBAAiB,iBAAiB,MAAM,WAAW,MAAM,KAAK,OAAO,WAAW;GACtF,MAAM,aAAa,iBAAiB,CAAC,MAAM,WAAW,MAAM,KAAK,OAAO,WAAW,KAAK,MAAM,eAAe;GAC7G,CAAA,GAAA,MAAA,gBAAA,OAAsB;IACpB,MAAM,SAAS,UAAU;IACzB,IAAI,YAAY,YAAY,WAAW,YAAY,UAAU,KAAA;IAC7D,IAAI,WAAW,QAAQ,kBAAkB,MAAM,iBAAiB,OAAO;IACvE,MAAM,aAAa,MAAM,cAAc,cAAc;IACrD,IAAI,YAAY,YAAY,aAAa,CAAC,YAAY;IACtD,YAAY,UAAU,KAAA;IACtB,MAAM,QAAQ,4BAA4B;KACxC,OAAO,YAAY,aAAa,IAAK,MAAM,iBAAiB,IAAI,SAAS,KAAK;KAC9E,IAAI,YAAY,OAAO,cAA2B,mCAAiC,CAAC,EAAE,MAAM,EAAE,eAAe,KAAK,CAAC;KACnH,cAAc,UAAU,MAAM;KAC9B,YAAY,UAAU;IACxB,CAAC;IACD,aAAa,qBAAqB,KAAK;GACzC,GAAG;IAAC;IAAW;IAAgB,MAAM;IAAc,MAAM;IAAiB,MAAM;GAAS,CAAC;GAC1F,CAAA,GAAA,MAAA,gBAAA,OAAsB;IACpB,MAAM,SAAS,UAAU;IACzB,MAAM,UAAU,QAAQ,cAA2B,yBAAyB;IAC5E,IAAI,UAAU,MAAM;IACpB,IAAI,WAAW,MAAM;KAAE,OAAO,MAAM,YAAY,sBAAsB,KAAK;KAAG;IAAO;IACrF,MAAM,gBAAsB;KAC1B,MAAM,SAAS,QAAQ,sBAAsB,CAAC,CAAC;KAE/C,MAAM,WAAW,SAAS,KAAK,OAAO;KACtC,OAAO,QAAQ,iBAAiB,OAAO,QAAQ;KAC/C,OAAO,MAAM,YAAY,sBAAsB,GAAG,WAAW,IAAI,OAAO,GAAG;IAC7E;IACA,MAAM,WAAW,IAAI,eAAe,OAAO;IAC3C,SAAS,QAAQ,OAAO;IACxB,SAAS,QAAQ,MAAM;IACvB,QAAQ;IACR,aAAa,SAAS,WAAW;GACnC,GAAG,CAAC,WAAW,cAAc,CAAC;GAC9B,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWC,mCAAI;IAApB,UAAA;KACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;MAAQ,WAAWA,mCAAI;MAAvB,UAAA;OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,mCAAI;QAApB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;SAAM,WAAWA,mCAAI;SAAW,eAAY;SAAO,UAAA;QAAO,CAAA,GAC1D,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD,EAAA,UAAK,EAAE,WAAW,EAAM,CAAA,CACrB;;OACL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;QAAK,WAAWA,mCAAI;QAApB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD,EAAW,MAAM,MAAM,UAAU,YAAY,UAAY,CAAA,GACzD,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAA,UAAO,MAAM,UACT,EAAE,aAAa,IACf,EAAE,qBAAqB;SAAE,SAAS,MAAM,OAAO,cAAc;SAAQ,SAAS;QAAa,CAAC,EAAQ,CAAA,CACrG;;OACL,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;QAAQ,MAAK;QAAS,WAAWA,mCAAI;QAAY,SAAS,MAAM;QAAU,UAAA,EAAE,gBAAgB;OAAU,CAAA;MAChG;;KAER,iBAAA,GAAA,kBAAA,IAAA,CAAC,qBAAD;MAAqB,MAAM,MAAM;MAAM,WAAW,SAAS;OACzD,IAAI,UAAU,YAAY,QAAQ,YAAY,YAAY,WAAW,MAAM,iBAAiB,IAAI,WAAW,UAAU,QAAQ,SAAS;OACtI,MAAM,aAAa,IAAI;MACzB;MAAM;KAAI,CAAA;KAEV,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD;MAAM,KAAK;MAAW,WAAWA,mCAAI;MAAQ,yBAAA;MAAsB,WAAW,UAAU;OACtF,IAAI,YAAY,YAAY,WAAW,MAAM,iBAAiB,IAAI,WAAW,MAAM,cAAc,SAAS;MAC5G;MACG,UAAA,gBAAgB,KAAK,SAAS;OAC7B,MAAM,SAAS,KAAK,OAAO,MAAM;OACjC,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;QAEE,IAAI,sBAAsB,KAAK;QAC/B,MAAK;QACL,mBAAiB,oBAAoB,KAAK;QAC1C,UAAU,SAAS,IAAI,KAAA;QACvB,QAAQ,CAAC;QAER,UAAA,UACC,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACG,aAAa,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;SAAK,WAAWC,4BAAG;SAAnB,UAAA,CACZ,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;UAAG,WAAWA,4BAAG;UAAa,MAAK;UAAU,UAAA,MAAM;SAAU,CAAA,GAC7D,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;UAAQ,MAAK;UAAS,WAAWA,4BAAG;UAAY,eAAe,KAAK,MAAM,KAAK;UAAI,UAAA,EAAE,iBAAiB;SAAU,CAAA,CAC7G;QAAI,CAAA,IAAA,iBACP,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;SAAK,aAAU;SAAO,cAAY,EAAE,aAAa;SAC/C,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;UAAK,WAAW,MAAM,SAAS,YAAYA,4BAAG,aAAaA,4BAAG;UAAe,eAAY;UACtF,UAAA;WAAC;WAAG;WAAG;WAAG;UAAC,CAAC,CAAC,KAAK,QAAQ,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD,EAAe,WAAWA,4BAAG,YAAc,GAAjC,GAAiC,CAAC;SACpE,CAAA;QACF,CAAA,IACH,MAAM,UACT,MAAM,UAAU,CAAC,cAAc,MAAM,SAAS,cAAc,MAAM,SAAS,cAAc,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;SAAG,WAAW,KAAKA,4BAAG,QAAQ,MAAM,eAAe,WAAWA,4BAAG,WAAW;SAAG,MAAK;SAAU,UAAA,MAAM;QAAU,CAAA,CACxM,EAAA,CAAA;OAED,GAtBE,KAAK,EAsBP;MAET,CAAC;KACG,CAAA;IACH;;EAET;;;EC9GA,SAAgB,6BAA6B;GAC3C,OAAO;IACL,yBAAS,IAAI,IAA8B;IAC3C,wBAAQ,IAAI,IAAoB;IAChC,QAAQ;KAAE,OAAO;KAAI,QAAQ;IAAwB;IACrD,OAAO;KAAE,OAAO;KAAI,YAAY;KAAI,UAAU,CAAC;IAA6B;GAC9E;EACF;EAEA,SAAgB,iBAAiB,OAAsD,KAA+B;GACpH,IAAI,QAAQ,MAAM,QAAQ,IAAI,GAAG;GACjC,IAAI,UAAU,KAAA,GAAW;IACvB,QAAQ;KAAE,QAAQ;KAAI,YAAY;KAAO,mBAAmB;IAAM;IAClE,MAAM,QAAQ,IAAI,KAAK,KAAK;GAC9B;GACA,OAAO;EACT;;;ECFA,SAAgB,gBAAgB,OAAwC;GACtE,MAAM,EAAE,MAAM;GACd,MAAM,QAAQ,mBAAmB,MAAM,KAAK,MAAM,QAAQ;GAC1D,MAAM,CAAC,MAAM,YAAA,GAAWC,MAAAA,SAAAA,CAAwB,UAAU;GAC1D,MAAM,UAAA,GAASC,MAAAA,OAAAA,CAAO,2BAA2B,CAAC,CAAC,CAAC;GACpD,MAAM,CAAC,WAAW,iBAAA,GAAgBD,MAAAA,SAAAA,CAAS,CAAC;GAC5C,MAAM,CAAC,WAAW,iBAAA,GAAgBA,MAAAA,SAAAA,CAAwB;GAC1D,MAAM,cAAc,WAAgC;IAClD,IAAI,WAAW,MAAM,aAAa,KAAA,CAAS;IAC3C,QAAQ,MAAM;GAChB;GACA,MAAM,aAAA,GAAYE,MAAAA,YAAAA,OAAkB,aAAa,IAAI,GAAG,CAAC,IAAI,CAAC;GAC9D,MAAM,YAAY,WAAgC;IAChD,WAAW,MAAM;IACjB,cAAc,UAAU,QAAQ,CAAC;GACnC;GACA,MAAM,WAAW,MAAM,OAAO;GAC9B,MAAM,YAAY,SAAS,cAAc,SAAS,aAAa,GAAG,KAAK,GAAG,aAAa;GACvF,MAAM,QAAA,GAAOC,MAAAA,qBAAAA,CACX,MAAM,WAAW,WACjB,MAAM,WAAW,aACjB,MAAM,WAAW,WACnB,CAAC,CAAC;GAEF,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,MAAM,MAAW,KAAK;GAC5B,GAAG,CAAC,MAAM,MAAM,IAAI,CAAC;GAErB,MAAM,UAAU,SAAS,aACrB,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD;IAAuC;IAAU;IAAG,QAAQ,iBAAiB,QAAQ,SAAS;IAAG,YAAY;GAAW,GAAlG,QAAkG,IACxH,SAAS,aACP,iBAAA,GAAA,kBAAA,IAAA,CAAC,cAAD;IAAoC;IAAU;IAAG,QAAQ,iBAAiB,QAAQ,SAAS;IAAG,YAAY;GAAW,GAAlG,QAAkG,IACrH,SAAS,UACP,iBAAA,GAAA,kBAAA,IAAA,CAAC,kBAAD;IAAkB,KAAK,MAAM;IAAe;IAAa;IAAG,QAAQ,OAAO;IAAO,YAAY;IAAU,SAAS;GAAY,CAAA,IAC7H,SAAS,WACP,iBAAA,GAAA,kBAAA,IAAA,CAAC,YAAD;IAAmB;IAAO,KAAK,MAAM;IAAQ;IAAG,QAAQ,OAAO;GAAS,CAAA,IACxE,SAAS,YACP,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;IAAoB;IAAU;GAAI,CAAA,IAClC,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD;IAAuB;IAAU;IAAG,SAAS;GAAY,CAAA;GAErE,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,gBAAD;IACS;IACD;IACH;IACH,cAAc;IACH;IACX,iBAAiB,OAAO;IACb;IACX,cAAc,SAAS,gBAAgB,SAAS,WAAW,cAAc;IACzE,SAAS,MAAM;IAEd,UAAA;GACa,CAAA;EAEpB;;;;EC7DA,MAAa,kBAAgC;GAAE,GAAG;GAAI,GAAG;EAAG;EAQ5D,MAAM,cAAc;;EAEpB,MAAM,qBAAqB;;EAG3B,SAAS,UAAU,OAAe,OAAuB;GACvD,MAAM,MAAM,KAAK,IAAI,GAAG,QAAA,CAAyB;GAEjD,OAAO,KAAK,IAAI,KAAK,IAAI,OADb,KAAK,IAAA,GAAuB,GACN,CAAC,GAAG,GAAG;EAC3C;;;;;EAMA,SAAgB,WACd,OACA,QACA,OAA+B,CAAC,GAClB;GACd,MAAM,QAAQ,KAAK,SAAA;GACnB,MAAM,SAAS,KAAK,UAAA;GACpB,OAAO;IACL,GAAG,UAAU,MAAM,GAAG,OAAO,QAAQ,KAAK;IAC1C,GAAG,UAAU,MAAM,GAAG,OAAO,SAAS,MAAM;GAC9C;EACF;;EAGA,SAAgB,cAAc,OAAqB,SAAgC;GACjF,OAAO,KAAK,IAAI,QAAQ,IAAI,MAAM,CAAC,IAAA,KAAyB,KAAK,IAAI,QAAQ,IAAI,MAAM,CAAC,IAAA;EAC1F;EAEA,SAAgB,4BAAsD;GACpE,IAAI;IACF,MAAM,MAAM,OAAO,aAAa,QAAQ,WAAW,KAAK,OAAO,aAAa,QAAQ,kBAAkB;IACtG,IAAI,QAAQ,MAAM,OAAO,KAAA;IACzB,MAAM,SAAkB,KAAK,MAAM,GAAG;IACtC,IAAI,WAAW,QAAQ,OAAO,WAAW,UAAU,OAAO,KAAA;IAC1D,MAAM,SAAS;IACf,IAAI,OAAO,OAAO,MAAM,YAAY,OAAO,OAAO,MAAM,UAAU,OAAO,KAAA;IACzE,IAAI,CAAC,OAAO,SAAS,OAAO,CAAC,KAAK,CAAC,OAAO,SAAS,OAAO,CAAC,GAAG,OAAO,KAAA;IACrE,OAAO;KAAE,GAAG,OAAO;KAAG,GAAG,OAAO;IAAE;GACpC,QAAQ;IACN;GACF;EACF;EAEA,SAAgB,qBAAqB,OAA2B;GAC9D,IAAI;IACF,OAAO,aAAa,QAAQ,aAAa,KAAK,UAAU;KAAE,GAAG,KAAK,MAAM,MAAM,CAAC;KAAG,GAAG,KAAK,MAAM,MAAM,CAAC;IAAE,CAAC,CAAC;GAC7G,QAAQ,CAER;EACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;EC5DA,SAAgB,gBAAgB,OAAkJ;GAChL,MAAM,EAAE,YAAY,YAAY,MAAM;GAEtC,MAAM,qBAAqB;GAC3B,MAAM,QAAA,GAAOC,MAAAA,qBAAAA,CAAqB,WAAW,WAAW,WAAW,aAAa,WAAW,WAAW,CAAC,CAAC;GAExG,MAAM,YAAA,GAAWC,MAAAA,OAAAA,CAAiC,IAAI;GACtD,MAAM,CAAC,UAAU,gBAAA,GAAeC,MAAAA,SAAAA,OAA6B,0BAA0B,KAAK,eAAe;GAC3G,MAAM,WAAA,GAAUD,MAAAA,OAAAA,CAA8G,IAAI;GAClI,MAAM,oBAAA,GAAmBA,MAAAA,OAAAA,CAAO,KAAK;GAGrC,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,wBAA8B;KAClC,aAAa,YAAY;MACvB,MAAM,OAAO,SAAS,SAAS,sBAAsB;MACrD,MAAM,OAAO,WACX,SACA;OAAE,OAAO,OAAO;OAAY,QAAQ,OAAO;MAAY,GACvD,SAAS,KAAA,IAAY,CAAC,IAAI;OAAE,OAAO,KAAK;OAAO,QAAQ,KAAK;MAAO,CACrE;MACA,OAAO,KAAK,MAAM,QAAQ,KAAK,KAAK,MAAM,QAAQ,IAAI,UAAU;KAClE,CAAC;IACH;IACA,gBAAgB;IAChB,OAAO,iBAAiB,UAAU,eAAe;IACjD,aAAa,OAAO,oBAAoB,UAAU,eAAe;GACnE,GAAG,CAAC,CAAC;GAEL,MAAM,iBAAA,GAAgBE,MAAAA,YAAAA,EAAa,UAAgD;IACjF,IAAI,MAAM,WAAW,GAAG;IACxB,QAAQ,UAAU;KAChB,WAAW,MAAM;KACjB,cAAc;MAAE,GAAG,MAAM;MAAS,GAAG,MAAM;KAAQ;KACnD,eAAe;KACf,OAAO;IACT;GACF,GAAG,CAAC,QAAQ,CAAC;GAEb,MAAM,iBAAA,GAAgBA,MAAAA,YAAAA,EAAa,UAAgD;IACjF,MAAM,OAAO,QAAQ;IACrB,IAAI,SAAS,QAAQ,KAAK,cAAc,MAAM,WAAW;IACzD,MAAM,QAAQ;KAAE,GAAG,MAAM,UAAU,KAAK,aAAa;KAAG,GAAG,MAAM,UAAU,KAAK,aAAa;IAAE;IAC/F,IAAI,CAAC,KAAK,SAAS,CAAC,cAAc,KAAK,cAAc;KAAE,GAAG,MAAM;KAAS,GAAG,MAAM;IAAQ,CAAC,GAAG;IAC9F,IAAI,CAAC,KAAK,OAAO;KACf,KAAK,QAAQ;KAEb,MAAM,cAAc,kBAAkB,MAAM,SAAS;IACvD;IACA,YAAY,WACV;KAAE,GAAG,KAAK,cAAc,IAAI,MAAM;KAAG,GAAG,KAAK,cAAc,IAAI,MAAM;IAAE,GACvE;KAAE,OAAO,OAAO;KAAY,QAAQ,OAAO;IAAY,GACvD;KAAE,OAAO,MAAM,cAAc;KAAa,QAAQ,MAAM,cAAc;IAAa,CACrF,CAAC;GACH,GAAG,CAAC,CAAC;GAEL,MAAM,WAAA,GAAUA,MAAAA,YAAAA,EAAa,UAAgD;IAC3E,MAAM,OAAO,QAAQ;IACrB,IAAI,SAAS,QAAQ,KAAK,cAAc,MAAM,WAAW;IACzD,QAAQ,UAAU;IAClB,IAAI,CAAC,KAAK,OAAO;IACjB,iBAAiB,UAAU;IAE3B,IAAI,MAAM,cAAc,kBAAkB,MAAM,SAAS,GAAG,MAAM,cAAc,sBAAsB,MAAM,SAAS;IACrH,aAAa,YAAY;KACvB,qBAAqB,OAAO;KAC5B,OAAO;IACT,CAAC;GACH,GAAG,CAAC,CAAC;GAEL,MAAM,WAAA,GAAUA,MAAAA,YAAAA,OAAkB;IAEhC,IAAI,iBAAiB,SAAS;KAC5B,iBAAiB,UAAU;KAC3B;IACF;IACA,WAAW,OAAO;GACpB,GAAG,CAAC,UAAU,CAAC;GAEf,MAAM,QAAQ;IAAE,MAAM,GAAG,SAAS,EAAE;IAAK,KAAK,GAAG,SAAS,EAAE;GAAI;GAChE,MAAM,QAAQ,OAAO,EAAE,WAAW,IAAI,EAAE,UAAU;GAClD,OACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;IAAK,WAAWC,6BAAI;IAAsB,iBAAc;IAAgC;IACtF,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,aAAD;KAAoB;KAClB,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MACE,MAAM,SAAmC;OACvC,SAAS,UAAU;OACnB,IAAI,uBAAuB,KAAA,GAAW,mBAAmB,UAAU;MACrE;MACA,MAAK;MACL,WAAWA,6BAAI;MACf,aAAW,OAAO,KAAK,KAAA;MACvB,mBAAgB;MAChB,iBAAc;MACd,cAAY;MACZ,gBAAc;MACd,iBAAe;MACf,iBAAc;MACC;MACA;MACf,aAAa;MACb,iBAAiB;MACR;MAET,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;OAAK,SAAQ;OAAY,OAAM;OAAK,QAAO;OAAK,MAAK;OAAO,QAAO;OAAe,aAAY;OAAM,eAAc;OAAQ,gBAAe;OAAQ,eAAY;OAC3J,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,QAAD,EAAM,GAAE,mDAAoD,CAAA;MACzD,CAAA;KACC,CAAA;IACG,CAAA;GACV,CAAA;EAET;;;;ECxHA,SAAgB,iBAAiB,OAAgC;GAC/D,MAAM,EAAE,YAAY,KAAK,UAAU,MAAM;GACzC,MAAM,QAAA,GAAOC,MAAAA,qBAAAA,CAAqB,WAAW,WAAW,WAAW,aAAa,WAAW,WAAW,CAAC,CAAC;GACxG,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,IAAI,CAAC,MAAM;IACX,MAAM,SAAS,UAA+B;KAC5C,IAAI,MAAM,QAAQ,YAAY,CAAC,MAAM,kBAAkB;MAAE,MAAM,eAAe;MAAG,WAAW,MAAM;KAAE;IACtG;IAEA,MAAM,WAAW,UAAuB;KACtC,MAAM,SAAU,MAA+B;KAC/C,IAAI,WAAW,eAAe,WAAW,OAAO,WAAW,MAAM;IACnE;IACA,SAAS,iBAAiB,WAAW,KAAK;IAC1C,SAAS,iBAAiB,sBAAsB,OAAO;IACvD,SAAS,cAAc,IAAI,YAAY,sBAAsB,EAAE,QAAQ,cAAc,CAAC,CAAC;IACvF,aAAa;KACX,SAAS,oBAAoB,WAAW,KAAK;KAC7C,SAAS,oBAAoB,sBAAsB,OAAO;IAC5D;GACF,GAAG,CAAC,MAAM,UAAU,CAAC;GAGrB,MAAM,cAAA,GAAaC,MAAAA,OAAAA,CAA0B,IAAI;GACjD,MAAM,aAAA,GAAYA,MAAAA,OAAAA,CAAoB,IAAI;GAC1C,MAAM,eAAA,GAAcA,MAAAA,OAAAA,CAAO,IAAI;GAC/B,CAAA,GAAA,MAAA,UAAA,OAAgB;IACd,MAAM,UAAU,YAAY;IAC5B,YAAY,UAAU;IACtB,IAAI,CAAC,WAAW,MAAM,UAAU,SAAS,MAAM;IAC/C,IAAI,WAAW,CAAC,MAAM,WAAW,SAAS,MAAM;GAClD,GAAG,CAAC,IAAI,CAAC;;;;GAIT,MAAM,mBAAmB,UAAiD;IACxE,IAAI,MAAM,QAAQ,SAAS,UAAU,YAAY,MAAM;IACvD,MAAM,SAAS,SAAS;IACxB,IAAI,EAAE,kBAAkB,gBAAgB,CAAC,UAAU,QAAQ,SAAS,MAAM,GAAG;IAC7E,MAAM,aAAa,CAAC,GAAG,UAAU,QAAQ,iBAA8B,SAAS,CAAC,CAAC,CAC/E,QAAQ,YAAY,CAAC,QAAQ,aAAa,UAAU,KAAK,QAAQ,eAAe,CAAC,CAAC,SAAS,CAAC;IAC/F,MAAM,OAAO,qBAAqB,WAAW,QAAQ,WAAW,QAAQ,MAAM,GAAG,MAAM,QAAQ;IAC/F,IAAI,SAAS,KAAA,GAAW;IACxB,MAAM,eAAe;IACrB,WAAW,KAAK,EAAE,MAAM;GAC1B;GACA,MAAM,UAAU,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD;IAA6B;IAAwB;IAAe;GAAI,CAAA;GAIxF,MAAM,SACJ,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;IAAK,WAAWC,6BAAI;IAAa,aAAW,OAAO,KAAK,KAAA;IAAxD,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,OAAD;KAAK,WAAWA,6BAAI;KAAgB,eAAe,WAAW,MAAM;KAAG,eAAY;IAAQ,CAAA,GAC3F,iBAAA,GAAA,kBAAA,IAAA,CAAC,WAAD;KAAS,IAAG;KAAsB,KAAK;KAAW,WAAWA,6BAAI;KAAa,iBAAc;KAAmB,MAAK;KAAS,cAAW;KAAO,cAAY,EAAE,eAAe;KAAG,UAAU;KAAI,WAAW;KACtM,UAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,iBAAD;MAAsB;MAAe;MAAsB;MAAe;MAAG,eAAe,WAAW,MAAM;KAAI,CAAA;IAC1G,CAAA,CACN;;GAEP,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAA,kBAAA,UAAA,EAAA,UAAA,CACG,OAAO,aAAa,eAAe,SAAS,SAAS,OAAO,WAAA,GAAUC,UAAAA,aAAAA,CAAa,SAAS,SAAS,IAAI,GACzG,OAAO,aAAa,eAAe,SAAS,SAAS,OAAO,UAAA,GAASA,UAAAA,aAAAA,CAAa,QAAQ,SAAS,IAAI,CACxG,EAAA,CAAA;EAEN;;;;;;;;;ECtEA,MAAa,YAAY;GAEvB,yBAAyB;GACzB,uBAAuB;GACvB,yBAAyB;GACzB,mBAAmB;GACnB,qBAAqB;GACrB,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,mBAAmB;GACnB,+BAA+B;GAC/B,2BAA2B;GAC3B,8BAA8B;GAC9B,0BAA0B;GAC1B,wBAAwB;GACxB,iCAAiC;GACjC,6BAA6B;GAC7B,2BAA2B;GAC3B,kBAAkB;GAClB,uBAAuB;GACvB,sBAAsB;GACtB,wBAAwB;GACxB,wBAAwB;GACxB,0BAA0B;GAC1B,uBAAuB;GACvB,mBAAmB;GACnB,mBAAmB;GACnB,yBAAyB;GACzB,wCAAwC;GACxC,4BAA4B;GAC5B,mCAAmC;GAGnC,cAAc;GACd,8BAA8B;GAC9B,YAAY;GACZ,aAAa;GACb,uBAAuB;GACvB,0BAA0B;GAC1B,kCAAkC;GAGlC,wBAAwB;GACxB,yBAAyB;GACzB,6BAA6B;GAC7B,4BAA4B;GAC5B,+BAA+B;GAC/B,+BAA+B;GAC/B,0BAA0B;GAC1B,2BAA2B;GAC3B,gCAAgC;GAChC,8BAA8B;GAE9B,6BAA6B;GAC7B,6BAA6B;GAE7B,oCAAoC;GACpC,oCAAoC;GACpC,qCAAqC;GAErC,iCAAiC;GACjC,4BAA4B;GAC5B,gCAAgC;GAChC,uBAAuB;GACvB,2BAA2B;GAC3B,uBAAuB;GACvB,4BAA4B;GAC5B,wBAAwB;GACxB,6BAA6B;GAC7B,4BAA4B;EAC9B;EAEA,MAAa,YAAoD;GAC/D,yBAAyB;GACzB,uBAAuB;GACvB,yBAAyB;GACzB,mBAAmB;GACnB,qBAAqB;GACrB,sBAAsB;GACtB,sBAAsB;GACtB,uBAAuB;GACvB,mBAAmB;GACnB,+BAA+B;GAC/B,2BAA2B;GAC3B,8BAA8B;GAC9B,0BAA0B;GAC1B,wBAAwB;GACxB,iCAAiC;GACjC,6BAA6B;GAC7B,2BAA2B;GAC3B,kBAAkB;GAClB,uBAAuB;GACvB,sBAAsB;GACtB,wBAAwB;GACxB,wBAAwB;GACxB,0BAA0B;GAC1B,uBAAuB;GACvB,mBAAmB;GACnB,mBAAmB;GACnB,yBAAyB;GACzB,wCAAwC;GACxC,4BAA4B;GAC5B,mCAAmC;GAEnC,cAAc;GACd,8BAA8B;GAC9B,YAAY;GACZ,aAAa;GACb,uBAAuB;GACvB,0BAA0B;GAC1B,kCAAkC;GAElC,wBAAwB;GACxB,yBAAyB;GACzB,6BAA6B;GAC7B,4BAA4B;GAC5B,+BAA+B;GAC/B,+BAA+B;GAC/B,0BAA0B;GAC1B,2BAA2B;GAC3B,gCAAgC;GAChC,8BAA8B;GAE9B,6BAA6B;GAC7B,6BAA6B;GAC7B,oCAAoC;GACpC,oCAAoC;GACpC,qCAAqC;GACrC,iCAAiC;GACjC,4BAA4B;GAC5B,gCAAgC;GAChC,uBAAuB;GACvB,2BAA2B;GAC3B,uBAAuB;GACvB,4BAA4B;GAC5B,wBAAwB;GACxB,6BAA6B;GAC7B,4BAA4B;EAC9B;;;;;;;;;;;;;;;ECrIA,MAAa,aAAa;GACxB,yBAAyB;GACzB,+BAA+B;GAC/B,0BAA0B;GAC1B,oBAAoB;GACpB,oBAAoB;GACpB,0BAA0B;GAC1B,oBAAoB;GACpB,0BAA0B;GAC1B,wBAAwB;GACxB,2BAA2B;GAC3B,oBAAoB;GACpB,qBAAqB;GACrB,sBAAsB;GACtB,gBAAgB;GAChB,wBAAwB;GACxB,wBAAwB;GACxB,4BAA4B;GAC5B,6BAA6B;GAC7B,qCAAqC;GACrC,iCAAiC;GACjC,qBAAqB;GACrB,gCAAgC;GAChC,iCAAiC;GACjC,wBAAwB;GACxB,wBAAwB;GACxB,mBAAmB;GACnB,yBAAyB;GACzB,yBAAyB;GACzB,+BAA+B;GAC/B,gCAAgC;GAChC,0BAA0B;GAC1B,yBAAyB;GACzB,uBAAuB;GACvB,0BAA0B;GAC1B,6BAA6B;GAC7B,2BAA2B;GAC3B,wBAAwB;GACxB,mBAAmB;GAEnB,uBAAuB;GACvB,yBAAyB;GACzB,gBAAgB;GAChB,oBAAoB;GACpB,sBAAsB;GACtB,gBAAgB;GAChB,kBAAkB;GAClB,uBAAuB;GACvB,8BAA8B;GAC9B,qBAAqB;GACrB,oBAAoB;GACpB,0BAA0B;GAC1B,uBAAuB;GACvB,sBAAsB;GACtB,yBAAyB;GACzB,uBAAuB;GACvB,2BAA2B;GAC3B,wBAAwB;GACxB,gCAAgC;GAChC,gCAAgC;GAChC,iCAAiC;GACjC,gCAAgC;GAChC,iCAAiC;GACjC,sBAAsB;GACtB,wBAAwB;GACxB,yBAAyB;GACzB,2BAA2B;GAC3B,gCAAgC;GAChC,+BAA+B;GAC/B,2BAA2B;GAC3B,0BAA0B;GAC1B,6BAA6B;GAC7B,4BAA4B;GAC5B,mBAAmB;GACnB,2BAA2B;GAC3B,iCAAiC;GACjC,wBAAwB;GACxB,6BAA6B;GAC7B,6BAA6B;GAC7B,gCAAgC;GAChC,+BAA+B;GAC/B,mCAAmC;GACnC,qCAAqC;GACrC,yBAAyB;GACzB,0BAA0B;GAC1B,uBAAuB;GACvB,uBAAuB;GACvB,uBAAuB;GACvB,0BAA0B;GAG1B,iBAAiB;GACjB,mBAAmB;GACnB,oBAAoB;GACpB,mBAAmB;GACnB,eAAe;GACf,iBAAiB;GACjB,kBAAkB;GAClB,eAAe;GACf,sBAAsB;GACtB,eAAe;GACf,sBAAsB;GACtB,oBAAoB;GACpB,mBAAmB;GACnB,mBAAmB;GACnB,4BAA4B;GAC5B,uBAAuB;GACvB,wBAAwB;GACxB,0BAA0B;GAC1B,6BAA6B;GAC7B,yBAAyB;GACzB,iBAAiB;GACjB,mBAAmB;GAGnB,sBAAsB;GACtB,yBAAyB;GACzB,8BAA8B;GAC9B,6BAA6B;GAC7B,4BAA4B;GAC5B,2BAA2B;GAC3B,sBAAsB;GACtB,sBAAsB;GACtB,wBAAwB;GACxB,yBAAyB;GACzB,oBAAoB;GACpB,wBAAwB;GACxB,yBAAyB;GACzB,wBAAwB;GACxB,4BAA4B;GAC5B,2BAA2B;GAC3B,uBAAuB;GACvB,0BAA0B;GAC1B,iBAAiB;GACjB,gBAAgB;GAChB,mBAAmB;GACnB,kBAAkB;GAClB,oBAAoB;GACpB,mBAAmB;GACnB,uBAAuB;GACvB,sBAAsB;GACtB,mBAAmB;GACnB,kBAAkB;GAClB,mBAAmB;GACnB,kBAAkB;GAClB,uBAAuB;GACvB,sBAAsB;GACtB,oBAAoB;GACpB,mBAAmB;GACnB,oBAAoB;GACpB,mBAAmB;GACnB,qBAAqB;GACrB,yBAAyB;GACzB,wBAAwB;GACxB,uBAAuB;GACvB,qBAAqB;GACrB,oBAAoB;GACpB,kBAAkB;GAClB,0BAA0B;GAC1B,sBAAsB;GACtB,4BAA4B;GAC5B,oBAAoB;GACpB,mBAAmB;GACnB,wBAAwB;GACxB,uBAAuB;GACvB,qBAAqB;GACrB,oBAAoB;GACpB,wBAAwB;GACxB,uBAAuB;GACvB,uBAAuB;GACvB,sBAAsB;GACtB,yBAAyB;GACzB,wBAAwB;GACxB,mBAAmB;GACnB,kBAAkB;GAClB,kBAAkB;GAClB,wBAAwB;GACxB,0BAA0B;GAC1B,sBAAsB;GACtB,mBAAmB;GACnB,mBAAmB;GACnB,kBAAkB;GAClB,yBAAyB;GACzB,wBAAwB;GACxB,mBAAmB;GACnB,kBAAkB;GAClB,sBAAsB;GACtB,qBAAqB;GACrB,2BAA2B;GAC3B,0BAA0B;GAC1B,6BAA6B;GAC7B,4BAA4B;GAC5B,6BAA6B;GAC7B,4BAA4B;GAC5B,sBAAsB;GACtB,qBAAqB;GACrB,4BAA4B;GAC5B,oBAAoB;GACpB,mBAAmB;GACnB,yBAAyB;GACzB,wBAAwB;GACxB,+BAA+B;GAC/B,kCAAkC;GAClC,iCAAiC;GACjC,wCAAwC;GACxC,0BAA0B;GAC1B,yBAAyB;GACzB,kCAAkC;GAClC,iCAAiC;GACjC,+BAA+B;GAC/B,8BAA8B;GAC9B,6BAA6B;GAC7B,4BAA4B;GAC5B,4BAA4B;GAC5B,6BAA6B;GAC7B,+BAA+B;GAG/B,iBAAiB;GACjB,iBAAiB;GACjB,sBAAsB;GACtB,2BAA2B;GAC3B,uBAAuB;GAGvB,kBAAkB;GAClB,wBAAwB;GACxB,yBAAyB;GACzB,uBAAuB;GACvB,oBAAoB;GACpB,uBAAuB;GACvB,mBAAmB;GACnB,wBAAwB;GACxB,sBAAsB;GAGtB,iBAAiB;GACjB,iBAAiB;GACjB,qBAAqB;GAErB,wBAAwB;GACxB,oBAAoB;GACpB,sBAAsB;GACtB,uBAAuB;GACvB,yBAAyB;GACzB,wBAAwB;GACxB,aAAa;GACb,aAAa;GACb,aAAa;GACb,gBAAgB;GAChB,mBAAmB;GACnB,wBAAwB;GACxB,4BAA4B;GAC5B,sBAAsB;GACtB,2BAA2B;GAC3B,sBAAsB;GACtB,oBAAoB;GACpB,mBAAmB;GACnB,aAAa;GACb,sBAAsB;GACtB,sBAAsB;GACtB,qBAAqB;GACrB,kBAAkB;GAClB,gBAAgB;GAChB,eAAe;GACf,kBAAkB;GAClB,gBAAgB;GAChB,kBAAkB;GAClB,kBAAkB;GAClB,uBAAuB;GACvB,kBAAkB;GAClB,kBAAkB;GAClB,oBAAoB;GACpB,aAAa;GACb,wBAAwB;GACxB,iBAAiB;GACjB,qBAAqB;GACrB,sBAAsB;GACtB,qBAAqB;GACrB,8BAA8B;GAC9B,2BAA2B;GAC3B,uBAAuB;GACvB,8BAA8B;GAC9B,qBAAqB;GACrB,mBAAmB;GACnB,2BAA2B;GAC3B,sBAAsB;GACtB,mBAAmB;GACnB,iBAAiB;GACjB,sBAAsB;GACtB,sBAAsB;GACtB,oBAAoB;GACpB,oBAAoB;GACpB,oBAAoB;GACpB,oBAAoB;GAGpB,mCAAmC;GACnC,kCAAkC;GAClC,gCAAgC;GAChC,+BAA+B;GAC/B,8CAA8C;GAC9C,6CAA6C;GAC7C,mCAAmC;GACnC,kCAAkC;GAClC,6BAA6B;GAC7B,4BAA4B;GAC5B,+BAA+B;GAC/B,8BAA8B;GAC9B,4BAA4B;GAC5B,2BAA2B;GAC3B,2BAA2B;GAC3B,8BAA8B;GAC9B,iCAAiC;GACjC,gCAAgC;GAChC,mCAAmC;GACnC,kCAAkC;GAClC,mCAAmC;GACnC,kCAAkC;GAClC,iCAAiC;GACjC,kCAAkC;GAClC,iCAAiC;GACjC,kCAAkC;GAClC,iCAAiC;GACjC,mCAAmC;GACnC,oCAAoC;GACpC,kCAAkC;GAClC,8BAA8B;GAC9B,iCAAiC;GACjC,iCAAiC;GACjC,gCAAgC;GAChC,mCAAmC;GACnC,sCAAsC;GACtC,8BAA8B;GAC9B,kCAAkC;GAClC,+BAA+B;GAC/B,yCAAyC;GACzC,qCAAqC;GACrC,mCAAmC;GACnC,8BAA8B;GAC9B,kCAAkC;GAClC,+BAA+B;GAC/B,+BAA+B;GAC/B,gCAAgC;GAChC,iCAAiC;GACjC,+BAA+B;GAC/B,uCAAuC;GACvC,8BAA8B;GAC9B,8BAA8B;GAC9B,6BAA6B;GAC7B,kCAAkC;GAClC,iCAAiC;GACjC,oCAAoC;GACpC,mCAAmC;GACnC,sCAAsC;GACtC,qCAAqC;GACrC,gCAAgC;GAChC,kCAAkC;GAClC,2BAA2B;GAC3B,iCAAiC;GACjC,gCAAgC;GAChC,4BAA4B;GAC5B,2BAA2B;GAC3B,qCAAqC;GACrC,oCAAoC;GACpC,gCAAgC;GAChC,+BAA+B;GAC/B,4BAA4B;GAC5B,2BAA2B;GAC3B,kCAAkC;GAClC,qCAAqC;GACrC,oCAAoC;GACpC,2CAA2C;GAC3C,qCAAqC;GACrC,oCAAoC;GACpC,kCAAkC;GAClC,iCAAiC;GACjC,gCAAgC;GAChC,+BAA+B;GAC/B,sCAAsC;GACtC,qCAAqC;GACrC,gCAAgC;GAChC,+BAA+B;GAC/B,+BAA+B;GAC/B,8BAA8B;GAC9B,6BAA6B;GAC7B,4BAA4B;GAC5B,8BAA8B;GAC9B,6BAA6B;GAC7B,iCAAiC;GACjC,gCAAgC;GAChC,qCAAqC;GACrC,oCAAoC;GACpC,2BAA2B;GAC3B,0BAA0B;GAG1B,mBAAmB;GACnB,sBAAsB;GACtB,2BAA2B;GAC3B,0BAA0B;GAC1B,wBAAwB;GACxB,0BAA0B;GAC1B,oBAAoB;GACpB,oBAAoB;GACpB,0BAA0B;GAC1B,iBAAiB;GACjB,mBAAmB;GACnB,sBAAsB;GACtB,uBAAuB;GACvB,6BAA6B;GAC7B,8BAA8B;GAC9B,wBAAwB;GAGxB,kBAAkB;GAClB,mBAAmB;GACnB,uBAAuB;GACvB,6BAA6B;GAC7B,4BAA4B;GAC5B,mBAAmB;GACnB,yBAAyB;GACzB,wBAAwB;GACxB,uBAAuB;GACvB,yBAAyB;GACzB,sBAAsB;GACtB,4BAA4B;GAC5B,kCAAkC;GAClC,mCAAmC;GACnC,iCAAiC;GACjC,8BAA8B;GAC9B,iCAAiC;GACjC,6BAA6B;GAC7B,kCAAkC;GAClC,gCAAgC;GAGhC,gBAAgB;GAChB,yBAAyB;GACzB,0BAA0B;GAC1B,wBAAwB;GACxB,uBAAuB;GACvB,uBAAuB;GACvB,wBAAwB;GACxB,uBAAuB;GACvB,uBAAuB;GACvB,0BAA0B;GAC1B,yBAAyB;GACzB,gCAAgC;GAChC,+BAA+B;GAC/B,kBAAkB;GAClB,gBAAgB;GAChB,kBAAkB;GAClB,6BAA6B;GAC7B,wBAAwB;GACxB,0BAA0B;GAC1B,6BAA6B;EAC/B;EAEA,MAAa,aAAsD;GACjE,yBAAyB;GACzB,+BAA+B;GAC/B,0BAA0B;GAC1B,oBAAoB;GACpB,oBAAoB;GACpB,0BAA0B;GAC1B,oBAAoB;GACpB,0BAA0B;GAC1B,wBAAwB;GACxB,2BAA2B;GAC3B,oBAAoB;GACpB,qBAAqB;GACrB,sBAAsB;GACtB,gBAAgB;GAChB,wBAAwB;GACxB,wBAAwB;GACxB,4BAA4B;GAC5B,6BAA6B;GAC7B,qCAAqC;GACrC,iCAAiC;GACjC,qBAAqB;GACrB,gCAAgC;GAChC,iCAAiC;GACjC,wBAAwB;GACxB,wBAAwB;GACxB,mBAAmB;GACnB,yBAAyB;GACzB,yBAAyB;GACzB,+BAA+B;GAC/B,gCAAgC;GAChC,0BAA0B;GAC1B,yBAAyB;GACzB,uBAAuB;GACvB,0BAA0B;GAC1B,6BAA6B;GAC7B,2BAA2B;GAC3B,wBAAwB;GACxB,mBAAmB;GACnB,uBAAuB;GACvB,yBAAyB;GACzB,gBAAgB;GAChB,oBAAoB;GACpB,sBAAsB;GACtB,gBAAgB;GAChB,kBAAkB;GAClB,uBAAuB;GACvB,8BAA8B;GAC9B,qBAAqB;GACrB,oBAAoB;GACpB,0BAA0B;GAC1B,uBAAuB;GACvB,sBAAsB;GACtB,yBAAyB;GACzB,uBAAuB;GACvB,2BAA2B;GAC3B,wBAAwB;GACxB,gCAAgC;GAChC,gCAAgC;GAChC,iCAAiC;GACjC,gCAAgC;GAChC,iCAAiC;GACjC,sBAAsB;GACtB,wBAAwB;GACxB,yBAAyB;GACzB,2BAA2B;GAC3B,gCAAgC;GAChC,+BAA+B;GAC/B,2BAA2B;GAC3B,0BAA0B;GAC1B,6BAA6B;GAC7B,4BAA4B;GAC5B,mBAAmB;GACnB,2BAA2B;GAC3B,iCAAiC;GACjC,wBAAwB;GACxB,6BAA6B;GAC7B,6BAA6B;GAC7B,gCAAgC;GAChC,+BAA+B;GAC/B,mCAAmC;GACnC,qCAAqC;GACrC,yBAAyB;GACzB,0BAA0B;GAC1B,uBAAuB;GACvB,uBAAuB;GACvB,uBAAuB;GACvB,0BAA0B;GAE1B,iBAAiB;GACjB,mBAAmB;GACnB,oBAAoB;GACpB,mBAAmB;GACnB,eAAe;GACf,iBAAiB;GACjB,kBAAkB;GAClB,eAAe;GACf,sBAAsB;GACtB,eAAe;GACf,sBAAsB;GACtB,oBAAoB;GACpB,mBAAmB;GACnB,mBAAmB;GACnB,4BAA4B;GAC5B,uBAAuB;GACvB,wBAAwB;GACxB,0BAA0B;GAC1B,6BAA6B;GAC7B,yBAAyB;GACzB,iBAAiB;GACjB,mBAAmB;GAEnB,sBAAsB;GACtB,yBAAyB;GACzB,8BAA8B;GAC9B,6BAA6B;GAC7B,4BAA4B;GAC5B,2BAA2B;GAC3B,sBAAsB;GACtB,sBAAsB;GACtB,wBAAwB;GACxB,yBAAyB;GACzB,oBAAoB;GACpB,wBAAwB;GACxB,yBAAyB;GACzB,wBAAwB;GACxB,4BAA4B;GAC5B,2BAA2B;GAC3B,uBAAuB;GACvB,0BAA0B;GAC1B,iBAAiB;GACjB,gBAAgB;GAChB,mBAAmB;GACnB,kBAAkB;GAClB,oBAAoB;GACpB,mBAAmB;GACnB,uBAAuB;GACvB,sBAAsB;GACtB,mBAAmB;GACnB,kBAAkB;GAClB,mBAAmB;GACnB,kBAAkB;GAClB,uBAAuB;GACvB,sBAAsB;GACtB,oBAAoB;GACpB,mBAAmB;GACnB,oBAAoB;GACpB,mBAAmB;GACnB,qBAAqB;GACrB,yBAAyB;GACzB,wBAAwB;GACxB,uBAAuB;GACvB,qBAAqB;GACrB,oBAAoB;GACpB,kBAAkB;GAClB,0BAA0B;GAC1B,sBAAsB;GACtB,4BAA4B;GAC5B,oBAAoB;GACpB,mBAAmB;GACnB,wBAAwB;GACxB,uBAAuB;GACvB,qBAAqB;GACrB,oBAAoB;GACpB,wBAAwB;GACxB,uBAAuB;GACvB,uBAAuB;GACvB,sBAAsB;GACtB,yBAAyB;GACzB,wBAAwB;GACxB,mBAAmB;GACnB,kBAAkB;GAClB,kBAAkB;GAClB,wBAAwB;GACxB,0BAA0B;GAC1B,sBAAsB;GACtB,mBAAmB;GACnB,mBAAmB;GACnB,kBAAkB;GAClB,yBAAyB;GACzB,wBAAwB;GACxB,mBAAmB;GACnB,kBAAkB;GAClB,sBAAsB;GACtB,qBAAqB;GACrB,2BAA2B;GAC3B,0BAA0B;GAC1B,6BAA6B;GAC7B,4BAA4B;GAC5B,6BAA6B;GAC7B,4BAA4B;GAC5B,sBAAsB;GACtB,qBAAqB;GACrB,4BAA4B;GAC5B,oBAAoB;GACpB,mBAAmB;GACnB,yBAAyB;GACzB,wBAAwB;GACxB,+BAA+B;GAC/B,kCAAkC;GAClC,iCAAiC;GACjC,wCAAwC;GACxC,0BAA0B;GAC1B,yBAAyB;GACzB,kCAAkC;GAClC,iCAAiC;GACjC,+BAA+B;GAC/B,8BAA8B;GAC9B,6BAA6B;GAC7B,4BAA4B;GAC5B,4BAA4B;GAC5B,6BAA6B;GAC7B,+BAA+B;GAE/B,iBAAiB;GACjB,iBAAiB;GACjB,sBAAsB;GACtB,2BAA2B;GAC3B,uBAAuB;GAEvB,kBAAkB;GAClB,wBAAwB;GACxB,yBAAyB;GACzB,uBAAuB;GACvB,oBAAoB;GACpB,uBAAuB;GACvB,mBAAmB;GACnB,wBAAwB;GACxB,sBAAsB;GAEtB,iBAAiB;GACjB,iBAAiB;GACjB,qBAAqB;GACrB,wBAAwB;GACxB,oBAAoB;GACpB,sBAAsB;GACtB,uBAAuB;GACvB,yBAAyB;GACzB,wBAAwB;GACxB,aAAa;GACb,aAAa;GACb,aAAa;GACb,gBAAgB;GAChB,mBAAmB;GACnB,wBAAwB;GACxB,4BAA4B;GAC5B,sBAAsB;GACtB,2BAA2B;GAC3B,sBAAsB;GACtB,oBAAoB;GACpB,mBAAmB;GACnB,aAAa;GACb,sBAAsB;GACtB,sBAAsB;GACtB,qBAAqB;GACrB,kBAAkB;GAClB,gBAAgB;GAChB,eAAe;GACf,kBAAkB;GAClB,gBAAgB;GAChB,kBAAkB;GAClB,kBAAkB;GAClB,uBAAuB;GACvB,kBAAkB;GAClB,kBAAkB;GAClB,oBAAoB;GACpB,aAAa;GACb,wBAAwB;GACxB,iBAAiB;GACjB,qBAAqB;GACrB,sBAAsB;GACtB,qBAAqB;GACrB,8BAA8B;GAC9B,2BAA2B;GAC3B,uBAAuB;GACvB,8BAA8B;GAC9B,qBAAqB;GACrB,mBAAmB;GACnB,2BAA2B;GAC3B,sBAAsB;GACtB,mBAAmB;GACnB,iBAAiB;GACjB,sBAAsB;GACtB,sBAAsB;GACtB,oBAAoB;GACpB,oBAAoB;GACpB,oBAAoB;GACpB,oBAAoB;GAEpB,mCAAmC;GACnC,kCAAkC;GAClC,gCAAgC;GAChC,+BAA+B;GAC/B,8CAA8C;GAC9C,6CAA6C;GAC7C,mCAAmC;GACnC,kCAAkC;GAClC,6BAA6B;GAC7B,4BAA4B;GAC5B,+BAA+B;GAC/B,8BAA8B;GAC9B,4BAA4B;GAC5B,2BAA2B;GAC3B,2BAA2B;GAC3B,8BAA8B;GAC9B,iCAAiC;GACjC,gCAAgC;GAChC,mCAAmC;GACnC,kCAAkC;GAClC,mCAAmC;GACnC,kCAAkC;GAClC,iCAAiC;GACjC,kCAAkC;GAClC,iCAAiC;GACjC,kCAAkC;GAClC,iCAAiC;GACjC,mCAAmC;GACnC,oCAAoC;GACpC,kCAAkC;GAClC,8BAA8B;GAC9B,iCAAiC;GACjC,iCAAiC;GACjC,gCAAgC;GAChC,mCAAmC;GACnC,sCAAsC;GACtC,8BAA8B;GAC9B,kCAAkC;GAClC,+BAA+B;GAC/B,yCAAyC;GACzC,qCAAqC;GACrC,mCAAmC;GACnC,8BAA8B;GAC9B,kCAAkC;GAClC,+BAA+B;GAC/B,+BAA+B;GAC/B,gCAAgC;GAChC,iCAAiC;GACjC,+BAA+B;GAC/B,uCAAuC;GACvC,8BAA8B;GAC9B,8BAA8B;GAC9B,6BAA6B;GAC7B,kCAAkC;GAClC,iCAAiC;GACjC,oCAAoC;GACpC,mCAAmC;GACnC,sCAAsC;GACtC,qCAAqC;GACrC,gCAAgC;GAChC,kCAAkC;GAClC,2BAA2B;GAC3B,iCAAiC;GACjC,gCAAgC;GAChC,4BAA4B;GAC5B,2BAA2B;GAC3B,qCAAqC;GACrC,oCAAoC;GACpC,gCAAgC;GAChC,+BAA+B;GAC/B,4BAA4B;GAC5B,2BAA2B;GAC3B,kCAAkC;GAClC,qCAAqC;GACrC,oCAAoC;GACpC,2CAA2C;GAC3C,qCAAqC;GACrC,oCAAoC;GACpC,kCAAkC;GAClC,iCAAiC;GACjC,gCAAgC;GAChC,+BAA+B;GAC/B,sCAAsC;GACtC,qCAAqC;GACrC,gCAAgC;GAChC,+BAA+B;GAC/B,+BAA+B;GAC/B,8BAA8B;GAC9B,6BAA6B;GAC7B,4BAA4B;GAC5B,8BAA8B;GAC9B,6BAA6B;GAC7B,iCAAiC;GACjC,gCAAgC;GAChC,qCAAqC;GACrC,oCAAoC;GACpC,2BAA2B;GAC3B,0BAA0B;GAE1B,mBAAmB;GACnB,sBAAsB;GACtB,2BAA2B;GAC3B,0BAA0B;GAC1B,wBAAwB;GACxB,0BAA0B;GAC1B,oBAAoB;GACpB,oBAAoB;GACpB,0BAA0B;GAC1B,iBAAiB;GACjB,mBAAmB;GACnB,sBAAsB;GACtB,uBAAuB;GACvB,6BAA6B;GAC7B,8BAA8B;GAC9B,wBAAwB;GAExB,kBAAkB;GAClB,mBAAmB;GACnB,uBAAuB;GACvB,6BAA6B;GAC7B,4BAA4B;GAC5B,mBAAmB;GACnB,yBAAyB;GACzB,wBAAwB;GACxB,uBAAuB;GACvB,yBAAyB;GACzB,sBAAsB;GACtB,4BAA4B;GAC5B,kCAAkC;GAClC,mCAAmC;GACnC,iCAAiC;GACjC,8BAA8B;GAC9B,iCAAiC;GACjC,6BAA6B;GAC7B,kCAAkC;GAClC,gCAAgC;GAEhC,gBAAgB;GAChB,yBAAyB;GACzB,0BAA0B;GAC1B,wBAAwB;GACxB,uBAAuB;GACvB,uBAAuB;GACvB,wBAAwB;GACxB,uBAAuB;GACvB,uBAAuB;GACvB,0BAA0B;GAC1B,yBAAyB;GACzB,gCAAgC;GAChC,+BAA+B;GAC/B,kBAAkB;GAClB,gBAAgB;GAChB,kBAAkB;GAClB,6BAA6B;GAC7B,wBAAwB;GACxB,0BAA0B;GAC1B,6BAA6B;EAC/B;;;;;;;;;;;;;EC34BA,MAAa,WAAW;GAEtB,0BAA0B;GAC1B,0BAA0B;GAC1B,0BAA0B;GAC1B,iCAAiC;GACjC,+BAA+B;GAC/B,gCAAgC;GAChC,6BAA6B;GAG7B,gBAAgB;GAChB,oBAAoB;GACpB,sBAAsB;GACtB,yBAAyB;GACzB,0BAA0B;GAC1B,kBAAkB;GAClB,qBAAqB;GACrB,gBAAgB;GAChB,uBAAuB;GACvB,0BAA0B;GAC1B,2BAA2B;GAC3B,4BAA4B;GAC5B,+BAA+B;GAC/B,wBAAwB;GACxB,wBAAwB;GACxB,mBAAmB;GACnB,wBAAwB;GACxB,+BAA+B;GAC/B,8BAA8B;GAC9B,8BAA8B;GAC9B,6BAA6B;GAC7B,6BAA6B;GAC7B,4BAA4B;GAC5B,wBAAwB;GACxB,0BAA0B;GAC1B,uBAAuB;GACvB,4BAA4B;GAC5B,kCAAkC;GAClC,kCAAkC;GAClC,uCAAuC;GACvC,6BAA6B;GAC7B,6BAA6B;GAC7B,qBAAqB;GACrB,iBAAiB;GACjB,mBAAmB;GACnB,oBAAoB;GACpB,iBAAiB;GACjB,wBAAwB;GACxB,4BAA4B;GAC5B,iCAAiC;GACjC,gCAAgC;GAChC,wBAAwB;GACxB,yBAAyB;GACzB,0BAA0B;GAC1B,0BAA0B;GAC1B,+BAA+B;GAC/B,8BAA8B;GAC9B,uCAAuC;GACvC,sCAAsC;GACtC,6BAA6B;GAC7B,qBAAqB;GACrB,qBAAqB;GACrB,uBAAuB;GACvB,sBAAsB;GACtB,oBAAoB;GACpB,yBAAyB;GACzB,wBAAwB;GACxB,uBAAuB;GACvB,4BAA4B;GAC5B,2BAA2B;GAC3B,kCAAkC;GAClC,0BAA0B;GAC1B,uBAAuB;GACvB,4BAA4B;GAC5B,2BAA2B;GAC3B,oCAAoC;GACpC,mCAAmC;GACnC,8BAA8B;GAC9B,0BAA0B;GAC1B,kBAAkB;GAClB,4BAA4B;GAC5B,iCAAiC;GACjC,gCAAgC;GAChC,6BAA6B;GAC7B,kCAAkC;GAClC,wBAAwB;GACxB,6BAA6B;GAC7B,4BAA4B;GAC5B,gCAAgC;GAChC,+BAA+B;GAC/B,wBAAwB;GACxB,uBAAuB;GACvB,2BAA2B;GAC3B,kCAAkC;GAClC,6BAA6B;GAC7B,8BAA8B;GAC9B,+BAA+B;GAC/B,gCAAgC;GAChC,iCAAiC;GACjC,2BAA2B;GAC3B,4BAA4B;GAC5B,sBAAsB;GACtB,qBAAqB;GACrB,yBAAyB;GAGzB,oBAAoB;GACpB,0BAA0B;GAC1B,oBAAoB;GACpB,wBAAwB;GACxB,uBAAuB;GACvB,0BAA0B;GAC1B,qBAAqB;GACrB,oBAAoB;GACpB,sBAAsB;GACtB,0BAA0B;GAC1B,qBAAqB;GACrB,2BAA2B;GAC3B,gCAAgC;GAGhC,2BAA2B;GAC3B,2BAA2B;GAC3B,8BAA8B;GAC9B,qCAAqC;GACrC,8BAA8B;GAC9B,kCAAkC;GAClC,kCAAkC;GAClC,qCAAqC;GACrC,4CAA4C;GAC5C,gCAAgC;GAChC,4BAA4B;GAC5B,yBAAyB;GACzB,wBAAwB;GACxB,gCAAgC;GAChC,2BAA2B;GAC3B,4BAA4B;GAC5B,0BAA0B;GAC1B,0BAA0B;GAC1B,6BAA6B;GAC7B,8BAA8B;GAC9B,0BAA0B;GAC1B,qBAAqB;GACrB,uBAAuB;GACvB,wBAAwB;GACxB,qBAAqB;GACrB,4BAA4B;GAC5B,qBAAqB;GACrB,uBAAuB;GACvB,2BAA2B;GAC3B,yBAAyB;GACzB,6BAA6B;GAC7B,gCAAgC;GAChC,oCAAoC;GACpC,2CAA2C;GAC3C,yBAAyB;GACzB,8BAA8B;GAC9B,6BAA6B;GAC7B,iCAAiC;GACjC,gCAAgC;GAChC,+BAA+B;GAC/B,6BAA6B;GAC7B,4BAA4B;GAC5B,+BAA+B;GAC/B,kCAAkC;GAClC,6BAA6B;GAC7B,iCAAiC;GACjC,iCAAiC;GACjC,8BAA8B;GAC9B,6BAA6B;GAC7B,iCAAiC;GACjC,gCAAgC;GAChC,6BAA6B;GAC7B,iCAAiC;GACjC,wCAAwC;GACxC,2BAA2B;GAC3B,0BAA0B;GAC1B,8BAA8B;GAC9B,uBAAuB;GACvB,yBAAyB;GACzB,wBAAwB;GACxB,4BAA4B;GAC5B,sBAAsB;GACtB,0BAA0B;GAC1B,0BAA0B;GAC1B,8BAA8B;GAC9B,8BAA8B;GAC9B,4BAA4B;GAC5B,4BAA4B;GAC5B,sBAAsB;GACtB,2BAA2B;GAC3B,wBAAwB;GACxB,4BAA4B;GAC5B,2BAA2B;GAC3B,4BAA4B;GAC5B,6BAA6B;GAC7B,yBAAyB;GACzB,wBAAwB;GACxB,0BAA0B;GAC1B,uBAAuB;GACvB,2BAA2B;GAC3B,8BAA8B;GAC9B,sBAAsB;GACtB,uBAAuB;GACvB,sBAAsB;GACtB,qBAAqB;GACrB,qBAAqB;GACrB,uBAAuB;GACvB,uBAAuB;GACvB,oBAAoB;GACpB,sBAAsB;GACtB,qBAAqB;GACrB,sBAAsB;GACtB,sBAAsB;GACtB,iCAAiC;GACjC,uBAAuB;GACvB,0BAA0B;GAC1B,sBAAsB;GACtB,oBAAoB;GACpB,kBAAkB;GAClB,yBAAyB;GACzB,mBAAmB;GACnB,wBAAwB;GACxB,uBAAuB;GACvB,6BAA6B;GAC7B,gCAAgC;GAChC,uBAAuB;GACvB,qBAAqB;GACrB,mBAAmB;GACnB,uBAAuB;GACvB,wBAAwB;GACxB,oBAAoB;GACpB,kCAAkC;GAClC,qCAAqC;GACrC,8BAA8B;GAC9B,iCAAiC;GACjC,+BAA+B;GAC/B,2BAA2B;GAC3B,4BAA4B;GAC5B,mCAAmC;GACnC,+BAA+B;GAC/B,sBAAsB;GACtB,8BAA8B;GAC9B,oBAAoB;GACpB,oBAAoB;GACpB,sBAAsB;GACtB,mBAAmB;GACnB,oBAAoB;GACpB,wBAAwB;GACxB,yBAAyB;GACzB,qBAAqB;GACrB,sBAAsB;GACtB,6BAA6B;GAC7B,uBAAuB;GACvB,sBAAsB;GACtB,qBAAqB;GACrB,iCAAiC;GACjC,4BAA4B;GAC5B,qBAAqB;GACrB,qBAAqB;GACrB,mBAAmB;GACnB,uBAAuB;GACvB,0BAA0B;GAC1B,8BAA8B;GAC9B,wBAAwB;GACxB,wBAAwB;GACxB,yBAAyB;GACzB,uBAAuB;GACvB,uBAAuB;GACvB,wBAAwB;GACxB,uBAAuB;GACvB,uBAAuB;GACvB,2BAA2B;GAC3B,4BAA4B;GAC5B,0BAA0B;EAC5B;EAEA,MAAa,WAAkD;GAC7D,0BAA0B;GAC1B,0BAA0B;GAC1B,0BAA0B;GAC1B,iCAAiC;GACjC,+BAA+B;GAC/B,gCAAgC;GAChC,6BAA6B;GAE7B,gBAAgB;GAChB,oBAAoB;GACpB,yBAAyB;GACzB,0BAA0B;GAC1B,sBAAsB;GACtB,kBAAkB;GAClB,qBAAqB;GACrB,gBAAgB;GAChB,uBAAuB;GACvB,0BAA0B;GAC1B,2BAA2B;GAC3B,4BAA4B;GAC5B,+BAA+B;GAC/B,wBAAwB;GACxB,wBAAwB;GACxB,mBAAmB;GACnB,wBAAwB;GACxB,+BAA+B;GAC/B,8BAA8B;GAC9B,8BAA8B;GAC9B,6BAA6B;GAC7B,6BAA6B;GAC7B,4BAA4B;GAC5B,wBAAwB;GACxB,0BAA0B;GAC1B,uBAAuB;GACvB,4BAA4B;GAC5B,kCAAkC;GAClC,kCAAkC;GAClC,uCAAuC;GACvC,6BAA6B;GAC7B,6BAA6B;GAC7B,qBAAqB;GACrB,iBAAiB;GACjB,mBAAmB;GACnB,oBAAoB;GACpB,iBAAiB;GACjB,wBAAwB;GACxB,4BAA4B;GAC5B,iCAAiC;GACjC,gCAAgC;GAChC,wBAAwB;GACxB,yBAAyB;GACzB,0BAA0B;GAC1B,0BAA0B;GAC1B,+BAA+B;GAC/B,8BAA8B;GAC9B,uCAAuC;GACvC,sCAAsC;GACtC,6BAA6B;GAC7B,qBAAqB;GACrB,qBAAqB;GACrB,uBAAuB;GACvB,sBAAsB;GACtB,oBAAoB;GACpB,yBAAyB;GACzB,wBAAwB;GACxB,uBAAuB;GACvB,4BAA4B;GAC5B,2BAA2B;GAC3B,kCAAkC;GAClC,0BAA0B;GAC1B,uBAAuB;GACvB,4BAA4B;GAC5B,2BAA2B;GAC3B,oCAAoC;GACpC,mCAAmC;GACnC,8BAA8B;GAC9B,0BAA0B;GAC1B,kBAAkB;GAClB,4BAA4B;GAC5B,iCAAiC;GACjC,gCAAgC;GAChC,6BAA6B;GAC7B,kCAAkC;GAClC,wBAAwB;GACxB,6BAA6B;GAC7B,4BAA4B;GAC5B,gCAAgC;GAChC,+BAA+B;GAC/B,wBAAwB;GACxB,uBAAuB;GACvB,2BAA2B;GAC3B,kCAAkC;GAClC,6BAA6B;GAC7B,8BAA8B;GAC9B,+BAA+B;GAC/B,gCAAgC;GAChC,iCAAiC;GACjC,2BAA2B;GAC3B,4BAA4B;GAC5B,sBAAsB;GACtB,qBAAqB;GACrB,yBAAyB;GAEzB,oBAAoB;GACpB,0BAA0B;GAC1B,oBAAoB;GACpB,wBAAwB;GACxB,uBAAuB;GACvB,0BAA0B;GAC1B,qBAAqB;GACrB,oBAAoB;GACpB,sBAAsB;GACtB,0BAA0B;GAC1B,qBAAqB;GACrB,2BAA2B;GAC3B,gCAAgC;GAEhC,2BAA2B;GAC3B,2BAA2B;GAC3B,8BAA8B;GAC9B,qCAAqC;GACrC,8BAA8B;GAC9B,kCAAkC;GAClC,kCAAkC;GAClC,qCAAqC;GACrC,4CAA4C;GAC5C,gCAAgC;GAChC,4BAA4B;GAC5B,yBAAyB;GACzB,wBAAwB;GACxB,gCAAgC;GAChC,2BAA2B;GAC3B,4BAA4B;GAC5B,0BAA0B;GAC1B,0BAA0B;GAC1B,6BAA6B;GAC7B,8BAA8B;GAC9B,0BAA0B;GAC1B,qBAAqB;GACrB,uBAAuB;GACvB,wBAAwB;GACxB,qBAAqB;GACrB,4BAA4B;GAC5B,qBAAqB;GACrB,uBAAuB;GACvB,2BAA2B;GAC3B,yBAAyB;GACzB,6BAA6B;GAC7B,gCAAgC;GAChC,oCAAoC;GACpC,2CAA2C;GAC3C,yBAAyB;GACzB,8BAA8B;GAC9B,6BAA6B;GAC7B,iCAAiC;GACjC,gCAAgC;GAChC,+BAA+B;GAC/B,6BAA6B;GAC7B,4BAA4B;GAC5B,+BAA+B;GAC/B,kCAAkC;GAClC,6BAA6B;GAC7B,iCAAiC;GACjC,iCAAiC;GACjC,8BAA8B;GAC9B,6BAA6B;GAC7B,iCAAiC;GACjC,gCAAgC;GAChC,6BAA6B;GAC7B,iCAAiC;GACjC,wCAAwC;GACxC,2BAA2B;GAC3B,0BAA0B;GAC1B,8BAA8B;GAC9B,uBAAuB;GACvB,yBAAyB;GACzB,wBAAwB;GACxB,4BAA4B;GAC5B,sBAAsB;GACtB,0BAA0B;GAC1B,0BAA0B;GAC1B,8BAA8B;GAC9B,8BAA8B;GAC9B,4BAA4B;GAC5B,4BAA4B;GAC5B,sBAAsB;GACtB,2BAA2B;GAC3B,wBAAwB;GACxB,4BAA4B;GAC5B,2BAA2B;GAC3B,4BAA4B;GAC5B,6BAA6B;GAC7B,yBAAyB;GACzB,wBAAwB;GACxB,0BAA0B;GAC1B,uBAAuB;GACvB,2BAA2B;GAC3B,8BAA8B;GAC9B,sBAAsB;GACtB,uBAAuB;GACvB,sBAAsB;GACtB,qBAAqB;GACrB,qBAAqB;GACrB,uBAAuB;GACvB,uBAAuB;GACvB,oBAAoB;GACpB,sBAAsB;GACtB,qBAAqB;GACrB,sBAAsB;GACtB,sBAAsB;GACtB,iCAAiC;GACjC,uBAAuB;GACvB,0BAA0B;GAC1B,sBAAsB;GACtB,oBAAoB;GACpB,kBAAkB;GAClB,yBAAyB;GACzB,mBAAmB;GACnB,wBAAwB;GACxB,uBAAuB;GACvB,6BAA6B;GAC7B,gCAAgC;GAChC,uBAAuB;GACvB,qBAAqB;GACrB,mBAAmB;GACnB,uBAAuB;GACvB,wBAAwB;GACxB,oBAAoB;GACpB,kCAAkC;GAClC,qCAAqC;GACrC,8BAA8B;GAC9B,iCAAiC;GACjC,+BAA+B;GAC/B,2BAA2B;GAC3B,4BAA4B;GAC5B,mCAAmC;GACnC,+BAA+B;GAC/B,sBAAsB;GACtB,8BAA8B;GAC9B,oBAAoB;GACpB,oBAAoB;GACpB,sBAAsB;GACtB,mBAAmB;GACnB,oBAAoB;GACpB,wBAAwB;GACxB,yBAAyB;GACzB,qBAAqB;GACrB,sBAAsB;GACtB,6BAA6B;GAC7B,uBAAuB;GACvB,sBAAsB;GACtB,qBAAqB;GACrB,iCAAiC;GACjC,4BAA4B;GAC5B,qBAAqB;GACrB,qBAAqB;GACrB,mBAAmB;GACnB,uBAAuB;GACvB,0BAA0B;GAC1B,8BAA8B;GAC9B,wBAAwB;GACxB,wBAAwB;GACxB,yBAAyB;GACzB,uBAAuB;GACvB,uBAAuB;GACvB,wBAAwB;GACxB,uBAAuB;GACvB,uBAAuB;GACvB,2BAA2B;GAC3B,4BAA4B;GAC5B,0BAA0B;EAC5B;;;;EChiBA,MAAaC,mBAAiB;EAE9B,MAAM,UAAU;GACd,aAAa;GACb,kBAAkB;GAClB,eAAe;GACf,qBAAqB;GACrB,YAAY;GACZ,aAAa;GACb,iBAAiB;GACjB,YAAY;GACZ,aAAa;GAEb,iBAAiB;GACjB,yBAAyB;GACzB,8BAA8B;GAC9B,6BAA6B;GAC7B,iCAAiC;GACjC,gCAAgC;GAChC,qBAAqB;GACrB,8BAA8B;GAC9B,0BAA0B;GAC1B,yBAAyB;GACzB,yCAAyC;GAGzC,uBAAuB;GACvB,uBAAuB;GACvB,oBAAoB;GACpB,qBAAqB;GACrB,sBAAsB;GACtB,yBAAyB;GAEzB,aAAa;GACb,oBAAoB;GACpB,wBAAwB;GACxB,qBAAqB;GACrB,qBAAqB;GACrB,iBAAiB;GACjB,qBAAqB;GACrB,2BAA2B;GAE3B,cAAc;GACd,qBAAqB;GACrB,4BAA4B;GAC5B,yBAAyB;GACzB,wBAAwB;GACxB,6BAA6B;GAC7B,oCAAoC;GACpC,wBAAwB;GACxB,wBAAwB;GACxB,oBAAoB;GACpB,mBAAmB;GACnB,kBAAkB;GAClB,6BAA6B;GAC7B,uBAAuB;GACvB,6BAA6B;GAC7B,6BAA6B;GAC7B,2BAA2B;GAC3B,2BAA2B;GAC3B,+BAA+B;GAC/B,6BAA6B;GAC7B,6BAA6B;GAC7B,+BAA+B;GAC/B,oCAAoC;GACpC,sCAAsC;GACtC,6BAA6B;GAC7B,4BAA4B;GAC5B,2BAA2B;GAC3B,2BAA2B;GAC3B,0BAA0B;GAC1B,wBAAwB;GACxB,yBAAyB;GACzB,yBAAyB;GACzB,4BAA4B;GAC5B,6BAA6B;GAC7B,8BAA8B;GAC9B,6BAA6B;GAE7B,mBAAmB;GACnB,4BAA4B;GAC5B,2BAA2B;GAC3B,0BAA0B;GAC1B,yBAAyB;GACzB,wBAAwB;GACxB,6BAA6B;GAC7B,4BAA4B;GAC5B,0BAA0B;GAC1B,yBAAyB;GACzB,6BAA6B;GAC7B,qBAAqB;GACrB,uBAAuB;GACvB,oBAAoB;GACpB,4BAA4B;GAC5B,2BAA2B;GAC3B,2BAA2B;GAC3B,0BAA0B;GAC1B,4BAA4B;GAC5B,qBAAqB;GACrB,4BAA4B;GAC5B,iCAAiC;GACjC,iCAAiC;GACjC,kCAAkC;GAClC,mCAAmC;GACnC,kCAAkC;GAClC,6BAA6B;GAC7B,iCAAiC;GACjC,6BAA6B;GAC7B,kCAAkC;GAClC,6BAA6B;GAC7B,kCAAkC;GAClC,4BAA4B;GAC5B,gCAAgC;GAEhC,eAAe;GACf,oBAAoB;GACpB,mBAAmB;GACnB,qBAAqB;GACrB,oBAAoB;GACpB,uBAAuB;GACvB,qBAAqB;GACrB,kBAAkB;GAClB,wBAAwB;GACxB,uBAAuB;GACvB,uBAAuB;GACvB,0BAA0B;GAC1B,uBAAuB;GACvB,2BAA2B;GAC3B,qBAAqB;GACrB,qBAAqB;GACrB,sBAAsB;GACtB,2BAA2B;GAC3B,uBAAuB;GACvB,yBAAyB;GACzB,wBAAwB;GACxB,4BAA4B;GAC5B,uBAAuB;GACvB,sBAAsB;GACtB,qBAAqB;GACrB,6BAA6B;GAC7B,gCAAgC;GAChC,wBAAwB;GACxB,0BAA0B;GAC1B,6BAA6B;GAC7B,yBAAyB;GACzB,uBAAuB;GACvB,sBAAsB;GACtB,uBAAuB;GACvB,sBAAsB;GACtB,iCAAiC;GACjC,6BAA6B;GAC7B,wCAAwC;GACxC,yBAAyB;GACzB,oCAAoC;GACpC,wBAAwB;GACxB,yBAAyB;GACzB,sBAAsB;GACtB,uBAAuB;GACvB,6BAA6B;GAC7B,yBAAyB;GACzB,wBAAwB;GACxB,sBAAsB;GACtB,6BAA6B;GAC7B,kBAAkB;GAClB,qBAAqB;GACrB,sBAAsB;GACtB,qBAAqB;GACrB,kBAAkB;GAClB,+BAA+B;GAC/B,0BAA0B;GAC1B,mCAAmC;GACnC,0BAA0B;GAC1B,gCAAgC;GAChC,4BAA4B;GAC5B,8BAA8B;GAC9B,yBAAyB;GACzB,yBAAyB;GACzB,0BAA0B;GAC1B,0BAA0B;GAC1B,6BAA6B;GAC7B,2BAA2B;GAC3B,0BAA0B;GAC1B,yBAAyB;GACzB,+BAA+B;GAC/B,8BAA8B;GAC9B,+BAA+B;GAC/B,8BAA8B;GAC9B,gCAAgC;GAChC,+BAA+B;GAC/B,0BAA0B;GAC1B,uBAAuB;GACvB,4BAA4B;GAC5B,qBAAqB;GACrB,uBAAuB;GACvB,2BAA2B;GAC3B,oBAAoB;GACpB,oBAAoB;GACpB,sBAAsB;GACtB,qBAAqB;GACrB,qBAAqB;GACrB,uBAAuB;GACvB,wBAAwB;GACxB,sBAAsB;GACtB,6BAA6B;GAC7B,0BAA0B;GAC1B,0BAA0B;GAC1B,4BAA4B;GAC5B,2BAA2B;GAC3B,qBAAqB;GACrB,0BAA0B;GAE1B,gBAAgB;GAChB,6BAA6B;GAC7B,4BAA4B;GAC5B,wBAAwB;GACxB,uBAAuB;GACvB,uBAAuB;GACvB,sBAAsB;GAEtB,wBAAwB;GACxB,uBAAuB;GACvB,sBAAsB;GACtB,yBAAyB;GACzB,4BAA4B;GAC5B,8BAA8B;GAC9B,4BAA4B;GAC5B,iCAAiC;GACjC,yBAAyB;GACzB,wBAAwB;GACxB,+BAA+B;GAC/B,+BAA+B;GAC/B,qCAAqC;GACrC,8BAA8B;GAC9B,+BAA+B;GAC/B,gCAAgC;GAChC,gCAAgC;GAChC,oCAAoC;GACpC,mCAAmC;GACnC,mCAAmC;GACnC,+BAA+B;GAC/B,0BAA0B;GAC1B,kCAAkC;GAClC,iCAAiC;GACjC,6BAA6B;GAC7B,4BAA4B;GAC5B,qCAAqC;GACrC,iCAAiC;GACjC,gCAAgC;GAChC,oCAAoC;GACpC,8BAA8B;GAC9B,8BAA8B;GAC9B,kCAAkC;GAClC,sCAAsC;GACtC,sCAAsC;GACtC,kCAAkC;GAClC,iCAAiC;GACjC,sCAAsC;GACtC,oCAAoC;GACpC,yCAAyC;GACzC,gCAAgC;GAChC,oCAAoC;GACpC,gCAAgC;GAChC,qCAAqC;EACvC;EAgBA,MAAM,UAAgD;GACpD,aAAa;GACb,kBAAkB;GAClB,eAAe;GACf,qBAAqB;GACrB,YAAY;GACZ,aAAa;GACb,iBAAiB;GACjB,YAAY;GACZ,aAAa;GAEb,iBAAiB;GACjB,yBAAyB;GACzB,8BAA8B;GAC9B,6BAA6B;GAC7B,iCAAiC;GACjC,gCAAgC;GAChC,qBAAqB;GACrB,8BAA8B;GAC9B,0BAA0B;GAC1B,yBAAyB;GACzB,yCAAyC;GAGzC,uBAAuB;GACvB,uBAAuB;GACvB,oBAAoB;GACpB,qBAAqB;GACrB,sBAAsB;GACtB,yBAAyB;GAEzB,aAAa;GACb,oBAAoB;GACpB,wBAAwB;GACxB,qBAAqB;GACrB,qBAAqB;GACrB,iBAAiB;GACjB,qBAAqB;GACrB,2BAA2B;GAE3B,cAAc;GACd,qBAAqB;GACrB,4BAA4B;GAC5B,yBAAyB;GACzB,wBAAwB;GACxB,6BAA6B;GAC7B,oCAAoC;GACpC,wBAAwB;GACxB,wBAAwB;GACxB,oBAAoB;GACpB,mBAAmB;GACnB,kBAAkB;GAClB,6BAA6B;GAC7B,uBAAuB;GACvB,6BAA6B;GAC7B,6BAA6B;GAC7B,2BAA2B;GAC3B,2BAA2B;GAC3B,+BAA+B;GAC/B,6BAA6B;GAC7B,6BAA6B;GAC7B,+BAA+B;GAC/B,oCAAoC;GACpC,sCAAsC;GACtC,6BAA6B;GAC7B,4BAA4B;GAC5B,2BAA2B;GAC3B,2BAA2B;GAC3B,0BAA0B;GAC1B,wBAAwB;GACxB,yBAAyB;GACzB,yBAAyB;GACzB,4BAA4B;GAC5B,6BAA6B;GAC7B,8BAA8B;GAC9B,6BAA6B;GAE7B,mBAAmB;GACnB,4BAA4B;GAC5B,2BAA2B;GAC3B,0BAA0B;GAC1B,yBAAyB;GACzB,wBAAwB;GACxB,6BAA6B;GAC7B,4BAA4B;GAC5B,0BAA0B;GAC1B,yBAAyB;GACzB,6BAA6B;GAC7B,qBAAqB;GACrB,uBAAuB;GACvB,oBAAoB;GACpB,4BAA4B;GAC5B,2BAA2B;GAC3B,2BAA2B;GAC3B,0BAA0B;GAC1B,4BAA4B;GAC5B,qBAAqB;GACrB,4BAA4B;GAC5B,iCAAiC;GACjC,iCAAiC;GACjC,kCAAkC;GAClC,mCAAmC;GACnC,kCAAkC;GAClC,6BAA6B;GAC7B,iCAAiC;GACjC,6BAA6B;GAC7B,kCAAkC;GAClC,6BAA6B;GAC7B,kCAAkC;GAClC,4BAA4B;GAC5B,gCAAgC;GAEhC,eAAe;GACf,oBAAoB;GACpB,mBAAmB;GACnB,qBAAqB;GACrB,oBAAoB;GACpB,uBAAuB;GACvB,qBAAqB;GACrB,kBAAkB;GAClB,wBAAwB;GACxB,uBAAuB;GACvB,uBAAuB;GACvB,0BAA0B;GAC1B,uBAAuB;GACvB,2BAA2B;GAC3B,qBAAqB;GACrB,qBAAqB;GACrB,sBAAsB;GACtB,2BAA2B;GAC3B,uBAAuB;GACvB,yBAAyB;GACzB,wBAAwB;GACxB,4BAA4B;GAC5B,uBAAuB;GACvB,sBAAsB;GACtB,qBAAqB;GACrB,6BAA6B;GAC7B,gCAAgC;GAChC,wBAAwB;GACxB,0BAA0B;GAC1B,6BAA6B;GAC7B,yBAAyB;GACzB,uBAAuB;GACvB,sBAAsB;GACtB,uBAAuB;GACvB,sBAAsB;GACtB,iCAAiC;GACjC,6BAA6B;GAC7B,wCAAwC;GACxC,yBAAyB;GACzB,oCAAoC;GACpC,wBAAwB;GACxB,yBAAyB;GACzB,sBAAsB;GACtB,uBAAuB;GACvB,6BAA6B;GAC7B,yBAAyB;GACzB,wBAAwB;GACxB,sBAAsB;GACtB,6BAA6B;GAC7B,kBAAkB;GAClB,qBAAqB;GACrB,sBAAsB;GACtB,qBAAqB;GACrB,kBAAkB;GAClB,+BAA+B;GAC/B,0BAA0B;GAC1B,mCAAmC;GACnC,0BAA0B;GAC1B,gCAAgC;GAChC,4BAA4B;GAC5B,8BAA8B;GAC9B,yBAAyB;GACzB,yBAAyB;GACzB,0BAA0B;GAC1B,0BAA0B;GAC1B,6BAA6B;GAC7B,2BAA2B;GAC3B,0BAA0B;GAC1B,yBAAyB;GACzB,+BAA+B;GAC/B,8BAA8B;GAC9B,+BAA+B;GAC/B,8BAA8B;GAC9B,gCAAgC;GAChC,+BAA+B;GAC/B,0BAA0B;GAC1B,uBAAuB;GACvB,4BAA4B;GAC5B,qBAAqB;GACrB,uBAAuB;GACvB,2BAA2B;GAC3B,oBAAoB;GACpB,oBAAoB;GACpB,sBAAsB;GACtB,qBAAqB;GACrB,qBAAqB;GACrB,uBAAuB;GACvB,wBAAwB;GACxB,sBAAsB;GACtB,6BAA6B;GAC7B,0BAA0B;GAC1B,0BAA0B;GAC1B,4BAA4B;GAC5B,2BAA2B;GAC3B,qBAAqB;GACrB,0BAA0B;GAE1B,gBAAgB;GAChB,6BAA6B;GAC7B,4BAA4B;GAC5B,wBAAwB;GACxB,uBAAuB;GACvB,uBAAuB;GACvB,sBAAsB;GAEtB,wBAAwB;GACxB,uBAAuB;GACvB,sBAAsB;GACtB,yBAAyB;GACzB,4BAA4B;GAC5B,8BAA8B;GAC9B,4BAA4B;GAC5B,iCAAiC;GACjC,yBAAyB;GACzB,wBAAwB;GACxB,+BAA+B;GAC/B,+BAA+B;GAC/B,qCAAqC;GACrC,8BAA8B;GAC9B,+BAA+B;GAC/B,gCAAgC;GAChC,gCAAgC;GAChC,oCAAoC;GACpC,mCAAmC;GACnC,mCAAmC;GACnC,+BAA+B;GAC/B,0BAA0B;GAC1B,kCAAkC;GAClC,iCAAiC;GACjC,6BAA6B;GAC7B,4BAA4B;GAC5B,qCAAqC;GACrC,iCAAiC;GACjC,gCAAgC;GAChC,oCAAoC;GACpC,8BAA8B;GAC9B,8BAA8B;GAC9B,kCAAkC;GAClC,sCAAsC;GACtC,sCAAsC;GACtC,kCAAkC;GAClC,iCAAiC;GACjC,sCAAsC;GACtC,oCAAoC;GACpC,yCAAyC;GACzC,gCAAgC;GAChC,oCAAoC;GACpC,gCAAgC;GAChC,qCAAqC;EACvC;EAsBA,MAAa,oBAA0G;GACrH,IAAI;IArB4C,GAAG;IAAS,GAAG;IAAW,GAAG;IAAY,GAAG;IAAU,GAAG;GAqBrG;GACJ,IAAI;IArB4C,GAAG;IAAS,GAAG;IAAW,GAAG;IAAY,GAAG;IAAU,GAAG;GAqBrG;EACN;;EAGA,SAAgB,yBAAyB,QAA8C;GACrF,OAAO,OAAO,SAASA,kBAAgB,iBAAiB;EAC1D;;;;;;;;;;ECzjBA,SAAgB,uBAAuB,KAAoB,MAA2C;GACpG,MAAM,aAAa,IAAI,MAAM,OAAO,8BAA8B,IAAI,MAAM,SAAS;IACnF,MAAM;IAAwB,IAAI;IAAe,OAAO;IAExD,aAAa,KAAK,EAAE,WAAW;IAC/B,QAAQC;IACR,cAAc;GAChB,GAAG,WAAW,CAAC;GACf,MAAM,iBAAiB,IAAI,MAAM,OAAO,uBAAuB,IAAI,MAAM,SAAS;IAChF,MAAM;IAAiB,IAAI;IAAyB,OAAO;IAC3D,QAAQA;IACR,cAAc;GAChB,GAAG,gBAAgB,CAAC;GACpB,aAAa;IAAE,eAAe;IAAG,WAAW;GAAE;EAChD;;;;EC1BA,IAAa,gCAAb,MAA2C;GACzC,WAAgD,EAAE,MAAM,MAAM;GAC9D,4BAA6B,IAAI,IAAgB;GAEjD,oBAAiD,KAAK;GAEtD,aAAa,aAAuC;IAClD,KAAK,UAAU,IAAI,QAAQ;IAC3B,aAAa;KAAE,KAAK,UAAU,OAAO,QAAQ;IAAE;GACjD;GAEA,OAAa;IAAE,KAAK,QAAQ,IAAI;GAAE;GAClC,QAAc;IAAE,KAAK,QAAQ,KAAK;GAAE;GACpC,SAAe;IAAE,KAAK,QAAQ,CAAC,KAAK,SAAS,IAAI;GAAE;GAEnD,QAAgB,MAAqB;IACnC,IAAI,KAAK,SAAS,SAAS,MAAM;IACjC,KAAK,WAAW,EAAE,KAAK;IACvB,KAAK,MAAM,YAAY,KAAK,WAAW,SAAS;GAClD;EACF;;;ECLA,MAAa,SAAS;GACpB;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF;;EAGA,MAAM,iBAAiB;EAEvB,SAAgB,MAAM,KAA0B;GAG9C,IAAI,aAAa,yBAAyB,IAAI,MAAM,CAAC;GACrD,MAAM,IAAI,IAAI,OAAO,KAAKC,gBAAS;GAInC,IAAI,aAAa,IAAI,GAAG,0BAA0B;IAChD,WAAgB,UAAU,EAAE,SAAS,KAAK,CAAC,CAAC,CAAC,YAAY,KAAA,CAAS;GACpE,CAAC,CAAC;GAEF,MAAM,QAAQ,IAAI,YAAY,IAA6B,cAAc;GACzE,MAAM,WAAwC;IAC5C;IACA,cAAc,IAAI,YAAY,SAAS,CAAC,CAAC,OAAO;IAChD,QAAQ,OAAO,KAAK,qBAAqB;KACvC,IAAI,CAAC,MAAM,MAAM,OAAO,KAAK,gBAAgB,GAAG,MAAM,IAAI,MAAM,EAAE,uBAAuB,CAAC;IAC5F;GACF;GAIA,MAAM,yBAA6C,qBAAqB,IAAI,UAAU,SAAS,IAAI,QAAQ;GAC3G,MAAM,UAA6B;IACjC;IACA,yBAAyB,aAAa,yBAAyB,IAAI,UAAU,SAAS,IAAI,UAAU,QAAQ;IAC5G,kBAAkB,YAAY;KAC5B,IAAI;MACF,MAAM,SAAS,MAAM,IAAI,OAAO,aAAa,KAAK;MAClD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC;MAExB,QADiB,OAAO,MAAmI,WACxI,CAAC,EAAA,CAAG,QAAQ,WAAW,OAAO,WAAW,KAAA,CAAS,CAAC,CAAC,KAAK,EAAE,IAAI,MAAM,aAAa,aAAa;OAChH;OACA,GAAI,SAAS,KAAA,IAAY,CAAC,IAAI,EAAE,KAAK;OACrC,GAAI,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,YAAY;OACnD,GAAI,UAAU,KAAA,IAAY,CAAC,IAAI,EAAE,MAAM;MACzC,EAAE;KACJ,QAAQ;MACN,OAAO,CAAC;KACV;IACF;IACA,qBAAqB,IAAI,YAAY,cAAc;IACnD,UAAU,OAAO,SAAS;KACxB,MAAM,SAAS,MAAM,IAAI,OAAO,QAAQ,kBAAkB,EAAE,KAAK,CAAC;KAClE,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,MAAM,OAAO,MAAM,OAAO;IACtD;IAGA,cAAc,uBACZ;KACE;KACA,mBAAmB,aAAa,IAAI,UAAU,QAAQ,QAAQ,UAAU,QAAQ;KAEhF,UAAU,OAAO,IAAI,SAAS,QAAQ,EAAgD;KACtF,kBAAkB,OAAO,IAAI,SAAS,gBAAgB,EAAwD;IAChH,IACC,YAAY,IAAI,OAAO,QAAQ,YAAY,OAA+D,CAC7G;IAGA,eAAe,wBAAwB;KACrC;KACA,mBAAmB,aAAa,IAAI,UAAU,QAAQ,QAAQ,UAAU,QAAQ;KAChF,UAAU,OAAO,IAAI,SAAS,QAAQ,EAAgD;IACxF,CAAC;IACD,cAAc,OAAO,OAAO;KAC1B,MAAM,YAAY,iBAAiB;KACnC,MAAM,OAAO,IAAI,SAAS,KAAK,YAAY;KAC3C,MAAM,UAAU,cAAc,KAAA,IAAY,KAAA,IAAY,KAAK,KAAK;KAChE,IAAI,YAAY,KAAA,GAAW,OAAO,EAAE,SAAS,MAAM;KACnD,IAAI,CAAC,QAAQ,OACX,OAAO;MAAE,SAAS;MAAO,SAAS,EAAE,uCAAuC;KAAE;KAE/E,MAAM,SAAS,MAAM,IAAI,OAAO,aAAa,OAAO,QAAQ,IAAI,EAAE;KAClE,IAAI,CAAC,OAAO,IAAI;MACd,MAAM,UAAU,OAAO;MACvB,MAAM,SAAS,QAAQ,SAAS;MAChC,OAAO;OACL,SAAS;OACT,SAAS,OAAO,WAAW,WAAW,SAAS,QAAQ;MACzD;KACF;KACA,OAAO,EAAE,SAAS,KAAK;IACzB;GACF;GAOA,uBAAuB,KAAK;IADY,YAAY,IAAI,8BAA8B;IAAG,KAAK;IAAS;IAAU;GACrF,CAAI;EAClC"}
|