semantic-renderer 1.0.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 (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +192 -0
  3. package/dist/core/classifier.d.ts +13 -0
  4. package/dist/core/classifier.d.ts.map +1 -0
  5. package/dist/core/classifier.js +478 -0
  6. package/dist/core/classifier.js.map +1 -0
  7. package/dist/core/index.d.ts +3 -0
  8. package/dist/core/index.d.ts.map +1 -0
  9. package/dist/core/index.js +3 -0
  10. package/dist/core/index.js.map +1 -0
  11. package/dist/core/types.d.ts +40 -0
  12. package/dist/core/types.d.ts.map +1 -0
  13. package/dist/core/types.js +2 -0
  14. package/dist/core/types.js.map +1 -0
  15. package/dist/react/FallbackMarkdown.d.ts +8 -0
  16. package/dist/react/FallbackMarkdown.d.ts.map +1 -0
  17. package/dist/react/FallbackMarkdown.js +10 -0
  18. package/dist/react/FallbackMarkdown.js.map +1 -0
  19. package/dist/react/SemanticRenderer.d.ts +14 -0
  20. package/dist/react/SemanticRenderer.d.ts.map +1 -0
  21. package/dist/react/SemanticRenderer.js +37 -0
  22. package/dist/react/SemanticRenderer.js.map +1 -0
  23. package/dist/react/index.d.ts +10 -0
  24. package/dist/react/index.d.ts.map +1 -0
  25. package/dist/react/index.js +11 -0
  26. package/dist/react/index.js.map +1 -0
  27. package/dist/react/renderers/CodeExplanationRenderer.d.ts +10 -0
  28. package/dist/react/renderers/CodeExplanationRenderer.d.ts.map +1 -0
  29. package/dist/react/renderers/CodeExplanationRenderer.js +14 -0
  30. package/dist/react/renderers/CodeExplanationRenderer.js.map +1 -0
  31. package/dist/react/renderers/ComparisonRenderer.d.ts +10 -0
  32. package/dist/react/renderers/ComparisonRenderer.d.ts.map +1 -0
  33. package/dist/react/renderers/ComparisonRenderer.js +13 -0
  34. package/dist/react/renderers/ComparisonRenderer.js.map +1 -0
  35. package/dist/react/renderers/DataTableRenderer.d.ts +10 -0
  36. package/dist/react/renderers/DataTableRenderer.d.ts.map +1 -0
  37. package/dist/react/renderers/DataTableRenderer.js +51 -0
  38. package/dist/react/renderers/DataTableRenderer.js.map +1 -0
  39. package/dist/react/renderers/ProsConsRenderer.d.ts +10 -0
  40. package/dist/react/renderers/ProsConsRenderer.d.ts.map +1 -0
  41. package/dist/react/renderers/ProsConsRenderer.js +13 -0
  42. package/dist/react/renderers/ProsConsRenderer.js.map +1 -0
  43. package/dist/react/renderers/StepsRenderer.d.ts +10 -0
  44. package/dist/react/renderers/StepsRenderer.d.ts.map +1 -0
  45. package/dist/react/renderers/StepsRenderer.js +28 -0
  46. package/dist/react/renderers/StepsRenderer.js.map +1 -0
  47. package/dist/react/renderers/VerdictRenderer.d.ts +10 -0
  48. package/dist/react/renderers/VerdictRenderer.d.ts.map +1 -0
  49. package/dist/react/renderers/VerdictRenderer.js +13 -0
  50. package/dist/react/renderers/VerdictRenderer.js.map +1 -0
  51. package/package.json +85 -0
  52. package/src/react/styles.css +79 -0
@@ -0,0 +1,478 @@
1
+ // ── Helpers ──────────────────────────────────────────────────────────────────
2
+ let idCounter = 0;
3
+ function makeId(type, index) {
4
+ return `sem-${type}-${index}-${++idCounter}`;
5
+ }
6
+ /** Split markdown into sections by ## or ### headings. */
7
+ function splitSections(markdown) {
8
+ const lines = markdown.split('\n');
9
+ const sections = [];
10
+ let currentHeading = '';
11
+ let currentLines = [];
12
+ for (const line of lines) {
13
+ const headingMatch = line.match(/^(#{2,3})\s+(.+)$/);
14
+ if (headingMatch) {
15
+ // Flush previous section
16
+ if (currentLines.length > 0 || currentHeading) {
17
+ const raw = currentHeading
18
+ ? currentHeading + '\n' + currentLines.join('\n')
19
+ : currentLines.join('\n');
20
+ sections.push({ heading: currentHeading, body: currentLines.join('\n'), raw });
21
+ }
22
+ currentHeading = line;
23
+ currentLines = [];
24
+ }
25
+ else {
26
+ currentLines.push(line);
27
+ }
28
+ }
29
+ // Flush final section
30
+ if (currentLines.length > 0 || currentHeading) {
31
+ const raw = currentHeading
32
+ ? currentHeading + '\n' + currentLines.join('\n')
33
+ : currentLines.join('\n');
34
+ sections.push({ heading: currentHeading, body: currentLines.join('\n'), raw });
35
+ }
36
+ return sections;
37
+ }
38
+ /** Extract bullet list items from a block of text. */
39
+ function extractBullets(text) {
40
+ const bullets = [];
41
+ for (const line of text.split('\n')) {
42
+ const m = line.match(/^\s*[-*+]\s+(.+)/);
43
+ if (m)
44
+ bullets.push(m[1].trim());
45
+ }
46
+ return bullets;
47
+ }
48
+ /** Count paragraphs of prose (non-empty, non-code-fence, non-list, non-heading lines). */
49
+ function countProseParagraphs(text) {
50
+ let count = 0;
51
+ let inCode = false;
52
+ let prevBlank = true;
53
+ for (const line of text.split('\n')) {
54
+ if (line.trim().startsWith('```')) {
55
+ inCode = !inCode;
56
+ continue;
57
+ }
58
+ if (inCode)
59
+ continue;
60
+ const trimmed = line.trim();
61
+ if (trimmed === '') {
62
+ prevBlank = true;
63
+ continue;
64
+ }
65
+ if (/^[-*+]\s/.test(trimmed) || /^\d+\.\s/.test(trimmed) || /^#{1,6}\s/.test(trimmed))
66
+ continue;
67
+ if (/^\|/.test(trimmed))
68
+ continue;
69
+ if (prevBlank)
70
+ count++;
71
+ prevBlank = false;
72
+ }
73
+ return count;
74
+ }
75
+ /** Extract a single fenced code block from text. Returns null if not exactly one. */
76
+ function extractSingleCodeBlock(text) {
77
+ const fenceRegex = /^```(\w*)\n([\s\S]*?)^```$/gm;
78
+ const matches = [...text.matchAll(fenceRegex)];
79
+ if (matches.length !== 1)
80
+ return null;
81
+ const match = matches[0];
82
+ const before = text.slice(0, match.index).trim();
83
+ const after = text.slice(match.index + match[0].length).trim();
84
+ return {
85
+ code: match[2].trim(),
86
+ language: match[1] || 'text',
87
+ before,
88
+ after,
89
+ };
90
+ }
91
+ /** Parse a GFM table from text. Returns null if no valid table found. */
92
+ function parseGfmTable(text) {
93
+ const lines = text.split('\n');
94
+ let tableStart = -1;
95
+ let separatorIdx = -1;
96
+ // Find the header + separator pattern
97
+ for (let i = 0; i < lines.length - 1; i++) {
98
+ const line = lines[i].trim();
99
+ const next = lines[i + 1].trim();
100
+ if (/^\|.+\|$/.test(line) && /^\|[\s:|-]+\|$/.test(next)) {
101
+ tableStart = i;
102
+ separatorIdx = i + 1;
103
+ break;
104
+ }
105
+ }
106
+ if (tableStart === -1)
107
+ return null;
108
+ const parseRow = (line) => line.split('|').slice(1, -1).map(cell => cell.trim());
109
+ const headers = parseRow(lines[tableStart]);
110
+ const rows = [];
111
+ for (let i = separatorIdx + 1; i < lines.length; i++) {
112
+ const line = lines[i].trim();
113
+ if (!line.startsWith('|') || !line.endsWith('|'))
114
+ break;
115
+ rows.push(parseRow(line));
116
+ }
117
+ if (rows.length === 0)
118
+ return null;
119
+ const tableLines = lines.slice(tableStart, separatorIdx + 1 + rows.length);
120
+ return { headers, rows, raw: tableLines.join('\n') };
121
+ }
122
+ // ── Detectors (priority order) ───────────────────────────────────────────────
123
+ /** Detect pros/cons pattern across the full markdown. */
124
+ function detectProsCons(markdown) {
125
+ const prosPattern = /\b(pros?|advantages?|benefits?|strengths?)\b/i;
126
+ const consPattern = /\b(cons?|disadvantages?|drawbacks?|weaknesses?)\b/i;
127
+ // Look for heading-based pros/cons
128
+ const sections = splitSections(markdown);
129
+ let prosSection = null;
130
+ let consSection = null;
131
+ for (const section of sections) {
132
+ const headingText = section.heading.replace(/^#{1,6}\s+/, '');
133
+ if (prosPattern.test(headingText) && !prosSection)
134
+ prosSection = section;
135
+ if (consPattern.test(headingText) && !consSection)
136
+ consSection = section;
137
+ }
138
+ if (prosSection && consSection) {
139
+ const pros = extractBullets(prosSection.body);
140
+ const cons = extractBullets(consSection.body);
141
+ if (pros.length >= 2 && cons.length >= 2) {
142
+ const meta = { pros, cons };
143
+ return {
144
+ id: makeId('pros-cons', 0),
145
+ type: 'pros-cons',
146
+ rawMarkdown: markdown,
147
+ meta: meta,
148
+ };
149
+ }
150
+ }
151
+ // Also try bold-based pattern: **Pros:** / **Cons:**
152
+ const boldProsMatch = markdown.match(/\*\*\s*(pros?|advantages?|benefits?)\s*:?\s*\*\*/i);
153
+ const boldConsMatch = markdown.match(/\*\*\s*(cons?|disadvantages?|drawbacks?)\s*:?\s*\*\*/i);
154
+ if (boldProsMatch && boldConsMatch) {
155
+ const prosIdx = boldProsMatch.index;
156
+ const consIdx = boldConsMatch.index;
157
+ const [firstIdx, secondIdx] = prosIdx < consIdx ? [prosIdx, consIdx] : [consIdx, prosIdx];
158
+ const firstBlock = markdown.slice(firstIdx, secondIdx);
159
+ const secondBlock = markdown.slice(secondIdx);
160
+ const firstBullets = extractBullets(firstBlock);
161
+ const secondBullets = extractBullets(secondBlock);
162
+ if (firstBullets.length >= 2 && secondBullets.length >= 2) {
163
+ const pros = prosIdx < consIdx ? firstBullets : secondBullets;
164
+ const cons = prosIdx < consIdx ? secondBullets : firstBullets;
165
+ const meta = { pros, cons };
166
+ return {
167
+ id: makeId('pros-cons', 0),
168
+ type: 'pros-cons',
169
+ rawMarkdown: markdown,
170
+ meta: meta,
171
+ };
172
+ }
173
+ }
174
+ return null;
175
+ }
176
+ /** Detect comparison pattern (A vs B with similar structure). */
177
+ function detectComparison(markdown) {
178
+ const sections = splitSections(markdown);
179
+ // Check for "vs" / "versus" in any heading
180
+ const hasVsHeading = sections.some(s => /\bvs\.?\b|\bversus\b|\bcompared?\s+to\b/i.test(s.heading));
181
+ // Find ### headings with bullet lists underneath
182
+ const h3Sections = sections.filter(s => s.heading.startsWith('### '));
183
+ const withBullets = h3Sections.filter(s => extractBullets(s.body).length >= 2);
184
+ if (withBullets.length >= 2 && (hasVsHeading || withBullets.length >= 2)) {
185
+ const items = withBullets.map(s => ({
186
+ title: s.heading.replace(/^###\s+/, '').replace(/\*\*/g, '').trim(),
187
+ points: extractBullets(s.body),
188
+ }));
189
+ const meta = { items };
190
+ return {
191
+ id: makeId('comparison', 0),
192
+ type: 'comparison',
193
+ rawMarkdown: markdown,
194
+ meta: meta,
195
+ };
196
+ }
197
+ // Also check for ## headings with similar structure (when there's a vs heading)
198
+ if (hasVsHeading) {
199
+ const h2Sections = sections.filter(s => s.heading.startsWith('## ') && !s.heading.match(/\bvs\.?\b|\bversus\b/i));
200
+ const h2WithBullets = h2Sections.filter(s => extractBullets(s.body).length >= 2);
201
+ if (h2WithBullets.length >= 2) {
202
+ const items = h2WithBullets.map(s => ({
203
+ title: s.heading.replace(/^##\s+/, '').replace(/\*\*/g, '').trim(),
204
+ points: extractBullets(s.body),
205
+ }));
206
+ const meta = { items };
207
+ return {
208
+ id: makeId('comparison', 0),
209
+ type: 'comparison',
210
+ rawMarkdown: markdown,
211
+ meta: meta,
212
+ };
213
+ }
214
+ }
215
+ return null;
216
+ }
217
+ /** Detect step-by-step pattern. */
218
+ function detectSteps(markdown) {
219
+ // Pattern 1: Headings matching "Step N" or "Phase N"
220
+ const sections = splitSections(markdown);
221
+ const stepSections = sections.filter(s => /^#{2,3}\s*(step|phase)\s*\d+/i.test(s.heading));
222
+ if (stepSections.length >= 3) {
223
+ const steps = stepSections.map((s, i) => ({
224
+ number: i + 1,
225
+ title: s.heading.replace(/^#{2,3}\s+/, '').trim(),
226
+ body: s.body.trim(),
227
+ }));
228
+ const meta = { steps };
229
+ return {
230
+ id: makeId('steps', 0),
231
+ type: 'steps',
232
+ rawMarkdown: markdown,
233
+ meta: meta,
234
+ };
235
+ }
236
+ // Pattern 2: Numbered headings like "## 1. Install dependencies"
237
+ const numberedHeadingSections = sections.filter(s => /^#{2,3}\s*\d+[\.\)]\s+/.test(s.heading));
238
+ if (numberedHeadingSections.length >= 3) {
239
+ const steps = numberedHeadingSections.map((s, i) => ({
240
+ number: i + 1,
241
+ title: s.heading.replace(/^#{2,3}\s*\d+[\.\)]\s+/, '').trim(),
242
+ body: s.body.trim(),
243
+ }));
244
+ const meta = { steps };
245
+ return {
246
+ id: makeId('steps', 0),
247
+ type: 'steps',
248
+ rawMarkdown: markdown,
249
+ meta: meta,
250
+ };
251
+ }
252
+ // Pattern 3: Ordered list with multi-sentence items or bold titles
253
+ const orderedListRegex = /^(\d+)\.\s+(?:\*\*(.+?)\*\*[:\s—-]*)?(.*)$/gm;
254
+ const listItems = [];
255
+ let match;
256
+ // Reset regex
257
+ const lines = markdown.split('\n');
258
+ let i = 0;
259
+ while (i < lines.length) {
260
+ const lineMatch = lines[i].match(/^(\d+)\.\s+(?:\*\*(.+?)\*\*[:\s—-]*)?(.*)$/);
261
+ if (lineMatch) {
262
+ const num = parseInt(lineMatch[1], 10);
263
+ const title = lineMatch[2] || '';
264
+ let body = lineMatch[3] || '';
265
+ // Collect continuation lines (indented or non-list)
266
+ i++;
267
+ while (i < lines.length) {
268
+ const nextLine = lines[i];
269
+ if (nextLine.trim() === '') {
270
+ i++;
271
+ continue;
272
+ }
273
+ if (/^\d+\.\s+/.test(nextLine))
274
+ break;
275
+ if (/^#{1,6}\s/.test(nextLine))
276
+ break;
277
+ body += '\n' + nextLine;
278
+ i++;
279
+ }
280
+ listItems.push({ number: num, title: title.trim(), body: body.trim() });
281
+ }
282
+ else {
283
+ i++;
284
+ }
285
+ }
286
+ if (listItems.length >= 3) {
287
+ // Check that items have some substance (not just one-word items)
288
+ const hasSubstance = listItems.some(item => item.body.length > 30 || item.title.length > 0);
289
+ if (hasSubstance) {
290
+ const meta = {
291
+ steps: listItems.map((item, idx) => ({
292
+ number: idx + 1,
293
+ title: item.title || item.body.split('\n')[0].slice(0, 80),
294
+ body: item.title ? item.body : item.body.split('\n').slice(1).join('\n').trim(),
295
+ })),
296
+ };
297
+ return {
298
+ id: makeId('steps', 0),
299
+ type: 'steps',
300
+ rawMarkdown: markdown,
301
+ meta: meta,
302
+ };
303
+ }
304
+ }
305
+ return null;
306
+ }
307
+ /** Detect code + explanation pattern. */
308
+ function detectCodeExplanation(markdown) {
309
+ const codeBlock = extractSingleCodeBlock(markdown);
310
+ if (!codeBlock)
311
+ return null;
312
+ const proseCount = countProseParagraphs(codeBlock.before) + countProseParagraphs(codeBlock.after);
313
+ if (proseCount < 2)
314
+ return null;
315
+ // The code block should be substantial (at least 3 lines)
316
+ if (codeBlock.code.split('\n').length < 3)
317
+ return null;
318
+ const explanation = [codeBlock.before, codeBlock.after].filter(Boolean).join('\n\n');
319
+ const meta = {
320
+ code: codeBlock.code,
321
+ language: codeBlock.language,
322
+ explanation,
323
+ };
324
+ return {
325
+ id: makeId('code-explanation', 0),
326
+ type: 'code-explanation',
327
+ rawMarkdown: markdown,
328
+ meta: meta,
329
+ };
330
+ }
331
+ /** Detect data table pattern. */
332
+ function detectDataTable(markdown) {
333
+ const table = parseGfmTable(markdown);
334
+ if (!table)
335
+ return null;
336
+ if (table.headers.length < 3 || table.rows.length < 3)
337
+ return null;
338
+ const meta = {
339
+ headers: table.headers,
340
+ rows: table.rows,
341
+ };
342
+ return {
343
+ id: makeId('data-table', 0),
344
+ type: 'data-table',
345
+ rawMarkdown: markdown,
346
+ meta: meta,
347
+ };
348
+ }
349
+ /** Detect verdict/conclusion pattern. */
350
+ function detectVerdict(markdown) {
351
+ const verdictPattern = /\b(verdict|conclusion|recommendation|summary|bottom\s*line|tldr|tl;dr|final\s+(?:thoughts?|take|answer))\b/i;
352
+ // Pattern 1: Heading-based verdict
353
+ const sections = splitSections(markdown);
354
+ for (const section of sections) {
355
+ const headingText = section.heading.replace(/^#{1,6}\s+/, '');
356
+ if (verdictPattern.test(headingText) && section.body.trim().length > 20) {
357
+ const meta = { verdict: section.body.trim() };
358
+ return {
359
+ id: makeId('verdict', 0),
360
+ type: 'verdict',
361
+ rawMarkdown: section.raw,
362
+ meta: meta,
363
+ };
364
+ }
365
+ }
366
+ // Pattern 2: Trailing blockquote at the very end
367
+ const lines = markdown.trim().split('\n');
368
+ const lastLines = [];
369
+ for (let i = lines.length - 1; i >= 0; i--) {
370
+ if (lines[i].startsWith('> ')) {
371
+ lastLines.unshift(lines[i].replace(/^>\s?/, ''));
372
+ }
373
+ else if (lines[i].trim() === '') {
374
+ continue;
375
+ }
376
+ else {
377
+ break;
378
+ }
379
+ }
380
+ if (lastLines.length > 0 && lastLines.join(' ').length > 20) {
381
+ const verdictText = lastLines.join('\n');
382
+ const meta = { verdict: verdictText };
383
+ return {
384
+ id: makeId('verdict', 0),
385
+ type: 'verdict',
386
+ rawMarkdown: lastLines.map(l => '> ' + l).join('\n'),
387
+ meta: meta,
388
+ };
389
+ }
390
+ return null;
391
+ }
392
+ // ── Main Classifier ──────────────────────────────────────────────────────────
393
+ /**
394
+ * Classify a sanitized markdown string into semantic blocks.
395
+ *
396
+ * The classifier attempts to match the ENTIRE response to a single semantic
397
+ * type first (e.g., the whole response is a comparison). If no full-response
398
+ * match is found, it falls back to a default block.
399
+ *
400
+ * A verdict detector also runs and can capture a trailing section separately,
401
+ * resulting in [main content block, verdict block] when applicable.
402
+ */
403
+ export function classify(markdown) {
404
+ if (!markdown || markdown.trim().length === 0) {
405
+ return [{ id: makeId('default', 0), type: 'default', rawMarkdown: markdown, meta: {} }];
406
+ }
407
+ const blocks = [];
408
+ // Try full-response detectors in priority order
409
+ const detectors = [
410
+ detectProsCons,
411
+ detectComparison,
412
+ detectSteps,
413
+ detectCodeExplanation,
414
+ detectDataTable,
415
+ ];
416
+ let matched = false;
417
+ for (const detect of detectors) {
418
+ const block = detect(markdown);
419
+ if (block) {
420
+ blocks.push(block);
421
+ matched = true;
422
+ break;
423
+ }
424
+ }
425
+ // If no full-response match, check for a verdict section at the end
426
+ // and use default for the rest
427
+ if (!matched) {
428
+ const verdict = detectVerdict(markdown);
429
+ if (verdict && verdict.rawMarkdown !== markdown) {
430
+ // There's a verdict section — split it out
431
+ const remainingMd = markdown.replace(verdict.rawMarkdown, '').trim();
432
+ if (remainingMd.length > 0) {
433
+ blocks.push({
434
+ id: makeId('default', 0),
435
+ type: 'default',
436
+ rawMarkdown: remainingMd,
437
+ meta: {},
438
+ });
439
+ }
440
+ blocks.push(verdict);
441
+ }
442
+ else if (verdict && verdict.rawMarkdown === markdown) {
443
+ // Entire response is a verdict
444
+ blocks.push(verdict);
445
+ }
446
+ else {
447
+ // Pure default
448
+ blocks.push({
449
+ id: makeId('default', 0),
450
+ type: 'default',
451
+ rawMarkdown: markdown,
452
+ meta: {},
453
+ });
454
+ }
455
+ }
456
+ else {
457
+ // Even with a matched type, check if there's a trailing verdict
458
+ const verdict = detectVerdict(markdown);
459
+ if (verdict && verdict.type === 'verdict') {
460
+ // Only add if it's a distinct section (heading-based, not overlapping with main block)
461
+ const mainBlock = blocks[0];
462
+ if (mainBlock && mainBlock.type !== 'verdict') {
463
+ // Check the verdict section isn't already part of the main content
464
+ const verdictText = verdict.meta.verdict;
465
+ if (verdictText && !isSubstantialOverlap(mainBlock.rawMarkdown, verdictText)) {
466
+ blocks.push(verdict);
467
+ }
468
+ }
469
+ }
470
+ }
471
+ return blocks;
472
+ }
473
+ /** Check if text B is substantially contained within text A. */
474
+ function isSubstantialOverlap(a, b) {
475
+ const bTrimmed = b.trim().slice(0, 100);
476
+ return a.includes(bTrimmed);
477
+ }
478
+ //# sourceMappingURL=classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classifier.js","sourceRoot":"","sources":["../../src/core/classifier.ts"],"names":[],"mappings":"AAWA,gFAAgF;AAEhF,IAAI,SAAS,GAAG,CAAC,CAAC;AAClB,SAAS,MAAM,CAAC,IAAuB,EAAE,KAAa;IACpD,OAAO,OAAO,IAAI,IAAI,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC;AAC/C,CAAC;AAED,0DAA0D;AAC1D,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,QAAQ,GAA0D,EAAE,CAAC;IAC3E,IAAI,cAAc,GAAG,EAAE,CAAC;IACxB,IAAI,YAAY,GAAa,EAAE,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACrD,IAAI,YAAY,EAAE,CAAC;YACjB,yBAAyB;YACzB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC;gBAC9C,MAAM,GAAG,GAAG,cAAc;oBACxB,CAAC,CAAC,cAAc,GAAG,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;oBACjD,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YACjF,CAAC;YACD,cAAc,GAAG,IAAI,CAAC;YACtB,YAAY,GAAG,EAAE,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC;QAC9C,MAAM,GAAG,GAAG,cAAc;YACxB,CAAC,CAAC,cAAc,GAAG,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YACjD,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,sDAAsD;AACtD,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACzC,IAAI,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,0FAA0F;AAC1F,SAAS,oBAAoB,CAAC,IAAY;IACxC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,SAAS,GAAG,IAAI,CAAC;IAErB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAAC,MAAM,GAAG,CAAC,MAAM,CAAC;YAAC,SAAS;QAAC,CAAC;QAClE,IAAI,MAAM;YAAE,SAAS;QAErB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YAAC,SAAS,GAAG,IAAI,CAAC;YAAC,SAAS;QAAC,CAAC;QACnD,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,SAAS;QAChG,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,SAAS;QAElC,IAAI,SAAS;YAAE,KAAK,EAAE,CAAC;QACvB,SAAS,GAAG,KAAK,CAAC;IACpB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,qFAAqF;AACrF,SAAS,sBAAsB,CAAC,IAAY;IAC1C,MAAM,UAAU,GAAG,8BAA8B,CAAC;IAClD,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAEhE,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QACrB,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM;QAC5B,MAAM;QACN,KAAK;KACN,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC;IACpB,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;IAEtB,sCAAsC;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzD,UAAU,GAAG,CAAC,CAAC;YACf,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC;YACrB,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,UAAU,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAY,EAAE,CAC1C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAe,EAAE,CAAC;IAE5B,KAAK,IAAI,CAAC,GAAG,YAAY,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,MAAM;QACxD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACvD,CAAC;AAED,gFAAgF;AAEhF,yDAAyD;AACzD,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,WAAW,GAAG,+CAA+C,CAAC;IACpE,MAAM,WAAW,GAAG,oDAAoD,CAAC;IAEzE,mCAAmC;IACnC,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,WAAW,GAA8B,IAAI,CAAC;IAClD,IAAI,WAAW,GAA8B,IAAI,CAAC;IAElD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAC9D,IAAI,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW;YAAE,WAAW,GAAG,OAAO,CAAC;QACzE,IAAI,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW;YAAE,WAAW,GAAG,OAAO,CAAC;IAC3E,CAAC;IAED,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,GAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC1C,OAAO;gBACL,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC1B,IAAI,EAAE,WAAW;gBACjB,WAAW,EAAE,QAAQ;gBACrB,IAAI,EAAE,IAA0C;aACjD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;IAC1F,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAE9F,IAAI,aAAa,IAAI,aAAa,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAM,CAAC;QACrC,MAAM,OAAO,GAAG,aAAa,CAAC,KAAM,CAAC;QACrC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC1F,MAAM,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAE9C,MAAM,YAAY,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAChD,MAAM,aAAa,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;QAElD,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;YAC9D,MAAM,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC;YAC9D,MAAM,IAAI,GAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC1C,OAAO;gBACL,EAAE,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC1B,IAAI,EAAE,WAAW;gBACjB,WAAW,EAAE,QAAQ;gBACrB,IAAI,EAAE,IAA0C;aACjD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iEAAiE;AACjE,SAAS,gBAAgB,CAAC,QAAgB;IACxC,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAEzC,2CAA2C;IAC3C,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CACrC,0CAA0C,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAC3D,CAAC;IAEF,iDAAiD;IACjD,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IAE/E,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC;QACzE,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;YACnE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC;SAC/B,CAAC,CAAC,CAAC;QACJ,MAAM,IAAI,GAAmB,EAAE,KAAK,EAAE,CAAC;QACvC,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;YAC3B,IAAI,EAAE,YAAY;YAClB,WAAW,EAAE,QAAQ;YACrB,IAAI,EAAE,IAA0C;SACjD,CAAC;IACJ,CAAC;IAED,gFAAgF;IAChF,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QAClH,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;QACjF,IAAI,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBACpC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;gBAClE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC;aAC/B,CAAC,CAAC,CAAC;YACJ,MAAM,IAAI,GAAmB,EAAE,KAAK,EAAE,CAAC;YACvC,OAAO;gBACL,EAAE,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;gBAC3B,IAAI,EAAE,YAAY;gBAClB,WAAW,EAAE,QAAQ;gBACrB,IAAI,EAAE,IAA0C;aACjD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,mCAAmC;AACnC,SAAS,WAAW,CAAC,QAAgB;IACnC,qDAAqD;IACrD,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CACvC,+BAA+B,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAChD,CAAC;IAEF,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACxC,MAAM,EAAE,CAAC,GAAG,CAAC;YACb,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;YACjD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;SACpB,CAAC,CAAC,CAAC;QACJ,MAAM,IAAI,GAAc,EAAE,KAAK,EAAE,CAAC;QAClC,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACtB,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,QAAQ;YACrB,IAAI,EAAE,IAA0C;SACjD,CAAC;IACJ,CAAC;IAED,iEAAiE;IACjE,MAAM,uBAAuB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAClD,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CACzC,CAAC;IAEF,IAAI,uBAAuB,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACnD,MAAM,EAAE,CAAC,GAAG,CAAC;YACb,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;YAC7D,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;SACpB,CAAC,CAAC,CAAC;QACJ,MAAM,IAAI,GAAc,EAAE,KAAK,EAAE,CAAC;QAClC,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACtB,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,QAAQ;YACrB,IAAI,EAAE,IAA0C;SACjD,CAAC;IACJ,CAAC;IAED,mEAAmE;IACnE,MAAM,gBAAgB,GAAG,8CAA8C,CAAC;IACxE,MAAM,SAAS,GAA2D,EAAE,CAAC;IAC7E,IAAI,KAA6B,CAAC;IAElC,cAAc;IACd,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC/E,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAE9B,oDAAoD;YACpD,CAAC,EAAE,CAAC;YACJ,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBACxB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC1B,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;oBAAC,CAAC,EAAE,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBAC9C,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAAE,MAAM;gBACtC,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAAE,MAAM;gBACtC,IAAI,IAAI,IAAI,GAAG,QAAQ,CAAC;gBACxB,CAAC,EAAE,CAAC;YACN,CAAC;YAED,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1E,CAAC;aAAM,CAAC;YACN,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC1B,iEAAiE;QACjE,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAC/C,CAAC;QACF,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,IAAI,GAAc;gBACtB,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;oBACnC,MAAM,EAAE,GAAG,GAAG,CAAC;oBACf,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;oBAC1D,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;iBAChF,CAAC,CAAC;aACJ,CAAC;YACF,OAAO;gBACL,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;gBACtB,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,QAAQ;gBACrB,IAAI,EAAE,IAA0C;aACjD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yCAAyC;AACzC,SAAS,qBAAqB,CAAC,QAAgB;IAC7C,MAAM,SAAS,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,MAAM,UAAU,GAAG,oBAAoB,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,oBAAoB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAClG,IAAI,UAAU,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEhC,0DAA0D;IAC1D,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvD,MAAM,WAAW,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAErF,MAAM,IAAI,GAAwB;QAChC,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,WAAW;KACZ,CAAC;IAEF,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACjC,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,QAAQ;QACrB,IAAI,EAAE,IAA0C;KACjD,CAAC;AACJ,CAAC;AAED,iCAAiC;AACjC,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnE,MAAM,IAAI,GAAkB;QAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;KACjB,CAAC;IAEF,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAC3B,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,QAAQ;QACrB,IAAI,EAAE,IAA0C;KACjD,CAAC;AACJ,CAAC;AAED,yCAAyC;AACzC,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,cAAc,GAAG,6GAA6G,CAAC;IAErI,mCAAmC;IACnC,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACzC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAC9D,IAAI,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACxE,MAAM,IAAI,GAAgB,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAC3D,OAAO;gBACL,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;gBACxB,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,OAAO,CAAC,GAAG;gBACxB,IAAI,EAAE,IAA0C;aACjD,CAAC;QACJ,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAClC,SAAS;QACX,CAAC;aAAM,CAAC;YACN,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC5D,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,MAAM,IAAI,GAAgB,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QACnD,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;YACxB,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACpD,IAAI,EAAE,IAA0C;SACjD,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gFAAgF;AAEhF;;;;;;;;;GASG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9C,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,MAAM,GAAoB,EAAE,CAAC;IAEnC,gDAAgD;IAChD,MAAM,SAAS,GAAgD;QAC7D,cAAc;QACd,gBAAgB;QAChB,WAAW;QACX,qBAAqB;QACrB,eAAe;KAChB,CAAC;IAEF,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,MAAM,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC/B,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO,GAAG,IAAI,CAAC;YACf,MAAM;QACR,CAAC;IACH,CAAC;IAED,oEAAoE;IACpE,+BAA+B;IAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,OAAO,IAAI,OAAO,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAChD,2CAA2C;YAC3C,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACrE,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC;oBACV,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;oBACxB,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,WAAW;oBACxB,IAAI,EAAE,EAAE;iBACT,CAAC,CAAC;YACL,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,OAAO,IAAI,OAAO,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YACvD,+BAA+B;YAC/B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,eAAe;YACf,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;gBACxB,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,QAAQ;gBACrB,IAAI,EAAE,EAAE;aACT,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,CAAC;QACN,gEAAgE;QAChE,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC1C,uFAAuF;YACvF,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC9C,mEAAmE;gBACnE,MAAM,WAAW,GAAI,OAAO,CAAC,IAA+B,CAAC,OAAO,CAAC;gBACrE,IAAI,WAAW,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,CAAC;oBAC7E,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gEAAgE;AAChE,SAAS,oBAAoB,CAAC,CAAS,EAAE,CAAS;IAChD,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACxC,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { classify } from './classifier.js';
2
+ export type { SemanticBlock, SemanticBlockType, ComparisonMeta, StepsMeta, ProsConsMeta, CodeExplanationMeta, DataTableMeta, VerdictMeta, } from './types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,WAAW,GACZ,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ // Core — framework-agnostic classifier and types
2
+ export { classify } from './classifier.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,iDAAiD;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,40 @@
1
+ export type SemanticBlockType = 'comparison' | 'steps' | 'pros-cons' | 'code-explanation' | 'data-table' | 'verdict' | 'default';
2
+ export interface SemanticBlock {
3
+ id: string;
4
+ type: SemanticBlockType;
5
+ rawMarkdown: string;
6
+ meta: Record<string, unknown>;
7
+ }
8
+ export interface ComparisonMeta {
9
+ items: Array<{
10
+ title: string;
11
+ points: string[];
12
+ }>;
13
+ }
14
+ export interface StepsMeta {
15
+ steps: Array<{
16
+ number: number;
17
+ title: string;
18
+ body: string;
19
+ }>;
20
+ }
21
+ export interface ProsConsMeta {
22
+ pros: string[];
23
+ cons: string[];
24
+ subject?: string;
25
+ }
26
+ export interface CodeExplanationMeta {
27
+ code: string;
28
+ language: string;
29
+ explanation: string;
30
+ }
31
+ export interface DataTableMeta {
32
+ headers: string[];
33
+ rows: string[][];
34
+ caption?: string;
35
+ }
36
+ export interface VerdictMeta {
37
+ verdict: string;
38
+ reasoning?: string;
39
+ }
40
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GACzB,YAAY,GACZ,OAAO,GACP,WAAW,GACX,kBAAkB,GAClB,YAAY,GACZ,SAAS,GACT,SAAS,CAAC;AAEd,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,iBAAiB,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,KAAK,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,KAAK,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Simple markdown fallback renderer.
3
+ * Users can override this by passing a custom `fallback` prop to SemanticRenderer.
4
+ */
5
+ export declare const FallbackMarkdown: import("react").MemoExoticComponent<({ content }: {
6
+ content: string;
7
+ }) => import("react/jsx-runtime").JSX.Element>;
8
+ //# sourceMappingURL=FallbackMarkdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FallbackMarkdown.d.ts","sourceRoot":"","sources":["../../src/react/FallbackMarkdown.tsx"],"names":[],"mappings":"AAGA;;;GAGG;AACH,eAAO,MAAM,gBAAgB,oDAAsB;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,6CAIpE,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { memo } from 'react';
3
+ import ReactMarkdown from 'react-markdown';
4
+ /**
5
+ * Simple markdown fallback renderer.
6
+ * Users can override this by passing a custom `fallback` prop to SemanticRenderer.
7
+ */
8
+ export const FallbackMarkdown = memo(({ content }) => (_jsx("div", { className: "sem-markdown", children: _jsx(ReactMarkdown, { children: content }) })));
9
+ FallbackMarkdown.displayName = 'FallbackMarkdown';
10
+ //# sourceMappingURL=FallbackMarkdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FallbackMarkdown.js","sourceRoot":"","sources":["../../src/react/FallbackMarkdown.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAE3C;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,CAAC,EAAE,OAAO,EAAuB,EAAE,EAAE,CAAC,CACzE,cAAK,SAAS,EAAC,cAAc,YAC3B,KAAC,aAAa,cAAE,OAAO,GAAiB,GACpC,CACP,CAAC,CAAC;AAEH,gBAAgB,CAAC,WAAW,GAAG,kBAAkB,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface SemanticRendererProps {
2
+ /** The markdown content to render */
3
+ content: string;
4
+ /** Skip classification and render as plain markdown (useful for streaming) */
5
+ isStreaming?: boolean;
6
+ /** CSS class for the wrapper */
7
+ className?: string;
8
+ /** Custom fallback renderer for unclassified content and inline markdown */
9
+ fallback?: React.ComponentType<{
10
+ content: string;
11
+ }>;
12
+ }
13
+ export declare const SemanticRenderer: import("react").MemoExoticComponent<({ content, isStreaming, className, fallback: Fallback, }: SemanticRendererProps) => import("react/jsx-runtime").JSX.Element>;
14
+ //# sourceMappingURL=SemanticRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SemanticRenderer.d.ts","sourceRoot":"","sources":["../../src/react/SemanticRenderer.tsx"],"names":[],"mappings":"AAWA,MAAM,WAAW,qBAAqB;IACpC,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAYD,eAAO,MAAM,gBAAgB,iGAK1B,qBAAqB,6CAsBtB,CAAC"}