@noirmd/previewer 2.0.2 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/NReditor.cjs +1080 -96
- package/dist/NReditor.cjs.map +1 -1
- package/dist/NReditor.d.cts +3 -1
- package/dist/NReditor.d.ts +3 -1
- package/dist/NReditor.js +1080 -96
- package/dist/NReditor.js.map +1 -1
- package/dist/accordion.css +85 -0
- package/dist/carousel.css +121 -0
- package/dist/chat.css +182 -0
- package/dist/countdown.css +83 -0
- package/dist/diff.css +94 -0
- package/dist/editor.css +218 -4
- package/dist/hover3d.css +157 -0
- package/dist/hovergallery.css +110 -0
- package/dist/index.cjs +572 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +572 -4
- package/dist/index.js.map +1 -1
- package/dist/kbd.css +63 -0
- package/dist/react.cjs +968 -7
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +27 -1
- package/dist/react.d.ts +27 -1
- package/dist/react.js +966 -7
- package/dist/react.js.map +1 -1
- package/dist/richlist.css +110 -0
- package/dist/stat.css +107 -0
- package/dist/vanilla.cjs +572 -4
- package/dist/vanilla.cjs.map +1 -1
- package/dist/vanilla.css +11 -1
- package/dist/vanilla.js +572 -4
- package/dist/vanilla.js.map +1 -1
- package/dist/variables.css +2 -0
- package/dist/vue.cjs +572 -4
- package/dist/vue.cjs.map +1 -1
- package/dist/vue.js +572 -4
- package/dist/vue.js.map +1 -1
- package/editor.css +218 -4
- package/package.json +5 -1
package/dist/NReditor.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../react/NReditor.tsx","../react/custom-syntax.ts","../react/useDebounce.ts","../react/useTailwindCDN.ts","../vanilla/tailwindTheme.ts","../react/CustomMarkdownRenderer.tsx","../core/utils.ts","../core/parser.ts","../vanilla/highlightSetup.ts","../vanilla/components.ts","../vanilla/inline.ts","../vanilla/directives/admonition.ts","../vanilla/directives/details.ts","../vanilla/directives/modal.ts","../vanilla/directives/button.ts","../vanilla/directives/card.ts","../vanilla/directives/wrapper.ts","../vanilla/directives/slide.ts","../vanilla/directives/index.ts","../vanilla/renderer.ts"],"sourcesContent":["import React, { useRef, useState } from 'react';\nimport CodeMirror, { ReactCodeMirrorProps } from '@uiw/react-codemirror';\nimport { EditorView, Decoration, ViewPlugin, ViewUpdate, lineNumbers, keymap } from '@codemirror/view';\nimport { customStreamParserV2 } from './custom-syntax';\nimport { RangeSetBuilder } from '@codemirror/state';\nimport { syntaxHighlighting, HighlightStyle, foldService, foldGutter, foldAll, unfoldAll } from '@codemirror/language';\nimport { tags as t } from '@lezer/highlight';\nimport { useDebounce } from './useDebounce';\nimport { useLazyTailwindCDN } from './useTailwindCDN';\nimport CustomMarkdownRenderer from './CustomMarkdownRenderer';\n\nexport type EditorMode = 'editor' | 'split' | 'preview';\n\ninterface NReditorProps extends ReactCodeMirrorProps {\n value: string;\n onChange: (value: string) => void;\n className?: string;\n /** Debounce delay in ms for preview rendering. Default: 300 */\n debounceMs?: number;\n /** Inject Tailwind v4 browser CDN for preview. Default: false */\n tailwindCDN?: boolean;\n /** Called when user clicks Guía */\n onGuide?: () => void;\n /** Called when user clicks Configurar */\n onConfig?: () => void;\n}\n\nconst customSyntaxHighlighting = HighlightStyle.define([\n { tag: t.heading, fontWeight: 'bold', color: 'var(--tc-heading, #e2e8f0)' },\n { tag: t.quote, color: 'var(--tc-quote, #94a3b8)', fontStyle: 'italic' },\n { tag: t.meta, color: 'var(--tc-meta, #64748b)' },\n { tag: t.variableName, color: 'var(--tc-variable, #38bdf8)' },\n { tag: t.strong, fontWeight: 'bold' },\n { tag: t.emphasis, fontStyle: 'italic' },\n { tag: t.strikethrough, textDecoration: 'line-through' },\n { tag: t.link, color: 'var(--tc-link, #38bdf8)' },\n { tag: t.url, color: 'var(--tc-link, #38bdf8)' },\n { tag: t.comment, color: 'var(--tc-comment, #64748b)' },\n { tag: t.keyword, color: 'var(--tc-heading, #e2e8f0)', fontWeight: 'bold' },\n { tag: t.typeName, color: 'var(--tc-type, #a78bfa)' },\n { tag: t.string, color: 'var(--tc-string, #4ade80)' },\n { tag: t.attributeName, color: 'var(--tc-attribute, #fb923c)' },\n { tag: t.propertyName, color: '#0ea5e9' },\n { tag: t.className, color: '#f59e0b', fontStyle: 'italic' },\n { tag: t.special(t.emphasis), textDecoration: 'underline' },\n { tag: t.special(t.comment), backgroundColor: 'var(--tc-highlight-bg, rgba(255,255,255,0.05))', padding: '0 2px', borderRadius: '2px' },\n]);\n\nconst customEditorTheme = EditorView.theme({\n '&': {\n color: 'var(--color-text-primary, #e2e8f0)',\n backgroundColor: 'transparent !important',\n height: '100%',\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n minHeight: '0',\n },\n '&.cm-focused': { outline: 'none' },\n '.cm-scroller': {\n overflow: 'auto !important',\n flex: '1',\n minHeight: '0',\n WebkitOverflowScrolling: 'touch',\n },\n '.cm-gutters': {\n backgroundColor: 'transparent !important',\n borderRight: '1px solid var(--color-border, #334155)',\n color: 'var(--color-text-secondary, #94a3b8)',\n opacity: 0.6,\n border: 'none',\n },\n '.cm-activeLineGutter': { backgroundColor: 'transparent' },\n '.cm-lineNumbers': { color: 'inherit' },\n '.cm-foldGutter': { padding: '0px', cursor: 'pointer' },\n '.cm-foldPlaceholder': {\n backgroundColor: 'rgba(255, 255, 255, 0.05)',\n border: '1px solid var(--color-border, #334155)',\n color: 'var(--tc-heading, #e2e8f0)',\n padding: '0 6px',\n borderRadius: '4px',\n margin: '0 4px',\n fontSize: '0.9em',\n fontWeight: 'bold',\n },\n '.dark .cm-foldPlaceholder': {\n backgroundColor: 'rgba(255, 255, 255, 0.1)',\n },\n '.cm-activeLine': { backgroundColor: 'transparent' },\n '.cm-cursor': { borderLeftColor: 'var(--color-text-primary, #e2e8f0)' },\n '&.cm-focused .cm-selectionBackground, .cm-selectionBackground': {\n backgroundColor: 'var(--tc-selection-bg, rgba(56, 189, 248, 0.2)) !important',\n },\n '.cm-blockquote-line': {\n color: 'var(--tc-blockquote-color, #94a3b8)',\n fontStyle: 'italic',\n borderLeft: '2px solid var(--tc-blockquote-border, #334155)',\n paddingLeft: '10px',\n },\n '.cm-spoiler': {\n backgroundColor: 'var(--color-text-secondary, #94a3b8)',\n color: 'var(--color-text-secondary, #94a3b8)',\n borderRadius: '3px',\n padding: '0 2px',\n cursor: 'pointer',\n transition: 'background-color 0.2s, color 0.2s',\n },\n '.cm-spoiler:hover': {\n backgroundColor: 'transparent',\n color: 'var(--color-text-primary, #e2e8f0)',\n },\n '.cm-admonition-bg': {\n borderLeft: 'none !important',\n marginLeft: '0px',\n },\n '.cm-admonition-button': { borderLeftColor: 'var(--tc-attribute, #fb923c)' },\n '.cm-admonition-modal': { borderLeftColor: 'var(--tc-variable, #38bdf8)' },\n '.cm-admonition-warning': { borderLeftColor: '#f59e0b' },\n '.cm-admonition-danger': { borderLeftColor: '#ef4444' },\n '.cm-raw-block': {\n fontFamily: 'monospace',\n backgroundColor: 'rgba(0, 0, 0, 0.1)',\n },\n '.dark .cm-raw-block': {\n backgroundColor: 'rgba(255, 255, 255, 0.05)',\n },\n '.cm-admonition-depth-1': {\n boxShadow: 'inset 4px 0 0 hsl(20, 70%, 50%)',\n backgroundColor: 'hsla(20, 70%, 50%, 0.05)',\n paddingLeft: '12px !important',\n },\n '.cm-admonition-depth-2': {\n boxShadow: 'inset 4px 0 0 hsl(20, 70%, 50%), inset 8px 0 0 hsl(140, 70%, 50%)',\n backgroundColor: 'hsla(140, 70%, 50%, 0.05)',\n paddingLeft: '16px !important',\n },\n '.cm-admonition-depth-3': {\n boxShadow: 'inset 4px 0 0 hsl(20, 70%, 50%), inset 8px 0 0 hsl(140, 70%, 50%), inset 12px 0 0 hsl(200, 70%, 50%)',\n backgroundColor: 'hsla(200, 70%, 50%, 0.05)',\n paddingLeft: '20px !important',\n },\n '.cm-admonition-depth-4': {\n boxShadow: 'inset 4px 0 0 hsl(20, 70%, 50%), inset 8px 0 0 hsl(140, 70%, 50%), inset 12px 0 0 hsl(200, 70%, 50%), inset 16px 0 0 hsl(280, 70%, 50%)',\n backgroundColor: 'hsla(280, 70%, 50%, 0.05)',\n paddingLeft: '24px !important',\n },\n '.cm-admonition-depth-5': {\n boxShadow: 'inset 4px 0 0 hsl(340, 70%, 50%), inset 8px 0 0 hsl(140, 70%, 50%), inset 12px 0 0 hsl(200, 70%, 50%), inset 16px 0 0 hsl(280, 70%, 50%), inset 20px 0 0 hsl(340, 70%, 50%)',\n backgroundColor: 'hsla(340, 70%, 50%, 0.05)',\n paddingLeft: '28px !important',\n },\n '.cm-panels': {\n position: 'static !important',\n backgroundColor: 'transparent !important',\n border: 'none !important',\n },\n '.cm-panel.cm-search': {\n position: 'fixed !important',\n top: '20px !important',\n right: '20px !important',\n zIndex: 100,\n backgroundColor: 'var(--color-background-primary, #0f172a)',\n border: '1px solid var(--color-border, #334155)',\n borderRadius: '12px',\n padding: '12px',\n boxShadow: '0 10px 25px -5px rgba(0, 0, 0, 0.3), 0 8px 10px -6px rgba(0, 0, 0, 0.3)',\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n backdropFilter: 'blur(8px)',\n minWidth: '280px',\n },\n '.cm-search [name=close]': {\n position: 'absolute',\n right: '8px',\n top: '8px',\n cursor: 'pointer',\n opacity: 0.6,\n border: 'none',\n background: 'transparent',\n color: 'var(--color-text-primary, #e2e8f0)',\n fontSize: '18px',\n },\n '.cm-search [name=close]:hover': { opacity: 1 },\n '.cm-textfield': {\n backgroundColor: 'rgba(255, 255, 255, 0.05)',\n border: '1px solid var(--color-border, #334155)',\n borderRadius: '6px',\n color: 'var(--color-text-primary, #e2e8f0)',\n padding: '4px 8px',\n outline: 'none',\n width: '100%',\n marginBottom: '4px',\n },\n '.cm-textfield:focus': {\n borderColor: 'var(--color-accent-primary, #38bdf8)',\n backgroundColor: 'rgba(255, 255, 255, 0.08)',\n },\n '.cm-panel.cm-search input[type=checkbox]:checked': {\n backgroundColor: 'var(--color-accent-primary, #38bdf8)',\n },\n '.cm-panel.cm-search input[type=checkbox]': {\n backgroundColor: 'rgba(255, 255, 255, 0.08)',\n },\n '.cm-button': {\n backgroundImage: 'linear-gradient(135deg, var(--color-accent-primary, #38bdf8), var(--color-accent-hover, #7dd3fc))',\n color: 'var(--color-accent-text, #0f172a)',\n border: 'none',\n borderRadius: '6px',\n padding: '4px 10px',\n cursor: 'pointer',\n fontSize: '0.85em',\n fontWeight: '600',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n transition: 'transform 0.1s, opacity 0.2s',\n marginRight: '4px',\n boxShadow: '0 4px 12px -2px rgba(0, 0, 0, 0.2)',\n },\n '.cm-button:hover': {\n opacity: 0.95,\n transform: 'translateY(-1px)',\n boxShadow: '0 6px 14px -2px rgba(0, 0, 0, 0.25)',\n },\n '.cm-button:active': { transform: 'translateY(0)' },\n '.cm-search label': {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '0.8em',\n color: 'var(--color-text-secondary, #94a3b8)',\n marginRight: '8px',\n cursor: 'pointer',\n },\n '.cm-search input[type=checkbox]': {\n cursor: 'pointer',\n accentColor: 'var(--color-accent-primary, #38bdf8)',\n },\n});\n\n// Fold service for ::: directive blocks and HTML tags\nconst customFoldService = foldService.of((state, lineStart) => {\n const line = state.doc.lineAt(lineStart);\n const trimmed = line.text.trim();\n \n const dirMatch = trimmed.match(/^:::(.+)/);\n if (dirMatch) {\n let stack = 1;\n for (let i = line.number + 1; i <= state.doc.lines; i++) {\n const nextLine = state.doc.line(i);\n const nextText = nextLine.text.trim();\n if (nextText.match(/^:::(.+)/)) {\n stack++;\n } else if (nextText === ':::') {\n stack--;\n if (stack === 0) {\n return { from: line.to, to: nextLine.to };\n }\n }\n }\n return null;\n }\n\n const htmlMatch = trimmed.match(/^<([a-zA-Z][\\w-]*)\\b/);\n if (htmlMatch) {\n const tagName = htmlMatch[1].toLowerCase();\n const voidElements = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', \n 'link', 'meta', 'param', 'source', 'track', 'wbr'\n ]);\n if (voidElements.has(tagName) || trimmed.endsWith('/>')) return null;\n\n let stack = 1;\n\n for (let i = line.number + 1; i <= state.doc.lines; i++) {\n const nextLine = state.doc.line(i);\n const nextText = nextLine.text;\n \n let match;\n const tagRegex = new RegExp(`</?${tagName}\\\\b[^>]*>`, 'gi');\n \n while ((match = tagRegex.exec(nextText)) !== null) {\n if (match[0].startsWith('</')) {\n stack--;\n if (stack === 0) {\n return { from: line.to, to: nextLine.to };\n }\n } else {\n if (!match[0].endsWith('/>')) {\n stack++;\n }\n }\n }\n }\n return null;\n }\n\n return null;\n});\n\n// Directive colorization plugin — colored left borders for nested :::\nconst directivePlugin = ViewPlugin.fromClass(\n class {\n decorations: any;\n constructor(view: EditorView) {\n this.decorations = this.getDecorations(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = this.getDecorations(update.view);\n }\n }\n getDecorations(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n const doc = view.state.doc;\n const visibleRanges = view.visibleRanges;\n if (visibleRanges.length === 0) return builder.finish();\n\n const maxTo = visibleRanges[visibleRanges.length - 1].to;\n const admonitionStack: string[] = [];\n\n for (let i = 1; i <= doc.lines; i++) {\n const line = doc.line(i);\n if (line.from > maxTo) break;\n\n const trimmedLine = line.text.trim();\n let isClosingLine = false;\n let closingTargetIdx = -1;\n\n const match = trimmedLine.match(/^:::(.*)/);\n if (match) {\n const rest = match[1].trim();\n if (rest === '') {\n if (admonitionStack.length > 0) {\n isClosingLine = true;\n closingTargetIdx = admonitionStack.length - 1;\n }\n } else {\n const typeMatch = rest.match(/^(\\w+|\\{)/);\n const type =\n typeMatch && typeMatch[1] !== '{'\n ? typeMatch[1].toLowerCase()\n : 'generic';\n admonitionStack.push(type);\n }\n }\n\n const isVisible = visibleRanges.some(\n r => line.to >= r.from && line.from <= r.to\n );\n\n if (isVisible && admonitionStack.length > 0) {\n const targetIdx = isClosingLine\n ? closingTargetIdx\n : admonitionStack.length - 1;\n const currentType = admonitionStack[targetIdx];\n const depth = targetIdx + 1;\n const lineClasses = ['cm-admonition-bg'];\n\n if (currentType === 'raw') {\n lineClasses.push('cm-raw-block');\n lineClasses.push(`cm-admonition-depth-${Math.min(depth, 5)}`);\n } else {\n lineClasses.push(`cm-admonition-${currentType}`);\n lineClasses.push(`cm-admonition-depth-${Math.min(depth, 5)}`);\n }\n\n builder.add(\n line.from,\n line.from,\n Decoration.line({ class: lineClasses.join(' ') })\n );\n }\n\n if (isClosingLine) {\n admonitionStack.pop();\n }\n }\n\n return builder.finish();\n }\n },\n { decorations: v => v.decorations }\n);\n\n// Blockquote line decoration\nconst blockquotePlugin = ViewPlugin.fromClass(\n class {\n decorations: any;\n constructor(view: EditorView) {\n this.decorations = this.getDecorations(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = this.getDecorations(update.view);\n }\n }\n getDecorations(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n for (const { from, to } of view.visibleRanges) {\n for (let pos = from; pos <= to; ) {\n const line = view.state.doc.lineAt(pos);\n if (line.text.trim().startsWith('>')) {\n builder.add(\n line.from,\n line.from,\n Decoration.line({ class: 'cm-blockquote-line' })\n );\n }\n pos = line.to + 1;\n }\n }\n return builder.finish();\n }\n },\n { decorations: v => v.decorations }\n);\n\n// Spoiler inline decoration: !>text<! → blurred until hover\nconst spoilerPlugin = ViewPlugin.fromClass(\n class {\n decorations: any;\n constructor(view: EditorView) {\n this.decorations = this.getDecorations(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = this.getDecorations(update.view);\n }\n }\n getDecorations(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n const spoilerRegex = /!>([\\s\\S]+?)<!(?=\\s|$)/g;\n const ranges: { from: number; to: number; dec: Decoration }[] = [];\n\n for (const { from, to } of view.visibleRanges) {\n const text = view.state.doc.sliceString(from, to);\n spoilerRegex.lastIndex = 0;\n let match;\n while ((match = spoilerRegex.exec(text))) {\n const start = from + match.index;\n const end = start + match[0].length;\n const contentStart = start + 2;\n const contentEnd = end - 2;\n if (contentStart >= contentEnd) continue;\n ranges.push({ from: start, to: contentStart, dec: Decoration.replace({}) });\n ranges.push({\n from: contentStart,\n to: contentEnd,\n dec: Decoration.mark({ class: 'cm-spoiler' }),\n });\n ranges.push({ from: contentEnd, to: end, dec: Decoration.replace({}) });\n }\n }\n\n ranges.sort((a, b) => a.from - b.from || a.to - b.to);\n for (const { from, to, dec } of ranges) builder.add(from, to, dec);\n return builder.finish();\n }\n },\n { decorations: v => v.decorations }\n);\n\n// Color text inline decoration: %color%text%%\nconst colorTextPlugin = ViewPlugin.fromClass(\n class {\n decorations: any;\n constructor(view: EditorView) {\n this.decorations = this.getDecorations(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = this.getDecorations(update.view);\n }\n }\n getDecorations(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n const colorRegex = /%([^%\\s]+?)%((?:(?!%%).)*)%%/g;\n for (const { from, to } of view.visibleRanges) {\n const text = view.state.doc.sliceString(from, to);\n let match;\n while ((match = colorRegex.exec(text))) {\n const color = match[1];\n const startPos = from + match.index;\n const endPos = startPos + match[0].length;\n builder.add(\n startPos,\n endPos,\n Decoration.mark({ attributes: { style: `color: ${color}` } })\n );\n }\n }\n return builder.finish();\n }\n },\n { decorations: v => v.decorations }\n);\n\n/**\n * NReditor — CodeMirror 6 editor with live markdown preview.\n * Drop-in component that works inside any container.\n *\n * @example\n * ```tsx\n * import NReditor from '@noirmd/previewer/editor';\n * import '@noirmd/previewer/editor.css';\n * import '@noirmd/previewer/vanilla/vanilla.css';\n *\n * <NReditor value={md} onChange={setMd} />\n * <NReditor value={md} onChange={setMd} tailwindCDN />\n * ```\n */\nconst NReditor: React.FC<NReditorProps> = ({\n value,\n onChange,\n className,\n debounceMs = 300,\n tailwindCDN = false,\n onGuide,\n onConfig,\n}) => {\n const editorRef = useRef<EditorView | null>(null);\n const [isAllFolded, setIsAllFolded] = useState(false);\n const [editorMode, setEditorMode] = useState<EditorMode>('split');\n const debouncedContent = useDebounce(value, debounceMs);\n\n useLazyTailwindCDN(tailwindCDN);\n\n const handleToggleFold = () => {\n if (!editorRef.current) return;\n if (isAllFolded) {\n unfoldAll(editorRef.current);\n setIsAllFolded(false);\n } else {\n foldAll(editorRef.current);\n setIsAllFolded(true);\n }\n };\n\n const extensions = React.useMemo(\n () => [\n customStreamParserV2,\n lineNumbers(),\n foldGutter({\n markerDOM: open => {\n const span = document.createElement('span');\n span.style.cursor = 'pointer';\n span.style.padding = '0 4px';\n span.style.fontSize = '12px';\n span.style.display = 'inline-block';\n span.style.transition = 'transform 0.2s';\n span.textContent = open ? '▼' : '▶';\n return span;\n },\n }),\n customFoldService,\n customEditorTheme,\n syntaxHighlighting(customSyntaxHighlighting),\n EditorView.lineWrapping,\n keymap.of([\n { key: 'Ctrl-Shift-[', run: foldAll },\n { key: 'Ctrl-Shift-]', run: unfoldAll },\n ]),\n directivePlugin,\n blockquotePlugin,\n spoilerPlugin,\n colorTextPlugin,\n ],\n []\n );\n\n const modeButtons: { key: EditorMode; icon: string; label: string }[] = [\n { key: 'editor', icon: 'code', label: 'Editor' },\n { key: 'split', icon: 'vertical_split', label: 'Split' },\n { key: 'preview', icon: 'visibility', label: 'Preview' },\n ];\n\n return (\n <div className={`nr-editor ${className || ''}`}>\n {/* Toolbar */}\n <div className=\"nr-editor-toolbar\">\n {/* Left: Fold + mode switcher */}\n <div className=\"nr-editor-toolbar-left\">\n <button\n onClick={handleToggleFold}\n className=\"nr-toolbar-btn nr-toolbar-btn-fold\"\n title={isAllFolded ? 'Expandir todo' : 'Colapsar todo'}\n aria-label={isAllFolded ? 'Expandir todo' : 'Colapsar todo'}\n >\n <span className=\"material-icons-round\">\n {isAllFolded ? 'unfold_more' : 'unfold_less'}\n </span>\n </button>\n\n <div className=\"nr-toolbar-divider\" />\n\n <div className=\"nr-toolbar-mode-group\">\n {modeButtons.map(btn => (\n <button\n key={btn.key}\n onClick={() => setEditorMode(btn.key)}\n className={`nr-toolbar-btn nr-toolbar-btn-mode ${\n editorMode === btn.key ? 'nr-toolbar-btn-mode--active' : ''\n } ${btn.key === 'split' ? 'nr-toolbar-btn-split' : ''}`}\n title={btn.label}\n >\n <span className=\"material-icons-round\">{btn.icon}</span>\n <span className=\"nr-toolbar-label\">{btn.label}</span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Right: Guía · Configurar (optional) */}\n <div className=\"nr-editor-toolbar-right\">\n {onGuide && (\n <button\n onClick={onGuide}\n className=\"nr-toolbar-btn nr-toolbar-btn-sm nr-toolbar-btn-guide\"\n title=\"Guía de sintaxis\"\n >\n <span className=\"material-icons-round\">menu_book</span>\n <span className=\"nr-toolbar-label\">Guía</span>\n </button>\n )}\n {onGuide && onConfig && <div className=\"nr-toolbar-divider\" />}\n {onConfig && (\n <button\n onClick={onConfig}\n className=\"nr-toolbar-btn nr-toolbar-btn-sm nr-toolbar-btn-config\"\n title=\"Configurar tema y metadata\"\n >\n <span className=\"material-icons-round\">tune</span>\n <span className=\"nr-toolbar-label\">Configurar</span>\n </button>\n )}\n </div>\n </div>\n\n {/* Content area — editor / split / preview */}\n <div className=\"nr-editor-body\">\n {(editorMode === 'editor' || editorMode === 'split') && (\n <div\n className={`nr-editor-pane ${\n editorMode === 'split' ? 'nr-editor-pane--half' : ''\n }`}\n >\n <CodeMirror\n value={value}\n onChange={onChange}\n height=\"auto\"\n onCreateEditor={view => {\n editorRef.current = view as any;\n }}\n basicSetup={{\n lineNumbers: false,\n foldGutter: false,\n }}\n extensions={extensions}\n />\n </div>\n )}\n\n {(editorMode === 'preview' || editorMode === 'split') && (\n <div\n className={`nr-editor-preview ${\n editorMode === 'split' ? 'nr-editor-preview--half' : ''\n }`}\n >\n <div className=\"nr-editor-prose\">\n <div className=\"nr-prose\">\n <CustomMarkdownRenderer content={debouncedContent} />\n </div>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default NReditor;\n","import { StreamLanguage } from '@codemirror/language';\nimport { tags as t } from '@lezer/highlight';\n\n/**\n * V2 Custom Syntax Highlighter for CodeMirror 6.\n */\n\ninterface V2State {\n inCodeBlock: boolean;\n inDirectiveHeader: boolean;\n inPropsBlock: boolean;\n braceDepth: number;\n blockStack: string[];\n imageState: 'none' | 'expectUrl' | 'expectOptions';\n linkState: 'none' | 'expectUrl';\n lastPropKey: string;\n inHtmlBlock: boolean;\n htmlTagName: string;\n isClosingHtmlTag: boolean;\n embeddedLang: 'none' | 'script' | 'style';\n}\n\nexport const customStreamParserV2 = StreamLanguage.define<V2State>({\n startState: () => ({\n inCodeBlock: false,\n inDirectiveHeader: false,\n inPropsBlock: false,\n braceDepth: 0,\n blockStack: [],\n imageState: 'none',\n linkState: 'none',\n lastPropKey: '',\n inHtmlBlock: false,\n htmlTagName: '',\n isClosingHtmlTag: false,\n embeddedLang: 'none',\n }),\n\n token(stream, state) {\n // ── Line start resets ──\n if (stream.sol()) {\n state.inDirectiveHeader = false;\n state.imageState = 'none';\n state.linkState = 'none';\n\n // Close code block\n if (state.inCodeBlock && stream.match(/^\\s*```/)) {\n state.inCodeBlock = false;\n return 'comment';\n }\n \n // ELIMINADO: El reinicio de state.inHtmlBlock aquí para permitir atributos multilínea\n }\n\n // Inside HTML block opening tag (soporta atributos multilínea)\n if (state.inHtmlBlock) {\n stream.eatSpace();\n \n // Self-closing: />\n if (stream.match(/^\\/>/)) {\n state.inHtmlBlock = false;\n state.htmlTagName = '';\n state.isClosingHtmlTag = false;\n return 'typeName';\n }\n // Closing >\n if (stream.match(/^>/)) {\n state.inHtmlBlock = false;\n // Enter embedded mode for <script> / <style> blocks\n if (!state.isClosingHtmlTag && (state.htmlTagName === 'script' || state.htmlTagName === 'style')) {\n state.embeddedLang = state.htmlTagName;\n }\n state.htmlTagName = '';\n state.isClosingHtmlTag = false;\n return 'typeName';\n }\n \n // Nombre de atributo\n if (stream.match(/^[a-zA-Z_:][\\w-.:]*/)) return 'attributeName';\n // Signo igual\n if (stream.match(/^=/)) return 'keyword';\n // Valor entre comillas dobles (cerradas o abiertas en esta línea)\n if (stream.match(/^\"[^\"]*\"/)) return 'string';\n if (stream.match(/^\"[^\"]*$/)) return 'string';\n // Valor entre comillas simples (cerradas o abiertas)\n if (stream.match(/^'[^']*'/)) return 'string';\n if (stream.match(/^'[^']*$/)) return 'string';\n // Valor sin comillas\n if (stream.match(/^[^\\s>]+/)) return 'string';\n \n if (stream.eatSpace()) return null;\n stream.next();\n return null;\n }\n\n // ── Inside embedded <script> / <style> ──\n if (state.embeddedLang !== 'none') {\n // Detect closing tag to exit embedded mode\n if (stream.match(/^<\\/(script|style)\\b/i)) {\n const closeTag = stream.current().replace(/^<\\//, '').toLowerCase();\n state.embeddedLang = 'none';\n state.inHtmlBlock = true;\n state.htmlTagName = closeTag;\n state.isClosingHtmlTag = true;\n return 'typeName';\n }\n\n if (state.embeddedLang === 'script') {\n // ── JavaScript tokenizer ──\n // Line comments\n if (stream.match(/^\\/\\//)) { stream.skipToEnd(); return 'comment'; }\n // Block comments\n if (stream.match(/^\\/\\*/)) {\n while (!stream.eol()) {\n if (stream.match(/\\*\\//)) return 'comment';\n stream.next();\n }\n return 'comment';\n }\n // Strings (single / double quotes)\n if (stream.match(/^[\"']/)) {\n const q = stream.current();\n while (!stream.eol()) {\n const ch = stream.next();\n if (ch === q && stream.string[stream.pos - 2] !== '\\\\') break;\n }\n return 'string';\n }\n // Template literals\n if (stream.match(/^`/)) {\n while (!stream.eol()) {\n if (stream.next() === '`') break;\n }\n return 'string';\n }\n // Keywords\n if (stream.match(/\\b(const|let|var|function|return|if|else|for|while|do|switch|case|break|continue|new|this|class|extends|import|export|default|from|try|catch|finally|throw|async|await|typeof|instanceof|in|of|void|null|undefined|true|false)\\b/)) return 'keyword';\n // Numbers\n if (stream.match(/^\\d+(\\.\\d+)?/)) return 'number';\n // Function call\n if (stream.match(/^[a-zA-Z_$][\\w$]*(?=\\s*\\()/)) return 'function';\n // Identifier\n if (stream.match(/^[a-zA-Z_$][\\w$]*/)) return 'variableName';\n // Operators\n if (stream.match(/^[+\\-*\\/%=!<>&|^~?:]+/)) return 'keyword';\n stream.next();\n return null;\n }\n\n if (state.embeddedLang === 'style') {\n // ── CSS tokenizer ──\n // Comments\n if (stream.match(/^\\/\\*/)) {\n while (!stream.eol()) {\n if (stream.match(/\\*\\//)) return 'comment';\n stream.next();\n }\n return 'comment';\n }\n // Strings\n if (stream.match(/^[\"']/)) {\n const q = stream.current();\n while (!stream.eol()) {\n const ch = stream.next();\n if (ch === q && stream.string[stream.pos - 2] !== '\\\\') break;\n }\n return 'string';\n }\n // At-rules\n if (stream.match(/^@[a-zA-Z-]+/)) return 'keyword';\n // Hex colors\n if (stream.match(/^#[0-9a-fA-F]{3,8}\\b/)) return 'string';\n // Numbers with optional units\n if (stream.match(/^\\d+(\\.\\d+)?(px|em|rem|%|vh|vw|vmin|vmax|s|ms|deg|fr)?\\b/)) return 'number';\n // Property name (word before colon)\n if (stream.match(/^[a-zA-Z-]+(?=\\s*:)/)) return 'propertyName';\n // Selectors: .class / #id\n if (stream.match(/^[.#][a-zA-Z][\\w-]*/)) return 'className';\n // CSS keywords\n if (stream.match(/\\b(none|auto|inherit|initial|unset|normal|bold|italic|center|left|right|flex|grid|block|inline|relative|absolute|fixed|sticky|hidden|visible|scroll|cover|contain)\\b/)) return 'keyword';\n // Tag selectors\n if (stream.match(/^[a-zA-Z][\\w-]*/)) return 'typeName';\n // Punctuation\n if (stream.match(/^[{}();:,]/)) return 'keyword';\n stream.next();\n return null;\n }\n }\n\n // Inside code block → everything is comment\n if (state.inCodeBlock) {\n stream.skipToEnd();\n return 'comment';\n }\n\n // Inside {props} block\n if (state.inPropsBlock) {\n stream.eatSpace();\n\n if (stream.peek() === '}') {\n stream.next();\n state.inPropsBlock = false;\n state.inDirectiveHeader = false;\n state.lastPropKey = '';\n return 'keyword';\n }\n\n if (stream.match(/^\\.[a-zA-Z0-9_-]+/)) return 'className';\n if (stream.match(/^#[a-zA-Z0-9_-]+/)) return 'propertyName';\n\n const urlKeys = /^(url|href|image|src|icon)$/i;\n if (stream.match(/^[a-zA-Z][\\w-]*(?==)/)) {\n state.lastPropKey = stream.current();\n return 'propertyName';\n }\n if (stream.match(/^=/)) return 'keyword';\n if (stream.match(/^\"[^\"]*\"|^'[^']*'/)) {\n return urlKeys.test(state.lastPropKey) ? 'url' : 'string';\n }\n\n stream.next();\n return null;\n }\n\n // ── Line-start rules ──\n if (stream.sol()) {\n let match;\n if ((match = stream.match(/^\\s*(:::)\\s*/))) {\n const rest = stream.string.slice(stream.pos).trim();\n\n if (rest === '') {\n state.blockStack.pop();\n } else {\n const typeMatch = rest.match(/^([\\w-]+)/);\n state.blockStack.push(typeMatch ? typeMatch[1].toLowerCase() : 'generic');\n }\n\n state.inDirectiveHeader = true;\n return 'keyword';\n }\n\n if (stream.match(/^\\s*#[a-zA-Z][\\w-]*\\s*$/) && !stream.match(/^\\s*#{1,6}\\s/)) {\n return 'propertyName';\n }\n if (stream.match(/^\\s*(#{1,6})\\s+/)) return 'heading';\n if (stream.match(/^\\s*```/)) {\n state.inCodeBlock = true;\n stream.skipToEnd();\n return 'comment';\n }\n if (stream.match(/^\\s*([-*+]|\\d+\\.)\\s+/)) return 'variableName';\n if (stream.match(/^\\s*(---|___|(\\*\\s*){3,})\\s*$/)) return 'meta';\n if (stream.match(/^\\s*\\[TOC\\d?\\]/)) return 'keyword';\n }\n\n // ── Directive header ──\n if (state.inDirectiveHeader) {\n stream.eatSpace();\n if (stream.match(/^[\\w-]+/)) return 'typeName';\n if (stream.peek() === '{') {\n stream.next();\n state.inPropsBlock = true;\n state.inDirectiveHeader = true;\n return 'keyword';\n }\n state.inDirectiveHeader = false;\n }\n\n // ── Raw block content (HTML/CSS/JS) ──\n const currentBlockType = state.blockStack[state.blockStack.length - 1];\n if (currentBlockType === 'raw' && !state.inDirectiveHeader) {\n if (stream.eatSpace()) return null;\n if (stream.match(/^<\\/?[a-zA-Z0-9-]+/)) return 'typeName';\n if (stream.match(/^>/)) return 'typeName';\n if (stream.match(/^[{}]/)) return 'keyword';\n if (stream.match(/^--[a-zA-Z0-9_-]+/)) return 'variableName';\n if (stream.match(/^[a-zA-Z-]+(?=\\s*:)/)) return 'propertyName';\n if (stream.match(/^var\\([^)]+\\)/)) return 'variableName';\n if (stream.match(/^['\"`][^'\"`]*['\"`]/)) return 'string';\n if (stream.match(/^[#.][a-zA-Z0-9_-]+/)) return 'className';\n if (stream.match(/^:[a-zA-Z0-9_-]+/)) return 'keyword';\n if (stream.match(/\\b(const|let|var|function|return|if|else|for|while)\\b/)) return 'keyword';\n stream.next();\n return null;\n }\n\n // ── Image & Links ──\n if (state.imageState === 'expectUrl') {\n state.imageState = 'expectOptions';\n if (stream.eat('(')) {\n let parenLevel = 1;\n while (!stream.eol() && parenLevel > 0) {\n const next = stream.next();\n if (next === '(') parenLevel++;\n else if (next === ')' && stream.string[stream.pos - 2] !== '\\\\') parenLevel--;\n }\n return 'url';\n } else {\n state.imageState = 'none';\n }\n }\n if (state.imageState === 'expectOptions') {\n state.imageState = 'none';\n if (stream.eat('{')) {\n stream.eatWhile(/[^}]/);\n stream.eat('}');\n return 'attributeName';\n }\n }\n if (state.linkState === 'expectUrl') {\n state.linkState = 'none';\n if (stream.eat('(')) {\n let parenLevel = 1;\n while (!stream.eol() && parenLevel > 0) {\n const next = stream.next();\n if (next === '(') parenLevel++;\n else if (next === ')' && stream.string[stream.pos - 2] !== '\\\\') parenLevel--;\n }\n return 'url';\n }\n }\n\n // ── HTML tags (inline & block) - Mejorado con |$ para EOL ──\n if (stream.match(/^<\\/?[a-zA-Z][\\w-]*(?=[>\\s/]|$)/)) {\n const raw = stream.current();\n state.htmlTagName = raw.replace(/^<\\/?/, '').toLowerCase();\n state.isClosingHtmlTag = raw.startsWith('</');\n state.inHtmlBlock = true;\n return 'typeName';\n }\n\n // ── Inline formatting ──\n if (stream.match(/\\*\\*\\*.+?\\*\\*\\*/)) return 'strongEmphasis';\n if (stream.match(/\\*\\*.+?\\*\\*/)) return 'strong';\n if (stream.match(/!\\[[^\\]]*?\\]/)) {\n if (stream.peek() === '(') state.imageState = 'expectUrl';\n return 'string';\n }\n if (stream.match(/\\[[^\\]]+?\\]/)) {\n if (stream.peek() === '(') state.linkState = 'expectUrl';\n return 'string';\n }\n if (stream.match(/\\|\\[[^\\]]+?\\]\\|/)) return 'keyword';\n if (stream.match(/`[^`]+`/)) return 'comment';\n if (stream.match(/_(.+?)_/)) return 'emphasis';\n if (stream.match(/~~(.+?)~~/)) return 'strikethrough';\n if (stream.match(/!~(.+?)~!/)) return 'underline';\n if (stream.match(/==(.+?)==/)) return 'highlight';\n if (stream.match(/!>.+?<!/)) return 'comment';\n if (stream.match(/%[^%\\s]+?%[^%]+?%%/)) return 'string';\n if (stream.match(/->|<-|\\|/)) return 'meta';\n\n stream.next();\n return null;\n },\n\n tokenTable: {\n heading: t.heading,\n keyword: t.keyword,\n typeName: t.typeName,\n string: t.string,\n attributeName: t.attributeName,\n propertyName: t.propertyName,\n className: t.className,\n comment: t.comment,\n variableName: t.variableName,\n meta: t.meta,\n strong: t.strong,\n emphasis: t.emphasis,\n strongEmphasis: [t.strong, t.emphasis],\n strikethrough: t.strikethrough,\n underline: t.special(t.emphasis),\n highlight: t.special(t.comment),\n url: t.url,\n link: t.string,\n number: t.number,\n function: t.function(t.variableName),\n },\n});","import { useState, useEffect } from 'react';\n\n/**\n * useDebounce — delays updating a value until after a specified delay.\n * Useful for reducing expensive operations (like preview rendering) during rapid input.\n */\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n","import { useEffect, useRef } from 'react';\nimport { injectNRTailwindTheme, removeNRTailwindTheme } from '../vanilla/tailwindTheme';\n\n/**\n * useLazyTailwindCDN — Lazily injects the Tailwind CSS v4 Browser CDN\n * so that arbitrary Tailwind classes written in runtime markdown content\n * (:::raw, directives, ##{ } attrs, etc.) are resolved.\n *\n * - Only injects the <script> when `enabled` is true (e.g. preview mode).\n * - Removes the script when `enabled` becomes false (editor-only mode).\n * - This means zero CDN cost in editor-only mode.\n * - The v4 Browser CDN uses `@tailwindcss/browser` which JIT-compiles\n * classes from the DOM at runtime.\n * - preflight is DISABLED via inline config to avoid overriding app base styles.\n */\n\nconst CDN_URL = 'https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4';\nconst SCRIPT_ID = 'tailwind-cdn-v4-runtime';\nconst CONFIG_ID = 'tailwind-cdn-v4-config';\n\n// Tailwind v4 Browser CDN reads the theme from CSS @theme blocks already on the page.\n// No need to duplicate fonts/colors here — they're defined in src/index.css.\n// Only disable preflight to avoid injecting normalize.css over our base styles.\nconst TAILWIND_CDN_CONFIG = `\nwindow.tailwind = window.tailwind || {};\nwindow.tailwind.config = {\n corePlugins: {\n preflight: false,\n },\n};\n`;\n\ndeclare global {\n interface Window {\n __twCDNRefs?: number;\n tailwind?: { config: object; scan?: () => void };\n }\n}\n\n/**\n * Lazy CDN hook — only loads the Tailwind Browser CDN when `enabled` is true.\n * Call this from the component that hosts the preview panel.\n */\nexport function useLazyTailwindCDN(enabled: boolean) {\n const loadedRef = useRef(false);\n\n useEffect(() => {\n if (!enabled) {\n // When disabled: remove CDN scripts if no other consumers need them\n window.__twCDNRefs = (window.__twCDNRefs ?? 1) - 1;\n if ((window.__twCDNRefs ?? 0) <= 0) {\n document.getElementById(SCRIPT_ID)?.remove();\n document.getElementById(CONFIG_ID)?.remove();\n removeNRTailwindTheme();\n window.__twCDNRefs = 0;\n loadedRef.current = false;\n }\n return;\n }\n\n // When enabled: inject CDN scripts\n window.__twCDNRefs = (window.__twCDNRefs ?? 0) + 1;\n\n // Inject config script BEFORE the CDN\n if (!document.getElementById(CONFIG_ID)) {\n const configScript = document.createElement('script');\n configScript.id = CONFIG_ID;\n configScript.textContent = TAILWIND_CDN_CONFIG;\n document.head.appendChild(configScript);\n }\n\n // Inject the NoirMD @theme (primary, base-100, ...) so color\n // classes resolve — must precede the CDN script.\n injectNRTailwindTheme();\n\n // Inject the Tailwind v4 Browser CDN script\n if (!document.getElementById(SCRIPT_ID)) {\n const script = document.createElement('script');\n script.id = SCRIPT_ID;\n script.src = CDN_URL;\n document.head.appendChild(script);\n loadedRef.current = true;\n }\n\n return () => {\n window.__twCDNRefs = (window.__twCDNRefs ?? 1) - 1;\n if ((window.__twCDNRefs ?? 0) <= 0) {\n document.getElementById(SCRIPT_ID)?.remove();\n document.getElementById(CONFIG_ID)?.remove();\n removeNRTailwindTheme();\n window.__twCDNRefs = 0;\n loadedRef.current = false;\n }\n };\n }, [enabled]);\n}\n\n/**\n * Trigger a Tailwind CDN re-scan (use after DOM mutations with new classes).\n */\nexport function scanTailwindCDN() {\n const tw = (window as any).tailwind;\n if (tw?.scan) tw.scan();\n}\n\n/**\n * Preload the Tailwind Browser CDN right after page load.\n * Uses requestIdleCallback so it doesn't block the main thread.\n * By the time the user opens preview, the CDN is already loaded.\n */\nexport function preloadTailwindCDN() {\n // Already loaded — skip\n if (document.getElementById(SCRIPT_ID)) return;\n\n const inject = () => {\n if (document.getElementById(SCRIPT_ID)) return; // double-check\n\n // Inject config script\n if (!document.getElementById(CONFIG_ID)) {\n const configScript = document.createElement('script');\n configScript.id = CONFIG_ID;\n configScript.textContent = TAILWIND_CDN_CONFIG;\n document.head.appendChild(configScript);\n }\n\n // Inject the NoirMD @theme before the CDN script\n injectNRTailwindTheme();\n\n // Inject CDN script\n const script = document.createElement('script');\n script.id = SCRIPT_ID;\n script.src = CDN_URL;\n document.head.appendChild(script);\n\n window.__twCDNRefs = (window.__twCDNRefs ?? 0) + 1;\n };\n\n // Wait for idle — don't block initial render\n if ('requestIdleCallback' in window) {\n (window as any).requestIdleCallback(inject, { timeout: 2000 });\n } else {\n // Fallback: load after a short delay\n setTimeout(inject, 200);\n }\n}\n\nexport function useTailwindCDN() {\n useLazyTailwindCDN(true);\n}\n","// ============================================================\n// NoirMD Vanilla — Tailwind v4 theme injection\n//\n// When the host enables the Tailwind Browser CDN (tailwindCDN\n// prop), Tailwind classes authored inside markdown (:::div,\n// :::raw, attrs, ...) are JIT-compiled at runtime. For color\n// utilities like `bg-primary` / `text-secondary` to resolve,\n// Tailwind v4 needs an `@theme` block registering --color-*\n// keys.\n//\n// This module injects a <style type=\"text/tailwindcss\"> block\n// with a daisyUI-compatible @theme (primary, secondary, accent,\n// neutral, base-100/200/300, base-content, info, success,\n// warning, error) wired to the host's --color-* variables, with\n// NoirMD defaults as fallback.\n//\n// Safety: if the host already provides a theme (daisyUI, a\n// Tailwind @theme block, or --color-* theme variables),\n// injection is skipped so the module never overrides the host\n// palette.\n// ============================================================\n\nconst THEME_STYLE_ID = 'nr-tailwind-theme';\n\n// daisyUI 5 / Tailwind v4 convention: the palette lives in\n// --color-* theme variables. Values resolve host vars first\n// (app --color-*, then daisyUI v4 --p/--b1/... components), and\n// fall back to NoirMD defaults. Never references --nr-* (would\n// create a circular dependency with the --nr-accent chain).\nconst NR_THEME_CSS = `\n@theme {\n --color-primary: var(--color-accent-primary, oklch(var(--p, 55% 0.3 240) / 1));\n --color-primary-content: #ffffff;\n --color-secondary: oklch(var(--s, 55% 0.25 200) / 1);\n --color-secondary-content: #ffffff;\n --color-accent: var(--color-accent-primary, oklch(var(--a, 65% 0.25 160) / 1));\n --color-accent-content: #ffffff;\n --color-neutral: oklch(var(--n, 50% 0.05 240) / 1);\n --color-neutral-content: var(--color-text-primary, oklch(var(--nc, 92% 0.02 240) / 1));\n --color-base-100: var(--color-background-primary, oklch(var(--b1, 15% 0.01 260) / 1));\n --color-base-200: var(--color-background-secondary-solid, oklch(var(--b2, 20% 0.02 260) / 1));\n --color-base-300: var(--color-border, oklch(var(--b3, 25% 0.03 260) / 1));\n --color-base-content: var(--color-text-primary, oklch(var(--bc, 92% 0.02 260) / 1));\n --color-info: oklch(var(--in, 70% 0.2 220) / 1);\n --color-info-content: #ffffff;\n --color-success: oklch(var(--su, 65% 0.25 140) / 1);\n --color-success-content: #ffffff;\n --color-warning: oklch(var(--wa, 80% 0.25 80) / 1);\n --color-warning-content: #1f2937;\n --color-error: oklch(var(--er, 65% 0.3 30) / 1);\n --color-error-content: #ffffff;\n}\n`;\n\nfunction getVar(root: HTMLElement, name: string): string {\n return getComputedStyle(root).getPropertyValue(name).trim();\n}\n\nfunction stylesheetHasTheme(): boolean {\n for (const sheet of Array.from(document.styleSheets)) {\n let rules: CSSRuleList | null = null;\n try {\n rules = sheet.cssRules;\n } catch {\n continue; // cross-origin stylesheet — rules are inaccessible\n }\n if (!rules) continue;\n for (const rule of Array.from(rules)) {\n const css = rule.cssText || '';\n if (css.includes('@theme') || css.includes('@plugin \"daisyui\"')) return true;\n }\n }\n return false;\n}\n\n/**\n * Detect whether the host page already provides a color theme\n * (daisyUI, a Tailwind @theme block, or --color-* variables).\n */\nexport function hasHostTheme(): boolean {\n if (typeof window === 'undefined' || typeof document === 'undefined') return true;\n if (getVar(document.documentElement, '--color-primary')) return true;\n if (getVar(document.documentElement, '--color-base-100')) return true;\n if (document.body && (getVar(document.body, '--color-primary') || getVar(document.body, '--color-base-100'))) return true;\n return stylesheetHasTheme();\n}\n\n/**\n * Inject the NoirMD @theme block so Tailwind CDN color classes\n * (bg-primary, text-secondary, ...) resolve inside markdown.\n * Skipped when the host already defines a theme. Idempotent.\n */\nexport function injectNRTailwindTheme(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById(THEME_STYLE_ID)) return;\n if (hasHostTheme()) return;\n\n const style = document.createElement('style');\n style.id = THEME_STYLE_ID;\n style.setAttribute('type', 'text/tailwindcss');\n style.textContent = NR_THEME_CSS;\n document.head.appendChild(style);\n}\n\n/**\n * Remove the injected NoirMD @theme block (idempotent).\n */\nexport function removeNRTailwindTheme(): void {\n if (typeof document === 'undefined') return;\n document.getElementById(THEME_STYLE_ID)?.remove();\n}","import React, { useEffect, useRef } from 'react';\nimport { renderMarkdownString } from '../vanilla/renderer';\nimport { scrollToId } from '../core/utils';\nimport { scanTailwindCDN } from './useTailwindCDN';\n\ninterface CustomMarkdownRendererProps {\n content: string;\n}\n\n/**\n * CustomMarkdownRenderer — thin React wrapper around the vanilla renderer.\n *\n * Pipeline:\n * content (string) → renderMarkdownString() → HTMLElement → mounted\n *\n * The vanilla engine handles all rendering, directives and events;\n * React only owns the mount point. Note: rendering happens on the\n * client (useEffect); the server render is an empty placeholder.\n */\nconst CustomMarkdownRenderer: React.FC<CustomMarkdownRendererProps> = ({ content }) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n // Clear previous content and mount the vanilla-rendered element\n container.replaceChildren();\n container.appendChild(renderMarkdownString(content));\n\n // Resolve any Tailwind classes in user-authored content (no-op if CDN not loaded)\n scanTailwindCDN();\n\n // Scroll to hash on load and hash changes\n const handleHashChange = () => {\n const hash = window.location.hash;\n if (hash) {\n const parts = hash.split('#');\n scrollToId(parts[parts.length - 1]);\n }\n };\n handleHashChange();\n window.addEventListener('hashchange', handleHashChange);\n return () => window.removeEventListener('hashchange', handleHashChange);\n }, [content]);\n\n return <div ref={containerRef} />;\n};\n\nexport default CustomMarkdownRenderer;","import type { CSSProperties } from './types';\n\n/**\n * Parse an inline CSS string (e.g. \"color: red; padding: 1rem\") into a CSSProperties object.\n */\nexport function parseCssString(cssText: string): CSSProperties {\n if (!cssText) return {};\n return cssText\n .split(';')\n .filter(Boolean)\n .reduce<CSSProperties>((styleObj, styleString) => {\n const parts = styleString.split(':');\n if (parts.length < 2) return styleObj;\n const key = parts[0].trim().replace(/-([a-z])/g, (_, g) => g.toUpperCase());\n const value = parts.slice(1).join(':').trim();\n styleObj[key] = value;\n return styleObj;\n }, {});\n}\n\n/**\n * Generate a URL-safe slug from text (NFD decomposition, strip accents, lowercase, hyphenate).\n */\nexport function generateId(text: string): string {\n return text\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/\\s+/g, '-');\n}\n\n/**\n * Smooth-scroll to an element by its ID.\n */\nexport function scrollToId(id: string): void {\n if (typeof document === 'undefined') return;\n const element = document.getElementById(id);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n}\n\n/**\n * Parse attribute suffix like `##{.my-class #my-id}` from a text line.\n * Returns the cleaned text, extracted classes, and id.\n */\nexport function extractAttributes(text: string): { text: string; classes: string; id: string } {\n const match = text.match(/^(.*?)\\s*##\\{([^}]*)\\}\\s*$/);\n if (!match) return { text, classes: '', id: '' };\n\n const rawAttrs = match[2];\n const cleanedText = match[1];\n\n const classList: string[] = [];\n let id = '';\n\n // 1. Parse key=\"value\" attributes (e.g., class=\"mt-0 px-4\", id=\"section\")\n for (const [, key, value] of rawAttrs.matchAll(/([\\w-]+)=\"([^\"]*)\"/g)) {\n if (key === 'class') {\n classList.push(...value.split(/\\s+/).filter(Boolean));\n } else if (key === 'id') {\n id = value;\n }\n }\n\n // 2. Parse shorthand tokens: .className and #id (from remaining content)\n // Supports classes with / (opacity), ! (important), . (arbitrary values)\n const stripped = rawAttrs.replace(/[\\w-]+=\"[^\"]*\"/g, '');\n for (const token of stripped.split(/\\s+/).filter(Boolean)) {\n if (token.startsWith('.')) classList.push(token.slice(1));\n else if (token.startsWith('#') && !id) id = token.slice(1);\n }\n\n return { text: cleanedText, classes: classList.join(' '), id };\n}\n\nlet _scopeCounter = 0;\nexport function resetScopeCounter(): void {\n _scopeCounter = 0;\n}\n\n/**\n * Generate a unique scope ID for CSS isolation.\n */\nexport function generateScopeId(): string {\n return `scope-${++_scopeCounter}`;\n}\n\n/**\n * Parse props from a `{key=\"value\" key2=\"value2\"}` string.\n * Also supports `.className` shorthand → adds to `class` prop.\n * Also supports `#id` shorthand → adds to `id` prop.\n */\nexport function parseProps(propsString: string): Record<string, string> {\n const props: Record<string, string> = {};\n if (!propsString?.trim()) return props;\n\n // Match key=\"value\" or key='value' pairs\n const pairRegex = /(\\w[\\w-]*)=(?:\"([^\"]*)\"|'([^']*)')/g;\n let match;\n while ((match = pairRegex.exec(propsString)) !== null) {\n const key = match[1];\n const value = match[2] ?? match[3] ?? '';\n props[key] = value;\n }\n\n // Extract .className shorthand (supports / for opacity, ! for important, . for arbitrary values)\n const classMatches = propsString.match(/\\.([a-zA-Z0-9_!/.\\-]+)/g);\n if (classMatches) {\n const existing = props['class'] || '';\n const newClasses = classMatches.map(c => c.substring(1)).join(' ');\n props['class'] = existing ? `${existing} ${newClasses}` : newClasses;\n }\n\n // Extract #id shorthand (only if not inside a key=\"value\" pair)\n const idMatch = propsString.match(/#([a-zA-Z0-9_-]+)(?=\\s|}|$)/);\n if (idMatch && !props['id']) {\n props['id'] = idMatch[1];\n }\n\n return props;\n}\n\n/**\n * Parse raw HTML attributes string (e.g. `class=\"...\" style=\"...\" data-foo=\"...\"`)\n * into a plain props object.\n *\n * NOTE: This does NOT rename `class` → `className`. Framework adapters\n * (React, Vue, etc.) should handle their own attribute name mapping.\n */\nexport function parseHtmlAttrs(attrsString: string): Record<string, any> {\n const props: Record<string, any> = {};\n if (!attrsString?.trim()) return props;\n\n const pairRegex = /([a-zA-Z0-9_-]+)(?:=(?:\"([^\"]*)\"|'([^']*)'|([^\\s>]+)))?/g;\n let match;\n while ((match = pairRegex.exec(attrsString)) !== null) {\n const key = match[1];\n const value = match[2] ?? match[3] ?? match[4] ?? true;\n\n // Parse style strings into objects\n if (key === 'style' && typeof value === 'string') {\n props[key] = parseCssString(value);\n } else {\n props[key] = value;\n }\n }\n\n return props;\n}\n","import type { Token, DirectiveToken, HtmlBlockToken, CSSProperties } from './types';\r\nimport { generateId, generateScopeId, parseProps, extractAttributes } from './utils';\r\n\r\n/**\r\n * V2 Markdown Parser — line-by-line state machine (framework-agnostic).\r\n */\r\nexport function parseMarkdown(markdown: string): Token[] {\r\n if (!markdown) return [];\r\n const lines = markdown.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '').split('\\n');\r\n const result: Token[] = [];\r\n const usedIds = new Set<string>();\r\n let i = 0;\r\n\r\n while (i < lines.length) {\r\n const line = lines[i];\r\n const trimmed = line.trim();\r\n let match: RegExpMatchArray | null;\r\n\r\n // ── Headers: ## Title ──\r\n if ((match = trimmed.match(/^(#{1,6})\\s+(.+)$/))) {\r\n const level = match[1].length;\r\n const rawText = match[2];\r\n const { text, classes, id: customId } = extractAttributes(rawText);\r\n const baseId = customId || generateId(text.replace(/->|<-/g, ''));\r\n let id = baseId;\r\n let n = 1;\r\n while (usedIds.has(id)) {\r\n n++;\r\n id = `${baseId}-${n}`;\r\n }\r\n usedIds.add(id);\r\n result.push({ type: 'header', level, text, id, classes: classes || undefined });\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── Aligned paragraph: -> text <- or -> text -> ──\r\n if ((match = trimmed.match(/^->\\s*(.+?)\\s*(<-|->)\\s*$/))) {\r\n const content = match[1];\r\n const align = match[2] === '<-' ? 'center' : 'right';\r\n result.push({ type: 'paragraph', content, align });\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── Code block: ```lang title=\"name\" ──\r\n if (trimmed.startsWith('```')) {\r\n const fenceHeader = trimmed.slice(3).trim();\r\n const titleMatch = fenceHeader.match(/title=[\"']([^\"']*)[\"']/);\r\n const lang = fenceHeader.replace(/title=[\"'][^\"']*[\"']/, '').trim();\r\n const title = titleMatch ? titleMatch[1] : undefined;\r\n const content: string[] = [];\r\n i++;\r\n while (i < lines.length && !lines[i].trim().startsWith('```')) {\r\n content.push(lines[i]);\r\n i++;\r\n }\r\n result.push({ type: 'codeblock', language: lang, title, content: content.join('\\n') });\r\n i++; // skip closing ```\r\n continue;\r\n }\r\n\r\n // ── Directive: :::type {props} ... ::: ──\r\n if (trimmed.startsWith(':::')) {\r\n const rest = trimmed.slice(3).trim();\r\n\r\n // Bare closing marker\r\n if (rest === '') {\r\n result.push({ type: 'paragraph', content: line });\r\n i++;\r\n continue;\r\n }\r\n\r\n const typeMatch = rest.match(/^([\\w-]+)/);\r\n const directiveType = typeMatch ? typeMatch[1] : 'custom';\r\n\r\n // Lookahead: find the matching closing :::\r\n let j = i + 1;\r\n let nestedLevel = 0;\r\n let foundClose = false;\r\n\r\n while (j < lines.length) {\r\n const currentTrimmed = lines[j].trim();\r\n if (currentTrimmed === ':::') {\r\n if (nestedLevel === 0) {\r\n foundClose = true;\r\n break;\r\n } else {\r\n nestedLevel--;\r\n }\r\n } else if (currentTrimmed.startsWith(':::')) {\r\n // Opening a nested directive\r\n nestedLevel++;\r\n }\r\n j++;\r\n }\r\n\r\n if (foundClose) {\r\n // Collect raw content lines (between opening and closing)\r\n const contentLines: string[] = [];\r\n for (let k = i + 1; k < j; k++) {\r\n contentLines.push(lines[k]);\r\n }\r\n const rawContent = contentLines.join('\\n');\r\n\r\n // Parse the directive header (everything after the type name)\r\n const headerRest = typeMatch ? rest.slice(directiveType.length).trim() : rest;\r\n\r\n // Extract {props} block\r\n let propsString = '';\r\n let shortForm = '';\r\n const propsBlockMatch = headerRest.match(/^\\{([^]*)\\}\\s*$/);\r\n if (propsBlockMatch) {\r\n propsString = propsBlockMatch[1];\r\n } else if (headerRest) {\r\n // Short-form: bare text after type → becomes title prop\r\n shortForm = headerRest;\r\n }\r\n\r\n const props = parseProps(propsString);\r\n if (shortForm && !props['title']) {\r\n props['title'] = shortForm;\r\n }\r\n\r\n // Split content into slots\r\n const slots = splitSlots(rawContent);\r\n\r\n result.push({\r\n type: 'directive',\r\n directiveType,\r\n props,\r\n slots,\r\n scopeId: generateScopeId(),\r\n } as DirectiveToken);\r\n\r\n i = j + 1;\r\n continue;\r\n } else {\r\n // Unclosed directive — render as plain text\r\n result.push({ type: 'paragraph', content: line });\r\n i++;\r\n continue;\r\n }\r\n }\r\n\r\n // ── Image: {w:h} ──\r\n if ((match = trimmed.match(/^(.*?)!\\[([^\\]]*)\\]\\(([^)]+?)\\)(?:\\{([^}]+?)\\})?(.*)$/))) {\r\n const [, preText, alt, srcAndFloat, size, postText] = match;\r\n\r\n if (preText.trim()) {\r\n result.push({ type: 'paragraph', content: preText.trim() });\r\n }\r\n\r\n let src = srcAndFloat;\r\n const style: CSSProperties = {};\r\n if (src.includes('#left')) {\r\n src = src.replace('#left', '');\r\n style.float = 'left';\r\n style.margin = '0 1em 1em 0';\r\n } else if (src.includes('#right')) {\r\n src = src.replace('#right', '');\r\n style.float = 'right';\r\n style.margin = '0 0 1em 1em';\r\n } else if (src.includes('#center')) {\r\n src = src.replace('#center', '');\r\n style.display = 'block';\r\n style.margin = '0 auto 1em auto';\r\n }\r\n if (size) {\r\n const [width, height] = size.split(':');\r\n if (width) style.width = width.trim();\r\n if (height) style.height = height.trim();\r\n }\r\n result.push({ type: 'image', alt, src, style });\r\n\r\n if (postText.trim()) {\r\n result.push({ type: 'paragraph', content: postText.trim() });\r\n }\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── Table: | cell | cell | ──\r\n if (trimmed.includes('|') && i + 1 < lines.length && lines[i + 1].includes('---')) {\r\n const tableLines = [line];\r\n i++;\r\n tableLines.push(lines[i]);\r\n i++;\r\n while (i < lines.length && lines[i].trim().includes('|')) {\r\n tableLines.push(lines[i]);\r\n i++;\r\n }\r\n result.push({ type: 'table', content: tableLines.join('\\n') });\r\n continue;\r\n }\r\n\r\n // ── List: - item or 1. item ──\r\n if ((match = trimmed.match(/^(\\s*)([-*+]|\\d+\\.)\\s+(.+)$/))) {\r\n const listItems = [line];\r\n i++;\r\n while (i < lines.length) {\r\n const nextLine = lines[i];\r\n const nextTrimmed = nextLine.trim();\r\n if (\r\n nextTrimmed.match(/^(\\s*)([-*+]|\\d+\\.)\\s+(.+)$/) ||\r\n nextTrimmed === '' ||\r\n nextLine.startsWith(' ')\r\n ) {\r\n listItems.push(nextLine);\r\n i++;\r\n } else {\r\n break;\r\n }\r\n }\r\n result.push({ type: 'list', content: listItems.join('\\n') });\r\n continue;\r\n }\r\n\r\n // ── Blockquote: > text ──\r\n if (trimmed.startsWith('>')) {\r\n const quoteLines = [line];\r\n i++;\r\n while (i < lines.length && (lines[i].trim().startsWith('>') || lines[i].trim() === '')) {\r\n quoteLines.push(lines[i]);\r\n i++;\r\n }\r\n const rawQuote = quoteLines.join('\\n').replace(/^>\\s?/gm, '');\r\n const { text, classes, id } = extractAttributes(rawQuote);\r\n result.push({ type: 'blockquote', content: text, classes: classes || undefined, id });\r\n continue;\r\n }\r\n\r\n // ── Horizontal rule: --- or ___ or *** ──\r\n if (/^(---|___|(\\*\\s*){3,})\\s*$/.test(trimmed)) {\r\n result.push({ type: 'hr' });\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── TOC: [TOC] or [TOC2] ──\r\n if (/^\\[TOC\\d?\\]\\s*$/.test(trimmed)) {\r\n result.push({ type: 'toc' });\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── Empty line ──\r\n if (trimmed === '') {\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── HTML Block: <tag ...> ──\r\n let tagStartMatch = trimmed.match(/^<([a-zA-Z][\\w-]*)/);\r\n if (tagStartMatch) {\r\n const tagName = tagStartMatch[1].toLowerCase();\r\n\r\n const voidElements = new Set([\r\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\r\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\r\n ]);\r\n\r\n const remainingText = lines.slice(i).join('\\n');\r\n\r\n // Find the full opening tag even with multi-line attributes\r\n const openTagRegex = new RegExp(`^\\\\s*<${tagName}\\\\b([^>]*?)>`, 'i');\r\n const openTagMatch = remainingText.match(openTagRegex);\r\n\r\n if (openTagMatch) {\r\n const fullOpenTag = openTagMatch[0];\r\n const attrs = openTagMatch[1].replace(/\\s+/g, ' ').trim();\r\n\r\n const isSelfClosing = fullOpenTag.endsWith('/>') || voidElements.has(tagName);\r\n\r\n if (isSelfClosing) {\r\n const blockText = remainingText.substring(0, openTagMatch.index! + fullOpenTag.length);\r\n const consumedLines = blockText.split('\\n').length;\r\n\r\n result.push({\r\n type: 'html-block',\r\n tag: tagName,\r\n attrs: attrs,\r\n children: [] // No children\r\n } as HtmlBlockToken);\r\n\r\n i += consumedLines;\r\n continue;\r\n } else {\r\n // Tag with content — search for its closing tag\r\n let nestedLevel = 0;\r\n let closeIndex = -1;\r\n let closeTagLength = 0;\r\n\r\n const tagRegex = new RegExp(`</?${tagName}\\\\b[^>]*>`, 'gi');\r\n tagRegex.lastIndex = openTagMatch.index! + fullOpenTag.length;\r\n\r\n let execMatch;\r\n while ((execMatch = tagRegex.exec(remainingText)) !== null) {\r\n if (execMatch[0].startsWith('</')) {\r\n nestedLevel--;\r\n if (nestedLevel < 0) {\r\n closeIndex = execMatch.index;\r\n closeTagLength = execMatch[0].length;\r\n break;\r\n }\r\n } else {\r\n if (!execMatch[0].endsWith('/>')) {\r\n nestedLevel++;\r\n }\r\n }\r\n }\r\n\r\n if (closeIndex !== -1) {\r\n const fullBlock = remainingText.substring(0, closeIndex + closeTagLength);\r\n const consumedLines = fullBlock.split('\\n').length;\r\n\r\n // style/script blocks should not be parsed as Markdown\r\n if (tagName === 'style' || tagName === 'script') {\r\n result.push({\r\n type: 'html',\r\n content: fullBlock,\r\n scopeId: generateScopeId(),\r\n });\r\n } else {\r\n const innerContent = remainingText.substring(openTagMatch.index! + fullOpenTag.length, closeIndex);\r\n result.push({\r\n type: 'html-block',\r\n tag: tagName,\r\n attrs: attrs,\r\n children: parseMarkdown(innerContent)\r\n } as HtmlBlockToken);\r\n }\r\n\r\n i += consumedLines;\r\n continue;\r\n } else {\r\n // Fallback: unclosed tag → treat as self-closing to avoid consuming the whole document\r\n const blockText = remainingText.substring(0, openTagMatch.index! + fullOpenTag.length);\r\n const consumedLines = blockText.split('\\n').length;\r\n\r\n result.push({\r\n type: 'html-block',\r\n tag: tagName,\r\n attrs: attrs,\r\n children: []\r\n } as HtmlBlockToken);\r\n\r\n i += consumedLines;\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // ── Paragraph (default) ──\r\n const paragraphLines = [line];\r\n i++;\r\n while (i < lines.length) {\r\n const nextLine = lines[i];\r\n const nextTrimmed = nextLine.trim();\r\n if (\r\n nextTrimmed === '' ||\r\n nextTrimmed.startsWith('#') ||\r\n nextTrimmed.startsWith(':::') ||\r\n nextTrimmed.includes('|') ||\r\n nextTrimmed.match(/^(\\s*)([-*+]|\\d+\\.)\\s+/) ||\r\n nextTrimmed.startsWith('>') ||\r\n nextTrimmed.startsWith('```') ||\r\n nextTrimmed.startsWith('->') ||\r\n nextTrimmed.match(/^<([a-zA-Z][\\w-]*)\\b/)\r\n ) {\r\n break;\r\n }\r\n paragraphLines.push(nextLine);\r\n i++;\r\n }\r\n const rawParagraph = paragraphLines.join('\\n').trim();\r\n const { text, classes, id } = extractAttributes(rawParagraph);\r\n result.push({ type: 'paragraph', content: text, classes: classes || undefined, id });\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// ─────────────────────────────────────────────\r\n// Slot splitting\r\n// ─────────────────────────────────────────────\r\n\r\n/**\r\n * Split directive content into named slots.\r\n * A line that is exactly `#slotname` starts a new slot.\r\n * Content before any `#slotname` goes into the \"default\" slot.\r\n *\r\n * IMPORTANT: This is nesting-aware — `#slotname` markers inside nested\r\n * directives (:::child ... :::) are NOT treated as slot boundaries of\r\n * the outer directive. Only `#slotname` at depth 0 are considered.\r\n */\r\nfunction splitSlots(rawContent: string): Record<string, string> {\r\n const slots: Record<string, string> = {};\r\n const lines = rawContent.split('\\n');\r\n let currentSlot = 'default';\r\n let buffer: string[] = [];\r\n let nestingDepth = 0;\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n\r\n // Track nesting of directives\r\n if (trimmed.startsWith(':::')) {\r\n const rest = trimmed.slice(3).trim();\r\n if (rest === '') {\r\n // Closing marker (bare :::)\r\n nestingDepth = Math.max(0, nestingDepth - 1);\r\n } else {\r\n nestingDepth++;\r\n }\r\n }\r\n\r\n // Only consider slot boundaries at depth 0\r\n if (nestingDepth === 0 && trimmed.match(/^#([\\w-]+)$/)) {\r\n // Save previous slot\r\n if (buffer.length > 0 || currentSlot !== 'default') {\r\n slots[currentSlot] = buffer.join('\\n').trim();\r\n }\r\n currentSlot = trimmed.slice(1);\r\n buffer = [];\r\n } else {\r\n buffer.push(line);\r\n }\r\n }\r\n\r\n // Save last slot\r\n slots[currentSlot] = buffer.join('\\n').trim();\r\n\r\n return slots;\r\n}\r\n","import hljs from 'highlight.js/lib/core';\n\nimport javascript from 'highlight.js/lib/languages/javascript';\nimport typescript from 'highlight.js/lib/languages/typescript';\nimport python from 'highlight.js/lib/languages/python';\nimport css from 'highlight.js/lib/languages/css';\nimport xml from 'highlight.js/lib/languages/xml';\nimport json from 'highlight.js/lib/languages/json';\nimport bash from 'highlight.js/lib/languages/bash';\nimport sql from 'highlight.js/lib/languages/sql';\nimport markdown from 'highlight.js/lib/languages/markdown';\nimport java from 'highlight.js/lib/languages/java';\nimport csharp from 'highlight.js/lib/languages/csharp';\nimport cpp from 'highlight.js/lib/languages/cpp';\nimport go from 'highlight.js/lib/languages/go';\nimport rust from 'highlight.js/lib/languages/rust';\nimport php from 'highlight.js/lib/languages/php';\nimport ruby from 'highlight.js/lib/languages/ruby';\nimport swift from 'highlight.js/lib/languages/swift';\nimport kotlin from 'highlight.js/lib/languages/kotlin';\nimport dart from 'highlight.js/lib/languages/dart';\nimport yaml from 'highlight.js/lib/languages/yaml';\nimport toml from 'highlight.js/lib/languages/ini';\nimport dockerfile from 'highlight.js/lib/languages/dockerfile';\nimport diff from 'highlight.js/lib/languages/diff';\nimport shell from 'highlight.js/lib/languages/shell';\n\nhljs.registerLanguage('javascript', javascript);\nhljs.registerLanguage('js', javascript);\nhljs.registerLanguage('jsx', javascript);\nhljs.registerLanguage('typescript', typescript);\nhljs.registerLanguage('ts', typescript);\nhljs.registerLanguage('tsx', typescript);\nhljs.registerLanguage('python', python);\nhljs.registerLanguage('py', python);\nhljs.registerLanguage('css', css);\nhljs.registerLanguage('html', xml);\nhljs.registerLanguage('xml', xml);\nhljs.registerLanguage('svg', xml);\nhljs.registerLanguage('json', json);\nhljs.registerLanguage('bash', bash);\nhljs.registerLanguage('sh', bash);\nhljs.registerLanguage('zsh', bash);\nhljs.registerLanguage('sql', sql);\nhljs.registerLanguage('markdown', markdown);\nhljs.registerLanguage('md', markdown);\nhljs.registerLanguage('java', java);\nhljs.registerLanguage('csharp', csharp);\nhljs.registerLanguage('cs', csharp);\nhljs.registerLanguage('cpp', cpp);\nhljs.registerLanguage('go', go);\nhljs.registerLanguage('rust', rust);\nhljs.registerLanguage('php', php);\nhljs.registerLanguage('ruby', ruby);\nhljs.registerLanguage('swift', swift);\nhljs.registerLanguage('kotlin', kotlin);\nhljs.registerLanguage('dart', dart);\nhljs.registerLanguage('yaml', yaml);\nhljs.registerLanguage('toml', toml);\nhljs.registerLanguage('dockerfile', dockerfile);\nhljs.registerLanguage('diff', diff);\nhljs.registerLanguage('shell', shell);\n\nexport default hljs;\n","// ============================================================\r\n// Vanilla UI Component Factories\r\n//\r\n// Each function returns a native HTMLElement. No React, no Tailwind.\r\n// Styling comes from vanilla.css via class names.\r\n// ============================================================\r\n\r\nimport hljs from './highlightSetup';\r\n\r\n// ── Icon ──────────────────────────────────────────────────\r\n\r\n/**\r\n * Create a Material Icons Round icon element.\r\n */\r\nexport function createIcon(iconName: string, extraClasses?: string): HTMLElement {\r\n const span = document.createElement('span');\r\n const cls = `nr-icon material-icons-round${extraClasses ? ` ${extraClasses}` : ''}`;\r\n span.className = cls;\r\n span.setAttribute('aria-hidden', 'true');\r\n\r\n const isCodepoint = /^[eE][0-9a-fA-F]{3,4}$/.test(iconName);\r\n if (isCodepoint) {\r\n span.innerHTML = `&#x${iconName};`;\r\n } else {\r\n span.textContent = iconName;\r\n }\r\n return span;\r\n}\r\n\r\n// ── CodeBlock ─────────────────────────────────────────────\r\n\r\n/**\r\n * Create a syntax-highlighted code block with copy button.\r\n */\r\nexport function createCodeBlock(code: string, language: string, title?: string): HTMLElement {\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'nr-codeblock';\r\n\r\n const lang = language?.split(/[\\s{]/)[0]?.trim() || '';\r\n\r\n // Title bar\r\n if (title) {\r\n const header = document.createElement('div');\r\n header.className = 'nr-codeblock__header';\r\n header.appendChild(createIcon('description'));\r\n const titleSpan = document.createElement('span');\r\n titleSpan.textContent = title;\r\n header.appendChild(titleSpan);\r\n wrapper.appendChild(header);\r\n }\r\n\r\n // Code area\r\n const pre = document.createElement('pre');\r\n pre.className = 'nr-codeblock__pre';\r\n const codeEl = document.createElement('code');\r\n codeEl.className = `language-${lang || 'plaintext'}`;\r\n\r\n try {\r\n if (lang && hljs.getLanguage(lang)) {\r\n codeEl.innerHTML = hljs.highlight(code, { language: lang }).value;\r\n } else {\r\n codeEl.innerHTML = hljs.highlightAuto(code).value;\r\n }\r\n } catch {\r\n codeEl.textContent = code;\r\n }\r\n\r\n pre.appendChild(codeEl);\r\n wrapper.appendChild(pre);\r\n\r\n // Copy button\r\n const copyBtn = document.createElement('button');\r\n copyBtn.className = 'nr-codeblock__copy';\r\n copyBtn.title = 'Copy code';\r\n const copyIcon = createIcon('content_copy');\r\n copyIcon.style.fontSize = '1rem';\r\n copyBtn.appendChild(copyIcon);\r\n\r\n let timer: ReturnType<typeof setTimeout> | null = null;\r\n copyBtn.addEventListener('click', () => {\r\n navigator.clipboard.writeText(code);\r\n copyIcon.textContent = 'check';\r\n if (timer) clearTimeout(timer);\r\n timer = setTimeout(() => { copyIcon.textContent = 'content_copy'; }, 1800);\r\n });\r\n\r\n wrapper.appendChild(copyBtn);\r\n return wrapper;\r\n}\r\n\r\n// ── Admonition ────────────────────────────────────────────\r\n\r\nconst DEFAULT_ADMONITION_ICONS: Record<string, string> = {\r\n note: 'info',\r\n info: 'lightbulb',\r\n warning: 'warning',\r\n danger: 'report',\r\n greentext: 'subdirectory_arrow_right',\r\n};\r\n\r\n/**\r\n * Create an admonition (alert) box.\r\n * Content should be appended by the caller.\r\n */\r\nexport function createAdmonition(\r\n type: string,\r\n title?: string,\r\n icon?: string,\r\n): HTMLElement {\r\n const el = document.createElement('div');\r\n el.className = `nr-admonition nr-admonition--${type || 'note'}`;\r\n\r\n if (title) {\r\n const header = document.createElement('h5');\r\n header.className = 'nr-admonition__title';\r\n const iconToRender = icon || DEFAULT_ADMONITION_ICONS[type] || 'info';\r\n header.appendChild(createIcon(iconToRender, 'nr-admonition__icon'));\r\n const titleSpan = document.createElement('span');\r\n titleSpan.textContent = title;\r\n header.appendChild(titleSpan);\r\n el.appendChild(header);\r\n }\r\n\r\n const body = document.createElement('div');\r\n body.className = 'nr-admonition__body';\r\n el.appendChild(body);\r\n\r\n return el;\r\n}\r\n\r\n// ── Details (Collapsible) ─────────────────────────────────\r\n\r\n/**\r\n * Create a native <details> collapsible section.\r\n * Content should be appended to the body div.\r\n */\r\nexport function createDetails(\r\n title: string,\r\n icon?: string,\r\n defaultOpen?: boolean,\r\n): HTMLElement {\r\n const details = document.createElement('details');\r\n details.className = 'nr-details';\r\n if (defaultOpen) details.open = true;\r\n\r\n const summary = document.createElement('summary');\r\n summary.className = 'nr-details__summary';\r\n\r\n const iconToRender = icon || 'play_arrow';\r\n const iconEl = createIcon(iconToRender, 'nr-details__icon');\r\n summary.appendChild(iconEl);\r\n\r\n const titleSpan = document.createElement('span');\r\n titleSpan.textContent = title || 'Details';\r\n summary.appendChild(titleSpan);\r\n\r\n // Rotate icon on toggle\r\n details.addEventListener('toggle', () => {\r\n iconEl.classList.toggle('nr-details__icon--open', details.open);\r\n });\r\n\r\n details.appendChild(summary);\r\n\r\n const body = document.createElement('div');\r\n body.className = 'nr-details__body';\r\n details.appendChild(body);\r\n\r\n return details;\r\n}\r\n\r\n// ── Modal (Native <dialog>) ───────────────────────────────\r\n\r\n/**\r\n * Create a native <dialog> modal.\r\n * Content should be appended to the body div.\r\n */\r\nexport function createModal(title: string): HTMLDialogElement {\r\n const dialog = document.createElement('dialog');\r\n dialog.className = 'nr-modal';\r\n\r\n // Backdrop click to close\r\n dialog.addEventListener('click', (e) => {\r\n if (e.target === dialog) {\r\n dialog.close();\r\n }\r\n });\r\n\r\n const popup = document.createElement('div');\r\n popup.className = 'nr-modal__popup';\r\n\r\n // Header\r\n const header = document.createElement('div');\r\n header.className = 'nr-modal__header';\r\n\r\n const titleEl = document.createElement('h2');\r\n titleEl.className = 'nr-modal__title';\r\n titleEl.textContent = title;\r\n header.appendChild(titleEl);\r\n\r\n const closeBtn = document.createElement('button');\r\n closeBtn.className = 'nr-modal__close';\r\n closeBtn.appendChild(createIcon('close'));\r\n closeBtn.addEventListener('click', () => dialog.close());\r\n header.appendChild(closeBtn);\r\n\r\n popup.appendChild(header);\r\n\r\n // Body\r\n const body = document.createElement('div');\r\n body.className = 'nr-modal__body';\r\n popup.appendChild(body);\r\n\r\n dialog.appendChild(popup);\r\n return dialog;\r\n}\r\n\r\n// ── Table ─────────────────────────────────────────────────\r\n\r\n/**\r\n * Render a pipe-delimited markdown table into an HTML table element.\r\n * Returns the outer wrapper div.\r\n */\r\nexport function createTable(\r\n content: string,\r\n renderInline: (text: string) => DocumentFragment,\r\n): HTMLElement {\r\n const rows = content.split('\\n').filter(r => r.trim());\r\n if (rows.length < 2) {\r\n const p = document.createElement('p');\r\n p.textContent = content;\r\n return p;\r\n }\r\n\r\n const parseRow = (row: string) =>\r\n row.split('|').map(c => c.trim()).filter(Boolean);\r\n\r\n const headerCells = parseRow(rows[0]);\r\n const bodyRows = rows.slice(2).map(parseRow);\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'nr-table-wrap';\r\n\r\n const table = document.createElement('table');\r\n table.className = 'nr-table';\r\n\r\n // Thead\r\n const thead = document.createElement('thead');\r\n const tr = document.createElement('tr');\r\n for (const cell of headerCells) {\r\n const th = document.createElement('th');\r\n th.className = 'nr-table__th';\r\n th.appendChild(renderInline(cell));\r\n tr.appendChild(th);\r\n }\r\n thead.appendChild(tr);\r\n table.appendChild(thead);\r\n\r\n // Tbody\r\n const tbody = document.createElement('tbody');\r\n for (const cells of bodyRows) {\r\n const tr = document.createElement('tr');\r\n for (const cell of cells) {\r\n const td = document.createElement('td');\r\n td.className = 'nr-table__td';\r\n td.appendChild(renderInline(cell));\r\n tr.appendChild(td);\r\n }\r\n tbody.appendChild(tr);\r\n }\r\n table.appendChild(tbody);\r\n wrapper.appendChild(table);\r\n\r\n return wrapper;\r\n}\r\n\r\n// ── List ──────────────────────────────────────────────────\r\n\r\n/**\r\n * Render a markdown list (ordered or unordered) into HTML.\r\n */\r\nexport function createList(\r\n content: string,\r\n renderInline: (text: string) => DocumentFragment,\r\n): HTMLElement {\r\n const lines = content.split('\\n');\r\n const items: { indent: number; marker: string; text: string }[] = [];\r\n\r\n for (const line of lines) {\r\n if (!line.trim()) continue;\r\n const match = line.match(/^(\\s*)([-*+]|\\d+\\.)\\s+(.+)$/);\r\n if (match) {\r\n items.push({ indent: match[1].length, marker: match[2], text: match[3] });\r\n }\r\n }\r\n\r\n if (items.length === 0) {\r\n const p = document.createElement('p');\r\n p.textContent = content;\r\n return p;\r\n }\r\n\r\n const isOrdered = /^\\d+\\.$/.test(items[0].marker);\r\n const list = document.createElement(isOrdered ? 'ol' : 'ul');\r\n list.className = 'nr-list';\r\n\r\n for (const item of items) {\r\n const li = document.createElement('li');\r\n li.className = 'nr-list__item';\r\n li.appendChild(renderInline(item.text));\r\n list.appendChild(li);\r\n }\r\n\r\n return list;\r\n}\r\n\r\n// ── TOC (Table of Contents) ───────────────────────────────\r\n\r\ninterface TocHeader {\r\n level: number;\r\n text: string;\r\n id: string;\r\n}\r\n\r\n/**\r\n * Create a table of contents from an array of headers.\r\n */\r\nexport function createTOC(\r\n headers: TocHeader[],\r\n renderInline: (text: string) => DocumentFragment,\r\n): HTMLElement {\r\n const nav = document.createElement('nav');\r\n nav.className = 'nr-toc';\r\n\r\n const title = document.createElement('div');\r\n title.className = 'nr-toc__title';\r\n title.textContent = 'Table of Contents';\r\n nav.appendChild(title);\r\n\r\n const ul = document.createElement('ul');\r\n ul.className = 'nr-toc__list';\r\n\r\n for (const h of headers) {\r\n const li = document.createElement('li');\r\n li.className = `nr-toc__item nr-toc__item--h${h.level}`;\r\n\r\n const a = document.createElement('a');\r\n a.className = 'nr-toc__link';\r\n a.href = `#${h.id}`;\r\n a.appendChild(renderInline(h.text.replace(/->|<-/g, '').trim()));\r\n a.addEventListener('click', (e) => {\r\n e.preventDefault();\r\n const target = document.getElementById(h.id);\r\n if (target) target.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n });\r\n\r\n li.appendChild(a);\r\n ul.appendChild(li);\r\n }\r\n\r\n nav.appendChild(ul);\r\n return nav;\r\n}\r\n\r\n// ── Blockquote ────────────────────────────────────────────\r\n\r\n/**\r\n * Create a blockquote element.\r\n */\r\nexport function createBlockquote(\r\n content: string,\r\n classes: string | undefined,\r\n renderInline: (text: string) => DocumentFragment,\r\n): HTMLElement {\r\n const el = document.createElement('blockquote');\r\n el.className = `nr-blockquote${classes ? ` ${classes}` : ''}`;\r\n el.appendChild(renderInline(content));\r\n return el;\r\n}\r\n","// ============================================================\r\n// Vanilla Inline Renderer\r\n//\r\n// Parses inline markdown formatting into DOM nodes.\r\n// Returns a DocumentFragment.\r\n// ============================================================\r\n\r\nimport { createIcon } from './components';\r\n\r\n/**\r\n * Render inline markdown text into a DocumentFragment.\r\n *\r\n * Supports: bold, italic, bold-italic, strikethrough, code, highlight,\r\n * spoiler, color text, underline, icons, links, raw HTML tags.\r\n */\r\nexport function renderInline(text: string): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n if (!text) return fragment;\r\n\r\n const regex =\r\n /(\\|\\[[^\\]]+\\]\\||\\*\\*\\*.+?\\*\\*\\*|\\*\\*.+?\\*\\*|_.+?_|~~.+?~~|`[^`]+?`|!~.+?~!|%[^%\\s]+?%[\\s\\S]+?%%|!>.+?<!|==.+?==|\\[[^\\]]+?\\]\\([^)]+?\\)|<[^>]+>)/g;\r\n\r\n let lastIndex = 0;\r\n let match: RegExpExecArray | null;\r\n\r\n while ((match = regex.exec(text)) !== null) {\r\n // Append text before this match\r\n if (match.index > lastIndex) {\r\n fragment.appendChild(document.createTextNode(text.slice(lastIndex, match.index)));\r\n }\r\n\r\n fragment.appendChild(parseInlinePart(match[0]));\r\n lastIndex = regex.lastIndex;\r\n }\r\n\r\n // Append remaining text\r\n if (lastIndex < text.length) {\r\n fragment.appendChild(document.createTextNode(text.slice(lastIndex)));\r\n }\r\n\r\n return fragment;\r\n}\r\n\r\n/**\r\n * Parse a single inline markdown token into a DOM node.\r\n */\r\nfunction parseInlinePart(part: string): Node {\r\n let match: RegExpMatchArray | null;\r\n\r\n // Icon: |[[icon-name]]|\r\n if ((match = part.match(/^\\|\\[([^\\]]+)\\]\\|$/))) {\r\n return createIcon(match[1]);\r\n }\r\n\r\n // Underline: !~content~! (supports params: !~color;style;type;text~!)\r\n if ((match = part.match(/^!~(.+?)~!$/))) {\r\n const content = match[1];\r\n const parts = content.split(';');\r\n let color = 'currentColor';\r\n let decorationStyle = 'solid';\r\n let type = 'underline';\r\n let textIndex = 0;\r\n\r\n if (\r\n parts[textIndex]?.match(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/) ||\r\n ['red', 'blue', 'green', 'purple', 'orange', 'yellow', 'pink'].includes(parts[textIndex])\r\n ) {\r\n color = parts[textIndex++];\r\n }\r\n if (['solid', 'double', 'dotted', 'dashed', 'wavy'].includes(parts[textIndex])) {\r\n decorationStyle = parts[textIndex++];\r\n }\r\n if (['underline', 'line-through', 'overline', 'both'].includes(parts[textIndex])) {\r\n type = parts[textIndex] === 'both' ? 'underline line-through' : parts[textIndex++];\r\n }\r\n const innerText = parts.slice(textIndex).join(';');\r\n\r\n const span = document.createElement('span');\r\n span.className = 'nr-underline';\r\n span.style.textDecoration = `${type} ${decorationStyle} ${color}`;\r\n span.style.textDecorationThickness = 'auto';\r\n span.appendChild(renderInline(innerText));\r\n return span;\r\n }\r\n\r\n // Color text: %color%text%%\r\n if ((match = part.match(/%([^%\\s]+?)%([\\s\\S]+?)%%/))) {\r\n const span = document.createElement('span');\r\n span.style.color = match[1];\r\n span.appendChild(renderInline(match[2]));\r\n return span;\r\n }\r\n\r\n // Spoiler: !>text<!\r\n if ((match = part.match(/^!>([^<]+?)<!$/))) {\r\n const span = document.createElement('span');\r\n span.className = 'nr-spoiler';\r\n span.appendChild(renderInline(match[1]));\r\n return span;\r\n }\r\n\r\n // Highlight: ==text==\r\n if ((match = part.match(/^==(.+?)==$/))) {\r\n const mark = document.createElement('mark');\r\n mark.className = 'nr-highlight';\r\n mark.appendChild(renderInline(match[1]));\r\n return mark;\r\n }\r\n\r\n // Bold-italic: ***text***\r\n if ((match = part.match(/^\\*\\*\\*(.+?)\\*\\*\\*$/))) {\r\n const strong = document.createElement('strong');\r\n const em = document.createElement('em');\r\n em.appendChild(renderInline(match[1]));\r\n strong.appendChild(em);\r\n return strong;\r\n }\r\n\r\n // Bold: **text**\r\n if ((match = part.match(/^\\*\\*(.+?)\\*\\*$/))) {\r\n const strong = document.createElement('strong');\r\n strong.appendChild(renderInline(match[1]));\r\n return strong;\r\n }\r\n\r\n // Italic: _text_\r\n if ((match = part.match(/^_(.+?)_$/))) {\r\n const em = document.createElement('em');\r\n em.appendChild(renderInline(match[1]));\r\n return em;\r\n }\r\n\r\n // Strikethrough: ~~text~~\r\n if ((match = part.match(/^~~(.+?)~~$/))) {\r\n const del = document.createElement('del');\r\n del.appendChild(renderInline(match[1]));\r\n return del;\r\n }\r\n\r\n // Inline code: `code`\r\n if ((match = part.match(/^`([^`]+)`$/))) {\r\n const code = document.createElement('code');\r\n code.className = 'nr-inline-code';\r\n code.textContent = match[1];\r\n return code;\r\n }\r\n\r\n // Link: [text](url)\r\n if ((match = part.match(/^\\[([^\\]]+?)\\]\\(([^)]+?)\\)$/))) {\r\n const a = document.createElement('a');\r\n a.className = 'nr-link';\r\n a.href = match[2];\r\n a.target = '_blank';\r\n a.rel = 'noopener noreferrer';\r\n a.appendChild(renderInline(match[1]));\r\n return a;\r\n }\r\n\r\n // Raw HTML tag: <tag>...</tag>\r\n if (part.startsWith('<') && part.endsWith('>')) {\r\n const span = document.createElement('span');\r\n span.innerHTML = part;\r\n return span;\r\n }\r\n\r\n // Fallback: plain text\r\n return document.createTextNode(part);\r\n}\r\n","// ============================================================\n// Admonition Directive (vanilla)\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\nimport { createAdmonition } from '../components';\n\nconst admonitionDirective: DirectiveRendererFn = ({ directiveType, props, renderSlot }) => {\n const el = createAdmonition(directiveType, props.title, props.icon);\n\n if (props.class) el.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.style) el.setAttribute('style', props.style);\n\n // Append default slot content into the body\n const body = el.querySelector('.nr-admonition__body');\n if (body) {\n body.appendChild(renderSlot('default'));\n }\n\n return el;\n};\n\nexport default admonitionDirective;\n","// ============================================================\n// Details Directive (vanilla)\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\nimport { createDetails } from '../components';\n\nconst detailsDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\n const el = createDetails(\n props.title || 'Details',\n props.icon,\n props.defaultOpen === 'true',\n );\n\n if (props.class) el.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.style) el.setAttribute('style', props.style);\n\n // Append default slot into the body\n const body = el.querySelector('.nr-details__body');\n if (body) {\n body.appendChild(renderSlot('default'));\n }\n\n return el;\n};\n\nexport default detailsDirective;\n","// ============================================================\r\n// Modal Directive (vanilla)\r\n// ============================================================\r\n\r\nimport type { DirectiveRendererFn } from './index';\r\nimport { createIcon, createModal } from '../components';\r\n\r\nconst modalDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\r\n const label = props.label || props.title || 'Open';\r\n const modalTitle = props.title || 'Modal';\r\n const customClass = props.class || '';\r\n\r\n // Wrapper\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'nr-modal-trigger';\r\n\r\n // Button to open modal\r\n const btn = document.createElement('button');\r\n btn.className = `nr-button nr-button--default`;\r\n if (customClass) btn.classList.add(...customClass.split(/\\s+/).filter(Boolean));\r\n\r\n const icon = props.icon || 'open_in_new';\r\n if (icon) btn.appendChild(createIcon(icon));\r\n btn.appendChild(document.createTextNode(label));\r\n\r\n // Create the native dialog\r\n const dialog = createModal(modalTitle);\r\n const body = dialog.querySelector('.nr-modal__body');\r\n if (body) {\r\n // Wrap in .nr-prose so the teleported content keeps module\r\n // typography and tokens once the dialog moves to <body>.\r\n const prose = document.createElement('div');\r\n prose.className = 'nr-prose';\r\n prose.appendChild(renderSlot('default'));\r\n body.appendChild(prose);\r\n }\r\n\r\n btn.addEventListener('click', () => {\r\n if (!dialog.open) {\r\n document.body.appendChild(dialog); // append to body for proper layering\r\n dialog.showModal();\r\n dialog.addEventListener('close', () => {\r\n dialog.remove();\r\n }, { once: true });\r\n }\r\n });\r\n\r\n wrapper.appendChild(btn);\r\n wrapper.appendChild(dialog);\r\n\r\n return wrapper;\r\n};\r\n\r\nexport default modalDirective;\r\n","// ============================================================\n// Button Directive (vanilla)\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\nimport { createIcon } from '../components';\n\nconst buttonDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\n const url = props.url || props.href || '#';\n const label = props.label;\n const icon = props.icon || 'near_me';\n const target = props.target || '_blank';\n const customClass = props.class || '';\n\n // Wrapper\n const wrapper = document.createElement('div');\n wrapper.className = 'nr-button-wrap';\n\n // If label is provided, use it directly\n if (label) {\n const a = document.createElement('a');\n a.href = url;\n a.target = target;\n a.rel = 'noopener noreferrer';\n a.className = 'nr-button nr-button--default';\n if (customClass) a.classList.add(...customClass.split(/\\s+/).filter(Boolean));\n a.appendChild(createIcon(icon));\n a.appendChild(document.createTextNode(label));\n wrapper.appendChild(a);\n return wrapper;\n }\n\n // Otherwise render slot content\n const slotContent = renderSlot('default');\n\n // Check if slot contains <a> links — wrap each in a button style\n const links = slotContent.querySelectorAll('a');\n if (links.length > 0) {\n links.forEach(link => {\n link.classList.add('nr-button', 'nr-button--default');\n if (customClass) link.classList.add(...customClass.split(/\\s+/).filter(Boolean));\n });\n wrapper.appendChild(slotContent);\n } else {\n // Fallback: wrap in an <a> tag\n const a = document.createElement('a');\n a.href = url;\n a.target = target;\n a.rel = 'noopener noreferrer';\n a.className = 'nr-button nr-button--default';\n if (customClass) a.classList.add(...customClass.split(/\\s+/).filter(Boolean));\n a.appendChild(createIcon(icon));\n a.appendChild(slotContent);\n wrapper.appendChild(a);\n }\n\n return wrapper;\n};\n\nexport default buttonDirective;\n","// ============================================================\n// Card Directive (vanilla)\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\nimport { createIcon, createModal } from '../components';\nimport { parseCssString } from '../../core/utils';\n\nconst cardDirective: DirectiveRendererFn = ({\n directiveType,\n props,\n slots,\n renderSlot,\n options,\n}) => {\n const { title, image, icon, url, target } = props;\n const customClass = props.class || '';\n const hasDescription = !!slots.description;\n const { isSingleCard } = (options || {}) as { isSingleCard?: boolean };\n\n const isModal = directiveType === 'card-m';\n const isLink = directiveType === 'card-b';\n\n const inlineStyles = props.style ? parseCssString(props.style) : {};\n\n const card = document.createElement('div');\n card.className = `nr-card${isModal || isLink ? ' nr-card--interactive' : ''} ${customClass}`.trim();\n\n // Apply inline styles\n for (const [key, value] of Object.entries(inlineStyles)) {\n card.style.setProperty(key, String(value));\n }\n\n // Image banner\n if (image) {\n const imgWrap = document.createElement('div');\n imgWrap.className = `nr-card__image${isSingleCard ? ' nr-card__image--tall' : ''}`;\n const img = document.createElement('img');\n img.src = image;\n img.alt = title || '';\n img.className = 'nr-card__img';\n imgWrap.appendChild(img);\n const gradient = document.createElement('div');\n gradient.className = 'nr-card__gradient';\n imgWrap.appendChild(gradient);\n card.appendChild(imgWrap);\n }\n\n // Content body\n const body = document.createElement('div');\n body.className = `nr-card__body${image ? ' nr-card__body--overlap' : ''}`;\n\n // Header: Icon + Title\n if (icon || title) {\n const header = document.createElement('div');\n header.className = 'nr-card__header';\n if (icon) {\n const iconWrap = document.createElement('div');\n iconWrap.className = 'nr-card__icon-wrap';\n iconWrap.appendChild(createIcon(icon));\n header.appendChild(iconWrap);\n }\n if (title) {\n const h3 = document.createElement('h3');\n h3.className = 'nr-card__title';\n h3.textContent = title;\n header.appendChild(h3);\n }\n body.appendChild(header);\n }\n\n // Description\n if (hasDescription) {\n const desc = document.createElement('div');\n desc.className = 'nr-card__description';\n desc.appendChild(renderSlot('description'));\n body.appendChild(desc);\n }\n\n // Content (for card type)\n if (directiveType === 'card') {\n const contentSlot = renderSlot('content') || renderSlot('default');\n if (contentSlot.childNodes.length > 0) {\n const contentDiv = document.createElement('div');\n contentDiv.className = 'nr-card__content';\n contentDiv.appendChild(contentSlot);\n body.appendChild(contentDiv);\n }\n }\n\n // Action link for card-m / card-b\n if (isModal || isLink) {\n const action = document.createElement('div');\n action.className = 'nr-card__action';\n\n if (isLink && url) {\n const a = document.createElement('a');\n a.href = url;\n a.target = target || '_blank';\n a.rel = 'noopener noreferrer';\n a.className = 'nr-card__action-link';\n a.appendChild(createIcon('open_in_new'));\n a.appendChild(document.createTextNode(' Link'));\n action.appendChild(a);\n } else if (isModal) {\n const modalBtn = document.createElement('div');\n modalBtn.className = 'nr-card__action-link';\n modalBtn.appendChild(createIcon('arrow_forward'));\n modalBtn.appendChild(document.createTextNode(' Abrir'));\n action.appendChild(modalBtn);\n }\n\n body.appendChild(action);\n }\n\n card.appendChild(body);\n\n // For card-m: attach modal\n if (isModal) {\n const dialog = createModal(title || 'Detalles');\n const modalBody = dialog.querySelector('.nr-modal__body');\n if (modalBody) {\n // Wrap in .nr-prose so the teleported content keeps module\n // typography and tokens once the dialog moves to <body>.\n const prose = document.createElement('div');\n prose.className = 'nr-prose';\n prose.appendChild(renderSlot('content') || renderSlot('default'));\n modalBody.appendChild(prose);\n }\n\n card.addEventListener('click', () => {\n if (!dialog.open) {\n document.body.appendChild(dialog);\n dialog.showModal();\n dialog.addEventListener('close', () => dialog.remove(), { once: true });\n }\n });\n\n // Return fragment with card + dialog\n const frag = document.createDocumentFragment();\n frag.appendChild(card);\n frag.appendChild(dialog);\n return frag;\n }\n\n // For card-b: click opens URL\n if (isLink && url) {\n card.addEventListener('click', () => window.open(url, target || '_blank'));\n }\n\n return card;\n};\n\nexport default cardDirective;\n","// ============================================================\n// Wrapper Directive (vanilla)\n//\n// Generic layout wrapper for: div, style, custom, raw\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\nimport { parseCssString } from '../../core/utils';\n\nconst wrapperDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\n const el = document.createElement('div');\n el.className = 'nr-wrapper';\n\n if (props.class) el.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.id) el.id = props.id;\n\n // Inline styles\n if (props.style) {\n const styles = parseCssString(props.style);\n for (const [key, value] of Object.entries(styles)) {\n el.style.setProperty(key, String(value));\n }\n }\n\n // data-* attributes\n for (const [key, value] of Object.entries(props)) {\n if (key.startsWith('data-')) {\n el.setAttribute(key, value);\n }\n }\n\n el.appendChild(renderSlot('default'));\n return el;\n};\n\nexport default wrapperDirective;\n","// ============================================================\n// Slide Directive (vanilla)\n//\n// Single-line text carousel with CSS-driven slide-up rotation.\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\nimport { parseCssString } from '../../core/utils';\n\nlet slideCounter = 0;\n\nconst slideDirective: DirectiveRendererFn = ({\n props,\n slots,\n renderInline,\n renderMarkdown,\n}) => {\n const rawContent = slots.default || '';\n const lines = rawContent\n .split('\\n')\n .map(l => l.trim())\n .filter(Boolean);\n\n if (lines.length === 0) {\n return document.createDocumentFragment();\n }\n\n const interval = parseInt(props.interval || '3000', 10);\n const speed = parseInt(props.speed || '500', 10);\n const rawClass = props.class || '';\n const inlineStyle = props.style ? parseCssString(props.style) : {};\n\n const scopeClass = `sld-${++slideCounter}`;\n\n // Container\n const container = document.createElement('div');\n container.className = 'nr-slide';\n Object.assign(container.style, {\n position: 'relative',\n overflow: 'hidden',\n ...inlineStyle,\n });\n\n // Inner track (holds all slides, animated via translateY)\n const track = document.createElement('div');\n track.className = 'nr-slide__track';\n track.style.transition = `transform ${speed}ms cubic-bezier(0.16, 1, 0.3, 1)`;\n\n // Create slide elements\n const slideEls: HTMLElement[] = [];\n for (const line of lines) {\n const slideEl = document.createElement('div');\n slideEl.className = `nr-slide__item ${scopeClass} ${rawClass}`.trim();\n slideEl.style.display = 'flex';\n slideEl.style.alignItems = 'center';\n\n // Parse each line as markdown\n if (renderMarkdown) {\n const tokens = renderMarkdown(line);\n slideEl.appendChild(tokens);\n } else if (renderInline) {\n slideEl.appendChild(renderInline(line));\n }\n\n track.appendChild(slideEl);\n slideEls.push(slideEl);\n }\n\n container.appendChild(track);\n\n // Measure and animate\n let current = 0;\n let maxH = 0;\n\n const measureAndSetHeight = () => {\n maxH = 0;\n for (const el of slideEls) {\n maxH = Math.max(maxH, el.offsetHeight);\n }\n if (maxH > 0) {\n container.style.height = `${maxH}px`;\n for (const el of slideEls) {\n el.style.height = `${maxH}px`;\n }\n }\n };\n\n // Initial measurement after DOM attach\n requestAnimationFrame(() => {\n measureAndSetHeight();\n // Re-measure after fonts load\n if (document.fonts?.ready) {\n document.fonts.ready.then(measureAndSetHeight);\n }\n });\n\n // Rotation\n if (lines.length > 1) {\n setInterval(() => {\n current = (current + 1) % lines.length;\n track.style.transform = `translateY(${-current * maxH}px)`;\n }, interval);\n }\n\n return container;\n};\n\nexport default slideDirective;\n","// ============================================================\n// Vanilla Directive Registry\n//\n// Maps directive type strings to vanilla renderer functions.\n// ============================================================\n\nimport type { Token } from '../../core/types';\n\n// ── Context passed to directive renderers ──\n\nexport interface VanillaRenderContext {\n /** Parse markdown string into tokens */\n parseMarkdown: (md: string) => Token[];\n /** Render tokens into an HTMLElement */\n renderElements: (tokens: Token[]) => HTMLElement;\n /** Render inline text into a DocumentFragment */\n renderInline: (text: string) => DocumentFragment;\n /** Parse markdown string and render into an HTMLElement */\n renderMarkdown: (md: string) => HTMLElement;\n}\n\nexport interface DirectiveProps {\n /** The directive type string */\n directiveType: string;\n /** Parsed key=\"value\" attributes */\n props: Record<string, string>;\n /** Named slots → raw content strings */\n slots: Record<string, string>;\n /** Render a named slot as parsed markdown */\n renderSlot: (name: string) => DocumentFragment;\n /** Render context */\n context: VanillaRenderContext;\n /** Position index */\n index: number;\n /** Full parsed AST */\n allElements: Token[];\n /** Extra flags */\n options?: Record<string, any>;\n /** Inline renderer shortcut */\n renderInline: (text: string) => DocumentFragment;\n /** Full markdown renderer shortcut (for complex directives like slide) */\n renderMarkdown?: (md: string) => HTMLElement;\n}\n\nexport type DirectiveRendererFn = (props: DirectiveProps) => HTMLElement | DocumentFragment;\n\n// ── Import directive implementations ──\n\nimport admonitionDirective from './admonition';\nimport detailsDirective from './details';\nimport modalDirective from './modal';\nimport buttonDirective from './button';\nimport cardDirective from './card';\nimport wrapperDirective from './wrapper';\nimport slideDirective from './slide';\n\n// ── Registry ──\n\nconst directiveRegistry: Record<string, DirectiveRendererFn> = {\n // Admonitions\n note: admonitionDirective,\n info: admonitionDirective,\n warning: admonitionDirective,\n danger: admonitionDirective,\n greentext: admonitionDirective,\n // Cards\n card: cardDirective,\n 'card-m': cardDirective,\n 'card-b': cardDirective,\n // Interactive\n details: detailsDirective,\n modal: modalDirective,\n button: buttonDirective,\n // Layout / generic wrappers\n div: wrapperDirective,\n style: wrapperDirective,\n custom: wrapperDirective,\n raw: wrapperDirective,\n // Animation\n slide: slideDirective,\n};\n\nexport default directiveRegistry;\n","// ============================================================\r\n// Vanilla Markdown Renderer\r\n//\r\n// Pipeline: Token[] → processElements() → HTMLElement\r\n// No React, no Tailwind. Pure DOM + CSS classes.\r\n// ============================================================\r\n\r\nimport type { Token, DirectiveToken, HtmlBlockToken, HtmlToken } from '../core/types';\r\nimport { parseMarkdown } from '../core/parser';\r\nimport { scrollToId, parseHtmlAttrs } from '../core/utils';\r\nimport { renderInline } from './inline';\r\nimport {\r\n createCodeBlock,\r\n createTable,\r\n createList,\r\n createTOC,\r\n createBlockquote,\r\n} from './components';\r\nimport directiveRegistry, { type VanillaRenderContext, type DirectiveProps } from './directives';\r\n\r\n/**\r\n * Render parsed markdown tokens into an HTMLElement.\r\n *\r\n * @param tokens - Array of tokens from `parseMarkdown()`\r\n * @returns The root `<article class=\"nr-prose\">` element\r\n */\r\nexport function renderTokens(tokens: Token[]): HTMLElement {\r\n const article = document.createElement('article');\r\n article.className = 'nr-prose';\r\n\r\n const ctx: VanillaRenderContext = {\r\n parseMarkdown,\r\n renderElements: (tks) => renderTokensInner(tks, ctx),\r\n renderInline,\r\n renderMarkdown: (md: string) => renderTokensInner(parseMarkdown(md), ctx),\r\n };\r\n\r\n article.appendChild(processElements(tokens, ctx, tokens));\r\n return article;\r\n}\r\n\r\n/**\r\n * Convenience: parse markdown string and render directly.\r\n */\r\nexport function renderMarkdownString(markdown: string): HTMLElement {\r\n const tokens = parseMarkdown(markdown);\r\n return renderTokens(tokens);\r\n}\r\n\r\n/**\r\n * Render a raw HTML string into a wrapper element.\r\n * Extracts <style> blocks (injected globally into <head>) and\r\n * force-executes any <script> tags.\r\n */\r\nexport function renderHtmlString(html: string): HTMLElement {\r\n let processedContent = html;\r\n\r\n // Extract <style> blocks and inject globally\r\n processedContent = processedContent.replace(\r\n /<style(?:\\s+[^>]*)?>([\\s\\S]*?)<\\/style>/gi,\r\n (_match: string, cssContent: string) => {\r\n const styleEl = document.createElement('style');\r\n styleEl.setAttribute('data-nr-global', '');\r\n styleEl.textContent = cssContent;\r\n document.head.appendChild(styleEl);\r\n return '';\r\n }\r\n );\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'nr-raw-html';\r\n wrapper.innerHTML = processedContent;\r\n\r\n // Force-execute injected scripts\r\n const scripts = wrapper.querySelectorAll('script');\r\n scripts.forEach(oldScript => {\r\n const newScript = document.createElement('script');\r\n Array.from(oldScript.attributes).forEach(attr =>\r\n newScript.setAttribute(attr.name, attr.value)\r\n );\r\n newScript.textContent = oldScript.textContent;\r\n oldScript.parentNode?.replaceChild(newScript, oldScript);\r\n });\r\n\r\n return wrapper;\r\n}\r\n\r\n/**\r\n * Render tokens into an HTMLElement (internal, creates a container).\r\n */\r\nfunction renderTokensInner(tokens: Token[], ctx: VanillaRenderContext): HTMLElement {\r\n const container = document.createElement('div');\r\n container.appendChild(processElements(tokens, ctx, tokens));\r\n return container;\r\n}\r\n\r\n/**\r\n * Process an array of tokens into a DocumentFragment.\r\n */\r\nfunction processElements(\r\n elements: Token[],\r\n ctx: VanillaRenderContext,\r\n allElements: Token[],\r\n): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n let i = 0;\r\n\r\n while (i < elements.length) {\r\n const el = elements[i];\r\n\r\n // Batch consecutive cards into a grid\r\n if (el.type === 'directive' && ['card', 'card-m', 'card-b'].includes(el.directiveType)) {\r\n const cards: Token[] = [];\r\n while (\r\n i < elements.length &&\r\n elements[i].type === 'directive' &&\r\n ['card', 'card-m', 'card-b'].includes((elements[i] as DirectiveToken).directiveType)\r\n ) {\r\n cards.push(elements[i]);\r\n i++;\r\n }\r\n\r\n if (cards.length === 1 || (cards[0] as DirectiveToken).props?.batch === 'off') {\r\n for (const card of cards) {\r\n const rendered = renderElement(card, ctx, allElements);\r\n if (rendered) fragment.appendChild(rendered);\r\n }\r\n } else {\r\n const grid = document.createElement('div');\r\n grid.className = 'nr-card-grid';\r\n for (const card of cards) {\r\n const rendered = renderElement(card, ctx, allElements);\r\n if (rendered) grid.appendChild(rendered);\r\n }\r\n fragment.appendChild(grid);\r\n }\r\n } else {\r\n const rendered = renderElement(el, ctx, allElements);\r\n if (rendered) fragment.appendChild(rendered);\r\n i++;\r\n }\r\n }\r\n\r\n return fragment;\r\n}\r\n\r\n/**\r\n * Render a single token into a Node.\r\n */\r\nfunction renderElement(\r\n element: Token,\r\n ctx: VanillaRenderContext,\r\n allElements: Token[],\r\n): Node | null {\r\n switch (element.type) {\r\n case 'header': {\r\n const tag = `h${element.level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\r\n let text = element.text;\r\n\r\n // Alignment modifiers\r\n const alignCenter = text.match(/^->\\s*(.+?)\\s*<-\\s*$/);\r\n const alignRight = text.match(/^->\\s*(.+?)\\s*->\\s*$/);\r\n if (alignCenter) text = alignCenter[1];\r\n else if (alignRight) text = alignRight[1];\r\n\r\n const h = document.createElement(tag);\r\n h.id = element.id;\r\n let cls = `md-h${element.level}`;\r\n if (alignCenter) cls += ' text-center';\r\n if (alignRight) cls += ' text-right';\r\n if (element.classes) cls += ` ${element.classes}`;\r\n h.className = cls;\r\n h.appendChild(renderInline(text));\r\n return h;\r\n }\r\n\r\n case 'paragraph': {\r\n const p = document.createElement('p');\r\n let cls = 'md-p';\r\n if (element.classes) cls += ` ${element.classes}`;\r\n if (element.align) cls += ` text-${element.align}`;\r\n p.className = cls;\r\n if (element.id) p.id = element.id;\r\n\r\n const lines = element.content.split('\\n');\r\n for (let li = 0; li < lines.length; li++) {\r\n const line = lines[li];\r\n const hardBreakMatch = line.match(/^(.*?)(\\s{2,})$/);\r\n if (hardBreakMatch) {\r\n p.appendChild(renderInline(hardBreakMatch[1]));\r\n p.appendChild(document.createElement('br'));\r\n } else {\r\n p.appendChild(renderInline(line));\r\n if (li < lines.length - 1) {\r\n p.appendChild(document.createTextNode(' '));\r\n }\r\n }\r\n }\r\n return p;\r\n }\r\n\r\n case 'codeblock':\r\n return createCodeBlock(element.content, element.language, element.title);\r\n\r\n case 'directive':\r\n return renderDirective(element, ctx, allElements);\r\n\r\n case 'html': {\r\n const el = element as HtmlToken;\r\n return renderHtmlString(el.content);\r\n }\r\n\r\n case 'html-block': {\r\n const htmlBlock = element as HtmlBlockToken;\r\n const rawProps = parseHtmlAttrs(htmlBlock.attrs);\r\n\r\n const el = document.createElement(htmlBlock.tag);\r\n // Apply attributes (keep as-is, no React renaming needed)\r\n for (const [key, value] of Object.entries(rawProps)) {\r\n if (key === 'style' && typeof value === 'object') {\r\n for (const [prop, val] of Object.entries(value)) {\r\n el.style.setProperty(prop, String(val));\r\n }\r\n } else if (value === true) {\r\n el.setAttribute(key, '');\r\n } else {\r\n el.setAttribute(key, String(value));\r\n }\r\n }\r\n\r\n // Recurse children\r\n const childFrag = processElements(htmlBlock.children, ctx, allElements);\r\n el.appendChild(childFrag);\r\n return el;\r\n }\r\n\r\n case 'image': {\r\n const img = document.createElement('img');\r\n img.src = element.src;\r\n img.alt = element.alt;\r\n img.className = 'nr-image';\r\n if (element.style) {\r\n for (const [key, value] of Object.entries(element.style)) {\r\n img.style.setProperty(key, String(value));\r\n }\r\n }\r\n return img;\r\n }\r\n\r\n case 'table':\r\n return createTable(element.content, renderInline);\r\n\r\n case 'list':\r\n return createList(element.content, renderInline);\r\n\r\n case 'blockquote':\r\n return createBlockquote(element.content, element.classes, renderInline);\r\n\r\n case 'hr': {\r\n const hr = document.createElement('hr');\r\n hr.className = 'nr-hr';\r\n return hr;\r\n }\r\n\r\n case 'toc': {\r\n const headers = allElements.filter((e): e is Token & { type: 'header' } => e.type === 'header');\r\n return createTOC(headers.map(h => ({ level: h.level, text: h.text, id: h.id })), renderInline);\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Render a directive token.\r\n */\r\nfunction renderDirective(\r\n element: DirectiveToken,\r\n ctx: VanillaRenderContext,\r\n allElements: Token[],\r\n): Node | null {\r\n const { directiveType, props, slots, scopeId } = element;\r\n\r\n const renderer = directiveRegistry[directiveType];\r\n\r\n // renderSlot helper: parse slot content as markdown and render\r\n const renderSlot = (name: string): DocumentFragment => {\r\n const frag = document.createDocumentFragment();\r\n const slotContent = slots[name];\r\n if (!slotContent) return frag;\r\n const tokens = ctx.parseMarkdown(slotContent);\r\n frag.appendChild(ctx.renderElements(tokens));\r\n return frag;\r\n };\r\n\r\n const directiveProps: DirectiveProps = {\r\n directiveType,\r\n props,\r\n slots,\r\n renderSlot,\r\n context: ctx,\r\n index: 0,\r\n allElements,\r\n renderInline,\r\n renderMarkdown: ctx.renderMarkdown,\r\n };\r\n\r\n if (renderer) {\r\n return renderer(directiveProps);\r\n }\r\n\r\n // Fallback: unknown directive → render as a div with default slot\r\n const fallback = document.createElement('div');\r\n fallback.className = 'nr-unknown-directive';\r\n fallback.appendChild(renderSlot('default'));\r\n return fallback;\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,gBAAwC;AACxC,8BAAiD;AACjD,kBAAoF;;;ACFpF,sBAA+B;AAC/B,uBAA0B;AAqBnB,IAAM,uBAAuB,+BAAe,OAAgB;AAAA,EACjE,YAAY,OAAO;AAAA,IACjB,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,YAAY,CAAC;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EAEA,MAAM,QAAQ,OAAO;AAEnB,QAAI,OAAO,IAAI,GAAG;AAChB,YAAM,oBAAoB;AAC1B,YAAM,aAAa;AACnB,YAAM,YAAY;AAGlB,UAAI,MAAM,eAAe,OAAO,MAAM,SAAS,GAAG;AAChD,cAAM,cAAc;AACpB,eAAO;AAAA,MACT;AAAA,IAGF;AAGA,QAAI,MAAM,aAAa;AACrB,aAAO,SAAS;AAGhB,UAAI,OAAO,MAAM,MAAM,GAAG;AACxB,cAAM,cAAc;AACpB,cAAM,cAAc;AACpB,cAAM,mBAAmB;AACzB,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,MAAM,IAAI,GAAG;AACtB,cAAM,cAAc;AAEpB,YAAI,CAAC,MAAM,qBAAqB,MAAM,gBAAgB,YAAY,MAAM,gBAAgB,UAAU;AAChG,gBAAM,eAAe,MAAM;AAAA,QAC7B;AACA,cAAM,cAAc;AACpB,cAAM,mBAAmB;AACzB,eAAO;AAAA,MACT;AAGA,UAAI,OAAO,MAAM,qBAAqB,EAAG,QAAO;AAEhD,UAAI,OAAO,MAAM,IAAI,EAAG,QAAO;AAE/B,UAAI,OAAO,MAAM,UAAU,EAAG,QAAO;AACrC,UAAI,OAAO,MAAM,UAAU,EAAG,QAAO;AAErC,UAAI,OAAO,MAAM,UAAU,EAAG,QAAO;AACrC,UAAI,OAAO,MAAM,UAAU,EAAG,QAAO;AAErC,UAAI,OAAO,MAAM,UAAU,EAAG,QAAO;AAErC,UAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,aAAO,KAAK;AACZ,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,iBAAiB,QAAQ;AAEjC,UAAI,OAAO,MAAM,uBAAuB,GAAG;AACzC,cAAM,WAAW,OAAO,QAAQ,EAAE,QAAQ,QAAQ,EAAE,EAAE,YAAY;AAClE,cAAM,eAAe;AACrB,cAAM,cAAc;AACpB,cAAM,cAAc;AACpB,cAAM,mBAAmB;AACzB,eAAO;AAAA,MACT;AAEA,UAAI,MAAM,iBAAiB,UAAU;AAGnC,YAAI,OAAO,MAAM,OAAO,GAAG;AAAE,iBAAO,UAAU;AAAG,iBAAO;AAAA,QAAW;AAEnE,YAAI,OAAO,MAAM,OAAO,GAAG;AACzB,iBAAO,CAAC,OAAO,IAAI,GAAG;AACpB,gBAAI,OAAO,MAAM,MAAM,EAAG,QAAO;AACjC,mBAAO,KAAK;AAAA,UACd;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,MAAM,OAAO,GAAG;AACzB,gBAAM,IAAI,OAAO,QAAQ;AACzB,iBAAO,CAAC,OAAO,IAAI,GAAG;AACpB,kBAAM,KAAK,OAAO,KAAK;AACvB,gBAAI,OAAO,KAAK,OAAO,OAAO,OAAO,MAAM,CAAC,MAAM,KAAM;AAAA,UAC1D;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,MAAM,IAAI,GAAG;AACtB,iBAAO,CAAC,OAAO,IAAI,GAAG;AACpB,gBAAI,OAAO,KAAK,MAAM,IAAK;AAAA,UAC7B;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,MAAM,kOAAkO,EAAG,QAAO;AAE7P,YAAI,OAAO,MAAM,cAAc,EAAG,QAAO;AAEzC,YAAI,OAAO,MAAM,4BAA4B,EAAG,QAAO;AAEvD,YAAI,OAAO,MAAM,mBAAmB,EAAG,QAAO;AAE9C,YAAI,OAAO,MAAM,uBAAuB,EAAG,QAAO;AAClD,eAAO,KAAK;AACZ,eAAO;AAAA,MACT;AAEA,UAAI,MAAM,iBAAiB,SAAS;AAGlC,YAAI,OAAO,MAAM,OAAO,GAAG;AACzB,iBAAO,CAAC,OAAO,IAAI,GAAG;AACpB,gBAAI,OAAO,MAAM,MAAM,EAAG,QAAO;AACjC,mBAAO,KAAK;AAAA,UACd;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,MAAM,OAAO,GAAG;AACzB,gBAAM,IAAI,OAAO,QAAQ;AACzB,iBAAO,CAAC,OAAO,IAAI,GAAG;AACpB,kBAAM,KAAK,OAAO,KAAK;AACvB,gBAAI,OAAO,KAAK,OAAO,OAAO,OAAO,MAAM,CAAC,MAAM,KAAM;AAAA,UAC1D;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,MAAM,cAAc,EAAG,QAAO;AAEzC,YAAI,OAAO,MAAM,sBAAsB,EAAG,QAAO;AAEjD,YAAI,OAAO,MAAM,0DAA0D,EAAG,QAAO;AAErF,YAAI,OAAO,MAAM,qBAAqB,EAAG,QAAO;AAEhD,YAAI,OAAO,MAAM,qBAAqB,EAAG,QAAO;AAEhD,YAAI,OAAO,MAAM,sKAAsK,EAAG,QAAO;AAEjM,YAAI,OAAO,MAAM,iBAAiB,EAAG,QAAO;AAE5C,YAAI,OAAO,MAAM,YAAY,EAAG,QAAO;AACvC,eAAO,KAAK;AACZ,eAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,MAAM,aAAa;AACrB,aAAO,UAAU;AACjB,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,cAAc;AACtB,aAAO,SAAS;AAEhB,UAAI,OAAO,KAAK,MAAM,KAAK;AACzB,eAAO,KAAK;AACZ,cAAM,eAAe;AACrB,cAAM,oBAAoB;AAC1B,cAAM,cAAc;AACpB,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,MAAM,mBAAmB,EAAG,QAAO;AAC9C,UAAI,OAAO,MAAM,kBAAkB,EAAG,QAAO;AAE7C,YAAM,UAAU;AAChB,UAAI,OAAO,MAAM,sBAAsB,GAAG;AACxC,cAAM,cAAc,OAAO,QAAQ;AACnC,eAAO;AAAA,MACT;AACA,UAAI,OAAO,MAAM,IAAI,EAAG,QAAO;AAC/B,UAAI,OAAO,MAAM,mBAAmB,GAAG;AACrC,eAAO,QAAQ,KAAK,MAAM,WAAW,IAAI,QAAQ;AAAA,MACnD;AAEA,aAAO,KAAK;AACZ,aAAO;AAAA,IACT;AAGA,QAAI,OAAO,IAAI,GAAG;AAChB,UAAI;AACJ,UAAK,QAAQ,OAAO,MAAM,cAAc,GAAI;AAC1C,cAAM,OAAO,OAAO,OAAO,MAAM,OAAO,GAAG,EAAE,KAAK;AAElD,YAAI,SAAS,IAAI;AACf,gBAAM,WAAW,IAAI;AAAA,QACvB,OAAO;AACL,gBAAM,YAAY,KAAK,MAAM,WAAW;AACxC,gBAAM,WAAW,KAAK,YAAY,UAAU,CAAC,EAAE,YAAY,IAAI,SAAS;AAAA,QAC1E;AAEA,cAAM,oBAAoB;AAC1B,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,MAAM,yBAAyB,KAAK,CAAC,OAAO,MAAM,cAAc,GAAG;AAC5E,eAAO;AAAA,MACT;AACA,UAAI,OAAO,MAAM,iBAAiB,EAAG,QAAO;AAC5C,UAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,cAAM,cAAc;AACpB,eAAO,UAAU;AACjB,eAAO;AAAA,MACT;AACA,UAAI,OAAO,MAAM,sBAAsB,EAAG,QAAO;AACjD,UAAI,OAAO,MAAM,+BAA+B,EAAG,QAAO;AAC1D,UAAI,OAAO,MAAM,gBAAgB,EAAG,QAAO;AAAA,IAC7C;AAGA,QAAI,MAAM,mBAAmB;AAC3B,aAAO,SAAS;AAChB,UAAI,OAAO,MAAM,SAAS,EAAG,QAAO;AACpC,UAAI,OAAO,KAAK,MAAM,KAAK;AACzB,eAAO,KAAK;AACZ,cAAM,eAAe;AACrB,cAAM,oBAAoB;AAC1B,eAAO;AAAA,MACT;AACA,YAAM,oBAAoB;AAAA,IAC5B;AAGA,UAAM,mBAAmB,MAAM,WAAW,MAAM,WAAW,SAAS,CAAC;AACrE,QAAI,qBAAqB,SAAS,CAAC,MAAM,mBAAmB;AAC1D,UAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,UAAI,OAAO,MAAM,oBAAoB,EAAG,QAAO;AAC/C,UAAI,OAAO,MAAM,IAAI,EAAG,QAAO;AAC/B,UAAI,OAAO,MAAM,OAAO,EAAG,QAAO;AAClC,UAAI,OAAO,MAAM,mBAAmB,EAAG,QAAO;AAC9C,UAAI,OAAO,MAAM,qBAAqB,EAAG,QAAO;AAChD,UAAI,OAAO,MAAM,eAAe,EAAG,QAAO;AAC1C,UAAI,OAAO,MAAM,oBAAoB,EAAG,QAAO;AAC/C,UAAI,OAAO,MAAM,qBAAqB,EAAG,QAAO;AAChD,UAAI,OAAO,MAAM,kBAAkB,EAAG,QAAO;AAC7C,UAAI,OAAO,MAAM,uDAAuD,EAAG,QAAO;AAClF,aAAO,KAAK;AACZ,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,eAAe,aAAa;AACpC,YAAM,aAAa;AACnB,UAAI,OAAO,IAAI,GAAG,GAAG;AACnB,YAAI,aAAa;AACjB,eAAO,CAAC,OAAO,IAAI,KAAK,aAAa,GAAG;AACtC,gBAAM,OAAO,OAAO,KAAK;AACzB,cAAI,SAAS,IAAK;AAAA,mBACT,SAAS,OAAO,OAAO,OAAO,OAAO,MAAM,CAAC,MAAM,KAAM;AAAA,QACnE;AACA,eAAO;AAAA,MACT,OAAO;AACL,cAAM,aAAa;AAAA,MACrB;AAAA,IACF;AACA,QAAI,MAAM,eAAe,iBAAiB;AACxC,YAAM,aAAa;AACnB,UAAI,OAAO,IAAI,GAAG,GAAG;AACnB,eAAO,SAAS,MAAM;AACtB,eAAO,IAAI,GAAG;AACd,eAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,MAAM,cAAc,aAAa;AACnC,YAAM,YAAY;AAClB,UAAI,OAAO,IAAI,GAAG,GAAG;AACnB,YAAI,aAAa;AACjB,eAAO,CAAC,OAAO,IAAI,KAAK,aAAa,GAAG;AACtC,gBAAM,OAAO,OAAO,KAAK;AACzB,cAAI,SAAS,IAAK;AAAA,mBACT,SAAS,OAAO,OAAO,OAAO,OAAO,MAAM,CAAC,MAAM,KAAM;AAAA,QACnE;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,OAAO,MAAM,iCAAiC,GAAG;AACnD,YAAM,MAAM,OAAO,QAAQ;AAC3B,YAAM,cAAc,IAAI,QAAQ,SAAS,EAAE,EAAE,YAAY;AACzD,YAAM,mBAAmB,IAAI,WAAW,IAAI;AAC5C,YAAM,cAAc;AACpB,aAAO;AAAA,IACT;AAGA,QAAI,OAAO,MAAM,iBAAiB,EAAG,QAAO;AAC5C,QAAI,OAAO,MAAM,aAAa,EAAG,QAAO;AACxC,QAAI,OAAO,MAAM,cAAc,GAAG;AAChC,UAAI,OAAO,KAAK,MAAM,IAAK,OAAM,aAAa;AAC9C,aAAO;AAAA,IACT;AACA,QAAI,OAAO,MAAM,aAAa,GAAG;AAC/B,UAAI,OAAO,KAAK,MAAM,IAAK,OAAM,YAAY;AAC7C,aAAO;AAAA,IACT;AACA,QAAI,OAAO,MAAM,iBAAiB,EAAG,QAAO;AAC5C,QAAI,OAAO,MAAM,SAAS,EAAG,QAAO;AACpC,QAAI,OAAO,MAAM,SAAS,EAAG,QAAO;AACpC,QAAI,OAAO,MAAM,WAAW,EAAG,QAAO;AACtC,QAAI,OAAO,MAAM,WAAW,EAAG,QAAO;AACtC,QAAI,OAAO,MAAM,WAAW,EAAG,QAAO;AACtC,QAAI,OAAO,MAAM,SAAS,EAAG,QAAO;AACpC,QAAI,OAAO,MAAM,oBAAoB,EAAG,QAAO;AAC/C,QAAI,OAAO,MAAM,UAAU,EAAG,QAAO;AAErC,WAAO,KAAK;AACZ,WAAO;AAAA,EACT;AAAA,EAEA,YAAY;AAAA,IACV,SAAS,iBAAAC,KAAE;AAAA,IACX,SAAS,iBAAAA,KAAE;AAAA,IACX,UAAU,iBAAAA,KAAE;AAAA,IACZ,QAAQ,iBAAAA,KAAE;AAAA,IACV,eAAe,iBAAAA,KAAE;AAAA,IACjB,cAAc,iBAAAA,KAAE;AAAA,IAChB,WAAW,iBAAAA,KAAE;AAAA,IACb,SAAS,iBAAAA,KAAE;AAAA,IACX,cAAc,iBAAAA,KAAE;AAAA,IAChB,MAAM,iBAAAA,KAAE;AAAA,IACR,QAAQ,iBAAAA,KAAE;AAAA,IACV,UAAU,iBAAAA,KAAE;AAAA,IACZ,gBAAgB,CAAC,iBAAAA,KAAE,QAAQ,iBAAAA,KAAE,QAAQ;AAAA,IACrC,eAAe,iBAAAA,KAAE;AAAA,IACjB,WAAW,iBAAAA,KAAE,QAAQ,iBAAAA,KAAE,QAAQ;AAAA,IAC/B,WAAW,iBAAAA,KAAE,QAAQ,iBAAAA,KAAE,OAAO;AAAA,IAC9B,KAAK,iBAAAA,KAAE;AAAA,IACP,MAAM,iBAAAA,KAAE;AAAA,IACR,QAAQ,iBAAAA,KAAE;AAAA,IACV,UAAU,iBAAAA,KAAE,SAAS,iBAAAA,KAAE,YAAY;AAAA,EACrC;AACF,CAAC;;;ADtXD,mBAAgC;AAChC,IAAAC,mBAAgG;AAChG,IAAAC,oBAA0B;;;AEN1B,mBAAoC;AAM7B,SAAS,YAAe,OAAU,OAAkB;AACzD,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,uBAAY,KAAK;AAE7D,8BAAU,MAAM;AACd,UAAM,QAAQ,WAAW,MAAM,kBAAkB,KAAK,GAAG,KAAK;AAC9D,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,OAAO,KAAK,CAAC;AAEjB,SAAO;AACT;;;ACfA,IAAAC,gBAAkC;;;ACsBlC,IAAM,iBAAiB;AAOvB,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBrB,SAAS,OAAO,MAAmB,MAAsB;AACvD,SAAO,iBAAiB,IAAI,EAAE,iBAAiB,IAAI,EAAE,KAAK;AAC5D;AAEA,SAAS,qBAA8B;AACrC,aAAW,SAAS,MAAM,KAAK,SAAS,WAAW,GAAG;AACpD,QAAI,QAA4B;AAChC,QAAI;AACF,cAAQ,MAAM;AAAA,IAChB,QAAQ;AACN;AAAA,IACF;AACA,QAAI,CAAC,MAAO;AACZ,eAAW,QAAQ,MAAM,KAAK,KAAK,GAAG;AACpC,YAAMC,OAAM,KAAK,WAAW;AAC5B,UAAIA,KAAI,SAAS,QAAQ,KAAKA,KAAI,SAAS,mBAAmB,EAAG,QAAO;AAAA,IAC1E;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,eAAwB;AACtC,MAAI,OAAO,WAAW,eAAe,OAAO,aAAa,YAAa,QAAO;AAC7E,MAAI,OAAO,SAAS,iBAAiB,iBAAiB,EAAG,QAAO;AAChE,MAAI,OAAO,SAAS,iBAAiB,kBAAkB,EAAG,QAAO;AACjE,MAAI,SAAS,SAAS,OAAO,SAAS,MAAM,iBAAiB,KAAK,OAAO,SAAS,MAAM,kBAAkB,GAAI,QAAO;AACrH,SAAO,mBAAmB;AAC5B;AAOO,SAAS,wBAA8B;AAC5C,MAAI,OAAO,aAAa,YAAa;AACrC,MAAI,SAAS,eAAe,cAAc,EAAG;AAC7C,MAAI,aAAa,EAAG;AAEpB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,KAAK;AACX,QAAM,aAAa,QAAQ,kBAAkB;AAC7C,QAAM,cAAc;AACpB,WAAS,KAAK,YAAY,KAAK;AACjC;AAKO,SAAS,wBAA8B;AAC5C,MAAI,OAAO,aAAa,YAAa;AACrC,WAAS,eAAe,cAAc,GAAG,OAAO;AAClD;;;AD9FA,IAAM,UAAU;AAChB,IAAM,YAAY;AAClB,IAAM,YAAY;AAKlB,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBrB,SAAS,mBAAmB,SAAkB;AACnD,QAAM,gBAAY,sBAAO,KAAK;AAE9B,+BAAU,MAAM;AACd,QAAI,CAAC,SAAS;AAEZ,aAAO,eAAe,OAAO,eAAe,KAAK;AACjD,WAAK,OAAO,eAAe,MAAM,GAAG;AAClC,iBAAS,eAAe,SAAS,GAAG,OAAO;AAC3C,iBAAS,eAAe,SAAS,GAAG,OAAO;AAC3C,8BAAsB;AACtB,eAAO,cAAc;AACrB,kBAAU,UAAU;AAAA,MACtB;AACA;AAAA,IACF;AAGA,WAAO,eAAe,OAAO,eAAe,KAAK;AAGjD,QAAI,CAAC,SAAS,eAAe,SAAS,GAAG;AACvC,YAAM,eAAe,SAAS,cAAc,QAAQ;AACpD,mBAAa,KAAK;AAClB,mBAAa,cAAc;AAC3B,eAAS,KAAK,YAAY,YAAY;AAAA,IACxC;AAIA,0BAAsB;AAGtB,QAAI,CAAC,SAAS,eAAe,SAAS,GAAG;AACvC,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,aAAO,KAAK;AACZ,aAAO,MAAM;AACb,eAAS,KAAK,YAAY,MAAM;AAChC,gBAAU,UAAU;AAAA,IACtB;AAEA,WAAO,MAAM;AACX,aAAO,eAAe,OAAO,eAAe,KAAK;AACjD,WAAK,OAAO,eAAe,MAAM,GAAG;AAClC,iBAAS,eAAe,SAAS,GAAG,OAAO;AAC3C,iBAAS,eAAe,SAAS,GAAG,OAAO;AAC3C,8BAAsB;AACtB,eAAO,cAAc;AACrB,kBAAU,UAAU;AAAA,MACtB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AACd;AAKO,SAAS,kBAAkB;AAChC,QAAM,KAAM,OAAe;AAC3B,MAAI,IAAI,KAAM,IAAG,KAAK;AACxB;;;AEvGA,IAAAC,gBAAyC;;;ACKlC,SAAS,eAAe,SAAgC;AAC7D,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,SAAO,QACJ,MAAM,GAAG,EACT,OAAO,OAAO,EACd,OAAsB,CAAC,UAAU,gBAAgB;AAChD,UAAM,QAAQ,YAAY,MAAM,GAAG;AACnC,QAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,UAAM,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,aAAa,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC;AAC1E,UAAM,QAAQ,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK;AAC5C,aAAS,GAAG,IAAI;AAChB,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACT;AAKO,SAAS,WAAW,MAAsB;AAC/C,SAAO,KACJ,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,YAAY,EACZ,QAAQ,aAAa,EAAE,EACvB,QAAQ,QAAQ,GAAG;AACxB;AAKO,SAAS,WAAW,IAAkB;AAC3C,MAAI,OAAO,aAAa,YAAa;AACrC,QAAM,UAAU,SAAS,eAAe,EAAE;AAC1C,MAAI,SAAS;AACX,YAAQ,eAAe,EAAE,UAAU,UAAU,OAAO,QAAQ,CAAC;AAAA,EAC/D;AACF;AAMO,SAAS,kBAAkB,MAA6D;AAC7F,QAAM,QAAQ,KAAK,MAAM,4BAA4B;AACrD,MAAI,CAAC,MAAO,QAAO,EAAE,MAAM,SAAS,IAAI,IAAI,GAAG;AAE/C,QAAM,WAAW,MAAM,CAAC;AACxB,QAAM,cAAc,MAAM,CAAC;AAE3B,QAAM,YAAsB,CAAC;AAC7B,MAAI,KAAK;AAGT,aAAW,CAAC,EAAE,KAAK,KAAK,KAAK,SAAS,SAAS,qBAAqB,GAAG;AACrE,QAAI,QAAQ,SAAS;AACnB,gBAAU,KAAK,GAAG,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAAA,IACtD,WAAW,QAAQ,MAAM;AACvB,WAAK;AAAA,IACP;AAAA,EACF;AAIA,QAAM,WAAW,SAAS,QAAQ,mBAAmB,EAAE;AACvD,aAAW,SAAS,SAAS,MAAM,KAAK,EAAE,OAAO,OAAO,GAAG;AACzD,QAAI,MAAM,WAAW,GAAG,EAAG,WAAU,KAAK,MAAM,MAAM,CAAC,CAAC;AAAA,aAC/C,MAAM,WAAW,GAAG,KAAK,CAAC,GAAI,MAAK,MAAM,MAAM,CAAC;AAAA,EAC3D;AAEA,SAAO,EAAE,MAAM,aAAa,SAAS,UAAU,KAAK,GAAG,GAAG,GAAG;AAC/D;AAEA,IAAI,gBAAgB;AAQb,SAAS,kBAA0B;AACxC,SAAO,SAAS,EAAE,aAAa;AACjC;AAOO,SAAS,WAAW,aAA6C;AACtE,QAAM,QAAgC,CAAC;AACvC,MAAI,CAAC,aAAa,KAAK,EAAG,QAAO;AAGjC,QAAM,YAAY;AAClB,MAAI;AACJ,UAAQ,QAAQ,UAAU,KAAK,WAAW,OAAO,MAAM;AACrD,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,QAAQ,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK;AACtC,UAAM,GAAG,IAAI;AAAA,EACf;AAGA,QAAM,eAAe,YAAY,MAAM,yBAAyB;AAChE,MAAI,cAAc;AAChB,UAAM,WAAW,MAAM,OAAO,KAAK;AACnC,UAAM,aAAa,aAAa,IAAI,OAAK,EAAE,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG;AACjE,UAAM,OAAO,IAAI,WAAW,GAAG,QAAQ,IAAI,UAAU,KAAK;AAAA,EAC5D;AAGA,QAAM,UAAU,YAAY,MAAM,6BAA6B;AAC/D,MAAI,WAAW,CAAC,MAAM,IAAI,GAAG;AAC3B,UAAM,IAAI,IAAI,QAAQ,CAAC;AAAA,EACzB;AAEA,SAAO;AACT;AASO,SAAS,eAAe,aAA0C;AACvE,QAAM,QAA6B,CAAC;AACpC,MAAI,CAAC,aAAa,KAAK,EAAG,QAAO;AAEjC,QAAM,YAAY;AAClB,MAAI;AACJ,UAAQ,QAAQ,UAAU,KAAK,WAAW,OAAO,MAAM;AACrD,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,QAAQ,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK;AAGlD,QAAI,QAAQ,WAAW,OAAO,UAAU,UAAU;AAChD,YAAM,GAAG,IAAI,eAAe,KAAK;AAAA,IACnC,OAAO;AACL,YAAM,GAAG,IAAI;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AACT;;;AChJO,SAAS,cAAcC,WAA2B;AACvD,MAAI,CAACA,UAAU,QAAO,CAAC;AACvB,QAAM,QAAQA,UAAS,QAAQ,SAAS,IAAI,EAAE,QAAQ,OAAO,EAAE,EAAE,MAAM,IAAI;AAC3E,QAAM,SAAkB,CAAC;AACzB,QAAM,UAAU,oBAAI,IAAY;AAChC,MAAI,IAAI;AAER,SAAO,IAAI,MAAM,QAAQ;AACvB,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI;AAGJ,QAAK,QAAQ,QAAQ,MAAM,mBAAmB,GAAI;AAChD,YAAM,QAAQ,MAAM,CAAC,EAAE;AACvB,YAAM,UAAU,MAAM,CAAC;AACvB,YAAM,EAAE,MAAAC,OAAM,SAAAC,UAAS,IAAI,SAAS,IAAI,kBAAkB,OAAO;AACjE,YAAM,SAAS,YAAY,WAAWD,MAAK,QAAQ,UAAU,EAAE,CAAC;AAChE,UAAIE,MAAK;AACT,UAAI,IAAI;AACR,aAAO,QAAQ,IAAIA,GAAE,GAAG;AACtB;AACA,QAAAA,MAAK,GAAG,MAAM,IAAI,CAAC;AAAA,MACrB;AACA,cAAQ,IAAIA,GAAE;AACd,aAAO,KAAK,EAAE,MAAM,UAAU,OAAO,MAAAF,OAAM,IAAAE,KAAI,SAASD,YAAW,OAAU,CAAC;AAC9E;AACA;AAAA,IACF;AAGA,QAAK,QAAQ,QAAQ,MAAM,2BAA2B,GAAI;AACxD,YAAM,UAAU,MAAM,CAAC;AACvB,YAAM,QAAQ,MAAM,CAAC,MAAM,OAAO,WAAW;AAC7C,aAAO,KAAK,EAAE,MAAM,aAAa,SAAS,MAAM,CAAC;AACjD;AACA;AAAA,IACF;AAGA,QAAI,QAAQ,WAAW,KAAK,GAAG;AAC7B,YAAM,cAAc,QAAQ,MAAM,CAAC,EAAE,KAAK;AAC1C,YAAM,aAAa,YAAY,MAAM,wBAAwB;AAC7D,YAAM,OAAO,YAAY,QAAQ,wBAAwB,EAAE,EAAE,KAAK;AAClE,YAAM,QAAQ,aAAa,WAAW,CAAC,IAAI;AAC3C,YAAM,UAAoB,CAAC;AAC3B;AACA,aAAO,IAAI,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,KAAK,GAAG;AAC7D,gBAAQ,KAAK,MAAM,CAAC,CAAC;AACrB;AAAA,MACF;AACA,aAAO,KAAK,EAAE,MAAM,aAAa,UAAU,MAAM,OAAO,SAAS,QAAQ,KAAK,IAAI,EAAE,CAAC;AACrF;AACA;AAAA,IACF;AAGA,QAAI,QAAQ,WAAW,KAAK,GAAG;AAC7B,YAAM,OAAO,QAAQ,MAAM,CAAC,EAAE,KAAK;AAGnC,UAAI,SAAS,IAAI;AACf,eAAO,KAAK,EAAE,MAAM,aAAa,SAAS,KAAK,CAAC;AAChD;AACA;AAAA,MACF;AAEA,YAAM,YAAY,KAAK,MAAM,WAAW;AACxC,YAAM,gBAAgB,YAAY,UAAU,CAAC,IAAI;AAGjD,UAAI,IAAI,IAAI;AACZ,UAAI,cAAc;AAClB,UAAI,aAAa;AAEjB,aAAO,IAAI,MAAM,QAAQ;AACvB,cAAM,iBAAiB,MAAM,CAAC,EAAE,KAAK;AACrC,YAAI,mBAAmB,OAAO;AAC5B,cAAI,gBAAgB,GAAG;AACrB,yBAAa;AACb;AAAA,UACF,OAAO;AACL;AAAA,UACF;AAAA,QACF,WAAW,eAAe,WAAW,KAAK,GAAG;AAE3C;AAAA,QACF;AACA;AAAA,MACF;AAEA,UAAI,YAAY;AAEd,cAAM,eAAyB,CAAC;AAChC,iBAAS,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;AAC9B,uBAAa,KAAK,MAAM,CAAC,CAAC;AAAA,QAC5B;AACA,cAAM,aAAa,aAAa,KAAK,IAAI;AAGzC,cAAM,aAAa,YAAY,KAAK,MAAM,cAAc,MAAM,EAAE,KAAK,IAAI;AAGzE,YAAI,cAAc;AAClB,YAAI,YAAY;AAChB,cAAM,kBAAkB,WAAW,MAAM,iBAAiB;AAC1D,YAAI,iBAAiB;AACnB,wBAAc,gBAAgB,CAAC;AAAA,QACjC,WAAW,YAAY;AAErB,sBAAY;AAAA,QACd;AAEA,cAAM,QAAQ,WAAW,WAAW;AACpC,YAAI,aAAa,CAAC,MAAM,OAAO,GAAG;AAChC,gBAAM,OAAO,IAAI;AAAA,QACnB;AAGA,cAAM,QAAQ,WAAW,UAAU;AAEnC,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS,gBAAgB;AAAA,QAC3B,CAAmB;AAEnB,YAAI,IAAI;AACR;AAAA,MACF,OAAO;AAEL,eAAO,KAAK,EAAE,MAAM,aAAa,SAAS,KAAK,CAAC;AAChD;AACA;AAAA,MACF;AAAA,IACF;AAGA,QAAK,QAAQ,QAAQ,MAAM,uDAAuD,GAAI;AACpF,YAAM,CAAC,EAAE,SAAS,KAAK,aAAa,MAAM,QAAQ,IAAI;AAEtD,UAAI,QAAQ,KAAK,GAAG;AAClB,eAAO,KAAK,EAAE,MAAM,aAAa,SAAS,QAAQ,KAAK,EAAE,CAAC;AAAA,MAC5D;AAEA,UAAI,MAAM;AACV,YAAM,QAAuB,CAAC;AAC9B,UAAI,IAAI,SAAS,OAAO,GAAG;AACzB,cAAM,IAAI,QAAQ,SAAS,EAAE;AAC7B,cAAM,QAAQ;AACd,cAAM,SAAS;AAAA,MACjB,WAAW,IAAI,SAAS,QAAQ,GAAG;AACjC,cAAM,IAAI,QAAQ,UAAU,EAAE;AAC9B,cAAM,QAAQ;AACd,cAAM,SAAS;AAAA,MACjB,WAAW,IAAI,SAAS,SAAS,GAAG;AAClC,cAAM,IAAI,QAAQ,WAAW,EAAE;AAC/B,cAAM,UAAU;AAChB,cAAM,SAAS;AAAA,MACjB;AACA,UAAI,MAAM;AACR,cAAM,CAAC,OAAO,MAAM,IAAI,KAAK,MAAM,GAAG;AACtC,YAAI,MAAO,OAAM,QAAQ,MAAM,KAAK;AACpC,YAAI,OAAQ,OAAM,SAAS,OAAO,KAAK;AAAA,MACzC;AACA,aAAO,KAAK,EAAE,MAAM,SAAS,KAAK,KAAK,MAAM,CAAC;AAE9C,UAAI,SAAS,KAAK,GAAG;AACnB,eAAO,KAAK,EAAE,MAAM,aAAa,SAAS,SAAS,KAAK,EAAE,CAAC;AAAA,MAC7D;AACA;AACA;AAAA,IACF;AAGA,QAAI,QAAQ,SAAS,GAAG,KAAK,IAAI,IAAI,MAAM,UAAU,MAAM,IAAI,CAAC,EAAE,SAAS,KAAK,GAAG;AACjF,YAAM,aAAa,CAAC,IAAI;AACxB;AACA,iBAAW,KAAK,MAAM,CAAC,CAAC;AACxB;AACA,aAAO,IAAI,MAAM,UAAU,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,GAAG,GAAG;AACxD,mBAAW,KAAK,MAAM,CAAC,CAAC;AACxB;AAAA,MACF;AACA,aAAO,KAAK,EAAE,MAAM,SAAS,SAAS,WAAW,KAAK,IAAI,EAAE,CAAC;AAC7D;AAAA,IACF;AAGA,QAAK,QAAQ,QAAQ,MAAM,6BAA6B,GAAI;AAC1D,YAAM,YAAY,CAAC,IAAI;AACvB;AACA,aAAO,IAAI,MAAM,QAAQ;AACvB,cAAM,WAAW,MAAM,CAAC;AACxB,cAAM,cAAc,SAAS,KAAK;AAClC,YACE,YAAY,MAAM,6BAA6B,KAC/C,gBAAgB,MAChB,SAAS,WAAW,IAAI,GACxB;AACA,oBAAU,KAAK,QAAQ;AACvB;AAAA,QACF,OAAO;AACL;AAAA,QACF;AAAA,MACF;AACA,aAAO,KAAK,EAAE,MAAM,QAAQ,SAAS,UAAU,KAAK,IAAI,EAAE,CAAC;AAC3D;AAAA,IACF;AAGA,QAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,YAAM,aAAa,CAAC,IAAI;AACxB;AACA,aAAO,IAAI,MAAM,WAAW,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,GAAG,KAAK,MAAM,CAAC,EAAE,KAAK,MAAM,KAAK;AACtF,mBAAW,KAAK,MAAM,CAAC,CAAC;AACxB;AAAA,MACF;AACA,YAAM,WAAW,WAAW,KAAK,IAAI,EAAE,QAAQ,WAAW,EAAE;AAC5D,YAAM,EAAE,MAAAD,OAAM,SAAAC,UAAS,IAAAC,IAAG,IAAI,kBAAkB,QAAQ;AACxD,aAAO,KAAK,EAAE,MAAM,cAAc,SAASF,OAAM,SAASC,YAAW,QAAW,IAAAC,IAAG,CAAC;AACpF;AAAA,IACF;AAGA,QAAI,6BAA6B,KAAK,OAAO,GAAG;AAC9C,aAAO,KAAK,EAAE,MAAM,KAAK,CAAC;AAC1B;AACA;AAAA,IACF;AAGA,QAAI,kBAAkB,KAAK,OAAO,GAAG;AACnC,aAAO,KAAK,EAAE,MAAM,MAAM,CAAC;AAC3B;AACA;AAAA,IACF;AAGA,QAAI,YAAY,IAAI;AAClB;AACA;AAAA,IACF;AAGA,QAAI,gBAAgB,QAAQ,MAAM,oBAAoB;AACtD,QAAI,eAAe;AACjB,YAAM,UAAU,cAAc,CAAC,EAAE,YAAY;AAE7C,YAAM,eAAe,oBAAI,IAAI;AAAA,QAC3B;AAAA,QAAQ;AAAA,QAAQ;AAAA,QAAM;AAAA,QAAO;AAAA,QAAS;AAAA,QAAM;AAAA,QAAO;AAAA,QACnD;AAAA,QAAQ;AAAA,QAAQ;AAAA,QAAS;AAAA,QAAU;AAAA,QAAS;AAAA,MAC9C,CAAC;AAED,YAAM,gBAAgB,MAAM,MAAM,CAAC,EAAE,KAAK,IAAI;AAG9C,YAAM,eAAe,IAAI,OAAO,SAAS,OAAO,gBAAgB,GAAG;AACnE,YAAM,eAAe,cAAc,MAAM,YAAY;AAErD,UAAI,cAAc;AAChB,cAAM,cAAc,aAAa,CAAC;AAClC,cAAM,QAAQ,aAAa,CAAC,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAExD,cAAM,gBAAgB,YAAY,SAAS,IAAI,KAAK,aAAa,IAAI,OAAO;AAE5E,YAAI,eAAe;AACjB,gBAAM,YAAY,cAAc,UAAU,GAAG,aAAa,QAAS,YAAY,MAAM;AACrF,gBAAM,gBAAgB,UAAU,MAAM,IAAI,EAAE;AAE5C,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,KAAK;AAAA,YACL;AAAA,YACA,UAAU,CAAC;AAAA;AAAA,UACb,CAAmB;AAEnB,eAAK;AACL;AAAA,QACF,OAAO;AAEL,cAAI,cAAc;AAClB,cAAI,aAAa;AACjB,cAAI,iBAAiB;AAErB,gBAAM,WAAW,IAAI,OAAO,MAAM,OAAO,aAAa,IAAI;AAC1D,mBAAS,YAAY,aAAa,QAAS,YAAY;AAEvD,cAAI;AACJ,kBAAQ,YAAY,SAAS,KAAK,aAAa,OAAO,MAAM;AAC1D,gBAAI,UAAU,CAAC,EAAE,WAAW,IAAI,GAAG;AACjC;AACA,kBAAI,cAAc,GAAG;AACnB,6BAAa,UAAU;AACvB,iCAAiB,UAAU,CAAC,EAAE;AAC9B;AAAA,cACF;AAAA,YACF,OAAO;AACL,kBAAI,CAAC,UAAU,CAAC,EAAE,SAAS,IAAI,GAAG;AAChC;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,cAAI,eAAe,IAAI;AACrB,kBAAM,YAAY,cAAc,UAAU,GAAG,aAAa,cAAc;AACxE,kBAAM,gBAAgB,UAAU,MAAM,IAAI,EAAE;AAG5C,gBAAI,YAAY,WAAW,YAAY,UAAU;AAC/C,qBAAO,KAAK;AAAA,gBACV,MAAM;AAAA,gBACN,SAAS;AAAA,gBACT,SAAS,gBAAgB;AAAA,cAC3B,CAAC;AAAA,YACH,OAAO;AACL,oBAAM,eAAe,cAAc,UAAU,aAAa,QAAS,YAAY,QAAQ,UAAU;AACjG,qBAAO,KAAK;AAAA,gBACV,MAAM;AAAA,gBACN,KAAK;AAAA,gBACL;AAAA,gBACA,UAAU,cAAc,YAAY;AAAA,cACtC,CAAmB;AAAA,YACrB;AAEA,iBAAK;AACL;AAAA,UACF,OAAO;AAEL,kBAAM,YAAY,cAAc,UAAU,GAAG,aAAa,QAAS,YAAY,MAAM;AACrF,kBAAM,gBAAgB,UAAU,MAAM,IAAI,EAAE;AAE5C,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN,KAAK;AAAA,cACL;AAAA,cACA,UAAU,CAAC;AAAA,YACb,CAAmB;AAEnB,iBAAK;AACL;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,iBAAiB,CAAC,IAAI;AAC5B;AACA,WAAO,IAAI,MAAM,QAAQ;AACvB,YAAM,WAAW,MAAM,CAAC;AACxB,YAAM,cAAc,SAAS,KAAK;AAClC,UACE,gBAAgB,MAChB,YAAY,WAAW,GAAG,KAC1B,YAAY,WAAW,KAAK,KAC5B,YAAY,SAAS,GAAG,KACxB,YAAY,MAAM,wBAAwB,KAC1C,YAAY,WAAW,GAAG,KAC1B,YAAY,WAAW,KAAK,KAC5B,YAAY,WAAW,IAAI,KAC3B,YAAY,MAAM,sBAAsB,GACxC;AACA;AAAA,MACF;AACA,qBAAe,KAAK,QAAQ;AAC5B;AAAA,IACF;AACA,UAAM,eAAe,eAAe,KAAK,IAAI,EAAE,KAAK;AACpD,UAAM,EAAE,MAAM,SAAS,GAAG,IAAI,kBAAkB,YAAY;AAC5D,WAAO,KAAK,EAAE,MAAM,aAAa,SAAS,MAAM,SAAS,WAAW,QAAW,GAAG,CAAC;AAAA,EACrF;AAEA,SAAO;AACT;AAeA,SAAS,WAAW,YAA4C;AAC9D,QAAM,QAAgC,CAAC;AACvC,QAAM,QAAQ,WAAW,MAAM,IAAI;AACnC,MAAI,cAAc;AAClB,MAAI,SAAmB,CAAC;AACxB,MAAI,eAAe;AAEnB,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,KAAK;AAG1B,QAAI,QAAQ,WAAW,KAAK,GAAG;AAC7B,YAAM,OAAO,QAAQ,MAAM,CAAC,EAAE,KAAK;AACnC,UAAI,SAAS,IAAI;AAEf,uBAAe,KAAK,IAAI,GAAG,eAAe,CAAC;AAAA,MAC7C,OAAO;AACL;AAAA,MACF;AAAA,IACF;AAGA,QAAI,iBAAiB,KAAK,QAAQ,MAAM,aAAa,GAAG;AAEtD,UAAI,OAAO,SAAS,KAAK,gBAAgB,WAAW;AAClD,cAAM,WAAW,IAAI,OAAO,KAAK,IAAI,EAAE,KAAK;AAAA,MAC9C;AACA,oBAAc,QAAQ,MAAM,CAAC;AAC7B,eAAS,CAAC;AAAA,IACZ,OAAO;AACL,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,EACF;AAGA,QAAM,WAAW,IAAI,OAAO,KAAK,IAAI,EAAE,KAAK;AAE5C,SAAO;AACT;;;ACnbA,kBAAiB;AAEjB,wBAAuB;AACvB,wBAAuB;AACvB,oBAAmB;AACnB,iBAAgB;AAChB,iBAAgB;AAChB,kBAAiB;AACjB,kBAAiB;AACjB,iBAAgB;AAChB,sBAAqB;AACrB,kBAAiB;AACjB,oBAAmB;AACnB,iBAAgB;AAChB,gBAAe;AACf,kBAAiB;AACjB,iBAAgB;AAChB,kBAAiB;AACjB,mBAAkB;AAClB,oBAAmB;AACnB,kBAAiB;AACjB,kBAAiB;AACjB,iBAAiB;AACjB,wBAAuB;AACvB,kBAAiB;AACjB,mBAAkB;AAElB,YAAAC,QAAK,iBAAiB,cAAc,kBAAAC,OAAU;AAC9C,YAAAD,QAAK,iBAAiB,MAAM,kBAAAC,OAAU;AACtC,YAAAD,QAAK,iBAAiB,OAAO,kBAAAC,OAAU;AACvC,YAAAD,QAAK,iBAAiB,cAAc,kBAAAE,OAAU;AAC9C,YAAAF,QAAK,iBAAiB,MAAM,kBAAAE,OAAU;AACtC,YAAAF,QAAK,iBAAiB,OAAO,kBAAAE,OAAU;AACvC,YAAAF,QAAK,iBAAiB,UAAU,cAAAG,OAAM;AACtC,YAAAH,QAAK,iBAAiB,MAAM,cAAAG,OAAM;AAClC,YAAAH,QAAK,iBAAiB,OAAO,WAAAI,OAAG;AAChC,YAAAJ,QAAK,iBAAiB,QAAQ,WAAAK,OAAG;AACjC,YAAAL,QAAK,iBAAiB,OAAO,WAAAK,OAAG;AAChC,YAAAL,QAAK,iBAAiB,OAAO,WAAAK,OAAG;AAChC,YAAAL,QAAK,iBAAiB,QAAQ,YAAAM,OAAI;AAClC,YAAAN,QAAK,iBAAiB,QAAQ,YAAAO,OAAI;AAClC,YAAAP,QAAK,iBAAiB,MAAM,YAAAO,OAAI;AAChC,YAAAP,QAAK,iBAAiB,OAAO,YAAAO,OAAI;AACjC,YAAAP,QAAK,iBAAiB,OAAO,WAAAQ,OAAG;AAChC,YAAAR,QAAK,iBAAiB,YAAY,gBAAAS,OAAQ;AAC1C,YAAAT,QAAK,iBAAiB,MAAM,gBAAAS,OAAQ;AACpC,YAAAT,QAAK,iBAAiB,QAAQ,YAAAU,OAAI;AAClC,YAAAV,QAAK,iBAAiB,UAAU,cAAAW,OAAM;AACtC,YAAAX,QAAK,iBAAiB,MAAM,cAAAW,OAAM;AAClC,YAAAX,QAAK,iBAAiB,OAAO,WAAAY,OAAG;AAChC,YAAAZ,QAAK,iBAAiB,MAAM,UAAAa,OAAE;AAC9B,YAAAb,QAAK,iBAAiB,QAAQ,YAAAc,OAAI;AAClC,YAAAd,QAAK,iBAAiB,OAAO,WAAAe,OAAG;AAChC,YAAAf,QAAK,iBAAiB,QAAQ,YAAAgB,OAAI;AAClC,YAAAhB,QAAK,iBAAiB,SAAS,aAAAiB,OAAK;AACpC,YAAAjB,QAAK,iBAAiB,UAAU,cAAAkB,OAAM;AACtC,YAAAlB,QAAK,iBAAiB,QAAQ,YAAAmB,OAAI;AAClC,YAAAnB,QAAK,iBAAiB,QAAQ,YAAAoB,OAAI;AAClC,YAAApB,QAAK,iBAAiB,QAAQ,WAAAqB,OAAI;AAClC,YAAArB,QAAK,iBAAiB,cAAc,kBAAAsB,OAAU;AAC9C,YAAAtB,QAAK,iBAAiB,QAAQ,YAAAuB,OAAI;AAClC,YAAAvB,QAAK,iBAAiB,SAAS,aAAAwB,OAAK;AAEpC,IAAO,yBAAQ,YAAAxB;;;ACjDR,SAAS,WAAW,UAAkB,cAAoC;AAC/E,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,QAAM,MAAM,+BAA+B,eAAe,IAAI,YAAY,KAAK,EAAE;AACjF,OAAK,YAAY;AACjB,OAAK,aAAa,eAAe,MAAM;AAEvC,QAAM,cAAc,yBAAyB,KAAK,QAAQ;AAC1D,MAAI,aAAa;AACf,SAAK,YAAY,MAAM,QAAQ;AAAA,EACjC,OAAO;AACL,SAAK,cAAc;AAAA,EACrB;AACA,SAAO;AACT;AAOO,SAAS,gBAAgB,MAAc,UAAkB,OAA6B;AAC3F,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AAEpB,QAAM,OAAO,UAAU,MAAM,OAAO,EAAE,CAAC,GAAG,KAAK,KAAK;AAGpD,MAAI,OAAO;AACT,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AACnB,WAAO,YAAY,WAAW,aAAa,CAAC;AAC5C,UAAM,YAAY,SAAS,cAAc,MAAM;AAC/C,cAAU,cAAc;AACxB,WAAO,YAAY,SAAS;AAC5B,YAAQ,YAAY,MAAM;AAAA,EAC5B;AAGA,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,QAAM,SAAS,SAAS,cAAc,MAAM;AAC5C,SAAO,YAAY,YAAY,QAAQ,WAAW;AAElD,MAAI;AACF,QAAI,QAAQ,uBAAK,YAAY,IAAI,GAAG;AAClC,aAAO,YAAY,uBAAK,UAAU,MAAM,EAAE,UAAU,KAAK,CAAC,EAAE;AAAA,IAC9D,OAAO;AACL,aAAO,YAAY,uBAAK,cAAc,IAAI,EAAE;AAAA,IAC9C;AAAA,EACF,QAAQ;AACN,WAAO,cAAc;AAAA,EACvB;AAEA,MAAI,YAAY,MAAM;AACtB,UAAQ,YAAY,GAAG;AAGvB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,YAAY;AACpB,UAAQ,QAAQ;AAChB,QAAM,WAAW,WAAW,cAAc;AAC1C,WAAS,MAAM,WAAW;AAC1B,UAAQ,YAAY,QAAQ;AAE5B,MAAI,QAA8C;AAClD,UAAQ,iBAAiB,SAAS,MAAM;AACtC,cAAU,UAAU,UAAU,IAAI;AAClC,aAAS,cAAc;AACvB,QAAI,MAAO,cAAa,KAAK;AAC7B,YAAQ,WAAW,MAAM;AAAE,eAAS,cAAc;AAAA,IAAgB,GAAG,IAAI;AAAA,EAC3E,CAAC;AAED,UAAQ,YAAY,OAAO;AAC3B,SAAO;AACT;AAIA,IAAM,2BAAmD;AAAA,EACvD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AACb;AAMO,SAAS,iBACd,MACA,OACA,MACa;AACb,QAAM,KAAK,SAAS,cAAc,KAAK;AACvC,KAAG,YAAY,gCAAgC,QAAQ,MAAM;AAE7D,MAAI,OAAO;AACT,UAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,WAAO,YAAY;AACnB,UAAM,eAAe,QAAQ,yBAAyB,IAAI,KAAK;AAC/D,WAAO,YAAY,WAAW,cAAc,qBAAqB,CAAC;AAClE,UAAM,YAAY,SAAS,cAAc,MAAM;AAC/C,cAAU,cAAc;AACxB,WAAO,YAAY,SAAS;AAC5B,OAAG,YAAY,MAAM;AAAA,EACvB;AAEA,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,KAAG,YAAY,IAAI;AAEnB,SAAO;AACT;AAQO,SAAS,cACd,OACA,MACA,aACa;AACb,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AACpB,MAAI,YAAa,SAAQ,OAAO;AAEhC,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AAEpB,QAAM,eAAe,QAAQ;AAC7B,QAAM,SAAS,WAAW,cAAc,kBAAkB;AAC1D,UAAQ,YAAY,MAAM;AAE1B,QAAM,YAAY,SAAS,cAAc,MAAM;AAC/C,YAAU,cAAc,SAAS;AACjC,UAAQ,YAAY,SAAS;AAG7B,UAAQ,iBAAiB,UAAU,MAAM;AACvC,WAAO,UAAU,OAAO,0BAA0B,QAAQ,IAAI;AAAA,EAChE,CAAC;AAED,UAAQ,YAAY,OAAO;AAE3B,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,UAAQ,YAAY,IAAI;AAExB,SAAO;AACT;AAQO,SAAS,YAAY,OAAkC;AAC5D,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,YAAY;AAGnB,SAAO,iBAAiB,SAAS,CAAC,MAAM;AACtC,QAAI,EAAE,WAAW,QAAQ;AACvB,aAAO,MAAM;AAAA,IACf;AAAA,EACF,CAAC;AAED,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY;AAGlB,QAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,SAAO,YAAY;AAEnB,QAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,UAAQ,YAAY;AACpB,UAAQ,cAAc;AACtB,SAAO,YAAY,OAAO;AAE1B,QAAM,WAAW,SAAS,cAAc,QAAQ;AAChD,WAAS,YAAY;AACrB,WAAS,YAAY,WAAW,OAAO,CAAC;AACxC,WAAS,iBAAiB,SAAS,MAAM,OAAO,MAAM,CAAC;AACvD,SAAO,YAAY,QAAQ;AAE3B,QAAM,YAAY,MAAM;AAGxB,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,QAAM,YAAY,IAAI;AAEtB,SAAO,YAAY,KAAK;AACxB,SAAO;AACT;AAQO,SAAS,YACd,SACAyB,eACa;AACb,QAAM,OAAO,QAAQ,MAAM,IAAI,EAAE,OAAO,OAAK,EAAE,KAAK,CAAC;AACrD,MAAI,KAAK,SAAS,GAAG;AACnB,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,cAAc;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,CAAC,QAChB,IAAI,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAElD,QAAM,cAAc,SAAS,KAAK,CAAC,CAAC;AACpC,QAAM,WAAW,KAAK,MAAM,CAAC,EAAE,IAAI,QAAQ;AAE3C,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AAEpB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,YAAY;AAGlB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,KAAK,SAAS,cAAc,IAAI;AACtC,aAAW,QAAQ,aAAa;AAC9B,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,YAAY;AACf,OAAG,YAAYA,cAAa,IAAI,CAAC;AACjC,OAAG,YAAY,EAAE;AAAA,EACnB;AACA,QAAM,YAAY,EAAE;AACpB,QAAM,YAAY,KAAK;AAGvB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,aAAW,SAAS,UAAU;AAC5B,UAAMC,MAAK,SAAS,cAAc,IAAI;AACtC,eAAW,QAAQ,OAAO;AACxB,YAAM,KAAK,SAAS,cAAc,IAAI;AACtC,SAAG,YAAY;AACf,SAAG,YAAYD,cAAa,IAAI,CAAC;AACjC,MAAAC,IAAG,YAAY,EAAE;AAAA,IACnB;AACA,UAAM,YAAYA,GAAE;AAAA,EACtB;AACA,QAAM,YAAY,KAAK;AACvB,UAAQ,YAAY,KAAK;AAEzB,SAAO;AACT;AAOO,SAAS,WACd,SACAD,eACa;AACb,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAM,QAA4D,CAAC;AAEnE,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,KAAK,KAAK,EAAG;AAClB,UAAM,QAAQ,KAAK,MAAM,6BAA6B;AACtD,QAAI,OAAO;AACT,YAAM,KAAK,EAAE,QAAQ,MAAM,CAAC,EAAE,QAAQ,QAAQ,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,IAC1E;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,cAAc;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,UAAU,KAAK,MAAM,CAAC,EAAE,MAAM;AAChD,QAAM,OAAO,SAAS,cAAc,YAAY,OAAO,IAAI;AAC3D,OAAK,YAAY;AAEjB,aAAW,QAAQ,OAAO;AACxB,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,YAAY;AACf,OAAG,YAAYA,cAAa,KAAK,IAAI,CAAC;AACtC,SAAK,YAAY,EAAE;AAAA,EACrB;AAEA,SAAO;AACT;AAaO,SAAS,UACd,SACAA,eACa;AACb,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAEhB,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY;AAClB,QAAM,cAAc;AACpB,MAAI,YAAY,KAAK;AAErB,QAAM,KAAK,SAAS,cAAc,IAAI;AACtC,KAAG,YAAY;AAEf,aAAW,KAAK,SAAS;AACvB,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,YAAY,+BAA+B,EAAE,KAAK;AAErD,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,YAAY;AACd,MAAE,OAAO,IAAI,EAAE,EAAE;AACjB,MAAE,YAAYA,cAAa,EAAE,KAAK,QAAQ,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;AAC/D,MAAE,iBAAiB,SAAS,CAAC,MAAM;AACjC,QAAE,eAAe;AACjB,YAAM,SAAS,SAAS,eAAe,EAAE,EAAE;AAC3C,UAAI,OAAQ,QAAO,eAAe,EAAE,UAAU,UAAU,OAAO,QAAQ,CAAC;AAAA,IAC1E,CAAC;AAED,OAAG,YAAY,CAAC;AAChB,OAAG,YAAY,EAAE;AAAA,EACnB;AAEA,MAAI,YAAY,EAAE;AAClB,SAAO;AACT;AAOO,SAAS,iBACd,SACA,SACAA,eACa;AACb,QAAM,KAAK,SAAS,cAAc,YAAY;AAC9C,KAAG,YAAY,gBAAgB,UAAU,IAAI,OAAO,KAAK,EAAE;AAC3D,KAAG,YAAYA,cAAa,OAAO,CAAC;AACpC,SAAO;AACT;;;AC1WO,SAAS,aAAa,MAAgC;AAC3D,QAAM,WAAW,SAAS,uBAAuB;AACjD,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,QACJ;AAEF,MAAI,YAAY;AAChB,MAAI;AAEJ,UAAQ,QAAQ,MAAM,KAAK,IAAI,OAAO,MAAM;AAE1C,QAAI,MAAM,QAAQ,WAAW;AAC3B,eAAS,YAAY,SAAS,eAAe,KAAK,MAAM,WAAW,MAAM,KAAK,CAAC,CAAC;AAAA,IAClF;AAEA,aAAS,YAAY,gBAAgB,MAAM,CAAC,CAAC,CAAC;AAC9C,gBAAY,MAAM;AAAA,EACpB;AAGA,MAAI,YAAY,KAAK,QAAQ;AAC3B,aAAS,YAAY,SAAS,eAAe,KAAK,MAAM,SAAS,CAAC,CAAC;AAAA,EACrE;AAEA,SAAO;AACT;AAKA,SAAS,gBAAgB,MAAoB;AAC3C,MAAI;AAGJ,MAAK,QAAQ,KAAK,MAAM,oBAAoB,GAAI;AAC9C,WAAO,WAAW,MAAM,CAAC,CAAC;AAAA,EAC5B;AAGA,MAAK,QAAQ,KAAK,MAAM,aAAa,GAAI;AACvC,UAAM,UAAU,MAAM,CAAC;AACvB,UAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,QAAI,QAAQ;AACZ,QAAI,kBAAkB;AACtB,QAAI,OAAO;AACX,QAAI,YAAY;AAEhB,QACE,MAAM,SAAS,GAAG,MAAM,oCAAoC,KAC5D,CAAC,OAAO,QAAQ,SAAS,UAAU,UAAU,UAAU,MAAM,EAAE,SAAS,MAAM,SAAS,CAAC,GACxF;AACA,cAAQ,MAAM,WAAW;AAAA,IAC3B;AACA,QAAI,CAAC,SAAS,UAAU,UAAU,UAAU,MAAM,EAAE,SAAS,MAAM,SAAS,CAAC,GAAG;AAC9E,wBAAkB,MAAM,WAAW;AAAA,IACrC;AACA,QAAI,CAAC,aAAa,gBAAgB,YAAY,MAAM,EAAE,SAAS,MAAM,SAAS,CAAC,GAAG;AAChF,aAAO,MAAM,SAAS,MAAM,SAAS,2BAA2B,MAAM,WAAW;AAAA,IACnF;AACA,UAAM,YAAY,MAAM,MAAM,SAAS,EAAE,KAAK,GAAG;AAEjD,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,YAAY;AACjB,SAAK,MAAM,iBAAiB,GAAG,IAAI,IAAI,eAAe,IAAI,KAAK;AAC/D,SAAK,MAAM,0BAA0B;AACrC,SAAK,YAAY,aAAa,SAAS,CAAC;AACxC,WAAO;AAAA,EACT;AAGA,MAAK,QAAQ,KAAK,MAAM,0BAA0B,GAAI;AACpD,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,MAAM,QAAQ,MAAM,CAAC;AAC1B,SAAK,YAAY,aAAa,MAAM,CAAC,CAAC,CAAC;AACvC,WAAO;AAAA,EACT;AAGA,MAAK,QAAQ,KAAK,MAAM,gBAAgB,GAAI;AAC1C,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,YAAY;AACjB,SAAK,YAAY,aAAa,MAAM,CAAC,CAAC,CAAC;AACvC,WAAO;AAAA,EACT;AAGA,MAAK,QAAQ,KAAK,MAAM,aAAa,GAAI;AACvC,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,YAAY;AACjB,SAAK,YAAY,aAAa,MAAM,CAAC,CAAC,CAAC;AACvC,WAAO;AAAA,EACT;AAGA,MAAK,QAAQ,KAAK,MAAM,qBAAqB,GAAI;AAC/C,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,YAAY,aAAa,MAAM,CAAC,CAAC,CAAC;AACrC,WAAO,YAAY,EAAE;AACrB,WAAO;AAAA,EACT;AAGA,MAAK,QAAQ,KAAK,MAAM,iBAAiB,GAAI;AAC3C,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,YAAY,aAAa,MAAM,CAAC,CAAC,CAAC;AACzC,WAAO;AAAA,EACT;AAGA,MAAK,QAAQ,KAAK,MAAM,WAAW,GAAI;AACrC,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,YAAY,aAAa,MAAM,CAAC,CAAC,CAAC;AACrC,WAAO;AAAA,EACT;AAGA,MAAK,QAAQ,KAAK,MAAM,aAAa,GAAI;AACvC,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,YAAY,aAAa,MAAM,CAAC,CAAC,CAAC;AACtC,WAAO;AAAA,EACT;AAGA,MAAK,QAAQ,KAAK,MAAM,aAAa,GAAI;AACvC,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,YAAY;AACjB,SAAK,cAAc,MAAM,CAAC;AAC1B,WAAO;AAAA,EACT;AAGA,MAAK,QAAQ,KAAK,MAAM,6BAA6B,GAAI;AACvD,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,YAAY;AACd,MAAE,OAAO,MAAM,CAAC;AAChB,MAAE,SAAS;AACX,MAAE,MAAM;AACR,MAAE,YAAY,aAAa,MAAM,CAAC,CAAC,CAAC;AACpC,WAAO;AAAA,EACT;AAGA,MAAI,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,GAAG;AAC9C,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,YAAY;AACjB,WAAO;AAAA,EACT;AAGA,SAAO,SAAS,eAAe,IAAI;AACrC;;;AChKA,IAAM,sBAA2C,CAAC,EAAE,eAAe,OAAO,WAAW,MAAM;AACzF,QAAM,KAAK,iBAAiB,eAAe,MAAM,OAAO,MAAM,IAAI;AAElE,MAAI,MAAM,MAAO,IAAG,UAAU,IAAI,GAAG,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC7E,MAAI,MAAM,MAAO,IAAG,aAAa,SAAS,MAAM,KAAK;AAGrD,QAAM,OAAO,GAAG,cAAc,sBAAsB;AACpD,MAAI,MAAM;AACR,SAAK,YAAY,WAAW,SAAS,CAAC;AAAA,EACxC;AAEA,SAAO;AACT;AAEA,IAAO,qBAAQ;;;ACff,IAAM,mBAAwC,CAAC,EAAE,OAAO,WAAW,MAAM;AACvE,QAAM,KAAK;AAAA,IACT,MAAM,SAAS;AAAA,IACf,MAAM;AAAA,IACN,MAAM,gBAAgB;AAAA,EACxB;AAEA,MAAI,MAAM,MAAO,IAAG,UAAU,IAAI,GAAG,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC7E,MAAI,MAAM,MAAO,IAAG,aAAa,SAAS,MAAM,KAAK;AAGrD,QAAM,OAAO,GAAG,cAAc,mBAAmB;AACjD,MAAI,MAAM;AACR,SAAK,YAAY,WAAW,SAAS,CAAC;AAAA,EACxC;AAEA,SAAO;AACT;AAEA,IAAO,kBAAQ;;;ACnBf,IAAM,iBAAsC,CAAC,EAAE,OAAO,WAAW,MAAM;AACrE,QAAM,QAAQ,MAAM,SAAS,MAAM,SAAS;AAC5C,QAAM,aAAa,MAAM,SAAS;AAClC,QAAM,cAAc,MAAM,SAAS;AAGnC,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AAGpB,QAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,MAAI,YAAY;AAChB,MAAI,YAAa,KAAI,UAAU,IAAI,GAAG,YAAY,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAE9E,QAAM,OAAO,MAAM,QAAQ;AAC3B,MAAI,KAAM,KAAI,YAAY,WAAW,IAAI,CAAC;AAC1C,MAAI,YAAY,SAAS,eAAe,KAAK,CAAC;AAG9C,QAAM,SAAS,YAAY,UAAU;AACrC,QAAM,OAAO,OAAO,cAAc,iBAAiB;AACnD,MAAI,MAAM;AAGR,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAClB,UAAM,YAAY,WAAW,SAAS,CAAC;AACvC,SAAK,YAAY,KAAK;AAAA,EACxB;AAEA,MAAI,iBAAiB,SAAS,MAAM;AAClC,QAAI,CAAC,OAAO,MAAM;AAChB,eAAS,KAAK,YAAY,MAAM;AAChC,aAAO,UAAU;AACjB,aAAO,iBAAiB,SAAS,MAAM;AACrC,eAAO,OAAO;AAAA,MAChB,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,IACnB;AAAA,EACF,CAAC;AAED,UAAQ,YAAY,GAAG;AACvB,UAAQ,YAAY,MAAM;AAE1B,SAAO;AACT;AAEA,IAAO,gBAAQ;;;AC9Cf,IAAM,kBAAuC,CAAC,EAAE,OAAO,WAAW,MAAM;AACtE,QAAM,MAAM,MAAM,OAAO,MAAM,QAAQ;AACvC,QAAM,QAAQ,MAAM;AACpB,QAAM,OAAO,MAAM,QAAQ;AAC3B,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,cAAc,MAAM,SAAS;AAGnC,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AAGpB,MAAI,OAAO;AACT,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,OAAO;AACT,MAAE,SAAS;AACX,MAAE,MAAM;AACR,MAAE,YAAY;AACd,QAAI,YAAa,GAAE,UAAU,IAAI,GAAG,YAAY,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC5E,MAAE,YAAY,WAAW,IAAI,CAAC;AAC9B,MAAE,YAAY,SAAS,eAAe,KAAK,CAAC;AAC5C,YAAQ,YAAY,CAAC;AACrB,WAAO;AAAA,EACT;AAGA,QAAM,cAAc,WAAW,SAAS;AAGxC,QAAM,QAAQ,YAAY,iBAAiB,GAAG;AAC9C,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,QAAQ,UAAQ;AACpB,WAAK,UAAU,IAAI,aAAa,oBAAoB;AACpD,UAAI,YAAa,MAAK,UAAU,IAAI,GAAG,YAAY,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAAA,IACjF,CAAC;AACD,YAAQ,YAAY,WAAW;AAAA,EACjC,OAAO;AAEL,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,OAAO;AACT,MAAE,SAAS;AACX,MAAE,MAAM;AACR,MAAE,YAAY;AACd,QAAI,YAAa,GAAE,UAAU,IAAI,GAAG,YAAY,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC5E,MAAE,YAAY,WAAW,IAAI,CAAC;AAC9B,MAAE,YAAY,WAAW;AACzB,YAAQ,YAAY,CAAC;AAAA,EACvB;AAEA,SAAO;AACT;AAEA,IAAO,iBAAQ;;;ACnDf,IAAM,gBAAqC,CAAC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,OAAO,OAAO,MAAM,KAAK,OAAO,IAAI;AAC5C,QAAM,cAAc,MAAM,SAAS;AACnC,QAAM,iBAAiB,CAAC,CAAC,MAAM;AAC/B,QAAM,EAAE,aAAa,IAAK,WAAW,CAAC;AAEtC,QAAM,UAAU,kBAAkB;AAClC,QAAM,SAAS,kBAAkB;AAEjC,QAAM,eAAe,MAAM,QAAQ,eAAe,MAAM,KAAK,IAAI,CAAC;AAElE,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY,UAAU,WAAW,SAAS,0BAA0B,EAAE,IAAI,WAAW,GAAG,KAAK;AAGlG,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACvD,SAAK,MAAM,YAAY,KAAK,OAAO,KAAK,CAAC;AAAA,EAC3C;AAGA,MAAI,OAAO;AACT,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY,iBAAiB,eAAe,0BAA0B,EAAE;AAChF,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,MAAM;AACV,QAAI,MAAM,SAAS;AACnB,QAAI,YAAY;AAChB,YAAQ,YAAY,GAAG;AACvB,UAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,aAAS,YAAY;AACrB,YAAQ,YAAY,QAAQ;AAC5B,SAAK,YAAY,OAAO;AAAA,EAC1B;AAGA,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY,gBAAgB,QAAQ,4BAA4B,EAAE;AAGvE,MAAI,QAAQ,OAAO;AACjB,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AACnB,QAAI,MAAM;AACR,YAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,eAAS,YAAY;AACrB,eAAS,YAAY,WAAW,IAAI,CAAC;AACrC,aAAO,YAAY,QAAQ;AAAA,IAC7B;AACA,QAAI,OAAO;AACT,YAAM,KAAK,SAAS,cAAc,IAAI;AACtC,SAAG,YAAY;AACf,SAAG,cAAc;AACjB,aAAO,YAAY,EAAE;AAAA,IACvB;AACA,SAAK,YAAY,MAAM;AAAA,EACzB;AAGA,MAAI,gBAAgB;AAClB,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,YAAY;AACjB,SAAK,YAAY,WAAW,aAAa,CAAC;AAC1C,SAAK,YAAY,IAAI;AAAA,EACvB;AAGA,MAAI,kBAAkB,QAAQ;AAC5B,UAAM,cAAc,WAAW,SAAS,KAAK,WAAW,SAAS;AACjE,QAAI,YAAY,WAAW,SAAS,GAAG;AACrC,YAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,iBAAW,YAAY;AACvB,iBAAW,YAAY,WAAW;AAClC,WAAK,YAAY,UAAU;AAAA,IAC7B;AAAA,EACF;AAGA,MAAI,WAAW,QAAQ;AACrB,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AAEnB,QAAI,UAAU,KAAK;AACjB,YAAM,IAAI,SAAS,cAAc,GAAG;AACpC,QAAE,OAAO;AACT,QAAE,SAAS,UAAU;AACrB,QAAE,MAAM;AACR,QAAE,YAAY;AACd,QAAE,YAAY,WAAW,aAAa,CAAC;AACvC,QAAE,YAAY,SAAS,eAAe,OAAO,CAAC;AAC9C,aAAO,YAAY,CAAC;AAAA,IACtB,WAAW,SAAS;AAClB,YAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,eAAS,YAAY;AACrB,eAAS,YAAY,WAAW,eAAe,CAAC;AAChD,eAAS,YAAY,SAAS,eAAe,QAAQ,CAAC;AACtD,aAAO,YAAY,QAAQ;AAAA,IAC7B;AAEA,SAAK,YAAY,MAAM;AAAA,EACzB;AAEA,OAAK,YAAY,IAAI;AAGrB,MAAI,SAAS;AACX,UAAM,SAAS,YAAY,SAAS,UAAU;AAC9C,UAAM,YAAY,OAAO,cAAc,iBAAiB;AACxD,QAAI,WAAW;AAGb,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAClB,YAAM,YAAY,WAAW,SAAS,KAAK,WAAW,SAAS,CAAC;AAChE,gBAAU,YAAY,KAAK;AAAA,IAC7B;AAEA,SAAK,iBAAiB,SAAS,MAAM;AACnC,UAAI,CAAC,OAAO,MAAM;AAChB,iBAAS,KAAK,YAAY,MAAM;AAChC,eAAO,UAAU;AACjB,eAAO,iBAAiB,SAAS,MAAM,OAAO,OAAO,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,MACxE;AAAA,IACF,CAAC;AAGD,UAAM,OAAO,SAAS,uBAAuB;AAC7C,SAAK,YAAY,IAAI;AACrB,SAAK,YAAY,MAAM;AACvB,WAAO;AAAA,EACT;AAGA,MAAI,UAAU,KAAK;AACjB,SAAK,iBAAiB,SAAS,MAAM,OAAO,KAAK,KAAK,UAAU,QAAQ,CAAC;AAAA,EAC3E;AAEA,SAAO;AACT;AAEA,IAAO,eAAQ;;;AChJf,IAAM,mBAAwC,CAAC,EAAE,OAAO,WAAW,MAAM;AACvE,QAAM,KAAK,SAAS,cAAc,KAAK;AACvC,KAAG,YAAY;AAEf,MAAI,MAAM,MAAO,IAAG,UAAU,IAAI,GAAG,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC7E,MAAI,MAAM,GAAI,IAAG,KAAK,MAAM;AAG5B,MAAI,MAAM,OAAO;AACf,UAAM,SAAS,eAAe,MAAM,KAAK;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,SAAG,MAAM,YAAY,KAAK,OAAO,KAAK,CAAC;AAAA,IACzC;AAAA,EACF;AAGA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,IAAI,WAAW,OAAO,GAAG;AAC3B,SAAG,aAAa,KAAK,KAAK;AAAA,IAC5B;AAAA,EACF;AAEA,KAAG,YAAY,WAAW,SAAS,CAAC;AACpC,SAAO;AACT;AAEA,IAAO,kBAAQ;;;AC1Bf,IAAI,eAAe;AAEnB,IAAM,iBAAsC,CAAC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA,cAAAE;AAAA,EACA;AACF,MAAM;AACJ,QAAM,aAAa,MAAM,WAAW;AACpC,QAAM,QAAQ,WACX,MAAM,IAAI,EACV,IAAI,OAAK,EAAE,KAAK,CAAC,EACjB,OAAO,OAAO;AAEjB,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,SAAS,uBAAuB;AAAA,EACzC;AAEA,QAAM,WAAW,SAAS,MAAM,YAAY,QAAQ,EAAE;AACtD,QAAM,QAAQ,SAAS,MAAM,SAAS,OAAO,EAAE;AAC/C,QAAM,WAAW,MAAM,SAAS;AAChC,QAAM,cAAc,MAAM,QAAQ,eAAe,MAAM,KAAK,IAAI,CAAC;AAEjE,QAAM,aAAa,OAAO,EAAE,YAAY;AAGxC,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,YAAY;AACtB,SAAO,OAAO,UAAU,OAAO;AAAA,IAC7B,UAAU;AAAA,IACV,UAAU;AAAA,IACV,GAAG;AAAA,EACL,CAAC;AAGD,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY;AAClB,QAAM,MAAM,aAAa,aAAa,KAAK;AAG3C,QAAM,WAA0B,CAAC;AACjC,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY,kBAAkB,UAAU,IAAI,QAAQ,GAAG,KAAK;AACpE,YAAQ,MAAM,UAAU;AACxB,YAAQ,MAAM,aAAa;AAG3B,QAAI,gBAAgB;AAClB,YAAM,SAAS,eAAe,IAAI;AAClC,cAAQ,YAAY,MAAM;AAAA,IAC5B,WAAWA,eAAc;AACvB,cAAQ,YAAYA,cAAa,IAAI,CAAC;AAAA,IACxC;AAEA,UAAM,YAAY,OAAO;AACzB,aAAS,KAAK,OAAO;AAAA,EACvB;AAEA,YAAU,YAAY,KAAK;AAG3B,MAAI,UAAU;AACd,MAAI,OAAO;AAEX,QAAM,sBAAsB,MAAM;AAChC,WAAO;AACP,eAAW,MAAM,UAAU;AACzB,aAAO,KAAK,IAAI,MAAM,GAAG,YAAY;AAAA,IACvC;AACA,QAAI,OAAO,GAAG;AACZ,gBAAU,MAAM,SAAS,GAAG,IAAI;AAChC,iBAAW,MAAM,UAAU;AACzB,WAAG,MAAM,SAAS,GAAG,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAGA,wBAAsB,MAAM;AAC1B,wBAAoB;AAEpB,QAAI,SAAS,OAAO,OAAO;AACzB,eAAS,MAAM,MAAM,KAAK,mBAAmB;AAAA,IAC/C;AAAA,EACF,CAAC;AAGD,MAAI,MAAM,SAAS,GAAG;AACpB,gBAAY,MAAM;AAChB,iBAAW,UAAU,KAAK,MAAM;AAChC,YAAM,MAAM,YAAY,cAAc,CAAC,UAAU,IAAI;AAAA,IACvD,GAAG,QAAQ;AAAA,EACb;AAEA,SAAO;AACT;AAEA,IAAO,gBAAQ;;;ACjDf,IAAM,oBAAyD;AAAA;AAAA,EAE7D,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA;AAAA,EAEX,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA;AAAA,EAEV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA;AAAA,EAER,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA;AAAA,EAEL,OAAO;AACT;AAEA,IAAO,qBAAQ;;;ACxDR,SAAS,aAAa,QAA8B;AACzD,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AAEpB,QAAM,MAA4B;AAAA,IAChC;AAAA,IACA,gBAAgB,CAAC,QAAQ,kBAAkB,KAAK,GAAG;AAAA,IACnD;AAAA,IACA,gBAAgB,CAAC,OAAe,kBAAkB,cAAc,EAAE,GAAG,GAAG;AAAA,EAC1E;AAEA,UAAQ,YAAY,gBAAgB,QAAQ,KAAK,MAAM,CAAC;AACxD,SAAO;AACT;AAKO,SAAS,qBAAqBC,WAA+B;AAClE,QAAM,SAAS,cAAcA,SAAQ;AACrC,SAAO,aAAa,MAAM;AAC5B;AAOO,SAAS,iBAAiB,MAA2B;AAC1D,MAAI,mBAAmB;AAGvB,qBAAmB,iBAAiB;AAAA,IAClC;AAAA,IACA,CAAC,QAAgB,eAAuB;AACtC,YAAM,UAAU,SAAS,cAAc,OAAO;AAC9C,cAAQ,aAAa,kBAAkB,EAAE;AACzC,cAAQ,cAAc;AACtB,eAAS,KAAK,YAAY,OAAO;AACjC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,UAAQ,YAAY;AAGpB,QAAM,UAAU,QAAQ,iBAAiB,QAAQ;AACjD,UAAQ,QAAQ,eAAa;AAC3B,UAAM,YAAY,SAAS,cAAc,QAAQ;AACjD,UAAM,KAAK,UAAU,UAAU,EAAE;AAAA,MAAQ,UACvC,UAAU,aAAa,KAAK,MAAM,KAAK,KAAK;AAAA,IAC9C;AACA,cAAU,cAAc,UAAU;AAClC,cAAU,YAAY,aAAa,WAAW,SAAS;AAAA,EACzD,CAAC;AAED,SAAO;AACT;AAKA,SAAS,kBAAkB,QAAiB,KAAwC;AAClF,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,YAAY,gBAAgB,QAAQ,KAAK,MAAM,CAAC;AAC1D,SAAO;AACT;AAKA,SAAS,gBACP,UACA,KACA,aACkB;AAClB,QAAM,WAAW,SAAS,uBAAuB;AACjD,MAAI,IAAI;AAER,SAAO,IAAI,SAAS,QAAQ;AAC1B,UAAM,KAAK,SAAS,CAAC;AAGrB,QAAI,GAAG,SAAS,eAAe,CAAC,QAAQ,UAAU,QAAQ,EAAE,SAAS,GAAG,aAAa,GAAG;AACtF,YAAM,QAAiB,CAAC;AACxB,aACE,IAAI,SAAS,UACb,SAAS,CAAC,EAAE,SAAS,eACrB,CAAC,QAAQ,UAAU,QAAQ,EAAE,SAAU,SAAS,CAAC,EAAqB,aAAa,GACnF;AACA,cAAM,KAAK,SAAS,CAAC,CAAC;AACtB;AAAA,MACF;AAEA,UAAI,MAAM,WAAW,KAAM,MAAM,CAAC,EAAqB,OAAO,UAAU,OAAO;AAC7E,mBAAW,QAAQ,OAAO;AACxB,gBAAM,WAAW,cAAc,MAAM,KAAK,WAAW;AACrD,cAAI,SAAU,UAAS,YAAY,QAAQ;AAAA,QAC7C;AAAA,MACF,OAAO;AACL,cAAM,OAAO,SAAS,cAAc,KAAK;AACzC,aAAK,YAAY;AACjB,mBAAW,QAAQ,OAAO;AACxB,gBAAM,WAAW,cAAc,MAAM,KAAK,WAAW;AACrD,cAAI,SAAU,MAAK,YAAY,QAAQ;AAAA,QACzC;AACA,iBAAS,YAAY,IAAI;AAAA,MAC3B;AAAA,IACF,OAAO;AACL,YAAM,WAAW,cAAc,IAAI,KAAK,WAAW;AACnD,UAAI,SAAU,UAAS,YAAY,QAAQ;AAC3C;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,cACP,SACA,KACA,aACa;AACb,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK,UAAU;AACb,YAAM,MAAM,IAAI,QAAQ,KAAK;AAC7B,UAAI,OAAO,QAAQ;AAGnB,YAAM,cAAc,KAAK,MAAM,sBAAsB;AACrD,YAAM,aAAa,KAAK,MAAM,sBAAsB;AACpD,UAAI,YAAa,QAAO,YAAY,CAAC;AAAA,eAC5B,WAAY,QAAO,WAAW,CAAC;AAExC,YAAM,IAAI,SAAS,cAAc,GAAG;AACpC,QAAE,KAAK,QAAQ;AACf,UAAI,MAAM,OAAO,QAAQ,KAAK;AAC9B,UAAI,YAAa,QAAO;AACxB,UAAI,WAAY,QAAO;AACvB,UAAI,QAAQ,QAAS,QAAO,IAAI,QAAQ,OAAO;AAC/C,QAAE,YAAY;AACd,QAAE,YAAY,aAAa,IAAI,CAAC;AAChC,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,aAAa;AAChB,YAAM,IAAI,SAAS,cAAc,GAAG;AACpC,UAAI,MAAM;AACV,UAAI,QAAQ,QAAS,QAAO,IAAI,QAAQ,OAAO;AAC/C,UAAI,QAAQ,MAAO,QAAO,SAAS,QAAQ,KAAK;AAChD,QAAE,YAAY;AACd,UAAI,QAAQ,GAAI,GAAE,KAAK,QAAQ;AAE/B,YAAM,QAAQ,QAAQ,QAAQ,MAAM,IAAI;AACxC,eAAS,KAAK,GAAG,KAAK,MAAM,QAAQ,MAAM;AACxC,cAAM,OAAO,MAAM,EAAE;AACrB,cAAM,iBAAiB,KAAK,MAAM,iBAAiB;AACnD,YAAI,gBAAgB;AAClB,YAAE,YAAY,aAAa,eAAe,CAAC,CAAC,CAAC;AAC7C,YAAE,YAAY,SAAS,cAAc,IAAI,CAAC;AAAA,QAC5C,OAAO;AACL,YAAE,YAAY,aAAa,IAAI,CAAC;AAChC,cAAI,KAAK,MAAM,SAAS,GAAG;AACzB,cAAE,YAAY,SAAS,eAAe,GAAG,CAAC;AAAA,UAC5C;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK;AACH,aAAO,gBAAgB,QAAQ,SAAS,QAAQ,UAAU,QAAQ,KAAK;AAAA,IAEzE,KAAK;AACH,aAAO,gBAAgB,SAAS,KAAK,WAAW;AAAA,IAElD,KAAK,QAAQ;AACX,YAAM,KAAK;AACX,aAAO,iBAAiB,GAAG,OAAO;AAAA,IACpC;AAAA,IAEA,KAAK,cAAc;AACjB,YAAM,YAAY;AAClB,YAAM,WAAW,eAAe,UAAU,KAAK;AAE/C,YAAM,KAAK,SAAS,cAAc,UAAU,GAAG;AAE/C,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,YAAI,QAAQ,WAAW,OAAO,UAAU,UAAU;AAChD,qBAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,eAAG,MAAM,YAAY,MAAM,OAAO,GAAG,CAAC;AAAA,UACxC;AAAA,QACF,WAAW,UAAU,MAAM;AACzB,aAAG,aAAa,KAAK,EAAE;AAAA,QACzB,OAAO;AACL,aAAG,aAAa,KAAK,OAAO,KAAK,CAAC;AAAA,QACpC;AAAA,MACF;AAGA,YAAM,YAAY,gBAAgB,UAAU,UAAU,KAAK,WAAW;AACtE,SAAG,YAAY,SAAS;AACxB,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,SAAS;AACZ,YAAM,MAAM,SAAS,cAAc,KAAK;AACxC,UAAI,MAAM,QAAQ;AAClB,UAAI,MAAM,QAAQ;AAClB,UAAI,YAAY;AAChB,UAAI,QAAQ,OAAO;AACjB,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,KAAK,GAAG;AACxD,cAAI,MAAM,YAAY,KAAK,OAAO,KAAK,CAAC;AAAA,QAC1C;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK;AACH,aAAO,YAAY,QAAQ,SAAS,YAAY;AAAA,IAElD,KAAK;AACH,aAAO,WAAW,QAAQ,SAAS,YAAY;AAAA,IAEjD,KAAK;AACH,aAAO,iBAAiB,QAAQ,SAAS,QAAQ,SAAS,YAAY;AAAA,IAExE,KAAK,MAAM;AACT,YAAM,KAAK,SAAS,cAAc,IAAI;AACtC,SAAG,YAAY;AACf,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,OAAO;AACV,YAAM,UAAU,YAAY,OAAO,CAAC,MAAuC,EAAE,SAAS,QAAQ;AAC9F,aAAO,UAAU,QAAQ,IAAI,QAAM,EAAE,OAAO,EAAE,OAAO,MAAM,EAAE,MAAM,IAAI,EAAE,GAAG,EAAE,GAAG,YAAY;AAAA,IAC/F;AAAA,IAEA;AACE,aAAO;AAAA,EACX;AACF;AAKA,SAAS,gBACP,SACA,KACA,aACa;AACb,QAAM,EAAE,eAAe,OAAO,OAAO,QAAQ,IAAI;AAEjD,QAAM,WAAW,mBAAkB,aAAa;AAGhD,QAAM,aAAa,CAAC,SAAmC;AACrD,UAAM,OAAO,SAAS,uBAAuB;AAC7C,UAAM,cAAc,MAAM,IAAI;AAC9B,QAAI,CAAC,YAAa,QAAO;AACzB,UAAM,SAAS,IAAI,cAAc,WAAW;AAC5C,SAAK,YAAY,IAAI,eAAe,MAAM,CAAC;AAC3C,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiC;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,gBAAgB,IAAI;AAAA,EACtB;AAEA,MAAI,UAAU;AACZ,WAAO,SAAS,cAAc;AAAA,EAChC;AAGA,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AACrB,WAAS,YAAY,WAAW,SAAS,CAAC;AAC1C,SAAO;AACT;;;Ad/QS;AA3BT,IAAM,yBAAgE,CAAC,EAAE,QAAQ,MAAM;AACrF,QAAM,mBAAe,sBAAuB,IAAI;AAEhD,+BAAU,MAAM;AACd,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,UAAW;AAGhB,cAAU,gBAAgB;AAC1B,cAAU,YAAY,qBAAqB,OAAO,CAAC;AAGnD,oBAAgB;AAGhB,UAAM,mBAAmB,MAAM;AAC7B,YAAM,OAAO,OAAO,SAAS;AAC7B,UAAI,MAAM;AACR,cAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,mBAAW,MAAM,MAAM,SAAS,CAAC,CAAC;AAAA,MACpC;AAAA,IACF;AACA,qBAAiB;AACjB,WAAO,iBAAiB,cAAc,gBAAgB;AACtD,WAAO,MAAM,OAAO,oBAAoB,cAAc,gBAAgB;AAAA,EACxE,GAAG,CAAC,OAAO,CAAC;AAEZ,SAAO,4CAAC,SAAI,KAAK,cAAc;AACjC;AAEA,IAAO,iCAAQ;;;AL4hBH,IAAAC,sBAAA;AAljBZ,IAAM,2BAA2B,gCAAe,OAAO;AAAA,EACrD,EAAE,KAAK,kBAAAC,KAAE,SAAS,YAAY,QAAQ,OAAO,6BAA6B;AAAA,EAC1E,EAAE,KAAK,kBAAAA,KAAE,OAAO,OAAO,4BAA4B,WAAW,SAAS;AAAA,EACvE,EAAE,KAAK,kBAAAA,KAAE,MAAM,OAAO,0BAA0B;AAAA,EAChD,EAAE,KAAK,kBAAAA,KAAE,cAAc,OAAO,8BAA8B;AAAA,EAC5D,EAAE,KAAK,kBAAAA,KAAE,QAAQ,YAAY,OAAO;AAAA,EACpC,EAAE,KAAK,kBAAAA,KAAE,UAAU,WAAW,SAAS;AAAA,EACvC,EAAE,KAAK,kBAAAA,KAAE,eAAe,gBAAgB,eAAe;AAAA,EACvD,EAAE,KAAK,kBAAAA,KAAE,MAAM,OAAO,0BAA0B;AAAA,EAChD,EAAE,KAAK,kBAAAA,KAAE,KAAK,OAAO,0BAA0B;AAAA,EAC/C,EAAE,KAAK,kBAAAA,KAAE,SAAS,OAAO,6BAA6B;AAAA,EACtD,EAAE,KAAK,kBAAAA,KAAE,SAAS,OAAO,8BAA8B,YAAY,OAAO;AAAA,EAC1E,EAAE,KAAK,kBAAAA,KAAE,UAAU,OAAO,0BAA0B;AAAA,EACpD,EAAE,KAAK,kBAAAA,KAAE,QAAQ,OAAO,4BAA4B;AAAA,EACpD,EAAE,KAAK,kBAAAA,KAAE,eAAe,OAAO,+BAA+B;AAAA,EAC9D,EAAE,KAAK,kBAAAA,KAAE,cAAc,OAAO,UAAU;AAAA,EACxC,EAAE,KAAK,kBAAAA,KAAE,WAAW,OAAO,WAAW,WAAW,SAAS;AAAA,EAC1D,EAAE,KAAK,kBAAAA,KAAE,QAAQ,kBAAAA,KAAE,QAAQ,GAAG,gBAAgB,YAAY;AAAA,EAC1D,EAAE,KAAK,kBAAAA,KAAE,QAAQ,kBAAAA,KAAE,OAAO,GAAG,iBAAiB,kDAAkD,SAAS,SAAS,cAAc,MAAM;AACxI,CAAC;AAED,IAAM,oBAAoB,uBAAW,MAAM;AAAA,EACzC,KAAK;AAAA,IACH,OAAO;AAAA,IACP,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,eAAe;AAAA,IACf,WAAW;AAAA,EACb;AAAA,EACA,gBAAgB,EAAE,SAAS,OAAO;AAAA,EAClC,gBAAgB;AAAA,IACd,UAAU;AAAA,IACV,MAAM;AAAA,IACN,WAAW;AAAA,IACX,yBAAyB;AAAA,EAC3B;AAAA,EACA,eAAe;AAAA,IACb,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,wBAAwB,EAAE,iBAAiB,cAAc;AAAA,EACzD,mBAAmB,EAAE,OAAO,UAAU;AAAA,EACtC,kBAAkB,EAAE,SAAS,OAAO,QAAQ,UAAU;AAAA,EACtD,uBAAuB;AAAA,IACrB,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AAAA,EACA,6BAA6B;AAAA,IAC3B,iBAAiB;AAAA,EACnB;AAAA,EACA,kBAAkB,EAAE,iBAAiB,cAAc;AAAA,EACnD,cAAc,EAAE,iBAAiB,qCAAqC;AAAA,EACtE,iEAAiE;AAAA,IAC/D,iBAAiB;AAAA,EACnB;AAAA,EACA,uBAAuB;AAAA,IACrB,OAAO;AAAA,IACP,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,aAAa;AAAA,EACf;AAAA,EACA,eAAe;AAAA,IACb,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,cAAc;AAAA,IACd,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAAA,EACA,qBAAqB;AAAA,IACnB,iBAAiB;AAAA,IACjB,OAAO;AAAA,EACT;AAAA,EACA,qBAAqB;AAAA,IACnB,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AAAA,EACA,yBAAyB,EAAE,iBAAiB,+BAA+B;AAAA,EAC3E,wBAAwB,EAAE,iBAAiB,8BAA8B;AAAA,EACzE,0BAA0B,EAAE,iBAAiB,UAAU;AAAA,EACvD,yBAAyB,EAAE,iBAAiB,UAAU;AAAA,EACtD,iBAAiB;AAAA,IACf,YAAY;AAAA,IACZ,iBAAiB;AAAA,EACnB;AAAA,EACA,uBAAuB;AAAA,IACrB,iBAAiB;AAAA,EACnB;AAAA,EACA,0BAA0B;AAAA,IACxB,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AAAA,EACA,0BAA0B;AAAA,IACxB,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AAAA,EACA,0BAA0B;AAAA,IACxB,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AAAA,EACA,0BAA0B;AAAA,IACxB,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AAAA,EACA,0BAA0B;AAAA,IACxB,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AAAA,EACA,cAAc;AAAA,IACZ,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,QAAQ;AAAA,EACV;AAAA,EACA,uBAAuB;AAAA,IACrB,UAAU;AAAA,IACV,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,SAAS;AAAA,IACT,WAAW;AAAA,IACX,SAAS;AAAA,IACT,eAAe;AAAA,IACf,KAAK;AAAA,IACL,gBAAgB;AAAA,IAChB,UAAU;AAAA,EACZ;AAAA,EACA,2BAA2B;AAAA,IACzB,UAAU;AAAA,IACV,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EACA,iCAAiC,EAAE,SAAS,EAAE;AAAA,EAC9C,iBAAiB;AAAA,IACf,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,cAAc;AAAA,EAChB;AAAA,EACA,uBAAuB;AAAA,IACrB,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,oDAAoD;AAAA,IAClD,iBAAiB;AAAA,EACnB;AAAA,EACA,4CAA4C;AAAA,IAC1C,iBAAiB;AAAA,EACnB;AAAA,EACA,cAAc;AAAA,IACZ,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,WAAW;AAAA,EACb;AAAA,EACA,oBAAoB;AAAA,IAClB,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AAAA,EACA,qBAAqB,EAAE,WAAW,gBAAgB;AAAA,EAClD,oBAAoB;AAAA,IAClB,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,EACV;AAAA,EACA,mCAAmC;AAAA,IACjC,QAAQ;AAAA,IACR,aAAa;AAAA,EACf;AACF,CAAC;AAGD,IAAM,oBAAoB,6BAAY,GAAG,CAAC,OAAO,cAAc;AAC7D,QAAM,OAAO,MAAM,IAAI,OAAO,SAAS;AACvC,QAAM,UAAU,KAAK,KAAK,KAAK;AAE/B,QAAM,WAAW,QAAQ,MAAM,UAAU;AACzC,MAAI,UAAU;AACZ,QAAI,QAAQ;AACZ,aAAS,IAAI,KAAK,SAAS,GAAG,KAAK,MAAM,IAAI,OAAO,KAAK;AACvD,YAAM,WAAW,MAAM,IAAI,KAAK,CAAC;AACjC,YAAM,WAAW,SAAS,KAAK,KAAK;AACpC,UAAI,SAAS,MAAM,UAAU,GAAG;AAC9B;AAAA,MACF,WAAW,aAAa,OAAO;AAC7B;AACA,YAAI,UAAU,GAAG;AACf,iBAAO,EAAE,MAAM,KAAK,IAAI,IAAI,SAAS,GAAG;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,QAAQ,MAAM,sBAAsB;AACtD,MAAI,WAAW;AACb,UAAM,UAAU,UAAU,CAAC,EAAE,YAAY;AACzC,UAAM,eAAe,oBAAI,IAAI;AAAA,MAC3B;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAM;AAAA,MAAO;AAAA,MAAS;AAAA,MAAM;AAAA,MAAO;AAAA,MACnD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAS;AAAA,MAAU;AAAA,MAAS;AAAA,IAC9C,CAAC;AACD,QAAI,aAAa,IAAI,OAAO,KAAK,QAAQ,SAAS,IAAI,EAAG,QAAO;AAEhE,QAAI,QAAQ;AAEZ,aAAS,IAAI,KAAK,SAAS,GAAG,KAAK,MAAM,IAAI,OAAO,KAAK;AACvD,YAAM,WAAW,MAAM,IAAI,KAAK,CAAC;AACjC,YAAM,WAAW,SAAS;AAE1B,UAAI;AACJ,YAAM,WAAW,IAAI,OAAO,MAAM,OAAO,aAAa,IAAI;AAE1D,cAAQ,QAAQ,SAAS,KAAK,QAAQ,OAAO,MAAM;AACjD,YAAI,MAAM,CAAC,EAAE,WAAW,IAAI,GAAG;AAC7B;AACA,cAAI,UAAU,GAAG;AACf,mBAAO,EAAE,MAAM,KAAK,IAAI,IAAI,SAAS,GAAG;AAAA,UAC1C;AAAA,QACF,OAAO;AACL,cAAI,CAAC,MAAM,CAAC,EAAE,SAAS,IAAI,GAAG;AAC5B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT,CAAC;AAGD,IAAM,kBAAkB,uBAAW;AAAA,EACjC,MAAM;AAAA,IAEJ,YAAY,MAAkB;AAC5B,WAAK,cAAc,KAAK,eAAe,IAAI;AAAA,IAC7C;AAAA,IACA,OAAO,QAAoB;AACzB,UAAI,OAAO,cAAc,OAAO,iBAAiB;AAC/C,aAAK,cAAc,KAAK,eAAe,OAAO,IAAI;AAAA,MACpD;AAAA,IACF;AAAA,IACA,eAAe,MAAkB;AAC/B,YAAM,UAAU,IAAI,6BAA4B;AAChD,YAAM,MAAM,KAAK,MAAM;AACvB,YAAM,gBAAgB,KAAK;AAC3B,UAAI,cAAc,WAAW,EAAG,QAAO,QAAQ,OAAO;AAEtD,YAAM,QAAQ,cAAc,cAAc,SAAS,CAAC,EAAE;AACtD,YAAM,kBAA4B,CAAC;AAEnC,eAAS,IAAI,GAAG,KAAK,IAAI,OAAO,KAAK;AACnC,cAAM,OAAO,IAAI,KAAK,CAAC;AACvB,YAAI,KAAK,OAAO,MAAO;AAEvB,cAAM,cAAc,KAAK,KAAK,KAAK;AACnC,YAAI,gBAAgB;AACpB,YAAI,mBAAmB;AAEvB,cAAM,QAAQ,YAAY,MAAM,UAAU;AAC1C,YAAI,OAAO;AACT,gBAAM,OAAO,MAAM,CAAC,EAAE,KAAK;AAC3B,cAAI,SAAS,IAAI;AACf,gBAAI,gBAAgB,SAAS,GAAG;AAC9B,8BAAgB;AAChB,iCAAmB,gBAAgB,SAAS;AAAA,YAC9C;AAAA,UACF,OAAO;AACL,kBAAM,YAAY,KAAK,MAAM,WAAW;AACxC,kBAAM,OACJ,aAAa,UAAU,CAAC,MAAM,MAC1B,UAAU,CAAC,EAAE,YAAY,IACzB;AACN,4BAAgB,KAAK,IAAI;AAAA,UAC3B;AAAA,QACF;AAEA,cAAM,YAAY,cAAc;AAAA,UAC9B,OAAK,KAAK,MAAM,EAAE,QAAQ,KAAK,QAAQ,EAAE;AAAA,QAC3C;AAEA,YAAI,aAAa,gBAAgB,SAAS,GAAG;AAC3C,gBAAM,YAAY,gBACd,mBACA,gBAAgB,SAAS;AAC7B,gBAAM,cAAc,gBAAgB,SAAS;AAC7C,gBAAM,QAAQ,YAAY;AAC1B,gBAAM,cAAc,CAAC,kBAAkB;AAEvC,cAAI,gBAAgB,OAAO;AACzB,wBAAY,KAAK,cAAc;AAC/B,wBAAY,KAAK,uBAAuB,KAAK,IAAI,OAAO,CAAC,CAAC,EAAE;AAAA,UAC9D,OAAO;AACL,wBAAY,KAAK,iBAAiB,WAAW,EAAE;AAC/C,wBAAY,KAAK,uBAAuB,KAAK,IAAI,OAAO,CAAC,CAAC,EAAE;AAAA,UAC9D;AAEA,kBAAQ;AAAA,YACN,KAAK;AAAA,YACL,KAAK;AAAA,YACL,uBAAW,KAAK,EAAE,OAAO,YAAY,KAAK,GAAG,EAAE,CAAC;AAAA,UAClD;AAAA,QACF;AAEA,YAAI,eAAe;AACjB,0BAAgB,IAAI;AAAA,QACtB;AAAA,MACF;AAEA,aAAO,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AAAA,EACA,EAAE,aAAa,OAAK,EAAE,YAAY;AACpC;AAGA,IAAM,mBAAmB,uBAAW;AAAA,EAClC,MAAM;AAAA,IAEJ,YAAY,MAAkB;AAC5B,WAAK,cAAc,KAAK,eAAe,IAAI;AAAA,IAC7C;AAAA,IACA,OAAO,QAAoB;AACzB,UAAI,OAAO,cAAc,OAAO,iBAAiB;AAC/C,aAAK,cAAc,KAAK,eAAe,OAAO,IAAI;AAAA,MACpD;AAAA,IACF;AAAA,IACA,eAAe,MAAkB;AAC/B,YAAM,UAAU,IAAI,6BAA4B;AAChD,iBAAW,EAAE,MAAM,GAAG,KAAK,KAAK,eAAe;AAC7C,iBAAS,MAAM,MAAM,OAAO,MAAM;AAChC,gBAAM,OAAO,KAAK,MAAM,IAAI,OAAO,GAAG;AACtC,cAAI,KAAK,KAAK,KAAK,EAAE,WAAW,GAAG,GAAG;AACpC,oBAAQ;AAAA,cACN,KAAK;AAAA,cACL,KAAK;AAAA,cACL,uBAAW,KAAK,EAAE,OAAO,qBAAqB,CAAC;AAAA,YACjD;AAAA,UACF;AACA,gBAAM,KAAK,KAAK;AAAA,QAClB;AAAA,MACF;AACA,aAAO,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AAAA,EACA,EAAE,aAAa,OAAK,EAAE,YAAY;AACpC;AAGA,IAAM,gBAAgB,uBAAW;AAAA,EAC/B,MAAM;AAAA,IAEJ,YAAY,MAAkB;AAC5B,WAAK,cAAc,KAAK,eAAe,IAAI;AAAA,IAC7C;AAAA,IACA,OAAO,QAAoB;AACzB,UAAI,OAAO,cAAc,OAAO,iBAAiB;AAC/C,aAAK,cAAc,KAAK,eAAe,OAAO,IAAI;AAAA,MACpD;AAAA,IACF;AAAA,IACA,eAAe,MAAkB;AAC/B,YAAM,UAAU,IAAI,6BAA4B;AAChD,YAAM,eAAe;AACrB,YAAM,SAA0D,CAAC;AAEjE,iBAAW,EAAE,MAAM,GAAG,KAAK,KAAK,eAAe;AAC7C,cAAM,OAAO,KAAK,MAAM,IAAI,YAAY,MAAM,EAAE;AAChD,qBAAa,YAAY;AACzB,YAAI;AACJ,eAAQ,QAAQ,aAAa,KAAK,IAAI,GAAI;AACxC,gBAAM,QAAQ,OAAO,MAAM;AAC3B,gBAAM,MAAM,QAAQ,MAAM,CAAC,EAAE;AAC7B,gBAAM,eAAe,QAAQ;AAC7B,gBAAM,aAAa,MAAM;AACzB,cAAI,gBAAgB,WAAY;AAChC,iBAAO,KAAK,EAAE,MAAM,OAAO,IAAI,cAAc,KAAK,uBAAW,QAAQ,CAAC,CAAC,EAAE,CAAC;AAC1E,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,KAAK,uBAAW,KAAK,EAAE,OAAO,aAAa,CAAC;AAAA,UAC9C,CAAC;AACD,iBAAO,KAAK,EAAE,MAAM,YAAY,IAAI,KAAK,KAAK,uBAAW,QAAQ,CAAC,CAAC,EAAE,CAAC;AAAA,QACxE;AAAA,MACF;AAEA,aAAO,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;AACpD,iBAAW,EAAE,MAAM,IAAI,IAAI,KAAK,OAAQ,SAAQ,IAAI,MAAM,IAAI,GAAG;AACjE,aAAO,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AAAA,EACA,EAAE,aAAa,OAAK,EAAE,YAAY;AACpC;AAGA,IAAM,kBAAkB,uBAAW;AAAA,EACjC,MAAM;AAAA,IAEJ,YAAY,MAAkB;AAC5B,WAAK,cAAc,KAAK,eAAe,IAAI;AAAA,IAC7C;AAAA,IACA,OAAO,QAAoB;AACzB,UAAI,OAAO,cAAc,OAAO,iBAAiB;AAC/C,aAAK,cAAc,KAAK,eAAe,OAAO,IAAI;AAAA,MACpD;AAAA,IACF;AAAA,IACA,eAAe,MAAkB;AAC/B,YAAM,UAAU,IAAI,6BAA4B;AAChD,YAAM,aAAa;AACnB,iBAAW,EAAE,MAAM,GAAG,KAAK,KAAK,eAAe;AAC7C,cAAM,OAAO,KAAK,MAAM,IAAI,YAAY,MAAM,EAAE;AAChD,YAAI;AACJ,eAAQ,QAAQ,WAAW,KAAK,IAAI,GAAI;AACtC,gBAAM,QAAQ,MAAM,CAAC;AACrB,gBAAM,WAAW,OAAO,MAAM;AAC9B,gBAAM,SAAS,WAAW,MAAM,CAAC,EAAE;AACnC,kBAAQ;AAAA,YACN;AAAA,YACA;AAAA,YACA,uBAAW,KAAK,EAAE,YAAY,EAAE,OAAO,UAAU,KAAK,GAAG,EAAE,CAAC;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AACA,aAAO,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AAAA,EACA,EAAE,aAAa,OAAK,EAAE,YAAY;AACpC;AAgBA,IAAM,WAAoC,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,cAAc;AAAA,EACd;AAAA,EACA;AACF,MAAM;AACJ,QAAM,gBAAY,sBAA0B,IAAI;AAChD,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,KAAK;AACpD,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAqB,OAAO;AAChE,QAAM,mBAAmB,YAAY,OAAO,UAAU;AAEtD,qBAAmB,WAAW;AAE9B,QAAM,mBAAmB,MAAM;AAC7B,QAAI,CAAC,UAAU,QAAS;AACxB,QAAI,aAAa;AACf,sCAAU,UAAU,OAAO;AAC3B,qBAAe,KAAK;AAAA,IACtB,OAAO;AACL,oCAAQ,UAAU,OAAO;AACzB,qBAAe,IAAI;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,aAAa,cAAAC,QAAM;AAAA,IACvB,MAAM;AAAA,MACJ;AAAA,UACA,yBAAY;AAAA,UACZ,6BAAW;AAAA,QACT,WAAW,UAAQ;AACjB,gBAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,eAAK,MAAM,SAAS;AACpB,eAAK,MAAM,UAAU;AACrB,eAAK,MAAM,WAAW;AACtB,eAAK,MAAM,UAAU;AACrB,eAAK,MAAM,aAAa;AACxB,eAAK,cAAc,OAAO,WAAM;AAChC,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,MACD;AAAA,MACA;AAAA,UACA,qCAAmB,wBAAwB;AAAA,MAC3C,uBAAW;AAAA,MACX,mBAAO,GAAG;AAAA,QACR,EAAE,KAAK,gBAAgB,KAAK,yBAAQ;AAAA,QACpC,EAAE,KAAK,gBAAgB,KAAK,2BAAU;AAAA,MACxC,CAAC;AAAA,MACD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,cAAkE;AAAA,IACtE,EAAE,KAAK,UAAU,MAAM,QAAQ,OAAO,SAAS;AAAA,IAC/C,EAAE,KAAK,SAAS,MAAM,kBAAkB,OAAO,QAAQ;AAAA,IACvD,EAAE,KAAK,WAAW,MAAM,cAAc,OAAO,UAAU;AAAA,EACzD;AAEA,SACE,8CAAC,SAAI,WAAW,aAAa,aAAa,EAAE,IAE1C;AAAA,kDAAC,SAAI,WAAU,qBAEb;AAAA,oDAAC,SAAI,WAAU,0BACb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,WAAU;AAAA,YACV,OAAO,cAAc,kBAAkB;AAAA,YACvC,cAAY,cAAc,kBAAkB;AAAA,YAE5C,uDAAC,UAAK,WAAU,wBACb,wBAAc,gBAAgB,eACjC;AAAA;AAAA,QACF;AAAA,QAEA,6CAAC,SAAI,WAAU,sBAAqB;AAAA,QAEpC,6CAAC,SAAI,WAAU,yBACZ,sBAAY,IAAI,SACf;AAAA,UAAC;AAAA;AAAA,YAEC,SAAS,MAAM,cAAc,IAAI,GAAG;AAAA,YACpC,WAAW,sCACT,eAAe,IAAI,MAAM,gCAAgC,EAC3D,IAAI,IAAI,QAAQ,UAAU,yBAAyB,EAAE;AAAA,YACrD,OAAO,IAAI;AAAA,YAEX;AAAA,2DAAC,UAAK,WAAU,wBAAwB,cAAI,MAAK;AAAA,cACjD,6CAAC,UAAK,WAAU,oBAAoB,cAAI,OAAM;AAAA;AAAA;AAAA,UARzC,IAAI;AAAA,QASX,CACD,GACH;AAAA,SACF;AAAA,MAGA,8CAAC,SAAI,WAAU,2BACZ;AAAA,mBACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,WAAU;AAAA,YACV,OAAM;AAAA,YAEN;AAAA,2DAAC,UAAK,WAAU,wBAAuB,uBAAS;AAAA,cAChD,6CAAC,UAAK,WAAU,oBAAmB,qBAAI;AAAA;AAAA;AAAA,QACzC;AAAA,QAED,WAAW,YAAY,6CAAC,SAAI,WAAU,sBAAqB;AAAA,QAC3D,YACC;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,WAAU;AAAA,YACV,OAAM;AAAA,YAEN;AAAA,2DAAC,UAAK,WAAU,wBAAuB,kBAAI;AAAA,cAC3C,6CAAC,UAAK,WAAU,oBAAmB,wBAAU;AAAA;AAAA;AAAA,QAC/C;AAAA,SAEJ;AAAA,OACF;AAAA,IAGA,8CAAC,SAAI,WAAU,kBACX;AAAA,sBAAe,YAAY,eAAe,YAC1C;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,kBACT,eAAe,UAAU,yBAAyB,EACpD;AAAA,UAEA;AAAA,YAAC,wBAAAC;AAAA,YAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA,QAAO;AAAA,cACP,gBAAgB,UAAQ;AACtB,0BAAU,UAAU;AAAA,cACtB;AAAA,cACA,YAAY;AAAA,gBACV,aAAa;AAAA,gBACb,YAAY;AAAA,cACd;AAAA,cACA;AAAA;AAAA,UACF;AAAA;AAAA,MACF;AAAA,OAGA,eAAe,aAAa,eAAe,YAC3C;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,qBACT,eAAe,UAAU,4BAA4B,EACvD;AAAA,UAEA,uDAAC,SAAI,WAAU,mBACb,uDAAC,SAAI,WAAU,YACb,uDAAC,kCAAuB,SAAS,kBAAkB,GACrD,GACF;AAAA;AAAA,MACF;AAAA,OAEJ;AAAA,KACF;AAEJ;AAEA,IAAO,mBAAQ;","names":["import_react","t","import_language","import_highlight","import_react","css","import_react","markdown","text","classes","id","hljs","javascript","typescript","python","css","xml","json","bash","sql","markdown","java","csharp","cpp","go","rust","php","ruby","swift","kotlin","dart","yaml","toml","dockerfile","diff","shell","renderInline","tr","renderInline","markdown","import_jsx_runtime","t","React","CodeMirror"]}
|
|
1
|
+
{"version":3,"sources":["../react/NReditor.tsx","../react/custom-syntax.ts","../react/useDebounce.ts","../react/useTailwindCDN.ts","../vanilla/tailwindTheme.ts","../react/CustomMarkdownRenderer.tsx","../core/utils.ts","../core/parser.ts","../vanilla/highlightSetup.ts","../vanilla/components.ts","../vanilla/inline.ts","../vanilla/directives/admonition.ts","../vanilla/directives/details.ts","../vanilla/directives/modal.ts","../vanilla/directives/button.ts","../vanilla/directives/card.ts","../vanilla/directives/wrapper.ts","../vanilla/directives/slide.ts","../vanilla/directives/keys.ts","../vanilla/directives/accordion.ts","../vanilla/directives/carousel.ts","../vanilla/directives/countdown.ts","../vanilla/directives/diff.ts","../vanilla/directives/hover3d.ts","../vanilla/directives/hovergallery.ts","../vanilla/directives/chat.ts","../vanilla/directives/events.ts","../vanilla/directives/richlist.ts","../vanilla/directives/stat.ts","../vanilla/directives/index.ts","../vanilla/renderer.ts","../react/Guide.tsx","../guide/index.ts"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport CodeMirror, { ReactCodeMirrorProps } from '@uiw/react-codemirror';\nimport { EditorView, Decoration, ViewPlugin, ViewUpdate, lineNumbers, keymap } from '@codemirror/view';\nimport { customStreamParserV2 } from './custom-syntax';\nimport { RangeSetBuilder } from '@codemirror/state';\nimport { syntaxHighlighting, HighlightStyle, foldService, foldGutter, foldAll, unfoldAll } from '@codemirror/language';\nimport { tags as t } from '@lezer/highlight';\nimport { useDebounce } from './useDebounce';\nimport { useLazyTailwindCDN } from './useTailwindCDN';\nimport CustomMarkdownRenderer from './CustomMarkdownRenderer';\nimport Guide from './Guide';\n\nexport type EditorMode = 'editor' | 'split' | 'preview';\n\ninterface NReditorProps extends ReactCodeMirrorProps {\n value: string;\n onChange: (value: string) => void;\n className?: string;\n /** Debounce delay in ms for preview rendering. Default: 300 */\n debounceMs?: number;\n /** Inject Tailwind v4 browser CDN for preview. Default: false */\n tailwindCDN?: boolean;\n /** Called when user clicks Guía (only when `guide` is not enabled) */\n onGuide?: () => void;\n /** Called when user clicks Configurar */\n onConfig?: () => void;\n /** Show the built-in syntax guide (opened from the toolbar) */\n guide?: boolean;\n}\n\nconst customSyntaxHighlighting = HighlightStyle.define([\n { tag: t.heading, fontWeight: 'bold', color: 'var(--tc-heading, #e2e8f0)' },\n { tag: t.quote, color: 'var(--tc-quote, #94a3b8)', fontStyle: 'italic' },\n { tag: t.meta, color: 'var(--tc-meta, #64748b)' },\n { tag: t.variableName, color: 'var(--tc-variable, #38bdf8)' },\n { tag: t.strong, fontWeight: 'bold' },\n { tag: t.emphasis, fontStyle: 'italic' },\n { tag: t.strikethrough, textDecoration: 'line-through' },\n { tag: t.link, color: 'var(--tc-link, #38bdf8)' },\n { tag: t.url, color: 'var(--tc-link, #38bdf8)' },\n { tag: t.comment, color: 'var(--tc-comment, #64748b)' },\n { tag: t.keyword, color: 'var(--tc-heading, #e2e8f0)', fontWeight: 'bold' },\n { tag: t.typeName, color: 'var(--tc-type, #a78bfa)' },\n { tag: t.string, color: 'var(--tc-string, #4ade80)' },\n { tag: t.attributeName, color: 'var(--tc-attribute, #fb923c)' },\n { tag: t.propertyName, color: '#0ea5e9' },\n { tag: t.className, color: '#f59e0b', fontStyle: 'italic' },\n { tag: t.special(t.emphasis), textDecoration: 'underline' },\n { tag: t.special(t.comment), backgroundColor: 'var(--tc-highlight-bg, rgba(255,255,255,0.05))', padding: '0 2px', borderRadius: '2px' },\n]);\n\nconst customEditorTheme = EditorView.theme({\n '&': {\n color: 'var(--color-text-primary, #e2e8f0)',\n backgroundColor: 'transparent !important',\n height: '100%',\n position: 'relative',\n display: 'flex',\n flexDirection: 'column',\n minHeight: '0',\n },\n '&.cm-focused': { outline: 'none' },\n '.cm-scroller': {\n overflow: 'auto !important',\n flex: '1',\n minHeight: '0',\n WebkitOverflowScrolling: 'touch',\n },\n '.cm-gutters': {\n backgroundColor: 'transparent !important',\n borderRight: '1px solid var(--color-border, #334155)',\n color: 'var(--color-text-secondary, #94a3b8)',\n opacity: 0.6,\n border: 'none',\n },\n '.cm-activeLineGutter': { backgroundColor: 'transparent' },\n '.cm-lineNumbers': { color: 'inherit' },\n '.cm-foldGutter': { padding: '0px', cursor: 'pointer' },\n '.cm-foldPlaceholder': {\n backgroundColor: 'rgba(255, 255, 255, 0.05)',\n border: '1px solid var(--color-border, #334155)',\n color: 'var(--tc-heading, #e2e8f0)',\n padding: '0 6px',\n borderRadius: '4px',\n margin: '0 4px',\n fontSize: '0.9em',\n fontWeight: 'bold',\n },\n '.dark .cm-foldPlaceholder': {\n backgroundColor: 'rgba(255, 255, 255, 0.1)',\n },\n '.cm-activeLine': { backgroundColor: 'transparent' },\n '.cm-cursor': { borderLeftColor: 'var(--color-text-primary, #e2e8f0)' },\n '&.cm-focused .cm-selectionBackground, .cm-selectionBackground': {\n backgroundColor: 'var(--tc-selection-bg, rgba(56, 189, 248, 0.2)) !important',\n },\n '.cm-blockquote-line': {\n color: 'var(--tc-blockquote-color, #94a3b8)',\n fontStyle: 'italic',\n borderLeft: '2px solid var(--tc-blockquote-border, #334155)',\n paddingLeft: '10px',\n },\n '.cm-spoiler': {\n backgroundColor: 'var(--color-text-secondary, #94a3b8)',\n color: 'var(--color-text-secondary, #94a3b8)',\n borderRadius: '3px',\n padding: '0 2px',\n cursor: 'pointer',\n transition: 'background-color 0.2s, color 0.2s',\n },\n '.cm-spoiler:hover': {\n backgroundColor: 'transparent',\n color: 'var(--color-text-primary, #e2e8f0)',\n },\n '.cm-admonition-bg': {\n borderLeft: 'none !important',\n marginLeft: '0px',\n },\n '.cm-admonition-button': { borderLeftColor: 'var(--tc-attribute, #fb923c)' },\n '.cm-admonition-modal': { borderLeftColor: 'var(--tc-variable, #38bdf8)' },\n '.cm-admonition-warning': { borderLeftColor: '#f59e0b' },\n '.cm-admonition-danger': { borderLeftColor: '#ef4444' },\n '.cm-raw-block': {\n fontFamily: 'monospace',\n backgroundColor: 'rgba(0, 0, 0, 0.1)',\n },\n '.dark .cm-raw-block': {\n backgroundColor: 'rgba(255, 255, 255, 0.05)',\n },\n '.cm-admonition-depth-1': {\n boxShadow: 'inset 4px 0 0 hsl(20, 70%, 50%)',\n backgroundColor: 'hsla(20, 70%, 50%, 0.05)',\n paddingLeft: '12px !important',\n },\n '.cm-admonition-depth-2': {\n boxShadow: 'inset 4px 0 0 hsl(20, 70%, 50%), inset 8px 0 0 hsl(140, 70%, 50%)',\n backgroundColor: 'hsla(140, 70%, 50%, 0.05)',\n paddingLeft: '16px !important',\n },\n '.cm-admonition-depth-3': {\n boxShadow: 'inset 4px 0 0 hsl(20, 70%, 50%), inset 8px 0 0 hsl(140, 70%, 50%), inset 12px 0 0 hsl(200, 70%, 50%)',\n backgroundColor: 'hsla(200, 70%, 50%, 0.05)',\n paddingLeft: '20px !important',\n },\n '.cm-admonition-depth-4': {\n boxShadow: 'inset 4px 0 0 hsl(20, 70%, 50%), inset 8px 0 0 hsl(140, 70%, 50%), inset 12px 0 0 hsl(200, 70%, 50%), inset 16px 0 0 hsl(280, 70%, 50%)',\n backgroundColor: 'hsla(280, 70%, 50%, 0.05)',\n paddingLeft: '24px !important',\n },\n '.cm-admonition-depth-5': {\n boxShadow: 'inset 4px 0 0 hsl(340, 70%, 50%), inset 8px 0 0 hsl(140, 70%, 50%), inset 12px 0 0 hsl(200, 70%, 50%), inset 16px 0 0 hsl(280, 70%, 50%), inset 20px 0 0 hsl(340, 70%, 50%)',\n backgroundColor: 'hsla(340, 70%, 50%, 0.05)',\n paddingLeft: '28px !important',\n },\n '.cm-panels': {\n position: 'static !important',\n backgroundColor: 'transparent !important',\n border: 'none !important',\n },\n '.cm-panel.cm-search': {\n position: 'fixed !important',\n top: '20px !important',\n right: '20px !important',\n zIndex: 100,\n backgroundColor: 'var(--color-background-primary, #0f172a)',\n border: '1px solid var(--color-border, #334155)',\n borderRadius: '12px',\n padding: '12px',\n boxShadow: '0 10px 25px -5px rgba(0, 0, 0, 0.3), 0 8px 10px -6px rgba(0, 0, 0, 0.3)',\n display: 'flex',\n flexDirection: 'column',\n gap: '8px',\n backdropFilter: 'blur(8px)',\n minWidth: '280px',\n },\n '.cm-search [name=close]': {\n position: 'absolute',\n right: '8px',\n top: '8px',\n cursor: 'pointer',\n opacity: 0.6,\n border: 'none',\n background: 'transparent',\n color: 'var(--color-text-primary, #e2e8f0)',\n fontSize: '18px',\n },\n '.cm-search [name=close]:hover': { opacity: 1 },\n '.cm-textfield': {\n backgroundColor: 'rgba(255, 255, 255, 0.05)',\n border: '1px solid var(--color-border, #334155)',\n borderRadius: '6px',\n color: 'var(--color-text-primary, #e2e8f0)',\n padding: '4px 8px',\n outline: 'none',\n width: '100%',\n marginBottom: '4px',\n },\n '.cm-textfield:focus': {\n borderColor: 'var(--color-accent-primary, #38bdf8)',\n backgroundColor: 'rgba(255, 255, 255, 0.08)',\n },\n '.cm-panel.cm-search input[type=checkbox]:checked': {\n backgroundColor: 'var(--color-accent-primary, #38bdf8)',\n },\n '.cm-panel.cm-search input[type=checkbox]': {\n backgroundColor: 'rgba(255, 255, 255, 0.08)',\n },\n '.cm-button': {\n backgroundImage: 'linear-gradient(135deg, var(--color-accent-primary, #38bdf8), var(--color-accent-hover, #7dd3fc))',\n color: 'var(--color-accent-text, #0f172a)',\n border: 'none',\n borderRadius: '6px',\n padding: '4px 10px',\n cursor: 'pointer',\n fontSize: '0.85em',\n fontWeight: '600',\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n transition: 'transform 0.1s, opacity 0.2s',\n marginRight: '4px',\n boxShadow: '0 4px 12px -2px rgba(0, 0, 0, 0.2)',\n },\n '.cm-button:hover': {\n opacity: 0.95,\n transform: 'translateY(-1px)',\n boxShadow: '0 6px 14px -2px rgba(0, 0, 0, 0.25)',\n },\n '.cm-button:active': { transform: 'translateY(0)' },\n '.cm-search label': {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n fontSize: '0.8em',\n color: 'var(--color-text-secondary, #94a3b8)',\n marginRight: '8px',\n cursor: 'pointer',\n },\n '.cm-search input[type=checkbox]': {\n cursor: 'pointer',\n accentColor: 'var(--color-accent-primary, #38bdf8)',\n },\n});\n\n// Fold service for ::: directive blocks and HTML tags\nconst customFoldService = foldService.of((state, lineStart) => {\n const line = state.doc.lineAt(lineStart);\n const trimmed = line.text.trim();\n \n const dirMatch = trimmed.match(/^:::(.+)/);\n if (dirMatch) {\n let stack = 1;\n for (let i = line.number + 1; i <= state.doc.lines; i++) {\n const nextLine = state.doc.line(i);\n const nextText = nextLine.text.trim();\n if (nextText.match(/^:::(.+)/)) {\n stack++;\n } else if (nextText === ':::') {\n stack--;\n if (stack === 0) {\n return { from: line.to, to: nextLine.to };\n }\n }\n }\n return null;\n }\n\n const htmlMatch = trimmed.match(/^<([a-zA-Z][\\w-]*)\\b/);\n if (htmlMatch) {\n const tagName = htmlMatch[1].toLowerCase();\n const voidElements = new Set([\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', \n 'link', 'meta', 'param', 'source', 'track', 'wbr'\n ]);\n if (voidElements.has(tagName) || trimmed.endsWith('/>')) return null;\n\n let stack = 1;\n\n for (let i = line.number + 1; i <= state.doc.lines; i++) {\n const nextLine = state.doc.line(i);\n const nextText = nextLine.text;\n \n let match;\n const tagRegex = new RegExp(`</?${tagName}\\\\b[^>]*>`, 'gi');\n \n while ((match = tagRegex.exec(nextText)) !== null) {\n if (match[0].startsWith('</')) {\n stack--;\n if (stack === 0) {\n return { from: line.to, to: nextLine.to };\n }\n } else {\n if (!match[0].endsWith('/>')) {\n stack++;\n }\n }\n }\n }\n return null;\n }\n\n return null;\n});\n\n// Directive colorization plugin — colored left borders for nested :::\nconst directivePlugin = ViewPlugin.fromClass(\n class {\n decorations: any;\n constructor(view: EditorView) {\n this.decorations = this.getDecorations(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = this.getDecorations(update.view);\n }\n }\n getDecorations(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n const doc = view.state.doc;\n const visibleRanges = view.visibleRanges;\n if (visibleRanges.length === 0) return builder.finish();\n\n const maxTo = visibleRanges[visibleRanges.length - 1].to;\n const admonitionStack: string[] = [];\n\n for (let i = 1; i <= doc.lines; i++) {\n const line = doc.line(i);\n if (line.from > maxTo) break;\n\n const trimmedLine = line.text.trim();\n let isClosingLine = false;\n let closingTargetIdx = -1;\n\n const match = trimmedLine.match(/^:::(.*)/);\n if (match) {\n const rest = match[1].trim();\n if (rest === '') {\n if (admonitionStack.length > 0) {\n isClosingLine = true;\n closingTargetIdx = admonitionStack.length - 1;\n }\n } else {\n const typeMatch = rest.match(/^(\\w+|\\{)/);\n const type =\n typeMatch && typeMatch[1] !== '{'\n ? typeMatch[1].toLowerCase()\n : 'generic';\n admonitionStack.push(type);\n }\n }\n\n const isVisible = visibleRanges.some(\n r => line.to >= r.from && line.from <= r.to\n );\n\n if (isVisible && admonitionStack.length > 0) {\n const targetIdx = isClosingLine\n ? closingTargetIdx\n : admonitionStack.length - 1;\n const currentType = admonitionStack[targetIdx];\n const depth = targetIdx + 1;\n const lineClasses = ['cm-admonition-bg'];\n\n if (currentType === 'raw') {\n lineClasses.push('cm-raw-block');\n lineClasses.push(`cm-admonition-depth-${Math.min(depth, 5)}`);\n } else {\n lineClasses.push(`cm-admonition-${currentType}`);\n lineClasses.push(`cm-admonition-depth-${Math.min(depth, 5)}`);\n }\n\n builder.add(\n line.from,\n line.from,\n Decoration.line({ class: lineClasses.join(' ') })\n );\n }\n\n if (isClosingLine) {\n admonitionStack.pop();\n }\n }\n\n return builder.finish();\n }\n },\n { decorations: v => v.decorations }\n);\n\n// Blockquote line decoration\nconst blockquotePlugin = ViewPlugin.fromClass(\n class {\n decorations: any;\n constructor(view: EditorView) {\n this.decorations = this.getDecorations(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = this.getDecorations(update.view);\n }\n }\n getDecorations(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n for (const { from, to } of view.visibleRanges) {\n for (let pos = from; pos <= to; ) {\n const line = view.state.doc.lineAt(pos);\n if (line.text.trim().startsWith('>')) {\n builder.add(\n line.from,\n line.from,\n Decoration.line({ class: 'cm-blockquote-line' })\n );\n }\n pos = line.to + 1;\n }\n }\n return builder.finish();\n }\n },\n { decorations: v => v.decorations }\n);\n\n// Spoiler inline decoration: !>text<! → blurred until hover\nconst spoilerPlugin = ViewPlugin.fromClass(\n class {\n decorations: any;\n constructor(view: EditorView) {\n this.decorations = this.getDecorations(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = this.getDecorations(update.view);\n }\n }\n getDecorations(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n const spoilerRegex = /!>([\\s\\S]+?)<!(?=\\s|$)/g;\n const ranges: { from: number; to: number; dec: Decoration }[] = [];\n\n for (const { from, to } of view.visibleRanges) {\n const text = view.state.doc.sliceString(from, to);\n spoilerRegex.lastIndex = 0;\n let match;\n while ((match = spoilerRegex.exec(text))) {\n const start = from + match.index;\n const end = start + match[0].length;\n const contentStart = start + 2;\n const contentEnd = end - 2;\n if (contentStart >= contentEnd) continue;\n ranges.push({ from: start, to: contentStart, dec: Decoration.replace({}) });\n ranges.push({\n from: contentStart,\n to: contentEnd,\n dec: Decoration.mark({ class: 'cm-spoiler' }),\n });\n ranges.push({ from: contentEnd, to: end, dec: Decoration.replace({}) });\n }\n }\n\n ranges.sort((a, b) => a.from - b.from || a.to - b.to);\n for (const { from, to, dec } of ranges) builder.add(from, to, dec);\n return builder.finish();\n }\n },\n { decorations: v => v.decorations }\n);\n\n// Color text inline decoration: %color%text%%\nconst colorTextPlugin = ViewPlugin.fromClass(\n class {\n decorations: any;\n constructor(view: EditorView) {\n this.decorations = this.getDecorations(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged) {\n this.decorations = this.getDecorations(update.view);\n }\n }\n getDecorations(view: EditorView) {\n const builder = new RangeSetBuilder<Decoration>();\n const colorRegex = /%([^%\\s]+?)%((?:(?!%%).)*)%%/g;\n for (const { from, to } of view.visibleRanges) {\n const text = view.state.doc.sliceString(from, to);\n let match;\n while ((match = colorRegex.exec(text))) {\n const color = match[1];\n const startPos = from + match.index;\n const endPos = startPos + match[0].length;\n builder.add(\n startPos,\n endPos,\n Decoration.mark({ attributes: { style: `color: ${color}` } })\n );\n }\n }\n return builder.finish();\n }\n },\n { decorations: v => v.decorations }\n);\n\n/**\n * NReditor — CodeMirror 6 editor with live markdown preview.\n * Drop-in component that works inside any container.\n *\n * @example\n * ```tsx\n * import NReditor from '@noirmd/previewer/editor';\n * import '@noirmd/previewer/editor.css';\n * import '@noirmd/previewer/vanilla/vanilla.css';\n *\n * <NReditor value={md} onChange={setMd} />\n * <NReditor value={md} onChange={setMd} tailwindCDN />\n * ```\n */\nconst NReditor: React.FC<NReditorProps> = ({\n value,\n onChange,\n className,\n debounceMs = 300,\n tailwindCDN = false,\n onGuide,\n onConfig,\n guide = false,\n}) => {\n const editorRef = useRef<EditorView | null>(null);\n const [isAllFolded, setIsAllFolded] = useState(false);\n const [editorMode, setEditorMode] = useState<EditorMode>('split');\n const [guideOpen, setGuideOpen] = useState(false);\n const debouncedContent = useDebounce(value, debounceMs);\n\n useLazyTailwindCDN(tailwindCDN);\n\n // Split is not available on mobile: fall back to editor mode\n useEffect(() => {\n const mq = window.matchMedia('(max-width: 639px)');\n const apply = () => {\n if (mq.matches && editorMode === 'split') setEditorMode('editor');\n };\n apply();\n mq.addEventListener('change', apply);\n return () => mq.removeEventListener('change', apply);\n }, [editorMode]);\n\n // On mobile the split button is hidden; if the mode is 'split', fall\n // back to 'editor' automatically (on load and on resize below 640px).\n useEffect(() => {\n const mq = window.matchMedia('(max-width: 639px)');\n const handle = () => {\n if (mq.matches) setEditorMode((m) => (m === 'split' ? 'editor' : m));\n };\n handle();\n mq.addEventListener('change', handle);\n return () => mq.removeEventListener('change', handle);\n }, []);\n\n const handleToggleFold = () => {\n if (!editorRef.current) return;\n if (isAllFolded) {\n unfoldAll(editorRef.current);\n setIsAllFolded(false);\n } else {\n foldAll(editorRef.current);\n setIsAllFolded(true);\n }\n };\n\n const extensions = React.useMemo(\n () => [\n customStreamParserV2,\n lineNumbers(),\n foldGutter({\n markerDOM: open => {\n const span = document.createElement('span');\n span.style.cursor = 'pointer';\n span.style.padding = '0 4px';\n span.style.fontSize = '12px';\n span.style.display = 'inline-block';\n span.style.transition = 'transform 0.2s';\n span.textContent = open ? '▼' : '▶';\n return span;\n },\n }),\n customFoldService,\n customEditorTheme,\n syntaxHighlighting(customSyntaxHighlighting),\n EditorView.lineWrapping,\n keymap.of([\n { key: 'Ctrl-Shift-[', run: foldAll },\n { key: 'Ctrl-Shift-]', run: unfoldAll },\n ]),\n directivePlugin,\n blockquotePlugin,\n spoilerPlugin,\n colorTextPlugin,\n ],\n []\n );\n\n const modeButtons: { key: EditorMode; icon: string; label: string }[] = [\n { key: 'editor', icon: 'code', label: 'Editor' },\n { key: 'split', icon: 'vertical_split', label: 'Split' },\n { key: 'preview', icon: 'visibility', label: 'Preview' },\n ];\n\n return (\n <div\n className={`nr-editor ${editorMode === 'split' ? 'nr-editor--split' : ''} ${\n className || ''\n }`}\n >\n {/* Toolbar */}\n <div className=\"nr-editor-toolbar\">\n {/* Left: Fold + mode switcher */}\n <div className=\"nr-editor-toolbar-left\">\n <button\n onClick={handleToggleFold}\n className=\"nr-toolbar-btn nr-toolbar-btn-fold\"\n title={isAllFolded ? 'Expandir todo' : 'Colapsar todo'}\n aria-label={isAllFolded ? 'Expandir todo' : 'Colapsar todo'}\n >\n <span className=\"material-icons-round\">\n {isAllFolded ? 'unfold_more' : 'unfold_less'}\n </span>\n </button>\n\n <div className=\"nr-toolbar-divider\" />\n\n <div className=\"nr-toolbar-mode-group\">\n {modeButtons.map(btn => (\n <button\n key={btn.key}\n onClick={() => setEditorMode(btn.key)}\n className={`nr-toolbar-btn nr-toolbar-btn-mode ${\n editorMode === btn.key ? 'nr-toolbar-btn-mode--active' : ''\n } ${btn.key === 'split' ? 'nr-toolbar-btn-split' : ''}`}\n title={btn.label}\n >\n <span className=\"material-icons-round\">{btn.icon}</span>\n <span className=\"nr-toolbar-label\">{btn.label}</span>\n </button>\n ))}\n </div>\n </div>\n\n {/* Right: Guía · Configurar (optional) */}\n <div className=\"nr-editor-toolbar-right\">\n {(guide || onGuide) && (\n <button\n onClick={() => (guide ? setGuideOpen(true) : onGuide?.())}\n className=\"nr-toolbar-btn nr-toolbar-btn-sm nr-toolbar-btn-guide\"\n title=\"Guía de sintaxis\"\n >\n <span className=\"material-icons-round\">menu_book</span>\n <span className=\"nr-toolbar-label\">Guía</span>\n </button>\n )}\n {(guide || onGuide) && onConfig && <div className=\"nr-toolbar-divider\" />}\n {onConfig && (\n <button\n onClick={onConfig}\n className=\"nr-toolbar-btn nr-toolbar-btn-sm nr-toolbar-btn-config\"\n title=\"Configurar tema y metadata\"\n >\n <span className=\"material-icons-round\">tune</span>\n <span className=\"nr-toolbar-label\">Configurar</span>\n </button>\n )}\n </div>\n </div>\n\n {/* Content area — editor / split / preview */}\n <div className=\"nr-editor-body\">\n {(editorMode === 'editor' || editorMode === 'split') && (\n <div\n className={`nr-editor-pane ${\n editorMode === 'split' ? 'nr-editor-pane--half' : ''\n }`}\n >\n <CodeMirror\n value={value}\n onChange={onChange}\n height=\"auto\"\n onCreateEditor={view => {\n editorRef.current = view as any;\n }}\n basicSetup={{\n lineNumbers: false,\n foldGutter: false,\n }}\n extensions={extensions}\n />\n </div>\n )}\n\n {(editorMode === 'preview' || editorMode === 'split') && (\n <div\n className={`nr-editor-preview ${\n editorMode === 'split' ? 'nr-editor-preview--half' : ''\n }`}\n >\n <div className=\"nr-editor-prose\">\n <div className=\"nr-prose\">\n <CustomMarkdownRenderer content={debouncedContent} />\n </div>\n </div>\n </div>\n )}\n </div>\n\n {guide && <Guide open={guideOpen} onClose={() => setGuideOpen(false)} />}\n </div>\n );\n};\n\nexport default NReditor;\n","import { StreamLanguage } from '@codemirror/language';\nimport { tags as t } from '@lezer/highlight';\n\n/**\n * V2 Custom Syntax Highlighter for CodeMirror 6.\n */\n\ninterface V2State {\n inCodeBlock: boolean;\n inDirectiveHeader: boolean;\n inPropsBlock: boolean;\n braceDepth: number;\n blockStack: string[];\n imageState: 'none' | 'expectUrl' | 'expectOptions';\n linkState: 'none' | 'expectUrl';\n lastPropKey: string;\n inHtmlBlock: boolean;\n htmlTagName: string;\n isClosingHtmlTag: boolean;\n embeddedLang: 'none' | 'script' | 'style';\n}\n\nexport const customStreamParserV2 = StreamLanguage.define<V2State>({\n startState: () => ({\n inCodeBlock: false,\n inDirectiveHeader: false,\n inPropsBlock: false,\n braceDepth: 0,\n blockStack: [],\n imageState: 'none',\n linkState: 'none',\n lastPropKey: '',\n inHtmlBlock: false,\n htmlTagName: '',\n isClosingHtmlTag: false,\n embeddedLang: 'none',\n }),\n\n token(stream, state) {\n // ── Line start resets ──\n if (stream.sol()) {\n state.inDirectiveHeader = false;\n state.imageState = 'none';\n state.linkState = 'none';\n\n // Close code block\n if (state.inCodeBlock && stream.match(/^\\s*```/)) {\n state.inCodeBlock = false;\n return 'comment';\n }\n \n // ELIMINADO: El reinicio de state.inHtmlBlock aquí para permitir atributos multilínea\n }\n\n // Inside HTML block opening tag (soporta atributos multilínea)\n if (state.inHtmlBlock) {\n stream.eatSpace();\n \n // Self-closing: />\n if (stream.match(/^\\/>/)) {\n state.inHtmlBlock = false;\n state.htmlTagName = '';\n state.isClosingHtmlTag = false;\n return 'typeName';\n }\n // Closing >\n if (stream.match(/^>/)) {\n state.inHtmlBlock = false;\n // Enter embedded mode for <script> / <style> blocks\n if (!state.isClosingHtmlTag && (state.htmlTagName === 'script' || state.htmlTagName === 'style')) {\n state.embeddedLang = state.htmlTagName;\n }\n state.htmlTagName = '';\n state.isClosingHtmlTag = false;\n return 'typeName';\n }\n \n // Nombre de atributo\n if (stream.match(/^[a-zA-Z_:][\\w-.:]*/)) return 'attributeName';\n // Signo igual\n if (stream.match(/^=/)) return 'keyword';\n // Valor entre comillas dobles (cerradas o abiertas en esta línea)\n if (stream.match(/^\"[^\"]*\"/)) return 'string';\n if (stream.match(/^\"[^\"]*$/)) return 'string';\n // Valor entre comillas simples (cerradas o abiertas)\n if (stream.match(/^'[^']*'/)) return 'string';\n if (stream.match(/^'[^']*$/)) return 'string';\n // Valor sin comillas\n if (stream.match(/^[^\\s>]+/)) return 'string';\n \n if (stream.eatSpace()) return null;\n stream.next();\n return null;\n }\n\n // ── Inside embedded <script> / <style> ──\n if (state.embeddedLang !== 'none') {\n // Detect closing tag to exit embedded mode\n if (stream.match(/^<\\/(script|style)\\b/i)) {\n const closeTag = stream.current().replace(/^<\\//, '').toLowerCase();\n state.embeddedLang = 'none';\n state.inHtmlBlock = true;\n state.htmlTagName = closeTag;\n state.isClosingHtmlTag = true;\n return 'typeName';\n }\n\n if (state.embeddedLang === 'script') {\n // ── JavaScript tokenizer ──\n // Line comments\n if (stream.match(/^\\/\\//)) { stream.skipToEnd(); return 'comment'; }\n // Block comments\n if (stream.match(/^\\/\\*/)) {\n while (!stream.eol()) {\n if (stream.match(/\\*\\//)) return 'comment';\n stream.next();\n }\n return 'comment';\n }\n // Strings (single / double quotes)\n if (stream.match(/^[\"']/)) {\n const q = stream.current();\n while (!stream.eol()) {\n const ch = stream.next();\n if (ch === q && stream.string[stream.pos - 2] !== '\\\\') break;\n }\n return 'string';\n }\n // Template literals\n if (stream.match(/^`/)) {\n while (!stream.eol()) {\n if (stream.next() === '`') break;\n }\n return 'string';\n }\n // Keywords\n if (stream.match(/\\b(const|let|var|function|return|if|else|for|while|do|switch|case|break|continue|new|this|class|extends|import|export|default|from|try|catch|finally|throw|async|await|typeof|instanceof|in|of|void|null|undefined|true|false)\\b/)) return 'keyword';\n // Numbers\n if (stream.match(/^\\d+(\\.\\d+)?/)) return 'number';\n // Function call\n if (stream.match(/^[a-zA-Z_$][\\w$]*(?=\\s*\\()/)) return 'function';\n // Identifier\n if (stream.match(/^[a-zA-Z_$][\\w$]*/)) return 'variableName';\n // Operators\n if (stream.match(/^[+\\-*\\/%=!<>&|^~?:]+/)) return 'keyword';\n stream.next();\n return null;\n }\n\n if (state.embeddedLang === 'style') {\n // ── CSS tokenizer ──\n // Comments\n if (stream.match(/^\\/\\*/)) {\n while (!stream.eol()) {\n if (stream.match(/\\*\\//)) return 'comment';\n stream.next();\n }\n return 'comment';\n }\n // Strings\n if (stream.match(/^[\"']/)) {\n const q = stream.current();\n while (!stream.eol()) {\n const ch = stream.next();\n if (ch === q && stream.string[stream.pos - 2] !== '\\\\') break;\n }\n return 'string';\n }\n // At-rules\n if (stream.match(/^@[a-zA-Z-]+/)) return 'keyword';\n // Hex colors\n if (stream.match(/^#[0-9a-fA-F]{3,8}\\b/)) return 'string';\n // Numbers with optional units\n if (stream.match(/^\\d+(\\.\\d+)?(px|em|rem|%|vh|vw|vmin|vmax|s|ms|deg|fr)?\\b/)) return 'number';\n // Property name (word before colon)\n if (stream.match(/^[a-zA-Z-]+(?=\\s*:)/)) return 'propertyName';\n // Selectors: .class / #id\n if (stream.match(/^[.#][a-zA-Z][\\w-]*/)) return 'className';\n // CSS keywords\n if (stream.match(/\\b(none|auto|inherit|initial|unset|normal|bold|italic|center|left|right|flex|grid|block|inline|relative|absolute|fixed|sticky|hidden|visible|scroll|cover|contain)\\b/)) return 'keyword';\n // Tag selectors\n if (stream.match(/^[a-zA-Z][\\w-]*/)) return 'typeName';\n // Punctuation\n if (stream.match(/^[{}();:,]/)) return 'keyword';\n stream.next();\n return null;\n }\n }\n\n // Inside code block → everything is comment\n if (state.inCodeBlock) {\n stream.skipToEnd();\n return 'comment';\n }\n\n // Inside {props} block\n if (state.inPropsBlock) {\n stream.eatSpace();\n\n if (stream.peek() === '}') {\n stream.next();\n state.inPropsBlock = false;\n state.inDirectiveHeader = false;\n state.lastPropKey = '';\n return 'keyword';\n }\n\n if (stream.match(/^\\.[a-zA-Z0-9_-]+/)) return 'className';\n if (stream.match(/^#[a-zA-Z0-9_-]+/)) return 'propertyName';\n\n const urlKeys = /^(url|href|image|src|icon)$/i;\n if (stream.match(/^[a-zA-Z][\\w-]*(?==)/)) {\n state.lastPropKey = stream.current();\n return 'propertyName';\n }\n if (stream.match(/^=/)) return 'keyword';\n if (stream.match(/^\"[^\"]*\"|^'[^']*'/)) {\n return urlKeys.test(state.lastPropKey) ? 'url' : 'string';\n }\n\n stream.next();\n return null;\n }\n\n // ── Line-start rules ──\n if (stream.sol()) {\n let match;\n if ((match = stream.match(/^\\s*(:::)\\s*/))) {\n const rest = stream.string.slice(stream.pos).trim();\n\n if (rest === '') {\n state.blockStack.pop();\n } else {\n const typeMatch = rest.match(/^([\\w-]+)/);\n state.blockStack.push(typeMatch ? typeMatch[1].toLowerCase() : 'generic');\n }\n\n state.inDirectiveHeader = true;\n return 'keyword';\n }\n\n if (stream.match(/^\\s*#[a-zA-Z][\\w-]*\\s*$/) && !stream.match(/^\\s*#{1,6}\\s/)) {\n return 'propertyName';\n }\n if (stream.match(/^\\s*(#{1,6})\\s+/)) return 'heading';\n if (stream.match(/^\\s*```/)) {\n state.inCodeBlock = true;\n stream.skipToEnd();\n return 'comment';\n }\n if (stream.match(/^\\s*([-*+]|\\d+\\.)\\s+/)) return 'variableName';\n if (stream.match(/^\\s*(---|___|(\\*\\s*){3,})\\s*$/)) return 'meta';\n if (stream.match(/^\\s*\\[TOC\\d?\\]/)) return 'keyword';\n }\n\n // ── Directive header ──\n if (state.inDirectiveHeader) {\n stream.eatSpace();\n if (stream.match(/^[\\w-]+/)) return 'typeName';\n if (stream.peek() === '{') {\n stream.next();\n state.inPropsBlock = true;\n state.inDirectiveHeader = true;\n return 'keyword';\n }\n state.inDirectiveHeader = false;\n }\n\n // ── Raw block content (HTML/CSS/JS) ──\n const currentBlockType = state.blockStack[state.blockStack.length - 1];\n if (currentBlockType === 'raw' && !state.inDirectiveHeader) {\n if (stream.eatSpace()) return null;\n if (stream.match(/^<\\/?[a-zA-Z0-9-]+/)) return 'typeName';\n if (stream.match(/^>/)) return 'typeName';\n if (stream.match(/^[{}]/)) return 'keyword';\n if (stream.match(/^--[a-zA-Z0-9_-]+/)) return 'variableName';\n if (stream.match(/^[a-zA-Z-]+(?=\\s*:)/)) return 'propertyName';\n if (stream.match(/^var\\([^)]+\\)/)) return 'variableName';\n if (stream.match(/^['\"`][^'\"`]*['\"`]/)) return 'string';\n if (stream.match(/^[#.][a-zA-Z0-9_-]+/)) return 'className';\n if (stream.match(/^:[a-zA-Z0-9_-]+/)) return 'keyword';\n if (stream.match(/\\b(const|let|var|function|return|if|else|for|while)\\b/)) return 'keyword';\n stream.next();\n return null;\n }\n\n // ── Image & Links ──\n if (state.imageState === 'expectUrl') {\n state.imageState = 'expectOptions';\n if (stream.eat('(')) {\n let parenLevel = 1;\n while (!stream.eol() && parenLevel > 0) {\n const next = stream.next();\n if (next === '(') parenLevel++;\n else if (next === ')' && stream.string[stream.pos - 2] !== '\\\\') parenLevel--;\n }\n return 'url';\n } else {\n state.imageState = 'none';\n }\n }\n if (state.imageState === 'expectOptions') {\n state.imageState = 'none';\n if (stream.eat('{')) {\n stream.eatWhile(/[^}]/);\n stream.eat('}');\n return 'attributeName';\n }\n }\n if (state.linkState === 'expectUrl') {\n state.linkState = 'none';\n if (stream.eat('(')) {\n let parenLevel = 1;\n while (!stream.eol() && parenLevel > 0) {\n const next = stream.next();\n if (next === '(') parenLevel++;\n else if (next === ')' && stream.string[stream.pos - 2] !== '\\\\') parenLevel--;\n }\n return 'url';\n }\n }\n\n // ── HTML tags (inline & block) - Mejorado con |$ para EOL ──\n if (stream.match(/^<\\/?[a-zA-Z][\\w-]*(?=[>\\s/]|$)/)) {\n const raw = stream.current();\n state.htmlTagName = raw.replace(/^<\\/?/, '').toLowerCase();\n state.isClosingHtmlTag = raw.startsWith('</');\n state.inHtmlBlock = true;\n return 'typeName';\n }\n\n // ── Inline formatting ──\n if (stream.match(/\\*\\*\\*.+?\\*\\*\\*/)) return 'strongEmphasis';\n if (stream.match(/\\*\\*.+?\\*\\*/)) return 'strong';\n if (stream.match(/!\\[[^\\]]*?\\]/)) {\n if (stream.peek() === '(') state.imageState = 'expectUrl';\n return 'string';\n }\n if (stream.match(/\\[[^\\]]+?\\]/)) {\n if (stream.peek() === '(') state.linkState = 'expectUrl';\n return 'string';\n }\n if (stream.match(/\\|\\[[^\\]]+?\\]\\|/)) return 'keyword';\n if (stream.match(/`[^`]+`/)) return 'comment';\n if (stream.match(/_(.+?)_/)) return 'emphasis';\n if (stream.match(/~~(.+?)~~/)) return 'strikethrough';\n if (stream.match(/!~(.+?)~!/)) return 'underline';\n if (stream.match(/==(.+?)==/)) return 'highlight';\n if (stream.match(/!>.+?<!/)) return 'comment';\n if (stream.match(/%[^%\\s]+?%[^%]+?%%/)) return 'string';\n if (stream.match(/->|<-|\\|/)) return 'meta';\n\n stream.next();\n return null;\n },\n\n tokenTable: {\n heading: t.heading,\n keyword: t.keyword,\n typeName: t.typeName,\n string: t.string,\n attributeName: t.attributeName,\n propertyName: t.propertyName,\n className: t.className,\n comment: t.comment,\n variableName: t.variableName,\n meta: t.meta,\n strong: t.strong,\n emphasis: t.emphasis,\n strongEmphasis: [t.strong, t.emphasis],\n strikethrough: t.strikethrough,\n underline: t.special(t.emphasis),\n highlight: t.special(t.comment),\n url: t.url,\n link: t.string,\n number: t.number,\n function: t.function(t.variableName),\n },\n});","import { useState, useEffect } from 'react';\n\n/**\n * useDebounce — delays updating a value until after a specified delay.\n * Useful for reducing expensive operations (like preview rendering) during rapid input.\n */\nexport function useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n","import { useEffect, useRef } from 'react';\nimport { injectNRTailwindTheme, removeNRTailwindTheme } from '../vanilla/tailwindTheme';\n\n/**\n * useLazyTailwindCDN — Lazily injects the Tailwind CSS v4 Browser CDN\n * so that arbitrary Tailwind classes written in runtime markdown content\n * (:::raw, directives, ##{ } attrs, etc.) are resolved.\n *\n * - Only injects the <script> when `enabled` is true (e.g. preview mode).\n * - Removes the script when `enabled` becomes false (editor-only mode).\n * - This means zero CDN cost in editor-only mode.\n * - The v4 Browser CDN uses `@tailwindcss/browser` which JIT-compiles\n * classes from the DOM at runtime.\n * - preflight is DISABLED via inline config to avoid overriding app base styles.\n */\n\nconst CDN_URL = 'https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4';\nconst SCRIPT_ID = 'tailwind-cdn-v4-runtime';\nconst CONFIG_ID = 'tailwind-cdn-v4-config';\n\n// Tailwind v4 Browser CDN reads the theme from CSS @theme blocks already on the page.\n// No need to duplicate fonts/colors here — they're defined in src/index.css.\n// Only disable preflight to avoid injecting normalize.css over our base styles.\nconst TAILWIND_CDN_CONFIG = `\nwindow.tailwind = window.tailwind || {};\nwindow.tailwind.config = {\n corePlugins: {\n preflight: false,\n },\n};\n`;\n\ndeclare global {\n interface Window {\n __twCDNRefs?: number;\n tailwind?: { config: object; scan?: () => void };\n }\n}\n\n/**\n * Lazy CDN hook — only loads the Tailwind Browser CDN when `enabled` is true.\n * Call this from the component that hosts the preview panel.\n */\nexport function useLazyTailwindCDN(enabled: boolean) {\n const loadedRef = useRef(false);\n\n useEffect(() => {\n if (!enabled) {\n // When disabled: remove CDN scripts if no other consumers need them\n window.__twCDNRefs = (window.__twCDNRefs ?? 1) - 1;\n if ((window.__twCDNRefs ?? 0) <= 0) {\n document.getElementById(SCRIPT_ID)?.remove();\n document.getElementById(CONFIG_ID)?.remove();\n removeNRTailwindTheme();\n window.__twCDNRefs = 0;\n loadedRef.current = false;\n }\n return;\n }\n\n // When enabled: inject CDN scripts\n window.__twCDNRefs = (window.__twCDNRefs ?? 0) + 1;\n\n // Inject config script BEFORE the CDN\n if (!document.getElementById(CONFIG_ID)) {\n const configScript = document.createElement('script');\n configScript.id = CONFIG_ID;\n configScript.textContent = TAILWIND_CDN_CONFIG;\n document.head.appendChild(configScript);\n }\n\n // Inject the NoirMD @theme (primary, base-100, ...) so color\n // classes resolve — must precede the CDN script.\n injectNRTailwindTheme();\n\n // Inject the Tailwind v4 Browser CDN script\n if (!document.getElementById(SCRIPT_ID)) {\n const script = document.createElement('script');\n script.id = SCRIPT_ID;\n script.src = CDN_URL;\n document.head.appendChild(script);\n loadedRef.current = true;\n }\n\n return () => {\n window.__twCDNRefs = (window.__twCDNRefs ?? 1) - 1;\n if ((window.__twCDNRefs ?? 0) <= 0) {\n document.getElementById(SCRIPT_ID)?.remove();\n document.getElementById(CONFIG_ID)?.remove();\n removeNRTailwindTheme();\n window.__twCDNRefs = 0;\n loadedRef.current = false;\n }\n };\n }, [enabled]);\n}\n\n/**\n * Trigger a Tailwind CDN re-scan (use after DOM mutations with new classes).\n */\nexport function scanTailwindCDN() {\n const tw = (window as any).tailwind;\n if (tw?.scan) tw.scan();\n}\n\n/**\n * Preload the Tailwind Browser CDN right after page load.\n * Uses requestIdleCallback so it doesn't block the main thread.\n * By the time the user opens preview, the CDN is already loaded.\n */\nexport function preloadTailwindCDN() {\n // Already loaded — skip\n if (document.getElementById(SCRIPT_ID)) return;\n\n const inject = () => {\n if (document.getElementById(SCRIPT_ID)) return; // double-check\n\n // Inject config script\n if (!document.getElementById(CONFIG_ID)) {\n const configScript = document.createElement('script');\n configScript.id = CONFIG_ID;\n configScript.textContent = TAILWIND_CDN_CONFIG;\n document.head.appendChild(configScript);\n }\n\n // Inject the NoirMD @theme before the CDN script\n injectNRTailwindTheme();\n\n // Inject CDN script\n const script = document.createElement('script');\n script.id = SCRIPT_ID;\n script.src = CDN_URL;\n document.head.appendChild(script);\n\n window.__twCDNRefs = (window.__twCDNRefs ?? 0) + 1;\n };\n\n // Wait for idle — don't block initial render\n if ('requestIdleCallback' in window) {\n (window as any).requestIdleCallback(inject, { timeout: 2000 });\n } else {\n // Fallback: load after a short delay\n setTimeout(inject, 200);\n }\n}\n\nexport function useTailwindCDN() {\n useLazyTailwindCDN(true);\n}\n","// ============================================================\n// NoirMD Vanilla — Tailwind v4 theme injection\n//\n// When the host enables the Tailwind Browser CDN (tailwindCDN\n// prop), Tailwind classes authored inside markdown (:::div,\n// :::raw, attrs, ...) are JIT-compiled at runtime. For color\n// utilities like `bg-primary` / `text-secondary` to resolve,\n// Tailwind v4 needs an `@theme` block registering --color-*\n// keys.\n//\n// This module injects a <style type=\"text/tailwindcss\"> block\n// with a daisyUI-compatible @theme (primary, secondary, accent,\n// neutral, base-100/200/300, base-content, info, success,\n// warning, error) wired to the host's --color-* variables, with\n// NoirMD defaults as fallback.\n//\n// Safety: if the host already provides a theme (daisyUI, a\n// Tailwind @theme block, or --color-* theme variables),\n// injection is skipped so the module never overrides the host\n// palette.\n// ============================================================\n\nconst THEME_STYLE_ID = 'nr-tailwind-theme';\n\n// daisyUI 5 / Tailwind v4 convention: the palette lives in\n// --color-* theme variables. Values resolve host vars first\n// (app --color-*, then daisyUI v4 --p/--b1/... components), and\n// fall back to NoirMD defaults. Never references --nr-* (would\n// create a circular dependency with the --nr-accent chain).\nconst NR_THEME_CSS = `\n@theme {\n --color-primary: var(--color-accent-primary, oklch(var(--p, 55% 0.3 240) / 1));\n --color-primary-content: #ffffff;\n --color-secondary: oklch(var(--s, 55% 0.25 200) / 1);\n --color-secondary-content: #ffffff;\n --color-accent: var(--color-accent-primary, oklch(var(--a, 65% 0.25 160) / 1));\n --color-accent-content: #ffffff;\n --color-neutral: oklch(var(--n, 50% 0.05 240) / 1);\n --color-neutral-content: var(--color-text-primary, oklch(var(--nc, 92% 0.02 240) / 1));\n --color-base-100: var(--color-background-primary, oklch(var(--b1, 15% 0.01 260) / 1));\n --color-base-200: var(--color-background-secondary-solid, oklch(var(--b2, 20% 0.02 260) / 1));\n --color-base-300: var(--color-border, oklch(var(--b3, 25% 0.03 260) / 1));\n --color-base-content: var(--color-text-primary, oklch(var(--bc, 92% 0.02 260) / 1));\n --color-info: oklch(var(--in, 70% 0.2 220) / 1);\n --color-info-content: #ffffff;\n --color-success: oklch(var(--su, 65% 0.25 140) / 1);\n --color-success-content: #ffffff;\n --color-warning: oklch(var(--wa, 80% 0.25 80) / 1);\n --color-warning-content: #1f2937;\n --color-error: oklch(var(--er, 65% 0.3 30) / 1);\n --color-error-content: #ffffff;\n}\n`;\n\nfunction getVar(root: HTMLElement, name: string): string {\n return getComputedStyle(root).getPropertyValue(name).trim();\n}\n\nfunction stylesheetHasTheme(): boolean {\n for (const sheet of Array.from(document.styleSheets)) {\n let rules: CSSRuleList | null = null;\n try {\n rules = sheet.cssRules;\n } catch {\n continue; // cross-origin stylesheet — rules are inaccessible\n }\n if (!rules) continue;\n for (const rule of Array.from(rules)) {\n const css = rule.cssText || '';\n if (css.includes('@theme') || css.includes('@plugin \"daisyui\"')) return true;\n }\n }\n return false;\n}\n\n/**\n * Detect whether the host page already provides a color theme\n * (daisyUI, a Tailwind @theme block, or --color-* variables).\n */\nexport function hasHostTheme(): boolean {\n if (typeof window === 'undefined' || typeof document === 'undefined') return true;\n if (getVar(document.documentElement, '--color-primary')) return true;\n if (getVar(document.documentElement, '--color-base-100')) return true;\n if (document.body && (getVar(document.body, '--color-primary') || getVar(document.body, '--color-base-100'))) return true;\n return stylesheetHasTheme();\n}\n\n/**\n * Inject the NoirMD @theme block so Tailwind CDN color classes\n * (bg-primary, text-secondary, ...) resolve inside markdown.\n * Skipped when the host already defines a theme. Idempotent.\n */\nexport function injectNRTailwindTheme(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById(THEME_STYLE_ID)) return;\n if (hasHostTheme()) return;\n\n const style = document.createElement('style');\n style.id = THEME_STYLE_ID;\n style.setAttribute('type', 'text/tailwindcss');\n style.textContent = NR_THEME_CSS;\n document.head.appendChild(style);\n}\n\n/**\n * Remove the injected NoirMD @theme block (idempotent).\n */\nexport function removeNRTailwindTheme(): void {\n if (typeof document === 'undefined') return;\n document.getElementById(THEME_STYLE_ID)?.remove();\n}","import React, { useEffect, useRef } from 'react';\nimport { renderMarkdownString } from '../vanilla/renderer';\nimport { scrollToId } from '../core/utils';\nimport { scanTailwindCDN } from './useTailwindCDN';\n\ninterface CustomMarkdownRendererProps {\n content: string;\n}\n\n/**\n * CustomMarkdownRenderer — thin React wrapper around the vanilla renderer.\n *\n * Pipeline:\n * content (string) → renderMarkdownString() → HTMLElement → mounted\n *\n * The vanilla engine handles all rendering, directives and events;\n * React only owns the mount point. Note: rendering happens on the\n * client (useEffect); the server render is an empty placeholder.\n */\nconst CustomMarkdownRenderer: React.FC<CustomMarkdownRendererProps> = ({ content }) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n\n // Clear previous content and mount the vanilla-rendered element\n container.replaceChildren();\n container.appendChild(renderMarkdownString(content));\n\n // Resolve any Tailwind classes in user-authored content (no-op if CDN not loaded)\n scanTailwindCDN();\n\n // Scroll to hash on load and hash changes\n const handleHashChange = () => {\n const hash = window.location.hash;\n if (hash) {\n const parts = hash.split('#');\n scrollToId(parts[parts.length - 1]);\n }\n };\n handleHashChange();\n window.addEventListener('hashchange', handleHashChange);\n return () => window.removeEventListener('hashchange', handleHashChange);\n }, [content]);\n\n return <div ref={containerRef} />;\n};\n\nexport default CustomMarkdownRenderer;","import type { CSSProperties } from './types';\n\n/**\n * Parse an inline CSS string (e.g. \"color: red; padding: 1rem\") into a CSSProperties object.\n */\nexport function parseCssString(cssText: string): CSSProperties {\n if (!cssText) return {};\n return cssText\n .split(';')\n .filter(Boolean)\n .reduce<CSSProperties>((styleObj, styleString) => {\n const parts = styleString.split(':');\n if (parts.length < 2) return styleObj;\n const key = parts[0].trim().replace(/-([a-z])/g, (_, g) => g.toUpperCase());\n const value = parts.slice(1).join(':').trim();\n styleObj[key] = value;\n return styleObj;\n }, {});\n}\n\n/**\n * Generate a URL-safe slug from text (NFD decomposition, strip accents, lowercase, hyphenate).\n */\nexport function generateId(text: string): string {\n return text\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/\\s+/g, '-');\n}\n\n/**\n * Smooth-scroll to an element by its ID.\n */\nexport function scrollToId(id: string): void {\n if (typeof document === 'undefined') return;\n const element = document.getElementById(id);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n}\n\n/**\n * Parse attribute suffix like `##{.my-class #my-id}` from a text line.\n * Returns the cleaned text, extracted classes, and id.\n */\nexport function extractAttributes(text: string): { text: string; classes: string; id: string } {\n const match = text.match(/^(.*?)\\s*##\\{([^}]*)\\}\\s*$/);\n if (!match) return { text, classes: '', id: '' };\n\n const rawAttrs = match[2];\n const cleanedText = match[1];\n\n const classList: string[] = [];\n let id = '';\n\n // 1. Parse key=\"value\" attributes (e.g., class=\"mt-0 px-4\", id=\"section\")\n for (const [, key, value] of rawAttrs.matchAll(/([\\w-]+)=\"([^\"]*)\"/g)) {\n if (key === 'class') {\n classList.push(...value.split(/\\s+/).filter(Boolean));\n } else if (key === 'id') {\n id = value;\n }\n }\n\n // 2. Parse shorthand tokens: .className and #id (from remaining content)\n // Supports classes with / (opacity), ! (important), . (arbitrary values)\n const stripped = rawAttrs.replace(/[\\w-]+=\"[^\"]*\"/g, '');\n for (const token of stripped.split(/\\s+/).filter(Boolean)) {\n if (token.startsWith('.')) classList.push(token.slice(1));\n else if (token.startsWith('#') && !id) id = token.slice(1);\n }\n\n return { text: cleanedText, classes: classList.join(' '), id };\n}\n\nlet _scopeCounter = 0;\nexport function resetScopeCounter(): void {\n _scopeCounter = 0;\n}\n\n/**\n * Generate a unique scope ID for CSS isolation.\n */\nexport function generateScopeId(): string {\n return `scope-${++_scopeCounter}`;\n}\n\n/**\n * Parse props from a `{key=\"value\" key2=\"value2\"}` string.\n * Also supports `.className` shorthand → adds to `class` prop.\n * Also supports `#id` shorthand → adds to `id` prop.\n */\nexport function parseProps(propsString: string): Record<string, string> {\n const props: Record<string, string> = {};\n if (!propsString?.trim()) return props;\n\n // Match key=\"value\" or key='value' pairs\n const pairRegex = /(\\w[\\w-]*)=(?:\"([^\"]*)\"|'([^']*)')/g;\n let match;\n while ((match = pairRegex.exec(propsString)) !== null) {\n const key = match[1];\n const value = match[2] ?? match[3] ?? '';\n props[key] = value;\n }\n\n // Extract .className shorthand (supports / for opacity, ! for important, . for arbitrary values)\n const classMatches = propsString.match(/\\.([a-zA-Z0-9_!/.\\-]+)/g);\n if (classMatches) {\n const existing = props['class'] || '';\n const newClasses = classMatches.map(c => c.substring(1)).join(' ');\n props['class'] = existing ? `${existing} ${newClasses}` : newClasses;\n }\n\n // Extract #id shorthand (only if not inside a key=\"value\" pair)\n const idMatch = propsString.match(/#([a-zA-Z0-9_-]+)(?=\\s|}|$)/);\n if (idMatch && !props['id']) {\n props['id'] = idMatch[1];\n }\n\n return props;\n}\n\n/**\n * Parse raw HTML attributes string (e.g. `class=\"...\" style=\"...\" data-foo=\"...\"`)\n * into a plain props object.\n *\n * NOTE: This does NOT rename `class` → `className`. Framework adapters\n * (React, Vue, etc.) should handle their own attribute name mapping.\n */\nexport function parseHtmlAttrs(attrsString: string): Record<string, any> {\n const props: Record<string, any> = {};\n if (!attrsString?.trim()) return props;\n\n const pairRegex = /([a-zA-Z0-9_-]+)(?:=(?:\"([^\"]*)\"|'([^']*)'|([^\\s>]+)))?/g;\n let match;\n while ((match = pairRegex.exec(attrsString)) !== null) {\n const key = match[1];\n const value = match[2] ?? match[3] ?? match[4] ?? true;\n\n // Parse style strings into objects\n if (key === 'style' && typeof value === 'string') {\n props[key] = parseCssString(value);\n } else {\n props[key] = value;\n }\n }\n\n return props;\n}\n","import type { Token, DirectiveToken, HtmlBlockToken, CSSProperties } from './types';\r\nimport { generateId, generateScopeId, parseProps, extractAttributes } from './utils';\r\n\r\n/**\r\n * V2 Markdown Parser — line-by-line state machine (framework-agnostic).\r\n */\r\nexport function parseMarkdown(markdown: string): Token[] {\r\n if (!markdown) return [];\r\n const lines = markdown.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '').split('\\n');\r\n const result: Token[] = [];\r\n const usedIds = new Set<string>();\r\n let i = 0;\r\n\r\n while (i < lines.length) {\r\n const line = lines[i];\r\n const trimmed = line.trim();\r\n let match: RegExpMatchArray | null;\r\n\r\n // ── Headers: ## Title ──\r\n if ((match = trimmed.match(/^(#{1,6})\\s+(.+)$/))) {\r\n const level = match[1].length;\r\n const rawText = match[2];\r\n const { text, classes, id: customId } = extractAttributes(rawText);\r\n const baseId = customId || generateId(text.replace(/->|<-/g, ''));\r\n let id = baseId;\r\n let n = 1;\r\n while (usedIds.has(id)) {\r\n n++;\r\n id = `${baseId}-${n}`;\r\n }\r\n usedIds.add(id);\r\n result.push({ type: 'header', level, text, id, classes: classes || undefined });\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── Aligned paragraph: -> text <- or -> text -> ──\r\n if ((match = trimmed.match(/^->\\s*(.+?)\\s*(<-|->)\\s*$/))) {\r\n const content = match[1];\r\n const align = match[2] === '<-' ? 'center' : 'right';\r\n result.push({ type: 'paragraph', content, align });\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── Code block: ```lang title=\"name\" ──\r\n if (trimmed.startsWith('```')) {\r\n const fenceHeader = trimmed.slice(3).trim();\r\n const titleMatch = fenceHeader.match(/title=[\"']([^\"']*)[\"']/);\r\n const lang = fenceHeader.replace(/title=[\"'][^\"']*[\"']/, '').trim();\r\n const title = titleMatch ? titleMatch[1] : undefined;\r\n const content: string[] = [];\r\n i++;\r\n while (i < lines.length && !lines[i].trim().startsWith('```')) {\r\n content.push(lines[i]);\r\n i++;\r\n }\r\n result.push({ type: 'codeblock', language: lang, title, content: content.join('\\n') });\r\n i++; // skip closing ```\r\n continue;\r\n }\r\n\r\n // ── Directive: :::type {props} ... ::: ──\r\n if (trimmed.startsWith(':::')) {\r\n const rest = trimmed.slice(3).trim();\r\n\r\n // Bare closing marker\r\n if (rest === '') {\r\n result.push({ type: 'paragraph', content: line });\r\n i++;\r\n continue;\r\n }\r\n\r\n const typeMatch = rest.match(/^([\\w-]+)/);\r\n const directiveType = typeMatch ? typeMatch[1] : 'custom';\r\n\r\n // Lookahead: find the matching closing :::\r\n let j = i + 1;\r\n let nestedLevel = 0;\r\n let foundClose = false;\r\n\r\n while (j < lines.length) {\r\n const currentTrimmed = lines[j].trim();\r\n if (currentTrimmed === ':::') {\r\n if (nestedLevel === 0) {\r\n foundClose = true;\r\n break;\r\n } else {\r\n nestedLevel--;\r\n }\r\n } else if (currentTrimmed.startsWith(':::')) {\r\n // Opening a nested directive\r\n nestedLevel++;\r\n }\r\n j++;\r\n }\r\n\r\n if (foundClose) {\r\n // Collect raw content lines (between opening and closing)\r\n const contentLines: string[] = [];\r\n for (let k = i + 1; k < j; k++) {\r\n contentLines.push(lines[k]);\r\n }\r\n const rawContent = contentLines.join('\\n');\r\n\r\n // Parse the directive header (everything after the type name)\r\n const headerRest = typeMatch ? rest.slice(directiveType.length).trim() : rest;\r\n\r\n // Extract {props} block\r\n let propsString = '';\r\n let shortForm = '';\r\n const propsBlockMatch = headerRest.match(/^\\{([^]*)\\}\\s*$/);\r\n if (propsBlockMatch) {\r\n propsString = propsBlockMatch[1];\r\n } else if (headerRest) {\r\n // Short-form: bare text after type → becomes title prop\r\n shortForm = headerRest;\r\n }\r\n\r\n const props = parseProps(propsString);\r\n if (shortForm && !props['title']) {\r\n props['title'] = shortForm;\r\n }\r\n\r\n // Split content into slots\r\n const slots = splitSlots(rawContent);\r\n\r\n result.push({\r\n type: 'directive',\r\n directiveType,\r\n props,\r\n slots,\r\n scopeId: generateScopeId(),\r\n } as DirectiveToken);\r\n\r\n i = j + 1;\r\n continue;\r\n } else {\r\n // Unclosed directive — render as plain text\r\n result.push({ type: 'paragraph', content: line });\r\n i++;\r\n continue;\r\n }\r\n }\r\n\r\n // ── Image: {w:h} ──\r\n if ((match = trimmed.match(/^(.*?)!\\[([^\\]]*)\\]\\(([^)]+?)\\)(?:\\{([^}]+?)\\})?(.*)$/))) {\r\n const [, preText, alt, srcAndFloat, size, postText] = match;\r\n\r\n if (preText.trim()) {\r\n result.push({ type: 'paragraph', content: preText.trim() });\r\n }\r\n\r\n let src = srcAndFloat;\r\n const style: CSSProperties = {};\r\n if (src.includes('#left')) {\r\n src = src.replace('#left', '');\r\n style.float = 'left';\r\n style.margin = '0 1em 1em 0';\r\n } else if (src.includes('#right')) {\r\n src = src.replace('#right', '');\r\n style.float = 'right';\r\n style.margin = '0 0 1em 1em';\r\n } else if (src.includes('#center')) {\r\n src = src.replace('#center', '');\r\n style.display = 'block';\r\n style.margin = '0 auto 1em auto';\r\n }\r\n if (size) {\r\n const [width, height] = size.split(':');\r\n if (width) style.width = width.trim();\r\n if (height) style.height = height.trim();\r\n }\r\n result.push({ type: 'image', alt, src, style });\r\n\r\n if (postText.trim()) {\r\n result.push({ type: 'paragraph', content: postText.trim() });\r\n }\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── Table: | cell | cell | ──\r\n if (trimmed.includes('|') && i + 1 < lines.length && lines[i + 1].includes('---')) {\r\n const tableLines = [line];\r\n i++;\r\n tableLines.push(lines[i]);\r\n i++;\r\n while (i < lines.length && lines[i].trim().includes('|')) {\r\n tableLines.push(lines[i]);\r\n i++;\r\n }\r\n result.push({ type: 'table', content: tableLines.join('\\n') });\r\n continue;\r\n }\r\n\r\n // ── List: - item or 1. item ──\r\n if ((match = trimmed.match(/^(\\s*)([-*+]|\\d+\\.)\\s+(.+)$/))) {\r\n const listItems = [line];\r\n i++;\r\n while (i < lines.length) {\r\n const nextLine = lines[i];\r\n const nextTrimmed = nextLine.trim();\r\n if (\r\n nextTrimmed.match(/^(\\s*)([-*+]|\\d+\\.)\\s+(.+)$/) ||\r\n nextTrimmed === '' ||\r\n nextLine.startsWith(' ')\r\n ) {\r\n listItems.push(nextLine);\r\n i++;\r\n } else {\r\n break;\r\n }\r\n }\r\n result.push({ type: 'list', content: listItems.join('\\n') });\r\n continue;\r\n }\r\n\r\n // ── Blockquote: > text ──\r\n if (trimmed.startsWith('>')) {\r\n const quoteLines = [line];\r\n i++;\r\n while (i < lines.length && (lines[i].trim().startsWith('>') || lines[i].trim() === '')) {\r\n quoteLines.push(lines[i]);\r\n i++;\r\n }\r\n const rawQuote = quoteLines.join('\\n').replace(/^>\\s?/gm, '');\r\n const { text, classes, id } = extractAttributes(rawQuote);\r\n result.push({ type: 'blockquote', content: text, classes: classes || undefined, id });\r\n continue;\r\n }\r\n\r\n // ── Horizontal rule: --- or ___ or *** ──\r\n if (/^(---|___|(\\*\\s*){3,})\\s*$/.test(trimmed)) {\r\n result.push({ type: 'hr' });\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── TOC: [TOC] or [TOC2] ──\r\n if (/^\\[TOC\\d?\\]\\s*$/.test(trimmed)) {\r\n result.push({ type: 'toc' });\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── Empty line ──\r\n if (trimmed === '') {\r\n i++;\r\n continue;\r\n }\r\n\r\n // ── HTML Block: <tag ...> ──\r\n let tagStartMatch = trimmed.match(/^<([a-zA-Z][\\w-]*)/);\r\n if (tagStartMatch) {\r\n const tagName = tagStartMatch[1].toLowerCase();\r\n\r\n const voidElements = new Set([\r\n 'area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input',\r\n 'link', 'meta', 'param', 'source', 'track', 'wbr'\r\n ]);\r\n\r\n const remainingText = lines.slice(i).join('\\n');\r\n\r\n // Find the full opening tag even with multi-line attributes\r\n const openTagRegex = new RegExp(`^\\\\s*<${tagName}\\\\b([^>]*?)>`, 'i');\r\n const openTagMatch = remainingText.match(openTagRegex);\r\n\r\n if (openTagMatch) {\r\n const fullOpenTag = openTagMatch[0];\r\n const attrs = openTagMatch[1].replace(/\\s+/g, ' ').trim();\r\n\r\n const isSelfClosing = fullOpenTag.endsWith('/>') || voidElements.has(tagName);\r\n\r\n if (isSelfClosing) {\r\n const blockText = remainingText.substring(0, openTagMatch.index! + fullOpenTag.length);\r\n const consumedLines = blockText.split('\\n').length;\r\n\r\n result.push({\r\n type: 'html-block',\r\n tag: tagName,\r\n attrs: attrs,\r\n children: [] // No children\r\n } as HtmlBlockToken);\r\n\r\n i += consumedLines;\r\n continue;\r\n } else {\r\n // Tag with content — search for its closing tag\r\n let nestedLevel = 0;\r\n let closeIndex = -1;\r\n let closeTagLength = 0;\r\n\r\n const tagRegex = new RegExp(`</?${tagName}\\\\b[^>]*>`, 'gi');\r\n tagRegex.lastIndex = openTagMatch.index! + fullOpenTag.length;\r\n\r\n let execMatch;\r\n while ((execMatch = tagRegex.exec(remainingText)) !== null) {\r\n if (execMatch[0].startsWith('</')) {\r\n nestedLevel--;\r\n if (nestedLevel < 0) {\r\n closeIndex = execMatch.index;\r\n closeTagLength = execMatch[0].length;\r\n break;\r\n }\r\n } else {\r\n if (!execMatch[0].endsWith('/>')) {\r\n nestedLevel++;\r\n }\r\n }\r\n }\r\n\r\n if (closeIndex !== -1) {\r\n const fullBlock = remainingText.substring(0, closeIndex + closeTagLength);\r\n const consumedLines = fullBlock.split('\\n').length;\r\n\r\n // style/script blocks should not be parsed as Markdown\r\n if (tagName === 'style' || tagName === 'script') {\r\n result.push({\r\n type: 'html',\r\n content: fullBlock,\r\n scopeId: generateScopeId(),\r\n });\r\n } else {\r\n const innerContent = remainingText.substring(openTagMatch.index! + fullOpenTag.length, closeIndex);\r\n result.push({\r\n type: 'html-block',\r\n tag: tagName,\r\n attrs: attrs,\r\n children: parseMarkdown(innerContent)\r\n } as HtmlBlockToken);\r\n }\r\n\r\n i += consumedLines;\r\n continue;\r\n } else {\r\n // Fallback: unclosed tag → treat as self-closing to avoid consuming the whole document\r\n const blockText = remainingText.substring(0, openTagMatch.index! + fullOpenTag.length);\r\n const consumedLines = blockText.split('\\n').length;\r\n\r\n result.push({\r\n type: 'html-block',\r\n tag: tagName,\r\n attrs: attrs,\r\n children: []\r\n } as HtmlBlockToken);\r\n\r\n i += consumedLines;\r\n continue;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // ── Paragraph (default) ──\r\n const paragraphLines = [line];\r\n i++;\r\n while (i < lines.length) {\r\n const nextLine = lines[i];\r\n const nextTrimmed = nextLine.trim();\r\n if (\r\n nextTrimmed === '' ||\r\n nextTrimmed.startsWith('#') ||\r\n nextTrimmed.startsWith(':::') ||\r\n nextTrimmed.includes('|') ||\r\n nextTrimmed.match(/^(\\s*)([-*+]|\\d+\\.)\\s+/) ||\r\n nextTrimmed.startsWith('>') ||\r\n nextTrimmed.startsWith('```') ||\r\n nextTrimmed.startsWith('->') ||\r\n nextTrimmed.match(/^<([a-zA-Z][\\w-]*)\\b/)\r\n ) {\r\n break;\r\n }\r\n paragraphLines.push(nextLine);\r\n i++;\r\n }\r\n const rawParagraph = paragraphLines.join('\\n').trim();\r\n const { text, classes, id } = extractAttributes(rawParagraph);\r\n result.push({ type: 'paragraph', content: text, classes: classes || undefined, id });\r\n }\r\n\r\n return result;\r\n}\r\n\r\n// ─────────────────────────────────────────────\r\n// Slot splitting\r\n// ─────────────────────────────────────────────\r\n\r\n/**\r\n * Split directive content into named slots.\r\n * A line that is exactly `#slotname` starts a new slot.\r\n * Content before any `#slotname` goes into the \"default\" slot.\r\n *\r\n * IMPORTANT: This is nesting-aware — `#slotname` markers inside nested\r\n * directives (:::child ... :::) are NOT treated as slot boundaries of\r\n * the outer directive. Only `#slotname` at depth 0 are considered.\r\n */\r\nfunction splitSlots(rawContent: string): Record<string, string> {\r\n const slots: Record<string, string> = {};\r\n const lines = rawContent.split('\\n');\r\n let currentSlot = 'default';\r\n let buffer: string[] = [];\r\n let nestingDepth = 0;\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n\r\n // Track nesting of directives\r\n if (trimmed.startsWith(':::')) {\r\n const rest = trimmed.slice(3).trim();\r\n if (rest === '') {\r\n // Closing marker (bare :::)\r\n nestingDepth = Math.max(0, nestingDepth - 1);\r\n } else {\r\n nestingDepth++;\r\n }\r\n }\r\n\r\n // Only consider slot boundaries at depth 0\r\n if (nestingDepth === 0 && trimmed.match(/^#([\\w-]+)$/)) {\r\n // Save previous slot\r\n if (buffer.length > 0 || currentSlot !== 'default') {\r\n slots[currentSlot] = buffer.join('\\n').trim();\r\n }\r\n currentSlot = trimmed.slice(1);\r\n buffer = [];\r\n } else {\r\n buffer.push(line);\r\n }\r\n }\r\n\r\n // Save last slot\r\n slots[currentSlot] = buffer.join('\\n').trim();\r\n\r\n return slots;\r\n}\r\n","import hljs from 'highlight.js/lib/core';\n\nimport javascript from 'highlight.js/lib/languages/javascript';\nimport typescript from 'highlight.js/lib/languages/typescript';\nimport python from 'highlight.js/lib/languages/python';\nimport css from 'highlight.js/lib/languages/css';\nimport xml from 'highlight.js/lib/languages/xml';\nimport json from 'highlight.js/lib/languages/json';\nimport bash from 'highlight.js/lib/languages/bash';\nimport sql from 'highlight.js/lib/languages/sql';\nimport markdown from 'highlight.js/lib/languages/markdown';\nimport java from 'highlight.js/lib/languages/java';\nimport csharp from 'highlight.js/lib/languages/csharp';\nimport cpp from 'highlight.js/lib/languages/cpp';\nimport go from 'highlight.js/lib/languages/go';\nimport rust from 'highlight.js/lib/languages/rust';\nimport php from 'highlight.js/lib/languages/php';\nimport ruby from 'highlight.js/lib/languages/ruby';\nimport swift from 'highlight.js/lib/languages/swift';\nimport kotlin from 'highlight.js/lib/languages/kotlin';\nimport dart from 'highlight.js/lib/languages/dart';\nimport yaml from 'highlight.js/lib/languages/yaml';\nimport toml from 'highlight.js/lib/languages/ini';\nimport dockerfile from 'highlight.js/lib/languages/dockerfile';\nimport diff from 'highlight.js/lib/languages/diff';\nimport shell from 'highlight.js/lib/languages/shell';\n\nhljs.registerLanguage('javascript', javascript);\nhljs.registerLanguage('js', javascript);\nhljs.registerLanguage('jsx', javascript);\nhljs.registerLanguage('typescript', typescript);\nhljs.registerLanguage('ts', typescript);\nhljs.registerLanguage('tsx', typescript);\nhljs.registerLanguage('python', python);\nhljs.registerLanguage('py', python);\nhljs.registerLanguage('css', css);\nhljs.registerLanguage('html', xml);\nhljs.registerLanguage('xml', xml);\nhljs.registerLanguage('svg', xml);\nhljs.registerLanguage('json', json);\nhljs.registerLanguage('bash', bash);\nhljs.registerLanguage('sh', bash);\nhljs.registerLanguage('zsh', bash);\nhljs.registerLanguage('sql', sql);\nhljs.registerLanguage('markdown', markdown);\nhljs.registerLanguage('md', markdown);\nhljs.registerLanguage('java', java);\nhljs.registerLanguage('csharp', csharp);\nhljs.registerLanguage('cs', csharp);\nhljs.registerLanguage('cpp', cpp);\nhljs.registerLanguage('go', go);\nhljs.registerLanguage('rust', rust);\nhljs.registerLanguage('php', php);\nhljs.registerLanguage('ruby', ruby);\nhljs.registerLanguage('swift', swift);\nhljs.registerLanguage('kotlin', kotlin);\nhljs.registerLanguage('dart', dart);\nhljs.registerLanguage('yaml', yaml);\nhljs.registerLanguage('toml', toml);\nhljs.registerLanguage('dockerfile', dockerfile);\nhljs.registerLanguage('diff', diff);\nhljs.registerLanguage('shell', shell);\n\nexport default hljs;\n","// ============================================================\r\n// Vanilla UI Component Factories\r\n//\r\n// Each function returns a native HTMLElement. No React, no Tailwind.\r\n// Styling comes from vanilla.css via class names.\r\n// ============================================================\r\n\r\nimport hljs from './highlightSetup';\r\n\r\n// ── Icon ──────────────────────────────────────────────────\r\n\r\n/**\r\n * Create a Material Icons Round icon element.\r\n */\r\nexport function createIcon(iconName: string, extraClasses?: string): HTMLElement {\r\n const span = document.createElement('span');\r\n const cls = `nr-icon material-icons-round${extraClasses ? ` ${extraClasses}` : ''}`;\r\n span.className = cls;\r\n span.setAttribute('aria-hidden', 'true');\r\n\r\n const isCodepoint = /^[eE][0-9a-fA-F]{3,4}$/.test(iconName);\r\n if (isCodepoint) {\r\n span.innerHTML = `&#x${iconName};`;\r\n } else {\r\n span.textContent = iconName;\r\n }\r\n return span;\r\n}\r\n\r\n// ── CodeBlock ─────────────────────────────────────────────\r\n\r\n/**\r\n * Create a syntax-highlighted code block with copy button.\r\n */\r\nexport function createCodeBlock(code: string, language: string, title?: string): HTMLElement {\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'nr-codeblock';\r\n\r\n const lang = language?.split(/[\\s{]/)[0]?.trim() || '';\r\n\r\n // Title bar\r\n if (title) {\r\n const header = document.createElement('div');\r\n header.className = 'nr-codeblock__header';\r\n header.appendChild(createIcon('description'));\r\n const titleSpan = document.createElement('span');\r\n titleSpan.textContent = title;\r\n header.appendChild(titleSpan);\r\n wrapper.appendChild(header);\r\n }\r\n\r\n // Code area\r\n const pre = document.createElement('pre');\r\n pre.className = 'nr-codeblock__pre';\r\n const codeEl = document.createElement('code');\r\n codeEl.className = `language-${lang || 'plaintext'}`;\r\n\r\n try {\r\n if (lang && hljs.getLanguage(lang)) {\r\n codeEl.innerHTML = hljs.highlight(code, { language: lang }).value;\r\n } else {\r\n codeEl.innerHTML = hljs.highlightAuto(code).value;\r\n }\r\n } catch {\r\n codeEl.textContent = code;\r\n }\r\n\r\n pre.appendChild(codeEl);\r\n wrapper.appendChild(pre);\r\n\r\n // Copy button\r\n const copyBtn = document.createElement('button');\r\n copyBtn.className = 'nr-codeblock__copy';\r\n copyBtn.title = 'Copy code';\r\n const copyIcon = createIcon('content_copy');\r\n copyIcon.style.fontSize = '1rem';\r\n copyBtn.appendChild(copyIcon);\r\n\r\n let timer: ReturnType<typeof setTimeout> | null = null;\r\n copyBtn.addEventListener('click', () => {\r\n navigator.clipboard.writeText(code);\r\n copyIcon.textContent = 'check';\r\n if (timer) clearTimeout(timer);\r\n timer = setTimeout(() => { copyIcon.textContent = 'content_copy'; }, 1800);\r\n });\r\n\r\n wrapper.appendChild(copyBtn);\r\n return wrapper;\r\n}\r\n\r\n// ── Admonition ────────────────────────────────────────────\r\n\r\nconst DEFAULT_ADMONITION_ICONS: Record<string, string> = {\r\n note: 'info',\r\n info: 'lightbulb',\r\n warning: 'warning',\r\n danger: 'report',\r\n greentext: 'subdirectory_arrow_right',\r\n};\r\n\r\n/**\r\n * Create an admonition (alert) box.\r\n * Content should be appended by the caller.\r\n */\r\nexport function createAdmonition(\r\n type: string,\r\n title?: string,\r\n icon?: string,\r\n): HTMLElement {\r\n const el = document.createElement('div');\r\n el.className = `nr-admonition nr-admonition--${type || 'note'}`;\r\n\r\n if (title) {\r\n const header = document.createElement('h5');\r\n header.className = 'nr-admonition__title';\r\n const iconToRender = icon || DEFAULT_ADMONITION_ICONS[type] || 'info';\r\n header.appendChild(createIcon(iconToRender, 'nr-admonition__icon'));\r\n const titleSpan = document.createElement('span');\r\n titleSpan.textContent = title;\r\n header.appendChild(titleSpan);\r\n el.appendChild(header);\r\n }\r\n\r\n const body = document.createElement('div');\r\n body.className = 'nr-admonition__body';\r\n el.appendChild(body);\r\n\r\n return el;\r\n}\r\n\r\n// ── Details (Collapsible) ─────────────────────────────────\r\n\r\n/**\r\n * Create a native <details> collapsible section.\r\n * Content should be appended to the body div.\r\n */\r\nexport function createDetails(\r\n title: string,\r\n icon?: string,\r\n defaultOpen?: boolean,\r\n): HTMLElement {\r\n const details = document.createElement('details');\r\n details.className = 'nr-details';\r\n if (defaultOpen) details.open = true;\r\n\r\n const summary = document.createElement('summary');\r\n summary.className = 'nr-details__summary';\r\n\r\n const iconToRender = icon || 'play_arrow';\r\n const iconEl = createIcon(iconToRender, 'nr-details__icon');\r\n summary.appendChild(iconEl);\r\n\r\n const titleSpan = document.createElement('span');\r\n titleSpan.textContent = title || 'Details';\r\n summary.appendChild(titleSpan);\r\n\r\n // Rotate icon on toggle\r\n details.addEventListener('toggle', () => {\r\n iconEl.classList.toggle('nr-details__icon--open', details.open);\r\n });\r\n\r\n details.appendChild(summary);\r\n\r\n const body = document.createElement('div');\r\n body.className = 'nr-details__body';\r\n details.appendChild(body);\r\n\r\n return details;\r\n}\r\n\r\n// ── Modal (Native <dialog>) ───────────────────────────────\r\n\r\n/**\r\n * Create a native <dialog> modal.\r\n * Content should be appended to the body div.\r\n */\r\nexport function createModal(title: string): HTMLDialogElement {\r\n const dialog = document.createElement('dialog');\r\n dialog.className = 'nr-modal';\r\n\r\n // Backdrop click to close\r\n dialog.addEventListener('click', (e) => {\r\n if (e.target === dialog) {\r\n dialog.close();\r\n }\r\n });\r\n\r\n const popup = document.createElement('div');\r\n popup.className = 'nr-modal__popup';\r\n\r\n // Header\r\n const header = document.createElement('div');\r\n header.className = 'nr-modal__header';\r\n\r\n const titleEl = document.createElement('h2');\r\n titleEl.className = 'nr-modal__title';\r\n titleEl.textContent = title;\r\n header.appendChild(titleEl);\r\n\r\n const closeBtn = document.createElement('button');\r\n closeBtn.className = 'nr-modal__close';\r\n closeBtn.appendChild(createIcon('close'));\r\n closeBtn.addEventListener('click', () => dialog.close());\r\n header.appendChild(closeBtn);\r\n\r\n popup.appendChild(header);\r\n\r\n // Body\r\n const body = document.createElement('div');\r\n body.className = 'nr-modal__body';\r\n popup.appendChild(body);\r\n\r\n dialog.appendChild(popup);\r\n return dialog;\r\n}\r\n\r\n// ── Table ─────────────────────────────────────────────────\r\n\r\n/**\r\n * Render a pipe-delimited markdown table into an HTML table element.\r\n * Returns the outer wrapper div.\r\n */\r\nexport function createTable(\r\n content: string,\r\n renderInline: (text: string) => DocumentFragment,\r\n): HTMLElement {\r\n const rows = content.split('\\n').filter(r => r.trim());\r\n if (rows.length < 2) {\r\n const p = document.createElement('p');\r\n p.textContent = content;\r\n return p;\r\n }\r\n\r\n const parseRow = (row: string) =>\r\n row.split('|').map(c => c.trim()).filter(Boolean);\r\n\r\n const headerCells = parseRow(rows[0]);\r\n const bodyRows = rows.slice(2).map(parseRow);\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'nr-table-wrap';\r\n\r\n const table = document.createElement('table');\r\n table.className = 'nr-table';\r\n\r\n // Thead\r\n const thead = document.createElement('thead');\r\n const tr = document.createElement('tr');\r\n for (const cell of headerCells) {\r\n const th = document.createElement('th');\r\n th.className = 'nr-table__th';\r\n th.appendChild(renderInline(cell));\r\n tr.appendChild(th);\r\n }\r\n thead.appendChild(tr);\r\n table.appendChild(thead);\r\n\r\n // Tbody\r\n const tbody = document.createElement('tbody');\r\n for (const cells of bodyRows) {\r\n const tr = document.createElement('tr');\r\n for (const cell of cells) {\r\n const td = document.createElement('td');\r\n td.className = 'nr-table__td';\r\n td.appendChild(renderInline(cell));\r\n tr.appendChild(td);\r\n }\r\n tbody.appendChild(tr);\r\n }\r\n table.appendChild(tbody);\r\n wrapper.appendChild(table);\r\n\r\n return wrapper;\r\n}\r\n\r\n// ── List ──────────────────────────────────────────────────\r\n\r\n/**\r\n * Render a markdown list (ordered or unordered) into HTML.\r\n */\r\nexport function createList(\r\n content: string,\r\n renderInline: (text: string) => DocumentFragment,\r\n): HTMLElement {\r\n const lines = content.split('\\n');\r\n const items: { indent: number; marker: string; text: string }[] = [];\r\n\r\n for (const line of lines) {\r\n if (!line.trim()) continue;\r\n const match = line.match(/^(\\s*)([-*+]|\\d+\\.)\\s+(.+)$/);\r\n if (match) {\r\n items.push({ indent: match[1].length, marker: match[2], text: match[3] });\r\n }\r\n }\r\n\r\n if (items.length === 0) {\r\n const p = document.createElement('p');\r\n p.textContent = content;\r\n return p;\r\n }\r\n\r\n const isOrdered = /^\\d+\\.$/.test(items[0].marker);\r\n const list = document.createElement(isOrdered ? 'ol' : 'ul');\r\n list.className = 'nr-list';\r\n\r\n for (const item of items) {\r\n const li = document.createElement('li');\r\n li.className = 'nr-list__item';\r\n li.appendChild(renderInline(item.text));\r\n list.appendChild(li);\r\n }\r\n\r\n return list;\r\n}\r\n\r\n// ── TOC (Table of Contents) ───────────────────────────────\r\n\r\ninterface TocHeader {\r\n level: number;\r\n text: string;\r\n id: string;\r\n}\r\n\r\n/**\r\n * Create a table of contents from an array of headers.\r\n */\r\nexport function createTOC(\r\n headers: TocHeader[],\r\n renderInline: (text: string) => DocumentFragment,\r\n): HTMLElement {\r\n const nav = document.createElement('nav');\r\n nav.className = 'nr-toc';\r\n\r\n const title = document.createElement('div');\r\n title.className = 'nr-toc__title';\r\n title.textContent = 'Table of Contents';\r\n nav.appendChild(title);\r\n\r\n const ul = document.createElement('ul');\r\n ul.className = 'nr-toc__list';\r\n\r\n for (const h of headers) {\r\n const li = document.createElement('li');\r\n li.className = `nr-toc__item nr-toc__item--h${h.level}`;\r\n\r\n const a = document.createElement('a');\r\n a.className = 'nr-toc__link';\r\n a.href = `#${h.id}`;\r\n a.appendChild(renderInline(h.text.replace(/->|<-/g, '').trim()));\r\n a.addEventListener('click', (e) => {\r\n e.preventDefault();\r\n const target = document.getElementById(h.id);\r\n if (target) target.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n });\r\n\r\n li.appendChild(a);\r\n ul.appendChild(li);\r\n }\r\n\r\n nav.appendChild(ul);\r\n return nav;\r\n}\r\n\r\n// ── Blockquote ────────────────────────────────────────────\r\n\r\n/**\r\n * Create a blockquote element.\r\n */\r\nexport function createBlockquote(\r\n content: string,\r\n classes: string | undefined,\r\n renderInline: (text: string) => DocumentFragment,\r\n): HTMLElement {\r\n const el = document.createElement('blockquote');\r\n el.className = `nr-blockquote${classes ? ` ${classes}` : ''}`;\r\n el.appendChild(renderInline(content));\r\n return el;\r\n}\r\n","// ============================================================\r\n// Vanilla Inline Renderer\r\n//\r\n// Parses inline markdown formatting into DOM nodes.\r\n// Returns a DocumentFragment.\r\n// ============================================================\r\n\r\nimport { createIcon } from './components';\r\n\r\n/**\r\n * Render inline markdown text into a DocumentFragment.\r\n *\r\n * Supports: bold, italic, bold-italic, strikethrough, code, highlight,\r\n * spoiler, color text, underline, icons, links, raw HTML tags.\r\n */\r\nexport function renderInline(text: string): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n if (!text) return fragment;\r\n\r\n const regex =\r\n /(\\|\\[[^\\]]+\\]\\||\\*\\*\\*.+?\\*\\*\\*|\\*\\*.+?\\*\\*|_.+?_|~~.+?~~|`[^`]+?`|!~.+?~!|%[^%\\s]+?%[\\s\\S]+?%%|!>.+?<!|==.+?==|\\[[^\\]]+?\\]\\([^)]+?\\)|<[^>]+>)/g;\r\n\r\n let lastIndex = 0;\r\n let match: RegExpExecArray | null;\r\n\r\n while ((match = regex.exec(text)) !== null) {\r\n // Append text before this match\r\n if (match.index > lastIndex) {\r\n fragment.appendChild(document.createTextNode(text.slice(lastIndex, match.index)));\r\n }\r\n\r\n fragment.appendChild(parseInlinePart(match[0]));\r\n lastIndex = regex.lastIndex;\r\n }\r\n\r\n // Append remaining text\r\n if (lastIndex < text.length) {\r\n fragment.appendChild(document.createTextNode(text.slice(lastIndex)));\r\n }\r\n\r\n return fragment;\r\n}\r\n\r\n/**\r\n * Parse a single inline markdown token into a DOM node.\r\n */\r\nfunction parseInlinePart(part: string): Node {\r\n let match: RegExpMatchArray | null;\r\n\r\n // Icon: |[[icon-name]]|\r\n if ((match = part.match(/^\\|\\[([^\\]]+)\\]\\|$/))) {\r\n return createIcon(match[1]);\r\n }\r\n\r\n // Underline: !~content~! (supports params: !~color;style;type;text~!)\r\n if ((match = part.match(/^!~(.+?)~!$/))) {\r\n const content = match[1];\r\n const parts = content.split(';');\r\n let color = 'currentColor';\r\n let decorationStyle = 'solid';\r\n let type = 'underline';\r\n let textIndex = 0;\r\n\r\n if (\r\n parts[textIndex]?.match(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/) ||\r\n ['red', 'blue', 'green', 'purple', 'orange', 'yellow', 'pink'].includes(parts[textIndex])\r\n ) {\r\n color = parts[textIndex++];\r\n }\r\n if (['solid', 'double', 'dotted', 'dashed', 'wavy'].includes(parts[textIndex])) {\r\n decorationStyle = parts[textIndex++];\r\n }\r\n if (['underline', 'line-through', 'overline', 'both'].includes(parts[textIndex])) {\r\n type = parts[textIndex] === 'both' ? 'underline line-through' : parts[textIndex++];\r\n }\r\n const innerText = parts.slice(textIndex).join(';');\r\n\r\n const span = document.createElement('span');\r\n span.className = 'nr-underline';\r\n span.style.textDecoration = `${type} ${decorationStyle} ${color}`;\r\n span.style.textDecorationThickness = 'auto';\r\n span.appendChild(renderInline(innerText));\r\n return span;\r\n }\r\n\r\n // Color text: %color%text%%\r\n if ((match = part.match(/%([^%\\s]+?)%([\\s\\S]+?)%%/))) {\r\n const span = document.createElement('span');\r\n span.style.color = match[1];\r\n span.appendChild(renderInline(match[2]));\r\n return span;\r\n }\r\n\r\n // Spoiler: !>text<!\r\n if ((match = part.match(/^!>([^<]+?)<!$/))) {\r\n const span = document.createElement('span');\r\n span.className = 'nr-spoiler';\r\n span.appendChild(renderInline(match[1]));\r\n return span;\r\n }\r\n\r\n // Highlight: ==text==\r\n if ((match = part.match(/^==(.+?)==$/))) {\r\n const mark = document.createElement('mark');\r\n mark.className = 'nr-highlight';\r\n mark.appendChild(renderInline(match[1]));\r\n return mark;\r\n }\r\n\r\n // Bold-italic: ***text***\r\n if ((match = part.match(/^\\*\\*\\*(.+?)\\*\\*\\*$/))) {\r\n const strong = document.createElement('strong');\r\n const em = document.createElement('em');\r\n em.appendChild(renderInline(match[1]));\r\n strong.appendChild(em);\r\n return strong;\r\n }\r\n\r\n // Bold: **text**\r\n if ((match = part.match(/^\\*\\*(.+?)\\*\\*$/))) {\r\n const strong = document.createElement('strong');\r\n strong.appendChild(renderInline(match[1]));\r\n return strong;\r\n }\r\n\r\n // Italic: _text_\r\n if ((match = part.match(/^_(.+?)_$/))) {\r\n const em = document.createElement('em');\r\n em.appendChild(renderInline(match[1]));\r\n return em;\r\n }\r\n\r\n // Strikethrough: ~~text~~\r\n if ((match = part.match(/^~~(.+?)~~$/))) {\r\n const del = document.createElement('del');\r\n del.appendChild(renderInline(match[1]));\r\n return del;\r\n }\r\n\r\n // Inline code: `code`\r\n if ((match = part.match(/^`([^`]+)`$/))) {\r\n const code = document.createElement('code');\r\n code.className = 'nr-inline-code';\r\n code.textContent = match[1];\r\n return code;\r\n }\r\n\r\n // Link: [text](url)\r\n if ((match = part.match(/^\\[([^\\]]+?)\\]\\(([^)]+?)\\)$/))) {\r\n const a = document.createElement('a');\r\n a.className = 'nr-link';\r\n a.href = match[2];\r\n a.target = '_blank';\r\n a.rel = 'noopener noreferrer';\r\n a.appendChild(renderInline(match[1]));\r\n return a;\r\n }\r\n\r\n // Raw HTML tag: <tag>...</tag>\r\n if (part.startsWith('<') && part.endsWith('>')) {\r\n const span = document.createElement('span');\r\n span.innerHTML = part;\r\n return span;\r\n }\r\n\r\n // Fallback: plain text\r\n return document.createTextNode(part);\r\n}\r\n","// ============================================================\n// Admonition Directive (vanilla)\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\nimport { createAdmonition } from '../components';\n\nconst admonitionDirective: DirectiveRendererFn = ({ directiveType, props, renderSlot }) => {\n const el = createAdmonition(directiveType, props.title, props.icon);\n\n if (props.class) el.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.style) el.setAttribute('style', props.style);\n\n // Append default slot content into the body\n const body = el.querySelector('.nr-admonition__body');\n if (body) {\n body.appendChild(renderSlot('default'));\n }\n\n return el;\n};\n\nexport default admonitionDirective;\n","// ============================================================\n// Details Directive (vanilla)\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\nimport { createDetails } from '../components';\n\nconst detailsDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\n const el = createDetails(\n props.title || 'Details',\n props.icon,\n props.defaultOpen === 'true',\n );\n\n if (props.class) el.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.style) el.setAttribute('style', props.style);\n\n // Append default slot into the body\n const body = el.querySelector('.nr-details__body');\n if (body) {\n body.appendChild(renderSlot('default'));\n }\n\n return el;\n};\n\nexport default detailsDirective;\n","// ============================================================\r\n// Modal Directive (vanilla)\r\n// ============================================================\r\n\r\nimport type { DirectiveRendererFn } from './index';\r\nimport { createIcon, createModal } from '../components';\r\n\r\nconst modalDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\r\n const label = props.label || props.title || 'Open';\r\n const modalTitle = props.title || 'Modal';\r\n const customClass = props.class || '';\r\n\r\n // Wrapper\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'nr-modal-trigger';\r\n\r\n // Button to open modal\r\n const btn = document.createElement('button');\r\n btn.className = `nr-button nr-button--default`;\r\n if (customClass) btn.classList.add(...customClass.split(/\\s+/).filter(Boolean));\r\n\r\n const icon = props.icon || 'open_in_new';\r\n if (icon) btn.appendChild(createIcon(icon));\r\n btn.appendChild(document.createTextNode(label));\r\n\r\n // Create the native dialog\r\n const dialog = createModal(modalTitle);\r\n const body = dialog.querySelector('.nr-modal__body');\r\n if (body) {\r\n // Wrap in .nr-prose so the teleported content keeps module\r\n // typography and tokens once the dialog moves to <body>.\r\n const prose = document.createElement('div');\r\n prose.className = 'nr-prose';\r\n prose.appendChild(renderSlot('default'));\r\n body.appendChild(prose);\r\n }\r\n\r\n btn.addEventListener('click', () => {\r\n if (!dialog.open) {\r\n document.body.appendChild(dialog); // append to body for proper layering\r\n dialog.showModal();\r\n dialog.addEventListener('close', () => {\r\n dialog.remove();\r\n }, { once: true });\r\n }\r\n });\r\n\r\n wrapper.appendChild(btn);\r\n wrapper.appendChild(dialog);\r\n\r\n return wrapper;\r\n};\r\n\r\nexport default modalDirective;\r\n","// ============================================================\n// Button Directive (vanilla)\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\nimport { createIcon } from '../components';\n\nconst buttonDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\n const url = props.url || props.href || '#';\n const label = props.label;\n const icon = props.icon || 'near_me';\n const target = props.target || '_blank';\n const customClass = props.class || '';\n\n // Wrapper\n const wrapper = document.createElement('div');\n wrapper.className = 'nr-button-wrap';\n\n // If label is provided, use it directly\n if (label) {\n const a = document.createElement('a');\n a.href = url;\n a.target = target;\n a.rel = 'noopener noreferrer';\n a.className = 'nr-button nr-button--default';\n if (customClass) a.classList.add(...customClass.split(/\\s+/).filter(Boolean));\n a.appendChild(createIcon(icon));\n a.appendChild(document.createTextNode(label));\n wrapper.appendChild(a);\n return wrapper;\n }\n\n // Otherwise render slot content\n const slotContent = renderSlot('default');\n\n // Check if slot contains <a> links — wrap each in a button style\n const links = slotContent.querySelectorAll('a');\n if (links.length > 0) {\n links.forEach(link => {\n link.classList.add('nr-button', 'nr-button--default');\n if (customClass) link.classList.add(...customClass.split(/\\s+/).filter(Boolean));\n });\n wrapper.appendChild(slotContent);\n } else {\n // Fallback: wrap in an <a> tag\n const a = document.createElement('a');\n a.href = url;\n a.target = target;\n a.rel = 'noopener noreferrer';\n a.className = 'nr-button nr-button--default';\n if (customClass) a.classList.add(...customClass.split(/\\s+/).filter(Boolean));\n a.appendChild(createIcon(icon));\n a.appendChild(slotContent);\n wrapper.appendChild(a);\n }\n\n return wrapper;\n};\n\nexport default buttonDirective;\n","// ============================================================\n// Card Directive (vanilla)\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\nimport { createIcon, createModal } from '../components';\nimport { parseCssString } from '../../core/utils';\n\nconst cardDirective: DirectiveRendererFn = ({\n directiveType,\n props,\n slots,\n renderSlot,\n options,\n}) => {\n const { title, image, icon, url, target } = props;\n const customClass = props.class || '';\n const hasDescription = !!slots.description;\n const { isSingleCard } = (options || {}) as { isSingleCard?: boolean };\n\n const isModal = directiveType === 'card-m';\n const isLink = directiveType === 'card-b';\n\n const inlineStyles = props.style ? parseCssString(props.style) : {};\n\n const card = document.createElement('div');\n card.className = `nr-card${isModal || isLink ? ' nr-card--interactive' : ''} ${customClass}`.trim();\n\n // Apply inline styles\n for (const [key, value] of Object.entries(inlineStyles)) {\n card.style.setProperty(key, String(value));\n }\n\n // Image banner\n if (image) {\n const imgWrap = document.createElement('div');\n imgWrap.className = `nr-card__image${isSingleCard ? ' nr-card__image--tall' : ''}`;\n const img = document.createElement('img');\n img.src = image;\n img.alt = title || '';\n img.className = 'nr-card__img';\n imgWrap.appendChild(img);\n const gradient = document.createElement('div');\n gradient.className = 'nr-card__gradient';\n imgWrap.appendChild(gradient);\n card.appendChild(imgWrap);\n }\n\n // Content body\n const body = document.createElement('div');\n body.className = `nr-card__body${image ? ' nr-card__body--overlap' : ''}`;\n\n // Header: Icon + Title\n if (icon || title) {\n const header = document.createElement('div');\n header.className = 'nr-card__header';\n if (icon) {\n const iconWrap = document.createElement('div');\n iconWrap.className = 'nr-card__icon-wrap';\n iconWrap.appendChild(createIcon(icon));\n header.appendChild(iconWrap);\n }\n if (title) {\n const h3 = document.createElement('h3');\n h3.className = 'nr-card__title';\n h3.textContent = title;\n header.appendChild(h3);\n }\n body.appendChild(header);\n }\n\n // Description\n if (hasDescription) {\n const desc = document.createElement('div');\n desc.className = 'nr-card__description';\n desc.appendChild(renderSlot('description'));\n body.appendChild(desc);\n }\n\n // Content (for card type)\n if (directiveType === 'card') {\n const contentSlot = renderSlot('content') || renderSlot('default');\n if (contentSlot.childNodes.length > 0) {\n const contentDiv = document.createElement('div');\n contentDiv.className = 'nr-card__content';\n contentDiv.appendChild(contentSlot);\n body.appendChild(contentDiv);\n }\n }\n\n // Action link for card-m / card-b\n if (isModal || isLink) {\n const action = document.createElement('div');\n action.className = 'nr-card__action';\n\n if (isLink && url) {\n const a = document.createElement('a');\n a.href = url;\n a.target = target || '_blank';\n a.rel = 'noopener noreferrer';\n a.className = 'nr-card__action-link';\n a.appendChild(createIcon('open_in_new'));\n a.appendChild(document.createTextNode(' Link'));\n action.appendChild(a);\n } else if (isModal) {\n const modalBtn = document.createElement('div');\n modalBtn.className = 'nr-card__action-link';\n modalBtn.appendChild(createIcon('arrow_forward'));\n modalBtn.appendChild(document.createTextNode(' Abrir'));\n action.appendChild(modalBtn);\n }\n\n body.appendChild(action);\n }\n\n card.appendChild(body);\n\n // For card-m: attach modal\n if (isModal) {\n const dialog = createModal(title || 'Detalles');\n const modalBody = dialog.querySelector('.nr-modal__body');\n if (modalBody) {\n // Wrap in .nr-prose so the teleported content keeps module\n // typography and tokens once the dialog moves to <body>.\n const prose = document.createElement('div');\n prose.className = 'nr-prose';\n prose.appendChild(renderSlot('content') || renderSlot('default'));\n modalBody.appendChild(prose);\n }\n\n card.addEventListener('click', () => {\n if (!dialog.open) {\n document.body.appendChild(dialog);\n dialog.showModal();\n dialog.addEventListener('close', () => dialog.remove(), { once: true });\n }\n });\n\n // Return fragment with card + dialog\n const frag = document.createDocumentFragment();\n frag.appendChild(card);\n frag.appendChild(dialog);\n return frag;\n }\n\n // For card-b: click opens URL\n if (isLink && url) {\n card.addEventListener('click', () => window.open(url, target || '_blank'));\n }\n\n return card;\n};\n\nexport default cardDirective;\n","// ============================================================\n// Wrapper Directive (vanilla)\n//\n// Generic layout wrapper for: div, style, custom, raw\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\nimport { parseCssString } from '../../core/utils';\n\nconst wrapperDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\n const el = document.createElement('div');\n el.className = 'nr-wrapper';\n\n if (props.class) el.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.id) el.id = props.id;\n\n // Inline styles\n if (props.style) {\n const styles = parseCssString(props.style);\n for (const [key, value] of Object.entries(styles)) {\n el.style.setProperty(key, String(value));\n }\n }\n\n // data-* attributes\n for (const [key, value] of Object.entries(props)) {\n if (key.startsWith('data-')) {\n el.setAttribute(key, value);\n }\n }\n\n el.appendChild(renderSlot('default'));\n return el;\n};\n\nexport default wrapperDirective;\n","// ============================================================\n// Slide Directive (vanilla)\n//\n// Single-line text carousel with CSS-driven slide-up rotation.\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\nimport { parseCssString } from '../../core/utils';\n\nlet slideCounter = 0;\n\nconst slideDirective: DirectiveRendererFn = ({\n props,\n slots,\n renderInline,\n renderMarkdown,\n}) => {\n const rawContent = slots.default || '';\n const lines = rawContent\n .split('\\n')\n .map(l => l.trim())\n .filter(Boolean);\n\n if (lines.length === 0) {\n return document.createDocumentFragment();\n }\n\n const interval = parseInt(props.interval || '3000', 10);\n const speed = parseInt(props.speed || '500', 10);\n const rawClass = props.class || '';\n const inlineStyle = props.style ? parseCssString(props.style) : {};\n\n const scopeClass = `sld-${++slideCounter}`;\n\n // Container\n const container = document.createElement('div');\n container.className = 'nr-slide';\n Object.assign(container.style, {\n position: 'relative',\n overflow: 'hidden',\n ...inlineStyle,\n });\n\n // Inner track (holds all slides, animated via translateY)\n const track = document.createElement('div');\n track.className = 'nr-slide__track';\n track.style.transition = `transform ${speed}ms cubic-bezier(0.16, 1, 0.3, 1)`;\n\n // Create slide elements\n const slideEls: HTMLElement[] = [];\n for (const line of lines) {\n const slideEl = document.createElement('div');\n slideEl.className = `nr-slide__item ${scopeClass} ${rawClass}`.trim();\n slideEl.style.display = 'flex';\n slideEl.style.alignItems = 'center';\n\n // Parse each line as markdown\n if (renderMarkdown) {\n const tokens = renderMarkdown(line);\n slideEl.appendChild(tokens);\n } else if (renderInline) {\n slideEl.appendChild(renderInline(line));\n }\n\n track.appendChild(slideEl);\n slideEls.push(slideEl);\n }\n\n container.appendChild(track);\n\n // Measure and animate\n let current = 0;\n let maxH = 0;\n\n const measureAndSetHeight = () => {\n maxH = 0;\n for (const el of slideEls) {\n maxH = Math.max(maxH, el.offsetHeight);\n }\n if (maxH > 0) {\n container.style.height = `${maxH}px`;\n for (const el of slideEls) {\n el.style.height = `${maxH}px`;\n }\n }\n };\n\n // Initial measurement after DOM attach\n requestAnimationFrame(() => {\n measureAndSetHeight();\n // Re-measure after fonts load\n if (document.fonts?.ready) {\n document.fonts.ready.then(measureAndSetHeight);\n }\n });\n\n // Rotation\n if (lines.length > 1) {\n setInterval(() => {\n current = (current + 1) % lines.length;\n track.style.transform = `translateY(${-current * maxH}px)`;\n }, interval);\n }\n\n return container;\n};\n\nexport default slideDirective;\n","// ============================================================\n// Keys Directive (vanilla)\n//\n// Renders keyboard shortcut text as <kbd> chips.\n// The directive detects the keys by splitting the content on \"+\".\n//\n// :::keys\n// CTRL + SHIFT + DEL\n// :::\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\n\nconst keysDirective: DirectiveRendererFn = ({ props, slots }) => {\n const wrap = document.createElement('div');\n wrap.className = 'nr-keys';\n\n if (props.class) wrap.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.style) wrap.setAttribute('style', props.style);\n\n const sizeClass = props.size ? ` nr-kbd--${props.size}` : '';\n\n const parts = (slots.default || '')\n .split('+')\n .map(p => p.trim())\n .filter(Boolean);\n\n parts.forEach((part, i) => {\n if (i > 0) {\n const sep = document.createElement('span');\n sep.className = 'nr-keys__sep';\n sep.textContent = '+';\n wrap.appendChild(sep);\n }\n const kbd = document.createElement('kbd');\n kbd.className = `nr-kbd${sizeClass}`;\n kbd.textContent = part;\n wrap.appendChild(kbd);\n });\n\n return wrap;\n};\n\nexport default keysDirective;","// ============================================================\n// Accordion Directive (vanilla)\n//\n// Collapsible accordion built from nested accordion-item\n// directives. Radio mode (default) allows one open item at a\n// time; checkbox mode allows multiple.\n//\n// :::accordion {mode=\"radio\"}\n// :::accordion-item {title=\"Question?\" checked=\"true\"}\n// Answer here.\n// :::\n// :::accordion-item {title=\"Another question?\"}\n// Another answer.\n// :::\n// :::\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\n\nlet accordionCounter = 0;\n\nexport const accordionItemDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\n const item = document.createElement('div');\n item.className = 'nr-accordion__item';\n\n if (props.class) item.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.style) item.setAttribute('style', props.style);\n\n const input = document.createElement('input');\n input.type = 'radio';\n input.className = 'nr-accordion__input';\n if (props.checked === 'true' || props.checked === '') input.checked = true;\n if (props.value) input.value = props.value;\n input.setAttribute('aria-label', props.title || 'Accordion item');\n\n const title = document.createElement('div');\n title.className = 'nr-accordion__title';\n title.textContent = props.title || '';\n\n const content = document.createElement('div');\n content.className = 'nr-accordion__content';\n content.appendChild(renderSlot('default'));\n\n item.append(input, title, content);\n return item;\n};\n\nconst accordionDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\n const wrap = document.createElement('div');\n wrap.className = 'nr-accordion';\n\n if (props.class) wrap.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.style) wrap.setAttribute('style', props.style);\n\n wrap.appendChild(renderSlot('default'));\n\n const mode = props.mode === 'checkbox' ? 'checkbox' : 'radio';\n const group = `nr-acc-${++accordionCounter}`;\n\n wrap.querySelectorAll<HTMLInputElement>('.nr-accordion__input').forEach(input => {\n input.type = mode;\n if (mode === 'radio') input.name = group;\n });\n\n return wrap;\n};\n\nexport default accordionDirective;","// ============================================================\n// Carousel Directive (vanilla)\n//\n// Image carousel with prev/next arrows and dot navigation.\n// Slides are detected from markdown images inside the slot.\n// Navigation wraps around (infinite loop) and transitions are\n// animated via a CSS transform on the track.\n//\n// :::carousel {height=\"400px\"}\n// \n// \n// :::\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\n\nconst IMG_RE = /!\\[([^\\]]*)\\]\\(([^)]+)\\)/g;\n\nconst carouselDirective: DirectiveRendererFn = ({ props, slots }) => {\n const images: { src: string; alt: string }[] = [];\n const raw = slots.default || '';\n let m: RegExpExecArray | null;\n IMG_RE.lastIndex = 0;\n while ((m = IMG_RE.exec(raw)) !== null) {\n images.push({ src: m[2].split('#')[0].trim(), alt: m[1].trim() || 'carousel image' });\n }\n\n if (images.length === 0) {\n return document.createDocumentFragment();\n }\n\n const wrap = document.createElement('div');\n wrap.className = 'nr-carousel';\n wrap.tabIndex = 0;\n wrap.setAttribute('aria-label', 'Image carousel');\n\n if (props.class) wrap.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.style) wrap.setAttribute('style', props.style);\n if (props.width) wrap.style.width = props.width;\n if (props.float) {\n if (props.float === 'left' || props.float === 'right') {\n wrap.style.float = props.float;\n if (!props.width) wrap.style.maxWidth = '50%';\n wrap.style.marginInlineStart = props.float === 'right' ? '1rem' : '';\n wrap.style.marginInlineEnd = props.float === 'left' ? '1rem' : '';\n } else if (props.float === 'center') {\n wrap.style.marginInline = 'auto';\n }\n }\n\n const viewport = document.createElement('div');\n viewport.className = 'nr-carousel__viewport';\n if (props.height) viewport.style.height = props.height;\n if (props.aspect) viewport.style.aspectRatio = props.aspect;\n\n const track = document.createElement('div');\n track.className = 'nr-carousel__track';\n\n const items: HTMLElement[] = [];\n for (const img of images) {\n const item = document.createElement('div');\n item.className = 'nr-carousel__item';\n const el = document.createElement('img');\n el.src = img.src;\n el.alt = img.alt;\n el.loading = 'lazy';\n item.appendChild(el);\n track.appendChild(item);\n items.push(item);\n }\n viewport.appendChild(track);\n wrap.appendChild(viewport);\n\n const total = items.length;\n let index = 0;\n\n const goTo = (i: number) => {\n index = ((i % total) + total) % total;\n track.style.transform = `translateX(-${index * 100}%)`;\n items.forEach((it, j) => it.classList.toggle('nr-carousel__item--active', j === index));\n dots.forEach((d, j) => d.classList.toggle('nr-carousel__dot--active', j === index));\n };\n\n const prev = document.createElement('button');\n prev.className = 'nr-carousel__nav nr-carousel__nav--prev';\n prev.setAttribute('aria-label', 'Previous slide');\n prev.textContent = '❮';\n prev.addEventListener('click', () => goTo(index - 1));\n\n const next = document.createElement('button');\n next.className = 'nr-carousel__nav nr-carousel__nav--next';\n next.setAttribute('aria-label', 'Next slide');\n next.textContent = '❯';\n next.addEventListener('click', () => goTo(index + 1));\n\n const dots: HTMLButtonElement[] = [];\n const dotsBox = document.createElement('div');\n dotsBox.className = 'nr-carousel__dots';\n images.forEach((_, i) => {\n const dot = document.createElement('button');\n dot.className = 'nr-carousel__dot';\n dot.setAttribute('aria-label', `Go to slide ${i + 1}`);\n dot.addEventListener('click', () => goTo(i));\n dotsBox.appendChild(dot);\n dots.push(dot);\n });\n\n wrap.append(prev, next, dotsBox);\n\n wrap.addEventListener('keydown', (e) => {\n if (e.key === 'ArrowLeft') {\n e.preventDefault();\n goTo(index - 1);\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n goTo(index + 1);\n }\n });\n\n goTo(0);\n\n return wrap;\n};\n\nexport default carouselDirective;","// ============================================================\n// Countdown Directive (vanilla)\n//\n// Countdown blocks (days / hours / min / sec) with daisyUI-style\n// digit flip animation. Static values via props, or a live\n// ticking countdown with the target prop.\n//\n// :::countdown {days=\"15\" hours=\"10\" min=\"24\" sec=\"59\"}\n// :::countdown {target=\"2026-12-31T23:59:59\"}\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\n\nconst DEFAULT_LABELS = ['days', 'hours', 'min', 'sec'];\n\nconst countdownDirective: DirectiveRendererFn = ({ props }) => {\n const wrap = document.createElement('div');\n wrap.className = 'nr-countdown';\n\n if (props.class) wrap.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.style) wrap.setAttribute('style', props.style);\n\n const labelParts = (props.labels || '').split('|').map(s => s.trim());\n const labels = DEFAULT_LABELS.map((label, i) => labelParts[i] || label);\n const digits = parseInt(props.digits || '2', 10);\n\n const targetTime = props.target ? new Date(props.target).getTime() : NaN;\n const hasTarget = !Number.isNaN(targetTime);\n\n const blocks: { value: HTMLElement }[] = [];\n\n const compute = (): number[] => {\n if (hasTarget) {\n const diff = Math.max(0, targetTime - Date.now());\n return [\n Math.floor(diff / 86400000),\n Math.floor(diff / 3600000) % 24,\n Math.floor(diff / 60000) % 60,\n Math.floor(diff / 1000) % 60,\n ];\n }\n return [\n parseInt(props.days || '0', 10),\n parseInt(props.hours || '0', 10),\n parseInt(props.min || '0', 10),\n parseInt(props.sec || '0', 10),\n ];\n };\n\n const render = () => {\n const values = compute();\n blocks.forEach((block, i) => {\n const v = String(values[i]);\n block.value.style.setProperty('--value', v);\n block.value.setAttribute('aria-label', v);\n block.value.textContent = v;\n });\n };\n\n labels.forEach(label => {\n const block = document.createElement('div');\n block.className = 'nr-countdown__block';\n\n const value = document.createElement('span');\n value.className = 'nr-countdown__value';\n value.style.setProperty('--digits', String(digits));\n value.setAttribute('aria-live', 'polite');\n value.setAttribute('aria-label', '0');\n value.textContent = '0';\n\n const labelEl = document.createElement('span');\n labelEl.className = 'nr-countdown__label';\n labelEl.textContent = label;\n\n block.append(value, labelEl);\n wrap.appendChild(block);\n blocks.push({ value });\n });\n\n render();\n if (hasTarget) setInterval(render, 1000);\n\n return wrap;\n};\n\nexport default countdownDirective;","// ============================================================\n// Diff Directive (vanilla)\n//\n// Before/after image comparison slider. Drag the handle (or\n// click anywhere on the figure), or use arrow keys when focused.\n// The split position is driven by the --nr-diff-pos custom\n// property, updated via pointer events for reliable dragging.\n//\n// :::diff {before=\"https://example.com/a.webp\" after=\"https://example.com/b.webp\"}\n// :::\n//\n// ...or with two markdown images inside the slot (first = before):\n//\n// :::diff\n// \n// \n// :::\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\n\nconst IMG_RE = /!\\[([^\\]]*)\\]\\(([^)]+)\\)/g;\n\nconst diffDirective: DirectiveRendererFn = ({ props, slots }) => {\n let before = (props.before || '').split('#')[0].trim();\n let after = (props.after || '').split('#')[0].trim();\n\n if (!before || !after) {\n const urls: string[] = [];\n const raw = slots.default || '';\n let m: RegExpExecArray | null;\n IMG_RE.lastIndex = 0;\n while ((m = IMG_RE.exec(raw)) !== null) {\n urls.push(m[2].split('#')[0].trim());\n }\n if (!before && urls.length > 0) before = urls[0];\n if (!after && urls.length > 1) after = urls[1];\n }\n\n if (!before || !after) {\n return document.createDocumentFragment();\n }\n\n const figure = document.createElement('figure');\n figure.className = 'nr-diff';\n figure.tabIndex = 0;\n figure.setAttribute('aria-label', 'Image comparison slider');\n\n if (props.class) figure.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.style) figure.setAttribute('style', props.style);\n if (props.aspect) figure.style.aspectRatio = props.aspect;\n if (props.height) figure.style.height = props.height;\n if (props.width) figure.style.width = props.width;\n if (props.float) {\n if (props.float === 'left' || props.float === 'right') {\n figure.style.float = props.float;\n if (!props.width) figure.style.maxWidth = '50%';\n figure.style.marginInlineStart = props.float === 'right' ? '1rem' : '';\n figure.style.marginInlineEnd = props.float === 'left' ? '1rem' : '';\n } else if (props.float === 'center') {\n figure.style.marginInline = 'auto';\n }\n }\n\n const beforeItem = document.createElement('div');\n beforeItem.className = 'nr-diff__item nr-diff__item--before';\n beforeItem.setAttribute('role', 'img');\n beforeItem.tabIndex = 0;\n const beforeImg = document.createElement('img');\n beforeImg.src = before;\n beforeImg.alt = 'before';\n beforeItem.appendChild(beforeImg);\n\n const afterItem = document.createElement('div');\n afterItem.className = 'nr-diff__item nr-diff__item--after';\n afterItem.setAttribute('role', 'img');\n const afterImg = document.createElement('img');\n afterImg.src = after;\n afterImg.alt = 'after';\n afterItem.appendChild(afterImg);\n\n const resizer = document.createElement('div');\n resizer.className = 'nr-diff__resizer';\n resizer.setAttribute('aria-label', 'Drag to compare');\n resizer.title = 'Drag to compare';\n\n figure.append(beforeItem, afterItem, resizer);\n\n let pos = 50;\n\n const applyPos = () => {\n figure.style.setProperty('--nr-diff-pos', `${pos}%`);\n };\n\n const setPosFromClientX = (clientX: number) => {\n const rect = figure.getBoundingClientRect();\n if (rect.width === 0) return;\n pos = Math.min(100, Math.max(0, ((clientX - rect.left) / rect.width) * 100));\n applyPos();\n };\n\n resizer.addEventListener('pointerdown', (e) => {\n e.preventDefault();\n resizer.setPointerCapture(e.pointerId);\n setPosFromClientX(e.clientX);\n });\n\n resizer.addEventListener('pointermove', (e) => {\n if (e.buttons & 1) setPosFromClientX(e.clientX);\n });\n\n resizer.addEventListener('pointerup', (e) => {\n if (resizer.hasPointerCapture(e.pointerId)) {\n resizer.releasePointerCapture(e.pointerId);\n }\n });\n\n figure.addEventListener('click', (e) => {\n if (e.target === resizer) return;\n setPosFromClientX(e.clientX);\n });\n\n figure.addEventListener('keydown', (e) => {\n if (e.key !== 'ArrowLeft' && e.key !== 'ArrowRight') return;\n e.preventDefault();\n pos = Math.min(100, Math.max(0, pos + (e.key === 'ArrowRight' ? 5 : -5)));\n applyPos();\n });\n\n applyPos();\n\n return figure;\n};\n\nexport default diffDirective;","// ============================================================\n// Hover-3D Directive (vanilla)\n//\n// 3D tilt card that reacts to the mouse position. The 8 empty\n// tracking divs daisyUI requires are generated automatically.\n//\n// :::hover-3d\n// <figure>...<img .../></figure>\n// :::\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\n\nconst hover3dDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\n const container = document.createElement('div');\n container.className = 'nr-hover-3d';\n\n if (props.class) container.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.style) container.setAttribute('style', props.style);\n\n const stage = document.createElement('div');\n stage.className = 'nr-hover-3d__stage';\n stage.appendChild(renderSlot('default'));\n container.appendChild(stage);\n\n // 8 empty divs needed for the directional hover regions\n for (let i = 0; i < 8; i++) {\n container.appendChild(document.createElement('div'));\n }\n\n return container;\n};\n\nexport default hover3dDirective;","// ============================================================\n// Hover Gallery Directive (vanilla)\n//\n// Image gallery where hovering a thumbnail expands it to fill\n// the whole gallery.\n//\n// :::hover-gallery {aspect=\"16/9\"}\n// \n// \n// :::\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\n\nconst IMG_RE = /!\\[([^\\]]*)\\]\\(([^)]+)\\)/g;\n\nconst hovergalleryDirective: DirectiveRendererFn = ({ props, slots }) => {\n const images: { src: string; alt: string }[] = [];\n const raw = slots.default || '';\n let m: RegExpExecArray | null;\n IMG_RE.lastIndex = 0;\n while ((m = IMG_RE.exec(raw)) !== null) {\n images.push({ src: m[2].split('#')[0].trim(), alt: m[1].trim() || 'gallery image' });\n }\n\n if (images.length === 0) {\n return document.createDocumentFragment();\n }\n\n const figure = document.createElement('figure');\n figure.className = 'nr-hover-gallery';\n if (props.aspect) figure.style.aspectRatio = props.aspect;\n\n if (props.class) figure.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.style) figure.setAttribute('style', props.style);\n\n for (const img of images) {\n const el = document.createElement('img');\n el.src = img.src;\n el.alt = img.alt;\n el.loading = 'lazy';\n figure.appendChild(el);\n }\n\n return figure;\n};\n\nexport default hovergalleryDirective;","// ============================================================\n// Chat Directive (vanilla)\n//\n// Chat bubbles built from nested chat-item directives.\n//\n// :::chat\n// :::chat-item {side=\"start\" name=\"Obi-Wan\" time=\"12:45\" avatar=\"https://...\"}\n// You were the Chosen One!\n// :::\n// :::chat-item {side=\"end\" name=\"Anakin\" time=\"12:46\" avatar=\"https://...\" color=\"primary\"}\n// I hate you!\n// :::\n// :::\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\n\nexport const chatItemDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\n const side = props.side === 'end' ? 'end' : 'start';\n const wrap = document.createElement('div');\n wrap.className = `nr-chat nr-chat--${side}`;\n\n if (props.class) wrap.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.style) wrap.setAttribute('style', props.style);\n\n const header = document.createElement('div');\n header.className = 'nr-chat__header';\n if (props.name) {\n const name = document.createElement('span');\n name.className = 'nr-chat__name';\n name.textContent = props.name;\n header.appendChild(name);\n }\n if (props.time) {\n const time = document.createElement('time');\n time.className = 'nr-chat__time';\n time.textContent = props.time;\n header.appendChild(time);\n }\n if (header.childNodes.length > 0) wrap.appendChild(header);\n\n if (props.avatar) {\n const avatar = document.createElement('div');\n avatar.className = 'nr-chat__avatar';\n const img = document.createElement('img');\n img.src = props.avatar;\n img.alt = props.name || 'avatar';\n avatar.appendChild(img);\n wrap.appendChild(avatar);\n }\n\n const bubble = document.createElement('div');\n bubble.className = `nr-chat__bubble${props.color ? ` nr-chat__bubble--${props.color}` : ''}`;\n bubble.appendChild(renderSlot('default'));\n wrap.appendChild(bubble);\n\n if (props.footer) {\n const footer = document.createElement('div');\n footer.className = 'nr-chat__footer';\n footer.textContent = props.footer;\n wrap.appendChild(footer);\n }\n\n return wrap;\n};\n\nconst chatDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\n const wrap = document.createElement('div');\n wrap.className = 'nr-chat';\n\n if (props.class) wrap.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.style) wrap.setAttribute('style', props.style);\n\n wrap.appendChild(renderSlot('default'));\n return wrap;\n};\n\nexport default chatDirective;","// ============================================================\n// Event prop binding (vanilla)\n//\n// Generic `event` prop support for directives:\n//\n// :::richlist-item {event=\"click: playSound; mouseover: hoverFn\"}\n//\n// Syntax per binding: `eventName: functionName`, multiple\n// bindings separated by `;`. The event name tolerates an `on`\n// prefix (`onclick` → `click`). The function is resolved from\n// the global scope at event time and invoked with the element\n// as `this` and the DOM event as argument.\n//\n// Trust model: same as :::raw / :::style — author-owned content.\n// ============================================================\n\nexport interface EventBinding {\n eventName: string;\n fnName: string;\n}\n\nexport function parseEventProp(eventProp?: string): EventBinding[] {\n if (!eventProp) return [];\n const bindings: EventBinding[] = [];\n for (const part of eventProp.split(';')) {\n const trimmed = part.trim();\n if (!trimmed) continue;\n const idx = trimmed.indexOf(':');\n if (idx === -1) continue;\n const eventName = trimmed.slice(0, idx).trim().replace(/^on/i, '');\n const fnName = trimmed.slice(idx + 1).trim();\n if (eventName && fnName) bindings.push({ eventName, fnName });\n }\n return bindings;\n}\n\nexport function bindEventProp(el: HTMLElement, eventProp?: string): void {\n for (const { eventName, fnName } of parseEventProp(eventProp)) {\n el.addEventListener(eventName, (e) => {\n const fn = (window as unknown as Record<string, unknown>)[fnName];\n if (typeof fn === 'function') {\n (fn as (this: HTMLElement, ev: Event) => void).call(el, e);\n }\n });\n }\n}","// ============================================================\n// Rich List Directive (vanilla)\n//\n// Rich list rows (daisyUI \"list\") with avatar, title, subtitle,\n// description and optional action buttons.\n//\n// :::richlist\n// :::richlist-item\n// {title=\"Dio Lupa\" subtitle=\"Remaining Reason\" image=\"https://...\" icon=\"play_arrow\" icon2=\"favorite\"}\n// Description text with **markdown** support.\n// :::\n// :::\n//\n// Action buttons accept:\n// url / url2 → open a new tab when the icon / icon2 button is clicked\n// event / event2 → bind a global function to the icon / icon2 button,\n// e.g. event=\"click: playSound\" (see events.ts)\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\nimport { createIcon } from '../components';\nimport { bindEventProp } from './events';\n\nexport const richlistItemDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\n const li = document.createElement('li');\n li.className = 'nr-richlist__item';\n\n if (props.class) li.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.style) li.setAttribute('style', props.style);\n\n if (props.image) {\n const thumb = document.createElement('div');\n thumb.className = 'nr-richlist__thumb';\n const img = document.createElement('img');\n img.src = props.image;\n img.alt = props.title || 'list item';\n img.loading = 'lazy';\n thumb.appendChild(img);\n li.appendChild(thumb);\n }\n\n if (props.title || props.subtitle) {\n const main = document.createElement('div');\n main.className = 'nr-richlist__main';\n if (props.title) {\n const title = document.createElement('div');\n title.className = 'nr-richlist__title';\n title.textContent = props.title;\n main.appendChild(title);\n }\n if (props.subtitle) {\n const subtitle = document.createElement('div');\n subtitle.className = 'nr-richlist__subtitle';\n subtitle.textContent = props.subtitle;\n main.appendChild(subtitle);\n }\n li.appendChild(main);\n }\n\n const descFrag = renderSlot('default');\n if (descFrag.childNodes.length > 0) {\n const desc = document.createElement('p');\n desc.className = 'nr-richlist__desc';\n desc.appendChild(descFrag);\n li.appendChild(desc);\n }\n\n const actions = [\n { icon: props.icon, url: props.url, event: props.event },\n { icon: props.icon2, url: props.url2, event: props.event2 },\n ].filter((a) => !!a.icon);\n\n if (actions.length > 0) {\n const actionsDiv = document.createElement('div');\n actionsDiv.className = 'nr-richlist__actions';\n for (const { icon, url, event } of actions) {\n const btn = document.createElement('button');\n btn.className = 'nr-richlist__action';\n btn.type = 'button';\n btn.setAttribute('aria-label', icon as string);\n btn.appendChild(createIcon(icon as string));\n if (event) {\n bindEventProp(btn, event);\n } else if (url) {\n btn.addEventListener('click', () => window.open(url as string, '_blank'));\n }\n actionsDiv.appendChild(btn);\n }\n li.appendChild(actionsDiv);\n }\n\n return li;\n};\n\nconst richlistDirective: DirectiveRendererFn = ({ props, renderSlot }) => {\n const ul = document.createElement('ul');\n ul.className = 'nr-richlist';\n\n if (props.class) ul.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.style) ul.setAttribute('style', props.style);\n\n ul.appendChild(renderSlot('default'));\n return ul;\n};\n\nexport default richlistDirective;","// ============================================================\n// Stat Directive (vanilla)\n//\n// Single stat card. Consecutive :::stat directives auto-batch\n// into a horizontal grid (see renderer.ts).\n//\n// :::stat {title=\"Total Likes\" value=\"25.6K\" desc=\"21% more than last month\" icon=\"favorite\" color=\"primary\"}\n// ============================================================\n\nimport type { DirectiveRendererFn } from './index';\nimport { createIcon } from '../components';\n\nconst statDirective: DirectiveRendererFn = ({ props }) => {\n const colorClass = props.color ? ` nr-stat--${props.color}` : '';\n const stat = document.createElement('div');\n stat.className = `nr-stat${colorClass}`;\n\n if (props.class) stat.classList.add(...props.class.split(/\\s+/).filter(Boolean));\n if (props.style) stat.setAttribute('style', props.style);\n\n if (props.icon) {\n const figure = document.createElement('div');\n figure.className = 'nr-stat__figure';\n figure.appendChild(createIcon(props.icon));\n stat.appendChild(figure);\n }\n\n if (props.title) {\n const title = document.createElement('div');\n title.className = 'nr-stat__title';\n title.textContent = props.title;\n stat.appendChild(title);\n }\n\n if (props.value) {\n const value = document.createElement('div');\n value.className = 'nr-stat__value';\n value.textContent = props.value;\n stat.appendChild(value);\n }\n\n if (props.desc) {\n const desc = document.createElement('div');\n desc.className = 'nr-stat__desc';\n desc.textContent = props.desc;\n stat.appendChild(desc);\n }\n\n return stat;\n};\n\nexport default statDirective;","// ============================================================\n// Vanilla Directive Registry\n//\n// Maps directive type strings to vanilla renderer functions.\n// ============================================================\n\nimport type { Token } from '../../core/types';\n\n// ── Context passed to directive renderers ──\n\nexport interface VanillaRenderContext {\n /** Parse markdown string into tokens */\n parseMarkdown: (md: string) => Token[];\n /** Render tokens into an HTMLElement */\n renderElements: (tokens: Token[]) => HTMLElement;\n /** Render inline text into a DocumentFragment */\n renderInline: (text: string) => DocumentFragment;\n /** Parse markdown string and render into an HTMLElement */\n renderMarkdown: (md: string) => HTMLElement;\n}\n\nexport interface DirectiveProps {\n /** The directive type string */\n directiveType: string;\n /** Parsed key=\"value\" attributes */\n props: Record<string, string>;\n /** Named slots → raw content strings */\n slots: Record<string, string>;\n /** Render a named slot as parsed markdown */\n renderSlot: (name: string) => DocumentFragment;\n /** Render context */\n context: VanillaRenderContext;\n /** Position index */\n index: number;\n /** Full parsed AST */\n allElements: Token[];\n /** Extra flags */\n options?: Record<string, any>;\n /** Inline renderer shortcut */\n renderInline: (text: string) => DocumentFragment;\n /** Full markdown renderer shortcut (for complex directives like slide) */\n renderMarkdown?: (md: string) => HTMLElement;\n}\n\nexport type DirectiveRendererFn = (props: DirectiveProps) => HTMLElement | DocumentFragment;\n\n// ── Import directive implementations ──\n\nimport admonitionDirective from './admonition';\nimport detailsDirective from './details';\nimport modalDirective from './modal';\nimport buttonDirective from './button';\nimport cardDirective from './card';\nimport wrapperDirective from './wrapper';\nimport slideDirective from './slide';\nimport keysDirective from './keys';\nimport accordionDirective, { accordionItemDirective } from './accordion';\nimport carouselDirective from './carousel';\nimport countdownDirective from './countdown';\nimport diffDirective from './diff';\nimport hover3dDirective from './hover3d';\nimport hovergalleryDirective from './hovergallery';\nimport chatDirective, { chatItemDirective } from './chat';\nimport richlistDirective, { richlistItemDirective } from './richlist';\nimport statDirective from './stat';\n\n// ── Registry ──\n\nconst directiveRegistry: Record<string, DirectiveRendererFn> = {\n // Admonitions\n note: admonitionDirective,\n info: admonitionDirective,\n warning: admonitionDirective,\n danger: admonitionDirective,\n greentext: admonitionDirective,\n // Cards\n card: cardDirective,\n 'card-m': cardDirective,\n 'card-b': cardDirective,\n // Interactive\n details: detailsDirective,\n modal: modalDirective,\n button: buttonDirective,\n // Layout / generic wrappers\n div: wrapperDirective,\n style: wrapperDirective,\n custom: wrapperDirective,\n raw: wrapperDirective,\n // Animation\n slide: slideDirective,\n // New components\n keys: keysDirective,\n accordion: accordionDirective,\n 'accordion-item': accordionItemDirective,\n carousel: carouselDirective,\n countdown: countdownDirective,\n diff: diffDirective,\n 'hover-3d': hover3dDirective,\n 'hover-gallery': hovergalleryDirective,\n chat: chatDirective,\n 'chat-item': chatItemDirective,\n richlist: richlistDirective,\n 'richlist-item': richlistItemDirective,\n stat: statDirective,\n};\n\nexport default directiveRegistry;\n","// ============================================================\r\n// Vanilla Markdown Renderer\r\n//\r\n// Pipeline: Token[] → processElements() → HTMLElement\r\n// No React, no Tailwind. Pure DOM + CSS classes.\r\n// ============================================================\r\n\r\nimport type { Token, DirectiveToken, HtmlBlockToken, HtmlToken } from '../core/types';\r\nimport { parseMarkdown } from '../core/parser';\r\nimport { scrollToId, parseHtmlAttrs } from '../core/utils';\r\nimport { renderInline } from './inline';\r\nimport {\r\n createCodeBlock,\r\n createTable,\r\n createList,\r\n createTOC,\r\n createBlockquote,\r\n} from './components';\r\nimport directiveRegistry, { type VanillaRenderContext, type DirectiveProps } from './directives';\r\n\r\n/**\r\n * Render parsed markdown tokens into an HTMLElement.\r\n *\r\n * @param tokens - Array of tokens from `parseMarkdown()`\r\n * @returns The root `<article class=\"nr-prose\">` element\r\n */\r\nexport function renderTokens(tokens: Token[]): HTMLElement {\r\n const article = document.createElement('article');\r\n article.className = 'nr-prose';\r\n\r\n const ctx: VanillaRenderContext = {\r\n parseMarkdown,\r\n renderElements: (tks) => renderTokensInner(tks, ctx),\r\n renderInline,\r\n renderMarkdown: (md: string) => renderTokensInner(parseMarkdown(md), ctx),\r\n };\r\n\r\n article.appendChild(processElements(tokens, ctx, tokens));\r\n return article;\r\n}\r\n\r\n/**\r\n * Convenience: parse markdown string and render directly.\r\n */\r\nexport function renderMarkdownString(markdown: string): HTMLElement {\r\n const tokens = parseMarkdown(markdown);\r\n return renderTokens(tokens);\r\n}\r\n\r\n/**\r\n * Render a raw HTML string into a wrapper element.\r\n * Extracts <style> blocks (injected globally into <head>) and\r\n * force-executes any <script> tags.\r\n */\r\nexport function renderHtmlString(html: string): HTMLElement {\r\n let processedContent = html;\r\n\r\n // Extract <style> blocks and inject globally\r\n processedContent = processedContent.replace(\r\n /<style(?:\\s+[^>]*)?>([\\s\\S]*?)<\\/style>/gi,\r\n (_match: string, cssContent: string) => {\r\n const styleEl = document.createElement('style');\r\n styleEl.setAttribute('data-nr-global', '');\r\n styleEl.textContent = cssContent;\r\n document.head.appendChild(styleEl);\r\n return '';\r\n }\r\n );\r\n\r\n const wrapper = document.createElement('div');\r\n wrapper.className = 'nr-raw-html';\r\n wrapper.innerHTML = processedContent;\r\n\r\n // Force-execute injected scripts\r\n const scripts = wrapper.querySelectorAll('script');\r\n scripts.forEach(oldScript => {\r\n const newScript = document.createElement('script');\r\n Array.from(oldScript.attributes).forEach(attr =>\r\n newScript.setAttribute(attr.name, attr.value)\r\n );\r\n newScript.textContent = oldScript.textContent;\r\n oldScript.parentNode?.replaceChild(newScript, oldScript);\r\n });\r\n\r\n return wrapper;\r\n}\r\n\r\n/**\r\n * Render tokens into an HTMLElement (internal, creates a container).\r\n */\r\nfunction renderTokensInner(tokens: Token[], ctx: VanillaRenderContext): HTMLElement {\r\n const container = document.createElement('div');\r\n container.appendChild(processElements(tokens, ctx, tokens));\r\n return container;\r\n}\r\n\r\n/**\r\n * Process an array of tokens into a DocumentFragment.\r\n */\r\nfunction processElements(\r\n elements: Token[],\r\n ctx: VanillaRenderContext,\r\n allElements: Token[],\r\n): DocumentFragment {\r\n const fragment = document.createDocumentFragment();\r\n let i = 0;\r\n\r\n // Directives that auto-batch consecutive instances into a grid\r\n const BATCHED_DIRECTIVES: Record<string, string> = {\r\n card: 'nr-card-grid',\r\n 'card-m': 'nr-card-grid',\r\n 'card-b': 'nr-card-grid',\r\n stat: 'nr-stat-grid',\r\n };\r\n\r\n const isBatched = (directive: Token | null): directive is DirectiveToken =>\r\n !!directive &&\r\n directive.type === 'directive' &&\r\n Object.prototype.hasOwnProperty.call(BATCHED_DIRECTIVES, directive.directiveType);\r\n\r\n while (i < elements.length) {\r\n const el = elements[i];\r\n\r\n // Batch consecutive batched directives into a grid\r\n if (isBatched(el)) {\r\n const cards: Token[] = [];\r\n while (i < elements.length && isBatched(elements[i])) {\r\n cards.push(elements[i]);\r\n i++;\r\n }\r\n\r\n if (cards.length === 1 || (cards[0] as DirectiveToken).props?.batch === 'off') {\r\n for (const card of cards) {\r\n const rendered = renderElement(card, ctx, allElements);\r\n if (rendered) fragment.appendChild(rendered);\r\n }\r\n } else {\r\n const grid = document.createElement('div');\r\n grid.className = BATCHED_DIRECTIVES[(cards[0] as DirectiveToken).directiveType];\r\n for (const card of cards) {\r\n const rendered = renderElement(card, ctx, allElements);\r\n if (rendered) grid.appendChild(rendered);\r\n }\r\n fragment.appendChild(grid);\r\n }\r\n } else {\r\n const rendered = renderElement(el, ctx, allElements);\r\n if (rendered) fragment.appendChild(rendered);\r\n i++;\r\n }\r\n }\r\n\r\n return fragment;\r\n}\r\n\r\n/**\r\n * Render a single token into a Node.\r\n */\r\nfunction renderElement(\r\n element: Token,\r\n ctx: VanillaRenderContext,\r\n allElements: Token[],\r\n): Node | null {\r\n switch (element.type) {\r\n case 'header': {\r\n const tag = `h${element.level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6';\r\n let text = element.text;\r\n\r\n // Alignment modifiers\r\n const alignCenter = text.match(/^->\\s*(.+?)\\s*<-\\s*$/);\r\n const alignRight = text.match(/^->\\s*(.+?)\\s*->\\s*$/);\r\n if (alignCenter) text = alignCenter[1];\r\n else if (alignRight) text = alignRight[1];\r\n\r\n const h = document.createElement(tag);\r\n h.id = element.id;\r\n let cls = `md-h${element.level}`;\r\n if (alignCenter) cls += ' text-center';\r\n if (alignRight) cls += ' text-right';\r\n if (element.classes) cls += ` ${element.classes}`;\r\n h.className = cls;\r\n h.appendChild(renderInline(text));\r\n return h;\r\n }\r\n\r\n case 'paragraph': {\r\n const p = document.createElement('p');\r\n let cls = 'md-p';\r\n if (element.classes) cls += ` ${element.classes}`;\r\n if (element.align) cls += ` text-${element.align}`;\r\n p.className = cls;\r\n if (element.id) p.id = element.id;\r\n\r\n const lines = element.content.split('\\n');\r\n for (let li = 0; li < lines.length; li++) {\r\n const line = lines[li];\r\n const hardBreakMatch = line.match(/^(.*?)(\\s{2,})$/);\r\n if (hardBreakMatch) {\r\n p.appendChild(renderInline(hardBreakMatch[1]));\r\n p.appendChild(document.createElement('br'));\r\n } else {\r\n p.appendChild(renderInline(line));\r\n if (li < lines.length - 1) {\r\n p.appendChild(document.createTextNode(' '));\r\n }\r\n }\r\n }\r\n return p;\r\n }\r\n\r\n case 'codeblock':\r\n return createCodeBlock(element.content, element.language, element.title);\r\n\r\n case 'directive':\r\n return renderDirective(element, ctx, allElements);\r\n\r\n case 'html': {\r\n const el = element as HtmlToken;\r\n return renderHtmlString(el.content);\r\n }\r\n\r\n case 'html-block': {\r\n const htmlBlock = element as HtmlBlockToken;\r\n const rawProps = parseHtmlAttrs(htmlBlock.attrs);\r\n\r\n const el = document.createElement(htmlBlock.tag);\r\n // Apply attributes (keep as-is, no React renaming needed)\r\n for (const [key, value] of Object.entries(rawProps)) {\r\n if (key === 'style' && typeof value === 'object') {\r\n for (const [prop, val] of Object.entries(value)) {\r\n el.style.setProperty(prop, String(val));\r\n }\r\n } else if (value === true) {\r\n el.setAttribute(key, '');\r\n } else {\r\n el.setAttribute(key, String(value));\r\n }\r\n }\r\n\r\n // Recurse children\r\n const childFrag = processElements(htmlBlock.children, ctx, allElements);\r\n el.appendChild(childFrag);\r\n return el;\r\n }\r\n\r\n case 'image': {\r\n const img = document.createElement('img');\r\n img.src = element.src;\r\n img.alt = element.alt;\r\n img.className = 'nr-image';\r\n if (element.style) {\r\n for (const [key, value] of Object.entries(element.style)) {\r\n img.style.setProperty(key, String(value));\r\n }\r\n }\r\n return img;\r\n }\r\n\r\n case 'table':\r\n return createTable(element.content, renderInline);\r\n\r\n case 'list':\r\n return createList(element.content, renderInline);\r\n\r\n case 'blockquote':\r\n return createBlockquote(element.content, element.classes, renderInline);\r\n\r\n case 'hr': {\r\n const hr = document.createElement('hr');\r\n hr.className = 'nr-hr';\r\n return hr;\r\n }\r\n\r\n case 'toc': {\r\n const headers = allElements.filter((e): e is Token & { type: 'header' } => e.type === 'header');\r\n return createTOC(headers.map(h => ({ level: h.level, text: h.text, id: h.id })), renderInline);\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Render a directive token.\r\n */\r\nfunction renderDirective(\r\n element: DirectiveToken,\r\n ctx: VanillaRenderContext,\r\n allElements: Token[],\r\n): Node | null {\r\n const { directiveType, props, slots, scopeId } = element;\r\n\r\n const renderer = directiveRegistry[directiveType];\r\n\r\n // renderSlot helper: parse slot content as markdown and render\r\n const renderSlot = (name: string): DocumentFragment => {\r\n const frag = document.createDocumentFragment();\r\n const slotContent = slots[name];\r\n if (!slotContent) return frag;\r\n const tokens = ctx.parseMarkdown(slotContent);\r\n frag.appendChild(ctx.renderElements(tokens));\r\n return frag;\r\n };\r\n\r\n const directiveProps: DirectiveProps = {\r\n directiveType,\r\n props,\r\n slots,\r\n renderSlot,\r\n context: ctx,\r\n index: 0,\r\n allElements,\r\n renderInline,\r\n renderMarkdown: ctx.renderMarkdown,\r\n };\r\n\r\n if (renderer) {\r\n return renderer(directiveProps);\r\n }\r\n\r\n // Fallback: unknown directive → render as a div with default slot\r\n const fallback = document.createElement('div');\r\n fallback.className = 'nr-unknown-directive';\r\n fallback.appendChild(renderSlot('default'));\r\n return fallback;\r\n}\r\n","import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { guideData, type GuideEntry } from '../guide/index';\nimport CustomMarkdownRenderer from './CustomMarkdownRenderer';\n\nexport interface GuideProps {\n open: boolean;\n onClose: () => void;\n initialDirective?: string;\n search?: boolean;\n}\n\n/**\n * Guide — in-editor syntax guide.\n *\n * Populated by guideData (generated from guide/**\\/*.md at build time by\n * guide/build.mjs). Each entry is rendered live with the same markdown\n * engine used by the preview, so directives inside the guide are real\n * working examples.\n */\nconst Guide: React.FC<GuideProps> = ({\n open,\n onClose,\n initialDirective,\n search = true,\n}) => {\n const [query, setQuery] = useState('');\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [collapsed, setCollapsed] = useState<Record<string, boolean>>({});\n const contentRef = useRef<HTMLDivElement>(null);\n\n const groups = useMemo(() => {\n const map = new Map<string, GuideEntry[]>();\n for (const e of guideData) {\n const arr = map.get(e.category) ?? [];\n arr.push(e);\n map.set(e.category, arr);\n }\n return [...map.entries()];\n }, []);\n\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase();\n if (!q) return groups;\n return groups\n .map(([cat, entries]) => [\n cat,\n entries.filter(\n (e) =>\n e.title.toLowerCase().includes(q) ||\n e.id.toLowerCase().includes(q) ||\n e.category.toLowerCase().includes(q) ||\n e.md.slice(0, 400).toLowerCase().includes(q)\n ),\n ] as const)\n .filter(([, entries]) => entries.length > 0);\n }, [groups, query]);\n\n const selected = useMemo(\n () => guideData.find((e) => e.id === selectedId) ?? null,\n [selectedId]\n );\n\n useEffect(() => {\n if (!open) return;\n setQuery('');\n if (!selectedId) {\n const initial =\n guideData.find((e) => e.id === initialDirective) ??\n guideData.find((e) => e.id === 'introduccion') ??\n guideData[0];\n setSelectedId(initial?.id ?? null);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n // Lock page scroll while the guide is open\n const prev = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = prev;\n };\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n // Each entry opens at the top of its content\n contentRef.current?.scrollTo({ top: 0 });\n }, [selectedId, open]);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') onClose();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [open, onClose]);\n\n if (!open) return null;\n\n const toggleCategory = (cat: string) =>\n setCollapsed((prev) => ({ ...prev, [cat]: !prev[cat] }));\n\n return createPortal(\n <div className=\"nr-guide\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Guía de sintaxis\">\n <div className=\"nr-guide__overlay\" onClick={onClose} />\n <div className=\"nr-guide__panel\">\n <header className=\"nr-guide__head\">\n <span className=\"material-icons-round\">menu_book</span>\n <h2>Guía de sintaxis</h2>\n {search && (\n <input\n className=\"nr-guide__search\"\n type=\"search\"\n placeholder=\"Buscar directiva…\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n />\n )}\n <button\n className=\"nr-guide__close\"\n onClick={onClose}\n aria-label=\"Cerrar guía\"\n >\n ×\n </button>\n </header>\n <div className=\"nr-guide__body\">\n <nav className=\"nr-guide__nav\">\n {filtered.map(([cat, entries]) => (\n <div className=\"nr-guide__cat\" key={cat}>\n <button\n className=\"nr-guide__cat-head\"\n onClick={() => toggleCategory(cat)}\n >\n <span className=\"material-icons-round nr-guide__cat-chevron\">\n {collapsed[cat] ? 'chevron_right' : 'expand_more'}\n </span>\n {cat}\n </button>\n {!collapsed[cat] && (\n <ul className=\"nr-guide__items\">\n {entries.map((e) => (\n <li key={e.id}>\n <button\n className={`nr-guide__item${\n selectedId === e.id ? ' nr-guide__item--active' : ''\n }`}\n onClick={() => setSelectedId(e.id)}\n >\n {e.icon && (\n <span className=\"material-icons-round nr-guide__item-icon\">\n {e.icon}\n </span>\n )}\n {e.title}\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n ))}\n {filtered.length === 0 && (\n <div className=\"nr-guide__empty\">Sin resultados para «{query}».</div>\n )}\n </nav>\n <div className=\"nr-guide__content\" ref={contentRef}>\n {selected ? (\n <CustomMarkdownRenderer key={selected.id} content={selected.md} />\n ) : (\n <div className=\"nr-guide__empty\">\n Selecciona una directiva de la lista.\n </div>\n )}\n </div>\n </div>\n </div>\n </div>,\n document.body\n );\n};\n\nexport default Guide;\n","// ============================================================\n// Guide data — GENERATED by guide/build.mjs. Do not edit manually.\n// Regenerate with `npm run guide:build` (edit guide/**/*.md instead).\n// ============================================================\n\nexport interface GuideEntry {\n id: string;\n category: string;\n title: string;\n icon?: string;\n order: number;\n md: string;\n}\n\nexport const guideData: GuideEntry[] = [\n {\n \"id\": \"introduccion\",\n \"category\": \"Introducción\",\n \"title\": \"Introducción\",\n \"icon\": \"menu_book\",\n \"order\": 1,\n \"md\": \"# Introducción a NoirMD\\n\\n**NoirMD** es un editor y motor de renderizado Markdown con extensiones propias: **admoniciones**, **componentes**, **directivas interactivas** y **markdown enriquecido**.\\n\\nEsta guía está escrita con el propio motor: cada directiva que ves aquí es una muestra **viva** y funcional, no una captura.\\n\\n## Cómo usar el editor\\n\\n| Elemento | Descripción |\\n| --- | --- |\\n| Toolbar superior | Modo (editor / split / preview), guardar, copiar, imprimir, tema, guía y configurar |\\n| Panel izquierdo | Editor de código con resaltado de sintaxis |\\n| Panel derecho | Preview en vivo (en modo split o preview) |\\n| Atajo | `Ctrl+S` guarda el contenido |\\n\\n## Sintaxis de una directiva\\n\\nLas directivas se escriben con tres dos puntos `:::` y un nombre, opcionalmente con atributos entre llaves:\\n\\n```\\n:::card {title=\\\"Mi tarjeta\\\" icon=\\\"star\\\"}\\n\\nContenido **markdown** aquí dentro.\\n\\n:::\\n```\\n\\nTodo lo que está entre la apertura y el cierre `:::` se renderiza con el mismo motor, así que puedes **anidar** directivas.\\n\\n## Cheatsheet rápido\\n\\n| Sintaxis | Resultado |\\n| --- | --- |\\n| `# Título` → `###### Título` | Encabezados |\\n| `**negrita**` · `*cursiva*` · `~~tachado~~` | Énfasis |\\n| `` `código` `` | Código inline |\\n| `` ```js `` | Bloque de código con resaltado |\\n| `[texto](url)` | Enlace |\\n| `` | Imagen |\\n| `` | Imagen flotante a la izquierda |\\n| `==resaltado==` | Resaltado |\\n| `%color%texto%%` | Texto de color |\\n| `->centrado<-` | Texto centrado |\\n| `!>spoiler<!` | Spoiler oculto |\\n| `|[[icono]]|` | Icono Material |\\n| `[TOC]` | Índice de contenidos |\\n| `:::note` `:::warning` `:::danger` `:::info` `:::greentext` | Admoniciones |\\n| `:::card` `:::accordion` `:::carousel` `:::diff` `:::chat` `:::stat` `:::countdown` `:::keys` `:::hover-3d` `:::hover-gallery` `:::richlist` | Componentes |\\n| `:::details` `:::modal` `:::button` `:::slide` | Interactivos |\\n| `:::div` `:::style` `:::raw` | Layout |\\n\\n## Organización de la guía\\n\\n- **Markdown** — sintaxis base y enriquecida (títulos, énfasis, tablas, código, imágenes, inline).\\n- **Admoniciones** — cajas de aviso: nota, warning, danger, info y greentext.\\n- **Componentes** — los 10 componentes de tarjeta, teclas, acordeón, carrusel, etc.\\n- **Interactivos** — details, modal, botones y slides.\\n- **Layout** — contenedores `div`, estilos `style` y HTML `raw`.\\n\\nCada página incluye: la sintaxis exacta, la tabla de props, un ejemplo en vivo y el código fuente para copiar.\"\n },\n {\n \"id\": \"titulos\",\n \"category\": \"Markdown\",\n \"title\": \"Títulos y encabezados\",\n \"icon\": \"title\",\n \"order\": 1,\n \"md\": \"# Títulos y encabezados\\n\\nLos títulos se escriben con almohadillas `#`. Hay **seis niveles**, de `#` (mayor) a `######` (menor).\\n\\n## Sintaxis\\n\\n```md\\n# Título 1\\n## Título 2\\n### Título 3\\n#### Título 4\\n##### Título 5\\n###### Título 6\\n```\\n\\n## Resultado\\n\\n# Título 1\\n## Título 2\\n### Título 3\\n#### Título 4\\n##### Título 5\\n###### Título 6\\n\\n## Notas\\n\\n- Cada título genera un **ancla** automática: al pulsar sobre él se copia el enlace directo a la sección.\\n- El prefijo `[TOC]` (índice de contenidos) genera un índice con todos los títulos del documento (ver la página de **Sintaxis inline**).\\n- Los títulos pueden llevar atributos personalizados con la directiva `:::div` o envolverlos en `:::style` para darles clases o estilos propios.\\n\\n## Anclas\\n\\nCualquier título se puede enlazar con su id automático:\\n\\n```md\\n[Ir a los títulos](#títulos-y-encabezados)\\n```\\n\\n> El id se genera a partir del texto del título, en minúsculas y con guiones.\"\n },\n {\n \"id\": \"enfasis\",\n \"category\": \"Markdown\",\n \"title\": \"Énfasis, código y enlaces\",\n \"icon\": \"format_bold\",\n \"order\": 2,\n \"md\": \"# Énfasis, código y enlaces\\n\\n## Énfasis básico\\n\\n| Sintaxis | Resultado |\\n| --- | --- |\\n| `**negrita**` | **negrita** |\\n| `*cursiva*` o `_cursiva_` | *cursiva* |\\n| `~~tachado~~` | ~~tachado~~ |\\n| `***negrita y cursiva***` | ***negrita y cursiva*** |\\n\\n## Código inline\\n\\nEl código en línea se escribe entre comillas invertidas:\\n\\n```md\\nUsa la función `renderMarkdownString()` para renderizar.\\n```\\n\\nUsa la función `renderMarkdownString()` para renderizar.\\n\\n## Enlaces\\n\\n### Externos\\n\\n```md\\n[Ir a la documentación](https://example.com)\\n```\\n\\n[Ir a la documentación](https://example.com)\\n\\n### Anclas internas\\n\\n```md\\n[Volver al inicio](#introducción-a-noirmd)\\n```\\n\\n[Volver al inicio](#introducción-a-noirmd)\\n\\n### Enlace con título\\n\\n```md\\n[Pasa el ratón aquí](https://example.com \\\"Título del enlace\\\")\\n```\\n\\n[Pasa el ratón aquí](https://example.com \\\"Título del enlace\\\")\\n\\n## Párrafos y saltos de línea\\n\\n- Un salto de línea simple **no** separa párrafos; se necesita una línea en blanco.\\n- Para un salto de línea forzado, termina la línea con dos espacios o usa `\\\\`.\\n\\n```md\\nPrimer párrafo.\\n\\nSegundo párrafo con salto forzado \\ny esta línea debajo.\\n```\\n\\n> Los párrafos vacíos entre bloques se eliminan automáticamente para no dejar huecos.\"\n },\n {\n \"id\": \"listas\",\n \"category\": \"Markdown\",\n \"title\": \"Listas\",\n \"icon\": \"format_list_bulleted\",\n \"order\": 3,\n \"md\": \"# Listas\\n\\n## Lista desordenada\\n\\n```md\\n- Elemento uno\\n- Elemento dos\\n- Elemento tres\\n```\\n\\n- Elemento uno\\n- Elemento dos\\n- Elemento tres\\n\\n## Lista ordenada\\n\\n```md\\n1. Primer paso\\n2. Segundo paso\\n3. Tercer paso\\n```\\n\\n1. Primer paso\\n2. Segundo paso\\n3. Tercer paso\\n\\n## Listas anidadas\\n\\n```md\\n- Frutas\\n - Manzana\\n - Pera\\n- Verduras\\n 1. Zanahoria\\n 2. Calabacín\\n- Legumbres\\n```\\n\\n- Frutas\\n - Manzana\\n - Pera\\n- Verduras\\n 1. Zanahoria\\n 2. Calabacín\\n- Legumbres\\n\\n## Listas mixtas\\n\\n```md\\n- Paso uno: preparar\\n 1. Cortar\\n 2. Pelar\\n- Paso dos: cocinar\\n - Hervir\\n - Saltear\\n```\\n\\n- Paso uno: preparar\\n 1. Cortar\\n 2. Pelar\\n- Paso dos: cocinar\\n - Hervir\\n - Saltear\\n\\n## Notas\\n\\n- La anidación se hace con **4 espacios** (o un tabulador).\\n- Los elementos de lista admiten todo el markdown: `**negrita**`, `[enlaces](#listas)`, código `` `inline` `` e incluso admoniciones y directivas anidadas.\\n- Si un elemento contiene un párrafo completo, añade una línea en blanco dentro del elemento.\"\n },\n {\n \"id\": \"tablas\",\n \"category\": \"Markdown\",\n \"title\": \"Tablas\",\n \"icon\": \"table_chart\",\n \"order\": 4,\n \"md\": \"# Tablas\\n\\nLas tablas usan la sintaxis de tuberías `|`. La segunda fila define la alineación.\\n\\n## Sintaxis\\n\\n```md\\n| Columna A | Columna B | Columna C |\\n| --- | --- | --- |\\n| a1 | b1 | c1 |\\n| a2 | b2 | c2 |\\n```\\n\\n| Columna A | Columna B | Columna C |\\n| --- | --- | --- |\\n| a1 | b1 | c1 |\\n| a2 | b2 | c2 |\\n\\n## Alineación\\n\\nUsa dos puntos en la fila de separación para alinear columnas:\\n\\n```md\\n| Izquierda | Centro | Derecha |\\n| :--- | :---: | ---: |\\n| texto | texto | texto |\\n```\\n\\n| Izquierda | Centro | Derecha |\\n| :--- | :---: | ---: |\\n| texto | texto | texto |\\n\\n## Contenido enriquecido\\n\\nLas celdas admiten **negrita**, *cursiva*, `` `código` `` y enlaces:\\n\\n| Directiva | Props | Descripción |\\n| :--- | :--- | :--- |\\n| `:::card` | `title`, `icon` | Tarjeta de contenido |\\n| `:::chat` | `side`, `name` | Burbuja de chat |\\n| `:::stat` | `value`, `color` | Estadística |\\n\\n## Escapar la tubería\\n\\nSi un valor contiene una `|`, escápala con barra invertida:\\n\\n```md\\n| Prop | Valores |\\n| --- | --- |\\n| float | `left` \\\\| `right` \\\\| `center` |\\n```\\n\\n| Prop | Valores |\\n| --- | --- |\\n| float | `left` \\\\| `right` \\\\| `center` |\\n\\n> Las tablas con muchas columnas se vuelven horizontales en pantallas pequeñas.\"\n },\n {\n \"id\": \"codigo\",\n \"category\": \"Markdown\",\n \"title\": \"Bloques de código\",\n \"icon\": \"code\",\n \"order\": 5,\n \"md\": \"# Bloques de código\\n\\nLos bloques de código se escriben con **tres comillas invertidas** (o tres tildes `~~~`). El lenguaje opcional activa el resaltado de sintaxis.\\n\\n## Sintaxis\\n\\n````md\\n```js\\nconst saludo = (nombre) => `Hola, ${nombre}!`;\\nconsole.log(saludo('mundo'));\\n```\\n````\\n\\n```js\\nconst saludo = (nombre) => `Hola, ${nombre}!`;\\nconsole.log(saludo('mundo'));\\n```\\n\\n## Lenguajes soportados\\n\\nEl resaltado funciona con los lenguajes de **highlight.js**: `js`, `ts`, `json`, `html`, `css`, `python`, `bash`, `md`, `sql`, `java`, `c`, `cpp`, `rust`, `go`, etc.\\n\\n```python\\ndef factorial(n):\\n return 1 if n <= 1 else n * factorial(n - 1)\\n\\nprint(factorial(5))\\n```\\n\\n```css\\n.nr-guide__panel {\\n display: flex;\\n border-radius: 14px;\\n overflow: hidden;\\n}\\n```\\n\\n## Notas\\n\\n- Los bloques de código **no** procesan directivas: lo que escribas dentro se muestra literal.\\n- El botón de copiar (esquina superior derecha) copia el contenido al portapapeles.\\n- Los bloques largos se desplazan verticalmente; no rompen el layout.\\n\\n## Mostrar la sintaxis de directivas\\n\\nPara enseñar directivas dentro de la propia guía se usa un bloque con lenguaje `md`:\\n\\n```md\\n:::card {title=\\\"Ejemplo\\\"}\\n\\nContenido de la tarjeta.\\n\\n:::\\n```\\n\\n> El lenguaje `md` (o `markdown`) resalta la sintaxis de directivas de NoirMD.\"\n },\n {\n \"id\": \"imagenes\",\n \"category\": \"Markdown\",\n \"title\": \"Imágenes\",\n \"icon\": \"image\",\n \"order\": 6,\n \"md\": \"# Imágenes\\n\\n## Básica\\n\\n```md\\n\\n```\\n\\n\\n\\n## Con tamaño\\n\\nAñade el tamaño entre llaves después de la URL en formato `ancho:alto` (px):\\n\\n```md\\n{300:200}\\n```\\n\\n{300:200}\\n\\n## Flotante\\n\\nEl sufijo `#left`, `#right` o `#center` después de la URL hace la imagen flotante (el texto la rodea):\\n\\n```md\\n{220:150}\\n\\nTexto que fluye alrededor de la imagen flotante...\\n```\\n\\n{220:150}\\n\\nTexto que fluye alrededor de la imagen flotante a la izquierda: el párrafo siguiente acompaña la imagen sin romper la línea. Puedes usar `#right` para colocarla a la derecha y `#center` para centrarla (en ese caso conviene definir tamaño).\\n\\n### Derecha\\n\\n```md\\n{200:130}\\n```\\n\\n{200:130}\\n\\n### Centrada\\n\\n```md\\n{400:220}\\n```\\n\\n{400:220}\\n\\n## Notas\\n\\n- Sin `{w:h}`, la imagen respeta su tamaño natural (máximo el ancho del contenedor).\\n- Las imágenes flotantes sin tamaño usan un ancho máximo del 50%.\\n- Para comparar dos imágenes con un slider, usa la directiva `:::diff` (ver **Componentes**).\"\n },\n {\n \"id\": \"inline\",\n \"category\": \"Markdown\",\n \"title\": \"Sintaxis inline\",\n \"icon\": \"text_fields\",\n \"order\": 7,\n \"md\": \"# Sintaxis inline\\n\\nAdemás del markdown clásico, NoirMD añade estilos inline propios.\\n\\n## Resaltado\\n\\n```md\\n==Este texto está resaltado==\\n```\\n\\n==Este texto está resaltado==\\n\\n## Texto de color\\n\\nSe usa `%color%texto%%`:\\n\\n```md\\n%red%texto rojo%% %green%texto verde%% %blue%texto azul%%\\n```\\n\\n%red%texto rojo%% %green%texto verde%% %blue%texto azul%%\\n\\n| Color | Ejemplo |\\n| --- | --- |\\n| `%red%` | %red%rojo%% |\\n| `%green%` | %green%verde%% |\\n| `%blue%` | %blue%azul%% |\\n| `%yellow%` | %yellow%amarillo%% |\\n| `%orange%` | %orange%naranja%% |\\n| `%purple%` | %purple%morado%% |\\n| `%cyan%` | %cyan%cian%% |\\n| `%pink%` | %pink%rosa%% |\\n\\n## Subrayado\\n\\n```md\\n!~subrayado~!\\n```\\n\\n!~subrayado~!\\n\\n## Spoiler\\n\\n```md\\n!>El final de la película era un sueño<!\\n```\\n\\n!>El final de la película era un sueño<!\\n\\n> Pasa el ratón (o pulsa) sobre el texto oculto para revelarlo.\\n\\n## Centrado y derecha\\n\\n```md\\n->texto centrado<-\\n->texto a la derecha->\\n```\\n\\n->texto centrado<-\\n\\n->texto a la derecha->\\n\\n## Iconos Material\\n\\nLos iconos se insertan con el nombre entre `|[[ ]]|`:\\n\\n```md\\n|[[favorite]]| Me gusta |[[send]]| Enviar |[[star]]| Destacar\\n```\\n\\n|[[favorite]]| Me gusta |[[send]]| Enviar |[[star]]| Destacar\\n\\n> Usa cualquier nombre de la colección [Material Symbols](https://fonts.google.com/icons). También funcionan en props como `icon` de las directivas.\\n\\n## Índice de contenidos\\n\\n```md\\n[TOC]\\n```\\n\\n[TOC]\\n\\n> El `[TOC]` genera un índice clicable con todos los títulos del documento. También existe como prop `toc` del editor.\"\n },\n {\n \"id\": \"nota\",\n \"category\": \"Admoniciones\",\n \"title\": \"Nota\",\n \"icon\": \"sticky_note_2\",\n \"order\": 1,\n \"md\": \"# Admonición: Nota\\n\\nLa directiva `:::note` crea una caja de aviso neutra, útil para información complementaria.\\n\\n## Sintaxis\\n\\n```md\\n:::note\\nTexto de la nota.\\n:::\\n```\\n\\n:::note\\nTexto de la nota.\\n:::\\n\\n## Con título\\n\\n```md\\n:::note Recuerda\\nGuarda tu trabajo con `Ctrl+S` antes de salir.\\n:::\\n```\\n\\n:::note Recuerda\\nGuarda tu trabajo con `Ctrl+S` antes de salir.\\n:::\\n\\n## Props\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `title` | texto | Título del bloque (sin `:` en el nombre, es el texto tras `note`) |\\n| `icon` | nombre Material | Icono personalizado del bloque |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n## Anidando directivas\\n\\nLas admoniciones admiten markdown completo dentro:\\n\\n```md\\n:::note Propina\\nPuedes anidar **directivas** dentro de una nota:\\n- `:::keys` para atajos\\n- Tablas, código, enlaces...\\n:::\\n```\\n\\n:::note Propina\\nPuedes anidar **directivas** dentro de una nota:\\n\\n:::keys {size=\\\"sm\\\"}\\nCTRL + S\\n:::\\n\\n- Tablas, código, enlaces...\\n:::\"\n },\n {\n \"id\": \"warning\",\n \"category\": \"Admoniciones\",\n \"title\": \"Warning\",\n \"icon\": \"warning_amber\",\n \"order\": 2,\n \"md\": \"# Admonición: Warning\\n\\nLa directiva `:::warning` crea una caja de aviso ámbar, para precauciones o advertencias moderadas.\\n\\n## Sintaxis\\n\\n```md\\n:::warning\\nCuidado con esto.\\n:::\\n```\\n\\n:::warning\\nCuidado con esto.\\n:::\\n\\n## Con título e icono\\n\\n```md\\n:::warning {title=\\\"Precaución\\\" icon=\\\"warning\\\"}\\nEl bloque `:::` debe cerrarse correctamente.\\n:::\\n```\\n\\n:::warning {title=\\\"Precaución\\\" icon=\\\"warning\\\"}\\nEl bloque `:::` debe cerrarse correctamente.\\n:::\\n\\n## Props\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `title` | texto | Título del bloque |\\n| `icon` | nombre Material | Icono personalizado |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n## Combinando admoniciones\\n\\n```md\\n:::warning Contenido sensible\\nEsta parte **se borra** al vaciar el editor:\\n- No guardes aquí contraseñas\\n- Usa `:::danger` para lo crítico\\n:::\\n```\\n\\n:::warning Contenido sensible\\nEsta parte **se borra** al vaciar el editor:\\n\\n- No guardes aquí contraseñas\\n- Usa `:::danger` para lo crítico\\n:::\"\n },\n {\n \"id\": \"danger\",\n \"category\": \"Admoniciones\",\n \"title\": \"Danger\",\n \"icon\": \"error\",\n \"order\": 3,\n \"md\": \"# Admonición: Danger\\n\\nLa directiva `:::danger` crea una caja roja de error o peligro, para lo más crítico.\\n\\n## Sintaxis\\n\\n```md\\n:::danger\\n¡Esto puede romper tu documento!\\n:::\\n```\\n\\n:::danger\\n¡Esto puede romper tu documento!\\n:::\\n\\n## Con título\\n\\n```md\\n:::danger {title=\\\"Error irrecuperable\\\" icon=\\\"error\\\"}\\nLa variable `{{title}}` no existe.\\n:::\\n```\\n\\n:::danger {title=\\\"Error irrecuperable\\\" icon=\\\"error\\\"}\\nLa variable `{{title}}` no existe.\\n:::\\n\\n## Props\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `title` | texto | Título del bloque |\\n| `icon` | nombre Material | Icono personalizado |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n## Uso combinado con código\\n\\n````md\\n:::danger Tiempo agotado\\nLa sesión expiró. Vuelve a iniciar sesión:\\n\\n```md\\n[Iniciar sesión](/login)\\n```\\n:::\\n````\\n\\n:::danger Tiempo agotado\\nLa sesión expiró. Vuelve a iniciar sesión:\\n\\n[Iniciar sesión](/login)\\n:::\"\n },\n {\n \"id\": \"info\",\n \"category\": \"Admoniciones\",\n \"title\": \"Info\",\n \"icon\": \"info\",\n \"order\": 4,\n \"md\": \"# Admonición: Info\\n\\nLa directiva `:::info` crea una caja azul de información técnica o contextual.\\n\\n## Sintaxis\\n\\n```md\\n:::info\\nDato técnico o contextual.\\n:::\\n```\\n\\n:::info\\nDato técnico o contextual.\\n:::\\n\\n## Con título\\n\\n```md\\n:::info {title=\\\"API\\\" icon=\\\"api\\\"}\\nEl endpoint devuelve `application/json`.\\n:::\\n```\\n\\n:::info {title=\\\"API\\\" icon=\\\"api\\\"}\\nEl endpoint devuelve `application/json`.\\n:::\\n\\n## Props\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `title` | texto | Título del bloque |\\n| `icon` | nombre Material | Icono personalizado |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n## Ejemplo con tablas\\n\\n```md\\n:::info Versiones\\n| Versión | Estado |\\n| --- | --- |\\n| v2.0 | Estable |\\n| v3.0 | Beta |\\n:::\\n```\\n\\n:::info Versiones\\n| Versión | Estado |\\n| --- | --- |\\n| v2.0 | Estable |\\n| v3.0 | Beta |\\n:::\"\n },\n {\n \"id\": \"greentext\",\n \"category\": \"Admoniciones\",\n \"title\": \"Greentext\",\n \"icon\": \"chat\",\n \"order\": 5,\n \"md\": \"# Admonición: Greentext\\n\\nLa directiva `:::greentext` crea un bloque verde tipo foro, para citas informales, humor o contexto narrativo.\\n\\n## Sintaxis\\n\\n```md\\n:::greentext\\n> el usuario que usa markdown simple\\n> no conoce el poder de las directivas\\n:::\\n```\\n\\n:::greentext\\n> el usuario que usa markdown simple\\n> no conoce el poder de las directivas\\n:::\\n\\n## Con título\\n\\n```md\\n:::greentext {title=\\\"Feedback del usuario\\\"}\\n> la guía escribe sola\\n> 10/10\\n:::\\n```\\n\\n:::greentext {title=\\\"Feedback del usuario\\\"}\\n> la guía escribe sola\\n> 10/10\\n:::\\n\\n## Props\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `title` | texto | Título del bloque |\\n| `icon` | nombre Material | Icono personalizado |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n## Combinando estilos\\n\\n```md\\n:::greentext\\n> **%green%alguien%%**: ¿y si anidamos una nota?\\n> **%green%otro%%**: `:::note` funciona dentro\\n:::\\n```\\n\\n:::greentext\\n> **%green%alguien%%**: ¿y si anidamos una nota?\\n> **%green%otro%%**: `:::note` funciona dentro\\n:::\"\n },\n {\n \"id\": \"card\",\n \"category\": \"Componentes\",\n \"title\": \"Card\",\n \"icon\": \"dashboard\",\n \"order\": 1,\n \"md\": \"# Card\\n\\nLa directiva `:::card` crea una tarjeta con icono, título y contenido markdown.\\n\\n## Sintaxis\\n\\n```md\\n:::card {title=\\\"Tarjeta simple\\\" icon=\\\"star\\\"}\\nContenido de la tarjeta en **markdown**.\\n:::\\n```\\n\\n:::card {title=\\\"Tarjeta simple\\\" icon=\\\"star\\\"}\\nContenido de la tarjeta en **markdown**.\\n:::\\n\\n## Con título largo y contenido enriquecido\\n\\n```md\\n:::card {title=\\\"Documentación técnica\\\" icon=\\\"code\\\"}\\n- Renderizado por el mismo motor\\n- Soporta `inline`, tablas y directivas\\n- Sin título: usa `:::card` a secas\\n:::\\n```\\n\\n:::card {title=\\\"Documentación técnica\\\" icon=\\\"code\\\"}\\n- Renderizado por el mismo motor\\n- Soporta `inline`, tablas y directivas\\n- Sin título: usa `:::card` a secas\\n:::\\n\\n## Grid automático\\n\\nLas tarjetas **consecutivas** se agrupan en una cuadrícula responsive. Añade `batch=\\\"off\\\"` para evitarlo:\\n\\n```md\\n:::card {title=\\\"HTML\\\" icon=\\\"html\\\"}\\nEstructura del documento.\\n:::\\n:::card {title=\\\"CSS\\\" icon=\\\"palette\\\"}\\nEstilos y variables.\\n:::\\n:::card {title=\\\"JS\\\" icon=\\\"javascript\\\"}\\nInteracción y eventos.\\n:::\\n```\\n\\n:::card {title=\\\"HTML\\\" icon=\\\"html\\\"}\\nEstructura del documento.\\n:::\\n:::card {title=\\\"CSS\\\" icon=\\\"palette\\\"}\\nEstilos y variables.\\n:::\\n:::card {title=\\\"JS\\\" icon=\\\"javascript\\\"}\\nInteracción y eventos.\\n:::\\n\\n## Props\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `title` | texto | Título de la tarjeta |\\n| `icon` | nombre Material | Icono del título |\\n| `batch` | `off` | Desactiva el agrupado en grid con las tarjetas vecinas |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n## Anidando directivas\\n\\n```md\\n:::card {title=\\\"Ejemplo anidado\\\" icon=\\\"layers\\\"}\\nUna admonición dentro de la tarjeta:\\n\\n:::note\\nLas tarjetas aceptan cualquier directiva dentro.\\n:::\\n:::\\n```\\n\\n:::card {title=\\\"Ejemplo anidado\\\" icon=\\\"layers\\\"}\\nUna admonición dentro de la tarjeta:\\n\\n:::note\\nLas tarjetas aceptan cualquier directiva dentro.\\n:::\\n:::\"\n },\n {\n \"id\": \"keys\",\n \"category\": \"Componentes\",\n \"title\": \"Keys (teclas)\",\n \"icon\": \"keyboard\",\n \"order\": 2,\n \"md\": \"# Keys (teclas)\\n\\nLa directiva `:::keys` muestra combinaciones de teclado con apariencia de teclas físicas.\\n\\n## Sintaxis\\n\\n```md\\n:::keys\\nCTRL + C\\n:::\\n```\\n\\n:::keys\\nCTRL + C\\n:::\\n\\n## Varias combinaciones\\n\\n```md\\n:::keys\\nCTRL + SHIFT + P\\n:::\\n```\\n\\n:::keys\\nCTRL + SHIFT + P\\n:::\\n\\n:::keys\\nALT + F4\\n:::\\n\\n:::keys\\nESC\\n:::\\n\\n## Tamaños\\n\\n| Tamaño | Sintaxis |\\n| --- | --- |\\n| `xs` | `:::keys {size=\\\"xs\\\"}` |\\n| `sm` | `:::keys {size=\\\"sm\\\"}` |\\n| `md` | sin prop (default) |\\n| `lg` | `:::keys {size=\\\"lg\\\"}` |\\n| `xl` | `:::keys {size=\\\"xl\\\"}` |\\n\\n:::keys {size=\\\"xs\\\"}\\nCTRL + A\\n:::\\n\\n:::keys {size=\\\"sm\\\"}\\nCTRL + A\\n:::\\n\\n:::keys {size=\\\"md\\\"}\\nCTRL + A\\n:::\\n\\n:::keys {size=\\\"lg\\\"}\\nCTRL + A\\n:::\\n\\n:::keys {size=\\\"xl\\\"}\\nCTRL + A\\n:::\\n\\n## Props\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `size` | `xs` \\\\| `sm` \\\\| `md` \\\\| `lg` \\\\| `xl` | Tamaño de las teclas (default `md`) |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n## Ejemplo combinado\\n\\n```md\\n:::keys {size=\\\"lg\\\"}\\nSHIFT + CTRL + G\\n:::\\n```\\n\\n:::keys {size=\\\"lg\\\"}\\nSHIFT + CTRL + G\\n:::\\n\\n> Las teclas se separan automáticamente por el signo `+`.\"\n },\n {\n \"id\": \"accordion\",\n \"category\": \"Componentes\",\n \"title\": \"Accordion\",\n \"icon\": \"unfold_more\",\n \"order\": 3,\n \"md\": \"# Accordion\\n\\nLa directiva `:::accordion` agrupa items desplegables (`:::accordion-item`). Por defecto solo un item puede estar abierto (modo `radio`).\\n\\n## Sintaxis\\n\\n```md\\n:::accordion\\n:::accordion-item {title=\\\"Primera sección\\\"}\\nContenido de la primera sección.\\n:::\\n:::accordion-item {title=\\\"Segunda sección\\\"}\\nContenido de la segunda sección.\\n:::\\n:::\\n```\\n\\n:::accordion\\n:::accordion-item {title=\\\"Primera sección\\\"}\\nContenido de la primera sección.\\n:::\\n:::accordion-item {title=\\\"Segunda sección\\\"}\\nContenido de la segunda sección.\\n:::\\n:::\\n\\n## Abierto por defecto\\n\\nCon `checked` el item nace abierto:\\n\\n```md\\n:::accordion\\n:::accordion-item {title=\\\"FAQ: ¿Qué es NoirMD?\\\" checked}\\nUn editor markdown con directivas propias.\\n:::\\n:::accordion-item {title=\\\"FAQ: ¿Cómo anido directivas?\\\"}\\nDentro del contenido de cualquier item puedes usar `:::`.\\n:::\\n:::\\n```\\n\\n:::accordion\\n:::accordion-item {title=\\\"FAQ: ¿Qué es NoirMD?\\\" checked}\\nUn editor markdown con directivas propias.\\n:::\\n:::accordion-item {title=\\\"FAQ: ¿Cómo anido directivas?\\\"}\\nDentro del contenido de cualquier item puedes usar `:::`.\\n:::\\n:::\\n\\n## Modo checkbox (multiples abiertos)\\n\\n```md\\n:::accordion {mode=\\\"checkbox\\\"}\\n:::accordion-item {title=\\\"Paso 1\\\" checked}\\nPreparar los ingredientes.\\n:::\\n:::accordion-item {title=\\\"Paso 2\\\"}\\nMezclar y hornear.\\n:::\\n:::\\n```\\n\\n:::accordion {mode=\\\"checkbox\\\"}\\n:::accordion-item {title=\\\"Paso 1\\\" checked}\\nPreparar los ingredientes.\\n:::\\n:::accordion-item {title=\\\"Paso 2\\\"}\\nMezclar y hornear.\\n:::\\n:::\\n\\n## Props\\n\\n### `:::accordion`\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `mode` | `radio` \\\\| `checkbox` | `radio` (default): solo uno abierto; `checkbox`: varios |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n### `:::accordion-item`\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `title` | texto | Título del item (requerido) |\\n| `checked` | flag | Item abierto por defecto |\\n| `value` | texto | Valor asociado al input |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\"\n },\n {\n \"id\": \"carousel\",\n \"category\": \"Componentes\",\n \"title\": \"Carousel\",\n \"icon\": \"view_carousel\",\n \"order\": 4,\n \"md\": \"# Carousel\\n\\nLa directiva `:::carousel` muestra un carrusel de imágenes con flechas, puntos de navegación y **loop infinito**.\\n\\n## Sintaxis\\n\\nLas imágenes se ponen como markdown dentro del bloque:\\n\\n```md\\n:::carousel {height=\\\"320px\\\"}\\n\\n\\n\\n\\n:::\\n```\\n\\n:::carousel {height=\\\"320px\\\"}\\n\\n\\n\\n\\n:::\\n\\n## Tamaño y proporción\\n\\n- Sin props, el viewport usa `16/9` de aspecto.\\n- `height` fija la altura del viewport (las imágenes lo rellenan).\\n- `aspect` fija la proporción (`4/3`, `1/1`, `21/9`...).\\n\\n```md\\n:::carousel {aspect=\\\"4/3\\\" width=\\\"420px\\\" float=\\\"right\\\"}\\n\\n\\n:::\\n```\\n\\n:::carousel {aspect=\\\"4/3\\\" width=\\\"420px\\\" float=\\\"right\\\"}\\n\\n\\n:::\\n\\n## Props\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `height` | CSS (px) | Altura fija del viewport |\\n| `aspect` | ratio | Proporción del viewport (default `16/9`) |\\n| `width` | CSS (px, %) | Ancho del carrusel |\\n| `float` | `left` \\\\| `right` \\\\| `center` | Flotación (sin `width`, el flotante usa `max-width: 50%`) |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n## Interacción\\n\\n- **Flechas** (izquierda/derecha): navegar.\\n- **Puntos** inferiores: ir a una imagen.\\n- **Teclado**: `←` y `→` cuando el carrusel está enfocado.\\n- El carrusel **da la vuelta** al llegar al final (loop infinito).\\n\\n> Las imágenes se recortan (`object-fit: cover`) para rellenar el viewport sin deformarse.\"\n },\n {\n \"id\": \"countdown\",\n \"category\": \"Componentes\",\n \"title\": \"Countdown\",\n \"icon\": \"timer\",\n \"order\": 5,\n \"md\": \"# Countdown\\n\\nLa directiva `:::countdown` muestra una cuenta atrás en tiempo real.\\n\\n## Cuenta atrás fija\\n\\nCon `days`, `hours`, `min` y `sec` se define una duración que se va agotando:\\n\\n```md\\n:::countdown {days=\\\"0\\\" hours=\\\"0\\\" min=\\\"2\\\" sec=\\\"30\\\"}\\n:::\\n```\\n\\n:::countdown {days=\\\"0\\\" hours=\\\"0\\\" min=\\\"2\\\" sec=\\\"30\\\"}\\n:::\\n\\n## Cuenta atrás a una fecha (live)\\n\\nCon `target` el contador cuenta hasta una fecha concreta (`YYYY-MM-DDTHH:mm:ss`):\\n\\n```md\\n:::countdown {target=\\\"2027-01-01T00:00:00\\\"}\\n:::\\n```\\n\\n:::countdown {target=\\\"2027-01-01T00:00:00\\\"}\\n:::\\n\\n## Con etiquetas personalizadas\\n\\n```md\\n:::countdown {days=\\\"1\\\" hours=\\\"4\\\" min=\\\"12\\\" sec=\\\"45\\\" labels=\\\"Días|Horas|Min|Seg\\\"}\\n:::\\n```\\n\\n:::countdown {days=\\\"1\\\" hours=\\\"4\\\" min=\\\"12\\\" sec=\\\"45\\\" labels=\\\"Días|Horas|Min|Seg\\\"}\\n:::\\n\\n## Props\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `days` | número | Días de duración |\\n| `hours` | número | Horas de duración |\\n| `min` | número | Minutos de duración |\\n| `sec` | número | Segundos de duración |\\n| `target` | fecha ISO | Fecha objetivo (cuenta hacia ella) |\\n| `labels` | texto `\\\\|` | Etiquetas bajo los dígitos, separadas por `\\\\|` |\\n| `digits` | número | Dígitos por bloque (default `2`) |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n> Puedes combinar `target` con `labels` para una cuenta atrás de evento completa. Al llegar a cero se muestra `00:00:00:00`.\"\n },\n {\n \"id\": \"diff\",\n \"category\": \"Componentes\",\n \"title\": \"Diff (comparar imágenes)\",\n \"icon\": \"compare\",\n \"order\": 6,\n \"md\": \"# Diff (comparar imágenes)\\n\\nLa directiva `:::diff` muestra **antes y después** con un slider arrastrable.\\n\\n## Sintaxis\\n\\nSe indican las dos imágenes con las props `before` y `after`:\\n\\n```md\\n:::diff {before=\\\"https://img.daisyui.com/images/stock/photo-1565098772267-60af42b81ef2.webp\\\" after=\\\"https://img.daisyui.com/images/stock/photo-1572635196237-14b3f281503f.webp\\\"}\\n:::\\n```\\n\\n:::diff {before=\\\"https://img.daisyui.com/images/stock/photo-1565098772267-60af42b81ef2.webp\\\" after=\\\"https://img.daisyui.com/images/stock/photo-1572635196237-14b3f281503f.webp\\\"}\\n:::\\n\\n## Con dos imágenes markdown\\n\\nAlternativa: dos imágenes en el cuerpo del bloque (la primera es el «antes»):\\n\\n```md\\n:::diff {height=\\\"320px\\\"}\\n\\n\\n:::\\n```\\n\\n:::diff {height=\\\"320px\\\"}\\n\\n\\n:::\\n\\n## Tamaño y flotación\\n\\n```md\\n:::diff {width=\\\"440px\\\" aspect=\\\"4/3\\\" float=\\\"left\\\" before=\\\"https://img.daisyui.com/images/stock/photo-1565098772267-60af42b81ef2.webp\\\" after=\\\"https://img.daisyui.com/images/stock/photo-1572635196237-14b3f281503f.webp\\\"}\\n:::\\n```\\n\\n:::diff {width=\\\"440px\\\" aspect=\\\"4/3\\\" float=\\\"left\\\" before=\\\"https://img.daisyui.com/images/stock/photo-1565098772267-60af42b81ef2.webp\\\" after=\\\"https://img.daisyui.com/images/stock/photo-1572635196237-14b3f281503f.webp\\\"}\\n:::\\n\\nTexto que fluye junto al diff flotante: la comparación queda integrada en el párrafo como una imagen flotante más.\\n\\n## Props\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `before` | URL | Imagen «antes» (descartada si hay dos imágenes markdown) |\\n| `after` | URL | Imagen «después» |\\n| `height` | CSS (px) | Altura del comparador (default `16/9` de aspecto) |\\n| `aspect` | ratio | Proporción (`4/3`, `1/1`, ...) |\\n| `width` | CSS (px, %) | Ancho del comparador |\\n| `float` | `left` \\\\| `right` \\\\| `center` | Flotación (sin `width`, `max-width: 50%`) |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n## Interacción\\n\\n- **Arrastra** el mango vertical para mover la línea de corte.\\n- **Haz clic** en cualquier punto para saltar el slider allí.\\n- **Teclado**: `←` y `→` ajustan ±5% (enfoca el comparador con Tab).\"\n },\n {\n \"id\": \"hover-3d\",\n \"category\": \"Componentes\",\n \"title\": \"Hover 3D\",\n \"icon\": \"view_in_ar\",\n \"order\": 7,\n \"md\": \"# Hover 3D\\n\\nLa directiva `:::hover-3d` convierte su contenido en una tarjeta con **efecto 3D** que sigue al ratón.\\n\\n## Sintaxis\\n\\n```md\\n:::hover-3d\\n{400:260}\\n:::\\n```\\n\\n:::hover-3d\\n{400:260}\\n:::\\n\\n## Con texto\\n\\n```md\\n:::hover-3d\\n## El efecto es automático\\nMueve el ratón sobre la tarjeta: el contenido rota en 3D siguiendo el cursor.\\n:::\\n```\\n\\n:::hover-3d\\n## El efecto es automático\\nMueve el ratón sobre la tarjeta: el contenido rota en 3D siguiendo el cursor.\\n:::\\n\\n## Props\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n## Notas\\n\\n- El contenedor genera 8 reflejos de luz (luces de borde) que reaccionan al movimiento.\\n- Cuanto más cerca del borde está el cursor, más rota la tarjeta.\\n- En pantallas táctiles el efecto se desactiva (no hay hover).\\n- Se recomienda un solo hijo (imagen o bloque de texto) para el mejor resultado.\"\n },\n {\n \"id\": \"hover-gallery\",\n \"category\": \"Componentes\",\n \"title\": \"Hover Gallery\",\n \"icon\": \"photo_library\",\n \"order\": 8,\n \"md\": \"# Hover Gallery\\n\\nLa directiva `:::hover-gallery` muestra una galería donde las imágenes se **expanden al pasar el ratón**, estilo dock.\\n\\n## Sintaxis\\n\\nLas imágenes se ponen como markdown dentro del bloque:\\n\\n```md\\n:::hover-gallery {aspect=\\\"16/9\\\"}\\n\\n\\n\\n\\n\\n\\n:::\\n```\\n\\n:::hover-gallery {aspect=\\\"16/9\\\"}\\n\\n\\n\\n\\n\\n\\n:::\\n\\n## Props\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `aspect` | ratio | Proporción de la galería (default `16/9`) |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n## Notas\\n\\n- La imagen activa (hover) crece y las vecinas se apartan para darle espacio.\\n- Las imágenes se recortan (`object-fit: cover`) para mantener la altura uniforme.\\n- Funciona con 3 o más imágenes; con menos, se reparten el ancho.\"\n },\n {\n \"id\": \"chat\",\n \"category\": \"Componentes\",\n \"title\": \"Chat\",\n \"icon\": \"chat_bubble\",\n \"order\": 9,\n \"md\": \"# Chat\\n\\nLa directiva `:::chat` muestra **burbujas de conversación** (`:::chat-item`) estilo app de mensajería.\\n\\n## Sintaxis\\n\\n```md\\n:::chat\\n:::chat-item {side=\\\"start\\\" name=\\\"Ana\\\" time=\\\"10:04\\\"}\\nHola, ¿terminaste la documentación?\\n:::\\n:::chat-item {side=\\\"end\\\" name=\\\"Tú\\\" time=\\\"10:05\\\"}\\n¡Sí! La guía renderiza hasta directivas dentro del chat.\\n:::\\n:::chat-item {side=\\\"start\\\" name=\\\"Ana\\\" time=\\\"10:06\\\"}\\nIncreíble. El motor escribe solo.\\n:::\\n:::\\n```\\n\\n:::chat\\n:::chat-item {side=\\\"start\\\" name=\\\"Ana\\\" time=\\\"10:04\\\"}\\nHola, ¿terminaste la documentación?\\n:::\\n:::chat-item {side=\\\"end\\\" name=\\\"Tú\\\" time=\\\"10:05\\\"}\\n¡Sí! La guía renderiza hasta directivas dentro del chat.\\n:::\\n:::chat-item {side=\\\"start\\\" name=\\\"Ana\\\" time=\\\"10:06\\\"}\\nIncreíble. El motor escribe solo.\\n:::\\n:::\\n\\n## Con avatar y color\\n\\n```md\\n:::chat\\n:::chat-item {side=\\\"start\\\" name=\\\"Soporte\\\" time=\\\"11:00\\\" avatar=\\\"https://img.daisyui.com/images/stock/photo-1534528741775-53994a69daeb.webp\\\" color=\\\"info\\\" footer=\\\"Atendido\\\"}\\n¿En qué podemos ayudarte?\\n:::\\n:::chat-item {side=\\\"end\\\" name=\\\"Tú\\\" time=\\\"11:02\\\" color=\\\"secondary\\\" footer=\\\"Enviado\\\"}\\n¿Cómo añado un avatar personalizado?\\n:::\\n:::\\n```\\n\\n:::chat\\n:::chat-item {side=\\\"start\\\" name=\\\"Soporte\\\" time=\\\"11:00\\\" avatar=\\\"https://img.daisyui.com/images/stock/photo-1534528741775-53994a69daeb.webp\\\" color=\\\"info\\\" footer=\\\"Atendido\\\"}\\n¿En qué podemos ayudarte?\\n:::\\n:::chat-item {side=\\\"end\\\" name=\\\"Tú\\\" time=\\\"11:02\\\" color=\\\"secondary\\\" footer=\\\"Enviado\\\"}\\n¿Cómo añado un avatar personalizado?\\n:::\\n:::\\n\\n## Props\\n\\n### `:::chat-item`\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `side` | `start` \\\\| `end` | Burbuja a la izquierda o derecha (default `start`) |\\n| `name` | texto | Nombre del autor |\\n| `time` | texto | Hora mostrada bajo el nombre |\\n| `avatar` | URL | Imagen del avatar |\\n| `color` | `neutral` \\\\| `primary` \\\\| `secondary` \\\\| `accent` \\\\| `info` \\\\| `success` \\\\| `warning` \\\\| `error` | Color de la burbuja |\\n| `footer` | texto | Pie del mensaje |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n## Notas\\n\\n- El contenido de cada `chat-item` admite **markdown completo** (código, tablas, enlaces...).\\n- Puedes poner varios `:::chat` en el documento; cada uno es un grupo independiente.\"\n },\n {\n \"id\": \"richlist\",\n \"category\": \"Componentes\",\n \"title\": \"Richlist\",\n \"icon\": \"playlist_play\",\n \"order\": 10,\n \"md\": \"# Richlist\\n\\nLa directiva `:::richlist` muestra una **lista enriquecida** (`:::richlist-item`) con imagen, títulos, subtítulo e iconos.\\n\\n## Sintaxis\\n\\n```md\\n:::richlist\\n:::richlist-item {title=\\\"Vim\\\" subtitle=\\\"Editor de texto\\\" image=\\\"https://img.daisyui.com/images/stock/photo-1493863641943-9b68992a8d07.webp\\\"}\\n:::richlist-item {title=\\\"Git\\\" subtitle=\\\"Control de versiones\\\" icon=\\\"code\\\" icon2=\\\"terminal\\\"}\\n:::richlist-item {title=\\\"Docker\\\" subtitle=\\\"Contenedores\\\" icon=\\\"deployed_code\\\"}\\n:::\\n```\\n\\n:::richlist\\n:::richlist-item {title=\\\"Vim\\\" subtitle=\\\"Editor de texto\\\" image=\\\"https://img.daisyui.com/images/stock/photo-1493863641943-9b68992a8d07.webp\\\"}\\n:::richlist-item {title=\\\"Git\\\" subtitle=\\\"Control de versiones\\\" icon=\\\"code\\\" icon2=\\\"terminal\\\"}\\n:::richlist-item {title=\\\"Docker\\\" subtitle=\\\"Contenedores\\\" icon=\\\"deployed_code\\\"}\\n:::\\n\\n## Con iconos en ambos lados\\n\\n```md\\n:::richlist\\n:::richlist-item {title=\\\"Modo oscuro\\\" subtitle=\\\"Menos fatiga visual\\\" icon=\\\"dark_mode\\\" icon2=\\\"chevron_right\\\"}\\n:::richlist-item {title=\\\"Atajos\\\" subtitle=\\\"Más velocidad\\\" icon=\\\"keyboard\\\" icon2=\\\"chevron_right\\\"}\\n:::richlist-item {title=\\\"Tema\\\" subtitle=\\\"Personaliza colores\\\" icon=\\\"palette\\\" icon2=\\\"chevron_right\\\"}\\n:::\\n```\\n\\n:::richlist\\n:::richlist-item {title=\\\"Modo oscuro\\\" subtitle=\\\"Menos fatiga visual\\\" icon=\\\"dark_mode\\\" icon2=\\\"chevron_right\\\"}\\n:::richlist-item {title=\\\"Atajos\\\" subtitle=\\\"Más velocidad\\\" icon=\\\"keyboard\\\" icon2=\\\"chevron_right\\\"}\\n:::richlist-item {title=\\\"Tema\\\" subtitle=\\\"Personaliza colores\\\" icon=\\\"palette\\\" icon2=\\\"chevron_right\\\"}\\n:::\\n\\n## Props\\n\\n### `:::richlist-item`\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `title` | texto | Título del elemento |\\n| `subtitle` | texto | Subtítulo (segunda línea) |\\n| `image` | URL | Imagen a la izquierda (sustituye a `icon`) |\\n| `icon` | nombre Material | Icono a la izquierda |\\n| `icon2` | nombre Material | Icono a la derecha |\\n| `url` | URL | El botón del `icon` abre el enlace en una pestaña nueva |\\n| `url2` | URL | El botón del `icon2` abre el enlace en una pestaña nueva |\\n| `event` | `evento: fn` | Handler del botón `icon` (función global, ver abajo) |\\n| `event2` | `evento: fn` | Handler del botón `icon2` (función global, ver abajo) |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n### `:::richlist`\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n## Botones con acción\\n\\nCada botón de icono puede navegar (`url`/`url2`) o llamar a una función global (`event`/`event2`). `event` tiene prioridad sobre `url` en el mismo botón:\\n\\n```md\\n:::richlist\\n:::richlist-item {title=\\\"Reproductor\\\" subtitle=\\\"Demo de botones\\\" icon=\\\"open_in_new\\\" url=\\\"https://example.com\\\" icon2=\\\"volume_up\\\" event=\\\"click: reproducirSonido\\\"}\\nEl primer botón abre una pestaña nueva; el segundo ejecuta una función global al hacer clic.\\n:::\\n:::\\n```\\n\\n:::richlist\\n:::richlist-item {title=\\\"Reproductor\\\" subtitle=\\\"Demo de botones\\\" icon=\\\"open_in_new\\\" url=\\\"https://example.com\\\" icon2=\\\"volume_up\\\" event=\\\"click: reproducirSonido\\\"}\\nEl primer botón abre una pestaña nueva; el segundo ejecuta una función global al hacer clic.\\n:::\\n:::\\n\\n### Sintaxis de `event`\\n\\n```md\\nevent=\\\"click: miFuncion\\\" <!-- un solo evento -->\\nevent=\\\"click: fn1; mouseover: fn2\\\" <!-- varios, separados por ; -->\\nevent=\\\"onclick: miFuncion\\\" <!-- el prefijo \\\"on\\\" es opcional -->\\n```\\n\\nLa función se resuelve desde el **scope global** en el momento del evento y se invoca con el elemento como `this` y el evento como argumento:\\n\\n```js\\nwindow.reproducirSonido = function (event) {\\n console.log('Click en:', this);\\n};\\n```\\n\\n:::note\\nSi la función no existe, el botón simplemente no hace nada (sin errores). El `event` es contenido propio del autor, con el mismo modelo de confianza que `:::raw` o `:::style`.\\n:::\"\n },\n {\n \"id\": \"stat\",\n \"category\": \"Componentes\",\n \"title\": \"Stat\",\n \"icon\": \"insights\",\n \"order\": 11,\n \"md\": \"# Stat\\n\\nLa directiva `:::stat` muestra una **estadística** con icono, valor y descripción. Las estadísticas **consecutivas** se agrupan en una fila.\\n\\n## Sintaxis\\n\\n```md\\n:::stat {title=\\\"Descargas\\\" value=\\\"31K\\\" icon=\\\"download\\\" color=\\\"success\\\"}\\n:::stat {title=\\\"Nuevos usuarios\\\" value=\\\"4,200\\\" icon=\\\"group_add\\\" color=\\\"primary\\\"}\\n:::stat {title=\\\"Retención\\\" value=\\\"82%\\\" icon=\\\"trending_up\\\" color=\\\"info\\\"}\\n:::\\n```\\n\\n:::stat {title=\\\"Descargas\\\" value=\\\"31K\\\" icon=\\\"download\\\" color=\\\"success\\\"}\\n:::stat {title=\\\"Nuevos usuarios\\\" value=\\\"4,200\\\" icon=\\\"group_add\\\" color=\\\"primary\\\"}\\n:::stat {title=\\\"Retención\\\" value=\\\"82%\\\" icon=\\\"trending_up\\\" color=\\\"info\\\"}\\n:::\\n\\n## Con descripción\\n\\n```md\\n:::stat {title=\\\"Ingresos\\\" value=\\\"$14,320\\\" desc=\\\"+12% este mes\\\" icon=\\\"payments\\\" color=\\\"secondary\\\"}\\n:::stat {title=\\\"Errores\\\" value=\\\"3\\\" desc=\\\"resueltos hoy\\\" icon=\\\"bug_report\\\" color=\\\"warning\\\"}\\n:::\\n```\\n\\n:::stat {title=\\\"Ingresos\\\" value=\\\"$14,320\\\" desc=\\\"+12% este mes\\\" icon=\\\"payments\\\" color=\\\"secondary\\\"}\\n:::stat {title=\\\"Errores\\\" value=\\\"3\\\" desc=\\\"resueltos hoy\\\" icon=\\\"bug_report\\\" color=\\\"warning\\\"}\\n:::\\n\\n## Prop individual (sin agrupar)\\n\\n```md\\n:::stat {title=\\\"Tiempo de actividad\\\" value=\\\"99.9%\\\" icon=\\\"monitor_heart\\\" color=\\\"success\\\"}\\n```\\n\\n:::stat {title=\\\"Tiempo de actividad\\\" value=\\\"99.9%\\\" icon=\\\"monitor_heart\\\" color=\\\"success\\\"}\\n:::\\n\\n## Props\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `title` | texto | Etiqueta superior |\\n| `value` | texto | Valor principal (grande) |\\n| `desc` | texto | Descripción bajo el valor |\\n| `icon` | nombre Material | Icono lateral |\\n| `color` | `primary` \\\\| `secondary` \\\\| `info` \\\\| `success` \\\\| `warning` \\\\| `error` | Color del icono y valor (default `primary`) |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n> Cada `:::stat` debe cerrarse con su `:::`. Las stats contiguas se agrupan en fila automáticamente; para separarlas deja texto entre medias.\"\n },\n {\n \"id\": \"details\",\n \"category\": \"Interactivos\",\n \"title\": \"Details\",\n \"icon\": \"expand_more\",\n \"order\": 1,\n \"md\": \"# Details\\n\\nLa directiva `:::details` crea un bloque **plegable** nativo (`<details>`), útil para respuestas largas o contenido oculto.\\n\\n## Sintaxis\\n\\n```md\\n:::details {title=\\\"¿Qué es NoirMD?\\\"}\\nEditor y motor de markdown con directivas propias.\\n:::\\n```\\n\\n:::details {title=\\\"¿Qué es NoirMD?\\\"}\\nEditor y motor de markdown con directivas propias.\\n:::\\n\\n## Abierto por defecto\\n\\n```md\\n:::details {title=\\\"Atajos del editor\\\" defaultOpen=\\\"true\\\"}\\n| Atajo | Acción |\\n| --- | --- |\\n| `Ctrl+S` | Guardar |\\n| `Ctrl+K` | Alternar preview |\\n| `Ctrl+F` | Buscar |\\n:::\\n```\\n\\n:::details {title=\\\"Atajos del editor\\\" defaultOpen=\\\"true\\\"}\\n| Atajo | Acción |\\n| --- | --- |\\n| `Ctrl+S` | Guardar |\\n| `Ctrl+K` | Alternar preview |\\n| `Ctrl+F` | Buscar |\\n:::\\n\\n## Con icono\\n\\n```md\\n:::details {title=\\\"Solución del ejercicio\\\" icon=\\\"lightbulb\\\"}\\nEl código resultante:\\n\\n```js\\nconsole.log('¡Resuelto!');\\n```\\n:::\\n```\\n\\n:::details {title=\\\"Solución del ejercicio\\\" icon=\\\"lightbulb\\\"}\\nEl código resultante:\\n\\n```js\\nconsole.log('¡Resuelto!');\\n```\\n:::\\n\\n## Props\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `title` | texto | Título del desplegable |\\n| `icon` | nombre Material | Icono junto al título |\\n| `defaultOpen` | `true` | Abierto al cargar |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n> El contenido admite markdown completo y directivas anidadas.\"\n },\n {\n \"id\": \"modal\",\n \"category\": \"Interactivos\",\n \"title\": \"Modal\",\n \"icon\": \"open_in_full\",\n \"order\": 2,\n \"md\": \"# Modal\\n\\nLa directiva `:::modal` crea un **diálogo modal** con su botón de apertura.\\n\\n## Sintaxis\\n\\n```md\\n:::modal {title=\\\"Confirmar borrado\\\" label=\\\"Abrir modal\\\" icon=\\\"delete\\\"}\\n¿Seguro que quieres borrar este documento? Esta acción no se puede deshacer.\\n\\n| Acción | Efecto |\\n| --- | --- |\\n| Aceptar | Borra el documento |\\n| Cancelar | No hace nada |\\n:::\\n```\\n\\n:::modal {title=\\\"Confirmar borrado\\\" label=\\\"Abrir modal\\\" icon=\\\"delete\\\"}\\n¿Seguro que quieres borrar este documento? Esta acción no se puede deshacer.\\n\\n| Acción | Efecto |\\n| --- | --- |\\n| Aceptar | Borra el documento |\\n| Cancelar | No hace nada |\\n:::\\n\\n## Contenido enriquecido\\n\\n```md\\n:::modal {title=\\\"Notas de la versión\\\" label=\\\"Ver novedades\\\" icon=\\\"new_releases\\\"}\\n**v2.0** — cambios principales:\\n\\n- Nuevo componente `:::diff`\\n- Guía integrada en el editor\\n- Especificidad CSS corregida en imágenes\\n:::\\n```\\n\\n:::modal {title=\\\"Notas de la versión\\\" label=\\\"Ver novedades\\\" icon=\\\"new_releases\\\"}\\n**v2.0** — cambios principales:\\n\\n- Nuevo componente `:::diff`\\n- Guía integrada en el editor\\n- Especificidad CSS corregida en imágenes\\n:::\\n\\n## Props\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `title` | texto | Título del modal |\\n| `label` | texto | Texto del botón de apertura (default: `title` o «Open») |\\n| `icon` | nombre Material | Icono del botón (default `open_in_new`) |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n## Interacción\\n\\n- **Botón**: abre el modal (focus se mueve dentro).\\n- **Overlay** o botón **×**: cierra.\\n- **Esc**: cierra (en desktop).\\n- `dialog` nativo → accesible por defecto, focus trapped y `inert` al fondo.\"\n },\n {\n \"id\": \"button\",\n \"category\": \"Interactivos\",\n \"title\": \"Button\",\n \"icon\": \"touch_app\",\n \"order\": 3,\n \"md\": \"# Button\\n\\nLa directiva `:::button` crea un **botón con enlace** (se abre en pestaña nueva por defecto).\\n\\n## Sintaxis\\n\\n```md\\n:::button {label=\\\"Documentación\\\" url=\\\"https://example.com\\\" icon=\\\"menu_book\\\"}\\n:::\\n```\\n\\n:::button {label=\\\"Documentación\\\" url=\\\"https://example.com\\\" icon=\\\"menu_book\\\"}\\n:::\\n\\n## Variante con enlace interno\\n\\n```md\\n:::button {label=\\\"Ir a la página de notas\\\" url=\\\"#admonición-nota\\\" icon=\\\"sticky_note_2\\\" target=\\\"_self\\\"}\\n:::\\n```\\n\\n:::button {label=\\\"Ir a la página de notas\\\" url=\\\"#admonición-nota\\\" icon=\\\"sticky_note_2\\\" target=\\\"_self\\\"}\\n:::\\n\\n## Con contenido markdown\\n\\nSi el bloque contiene texto/enlaces, se renderizan dentro del botón:\\n\\n```md\\n:::button {label=\\\"Descargar\\\" url=\\\"https://example.com/download\\\" icon=\\\"download\\\"}\\nDescarga el **manual** en PDF\\n:::\\n```\\n\\n:::button {label=\\\"Descargar\\\" url=\\\"https://example.com/download\\\" icon=\\\"download\\\"}\\nDescarga el **manual** en PDF\\n:::\\n\\n## Props\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `label` | texto | Texto del botón |\\n| `url` (o `href`) | URL | Destino del enlace (default `#`) |\\n| `icon` | nombre Material | Icono (default `near_me`) |\\n| `target` | `_blank` \\\\| `_self` \\\\| ... | Destino del enlace (default `_blank`) |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\"\n },\n {\n \"id\": \"slide\",\n \"category\": \"Interactivos\",\n \"title\": \"Slide\",\n \"icon\": \"slideshow\",\n \"order\": 4,\n \"md\": \"# Slide\\n\\nLa directiva `:::slide` convierte su contenido en un **slider automático** (diapositivas con fade).\\n\\n## Sintaxis\\n\\nLas secciones se separan con `---`:\\n\\n```md\\n:::slide {interval=\\\"2500\\\"}\\n## Diapositiva 1\\n\\nBienvenido a la **guía interactiva**.\\n\\n---\\n\\n## Diapositiva 2\\n\\nCada `---` separa una diapositiva nueva.\\n\\n---\\n\\n## Diapositiva 3\\n\\nY el motor se encarga del resto.\\n:::\\n```\\n\\n:::slide {interval=\\\"2500\\\"}\\n## Diapositiva 1\\n\\nBienvenido a la **guía interactiva**.\\n\\n---\\n\\n## Diapositiva 2\\n\\nCada `---` separa una diapositiva nueva.\\n\\n---\\n\\n## Diapositiva 3\\n\\nY el motor se encarga del resto.\\n:::\\n\\n## Con contenido variado\\n\\n```md\\n:::slide {interval=\\\"3500\\\" speed=\\\"800\\\"}\\n:::card {title=\\\"Card\\\" icon=\\\"dashboard\\\"}\\nLas directivas se anidan dentro.\\n:::\\n---\\n> **Admonición** como diapositiva\\n---\\n| Página | Tema |\\n| --- | --- |\\n| 1 | Slide |\\n| 2 | Loop |\\n:::\\n```\\n\\n:::slide {interval=\\\"3500\\\" speed=\\\"800\\\"}\\n:::card {title=\\\"Card\\\" icon=\\\"dashboard\\\"}\\nLas directivas se anidan dentro.\\n:::\\n---\\n> **Admonición** como diapositiva\\n---\\n| Página | Tema |\\n| --- | --- |\\n| 1 | Slide |\\n| 2 | Loop |\\n:::\\n\\n## Props\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `interval` | ms | Tiempo por diapositiva (default `3000`) |\\n| `speed` | ms | Duración de la transición (default `500`) |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n## Notas\\n\\n- Los puntos inferiores permiten saltar a una diapositiva.\\n- Al llegar a la última, vuelve a la primera automáticamente (loop).\\n- La barra de progreso superior muestra el avance del ciclo.\"\n },\n {\n \"id\": \"div\",\n \"category\": \"Layout\",\n \"title\": \"Div (contenedor)\",\n \"icon\": \"square_foot\",\n \"order\": 1,\n \"md\": \"# Div (contenedor)\\n\\nLa directiva `:::div` envuelve su contenido en un `<div>` con **clases, id o estilos** propios.\\n\\n## Sintaxis\\n\\n```md\\n:::div {.mi-clase #mi-id}\\nContenido dentro del div.\\n:::\\n```\\n\\n:::div {.mi-clase #mi-id}\\nContenido dentro del div.\\n:::\\n\\n## Aplicando clases\\n\\n```md\\n:::div {.test-container}\\nTarjeta con estilo personalizado.\\n:::\\n```\\n\\n:::div {.test-container}\\nTarjeta con estilo personalizado.\\n:::\\n\\n## Con estilos inline\\n\\n```md\\n:::div {style=\\\"border: 1px dashed var(--color-accent-primary, #0ea5e9); padding: 1rem; border-radius: 10px;\\\"}\\nCaja con borde discontinuo y padding.\\n:::\\n```\\n\\n:::div {style=\\\"border: 1px dashed var(--color-accent-primary, #0ea5e9); padding: 1rem; border-radius: 10px;\\\"}\\nCaja con borde discontinuo y padding.\\n:::\\n\\n## Contenido enriquecido\\n\\n```md\\n:::div {.test-container}\\n## Título dentro del div\\n\\n:::note\\nLas directivas funcionan anidadas dentro del div.\\n:::\\n:::\\n```\\n\\n:::div {.test-container}\\n## Título dentro del div\\n\\n:::note\\nLas directivas funcionan anidadas dentro del div.\\n:::\\n:::\\n\\n## Props\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `.clase` | texto | Clases CSS (prefijo `.`, varias separadas por espacio) |\\n| `#id` | texto | Id del contenedor (prefijo `#`) |\\n| `style` | CSS | Estilos inline |\\n\\n## Usos típicos\\n\\n- Agrupar varios componentes para darles un fondo o borde común.\\n- Contenedor centrado: `:::div {style=\\\"max-width: 600px; margin: 0 auto;\\\"}`.\\n- Combinar con `:::style` para CSS reutilizable por clase.\"\n },\n {\n \"id\": \"style\",\n \"category\": \"Layout\",\n \"title\": \"Style (CSS)\",\n \"icon\": \"palette\",\n \"order\": 2,\n \"md\": \"# Style (CSS)\\n\\nLa directiva `:::style` inyecta **CSS global** al documento renderizado.\\n\\n## Sintaxis\\n\\n```md\\n:::style\\n.mi-clase {\\n background: #f1f5f9;\\n border-radius: 10px;\\n padding: 1rem;\\n}\\n:::\\n```\\n\\n## Ejemplo combinado con div\\n\\n```md\\n:::style\\n.box-demo {\\n display: grid;\\n grid-template-columns: 1fr 1fr;\\n gap: 1rem;\\n padding: 1rem;\\n border-radius: 12px;\\n background: color-mix(in srgb, var(--color-accent-primary, #0ea5e9) 10%, transparent);\\n}\\n.box-demo > div {\\n padding: 1rem;\\n border-radius: 8px;\\n background: var(--color-background-secondary-solid, #1e293b);\\n}\\n:::\\n\\n:::div {.box-demo}\\n**A**\\n\\n---\\n**B**\\n:::\\n```\\n\\n:::style\\n.box-demo {\\n display: grid;\\n grid-template-columns: 1fr 1fr;\\n gap: 1rem;\\n padding: 1rem;\\n border-radius: 12px;\\n background: color-mix(in srgb, var(--color-accent-primary, #0ea5e9) 10%, transparent);\\n}\\n.box-demo > div {\\n padding: 1rem;\\n border-radius: 8px;\\n background: var(--color-background-secondary-solid, #1e293b);\\n}\\n:::\\n\\n:::div {.box-demo}\\n**A**\\n\\n---\\n**B**\\n:::\\n\\n## Props\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n## Notas\\n\\n- El CSS se aplica al **documento renderizado completo**, no solo al bloque.\\n- Define clases una vez al principio y úsalas después con `:::div` o props `class`.\\n- Dispones de las variables de tema del editor: `--color-background-primary`, `--color-text-primary`, `--color-accent-primary`, `--color-border`, etc.\"\n },\n {\n \"id\": \"raw\",\n \"category\": \"Layout\",\n \"title\": \"Raw (HTML)\",\n \"icon\": \"code_off\",\n \"order\": 3,\n \"md\": \"# Raw (HTML)\\n\\nLa directiva `:::raw` (o su alias `:::custom`) inserta **HTML puro** sin procesar en el documento.\\n\\n## Sintaxis\\n\\n```md\\n:::raw\\n<div style=\\\"text-align: center; padding: 1rem; border: 1px solid #334155; border-radius: 10px;\\\">\\n HTML escrito a mano funciona tal cual.\\n</div>\\n:::\\n```\\n\\n:::raw\\n<div style=\\\"text-align: center; padding: 1rem; border: 1px solid #334155; border-radius: 10px;\\\">\\n HTML escrito a mano funciona tal cual.\\n</div>\\n:::\\n\\n## Elementos interactivos\\n\\n```md\\n:::raw\\n<details class=\\\"nr-details\\\">\\n <summary>Detalle nativo con <b>HTML</b></summary>\\n <p>Los atributos, estilos y eventos se conservan intactos.</p>\\n</details>\\n:::\\n```\\n\\n:::raw\\n<details class=\\\"nr-details\\\">\\n <summary>Detalle nativo con <b>HTML</b></summary>\\n <p>Los atributos, estilos y eventos se conservan intactos.</p>\\n</details>\\n:::\\n\\n## Props\\n\\n| Prop | Tipo | Descripción |\\n| --- | --- | --- |\\n| `class` | texto | Clases CSS adicionales |\\n| `style` | CSS | Estilos inline |\\n\\n## Cuándo usar `raw`\\n\\n- Insertar embeds (`iframe`, `video`, widgets).\\n- Marcar up estructuras que el markdown no cubre.\\n- Prototipar HTML antes de convertirlo a directiva.\\n\\n> ⚠️ Al ser HTML sin filtrar, úsalo solo con contenido de confianza.\"\n }\n];\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,gBAAmD;AACnD,8BAAiD;AACjD,kBAAoF;;;ACFpF,sBAA+B;AAC/B,uBAA0B;AAqBnB,IAAM,uBAAuB,+BAAe,OAAgB;AAAA,EACjE,YAAY,OAAO;AAAA,IACjB,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,YAAY,CAAC;AAAA,IACb,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,cAAc;AAAA,EAChB;AAAA,EAEA,MAAM,QAAQ,OAAO;AAEnB,QAAI,OAAO,IAAI,GAAG;AAChB,YAAM,oBAAoB;AAC1B,YAAM,aAAa;AACnB,YAAM,YAAY;AAGlB,UAAI,MAAM,eAAe,OAAO,MAAM,SAAS,GAAG;AAChD,cAAM,cAAc;AACpB,eAAO;AAAA,MACT;AAAA,IAGF;AAGA,QAAI,MAAM,aAAa;AACrB,aAAO,SAAS;AAGhB,UAAI,OAAO,MAAM,MAAM,GAAG;AACxB,cAAM,cAAc;AACpB,cAAM,cAAc;AACpB,cAAM,mBAAmB;AACzB,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,MAAM,IAAI,GAAG;AACtB,cAAM,cAAc;AAEpB,YAAI,CAAC,MAAM,qBAAqB,MAAM,gBAAgB,YAAY,MAAM,gBAAgB,UAAU;AAChG,gBAAM,eAAe,MAAM;AAAA,QAC7B;AACA,cAAM,cAAc;AACpB,cAAM,mBAAmB;AACzB,eAAO;AAAA,MACT;AAGA,UAAI,OAAO,MAAM,qBAAqB,EAAG,QAAO;AAEhD,UAAI,OAAO,MAAM,IAAI,EAAG,QAAO;AAE/B,UAAI,OAAO,MAAM,UAAU,EAAG,QAAO;AACrC,UAAI,OAAO,MAAM,UAAU,EAAG,QAAO;AAErC,UAAI,OAAO,MAAM,UAAU,EAAG,QAAO;AACrC,UAAI,OAAO,MAAM,UAAU,EAAG,QAAO;AAErC,UAAI,OAAO,MAAM,UAAU,EAAG,QAAO;AAErC,UAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,aAAO,KAAK;AACZ,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,iBAAiB,QAAQ;AAEjC,UAAI,OAAO,MAAM,uBAAuB,GAAG;AACzC,cAAM,WAAW,OAAO,QAAQ,EAAE,QAAQ,QAAQ,EAAE,EAAE,YAAY;AAClE,cAAM,eAAe;AACrB,cAAM,cAAc;AACpB,cAAM,cAAc;AACpB,cAAM,mBAAmB;AACzB,eAAO;AAAA,MACT;AAEA,UAAI,MAAM,iBAAiB,UAAU;AAGnC,YAAI,OAAO,MAAM,OAAO,GAAG;AAAE,iBAAO,UAAU;AAAG,iBAAO;AAAA,QAAW;AAEnE,YAAI,OAAO,MAAM,OAAO,GAAG;AACzB,iBAAO,CAAC,OAAO,IAAI,GAAG;AACpB,gBAAI,OAAO,MAAM,MAAM,EAAG,QAAO;AACjC,mBAAO,KAAK;AAAA,UACd;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,MAAM,OAAO,GAAG;AACzB,gBAAM,IAAI,OAAO,QAAQ;AACzB,iBAAO,CAAC,OAAO,IAAI,GAAG;AACpB,kBAAM,KAAK,OAAO,KAAK;AACvB,gBAAI,OAAO,KAAK,OAAO,OAAO,OAAO,MAAM,CAAC,MAAM,KAAM;AAAA,UAC1D;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,MAAM,IAAI,GAAG;AACtB,iBAAO,CAAC,OAAO,IAAI,GAAG;AACpB,gBAAI,OAAO,KAAK,MAAM,IAAK;AAAA,UAC7B;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,MAAM,kOAAkO,EAAG,QAAO;AAE7P,YAAI,OAAO,MAAM,cAAc,EAAG,QAAO;AAEzC,YAAI,OAAO,MAAM,4BAA4B,EAAG,QAAO;AAEvD,YAAI,OAAO,MAAM,mBAAmB,EAAG,QAAO;AAE9C,YAAI,OAAO,MAAM,uBAAuB,EAAG,QAAO;AAClD,eAAO,KAAK;AACZ,eAAO;AAAA,MACT;AAEA,UAAI,MAAM,iBAAiB,SAAS;AAGlC,YAAI,OAAO,MAAM,OAAO,GAAG;AACzB,iBAAO,CAAC,OAAO,IAAI,GAAG;AACpB,gBAAI,OAAO,MAAM,MAAM,EAAG,QAAO;AACjC,mBAAO,KAAK;AAAA,UACd;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,MAAM,OAAO,GAAG;AACzB,gBAAM,IAAI,OAAO,QAAQ;AACzB,iBAAO,CAAC,OAAO,IAAI,GAAG;AACpB,kBAAM,KAAK,OAAO,KAAK;AACvB,gBAAI,OAAO,KAAK,OAAO,OAAO,OAAO,MAAM,CAAC,MAAM,KAAM;AAAA,UAC1D;AACA,iBAAO;AAAA,QACT;AAEA,YAAI,OAAO,MAAM,cAAc,EAAG,QAAO;AAEzC,YAAI,OAAO,MAAM,sBAAsB,EAAG,QAAO;AAEjD,YAAI,OAAO,MAAM,0DAA0D,EAAG,QAAO;AAErF,YAAI,OAAO,MAAM,qBAAqB,EAAG,QAAO;AAEhD,YAAI,OAAO,MAAM,qBAAqB,EAAG,QAAO;AAEhD,YAAI,OAAO,MAAM,sKAAsK,EAAG,QAAO;AAEjM,YAAI,OAAO,MAAM,iBAAiB,EAAG,QAAO;AAE5C,YAAI,OAAO,MAAM,YAAY,EAAG,QAAO;AACvC,eAAO,KAAK;AACZ,eAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,MAAM,aAAa;AACrB,aAAO,UAAU;AACjB,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,cAAc;AACtB,aAAO,SAAS;AAEhB,UAAI,OAAO,KAAK,MAAM,KAAK;AACzB,eAAO,KAAK;AACZ,cAAM,eAAe;AACrB,cAAM,oBAAoB;AAC1B,cAAM,cAAc;AACpB,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,MAAM,mBAAmB,EAAG,QAAO;AAC9C,UAAI,OAAO,MAAM,kBAAkB,EAAG,QAAO;AAE7C,YAAM,UAAU;AAChB,UAAI,OAAO,MAAM,sBAAsB,GAAG;AACxC,cAAM,cAAc,OAAO,QAAQ;AACnC,eAAO;AAAA,MACT;AACA,UAAI,OAAO,MAAM,IAAI,EAAG,QAAO;AAC/B,UAAI,OAAO,MAAM,mBAAmB,GAAG;AACrC,eAAO,QAAQ,KAAK,MAAM,WAAW,IAAI,QAAQ;AAAA,MACnD;AAEA,aAAO,KAAK;AACZ,aAAO;AAAA,IACT;AAGA,QAAI,OAAO,IAAI,GAAG;AAChB,UAAI;AACJ,UAAK,QAAQ,OAAO,MAAM,cAAc,GAAI;AAC1C,cAAM,OAAO,OAAO,OAAO,MAAM,OAAO,GAAG,EAAE,KAAK;AAElD,YAAI,SAAS,IAAI;AACf,gBAAM,WAAW,IAAI;AAAA,QACvB,OAAO;AACL,gBAAM,YAAY,KAAK,MAAM,WAAW;AACxC,gBAAM,WAAW,KAAK,YAAY,UAAU,CAAC,EAAE,YAAY,IAAI,SAAS;AAAA,QAC1E;AAEA,cAAM,oBAAoB;AAC1B,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,MAAM,yBAAyB,KAAK,CAAC,OAAO,MAAM,cAAc,GAAG;AAC5E,eAAO;AAAA,MACT;AACA,UAAI,OAAO,MAAM,iBAAiB,EAAG,QAAO;AAC5C,UAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,cAAM,cAAc;AACpB,eAAO,UAAU;AACjB,eAAO;AAAA,MACT;AACA,UAAI,OAAO,MAAM,sBAAsB,EAAG,QAAO;AACjD,UAAI,OAAO,MAAM,+BAA+B,EAAG,QAAO;AAC1D,UAAI,OAAO,MAAM,gBAAgB,EAAG,QAAO;AAAA,IAC7C;AAGA,QAAI,MAAM,mBAAmB;AAC3B,aAAO,SAAS;AAChB,UAAI,OAAO,MAAM,SAAS,EAAG,QAAO;AACpC,UAAI,OAAO,KAAK,MAAM,KAAK;AACzB,eAAO,KAAK;AACZ,cAAM,eAAe;AACrB,cAAM,oBAAoB;AAC1B,eAAO;AAAA,MACT;AACA,YAAM,oBAAoB;AAAA,IAC5B;AAGA,UAAM,mBAAmB,MAAM,WAAW,MAAM,WAAW,SAAS,CAAC;AACrE,QAAI,qBAAqB,SAAS,CAAC,MAAM,mBAAmB;AAC1D,UAAI,OAAO,SAAS,EAAG,QAAO;AAC9B,UAAI,OAAO,MAAM,oBAAoB,EAAG,QAAO;AAC/C,UAAI,OAAO,MAAM,IAAI,EAAG,QAAO;AAC/B,UAAI,OAAO,MAAM,OAAO,EAAG,QAAO;AAClC,UAAI,OAAO,MAAM,mBAAmB,EAAG,QAAO;AAC9C,UAAI,OAAO,MAAM,qBAAqB,EAAG,QAAO;AAChD,UAAI,OAAO,MAAM,eAAe,EAAG,QAAO;AAC1C,UAAI,OAAO,MAAM,oBAAoB,EAAG,QAAO;AAC/C,UAAI,OAAO,MAAM,qBAAqB,EAAG,QAAO;AAChD,UAAI,OAAO,MAAM,kBAAkB,EAAG,QAAO;AAC7C,UAAI,OAAO,MAAM,uDAAuD,EAAG,QAAO;AAClF,aAAO,KAAK;AACZ,aAAO;AAAA,IACT;AAGA,QAAI,MAAM,eAAe,aAAa;AACpC,YAAM,aAAa;AACnB,UAAI,OAAO,IAAI,GAAG,GAAG;AACnB,YAAI,aAAa;AACjB,eAAO,CAAC,OAAO,IAAI,KAAK,aAAa,GAAG;AACtC,gBAAM,OAAO,OAAO,KAAK;AACzB,cAAI,SAAS,IAAK;AAAA,mBACT,SAAS,OAAO,OAAO,OAAO,OAAO,MAAM,CAAC,MAAM,KAAM;AAAA,QACnE;AACA,eAAO;AAAA,MACT,OAAO;AACL,cAAM,aAAa;AAAA,MACrB;AAAA,IACF;AACA,QAAI,MAAM,eAAe,iBAAiB;AACxC,YAAM,aAAa;AACnB,UAAI,OAAO,IAAI,GAAG,GAAG;AACnB,eAAO,SAAS,MAAM;AACtB,eAAO,IAAI,GAAG;AACd,eAAO;AAAA,MACT;AAAA,IACF;AACA,QAAI,MAAM,cAAc,aAAa;AACnC,YAAM,YAAY;AAClB,UAAI,OAAO,IAAI,GAAG,GAAG;AACnB,YAAI,aAAa;AACjB,eAAO,CAAC,OAAO,IAAI,KAAK,aAAa,GAAG;AACtC,gBAAM,OAAO,OAAO,KAAK;AACzB,cAAI,SAAS,IAAK;AAAA,mBACT,SAAS,OAAO,OAAO,OAAO,OAAO,MAAM,CAAC,MAAM,KAAM;AAAA,QACnE;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,OAAO,MAAM,iCAAiC,GAAG;AACnD,YAAM,MAAM,OAAO,QAAQ;AAC3B,YAAM,cAAc,IAAI,QAAQ,SAAS,EAAE,EAAE,YAAY;AACzD,YAAM,mBAAmB,IAAI,WAAW,IAAI;AAC5C,YAAM,cAAc;AACpB,aAAO;AAAA,IACT;AAGA,QAAI,OAAO,MAAM,iBAAiB,EAAG,QAAO;AAC5C,QAAI,OAAO,MAAM,aAAa,EAAG,QAAO;AACxC,QAAI,OAAO,MAAM,cAAc,GAAG;AAChC,UAAI,OAAO,KAAK,MAAM,IAAK,OAAM,aAAa;AAC9C,aAAO;AAAA,IACT;AACA,QAAI,OAAO,MAAM,aAAa,GAAG;AAC/B,UAAI,OAAO,KAAK,MAAM,IAAK,OAAM,YAAY;AAC7C,aAAO;AAAA,IACT;AACA,QAAI,OAAO,MAAM,iBAAiB,EAAG,QAAO;AAC5C,QAAI,OAAO,MAAM,SAAS,EAAG,QAAO;AACpC,QAAI,OAAO,MAAM,SAAS,EAAG,QAAO;AACpC,QAAI,OAAO,MAAM,WAAW,EAAG,QAAO;AACtC,QAAI,OAAO,MAAM,WAAW,EAAG,QAAO;AACtC,QAAI,OAAO,MAAM,WAAW,EAAG,QAAO;AACtC,QAAI,OAAO,MAAM,SAAS,EAAG,QAAO;AACpC,QAAI,OAAO,MAAM,oBAAoB,EAAG,QAAO;AAC/C,QAAI,OAAO,MAAM,UAAU,EAAG,QAAO;AAErC,WAAO,KAAK;AACZ,WAAO;AAAA,EACT;AAAA,EAEA,YAAY;AAAA,IACV,SAAS,iBAAAC,KAAE;AAAA,IACX,SAAS,iBAAAA,KAAE;AAAA,IACX,UAAU,iBAAAA,KAAE;AAAA,IACZ,QAAQ,iBAAAA,KAAE;AAAA,IACV,eAAe,iBAAAA,KAAE;AAAA,IACjB,cAAc,iBAAAA,KAAE;AAAA,IAChB,WAAW,iBAAAA,KAAE;AAAA,IACb,SAAS,iBAAAA,KAAE;AAAA,IACX,cAAc,iBAAAA,KAAE;AAAA,IAChB,MAAM,iBAAAA,KAAE;AAAA,IACR,QAAQ,iBAAAA,KAAE;AAAA,IACV,UAAU,iBAAAA,KAAE;AAAA,IACZ,gBAAgB,CAAC,iBAAAA,KAAE,QAAQ,iBAAAA,KAAE,QAAQ;AAAA,IACrC,eAAe,iBAAAA,KAAE;AAAA,IACjB,WAAW,iBAAAA,KAAE,QAAQ,iBAAAA,KAAE,QAAQ;AAAA,IAC/B,WAAW,iBAAAA,KAAE,QAAQ,iBAAAA,KAAE,OAAO;AAAA,IAC9B,KAAK,iBAAAA,KAAE;AAAA,IACP,MAAM,iBAAAA,KAAE;AAAA,IACR,QAAQ,iBAAAA,KAAE;AAAA,IACV,UAAU,iBAAAA,KAAE,SAAS,iBAAAA,KAAE,YAAY;AAAA,EACrC;AACF,CAAC;;;ADtXD,mBAAgC;AAChC,IAAAC,mBAAgG;AAChG,IAAAC,oBAA0B;;;AEN1B,mBAAoC;AAM7B,SAAS,YAAe,OAAU,OAAkB;AACzD,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,uBAAY,KAAK;AAE7D,8BAAU,MAAM;AACd,UAAM,QAAQ,WAAW,MAAM,kBAAkB,KAAK,GAAG,KAAK;AAC9D,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,OAAO,KAAK,CAAC;AAEjB,SAAO;AACT;;;ACfA,IAAAC,gBAAkC;;;ACsBlC,IAAM,iBAAiB;AAOvB,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBrB,SAAS,OAAO,MAAmB,MAAsB;AACvD,SAAO,iBAAiB,IAAI,EAAE,iBAAiB,IAAI,EAAE,KAAK;AAC5D;AAEA,SAAS,qBAA8B;AACrC,aAAW,SAAS,MAAM,KAAK,SAAS,WAAW,GAAG;AACpD,QAAI,QAA4B;AAChC,QAAI;AACF,cAAQ,MAAM;AAAA,IAChB,QAAQ;AACN;AAAA,IACF;AACA,QAAI,CAAC,MAAO;AACZ,eAAW,QAAQ,MAAM,KAAK,KAAK,GAAG;AACpC,YAAMC,OAAM,KAAK,WAAW;AAC5B,UAAIA,KAAI,SAAS,QAAQ,KAAKA,KAAI,SAAS,mBAAmB,EAAG,QAAO;AAAA,IAC1E;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,eAAwB;AACtC,MAAI,OAAO,WAAW,eAAe,OAAO,aAAa,YAAa,QAAO;AAC7E,MAAI,OAAO,SAAS,iBAAiB,iBAAiB,EAAG,QAAO;AAChE,MAAI,OAAO,SAAS,iBAAiB,kBAAkB,EAAG,QAAO;AACjE,MAAI,SAAS,SAAS,OAAO,SAAS,MAAM,iBAAiB,KAAK,OAAO,SAAS,MAAM,kBAAkB,GAAI,QAAO;AACrH,SAAO,mBAAmB;AAC5B;AAOO,SAAS,wBAA8B;AAC5C,MAAI,OAAO,aAAa,YAAa;AACrC,MAAI,SAAS,eAAe,cAAc,EAAG;AAC7C,MAAI,aAAa,EAAG;AAEpB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,KAAK;AACX,QAAM,aAAa,QAAQ,kBAAkB;AAC7C,QAAM,cAAc;AACpB,WAAS,KAAK,YAAY,KAAK;AACjC;AAKO,SAAS,wBAA8B;AAC5C,MAAI,OAAO,aAAa,YAAa;AACrC,WAAS,eAAe,cAAc,GAAG,OAAO;AAClD;;;AD9FA,IAAM,UAAU;AAChB,IAAM,YAAY;AAClB,IAAM,YAAY;AAKlB,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAoBrB,SAAS,mBAAmB,SAAkB;AACnD,QAAM,gBAAY,sBAAO,KAAK;AAE9B,+BAAU,MAAM;AACd,QAAI,CAAC,SAAS;AAEZ,aAAO,eAAe,OAAO,eAAe,KAAK;AACjD,WAAK,OAAO,eAAe,MAAM,GAAG;AAClC,iBAAS,eAAe,SAAS,GAAG,OAAO;AAC3C,iBAAS,eAAe,SAAS,GAAG,OAAO;AAC3C,8BAAsB;AACtB,eAAO,cAAc;AACrB,kBAAU,UAAU;AAAA,MACtB;AACA;AAAA,IACF;AAGA,WAAO,eAAe,OAAO,eAAe,KAAK;AAGjD,QAAI,CAAC,SAAS,eAAe,SAAS,GAAG;AACvC,YAAM,eAAe,SAAS,cAAc,QAAQ;AACpD,mBAAa,KAAK;AAClB,mBAAa,cAAc;AAC3B,eAAS,KAAK,YAAY,YAAY;AAAA,IACxC;AAIA,0BAAsB;AAGtB,QAAI,CAAC,SAAS,eAAe,SAAS,GAAG;AACvC,YAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,aAAO,KAAK;AACZ,aAAO,MAAM;AACb,eAAS,KAAK,YAAY,MAAM;AAChC,gBAAU,UAAU;AAAA,IACtB;AAEA,WAAO,MAAM;AACX,aAAO,eAAe,OAAO,eAAe,KAAK;AACjD,WAAK,OAAO,eAAe,MAAM,GAAG;AAClC,iBAAS,eAAe,SAAS,GAAG,OAAO;AAC3C,iBAAS,eAAe,SAAS,GAAG,OAAO;AAC3C,8BAAsB;AACtB,eAAO,cAAc;AACrB,kBAAU,UAAU;AAAA,MACtB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AACd;AAKO,SAAS,kBAAkB;AAChC,QAAM,KAAM,OAAe;AAC3B,MAAI,IAAI,KAAM,IAAG,KAAK;AACxB;;;AEvGA,IAAAC,gBAAyC;;;ACKlC,SAAS,eAAe,SAAgC;AAC7D,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,SAAO,QACJ,MAAM,GAAG,EACT,OAAO,OAAO,EACd,OAAsB,CAAC,UAAU,gBAAgB;AAChD,UAAM,QAAQ,YAAY,MAAM,GAAG;AACnC,QAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,UAAM,MAAM,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,aAAa,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC;AAC1E,UAAM,QAAQ,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK;AAC5C,aAAS,GAAG,IAAI;AAChB,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACT;AAKO,SAAS,WAAW,MAAsB;AAC/C,SAAO,KACJ,UAAU,KAAK,EACf,QAAQ,oBAAoB,EAAE,EAC9B,YAAY,EACZ,QAAQ,aAAa,EAAE,EACvB,QAAQ,QAAQ,GAAG;AACxB;AAKO,SAAS,WAAW,IAAkB;AAC3C,MAAI,OAAO,aAAa,YAAa;AACrC,QAAM,UAAU,SAAS,eAAe,EAAE;AAC1C,MAAI,SAAS;AACX,YAAQ,eAAe,EAAE,UAAU,UAAU,OAAO,QAAQ,CAAC;AAAA,EAC/D;AACF;AAMO,SAAS,kBAAkB,MAA6D;AAC7F,QAAM,QAAQ,KAAK,MAAM,4BAA4B;AACrD,MAAI,CAAC,MAAO,QAAO,EAAE,MAAM,SAAS,IAAI,IAAI,GAAG;AAE/C,QAAM,WAAW,MAAM,CAAC;AACxB,QAAM,cAAc,MAAM,CAAC;AAE3B,QAAM,YAAsB,CAAC;AAC7B,MAAI,KAAK;AAGT,aAAW,CAAC,EAAE,KAAK,KAAK,KAAK,SAAS,SAAS,qBAAqB,GAAG;AACrE,QAAI,QAAQ,SAAS;AACnB,gBAAU,KAAK,GAAG,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAAA,IACtD,WAAW,QAAQ,MAAM;AACvB,WAAK;AAAA,IACP;AAAA,EACF;AAIA,QAAM,WAAW,SAAS,QAAQ,mBAAmB,EAAE;AACvD,aAAW,SAAS,SAAS,MAAM,KAAK,EAAE,OAAO,OAAO,GAAG;AACzD,QAAI,MAAM,WAAW,GAAG,EAAG,WAAU,KAAK,MAAM,MAAM,CAAC,CAAC;AAAA,aAC/C,MAAM,WAAW,GAAG,KAAK,CAAC,GAAI,MAAK,MAAM,MAAM,CAAC;AAAA,EAC3D;AAEA,SAAO,EAAE,MAAM,aAAa,SAAS,UAAU,KAAK,GAAG,GAAG,GAAG;AAC/D;AAEA,IAAI,gBAAgB;AAQb,SAAS,kBAA0B;AACxC,SAAO,SAAS,EAAE,aAAa;AACjC;AAOO,SAAS,WAAW,aAA6C;AACtE,QAAM,QAAgC,CAAC;AACvC,MAAI,CAAC,aAAa,KAAK,EAAG,QAAO;AAGjC,QAAM,YAAY;AAClB,MAAI;AACJ,UAAQ,QAAQ,UAAU,KAAK,WAAW,OAAO,MAAM;AACrD,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,QAAQ,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK;AACtC,UAAM,GAAG,IAAI;AAAA,EACf;AAGA,QAAM,eAAe,YAAY,MAAM,yBAAyB;AAChE,MAAI,cAAc;AAChB,UAAM,WAAW,MAAM,OAAO,KAAK;AACnC,UAAM,aAAa,aAAa,IAAI,OAAK,EAAE,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG;AACjE,UAAM,OAAO,IAAI,WAAW,GAAG,QAAQ,IAAI,UAAU,KAAK;AAAA,EAC5D;AAGA,QAAM,UAAU,YAAY,MAAM,6BAA6B;AAC/D,MAAI,WAAW,CAAC,MAAM,IAAI,GAAG;AAC3B,UAAM,IAAI,IAAI,QAAQ,CAAC;AAAA,EACzB;AAEA,SAAO;AACT;AASO,SAAS,eAAe,aAA0C;AACvE,QAAM,QAA6B,CAAC;AACpC,MAAI,CAAC,aAAa,KAAK,EAAG,QAAO;AAEjC,QAAM,YAAY;AAClB,MAAI;AACJ,UAAQ,QAAQ,UAAU,KAAK,WAAW,OAAO,MAAM;AACrD,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,QAAQ,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK;AAGlD,QAAI,QAAQ,WAAW,OAAO,UAAU,UAAU;AAChD,YAAM,GAAG,IAAI,eAAe,KAAK;AAAA,IACnC,OAAO;AACL,YAAM,GAAG,IAAI;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AACT;;;AChJO,SAAS,cAAcC,WAA2B;AACvD,MAAI,CAACA,UAAU,QAAO,CAAC;AACvB,QAAM,QAAQA,UAAS,QAAQ,SAAS,IAAI,EAAE,QAAQ,OAAO,EAAE,EAAE,MAAM,IAAI;AAC3E,QAAM,SAAkB,CAAC;AACzB,QAAM,UAAU,oBAAI,IAAY;AAChC,MAAI,IAAI;AAER,SAAO,IAAI,MAAM,QAAQ;AACvB,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI;AAGJ,QAAK,QAAQ,QAAQ,MAAM,mBAAmB,GAAI;AAChD,YAAM,QAAQ,MAAM,CAAC,EAAE;AACvB,YAAM,UAAU,MAAM,CAAC;AACvB,YAAM,EAAE,MAAAC,OAAM,SAAAC,UAAS,IAAI,SAAS,IAAI,kBAAkB,OAAO;AACjE,YAAM,SAAS,YAAY,WAAWD,MAAK,QAAQ,UAAU,EAAE,CAAC;AAChE,UAAIE,MAAK;AACT,UAAI,IAAI;AACR,aAAO,QAAQ,IAAIA,GAAE,GAAG;AACtB;AACA,QAAAA,MAAK,GAAG,MAAM,IAAI,CAAC;AAAA,MACrB;AACA,cAAQ,IAAIA,GAAE;AACd,aAAO,KAAK,EAAE,MAAM,UAAU,OAAO,MAAAF,OAAM,IAAAE,KAAI,SAASD,YAAW,OAAU,CAAC;AAC9E;AACA;AAAA,IACF;AAGA,QAAK,QAAQ,QAAQ,MAAM,2BAA2B,GAAI;AACxD,YAAM,UAAU,MAAM,CAAC;AACvB,YAAM,QAAQ,MAAM,CAAC,MAAM,OAAO,WAAW;AAC7C,aAAO,KAAK,EAAE,MAAM,aAAa,SAAS,MAAM,CAAC;AACjD;AACA;AAAA,IACF;AAGA,QAAI,QAAQ,WAAW,KAAK,GAAG;AAC7B,YAAM,cAAc,QAAQ,MAAM,CAAC,EAAE,KAAK;AAC1C,YAAM,aAAa,YAAY,MAAM,wBAAwB;AAC7D,YAAM,OAAO,YAAY,QAAQ,wBAAwB,EAAE,EAAE,KAAK;AAClE,YAAM,QAAQ,aAAa,WAAW,CAAC,IAAI;AAC3C,YAAM,UAAoB,CAAC;AAC3B;AACA,aAAO,IAAI,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,KAAK,GAAG;AAC7D,gBAAQ,KAAK,MAAM,CAAC,CAAC;AACrB;AAAA,MACF;AACA,aAAO,KAAK,EAAE,MAAM,aAAa,UAAU,MAAM,OAAO,SAAS,QAAQ,KAAK,IAAI,EAAE,CAAC;AACrF;AACA;AAAA,IACF;AAGA,QAAI,QAAQ,WAAW,KAAK,GAAG;AAC7B,YAAM,OAAO,QAAQ,MAAM,CAAC,EAAE,KAAK;AAGnC,UAAI,SAAS,IAAI;AACf,eAAO,KAAK,EAAE,MAAM,aAAa,SAAS,KAAK,CAAC;AAChD;AACA;AAAA,MACF;AAEA,YAAM,YAAY,KAAK,MAAM,WAAW;AACxC,YAAM,gBAAgB,YAAY,UAAU,CAAC,IAAI;AAGjD,UAAI,IAAI,IAAI;AACZ,UAAI,cAAc;AAClB,UAAI,aAAa;AAEjB,aAAO,IAAI,MAAM,QAAQ;AACvB,cAAM,iBAAiB,MAAM,CAAC,EAAE,KAAK;AACrC,YAAI,mBAAmB,OAAO;AAC5B,cAAI,gBAAgB,GAAG;AACrB,yBAAa;AACb;AAAA,UACF,OAAO;AACL;AAAA,UACF;AAAA,QACF,WAAW,eAAe,WAAW,KAAK,GAAG;AAE3C;AAAA,QACF;AACA;AAAA,MACF;AAEA,UAAI,YAAY;AAEd,cAAM,eAAyB,CAAC;AAChC,iBAAS,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;AAC9B,uBAAa,KAAK,MAAM,CAAC,CAAC;AAAA,QAC5B;AACA,cAAM,aAAa,aAAa,KAAK,IAAI;AAGzC,cAAM,aAAa,YAAY,KAAK,MAAM,cAAc,MAAM,EAAE,KAAK,IAAI;AAGzE,YAAI,cAAc;AAClB,YAAI,YAAY;AAChB,cAAM,kBAAkB,WAAW,MAAM,iBAAiB;AAC1D,YAAI,iBAAiB;AACnB,wBAAc,gBAAgB,CAAC;AAAA,QACjC,WAAW,YAAY;AAErB,sBAAY;AAAA,QACd;AAEA,cAAM,QAAQ,WAAW,WAAW;AACpC,YAAI,aAAa,CAAC,MAAM,OAAO,GAAG;AAChC,gBAAM,OAAO,IAAI;AAAA,QACnB;AAGA,cAAM,QAAQ,WAAW,UAAU;AAEnC,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS,gBAAgB;AAAA,QAC3B,CAAmB;AAEnB,YAAI,IAAI;AACR;AAAA,MACF,OAAO;AAEL,eAAO,KAAK,EAAE,MAAM,aAAa,SAAS,KAAK,CAAC;AAChD;AACA;AAAA,MACF;AAAA,IACF;AAGA,QAAK,QAAQ,QAAQ,MAAM,uDAAuD,GAAI;AACpF,YAAM,CAAC,EAAE,SAAS,KAAK,aAAa,MAAM,QAAQ,IAAI;AAEtD,UAAI,QAAQ,KAAK,GAAG;AAClB,eAAO,KAAK,EAAE,MAAM,aAAa,SAAS,QAAQ,KAAK,EAAE,CAAC;AAAA,MAC5D;AAEA,UAAI,MAAM;AACV,YAAM,QAAuB,CAAC;AAC9B,UAAI,IAAI,SAAS,OAAO,GAAG;AACzB,cAAM,IAAI,QAAQ,SAAS,EAAE;AAC7B,cAAM,QAAQ;AACd,cAAM,SAAS;AAAA,MACjB,WAAW,IAAI,SAAS,QAAQ,GAAG;AACjC,cAAM,IAAI,QAAQ,UAAU,EAAE;AAC9B,cAAM,QAAQ;AACd,cAAM,SAAS;AAAA,MACjB,WAAW,IAAI,SAAS,SAAS,GAAG;AAClC,cAAM,IAAI,QAAQ,WAAW,EAAE;AAC/B,cAAM,UAAU;AAChB,cAAM,SAAS;AAAA,MACjB;AACA,UAAI,MAAM;AACR,cAAM,CAAC,OAAO,MAAM,IAAI,KAAK,MAAM,GAAG;AACtC,YAAI,MAAO,OAAM,QAAQ,MAAM,KAAK;AACpC,YAAI,OAAQ,OAAM,SAAS,OAAO,KAAK;AAAA,MACzC;AACA,aAAO,KAAK,EAAE,MAAM,SAAS,KAAK,KAAK,MAAM,CAAC;AAE9C,UAAI,SAAS,KAAK,GAAG;AACnB,eAAO,KAAK,EAAE,MAAM,aAAa,SAAS,SAAS,KAAK,EAAE,CAAC;AAAA,MAC7D;AACA;AACA;AAAA,IACF;AAGA,QAAI,QAAQ,SAAS,GAAG,KAAK,IAAI,IAAI,MAAM,UAAU,MAAM,IAAI,CAAC,EAAE,SAAS,KAAK,GAAG;AACjF,YAAM,aAAa,CAAC,IAAI;AACxB;AACA,iBAAW,KAAK,MAAM,CAAC,CAAC;AACxB;AACA,aAAO,IAAI,MAAM,UAAU,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,GAAG,GAAG;AACxD,mBAAW,KAAK,MAAM,CAAC,CAAC;AACxB;AAAA,MACF;AACA,aAAO,KAAK,EAAE,MAAM,SAAS,SAAS,WAAW,KAAK,IAAI,EAAE,CAAC;AAC7D;AAAA,IACF;AAGA,QAAK,QAAQ,QAAQ,MAAM,6BAA6B,GAAI;AAC1D,YAAM,YAAY,CAAC,IAAI;AACvB;AACA,aAAO,IAAI,MAAM,QAAQ;AACvB,cAAM,WAAW,MAAM,CAAC;AACxB,cAAM,cAAc,SAAS,KAAK;AAClC,YACE,YAAY,MAAM,6BAA6B,KAC/C,gBAAgB,MAChB,SAAS,WAAW,IAAI,GACxB;AACA,oBAAU,KAAK,QAAQ;AACvB;AAAA,QACF,OAAO;AACL;AAAA,QACF;AAAA,MACF;AACA,aAAO,KAAK,EAAE,MAAM,QAAQ,SAAS,UAAU,KAAK,IAAI,EAAE,CAAC;AAC3D;AAAA,IACF;AAGA,QAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,YAAM,aAAa,CAAC,IAAI;AACxB;AACA,aAAO,IAAI,MAAM,WAAW,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,GAAG,KAAK,MAAM,CAAC,EAAE,KAAK,MAAM,KAAK;AACtF,mBAAW,KAAK,MAAM,CAAC,CAAC;AACxB;AAAA,MACF;AACA,YAAM,WAAW,WAAW,KAAK,IAAI,EAAE,QAAQ,WAAW,EAAE;AAC5D,YAAM,EAAE,MAAAD,OAAM,SAAAC,UAAS,IAAAC,IAAG,IAAI,kBAAkB,QAAQ;AACxD,aAAO,KAAK,EAAE,MAAM,cAAc,SAASF,OAAM,SAASC,YAAW,QAAW,IAAAC,IAAG,CAAC;AACpF;AAAA,IACF;AAGA,QAAI,6BAA6B,KAAK,OAAO,GAAG;AAC9C,aAAO,KAAK,EAAE,MAAM,KAAK,CAAC;AAC1B;AACA;AAAA,IACF;AAGA,QAAI,kBAAkB,KAAK,OAAO,GAAG;AACnC,aAAO,KAAK,EAAE,MAAM,MAAM,CAAC;AAC3B;AACA;AAAA,IACF;AAGA,QAAI,YAAY,IAAI;AAClB;AACA;AAAA,IACF;AAGA,QAAI,gBAAgB,QAAQ,MAAM,oBAAoB;AACtD,QAAI,eAAe;AACjB,YAAM,UAAU,cAAc,CAAC,EAAE,YAAY;AAE7C,YAAM,eAAe,oBAAI,IAAI;AAAA,QAC3B;AAAA,QAAQ;AAAA,QAAQ;AAAA,QAAM;AAAA,QAAO;AAAA,QAAS;AAAA,QAAM;AAAA,QAAO;AAAA,QACnD;AAAA,QAAQ;AAAA,QAAQ;AAAA,QAAS;AAAA,QAAU;AAAA,QAAS;AAAA,MAC9C,CAAC;AAED,YAAM,gBAAgB,MAAM,MAAM,CAAC,EAAE,KAAK,IAAI;AAG9C,YAAM,eAAe,IAAI,OAAO,SAAS,OAAO,gBAAgB,GAAG;AACnE,YAAM,eAAe,cAAc,MAAM,YAAY;AAErD,UAAI,cAAc;AAChB,cAAM,cAAc,aAAa,CAAC;AAClC,cAAM,QAAQ,aAAa,CAAC,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAExD,cAAM,gBAAgB,YAAY,SAAS,IAAI,KAAK,aAAa,IAAI,OAAO;AAE5E,YAAI,eAAe;AACjB,gBAAM,YAAY,cAAc,UAAU,GAAG,aAAa,QAAS,YAAY,MAAM;AACrF,gBAAM,gBAAgB,UAAU,MAAM,IAAI,EAAE;AAE5C,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,KAAK;AAAA,YACL;AAAA,YACA,UAAU,CAAC;AAAA;AAAA,UACb,CAAmB;AAEnB,eAAK;AACL;AAAA,QACF,OAAO;AAEL,cAAI,cAAc;AAClB,cAAI,aAAa;AACjB,cAAI,iBAAiB;AAErB,gBAAM,WAAW,IAAI,OAAO,MAAM,OAAO,aAAa,IAAI;AAC1D,mBAAS,YAAY,aAAa,QAAS,YAAY;AAEvD,cAAI;AACJ,kBAAQ,YAAY,SAAS,KAAK,aAAa,OAAO,MAAM;AAC1D,gBAAI,UAAU,CAAC,EAAE,WAAW,IAAI,GAAG;AACjC;AACA,kBAAI,cAAc,GAAG;AACnB,6BAAa,UAAU;AACvB,iCAAiB,UAAU,CAAC,EAAE;AAC9B;AAAA,cACF;AAAA,YACF,OAAO;AACL,kBAAI,CAAC,UAAU,CAAC,EAAE,SAAS,IAAI,GAAG;AAChC;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,cAAI,eAAe,IAAI;AACrB,kBAAM,YAAY,cAAc,UAAU,GAAG,aAAa,cAAc;AACxE,kBAAM,gBAAgB,UAAU,MAAM,IAAI,EAAE;AAG5C,gBAAI,YAAY,WAAW,YAAY,UAAU;AAC/C,qBAAO,KAAK;AAAA,gBACV,MAAM;AAAA,gBACN,SAAS;AAAA,gBACT,SAAS,gBAAgB;AAAA,cAC3B,CAAC;AAAA,YACH,OAAO;AACL,oBAAM,eAAe,cAAc,UAAU,aAAa,QAAS,YAAY,QAAQ,UAAU;AACjG,qBAAO,KAAK;AAAA,gBACV,MAAM;AAAA,gBACN,KAAK;AAAA,gBACL;AAAA,gBACA,UAAU,cAAc,YAAY;AAAA,cACtC,CAAmB;AAAA,YACrB;AAEA,iBAAK;AACL;AAAA,UACF,OAAO;AAEL,kBAAM,YAAY,cAAc,UAAU,GAAG,aAAa,QAAS,YAAY,MAAM;AACrF,kBAAM,gBAAgB,UAAU,MAAM,IAAI,EAAE;AAE5C,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN,KAAK;AAAA,cACL;AAAA,cACA,UAAU,CAAC;AAAA,YACb,CAAmB;AAEnB,iBAAK;AACL;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,iBAAiB,CAAC,IAAI;AAC5B;AACA,WAAO,IAAI,MAAM,QAAQ;AACvB,YAAM,WAAW,MAAM,CAAC;AACxB,YAAM,cAAc,SAAS,KAAK;AAClC,UACE,gBAAgB,MAChB,YAAY,WAAW,GAAG,KAC1B,YAAY,WAAW,KAAK,KAC5B,YAAY,SAAS,GAAG,KACxB,YAAY,MAAM,wBAAwB,KAC1C,YAAY,WAAW,GAAG,KAC1B,YAAY,WAAW,KAAK,KAC5B,YAAY,WAAW,IAAI,KAC3B,YAAY,MAAM,sBAAsB,GACxC;AACA;AAAA,MACF;AACA,qBAAe,KAAK,QAAQ;AAC5B;AAAA,IACF;AACA,UAAM,eAAe,eAAe,KAAK,IAAI,EAAE,KAAK;AACpD,UAAM,EAAE,MAAM,SAAS,GAAG,IAAI,kBAAkB,YAAY;AAC5D,WAAO,KAAK,EAAE,MAAM,aAAa,SAAS,MAAM,SAAS,WAAW,QAAW,GAAG,CAAC;AAAA,EACrF;AAEA,SAAO;AACT;AAeA,SAAS,WAAW,YAA4C;AAC9D,QAAM,QAAgC,CAAC;AACvC,QAAM,QAAQ,WAAW,MAAM,IAAI;AACnC,MAAI,cAAc;AAClB,MAAI,SAAmB,CAAC;AACxB,MAAI,eAAe;AAEnB,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,KAAK;AAG1B,QAAI,QAAQ,WAAW,KAAK,GAAG;AAC7B,YAAM,OAAO,QAAQ,MAAM,CAAC,EAAE,KAAK;AACnC,UAAI,SAAS,IAAI;AAEf,uBAAe,KAAK,IAAI,GAAG,eAAe,CAAC;AAAA,MAC7C,OAAO;AACL;AAAA,MACF;AAAA,IACF;AAGA,QAAI,iBAAiB,KAAK,QAAQ,MAAM,aAAa,GAAG;AAEtD,UAAI,OAAO,SAAS,KAAK,gBAAgB,WAAW;AAClD,cAAM,WAAW,IAAI,OAAO,KAAK,IAAI,EAAE,KAAK;AAAA,MAC9C;AACA,oBAAc,QAAQ,MAAM,CAAC;AAC7B,eAAS,CAAC;AAAA,IACZ,OAAO;AACL,aAAO,KAAK,IAAI;AAAA,IAClB;AAAA,EACF;AAGA,QAAM,WAAW,IAAI,OAAO,KAAK,IAAI,EAAE,KAAK;AAE5C,SAAO;AACT;;;ACnbA,kBAAiB;AAEjB,wBAAuB;AACvB,wBAAuB;AACvB,oBAAmB;AACnB,iBAAgB;AAChB,iBAAgB;AAChB,kBAAiB;AACjB,kBAAiB;AACjB,iBAAgB;AAChB,sBAAqB;AACrB,kBAAiB;AACjB,oBAAmB;AACnB,iBAAgB;AAChB,gBAAe;AACf,kBAAiB;AACjB,iBAAgB;AAChB,kBAAiB;AACjB,mBAAkB;AAClB,oBAAmB;AACnB,kBAAiB;AACjB,kBAAiB;AACjB,iBAAiB;AACjB,wBAAuB;AACvB,kBAAiB;AACjB,mBAAkB;AAElB,YAAAC,QAAK,iBAAiB,cAAc,kBAAAC,OAAU;AAC9C,YAAAD,QAAK,iBAAiB,MAAM,kBAAAC,OAAU;AACtC,YAAAD,QAAK,iBAAiB,OAAO,kBAAAC,OAAU;AACvC,YAAAD,QAAK,iBAAiB,cAAc,kBAAAE,OAAU;AAC9C,YAAAF,QAAK,iBAAiB,MAAM,kBAAAE,OAAU;AACtC,YAAAF,QAAK,iBAAiB,OAAO,kBAAAE,OAAU;AACvC,YAAAF,QAAK,iBAAiB,UAAU,cAAAG,OAAM;AACtC,YAAAH,QAAK,iBAAiB,MAAM,cAAAG,OAAM;AAClC,YAAAH,QAAK,iBAAiB,OAAO,WAAAI,OAAG;AAChC,YAAAJ,QAAK,iBAAiB,QAAQ,WAAAK,OAAG;AACjC,YAAAL,QAAK,iBAAiB,OAAO,WAAAK,OAAG;AAChC,YAAAL,QAAK,iBAAiB,OAAO,WAAAK,OAAG;AAChC,YAAAL,QAAK,iBAAiB,QAAQ,YAAAM,OAAI;AAClC,YAAAN,QAAK,iBAAiB,QAAQ,YAAAO,OAAI;AAClC,YAAAP,QAAK,iBAAiB,MAAM,YAAAO,OAAI;AAChC,YAAAP,QAAK,iBAAiB,OAAO,YAAAO,OAAI;AACjC,YAAAP,QAAK,iBAAiB,OAAO,WAAAQ,OAAG;AAChC,YAAAR,QAAK,iBAAiB,YAAY,gBAAAS,OAAQ;AAC1C,YAAAT,QAAK,iBAAiB,MAAM,gBAAAS,OAAQ;AACpC,YAAAT,QAAK,iBAAiB,QAAQ,YAAAU,OAAI;AAClC,YAAAV,QAAK,iBAAiB,UAAU,cAAAW,OAAM;AACtC,YAAAX,QAAK,iBAAiB,MAAM,cAAAW,OAAM;AAClC,YAAAX,QAAK,iBAAiB,OAAO,WAAAY,OAAG;AAChC,YAAAZ,QAAK,iBAAiB,MAAM,UAAAa,OAAE;AAC9B,YAAAb,QAAK,iBAAiB,QAAQ,YAAAc,OAAI;AAClC,YAAAd,QAAK,iBAAiB,OAAO,WAAAe,OAAG;AAChC,YAAAf,QAAK,iBAAiB,QAAQ,YAAAgB,OAAI;AAClC,YAAAhB,QAAK,iBAAiB,SAAS,aAAAiB,OAAK;AACpC,YAAAjB,QAAK,iBAAiB,UAAU,cAAAkB,OAAM;AACtC,YAAAlB,QAAK,iBAAiB,QAAQ,YAAAmB,OAAI;AAClC,YAAAnB,QAAK,iBAAiB,QAAQ,YAAAoB,OAAI;AAClC,YAAApB,QAAK,iBAAiB,QAAQ,WAAAqB,OAAI;AAClC,YAAArB,QAAK,iBAAiB,cAAc,kBAAAsB,OAAU;AAC9C,YAAAtB,QAAK,iBAAiB,QAAQ,YAAAuB,OAAI;AAClC,YAAAvB,QAAK,iBAAiB,SAAS,aAAAwB,OAAK;AAEpC,IAAO,yBAAQ,YAAAxB;;;ACjDR,SAAS,WAAW,UAAkB,cAAoC;AAC/E,QAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,QAAM,MAAM,+BAA+B,eAAe,IAAI,YAAY,KAAK,EAAE;AACjF,OAAK,YAAY;AACjB,OAAK,aAAa,eAAe,MAAM;AAEvC,QAAM,cAAc,yBAAyB,KAAK,QAAQ;AAC1D,MAAI,aAAa;AACf,SAAK,YAAY,MAAM,QAAQ;AAAA,EACjC,OAAO;AACL,SAAK,cAAc;AAAA,EACrB;AACA,SAAO;AACT;AAOO,SAAS,gBAAgB,MAAc,UAAkB,OAA6B;AAC3F,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AAEpB,QAAM,OAAO,UAAU,MAAM,OAAO,EAAE,CAAC,GAAG,KAAK,KAAK;AAGpD,MAAI,OAAO;AACT,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AACnB,WAAO,YAAY,WAAW,aAAa,CAAC;AAC5C,UAAM,YAAY,SAAS,cAAc,MAAM;AAC/C,cAAU,cAAc;AACxB,WAAO,YAAY,SAAS;AAC5B,YAAQ,YAAY,MAAM;AAAA,EAC5B;AAGA,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,QAAM,SAAS,SAAS,cAAc,MAAM;AAC5C,SAAO,YAAY,YAAY,QAAQ,WAAW;AAElD,MAAI;AACF,QAAI,QAAQ,uBAAK,YAAY,IAAI,GAAG;AAClC,aAAO,YAAY,uBAAK,UAAU,MAAM,EAAE,UAAU,KAAK,CAAC,EAAE;AAAA,IAC9D,OAAO;AACL,aAAO,YAAY,uBAAK,cAAc,IAAI,EAAE;AAAA,IAC9C;AAAA,EACF,QAAQ;AACN,WAAO,cAAc;AAAA,EACvB;AAEA,MAAI,YAAY,MAAM;AACtB,UAAQ,YAAY,GAAG;AAGvB,QAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,UAAQ,YAAY;AACpB,UAAQ,QAAQ;AAChB,QAAM,WAAW,WAAW,cAAc;AAC1C,WAAS,MAAM,WAAW;AAC1B,UAAQ,YAAY,QAAQ;AAE5B,MAAI,QAA8C;AAClD,UAAQ,iBAAiB,SAAS,MAAM;AACtC,cAAU,UAAU,UAAU,IAAI;AAClC,aAAS,cAAc;AACvB,QAAI,MAAO,cAAa,KAAK;AAC7B,YAAQ,WAAW,MAAM;AAAE,eAAS,cAAc;AAAA,IAAgB,GAAG,IAAI;AAAA,EAC3E,CAAC;AAED,UAAQ,YAAY,OAAO;AAC3B,SAAO;AACT;AAIA,IAAM,2BAAmD;AAAA,EACvD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AACb;AAMO,SAAS,iBACd,MACA,OACA,MACa;AACb,QAAM,KAAK,SAAS,cAAc,KAAK;AACvC,KAAG,YAAY,gCAAgC,QAAQ,MAAM;AAE7D,MAAI,OAAO;AACT,UAAM,SAAS,SAAS,cAAc,IAAI;AAC1C,WAAO,YAAY;AACnB,UAAM,eAAe,QAAQ,yBAAyB,IAAI,KAAK;AAC/D,WAAO,YAAY,WAAW,cAAc,qBAAqB,CAAC;AAClE,UAAM,YAAY,SAAS,cAAc,MAAM;AAC/C,cAAU,cAAc;AACxB,WAAO,YAAY,SAAS;AAC5B,OAAG,YAAY,MAAM;AAAA,EACvB;AAEA,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,KAAG,YAAY,IAAI;AAEnB,SAAO;AACT;AAQO,SAAS,cACd,OACA,MACA,aACa;AACb,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AACpB,MAAI,YAAa,SAAQ,OAAO;AAEhC,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AAEpB,QAAM,eAAe,QAAQ;AAC7B,QAAM,SAAS,WAAW,cAAc,kBAAkB;AAC1D,UAAQ,YAAY,MAAM;AAE1B,QAAM,YAAY,SAAS,cAAc,MAAM;AAC/C,YAAU,cAAc,SAAS;AACjC,UAAQ,YAAY,SAAS;AAG7B,UAAQ,iBAAiB,UAAU,MAAM;AACvC,WAAO,UAAU,OAAO,0BAA0B,QAAQ,IAAI;AAAA,EAChE,CAAC;AAED,UAAQ,YAAY,OAAO;AAE3B,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,UAAQ,YAAY,IAAI;AAExB,SAAO;AACT;AAQO,SAAS,YAAY,OAAkC;AAC5D,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,YAAY;AAGnB,SAAO,iBAAiB,SAAS,CAAC,MAAM;AACtC,QAAI,EAAE,WAAW,QAAQ;AACvB,aAAO,MAAM;AAAA,IACf;AAAA,EACF,CAAC;AAED,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY;AAGlB,QAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,SAAO,YAAY;AAEnB,QAAM,UAAU,SAAS,cAAc,IAAI;AAC3C,UAAQ,YAAY;AACpB,UAAQ,cAAc;AACtB,SAAO,YAAY,OAAO;AAE1B,QAAM,WAAW,SAAS,cAAc,QAAQ;AAChD,WAAS,YAAY;AACrB,WAAS,YAAY,WAAW,OAAO,CAAC;AACxC,WAAS,iBAAiB,SAAS,MAAM,OAAO,MAAM,CAAC;AACvD,SAAO,YAAY,QAAQ;AAE3B,QAAM,YAAY,MAAM;AAGxB,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,QAAM,YAAY,IAAI;AAEtB,SAAO,YAAY,KAAK;AACxB,SAAO;AACT;AAQO,SAAS,YACd,SACAyB,eACa;AACb,QAAM,OAAO,QAAQ,MAAM,IAAI,EAAE,OAAO,OAAK,EAAE,KAAK,CAAC;AACrD,MAAI,KAAK,SAAS,GAAG;AACnB,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,cAAc;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,CAAC,QAChB,IAAI,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAElD,QAAM,cAAc,SAAS,KAAK,CAAC,CAAC;AACpC,QAAM,WAAW,KAAK,MAAM,CAAC,EAAE,IAAI,QAAQ;AAE3C,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AAEpB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,YAAY;AAGlB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,KAAK,SAAS,cAAc,IAAI;AACtC,aAAW,QAAQ,aAAa;AAC9B,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,YAAY;AACf,OAAG,YAAYA,cAAa,IAAI,CAAC;AACjC,OAAG,YAAY,EAAE;AAAA,EACnB;AACA,QAAM,YAAY,EAAE;AACpB,QAAM,YAAY,KAAK;AAGvB,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,aAAW,SAAS,UAAU;AAC5B,UAAMC,MAAK,SAAS,cAAc,IAAI;AACtC,eAAW,QAAQ,OAAO;AACxB,YAAM,KAAK,SAAS,cAAc,IAAI;AACtC,SAAG,YAAY;AACf,SAAG,YAAYD,cAAa,IAAI,CAAC;AACjC,MAAAC,IAAG,YAAY,EAAE;AAAA,IACnB;AACA,UAAM,YAAYA,GAAE;AAAA,EACtB;AACA,QAAM,YAAY,KAAK;AACvB,UAAQ,YAAY,KAAK;AAEzB,SAAO;AACT;AAOO,SAAS,WACd,SACAD,eACa;AACb,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAM,QAA4D,CAAC;AAEnE,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,KAAK,KAAK,EAAG;AAClB,UAAM,QAAQ,KAAK,MAAM,6BAA6B;AACtD,QAAI,OAAO;AACT,YAAM,KAAK,EAAE,QAAQ,MAAM,CAAC,EAAE,QAAQ,QAAQ,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,IAC1E;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,cAAc;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,UAAU,KAAK,MAAM,CAAC,EAAE,MAAM;AAChD,QAAM,OAAO,SAAS,cAAc,YAAY,OAAO,IAAI;AAC3D,OAAK,YAAY;AAEjB,aAAW,QAAQ,OAAO;AACxB,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,YAAY;AACf,OAAG,YAAYA,cAAa,KAAK,IAAI,CAAC;AACtC,SAAK,YAAY,EAAE;AAAA,EACrB;AAEA,SAAO;AACT;AAaO,SAAS,UACd,SACAA,eACa;AACb,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAEhB,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY;AAClB,QAAM,cAAc;AACpB,MAAI,YAAY,KAAK;AAErB,QAAM,KAAK,SAAS,cAAc,IAAI;AACtC,KAAG,YAAY;AAEf,aAAW,KAAK,SAAS;AACvB,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,YAAY,+BAA+B,EAAE,KAAK;AAErD,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,YAAY;AACd,MAAE,OAAO,IAAI,EAAE,EAAE;AACjB,MAAE,YAAYA,cAAa,EAAE,KAAK,QAAQ,UAAU,EAAE,EAAE,KAAK,CAAC,CAAC;AAC/D,MAAE,iBAAiB,SAAS,CAAC,MAAM;AACjC,QAAE,eAAe;AACjB,YAAM,SAAS,SAAS,eAAe,EAAE,EAAE;AAC3C,UAAI,OAAQ,QAAO,eAAe,EAAE,UAAU,UAAU,OAAO,QAAQ,CAAC;AAAA,IAC1E,CAAC;AAED,OAAG,YAAY,CAAC;AAChB,OAAG,YAAY,EAAE;AAAA,EACnB;AAEA,MAAI,YAAY,EAAE;AAClB,SAAO;AACT;AAOO,SAAS,iBACd,SACA,SACAA,eACa;AACb,QAAM,KAAK,SAAS,cAAc,YAAY;AAC9C,KAAG,YAAY,gBAAgB,UAAU,IAAI,OAAO,KAAK,EAAE;AAC3D,KAAG,YAAYA,cAAa,OAAO,CAAC;AACpC,SAAO;AACT;;;AC1WO,SAAS,aAAa,MAAgC;AAC3D,QAAM,WAAW,SAAS,uBAAuB;AACjD,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,QACJ;AAEF,MAAI,YAAY;AAChB,MAAI;AAEJ,UAAQ,QAAQ,MAAM,KAAK,IAAI,OAAO,MAAM;AAE1C,QAAI,MAAM,QAAQ,WAAW;AAC3B,eAAS,YAAY,SAAS,eAAe,KAAK,MAAM,WAAW,MAAM,KAAK,CAAC,CAAC;AAAA,IAClF;AAEA,aAAS,YAAY,gBAAgB,MAAM,CAAC,CAAC,CAAC;AAC9C,gBAAY,MAAM;AAAA,EACpB;AAGA,MAAI,YAAY,KAAK,QAAQ;AAC3B,aAAS,YAAY,SAAS,eAAe,KAAK,MAAM,SAAS,CAAC,CAAC;AAAA,EACrE;AAEA,SAAO;AACT;AAKA,SAAS,gBAAgB,MAAoB;AAC3C,MAAI;AAGJ,MAAK,QAAQ,KAAK,MAAM,oBAAoB,GAAI;AAC9C,WAAO,WAAW,MAAM,CAAC,CAAC;AAAA,EAC5B;AAGA,MAAK,QAAQ,KAAK,MAAM,aAAa,GAAI;AACvC,UAAM,UAAU,MAAM,CAAC;AACvB,UAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,QAAI,QAAQ;AACZ,QAAI,kBAAkB;AACtB,QAAI,OAAO;AACX,QAAI,YAAY;AAEhB,QACE,MAAM,SAAS,GAAG,MAAM,oCAAoC,KAC5D,CAAC,OAAO,QAAQ,SAAS,UAAU,UAAU,UAAU,MAAM,EAAE,SAAS,MAAM,SAAS,CAAC,GACxF;AACA,cAAQ,MAAM,WAAW;AAAA,IAC3B;AACA,QAAI,CAAC,SAAS,UAAU,UAAU,UAAU,MAAM,EAAE,SAAS,MAAM,SAAS,CAAC,GAAG;AAC9E,wBAAkB,MAAM,WAAW;AAAA,IACrC;AACA,QAAI,CAAC,aAAa,gBAAgB,YAAY,MAAM,EAAE,SAAS,MAAM,SAAS,CAAC,GAAG;AAChF,aAAO,MAAM,SAAS,MAAM,SAAS,2BAA2B,MAAM,WAAW;AAAA,IACnF;AACA,UAAM,YAAY,MAAM,MAAM,SAAS,EAAE,KAAK,GAAG;AAEjD,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,YAAY;AACjB,SAAK,MAAM,iBAAiB,GAAG,IAAI,IAAI,eAAe,IAAI,KAAK;AAC/D,SAAK,MAAM,0BAA0B;AACrC,SAAK,YAAY,aAAa,SAAS,CAAC;AACxC,WAAO;AAAA,EACT;AAGA,MAAK,QAAQ,KAAK,MAAM,0BAA0B,GAAI;AACpD,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,MAAM,QAAQ,MAAM,CAAC;AAC1B,SAAK,YAAY,aAAa,MAAM,CAAC,CAAC,CAAC;AACvC,WAAO;AAAA,EACT;AAGA,MAAK,QAAQ,KAAK,MAAM,gBAAgB,GAAI;AAC1C,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,YAAY;AACjB,SAAK,YAAY,aAAa,MAAM,CAAC,CAAC,CAAC;AACvC,WAAO;AAAA,EACT;AAGA,MAAK,QAAQ,KAAK,MAAM,aAAa,GAAI;AACvC,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,YAAY;AACjB,SAAK,YAAY,aAAa,MAAM,CAAC,CAAC,CAAC;AACvC,WAAO;AAAA,EACT;AAGA,MAAK,QAAQ,KAAK,MAAM,qBAAqB,GAAI;AAC/C,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,YAAY,aAAa,MAAM,CAAC,CAAC,CAAC;AACrC,WAAO,YAAY,EAAE;AACrB,WAAO;AAAA,EACT;AAGA,MAAK,QAAQ,KAAK,MAAM,iBAAiB,GAAI;AAC3C,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,YAAY,aAAa,MAAM,CAAC,CAAC,CAAC;AACzC,WAAO;AAAA,EACT;AAGA,MAAK,QAAQ,KAAK,MAAM,WAAW,GAAI;AACrC,UAAM,KAAK,SAAS,cAAc,IAAI;AACtC,OAAG,YAAY,aAAa,MAAM,CAAC,CAAC,CAAC;AACrC,WAAO;AAAA,EACT;AAGA,MAAK,QAAQ,KAAK,MAAM,aAAa,GAAI;AACvC,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,YAAY,aAAa,MAAM,CAAC,CAAC,CAAC;AACtC,WAAO;AAAA,EACT;AAGA,MAAK,QAAQ,KAAK,MAAM,aAAa,GAAI;AACvC,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,YAAY;AACjB,SAAK,cAAc,MAAM,CAAC;AAC1B,WAAO;AAAA,EACT;AAGA,MAAK,QAAQ,KAAK,MAAM,6BAA6B,GAAI;AACvD,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,YAAY;AACd,MAAE,OAAO,MAAM,CAAC;AAChB,MAAE,SAAS;AACX,MAAE,MAAM;AACR,MAAE,YAAY,aAAa,MAAM,CAAC,CAAC,CAAC;AACpC,WAAO;AAAA,EACT;AAGA,MAAI,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,GAAG;AAC9C,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,YAAY;AACjB,WAAO;AAAA,EACT;AAGA,SAAO,SAAS,eAAe,IAAI;AACrC;;;AChKA,IAAM,sBAA2C,CAAC,EAAE,eAAe,OAAO,WAAW,MAAM;AACzF,QAAM,KAAK,iBAAiB,eAAe,MAAM,OAAO,MAAM,IAAI;AAElE,MAAI,MAAM,MAAO,IAAG,UAAU,IAAI,GAAG,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC7E,MAAI,MAAM,MAAO,IAAG,aAAa,SAAS,MAAM,KAAK;AAGrD,QAAM,OAAO,GAAG,cAAc,sBAAsB;AACpD,MAAI,MAAM;AACR,SAAK,YAAY,WAAW,SAAS,CAAC;AAAA,EACxC;AAEA,SAAO;AACT;AAEA,IAAO,qBAAQ;;;ACff,IAAM,mBAAwC,CAAC,EAAE,OAAO,WAAW,MAAM;AACvE,QAAM,KAAK;AAAA,IACT,MAAM,SAAS;AAAA,IACf,MAAM;AAAA,IACN,MAAM,gBAAgB;AAAA,EACxB;AAEA,MAAI,MAAM,MAAO,IAAG,UAAU,IAAI,GAAG,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC7E,MAAI,MAAM,MAAO,IAAG,aAAa,SAAS,MAAM,KAAK;AAGrD,QAAM,OAAO,GAAG,cAAc,mBAAmB;AACjD,MAAI,MAAM;AACR,SAAK,YAAY,WAAW,SAAS,CAAC;AAAA,EACxC;AAEA,SAAO;AACT;AAEA,IAAO,kBAAQ;;;ACnBf,IAAM,iBAAsC,CAAC,EAAE,OAAO,WAAW,MAAM;AACrE,QAAM,QAAQ,MAAM,SAAS,MAAM,SAAS;AAC5C,QAAM,aAAa,MAAM,SAAS;AAClC,QAAM,cAAc,MAAM,SAAS;AAGnC,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AAGpB,QAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,MAAI,YAAY;AAChB,MAAI,YAAa,KAAI,UAAU,IAAI,GAAG,YAAY,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAE9E,QAAM,OAAO,MAAM,QAAQ;AAC3B,MAAI,KAAM,KAAI,YAAY,WAAW,IAAI,CAAC;AAC1C,MAAI,YAAY,SAAS,eAAe,KAAK,CAAC;AAG9C,QAAM,SAAS,YAAY,UAAU;AACrC,QAAM,OAAO,OAAO,cAAc,iBAAiB;AACnD,MAAI,MAAM;AAGR,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAClB,UAAM,YAAY,WAAW,SAAS,CAAC;AACvC,SAAK,YAAY,KAAK;AAAA,EACxB;AAEA,MAAI,iBAAiB,SAAS,MAAM;AAClC,QAAI,CAAC,OAAO,MAAM;AAChB,eAAS,KAAK,YAAY,MAAM;AAChC,aAAO,UAAU;AACjB,aAAO,iBAAiB,SAAS,MAAM;AACrC,eAAO,OAAO;AAAA,MAChB,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,IACnB;AAAA,EACF,CAAC;AAED,UAAQ,YAAY,GAAG;AACvB,UAAQ,YAAY,MAAM;AAE1B,SAAO;AACT;AAEA,IAAO,gBAAQ;;;AC9Cf,IAAM,kBAAuC,CAAC,EAAE,OAAO,WAAW,MAAM;AACtE,QAAM,MAAM,MAAM,OAAO,MAAM,QAAQ;AACvC,QAAM,QAAQ,MAAM;AACpB,QAAM,OAAO,MAAM,QAAQ;AAC3B,QAAM,SAAS,MAAM,UAAU;AAC/B,QAAM,cAAc,MAAM,SAAS;AAGnC,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AAGpB,MAAI,OAAO;AACT,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,OAAO;AACT,MAAE,SAAS;AACX,MAAE,MAAM;AACR,MAAE,YAAY;AACd,QAAI,YAAa,GAAE,UAAU,IAAI,GAAG,YAAY,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC5E,MAAE,YAAY,WAAW,IAAI,CAAC;AAC9B,MAAE,YAAY,SAAS,eAAe,KAAK,CAAC;AAC5C,YAAQ,YAAY,CAAC;AACrB,WAAO;AAAA,EACT;AAGA,QAAM,cAAc,WAAW,SAAS;AAGxC,QAAM,QAAQ,YAAY,iBAAiB,GAAG;AAC9C,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,QAAQ,UAAQ;AACpB,WAAK,UAAU,IAAI,aAAa,oBAAoB;AACpD,UAAI,YAAa,MAAK,UAAU,IAAI,GAAG,YAAY,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAAA,IACjF,CAAC;AACD,YAAQ,YAAY,WAAW;AAAA,EACjC,OAAO;AAEL,UAAM,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,OAAO;AACT,MAAE,SAAS;AACX,MAAE,MAAM;AACR,MAAE,YAAY;AACd,QAAI,YAAa,GAAE,UAAU,IAAI,GAAG,YAAY,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC5E,MAAE,YAAY,WAAW,IAAI,CAAC;AAC9B,MAAE,YAAY,WAAW;AACzB,YAAQ,YAAY,CAAC;AAAA,EACvB;AAEA,SAAO;AACT;AAEA,IAAO,iBAAQ;;;ACnDf,IAAM,gBAAqC,CAAC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,EAAE,OAAO,OAAO,MAAM,KAAK,OAAO,IAAI;AAC5C,QAAM,cAAc,MAAM,SAAS;AACnC,QAAM,iBAAiB,CAAC,CAAC,MAAM;AAC/B,QAAM,EAAE,aAAa,IAAK,WAAW,CAAC;AAEtC,QAAM,UAAU,kBAAkB;AAClC,QAAM,SAAS,kBAAkB;AAEjC,QAAM,eAAe,MAAM,QAAQ,eAAe,MAAM,KAAK,IAAI,CAAC;AAElE,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY,UAAU,WAAW,SAAS,0BAA0B,EAAE,IAAI,WAAW,GAAG,KAAK;AAGlG,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACvD,SAAK,MAAM,YAAY,KAAK,OAAO,KAAK,CAAC;AAAA,EAC3C;AAGA,MAAI,OAAO;AACT,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY,iBAAiB,eAAe,0BAA0B,EAAE;AAChF,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,MAAM;AACV,QAAI,MAAM,SAAS;AACnB,QAAI,YAAY;AAChB,YAAQ,YAAY,GAAG;AACvB,UAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,aAAS,YAAY;AACrB,YAAQ,YAAY,QAAQ;AAC5B,SAAK,YAAY,OAAO;AAAA,EAC1B;AAGA,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY,gBAAgB,QAAQ,4BAA4B,EAAE;AAGvE,MAAI,QAAQ,OAAO;AACjB,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AACnB,QAAI,MAAM;AACR,YAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,eAAS,YAAY;AACrB,eAAS,YAAY,WAAW,IAAI,CAAC;AACrC,aAAO,YAAY,QAAQ;AAAA,IAC7B;AACA,QAAI,OAAO;AACT,YAAM,KAAK,SAAS,cAAc,IAAI;AACtC,SAAG,YAAY;AACf,SAAG,cAAc;AACjB,aAAO,YAAY,EAAE;AAAA,IACvB;AACA,SAAK,YAAY,MAAM;AAAA,EACzB;AAGA,MAAI,gBAAgB;AAClB,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,YAAY;AACjB,SAAK,YAAY,WAAW,aAAa,CAAC;AAC1C,SAAK,YAAY,IAAI;AAAA,EACvB;AAGA,MAAI,kBAAkB,QAAQ;AAC5B,UAAM,cAAc,WAAW,SAAS,KAAK,WAAW,SAAS;AACjE,QAAI,YAAY,WAAW,SAAS,GAAG;AACrC,YAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,iBAAW,YAAY;AACvB,iBAAW,YAAY,WAAW;AAClC,WAAK,YAAY,UAAU;AAAA,IAC7B;AAAA,EACF;AAGA,MAAI,WAAW,QAAQ;AACrB,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AAEnB,QAAI,UAAU,KAAK;AACjB,YAAM,IAAI,SAAS,cAAc,GAAG;AACpC,QAAE,OAAO;AACT,QAAE,SAAS,UAAU;AACrB,QAAE,MAAM;AACR,QAAE,YAAY;AACd,QAAE,YAAY,WAAW,aAAa,CAAC;AACvC,QAAE,YAAY,SAAS,eAAe,OAAO,CAAC;AAC9C,aAAO,YAAY,CAAC;AAAA,IACtB,WAAW,SAAS;AAClB,YAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,eAAS,YAAY;AACrB,eAAS,YAAY,WAAW,eAAe,CAAC;AAChD,eAAS,YAAY,SAAS,eAAe,QAAQ,CAAC;AACtD,aAAO,YAAY,QAAQ;AAAA,IAC7B;AAEA,SAAK,YAAY,MAAM;AAAA,EACzB;AAEA,OAAK,YAAY,IAAI;AAGrB,MAAI,SAAS;AACX,UAAM,SAAS,YAAY,SAAS,UAAU;AAC9C,UAAM,YAAY,OAAO,cAAc,iBAAiB;AACxD,QAAI,WAAW;AAGb,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAClB,YAAM,YAAY,WAAW,SAAS,KAAK,WAAW,SAAS,CAAC;AAChE,gBAAU,YAAY,KAAK;AAAA,IAC7B;AAEA,SAAK,iBAAiB,SAAS,MAAM;AACnC,UAAI,CAAC,OAAO,MAAM;AAChB,iBAAS,KAAK,YAAY,MAAM;AAChC,eAAO,UAAU;AACjB,eAAO,iBAAiB,SAAS,MAAM,OAAO,OAAO,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,MACxE;AAAA,IACF,CAAC;AAGD,UAAM,OAAO,SAAS,uBAAuB;AAC7C,SAAK,YAAY,IAAI;AACrB,SAAK,YAAY,MAAM;AACvB,WAAO;AAAA,EACT;AAGA,MAAI,UAAU,KAAK;AACjB,SAAK,iBAAiB,SAAS,MAAM,OAAO,KAAK,KAAK,UAAU,QAAQ,CAAC;AAAA,EAC3E;AAEA,SAAO;AACT;AAEA,IAAO,eAAQ;;;AChJf,IAAM,mBAAwC,CAAC,EAAE,OAAO,WAAW,MAAM;AACvE,QAAM,KAAK,SAAS,cAAc,KAAK;AACvC,KAAG,YAAY;AAEf,MAAI,MAAM,MAAO,IAAG,UAAU,IAAI,GAAG,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC7E,MAAI,MAAM,GAAI,IAAG,KAAK,MAAM;AAG5B,MAAI,MAAM,OAAO;AACf,UAAM,SAAS,eAAe,MAAM,KAAK;AACzC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,SAAG,MAAM,YAAY,KAAK,OAAO,KAAK,CAAC;AAAA,IACzC;AAAA,EACF;AAGA,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,QAAI,IAAI,WAAW,OAAO,GAAG;AAC3B,SAAG,aAAa,KAAK,KAAK;AAAA,IAC5B;AAAA,EACF;AAEA,KAAG,YAAY,WAAW,SAAS,CAAC;AACpC,SAAO;AACT;AAEA,IAAO,kBAAQ;;;AC1Bf,IAAI,eAAe;AAEnB,IAAM,iBAAsC,CAAC;AAAA,EAC3C;AAAA,EACA;AAAA,EACA,cAAAE;AAAA,EACA;AACF,MAAM;AACJ,QAAM,aAAa,MAAM,WAAW;AACpC,QAAM,QAAQ,WACX,MAAM,IAAI,EACV,IAAI,OAAK,EAAE,KAAK,CAAC,EACjB,OAAO,OAAO;AAEjB,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,SAAS,uBAAuB;AAAA,EACzC;AAEA,QAAM,WAAW,SAAS,MAAM,YAAY,QAAQ,EAAE;AACtD,QAAM,QAAQ,SAAS,MAAM,SAAS,OAAO,EAAE;AAC/C,QAAM,WAAW,MAAM,SAAS;AAChC,QAAM,cAAc,MAAM,QAAQ,eAAe,MAAM,KAAK,IAAI,CAAC;AAEjE,QAAM,aAAa,OAAO,EAAE,YAAY;AAGxC,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,YAAY;AACtB,SAAO,OAAO,UAAU,OAAO;AAAA,IAC7B,UAAU;AAAA,IACV,UAAU;AAAA,IACV,GAAG;AAAA,EACL,CAAC;AAGD,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY;AAClB,QAAM,MAAM,aAAa,aAAa,KAAK;AAG3C,QAAM,WAA0B,CAAC;AACjC,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,YAAY,kBAAkB,UAAU,IAAI,QAAQ,GAAG,KAAK;AACpE,YAAQ,MAAM,UAAU;AACxB,YAAQ,MAAM,aAAa;AAG3B,QAAI,gBAAgB;AAClB,YAAM,SAAS,eAAe,IAAI;AAClC,cAAQ,YAAY,MAAM;AAAA,IAC5B,WAAWA,eAAc;AACvB,cAAQ,YAAYA,cAAa,IAAI,CAAC;AAAA,IACxC;AAEA,UAAM,YAAY,OAAO;AACzB,aAAS,KAAK,OAAO;AAAA,EACvB;AAEA,YAAU,YAAY,KAAK;AAG3B,MAAI,UAAU;AACd,MAAI,OAAO;AAEX,QAAM,sBAAsB,MAAM;AAChC,WAAO;AACP,eAAW,MAAM,UAAU;AACzB,aAAO,KAAK,IAAI,MAAM,GAAG,YAAY;AAAA,IACvC;AACA,QAAI,OAAO,GAAG;AACZ,gBAAU,MAAM,SAAS,GAAG,IAAI;AAChC,iBAAW,MAAM,UAAU;AACzB,WAAG,MAAM,SAAS,GAAG,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAGA,wBAAsB,MAAM;AAC1B,wBAAoB;AAEpB,QAAI,SAAS,OAAO,OAAO;AACzB,eAAS,MAAM,MAAM,KAAK,mBAAmB;AAAA,IAC/C;AAAA,EACF,CAAC;AAGD,MAAI,MAAM,SAAS,GAAG;AACpB,gBAAY,MAAM;AAChB,iBAAW,UAAU,KAAK,MAAM;AAChC,YAAM,MAAM,YAAY,cAAc,CAAC,UAAU,IAAI;AAAA,IACvD,GAAG,QAAQ;AAAA,EACb;AAEA,SAAO;AACT;AAEA,IAAO,gBAAQ;;;AC9Ff,IAAM,gBAAqC,CAAC,EAAE,OAAO,MAAM,MAAM;AAC/D,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AAEjB,MAAI,MAAM,MAAO,MAAK,UAAU,IAAI,GAAG,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC/E,MAAI,MAAM,MAAO,MAAK,aAAa,SAAS,MAAM,KAAK;AAEvD,QAAM,YAAY,MAAM,OAAO,YAAY,MAAM,IAAI,KAAK;AAE1D,QAAM,SAAS,MAAM,WAAW,IAC7B,MAAM,GAAG,EACT,IAAI,OAAK,EAAE,KAAK,CAAC,EACjB,OAAO,OAAO;AAEjB,QAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,QAAI,IAAI,GAAG;AACT,YAAM,MAAM,SAAS,cAAc,MAAM;AACzC,UAAI,YAAY;AAChB,UAAI,cAAc;AAClB,WAAK,YAAY,GAAG;AAAA,IACtB;AACA,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,YAAY,SAAS,SAAS;AAClC,QAAI,cAAc;AAClB,SAAK,YAAY,GAAG;AAAA,EACtB,CAAC;AAED,SAAO;AACT;AAEA,IAAO,eAAQ;;;ACxBf,IAAI,mBAAmB;AAEhB,IAAM,yBAA8C,CAAC,EAAE,OAAO,WAAW,MAAM;AACpF,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AAEjB,MAAI,MAAM,MAAO,MAAK,UAAU,IAAI,GAAG,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC/E,MAAI,MAAM,MAAO,MAAK,aAAa,SAAS,MAAM,KAAK;AAEvD,QAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,QAAM,OAAO;AACb,QAAM,YAAY;AAClB,MAAI,MAAM,YAAY,UAAU,MAAM,YAAY,GAAI,OAAM,UAAU;AACtE,MAAI,MAAM,MAAO,OAAM,QAAQ,MAAM;AACrC,QAAM,aAAa,cAAc,MAAM,SAAS,gBAAgB;AAEhE,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY;AAClB,QAAM,cAAc,MAAM,SAAS;AAEnC,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,UAAQ,YAAY,WAAW,SAAS,CAAC;AAEzC,OAAK,OAAO,OAAO,OAAO,OAAO;AACjC,SAAO;AACT;AAEA,IAAM,qBAA0C,CAAC,EAAE,OAAO,WAAW,MAAM;AACzE,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AAEjB,MAAI,MAAM,MAAO,MAAK,UAAU,IAAI,GAAG,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC/E,MAAI,MAAM,MAAO,MAAK,aAAa,SAAS,MAAM,KAAK;AAEvD,OAAK,YAAY,WAAW,SAAS,CAAC;AAEtC,QAAM,OAAO,MAAM,SAAS,aAAa,aAAa;AACtD,QAAM,QAAQ,UAAU,EAAE,gBAAgB;AAE1C,OAAK,iBAAmC,sBAAsB,EAAE,QAAQ,WAAS;AAC/E,UAAM,OAAO;AACb,QAAI,SAAS,QAAS,OAAM,OAAO;AAAA,EACrC,CAAC;AAED,SAAO;AACT;AAEA,IAAO,oBAAQ;;;ACnDf,IAAM,SAAS;AAEf,IAAM,oBAAyC,CAAC,EAAE,OAAO,MAAM,MAAM;AACnE,QAAM,SAAyC,CAAC;AAChD,QAAM,MAAM,MAAM,WAAW;AAC7B,MAAI;AACJ,SAAO,YAAY;AACnB,UAAQ,IAAI,OAAO,KAAK,GAAG,OAAO,MAAM;AACtC,WAAO,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,CAAC,EAAE,KAAK,KAAK,iBAAiB,CAAC;AAAA,EACtF;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,SAAS,uBAAuB;AAAA,EACzC;AAEA,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AACjB,OAAK,WAAW;AAChB,OAAK,aAAa,cAAc,gBAAgB;AAEhD,MAAI,MAAM,MAAO,MAAK,UAAU,IAAI,GAAG,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC/E,MAAI,MAAM,MAAO,MAAK,aAAa,SAAS,MAAM,KAAK;AACvD,MAAI,MAAM,MAAO,MAAK,MAAM,QAAQ,MAAM;AAC1C,MAAI,MAAM,OAAO;AACf,QAAI,MAAM,UAAU,UAAU,MAAM,UAAU,SAAS;AACrD,WAAK,MAAM,QAAQ,MAAM;AACzB,UAAI,CAAC,MAAM,MAAO,MAAK,MAAM,WAAW;AACxC,WAAK,MAAM,oBAAoB,MAAM,UAAU,UAAU,SAAS;AAClE,WAAK,MAAM,kBAAkB,MAAM,UAAU,SAAS,SAAS;AAAA,IACjE,WAAW,MAAM,UAAU,UAAU;AACnC,WAAK,MAAM,eAAe;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AACrB,MAAI,MAAM,OAAQ,UAAS,MAAM,SAAS,MAAM;AAChD,MAAI,MAAM,OAAQ,UAAS,MAAM,cAAc,MAAM;AAErD,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY;AAElB,QAAM,QAAuB,CAAC;AAC9B,aAAW,OAAO,QAAQ;AACxB,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,YAAY;AACjB,UAAM,KAAK,SAAS,cAAc,KAAK;AACvC,OAAG,MAAM,IAAI;AACb,OAAG,MAAM,IAAI;AACb,OAAG,UAAU;AACb,SAAK,YAAY,EAAE;AACnB,UAAM,YAAY,IAAI;AACtB,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,WAAS,YAAY,KAAK;AAC1B,OAAK,YAAY,QAAQ;AAEzB,QAAM,QAAQ,MAAM;AACpB,MAAI,QAAQ;AAEZ,QAAM,OAAO,CAAC,MAAc;AAC1B,aAAU,IAAI,QAAS,SAAS;AAChC,UAAM,MAAM,YAAY,eAAe,QAAQ,GAAG;AAClD,UAAM,QAAQ,CAAC,IAAI,MAAM,GAAG,UAAU,OAAO,6BAA6B,MAAM,KAAK,CAAC;AACtF,SAAK,QAAQ,CAAC,GAAG,MAAM,EAAE,UAAU,OAAO,4BAA4B,MAAM,KAAK,CAAC;AAAA,EACpF;AAEA,QAAM,OAAO,SAAS,cAAc,QAAQ;AAC5C,OAAK,YAAY;AACjB,OAAK,aAAa,cAAc,gBAAgB;AAChD,OAAK,cAAc;AACnB,OAAK,iBAAiB,SAAS,MAAM,KAAK,QAAQ,CAAC,CAAC;AAEpD,QAAM,OAAO,SAAS,cAAc,QAAQ;AAC5C,OAAK,YAAY;AACjB,OAAK,aAAa,cAAc,YAAY;AAC5C,OAAK,cAAc;AACnB,OAAK,iBAAiB,SAAS,MAAM,KAAK,QAAQ,CAAC,CAAC;AAEpD,QAAM,OAA4B,CAAC;AACnC,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,SAAO,QAAQ,CAAC,GAAG,MAAM;AACvB,UAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,QAAI,YAAY;AAChB,QAAI,aAAa,cAAc,eAAe,IAAI,CAAC,EAAE;AACrD,QAAI,iBAAiB,SAAS,MAAM,KAAK,CAAC,CAAC;AAC3C,YAAQ,YAAY,GAAG;AACvB,SAAK,KAAK,GAAG;AAAA,EACf,CAAC;AAED,OAAK,OAAO,MAAM,MAAM,OAAO;AAE/B,OAAK,iBAAiB,WAAW,CAAC,MAAM;AACtC,QAAI,EAAE,QAAQ,aAAa;AACzB,QAAE,eAAe;AACjB,WAAK,QAAQ,CAAC;AAAA,IAChB,WAAW,EAAE,QAAQ,cAAc;AACjC,QAAE,eAAe;AACjB,WAAK,QAAQ,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAED,OAAK,CAAC;AAEN,SAAO;AACT;AAEA,IAAO,mBAAQ;;;AC/Gf,IAAM,iBAAiB,CAAC,QAAQ,SAAS,OAAO,KAAK;AAErD,IAAM,qBAA0C,CAAC,EAAE,MAAM,MAAM;AAC7D,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AAEjB,MAAI,MAAM,MAAO,MAAK,UAAU,IAAI,GAAG,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC/E,MAAI,MAAM,MAAO,MAAK,aAAa,SAAS,MAAM,KAAK;AAEvD,QAAM,cAAc,MAAM,UAAU,IAAI,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC;AACpE,QAAM,SAAS,eAAe,IAAI,CAAC,OAAO,MAAM,WAAW,CAAC,KAAK,KAAK;AACtE,QAAM,SAAS,SAAS,MAAM,UAAU,KAAK,EAAE;AAE/C,QAAM,aAAa,MAAM,SAAS,IAAI,KAAK,MAAM,MAAM,EAAE,QAAQ,IAAI;AACrE,QAAM,YAAY,CAAC,OAAO,MAAM,UAAU;AAE1C,QAAM,SAAmC,CAAC;AAE1C,QAAM,UAAU,MAAgB;AAC9B,QAAI,WAAW;AACb,YAAMC,QAAO,KAAK,IAAI,GAAG,aAAa,KAAK,IAAI,CAAC;AAChD,aAAO;AAAA,QACL,KAAK,MAAMA,QAAO,KAAQ;AAAA,QAC1B,KAAK,MAAMA,QAAO,IAAO,IAAI;AAAA,QAC7B,KAAK,MAAMA,QAAO,GAAK,IAAI;AAAA,QAC3B,KAAK,MAAMA,QAAO,GAAI,IAAI;AAAA,MAC5B;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS,MAAM,QAAQ,KAAK,EAAE;AAAA,MAC9B,SAAS,MAAM,SAAS,KAAK,EAAE;AAAA,MAC/B,SAAS,MAAM,OAAO,KAAK,EAAE;AAAA,MAC7B,SAAS,MAAM,OAAO,KAAK,EAAE;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AACnB,UAAM,SAAS,QAAQ;AACvB,WAAO,QAAQ,CAAC,OAAO,MAAM;AAC3B,YAAM,IAAI,OAAO,OAAO,CAAC,CAAC;AAC1B,YAAM,MAAM,MAAM,YAAY,WAAW,CAAC;AAC1C,YAAM,MAAM,aAAa,cAAc,CAAC;AACxC,YAAM,MAAM,cAAc;AAAA,IAC5B,CAAC;AAAA,EACH;AAEA,SAAO,QAAQ,WAAS;AACtB,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAElB,UAAM,QAAQ,SAAS,cAAc,MAAM;AAC3C,UAAM,YAAY;AAClB,UAAM,MAAM,YAAY,YAAY,OAAO,MAAM,CAAC;AAClD,UAAM,aAAa,aAAa,QAAQ;AACxC,UAAM,aAAa,cAAc,GAAG;AACpC,UAAM,cAAc;AAEpB,UAAM,UAAU,SAAS,cAAc,MAAM;AAC7C,YAAQ,YAAY;AACpB,YAAQ,cAAc;AAEtB,UAAM,OAAO,OAAO,OAAO;AAC3B,SAAK,YAAY,KAAK;AACtB,WAAO,KAAK,EAAE,MAAM,CAAC;AAAA,EACvB,CAAC;AAED,SAAO;AACP,MAAI,UAAW,aAAY,QAAQ,GAAI;AAEvC,SAAO;AACT;AAEA,IAAO,oBAAQ;;;AChEf,IAAMC,UAAS;AAEf,IAAM,gBAAqC,CAAC,EAAE,OAAO,MAAM,MAAM;AAC/D,MAAI,UAAU,MAAM,UAAU,IAAI,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK;AACrD,MAAI,SAAS,MAAM,SAAS,IAAI,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK;AAEnD,MAAI,CAAC,UAAU,CAAC,OAAO;AACrB,UAAM,OAAiB,CAAC;AACxB,UAAM,MAAM,MAAM,WAAW;AAC7B,QAAI;AACJ,IAAAA,QAAO,YAAY;AACnB,YAAQ,IAAIA,QAAO,KAAK,GAAG,OAAO,MAAM;AACtC,WAAK,KAAK,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC;AAAA,IACrC;AACA,QAAI,CAAC,UAAU,KAAK,SAAS,EAAG,UAAS,KAAK,CAAC;AAC/C,QAAI,CAAC,SAAS,KAAK,SAAS,EAAG,SAAQ,KAAK,CAAC;AAAA,EAC/C;AAEA,MAAI,CAAC,UAAU,CAAC,OAAO;AACrB,WAAO,SAAS,uBAAuB;AAAA,EACzC;AAEA,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,YAAY;AACnB,SAAO,WAAW;AAClB,SAAO,aAAa,cAAc,yBAAyB;AAE3D,MAAI,MAAM,MAAO,QAAO,UAAU,IAAI,GAAG,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AACjF,MAAI,MAAM,MAAO,QAAO,aAAa,SAAS,MAAM,KAAK;AACzD,MAAI,MAAM,OAAQ,QAAO,MAAM,cAAc,MAAM;AACnD,MAAI,MAAM,OAAQ,QAAO,MAAM,SAAS,MAAM;AAC9C,MAAI,MAAM,MAAO,QAAO,MAAM,QAAQ,MAAM;AAC5C,MAAI,MAAM,OAAO;AACf,QAAI,MAAM,UAAU,UAAU,MAAM,UAAU,SAAS;AACrD,aAAO,MAAM,QAAQ,MAAM;AAC3B,UAAI,CAAC,MAAM,MAAO,QAAO,MAAM,WAAW;AAC1C,aAAO,MAAM,oBAAoB,MAAM,UAAU,UAAU,SAAS;AACpE,aAAO,MAAM,kBAAkB,MAAM,UAAU,SAAS,SAAS;AAAA,IACnE,WAAW,MAAM,UAAU,UAAU;AACnC,aAAO,MAAM,eAAe;AAAA,IAC9B;AAAA,EACF;AAEA,QAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,aAAW,YAAY;AACvB,aAAW,aAAa,QAAQ,KAAK;AACrC,aAAW,WAAW;AACtB,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,MAAM;AAChB,YAAU,MAAM;AAChB,aAAW,YAAY,SAAS;AAEhC,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,YAAY;AACtB,YAAU,aAAa,QAAQ,KAAK;AACpC,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,MAAM;AACf,WAAS,MAAM;AACf,YAAU,YAAY,QAAQ;AAE9B,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,UAAQ,aAAa,cAAc,iBAAiB;AACpD,UAAQ,QAAQ;AAEhB,SAAO,OAAO,YAAY,WAAW,OAAO;AAE5C,MAAI,MAAM;AAEV,QAAM,WAAW,MAAM;AACrB,WAAO,MAAM,YAAY,iBAAiB,GAAG,GAAG,GAAG;AAAA,EACrD;AAEA,QAAM,oBAAoB,CAAC,YAAoB;AAC7C,UAAM,OAAO,OAAO,sBAAsB;AAC1C,QAAI,KAAK,UAAU,EAAG;AACtB,UAAM,KAAK,IAAI,KAAK,KAAK,IAAI,IAAK,UAAU,KAAK,QAAQ,KAAK,QAAS,GAAG,CAAC;AAC3E,aAAS;AAAA,EACX;AAEA,UAAQ,iBAAiB,eAAe,CAAC,MAAM;AAC7C,MAAE,eAAe;AACjB,YAAQ,kBAAkB,EAAE,SAAS;AACrC,sBAAkB,EAAE,OAAO;AAAA,EAC7B,CAAC;AAED,UAAQ,iBAAiB,eAAe,CAAC,MAAM;AAC7C,QAAI,EAAE,UAAU,EAAG,mBAAkB,EAAE,OAAO;AAAA,EAChD,CAAC;AAED,UAAQ,iBAAiB,aAAa,CAAC,MAAM;AAC3C,QAAI,QAAQ,kBAAkB,EAAE,SAAS,GAAG;AAC1C,cAAQ,sBAAsB,EAAE,SAAS;AAAA,IAC3C;AAAA,EACF,CAAC;AAED,SAAO,iBAAiB,SAAS,CAAC,MAAM;AACtC,QAAI,EAAE,WAAW,QAAS;AAC1B,sBAAkB,EAAE,OAAO;AAAA,EAC7B,CAAC;AAED,SAAO,iBAAiB,WAAW,CAAC,MAAM;AACxC,QAAI,EAAE,QAAQ,eAAe,EAAE,QAAQ,aAAc;AACrD,MAAE,eAAe;AACjB,UAAM,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,OAAO,EAAE,QAAQ,eAAe,IAAI,GAAG,CAAC;AACxE,aAAS;AAAA,EACX,CAAC;AAED,WAAS;AAET,SAAO;AACT;AAEA,IAAO,eAAQ;;;ACzHf,IAAM,mBAAwC,CAAC,EAAE,OAAO,WAAW,MAAM;AACvE,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,YAAY;AAEtB,MAAI,MAAM,MAAO,WAAU,UAAU,IAAI,GAAG,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AACpF,MAAI,MAAM,MAAO,WAAU,aAAa,SAAS,MAAM,KAAK;AAE5D,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY;AAClB,QAAM,YAAY,WAAW,SAAS,CAAC;AACvC,YAAU,YAAY,KAAK;AAG3B,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAU,YAAY,SAAS,cAAc,KAAK,CAAC;AAAA,EACrD;AAEA,SAAO;AACT;AAEA,IAAO,kBAAQ;;;ACnBf,IAAMC,UAAS;AAEf,IAAM,wBAA6C,CAAC,EAAE,OAAO,MAAM,MAAM;AACvE,QAAM,SAAyC,CAAC;AAChD,QAAM,MAAM,MAAM,WAAW;AAC7B,MAAI;AACJ,EAAAA,QAAO,YAAY;AACnB,UAAQ,IAAIA,QAAO,KAAK,GAAG,OAAO,MAAM;AACtC,WAAO,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,CAAC,EAAE,KAAK,KAAK,gBAAgB,CAAC;AAAA,EACrF;AAEA,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,SAAS,uBAAuB;AAAA,EACzC;AAEA,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,YAAY;AACnB,MAAI,MAAM,OAAQ,QAAO,MAAM,cAAc,MAAM;AAEnD,MAAI,MAAM,MAAO,QAAO,UAAU,IAAI,GAAG,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AACjF,MAAI,MAAM,MAAO,QAAO,aAAa,SAAS,MAAM,KAAK;AAEzD,aAAW,OAAO,QAAQ;AACxB,UAAM,KAAK,SAAS,cAAc,KAAK;AACvC,OAAG,MAAM,IAAI;AACb,OAAG,MAAM,IAAI;AACb,OAAG,UAAU;AACb,WAAO,YAAY,EAAE;AAAA,EACvB;AAEA,SAAO;AACT;AAEA,IAAO,uBAAQ;;;AC9BR,IAAM,oBAAyC,CAAC,EAAE,OAAO,WAAW,MAAM;AAC/E,QAAM,OAAO,MAAM,SAAS,QAAQ,QAAQ;AAC5C,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY,oBAAoB,IAAI;AAEzC,MAAI,MAAM,MAAO,MAAK,UAAU,IAAI,GAAG,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC/E,MAAI,MAAM,MAAO,MAAK,aAAa,SAAS,MAAM,KAAK;AAEvD,QAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,SAAO,YAAY;AACnB,MAAI,MAAM,MAAM;AACd,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,YAAY;AACjB,SAAK,cAAc,MAAM;AACzB,WAAO,YAAY,IAAI;AAAA,EACzB;AACA,MAAI,MAAM,MAAM;AACd,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,YAAY;AACjB,SAAK,cAAc,MAAM;AACzB,WAAO,YAAY,IAAI;AAAA,EACzB;AACA,MAAI,OAAO,WAAW,SAAS,EAAG,MAAK,YAAY,MAAM;AAEzD,MAAI,MAAM,QAAQ;AAChB,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AACnB,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,MAAM,MAAM;AAChB,QAAI,MAAM,MAAM,QAAQ;AACxB,WAAO,YAAY,GAAG;AACtB,SAAK,YAAY,MAAM;AAAA,EACzB;AAEA,QAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,SAAO,YAAY,kBAAkB,MAAM,QAAQ,qBAAqB,MAAM,KAAK,KAAK,EAAE;AAC1F,SAAO,YAAY,WAAW,SAAS,CAAC;AACxC,OAAK,YAAY,MAAM;AAEvB,MAAI,MAAM,QAAQ;AAChB,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AACnB,WAAO,cAAc,MAAM;AAC3B,SAAK,YAAY,MAAM;AAAA,EACzB;AAEA,SAAO;AACT;AAEA,IAAM,gBAAqC,CAAC,EAAE,OAAO,WAAW,MAAM;AACpE,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY;AAEjB,MAAI,MAAM,MAAO,MAAK,UAAU,IAAI,GAAG,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC/E,MAAI,MAAM,MAAO,MAAK,aAAa,SAAS,MAAM,KAAK;AAEvD,OAAK,YAAY,WAAW,SAAS,CAAC;AACtC,SAAO;AACT;AAEA,IAAO,eAAQ;;;ACxDR,SAAS,eAAe,WAAoC;AACjE,MAAI,CAAC,UAAW,QAAO,CAAC;AACxB,QAAM,WAA2B,CAAC;AAClC,aAAW,QAAQ,UAAU,MAAM,GAAG,GAAG;AACvC,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,QAAS;AACd,UAAM,MAAM,QAAQ,QAAQ,GAAG;AAC/B,QAAI,QAAQ,GAAI;AAChB,UAAM,YAAY,QAAQ,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,QAAQ,QAAQ,EAAE;AACjE,UAAM,SAAS,QAAQ,MAAM,MAAM,CAAC,EAAE,KAAK;AAC3C,QAAI,aAAa,OAAQ,UAAS,KAAK,EAAE,WAAW,OAAO,CAAC;AAAA,EAC9D;AACA,SAAO;AACT;AAEO,SAAS,cAAc,IAAiB,WAA0B;AACvE,aAAW,EAAE,WAAW,OAAO,KAAK,eAAe,SAAS,GAAG;AAC7D,OAAG,iBAAiB,WAAW,CAAC,MAAM;AACpC,YAAM,KAAM,OAA8C,MAAM;AAChE,UAAI,OAAO,OAAO,YAAY;AAC5B,QAAC,GAA8C,KAAK,IAAI,CAAC;AAAA,MAC3D;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACtBO,IAAM,wBAA6C,CAAC,EAAE,OAAO,WAAW,MAAM;AACnF,QAAM,KAAK,SAAS,cAAc,IAAI;AACtC,KAAG,YAAY;AAEf,MAAI,MAAM,MAAO,IAAG,UAAU,IAAI,GAAG,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC7E,MAAI,MAAM,MAAO,IAAG,aAAa,SAAS,MAAM,KAAK;AAErD,MAAI,MAAM,OAAO;AACf,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAClB,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,MAAM,MAAM;AAChB,QAAI,MAAM,MAAM,SAAS;AACzB,QAAI,UAAU;AACd,UAAM,YAAY,GAAG;AACrB,OAAG,YAAY,KAAK;AAAA,EACtB;AAEA,MAAI,MAAM,SAAS,MAAM,UAAU;AACjC,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,YAAY;AACjB,QAAI,MAAM,OAAO;AACf,YAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,YAAM,YAAY;AAClB,YAAM,cAAc,MAAM;AAC1B,WAAK,YAAY,KAAK;AAAA,IACxB;AACA,QAAI,MAAM,UAAU;AAClB,YAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,eAAS,YAAY;AACrB,eAAS,cAAc,MAAM;AAC7B,WAAK,YAAY,QAAQ;AAAA,IAC3B;AACA,OAAG,YAAY,IAAI;AAAA,EACrB;AAEA,QAAM,WAAW,WAAW,SAAS;AACrC,MAAI,SAAS,WAAW,SAAS,GAAG;AAClC,UAAM,OAAO,SAAS,cAAc,GAAG;AACvC,SAAK,YAAY;AACjB,SAAK,YAAY,QAAQ;AACzB,OAAG,YAAY,IAAI;AAAA,EACrB;AAEA,QAAM,UAAU;AAAA,IACd,EAAE,MAAM,MAAM,MAAM,KAAK,MAAM,KAAK,OAAO,MAAM,MAAM;AAAA,IACvD,EAAE,MAAM,MAAM,OAAO,KAAK,MAAM,MAAM,OAAO,MAAM,OAAO;AAAA,EAC5D,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI;AAExB,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,aAAa,SAAS,cAAc,KAAK;AAC/C,eAAW,YAAY;AACvB,eAAW,EAAE,MAAM,KAAK,MAAM,KAAK,SAAS;AAC1C,YAAM,MAAM,SAAS,cAAc,QAAQ;AAC3C,UAAI,YAAY;AAChB,UAAI,OAAO;AACX,UAAI,aAAa,cAAc,IAAc;AAC7C,UAAI,YAAY,WAAW,IAAc,CAAC;AAC1C,UAAI,OAAO;AACT,sBAAc,KAAK,KAAK;AAAA,MAC1B,WAAW,KAAK;AACd,YAAI,iBAAiB,SAAS,MAAM,OAAO,KAAK,KAAe,QAAQ,CAAC;AAAA,MAC1E;AACA,iBAAW,YAAY,GAAG;AAAA,IAC5B;AACA,OAAG,YAAY,UAAU;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,IAAM,oBAAyC,CAAC,EAAE,OAAO,WAAW,MAAM;AACxE,QAAM,KAAK,SAAS,cAAc,IAAI;AACtC,KAAG,YAAY;AAEf,MAAI,MAAM,MAAO,IAAG,UAAU,IAAI,GAAG,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC7E,MAAI,MAAM,MAAO,IAAG,aAAa,SAAS,MAAM,KAAK;AAErD,KAAG,YAAY,WAAW,SAAS,CAAC;AACpC,SAAO;AACT;AAEA,IAAO,mBAAQ;;;AC7Ff,IAAM,gBAAqC,CAAC,EAAE,MAAM,MAAM;AACxD,QAAM,aAAa,MAAM,QAAQ,aAAa,MAAM,KAAK,KAAK;AAC9D,QAAM,OAAO,SAAS,cAAc,KAAK;AACzC,OAAK,YAAY,UAAU,UAAU;AAErC,MAAI,MAAM,MAAO,MAAK,UAAU,IAAI,GAAG,MAAM,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO,CAAC;AAC/E,MAAI,MAAM,MAAO,MAAK,aAAa,SAAS,MAAM,KAAK;AAEvD,MAAI,MAAM,MAAM;AACd,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,YAAY;AACnB,WAAO,YAAY,WAAW,MAAM,IAAI,CAAC;AACzC,SAAK,YAAY,MAAM;AAAA,EACzB;AAEA,MAAI,MAAM,OAAO;AACf,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAClB,UAAM,cAAc,MAAM;AAC1B,SAAK,YAAY,KAAK;AAAA,EACxB;AAEA,MAAI,MAAM,OAAO;AACf,UAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,UAAM,YAAY;AAClB,UAAM,cAAc,MAAM;AAC1B,SAAK,YAAY,KAAK;AAAA,EACxB;AAEA,MAAI,MAAM,MAAM;AACd,UAAM,OAAO,SAAS,cAAc,KAAK;AACzC,SAAK,YAAY;AACjB,SAAK,cAAc,MAAM;AACzB,SAAK,YAAY,IAAI;AAAA,EACvB;AAEA,SAAO;AACT;AAEA,IAAO,eAAQ;;;ACiBf,IAAM,oBAAyD;AAAA;AAAA,EAE7D,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,WAAW;AAAA;AAAA,EAEX,MAAM;AAAA,EACN,UAAU;AAAA,EACV,UAAU;AAAA;AAAA,EAEV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA;AAAA,EAER,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA;AAAA,EAEL,OAAO;AAAA;AAAA,EAEP,MAAM;AAAA,EACN,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV,WAAW;AAAA,EACX,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,aAAa;AAAA,EACb,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,MAAM;AACR;AAEA,IAAO,qBAAQ;;;AChFR,SAAS,aAAa,QAA8B;AACzD,QAAM,UAAU,SAAS,cAAc,SAAS;AAChD,UAAQ,YAAY;AAEpB,QAAM,MAA4B;AAAA,IAChC;AAAA,IACA,gBAAgB,CAAC,QAAQ,kBAAkB,KAAK,GAAG;AAAA,IACnD;AAAA,IACA,gBAAgB,CAAC,OAAe,kBAAkB,cAAc,EAAE,GAAG,GAAG;AAAA,EAC1E;AAEA,UAAQ,YAAY,gBAAgB,QAAQ,KAAK,MAAM,CAAC;AACxD,SAAO;AACT;AAKO,SAAS,qBAAqBC,WAA+B;AAClE,QAAM,SAAS,cAAcA,SAAQ;AACrC,SAAO,aAAa,MAAM;AAC5B;AAOO,SAAS,iBAAiB,MAA2B;AAC1D,MAAI,mBAAmB;AAGvB,qBAAmB,iBAAiB;AAAA,IAClC;AAAA,IACA,CAAC,QAAgB,eAAuB;AACtC,YAAM,UAAU,SAAS,cAAc,OAAO;AAC9C,cAAQ,aAAa,kBAAkB,EAAE;AACzC,cAAQ,cAAc;AACtB,eAAS,KAAK,YAAY,OAAO;AACjC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,UAAQ,YAAY;AACpB,UAAQ,YAAY;AAGpB,QAAM,UAAU,QAAQ,iBAAiB,QAAQ;AACjD,UAAQ,QAAQ,eAAa;AAC3B,UAAM,YAAY,SAAS,cAAc,QAAQ;AACjD,UAAM,KAAK,UAAU,UAAU,EAAE;AAAA,MAAQ,UACvC,UAAU,aAAa,KAAK,MAAM,KAAK,KAAK;AAAA,IAC9C;AACA,cAAU,cAAc,UAAU;AAClC,cAAU,YAAY,aAAa,WAAW,SAAS;AAAA,EACzD,CAAC;AAED,SAAO;AACT;AAKA,SAAS,kBAAkB,QAAiB,KAAwC;AAClF,QAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,YAAU,YAAY,gBAAgB,QAAQ,KAAK,MAAM,CAAC;AAC1D,SAAO;AACT;AAKA,SAAS,gBACP,UACA,KACA,aACkB;AAClB,QAAM,WAAW,SAAS,uBAAuB;AACjD,MAAI,IAAI;AAGR,QAAM,qBAA6C;AAAA,IACjD,MAAM;AAAA,IACN,UAAU;AAAA,IACV,UAAU;AAAA,IACV,MAAM;AAAA,EACR;AAEA,QAAM,YAAY,CAAC,cACjB,CAAC,CAAC,aACF,UAAU,SAAS,eACnB,OAAO,UAAU,eAAe,KAAK,oBAAoB,UAAU,aAAa;AAElF,SAAO,IAAI,SAAS,QAAQ;AAC1B,UAAM,KAAK,SAAS,CAAC;AAGrB,QAAI,UAAU,EAAE,GAAG;AACjB,YAAM,QAAiB,CAAC;AACxB,aAAO,IAAI,SAAS,UAAU,UAAU,SAAS,CAAC,CAAC,GAAG;AACpD,cAAM,KAAK,SAAS,CAAC,CAAC;AACtB;AAAA,MACF;AAEA,UAAI,MAAM,WAAW,KAAM,MAAM,CAAC,EAAqB,OAAO,UAAU,OAAO;AAC7E,mBAAW,QAAQ,OAAO;AACxB,gBAAM,WAAW,cAAc,MAAM,KAAK,WAAW;AACrD,cAAI,SAAU,UAAS,YAAY,QAAQ;AAAA,QAC7C;AAAA,MACF,OAAO;AACL,cAAM,OAAO,SAAS,cAAc,KAAK;AACzC,aAAK,YAAY,mBAAoB,MAAM,CAAC,EAAqB,aAAa;AAC9E,mBAAW,QAAQ,OAAO;AACxB,gBAAM,WAAW,cAAc,MAAM,KAAK,WAAW;AACrD,cAAI,SAAU,MAAK,YAAY,QAAQ;AAAA,QACzC;AACA,iBAAS,YAAY,IAAI;AAAA,MAC3B;AAAA,IACF,OAAO;AACL,YAAM,WAAW,cAAc,IAAI,KAAK,WAAW;AACnD,UAAI,SAAU,UAAS,YAAY,QAAQ;AAC3C;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,cACP,SACA,KACA,aACa;AACb,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK,UAAU;AACb,YAAM,MAAM,IAAI,QAAQ,KAAK;AAC7B,UAAI,OAAO,QAAQ;AAGnB,YAAM,cAAc,KAAK,MAAM,sBAAsB;AACrD,YAAM,aAAa,KAAK,MAAM,sBAAsB;AACpD,UAAI,YAAa,QAAO,YAAY,CAAC;AAAA,eAC5B,WAAY,QAAO,WAAW,CAAC;AAExC,YAAM,IAAI,SAAS,cAAc,GAAG;AACpC,QAAE,KAAK,QAAQ;AACf,UAAI,MAAM,OAAO,QAAQ,KAAK;AAC9B,UAAI,YAAa,QAAO;AACxB,UAAI,WAAY,QAAO;AACvB,UAAI,QAAQ,QAAS,QAAO,IAAI,QAAQ,OAAO;AAC/C,QAAE,YAAY;AACd,QAAE,YAAY,aAAa,IAAI,CAAC;AAChC,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,aAAa;AAChB,YAAM,IAAI,SAAS,cAAc,GAAG;AACpC,UAAI,MAAM;AACV,UAAI,QAAQ,QAAS,QAAO,IAAI,QAAQ,OAAO;AAC/C,UAAI,QAAQ,MAAO,QAAO,SAAS,QAAQ,KAAK;AAChD,QAAE,YAAY;AACd,UAAI,QAAQ,GAAI,GAAE,KAAK,QAAQ;AAE/B,YAAM,QAAQ,QAAQ,QAAQ,MAAM,IAAI;AACxC,eAAS,KAAK,GAAG,KAAK,MAAM,QAAQ,MAAM;AACxC,cAAM,OAAO,MAAM,EAAE;AACrB,cAAM,iBAAiB,KAAK,MAAM,iBAAiB;AACnD,YAAI,gBAAgB;AAClB,YAAE,YAAY,aAAa,eAAe,CAAC,CAAC,CAAC;AAC7C,YAAE,YAAY,SAAS,cAAc,IAAI,CAAC;AAAA,QAC5C,OAAO;AACL,YAAE,YAAY,aAAa,IAAI,CAAC;AAChC,cAAI,KAAK,MAAM,SAAS,GAAG;AACzB,cAAE,YAAY,SAAS,eAAe,GAAG,CAAC;AAAA,UAC5C;AAAA,QACF;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK;AACH,aAAO,gBAAgB,QAAQ,SAAS,QAAQ,UAAU,QAAQ,KAAK;AAAA,IAEzE,KAAK;AACH,aAAO,gBAAgB,SAAS,KAAK,WAAW;AAAA,IAElD,KAAK,QAAQ;AACX,YAAM,KAAK;AACX,aAAO,iBAAiB,GAAG,OAAO;AAAA,IACpC;AAAA,IAEA,KAAK,cAAc;AACjB,YAAM,YAAY;AAClB,YAAM,WAAW,eAAe,UAAU,KAAK;AAE/C,YAAM,KAAK,SAAS,cAAc,UAAU,GAAG;AAE/C,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,YAAI,QAAQ,WAAW,OAAO,UAAU,UAAU;AAChD,qBAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,eAAG,MAAM,YAAY,MAAM,OAAO,GAAG,CAAC;AAAA,UACxC;AAAA,QACF,WAAW,UAAU,MAAM;AACzB,aAAG,aAAa,KAAK,EAAE;AAAA,QACzB,OAAO;AACL,aAAG,aAAa,KAAK,OAAO,KAAK,CAAC;AAAA,QACpC;AAAA,MACF;AAGA,YAAM,YAAY,gBAAgB,UAAU,UAAU,KAAK,WAAW;AACtE,SAAG,YAAY,SAAS;AACxB,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,SAAS;AACZ,YAAM,MAAM,SAAS,cAAc,KAAK;AACxC,UAAI,MAAM,QAAQ;AAClB,UAAI,MAAM,QAAQ;AAClB,UAAI,YAAY;AAChB,UAAI,QAAQ,OAAO;AACjB,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,KAAK,GAAG;AACxD,cAAI,MAAM,YAAY,KAAK,OAAO,KAAK,CAAC;AAAA,QAC1C;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK;AACH,aAAO,YAAY,QAAQ,SAAS,YAAY;AAAA,IAElD,KAAK;AACH,aAAO,WAAW,QAAQ,SAAS,YAAY;AAAA,IAEjD,KAAK;AACH,aAAO,iBAAiB,QAAQ,SAAS,QAAQ,SAAS,YAAY;AAAA,IAExE,KAAK,MAAM;AACT,YAAM,KAAK,SAAS,cAAc,IAAI;AACtC,SAAG,YAAY;AACf,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,OAAO;AACV,YAAM,UAAU,YAAY,OAAO,CAAC,MAAuC,EAAE,SAAS,QAAQ;AAC9F,aAAO,UAAU,QAAQ,IAAI,QAAM,EAAE,OAAO,EAAE,OAAO,MAAM,EAAE,MAAM,IAAI,EAAE,GAAG,EAAE,GAAG,YAAY;AAAA,IAC/F;AAAA,IAEA;AACE,aAAO;AAAA,EACX;AACF;AAKA,SAAS,gBACP,SACA,KACA,aACa;AACb,QAAM,EAAE,eAAe,OAAO,OAAO,QAAQ,IAAI;AAEjD,QAAM,WAAW,mBAAkB,aAAa;AAGhD,QAAM,aAAa,CAAC,SAAmC;AACrD,UAAM,OAAO,SAAS,uBAAuB;AAC7C,UAAM,cAAc,MAAM,IAAI;AAC9B,QAAI,CAAC,YAAa,QAAO;AACzB,UAAM,SAAS,IAAI,cAAc,WAAW;AAC5C,SAAK,YAAY,IAAI,eAAe,MAAM,CAAC;AAC3C,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiC;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,gBAAgB,IAAI;AAAA,EACtB;AAEA,MAAI,UAAU;AACZ,WAAO,SAAS,cAAc;AAAA,EAChC;AAGA,QAAM,WAAW,SAAS,cAAc,KAAK;AAC7C,WAAS,YAAY;AACrB,WAAS,YAAY,WAAW,SAAS,CAAC;AAC1C,SAAO;AACT;;;AzBxRS;AA3BT,IAAM,yBAAgE,CAAC,EAAE,QAAQ,MAAM;AACrF,QAAM,mBAAe,sBAAuB,IAAI;AAEhD,+BAAU,MAAM;AACd,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,UAAW;AAGhB,cAAU,gBAAgB;AAC1B,cAAU,YAAY,qBAAqB,OAAO,CAAC;AAGnD,oBAAgB;AAGhB,UAAM,mBAAmB,MAAM;AAC7B,YAAM,OAAO,OAAO,SAAS;AAC7B,UAAI,MAAM;AACR,cAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,mBAAW,MAAM,MAAM,SAAS,CAAC,CAAC;AAAA,MACpC;AAAA,IACF;AACA,qBAAiB;AACjB,WAAO,iBAAiB,cAAc,gBAAgB;AACtD,WAAO,MAAM,OAAO,oBAAoB,cAAc,gBAAgB;AAAA,EACxE,GAAG,CAAC,OAAO,CAAC;AAEZ,SAAO,4CAAC,SAAI,KAAK,cAAc;AACjC;AAEA,IAAO,iCAAQ;;;A0BjDf,IAAAC,gBAA4D;AAC5D,uBAA6B;;;ACatB,IAAM,YAA0B;AAAA,EACrC;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,MAAM;AAAA,EACR;AACF;;;AD3JM,IAAAC,sBAAA;AAxFN,IAAM,QAA8B,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AACX,MAAM;AACJ,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,EAAE;AACrC,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAwB,IAAI;AAChE,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAkC,CAAC,CAAC;AACtE,QAAM,iBAAa,sBAAuB,IAAI;AAE9C,QAAM,aAAS,uBAAQ,MAAM;AAC3B,UAAM,MAAM,oBAAI,IAA0B;AAC1C,eAAW,KAAK,WAAW;AACzB,YAAM,MAAM,IAAI,IAAI,EAAE,QAAQ,KAAK,CAAC;AACpC,UAAI,KAAK,CAAC;AACV,UAAI,IAAI,EAAE,UAAU,GAAG;AAAA,IACzB;AACA,WAAO,CAAC,GAAG,IAAI,QAAQ,CAAC;AAAA,EAC1B,GAAG,CAAC,CAAC;AAEL,QAAM,eAAW,uBAAQ,MAAM;AAC7B,UAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,QAAI,CAAC,EAAG,QAAO;AACf,WAAO,OACJ,IAAI,CAAC,CAAC,KAAK,OAAO,MAAM;AAAA,MACvB;AAAA,MACA,QAAQ;AAAA,QACN,CAAC,MACC,EAAE,MAAM,YAAY,EAAE,SAAS,CAAC,KAChC,EAAE,GAAG,YAAY,EAAE,SAAS,CAAC,KAC7B,EAAE,SAAS,YAAY,EAAE,SAAS,CAAC,KACnC,EAAE,GAAG,MAAM,GAAG,GAAG,EAAE,YAAY,EAAE,SAAS,CAAC;AAAA,MAC/C;AAAA,IACF,CAAU,EACT,OAAO,CAAC,CAAC,EAAE,OAAO,MAAM,QAAQ,SAAS,CAAC;AAAA,EAC/C,GAAG,CAAC,QAAQ,KAAK,CAAC;AAElB,QAAM,eAAW;AAAA,IACf,MAAM,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,UAAU,KAAK;AAAA,IACpD,CAAC,UAAU;AAAA,EACb;AAEA,+BAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,aAAS,EAAE;AACX,QAAI,CAAC,YAAY;AACf,YAAM,UACJ,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,gBAAgB,KAC/C,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,cAAc,KAC7C,UAAU,CAAC;AACb,oBAAc,SAAS,MAAM,IAAI;AAAA,IACnC;AAAA,EAEF,GAAG,CAAC,IAAI,CAAC;AAET,+BAAU,MAAM;AACd,QAAI,CAAC,KAAM;AAEX,UAAM,OAAO,SAAS,KAAK,MAAM;AACjC,aAAS,KAAK,MAAM,WAAW;AAC/B,WAAO,MAAM;AACX,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,+BAAU,MAAM;AACd,QAAI,CAAC,KAAM;AAEX,eAAW,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC;AAAA,EACzC,GAAG,CAAC,YAAY,IAAI,CAAC;AAErB,+BAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,QAAQ,CAAC,MAAqB;AAClC,UAAI,EAAE,QAAQ,SAAU,SAAQ;AAAA,IAClC;AACA,WAAO,iBAAiB,WAAW,KAAK;AACxC,WAAO,MAAM,OAAO,oBAAoB,WAAW,KAAK;AAAA,EAC1D,GAAG,CAAC,MAAM,OAAO,CAAC;AAElB,MAAI,CAAC,KAAM,QAAO;AAElB,QAAM,iBAAiB,CAAC,QACtB,aAAa,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,EAAE,EAAE;AAEzD,aAAO;AAAA,IACL,8CAAC,SAAI,WAAU,YAAW,MAAK,UAAS,cAAW,QAAO,cAAW,uBACnE;AAAA,mDAAC,SAAI,WAAU,qBAAoB,SAAS,SAAS;AAAA,MACrD,8CAAC,SAAI,WAAU,mBACb;AAAA,sDAAC,YAAO,WAAU,kBAChB;AAAA,uDAAC,UAAK,WAAU,wBAAuB,uBAAS;AAAA,UAChD,6CAAC,QAAG,iCAAgB;AAAA,UACnB,UACC;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,MAAK;AAAA,cACL,aAAY;AAAA,cACZ,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA;AAAA,UAC1C;AAAA,UAEF;AAAA,YAAC;AAAA;AAAA,cACC,WAAU;AAAA,cACV,SAAS;AAAA,cACT,cAAW;AAAA,cACZ;AAAA;AAAA,UAED;AAAA,WACF;AAAA,QACA,8CAAC,SAAI,WAAU,kBACb;AAAA,wDAAC,SAAI,WAAU,iBACZ;AAAA,qBAAS,IAAI,CAAC,CAAC,KAAK,OAAO,MAC1B,8CAAC,SAAI,WAAU,iBACb;AAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAU;AAAA,kBACV,SAAS,MAAM,eAAe,GAAG;AAAA,kBAEjC;AAAA,iEAAC,UAAK,WAAU,8CACb,oBAAU,GAAG,IAAI,kBAAkB,eACtC;AAAA,oBACC;AAAA;AAAA;AAAA,cACH;AAAA,cACC,CAAC,UAAU,GAAG,KACb,6CAAC,QAAG,WAAU,mBACX,kBAAQ,IAAI,CAAC,MACZ,6CAAC,QACC;AAAA,gBAAC;AAAA;AAAA,kBACC,WAAW,iBACT,eAAe,EAAE,KAAK,4BAA4B,EACpD;AAAA,kBACA,SAAS,MAAM,cAAc,EAAE,EAAE;AAAA,kBAEhC;AAAA,sBAAE,QACD,6CAAC,UAAK,WAAU,4CACb,YAAE,MACL;AAAA,oBAED,EAAE;AAAA;AAAA;AAAA,cACL,KAbO,EAAE,EAcX,CACD,GACH;AAAA,iBA7BgC,GA+BpC,CACD;AAAA,YACA,SAAS,WAAW,KACnB,8CAAC,SAAI,WAAU,mBAAkB;AAAA;AAAA,cAAsB;AAAA,cAAM;AAAA,eAAE;AAAA,aAEnE;AAAA,UACA,6CAAC,SAAI,WAAU,qBAAoB,KAAK,YACrC,qBACC,6CAAC,kCAAyC,SAAS,SAAS,MAA/B,SAAS,EAA0B,IAEhE,6CAAC,SAAI,WAAU,mBAAkB,mDAEjC,GAEJ;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,IACA,SAAS;AAAA,EACX;AACF;AAEA,IAAO,gBAAQ;;;A/BmbH,IAAAC,sBAAA;AA/kBZ,IAAM,2BAA2B,gCAAe,OAAO;AAAA,EACrD,EAAE,KAAK,kBAAAC,KAAE,SAAS,YAAY,QAAQ,OAAO,6BAA6B;AAAA,EAC1E,EAAE,KAAK,kBAAAA,KAAE,OAAO,OAAO,4BAA4B,WAAW,SAAS;AAAA,EACvE,EAAE,KAAK,kBAAAA,KAAE,MAAM,OAAO,0BAA0B;AAAA,EAChD,EAAE,KAAK,kBAAAA,KAAE,cAAc,OAAO,8BAA8B;AAAA,EAC5D,EAAE,KAAK,kBAAAA,KAAE,QAAQ,YAAY,OAAO;AAAA,EACpC,EAAE,KAAK,kBAAAA,KAAE,UAAU,WAAW,SAAS;AAAA,EACvC,EAAE,KAAK,kBAAAA,KAAE,eAAe,gBAAgB,eAAe;AAAA,EACvD,EAAE,KAAK,kBAAAA,KAAE,MAAM,OAAO,0BAA0B;AAAA,EAChD,EAAE,KAAK,kBAAAA,KAAE,KAAK,OAAO,0BAA0B;AAAA,EAC/C,EAAE,KAAK,kBAAAA,KAAE,SAAS,OAAO,6BAA6B;AAAA,EACtD,EAAE,KAAK,kBAAAA,KAAE,SAAS,OAAO,8BAA8B,YAAY,OAAO;AAAA,EAC1E,EAAE,KAAK,kBAAAA,KAAE,UAAU,OAAO,0BAA0B;AAAA,EACpD,EAAE,KAAK,kBAAAA,KAAE,QAAQ,OAAO,4BAA4B;AAAA,EACpD,EAAE,KAAK,kBAAAA,KAAE,eAAe,OAAO,+BAA+B;AAAA,EAC9D,EAAE,KAAK,kBAAAA,KAAE,cAAc,OAAO,UAAU;AAAA,EACxC,EAAE,KAAK,kBAAAA,KAAE,WAAW,OAAO,WAAW,WAAW,SAAS;AAAA,EAC1D,EAAE,KAAK,kBAAAA,KAAE,QAAQ,kBAAAA,KAAE,QAAQ,GAAG,gBAAgB,YAAY;AAAA,EAC1D,EAAE,KAAK,kBAAAA,KAAE,QAAQ,kBAAAA,KAAE,OAAO,GAAG,iBAAiB,kDAAkD,SAAS,SAAS,cAAc,MAAM;AACxI,CAAC;AAED,IAAM,oBAAoB,uBAAW,MAAM;AAAA,EACzC,KAAK;AAAA,IACH,OAAO;AAAA,IACP,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,eAAe;AAAA,IACf,WAAW;AAAA,EACb;AAAA,EACA,gBAAgB,EAAE,SAAS,OAAO;AAAA,EAClC,gBAAgB;AAAA,IACd,UAAU;AAAA,IACV,MAAM;AAAA,IACN,WAAW;AAAA,IACX,yBAAyB;AAAA,EAC3B;AAAA,EACA,eAAe;AAAA,IACb,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,OAAO;AAAA,IACP,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AAAA,EACA,wBAAwB,EAAE,iBAAiB,cAAc;AAAA,EACzD,mBAAmB,EAAE,OAAO,UAAU;AAAA,EACtC,kBAAkB,EAAE,SAAS,OAAO,QAAQ,UAAU;AAAA,EACtD,uBAAuB;AAAA,IACrB,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,SAAS;AAAA,IACT,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AAAA,EACA,6BAA6B;AAAA,IAC3B,iBAAiB;AAAA,EACnB;AAAA,EACA,kBAAkB,EAAE,iBAAiB,cAAc;AAAA,EACnD,cAAc,EAAE,iBAAiB,qCAAqC;AAAA,EACtE,iEAAiE;AAAA,IAC/D,iBAAiB;AAAA,EACnB;AAAA,EACA,uBAAuB;AAAA,IACrB,OAAO;AAAA,IACP,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,aAAa;AAAA,EACf;AAAA,EACA,eAAe;AAAA,IACb,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,cAAc;AAAA,IACd,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAAA,EACA,qBAAqB;AAAA,IACnB,iBAAiB;AAAA,IACjB,OAAO;AAAA,EACT;AAAA,EACA,qBAAqB;AAAA,IACnB,YAAY;AAAA,IACZ,YAAY;AAAA,EACd;AAAA,EACA,yBAAyB,EAAE,iBAAiB,+BAA+B;AAAA,EAC3E,wBAAwB,EAAE,iBAAiB,8BAA8B;AAAA,EACzE,0BAA0B,EAAE,iBAAiB,UAAU;AAAA,EACvD,yBAAyB,EAAE,iBAAiB,UAAU;AAAA,EACtD,iBAAiB;AAAA,IACf,YAAY;AAAA,IACZ,iBAAiB;AAAA,EACnB;AAAA,EACA,uBAAuB;AAAA,IACrB,iBAAiB;AAAA,EACnB;AAAA,EACA,0BAA0B;AAAA,IACxB,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AAAA,EACA,0BAA0B;AAAA,IACxB,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AAAA,EACA,0BAA0B;AAAA,IACxB,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AAAA,EACA,0BAA0B;AAAA,IACxB,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AAAA,EACA,0BAA0B;AAAA,IACxB,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa;AAAA,EACf;AAAA,EACA,cAAc;AAAA,IACZ,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,QAAQ;AAAA,EACV;AAAA,EACA,uBAAuB;AAAA,IACrB,UAAU;AAAA,IACV,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,SAAS;AAAA,IACT,WAAW;AAAA,IACX,SAAS;AAAA,IACT,eAAe;AAAA,IACf,KAAK;AAAA,IACL,gBAAgB;AAAA,IAChB,UAAU;AAAA,EACZ;AAAA,EACA,2BAA2B;AAAA,IACzB,UAAU;AAAA,IACV,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EACA,iCAAiC,EAAE,SAAS,EAAE;AAAA,EAC9C,iBAAiB;AAAA,IACf,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,OAAO;AAAA,IACP,SAAS;AAAA,IACT,SAAS;AAAA,IACT,OAAO;AAAA,IACP,cAAc;AAAA,EAChB;AAAA,EACA,uBAAuB;AAAA,IACrB,aAAa;AAAA,IACb,iBAAiB;AAAA,EACnB;AAAA,EACA,oDAAoD;AAAA,IAClD,iBAAiB;AAAA,EACnB;AAAA,EACA,4CAA4C;AAAA,IAC1C,iBAAiB;AAAA,EACnB;AAAA,EACA,cAAc;AAAA,IACZ,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,WAAW;AAAA,EACb;AAAA,EACA,oBAAoB;AAAA,IAClB,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AAAA,EACA,qBAAqB,EAAE,WAAW,gBAAgB;AAAA,EAClD,oBAAoB;AAAA,IAClB,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,IACP,aAAa;AAAA,IACb,QAAQ;AAAA,EACV;AAAA,EACA,mCAAmC;AAAA,IACjC,QAAQ;AAAA,IACR,aAAa;AAAA,EACf;AACF,CAAC;AAGD,IAAM,oBAAoB,6BAAY,GAAG,CAAC,OAAO,cAAc;AAC7D,QAAM,OAAO,MAAM,IAAI,OAAO,SAAS;AACvC,QAAM,UAAU,KAAK,KAAK,KAAK;AAE/B,QAAM,WAAW,QAAQ,MAAM,UAAU;AACzC,MAAI,UAAU;AACZ,QAAI,QAAQ;AACZ,aAAS,IAAI,KAAK,SAAS,GAAG,KAAK,MAAM,IAAI,OAAO,KAAK;AACvD,YAAM,WAAW,MAAM,IAAI,KAAK,CAAC;AACjC,YAAM,WAAW,SAAS,KAAK,KAAK;AACpC,UAAI,SAAS,MAAM,UAAU,GAAG;AAC9B;AAAA,MACF,WAAW,aAAa,OAAO;AAC7B;AACA,YAAI,UAAU,GAAG;AACf,iBAAO,EAAE,MAAM,KAAK,IAAI,IAAI,SAAS,GAAG;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,QAAQ,MAAM,sBAAsB;AACtD,MAAI,WAAW;AACb,UAAM,UAAU,UAAU,CAAC,EAAE,YAAY;AACzC,UAAM,eAAe,oBAAI,IAAI;AAAA,MAC3B;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAM;AAAA,MAAO;AAAA,MAAS;AAAA,MAAM;AAAA,MAAO;AAAA,MACnD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAS;AAAA,MAAU;AAAA,MAAS;AAAA,IAC9C,CAAC;AACD,QAAI,aAAa,IAAI,OAAO,KAAK,QAAQ,SAAS,IAAI,EAAG,QAAO;AAEhE,QAAI,QAAQ;AAEZ,aAAS,IAAI,KAAK,SAAS,GAAG,KAAK,MAAM,IAAI,OAAO,KAAK;AACvD,YAAM,WAAW,MAAM,IAAI,KAAK,CAAC;AACjC,YAAM,WAAW,SAAS;AAE1B,UAAI;AACJ,YAAM,WAAW,IAAI,OAAO,MAAM,OAAO,aAAa,IAAI;AAE1D,cAAQ,QAAQ,SAAS,KAAK,QAAQ,OAAO,MAAM;AACjD,YAAI,MAAM,CAAC,EAAE,WAAW,IAAI,GAAG;AAC7B;AACA,cAAI,UAAU,GAAG;AACf,mBAAO,EAAE,MAAM,KAAK,IAAI,IAAI,SAAS,GAAG;AAAA,UAC1C;AAAA,QACF,OAAO;AACL,cAAI,CAAC,MAAM,CAAC,EAAE,SAAS,IAAI,GAAG;AAC5B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT,CAAC;AAGD,IAAM,kBAAkB,uBAAW;AAAA,EACjC,MAAM;AAAA,IAEJ,YAAY,MAAkB;AAC5B,WAAK,cAAc,KAAK,eAAe,IAAI;AAAA,IAC7C;AAAA,IACA,OAAO,QAAoB;AACzB,UAAI,OAAO,cAAc,OAAO,iBAAiB;AAC/C,aAAK,cAAc,KAAK,eAAe,OAAO,IAAI;AAAA,MACpD;AAAA,IACF;AAAA,IACA,eAAe,MAAkB;AAC/B,YAAM,UAAU,IAAI,6BAA4B;AAChD,YAAM,MAAM,KAAK,MAAM;AACvB,YAAM,gBAAgB,KAAK;AAC3B,UAAI,cAAc,WAAW,EAAG,QAAO,QAAQ,OAAO;AAEtD,YAAM,QAAQ,cAAc,cAAc,SAAS,CAAC,EAAE;AACtD,YAAM,kBAA4B,CAAC;AAEnC,eAAS,IAAI,GAAG,KAAK,IAAI,OAAO,KAAK;AACnC,cAAM,OAAO,IAAI,KAAK,CAAC;AACvB,YAAI,KAAK,OAAO,MAAO;AAEvB,cAAM,cAAc,KAAK,KAAK,KAAK;AACnC,YAAI,gBAAgB;AACpB,YAAI,mBAAmB;AAEvB,cAAM,QAAQ,YAAY,MAAM,UAAU;AAC1C,YAAI,OAAO;AACT,gBAAM,OAAO,MAAM,CAAC,EAAE,KAAK;AAC3B,cAAI,SAAS,IAAI;AACf,gBAAI,gBAAgB,SAAS,GAAG;AAC9B,8BAAgB;AAChB,iCAAmB,gBAAgB,SAAS;AAAA,YAC9C;AAAA,UACF,OAAO;AACL,kBAAM,YAAY,KAAK,MAAM,WAAW;AACxC,kBAAM,OACJ,aAAa,UAAU,CAAC,MAAM,MAC1B,UAAU,CAAC,EAAE,YAAY,IACzB;AACN,4BAAgB,KAAK,IAAI;AAAA,UAC3B;AAAA,QACF;AAEA,cAAM,YAAY,cAAc;AAAA,UAC9B,OAAK,KAAK,MAAM,EAAE,QAAQ,KAAK,QAAQ,EAAE;AAAA,QAC3C;AAEA,YAAI,aAAa,gBAAgB,SAAS,GAAG;AAC3C,gBAAM,YAAY,gBACd,mBACA,gBAAgB,SAAS;AAC7B,gBAAM,cAAc,gBAAgB,SAAS;AAC7C,gBAAM,QAAQ,YAAY;AAC1B,gBAAM,cAAc,CAAC,kBAAkB;AAEvC,cAAI,gBAAgB,OAAO;AACzB,wBAAY,KAAK,cAAc;AAC/B,wBAAY,KAAK,uBAAuB,KAAK,IAAI,OAAO,CAAC,CAAC,EAAE;AAAA,UAC9D,OAAO;AACL,wBAAY,KAAK,iBAAiB,WAAW,EAAE;AAC/C,wBAAY,KAAK,uBAAuB,KAAK,IAAI,OAAO,CAAC,CAAC,EAAE;AAAA,UAC9D;AAEA,kBAAQ;AAAA,YACN,KAAK;AAAA,YACL,KAAK;AAAA,YACL,uBAAW,KAAK,EAAE,OAAO,YAAY,KAAK,GAAG,EAAE,CAAC;AAAA,UAClD;AAAA,QACF;AAEA,YAAI,eAAe;AACjB,0BAAgB,IAAI;AAAA,QACtB;AAAA,MACF;AAEA,aAAO,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AAAA,EACA,EAAE,aAAa,OAAK,EAAE,YAAY;AACpC;AAGA,IAAM,mBAAmB,uBAAW;AAAA,EAClC,MAAM;AAAA,IAEJ,YAAY,MAAkB;AAC5B,WAAK,cAAc,KAAK,eAAe,IAAI;AAAA,IAC7C;AAAA,IACA,OAAO,QAAoB;AACzB,UAAI,OAAO,cAAc,OAAO,iBAAiB;AAC/C,aAAK,cAAc,KAAK,eAAe,OAAO,IAAI;AAAA,MACpD;AAAA,IACF;AAAA,IACA,eAAe,MAAkB;AAC/B,YAAM,UAAU,IAAI,6BAA4B;AAChD,iBAAW,EAAE,MAAM,GAAG,KAAK,KAAK,eAAe;AAC7C,iBAAS,MAAM,MAAM,OAAO,MAAM;AAChC,gBAAM,OAAO,KAAK,MAAM,IAAI,OAAO,GAAG;AACtC,cAAI,KAAK,KAAK,KAAK,EAAE,WAAW,GAAG,GAAG;AACpC,oBAAQ;AAAA,cACN,KAAK;AAAA,cACL,KAAK;AAAA,cACL,uBAAW,KAAK,EAAE,OAAO,qBAAqB,CAAC;AAAA,YACjD;AAAA,UACF;AACA,gBAAM,KAAK,KAAK;AAAA,QAClB;AAAA,MACF;AACA,aAAO,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AAAA,EACA,EAAE,aAAa,OAAK,EAAE,YAAY;AACpC;AAGA,IAAM,gBAAgB,uBAAW;AAAA,EAC/B,MAAM;AAAA,IAEJ,YAAY,MAAkB;AAC5B,WAAK,cAAc,KAAK,eAAe,IAAI;AAAA,IAC7C;AAAA,IACA,OAAO,QAAoB;AACzB,UAAI,OAAO,cAAc,OAAO,iBAAiB;AAC/C,aAAK,cAAc,KAAK,eAAe,OAAO,IAAI;AAAA,MACpD;AAAA,IACF;AAAA,IACA,eAAe,MAAkB;AAC/B,YAAM,UAAU,IAAI,6BAA4B;AAChD,YAAM,eAAe;AACrB,YAAM,SAA0D,CAAC;AAEjE,iBAAW,EAAE,MAAM,GAAG,KAAK,KAAK,eAAe;AAC7C,cAAM,OAAO,KAAK,MAAM,IAAI,YAAY,MAAM,EAAE;AAChD,qBAAa,YAAY;AACzB,YAAI;AACJ,eAAQ,QAAQ,aAAa,KAAK,IAAI,GAAI;AACxC,gBAAM,QAAQ,OAAO,MAAM;AAC3B,gBAAM,MAAM,QAAQ,MAAM,CAAC,EAAE;AAC7B,gBAAM,eAAe,QAAQ;AAC7B,gBAAM,aAAa,MAAM;AACzB,cAAI,gBAAgB,WAAY;AAChC,iBAAO,KAAK,EAAE,MAAM,OAAO,IAAI,cAAc,KAAK,uBAAW,QAAQ,CAAC,CAAC,EAAE,CAAC;AAC1E,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,KAAK,uBAAW,KAAK,EAAE,OAAO,aAAa,CAAC;AAAA,UAC9C,CAAC;AACD,iBAAO,KAAK,EAAE,MAAM,YAAY,IAAI,KAAK,KAAK,uBAAW,QAAQ,CAAC,CAAC,EAAE,CAAC;AAAA,QACxE;AAAA,MACF;AAEA,aAAO,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE;AACpD,iBAAW,EAAE,MAAM,IAAI,IAAI,KAAK,OAAQ,SAAQ,IAAI,MAAM,IAAI,GAAG;AACjE,aAAO,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AAAA,EACA,EAAE,aAAa,OAAK,EAAE,YAAY;AACpC;AAGA,IAAM,kBAAkB,uBAAW;AAAA,EACjC,MAAM;AAAA,IAEJ,YAAY,MAAkB;AAC5B,WAAK,cAAc,KAAK,eAAe,IAAI;AAAA,IAC7C;AAAA,IACA,OAAO,QAAoB;AACzB,UAAI,OAAO,cAAc,OAAO,iBAAiB;AAC/C,aAAK,cAAc,KAAK,eAAe,OAAO,IAAI;AAAA,MACpD;AAAA,IACF;AAAA,IACA,eAAe,MAAkB;AAC/B,YAAM,UAAU,IAAI,6BAA4B;AAChD,YAAM,aAAa;AACnB,iBAAW,EAAE,MAAM,GAAG,KAAK,KAAK,eAAe;AAC7C,cAAM,OAAO,KAAK,MAAM,IAAI,YAAY,MAAM,EAAE;AAChD,YAAI;AACJ,eAAQ,QAAQ,WAAW,KAAK,IAAI,GAAI;AACtC,gBAAM,QAAQ,MAAM,CAAC;AACrB,gBAAM,WAAW,OAAO,MAAM;AAC9B,gBAAM,SAAS,WAAW,MAAM,CAAC,EAAE;AACnC,kBAAQ;AAAA,YACN;AAAA,YACA;AAAA,YACA,uBAAW,KAAK,EAAE,YAAY,EAAE,OAAO,UAAU,KAAK,GAAG,EAAE,CAAC;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AACA,aAAO,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AAAA,EACA,EAAE,aAAa,OAAK,EAAE,YAAY;AACpC;AAgBA,IAAM,WAAoC,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,QAAQ;AACV,MAAM;AACJ,QAAM,gBAAY,sBAA0B,IAAI;AAChD,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,KAAK;AACpD,QAAM,CAAC,YAAY,aAAa,QAAI,wBAAqB,OAAO;AAChE,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,mBAAmB,YAAY,OAAO,UAAU;AAEtD,qBAAmB,WAAW;AAG9B,+BAAU,MAAM;AACd,UAAM,KAAK,OAAO,WAAW,oBAAoB;AACjD,UAAM,QAAQ,MAAM;AAClB,UAAI,GAAG,WAAW,eAAe,QAAS,eAAc,QAAQ;AAAA,IAClE;AACA,UAAM;AACN,OAAG,iBAAiB,UAAU,KAAK;AACnC,WAAO,MAAM,GAAG,oBAAoB,UAAU,KAAK;AAAA,EACrD,GAAG,CAAC,UAAU,CAAC;AAIf,+BAAU,MAAM;AACd,UAAM,KAAK,OAAO,WAAW,oBAAoB;AACjD,UAAM,SAAS,MAAM;AACnB,UAAI,GAAG,QAAS,eAAc,CAAC,MAAO,MAAM,UAAU,WAAW,CAAE;AAAA,IACrE;AACA,WAAO;AACP,OAAG,iBAAiB,UAAU,MAAM;AACpC,WAAO,MAAM,GAAG,oBAAoB,UAAU,MAAM;AAAA,EACtD,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAmB,MAAM;AAC7B,QAAI,CAAC,UAAU,QAAS;AACxB,QAAI,aAAa;AACf,sCAAU,UAAU,OAAO;AAC3B,qBAAe,KAAK;AAAA,IACtB,OAAO;AACL,oCAAQ,UAAU,OAAO;AACzB,qBAAe,IAAI;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,aAAa,cAAAC,QAAM;AAAA,IACvB,MAAM;AAAA,MACJ;AAAA,UACA,yBAAY;AAAA,UACZ,6BAAW;AAAA,QACT,WAAW,UAAQ;AACjB,gBAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,eAAK,MAAM,SAAS;AACpB,eAAK,MAAM,UAAU;AACrB,eAAK,MAAM,WAAW;AACtB,eAAK,MAAM,UAAU;AACrB,eAAK,MAAM,aAAa;AACxB,eAAK,cAAc,OAAO,WAAM;AAChC,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,MACD;AAAA,MACA;AAAA,UACA,qCAAmB,wBAAwB;AAAA,MAC3C,uBAAW;AAAA,MACX,mBAAO,GAAG;AAAA,QACR,EAAE,KAAK,gBAAgB,KAAK,yBAAQ;AAAA,QACpC,EAAE,KAAK,gBAAgB,KAAK,2BAAU;AAAA,MACxC,CAAC;AAAA,MACD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,cAAkE;AAAA,IACtE,EAAE,KAAK,UAAU,MAAM,QAAQ,OAAO,SAAS;AAAA,IAC/C,EAAE,KAAK,SAAS,MAAM,kBAAkB,OAAO,QAAQ;AAAA,IACvD,EAAE,KAAK,WAAW,MAAM,cAAc,OAAO,UAAU;AAAA,EACzD;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,aAAa,eAAe,UAAU,qBAAqB,EAAE,IACtE,aAAa,EACf;AAAA,MAGA;AAAA,sDAAC,SAAI,WAAU,qBAEb;AAAA,wDAAC,SAAI,WAAU,0BACb;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,WAAU;AAAA,gBACV,OAAO,cAAc,kBAAkB;AAAA,gBACvC,cAAY,cAAc,kBAAkB;AAAA,gBAE5C,uDAAC,UAAK,WAAU,wBACb,wBAAc,gBAAgB,eACjC;AAAA;AAAA,YACF;AAAA,YAEA,6CAAC,SAAI,WAAU,sBAAqB;AAAA,YAEpC,6CAAC,SAAI,WAAU,yBACZ,sBAAY,IAAI,SACf;AAAA,cAAC;AAAA;AAAA,gBAEC,SAAS,MAAM,cAAc,IAAI,GAAG;AAAA,gBACpC,WAAW,sCACT,eAAe,IAAI,MAAM,gCAAgC,EAC3D,IAAI,IAAI,QAAQ,UAAU,yBAAyB,EAAE;AAAA,gBACrD,OAAO,IAAI;AAAA,gBAEX;AAAA,+DAAC,UAAK,WAAU,wBAAwB,cAAI,MAAK;AAAA,kBACjD,6CAAC,UAAK,WAAU,oBAAoB,cAAI,OAAM;AAAA;AAAA;AAAA,cARzC,IAAI;AAAA,YASX,CACD,GACH;AAAA,aACF;AAAA,UAGA,8CAAC,SAAI,WAAU,2BACX;AAAA,sBAAS,YACT;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS,MAAO,QAAQ,aAAa,IAAI,IAAI,UAAU;AAAA,gBACvD,WAAU;AAAA,gBACV,OAAM;AAAA,gBAEN;AAAA,+DAAC,UAAK,WAAU,wBAAuB,uBAAS;AAAA,kBAChD,6CAAC,UAAK,WAAU,oBAAmB,qBAAI;AAAA;AAAA;AAAA,YACzC;AAAA,aAEA,SAAS,YAAY,YAAY,6CAAC,SAAI,WAAU,sBAAqB;AAAA,YACtE,YACC;AAAA,cAAC;AAAA;AAAA,gBACC,SAAS;AAAA,gBACT,WAAU;AAAA,gBACV,OAAM;AAAA,gBAEN;AAAA,+DAAC,UAAK,WAAU,wBAAuB,kBAAI;AAAA,kBAC3C,6CAAC,UAAK,WAAU,oBAAmB,wBAAU;AAAA;AAAA;AAAA,YAC/C;AAAA,aAEJ;AAAA,WACF;AAAA,QAGA,8CAAC,SAAI,WAAU,kBACX;AAAA,0BAAe,YAAY,eAAe,YAC1C;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,kBACT,eAAe,UAAU,yBAAyB,EACpD;AAAA,cAEA;AAAA,gBAAC,wBAAAC;AAAA,gBAAA;AAAA,kBACC;AAAA,kBACA;AAAA,kBACA,QAAO;AAAA,kBACP,gBAAgB,UAAQ;AACtB,8BAAU,UAAU;AAAA,kBACtB;AAAA,kBACA,YAAY;AAAA,oBACV,aAAa;AAAA,oBACb,YAAY;AAAA,kBACd;AAAA,kBACA;AAAA;AAAA,cACF;AAAA;AAAA,UACF;AAAA,WAGA,eAAe,aAAa,eAAe,YAC3C;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,qBACT,eAAe,UAAU,4BAA4B,EACvD;AAAA,cAEA,uDAAC,SAAI,WAAU,mBACb,uDAAC,SAAI,WAAU,YACb,uDAAC,kCAAuB,SAAS,kBAAkB,GACrD,GACF;AAAA;AAAA,UACF;AAAA,WAEJ;AAAA,QAEC,SAAS,6CAAC,iBAAM,MAAM,WAAW,SAAS,MAAM,aAAa,KAAK,GAAG;AAAA;AAAA;AAAA,EACxE;AAEJ;AAEA,IAAO,mBAAQ;","names":["import_react","t","import_language","import_highlight","import_react","css","import_react","markdown","text","classes","id","hljs","javascript","typescript","python","css","xml","json","bash","sql","markdown","java","csharp","cpp","go","rust","php","ruby","swift","kotlin","dart","yaml","toml","dockerfile","diff","shell","renderInline","tr","renderInline","diff","IMG_RE","IMG_RE","markdown","import_react","import_jsx_runtime","import_jsx_runtime","t","React","CodeMirror"]}
|