@yadsh/dsh-qa-surface 0.1.1 → 0.3.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.
Files changed (192) hide show
  1. package/CHANGELOG.md +151 -0
  2. package/README.md +239 -16
  3. package/SPEC-dsh-qa-surface.md +600 -96
  4. package/capability-policy.json +5 -0
  5. package/compatibility.json +18 -4
  6. package/cordis.patch.yml +11 -0
  7. package/docs/ARCHITECTURE.md +50 -8
  8. package/docs/COMPATIBILITY.md +5 -4
  9. package/docs/CONFIGURATION.md +184 -3
  10. package/docs/SOURCES-MIGRATION.md +28 -0
  11. package/docs/SOURCES-PROVENANCE-AUDIT.md +88 -0
  12. package/docs/SPEC-dsh-qa-surface-accounts.md +219 -0
  13. package/docs/SPEC-dsh-qa-surface-sources-provenance.md +1692 -0
  14. package/lib/accounts/index.js +2 -0
  15. package/lib/accounts/index.js.map +1 -0
  16. package/lib/accounts/store.js +478 -0
  17. package/lib/accounts/store.js.map +1 -0
  18. package/lib/attestation.js +10 -0
  19. package/lib/attestation.js.map +1 -0
  20. package/lib/cli.js +143 -0
  21. package/lib/cli.js.map +1 -0
  22. package/lib/client/QaAccountsController.js +329 -0
  23. package/lib/client/QaAccountsController.js.map +1 -0
  24. package/lib/client/QaConfigController.js +111 -4
  25. package/lib/client/QaConfigController.js.map +1 -1
  26. package/lib/client/QaSessionController.js +621 -163
  27. package/lib/client/QaSessionController.js.map +1 -1
  28. package/lib/client/QaSurface.js +303 -24
  29. package/lib/client/QaSurface.js.map +1 -1
  30. package/lib/client/QaTranscriptAdapter.js +324 -49
  31. package/lib/client/QaTranscriptAdapter.js.map +1 -1
  32. package/lib/client/attestation.js +66 -0
  33. package/lib/client/attestation.js.map +1 -0
  34. package/lib/client/chat-index.js +86 -0
  35. package/lib/client/chat-index.js.map +1 -0
  36. package/lib/client/components/Markdown.js +124 -13
  37. package/lib/client/components/Markdown.js.map +1 -1
  38. package/lib/client/components/QaAgentsDrawer.js +40 -0
  39. package/lib/client/components/QaAgentsDrawer.js.map +1 -0
  40. package/lib/client/components/QaAuthGate.js +40 -0
  41. package/lib/client/components/QaAuthGate.js.map +1 -0
  42. package/lib/client/components/QaChangelog.js +112 -0
  43. package/lib/client/components/QaChangelog.js.map +1 -0
  44. package/lib/client/components/QaComposer.js +132 -15
  45. package/lib/client/components/QaComposer.js.map +1 -1
  46. package/lib/client/components/QaMessage.js +214 -10
  47. package/lib/client/components/QaMessage.js.map +1 -1
  48. package/lib/client/components/QaSidebar.js +167 -0
  49. package/lib/client/components/QaSidebar.js.map +1 -0
  50. package/lib/client/components/QaSourcesDrawer.js +127 -0
  51. package/lib/client/components/QaSourcesDrawer.js.map +1 -0
  52. package/lib/client/components/QaTurnRail.js +281 -0
  53. package/lib/client/components/QaTurnRail.js.map +1 -0
  54. package/lib/client/components/QaWelcomeNotice.js +125 -0
  55. package/lib/client/components/QaWelcomeNotice.js.map +1 -0
  56. package/lib/client/components/QaWidthHandle.js +142 -0
  57. package/lib/client/components/QaWidthHandle.js.map +1 -0
  58. package/lib/client/components/QaWorkGroup.js +135 -0
  59. package/lib/client/components/QaWorkGroup.js.map +1 -0
  60. package/lib/client/components/VariantSwitcher.js +29 -0
  61. package/lib/client/components/VariantSwitcher.js.map +1 -0
  62. package/lib/client/components/format.js +48 -0
  63. package/lib/client/components/format.js.map +1 -0
  64. package/lib/client/components/source-refs.js +78 -0
  65. package/lib/client/components/source-refs.js.map +1 -0
  66. package/lib/client/create-session.js +51 -0
  67. package/lib/client/create-session.js.map +1 -0
  68. package/lib/client/index.js +166 -35
  69. package/lib/client/index.js.map +1 -1
  70. package/lib/client/project-session-state.js +78 -0
  71. package/lib/client/project-session-state.js.map +1 -0
  72. package/lib/client/session-admission.js +38 -0
  73. package/lib/client/session-admission.js.map +1 -0
  74. package/lib/client/session-assets.js +52 -0
  75. package/lib/client/session-assets.js.map +1 -0
  76. package/lib/client/session-sources.js +61 -0
  77. package/lib/client/session-sources.js.map +1 -0
  78. package/lib/client/settlement.js +24 -0
  79. package/lib/client/settlement.js.map +1 -0
  80. package/lib/client/styles.js +450 -43
  81. package/lib/client/styles.js.map +1 -1
  82. package/lib/client/tool-presentation.js +102 -0
  83. package/lib/client/tool-presentation.js.map +1 -0
  84. package/lib/client/turn-sources.js +98 -0
  85. package/lib/client/turn-sources.js.map +1 -0
  86. package/lib/client/types.js +15 -0
  87. package/lib/client/types.js.map +1 -0
  88. package/lib/client/use-session-ui-state.js +68 -0
  89. package/lib/client/use-session-ui-state.js.map +1 -0
  90. package/lib/client/use-transcript-view.js +44 -0
  91. package/lib/client/use-transcript-view.js.map +1 -0
  92. package/lib/client/wait-for.js +49 -0
  93. package/lib/client/wait-for.js.map +1 -0
  94. package/lib/client.js +12551 -918
  95. package/lib/client.js.map +1 -1
  96. package/lib/config.js +226 -58
  97. package/lib/config.js.map +1 -1
  98. package/lib/entry-redirect.js +44 -0
  99. package/lib/entry-redirect.js.map +1 -0
  100. package/lib/host-route.js +25 -1
  101. package/lib/host-route.js.map +1 -1
  102. package/lib/index.js +354 -72
  103. package/lib/index.js.map +1 -1
  104. package/lib/launch-token.js +42 -0
  105. package/lib/launch-token.js.map +1 -0
  106. package/lib/lockdown-policy.js +20 -0
  107. package/lib/lockdown-policy.js.map +1 -0
  108. package/lib/provenance/collector.js +40 -0
  109. package/lib/provenance/collector.js.map +1 -0
  110. package/lib/provenance/connectors.js +147 -0
  111. package/lib/provenance/connectors.js.map +1 -0
  112. package/lib/provenance/dedupe.js +89 -0
  113. package/lib/provenance/dedupe.js.map +1 -0
  114. package/lib/provenance/extractors.js +340 -0
  115. package/lib/provenance/extractors.js.map +1 -0
  116. package/lib/provenance/file-preview.js +39 -0
  117. package/lib/provenance/file-preview.js.map +1 -0
  118. package/lib/provenance/host-store.js +387 -0
  119. package/lib/provenance/host-store.js.map +1 -0
  120. package/lib/provenance/index.js +9 -0
  121. package/lib/provenance/index.js.map +1 -0
  122. package/lib/provenance/normalize.js +128 -0
  123. package/lib/provenance/normalize.js.map +1 -0
  124. package/lib/provenance/reported.js +53 -0
  125. package/lib/provenance/reported.js.map +1 -0
  126. package/lib/provenance/types.js +2 -0
  127. package/lib/provenance/types.js.map +1 -0
  128. package/lib/resolve-config.js +283 -10
  129. package/lib/resolve-config.js.map +1 -1
  130. package/lib/secure-session.js +212 -0
  131. package/lib/secure-session.js.map +1 -0
  132. package/lib/typert.host.d.ts +3 -0
  133. package/lib/typert.host.js +784 -0
  134. package/lib/typert.remote-client.d.ts +40 -0
  135. package/lib/typert.remote-client.js +597 -0
  136. package/lib/types/accounts/index.d.ts +2 -0
  137. package/lib/types/accounts/store.d.ts +121 -0
  138. package/lib/types/attestation.d.ts +17 -0
  139. package/lib/types/cli.d.ts +9 -0
  140. package/lib/types/client/QaAccountsController.d.ts +95 -0
  141. package/lib/types/client/QaConfigController.d.ts +35 -3
  142. package/lib/types/client/QaSessionController.d.ts +146 -20
  143. package/lib/types/client/QaSurface.d.ts +11 -5
  144. package/lib/types/client/QaTranscriptAdapter.d.ts +13 -3
  145. package/lib/types/client/attestation.d.ts +25 -0
  146. package/lib/types/client/chat-index.d.ts +28 -0
  147. package/lib/types/client/components/Markdown.d.ts +17 -3
  148. package/lib/types/client/components/QaAgentsDrawer.d.ts +25 -0
  149. package/lib/types/client/components/QaAuthGate.d.ts +15 -0
  150. package/lib/types/client/components/QaChangelog.d.ts +21 -0
  151. package/lib/types/client/components/QaComposer.d.ts +12 -2
  152. package/lib/types/client/components/QaMessage.d.ts +22 -2
  153. package/lib/types/client/components/QaSidebar.d.ts +69 -0
  154. package/lib/types/client/components/QaSourcesDrawer.d.ts +20 -0
  155. package/lib/types/client/components/QaTurnRail.d.ts +59 -0
  156. package/lib/types/client/components/QaWelcomeNotice.d.ts +27 -0
  157. package/lib/types/client/components/QaWidthHandle.d.ts +36 -0
  158. package/lib/types/client/components/QaWorkGroup.d.ts +19 -0
  159. package/lib/types/client/components/VariantSwitcher.d.ts +19 -0
  160. package/lib/types/client/components/format.d.ts +9 -0
  161. package/lib/types/client/components/source-refs.d.ts +16 -0
  162. package/lib/types/client/create-session.d.ts +16 -0
  163. package/lib/types/client/index.d.ts +2 -5
  164. package/lib/types/client/project-session-state.d.ts +30 -0
  165. package/lib/types/client/session-admission.d.ts +23 -0
  166. package/lib/types/client/session-assets.d.ts +20 -0
  167. package/lib/types/client/session-sources.d.ts +28 -0
  168. package/lib/types/client/settlement.d.ts +6 -0
  169. package/lib/types/client/tool-presentation.d.ts +6 -0
  170. package/lib/types/client/turn-sources.d.ts +14 -0
  171. package/lib/types/client/types.d.ts +93 -0
  172. package/lib/types/client/use-session-ui-state.d.ts +35 -0
  173. package/lib/types/client/use-transcript-view.d.ts +20 -0
  174. package/lib/types/client/wait-for.d.ts +11 -0
  175. package/lib/types/entry-redirect.d.ts +20 -0
  176. package/lib/types/host-route.d.ts +14 -1
  177. package/lib/types/index.d.ts +67 -7
  178. package/lib/types/launch-token.d.ts +21 -0
  179. package/lib/types/lockdown-policy.d.ts +18 -0
  180. package/lib/types/provenance/collector.d.ts +26 -0
  181. package/lib/types/provenance/connectors.d.ts +11 -0
  182. package/lib/types/provenance/dedupe.d.ts +6 -0
  183. package/lib/types/provenance/extractors.d.ts +14 -0
  184. package/lib/types/provenance/file-preview.d.ts +10 -0
  185. package/lib/types/provenance/host-store.d.ts +54 -0
  186. package/lib/types/provenance/index.d.ts +10 -0
  187. package/lib/types/provenance/normalize.d.ts +13 -0
  188. package/lib/types/provenance/reported.d.ts +5 -0
  189. package/lib/types/provenance/types.d.ts +78 -0
  190. package/lib/types/secure-session.d.ts +31 -0
  191. package/lib/types/types.d.ts +304 -1
  192. package/package.json +70 -27
