@green-on-grey/ui-kit 1.8.0 → 1.10.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/dist/chat.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"chat.js","names":["_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","useToast","Icon","Modal","Markdown","useOutside","useKitT","UIKIT_NS","matchCommands","q","query","commands","c","CommandPalette","t","items","skills","row","i","active","e","onPick","onHover","intlLocale","lng","tokens","n","ContextMeter","useTranslation","open","setOpen","useState","ref","share","context","pct","level","i18n","v","onCompact","onReset","Fragment","MeterAction","busy","run","icon","label","IMAGES","IMAGE_EXT","TEXT_EXT","previewKind","type","a","name","KIND_ICON","previewIcon","kind","fileSize","units","bytes","language","HTML_POLICY","htmlDocument","meta","doctype","text","doc","el","attr","URL_ATTRS","SAFE_URL","cleanCss","policy","css","u","m","TYPE_BY_EXT","previewType","own","parseTable","tab","l","rows","cell","quoted","useBlob","state","setState","useEffect","enabled","url","live","load","typed","blob","id","href","fileName","mimeType","size","Thumb","failed","Tile","onOpen","preview","body","AttachmentList","TableView","head","shown","r","j","PAGE_WIDTH","HtmlPage","box","useRef","boxWidth","setBoxWidth","pageWidth","setPageWidth","fit","ro","useMemo","measured","setMeasured","measure","frame","read","page","scale","AttachmentPreview","textual","source","setSource","knownTooLarge","content","setContent","tooLarge","buf","onClose","markTime","iso","visibleSteps","steps","STEP","MessageView","EventDivider","mark","atts","loadAttachment","onOpenAttachment","waiting","s","onRetry","ev","transcribe","recognize","recording","on","useRecorder","supported","setRecording","seconds","setSeconds","setLevel","error","setError","rec","chunks","timer","audio","stopped","discard","limit","onLimit","cleanup","useCallback","tr","start","stream","analyser","Ctx","samples","began","limited","peak","maxSeconds","stop","resolve","cancel","clock","Chat","toast","setText","pending","setPending","uploading","setUploading","skill","setSkill","setActive","paletteClosed","setPaletteClosed","unknown","setUnknown","recognizing","setRecognizing","viewing","setViewing","latestLoader","props","canLoad","loadFile","voice","listRef","fileRef","fieldRef","recorder","stopAndTranscribe","turnRunning","messages","onPendingChange","first","tail","last","tailText","tailSteps","lastLayout","was","paletteOpen","clear","runCommand","rest","send","msg","asText","word","cmd","f","pick","keys","d","touchKeyboard","useLayoutEffect","keepListEnd","fitField","width","attach","files","x","reason","retry","voiceKey","placeholder","left","y","VoiceButton","onStart","atEnd","list","pinned","change","full","ConversationList","creating","setCreating","onKey","item","currentId","inGroup","conversations","g","topics","archive","onCreate","NewTopicModal","ChatLayout","narrow","title","setTitle","create","AgentButton","small","expanded","AgentMenu","draft","setDraft","next","onRename","optionsLabel","options","value","o","models","single","b","hint","agentModelKey","agentModelOptions","badges","warn","choice","AgentSettingsMenu","block","onModel","key"],"sources":["../src/chat/CommandPalette.tsx","../src/chat/intl.ts","../src/chat/ContextMeter.tsx","../src/chat/Attachments.tsx","../src/chat/MessageView.tsx","../src/chat/transcription.ts","../src/chat/useRecorder.ts","../src/chat/Chat.tsx","../src/chat/ConversationList.tsx","../src/chat/AgentMenu.tsx","../src/chat/AgentSettingsMenu.tsx"],"sourcesContent":["import { Icon } from \"../components/Icon\";\nimport { useKitT } from \"../i18n\";\nimport type { ChatCommand } from \"./types\";\n\n/** The items of the palette that match what is typed after \"/\". */\nexport function matchCommands(commands: ChatCommand[], query: string): ChatCommand[] {\n const q = query.toLowerCase();\n return commands.filter((c) => c.name.toLowerCase().includes(q) || (c.description ?? \"\").toLowerCase().includes(q));\n}\n\n/** The palette of commands and skills over the composer (FTR.NAB.CHAT-0001 R4,\n * design §3.1). The composer owns the keys: arrows move `active`, Enter and Tab\n * pick it, Esc closes. */\nexport function CommandPalette({ items, active, onPick, onHover }: {\n items: ChatCommand[];\n active: number;\n onPick: (c: ChatCommand) => void;\n onHover: (i: number) => void;\n}) {\n const t = useKitT();\n const commands = items.filter((c) => c.kind === \"command\");\n const skills = items.filter((c) => c.kind === \"skill\");\n const row = (c: ChatCommand, i: number) => (\n <button key={c.kind + c.name} type=\"button\" role=\"option\" aria-selected={i === active} className={`palette-row${i === active ? \" on\" : \"\"}`}\n // the field keeps the focus: the pick happens before the blur\n onMouseDown={(e) => { e.preventDefault(); onPick(c); }} onMouseEnter={() => onHover(i)}>\n {/* the name of a command starts with «/» itself: its column stays empty, the names line up with the skills */}\n {c.kind === \"skill\" ? <Icon name=\"spark\" size={14} /> : <span className=\"slash\" aria-hidden=\"true\" />}\n <span className=\"nm\">{c.kind === \"command\" ? \"/\" + c.name : c.name}</span>\n <span className=\"ds\">{c.description}</span>\n {c.source && <span className=\"src\">{c.source}</span>}\n </button>\n );\n return (\n <div className=\"palette\" role=\"listbox\" aria-label={t(\"chat.palette.title\")}>\n {items.length === 0 && <div className=\"palette-empty\">{t(\"chat.palette.empty\")}</div>}\n {commands.length > 0 && <div className=\"palette-h\">{t(\"chat.palette.commands\")}</div>}\n {commands.map((c) => row(c, items.indexOf(c)))}\n {items.length > 0 && <div className=\"palette-h\">{t(\"chat.palette.skills\")}</div>}\n {skills.length === 0 && items.length > 0 && <div className=\"palette-empty\">{t(\"chat.palette.noSkills\")}</div>}\n {skills.map((c) => row(c, items.indexOf(c)))}\n </div>\n );\n}\n","/** The locale of Intl formatting for a language code of the products. */\nexport const intlLocale = (lng: string) => (lng === \"zh\" ? \"zh-CN\" : lng);\n","import { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Icon, type IconName } from \"../components/Icon\";\nimport { useOutside } from \"../components/ui\";\nimport { UIKIT_NS, useKitT } from \"../i18n\";\nimport type { ChatContext } from \"./types\";\nimport { intlLocale } from \"./intl\";\n\n/** A number of tokens shortly: 42K, 1.2M in the language of the interface. */\nexport function tokens(n: number, lng: string): string {\n return new Intl.NumberFormat(intlLocale(lng), { notation: \"compact\", maximumFractionDigits: 1 }).format(n);\n}\n\n/** The fill of the context window by a ring next to the send button\n * (FTR.NAB.CHAT-0001 R3, design §3.1): grey, amber from 70 %, red from 90 %.\n * A click shows the numbers; a full context (from 90 %) offers to compact or to reset, off while the agent answers. */\nexport function ContextMeter({ context, onCompact, onReset, busy = false }: {\n context: ChatContext; onCompact?: () => void; onReset?: () => void;\n /** A turn is being written: the actions wait for it. */\n busy?: boolean;\n}) {\n const t = useKitT();\n const { i18n } = useTranslation(UIKIT_NS);\n const [open, setOpen] = useState(false);\n const ref = useOutside<HTMLDivElement>(open, () => setOpen(false));\n const share = context.window > 0 ? Math.min(1, context.tokens / context.window) : 0;\n const pct = Math.round(share * 100);\n const level = share >= 0.9 ? \"full\" : share >= 0.7 ? \"warn\" : \"\";\n const r = 7;\n const c = 2 * Math.PI * r;\n const lng = i18n.language;\n return (\n <div className=\"ctxmeter\" ref={ref}>\n <button type=\"button\" className={`ctxring ${level}`} aria-expanded={open} onClick={() => setOpen((v) => !v)}\n aria-label={t(\"chat.context.meter\", { used: tokens(context.tokens, lng), total: tokens(context.window, lng), pct })}\n title={t(\"chat.context.meter\", { used: tokens(context.tokens, lng), total: tokens(context.window, lng), pct })}>\n <svg viewBox=\"0 0 18 18\" aria-hidden=\"true\">\n <circle className=\"bg\" cx=\"9\" cy=\"9\" r={r} />\n <circle className=\"fg\" cx=\"9\" cy=\"9\" r={r} strokeDasharray={`${(c * share).toFixed(1)} ${c.toFixed(1)}`} transform=\"rotate(-90 9 9)\" />\n </svg>\n </button>\n {open && (\n <div className=\"ctxtip\" role=\"dialog\">\n <div>{t(\"chat.context.meter\", { used: tokens(context.tokens, lng), total: tokens(context.window, lng), pct })}</div>\n {level === \"full\" && <div className=\"small muted\" style={{ marginTop: 4 }}>{t(\"chat.context.full\")}</div>}\n {level === \"full\" && (onCompact || onReset) && (\n <>\n <div className=\"row\" style={{ marginTop: 8, gap: 6 }}>\n {/* design §3.1: both actions, as buttons with their border */}\n {onCompact && <MeterAction icon=\"compress\" label={t(\"chat.context.compact\")} busy={busy}\n run={() => { setOpen(false); onCompact(); }} />}\n {onReset && <MeterAction icon=\"reset\" label={t(\"chat.context.reset\")} busy={busy} run={() => { setOpen(false); onReset(); }} />}\n </div>\n {/* the reason is said in words: a disabled button shows no tooltip everywhere and is not read out */}\n {busy && <div id=\"ctx-wait\" className=\"small muted\" style={{ marginTop: 6 }}>{t(\"chat.context.waitTurn\")}</div>}\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n\n/** An action on the context: off while a turn runs, described by the reason under it. */\nfunction MeterAction({ icon, label, busy, run }: { icon: IconName; label: string; busy: boolean; run: () => void }) {\n return (\n <button type=\"button\" className=\"btn sm\" disabled={busy} aria-describedby={busy ? \"ctx-wait\" : undefined} onClick={run}>\n <Icon name={icon} size={14} />{label}\n </button>\n );\n}\n","import { useEffect, useMemo, useRef, useState, type SyntheticEvent } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Icon, type IconName } from \"../components/Icon\";\nimport { Markdown } from \"../components/Markdown\";\nimport { Modal } from \"../components/ui\";\nimport { UIKIT_NS, useKitT } from \"../i18n\";\nimport { intlLocale } from \"./intl\";\nimport type { ChatAttachment } from \"./types\";\n\n// The files of a message and their preview (FTR.NAB.CHAT-0001 R34, design §3.6):\n// images as thumbnails, the files with a preview as tiles with the icon of the\n// preview, the rest as tiles that download.\n\nexport type PreviewKind = \"image\" | \"pdf\" | \"markdown\" | \"table\" | \"html\" | \"text\";\n\n/** Loads the content of an attachment: the product fetches it with its session. */\nexport type LoadAttachment = (a: ChatAttachment) => Promise<Blob>;\n\n// SVG is an image of <img>: there its scripts do not run.\nconst IMAGES = new Set([\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\", \"image/svg+xml\"]);\nconst IMAGE_EXT = /\\.(png|jpe?g|gif|webp|svg)$/;\nconst TEXT_EXT = /\\.(txt|log|json|ya?ml|xml|ini|toml|sql|sh|py|go|js|ts|tsx|java|kt|rb|rs|c|cpp|h|css)$/;\n\n/** Text, tables and Markdown larger than this are downloaded, not drawn. */\nexport const TEXT_PREVIEW_MAX = 1 << 20;\n/** The rows of a table shown in the preview. */\nexport const TABLE_ROWS = 500;\n\n/** How an attachment is previewed, or null when it is only downloaded. */\nexport function previewKind(a: Pick<ChatAttachment, \"fileName\" | \"mimeType\">): PreviewKind | null {\n const type = (a.mimeType ?? \"\").toLowerCase().split(\";\")[0].trim();\n const name = a.fileName.toLowerCase();\n if (IMAGES.has(type) || ((!type || type === \"application/octet-stream\") && IMAGE_EXT.test(name))) return \"image\";\n if (type === \"application/pdf\" || name.endsWith(\".pdf\")) return \"pdf\";\n if (type === \"text/markdown\" || /\\.(md|markdown)$/.test(name)) return \"markdown\";\n if (type === \"text/csv\" || type === \"text/tab-separated-values\" || /\\.(csv|tsv)$/.test(name)) return \"table\";\n if (type === \"text/html\" || /\\.html?$/.test(name)) return \"html\";\n if (type.startsWith(\"text/\") || type === \"application/json\" || type === \"application/xml\" || TEXT_EXT.test(name)) return \"text\";\n return null;\n}\n\nconst KIND_ICON: Record<PreviewKind, IconName> = { image: \"image\", pdf: \"pdf\", markdown: \"markdown\", table: \"table\", html: \"globe\", text: \"source\" };\n\n/** The icon of a kind of preview: the tiles of the chat and the products' own lists of files show it. */\nexport const previewIcon = (kind: PreviewKind): IconName => KIND_ICON[kind];\n\n/** The label of a tile: the kind of the preview or the extension of the file. */\nfunction label(a: ChatAttachment, kind: PreviewKind | null): string {\n if (kind === \"pdf\") return \"PDF\";\n if (kind === \"markdown\") return \"MD\";\n if (kind === \"html\") return \"HTML\";\n const ext = /\\.([a-z0-9]{1,5})$/i.exec(a.fileName)?.[1]?.toUpperCase();\n return ext ?? (kind ? \"TXT\" : \"FILE\");\n}\n\n/** The size of a file in the units of the language. */\nexport function fileSize(bytes: number, language: string): string {\n const units = [\"byte\", \"kilobyte\", \"megabyte\", \"gigabyte\"] as const;\n let v = bytes;\n let i = 0;\n while (v >= 1024 && i < units.length - 1) {\n v /= 1024;\n i++;\n }\n return new Intl.NumberFormat(intlLocale(language), {\n style: \"unit\", unit: units[i], unitDisplay: \"short\", maximumFractionDigits: i === 0 ? 0 : 1,\n }).format(v);\n}\n\n/** The policy put into a previewed HTML page: nothing is loaded from outside and nothing runs; images and\n * fonts inside the file and its own styles stay. */\nconst HTML_POLICY = \"default-src 'none'; img-src data:; media-src data:; font-src data:; style-src 'unsafe-inline' data:\";\n\n/** The document of a previewed HTML page. In a browser the page is parsed inert (a DOMParser loads nothing) and\n * cleaned of everything that would load or lead anywhere: scripts, frames, plug-ins, links of the head, its own\n * `http-equiv` (a refresh), and every address that is not `data:`, `blob:` or an anchor — a relative one would go to\n * the site with the session. The policy is put first into the head, after the doctype of the file, so the page keeps\n * its mode. The policy alone is not enough: a browser may fetch a picture before it applies a policy of a meta. */\nexport function htmlDocument(text: string): string {\n const meta = `<meta http-equiv=\"Content-Security-Policy\" content=\"${HTML_POLICY}\">`;\n const doctype = /^\\s*<!doctype[^>]*>/i.exec(text)?.[0] ?? \"\";\n if (typeof DOMParser === \"undefined\") return doctype + meta + text.slice(doctype.length);\n const doc = new DOMParser().parseFromString(text, \"text/html\");\n doc.querySelectorAll(\"script, noscript, iframe, frame, frameset, object, embed, applet, base, link, meta[http-equiv], portal\").forEach((el) => el.remove());\n doc.querySelectorAll(\"*\").forEach((el) => {\n // a copy: attributes are removed while they are walked\n for (const attr of Array.from(el.attributes)) {\n const name = attr.name.toLowerCase();\n if (name.startsWith(\"on\")) el.removeAttribute(attr.name);\n else if (URL_ATTRS.has(name) && !SAFE_URL.test(attr.value)) el.removeAttribute(attr.name);\n else if (name === \"srcset\" && attr.value.split(\",\").some((c) => !SAFE_URL.test(c))) el.removeAttribute(attr.name);\n else if (name === \"style\") el.setAttribute(\"style\", cleanCss(attr.value));\n }\n });\n doc.querySelectorAll(\"style\").forEach((el) => { el.textContent = cleanCss(el.textContent ?? \"\"); });\n const policy = doc.createElement(\"meta\");\n policy.setAttribute(\"http-equiv\", \"Content-Security-Policy\");\n policy.setAttribute(\"content\", HTML_POLICY);\n doc.head.prepend(policy);\n return (doctype ? \"<!doctype html>\" : \"\") + doc.documentElement.outerHTML;\n}\n\n// The attributes that load a resource or lead to an address.\nconst URL_ATTRS = new Set([\"src\", \"href\", \"xlink:href\", \"action\", \"formaction\", \"poster\", \"background\", \"data\", \"ping\", \"lowsrc\", \"dynsrc\", \"manifest\", \"cite\", \"longdesc\", \"codebase\", \"archive\", \"usemap\"]);\n// No `blob:`: the frame shares the origin of the site (HtmlPage), so a blob address would reach the files the site\n// holds, other attachments among them.\nconst SAFE_URL = /^\\s*(data:|#|$)/i;\n\n/** CSS without what loads from outside: `@import` and any `url()` that is not `data:`. */\nfunction cleanCss(css: string): string {\n return css.replace(/@import[^;]*;?/gi, \"\").replace(/url\\(\\s*(['\"]?)(.*?)\\1\\s*\\)/gi, (m, _q: string, u: string) => (SAFE_URL.test(u) && u.trim() !== \"\" ? m : \"none\"));\n}\n\n// The types of the previews by the extension: a file whose type is unknown (a file of a space comes as\n// application/octet-stream) is drawn by the type of its name.\nconst TYPE_BY_EXT: Record<string, string> = {\n png: \"image/png\", jpg: \"image/jpeg\", jpeg: \"image/jpeg\", gif: \"image/gif\", webp: \"image/webp\", svg: \"image/svg+xml\",\n pdf: \"application/pdf\", md: \"text/markdown\", markdown: \"text/markdown\", csv: \"text/csv\", tsv: \"text/tab-separated-values\",\n html: \"text/html\", htm: \"text/html\",\n};\n\n/** The type a preview draws a file with: its own, else the one of its extension. */\nexport function previewType(a: Pick<ChatAttachment, \"fileName\" | \"mimeType\">): string | undefined {\n const own = (a.mimeType ?? \"\").split(\";\")[0].trim().toLowerCase();\n if (own && own !== \"application/octet-stream\") return own;\n return TYPE_BY_EXT[/\\.([a-z0-9]+)$/i.exec(a.fileName)?.[1]?.toLowerCase() ?? \"\"] ?? (own || undefined);\n}\n\n/** The rows of CSV (quotes by RFC 4180) or TSV. */\nexport function parseTable(text: string, tab: boolean): string[][] {\n if (tab) return text.replace(/\\r?\\n$/, \"\").split(/\\r?\\n/).map((l) => l.split(\"\\t\"));\n const rows: string[][] = [];\n let row: string[] = [];\n let cell = \"\";\n let quoted = false;\n for (let i = 0; i < text.length; i++) {\n const c = text[i];\n if (quoted) {\n if (c === '\"' && text[i + 1] === '\"') {\n cell += '\"';\n i++;\n } else if (c === '\"') quoted = false;\n else cell += c;\n } else if (c === '\"') quoted = true;\n else if (c === \",\") {\n row.push(cell);\n cell = \"\";\n } else if (c === \"\\n\" || c === \"\\r\") {\n if (c === \"\\r\" && text[i + 1] === \"\\n\") i++;\n row.push(cell);\n rows.push(row);\n row = [];\n cell = \"\";\n } else cell += c;\n }\n if (cell !== \"\" || row.length > 0) {\n row.push(cell);\n rows.push(row);\n }\n return rows;\n}\n\n/** An object URL of the loaded attachment, revoked when it is no longer shown. */\nfunction useBlob(a: ChatAttachment, load: LoadAttachment, enabled = true) {\n const [state, setState] = useState<{ url?: string; blob?: Blob; failed?: boolean }>({});\n // the adapter builds new objects on every render: the file is loaded once per file, not per object\n const { id, href, fileName, mimeType, size } = a;\n useEffect(() => {\n if (!enabled) return;\n let url: string | undefined;\n let live = true;\n load({ id, href, fileName, mimeType, size }).then((blob) => {\n if (!live) return;\n // the type of the product's metadata: a blob of a download is often untyped\n const type = previewType({ fileName, mimeType });\n const typed = type && blob.type !== type ? new Blob([blob], { type }) : blob;\n url = URL.createObjectURL(typed);\n setState({ url, blob: typed });\n }, () => live && setState({ failed: true }));\n return () => {\n live = false;\n if (url) URL.revokeObjectURL(url);\n };\n }, [enabled, load, id, href, fileName, mimeType, size]);\n return state;\n}\n\nfunction Thumb({ a, load, onOpen }: { a: ChatAttachment; load: LoadAttachment; onOpen: () => void }) {\n const t = useKitT();\n const { url, failed } = useBlob(a, load);\n if (failed) return <Tile a={a} kind=\"image\" onOpen={onOpen} />;\n return (\n <button type=\"button\" className=\"att-thumb\" onClick={onOpen} aria-label={t(\"chat.files.open\", { name: a.fileName })} title={a.fileName}>\n {url ? <img src={url} alt=\"\" /> : <span className=\"spin\" aria-hidden=\"true\" />}\n <span className=\"att-cap\">{a.fileName}</span>\n </button>\n );\n}\n\n/** A file as a tile: the icon of its preview, or of the download, its name and size. */\nfunction Tile({ a, kind, onOpen }: { a: ChatAttachment; kind: PreviewKind | null; onOpen?: () => void }) {\n const t = useKitT();\n const { i18n } = useTranslation(UIKIT_NS);\n const preview = kind !== null && onOpen !== undefined;\n const body = (\n <>\n <span className=\"att-ic\">\n <Icon name={preview && kind ? KIND_ICON[kind] : \"download\"} size={24} />\n <span className=\"att-kl\">{label(a, kind)}</span>\n </span>\n <span className=\"att-name\">{a.fileName}</span>\n {a.size != null && <span className=\"att-size\">{fileSize(a.size, i18n.language)}</span>}\n </>\n );\n if (preview) {\n return <button type=\"button\" className={`att-tile ${kind}`} onClick={onOpen} aria-label={t(\"chat.files.open\", { name: a.fileName })} title={a.fileName}>{body}</button>;\n }\n return <a className=\"att-tile dl\" href={a.href} download={a.fileName} aria-label={t(\"chat.files.save\", { name: a.fileName })} title={a.fileName}>{body}</a>;\n}\n\n/** The files of a message: thumbnails of images and tiles; without `load` every file downloads. */\nexport function AttachmentList({ items, load, onOpen }: { items: ChatAttachment[]; load?: LoadAttachment; onOpen?: (a: ChatAttachment) => void }) {\n return (\n <div className=\"atts\">\n {items.map((a) => {\n const open = load && onOpen ? () => onOpen(a) : undefined;\n const kind = previewKind(a);\n return load && open && kind === \"image\"\n ? <Thumb key={a.id} a={a} load={load} onOpen={open} />\n : <Tile key={a.id} a={a} kind={kind} onOpen={open} />;\n })}\n </div>\n );\n}\n\nfunction TableView({ text, tab }: { text: string; tab: boolean }) {\n const t = useKitT();\n const [head, ...body] = parseTable(text, tab);\n const shown = body.slice(0, TABLE_ROWS);\n return (\n <div className=\"att-table\">\n <table>\n {head && <thead><tr>{head.map((c, i) => <th key={i}>{c}</th>)}</tr></thead>}\n <tbody>{shown.map((r, i) => <tr key={i}>{r.map((c, j) => <td key={j}>{c}</td>)}</tr>)}</tbody>\n </table>\n {body.length > shown.length && <div className=\"att-more\">{t(\"chat.files.rows\", { shown: shown.length, total: body.length })}</div>}\n </div>\n );\n}\n\n/** The width a previewed page is laid out at: the one of a desktop. A narrower frame shows it scaled down, so a\n * page made for a screen (a deck of slides) is seen whole instead of cut. */\nexport const PAGE_WIDTH = 1280;\n\n/** A previewed HTML page, laid out at PAGE_WIDTH or at the width of its content when it is wider (a deck of wide\n * slides), and scaled to the width of the preview, so the page is seen whole, without a scroll to the side.\n * The frame has only `allow-same-origin`, so the chat can read the width of the page (FTR.NAB.CHAT-0001 tech,\n * decision 28): nothing in it runs — its scripts are removed (htmlDocument), and the frame and the policy forbid\n * them — and it loads nothing from outside. The isolation rests on the frame having no `allow-scripts`: with it,\n * the page would act as the site. Never add it. */\nfunction HtmlPage({ text, title }: { text: string; title: string }) {\n const box = useRef<HTMLDivElement>(null);\n const [boxWidth, setBoxWidth] = useState(PAGE_WIDTH);\n const [pageWidth, setPageWidth] = useState(PAGE_WIDTH);\n useEffect(() => {\n const el = box.current;\n if (!el) return;\n const fit = () => setBoxWidth(el.clientWidth);\n fit();\n if (typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(fit);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n const doc = useMemo(() => htmlDocument(text), [text]);\n // another document is laid out anew at the width of a desktop, not at the width the last one needed\n const [measured, setMeasured] = useState(doc);\n if (measured !== doc) {\n setMeasured(doc);\n setPageWidth(PAGE_WIDTH);\n }\n const measure = (e: SyntheticEvent<HTMLIFrameElement>) => {\n const frame = e.currentTarget;\n const read = () => {\n const page = frame.contentDocument?.documentElement;\n if (page) setPageWidth(Math.max(PAGE_WIDTH, page.scrollWidth));\n };\n read();\n // the fonts of the file (data:) may widen the page after it has loaded\n void frame.contentDocument?.fonts?.ready.then(read);\n };\n const scale = Math.min(1, boxWidth / pageWidth);\n return (\n <div className=\"att-htmlbox\" ref={box}>\n <iframe className=\"att-html\" sandbox=\"allow-same-origin\" srcDoc={doc} title={title} referrerPolicy=\"no-referrer\" onLoad={measure}\n style={{ width: pageWidth, height: `${100 / scale}%`, transform: `scale(${scale})` }} />\n </div>\n );\n}\n\n/** The text of a file, or null when it is not UTF-8. */\ntype Text = { text: string | null };\n\n/** The preview of an attachment: an image, the browser's PDF viewer, drawn Markdown, a table or text. */\nexport function AttachmentPreview({ a, load, onClose }: { a: ChatAttachment; load: LoadAttachment; onClose: () => void }) {\n const t = useKitT();\n const { i18n } = useTranslation(UIKIT_NS);\n const kind = previewKind(a);\n const textual = kind === \"markdown\" || kind === \"table\" || kind === \"html\" || kind === \"text\";\n const [source, setSource] = useState(false);\n // a known size over the limit is not loaded at all\n const knownTooLarge = textual && (a.size ?? 0) > TEXT_PREVIEW_MAX;\n const { url, blob, failed } = useBlob(a, load, !knownTooLarge);\n const [content, setContent] = useState<Text | null>(null);\n const tooLarge = knownTooLarge || (textual && (blob?.size ?? 0) > TEXT_PREVIEW_MAX);\n useEffect(() => {\n if (!textual || !blob || tooLarge) return;\n void blob.arrayBuffer().then((buf) => {\n try {\n setContent({ text: new TextDecoder(\"utf-8\", { fatal: true }).decode(buf) });\n } catch {\n setContent({ text: null });\n }\n }, () => setContent({ text: null }));\n }, [textual, blob, tooLarge]);\n const text = content?.text;\n let body;\n if (failed) body = <div className=\"att-msg err-text\">{t(\"chat.files.failed\")}</div>;\n else if (tooLarge) body = <div className=\"att-msg\">{t(\"chat.files.tooLarge\")}</div>;\n else if (content && text === null) body = <div className=\"att-msg\">{t(\"chat.files.notUtf8\")}</div>;\n else if (!url || (textual && text == null)) body = <div className=\"att-msg\"><span className=\"spin\" aria-hidden=\"true\" /> {t(\"loading\")}</div>;\n else if (kind === \"image\") body = <img className=\"att-img\" src={url} alt={a.fileName} />;\n // the browser's own viewer; an <object> because a sandboxed frame shows no PDF\n else if (kind === \"pdf\") body = <object className=\"att-pdf\" data={url} type=\"application/pdf\" aria-label={a.fileName}><div className=\"att-msg\">{t(\"chat.files.failed\")}</div></object>;\n else if (kind === \"markdown\") body = <div className=\"att-md\"><Markdown text={text ?? \"\"} /></div>;\n else if (kind === \"table\") body = <TableView text={text ?? \"\"} tab={/\\.tsv$/i.test(a.fileName) || a.mimeType === \"text/tab-separated-values\"} />;\n // a page: a frame with no permissions — no scripts, forms or access to the site — and no loads from outside\n else if (kind === \"html\" && !source) body = <HtmlPage text={text ?? \"\"} title={a.fileName} />;\n else body = <pre className=\"att-text\">{text}</pre>;\n return (\n <Modal wide onClose={onClose}\n title={<span className=\"att-title\"><span className=\"att-name\">{a.fileName}</span>{a.size != null && <span className=\"muted small\">{fileSize(a.size, i18n.language)}</span>}</span>}\n footer={<>\n {kind === \"html\" && (\n <button type=\"button\" className=\"btn ghost\" onClick={() => setSource((v) => !v)}>\n <Icon name={source ? \"globe\" : \"code\"} size={14} /> {t(source ? \"chat.files.page\" : \"chat.files.source\")}\n </button>\n )}\n <a className=\"btn ghost\" href={url ?? a.href} download={a.fileName}><Icon name=\"download\" size={14} /> {t(\"chat.files.download\")}</a>\n <button type=\"button\" className=\"btn primary\" onClick={onClose}>{t(\"close\")}</button>\n </>}>\n <div className={`att-view ${kind ?? \"\"}`}>{body}</div>\n </Modal>\n );\n}\n","import { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Icon } from \"../components/Icon\";\nimport { Markdown } from \"../components/Markdown\";\nimport { UIKIT_NS } from \"../i18n\";\nimport { AttachmentList, type LoadAttachment } from \"./Attachments\";\nimport { intlLocale } from \"./intl\";\nimport type { ChatAttachment, ChatMessage, ChatStep } from \"./types\";\n\n\n/** The time of a caption: hours and minutes in the language of the interface. */\nexport function markTime(iso: string, language: string): string {\n return new Intl.DateTimeFormat(intlLocale(language), { hour: \"2-digit\", minute: \"2-digit\" }).format(new Date(iso));\n}\n\n/** More than three steps are folded to the last two (design §6.4). */\nexport function visibleSteps(steps: ChatStep[], open: boolean): ChatStep[] {\n return open || steps.length <= 3 ? steps : steps.slice(-2);\n}\n\n/** The icon of a step and its colour class by the state of the step. */\nconst STEP = {\n done: { icon: \"check\", cls: \"ok\" },\n error: { icon: \"alert\", cls: \"er\" },\n running: { icon: \"clock\", cls: \"run\" },\n} as const;\n\n/** One message of the conversation (design §6.4). */\nexport function MessageView({ m, busy, onRetry, loadAttachment, onOpenAttachment }: {\n m: ChatMessage; busy: boolean; onRetry?: () => void;\n /** R34: the preview of the files; without it they are links. */\n loadAttachment?: LoadAttachment; onOpenAttachment?: (a: ChatAttachment) => void;\n}) {\n const { t, i18n } = useTranslation(UIKIT_NS);\n const [open, setOpen] = useState(false);\n if (m.role === \"note\") return <div className=\"sysnote\">{m.text}</div>;\n if (m.role === \"event\" && m.event) return <EventDivider m={m} />;\n const mark = m.mark && <div className=\"chan\"><Icon name={m.mark.icon} size={12} /> {m.mark.text} · {markTime(m.createdAt, i18n.language)}</div>;\n const atts = m.attachments && m.attachments.length > 0 && (\n <AttachmentList items={m.attachments} load={loadAttachment} onOpen={onOpenAttachment} />\n );\n if (m.role === \"user\") {\n return (\n <div className=\"m u\">\n {mark}\n {m.content}\n {m.text && <div className=\"bub\">{m.text}</div>}\n {atts}\n {m.wait && (\n <div className={`turnstate${m.wait.state === \"queued\" ? \" q\" : \"\"}`} role=\"status\">\n {m.wait.state === \"queued\"\n ? <><Icon name=\"clock\" size={12} />{t(\"chat.wait.queued\", { count: m.wait.position })}</>\n : <><span className=\"spin\" aria-hidden=\"true\" />{t(\"chat.wait.starting\")}</>}\n </div>\n )}\n </div>\n );\n }\n const steps = m.steps ?? [];\n const waiting = (m.status === \"streaming\" || m.status === \"pending\") && !m.text && !m.content;\n return (\n <div className=\"m a\">\n {mark}\n {steps.length > 3 && (\n <button className=\"tools-fold\" onClick={() => setOpen((v) => !v)} aria-expanded={open}>\n {open ? t(\"chat.hideSteps\") : t(\"chat.moreSteps\", { count: steps.length - 2 })}\n </button>\n )}\n {visibleSteps(steps, open).map((s) => (\n <div key={s.id} className=\"tool\" title={s.title}>\n <Icon name={STEP[s.status].icon} size={14} className={STEP[s.status].cls} />\n <span className=\"tx\">{s.text}</span>\n </div>\n ))}\n {waiting && <div className=\"bub\"><span className=\"typing\" aria-label={t(\"chat.typing\")}><i /><i /><i /></span></div>}\n {m.content ?? (m.text && <div className=\"bub\" title={m.hint}><Markdown text={m.text} /></div>)}\n {atts}\n {m.error && (\n <div className={`llmerr${m.error.transient ? \" amber\" : \"\"}`} role=\"alert\" style={{ marginTop: 6 }}>\n <span>{m.error.text}</span>\n {onRetry && (\n <div className=\"row\">\n <button className=\"btn sm\" disabled={busy} onClick={onRetry}><Icon name=\"refresh\" size={14} />{t(\"chat.retry\")}</button>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\n/** An event of the conversation: a line with a chip; the details unfold\n * (FTR.NAB.CHAT-0001 design §3.2). */\nfunction EventDivider({ m }: { m: ChatMessage }) {\n const { t, i18n } = useTranslation(UIKIT_NS);\n const [open, setOpen] = useState(false);\n const ev = m.event!;\n return (\n <div className=\"evdiv\">\n <div className=\"evline\" role=\"separator\">\n <span className=\"evchip\">\n <Icon name={ev.icon} size={12} />\n {ev.text} · {markTime(m.createdAt, i18n.language)}\n {ev.details && (\n <button type=\"button\" className=\"textbtn\" aria-expanded={open} onClick={() => setOpen((v) => !v)}>\n {t(\"chat.event.details\")} {open ? \"▴\" : \"▾\"}\n </button>\n )}\n </span>\n </div>\n {open && ev.details && <div className=\"evdetails\">{ev.details}</div>}\n </div>\n );\n}\n","/** What the composer does with the outcome of a recognition. */\nexport interface TranscriptionHandlers {\n busy(on: boolean): void;\n /** The recognized text goes into the composer. */\n text(text: string): void;\n /** Nothing was recognized. */\n empty(): void;\n /** The recognition failed: the reason and a way to try the same recording again. */\n failed(reason: string | undefined, retry: () => void): void;\n}\n\n/** Recognizes a recording (FTR.NAB.CHAT-0001 R20, design §3.1). A rejection of the\n * product is a failure the user may retry: the recording stays with the retry until\n * the toast is closed. `null` means the product has told the user itself. */\nexport async function transcribe(recording: Blob, recognize: (b: Blob) => Promise<string | null>, on: TranscriptionHandlers): Promise<void> {\n on.busy(true);\n let r: string | null;\n try {\n r = await recognize(recording);\n } catch (e) {\n on.busy(false);\n on.failed(e instanceof Error && e.message ? e.message : undefined, () => void transcribe(recording, recognize, on));\n return;\n }\n on.busy(false);\n if (r === null) return;\n if (!r) on.empty();\n else on.text(r);\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\n/** Recording with MediaRecorder (FTR.NAB.CHAT-0001 R20): started and stopped\n * by the user, stopped by itself at `maxSeconds`; the level of the voice is\n * sampled for the bar of the recording. */\nexport function useRecorder(maxSeconds = 300, onLimit?: () => void) {\n const supported = typeof window !== \"undefined\" && \"MediaRecorder\" in window && !!navigator.mediaDevices?.getUserMedia;\n const [recording, setRecording] = useState(false);\n const [seconds, setSeconds] = useState(0);\n const [level, setLevel] = useState(0);\n const [error, setError] = useState(false);\n const rec = useRef<MediaRecorder | null>(null);\n const chunks = useRef<Blob[]>([]);\n const timer = useRef<number | undefined>(undefined);\n const audio = useRef<AudioContext | null>(null);\n const stopped = useRef<((b: Blob | null) => void) | null>(null);\n const discard = useRef(false);\n const limit = useRef(onLimit);\n useEffect(() => {\n limit.current = onLimit;\n });\n\n const cleanup = useCallback(() => {\n window.clearInterval(timer.current);\n rec.current?.stream.getTracks().forEach((tr) => tr.stop());\n rec.current = null;\n void audio.current?.close().catch(() => undefined);\n audio.current = null;\n setRecording(false);\n setLevel(0);\n }, []);\n\n const start = useCallback(async () => {\n if (!supported || rec.current) return;\n setError(false);\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n const r = new MediaRecorder(stream);\n chunks.current = [];\n discard.current = false;\n r.ondataavailable = (e) => e.data.size > 0 && chunks.current.push(e.data);\n r.onstop = () => {\n const blob = !discard.current && chunks.current.length ? new Blob(chunks.current, { type: r.mimeType || \"audio/webm\" }) : null;\n cleanup();\n stopped.current?.(blob);\n stopped.current = null;\n };\n let analyser: AnalyserNode | null = null;\n try {\n const Ctx = window.AudioContext ?? (window as unknown as { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;\n if (Ctx) {\n audio.current = new Ctx();\n analyser = audio.current.createAnalyser();\n analyser.fftSize = 256;\n audio.current.createMediaStreamSource(stream).connect(analyser);\n }\n } catch {\n analyser = null; // the bar stays flat without Web Audio\n }\n const samples = analyser ? new Uint8Array(analyser.fftSize) : null;\n rec.current = r;\n r.start();\n setSeconds(0);\n setRecording(true);\n const began = Date.now();\n let limited = false;\n timer.current = window.setInterval(() => {\n const s = Math.floor((Date.now() - began) / 1000);\n setSeconds(s);\n if (analyser && samples) {\n analyser.getByteTimeDomainData(samples);\n let peak = 0;\n for (const v of samples) peak = Math.max(peak, Math.abs(v - 128));\n setLevel(Math.min(1, peak / 64));\n }\n if (s >= maxSeconds && !limited) {\n limited = true;\n limit.current?.();\n }\n }, 100);\n } catch {\n setError(true);\n cleanup();\n }\n }, [supported, cleanup, maxSeconds]);\n\n const stop = useCallback(() => new Promise<Blob | null>((resolve) => {\n const r = rec.current;\n if (!r || r.state === \"inactive\") return resolve(null);\n stopped.current = resolve;\n r.stop();\n }), []);\n\n /** Ends the recording and drops it. */\n const cancel = useCallback(() => {\n discard.current = true;\n void stop();\n }, [stop]);\n\n useEffect(() => () => cleanup(), [cleanup]);\n\n return { supported, recording, seconds, level, error, start, stop, cancel };\n}\n\n/** m:ss of a number of seconds. */\nexport function clock(seconds: number): string {\n return `${Math.floor(seconds / 60)}:${String(seconds % 60).padStart(2, \"0\")}`;\n}\n","import { useEffect, useLayoutEffect, useMemo, useRef, useState, type KeyboardEvent } from \"react\";\nimport { Icon } from \"../components/Icon\";\nimport { useToast } from \"../components/ui\";\nimport { useKitT } from \"../i18n\";\nimport { CommandPalette, matchCommands } from \"./CommandPalette\";\nimport { ContextMeter } from \"./ContextMeter\";\nimport { MessageView } from \"./MessageView\";\nimport { AttachmentPreview, type LoadAttachment } from \"./Attachments\";\nimport { transcribe } from \"./transcription\";\nimport type { ChatAttachment, ChatCommand, ChatProps, ChatUpload } from \"./types\";\nimport { clock, useRecorder } from \"./useRecorder\";\n\n/** The conversation: the messages and the composer (FTR.NAB.CMN-0005 R11–R13,\n * design §6; FTR.NAB.CHAT-0001 design §3.1). The behaviour is the one of the\n * chat of Nabu. A control exists only when the product gave its handler: no\n * `onCancel` — no cancel button, no `commands` — no palette. */\nexport function Chat(props: ChatProps) {\n const t = useKitT();\n const toast = useToast();\n const [text, setText] = useState(\"\");\n const [pending, setPending] = useState<ChatUpload[]>([]);\n const [uploading, setUploading] = useState(false);\n const [skill, setSkill] = useState<string | null>(null);\n const [active, setActive] = useState(0);\n const [paletteClosed, setPaletteClosed] = useState(false);\n const [unknown, setUnknown] = useState<string | null>(null);\n const [recognizing, setRecognizing] = useState(false);\n // FTR.NAB.CHAT-0001 R34: the file open in the preview. The product's loader may be a new function on\n // every render; the chat gives the thumbnails one stable function while the product has a loader\n const [viewing, setViewing] = useState<ChatAttachment | null>(null);\n const latestLoader = useRef(props.loadAttachment);\n useEffect(() => {\n latestLoader.current = props.loadAttachment;\n });\n const canLoad = !!props.loadAttachment;\n const loadFile = useMemo<LoadAttachment | undefined>(() => canLoad\n ? (a: ChatAttachment) => latestLoader.current ? latestLoader.current(a) : Promise.reject(new Error(\"no loader\"))\n : undefined, [canLoad]);\n const voice = useRef(false);\n const listRef = useRef<HTMLDivElement>(null);\n const fileRef = useRef<HTMLInputElement>(null);\n const fieldRef = useRef<HTMLTextAreaElement>(null);\n const maxSeconds = props.voiceMaxSeconds ?? 300;\n const recorder = useRecorder(maxSeconds, () => void stopAndTranscribe());\n const { messages, busy = false } = props;\n // FTR.NAB.CHAT-0001 R1, R2: the context is reset or compacted between turns, not during one\n const turnRunning = busy || messages.some((m) => m.status === \"pending\" || m.status === \"streaming\");\n const onPendingChange = props.onPendingChange;\n useEffect(() => onPendingChange?.(pending), [pending, onPendingChange]);\n\n const first = messages[0]?.id;\n const tail = messages[messages.length - 1];\n const last = tail?.id;\n const tailText = tail?.text.length;\n const tailSteps = tail?.steps?.length;\n // The ends and the height of the list at the last layout: earlier messages\n // loaded above it keep the place of the list.\n const lastLayout = useRef<{ first?: string; last?: string; height: number }>({ height: 0 });\n // The list follows new messages and the growth of the last one: the dependencies are the trigger.\n useLayoutEffect(() => {\n const el = listRef.current;\n if (!el) return;\n const was = lastLayout.current;\n // history is prepended when the start of the list changed and its end did not;\n // another conversation changes both\n const prepended = was.first !== undefined && first !== was.first && last === was.last;\n el.scrollTop = prepended ? el.scrollTop + (el.scrollHeight - was.height) : el.scrollHeight;\n lastLayout.current = { first, last, height: el.scrollHeight };\n // oxlint-disable-next-line react/exhaustive-effect-dependencies -- the length and the growth of the tail only trigger\n }, [messages.length, first, last, tailText, tailSteps]);\n\n // R4: \"/\" at the start of the field without a space opens the palette\n const query = props.commands && !skill && text.startsWith(\"/\") && !/\\s/.test(text) ? text.slice(1) : null;\n const items = query !== null ? matchCommands(props.commands ?? [], query) : [];\n const paletteOpen = query !== null && !paletteClosed;\n\n const clear = () => {\n setText(\"\");\n setPending([]);\n setSkill(null);\n setUnknown(null);\n voice.current = false;\n };\n\n const runCommand = async (name: string, rest: string) => {\n if (!props.onCommand) return;\n try {\n await props.onCommand(name, rest);\n clear();\n } catch {\n // the product has told the user; the text stays\n }\n };\n\n const send = async (body: string, asText = false) => {\n const msg = body.trim();\n if ((!msg && pending.length === 0 && !skill) || busy || props.readOnly) return;\n // R4: a command typed in full runs; an unknown one waits for «Send as text»\n if (!asText && !skill && props.commands && msg.startsWith(\"/\")) {\n const [word, ...rest] = msg.slice(1).split(/\\s+/);\n const cmd = props.commands.find((c) => c.kind === \"command\" && c.name === word);\n if (cmd) return runCommand(cmd.name, rest.join(\" \"));\n if (word && !msg.includes(\"\\n\")) {\n setUnknown(\"/\" + word);\n return;\n }\n }\n try {\n await props.onSend(msg, pending.map((f) => f.id), voice.current, skill ?? undefined);\n clear();\n } catch {\n // the product has told the user; the text stays in the composer\n }\n };\n\n const pick = (c: ChatCommand) => {\n setActive(0);\n if (c.kind === \"skill\") {\n setSkill(c.name);\n setText(\"\");\n } else if (c.takesText) {\n setText(\"/\" + c.name + \" \");\n } else {\n void runCommand(c.name, \"\");\n }\n fieldRef.current?.focus();\n };\n\n const keys = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (paletteOpen && items.length > 0) {\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n const d = e.key === \"ArrowDown\" ? 1 : -1;\n setActive((a) => (a + d + items.length) % items.length);\n return;\n }\n if ((e.key === \"Enter\" && !e.shiftKey) || e.key === \"Tab\") {\n e.preventDefault();\n pick(items[Math.min(active, items.length - 1)]);\n return;\n }\n }\n if (paletteOpen && e.key === \"Escape\") {\n e.preventDefault();\n setPaletteClosed(true);\n return;\n }\n if (e.key === \"Backspace\" && skill && text === \"\") {\n setSkill(null); // design §3.1: Backspace in the empty field takes the skill off\n return;\n }\n // FTR.NAB.CHAT-0001 design §3.1: on a touch screen Enter is a new line, the message goes by its button\n if (e.key === \"Enter\" && !e.shiftKey && !e.nativeEvent.isComposing && !touchKeyboard()) {\n e.preventDefault();\n void send(text);\n }\n };\n\n // design §3.1: the field grows with its lines up to three, then scrolls (its max-height in CSS); a change of\n // its width (a turned phone, a resized panel) wraps the lines anew\n useLayoutEffect(() => keepListEnd(listRef.current, () => fitField(fieldRef.current)), [text]);\n useEffect(() => {\n const el = fieldRef.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n let width = el.clientWidth;\n const ro = new ResizeObserver(() => {\n if (el.clientWidth !== width) {\n width = el.clientWidth;\n keepListEnd(listRef.current, () => fitField(el));\n }\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [recorder.recording]);\n\n const attach = async (files: FileList | null) => {\n if (!files?.length || !props.onUpload) return;\n setUploading(true);\n for (const f of Array.from(files)) {\n if (props.upload && f.size > props.upload.maxBytes) {\n toast({ kind: \"error\", title: t(\"chat.tooLarge\"), text: f.name });\n continue;\n }\n const a = await props.onUpload(f).catch(() => null);\n if (a) setPending((x) => [...x, a]);\n }\n setUploading(false);\n if (fileRef.current) fileRef.current.value = \"\";\n };\n\n // R20: the recognized text goes into the field; the user checks and sends it\n async function stopAndTranscribe() {\n const blob = await recorder.stop();\n if (!blob || !props.onTranscribe) return;\n await transcribe(blob, props.onTranscribe, {\n busy: setRecognizing,\n empty: () => toast({ kind: \"error\", title: t(\"chat.voice.notRecognized\") }),\n // design §3.1: the recording stays until the toast is closed\n failed: (reason, retry) => toast({ kind: \"error\", title: reason ?? t(\"chat.voice.failed\"), actions: [{ label: t(\"chat.voice.retry\"), primary: true, onClick: retry }] }),\n text: (r) => {\n voice.current = true;\n setText((x) => (x.trim() ? x.trimEnd() + \" \" + r : r));\n fieldRef.current?.focus();\n },\n });\n }\n\n const voiceKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && recorder.recording) {\n e.preventDefault();\n recorder.cancel();\n }\n };\n\n const placeholder = skill ? t(\"chat.skillPlaceholder\") : t(\"chat.placeholder\", { name: props.agentName });\n const left = maxSeconds - recorder.seconds;\n return (\n <section className=\"nb-chat\" aria-label={t(\"chat.title\")}>\n {props.header}\n <div className=\"msgs\" ref={listRef} aria-live=\"polite\">\n {props.hasOlder && props.onLoadOlder && (\n <button className=\"btn ghost sm\" style={{ alignSelf: \"center\" }} disabled={props.loadingOlder} onClick={props.onLoadOlder}>\n {t(\"chat.loadOlder\")}\n </button>\n )}\n {props.historyError && <div className=\"err-text\">{props.historyError}</div>}\n {messages.length === 0 && !props.loading && !props.historyError && (\n <div className=\"empty\"><div className=\"ic\"><Icon name=\"spark\" /></div><b>{t(\"chat.emptyTitle\", { name: props.agentName })}</b>{props.emptyHint}</div>\n )}\n {messages.map((m) => <MessageView key={m.id} m={m} busy={busy} onRetry={props.onRetry && (() => props.onRetry?.(m.id))}\n loadAttachment={loadFile} onOpenAttachment={setViewing} />)}\n {props.onConfirm && (props.confirmations ?? []).map((c) => (\n <div className=\"confirm\" key={c.id} role=\"group\" aria-label={t(\"chat.confirm.title\")}>\n <div className=\"h\"><Icon name=\"alert\" size={16} />{t(\"chat.confirm.title\")}</div>\n <div>{t(\"chat.confirm.text\", { action: c.summary })}</div>\n {c.preview !== undefined && <pre>{c.preview}</pre>}\n <div className=\"acts\">\n {/* never tied to `busy`: the agent asks in the middle of its turn */}\n <button className=\"btn sm primary\" onClick={() => props.onConfirm?.(c.id, true)}>{t(\"chat.confirm.approve\")}</button>\n <button className=\"btn sm\" onClick={() => props.onConfirm?.(c.id, false)}>{t(\"chat.confirm.reject\")}</button>\n </div>\n </div>\n ))}\n </div>\n\n {props.readOnly ? (\n <div className=\"composer\" style={{ justifyContent: \"space-between\", alignItems: \"center\" }}>{props.readOnly}</div>\n ) : (\n <div className=\"composer-wrap\">\n {paletteOpen && <CommandPalette items={items} active={Math.min(active, Math.max(items.length - 1, 0))} onPick={pick} onHover={setActive} />}\n {props.aboveComposer}\n {pending.length > 0 && (\n <div className=\"pending-files\">\n {pending.map((f) => (\n <span key={f.id} className=\"chip\">\n <Icon name=\"clip\" size={12} />{f.fileName}\n <button className=\"iconbtn\" style={{ width: 18, height: 18 }} aria-label={t(\"remove\")}\n onClick={() => setPending((x) => x.filter((y) => y.id !== f.id))}><Icon name=\"x\" size={12} /></button>\n </span>\n ))}\n </div>\n )}\n {unknown && (\n <div className=\"cmd-unknown\" role=\"status\">\n {t(\"chat.unknownCommand\", { name: unknown })}\n <button type=\"button\" className=\"textbtn\" onClick={() => void send(text, true)}>{t(\"chat.sendAsText\")}</button>\n </div>\n )}\n <div className=\"composer\">\n {props.onUpload && !recorder.recording && (\n <>\n <button className=\"iconbtn\" aria-label={t(\"chat.attach\")} disabled={uploading} onClick={() => fileRef.current?.click()}><Icon name=\"clip\" /></button>\n <input ref={fileRef} type=\"file\" multiple hidden accept={props.upload?.accept} onChange={(e) => attach(e.target.files)} />\n </>\n )}\n {recorder.recording ? (\n <div className={`recbar${left <= 15 ? \" ending\" : \"\"}`} role=\"status\" aria-label={t(\"chat.voice.recordingNow\")}>\n <span className=\"dot\" aria-hidden=\"true\" />\n <span className=\"tm\">{clock(recorder.seconds)} / {clock(maxSeconds)}</span>\n <span className=\"lvl\" aria-hidden=\"true\"><i style={{ transform: `scaleX(${Math.max(0.04, recorder.level)})` }} /></span>\n <button type=\"button\" className=\"btn ghost sm\" onClick={recorder.cancel}>{t(\"cancel\")}</button>\n <button type=\"button\" className=\"btn primary sm\" onKeyDown={voiceKey} onClick={() => void stopAndTranscribe()}>{t(\"chat.voice.done\")}</button>\n </div>\n ) : (\n <div className={`field${skill ? \" with-skill\" : \"\"}${recognizing ? \" recognizing\" : \"\"}`} aria-busy={recognizing || undefined}>\n {skill && (\n <span className=\"chip skill-chip\">\n <Icon name=\"spark\" size={12} />{skill}\n <button className=\"iconbtn\" style={{ width: 18, height: 18 }} aria-label={t(\"remove\")} onClick={() => setSkill(null)}><Icon name=\"x\" size={12} /></button>\n </span>\n )}\n <textarea ref={fieldRef} rows={1} value={text} placeholder={recognizing ? t(\"chat.voice.recognizing\") : placeholder} aria-label={placeholder}\n disabled={recognizing} aria-expanded={paletteOpen} aria-autocomplete={props.commands ? \"list\" : undefined}\n onChange={(e) => { setText(e.target.value); setPaletteClosed(false); setActive(0); setUnknown(null); }}\n onKeyDown={keys} />\n </div>\n )}\n {props.context && !recorder.recording && <ContextMeter context={props.context} onCompact={props.onCompact} onReset={props.onReset} busy={turnRunning} />}\n {props.onTranscribe && !recorder.recording && (\n <VoiceButton supported={recorder.supported} recognizing={recognizing} onStart={() => void recorder.start()} />\n )}\n {!recorder.recording && (props.onCancel && busy ? (\n <button className=\"iconbtn fill\" aria-label={t(\"chat.stop\")} onClick={props.onCancel}><Icon name=\"stop\" /></button>\n ) : (\n <button className=\"iconbtn fill\" aria-label={t(\"chat.send\")} disabled={(!text.trim() && pending.length === 0 && !skill) || busy || recognizing} onClick={() => send(text)}>\n <Icon name=\"send\" />\n </button>\n ))}\n </div>\n {recorder.error && <div className=\"err-text\" style={{ padding: \"0 12px 8px\" }}>{t(\"chat.voice.micDenied\")}</div>}\n </div>\n )}\n {viewing && loadFile && <AttachmentPreview a={viewing} load={loadFile} onClose={() => setViewing(null)} />}\n </section>\n );\n}\n\n// design §3.1: while the server recognizes a recording the microphone gives way\n// to a wave, so the user sees the voice is being processed\nexport function VoiceButton({ supported, recognizing, onStart }: { supported: boolean; recognizing: boolean; onStart: () => void }) {\n const t = useKitT();\n if (recognizing) {\n return (\n <span className=\"voicewait\" role=\"status\" aria-label={t(\"chat.voice.recognizing\")} title={t(\"chat.voice.recognizing\")}>\n <i /><i /><i /><i /><i />\n </span>\n );\n }\n return (\n <button className=\"iconbtn\" disabled={!supported}\n aria-label={t(\"chat.voice.start\")} title={supported ? t(\"chat.voice.start\") : t(\"chat.voice.unsupported\")}\n onClick={onStart}>\n <Icon name=\"mic\" />\n </button>\n );\n}\n\n/** A touch screen without a mouse: its on-screen keyboard has no Shift+Enter, so Enter breaks the line. */\nfunction touchKeyboard(): boolean {\n return typeof window !== \"undefined\" && !!window.matchMedia?.(\"(hover: none) and (pointer: coarse)\").matches;\n}\n\n/** A list scrolled to its end (within the rounding of a pixel). */\nconst atEnd = (list: HTMLElement) => list.scrollHeight - list.scrollTop - list.clientHeight < 2;\n\n/** FTR.NAB.CHAT-0001 design §3.1: the list of messages gets lower as the field grows; a list read to its end stays at\n * its end, so the last message is not hidden under the field, and a list scrolled up stays where it is. */\nfunction keepListEnd(list: HTMLElement | null, change: () => void) {\n const pinned = !!list && atEnd(list);\n change();\n if (list && pinned) list.scrollTop = list.scrollHeight;\n}\n\n/** FTR.NAB.CHAT-0001 design §3.1: sets the height of the field to its lines; the CSS bounds it to three. */\nfunction fitField(el: HTMLTextAreaElement | null) {\n if (!el) return;\n // measured without a scrollbar: a scrollbar that takes room (Windows) would add to the height it is measured by\n el.style.overflowY = \"hidden\";\n el.style.height = \"auto\";\n const full = el.scrollHeight + el.offsetHeight - el.clientHeight;\n el.style.height = `${full}px`;\n // the bar appears only past three lines, where the CSS stops the field\n el.style.overflowY = el.offsetHeight < full ? \"auto\" : \"hidden\";\n}\n","import { useEffect, useState, type ReactNode } from \"react\";\nimport { Icon } from \"../components/Icon\";\nimport { Modal } from \"../components/ui\";\nimport { useKitT } from \"../i18n\";\nimport type { ChatConversation, ConversationListProps } from \"./types\";\n\n/** The conversations of the user: the main one, the topics, the archive (design\n * §6.2). In a wide place the list stands left of the messages; on a phone and in\n * a narrow place it lies over them while open and closes by a pick, a tap\n * beside it or Escape. */\nexport function ConversationList({ conversations, currentId, open, onPick, onClose, onCreate }: ConversationListProps) {\n const t = useKitT();\n const [creating, setCreating] = useState(false);\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => e.key === \"Escape\" && onClose();\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [open, onClose]);\n\n const item = (c: ChatConversation) => (\n <button key={c.id} className={`it${c.id === currentId ? \" on\" : \"\"}${c.group === \"archive\" ? \" arch\" : \"\"}`}\n onClick={() => onPick(c.id)} aria-current={c.id === currentId}>\n <Icon name={c.icon ?? \"msg2\"} size={16} />\n <span className=\"nm\">{c.title}</span>\n {!!c.unread && <span className=\"unread\" aria-label={t(\"chat.unread\", { count: c.unread })}>{c.unread}</span>}\n <span className=\"sub\">{c.when}</span>\n </button>\n );\n const inGroup = (g: ChatConversation[\"group\"]) => conversations.filter((c) => c.group === g);\n const topics = inGroup(\"topic\");\n const archive = inGroup(\"archive\");\n return (\n <>\n <nav className={`nb-side${open ? \" open\" : \"\"}`} aria-label={t(\"chat.conversations\")}>\n {onCreate && (\n <button className=\"btn sm\" style={{ width: \"100%\", justifyContent: \"center\" }} onClick={() => setCreating(true)}>\n <Icon name=\"plus\" size={15} />{t(\"chat.newTopic\")}\n </button>\n )}\n <div className=\"h\">{t(\"chat.conversation\")}</div>\n {inGroup(\"main\").map(item)}\n <div className=\"h\">{t(\"chat.topics\")}</div>\n {topics.length === 0 && <div className=\"small muted\" style={{ padding: \"0 10px\" }}>{t(\"chat.noTopics\")}</div>}\n {topics.map(item)}\n {archive.length > 0 && <div className=\"h\">{t(\"chat.archive\")}</div>}\n {archive.map(item)}\n </nav>\n {/* over the messages: a tap beside the list closes it */}\n {open && <button type=\"button\" className=\"nb-scrim\" aria-label={t(\"close\")} onClick={onClose} />}\n {creating && onCreate && <NewTopicModal onClose={() => setCreating(false)} onCreate={onCreate} />}\n </>\n );\n}\n\n/** The place of a chat: the list of conversations, the conversation and what the\n * product puts beside them. `narrow` is for a side panel: the list lies over the\n * messages as on a phone, whatever the width of the window. */\nexport function ChatLayout({ narrow, children }: { narrow?: boolean; children: ReactNode }) {\n return <div className={`nb-app${narrow ? \" narrow\" : \"\"}`}>{children}</div>;\n}\n\n/** The dialog of a new topic: one field, Enter creates. */\nexport function NewTopicModal({ onClose, onCreate }: { onClose: () => void; onCreate: (title: string) => Promise<void> }) {\n const t = useKitT();\n const [title, setTitle] = useState(\"\");\n const [pending, setPending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const create = async () => {\n if (!title.trim() || pending) return;\n setPending(true);\n setError(null);\n try {\n await onCreate(title.trim());\n onClose();\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n setPending(false);\n }\n };\n return (\n <Modal title={t(\"chat.newTopic\")} onClose={onClose} footer={<>\n <button className=\"btn ghost\" onClick={onClose}>{t(\"cancel\")}</button>\n <button className=\"btn primary\" disabled={!title.trim() || pending} onClick={create}>{t(\"create\")}</button>\n </>}>\n <div className=\"field\">\n <label htmlFor=\"topic-title\">{t(\"chat.topicTitle\")}</label>\n <input id=\"topic-title\" className=\"inp\" value={title} maxLength={120} onChange={(e) => setTitle(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && create()} />\n <div className=\"hint\">{t(\"chat.topicHint\")}</div>\n </div>\n {error && <div className=\"err-text\">{error}</div>}\n </Modal>\n );\n}\n","import { useState, type ReactNode } from \"react\";\nimport { Icon, type IconName } from \"../components/Icon\";\nimport { useOutside } from \"../components/ui\";\nimport { useKitT } from \"../i18n\";\n\n/** One of the ways an agent can look and talk; what it means only the product knows (R7). */\nexport interface AgentOption { key: string; label: string; icon: IconName }\n\n/** A model the user may choose for the agent (FTR.NAB.CHAT-0001 R16, design §3.3). */\nexport interface AgentModelOption {\n key: string;\n label: string;\n /** The connection or the default model, grey under the name. */\n sub?: string;\n /** The capabilities: images, reasoning, the window. */\n badges?: { icon?: IconName; text: string }[];\n /** Under the row of the chosen model: the context will be compacted. */\n warn?: ReactNode;\n}\n\n/** The block «Model» of the menu: one model is shown without a choice; none — the text of the product. */\nexport interface AgentModels {\n label: ReactNode;\n options: AgentModelOption[];\n value: string;\n onPick: (key: string) => void;\n empty?: ReactNode;\n}\n\n/** The round button of the agent: its icon, and the menu behind it. */\nexport function AgentButton({ icon, label, title, expanded, small, disabled, onClick }: {\n icon: IconName; label: string; title?: string; expanded?: boolean; small?: boolean; disabled?: boolean; onClick?: () => void;\n}) {\n return (\n <button type=\"button\" className={`agentbtn${small ? \" s\" : \"\"}`} disabled={disabled} aria-label={label} aria-expanded={expanded} title={title}\n // the menu closes on an outside mousedown; keep this click a toggle\n onMouseDown={(e) => expanded && e.stopPropagation()} onClick={onClick}>\n <Icon name={icon} size={small ? 15 : 18} />\n </button>\n );\n}\n\n/** The menu of the agent (FTR.NAB.CMN-0005 R15, design §6.6): its name and a\n * choice among the options of the product, as tiles with icons. The name is\n * saved on Enter and on leaving the field; a pick is saved at once. */\nexport function AgentMenu({ label, name, options, value, optionsLabel, hint, narrow, models, onRename, onPick, onClose }: {\n /** The name of the dialog for a screen reader. */\n label: string;\n name: string;\n options: AgentOption[];\n value: string;\n optionsLabel: ReactNode;\n hint?: ReactNode;\n /** A narrow place — a side panel: the options go in one column. */\n narrow?: boolean;\n /** The choice of the model after the options. */\n models?: AgentModels;\n onRename: (name: string) => void;\n onPick: (key: string) => void;\n /** Must keep its identity between renders. */\n onClose: () => void;\n}) {\n const t = useKitT();\n const [draft, setDraft] = useState(name);\n const ref = useOutside<HTMLDivElement>(true, onClose);\n const save = () => {\n const next = draft.trim();\n if (next && next !== name) onRename(next);\n };\n return (\n <div className={`agentmenu${narrow ? \" narrow\" : \"\"}`} ref={ref} role=\"dialog\" aria-label={label}>\n <div className=\"lab\">{t(\"agentName\")}</div>\n <input className=\"inp\" value={draft} maxLength={40} autoFocus aria-label={t(\"agentName\")}\n onChange={(e) => setDraft(e.target.value)} onBlur={save}\n onKeyDown={(e) => e.key === \"Enter\" && (e.target as HTMLInputElement).blur()} />\n <div className=\"lab\" style={{ marginTop: 14 }}>{optionsLabel}</div>\n <div className=\"agentoptions\">\n {options.map((o) => (\n <button key={o.key} type=\"button\" className={`agentoption${value === o.key ? \" on\" : \"\"}`} aria-pressed={value === o.key} onClick={() => onPick(o.key)}>\n <span className=\"ic\"><Icon name={o.icon} size={15} /></span>\n {o.label}\n </button>\n ))}\n </div>\n {models && (\n <>\n <div className=\"lab\" style={{ marginTop: 14 }}>{models.label}</div>\n {models.options.length === 0 && <div className=\"hint\">{models.empty}</div>}\n <div className=\"agentmodels\" role=\"radiogroup\">\n {models.options.map((m) => {\n const single = models.options.length === 1;\n const on = single || models.value === m.key;\n return (\n <button key={m.key} type=\"button\" role=\"radio\" aria-checked={on} disabled={single} className={`agentmodel${on ? \" on\" : \"\"}`}\n onClick={() => !on && models.onPick(m.key)}>\n {!single && <span className={`radio${on ? \" on\" : \"\"}`} aria-hidden=\"true\" />}\n <span className=\"body\">\n <span className=\"nm\">{m.label}</span>\n {m.sub && <span className=\"sub\">{m.sub}</span>}\n {m.badges && m.badges.length > 0 && (\n <span className=\"badges\">\n {m.badges.map((b) => <span key={b.text} className=\"cap\">{b.icon && <Icon name={b.icon} size={11} />}{b.text}</span>)}\n </span>\n )}\n {on && m.warn && <span className=\"warn\">{m.warn}</span>}\n </span>\n </button>\n );\n })}\n </div>\n </>\n )}\n {hint && <div className=\"hint\" style={{ marginTop: 10 }}>{hint}</div>}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport type { TFunction } from \"i18next\";\nimport { useKitT } from \"../i18n\";\nimport { AgentMenu, type AgentModelOption, type AgentOption } from \"./AgentMenu\";\nimport { tokens } from \"./ContextMeter\";\n\n/** A model the agent can run on, as the service of the agent gives it\n * (FTR.NAB.CHAT-0001 tech §2.2: `availableModels`, `model`, `defaultModel`). */\nexport interface AgentModel {\n connectionId: string;\n model: string;\n name: string;\n /** The connection the model comes through: grey under its name. */\n connection: string;\n caps: { image: boolean; reasoning: boolean; contextWindow: number };\n}\n\n/** What the user chose; null — the default model. */\nexport type AgentModelChoice = Pick<AgentModel, \"connectionId\" | \"model\"> | null;\n\n/** The models of the agent for the block «Model». */\nexport interface AgentModelState {\n available: AgentModel[];\n /** The model in use. */\n model: AgentModel | null;\n defaultModel: AgentModel | null;\n /** The user chose the model; false — the default one. */\n chosen: boolean;\n /** The fill of the context of the main conversation, in tokens. */\n contextTokens: number;\n}\n\n/** The key of a model of a connection in the menu. */\nexport const agentModelKey = (m: Pick<AgentModel, \"connectionId\" | \"model\">) => `${m.connectionId}/${m.model}`;\n\n/** The lines of the block «Model» (FTR.NAB.CHAT-0001 R16, R17, design §3.3): with a\n * choice the first line is «Default» with the default model under it; a model\n * whose window the context outgrows warns; one model is shown without a choice. */\nexport function agentModelOptions(t: TFunction, lng: string, s: AgentModelState): { options: AgentModelOption[]; value: string } {\n const badges = (m: AgentModel) => [\n ...(m.caps.image ? [{ icon: \"image\" as const, text: t(\"agent.capImage\") }] : []),\n ...(m.caps.reasoning ? [{ icon: \"brain\" as const, text: t(\"agent.capReasoning\") }] : []),\n ...(m.caps.contextWindow > 0 ? [{ text: tokens(m.caps.contextWindow, lng) }] : []),\n ];\n // R17: a context larger than 80 % of the window will be compacted\n const warn = (m: AgentModel) =>\n m.caps.contextWindow > 0 && s.contextTokens > 0.8 * m.caps.contextWindow ? t(\"agent.modelCompactWarn\") : undefined;\n const choice = s.available.length > 1;\n const models: AgentModelOption[] = s.available.map((m) => ({\n key: agentModelKey(m), label: m.name, sub: m.connection, badges: badges(m), warn: choice ? warn(m) : undefined,\n }));\n const options: AgentModelOption[] = choice\n ? [{ key: \"\", label: t(\"agent.modelDefault\"), sub: s.defaultModel?.name ?? \"—\", warn: s.defaultModel ? warn(s.defaultModel) : undefined }, ...models]\n : models;\n const value = s.chosen && s.model ? agentModelKey(s.model) : choice ? \"\" : (s.model ? agentModelKey(s.model) : \"\");\n return { options, value };\n}\n\n/** The menu of the agent, the same in every product (FTR.NAB.CMN-0005 R15;\n * FTR.HMR.SPEC-0001): the name, the options of the product as tiles in two\n * columns, the model when the product gives `models`, and the hint. What the\n * options mean only the product knows (R7): it passes them with their icons. The\n * strings are the kit's; `hint` replaces the hint of the kit where the product\n * saves the agent elsewhere. */\nexport function AgentSettingsMenu({ name, value, options, models, hint, onRename, onPick, onModel, onClose }: {\n name: string;\n value: string;\n options: AgentOption[];\n models?: AgentModelState;\n hint?: ReactNode;\n onRename: (name: string) => void;\n onPick: (key: string) => void;\n onModel?: (choice: AgentModelChoice) => void;\n /** Must keep its identity between renders. */\n onClose: () => void;\n}) {\n const t = useKitT();\n const { i18n } = useTranslation();\n const block = models && onModel ? agentModelOptions(t, i18n.language, models) : null;\n const pickModel = (key: string) => {\n if (!models || !onModel) return;\n if (!key) return onModel(null);\n const m = models.available.find((x) => agentModelKey(x) === key);\n if (m) onModel({ connectionId: m.connectionId, model: m.model });\n };\n return (\n <AgentMenu label={t(\"agent.menu\")} name={name} value={value} optionsLabel={t(\"agent.options\")} hint={hint ?? t(\"agent.everywhere\")}\n options={options}\n models={block ? { label: t(\"agent.model\"), options: block.options, value: block.value, onPick: pickModel, empty: t(\"agent.noModels\") } : undefined}\n onRename={onRename} onPick={onPick} onClose={onClose} />\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"chat.js","names":["_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","_Fragment","useToast","Icon","Modal","Tabs","useOutside","Markdown","useKitT","UIKIT_NS","matchCommands","q","query","commands","c","CommandPalette","t","items","skills","row","i","active","e","onPick","onHover","intlLocale","lng","tokens","n","ContextMeter","useTranslation","open","setOpen","useState","ref","share","context","pct","level","i18n","v","onCompact","onReset","Fragment","MeterAction","busy","run","icon","label","OFFICE_DOC","OFFICE_SHEET","IMAGES","IMAGE_EXT","TEXT_EXT","previewKind","type","a","name","office","KIND_ICON","previewIcon","kind","fileSize","units","bytes","language","HTML_POLICY","htmlDocument","meta","doctype","text","doc","el","attr","URL_ATTRS","SAFE_URL","cleanCss","policy","css","u","m","TYPE_BY_EXT","previewType","own","parseTable","tab","l","rows","cell","quoted","useBlob","state","setState","useEffect","enabled","url","live","load","typed","blob","id","href","fileName","mimeType","size","Thumb","failed","Tile","onOpen","preview","body","AttachmentList","TableView","head","shown","r","j","PAGE_WIDTH","HtmlPage","box","useRef","boxWidth","setBoxWidth","pageWidth","setPageWidth","fit","ro","useMemo","measured","setMeasured","measure","frame","read","page","scale","AttachmentPreview","loadPreview","textual","source","setSource","knownTooLarge","content","setContent","tooLarge","buf","OfficeView","onClose","OFFICE_WAIT","OFFICE_POLL","OFFICE_LIMIT_MB","DOC_PAGES","st","setSt","timer","started","ask","p","DocView","SheetView","from","total","cellAt","col","ch","mergeSpans","spans","covered","merges","to","columnName","s","setI","sheet","sheets","width","cols","moreRows","moreCols","k","down","across","rowSpan","colSpan","markTime","iso","visibleSteps","steps","STEP","MessageView","EventDivider","mark","atts","loadAttachment","onOpenAttachment","NoticeView","waiting","onRetry","NOTICE_LINES","long","ev","transcribe","recognize","recording","on","useRecorder","supported","setRecording","seconds","setSeconds","setLevel","error","setError","rec","chunks","audio","stopped","discard","limit","onLimit","cleanup","useCallback","tr","start","stream","analyser","Ctx","samples","began","limited","peak","maxSeconds","stop","resolve","cancel","clock","Chat","toast","setText","pending","setPending","uploading","setUploading","skill","setSkill","setActive","paletteClosed","setPaletteClosed","unknown","setUnknown","recognizing","setRecognizing","viewing","setViewing","loadFile","useStableLoader","props","voice","listRef","fileRef","fieldRef","recorder","stopAndTranscribe","turnRunning","messages","onPendingChange","first","tail","last","tailText","tailSteps","lastLayout","was","paletteOpen","clear","runCommand","rest","send","msg","asText","word","cmd","f","pick","keys","d","touchKeyboard","useLayoutEffect","keepListEnd","fitField","attach","files","x","reason","retry","voiceKey","placeholder","left","y","VoiceButton","onStart","atEnd","list","pinned","change","full","latest","has","ConversationList","creating","setCreating","onKey","item","currentId","inGroup","conversations","g","topics","archive","onCreate","NewTopicModal","ChatLayout","narrow","title","setTitle","create","AgentButton","small","expanded","AgentMenu","draft","setDraft","next","onRename","optionsLabel","options","value","o","models","single","b","hint","agentModelKey","agentModelOptions","badges","warn","choice","AgentSettingsMenu","block","onModel","key"],"sources":["../src/chat/CommandPalette.tsx","../src/chat/intl.ts","../src/chat/ContextMeter.tsx","../src/chat/Attachments.tsx","../src/chat/MessageView.tsx","../src/chat/transcription.ts","../src/chat/useRecorder.ts","../src/chat/Chat.tsx","../src/chat/ConversationList.tsx","../src/chat/AgentMenu.tsx","../src/chat/AgentSettingsMenu.tsx"],"sourcesContent":["import { Icon } from \"../components/Icon\";\nimport { useKitT } from \"../i18n\";\nimport type { ChatCommand } from \"./types\";\n\n/** The items of the palette that match what is typed after \"/\". */\nexport function matchCommands(commands: ChatCommand[], query: string): ChatCommand[] {\n const q = query.toLowerCase();\n return commands.filter((c) => c.name.toLowerCase().includes(q) || (c.description ?? \"\").toLowerCase().includes(q));\n}\n\n/** The palette of commands and skills over the composer (FTR.NAB.CHAT-0001 R4,\n * design §3.1). The composer owns the keys: arrows move `active`, Enter and Tab\n * pick it, Esc closes. */\nexport function CommandPalette({ items, active, onPick, onHover }: {\n items: ChatCommand[];\n active: number;\n onPick: (c: ChatCommand) => void;\n onHover: (i: number) => void;\n}) {\n const t = useKitT();\n const commands = items.filter((c) => c.kind === \"command\");\n const skills = items.filter((c) => c.kind === \"skill\");\n const row = (c: ChatCommand, i: number) => (\n <button key={c.kind + c.name} type=\"button\" role=\"option\" aria-selected={i === active} className={`palette-row${i === active ? \" on\" : \"\"}`}\n // the field keeps the focus: the pick happens before the blur\n onMouseDown={(e) => { e.preventDefault(); onPick(c); }} onMouseEnter={() => onHover(i)}>\n {/* the name of a command starts with «/» itself: its column stays empty, the names line up with the skills */}\n {c.kind === \"skill\" ? <Icon name=\"spark\" size={14} /> : <span className=\"slash\" aria-hidden=\"true\" />}\n <span className=\"nm\">{c.kind === \"command\" ? \"/\" + c.name : c.name}</span>\n <span className=\"ds\">{c.description}</span>\n {c.source && <span className=\"src\">{c.source}</span>}\n </button>\n );\n return (\n <div className=\"palette\" role=\"listbox\" aria-label={t(\"chat.palette.title\")}>\n {items.length === 0 && <div className=\"palette-empty\">{t(\"chat.palette.empty\")}</div>}\n {commands.length > 0 && <div className=\"palette-h\">{t(\"chat.palette.commands\")}</div>}\n {commands.map((c) => row(c, items.indexOf(c)))}\n {items.length > 0 && <div className=\"palette-h\">{t(\"chat.palette.skills\")}</div>}\n {skills.length === 0 && items.length > 0 && <div className=\"palette-empty\">{t(\"chat.palette.noSkills\")}</div>}\n {skills.map((c) => row(c, items.indexOf(c)))}\n </div>\n );\n}\n","/** The locale of Intl formatting for a language code of the products. */\nexport const intlLocale = (lng: string) => (lng === \"zh\" ? \"zh-CN\" : lng);\n","import { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Icon, type IconName } from \"../components/Icon\";\nimport { useOutside } from \"../components/ui\";\nimport { UIKIT_NS, useKitT } from \"../i18n\";\nimport type { ChatContext } from \"./types\";\nimport { intlLocale } from \"./intl\";\n\n/** A number of tokens shortly: 42K, 1.2M in the language of the interface. */\nexport function tokens(n: number, lng: string): string {\n return new Intl.NumberFormat(intlLocale(lng), { notation: \"compact\", maximumFractionDigits: 1 }).format(n);\n}\n\n/** The fill of the context window by a ring next to the send button\n * (FTR.NAB.CHAT-0001 R3, design §3.1): grey, amber from 70 %, red from 90 %.\n * A click shows the numbers; a full context (from 90 %) offers to compact or to reset, off while the agent answers. */\nexport function ContextMeter({ context, onCompact, onReset, busy = false }: {\n context: ChatContext; onCompact?: () => void; onReset?: () => void;\n /** A turn is being written: the actions wait for it. */\n busy?: boolean;\n}) {\n const t = useKitT();\n const { i18n } = useTranslation(UIKIT_NS);\n const [open, setOpen] = useState(false);\n const ref = useOutside<HTMLDivElement>(open, () => setOpen(false));\n const share = context.window > 0 ? Math.min(1, context.tokens / context.window) : 0;\n const pct = Math.round(share * 100);\n const level = share >= 0.9 ? \"full\" : share >= 0.7 ? \"warn\" : \"\";\n const r = 7;\n const c = 2 * Math.PI * r;\n const lng = i18n.language;\n return (\n <div className=\"ctxmeter\" ref={ref}>\n <button type=\"button\" className={`ctxring ${level}`} aria-expanded={open} onClick={() => setOpen((v) => !v)}\n aria-label={t(\"chat.context.meter\", { used: tokens(context.tokens, lng), total: tokens(context.window, lng), pct })}\n title={t(\"chat.context.meter\", { used: tokens(context.tokens, lng), total: tokens(context.window, lng), pct })}>\n <svg viewBox=\"0 0 18 18\" aria-hidden=\"true\">\n <circle className=\"bg\" cx=\"9\" cy=\"9\" r={r} />\n <circle className=\"fg\" cx=\"9\" cy=\"9\" r={r} strokeDasharray={`${(c * share).toFixed(1)} ${c.toFixed(1)}`} transform=\"rotate(-90 9 9)\" />\n </svg>\n </button>\n {open && (\n <div className=\"ctxtip\" role=\"dialog\">\n <div>{t(\"chat.context.meter\", { used: tokens(context.tokens, lng), total: tokens(context.window, lng), pct })}</div>\n {level === \"full\" && <div className=\"small muted\" style={{ marginTop: 4 }}>{t(\"chat.context.full\")}</div>}\n {level === \"full\" && (onCompact || onReset) && (\n <>\n <div className=\"row\" style={{ marginTop: 8, gap: 6 }}>\n {/* design §3.1: both actions, as buttons with their border */}\n {onCompact && <MeterAction icon=\"compress\" label={t(\"chat.context.compact\")} busy={busy}\n run={() => { setOpen(false); onCompact(); }} />}\n {onReset && <MeterAction icon=\"reset\" label={t(\"chat.context.reset\")} busy={busy} run={() => { setOpen(false); onReset(); }} />}\n </div>\n {/* the reason is said in words: a disabled button shows no tooltip everywhere and is not read out */}\n {busy && <div id=\"ctx-wait\" className=\"small muted\" style={{ marginTop: 6 }}>{t(\"chat.context.waitTurn\")}</div>}\n </>\n )}\n </div>\n )}\n </div>\n );\n}\n\n/** An action on the context: off while a turn runs, described by the reason under it. */\nfunction MeterAction({ icon, label, busy, run }: { icon: IconName; label: string; busy: boolean; run: () => void }) {\n return (\n <button type=\"button\" className=\"btn sm\" disabled={busy} aria-describedby={busy ? \"ctx-wait\" : undefined} onClick={run}>\n <Icon name={icon} size={14} />{label}\n </button>\n );\n}\n","import { useEffect, useMemo, useRef, useState, type SyntheticEvent } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Icon, type IconName } from \"../components/Icon\";\nimport { Markdown } from \"../components/Markdown\";\nimport { Tabs } from \"../components/Tabs\";\nimport { Modal } from \"../components/ui\";\nimport { UIKIT_NS, useKitT } from \"../i18n\";\nimport { intlLocale } from \"./intl\";\nimport type { ChatAttachment, OfficePreview, Sheet } from \"./types\";\n\n// The files of a message and their preview (FTR.NAB.CHAT-0001 R34, design §3.6):\n// images as thumbnails, the files with a preview as tiles with the icon of the\n// preview, the rest as tiles that download.\n\nexport type PreviewKind = \"image\" | \"pdf\" | \"markdown\" | \"table\" | \"html\" | \"text\" | \"office-doc\" | \"office-sheet\";\n\n/** Loads the content of an attachment: the product fetches it with its session. */\nexport type LoadAttachment = (a: ChatAttachment) => Promise<Blob>;\n\n/** Loads the preview of a document or a spreadsheet (FTR.NAB.CHAT-0003 R13–R16): the product asks its API; a\n * `pending` answer is asked again. */\nexport type LoadOfficePreview = (a: ChatAttachment) => Promise<OfficePreview>;\n\nconst OFFICE_DOC = /\\.(docx|doc|docm|odt|rtf|pptx|ppt|pptm|odp)$/;\nconst OFFICE_SHEET = /\\.(xlsx|xlsm|xls|ods)$/;\n/** The rows and columns of a sheet in the preview (R14). */\nexport const SHEET_ROWS = 500;\nexport const SHEET_COLS = 50;\n\n// SVG is an image of <img>: there its scripts do not run.\nconst IMAGES = new Set([\"image/png\", \"image/jpeg\", \"image/gif\", \"image/webp\", \"image/svg+xml\"]);\nconst IMAGE_EXT = /\\.(png|jpe?g|gif|webp|svg)$/;\nconst TEXT_EXT = /\\.(txt|log|json|ya?ml|xml|ini|toml|sql|sh|py|go|js|ts|tsx|java|kt|rb|rs|c|cpp|h|css)$/;\n\n/** Text, tables and Markdown larger than this are downloaded, not drawn. */\nexport const TEXT_PREVIEW_MAX = 1 << 20;\n/** The rows of a table shown in the preview. */\nexport const TABLE_ROWS = 500;\n\n/** How an attachment is previewed, or null when it is only downloaded. `office`: the product previews\n * documents and spreadsheets (FTR.NAB.CHAT-0003). */\nexport function previewKind(a: Pick<ChatAttachment, \"fileName\" | \"mimeType\">, office = false): PreviewKind | null {\n const type = (a.mimeType ?? \"\").toLowerCase().split(\";\")[0].trim();\n const name = a.fileName.toLowerCase();\n if (office && OFFICE_DOC.test(name)) return \"office-doc\";\n if (office && OFFICE_SHEET.test(name)) return \"office-sheet\";\n if (IMAGES.has(type) || ((!type || type === \"application/octet-stream\") && IMAGE_EXT.test(name))) return \"image\";\n if (type === \"application/pdf\" || name.endsWith(\".pdf\")) return \"pdf\";\n if (type === \"text/markdown\" || /\\.(md|markdown)$/.test(name)) return \"markdown\";\n if (type === \"text/csv\" || type === \"text/tab-separated-values\" || /\\.(csv|tsv)$/.test(name)) return \"table\";\n if (type === \"text/html\" || /\\.html?$/.test(name)) return \"html\";\n if (type.startsWith(\"text/\") || type === \"application/json\" || type === \"application/xml\" || TEXT_EXT.test(name)) return \"text\";\n return null;\n}\n\nconst KIND_ICON: Record<PreviewKind, IconName> = { image: \"image\", pdf: \"pdf\", markdown: \"markdown\", table: \"table\", html: \"globe\", text: \"source\",\n \"office-doc\": \"files\", \"office-sheet\": \"table\" };\n\n/** The icon of a kind of preview: the tiles of the chat and the products' own lists of files show it. */\nexport const previewIcon = (kind: PreviewKind): IconName => KIND_ICON[kind];\n\n/** The label of a tile: the kind of the preview or the extension of the file. */\nfunction label(a: ChatAttachment, kind: PreviewKind | null): string {\n if (kind === \"pdf\") return \"PDF\";\n if (kind === \"markdown\") return \"MD\";\n if (kind === \"html\") return \"HTML\";\n const ext = /\\.([a-z0-9]{1,5})$/i.exec(a.fileName)?.[1]?.toUpperCase();\n return ext ?? (kind ? \"TXT\" : \"FILE\");\n}\n\n/** The size of a file in the units of the language. */\nexport function fileSize(bytes: number, language: string): string {\n const units = [\"byte\", \"kilobyte\", \"megabyte\", \"gigabyte\"] as const;\n let v = bytes;\n let i = 0;\n while (v >= 1024 && i < units.length - 1) {\n v /= 1024;\n i++;\n }\n return new Intl.NumberFormat(intlLocale(language), {\n style: \"unit\", unit: units[i], unitDisplay: \"short\", maximumFractionDigits: i === 0 ? 0 : 1,\n }).format(v);\n}\n\n/** The policy put into a previewed HTML page: nothing is loaded from outside and nothing runs; images and\n * fonts inside the file and its own styles stay. */\nconst HTML_POLICY = \"default-src 'none'; img-src data:; media-src data:; font-src data:; style-src 'unsafe-inline' data:\";\n\n/** The document of a previewed HTML page. In a browser the page is parsed inert (a DOMParser loads nothing) and\n * cleaned of everything that would load or lead anywhere: scripts, frames, plug-ins, links of the head, its own\n * `http-equiv` (a refresh), and every address that is not `data:`, `blob:` or an anchor — a relative one would go to\n * the site with the session. The policy is put first into the head, after the doctype of the file, so the page keeps\n * its mode. The policy alone is not enough: a browser may fetch a picture before it applies a policy of a meta. */\nexport function htmlDocument(text: string): string {\n const meta = `<meta http-equiv=\"Content-Security-Policy\" content=\"${HTML_POLICY}\">`;\n const doctype = /^\\s*<!doctype[^>]*>/i.exec(text)?.[0] ?? \"\";\n if (typeof DOMParser === \"undefined\") return doctype + meta + text.slice(doctype.length);\n const doc = new DOMParser().parseFromString(text, \"text/html\");\n doc.querySelectorAll(\"script, noscript, iframe, frame, frameset, object, embed, applet, base, link, meta[http-equiv], portal\").forEach((el) => el.remove());\n doc.querySelectorAll(\"*\").forEach((el) => {\n // a copy: attributes are removed while they are walked\n for (const attr of Array.from(el.attributes)) {\n const name = attr.name.toLowerCase();\n if (name.startsWith(\"on\")) el.removeAttribute(attr.name);\n else if (URL_ATTRS.has(name) && !SAFE_URL.test(attr.value)) el.removeAttribute(attr.name);\n else if (name === \"srcset\" && attr.value.split(\",\").some((c) => !SAFE_URL.test(c))) el.removeAttribute(attr.name);\n else if (name === \"style\") el.setAttribute(\"style\", cleanCss(attr.value));\n }\n });\n doc.querySelectorAll(\"style\").forEach((el) => { el.textContent = cleanCss(el.textContent ?? \"\"); });\n const policy = doc.createElement(\"meta\");\n policy.setAttribute(\"http-equiv\", \"Content-Security-Policy\");\n policy.setAttribute(\"content\", HTML_POLICY);\n doc.head.prepend(policy);\n return (doctype ? \"<!doctype html>\" : \"\") + doc.documentElement.outerHTML;\n}\n\n// The attributes that load a resource or lead to an address.\nconst URL_ATTRS = new Set([\"src\", \"href\", \"xlink:href\", \"action\", \"formaction\", \"poster\", \"background\", \"data\", \"ping\", \"lowsrc\", \"dynsrc\", \"manifest\", \"cite\", \"longdesc\", \"codebase\", \"archive\", \"usemap\"]);\n// No `blob:`: the frame shares the origin of the site (HtmlPage), so a blob address would reach the files the site\n// holds, other attachments among them.\nconst SAFE_URL = /^\\s*(data:|#|$)/i;\n\n/** CSS without what loads from outside: `@import` and any `url()` that is not `data:`. */\nfunction cleanCss(css: string): string {\n return css.replace(/@import[^;]*;?/gi, \"\").replace(/url\\(\\s*(['\"]?)(.*?)\\1\\s*\\)/gi, (m, _q: string, u: string) => (SAFE_URL.test(u) && u.trim() !== \"\" ? m : \"none\"));\n}\n\n// The types of the previews by the extension: a file whose type is unknown (a file of a space comes as\n// application/octet-stream) is drawn by the type of its name.\nconst TYPE_BY_EXT: Record<string, string> = {\n png: \"image/png\", jpg: \"image/jpeg\", jpeg: \"image/jpeg\", gif: \"image/gif\", webp: \"image/webp\", svg: \"image/svg+xml\",\n pdf: \"application/pdf\", md: \"text/markdown\", markdown: \"text/markdown\", csv: \"text/csv\", tsv: \"text/tab-separated-values\",\n html: \"text/html\", htm: \"text/html\",\n};\n\n/** The type a preview draws a file with: its own, else the one of its extension. */\nexport function previewType(a: Pick<ChatAttachment, \"fileName\" | \"mimeType\">): string | undefined {\n const own = (a.mimeType ?? \"\").split(\";\")[0].trim().toLowerCase();\n if (own && own !== \"application/octet-stream\") return own;\n return TYPE_BY_EXT[/\\.([a-z0-9]+)$/i.exec(a.fileName)?.[1]?.toLowerCase() ?? \"\"] ?? (own || undefined);\n}\n\n/** The rows of CSV (quotes by RFC 4180) or TSV. */\nexport function parseTable(text: string, tab: boolean): string[][] {\n if (tab) return text.replace(/\\r?\\n$/, \"\").split(/\\r?\\n/).map((l) => l.split(\"\\t\"));\n const rows: string[][] = [];\n let row: string[] = [];\n let cell = \"\";\n let quoted = false;\n for (let i = 0; i < text.length; i++) {\n const c = text[i];\n if (quoted) {\n if (c === '\"' && text[i + 1] === '\"') {\n cell += '\"';\n i++;\n } else if (c === '\"') quoted = false;\n else cell += c;\n } else if (c === '\"') quoted = true;\n else if (c === \",\") {\n row.push(cell);\n cell = \"\";\n } else if (c === \"\\n\" || c === \"\\r\") {\n if (c === \"\\r\" && text[i + 1] === \"\\n\") i++;\n row.push(cell);\n rows.push(row);\n row = [];\n cell = \"\";\n } else cell += c;\n }\n if (cell !== \"\" || row.length > 0) {\n row.push(cell);\n rows.push(row);\n }\n return rows;\n}\n\n/** An object URL of the loaded attachment, revoked when it is no longer shown. */\nfunction useBlob(a: ChatAttachment, load: LoadAttachment, enabled = true) {\n const [state, setState] = useState<{ url?: string; blob?: Blob; failed?: boolean }>({});\n // the adapter builds new objects on every render: the file is loaded once per file, not per object\n const { id, href, fileName, mimeType, size } = a;\n useEffect(() => {\n if (!enabled) return;\n let url: string | undefined;\n let live = true;\n load({ id, href, fileName, mimeType, size }).then((blob) => {\n if (!live) return;\n // the type of the product's metadata: a blob of a download is often untyped\n const type = previewType({ fileName, mimeType });\n const typed = type && blob.type !== type ? new Blob([blob], { type }) : blob;\n url = URL.createObjectURL(typed);\n setState({ url, blob: typed });\n }, () => live && setState({ failed: true }));\n return () => {\n live = false;\n if (url) URL.revokeObjectURL(url);\n };\n }, [enabled, load, id, href, fileName, mimeType, size]);\n return state;\n}\n\nfunction Thumb({ a, load, onOpen }: { a: ChatAttachment; load: LoadAttachment; onOpen: () => void }) {\n const t = useKitT();\n const { url, failed } = useBlob(a, load);\n if (failed) return <Tile a={a} kind=\"image\" onOpen={onOpen} />;\n return (\n <button type=\"button\" className=\"att-thumb\" onClick={onOpen} aria-label={t(\"chat.files.open\", { name: a.fileName })} title={a.fileName}>\n {url ? <img src={url} alt=\"\" /> : <span className=\"spin\" aria-hidden=\"true\" />}\n <span className=\"att-cap\">{a.fileName}</span>\n </button>\n );\n}\n\n/** A file as a tile: the icon of its preview, or of the download, its name and size. */\nfunction Tile({ a, kind, onOpen }: { a: ChatAttachment; kind: PreviewKind | null; onOpen?: () => void }) {\n const t = useKitT();\n const { i18n } = useTranslation(UIKIT_NS);\n const preview = kind !== null && onOpen !== undefined;\n const body = (\n <>\n <span className=\"att-ic\">\n <Icon name={preview && kind ? KIND_ICON[kind] : \"download\"} size={24} />\n <span className=\"att-kl\">{label(a, kind)}</span>\n </span>\n <span className=\"att-name\">{a.fileName}</span>\n {a.size != null && <span className=\"att-size\">{fileSize(a.size, i18n.language)}</span>}\n </>\n );\n if (preview) {\n return <button type=\"button\" className={`att-tile ${kind}`} onClick={onOpen} aria-label={t(\"chat.files.open\", { name: a.fileName })} title={a.fileName}>{body}</button>;\n }\n return <a className=\"att-tile dl\" href={a.href} download={a.fileName} aria-label={t(\"chat.files.save\", { name: a.fileName })} title={a.fileName}>{body}</a>;\n}\n\n/** The files of a message: thumbnails of images and tiles; without `load` every file downloads. `office`:\n * documents and spreadsheets open in the preview (FTR.NAB.CHAT-0003). */\nexport function AttachmentList({ items, load, onOpen, office = false }: {\n items: ChatAttachment[]; load?: LoadAttachment; onOpen?: (a: ChatAttachment) => void; office?: boolean;\n}) {\n return (\n <div className=\"atts\">\n {items.map((a) => {\n const open = load && onOpen ? () => onOpen(a) : undefined;\n const kind = previewKind(a, office);\n return load && open && kind === \"image\"\n ? <Thumb key={a.id} a={a} load={load} onOpen={open} />\n : <Tile key={a.id} a={a} kind={kind} onOpen={open} />;\n })}\n </div>\n );\n}\n\nfunction TableView({ text, tab }: { text: string; tab: boolean }) {\n const t = useKitT();\n const [head, ...body] = parseTable(text, tab);\n const shown = body.slice(0, TABLE_ROWS);\n return (\n <div className=\"att-table\">\n <table>\n {head && <thead><tr>{head.map((c, i) => <th key={i}>{c}</th>)}</tr></thead>}\n <tbody>{shown.map((r, i) => <tr key={i}>{r.map((c, j) => <td key={j}>{c}</td>)}</tr>)}</tbody>\n </table>\n {body.length > shown.length && <div className=\"att-more\">{t(\"chat.files.rows\", { shown: shown.length, total: body.length })}</div>}\n </div>\n );\n}\n\n/** The width a previewed page is laid out at: the one of a desktop. A narrower frame shows it scaled down, so a\n * page made for a screen (a deck of slides) is seen whole instead of cut. */\nexport const PAGE_WIDTH = 1280;\n\n/** A previewed HTML page, laid out at PAGE_WIDTH or at the width of its content when it is wider (a deck of wide\n * slides), and scaled to the width of the preview, so the page is seen whole, without a scroll to the side.\n * The frame has only `allow-same-origin`, so the chat can read the width of the page (FTR.NAB.CHAT-0001 tech,\n * decision 28): nothing in it runs — its scripts are removed (htmlDocument), and the frame and the policy forbid\n * them — and it loads nothing from outside. The isolation rests on the frame having no `allow-scripts`: with it,\n * the page would act as the site. Never add it. */\nfunction HtmlPage({ text, title }: { text: string; title: string }) {\n const box = useRef<HTMLDivElement>(null);\n const [boxWidth, setBoxWidth] = useState(PAGE_WIDTH);\n const [pageWidth, setPageWidth] = useState(PAGE_WIDTH);\n useEffect(() => {\n const el = box.current;\n if (!el) return;\n const fit = () => setBoxWidth(el.clientWidth);\n fit();\n if (typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver(fit);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n const doc = useMemo(() => htmlDocument(text), [text]);\n // another document is laid out anew at the width of a desktop, not at the width the last one needed\n const [measured, setMeasured] = useState(doc);\n if (measured !== doc) {\n setMeasured(doc);\n setPageWidth(PAGE_WIDTH);\n }\n const measure = (e: SyntheticEvent<HTMLIFrameElement>) => {\n const frame = e.currentTarget;\n const read = () => {\n const page = frame.contentDocument?.documentElement;\n if (page) setPageWidth(Math.max(PAGE_WIDTH, page.scrollWidth));\n };\n read();\n // the fonts of the file (data:) may widen the page after it has loaded\n void frame.contentDocument?.fonts?.ready.then(read);\n };\n const scale = Math.min(1, boxWidth / pageWidth);\n return (\n <div className=\"att-htmlbox\" ref={box}>\n <iframe className=\"att-html\" sandbox=\"allow-same-origin\" srcDoc={doc} title={title} referrerPolicy=\"no-referrer\" onLoad={measure}\n style={{ width: pageWidth, height: `${100 / scale}%`, transform: `scale(${scale})` }} />\n </div>\n );\n}\n\n/** The text of a file, or null when it is not UTF-8. */\ntype Text = { text: string | null };\n\n/** The preview of an attachment: an image, the browser's PDF viewer, drawn Markdown, a table or text; with\n * `loadPreview` — documents and spreadsheets as well (FTR.NAB.CHAT-0003). */\nexport function AttachmentPreview({ a, load, loadPreview, onClose }: {\n a: ChatAttachment; load: LoadAttachment; loadPreview?: LoadOfficePreview; onClose: () => void;\n}) {\n const t = useKitT();\n const { i18n } = useTranslation(UIKIT_NS);\n const kind = previewKind(a, !!loadPreview);\n const office = kind === \"office-doc\" || kind === \"office-sheet\";\n const textual = kind === \"markdown\" || kind === \"table\" || kind === \"html\" || kind === \"text\";\n const [source, setSource] = useState(false);\n // a known size over the limit is not loaded at all\n const knownTooLarge = textual && (a.size ?? 0) > TEXT_PREVIEW_MAX;\n const { url, blob, failed } = useBlob(a, load, !knownTooLarge && !office);\n const [content, setContent] = useState<Text | null>(null);\n const tooLarge = knownTooLarge || (textual && (blob?.size ?? 0) > TEXT_PREVIEW_MAX);\n useEffect(() => {\n if (!textual || !blob || tooLarge) return;\n void blob.arrayBuffer().then((buf) => {\n try {\n setContent({ text: new TextDecoder(\"utf-8\", { fatal: true }).decode(buf) });\n } catch {\n setContent({ text: null });\n }\n }, () => setContent({ text: null }));\n }, [textual, blob, tooLarge]);\n const text = content?.text;\n let body;\n if (office && loadPreview) body = <OfficeView a={a} load={loadPreview} />;\n else if (failed) body = <div className=\"att-msg err-text\">{t(\"chat.files.failed\")}</div>;\n else if (tooLarge) body = <div className=\"att-msg\">{t(\"chat.files.tooLarge\")}</div>;\n else if (content && text === null) body = <div className=\"att-msg\">{t(\"chat.files.notUtf8\")}</div>;\n else if (!url || (textual && text == null)) body = <div className=\"att-msg\"><span className=\"spin\" aria-hidden=\"true\" /> {t(\"loading\")}</div>;\n else if (kind === \"image\") body = <img className=\"att-img\" src={url} alt={a.fileName} />;\n // the browser's own viewer; an <object> because a sandboxed frame shows no PDF\n else if (kind === \"pdf\") body = <object className=\"att-pdf\" data={url} type=\"application/pdf\" aria-label={a.fileName}><div className=\"att-msg\">{t(\"chat.files.failed\")}</div></object>;\n else if (kind === \"markdown\") body = <div className=\"att-md\"><Markdown text={text ?? \"\"} /></div>;\n else if (kind === \"table\") body = <TableView text={text ?? \"\"} tab={/\\.tsv$/i.test(a.fileName) || a.mimeType === \"text/tab-separated-values\"} />;\n // a page: a frame with no permissions — no scripts, forms or access to the site — and no loads from outside\n else if (kind === \"html\" && !source) body = <HtmlPage text={text ?? \"\"} title={a.fileName} />;\n else body = <pre className=\"att-text\">{text}</pre>;\n return (\n <Modal wide onClose={onClose}\n title={<span className=\"att-title\"><span className=\"att-name\">{a.fileName}</span>{a.size != null && <span className=\"muted small\">{fileSize(a.size, i18n.language)}</span>}</span>}\n footer={<>\n {kind === \"html\" && (\n <button type=\"button\" className=\"btn ghost\" onClick={() => setSource((v) => !v)}>\n <Icon name={source ? \"globe\" : \"code\"} size={14} /> {t(source ? \"chat.files.page\" : \"chat.files.source\")}\n </button>\n )}\n <a className=\"btn ghost\" href={url ?? a.href} download={a.fileName}><Icon name=\"download\" size={14} /> {t(\"chat.files.download\")}</a>\n <button type=\"button\" className=\"btn primary\" onClick={onClose}>{t(\"close\")}</button>\n </>}>\n <div className={`att-view ${kind ?? \"\"}`}>{body}</div>\n </Modal>\n );\n}\n\n// ─── Documents and spreadsheets (FTR.NAB.CHAT-0003 R13–R16, design §3.2–3.3) ───\n\n/** How long a preview is waited for before «not available: timeout» (the server gives up after 30 s). */\nconst OFFICE_WAIT = 40_000;\nconst OFFICE_POLL = 2_000;\n/** The limit of a file the server names in a refusal; this one when it does not (R12). */\nconst OFFICE_LIMIT_MB = 25;\n/** The pages of a document in its preview (R13): the server converts these first ones. */\nconst DOC_PAGES = 50;\n\ntype OfficeState = OfficePreview | { state: \"loading\" } | { state: \"failed\" };\n\nfunction OfficeView({ a, load }: { a: ChatAttachment; load: LoadOfficePreview }) {\n const t = useKitT();\n const [st, setSt] = useState<OfficeState>({ state: \"loading\" });\n const { id, href, fileName, mimeType, size } = a;\n useEffect(() => {\n let live = true;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const started = Date.now();\n const ask = () => {\n load({ id, href, fileName, mimeType, size }).then((p) => {\n if (!live) return;\n if (p.state === \"pending\") {\n if (Date.now() - started > OFFICE_WAIT) setSt({ state: \"error\", reason: \"timeout\" });\n else {\n setSt(p);\n timer = setTimeout(ask, OFFICE_POLL);\n }\n return;\n }\n setSt(p);\n }, () => live && setSt({ state: \"failed\" }));\n };\n ask();\n return () => {\n live = false;\n if (timer) clearTimeout(timer);\n };\n }, [load, id, href, fileName, mimeType, size]);\n if (st.state === \"loading\" || st.state === \"pending\") {\n return <div className=\"att-msg att-wait\"><span className=\"spin\" aria-hidden=\"true\" /><b>{t(\"chat.files.preparing\")}</b><span className=\"muted small\">{t(\"chat.files.preparingHint\")}</span></div>;\n }\n if (st.state === \"failed\") return <div className=\"att-msg err-text\">{t(\"chat.files.failed\")}</div>;\n if (st.state === \"error\") {\n return (\n <div className=\"att-msg att-wait\">\n <Icon name=\"alert\" size={28} />\n <b>{t(\"chat.files.unavailable\")}</b>\n <span className=\"muted small\">{t(`chat.files.reasons.${st.reason}`, { limit: st.limitMb ?? OFFICE_LIMIT_MB })}</span>\n </div>\n );\n }\n if (st.state === \"doc\") return <DocView blob={st.blob} shown={st.shown} total={st.total} from={st.from} name={a.fileName} />;\n return <SheetView sheets={st.sheets} />;\n}\n\nfunction DocView({ blob, shown, total, from, name }: { blob: Blob; shown: number; total: number | null; from: string; name: string }) {\n const t = useKitT();\n const url = useMemo(() => URL.createObjectURL(blob.type === \"application/pdf\" ? blob : new Blob([blob], { type: \"application/pdf\" })), [blob]);\n useEffect(() => () => URL.revokeObjectURL(url), [url]);\n return (\n <div className=\"att-office\">\n <div className=\"att-converted\">{t(\"chat.files.converted\", { format: from })}</div>\n <object className=\"att-pdf\" data={url} type=\"application/pdf\" aria-label={name}><div className=\"att-msg\">{t(\"chat.files.failed\")}</div></object>\n {total != null && total > shown && <div className=\"att-more\">{t(\"chat.files.pagesShown\", { shown, total })}</div>}\n {total == null && shown >= DOC_PAGES && <div className=\"att-more\">{t(\"chat.files.firstPages\", { shown })}</div>}\n </div>\n );\n}\n\n/** A cell address: `B3` → row 2, column 1 (from zero). */\nfunction cellAt(ref: string): [number, number] | null {\n const m = /^([A-Z]+)(\\d+)$/.exec(ref);\n if (!m) return null;\n let col = 0;\n for (const ch of m[1]) col = col * 26 + ch.charCodeAt(0) - 64;\n return [Number(m[2]) - 1, col - 1];\n}\n\n/** The merged ranges of a sheet: the spans of their first cells and the cells they cover. */\nexport function mergeSpans(merges: string[]): { spans: Map<string, [number, number]>; covered: Set<string> } {\n const spans = new Map<string, [number, number]>();\n const covered = new Set<string>();\n for (const m of merges) {\n const [from, to] = m.split(\":\").map(cellAt);\n if (!from || !to) continue;\n spans.set(`${from[0]}:${from[1]}`, [to[0] - from[0] + 1, to[1] - from[1] + 1]);\n for (let r = from[0]; r <= to[0]; r++) for (let c = from[1]; c <= to[1]; c++) if (r !== from[0] || c !== from[1]) covered.add(`${r}:${c}`);\n }\n return { spans, covered };\n}\n\n/** The letters of a column: 1 → A, 27 → AA. */\nexport function columnName(n: number): string {\n let s = \"\";\n for (let c = n; c > 0; c = Math.floor((c - 1) / 26)) s = String.fromCharCode(65 + ((c - 1) % 26)) + s;\n return s;\n}\n\nexport function SheetView({ sheets }: { sheets: Sheet[] }) {\n const t = useKitT();\n const [i, setI] = useState(0);\n const sheet = sheets[Math.min(i, sheets.length - 1)];\n if (!sheet) return <div className=\"att-msg\">{t(\"chat.files.failed\")}</div>;\n const width = Math.max(0, ...sheet.cells.map((r) => r.length));\n const cols = Array.from({ length: width }, (_, c) => columnName(c + 1));\n const { spans, covered } = mergeSpans(sheet.merges);\n const moreRows = sheet.rows > sheet.cells.length;\n const moreCols = sheet.cols > width;\n return (\n <div className=\"att-office\">\n {sheets.length > 1 && (\n <Tabs label={t(\"chat.files.sheets\")} items={sheets.map((s, k) => ({ key: String(k), label: s.name }))} value={String(i)}\n onChange={(k) => setI(Number(k))} />\n )}\n <div className=\"att-table att-sheet\">\n <table>\n <thead><tr><th />{cols.map((c) => <th key={c}>{c}</th>)}</tr></thead>\n <tbody>\n {sheet.cells.map((row, r) => (\n <tr key={r}>\n <th>{r + 1}</th>\n {row.map((cell, c) => {\n if (covered.has(`${r}:${c}`)) return null;\n const [down, across] = spans.get(`${r}:${c}`) ?? [1, 1];\n const rowSpan = down > 1 ? down : undefined;\n const colSpan = across > 1 ? across : undefined;\n return cell.f\n ? <td key={c} rowSpan={rowSpan} colSpan={colSpan} className=\"att-formula\" title={t(\"chat.files.formulaHint\")}>{cell.f}</td>\n : <td key={c} rowSpan={rowSpan} colSpan={colSpan} className={cell.n != null ? \"att-num\" : undefined}>{cell.v ?? \"\"}</td>;\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n {(moreRows || moreCols) && (\n <div className=\"att-more\">\n {t(\"chat.files.rows\", { shown: sheet.cells.length, total: sheet.rows })}\n {moreCols && <> {t(\"chat.files.cols\", { shown: width, total: sheet.cols })}</>}\n </div>\n )}\n </div>\n );\n}\n","import { useState, type ReactNode } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { Icon } from \"../components/Icon\";\nimport { Markdown } from \"../components/Markdown\";\nimport { UIKIT_NS } from \"../i18n\";\nimport { AttachmentList, type LoadAttachment, type LoadOfficePreview } from \"./Attachments\";\nimport { intlLocale } from \"./intl\";\nimport type { ChatAttachment, ChatMessage, ChatStep } from \"./types\";\n\n\n/** The time of a caption: hours and minutes in the language of the interface. */\nexport function markTime(iso: string, language: string): string {\n return new Intl.DateTimeFormat(intlLocale(language), { hour: \"2-digit\", minute: \"2-digit\" }).format(new Date(iso));\n}\n\n/** More than three steps are folded to the last two (design §6.4). */\nexport function visibleSteps(steps: ChatStep[], open: boolean): ChatStep[] {\n return open || steps.length <= 3 ? steps : steps.slice(-2);\n}\n\n/** The icon of a step and its colour class by the state of the step. */\nconst STEP = {\n done: { icon: \"check\", cls: \"ok\" },\n error: { icon: \"alert\", cls: \"er\" },\n running: { icon: \"clock\", cls: \"run\" },\n} as const;\n\n/** One message of the conversation (design §6.4). */\nexport function MessageView({ m, busy, onRetry, loadAttachment, loadPreview, onOpenAttachment }: {\n m: ChatMessage; busy: boolean; onRetry?: () => void;\n /** R34: the preview of the files; without it they are links. */\n loadAttachment?: LoadAttachment; onOpenAttachment?: (a: ChatAttachment) => void;\n /** FTR.NAB.CHAT-0003: documents and spreadsheets open in the preview too. */\n loadPreview?: LoadOfficePreview;\n}) {\n const { t, i18n } = useTranslation(UIKIT_NS);\n const [open, setOpen] = useState(false);\n if (m.role === \"note\") return <div className=\"sysnote\">{m.text}</div>;\n if (m.role === \"event\" && m.event) return <EventDivider m={m} />;\n const mark = m.mark && <div className=\"chan\"><Icon name={m.mark.icon} size={12} /> {m.mark.text} · {markTime(m.createdAt, i18n.language)}</div>;\n const atts = m.attachments && m.attachments.length > 0 && (\n <AttachmentList items={m.attachments} load={loadAttachment} office={!!loadPreview} onOpen={onOpenAttachment} />\n );\n if (m.role === \"user\") {\n return (\n <div className=\"m u\">\n {mark}\n {m.content}\n {m.text && <div className=\"bub\">{m.text}</div>}\n {atts}\n {m.wait && (\n <div className={`turnstate${m.wait.state === \"queued\" ? \" q\" : \"\"}`} role=\"status\">\n {m.wait.state === \"queued\"\n ? <><Icon name=\"clock\" size={12} />{t(\"chat.wait.queued\", { count: m.wait.position })}</>\n : <><span className=\"spin\" aria-hidden=\"true\" />{t(\"chat.wait.starting\")}</>}\n </div>\n )}\n </div>\n );\n }\n if (m.variant === \"notice\") return <NoticeView m={m} mark={mark} atts={atts} />;\n const steps = m.steps ?? [];\n const waiting = (m.status === \"streaming\" || m.status === \"pending\") && !m.text && !m.content;\n return (\n <div className=\"m a\">\n {mark}\n {steps.length > 3 && (\n <button className=\"tools-fold\" onClick={() => setOpen((v) => !v)} aria-expanded={open}>\n {open ? t(\"chat.hideSteps\") : t(\"chat.moreSteps\", { count: steps.length - 2 })}\n </button>\n )}\n {visibleSteps(steps, open).map((s) => (\n <div key={s.id} className=\"tool\" title={s.title}>\n <Icon name={STEP[s.status].icon} size={14} className={STEP[s.status].cls} />\n <span className=\"tx\">{s.text}</span>\n </div>\n ))}\n {waiting && <div className=\"bub\"><span className=\"typing\" aria-label={t(\"chat.typing\")}><i /><i /><i /></span></div>}\n {m.content ?? (m.text && <div className=\"bub\" title={m.hint}><Markdown text={m.text} /></div>)}\n {atts}\n {m.error && (\n <div className={`llmerr${m.error.transient ? \" amber\" : \"\"}`} role=\"alert\" style={{ marginTop: 6 }}>\n <span>{m.error.text}</span>\n {onRetry && (\n <div className=\"row\">\n <button className=\"btn sm\" disabled={busy} onClick={onRetry}><Icon name=\"refresh\" size={14} />{t(\"chat.retry\")}</button>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\n/** A notice longer than this many lines is folded (FTR.NAB.CHAT-0002 design §3.1). */\nexport const NOTICE_LINES = 12;\n\n/** A notice of a product (FTR.NAB.CHAT-0002 design §3.1): on the left as an answer, a card with a\n * stripe, no retry, a long text folded. The content of the product, if any, replaces the text. */\nfunction NoticeView({ m, mark, atts }: { m: ChatMessage; mark: ReactNode; atts: ReactNode }) {\n const { t } = useTranslation(UIKIT_NS);\n const [open, setOpen] = useState(false);\n const long = !m.content && m.text.split(\"\\n\").length > NOTICE_LINES;\n return (\n <div className=\"m a notice\">\n {mark}\n {m.content ?? (\n <div className={`bub${long && !open ? \" folded\" : \"\"}`}>\n <Markdown text={m.text} />\n {long && (\n <button type=\"button\" className=\"textbtn\" aria-expanded={open} onClick={() => setOpen((v) => !v)}>\n {t(open ? \"chat.notice.less\" : \"chat.notice.more\")}\n </button>\n )}\n </div>\n )}\n {atts}\n </div>\n );\n}\n\n/** An event of the conversation: a line with a chip; the details unfold\n * (FTR.NAB.CHAT-0001 design §3.2). */\nfunction EventDivider({ m }: { m: ChatMessage }) {\n const { t, i18n } = useTranslation(UIKIT_NS);\n const [open, setOpen] = useState(false);\n const ev = m.event!;\n return (\n <div className=\"evdiv\">\n <div className=\"evline\" role=\"separator\">\n <span className=\"evchip\">\n <Icon name={ev.icon} size={12} />\n {ev.text} · {markTime(m.createdAt, i18n.language)}\n {ev.details && (\n <button type=\"button\" className=\"textbtn\" aria-expanded={open} onClick={() => setOpen((v) => !v)}>\n {t(\"chat.event.details\")} {open ? \"▴\" : \"▾\"}\n </button>\n )}\n </span>\n </div>\n {open && ev.details && <div className=\"evdetails\">{ev.details}</div>}\n </div>\n );\n}\n","/** What the composer does with the outcome of a recognition. */\nexport interface TranscriptionHandlers {\n busy(on: boolean): void;\n /** The recognized text goes into the composer. */\n text(text: string): void;\n /** Nothing was recognized. */\n empty(): void;\n /** The recognition failed: the reason and a way to try the same recording again. */\n failed(reason: string | undefined, retry: () => void): void;\n}\n\n/** Recognizes a recording (FTR.NAB.CHAT-0001 R20, design §3.1). A rejection of the\n * product is a failure the user may retry: the recording stays with the retry until\n * the toast is closed. `null` means the product has told the user itself. */\nexport async function transcribe(recording: Blob, recognize: (b: Blob) => Promise<string | null>, on: TranscriptionHandlers): Promise<void> {\n on.busy(true);\n let r: string | null;\n try {\n r = await recognize(recording);\n } catch (e) {\n on.busy(false);\n on.failed(e instanceof Error && e.message ? e.message : undefined, () => void transcribe(recording, recognize, on));\n return;\n }\n on.busy(false);\n if (r === null) return;\n if (!r) on.empty();\n else on.text(r);\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\n/** Recording with MediaRecorder (FTR.NAB.CHAT-0001 R20): started and stopped\n * by the user, stopped by itself at `maxSeconds`; the level of the voice is\n * sampled for the bar of the recording. */\nexport function useRecorder(maxSeconds = 300, onLimit?: () => void) {\n const supported = typeof window !== \"undefined\" && \"MediaRecorder\" in window && !!navigator.mediaDevices?.getUserMedia;\n const [recording, setRecording] = useState(false);\n const [seconds, setSeconds] = useState(0);\n const [level, setLevel] = useState(0);\n const [error, setError] = useState(false);\n const rec = useRef<MediaRecorder | null>(null);\n const chunks = useRef<Blob[]>([]);\n const timer = useRef<number | undefined>(undefined);\n const audio = useRef<AudioContext | null>(null);\n const stopped = useRef<((b: Blob | null) => void) | null>(null);\n const discard = useRef(false);\n const limit = useRef(onLimit);\n useEffect(() => {\n limit.current = onLimit;\n });\n\n const cleanup = useCallback(() => {\n window.clearInterval(timer.current);\n rec.current?.stream.getTracks().forEach((tr) => tr.stop());\n rec.current = null;\n void audio.current?.close().catch(() => undefined);\n audio.current = null;\n setRecording(false);\n setLevel(0);\n }, []);\n\n const start = useCallback(async () => {\n if (!supported || rec.current) return;\n setError(false);\n try {\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n const r = new MediaRecorder(stream);\n chunks.current = [];\n discard.current = false;\n r.ondataavailable = (e) => e.data.size > 0 && chunks.current.push(e.data);\n r.onstop = () => {\n const blob = !discard.current && chunks.current.length ? new Blob(chunks.current, { type: r.mimeType || \"audio/webm\" }) : null;\n cleanup();\n stopped.current?.(blob);\n stopped.current = null;\n };\n let analyser: AnalyserNode | null = null;\n try {\n const Ctx = window.AudioContext ?? (window as unknown as { webkitAudioContext?: typeof AudioContext }).webkitAudioContext;\n if (Ctx) {\n audio.current = new Ctx();\n analyser = audio.current.createAnalyser();\n analyser.fftSize = 256;\n audio.current.createMediaStreamSource(stream).connect(analyser);\n }\n } catch {\n analyser = null; // the bar stays flat without Web Audio\n }\n const samples = analyser ? new Uint8Array(analyser.fftSize) : null;\n rec.current = r;\n r.start();\n setSeconds(0);\n setRecording(true);\n const began = Date.now();\n let limited = false;\n timer.current = window.setInterval(() => {\n const s = Math.floor((Date.now() - began) / 1000);\n setSeconds(s);\n if (analyser && samples) {\n analyser.getByteTimeDomainData(samples);\n let peak = 0;\n for (const v of samples) peak = Math.max(peak, Math.abs(v - 128));\n setLevel(Math.min(1, peak / 64));\n }\n if (s >= maxSeconds && !limited) {\n limited = true;\n limit.current?.();\n }\n }, 100);\n } catch {\n setError(true);\n cleanup();\n }\n }, [supported, cleanup, maxSeconds]);\n\n const stop = useCallback(() => new Promise<Blob | null>((resolve) => {\n const r = rec.current;\n if (!r || r.state === \"inactive\") return resolve(null);\n stopped.current = resolve;\n r.stop();\n }), []);\n\n /** Ends the recording and drops it. */\n const cancel = useCallback(() => {\n discard.current = true;\n void stop();\n }, [stop]);\n\n useEffect(() => () => cleanup(), [cleanup]);\n\n return { supported, recording, seconds, level, error, start, stop, cancel };\n}\n\n/** m:ss of a number of seconds. */\nexport function clock(seconds: number): string {\n return `${Math.floor(seconds / 60)}:${String(seconds % 60).padStart(2, \"0\")}`;\n}\n","import { useEffect, useLayoutEffect, useMemo, useRef, useState, type KeyboardEvent } from \"react\";\nimport { Icon } from \"../components/Icon\";\nimport { useToast } from \"../components/ui\";\nimport { useKitT } from \"../i18n\";\nimport { CommandPalette, matchCommands } from \"./CommandPalette\";\nimport { ContextMeter } from \"./ContextMeter\";\nimport { MessageView } from \"./MessageView\";\nimport { AttachmentPreview, type LoadAttachment, type LoadOfficePreview } from \"./Attachments\";\nimport { transcribe } from \"./transcription\";\nimport type { ChatAttachment, ChatCommand, ChatProps, ChatUpload } from \"./types\";\nimport { clock, useRecorder } from \"./useRecorder\";\n\n/** The conversation: the messages and the composer (FTR.NAB.CMN-0005 R11–R13,\n * design §6; FTR.NAB.CHAT-0001 design §3.1). The behaviour is the one of the\n * chat of Nabu. A control exists only when the product gave its handler: no\n * `onCancel` — no cancel button, no `commands` — no palette. */\nexport function Chat(props: ChatProps) {\n const t = useKitT();\n const toast = useToast();\n const [text, setText] = useState(\"\");\n const [pending, setPending] = useState<ChatUpload[]>([]);\n const [uploading, setUploading] = useState(false);\n const [skill, setSkill] = useState<string | null>(null);\n const [active, setActive] = useState(0);\n const [paletteClosed, setPaletteClosed] = useState(false);\n const [unknown, setUnknown] = useState<string | null>(null);\n const [recognizing, setRecognizing] = useState(false);\n // FTR.NAB.CHAT-0001 R34: the file open in the preview. The product's loader may be a new function on\n // every render; the chat gives the thumbnails one stable function while the product has a loader\n const [viewing, setViewing] = useState<ChatAttachment | null>(null);\n const loadFile: LoadAttachment | undefined = useStableLoader(props.loadAttachment);\n // FTR.NAB.CHAT-0003: the preview of documents and spreadsheets, stable in the same way\n const loadPreview: LoadOfficePreview | undefined = useStableLoader(props.loadPreview);\n const voice = useRef(false);\n const listRef = useRef<HTMLDivElement>(null);\n const fileRef = useRef<HTMLInputElement>(null);\n const fieldRef = useRef<HTMLTextAreaElement>(null);\n const maxSeconds = props.voiceMaxSeconds ?? 300;\n const recorder = useRecorder(maxSeconds, () => void stopAndTranscribe());\n const { messages, busy = false } = props;\n // FTR.NAB.CHAT-0001 R1, R2: the context is reset or compacted between turns, not during one\n const turnRunning = busy || messages.some((m) => m.status === \"pending\" || m.status === \"streaming\");\n const onPendingChange = props.onPendingChange;\n useEffect(() => onPendingChange?.(pending), [pending, onPendingChange]);\n\n const first = messages[0]?.id;\n const tail = messages[messages.length - 1];\n const last = tail?.id;\n const tailText = tail?.text.length;\n const tailSteps = tail?.steps?.length;\n // The ends and the height of the list at the last layout: earlier messages\n // loaded above it keep the place of the list.\n const lastLayout = useRef<{ first?: string; last?: string; height: number }>({ height: 0 });\n // The list follows new messages and the growth of the last one: the dependencies are the trigger.\n useLayoutEffect(() => {\n const el = listRef.current;\n if (!el) return;\n const was = lastLayout.current;\n // history is prepended when the start of the list changed and its end did not;\n // another conversation changes both\n const prepended = was.first !== undefined && first !== was.first && last === was.last;\n el.scrollTop = prepended ? el.scrollTop + (el.scrollHeight - was.height) : el.scrollHeight;\n lastLayout.current = { first, last, height: el.scrollHeight };\n // oxlint-disable-next-line react/exhaustive-effect-dependencies -- the length and the growth of the tail only trigger\n }, [messages.length, first, last, tailText, tailSteps]);\n\n // R4: \"/\" at the start of the field without a space opens the palette\n const query = props.commands && !skill && text.startsWith(\"/\") && !/\\s/.test(text) ? text.slice(1) : null;\n const items = query !== null ? matchCommands(props.commands ?? [], query) : [];\n const paletteOpen = query !== null && !paletteClosed;\n\n const clear = () => {\n setText(\"\");\n setPending([]);\n setSkill(null);\n setUnknown(null);\n voice.current = false;\n };\n\n const runCommand = async (name: string, rest: string) => {\n if (!props.onCommand) return;\n try {\n await props.onCommand(name, rest);\n clear();\n } catch {\n // the product has told the user; the text stays\n }\n };\n\n const send = async (body: string, asText = false) => {\n const msg = body.trim();\n if ((!msg && pending.length === 0 && !skill) || busy || props.readOnly) return;\n // R4: a command typed in full runs; an unknown one waits for «Send as text»\n if (!asText && !skill && props.commands && msg.startsWith(\"/\")) {\n const [word, ...rest] = msg.slice(1).split(/\\s+/);\n const cmd = props.commands.find((c) => c.kind === \"command\" && c.name === word);\n if (cmd) return runCommand(cmd.name, rest.join(\" \"));\n if (word && !msg.includes(\"\\n\")) {\n setUnknown(\"/\" + word);\n return;\n }\n }\n try {\n await props.onSend(msg, pending.map((f) => f.id), voice.current, skill ?? undefined);\n clear();\n } catch {\n // the product has told the user; the text stays in the composer\n }\n };\n\n const pick = (c: ChatCommand) => {\n setActive(0);\n if (c.kind === \"skill\") {\n setSkill(c.name);\n setText(\"\");\n } else if (c.takesText) {\n setText(\"/\" + c.name + \" \");\n } else {\n void runCommand(c.name, \"\");\n }\n fieldRef.current?.focus();\n };\n\n const keys = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n if (paletteOpen && items.length > 0) {\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n const d = e.key === \"ArrowDown\" ? 1 : -1;\n setActive((a) => (a + d + items.length) % items.length);\n return;\n }\n if ((e.key === \"Enter\" && !e.shiftKey) || e.key === \"Tab\") {\n e.preventDefault();\n pick(items[Math.min(active, items.length - 1)]);\n return;\n }\n }\n if (paletteOpen && e.key === \"Escape\") {\n e.preventDefault();\n setPaletteClosed(true);\n return;\n }\n if (e.key === \"Backspace\" && skill && text === \"\") {\n setSkill(null); // design §3.1: Backspace in the empty field takes the skill off\n return;\n }\n // FTR.NAB.CHAT-0001 design §3.1: on a touch screen Enter is a new line, the message goes by its button\n if (e.key === \"Enter\" && !e.shiftKey && !e.nativeEvent.isComposing && !touchKeyboard()) {\n e.preventDefault();\n void send(text);\n }\n };\n\n // design §3.1: the field grows with its lines up to three, then scrolls (its max-height in CSS); a change of\n // its width (a turned phone, a resized panel) wraps the lines anew\n useLayoutEffect(() => keepListEnd(listRef.current, () => fitField(fieldRef.current)), [text]);\n useEffect(() => {\n const el = fieldRef.current;\n if (!el || typeof ResizeObserver === \"undefined\") return;\n let width = el.clientWidth;\n const ro = new ResizeObserver(() => {\n if (el.clientWidth !== width) {\n width = el.clientWidth;\n keepListEnd(listRef.current, () => fitField(el));\n }\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, [recorder.recording]);\n\n const attach = async (files: FileList | null) => {\n if (!files?.length || !props.onUpload) return;\n setUploading(true);\n for (const f of Array.from(files)) {\n if (props.upload && f.size > props.upload.maxBytes) {\n toast({ kind: \"error\", title: t(\"chat.tooLarge\"), text: f.name });\n continue;\n }\n const a = await props.onUpload(f).catch(() => null);\n if (a) setPending((x) => [...x, a]);\n }\n setUploading(false);\n if (fileRef.current) fileRef.current.value = \"\";\n };\n\n // R20: the recognized text goes into the field; the user checks and sends it\n async function stopAndTranscribe() {\n const blob = await recorder.stop();\n if (!blob || !props.onTranscribe) return;\n await transcribe(blob, props.onTranscribe, {\n busy: setRecognizing,\n empty: () => toast({ kind: \"error\", title: t(\"chat.voice.notRecognized\") }),\n // design §3.1: the recording stays until the toast is closed\n failed: (reason, retry) => toast({ kind: \"error\", title: reason ?? t(\"chat.voice.failed\"), actions: [{ label: t(\"chat.voice.retry\"), primary: true, onClick: retry }] }),\n text: (r) => {\n voice.current = true;\n setText((x) => (x.trim() ? x.trimEnd() + \" \" + r : r));\n fieldRef.current?.focus();\n },\n });\n }\n\n const voiceKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\" && recorder.recording) {\n e.preventDefault();\n recorder.cancel();\n }\n };\n\n const placeholder = skill ? t(\"chat.skillPlaceholder\") : (props.placeholder ?? t(\"chat.placeholder\", { name: props.agentName }));\n const left = maxSeconds - recorder.seconds;\n return (\n <section className=\"nb-chat\" aria-label={t(\"chat.title\")}>\n {props.header}\n <div className=\"msgs\" ref={listRef} aria-live=\"polite\">\n {props.hasOlder && props.onLoadOlder && (\n <button className=\"btn ghost sm\" style={{ alignSelf: \"center\" }} disabled={props.loadingOlder} onClick={props.onLoadOlder}>\n {t(\"chat.loadOlder\")}\n </button>\n )}\n {props.historyError && <div className=\"err-text\">{props.historyError}</div>}\n {messages.length === 0 && !props.loading && !props.historyError && (props.empty ??\n <div className=\"empty\"><div className=\"ic\"><Icon name=\"spark\" /></div><b>{t(\"chat.emptyTitle\", { name: props.agentName })}</b>{props.emptyHint}</div>\n )}\n {messages.map((m) => <MessageView key={m.id} m={m} busy={busy} onRetry={props.onRetry && (() => props.onRetry?.(m.id))}\n loadAttachment={loadFile} loadPreview={loadPreview} onOpenAttachment={setViewing} />)}\n {props.onConfirm && (props.confirmations ?? []).map((c) => (\n <div className=\"confirm\" key={c.id} role=\"group\" aria-label={t(\"chat.confirm.title\")}>\n <div className=\"h\"><Icon name=\"alert\" size={16} />{t(\"chat.confirm.title\")}</div>\n <div>{t(\"chat.confirm.text\", { action: c.summary })}</div>\n {c.preview !== undefined && <pre>{c.preview}</pre>}\n <div className=\"acts\">\n {/* never tied to `busy`: the agent asks in the middle of its turn */}\n <button className=\"btn sm primary\" onClick={() => props.onConfirm?.(c.id, true)}>{t(\"chat.confirm.approve\")}</button>\n <button className=\"btn sm\" onClick={() => props.onConfirm?.(c.id, false)}>{t(\"chat.confirm.reject\")}</button>\n </div>\n </div>\n ))}\n </div>\n\n {props.readOnly ? (\n <div className=\"composer\" style={{ justifyContent: \"space-between\", alignItems: \"center\" }}>{props.readOnly}</div>\n ) : (\n <div className=\"composer-wrap\">\n {paletteOpen && <CommandPalette items={items} active={Math.min(active, Math.max(items.length - 1, 0))} onPick={pick} onHover={setActive} />}\n {props.aboveComposer}\n {pending.length > 0 && (\n <div className=\"pending-files\">\n {pending.map((f) => (\n <span key={f.id} className=\"chip\">\n <Icon name=\"clip\" size={12} />{f.fileName}\n <button className=\"iconbtn\" style={{ width: 18, height: 18 }} aria-label={t(\"remove\")}\n onClick={() => setPending((x) => x.filter((y) => y.id !== f.id))}><Icon name=\"x\" size={12} /></button>\n </span>\n ))}\n </div>\n )}\n {unknown && (\n <div className=\"cmd-unknown\" role=\"status\">\n {t(\"chat.unknownCommand\", { name: unknown })}\n <button type=\"button\" className=\"textbtn\" onClick={() => void send(text, true)}>{t(\"chat.sendAsText\")}</button>\n </div>\n )}\n <div className=\"composer\">\n {props.onUpload && !recorder.recording && (\n <>\n <button className=\"iconbtn\" aria-label={t(\"chat.attach\")} disabled={uploading} onClick={() => fileRef.current?.click()}><Icon name=\"clip\" /></button>\n <input ref={fileRef} type=\"file\" multiple hidden accept={props.upload?.accept} onChange={(e) => attach(e.target.files)} />\n </>\n )}\n {recorder.recording ? (\n <div className={`recbar${left <= 15 ? \" ending\" : \"\"}`} role=\"status\" aria-label={t(\"chat.voice.recordingNow\")}>\n <span className=\"dot\" aria-hidden=\"true\" />\n <span className=\"tm\">{clock(recorder.seconds)} / {clock(maxSeconds)}</span>\n <span className=\"lvl\" aria-hidden=\"true\"><i style={{ transform: `scaleX(${Math.max(0.04, recorder.level)})` }} /></span>\n <button type=\"button\" className=\"btn ghost sm\" onClick={recorder.cancel}>{t(\"cancel\")}</button>\n <button type=\"button\" className=\"btn primary sm\" onKeyDown={voiceKey} onClick={() => void stopAndTranscribe()}>{t(\"chat.voice.done\")}</button>\n </div>\n ) : (\n <div className={`field${skill ? \" with-skill\" : \"\"}${recognizing ? \" recognizing\" : \"\"}`} aria-busy={recognizing || undefined}>\n {skill && (\n <span className=\"chip skill-chip\">\n <Icon name=\"spark\" size={12} />{skill}\n <button className=\"iconbtn\" style={{ width: 18, height: 18 }} aria-label={t(\"remove\")} onClick={() => setSkill(null)}><Icon name=\"x\" size={12} /></button>\n </span>\n )}\n <textarea ref={fieldRef} rows={1} value={text} placeholder={recognizing ? t(\"chat.voice.recognizing\") : placeholder} aria-label={placeholder}\n disabled={recognizing} aria-expanded={paletteOpen} aria-autocomplete={props.commands ? \"list\" : undefined}\n onChange={(e) => { setText(e.target.value); setPaletteClosed(false); setActive(0); setUnknown(null); }}\n onKeyDown={keys} />\n </div>\n )}\n {props.context && !recorder.recording && <ContextMeter context={props.context} onCompact={props.onCompact} onReset={props.onReset} busy={turnRunning} />}\n {props.onTranscribe && !recorder.recording && (\n <VoiceButton supported={recorder.supported} recognizing={recognizing} onStart={() => void recorder.start()} />\n )}\n {!recorder.recording && (props.onCancel && busy ? (\n <button className=\"iconbtn fill\" aria-label={t(\"chat.stop\")} onClick={props.onCancel}><Icon name=\"stop\" /></button>\n ) : (\n <button className=\"iconbtn fill\" aria-label={t(\"chat.send\")} disabled={(!text.trim() && pending.length === 0 && !skill) || busy || recognizing} onClick={() => send(text)}>\n <Icon name=\"send\" />\n </button>\n ))}\n </div>\n {recorder.error && <div className=\"err-text\" style={{ padding: \"0 12px 8px\" }}>{t(\"chat.voice.micDenied\")}</div>}\n </div>\n )}\n {viewing && loadFile && <AttachmentPreview a={viewing} load={loadFile} loadPreview={loadPreview} onClose={() => setViewing(null)} />}\n </section>\n );\n}\n\n// design §3.1: while the server recognizes a recording the microphone gives way\n// to a wave, so the user sees the voice is being processed\nexport function VoiceButton({ supported, recognizing, onStart }: { supported: boolean; recognizing: boolean; onStart: () => void }) {\n const t = useKitT();\n if (recognizing) {\n return (\n <span className=\"voicewait\" role=\"status\" aria-label={t(\"chat.voice.recognizing\")} title={t(\"chat.voice.recognizing\")}>\n <i /><i /><i /><i /><i />\n </span>\n );\n }\n return (\n <button className=\"iconbtn\" disabled={!supported}\n aria-label={t(\"chat.voice.start\")} title={supported ? t(\"chat.voice.start\") : t(\"chat.voice.unsupported\")}\n onClick={onStart}>\n <Icon name=\"mic\" />\n </button>\n );\n}\n\n/** A touch screen without a mouse: its on-screen keyboard has no Shift+Enter, so Enter breaks the line. */\nfunction touchKeyboard(): boolean {\n return typeof window !== \"undefined\" && !!window.matchMedia?.(\"(hover: none) and (pointer: coarse)\").matches;\n}\n\n/** A list scrolled to its end (within the rounding of a pixel). */\nconst atEnd = (list: HTMLElement) => list.scrollHeight - list.scrollTop - list.clientHeight < 2;\n\n/** FTR.NAB.CHAT-0001 design §3.1: the list of messages gets lower as the field grows; a list read to its end stays at\n * its end, so the last message is not hidden under the field, and a list scrolled up stays where it is. */\nfunction keepListEnd(list: HTMLElement | null, change: () => void) {\n const pinned = !!list && atEnd(list);\n change();\n if (list && pinned) list.scrollTop = list.scrollHeight;\n}\n\n/** FTR.NAB.CHAT-0001 design §3.1: sets the height of the field to its lines; the CSS bounds it to three. */\nfunction fitField(el: HTMLTextAreaElement | null) {\n if (!el) return;\n // measured without a scrollbar: a scrollbar that takes room (Windows) would add to the height it is measured by\n el.style.overflowY = \"hidden\";\n el.style.height = \"auto\";\n const full = el.scrollHeight + el.offsetHeight - el.clientHeight;\n el.style.height = `${full}px`;\n // the bar appears only past three lines, where the CSS stops the field\n el.style.overflowY = el.offsetHeight < full ? \"auto\" : \"hidden\";\n}\n\n/** One function for as long as the product has a loader, whatever function it passes on each render:\n * thumbnails and the preview do not load again when the product renders. */\nfunction useStableLoader<A, R>(load: ((a: A) => Promise<R>) | undefined): ((a: A) => Promise<R>) | undefined {\n const latest = useRef(load);\n useEffect(() => {\n latest.current = load;\n });\n const has = !!load;\n return useMemo(() => has\n ? (a: A) => latest.current ? latest.current(a) : Promise.reject(new Error(\"no loader\"))\n : undefined, [has]);\n}\n","import { useEffect, useState, type ReactNode } from \"react\";\nimport { Icon } from \"../components/Icon\";\nimport { Modal } from \"../components/ui\";\nimport { useKitT } from \"../i18n\";\nimport type { ChatConversation, ConversationListProps } from \"./types\";\n\n/** The conversations of the user: the main one, the topics, the archive (design\n * §6.2). In a wide place the list stands left of the messages; on a phone and in\n * a narrow place it lies over them while open and closes by a pick, a tap\n * beside it or Escape. */\nexport function ConversationList({ conversations, currentId, open, onPick, onClose, onCreate }: ConversationListProps) {\n const t = useKitT();\n const [creating, setCreating] = useState(false);\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => e.key === \"Escape\" && onClose();\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [open, onClose]);\n\n const item = (c: ChatConversation) => (\n <button key={c.id} className={`it${c.id === currentId ? \" on\" : \"\"}${c.group === \"archive\" ? \" arch\" : \"\"}`}\n onClick={() => onPick(c.id)} aria-current={c.id === currentId}>\n <Icon name={c.icon ?? \"msg2\"} size={16} />\n <span className=\"nm\">{c.title}</span>\n {!!c.unread && <span className=\"unread\" aria-label={t(\"chat.unread\", { count: c.unread })}>{c.unread}</span>}\n <span className=\"sub\">{c.when}</span>\n </button>\n );\n const inGroup = (g: ChatConversation[\"group\"]) => conversations.filter((c) => c.group === g);\n const topics = inGroup(\"topic\");\n const archive = inGroup(\"archive\");\n return (\n <>\n <nav className={`nb-side${open ? \" open\" : \"\"}`} aria-label={t(\"chat.conversations\")}>\n {onCreate && (\n <button className=\"btn sm\" style={{ width: \"100%\", justifyContent: \"center\" }} onClick={() => setCreating(true)}>\n <Icon name=\"plus\" size={15} />{t(\"chat.newTopic\")}\n </button>\n )}\n <div className=\"h\">{t(\"chat.conversation\")}</div>\n {inGroup(\"main\").map(item)}\n <div className=\"h\">{t(\"chat.topics\")}</div>\n {topics.length === 0 && <div className=\"small muted\" style={{ padding: \"0 10px\" }}>{t(\"chat.noTopics\")}</div>}\n {topics.map(item)}\n {archive.length > 0 && <div className=\"h\">{t(\"chat.archive\")}</div>}\n {archive.map(item)}\n </nav>\n {/* over the messages: a tap beside the list closes it */}\n {open && <button type=\"button\" className=\"nb-scrim\" aria-label={t(\"close\")} onClick={onClose} />}\n {creating && onCreate && <NewTopicModal onClose={() => setCreating(false)} onCreate={onCreate} />}\n </>\n );\n}\n\n/** The place of a chat: the list of conversations, the conversation and what the\n * product puts beside them. `narrow` is for a side panel: the list lies over the\n * messages as on a phone, whatever the width of the window. */\nexport function ChatLayout({ narrow, children }: { narrow?: boolean; children: ReactNode }) {\n return <div className={`nb-app${narrow ? \" narrow\" : \"\"}`}>{children}</div>;\n}\n\n/** The dialog of a new topic: one field, Enter creates. */\nexport function NewTopicModal({ onClose, onCreate }: { onClose: () => void; onCreate: (title: string) => Promise<void> }) {\n const t = useKitT();\n const [title, setTitle] = useState(\"\");\n const [pending, setPending] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const create = async () => {\n if (!title.trim() || pending) return;\n setPending(true);\n setError(null);\n try {\n await onCreate(title.trim());\n onClose();\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n setPending(false);\n }\n };\n return (\n <Modal title={t(\"chat.newTopic\")} onClose={onClose} footer={<>\n <button className=\"btn ghost\" onClick={onClose}>{t(\"cancel\")}</button>\n <button className=\"btn primary\" disabled={!title.trim() || pending} onClick={create}>{t(\"create\")}</button>\n </>}>\n <div className=\"field\">\n <label htmlFor=\"topic-title\">{t(\"chat.topicTitle\")}</label>\n <input id=\"topic-title\" className=\"inp\" value={title} maxLength={120} onChange={(e) => setTitle(e.target.value)}\n onKeyDown={(e) => e.key === \"Enter\" && create()} />\n <div className=\"hint\">{t(\"chat.topicHint\")}</div>\n </div>\n {error && <div className=\"err-text\">{error}</div>}\n </Modal>\n );\n}\n","import { useState, type ReactNode } from \"react\";\nimport { Icon, type IconName } from \"../components/Icon\";\nimport { useOutside } from \"../components/ui\";\nimport { useKitT } from \"../i18n\";\n\n/** One of the ways an agent can look and talk; what it means only the product knows (R7). */\nexport interface AgentOption { key: string; label: string; icon: IconName }\n\n/** A model the user may choose for the agent (FTR.NAB.CHAT-0001 R16, design §3.3). */\nexport interface AgentModelOption {\n key: string;\n label: string;\n /** The connection or the default model, grey under the name. */\n sub?: string;\n /** The capabilities: images, reasoning, the window. */\n badges?: { icon?: IconName; text: string }[];\n /** Under the row of the chosen model: the context will be compacted. */\n warn?: ReactNode;\n}\n\n/** The block «Model» of the menu: one model is shown without a choice; none — the text of the product. */\nexport interface AgentModels {\n label: ReactNode;\n options: AgentModelOption[];\n value: string;\n onPick: (key: string) => void;\n empty?: ReactNode;\n}\n\n/** The round button of the agent: its icon, and the menu behind it. */\nexport function AgentButton({ icon, label, title, expanded, small, disabled, onClick }: {\n icon: IconName; label: string; title?: string; expanded?: boolean; small?: boolean; disabled?: boolean; onClick?: () => void;\n}) {\n return (\n <button type=\"button\" className={`agentbtn${small ? \" s\" : \"\"}`} disabled={disabled} aria-label={label} aria-expanded={expanded} title={title}\n // the menu closes on an outside mousedown; keep this click a toggle\n onMouseDown={(e) => expanded && e.stopPropagation()} onClick={onClick}>\n <Icon name={icon} size={small ? 15 : 18} />\n </button>\n );\n}\n\n/** The menu of the agent (FTR.NAB.CMN-0005 R15, design §6.6): its name and a\n * choice among the options of the product, as tiles with icons. The name is\n * saved on Enter and on leaving the field; a pick is saved at once. */\nexport function AgentMenu({ label, name, options, value, optionsLabel, hint, narrow, models, onRename, onPick, onClose }: {\n /** The name of the dialog for a screen reader. */\n label: string;\n name: string;\n options: AgentOption[];\n value: string;\n optionsLabel: ReactNode;\n hint?: ReactNode;\n /** A narrow place — a side panel: the options go in one column. */\n narrow?: boolean;\n /** The choice of the model after the options. */\n models?: AgentModels;\n onRename: (name: string) => void;\n onPick: (key: string) => void;\n /** Must keep its identity between renders. */\n onClose: () => void;\n}) {\n const t = useKitT();\n const [draft, setDraft] = useState(name);\n const ref = useOutside<HTMLDivElement>(true, onClose);\n const save = () => {\n const next = draft.trim();\n if (next && next !== name) onRename(next);\n };\n return (\n <div className={`agentmenu${narrow ? \" narrow\" : \"\"}`} ref={ref} role=\"dialog\" aria-label={label}>\n <div className=\"lab\">{t(\"agentName\")}</div>\n <input className=\"inp\" value={draft} maxLength={40} autoFocus aria-label={t(\"agentName\")}\n onChange={(e) => setDraft(e.target.value)} onBlur={save}\n onKeyDown={(e) => e.key === \"Enter\" && (e.target as HTMLInputElement).blur()} />\n <div className=\"lab\" style={{ marginTop: 14 }}>{optionsLabel}</div>\n <div className=\"agentoptions\">\n {options.map((o) => (\n <button key={o.key} type=\"button\" className={`agentoption${value === o.key ? \" on\" : \"\"}`} aria-pressed={value === o.key} onClick={() => onPick(o.key)}>\n <span className=\"ic\"><Icon name={o.icon} size={15} /></span>\n {o.label}\n </button>\n ))}\n </div>\n {models && (\n <>\n <div className=\"lab\" style={{ marginTop: 14 }}>{models.label}</div>\n {models.options.length === 0 && <div className=\"hint\">{models.empty}</div>}\n <div className=\"agentmodels\" role=\"radiogroup\">\n {models.options.map((m) => {\n const single = models.options.length === 1;\n const on = single || models.value === m.key;\n return (\n <button key={m.key} type=\"button\" role=\"radio\" aria-checked={on} disabled={single} className={`agentmodel${on ? \" on\" : \"\"}`}\n onClick={() => !on && models.onPick(m.key)}>\n {!single && <span className={`radio${on ? \" on\" : \"\"}`} aria-hidden=\"true\" />}\n <span className=\"body\">\n <span className=\"nm\">{m.label}</span>\n {m.sub && <span className=\"sub\">{m.sub}</span>}\n {m.badges && m.badges.length > 0 && (\n <span className=\"badges\">\n {m.badges.map((b) => <span key={b.text} className=\"cap\">{b.icon && <Icon name={b.icon} size={11} />}{b.text}</span>)}\n </span>\n )}\n {on && m.warn && <span className=\"warn\">{m.warn}</span>}\n </span>\n </button>\n );\n })}\n </div>\n </>\n )}\n {hint && <div className=\"hint\" style={{ marginTop: 10 }}>{hint}</div>}\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport type { TFunction } from \"i18next\";\nimport { useKitT } from \"../i18n\";\nimport { AgentMenu, type AgentModelOption, type AgentOption } from \"./AgentMenu\";\nimport { tokens } from \"./ContextMeter\";\n\n/** A model the agent can run on, as the service of the agent gives it\n * (FTR.NAB.CHAT-0001 tech §2.2: `availableModels`, `model`, `defaultModel`). */\nexport interface AgentModel {\n connectionId: string;\n model: string;\n name: string;\n /** The connection the model comes through: grey under its name. */\n connection: string;\n caps: { image: boolean; reasoning: boolean; contextWindow: number };\n}\n\n/** What the user chose; null — the default model. */\nexport type AgentModelChoice = Pick<AgentModel, \"connectionId\" | \"model\"> | null;\n\n/** The models of the agent for the block «Model». */\nexport interface AgentModelState {\n available: AgentModel[];\n /** The model in use. */\n model: AgentModel | null;\n defaultModel: AgentModel | null;\n /** The user chose the model; false — the default one. */\n chosen: boolean;\n /** The fill of the context of the main conversation, in tokens. */\n contextTokens: number;\n}\n\n/** The key of a model of a connection in the menu. */\nexport const agentModelKey = (m: Pick<AgentModel, \"connectionId\" | \"model\">) => `${m.connectionId}/${m.model}`;\n\n/** The lines of the block «Model» (FTR.NAB.CHAT-0001 R16, R17, design §3.3): with a\n * choice the first line is «Default» with the default model under it; a model\n * whose window the context outgrows warns; one model is shown without a choice. */\nexport function agentModelOptions(t: TFunction, lng: string, s: AgentModelState): { options: AgentModelOption[]; value: string } {\n const badges = (m: AgentModel) => [\n ...(m.caps.image ? [{ icon: \"image\" as const, text: t(\"agent.capImage\") }] : []),\n ...(m.caps.reasoning ? [{ icon: \"brain\" as const, text: t(\"agent.capReasoning\") }] : []),\n ...(m.caps.contextWindow > 0 ? [{ text: tokens(m.caps.contextWindow, lng) }] : []),\n ];\n // R17: a context larger than 80 % of the window will be compacted\n const warn = (m: AgentModel) =>\n m.caps.contextWindow > 0 && s.contextTokens > 0.8 * m.caps.contextWindow ? t(\"agent.modelCompactWarn\") : undefined;\n const choice = s.available.length > 1;\n const models: AgentModelOption[] = s.available.map((m) => ({\n key: agentModelKey(m), label: m.name, sub: m.connection, badges: badges(m), warn: choice ? warn(m) : undefined,\n }));\n const options: AgentModelOption[] = choice\n ? [{ key: \"\", label: t(\"agent.modelDefault\"), sub: s.defaultModel?.name ?? \"—\", warn: s.defaultModel ? warn(s.defaultModel) : undefined }, ...models]\n : models;\n const value = s.chosen && s.model ? agentModelKey(s.model) : choice ? \"\" : (s.model ? agentModelKey(s.model) : \"\");\n return { options, value };\n}\n\n/** The menu of the agent, the same in every product (FTR.NAB.CMN-0005 R15;\n * FTR.HMR.SPEC-0001): the name, the options of the product as tiles in two\n * columns, the model when the product gives `models`, and the hint. What the\n * options mean only the product knows (R7): it passes them with their icons. The\n * strings are the kit's; `hint` replaces the hint of the kit where the product\n * saves the agent elsewhere. */\nexport function AgentSettingsMenu({ name, value, options, models, hint, onRename, onPick, onModel, onClose }: {\n name: string;\n value: string;\n options: AgentOption[];\n models?: AgentModelState;\n hint?: ReactNode;\n onRename: (name: string) => void;\n onPick: (key: string) => void;\n onModel?: (choice: AgentModelChoice) => void;\n /** Must keep its identity between renders. */\n onClose: () => void;\n}) {\n const t = useKitT();\n const { i18n } = useTranslation();\n const block = models && onModel ? agentModelOptions(t, i18n.language, models) : null;\n const pickModel = (key: string) => {\n if (!models || !onModel) return;\n if (!key) return onModel(null);\n const m = models.available.find((x) => agentModelKey(x) === key);\n if (m) onModel({ connectionId: m.connectionId, model: m.model });\n };\n return (\n <AgentMenu label={t(\"agent.menu\")} name={name} value={value} optionsLabel={t(\"agent.options\")} hint={hint ?? t(\"agent.everywhere\")}\n options={options}\n models={block ? { label: t(\"agent.model\"), options: block.options, value: block.value, onPick: pickModel, empty: t(\"agent.noModels\") } : undefined}\n onRename={onRename} onPick={onPick} onClose={onClose} />\n );\n}\n"],"mappings":";;;;;;AAKA,SAAgBc,EAAc,GAAyB,GAA8B;CACnF,IAAMC,IAAIC,EAAM,YAAY;CAC5B,OAAOC,EAAS,QAAQ,MAAMC,EAAE,KAAK,YAAY,CAAC,CAAC,SAASH,CAAC,MAAMG,EAAE,eAAe,GAAA,CAAI,YAAY,CAAC,CAAC,SAASH,CAAC,CAAC;AACnH;AAKA,SAAgBI,EAAe,EAAE,UAAO,WAAQ,WAAQ,cAKrD;CACD,IAAMC,IAAIR,EAAQ,GACZK,IAAWI,EAAM,QAAQ,MAAMH,EAAE,SAAS,SAAS,GACnDI,IAASD,EAAM,QAAQ,MAAMH,EAAE,SAAS,OAAO,GAC/CK,KAAO,GAAgB,MAC3B,kBAAC,UAAD;EAA8B,MAAK;EAAS,MAAK;EAAS,iBAAeC,MAAMC;EAAQ,WAAW,cAAcD,MAAMC,IAAS,QAAQ;EAErI,cAAc,MAAM;GAAsB,AAApBC,EAAE,eAAe,GAAGC,EAAOT,CAAC;EAAG;EAAG,oBAAoBU,EAAQJ,CAAC;EAFvF,UAAA;GAIGN,EAAE,SAAS,UAAU,kBAACX,GAAD;IAAM,MAAK;IAAQ,MAAM;GAAK,CAAA,IAAI,kBAAC,QAAD;IAAM,WAAU;IAAQ,eAAY;GAAQ,CAAA;GACpG,kBAAC,QAAD;IAAM,WAAU;IAAM,UAAAW,EAAE,SAAS,YAAY,MAAMA,EAAE,OAAOA,EAAE;GAAW,CAAA;GACzE,kBAAC,QAAD;IAAM,WAAU;IAAM,UAAAA,EAAE;GAAkB,CAAA;GACzCA,EAAE,UAAU,kBAAC,QAAD;IAAM,WAAU;IAAO,UAAAA,EAAE;GAAa,CAAA;EAC7C;CARK,GAAAA,EAAE,OAAOA,EAAE,IAQhB;CAEV,OACE,kBAAC,OAAD;EAAK,WAAU;EAAU,MAAK;EAAU,cAAYE,EAAE,oBAAoB;EAA1E,UAAA;GACGC,EAAM,WAAW,KAAK,kBAAC,OAAD;IAAK,WAAU;IAAiB,UAAAD,EAAE,oBAAoB;GAAO,CAAA;GACnFH,EAAS,SAAS,KAAK,kBAAC,OAAD;IAAK,WAAU;IAAa,UAAAG,EAAE,uBAAuB;GAAO,CAAA;GACnFH,EAAS,KAAK,MAAMM,EAAIL,GAAGG,EAAM,QAAQH,CAAC,CAAC,CAAC;GAC5CG,EAAM,SAAS,KAAK,kBAAC,OAAD;IAAK,WAAU;IAAa,UAAAD,EAAE,qBAAqB;GAAO,CAAA;GAC9EE,EAAO,WAAW,KAAKD,EAAM,SAAS,KAAK,kBAAC,OAAD;IAAK,WAAU;IAAiB,UAAAD,EAAE,uBAAuB;GAAO,CAAA;GAC3GE,EAAO,KAAK,MAAMC,EAAIL,GAAGG,EAAM,QAAQH,CAAC,CAAC,CAAC;EACxC;;AAET;;;AC1CA,IAAaW,KAAc,MAAiBC,MAAQ,OAAO,UAAUA;;;ACQrE,SAAgBC,EAAO,GAAW,GAAqB;CACrD,OAAO,IAAI,KAAK,aAAaF,EAAWC,CAAG,GAAG;EAAE,UAAU;EAAW,uBAAuB;CAAE,CAAC,CAAC,CAAC,OAAOE,CAAC;AAC3G;AAKA,SAAgBC,EAAa,EAAE,YAAS,cAAW,YAAS,UAAO,MAIhE;CACD,IAAMb,IAAIR,EAAQ,GACZ,EAAE,YAASsB,EAAerB,CAAQ,GAClC,CAACsB,GAAMC,KAAWC,EAAS,EAAK,GAChCC,IAAM5B,EAA2ByB,SAAYC,EAAQ,EAAK,CAAC,GAC3DG,IAAQC,EAAQ,SAAS,IAAI,KAAK,IAAI,GAAGA,EAAQ,SAASA,EAAQ,MAAM,IAAI,GAC5EC,IAAM,KAAK,MAAMF,IAAQ,GAAG,GAC5BG,IAAQH,KAAS,KAAM,SAASA,KAAS,KAAM,SAAS,IAExDrB,IAAI,IAAI,KAAK,KAAK,GAClBY,IAAMa,EAAK;CACjB,OACE,kBAAC,OAAD;EAAK,WAAU;EAAgB;EAA/B,UAAA,CACE,kBAAC,UAAD;GAAQ,MAAK;GAAS,WAAW,WAAWD;GAAS,iBAAeP;GAAM,eAAeC,GAAS,MAAM,CAACQ,CAAC;GACxG,cAAYxB,EAAE,sBAAsB;IAAE,MAAMW,EAAOS,EAAQ,QAAQV,CAAG;IAAG,OAAOC,EAAOS,EAAQ,QAAQV,CAAG;IAAG;GAAI,CAAC;GAClH,OAAOV,EAAE,sBAAsB;IAAE,MAAMW,EAAOS,EAAQ,QAAQV,CAAG;IAAG,OAAOC,EAAOS,EAAQ,QAAQV,CAAG;IAAG;GAAI,CAAC;GAC7G,UAAA,kBAAC,OAAD;IAAK,SAAQ;IAAY,eAAY;IAArC,UAAA,CACE,kBAAC,UAAD;KAAQ,WAAU;KAAK,IAAG;KAAI,IAAG;KAAO;IAAI,CAAA,GAC5C,kBAAC,UAAD;KAAQ,WAAU;KAAK,IAAG;KAAI,IAAG;KAAO;KAAG,iBAAiB,IAAIZ,IAAIqB,EAAA,CAAO,QAAQ,CAAC,EAAE,GAAGrB,EAAE,QAAQ,CAAC;KAAK,WAAU;IAAmB,CAAA,CACnI;;EACC,CAAA,GACPiB,KACC,kBAAC,OAAD;GAAK,WAAU;GAAS,MAAK;GAA7B,UAAA;IACE,kBAAC,OAAD,EAAA,UAAMf,EAAE,sBAAsB;KAAE,MAAMW,EAAOS,EAAQ,QAAQV,CAAG;KAAG,OAAOC,EAAOS,EAAQ,QAAQV,CAAG;KAAG;IAAI,CAAC,EAAO,CAAA;IAClHY,MAAU,UAAU,kBAAC,OAAD;KAAK,WAAU;KAAc,OAAO,EAAE,WAAW,EAAE;KAAI,UAAAtB,EAAE,mBAAmB;IAAO,CAAA;IACvGsB,MAAU,WAAWG,KAAaC,MACjC,kBAAA9C,GAAA,EAAA,UAAA,CACE,kBAAC,OAAD;KAAK,WAAU;KAAM,OAAO;MAAE,WAAW;MAAG,KAAK;KAAE;KAAnD,UAAA,CAEG6C,KAAa,kBAACG,GAAD;MAAa,MAAK;MAAW,OAAO5B,EAAE,sBAAsB;MAAS;MACjF,WAAW;OAAkB,AAAhBgB,EAAQ,EAAK,GAAGS,EAAU;MAAG;KAAI,CAAA,GAC/CC,KAAW,kBAACE,GAAD;MAAa,MAAK;MAAQ,OAAO5B,EAAE,oBAAoB;MAAS;MAAM,WAAW;OAAkB,AAAhBgB,EAAQ,EAAK,GAAGU,EAAQ;MAAG;KAAI,CAAA,CAC3H;IAEJ,CAAA,GAAAG,KAAQ,kBAAC,OAAD;KAAK,IAAG;KAAW,WAAU;KAAc,OAAO,EAAE,WAAW,EAAE;KAAI,UAAA7B,EAAE,uBAAuB;IAAO,CAAA,CAC9G,EAAA,CAAA;GAED;EAEJ,CAAA,CAAA;;AAET;AAGA,SAAS4B,EAAY,EAAE,SAAM,UAAO,SAAM,UAA0E;CAClH,OACE,kBAAC,UAAD;EAAQ,MAAK;EAAS,WAAU;EAAS,UAAUC;EAAM,oBAAkBA,IAAO,aAAa,KAAA;EAAW,SAASC;EAAnH,UAAA,CACE,kBAAC3C,GAAD;GAAM,MAAM4C;GAAM,MAAM;EAAK,CAAA,GAAEC,CACzB;;AAEZ;;;AC/CA,IAAMC,IAAa,gDACbC,IAAe,0BAMfC,oBAAS,IAAI,IAAI;CAAC;CAAa;CAAc;CAAa;CAAc;AAAe,CAAC,GACxFC,IAAY,+BACZC,IAAW;AASjB,SAAgBC,EAAY,GAAkD,IAAS,IAA2B;CAChH,IAAMC,KAAQC,EAAE,YAAY,GAAA,CAAI,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,GAC3DC,IAAOD,EAAE,SAAS,YAAY;CASpC,OARIE,KAAUT,EAAW,KAAKQ,CAAI,IAAU,eACxCC,KAAUR,EAAa,KAAKO,CAAI,IAAU,iBAC1CN,EAAO,IAAII,CAAI,MAAO,CAACA,KAAQA,MAAS,+BAA+BH,EAAU,KAAKK,CAAI,IAAW,UACrGF,MAAS,qBAAqBE,EAAK,SAAS,MAAM,IAAU,QAC5DF,MAAS,mBAAmB,mBAAmB,KAAKE,CAAI,IAAU,aAClEF,MAAS,cAAcA,MAAS,+BAA+B,eAAe,KAAKE,CAAI,IAAU,UACjGF,MAAS,eAAe,WAAW,KAAKE,CAAI,IAAU,SACtDF,EAAK,WAAW,OAAO,KAAKA,MAAS,sBAAsBA,MAAS,qBAAqBF,EAAS,KAAKI,CAAI,IAAU,SAClH;AACT;AAEA,IAAME,IAA2C;CAAE,OAAO;CAAS,KAAK;CAAO,UAAU;CAAY,OAAO;CAAS,MAAM;CAAS,MAAM;CACxI,cAAc;CAAS,gBAAgB;AAAQ,GAGpCC,KAAe,MAAgCD,EAAUE;AAGtE,SAASb,GAAM,GAAmB,GAAkC;CAKlE,OAJIa,MAAS,QAAc,QACvBA,MAAS,aAAmB,OAC5BA,MAAS,SAAe,SAChB,sBAAsB,KAAKL,EAAE,QAAQ,CAAC,GAAG,EAAE,EAAE,YAAY,MACtDK,IAAO,QAAQ;AAChC;AAGA,SAAgBC,EAAS,GAAe,GAA0B;CAChE,IAAMC,IAAQ;EAAC;EAAQ;EAAY;EAAY;CAAU,GACrDvB,IAAIwB,GACJ,IAAI;CACR,OAAOxB,KAAK,QAAQ,IAAIuB,EAAM,SAAS,IAErC,AADA,KAAK,MACL;CAEF,OAAO,IAAI,KAAK,aAAatC,EAAWwC,CAAQ,GAAG;EACjD,OAAO;EAAQ,MAAMF,EAAM;EAAI,aAAa;EAAS,uBAAuB,MAAM,IAAI,IAAI;CAC5F,CAAC,CAAC,CAAC,OAAOvB,CAAC;AACb;AAIA,IAAM0B,IAAc;AAOpB,SAAgBC,EAAa,GAAsB;CACjD,IAAMC,IAAO,uDAAuDF,EAAY,KAC1EG,IAAU,uBAAuB,KAAKC,CAAI,CAAC,GAAG,MAAM;CAC1D,IAAI,OAAO,YAAc,KAAa,OAAOD,IAAUD,IAAOE,EAAK,MAAMD,EAAQ,MAAM;CACvF,IAAME,IAAM,IAAI,UAAU,CAAC,CAAC,gBAAgBD,GAAM,WAAW;CAY7D,AAXAC,EAAI,iBAAiB,wGAAwG,CAAC,CAAC,SAAS,MAAOC,EAAG,OAAO,CAAC,GAC1JD,EAAI,iBAAiB,GAAG,CAAC,CAAC,SAAS,MAAO;EAExC,KAAK,IAAME,KAAQ,MAAM,KAAKD,EAAG,UAAU,GAAG;GAC5C,IAAMf,IAAOgB,EAAK,KAAK,YAAY;GACnC,AAAIhB,EAAK,WAAW,IAAI,KACfiB,EAAU,IAAIjB,CAAI,KAAK,CAACkB,EAAS,KAAKF,EAAK,KAAK,KAChDhB,MAAS,YAAYgB,EAAK,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,MAAM,CAACE,EAAS,KAAK7D,CAAC,CAAC,IAFtD0D,EAAG,gBAAgBC,EAAK,IAAI,IAG9ChB,MAAS,WAASe,EAAG,aAAa,SAASI,EAASH,EAAK,KAAK,CAAC;EAC1E;CACF,CAAC,GACDF,EAAI,iBAAiB,OAAO,CAAC,CAAC,SAAS,MAAO;EAAE,EAAG,cAAcK,EAASJ,EAAG,eAAe,EAAE;CAAG,CAAC;CAClG,IAAMK,IAASN,EAAI,cAAc,MAAM;CAIvC,OAHAM,EAAO,aAAa,cAAc,yBAAyB,GAC3DA,EAAO,aAAa,WAAWX,CAAW,GAC1CK,EAAI,KAAK,QAAQM,CAAM,IACfR,IAAU,oBAAoB,MAAME,EAAI,gBAAgB;AAClE;AAGA,IAAMG,oBAAY,IAAI,IAAI;CAAC;CAAO;CAAQ;CAAc;CAAU;CAAc;CAAU;CAAc;CAAQ;CAAQ;CAAU;CAAU;CAAY;CAAQ;CAAY;CAAY;CAAW;AAAQ,CAAC,GAGtMC,IAAW;AAGjB,SAASC,EAAS,GAAqB;CACrC,OAAOE,EAAI,QAAQ,oBAAoB,EAAE,CAAC,CAAC,QAAQ,kCAAkC,GAAG,GAAY,MAAeH,EAAS,KAAKI,CAAC,KAAKA,EAAE,KAAK,MAAM,KAAKC,IAAI,MAAO;AACtK;AAIA,IAAMC,IAAsC;CAC1C,KAAK;CAAa,KAAK;CAAc,MAAM;CAAc,KAAK;CAAa,MAAM;CAAc,KAAK;CACpG,KAAK;CAAmB,IAAI;CAAiB,UAAU;CAAiB,KAAK;CAAY,KAAK;CAC9F,MAAM;CAAa,KAAK;AAC1B;AAGA,SAAgBC,EAAY,GAAsE;CAChG,IAAMC,KAAO3B,EAAE,YAAY,GAAA,CAAI,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,YAAY;CAEhE,OADI2B,KAAOA,MAAQ,6BAAmCA,IAC/CF,EAAY,kBAAkB,KAAKzB,EAAE,QAAQ,CAAC,GAAG,EAAE,EAAE,YAAY,KAAK,QAAQ2B,KAAO,KAAA;AAC9F;AAGA,SAAgBC,EAAW,GAAc,GAA0B;CACjE,IAAIC,GAAK,OAAOf,EAAK,QAAQ,UAAU,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,KAAK,MAAMgB,EAAE,MAAM,GAAI,CAAC;CAClF,IAAMC,IAAmB,CAAC,GACtBpE,IAAgB,CAAC,GACjBqE,IAAO,IACPC,IAAS;CACb,KAAK,IAAIrE,IAAI,GAAGA,IAAIkD,EAAK,QAAQ,KAAK;EACpC,IAAMxD,IAAIwD,EAAKlD;EACf,AAAIqE,IACE3E,MAAM,QAAOwD,EAAKlD,IAAI,OAAO,QAC/B,KAAQ,MACR,OACSN,MAAM,OAAK,IAAS,KAC1B,KAAQA,IACJA,MAAM,OAAK,IAAS,KACtBA,MAAM,OACbK,EAAI,KAAKqE,CAAI,GACb,IAAO,MACE1E,MAAM,QAAQA,MAAM,QACzBA,MAAM,QAAQwD,EAAKlD,IAAI,OAAO,QAAM,KACxCD,EAAI,KAAKqE,CAAI,GACbD,EAAK,KAAKpE,CAAG,GACb,IAAM,CAAC,GACP,IAAO,MACF,KAAQL;CACjB;CAKA,QAJI0E,MAAS,MAAMrE,EAAI,SAAS,OAC9BA,EAAI,KAAKqE,CAAI,GACbD,EAAK,KAAKpE,CAAG,IAERoE;AACT;AAGA,SAASG,EAAQ,GAAmB,GAAsB,IAAU,IAAM;CACxE,IAAM,CAACC,GAAOC,KAAY3D,EAA0D,CAAC,CAAC,GAEhF,EAAE,OAAI,SAAM,aAAU,aAAU,YAASuB;CAkB/C,OAjBAqC,QAAgB;EACd,IAAI,CAACC,GAAS;EACd,IAAIC,GACAC,IAAO;EASX,OARAC,EAAK;GAAE;GAAI;GAAM;GAAU;GAAU;EAAK,CAAC,CAAC,CAAC,MAAM,MAAS;GAC1D,IAAI,CAACD,GAAM;GAEX,IAAMzC,IAAO2B,EAAY;IAAE;IAAU;GAAS,CAAC,GACzCgB,IAAQ3C,KAAQ4C,EAAK,SAAS5C,IAAO,IAAI,KAAK,CAAC4C,CAAI,GAAG,EAAE,QAAK,CAAC,IAAIA;GAExE,AADA,IAAM,IAAI,gBAAgBD,CAAK,GAC/BN,EAAS;IAAE;IAAK,MAAMM;GAAM,CAAC;EAC/B,SAASF,KAAQJ,EAAS,EAAE,QAAQ,GAAK,CAAC,CAAC,SAC9B;GAEX,AADA,IAAO,IACHG,KAAK,IAAI,gBAAgBA,CAAG;EAClC;CACF,GAAG;EAACD;EAASG;EAAMG;EAAIC;EAAMC;EAAUC;EAAUC;CAAI,CAAC,GAC/Cb;AACT;AAEA,SAASc,EAAM,EAAE,MAAG,SAAM,aAA2E;CACnG,IAAMzF,IAAIR,EAAQ,GACZ,EAAE,QAAK,cAAWkF,EAAQlC,GAAGyC,CAAI;CAEvC,OADIS,IAAe,kBAACC,IAAD;EAAS;EAAG,MAAK;EAAgB;CAAS,CAAA,IAE3D,kBAAC,UAAD;EAAQ,MAAK;EAAS,WAAU;EAAY,SAASC;EAAQ,cAAY5F,EAAE,mBAAmB,EAAE,MAAMwC,EAAE,SAAS,CAAC;EAAG,OAAOA,EAAE;EAA9H,UAAA,CACGuC,IAAM,kBAAC,OAAD;GAAK,KAAKA;GAAK,KAAI;EAAI,CAAA,IAAI,kBAAC,QAAD;GAAM,WAAU;GAAO,eAAY;EAAQ,CAAA,GAC7E,kBAAC,QAAD;GAAM,WAAU;GAAW,UAAAvC,EAAE;EAAe,CAAA,CACtC;;AAEZ;AAGA,SAASmD,GAAK,EAAE,MAAG,SAAM,aAAgF;CACvG,IAAM3F,IAAIR,EAAQ,GACZ,EAAE,YAASsB,EAAerB,CAAQ,GAClCoG,IAAUhD,MAAS,QAAQ+C,MAAW,KAAA,GACtCE,IACJ,kBAAAjH,GAAA,EAAA,UAAA;EACE,kBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CACE,kBAACM,GAAD;IAAM,MAAM0G,KAAWhD,IAAOF,EAAUE,KAAQ;IAAY,MAAM;GAAK,CAAA,GACvE,kBAAC,QAAD;IAAM,WAAU;IAAU,UAAAb,GAAMQ,GAAGK,CAAI;GAAQ,CAAA,CAC3C;;EACN,kBAAC,QAAD;GAAM,WAAU;GAAY,UAAAL,EAAE;EAAe,CAAA;EAC5CA,EAAE,QAAQ,QAAQ,kBAAC,QAAD;GAAM,WAAU;GAAY,UAAAM,EAASN,EAAE,MAAMjB,EAAK,QAAQ;EAAQ,CAAA;CACrF,EAAA,CAAA;CAKJ,OAHIsE,IACK,kBAAC,UAAD;EAAQ,MAAK;EAAS,WAAW,YAAYhD;EAAQ,SAAS+C;EAAQ,cAAY5F,EAAE,mBAAmB,EAAE,MAAMwC,EAAE,SAAS,CAAC;EAAG,OAAOA,EAAE;EAAW,UAAAsD;CAAa,CAAA,IAEjK,kBAAC,KAAD;EAAG,WAAU;EAAc,MAAMtD,EAAE;EAAM,UAAUA,EAAE;EAAU,cAAYxC,EAAE,mBAAmB,EAAE,MAAMwC,EAAE,SAAS,CAAC;EAAG,OAAOA,EAAE;EAAW,UAAAsD;CAAQ,CAAA;AAC5J;AAIA,SAAgBC,EAAe,EAAE,UAAO,SAAM,WAAQ,YAAS,MAE5D;CACD,OACE,kBAAC,OAAD;EAAK,WAAU;EACZ,UAAA9F,EAAM,KAAK,MAAM;GAChB,IAAMc,IAAOkE,KAAQW,UAAeA,EAAOpD,CAAC,IAAI,KAAA,GAC1CK,IAAOP,EAAYE,GAAGE,CAAM;GAClC,OAAOuC,KAAQlE,KAAQ8B,MAAS,UAC5B,kBAAC4C,GAAD;IAAqB;IAAS;IAAM,QAAQ1E;GAAO,GAAvCyB,EAAE,EAAqC,IACnD,kBAACmD,IAAD;IAAoB;IAAS;IAAM,QAAQ5E;GAAO,GAAvCyB,EAAE,EAAqC;EACxD,CAAC;CACE,CAAA;AAET;AAEA,SAASwD,EAAU,EAAE,SAAM,UAAuC;CAChE,IAAMhG,IAAIR,EAAQ,GACZ,CAACyG,GAAM,GAAGH,KAAQ1B,EAAWd,GAAMe,CAAG,GACtC6B,IAAQJ,EAAK,MAAM,GAAA,GAAa;CACtC,OACE,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,kBAAC,SAAD,EAAA,UAAA,CACGG,KAAQ,kBAAC,SAAD,EAAA,UAAO,kBAAC,MAAD,EAAA,UAAKA,EAAK,KAAK,GAAG,MAAM,kBAAC,MAAD,EAAA,UAAanG,EAAM,GAAVM,CAAU,CAAC,EAAM,CAAA,EAAQ,CAAA,GAC1E,kBAAC,SAAD,EAAA,UAAQ8F,EAAM,KAAK,GAAG,MAAM,kBAAC,MAAD,EAAA,UAAaC,EAAE,KAAK,GAAG,MAAM,kBAAC,MAAD,EAAA,UAAarG,EAAM,GAAVsG,CAAU,CAAC,EAAM,GAA9ChG,CAA8C,CAAC,EAAS,CAAA,CACxF,EAAA,CAAA,GACN0F,EAAK,SAASI,EAAM,UAAU,kBAAC,OAAD;GAAK,WAAU;GAAY,UAAAlG,EAAE,mBAAmB;IAAE,OAAOkG,EAAM;IAAQ,OAAOJ,EAAK;GAAO,CAAC;EAAO,CAAA,CAC9H;;AAET;AAIA,IAAaO,IAAa;AAQ1B,SAASC,EAAS,EAAE,SAAM,YAA0C;CAClE,IAAMC,IAAMC,EAAuB,IAAI,GACjC,CAACC,GAAUC,KAAezF,EAASoF,CAAU,GAC7C,CAACM,GAAWC,KAAgB3F,EAASoF,CAAU;CACrD,QAAgB;EACd,IAAM7C,IAAK+C,EAAI;EACf,IAAI,CAAC/C,GAAI;EACT,IAAMqD,UAAYH,EAAYlD,EAAG,WAAW;EAE5C,IADAqD,EAAI,GACA,OAAO,iBAAmB,KAAa;EAC3C,IAAMC,IAAK,IAAI,eAAeD,CAAG;EAEjC,OADAC,EAAG,QAAQtD,CAAE,SACAsD,EAAG,WAAW;CAC7B,GAAG,CAAC,CAAC;CACL,IAAMvD,IAAMwD,QAAc5D,EAAaG,CAAI,GAAG,CAACA,CAAI,CAAC,GAE9C,CAAC0D,GAAUC,KAAehG,EAASsC,CAAG;CAC5C,AAAIyD,MAAazD,MACf0D,EAAY1D,CAAG,GACfqD,EAAaP,CAAU;CAEzB,IAAMa,KAAW,MAAyC;EACxD,IAAMC,IAAQ,EAAE,eACVC,UAAa;GACjB,IAAMC,IAAOF,EAAM,iBAAiB;GACpC,AAAIE,KAAMT,EAAa,KAAK,IAAIP,GAAYgB,EAAK,WAAW,CAAC;EAC/D;EAGA,AAFAD,EAAK,GAELD,EAAW,iBAAiB,OAAO,MAAM,KAAKC,CAAI;CACpD,GACME,IAAQ,KAAK,IAAI,GAAGb,IAAWE,CAAS;CAC9C,OACE,kBAAC,OAAD;EAAK,WAAU;EAAc,KAAKJ;EAChC,UAAA,kBAAC,UAAD;GAAQ,WAAU;GAAW,SAAQ;GAAoB,QAAQhD;GAAY;GAAO,gBAAe;GAAc,QAAQ2D;GACvH,OAAO;IAAE,OAAOP;IAAW,QAAQ,GAAG,MAAMW,EAAM;IAAI,WAAW,SAASA,EAAM;GAAG;EAAI,CAAA;CACtF,CAAA;AAET;AAOA,SAAgBC,GAAkB,EAAE,MAAG,SAAM,gBAAa,cAEvD;CACD,IAAMvH,IAAIR,EAAQ,GACZ,EAAE,YAASsB,EAAerB,CAAQ,GAClCoD,IAAOP,EAAYE,GAAG,CAAC,CAACgF,CAAW,GACnC9E,IAASG,MAAS,gBAAgBA,MAAS,gBAC3C4E,IAAU5E,MAAS,cAAcA,MAAS,WAAWA,MAAS,UAAUA,MAAS,QACjF,CAAC6E,GAAQC,KAAa1G,EAAS,EAAK,GAEpC2G,IAAgBH,MAAYjF,EAAE,QAAQ,KAAA,SACtC,EAAE,QAAK,SAAM,cAAWkC,EAAQlC,GAAGyC,GAAM,CAAC2C,KAAiB,CAAClF,CAAM,GAClE,CAACmF,GAASC,KAAc7G,EAAsB,IAAI,GAClD8G,IAAWH,KAAkBH,MAAYtC,GAAM,QAAQ,KAAA;CAC7D,QAAgB;EACd,AAAKsC,KAAYtC,KAAQ,MACzBA,EAAU,YAAY,CAAC,CAAC,MAAM,MAAQ;GACpC,IAAI;IACF,EAAW,EAAE,MAAM,IAAI,YAAY,SAAS,EAAE,OAAO,GAAK,CAAC,CAAC,CAAC,OAAO6C,CAAG,EAAE,CAAC;GAC5E,QAAQ;IACN,EAAW,EAAE,MAAM,KAAK,CAAC;GAC3B;EACF,SAASF,EAAW,EAAE,MAAM,KAAK,CAAC,CAAC;CACrC,GAAG;EAACL;EAAStC;EAAM4C;CAAQ,CAAC;CAC5B,IAAMzE,IAAOuE,GAAS,MAClB/B;CAcJ,OAbA,AAYKA,IAZDpD,KAAU8E,IAAoB,kBAACS,GAAD;EAAe;EAAG,MAAMT;CAAc,CAAA,IAC/D9B,IAAe,kBAAC,OAAD;EAAK,WAAU;EAAoB,UAAA1F,EAAE,mBAAmB;CAAO,CAAA,IAC9E+H,IAAiB,kBAAC,OAAD;EAAK,WAAU;EAAW,UAAA/H,EAAE,qBAAqB;CAAO,CAAA,IACzE6H,KAAWvE,MAAS,OAAa,kBAAC,OAAD;EAAK,WAAU;EAAW,UAAAtD,EAAE,oBAAoB;CAAO,CAAA,IACxF,CAAC+E,KAAQ0C,KAAWnE,KAAQ,OAAc,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GAAyB,kBAAC,QAAD;IAAM,WAAU;IAAO,eAAY;GAAQ,CAAA;GAAC;GAAEtD,EAAE,SAAS;EAAO;MACnI6C,MAAS,UAAgB,kBAAC,OAAD;EAAK,WAAU;EAAU,KAAKkC;EAAK,KAAKvC,EAAE;CAAW,CAAA,IAE9EK,MAAS,QAAc,kBAAC,UAAD;EAAQ,WAAU;EAAU,MAAMkC;EAAK,MAAK;EAAkB,cAAYvC,EAAE;EAAU,UAAA,kBAAC,OAAD;GAAK,WAAU;GAAW,UAAAxC,EAAE,mBAAmB;EAAO,CAAA;CAAS,CAAA,IAC5K6C,MAAS,aAAmB,kBAAC,OAAD;EAAK,WAAU;EAAS,UAAA,kBAACtD,GAAD,EAAU,MAAM+D,KAAQ,GAAK,CAAA;CAAM,CAAA,IACvFT,MAAS,UAAgB,kBAACmD,GAAD;EAAW,MAAM1C,KAAQ;EAAI,KAAK,UAAU,KAAKd,EAAE,QAAQ,KAAKA,EAAE,aAAa;CAA8B,CAAA,IAEtIK,MAAS,UAAU,CAAC6E,IAAe,kBAACpB,GAAD;EAAU,MAAMhD,KAAQ;EAAI,OAAOd,EAAE;CAAW,CAAA,IAChF,kBAAC,OAAD;EAAK,WAAU;EAAY,UAAAc;CAAU,CAAA,GAE/C,kBAAClE,GAAD;EAAO,MAAA;EAAc;EACnB,OAAO,kBAAC,QAAD;GAAM,WAAU;GAAhB,UAAA,CAA4B,kBAAC,QAAD;IAAM,WAAU;IAAY,UAAAoD,EAAE;GAAe,CAAA,GAAEA,EAAE,QAAQ,QAAQ,kBAAC,QAAD;IAAM,WAAU;IAAe,UAAAM,EAASN,EAAE,MAAMjB,EAAK,QAAQ;GAAQ,CAAA,CAAQ;;EACjL,QAAQ,kBAAA1C,GAAA,EAAA,UAAA;GACLgE,MAAS,UACR,kBAAC,UAAD;IAAQ,MAAK;IAAS,WAAU;IAAY,eAAe8E,GAAW,MAAM,CAACnG,CAAC;IAA9E,UAAA;KACE,kBAACrC,GAAD;MAAM,MAAMuI,IAAS,UAAU;MAAQ,MAAM;KAAK,CAAA;KAAC;KAAE1H,EAAE0H,IAAS,oBAAoB,mBAAmB;IACjG;;GAEV,kBAAC,KAAD;IAAG,WAAU;IAAY,MAAM3C,KAAOvC,EAAE;IAAM,UAAUA,EAAE;IAA1D,UAAA;KAAoE,kBAACrD,GAAD;MAAM,MAAK;MAAW,MAAM;KAAK,CAAA;KAAC;KAAEa,EAAE,qBAAqB;IAAK;;GACpI,kBAAC,UAAD;IAAQ,MAAK;IAAS,WAAU;IAAc,SAASkI;IAAU,UAAAlI,EAAE,OAAO;GAAU,CAAA;EACpF,EAAA,CAAA;EACF,UAAA,kBAAC,OAAD;GAAK,WAAW,YAAY6C,KAAQ;GAAO,UAAAiD;EAAU,CAAA;CAChD,CAAA;AAEX;AAKA,IAAMqC,KAAc,KACdC,KAAc,KAEdC,IAAkB,IAElBC,IAAY;AAIlB,SAASL,EAAW,EAAE,MAAG,WAAwD;CAC/E,IAAMjI,IAAIR,EAAQ,GACZ,CAAC+I,GAAIC,KAASvH,EAAsB,EAAE,OAAO,UAAU,CAAC,GACxD,EAAE,OAAI,SAAM,aAAU,aAAU,YAASuB;CAuC/C,OAtCAqC,QAAgB;EACd,IAAIG,IAAO,IACPyD,GACEC,IAAU,KAAK,IAAI,GACnBC,UAAY;GAChB,EAAK;IAAE;IAAI;IAAM;IAAU;IAAU;GAAK,CAAC,CAAC,CAAC,MAAM,MAAM;IACvD,AAAK3D,MACD4D,EAAE,UAAU,YACV,KAAK,IAAI,IAAIF,IAAUP,KAAaK,EAAM;KAAE,OAAO;KAAS,QAAQ;IAAU,CAAC,KAEjFA,EAAMI,CAAC,GACP,IAAQ,WAAWD,GAAKP,EAAW,KAIvCI,EAAMI,CAAC;GACT,SAAS5D,KAAQwD,EAAM,EAAE,OAAO,SAAS,CAAC,CAAC;EAC7C;EAEA,OADAG,EAAI,SACS;GAEX,AADA,IAAO,IACHF,KAAO,aAAaA,CAAK;EAC/B;CACF,GAAG;EAACxD;EAAMG;EAAIC;EAAMC;EAAUC;EAAUC;CAAI,CAAC,GACzC+C,EAAG,UAAU,aAAaA,EAAG,UAAU,YAClC,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GAAkC,kBAAC,QAAD;IAAM,WAAU;IAAO,eAAY;GAAQ,CAAA;GAAC,kBAAC,KAAD,EAAA,UAAIvI,EAAE,sBAAsB,EAAK,CAAA;GAAC,kBAAC,QAAD;IAAM,WAAU;IAAe,UAAAA,EAAE,0BAA0B;GAAQ,CAAA;EAAM;MAE9LuI,EAAG,UAAU,WAAiB,kBAAC,OAAD;EAAK,WAAU;EAAoB,UAAAvI,EAAE,mBAAmB;CAAO,CAAA,IAC7FuI,EAAG,UAAU,UAEb,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,kBAACpJ,GAAD;IAAM,MAAK;IAAQ,MAAM;GAAK,CAAA;GAC9B,kBAAC,KAAD,EAAA,UAAIa,EAAE,wBAAwB,EAAK,CAAA;GACnC,kBAAC,QAAD;IAAM,WAAU;IAAe,UAAAA,EAAE,sBAAsBuI,EAAG,UAAU,EAAE,OAAOA,EAAG,WAAWF,EAAgB,CAAC;GAAQ,CAAA;EACjH;MAGLE,EAAG,UAAU,QAAc,kBAACM,GAAD;EAAS,MAAMN,EAAG;EAAM,OAAOA,EAAG;EAAO,OAAOA,EAAG;EAAO,MAAMA,EAAG;EAAM,MAAM/F,EAAE;CAAW,CAAA,IACpH,kBAACsG,IAAD,EAAW,QAAQP,EAAG,OAAS,CAAA;AACxC;AAEA,SAASM,EAAQ,EAAE,SAAM,UAAO,UAAO,SAAM,WAAyF;CACpI,IAAM7I,IAAIR,EAAQ,GACZuF,IAAMgC,QAAc,IAAI,gBAAgB5B,EAAK,SAAS,oBAAoBA,IAAO,IAAI,KAAK,CAACA,CAAI,GAAG,EAAE,MAAM,kBAAkB,CAAC,CAAC,GAAG,CAACA,CAAI,CAAC;CAE7I,OADAN,cAAsB,IAAI,gBAAgBE,CAAG,GAAG,CAACA,CAAG,CAAC,GAEnD,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,kBAAC,OAAD;IAAK,WAAU;IAAiB,UAAA/E,EAAE,wBAAwB,EAAE,QAAQ+I,EAAK,CAAC;GAAO,CAAA;GACjF,kBAAC,UAAD;IAAQ,WAAU;IAAU,MAAMhE;IAAK,MAAK;IAAkB,cAAYtC;IAAM,UAAA,kBAAC,OAAD;KAAK,WAAU;KAAW,UAAAzC,EAAE,mBAAmB;IAAO,CAAA;GAAS,CAAA;GAC9IgJ,KAAS,QAAQA,IAAQ9C,KAAS,kBAAC,OAAD;IAAK,WAAU;IAAY,UAAAlG,EAAE,yBAAyB;KAAE;KAAO;IAAM,CAAC;GAAO,CAAA;GAC/GgJ,KAAS,QAAQ9C,KAASoC,KAAa,kBAAC,OAAD;IAAK,WAAU;IAAY,UAAAtI,EAAE,yBAAyB,EAAE,SAAM,CAAC;GAAO,CAAA;EAC3G;;AAET;AAGA,SAASiJ,GAAO,GAAsC;CACpD,IAAMjF,IAAI,kBAAkB,KAAK9C,CAAG;CACpC,IAAI,CAAC8C,GAAG,OAAO;CACf,IAAIkF,IAAM;CACV,KAAK,IAAMC,KAAMnF,EAAE,IAAI,IAAMkF,IAAM,KAAKC,EAAG,WAAW,CAAC,IAAI;CAC3D,OAAO,CAAC,OAAOnF,EAAE,EAAE,IAAI,GAAGkF,IAAM,CAAC;AACnC;AAGA,SAAgBE,GAAW,GAAkF;CAC3G,IAAMC,oBAAQ,IAAI,IAA8B,GAC1CC,oBAAU,IAAI,IAAY;CAChC,KAAK,IAAMtF,KAAKuF,GAAQ;EACtB,IAAM,CAACR,GAAMS,KAAMxF,EAAE,MAAM,GAAG,CAAC,CAAC,IAAIiF,EAAM;EAC1C,IAAKF,KAASS,GACd;KAAM,IAAI,GAAGT,EAAK,GAAG,GAAGA,EAAK,MAAM,CAACS,EAAG,KAAKT,EAAK,KAAK,GAAGS,EAAG,KAAKT,EAAK,KAAK,CAAC,CAAC;GAC7E,KAAK,IAAI5C,IAAI4C,EAAK,IAAI5C,KAAKqD,EAAG,IAAI,KAAK,KAAK,IAAI1J,IAAIiJ,EAAK,IAAIjJ,KAAK0J,EAAG,IAAI,KAAK,CAAIrD,MAAM4C,EAAK,MAAMjJ,MAAMiJ,EAAK,OAAIO,EAAQ,IAAI,GAAGnD,EAAE,GAAGrG,GAAG;EAD5D;CAE/E;CACA,OAAO;EAAE;EAAO;CAAQ;AAC1B;AAGA,SAAgB2J,EAAW,GAAmB;CAC5C,IAAIC,IAAI;CACR,KAAK,IAAI5J,IAAIc,GAAGd,IAAI,GAAG,IAAI,KAAK,OAAOA,IAAI,KAAK,EAAE,GAAG,IAAI,OAAO,aAAa,MAAOA,IAAI,KAAK,EAAG,IAAI4J;CACpG,OAAOA;AACT;AAEA,SAAgBZ,GAAU,EAAE,aAA+B;CACzD,IAAM,IAAItJ,EAAQ,GACZ,CAACY,GAAGuJ,KAAQ1I,EAAS,CAAC,GACtB2I,IAAQC,EAAO,KAAK,IAAIzJ,GAAGyJ,EAAO,SAAS,CAAC;CAClD,IAAI,CAACD,GAAO,OAAO,kBAAC,OAAD;EAAK,WAAU;EAAW,UAAA,EAAE,mBAAmB;CAAO,CAAA;CACzE,IAAME,IAAQ,KAAK,IAAI,GAAG,GAAGF,EAAM,MAAM,KAAK,MAAMzD,EAAE,MAAM,CAAC,GACvD4D,IAAO,MAAM,KAAK,EAAE,QAAQD,EAAM,IAAI,GAAG,MAAML,EAAW3J,IAAI,CAAC,CAAC,GAChE,EAAE,UAAO,eAAYsJ,GAAWQ,EAAM,MAAM,GAC5CI,IAAWJ,EAAM,OAAOA,EAAM,MAAM,QACpCK,IAAWL,EAAM,OAAOE;CAC9B,OACE,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACGD,EAAO,SAAS,KACf,kBAACxK,GAAD;IAAM,OAAO,EAAE,mBAAmB;IAAG,OAAOwK,EAAO,KAAK,GAAG,OAAO;KAAE,KAAK,OAAOK,CAAC;KAAG,OAAOR,EAAE;IAAK,EAAE;IAAG,OAAO,OAAOtJ,CAAC;IACpH,WAAW,MAAMuJ,EAAK,OAAOO,CAAC,CAAC;GAAI,CAAA;GAEvC,kBAAC,OAAD;IAAK,WAAU;IACb,UAAA,kBAAC,SAAD,EAAA,UAAA,CACE,kBAAC,SAAD,EAAA,UAAO,kBAAC,MAAD,EAAA,UAAA,CAAI,kBAAC,MAAD,CAAK,CAAA,GAAEH,EAAK,KAAK,MAAM,kBAAC,MAAD,EAAA,UAAajK,EAAM,GAAVA,CAAU,CAAC,CAAM,EAAA,CAAA,EAAQ,CAAA,GACpE,kBAAC,SAAD,EAAA,UACG8J,EAAM,MAAM,KAAK,GAAK,MACrB,kBAAC,MAAD,EAAA,UAAA,CACE,kBAAC,MAAD,EAAA,UAAKzD,IAAI,EAAM,CAAA,GACdhG,EAAI,KAAK,GAAM,MAAM;KACpB,IAAImJ,EAAQ,IAAI,GAAGnD,EAAE,GAAGrG,GAAG,GAAG,OAAO;KACrC,IAAM,CAACqK,GAAMC,KAAUf,EAAM,IAAI,GAAGlD,EAAE,GAAGrG,GAAG,KAAK,CAAC,GAAG,CAAC,GAChDuK,IAAUF,IAAO,IAAIA,IAAO,KAAA,GAC5BG,IAAUF,IAAS,IAAIA,IAAS,KAAA;KACtC,OAAO5F,EAAK,IACR,kBAAC,MAAD;MAAqB;MAAkB;MAAS,WAAU;MAAc,OAAO,EAAE,wBAAwB;MAAI,UAAAA,EAAK;KAAM,GAA/G1E,CAA+G,IACxH,kBAAC,MAAD;MAAqB;MAAkB;MAAS,WAAW0E,EAAK,KAAK,OAAmB,KAAA,IAAZ;MAAwB,UAAAA,EAAK,KAAK;KAAO,GAA5G1E,CAA4G;IAC3H,CAAC,CACC,EAAA,GAXKqG,CAWL,CACL,EACI,CAAA,CACF,EAAA,CAAA;GACJ,CAAA;IACH6D,KAAYC,MACZ,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACG,EAAE,mBAAmB;KAAE,OAAOL,EAAM,MAAM;KAAQ,OAAOA,EAAM;IAAK,CAAC,GACrEK,KAAY,kBAAApL,GAAA,EAAA,UAAA,CAAE,KAAE,EAAE,mBAAmB;KAAE,OAAOiL;KAAO,OAAOF,EAAM;IAAK,CAAC,CAAI,EAAA,CAAA,CAC1E;;EAEJ;;AAET;;;ACjgBA,SAAgBW,GAAS,GAAa,GAA0B;CAC9D,OAAO,IAAI,KAAK,eAAe9J,EAAWwC,CAAQ,GAAG;EAAE,MAAM;EAAW,QAAQ;CAAU,CAAC,CAAC,CAAC,OAAO,IAAI,KAAKuH,CAAG,CAAC;AACnH;AAGA,SAAgBC,GAAa,GAAmB,GAA2B;CACzE,OAAO1J,KAAQ2J,EAAM,UAAU,IAAIA,IAAQA,EAAM,MAAM,EAAE;AAC3D;AAGA,IAAMC,IAAO;CACX,MAAM;EAAE,MAAM;EAAS,KAAK;CAAK;CACjC,OAAO;EAAE,MAAM;EAAS,KAAK;CAAK;CAClC,SAAS;EAAE,MAAM;EAAS,KAAK;CAAM;AACvC;AAGA,SAAgBC,GAAY,EAAE,MAAG,SAAM,YAAS,mBAAgB,gBAAa,uBAM1E;CACD,IAAM,EAAE,MAAG,YAAS9J,EAAerB,CAAQ,GACrC,CAACsB,GAAMC,KAAWC,EAAS,EAAK;CACtC,IAAI+C,EAAE,SAAS,QAAQ,OAAO,kBAAC,OAAD;EAAK,WAAU;EAAW,UAAAA,EAAE;CAAU,CAAA;CACpE,IAAIA,EAAE,SAAS,WAAWA,EAAE,OAAO,OAAO,kBAAC6G,IAAD,EAAiB,KAAI,CAAA;CAC/D,IAAMC,IAAO9G,EAAE,QAAQ,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GAAsB,kBAAC7E,GAAD;IAAM,MAAM6E,EAAE,KAAK;IAAM,MAAM;GAAK,CAAA;GAAC;GAAEA,EAAE,KAAK;GAAK;GAAIuG,GAASvG,EAAE,WAAWzC,EAAK,QAAQ;EAAO;KACxIwJ,IAAO/G,EAAE,eAAeA,EAAE,YAAY,SAAS,KACnD,kBAAC+B,GAAD;EAAgB,OAAO/B,EAAE;EAAa,MAAMgH;EAAgB,QAAQ,CAAC,CAACxD;EAAa,QAAQyD;CAAmB,CAAA;CAEhH,IAAIjH,EAAE,SAAS,QACb,OACE,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACG8G;GACA9G,EAAE;GACFA,EAAE,QAAQ,kBAAC,OAAD;IAAK,WAAU;IAAO,UAAAA,EAAE;GAAU,CAAA;GAC5C+G;GACA/G,EAAE,QACD,kBAAC,OAAD;IAAK,WAAW,YAAYA,EAAE,KAAK,UAAU,WAAW,OAAO;IAAM,MAAK;IACvE,UAAAA,EAAE,KAAK,UAAU,WACd,kBAAAlF,GAAA,EAAA,UAAA,CAAE,kBAACK,GAAD;KAAM,MAAK;KAAQ,MAAM;IAAK,CAAA,GAAEa,EAAE,oBAAoB,EAAE,OAAOgE,EAAE,KAAK,SAAS,CAAC,CAAI,EAAA,CAAA,IACtF,kBAAAlF,GAAA,EAAA,UAAA,CAAE,kBAAC,QAAD;KAAM,WAAU;KAAO,eAAY;IAAQ,CAAA,GAAEkB,EAAE,oBAAoB,CAAI,EAAA,CAAA;GAC1E,CAAA;EAEJ;;CAGT,IAAIgE,EAAE,YAAY,UAAU,OAAO,kBAACkH,IAAD;EAAe;EAAS;EAAY;CAAO,CAAA;CAC9E,IAAMR,IAAQ1G,EAAE,SAAS,CAAC,GACpBmH,KAAWnH,EAAE,WAAW,eAAeA,EAAE,WAAW,cAAc,CAACA,EAAE,QAAQ,CAACA,EAAE;CACtF,OACE,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACG8G;GACAJ,EAAM,SAAS,KACd,kBAAC,UAAD;IAAQ,WAAU;IAAa,eAAe1J,GAAS,MAAM,CAACQ,CAAC;IAAG,iBAAeT;IAC9E,UAAAA,IAAOf,EAAE,gBAAgB,IAAIA,EAAE,kBAAkB,EAAE,OAAO0K,EAAM,SAAS,EAAE,CAAC;GACvE,CAAA;GAETD,GAAaC,GAAO3J,CAAI,CAAC,CAAC,KAAK,MAC9B,kBAAC,OAAD;IAAgB,WAAU;IAAO,OAAO2I,EAAE;IAA1C,UAAA,CACE,kBAACvK,GAAD;KAAM,MAAMwL,EAAKjB,EAAE,OAAO,CAAC;KAAM,MAAM;KAAI,WAAWiB,EAAKjB,EAAE,OAAO,CAAC;IAAM,CAAA,GAC3E,kBAAC,QAAD;KAAM,WAAU;KAAM,UAAAA,EAAE;IAAW,CAAA,CAChC;GAHK,GAAAA,EAAE,EAGP,CACN;GACAyB,KAAW,kBAAC,OAAD;IAAK,WAAU;IAAM,UAAA,kBAAC,QAAD;KAAM,WAAU;KAAS,cAAYnL,EAAE,aAAa;KAApD,UAAA;MAAuD,kBAAC,KAAD,CAAI,CAAA;MAAC,kBAAC,KAAD,CAAI,CAAA;MAAC,kBAAC,KAAD,CAAI,CAAA;KAAO;;GAAM,CAAA;GAClHgE,EAAE,YAAYA,EAAE,QAAQ,kBAAC,OAAD;IAAK,WAAU;IAAM,OAAOA,EAAE;IAAM,UAAA,kBAACzE,GAAD,EAAU,MAAMyE,EAAE,KAAO,CAAA;GAAM,CAAA;GAC3F+G;GACA/G,EAAE,SACD,kBAAC,OAAD;IAAK,WAAW,SAASA,EAAE,MAAM,YAAY,WAAW;IAAM,MAAK;IAAQ,OAAO,EAAE,WAAW,EAAE;IAAjG,UAAA,CACE,kBAAC,QAAD,EAAA,UAAOA,EAAE,MAAM,KAAW,CAAA,GACzBoH,KACC,kBAAC,OAAD;KAAK,WAAU;KACb,UAAA,kBAAC,UAAD;MAAQ,WAAU;MAAS,UAAUvJ;MAAM,SAASuJ;MAApD,UAAA,CAA6D,kBAACjM,GAAD;OAAM,MAAK;OAAU,MAAM;MAAK,CAAA,GAAEa,EAAE,YAAY,CAAU;;IACpH,CAAA,CAEJ;;EAEJ;;AAET;AAGA,IAAaqL,KAAe;AAI5B,SAASH,GAAW,EAAE,MAAG,SAAM,WAA8D;CAC3F,IAAM,EAAE,SAAMpK,EAAerB,CAAQ,GAC/B,CAACsB,GAAMC,KAAWC,EAAS,EAAK,GAChCqK,IAAO,CAACtH,EAAE,WAAWA,EAAE,KAAK,MAAM,IAAI,CAAC,CAAC,SAAA;CAC9C,OACE,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACG8G;GACA9G,EAAE,WACD,kBAAC,OAAD;IAAK,WAAW,MAAMsH,KAAQ,CAACvK,IAAO,YAAY;IAAlD,UAAA,CACE,kBAACxB,GAAD,EAAU,MAAMyE,EAAE,KAAO,CAAA,GACxBsH,KACC,kBAAC,UAAD;KAAQ,MAAK;KAAS,WAAU;KAAU,iBAAevK;KAAM,eAAeC,GAAS,MAAM,CAACQ,CAAC;KAC5F,UAAAxB,EAAEe,IAAO,qBAAqB,kBAAkB;IAC3C,CAAA,CAEP;;GAENgK;EACE;;AAET;AAIA,SAASF,GAAa,EAAE,QAAyB;CAC/C,IAAM,EAAE,MAAG,YAAS/J,EAAerB,CAAQ,GACrC,CAACsB,GAAMC,KAAWC,EAAS,EAAK,GAChCsK,IAAKvH,EAAE;CACb,OACE,kBAAC,OAAD;EAAK,WAAU;EAAf,UAAA,CACE,kBAAC,OAAD;GAAK,WAAU;GAAS,MAAK;GAC3B,UAAA,kBAAC,QAAD;IAAM,WAAU;IAAhB,UAAA;KACE,kBAAC7E,GAAD;MAAM,MAAMoM,EAAG;MAAM,MAAM;KAAK,CAAA;KAC/BA,EAAG;KAAK;KAAIhB,GAASvG,EAAE,WAAWzC,EAAK,QAAQ;KAC/CgK,EAAG,WACF,kBAAC,UAAD;MAAQ,MAAK;MAAS,WAAU;MAAU,iBAAexK;MAAM,eAAeC,GAAS,MAAM,CAACQ,CAAC;MAA/F,UAAA;OACGxB,EAAE,oBAAoB;OAAE;OAAEe,IAAO,MAAM;MAClC;;IAEN;;EACH,CAAA,GACJA,KAAQwK,EAAG,WAAW,kBAAC,OAAD;GAAK,WAAU;GAAa,UAAAA,EAAG;EAAa,CAAA,CAChE;;AAET;;;ACjIA,eAAsBC,GAAW,GAAiB,GAAgD,GAA0C;CAC1I,EAAG,KAAK,EAAI;CACZ,IAAI;CACJ,IAAI;EACF,IAAI,MAAMC,EAAUC,CAAS;CAC/B,SAASpL,GAAG;EAEV,AADAqL,EAAG,KAAK,EAAK,GACbA,EAAG,OAAOrL,aAAa,SAASA,EAAE,UAAUA,EAAE,UAAU,KAAA,SAAiB,KAAKkL,GAAWE,GAAWD,GAAWE,CAAE,CAAC;EAClH;CACF;CAEA,AADAA,EAAG,KAAK,EAAK,GACT,MAAM,SACL,IACAA,EAAG,KAAK,CAAC,IADNA,EAAG,MAAM;AAEnB;;;ACvBA,SAAgBC,GAAY,IAAa,KAAK,GAAsB;CAClE,IAAMC,IAAY,OAAO,SAAW,OAAe,mBAAmB,UAAU,CAAC,CAAC,UAAU,cAAc,cACpG,CAACH,GAAWI,KAAgB7K,EAAS,EAAK,GAC1C,CAAC8K,GAASC,KAAc/K,EAAS,CAAC,GAClC,CAACK,GAAO2K,KAAYhL,EAAS,CAAC,GAC9B,CAACiL,GAAOC,KAAYlL,EAAS,EAAK,GAClCmL,IAAM5F,EAA6B,IAAI,GACvC6F,IAAS7F,EAAe,CAAC,CAAC,GAC1BiC,IAAQjC,EAA2B,KAAA,CAAS,GAC5C8F,IAAQ9F,EAA4B,IAAI,GACxC+F,IAAU/F,EAA0C,IAAI,GACxDgG,IAAUhG,EAAO,EAAK,GACtBiG,IAAQjG,EAAOkG,CAAO;CAC5B,QAAgB;EACd,EAAM,UAAUA;CAClB,CAAC;CAED,IAAMC,IAAUC,QAAkB;EAOhC,AANA,OAAO,cAAcnE,EAAM,OAAO,GAClC2D,EAAI,SAAS,OAAO,UAAU,CAAC,CAAC,SAAS,MAAOS,EAAG,KAAK,CAAC,GACzD,EAAI,UAAU,MACdP,EAAW,SAAS,MAAM,CAAC,CAAC,YAAY,KAAA,CAAS,GACjD,EAAM,UAAU,MAChBR,EAAa,EAAK,GAClBG,EAAS,CAAC;CACZ,GAAG,CAAC,CAAC,GAECa,IAAQF,EAAY,YAAY;EACpC,IAAKf,KAAa,GAAI,SACtB;KAAS,EAAK;GACd,IAAI;IACF,IAAMkB,IAAS,MAAM,UAAU,aAAa,aAAa,EAAE,OAAO,GAAK,CAAC,GAClE5G,IAAI,IAAI,cAAc4G,CAAM;IAIlC,AAHA,EAAO,UAAU,CAAC,GAClB,EAAQ,UAAU,IAClB,EAAE,mBAAmB,MAAM,EAAE,KAAK,OAAO,KAAKV,EAAO,QAAQ,KAAK,EAAE,IAAI,GACxE,EAAE,eAAe;KACf,IAAMlH,IAAO,CAACqH,EAAQ,WAAWH,EAAO,QAAQ,SAAS,IAAI,KAAKA,EAAO,SAAS,EAAE,MAAMlG,EAAE,YAAY,aAAa,CAAC,IAAI;KAG1H,AAFAwG,EAAQ,GACRJ,EAAQ,UAAUpH,CAAI,GACtB,EAAQ,UAAU;IACpB;IACA,IAAI6H,IAAgC;IACpC,IAAI;KACF,IAAMC,IAAM,OAAO,gBAAiB,OAAmE;KACvG,AAAIA,MACF,EAAM,UAAU,IAAIA,EAAI,GACxB,IAAWX,EAAM,QAAQ,eAAe,GACxC,EAAS,UAAU,KACnBA,EAAM,QAAQ,wBAAwBS,CAAM,CAAC,CAAC,QAAQC,CAAQ;IAElE,QAAQ;KACN,IAAW;IACb;IACA,IAAME,IAAUF,IAAW,IAAI,WAAWA,EAAS,OAAO,IAAI;IAI9D,AAHA,EAAI,UAAU7G,GACdA,EAAE,MAAM,GACR6F,EAAW,CAAC,GACZF,EAAa,EAAI;IACjB,IAAMqB,IAAQ,KAAK,IAAI,GACnBC,IAAU;IACd,EAAM,UAAU,OAAO,kBAAkB;KACvC,IAAM1D,IAAI,KAAK,OAAO,KAAK,IAAI,IAAIyD,KAAS,GAAI;KAEhD,IADAnB,EAAWtC,CAAC,GACRsD,KAAYE,GAAS;MACvB,EAAS,sBAAsBA,CAAO;MACtC,IAAIG,IAAO;MACX,KAAK,IAAM7L,KAAK0L,GAAS,IAAO,KAAK,IAAIG,GAAM,KAAK,IAAI7L,IAAI,GAAG,CAAC;MAChE,EAAS,KAAK,IAAI,GAAG6L,IAAO,EAAE,CAAC;KACjC;KACA,AAAI3D,KAAK4D,KAAc,CAACF,MACtB,IAAU,IACVX,EAAM,UAAU;IAEpB,GAAG,GAAG;GACR,QAAQ;IAEN,AADAN,EAAS,EAAI,GACbQ,EAAQ;GACV;EAjDc;CAkDhB,GAAG;EAACd;EAAWc;EAASW;CAAU,CAAC,GAE7BC,IAAOX,QAAkB,IAAI,SAAsB,MAAY;EACnE,IAAMzG,IAAIiG,EAAI;EACd,IAAI,CAACjG,KAAKA,EAAE,UAAU,YAAY,OAAOqH,EAAQ,IAAI;EAErD,AADA,EAAQ,UAAUA,GAClBrH,EAAE,KAAK;CACT,CAAC,GAAG,CAAC,CAAC,GAGAsH,IAASb,QAAkB;EAE/B,AADA,EAAQ,UAAU,IAClBW,EAAU;CACZ,GAAG,CAACA,CAAI,CAAC;CAIT,OAFA1I,cAAsB8H,EAAQ,GAAG,CAACA,CAAO,CAAC,GAEnC;EAAE;EAAW;EAAW;EAAS;EAAO;EAAO;EAAO;EAAM;CAAO;AAC5E;AAGA,SAAgBe,GAAM,GAAyB;CAC7C,OAAO,GAAG,KAAK,MAAM3B,IAAU,EAAE,EAAE,GAAG,OAAOA,IAAU,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;AAC5E;;;AC3FA,SAAgB4B,GAAK,GAAkB;CACrC,IAAM3N,IAAIR,EAAQ,GACZoO,IAAQ1O,EAAS,GACjB,CAACoE,GAAMuK,KAAW5M,EAAS,EAAE,GAC7B,CAAC6M,GAASC,KAAc9M,EAAuB,CAAC,CAAC,GACjD,CAAC+M,GAAWC,KAAgBhN,EAAS,EAAK,GAC1C,CAACiN,GAAOC,KAAYlN,EAAwB,IAAI,GAChD,CAACZ,GAAQ+N,KAAanN,EAAS,CAAC,GAChC,CAACoN,GAAeC,KAAoBrN,EAAS,EAAK,GAClD,CAACsN,GAASC,KAAcvN,EAAwB,IAAI,GACpD,CAACwN,GAAaC,KAAkBzN,EAAS,EAAK,GAG9C,CAAC0N,IAASC,KAAc3N,EAAgC,IAAI,GAC5D4N,IAAuCC,GAAgBC,EAAM,cAAc,GAE3EvH,IAA6CsH,GAAgBC,EAAM,WAAW,GAC9EC,IAAQxI,EAAO,EAAK,GACpByI,IAAUzI,EAAuB,IAAI,GACrC0I,IAAU1I,EAAyB,IAAI,GACvC2I,IAAW3I,EAA4B,IAAI,GAC3C8G,IAAayB,EAAM,mBAAmB,KACtCK,IAAWxD,GAAY0B,SAAkB,KAAK+B,EAAkB,CAAC,GACjE,EAAE,aAAU,UAAO,OAAUN,GAE7BO,KAAczN,KAAQ0N,EAAS,MAAM,MAAMvL,EAAE,WAAW,aAAaA,EAAE,WAAW,WAAW,GAC7FwL,IAAkBT,EAAM;CAC9B,QAAgBS,IAAkB1B,CAAO,GAAG,CAACA,GAAS0B,CAAe,CAAC;CAEtE,IAAMC,IAAQF,EAAS,EAAE,EAAE,IACrBG,IAAOH,EAASA,EAAS,SAAS,IAClCI,IAAOD,GAAM,IACbE,KAAWF,GAAM,KAAK,QACtBG,KAAYH,GAAM,OAAO,QAGzBI,IAAatJ,EAA0D,EAAE,QAAQ,EAAE,CAAC;CAE1F,QAAsB;EACpB,IAAMhD,IAAKyL,EAAQ;EACnB,IAAI,CAACzL,GAAI;EACT,IAAMuM,IAAMD,EAAW;EAKvB,AADA,EAAG,YADeC,EAAI,UAAU,KAAA,KAAaN,MAAUM,EAAI,SAASJ,MAASI,EAAI,OACtDvM,EAAG,aAAaA,EAAG,eAAeuM,EAAI,UAAUvM,EAAG,cAC9E,EAAW,UAAU;GAAE;GAAO;GAAM,QAAQA,EAAG;EAAa;CAE9D,GAAG;EAAC+L,EAAS;EAAQE;EAAOE;EAAMC;EAAUC;CAAS,CAAC;CAGtD,IAAMjQ,IAAQmP,EAAM,YAAY,CAACb,KAAS5K,EAAK,WAAW,GAAG,KAAK,CAAC,KAAK,KAAKA,CAAI,IAAIA,EAAK,MAAM,CAAC,IAAI,MAC/FrD,IAAQL,MAAU,OAAoD,CAAC,IAA9CF,EAAcqP,EAAM,YAAY,CAAC,GAAGnP,CAAK,GAClEoQ,IAAcpQ,MAAU,QAAQ,CAACyO,GAEjC4B,WAAc;EAKlB,AAJApC,EAAQ,EAAE,GACVE,EAAW,CAAC,CAAC,GACbI,EAAS,IAAI,GACbK,EAAW,IAAI,GACf,EAAM,UAAU;CAClB,GAEM0B,KAAa,OAAO,GAAc,MAAiB;EACvD,IAAKnB,EAAM,WACX,IAAI;GAEF,AADA,MAAMA,EAAM,UAAUtM,GAAM0N,CAAI,GAChCF,GAAM;EACR,QAAQ,CAER;CACF,GAEMG,IAAO,OAAO,GAAc,IAAS,OAAU;EACnD,IAAMC,IAAMvK,EAAK,KAAK;EACtB,IAAK,GAACuK,KAAOvC,EAAQ,WAAW,KAAK,CAACI,KAAUrM,KAAQkN,EAAM,WAE9D;OAAI,CAACuB,KAAU,CAACpC,KAASa,EAAM,YAAYsB,EAAI,WAAW,GAAG,GAAG;IAC9D,IAAM,CAACE,GAAM,GAAGJ,KAAQE,EAAI,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,GAC1CG,IAAMzB,EAAM,SAAS,MAAM,MAAMjP,EAAE,SAAS,aAAaA,EAAE,SAASyQ,CAAI;IAC9E,IAAIC,GAAK,OAAON,GAAWM,EAAI,MAAML,EAAK,KAAK,GAAG,CAAC;IACnD,IAAII,KAAQ,CAACF,EAAI,SAAS,IAAI,GAAG;KAC/B,EAAW,MAAME,CAAI;KACrB;IACF;GACF;GACA,IAAI;IAEF,AADA,MAAMxB,EAAM,OAAOsB,GAAKvC,EAAQ,KAAK,MAAM2C,EAAE,EAAE,GAAGzB,EAAM,SAASd,KAAS,KAAA,CAAS,GACnF+B,GAAM;GACR,QAAQ,CAER;EANA;CAOF,GAEMS,MAAQ,MAAmB;EAU/B,AATAtC,EAAU,CAAC,GACPtO,EAAE,SAAS,WACbqO,EAASrO,EAAE,IAAI,GACf+N,EAAQ,EAAE,KACD/N,EAAE,YACX+N,EAAQ,MAAM/N,EAAE,OAAO,GAAG,IAE1BoQ,GAAgBpQ,EAAE,MAAM,EAAE,GAE5BqP,EAAS,SAAS,MAAM;CAC1B,GAEMwB,MAAQ,MAA0C;EACtD,IAAIX,KAAe/P,EAAM,SAAS,GAAG;GACnC,IAAI,EAAE,QAAQ,eAAe,EAAE,QAAQ,WAAW;IAChD,EAAE,eAAe;IACjB,IAAM2Q,IAAI,EAAE,QAAQ,cAAc,IAAI;IACtC,GAAW,OAAOpO,IAAIoO,IAAI3Q,EAAM,UAAUA,EAAM,MAAM;IACtD;GACF;GACA,IAAK,EAAE,QAAQ,WAAW,CAAC,EAAE,YAAa,EAAE,QAAQ,OAAO;IAEzD,AADA,EAAE,eAAe,GACjByQ,GAAKzQ,EAAM,KAAK,IAAII,GAAQJ,EAAM,SAAS,CAAC,EAAE;IAC9C;GACF;EACF;EACA,AAAI+P,KAAe,EAAE,QAAQ,YAC3B,EAAE,eAAe,GACjB1B,EAAiB,EAAI,KAGnB,EAAE,QAAQ,eAAeJ,KAAS5K,MAAS,KAC7C6K,EAAS,IAAI,IAIX,EAAE,QAAQ,WAAW,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,eAAe,CAAC0C,GAAc,MACnF,EAAE,eAAe,GACjBT,EAAU9M,CAAI;CAElB;CAKA,AADAwN,QAAsBC,GAAY9B,EAAQ,eAAe+B,GAAS7B,EAAS,OAAO,CAAC,GAAG,CAAC7L,CAAI,CAAC,GAC5FuB,QAAgB;EACd,IAAMrB,IAAK2L,EAAS;EACpB,IAAI,CAAC3L,KAAM,OAAO,iBAAmB,KAAa;EAClD,IAAIsG,IAAQtG,EAAG,aACTsD,IAAK,IAAI,qBAAqB;GAClC,AAAItD,EAAG,gBAAgBsG,MACrB,IAAQtG,EAAG,aACXuN,GAAY9B,EAAQ,eAAe+B,GAASxN,CAAE,CAAC;EAEnD,CAAC;EAED,OADAsD,EAAG,QAAQtD,CAAE,SACAsD,EAAG,WAAW;CAC7B,GAAG,CAACsI,EAAS,SAAS,CAAC;CAEvB,IAAM6B,KAAS,OAAO,MAA2B;EAC/C,IAAKC,GAAO,UAAWnC,EAAM,UAC7B;KAAa,EAAI;GACjB,KAAK,IAAM0B,KAAK,MAAM,KAAKS,CAAK,GAAG;IACjC,IAAInC,EAAM,UAAU0B,EAAE,OAAO1B,EAAM,OAAO,UAAU;KAClD,EAAM;MAAE,MAAM;MAAS,OAAO/O,EAAE,eAAe;MAAG,MAAMyQ,EAAE;KAAK,CAAC;KAChE;IACF;IACA,IAAMjO,IAAI,MAAMuM,EAAM,SAAS0B,CAAC,CAAC,CAAC,YAAY,IAAI;IAClD,AAAIjO,KAAGuL,GAAY,MAAM,CAAC,GAAGoD,GAAG3O,CAAC,CAAC;GACpC;GAEA,AADAyL,EAAa,EAAK,GACdiB,EAAQ,YAAS,EAAQ,QAAQ,QAAQ;EAV5B;CAWnB;CAGA,eAAeG,IAAoB;EACjC,IAAMlK,IAAO,MAAMiK,EAAS,KAAK;EACjC,AAAKjK,KAAS4J,EAAM,gBACpB,MAAMvD,GAAWrG,GAAM4J,EAAM,cAAc;GACzC,MAAML;GACN,aAAad,EAAM;IAAE,MAAM;IAAS,OAAO5N,EAAE,0BAA0B;GAAE,CAAC;GAE1E,SAAS,GAAQ,MAAU4N,EAAM;IAAE,MAAM;IAAS,OAAOwD,KAAUpR,EAAE,mBAAmB;IAAG,SAAS,CAAC;KAAE,OAAOA,EAAE,kBAAkB;KAAG,SAAS;KAAM,SAASqR;IAAM,CAAC;GAAE,CAAC;GACvK,OAAO,MAAM;IAGX,AAFA,EAAM,UAAU,IAChBxD,GAAS,MAAOsD,EAAE,KAAK,IAAIA,EAAE,QAAQ,IAAI,MAAMhL,IAAIA,CAAE,GACrDgJ,EAAS,SAAS,MAAM;GAC1B;EACF,CAAC;CACH;CAEA,IAAMmC,MAAY,MAAqB;EACrC,AAAI,EAAE,QAAQ,YAAYlC,EAAS,cACjC,EAAE,eAAe,GACjBA,EAAS,OAAO;CAEpB,GAEMmC,KAAcrD,IAAQlO,EAAE,uBAAuB,IAAK+O,EAAM,eAAe/O,EAAE,oBAAoB,EAAE,MAAM+O,EAAM,UAAU,CAAC,GACxHyC,KAAOlE,IAAa8B,EAAS;CACnC,OACE,kBAAC,WAAD;EAAS,WAAU;EAAU,cAAYpP,EAAE,YAAY;EAAvD,UAAA;GACG+O,EAAM;GACP,kBAAC,OAAD;IAAK,WAAU;IAAO,KAAKE;IAAS,aAAU;IAA9C,UAAA;KACGF,EAAM,YAAYA,EAAM,eACvB,kBAAC,UAAD;MAAQ,WAAU;MAAe,OAAO,EAAE,WAAW,SAAS;MAAG,UAAUA,EAAM;MAAc,SAASA,EAAM;MAC3G,UAAA/O,EAAE,gBAAgB;KACb,CAAA;KAET+O,EAAM,gBAAgB,kBAAC,OAAD;MAAK,WAAU;MAAY,UAAAA,EAAM;KAAkB,CAAA;KACzEQ,EAAS,WAAW,KAAK,CAACR,EAAM,WAAW,CAACA,EAAM,iBAAiBA,EAAM,SACxE,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OAAuB,kBAAC,OAAD;QAAK,WAAU;QAAK,UAAA,kBAAC5P,GAAD,EAAM,MAAK,QAAS,CAAA;OAAM,CAAA;OAAC,kBAAC,KAAD,EAAA,UAAIa,EAAE,mBAAmB,EAAE,MAAM+O,EAAM,UAAU,CAAC,EAAK,CAAA;OAAEA,EAAM;MAAe;;KAErJQ,EAAS,KAAK,MAAM,kBAAC3E,IAAD;MAA2B;MAAS;MAAM,SAASmE,EAAM,kBAAkBA,EAAM,UAAU/K,EAAE,EAAE;MAClH,gBAAgB6K;MAAuB;MAAa,kBAAkBD;KAAa,GAD9C5K,EAAE,EAC4C,CAAC;KACrF+K,EAAM,cAAcA,EAAM,iBAAiB,CAAC,EAAA,CAAG,KAAK,MACnD,kBAAC,OAAD;MAAK,WAAU;MAAqB,MAAK;MAAQ,cAAY/O,EAAE,oBAAoB;MAAnF,UAAA;OACE,kBAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CAAmB,kBAACb,GAAD;SAAM,MAAK;SAAQ,MAAM;QAAK,CAAA,GAAEa,EAAE,oBAAoB,CAAO;;OAChF,kBAAC,OAAD,EAAA,UAAMA,EAAE,qBAAqB,EAAE,QAAQF,EAAE,QAAQ,CAAC,EAAO,CAAA;OACxDA,EAAE,YAAY,KAAA,KAAa,kBAAC,OAAD,EAAA,UAAMA,EAAE,QAAa,CAAA;OACjD,kBAAC,OAAD;QAAK,WAAU;QAAf,UAAA,CAEE,kBAAC,UAAD;SAAQ,WAAU;SAAiB,eAAeiP,EAAM,YAAYjP,EAAE,IAAI,EAAI;SAAI,UAAAE,EAAE,sBAAsB;QAAU,CAAA,GACpH,kBAAC,UAAD;SAAQ,WAAU;SAAS,eAAe+O,EAAM,YAAYjP,EAAE,IAAI,EAAK;SAAI,UAAAE,EAAE,qBAAqB;QAAU,CAAA,CACzG;;MACF;KATyB,GAAAF,EAAE,EAS3B,CACN;IACE;;GAEJiP,EAAM,WACL,kBAAC,OAAD;IAAK,WAAU;IAAW,OAAO;KAAE,gBAAgB;KAAiB,YAAY;IAAS;IAAI,UAAAA,EAAM;GAAc,CAAA,IAEjH,kBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACGiB,KAAe,kBAACjQ,GAAD;MAAuB;MAAO,QAAQ,KAAK,IAAIM,GAAQ,KAAK,IAAIJ,EAAM,SAAS,GAAG,CAAC,CAAC;MAAG,QAAQyQ;MAAM,SAAStC;KAAY,CAAA;KACzIW,EAAM;KACNjB,EAAQ,SAAS,KAChB,kBAAC,OAAD;MAAK,WAAU;MACZ,UAAAA,EAAQ,KAAK,MACZ,kBAAC,QAAD;OAAiB,WAAU;OAA3B,UAAA;QACE,kBAAC3O,GAAD;SAAM,MAAK;SAAO,MAAM;QAAK,CAAA;QAAEsR,EAAE;QACjC,kBAAC,UAAD;SAAQ,WAAU;SAAU,OAAO;UAAE,OAAO;UAAI,QAAQ;SAAG;SAAG,cAAYzQ,EAAE,QAAQ;SAClF,eAAe+N,GAAY,MAAMoD,EAAE,QAAQ,MAAMM,EAAE,OAAOhB,EAAE,EAAE,CAAC;SAAG,UAAA,kBAACtR,GAAD;UAAM,MAAK;UAAI,MAAM;SAAK,CAAA;QAAS,CAAA;OACnG;MAJK,GAAAsR,EAAE,EAIP,CACP;KACE,CAAA;KAENlC,KACC,kBAAC,OAAD;MAAK,WAAU;MAAc,MAAK;MAAlC,UAAA,CACGvO,EAAE,uBAAuB,EAAE,MAAMuO,EAAQ,CAAC,GAC3C,kBAAC,UAAD;OAAQ,MAAK;OAAS,WAAU;OAAU,eAAe,KAAK6B,EAAK9M,GAAM,EAAI;OAAI,UAAAtD,EAAE,iBAAiB;MAAU,CAAA,CAC3G;;KAEP,kBAAC,OAAD;MAAK,WAAU;MAAf,UAAA;OACG+O,EAAM,YAAY,CAACK,EAAS,aAC3B,kBAAArQ,GAAA,EAAA,UAAA,CACE,kBAAC,UAAD;QAAQ,WAAU;QAAU,cAAYiB,EAAE,aAAa;QAAG,UAAUgO;QAAW,eAAekB,EAAQ,SAAS,MAAM;QAAG,UAAA,kBAAC/P,GAAD,EAAM,MAAK,OAAQ,CAAA;OAAS,CAAA,GACpJ,kBAAC,SAAD;QAAO,KAAK+P;QAAS,MAAK;QAAO,UAAA;QAAS,QAAA;QAAO,QAAQH,EAAM,QAAQ;QAAQ,WAAW,MAAMkC,GAAO,EAAE,OAAO,KAAK;OAAI,CAAA,CACzH,EAAA,CAAA;OAEH7B,EAAS,YACR,kBAAC,OAAD;QAAK,WAAW,SAASoC,MAAQ,KAAK,YAAY;QAAM,MAAK;QAAS,cAAYxR,EAAE,yBAAyB;QAA7G,UAAA;SACE,kBAAC,QAAD;UAAM,WAAU;UAAM,eAAY;SAAQ,CAAA;SAC1C,kBAAC,QAAD;UAAM,WAAU;UAAhB,UAAA;WAAsB0N,GAAM0B,EAAS,OAAO;WAAE;WAAI1B,GAAMJ,CAAU;UAAQ;;SAC1E,kBAAC,QAAD;UAAM,WAAU;UAAM,eAAY;UAAO,UAAA,kBAAC,KAAD,EAAG,OAAO,EAAE,WAAW,UAAU,KAAK,IAAI,KAAM8B,EAAS,KAAK,EAAE,GAAG,EAAI,CAAA;SAAO,CAAA;SACvH,kBAAC,UAAD;UAAQ,MAAK;UAAS,WAAU;UAAe,SAASA,EAAS;UAAS,UAAApP,EAAE,QAAQ;SAAU,CAAA;SAC9F,kBAAC,UAAD;UAAQ,MAAK;UAAS,WAAU;UAAiB,WAAWsR;UAAU,eAAe,KAAKjC,EAAkB;UAAI,UAAArP,EAAE,iBAAiB;SAAU,CAAA;QAC1I;OAEL,CAAA,IAAA,kBAAC,OAAD;QAAK,WAAW,QAAQkO,IAAQ,gBAAgB,KAAKO,IAAc,iBAAiB;QAAM,aAAWA,KAAe,KAAA;QAApH,UAAA,CACGP,KACC,kBAAC,QAAD;SAAM,WAAU;SAAhB,UAAA;UACE,kBAAC/O,GAAD;WAAM,MAAK;WAAQ,MAAM;UAAK,CAAA;UAAE+O;UAChC,kBAAC,UAAD;WAAQ,WAAU;WAAU,OAAO;YAAE,OAAO;YAAI,QAAQ;WAAG;WAAG,cAAYlO,EAAE,QAAQ;WAAG,eAAemO,EAAS,IAAI;WAAG,UAAA,kBAAChP,GAAD;YAAM,MAAK;YAAI,MAAM;WAAK,CAAA;UAAS,CAAA;SACrJ;QAER,CAAA,GAAA,kBAAC,YAAD;SAAU,KAAKgQ;SAAU,MAAM;SAAG,OAAO7L;SAAM,aAAamL,IAAczO,EAAE,wBAAwB,IAAIuR;SAAa,cAAYA;SAC/H,UAAU9C;SAAa,iBAAeuB;SAAa,qBAAmBjB,EAAM,WAAW,SAAS,KAAA;SAChG,WAAW,MAAM;UAAkE,AAAhElB,EAAQ,EAAE,OAAO,KAAK,GAAGS,EAAiB,EAAK,GAAGF,EAAU,CAAC,GAAGI,EAAW,IAAI;SAAG;SACrG,WAAWmC;QAAO,CAAA,CACjB;;OAEN5B,EAAM,WAAW,CAACK,EAAS,aAAa,kBAACvO,GAAD;QAAc,SAASkO,EAAM;QAAS,WAAWA,EAAM;QAAW,SAASA,EAAM;QAAS,MAAMO;OAAc,CAAA;OACtJP,EAAM,gBAAgB,CAACK,EAAS,aAC/B,kBAACsC,IAAD;QAAa,WAAWtC,EAAS;QAAwB;QAAa,eAAe,KAAKA,EAAS,MAAM;OAAI,CAAA;OAE9G,CAACA,EAAS,cAAcL,EAAM,YAAYlN,IACzC,kBAAC,UAAD;QAAQ,WAAU;QAAe,cAAY7B,EAAE,WAAW;QAAG,SAAS+O,EAAM;QAAU,UAAA,kBAAC5P,GAAD,EAAM,MAAK,OAAQ,CAAA;OAAS,CAAA,IAElH,kBAAC,UAAD;QAAQ,WAAU;QAAe,cAAYa,EAAE,WAAW;QAAG,UAAW,CAACsD,EAAK,KAAK,KAAKwK,EAAQ,WAAW,KAAK,CAACI,KAAUrM,KAAQ4M;QAAa,eAAe2B,EAAK9M,CAAI;QACtK,UAAA,kBAACnE,GAAD,EAAM,MAAK,OAAQ,CAAA;OACb,CAAA;MAEP;;KACJiQ,EAAS,SAAS,kBAAC,OAAD;MAAK,WAAU;MAAW,OAAO,EAAE,SAAS,aAAa;MAAI,UAAApP,EAAE,sBAAsB;KAAO,CAAA;IAC5G;;GAEN2O,MAAWE,KAAY,kBAACtH,IAAD;IAAmB,GAAGoH;IAAS,MAAME;IAAuB;IAAa,eAAeD,EAAW,IAAI;GAAI,CAAA;EAC5H;;AAEb;AAIA,SAAgB8C,GAAY,EAAE,cAAW,gBAAa,cAA8E;CAClI,IAAM1R,IAAIR,EAAQ;CAQlB,OAPIiP,IAEA,kBAAC,QAAD;EAAM,WAAU;EAAY,MAAK;EAAS,cAAYzO,EAAE,wBAAwB;EAAG,OAAOA,EAAE,wBAAwB;EAApH,UAAA;GACE,kBAAC,KAAD,CAAI,CAAA;GAAC,kBAAC,KAAD,CAAI,CAAA;GAAC,kBAAC,KAAD,CAAI,CAAA;GAAC,kBAAC,KAAD,CAAI,CAAA;GAAC,kBAAC,KAAD,CAAI,CAAA;EACpB;MAIR,kBAAC,UAAD;EAAQ,WAAU;EAAU,UAAU,CAAC6L;EACrC,cAAY7L,EAAE,kBAAkB;EAAG,OAAmBA,EAAZ6L,IAAc,qBAAwB,wBAAwB;EACxG,SAAS8F;EACT,UAAA,kBAACxS,GAAD,EAAM,MAAK,MAAO,CAAA;CACZ,CAAA;AAEZ;AAGA,SAAS0R,KAAyB;CAChC,OAAO,OAAO,SAAW,OAAe,CAAC,CAAC,OAAO,aAAa,qCAAqC,CAAC,CAAC;AACvG;AAGA,IAAMe,MAAS,MAAsBC,EAAK,eAAeA,EAAK,YAAYA,EAAK,eAAe;AAI9F,SAASd,GAAY,GAA0B,GAAoB;CACjE,IAAMe,IAAS,CAAC,CAACD,KAAQD,GAAMC,CAAI;CAEnC,AADAE,EAAO,GACHF,KAAQC,MAAQ,EAAK,YAAYD,EAAK;AAC5C;AAGA,SAASb,GAAS,GAAgC;CAChD,IAAI,CAACxN,GAAI;CAGT,AADA,EAAG,MAAM,YAAY,UACrB,EAAG,MAAM,SAAS;CAClB,IAAMwO,IAAOxO,EAAG,eAAeA,EAAG,eAAeA,EAAG;CAGpD,AAFA,EAAG,MAAM,SAAS,GAAGwO,EAAK,KAE1B,EAAG,MAAM,YAAYxO,EAAG,eAAewO,IAAO,SAAS;AACzD;AAIA,SAASlD,GAAsB,GAA8E;CAC3G,IAAMmD,IAASzL,EAAOvB,CAAI;CAC1B,QAAgB;EACd,EAAO,UAAUA;CACnB,CAAC;CACD,IAAMiN,IAAM,CAAC,CAACjN;CACd,OAAO8B,QAAcmL,KAChB,MAASD,EAAO,UAAUA,EAAO,QAAQzP,CAAC,IAAI,QAAQ,OAAO,gBAAI,MAAM,WAAW,CAAC,IACpF,KAAA,GAAW,CAAC0P,CAAG,CAAC;AACtB;;;ACzWA,SAAgBC,GAAiB,EAAE,kBAAe,cAAW,SAAM,WAAQ,YAAS,eAAmC;CACrH,IAAMnS,IAAIR,EAAQ,GACZ,CAAC4S,GAAUC,KAAepR,EAAS,EAAK;CAC9C,QAAgB;EACd,IAAI,CAACF,GAAM;EACX,IAAMuR,KAAS,MAAqB,EAAE,QAAQ,YAAYpK,EAAQ;EAElE,OADA,SAAS,iBAAiB,WAAWoK,CAAK,SAC7B,SAAS,oBAAoB,WAAWA,CAAK;CAC5D,GAAG,CAACvR,GAAMmH,CAAO,CAAC;CAElB,IAAMqK,KAAQ,MACZ,kBAAC,UAAD;EAAmB,WAAW,KAAKzS,EAAE,OAAO0S,IAAY,QAAQ,KAAK1S,EAAE,UAAU,YAAY,UAAU;EACrG,eAAeS,EAAOT,EAAE,EAAE;EAAG,gBAAcA,EAAE,OAAO0S;EADtD,UAAA;GAEE,kBAACrT,GAAD;IAAM,MAAMW,EAAE,QAAQ;IAAQ,MAAM;GAAK,CAAA;GACzC,kBAAC,QAAD;IAAM,WAAU;IAAM,UAAAA,EAAE;GAAY,CAAA;GACnC,CAAC,CAACA,EAAE,UAAU,kBAAC,QAAD;IAAM,WAAU;IAAS,cAAYE,EAAE,eAAe,EAAE,OAAOF,EAAE,OAAO,CAAC;IAAI,UAAAA,EAAE;GAAa,CAAA;GAC3G,kBAAC,QAAD;IAAM,WAAU;IAAO,UAAAA,EAAE;GAAW,CAAA;EAC9B;CANK,GAAAA,EAAE,EAMP,GAEJ2S,KAAW,MAAiCC,EAAc,QAAQ,MAAM5S,EAAE,UAAU6S,CAAC,GACrFC,IAASH,EAAQ,OAAO,GACxBI,IAAUJ,EAAQ,SAAS;CACjC,OACE,kBAAAzT,GAAA,EAAA,UAAA;EACE,kBAAC,OAAD;GAAK,WAAW,UAAU+B,IAAO,UAAU;GAAM,cAAYf,EAAE,oBAAoB;GAAnF,UAAA;IACG8S,KACC,kBAAC,UAAD;KAAQ,WAAU;KAAS,OAAO;MAAE,OAAO;MAAQ,gBAAgB;KAAS;KAAG,eAAeT,EAAY,EAAI;KAA9G,UAAA,CACE,kBAAClT,GAAD;MAAM,MAAK;MAAO,MAAM;KAAK,CAAA,GAAEa,EAAE,eAAe,CAC1C;;IAEV,kBAAC,OAAD;KAAK,WAAU;KAAK,UAAAA,EAAE,mBAAmB;IAAO,CAAA;IAC/CyS,EAAQ,MAAM,CAAC,CAAC,IAAIF,CAAI;IACzB,kBAAC,OAAD;KAAK,WAAU;KAAK,UAAAvS,EAAE,aAAa;IAAO,CAAA;IACzC4S,EAAO,WAAW,KAAK,kBAAC,OAAD;KAAK,WAAU;KAAc,OAAO,EAAE,SAAS,SAAS;KAAI,UAAA5S,EAAE,eAAe;IAAO,CAAA;IAC3G4S,EAAO,IAAIL,CAAI;IACfM,EAAQ,SAAS,KAAK,kBAAC,OAAD;KAAK,WAAU;KAAK,UAAA7S,EAAE,cAAc;IAAO,CAAA;IACjE6S,EAAQ,IAAIN,CAAI;GACd;;EAEJxR,KAAQ,kBAAC,UAAD;GAAQ,MAAK;GAAS,WAAU;GAAW,cAAYf,EAAE,OAAO;GAAG,SAASkI;EAAU,CAAA;EAC9FkK,KAAYU,KAAY,kBAACC,IAAD;GAAe,eAAeV,EAAY,EAAK;GAAa;EAAW,CAAA;CAChG,EAAA,CAAA;AAEN;AAKA,SAAgBW,GAAW,EAAE,WAAQ,eAAuD;CAC1F,OAAO,kBAAC,OAAD;EAAK,WAAW,SAASC,IAAS,YAAY;EAAO;CAAc,CAAA;AAC5E;AAGA,SAAgBF,GAAc,EAAE,YAAS,eAAiF;CACxH,IAAM/S,IAAIR,EAAQ,GACZ,CAAC0T,GAAOC,KAAYlS,EAAS,EAAE,GAC/B,CAAC6M,GAASC,KAAc9M,EAAS,EAAK,GACtC,CAACiL,GAAOC,KAAYlL,EAAwB,IAAI,GAChDmS,IAAS,YAAY;EACzB,IAAKF,EAAM,KAAK,KAAK,IACrB;GACA,AADAnF,EAAW,EAAI,GACf5B,EAAS,IAAI;GACb,IAAI;IAEF,AADA,MAAM2G,EAASI,EAAM,KAAK,CAAC,GAC3BhL,EAAQ;GACV,SAAS,GAAG;IAEV,AADAiE,EAAS,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,GACnD4B,EAAW,EAAK;GAClB;EARe;CASjB;CACA,OACE,kBAAC3O,GAAD;EAAO,OAAOY,EAAE,eAAe;EAAY;EAAS,QAAQ,kBAAAhB,GAAA,EAAA,UAAA,CAC1D,kBAAC,UAAD;GAAQ,WAAU;GAAY,SAASkJ;GAAU,UAAAlI,EAAE,QAAQ;EAAU,CAAA,GACrE,kBAAC,UAAD;GAAQ,WAAU;GAAc,UAAU,CAACkT,EAAM,KAAK,KAAKpF;GAAS,SAASsF;GAAS,UAAApT,EAAE,QAAQ;EAAU,CAAA,CAC1G,EAAA,CAAA;EAHF,UAAA,CAIE,kBAAC,OAAD;GAAK,WAAU;GAAf,UAAA;IACE,kBAAC,SAAD;KAAO,SAAQ;KAAe,UAAAA,EAAE,iBAAiB;IAAS,CAAA;IAC1D,kBAAC,SAAD;KAAO,IAAG;KAAc,WAAU;KAAM,OAAOkT;KAAO,WAAW;KAAK,WAAW,MAAMC,EAAS,EAAE,OAAO,KAAK;KAC5G,YAAY,MAAM,EAAE,QAAQ,WAAWC,EAAO;IAAI,CAAA;IACpD,kBAAC,OAAD;KAAK,WAAU;KAAQ,UAAApT,EAAE,gBAAgB;IAAO,CAAA;GAC7C;EACJ,CAAA,GAAAkM,KAAS,kBAAC,OAAD;GAAK,WAAU;GAAY,UAAAA;EAAW,CAAA,CAC3C;;AAEX;;;AChEA,SAAgBmH,GAAY,EAAE,SAAM,UAAO,UAAO,aAAU,UAAO,aAAU,cAE1E;CACD,OACE,kBAAC,UAAD;EAAQ,MAAK;EAAS,WAAW,WAAWC,IAAQ,OAAO;EAAgB;EAAU,cAAYtR;EAAO,iBAAeuR;EAAiB;EAEtI,cAAc,MAAMA,KAAY,EAAE,gBAAgB;EAAY;EAC9D,UAAA,kBAACpU,GAAD;GAAM,MAAM4C;GAAM,MAAMuR,IAAQ,KAAK;EAAK,CAAA;CACpC,CAAA;AAEZ;AAKA,SAAgBE,GAAU,EAAE,UAAO,SAAM,YAAS,UAAO,iBAAc,SAAM,WAAQ,WAAQ,aAAU,WAAQ,cAgB5G;CACD,IAAMxT,IAAIR,EAAQ,GACZ,CAACiU,GAAOC,KAAYzS,EAASwB,CAAI,GACjCvB,IAAM5B,EAA2B,IAAM4I,CAAO;CAKpD,OACE,kBAAC,OAAD;EAAK,WAAW,YAAY+K,IAAS,YAAY;EAAW;EAAK,MAAK;EAAS,cAAYjR;EAA3F,UAAA;GACE,kBAAC,OAAD;IAAK,WAAU;IAAO,UAAAhC,EAAE,WAAW;GAAO,CAAA;GAC1C,kBAAC,SAAD;IAAO,WAAU;IAAM,OAAOyT;IAAO,WAAW;IAAI,WAAA;IAAU,cAAYzT,EAAE,WAAW;IACrF,WAAW,MAAM0T,EAAS,EAAE,OAAO,KAAK;IAAG,cAR9B;KACjB,IAAMC,IAAOF,EAAM,KAAK;KACxB,AAAIE,KAAQA,MAASlR,KAAMmR,EAASD,CAAI;IAC1C;IAMM,YAAY,MAAM,EAAE,QAAQ,WAAY,EAAE,OAA4B,KAAK;GAAI,CAAA;GACjF,kBAAC,OAAD;IAAK,WAAU;IAAM,OAAO,EAAE,WAAW,GAAG;IAAI,UAAAE;GAAkB,CAAA;GAClE,kBAAC,OAAD;IAAK,WAAU;IACZ,UAAAC,EAAQ,KAAK,MACZ,kBAAC,UAAD;KAAoB,MAAK;KAAS,WAAW,cAAcC,MAAUC,EAAE,MAAM,QAAQ;KAAM,gBAAcD,MAAUC,EAAE;KAAK,eAAezT,EAAOyT,EAAE,GAAG;KAArJ,UAAA,CACE,kBAAC,QAAD;MAAM,WAAU;MAAK,UAAA,kBAAC7U,GAAD;OAAM,MAAM6U,EAAE;OAAM,MAAM;MAAK,CAAA;KAAO,CAAA,GAC1DA,EAAE,KACG;IAHK,GAAAA,EAAE,GAGP,CACT;GACE,CAAA;GACJC,KACC,kBAAAhV,GAAA,EAAA,UAAA;IACE,kBAAC,OAAD;KAAK,WAAU;KAAM,OAAO,EAAE,WAAW,GAAG;KAAI,UAAAgV,EAAO;IAAW,CAAA;IACjEA,EAAO,QAAQ,WAAW,KAAK,kBAAC,OAAD;KAAK,WAAU;KAAQ,UAAAA,EAAO;IAAW,CAAA;IACzE,kBAAC,OAAD;KAAK,WAAU;KAAc,MAAK;KAC/B,UAAAA,EAAO,QAAQ,KAAK,MAAM;MACzB,IAAMC,IAASD,EAAO,QAAQ,WAAW,GACnCtI,IAAKuI,KAAUD,EAAO,UAAUjQ,EAAE;MACxC,OACE,kBAAC,UAAD;OAAoB,MAAK;OAAS,MAAK;OAAQ,gBAAc2H;OAAI,UAAUuI;OAAQ,WAAW,aAAavI,IAAK,QAAQ;OACtH,eAAe,CAACA,KAAMsI,EAAO,OAAOjQ,EAAE,GAAG;OAD3C,UAAA,CAEG,CAACkQ,KAAU,kBAAC,QAAD;QAAM,WAAW,QAAQvI,IAAK,QAAQ;QAAM,eAAY;OAAQ,CAAA,GAC5E,kBAAC,QAAD;QAAM,WAAU;QAAhB,UAAA;SACE,kBAAC,QAAD;UAAM,WAAU;UAAM,UAAA3H,EAAE;SAAY,CAAA;SACnCA,EAAE,OAAO,kBAAC,QAAD;UAAM,WAAU;UAAO,UAAAA,EAAE;SAAU,CAAA;SAC5CA,EAAE,UAAUA,EAAE,OAAO,SAAS,KAC7B,kBAAC,QAAD;UAAM,WAAU;UACb,UAAAA,EAAE,OAAO,KAAK,MAAM,kBAAC,QAAD;WAAmB,WAAU;WAA7B,UAAA,CAAoCmQ,EAAE,QAAQ,kBAAChV,GAAD;YAAM,MAAMgV,EAAE;YAAM,MAAM;WAAK,CAAA,GAAGA,EAAE,IAAW;UAAlF,GAAAA,EAAE,IAAgF,CAAC;SAC/G,CAAA;SAEPxI,KAAM3H,EAAE,QAAQ,kBAAC,QAAD;UAAM,WAAU;UAAQ,UAAAA,EAAE;SAAW,CAAA;QAClD;OACA,CAAA,CAAA;MAbK,GAAAA,EAAE,GAaP;KAEZ,CAAC;IACE,CAAA;GACL,EAAA,CAAA;GAEHoQ,KAAQ,kBAAC,OAAD;IAAK,WAAU;IAAO,OAAO,EAAE,WAAW,GAAG;IAAI,UAAAA;GAAU,CAAA;EACjE;;AAET;;;ACjFA,IAAaC,KAAiB,MAAkD,GAAGrQ,EAAE,aAAa,GAAGA,EAAE;AAKvG,SAAgBsQ,GAAkB,GAAc,GAAa,GAAoE;CAC/H,IAAMC,KAAU,MAAkB;EAChC,GAAIvQ,EAAE,KAAK,QAAQ,CAAC;GAAE,MAAM;GAAkB,MAAMhE,EAAE,gBAAgB;EAAE,CAAC,IAAI,CAAC;EAC9E,GAAIgE,EAAE,KAAK,YAAY,CAAC;GAAE,MAAM;GAAkB,MAAMhE,EAAE,oBAAoB;EAAE,CAAC,IAAI,CAAC;EACtF,GAAIgE,EAAE,KAAK,gBAAgB,IAAI,CAAC,EAAE,MAAMrD,EAAOqD,EAAE,KAAK,eAAetD,CAAG,EAAE,CAAC,IAAI,CAAC;CAClF,GAEM8T,KAAQ,MACZxQ,EAAE,KAAK,gBAAgB,KAAK0F,EAAE,gBAAgB,KAAM1F,EAAE,KAAK,gBAAgBhE,EAAE,wBAAwB,IAAI,KAAA,GACrGyU,IAAS/K,EAAE,UAAU,SAAS,GAC9BuK,IAA6BvK,EAAE,UAAU,KAAK,OAAO;EACzD,KAAK2K,EAAcrQ,CAAC;EAAG,OAAOA,EAAE;EAAM,KAAKA,EAAE;EAAY,QAAQuQ,EAAOvQ,CAAC;EAAG,MAAMyQ,IAASD,EAAKxQ,CAAC,IAAI,KAAA;CACvG,EAAE;CAKF,OAAO;EAAE,SAJ2ByQ,IAChC,CAAC;GAAE,KAAK;GAAI,OAAOzU,EAAE,oBAAoB;GAAG,KAAK0J,EAAE,cAAc,QAAQ;GAAK,MAAMA,EAAE,eAAe8K,EAAK9K,EAAE,YAAY,IAAI,KAAA;EAAU,GAAG,GAAGuK,CAAM,IAClJA;EAEc,OADJvK,EAAE,UAAUA,EAAE,QAAQ2K,EAAc3K,EAAE,KAAK,IAAI+K,IAAS,KAAM/K,EAAE,QAAQ2K,EAAc3K,EAAE,KAAK,IAAI;CACvF;AAC1B;AAQA,SAAgBgL,GAAkB,EAAE,SAAM,UAAO,YAAS,WAAQ,SAAM,aAAU,WAAQ,YAAS,cAWhG;CACD,IAAM1U,IAAIR,EAAQ,GACZ,EAAE,YAASsB,EAAe,GAC1B6T,IAAQV,KAAUW,IAAUN,GAAkBtU,GAAGuB,EAAK,UAAU0S,CAAM,IAAI;CAOhF,OACE,kBAACT,IAAD;EAAW,OAAOxT,EAAE,YAAY;EAAS;EAAa;EAAO,cAAcA,EAAE,eAAe;EAAG,MAAMoU,KAAQpU,EAAE,kBAAkB;EACtH;EACT,QAAQ2U,IAAQ;GAAE,OAAO3U,EAAE,aAAa;GAAG,SAAS2U,EAAM;GAAS,OAAOA,EAAM;GAAO,SATxE,MAAgB;IACjC,IAAI,CAACV,KAAU,CAACW,GAAS;IACzB,IAAI,CAACC,GAAK,OAAOD,EAAQ,IAAI;IAC7B,IAAM5Q,IAAIiQ,EAAO,UAAU,MAAM,MAAMI,EAAclD,CAAC,MAAM0D,CAAG;IAC/D,AAAI7Q,KAAG4Q,EAAQ;KAAE,cAAc5Q,EAAE;KAAc,OAAOA,EAAE;IAAM,CAAC;GACjE;GAI8G,OAAOhE,EAAE,gBAAgB;EAAE,IAAI,KAAA;EAC/H;EAAkB;EAAiB;CAAU,CAAA;AAE7D"}