@@ -1,33 +1,150 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useEffect, useRef, useState } from "react";
3
- export function QaComposer(props) {
2
+ import { memo, useEffect, useLayoutEffect, useRef, useState } from "react";
3
+ /** Raster formats the host attachment path accepts. */
4
+ const IMAGE_MEDIA_TYPES = [
5
+ "image/png",
6
+ "image/jpeg",
7
+ "image/webp",
8
+ "image/gif",
9
+ ];
10
+ /** Soft client-side caps; the Host stays authoritative at admission. */
11
+ const MAX_IMAGES = 8;
12
+ const MAX_FILE_BYTES = 15 * 1024 * 1024;
13
+ let imageDraftSequence = 0;
14
+ function bytesToBase64(bytes) {
15
+ let binary = "";
16
+ for (let index = 0; index < bytes.length; index += 0x8000) {
17
+ binary += String.fromCharCode(...bytes.subarray(index, index + 0x8000));
18
+ }
19
+ return btoa(binary);
20
+ }
21
+ /** FileReader covers runtimes without File.arrayBuffer (jsdom). */
22
+ function readAsArrayBuffer(file) {
23
+ if (typeof file.arrayBuffer === "function")
24
+ return file.arrayBuffer();
25
+ return new Promise((resolve, reject) => {
26
+ const reader = new FileReader();
27
+ reader.onload = () => resolve(reader.result);
28
+ reader.onerror = () => reject(reader.error ?? new Error("read failed"));
29
+ reader.readAsArrayBuffer(file);
30
+ });
31
+ }
32
+ async function fileToImageDraft(file) {
33
+ if (!IMAGE_MEDIA_TYPES.includes(file.type)) {
34
+ return "Поддерживаются изображения PNG, JPEG, WebP и GIF.";
35
+ }
36
+ if (file.size > MAX_FILE_BYTES) {
37
+ return "Изображение слишком большое (лимит 15 МБ).";
38
+ }
39
+ const data = bytesToBase64(new Uint8Array(await readAsArrayBuffer(file)));
40
+ imageDraftSequence += 1;
41
+ return {
42
+ id: `image-${imageDraftSequence}`,
43
+ mediaType: file.type,
44
+ name: file.name === "" ? "изображение" : file.name,
45
+ data,
46
+ previewUrl: URL.createObjectURL(file),
47
+ };
48
+ }
49
+ function ImagePickerIcon() {
50
+ return (_jsxs("svg", { viewBox: "0 0 18 18", "aria-hidden": "true", children: [_jsx("rect", { x: "2.5", y: "3.5", width: "13", height: "11", rx: "2" }), _jsx("circle", { cx: "6.4", cy: "7.4", r: "1.3" }), _jsx("path", { d: "m4 13 3.6-3.6 2 2L12.4 8l2.6 2.6" })] }));
51
+ }
52
+ /**
53
+ * Memoized with the default shallow compare: every prop is a scalar, a
54
+ * stable array or a stable callback, so a stream of transcript frames never
55
+ * re-renders the composer and typing stays responsive while an answer runs.
56
+ */
57
+ export const QaComposer = memo(function QaComposer(props) {
4
58
  const [draft, setDraft] = useState("");
5
59
  const [submitting, setSubmitting] = useState(false);
60
+ const [dragOver, setDragOver] = useState(false);
61
+ const [attachmentError, setAttachmentError] = useState(null);
6
62
  const textarea = useRef(null);
7
- const send = async () => {
8
- if (submitting || draft.trim() === "" || !props.canSend)
63
+ const fileInput = useRef(null);
64
+ const images = props.images;
65
+ const send = async (textOverride) => {
66
+ const text = textOverride ?? draft;
67
+ if (submitting || !props.canSend)
68
+ return;
69
+ if (text.trim() === "" && images.length === 0)
9
70
  return;
10
71
  setSubmitting(true);
11
72
  try {
12
- if (await props.onSend(draft))
13
- setDraft("");
73
+ if (await props.onSend(text, images)) {
74
+ if (textOverride === undefined)
75
+ setDraft("");
76
+ else
77
+ setDraft("");
78
+ props.onImagesChange([]);
79
+ }
14
80
  }
15
81
  finally {
16
82
  setSubmitting(false);
17
83
  textarea.current?.focus();
18
84
  }
19
85
  };
86
+ const addFiles = async (files) => {
87
+ const incoming = [...files];
88
+ if (incoming.length === 0)
89
+ return;
90
+ setAttachmentError(null);
91
+ const room = MAX_IMAGES - images.length;
92
+ if (room <= 0) {
93
+ setAttachmentError(`Не больше ${MAX_IMAGES} изображений на сообщение.`);
94
+ return;
95
+ }
96
+ const drafts = [];
97
+ let error = incoming.length > room
98
+ ? `Не больше ${MAX_IMAGES} изображений на сообщение.`
99
+ : null;
100
+ for (const file of incoming.slice(0, Math.max(0, room))) {
101
+ const draft = await fileToImageDraft(file);
102
+ if (typeof draft === "string")
103
+ error = draft;
104
+ else
105
+ drafts.push(draft);
106
+ }
107
+ if (drafts.length > 0)
108
+ props.onImagesChange([...images, ...drafts]);
109
+ setAttachmentError(error);
110
+ };
20
111
  useEffect(() => {
21
112
  if (!props.running)
22
113
  textarea.current?.focus();
23
114
  }, [props.running]);
24
- return (_jsxs("div", { className: "dsh-qa-composer", children: [_jsx("label", { className: "dsh-qa-sr-only", htmlFor: "dsh-qa-prompt", children: "Ask a question" }), _jsx("textarea", { ref: textarea, id: "dsh-qa-prompt", rows: 1, value: draft, placeholder: props.placeholder, disabled: !props.canSend && !props.running, onChange: (event) => setDraft(event.currentTarget.value), onKeyDown: (event) => {
25
- if (event.key === "Enter" &&
26
- !event.shiftKey &&
27
- !event.nativeEvent.isComposing) {
28
- event.preventDefault();
29
- void send();
30
- }
31
- } }), props.running && props.showStop ? (_jsx("button", { type: "button", className: "dsh-qa-button dsh-qa-button--stop", disabled: !props.canStop, onClick: () => void props.onStop(), children: "Stop" })) : (_jsx("button", { type: "button", className: "dsh-qa-button dsh-qa-button--send", disabled: !props.canSend || submitting || draft.trim() === "", onClick: () => void send(), children: "Send" }))] }));
32
- }
115
+ useLayoutEffect(() => {
116
+ const element = textarea.current;
117
+ if (element === null)
118
+ return;
119
+ element.style.height = "0px";
120
+ element.style.height = `${Math.min(element.scrollHeight, 168)}px`;
121
+ }, [draft]);
122
+ const hasContent = draft.trim() !== "" || images.length > 0;
123
+ return (_jsxs("div", { className: dragOver
124
+ ? "dsh-qa-composer-wrap dsh-qa-composer-wrap--drag"
125
+ : "dsh-qa-composer-wrap", onDragOver: (event) => {
126
+ event.preventDefault();
127
+ setDragOver(true);
128
+ }, onDragLeave: () => setDragOver(false), onDrop: (event) => {
129
+ event.preventDefault();
130
+ setDragOver(false);
131
+ void addFiles(event.dataTransfer.files);
132
+ }, children: [(props.quickQuestions?.length ?? 0) > 0 ? (_jsx("div", { className: "dsh-qa-quick-questions", "aria-label": "\u0411\u044B\u0441\u0442\u0440\u044B\u0435 \u0432\u043E\u043F\u0440\u043E\u0441\u044B", children: props.quickQuestions?.map((question) => (_jsx("button", { type: "button", disabled: !props.canSend || submitting, onClick: () => void send(question), children: question }, question))) })) : null, _jsxs("div", { className: "dsh-qa-composer", children: [images.length === 0 ? null : (_jsx("div", { className: "dsh-qa-composer__images", "aria-label": "\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u043B\u0451\u043D\u043D\u044B\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F", children: images.map((image) => (_jsxs("span", { className: "dsh-qa-composer__image", children: [_jsx("img", { src: image.previewUrl, alt: image.name }), _jsx("button", { type: "button", "aria-label": `Убрать ${image.name}`, title: "\u0423\u0431\u0440\u0430\u0442\u044C", onClick: () => props.onImagesChange(images.filter((candidate) => candidate.id !== image.id)), children: _jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", children: _jsx("path", { d: "m4 4 8 8m0-8-8 8" }) }) })] }, image.id))) })), attachmentError === null ? null : (_jsx("p", { className: "dsh-qa-composer__attachment-error", role: "alert", children: attachmentError })), _jsx("label", { className: "dsh-qa-sr-only", htmlFor: "dsh-qa-prompt", children: "\u0417\u0430\u0434\u0430\u0442\u044C \u0432\u043E\u043F\u0440\u043E\u0441" }), _jsx("textarea", { ref: textarea, id: "dsh-qa-prompt", rows: 1, value: draft, placeholder: props.placeholder, disabled: !props.canSend && !props.running, onChange: (event) => setDraft(event.currentTarget.value), onPaste: (event) => {
133
+ const files = event.clipboardData?.files;
134
+ if (files !== undefined && files.length > 0) {
135
+ event.preventDefault();
136
+ void addFiles(files);
137
+ }
138
+ }, onKeyDown: (event) => {
139
+ if (event.key === "Enter" &&
140
+ !event.shiftKey &&
141
+ !event.nativeEvent.isComposing) {
142
+ event.preventDefault();
143
+ void send();
144
+ }
145
+ } }), _jsxs("div", { className: "dsh-qa-composer__toolbar", children: [_jsx("input", { ref: fileInput, type: "file", accept: IMAGE_MEDIA_TYPES.join(","), multiple: true, className: "dsh-qa-sr-only", tabIndex: -1, "aria-hidden": "true", onChange: (event) => {
146
+ void addFiles(event.target.files ?? []);
147
+ event.target.value = "";
148
+ } }), _jsx("button", { type: "button", className: "dsh-qa-composer__attach", "aria-label": "\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u0438\u0442\u044C \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F", title: "\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u0438\u0442\u044C \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F", disabled: !props.canSend || images.length >= MAX_IMAGES, onClick: () => fileInput.current?.click(), children: _jsx(ImagePickerIcon, {}) }), _jsx("span", { className: "dsh-qa-composer__hint", "aria-live": "polite", children: props.status ?? "Enter: отправить, Shift+Enter: новая строка" }), props.running && props.showStop ? (_jsx("button", { type: "button", className: "dsh-qa-composer__action dsh-qa-composer__action--stop", "aria-label": "\u041E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C", title: "\u041E\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u044C", disabled: !props.canStop, onClick: () => void props.onStop(), children: _jsx("svg", { viewBox: "0 0 18 18", "aria-hidden": "true", children: _jsx("rect", { x: "5.25", y: "5.25", width: "7.5", height: "7.5", rx: "1.5" }) }) })) : (_jsx("button", { type: "button", className: "dsh-qa-composer__action dsh-qa-composer__action--send", "aria-label": "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C", title: "\u041E\u0442\u043F\u0440\u0430\u0432\u0438\u0442\u044C", disabled: !props.canSend || submitting || !hasContent, onClick: () => void send(), children: _jsx("svg", { viewBox: "0 0 18 18", "aria-hidden": "true", children: _jsx("path", { d: "M9 13.5v-9m0 0L5.5 8M9 4.5 12.5 8" }) }) }))] })] })] }));
149
+ });
33
150
  //# sourceMappingURL=QaComposer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"QaComposer.js","sourceRoot":"","sources":["../../../src/client/components/QaComposer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAYpD,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,MAAM,CAAsB,IAAI,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,IAAI,UAAU,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO;QAChE,aAAa,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC;YACH,IAAI,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;gBAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC9C,CAAC;gBAAS,CAAC;YACT,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAChD,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAEpB,OAAO,CACL,eAAK,SAAS,EAAC,iBAAiB,aAC9B,gBAAO,SAAS,EAAC,gBAAgB,EAAC,OAAO,EAAC,eAAe,+BAEjD,EACR,mBACE,GAAG,EAAE,QAAQ,EACb,EAAE,EAAC,eAAe,EAClB,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,KAAK,CAAC,WAAW,EAC9B,QAAQ,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAC1C,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,EACxD,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;oBACnB,IACE,KAAK,CAAC,GAAG,KAAK,OAAO;wBACrB,CAAC,KAAK,CAAC,QAAQ;wBACf,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,EAC9B,CAAC;wBACD,KAAK,CAAC,cAAc,EAAE,CAAC;wBACvB,KAAK,IAAI,EAAE,CAAC;oBACd,CAAC;gBACH,CAAC,GACD,EACD,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CACjC,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,mCAAmC,EAC7C,QAAQ,EAAE,CAAC,KAAK,CAAC,OAAO,EACxB,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,KAAK,CAAC,MAAM,EAAE,qBAG3B,CACV,CAAC,CAAC,CAAC,CACF,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,mCAAmC,EAC7C,QAAQ,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,UAAU,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAC7D,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,qBAGnB,CACV,IACG,CACP,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"QaComposer.js","sourceRoot":"","sources":["../../../src/client/components/QaComposer.tsx"],"names":[],"mappings":"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"}
@@ -1,14 +1,218 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo, useEffect, useRef, useState } from "react";
3
+ import { sameWorkItems } from "./QaWorkGroup.js";
4
+ import { buildSourceRefs } from "./source-refs.js";
5
+ function QaAttachedImage({ image, resolve, }) {
6
+ const [url, setUrl] = useState(null);
7
+ useEffect(() => {
8
+ let alive = true;
9
+ // Deduplication and revocation live in the controller's per-chat asset
10
+ // repository; this effect only projects one resolution.
11
+ resolve(image.attachmentId).then((resolved) => {
12
+ if (alive)
13
+ setUrl(resolved);
14
+ }, () => {
15
+ if (alive)
16
+ setUrl("");
17
+ });
18
+ return () => {
19
+ alive = false;
20
+ };
21
+ }, [image.attachmentId, resolve]);
22
+ if (url === null) {
23
+ return _jsx("span", { className: "dsh-qa-message__image", "data-state": "loading" });
24
+ }
25
+ if (url === "") {
26
+ return _jsx("span", { className: "dsh-qa-message__image", "data-state": "broken" });
27
+ }
28
+ return (_jsx("a", { href: url, target: "_blank", rel: "noreferrer", children: _jsx("img", { className: "dsh-qa-message__image", src: url, alt: "\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u043B\u0451\u043D\u043D\u043E\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435" }) }));
29
+ }
30
+ import { formatDayTime, formatSeconds } from "./format.js";
2
31
  import { Markdown } from "./Markdown.js";
3
- export function QaMessage({ message, renderMarkdown, showTimestamp, }) {
32
+ import { QaWorkGroup } from "./QaWorkGroup.js";
33
+ /**
34
+ * Whether two transcript messages render identically. The transcript
35
+ * projection rebuilds every message object on each published frame, so the
36
+ * memoized row compares rendered content instead of references; string
37
+ * comparison is by value, which keeps fresh copies cheap to recognize.
38
+ */
39
+ export function sameMessage(a, b) {
40
+ if (a === b)
41
+ return true;
42
+ if (a.id !== b.id || a.role !== b.role || a.status !== b.status)
43
+ return false;
44
+ if (a.role === "work" && b.role === "work") {
45
+ return (a.turn === b.turn &&
46
+ a.startedAt === b.startedAt &&
47
+ a.endedAt === b.endedAt &&
48
+ sameWorkItems(a.items, b.items));
49
+ }
50
+ if (a.role === "work" || b.role === "work")
51
+ return false;
52
+ // Roles are equal, so both messages are one of the text-bearing variants.
53
+ if (a.text !== b.text || a.timestamp !== b.timestamp)
54
+ return false;
55
+ if (a.role === "assistant" && b.role === "assistant") {
56
+ return (sameSources(a.sources, b.sources) &&
57
+ (a.stats === undefined) === (b.stats === undefined) &&
58
+ (a.stats === undefined ||
59
+ b.stats === undefined ||
60
+ (a.stats.durationMs === b.stats.durationMs &&
61
+ a.stats.ttftMs === b.stats.ttftMs &&
62
+ a.stats.tokensPerSecond === b.stats.tokensPerSecond)));
63
+ }
64
+ if (a.role === "user" && b.role === "user") {
65
+ return a.author === b.author && sameImages(a.images, b.images);
66
+ }
67
+ if (a.role === "system" && b.role === "system") {
68
+ return ((a.notice === undefined) === (b.notice === undefined) &&
69
+ (a.notice === undefined ||
70
+ b.notice === undefined ||
71
+ (a.notice.title === b.notice.title && a.notice.body === b.notice.body)));
72
+ }
73
+ return false;
74
+ }
75
+ function sameSources(a, b) {
76
+ if (a === b)
77
+ return true;
78
+ if (a === undefined || b === undefined || a.length !== b.length)
79
+ return false;
80
+ return a.every((source, index) => source.id === b[index]?.id &&
81
+ source.title === b[index]?.title &&
82
+ source.uri === b[index]?.uri &&
83
+ source.path === b[index]?.path &&
84
+ source.snippet === b[index]?.snippet &&
85
+ source.evidence === b[index]?.evidence &&
86
+ source.score === b[index]?.score &&
87
+ JSON.stringify(source.locations) ===
88
+ JSON.stringify(b[index]?.locations) &&
89
+ JSON.stringify(source.origins) === JSON.stringify(b[index]?.origins));
90
+ }
91
+ function sameImages(a, b) {
92
+ if (a === b)
93
+ return true;
94
+ if (a === undefined || b === undefined || a.length !== b.length)
95
+ return false;
96
+ return a.every((image, index) => image.attachmentId === b[index].attachmentId &&
97
+ image.mediaType === b[index].mediaType);
98
+ }
99
+ function readRatings(stateKey) {
100
+ if (stateKey === undefined)
101
+ return {};
102
+ try {
103
+ const raw = window.localStorage.getItem(`${stateKey}:ratings`);
104
+ if (raw === null)
105
+ return {};
106
+ const parsed = JSON.parse(raw);
107
+ return typeof parsed === "object" && parsed !== null
108
+ ? parsed
109
+ : {};
110
+ }
111
+ catch {
112
+ return {};
113
+ }
114
+ }
115
+ function writeRating(stateKey, id, rating) {
116
+ if (stateKey === undefined)
117
+ return;
118
+ try {
119
+ const ratings = readRatings(stateKey);
120
+ if (rating === null)
121
+ delete ratings[id];
122
+ else
123
+ ratings[id] = rating;
124
+ window.localStorage.setItem(`${stateKey}:ratings`, JSON.stringify(ratings));
125
+ }
126
+ catch {
127
+ // A denied localStorage write must not break the conversation.
128
+ }
129
+ }
130
+ function assistantMeta(message) {
131
+ const parts = [];
132
+ if (message.stats !== undefined) {
133
+ parts.push(formatSeconds(message.stats.durationMs));
134
+ if (message.stats.ttftMs !== null) {
135
+ parts.push(`TTFT ${formatSeconds(message.stats.ttftMs)}`);
136
+ }
137
+ if (message.stats.tokensPerSecond !== null) {
138
+ parts.push(`${message.stats.tokensPerSecond} ток/с`);
139
+ }
140
+ }
141
+ return parts;
142
+ }
143
+ export const QaMessage = memo(function QaMessage({ message, renderMarkdown, showTimestamp, stateKey, onRegenerate, resolveImage, onOpenSources, onSourceDetail, }) {
144
+ const [copied, setCopied] = useState(false);
145
+ const copiedTimer = useRef(undefined);
146
+ const [rating, setRating] = useState(null);
147
+ // Source-footnote registry, cached by the source-id set so the memoized
148
+ // Markdown keeps one resolver identity across streaming frames.
149
+ const refsCache = useRef({
150
+ ids: "",
151
+ refs: buildSourceRefs([]),
152
+ });
153
+ if (message.role === "assistant") {
154
+ const ids = message.sources?.map((source) => source.id).join("|") ?? "";
155
+ if (refsCache.current.ids !== ids) {
156
+ refsCache.current = {
157
+ ids,
158
+ refs: buildSourceRefs(message.sources ?? []),
159
+ };
160
+ }
161
+ }
162
+ const sourceRefs = message.role === "assistant" ? refsCache.current.refs : undefined;
163
+ useEffect(() => {
164
+ setRating(readRatings(stateKey)[message.id] ?? null);
165
+ }, [stateKey, message.id]);
166
+ useEffect(() => () => {
167
+ if (copiedTimer.current !== undefined)
168
+ clearTimeout(copiedTimer.current);
169
+ }, []);
170
+ if (message.role === "system" && message.notice !== undefined) {
171
+ return (_jsxs("details", { className: "dsh-qa-notice", children: [_jsxs("summary", { className: "dsh-qa-notice__summary", children: [_jsxs("svg", { className: "dsh-qa-notice__icon", viewBox: "0 0 16 16", "aria-hidden": "true", children: [_jsx("rect", { x: "3", y: "5", width: "10", height: "7.5", rx: "1.75" }), _jsx("path", { d: "M8 2.5V5m0-.25a.9.9 0 1 0-.01-1.8.9.9 0 0 0 .01 1.8ZM5.4 8.4h1.7M8.9 8.4h1.7M6 10.4h4" })] }), _jsx("span", { className: "dsh-qa-notice__title", children: message.notice.title }), _jsx("svg", { className: "dsh-qa-notice__chevron", viewBox: "0 0 14 14", "aria-hidden": "true", children: _jsx("path", { d: "m5.25 3.5 3.5 3.5-3.5 3.5" }) })] }), _jsx("div", { className: "dsh-qa-notice__body", children: message.notice.body === "" ? (_jsx("p", { children: "\u0411\u0435\u0437 \u0438\u0442\u043E\u0433\u043E\u0432\u043E\u0433\u043E \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F." })) : renderMarkdown ? (_jsx(Markdown, { text: message.notice.body })) : (message.notice.body) })] }));
172
+ }
173
+ if (message.role === "work") {
174
+ return (_jsx("article", { className: "dsh-qa-message dsh-qa-message--work", "data-status": message.status, "aria-label": "\u0420\u0430\u0431\u043E\u0442\u0430 \u043F\u043E\u043C\u043E\u0449\u043D\u0438\u043A\u0430", children: _jsx(QaWorkGroup, { status: message.status, startedAt: message.startedAt, endedAt: message.endedAt, items: message.items, renderMarkdown: renderMarkdown }) }));
175
+ }
4
176
  const label = message.role === "assistant"
5
- ? "Assistant"
177
+ ? "Помощник"
6
178
  : message.role === "user"
7
- ? "You"
8
- : "Status";
9
- return (_jsxs("article", { className: `dsh-qa-message dsh-qa-message--${message.role}`, "data-status": message.status, children: [_jsxs("div", { className: "dsh-qa-message__meta", children: [_jsx("span", { children: label }), showTimestamp && message.timestamp !== undefined ? (_jsx("time", { dateTime: new Date(message.timestamp).toISOString(), children: new Date(message.timestamp).toLocaleTimeString([], {
10
- hour: "2-digit",
11
- minute: "2-digit",
12
- }) })) : null] }), _jsxs("div", { className: "dsh-qa-message__content", children: [message.role === "assistant" && renderMarkdown ? (_jsx(Markdown, { text: message.text })) : (message.text), message.status === "streaming" ? (_jsx("span", { className: "dsh-qa-message__cursor", "aria-hidden": "true" })) : null] })] }));
13
- }
179
+ ? (message.author ?? "Вы")
180
+ : "Статус";
181
+ const copy = async () => {
182
+ if (copied || navigator.clipboard?.writeText === undefined)
183
+ return;
184
+ try {
185
+ await navigator.clipboard.writeText(message.text);
186
+ setCopied(true);
187
+ if (copiedTimer.current !== undefined)
188
+ clearTimeout(copiedTimer.current);
189
+ copiedTimer.current = setTimeout(() => setCopied(false), 1200);
190
+ }
191
+ catch {
192
+ // Clipboard access may be denied by the embedding browser; keep the
193
+ // action available for a later user gesture without surfacing noise.
194
+ }
195
+ };
196
+ const toggleRating = (value) => {
197
+ const next = rating === value ? null : value;
198
+ setRating(next);
199
+ writeRating(stateKey, message.id, next);
200
+ };
201
+ const persistentMeta = showTimestamp && message.timestamp !== undefined;
202
+ const meta = message.role === "system" || message.timestamp === undefined ? null : (_jsxs("span", { className: "dsh-qa-message__meta", children: [_jsx("time", { dateTime: new Date(message.timestamp).toISOString(), children: formatDayTime(message.timestamp) }), message.role === "assistant"
203
+ ? assistantMeta(message).map((part) => (_jsx("span", { className: "dsh-qa-message__meta-part", children: part }, part)))
204
+ : null] }));
205
+ const showActions = message.role !== "system" && message.status !== "streaming";
206
+ return (_jsxs("article", { className: `dsh-qa-message dsh-qa-message--${message.role}`, "data-status": message.status, "aria-label": `Сообщение: ${label}`, children: [_jsxs("div", { className: "dsh-qa-message__content", children: [message.role === "user" && message.author !== undefined ? (_jsx("span", { className: "dsh-qa-message__byline", children: message.author })) : null, message.role === "user" && message.images !== undefined ? (_jsx("div", { className: "dsh-qa-message__images", children: message.images.map((image) => resolveImage === undefined ? null : (_jsx(QaAttachedImage, { image: image, resolve: resolveImage }, image.attachmentId))) })) : null, message.role === "assistant" && renderMarkdown ? (_jsx(Markdown, { text: message.text, sourceRefs: sourceRefs, onSourceOpen: onSourceDetail })) : (message.text), message.status === "streaming" ? (_jsx("span", { className: "dsh-qa-message__cursor", "aria-hidden": "true" })) : null] }), message.role === "assistant" &&
207
+ onOpenSources !== undefined &&
208
+ message.sources !== undefined &&
209
+ message.sources.length > 0 ? (_jsxs("button", { type: "button", className: "dsh-qa-message__sources", onClick: () => onOpenSources(message.sources ?? [], message.sourcesComplete ?? true, message.incompleteSourceOrigins), children: ["\u0418\u0441\u0442\u043E\u0447\u043D\u0438\u043A\u0438 (", message.sources.length, ")"] })) : null, showActions ? (_jsxs("div", { className: "dsh-qa-message__actions", "data-persistent": persistentMeta || undefined, children: [message.role === "user" ? meta : null, _jsx("button", { type: "button", "aria-label": copied ? "Скопировано" : "Скопировать сообщение", title: copied ? "Скопировано" : "Копировать", onClick: () => void copy(), children: copied ? (_jsx("svg", { viewBox: "0 0 18 18", "aria-hidden": "true", children: _jsx("path", { d: "m4.5 9.25 2.75 2.75 6.25-6.25" }) })) : (_jsxs("svg", { viewBox: "0 0 18 18", "aria-hidden": "true", children: [_jsx("rect", { x: "6.25", y: "3.25", width: "8.5", height: "8.5", rx: "2" }), _jsx("path", { d: "M11.75 11.75v.5a2.5 2.5 0 0 1-2.5 2.5h-3.5a2.5 2.5 0 0 1-2.5-2.5v-3.5a2.5 2.5 0 0 1 2.5-2.5h.5" })] })) }), message.role === "user" ? null : (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", "aria-label": "\u041D\u0440\u0430\u0432\u0438\u0442\u0441\u044F", title: "\u041D\u0440\u0430\u0432\u0438\u0442\u0441\u044F", "aria-pressed": rating === "up", "data-active": rating === "up" || undefined, onClick: () => toggleRating("up"), children: _jsx("svg", { viewBox: "0 0 18 18", "aria-hidden": "true", children: _jsx("path", { d: "M5.25 8.25 8.1 2.9a1.3 1.3 0 0 1 2.4.75v3.1h3.1c.9 0 1.55.85 1.33 1.72l-1.05 4.2a1.75 1.75 0 0 1-1.7 1.33H5.25m0-5.75v5.75m0-5.75h-2v5.75h2" }) }) }), _jsx("button", { type: "button", "aria-label": "\u041D\u0435 \u043D\u0440\u0430\u0432\u0438\u0442\u0441\u044F", title: "\u041D\u0435 \u043D\u0440\u0430\u0432\u0438\u0442\u0441\u044F", "aria-pressed": rating === "down", "data-active": rating === "down" || undefined, onClick: () => toggleRating("down"), children: _jsx("svg", { viewBox: "0 0 18 18", "aria-hidden": "true", children: _jsx("path", { d: "M12.75 9.75 9.9 15.1a1.3 1.3 0 0 1-2.4-.75v-3.1H4.4a1.38 1.38 0 0 1-1.33-1.72l1.05-4.2A1.75 1.75 0 0 1 5.82 4h6.93m0 5.75V4m0 5.75h2V4h-2" }) }) }), onRegenerate === undefined ? null : (_jsx("button", { type: "button", "aria-label": "\u041F\u0435\u0440\u0435\u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C", title: "\u041F\u0435\u0440\u0435\u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C", onClick: onRegenerate, children: _jsx("svg", { viewBox: "0 0 18 18", "aria-hidden": "true", children: _jsx("path", { d: "M14.6 9A5.6 5.6 0 1 1 12.9 5l1.7 1.7m0-3.4v3.4h-3.4" }) }) }))] })), message.role === "user" ? null : meta] })) : null] }));
210
+ }, (prev, next) => prev.renderMarkdown === next.renderMarkdown &&
211
+ prev.showTimestamp === next.showTimestamp &&
212
+ prev.stateKey === next.stateKey &&
213
+ prev.onRegenerate === next.onRegenerate &&
214
+ prev.resolveImage === next.resolveImage &&
215
+ prev.onOpenSources === next.onOpenSources &&
216
+ prev.onSourceDetail === next.onSourceDetail &&
217
+ sameMessage(prev.message, next.message));
14
218
  //# sourceMappingURL=QaMessage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"QaMessage.js","sourceRoot":"","sources":["../../../src/client/components/QaMessage.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAQzC,MAAM,UAAU,SAAS,CAAC,EACxB,OAAO,EACP,cAAc,EACd,aAAa,GACE;IACf,MAAM,KAAK,GACT,OAAO,CAAC,IAAI,KAAK,WAAW;QAC1B,CAAC,CAAC,WAAW;QACb,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM;YACvB,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,QAAQ,CAAC;IACjB,OAAO,CACL,mBACE,SAAS,EAAE,kCAAkC,OAAO,CAAC,IAAI,EAAE,iBAC9C,OAAO,CAAC,MAAM,aAE3B,eAAK,SAAS,EAAC,sBAAsB,aACnC,yBAAO,KAAK,GAAQ,EACnB,aAAa,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,CAClD,eAAM,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,YACtD,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,EAAE,EAAE;4BAClD,IAAI,EAAE,SAAS;4BACf,MAAM,EAAE,SAAS;yBAClB,CAAC,GACG,CACR,CAAC,CAAC,CAAC,IAAI,IACJ,EACN,eAAK,SAAS,EAAC,yBAAyB,aACrC,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,cAAc,CAAC,CAAC,CAAC,CAChD,KAAC,QAAQ,IAAC,IAAI,EAAE,OAAO,CAAC,IAAI,GAAI,CACjC,CAAC,CAAC,CAAC,CACF,OAAO,CAAC,IAAI,CACb,EACA,OAAO,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,CAChC,eAAM,SAAS,EAAC,wBAAwB,iBAAa,MAAM,GAAG,CAC/D,CAAC,CAAC,CAAC,IAAI,IACJ,IACE,CACX,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"QaMessage.js","sourceRoot":"","sources":["../../../src/client/components/QaMessage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAO1D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAqB,MAAM,kBAAkB,CAAC;AAEtE,SAAS,eAAe,CAAC,EACvB,KAAK,EACL,OAAO,GAIR;IACC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACpD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,uEAAuE;QACvE,wDAAwD;QACxD,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,IAAI,CAC9B,CAAC,QAAQ,EAAE,EAAE;YACX,IAAI,KAAK;gBAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC,EACD,GAAG,EAAE;YACH,IAAI,KAAK;gBAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC,CACF,CAAC;QACF,OAAO,GAAG,EAAE;YACV,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAClC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,eAAM,SAAS,EAAC,uBAAuB,gBAAY,SAAS,GAAG,CAAC;IACzE,CAAC;IACD,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QACf,OAAO,eAAM,SAAS,EAAC,uBAAuB,gBAAY,QAAQ,GAAG,CAAC;IACxE,CAAC;IACD,OAAO,CACL,YAAG,IAAI,EAAE,GAAG,EAAE,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,YAAY,YAC5C,cACE,SAAS,EAAC,uBAAuB,EACjC,GAAG,EAAE,GAAG,EACR,GAAG,EAAC,mJAA2B,GAC/B,GACA,CACL,CAAC;AACJ,CAAC;AACD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AA2B/C;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,CAAiB,EAAE,CAAiB;IAC9D,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC9E,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3C,OAAO,CACL,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI;YACjB,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;YAC3B,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO;YACvB,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAChC,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACzD,0EAA0E;IAC1E,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACnE,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACrD,OAAO,CACL,WAAW,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC;YACjC,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC;YACnD,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS;gBACpB,CAAC,CAAC,KAAK,KAAK,SAAS;gBACrB,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,CAAC,KAAK,CAAC,UAAU;oBACxC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,CAAC,MAAM;oBACjC,CAAC,CAAC,KAAK,CAAC,eAAe,KAAK,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAC1D,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3C,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC/C,OAAO,CACL,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC;YACrD,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS;gBACrB,CAAC,CAAC,MAAM,KAAK,SAAS;gBACtB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAC1E,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAClB,CAAkC,EAClC,CAAkC;IAElC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC9E,OAAO,CAAC,CAAC,KAAK,CACZ,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAChB,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE;QAC1B,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK;QAChC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG;QAC5B,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI;QAC9B,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO;QACpC,MAAM,CAAC,QAAQ,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,QAAQ;QACtC,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK;QAChC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;QACrC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CACvE,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CACjB,CAAqC,EACrC,CAAqC;IAErC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC9E,OAAO,CAAC,CAAC,KAAK,CACZ,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CACf,KAAK,CAAC,YAAY,KAAM,CAAC,CAAC,KAAK,CAAiB,CAAC,YAAY;QAC7D,KAAK,CAAC,SAAS,KAAM,CAAC,CAAC,KAAK,CAAiB,CAAC,SAAS,CAC1D,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,QAA4B;IAC/C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,QAAQ,UAAU,CAAC,CAAC;QAC/D,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;YAClD,CAAC,CAAE,MAAiC;YACpC,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAClB,QAA4B,EAC5B,EAAU,EACV,MAAqB;IAErB,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO;IACnC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtC,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,OAAO,CAAC,EAAE,CAAC,CAAC;;YACnC,OAAO,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC;QAC1B,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,QAAQ,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAA+C;IACpE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QACpD,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,QAAQ,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,QAAQ,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAC3B,SAAS,SAAS,CAAC,EACjB,OAAO,EACP,cAAc,EACd,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,GACC;IACf,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,MAAM,CACxB,SAAS,CACV,CAAC;IACF,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC1D,wEAAwE;IACxE,gEAAgE;IAChE,MAAM,SAAS,GAAG,MAAM,CAAsC;QAC5D,GAAG,EAAE,EAAE;QACP,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC;KAC1B,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACxE,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YAClC,SAAS,CAAC,OAAO,GAAG;gBAClB,GAAG;gBACH,IAAI,EAAE,eAAe,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;aAC7C,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,UAAU,GACd,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC;IACvD,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,SAAS,CACP,GAAG,EAAE,CAAC,GAAG,EAAE;QACT,IAAI,WAAW,CAAC,OAAO,KAAK,SAAS;YACnC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC,EACD,EAAE,CACH,CAAC;IACF,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9D,OAAO,CACL,mBAAS,SAAS,EAAC,eAAe,aAChC,mBAAS,SAAS,EAAC,wBAAwB,aACzC,eACE,SAAS,EAAC,qBAAqB,EAC/B,OAAO,EAAC,WAAW,iBACP,MAAM,aAElB,eAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,KAAK,EAAC,EAAE,EAAC,MAAM,GAAG,EACtD,eAAM,CAAC,EAAC,uFAAuF,GAAG,IAC9F,EACN,eAAM,SAAS,EAAC,sBAAsB,YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,GAAQ,EACpE,cACE,SAAS,EAAC,wBAAwB,EAClC,OAAO,EAAC,WAAW,iBACP,MAAM,YAElB,eAAM,CAAC,EAAC,2BAA2B,GAAG,GAClC,IACE,EACV,cAAK,SAAS,EAAC,qBAAqB,YACjC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,CAC5B,4JAA+B,CAChC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CACnB,KAAC,QAAQ,IAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,GAAI,CACxC,CAAC,CAAC,CAAC,CACF,OAAO,CAAC,MAAM,CAAC,IAAI,CACpB,GACG,IACE,CACX,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5B,OAAO,CACL,kBACE,SAAS,EAAC,qCAAqC,iBAClC,OAAO,CAAC,MAAM,gBAChB,6FAAkB,YAE7B,KAAC,WAAW,IACV,MAAM,EAAE,OAAO,CAAC,MAAM,EACtB,SAAS,EAAE,OAAO,CAAC,SAAS,EAC5B,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,KAAK,EAAE,OAAO,CAAC,KAAK,EACpB,cAAc,EAAE,cAAc,GAC9B,GACM,CACX,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GACT,OAAO,CAAC,IAAI,KAAK,WAAW;QAC1B,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM;YACvB,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;YAC1B,CAAC,CAAC,QAAQ,CAAC;IACjB,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE;QACtB,IAAI,MAAM,IAAI,SAAS,CAAC,SAAS,EAAE,SAAS,KAAK,SAAS;YAAE,OAAO;QACnE,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAClD,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,IAAI,WAAW,CAAC,OAAO,KAAK,SAAS;gBACnC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;YACpC,WAAW,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QACjE,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;YACpE,qEAAqE;QACvE,CAAC;IACH,CAAC,CAAC;IACF,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QAC7C,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC;IACF,MAAM,cAAc,GAAG,aAAa,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;IACxE,MAAM,IAAI,GACR,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACpE,gBAAM,SAAS,EAAC,sBAAsB,aACpC,eAAM,QAAQ,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,YACtD,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,GAC5B,EACN,OAAO,CAAC,IAAI,KAAK,WAAW;gBAC3B,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CACnC,eAAiB,SAAS,EAAC,2BAA2B,YACnD,IAAI,IADI,IAAI,CAER,CACR,CAAC;gBACJ,CAAC,CAAC,IAAI,IACH,CACR,CAAC;IACJ,MAAM,WAAW,GACf,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,CAAC;IAC9D,OAAO,CACL,mBACE,SAAS,EAAE,kCAAkC,OAAO,CAAC,IAAI,EAAE,iBAC9C,OAAO,CAAC,MAAM,gBACf,cAAc,KAAK,EAAE,aAEjC,eAAK,SAAS,EAAC,yBAAyB,aACrC,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CACzD,eAAM,SAAS,EAAC,wBAAwB,YAAE,OAAO,CAAC,MAAM,GAAQ,CACjE,CAAC,CAAC,CAAC,IAAI,EACP,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CACzD,cAAK,SAAS,EAAC,wBAAwB,YACpC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAC5B,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAClC,KAAC,eAAe,IAEd,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,YAAY,IAFhB,KAAK,CAAC,YAAY,CAGvB,CACH,CACF,GACG,CACP,CAAC,CAAC,CAAC,IAAI,EACP,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,cAAc,CAAC,CAAC,CAAC,CAChD,KAAC,QAAQ,IACP,IAAI,EAAE,OAAO,CAAC,IAAI,EAClB,UAAU,EAAE,UAAU,EACtB,YAAY,EAAE,cAAc,GAC5B,CACH,CAAC,CAAC,CAAC,CACF,OAAO,CAAC,IAAI,CACb,EACA,OAAO,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,CAChC,eAAM,SAAS,EAAC,wBAAwB,iBAAa,MAAM,GAAG,CAC/D,CAAC,CAAC,CAAC,IAAI,IACJ,EACL,OAAO,CAAC,IAAI,KAAK,WAAW;gBAC7B,aAAa,KAAK,SAAS;gBAC3B,OAAO,CAAC,OAAO,KAAK,SAAS;gBAC7B,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAC3B,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,yBAAyB,EACnC,OAAO,EAAE,GAAG,EAAE,CACZ,aAAa,CACX,OAAO,CAAC,OAAO,IAAI,EAAE,EACrB,OAAO,CAAC,eAAe,IAAI,IAAI,EAC/B,OAAO,CAAC,uBAAuB,CAChC,yEAGS,OAAO,CAAC,OAAO,CAAC,MAAM,SAC3B,CACV,CAAC,CAAC,CAAC,IAAI,EACP,WAAW,CAAC,CAAC,CAAC,CACb,eACE,SAAS,EAAC,yBAAyB,qBAClB,cAAc,IAAI,SAAS,aAE3C,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EACtC,iBACE,IAAI,EAAC,QAAQ,gBACD,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,uBAAuB,EAC5D,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,EAC5C,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,IAAI,EAAE,YAEzB,MAAM,CAAC,CAAC,CAAC,CACR,cAAK,OAAO,EAAC,WAAW,iBAAa,MAAM,YACzC,eAAM,CAAC,EAAC,+BAA+B,GAAG,GACtC,CACP,CAAC,CAAC,CAAC,CACF,eAAK,OAAO,EAAC,WAAW,iBAAa,MAAM,aACzC,eAAM,CAAC,EAAC,MAAM,EAAC,CAAC,EAAC,MAAM,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,EAAE,EAAC,GAAG,GAAG,EAC1D,eAAM,CAAC,EAAC,gGAAgG,GAAG,IACvG,CACP,GACM,EACR,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAChC,8BACE,iBACE,IAAI,EAAC,QAAQ,gBACF,kDAAU,EACrB,KAAK,EAAC,kDAAU,kBACF,MAAM,KAAK,IAAI,iBAChB,MAAM,KAAK,IAAI,IAAI,SAAS,EACzC,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,YAEjC,cAAK,OAAO,EAAC,WAAW,iBAAa,MAAM,YACzC,eAAM,CAAC,EAAC,6IAA6I,GAAG,GACpJ,GACC,EACT,iBACE,IAAI,EAAC,QAAQ,gBACF,+DAAa,EACxB,KAAK,EAAC,+DAAa,kBACL,MAAM,KAAK,MAAM,iBAClB,MAAM,KAAK,MAAM,IAAI,SAAS,EAC3C,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,YAEnC,cAAK,OAAO,EAAC,WAAW,iBAAa,MAAM,YACzC,eAAM,CAAC,EAAC,2IAA2I,GAAG,GAClJ,GACC,EACR,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACnC,iBACE,IAAI,EAAC,QAAQ,gBACF,kGAAkB,EAC7B,KAAK,EAAC,kGAAkB,EACxB,OAAO,EAAE,YAAY,YAErB,cAAK,OAAO,EAAC,WAAW,iBAAa,MAAM,YACzC,eAAM,CAAC,EAAC,qDAAqD,GAAG,GAC5D,GACC,CACV,IACA,CACJ,EACA,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAClC,CACP,CAAC,CAAC,CAAC,IAAI,IACA,CACX,CAAC;AACJ,CAAC,EACD,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CACb,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,cAAc;IAC3C,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,aAAa;IACzC,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ;IAC/B,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,YAAY;IACvC,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,YAAY;IACvC,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,aAAa;IACzC,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,cAAc;IAC3C,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAC1C,CAAC"}