{"version":3,"file":"rk-editor-core.mjs","sources":["../src/extensions/Link.ts","../src/extensions/FontSize.ts","../src/extensions/TextTransform.ts","../src/extensions/LineHeight.ts","../src/extensions/ParagraphSpacing.ts","../src/extensions/Indent.ts","../src/extensions/PageBreak.ts","../src/extensions/Footnote.ts","../src/extensions/PasteHandler.ts","../src/extensions/AdvancedTypography.ts","../src/extensions/ParagraphSystem.ts","../src/StyleManager.ts","../src/extensions/StylesEngine.ts","../src/extensions/PageLayout.ts","../src/extensions/Section.ts","../src/extensions/HeaderFooter.ts","../src/extensions/TableStyles.ts","../src/extensions/MultilevelList.ts","../src/extensions/Caption.ts","../src/extensions/ImageResize.ts","../src/extensions/Math.ts","../src/extensions/TableOfContents.ts","../src/extensions/Citation.ts","../src/extensions/SlashCommands.ts","../src/extensions/ImageUpload.ts","../src/extensions/FormatPainter.ts","../src/extensions/DragHandle.ts","../src/extensions/TrackChanges.ts","../src/extensions/LeaderMark.ts","../src/extensions/FindReplace.ts","../src/extensions/WordShortcuts.ts","../src/extensions/TextBox.ts","../src/extensions/Pagination.ts","../src/extensions/TitleSubtitle.ts","../src/DocumentValidator.ts","../src/CommandManager.ts","../src/ExportEngine.ts","../src/ImportEngine.ts","../src/PrintEngine.ts","../src/extensions/ImageResizeHandle.ts","../src/index.ts"],"sourcesContent":["import { Mark, mergeAttributes } from '@tiptap/core';\r\n\r\nexport interface LinkOptions {\r\n    /**\r\n     * If enabled, it will be opened by a click.\r\n     */\r\n    openOnClick: boolean;\r\n    /**\r\n     * HTML attributes to add to the link element.\r\n     */\r\n    HTMLAttributes: Record<string, any>;\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n    interface Commands<ReturnType> {\r\n        link: {\r\n            /**\r\n             * Set a link mark\r\n             */\r\n            setLink: (attributes: { href: string; target?: string | null; rel?: string | null; class?: string | null }) => ReturnType;\r\n            /**\r\n             * Toggle a link mark\r\n             */\r\n            toggleLink: (attributes: { href: string; target?: string | null; rel?: string | null; class?: string | null }) => ReturnType;\r\n            /**\r\n             * Unset a link mark\r\n             */\r\n            unsetLink: () => ReturnType;\r\n        };\r\n    }\r\n}\r\n\r\nexport const Link = Mark.create<LinkOptions>({\r\n    name: 'link',\r\n\r\n    priority: 1000,\r\n\r\n    keepOnSplit: false,\r\n\r\n    addOptions() {\r\n        return {\r\n            openOnClick: true,\r\n            HTMLAttributes: {\r\n                target: '_blank',\r\n                rel: 'noopener noreferrer nofollow',\r\n                class: null,\r\n            },\r\n        };\r\n    },\r\n\r\n    addAttributes() {\r\n        return {\r\n            href: {\r\n                default: null,\r\n            },\r\n            target: {\r\n                default: this.options.HTMLAttributes.target,\r\n            },\r\n            rel: {\r\n                default: this.options.HTMLAttributes.rel,\r\n            },\r\n            class: {\r\n                default: this.options.HTMLAttributes.class,\r\n            },\r\n        };\r\n    },\r\n\r\n    parseHTML() {\r\n        return [\r\n            {\r\n                tag: 'a[href]:not([href^=\"javascript:\"])',\r\n            },\r\n        ];\r\n    },\r\n\r\n    renderHTML({ HTMLAttributes }) {\r\n        return ['a', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            setLink: attributes => ({ chain }) => {\r\n                return chain().setMark(this.name, attributes).setMeta('preventAutolink', true).run();\r\n            },\r\n\r\n            toggleLink: attributes => ({ chain }) => {\r\n                return chain().toggleMark(this.name, attributes).setMeta('preventAutolink', true).run();\r\n            },\r\n\r\n            unsetLink: () => ({ chain }) => {\r\n                return chain().unsetMark(this.name).setMeta('preventAutolink', true).run();\r\n            },\r\n        };\r\n    },\r\n});\r\n","import { Extension } from '@tiptap/core';\r\n\r\nexport interface FontSizeOptions {\r\n    types: string[];\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n    interface Commands<ReturnType> {\r\n        fontSize: {\r\n            /**\r\n             * Set the font size\r\n             */\r\n            setFontSize: (size: string) => ReturnType;\r\n            /**\r\n             * Unset the font size\r\n             */\r\n            unsetFontSize: () => ReturnType;\r\n        };\r\n    }\r\n}\r\n\r\nexport const FontSize = Extension.create<FontSizeOptions>({\r\n    name: 'fontSize',\r\n\r\n    addOptions() {\r\n        return {\r\n            types: ['textStyle'],\r\n        };\r\n    },\r\n\r\n    addGlobalAttributes() {\r\n        return [\r\n            {\r\n                types: this.options.types,\r\n                attributes: {\r\n                    fontSize: {\r\n                        default: null,\r\n                        parseHTML: (element) => element.style.fontSize.replace(/['\"]+/g, ''),\r\n                        renderHTML: (attributes) => {\r\n                            if (!attributes.fontSize) {\r\n                                return {};\r\n                            }\r\n\r\n                            return {\r\n                                style: `font-size: ${attributes.fontSize}`,\r\n                            };\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n        ];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            setFontSize: (fontSize) => ({ chain }) => {\r\n                return chain().setMark('textStyle', { fontSize }).run();\r\n            },\r\n            unsetFontSize: () => ({ chain }) => {\r\n                return chain().setMark('textStyle', { fontSize: null }).removeEmptyTextStyle().run();\r\n            },\r\n        };\r\n    },\r\n});\r\n","import { Extension } from '@tiptap/core';\r\n\r\nexport interface TextTransformOptions {\r\n    types: string[];\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n    interface Commands<ReturnType> {\r\n        textTransform: {\r\n            /**\r\n             * Set the text transform\r\n             */\r\n            setTextTransform: (transform: string) => ReturnType;\r\n            /**\r\n             * Unset the text transform\r\n             */\r\n            unsetTextTransform: () => ReturnType;\r\n        };\r\n    }\r\n}\r\n\r\nexport const TextTransform = Extension.create<TextTransformOptions>({\r\n    name: 'textTransform',\r\n\r\n    addOptions() {\r\n        return {\r\n            types: ['textStyle'],\r\n        };\r\n    },\r\n\r\n    addGlobalAttributes() {\r\n        return [\r\n            {\r\n                types: this.options.types,\r\n                attributes: {\r\n                    textTransform: {\r\n                        default: null,\r\n                        parseHTML: (element) => element.style.textTransform,\r\n                        renderHTML: (attributes) => {\r\n                            if (!attributes.textTransform) {\r\n                                return {};\r\n                            }\r\n\r\n                            return {\r\n                                style: `text-transform: ${attributes.textTransform}`,\r\n                            };\r\n                        },\r\n                    },\r\n                    fontVariant: {\r\n                        default: null,\r\n                        parseHTML: (element) => element.style.fontVariant,\r\n                        renderHTML: (attributes) => {\r\n                            if (!attributes.fontVariant) {\r\n                                return {};\r\n                            }\r\n\r\n                            return {\r\n                                style: `font-variant: ${attributes.fontVariant}`,\r\n                            };\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n        ];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            setTextTransform: (textTransform: string) => ({ chain }: { chain: any }) => {\r\n                return chain()\r\n                    .focus()\r\n                    .setMark('textStyle', { textTransform })\r\n                    .run();\r\n            },\r\n            toggleSmallCaps: () => ({ chain }: { chain: any }) => {\r\n                return chain().focus().setMark('textStyle', { fontVariant: 'small-caps' }).run();\r\n            },\r\n            unsetTextTransform: () => ({ chain }: { chain: any }) => {\r\n                return chain().focus().setMark('textStyle', { textTransform: null }).removeEmptyTextStyle().run();\r\n            },\r\n        };\r\n    },\r\n});\r\n","import { Extension } from '@tiptap/core';\r\n\r\nexport interface LineHeightOptions {\r\n    types: string[];\r\n    defaultLineHeight: string;\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n    interface Commands<ReturnType> {\r\n        lineHeight: {\r\n            setLineHeight: (height: string) => ReturnType;\r\n            unsetLineHeight: () => ReturnType;\r\n        };\r\n    }\r\n}\r\n\r\nexport const LineHeight = Extension.create<LineHeightOptions>({\r\n    name: 'lineHeight',\r\n\r\n    addOptions() {\r\n        return {\r\n            types: ['paragraph', 'heading'],\r\n            defaultLineHeight: 'normal',\r\n        };\r\n    },\r\n\r\n    addGlobalAttributes() {\r\n        return [\r\n            {\r\n                types: this.options.types,\r\n                attributes: {\r\n                    lineHeight: {\r\n                        default: this.options.defaultLineHeight,\r\n                        parseHTML: (element) => element.style.lineHeight || this.options.defaultLineHeight,\r\n                        renderHTML: (attributes) => {\r\n                            if (attributes.lineHeight === this.options.defaultLineHeight) {\r\n                                return {};\r\n                            }\r\n\r\n                            return {\r\n                                style: `line-height: ${attributes.lineHeight}`,\r\n                            };\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n        ];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            setLineHeight: (lineHeight) => ({ commands }) => {\r\n                return this.options.types.every((type) => commands.updateAttributes(type, { lineHeight }));\r\n            },\r\n            unsetLineHeight: () => ({ commands }) => {\r\n                return this.options.types.every((type) => commands.updateAttributes(type, { lineHeight: this.options.defaultLineHeight }));\r\n            },\r\n        };\r\n    },\r\n});\r\n","import { Extension } from '@tiptap/core';\r\n\r\nexport interface ParagraphSpacingOptions {\r\n    types: string[];\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n    interface Commands<ReturnType> {\r\n        paragraphSpacing: {\r\n            setParagraphSpacing: (spacing: { top?: string, bottom?: string }) => ReturnType;\r\n        };\r\n    }\r\n}\r\n\r\nexport const ParagraphSpacing = Extension.create<ParagraphSpacingOptions>({\r\n    name: 'paragraphSpacing',\r\n\r\n    addOptions() {\r\n        return {\r\n            types: ['paragraph'],\r\n        };\r\n    },\r\n\r\n    addGlobalAttributes() {\r\n        return [\r\n            {\r\n                types: this.options.types,\r\n                attributes: {\r\n                    marginTop: {\r\n                        default: null,\r\n                        parseHTML: (element) => element.style.marginTop,\r\n                        renderHTML: (attributes) => {\r\n                            if (!attributes.marginTop) return {};\r\n                            return { style: `margin-top: ${attributes.marginTop}` };\r\n                        },\r\n                    },\r\n                    marginBottom: {\r\n                        default: null,\r\n                        parseHTML: (element) => element.style.marginBottom,\r\n                        renderHTML: (attributes) => {\r\n                            if (!attributes.marginBottom) return {};\r\n                            return { style: `margin-bottom: ${attributes.marginBottom}` };\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n        ];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            setParagraphSpacing: (spacing) => ({ commands }) => {\r\n                return this.options.types.every((type) => commands.updateAttributes(type, {\r\n                    marginTop: spacing.top,\r\n                    marginBottom: spacing.bottom\r\n                }));\r\n            },\r\n        };\r\n    },\r\n});\r\n","import { Extension } from '@tiptap/core';\r\n\r\nexport interface IndentOptions {\r\n    types: string[];\r\n    minIndent: number;\r\n    maxIndent: number;\r\n    indentSize: number; // Added indentSize\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n    interface Commands<ReturnType> {\r\n        indent: {\r\n            indent: () => ReturnType;\r\n            outdent: () => ReturnType;\r\n        };\r\n    }\r\n}\r\n\r\nexport const Indent = Extension.create<IndentOptions>({\r\n    name: 'indent',\r\n\r\n    addOptions() {\r\n        return {\r\n            types: ['paragraph', 'heading', 'listItem'],\r\n            minIndent: 0,\r\n            maxIndent: 8,\r\n            indentSize: 1, // Default indent size\r\n        };\r\n    },\r\n\r\n    addGlobalAttributes() {\r\n        return [\r\n            {\r\n                types: this.options.types,\r\n                attributes: {\r\n                    indent: {\r\n                        default: 0,\r\n                        parseHTML: (element) => parseInt(element.style.marginLeft) / 40 || 0,\r\n                        renderHTML: (attributes) => {\r\n                            if (!attributes.indent) return {};\r\n                            return { style: `margin-left: ${attributes.indent * 40}px` };\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n        ];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            indent: () => ({ commands }) => {\r\n                if (this.editor.isActive('listItem')) {\r\n                    return (this.editor.chain().focus() as any).sinkListItem('listItem').run();\r\n                }\r\n                const types = this.options.types.filter(t => t !== 'listItem');\r\n                return types.every(type => {\r\n                    const currentIndent = this.editor.getAttributes(type).indent || 0;\r\n                    return commands.updateAttributes(type, {\r\n                        indent: Math.min(currentIndent + this.options.indentSize, this.options.maxIndent),\r\n                    });\r\n                });\r\n            },\r\n            outdent: () => ({ commands }) => {\r\n                if (this.editor.isActive('listItem')) {\r\n                    return (this.editor.chain().focus() as any).liftListItem('listItem').run();\r\n                }\r\n                const types = this.options.types.filter(t => t !== 'listItem');\r\n                return types.every(type => {\r\n                    const currentIndent = this.editor.getAttributes(type).indent || 0;\r\n                    return commands.updateAttributes(type, {\r\n                        indent: Math.max(this.options.minIndent, currentIndent - this.options.indentSize),\r\n                    });\r\n                });\r\n            },\r\n        };\r\n    },\r\n\r\n    addKeyboardShortcuts() {\r\n        return {\r\n            'Tab': () => {\r\n                if (this.editor.isActive('listItem')) {\r\n                    return this.editor.commands.sinkListItem('listItem');\r\n                }\r\n\r\n                // If not in a list, insert 4 non-breaking spaces\r\n                return this.editor.commands.insertContent('\\u00A0\\u00A0\\u00A0\\u00A0');\r\n            },\r\n            'Shift-Tab': () => {\r\n                if (this.editor.isActive('listItem')) {\r\n                    return this.editor.commands.liftListItem('listItem');\r\n                }\r\n                return false;\r\n            },\r\n        };\r\n    },\r\n});\r\n","import { Node, mergeAttributes } from '@tiptap/core';\r\n\r\ndeclare module '@tiptap/core' {\r\n    interface Commands<ReturnType> {\r\n        pageBreak: {\r\n            setPageBreak: () => ReturnType;\r\n        };\r\n    }\r\n}\r\n\r\nexport const PageBreak = Node.create({\r\n    name: 'pageBreak',\r\n\r\n    group: 'block',\r\n\r\n    parseHTML() {\r\n        return [\r\n            { tag: 'div[data-type=\"page-break\"]' },\r\n        ];\r\n    },\r\n\r\n    renderHTML({ HTMLAttributes }) {\r\n        return ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'page-break', class: 'rk-page-break' })];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            setPageBreak: () => ({ commands }: { commands: any }) => {\r\n                return (commands as any).insertContent({ type: this.name });\r\n            },\r\n        } as any;\r\n    },\r\n});\r\n","import { Node, mergeAttributes } from '@tiptap/core';\r\n\r\nexport const Footnote = Node.create({\r\n    name: 'footnote',\r\n\r\n    group: 'inline',\r\n\r\n    content: 'text*',\r\n\r\n    inline: true,\r\n\r\n    draggable: true,\r\n\r\n    parseHTML() {\r\n        return [\r\n            {\r\n                tag: 'footnote',\r\n            },\r\n        ];\r\n    },\r\n\r\n    renderHTML({ HTMLAttributes }) {\r\n        return ['footnote', mergeAttributes(HTMLAttributes), 0];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            setFootnote: (content?: string) => ({ commands }: { commands: any }) => {\r\n                return commands.insertContent({\r\n                    type: this.name,\r\n                    content: content ? [{ type: 'text', text: content }] : undefined\r\n                });\r\n            },\r\n        } as any;\r\n    },\r\n});\r\n","import { Extension } from '@tiptap/core';\r\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\r\n\r\nexport const PasteHandler = Extension.create({\r\n    name: 'pasteHandler',\r\n\r\n    addProseMirrorPlugins() {\r\n        return [\r\n            new Plugin({\r\n                key: new PluginKey('pasteHandler'),\r\n                props: {\r\n                    handlePaste: (view, event) => {\r\n                        const html = event.clipboardData?.getData('text/html');\r\n\r\n                        if (html && (html.includes('office:word') || html.includes('mso-') || html.includes('docs-internal-guid'))) {\r\n                            const domParser = new DOMParser();\r\n                            const doc = domParser.parseFromString(html, 'text/html');\r\n\r\n                            // Remove Word-specific tags and comments\r\n                            const walker = document.createTreeWalker(doc.body, NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_ELEMENT);\r\n                            let node;\r\n                            while (node = walker.nextNode()) {\r\n                                if (node.nodeType === Node.COMMENT_NODE) {\r\n                                    node.parentNode?.removeChild(node);\r\n                                }\r\n                            }\r\n\r\n                            // Simple cleanup of inline styles that often break layouts\r\n                            doc.querySelectorAll('*').forEach(el => {\r\n                                if (el instanceof HTMLElement) {\r\n                                    el.style.fontFamily = ''; // Clear forced fonts\r\n                                    el.style.fontSize = '';   // Clear forced sizes\r\n                                }\r\n                            });\r\n                        }\r\n\r\n                        return false; // Let Tiptap/ProseMirror handle the rest\r\n                    },\r\n                },\r\n            }),\r\n        ];\r\n    },\r\n});\r\n","import { Extension } from '@tiptap/core';\r\n\r\nexport interface AdvancedTypographyOptions {\r\n    types: string[];\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n    interface Commands<ReturnType> {\r\n        advancedTypography: {\r\n            /**\r\n             * Set the letter spacing\r\n             */\r\n            setLetterSpacing: (spacing: string) => ReturnType;\r\n            /**\r\n             * Unset the letter spacing\r\n             */\r\n            unsetLetterSpacing: () => ReturnType;\r\n            /**\r\n             * Set the word spacing\r\n             */\r\n            setWordSpacing: (spacing: string) => ReturnType;\r\n            /**\r\n             * Unset the word spacing\r\n             */\r\n            unsetWordSpacing: () => ReturnType;\r\n        };\r\n    }\r\n}\r\n\r\nexport const AdvancedTypography = Extension.create<AdvancedTypographyOptions>({\r\n    name: 'advancedTypography',\r\n\r\n    addOptions() {\r\n        return {\r\n            types: ['textStyle'],\r\n        };\r\n    },\r\n\r\n    addGlobalAttributes() {\r\n        return [\r\n            {\r\n                types: this.options.types,\r\n                attributes: {\r\n                    letterSpacing: {\r\n                        default: null,\r\n                        parseHTML: element => element.style.letterSpacing,\r\n                        renderHTML: attributes => {\r\n                            if (!attributes.letterSpacing) {\r\n                                return {};\r\n                            }\r\n\r\n                            return {\r\n                                style: `letter-spacing: ${attributes.letterSpacing}`,\r\n                            };\r\n                        },\r\n                    },\r\n                    wordSpacing: {\r\n                        default: null,\r\n                        parseHTML: element => element.style.wordSpacing,\r\n                        renderHTML: attributes => {\r\n                            if (!attributes.wordSpacing) {\r\n                                return {};\r\n                            }\r\n\r\n                            return {\r\n                                style: `word-spacing: ${attributes.wordSpacing}`,\r\n                            };\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n        ];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            setLetterSpacing: (letterSpacing) => ({ chain }) => {\r\n                return chain().setMark('textStyle', { letterSpacing }).run();\r\n            },\r\n            unsetLetterSpacing: () => ({ chain }) => {\r\n                return chain().setMark('textStyle', { letterSpacing: null }).removeEmptyTextStyle().run();\r\n            },\r\n            setWordSpacing: (wordSpacing) => ({ chain }) => {\r\n                return chain().setMark('textStyle', { wordSpacing }).run();\r\n            },\r\n            unsetWordSpacing: () => ({ chain }) => {\r\n                return chain().setMark('textStyle', { wordSpacing: null }).removeEmptyTextStyle().run();\r\n            },\r\n        };\r\n    },\r\n});\r\n","import { Extension } from '@tiptap/core';\r\n\r\nexport interface ParagraphSystemOptions {\r\n    types: string[];\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n    interface Commands<ReturnType> {\r\n        paragraphSystem: {\r\n            /**\r\n             * Set paragraph spacing\r\n             */\r\n            setParagraphLayout: (attrs: {\r\n                before?: string;\r\n                after?: string;\r\n                firstLineIndent?: string;\r\n                hangingIndent?: string;\r\n                backgroundColor?: string;\r\n                border?: string;\r\n                class?: string;\r\n                id?: string;\r\n            }) => ReturnType;\r\n        };\r\n    }\r\n}\r\n\r\nexport const ParagraphSystem = Extension.create<ParagraphSystemOptions>({\r\n    name: 'paragraphSystem',\r\n\r\n    addOptions() {\r\n        return {\r\n            types: ['paragraph', 'heading'],\r\n        };\r\n    },\r\n\r\n    addGlobalAttributes() {\r\n        return [\r\n            {\r\n                types: this.options.types,\r\n                attributes: {\r\n                    spacingBefore: {\r\n                        default: null,\r\n                        parseHTML: element => element.style.marginTop,\r\n                        renderHTML: attributes => {\r\n                            if (!attributes.spacingBefore) return {};\r\n                            return { style: `margin-top: ${attributes.spacingBefore}` };\r\n                        },\r\n                    },\r\n                    spacingAfter: {\r\n                        default: null,\r\n                        parseHTML: element => element.style.marginBottom,\r\n                        renderHTML: attributes => {\r\n                            if (!attributes.spacingAfter) return {};\r\n                            return { style: `margin-bottom: ${attributes.spacingAfter}` };\r\n                        },\r\n                    },\r\n                    firstLineIndent: {\r\n                        default: null,\r\n                        parseHTML: element => element.style.textIndent,\r\n                        renderHTML: attributes => {\r\n                            if (!attributes.firstLineIndent) return {};\r\n                            return { style: `text-indent: ${attributes.firstLineIndent}` };\r\n                        },\r\n                    },\r\n                    hangingIndent: {\r\n                        default: null,\r\n                        parseHTML: element => {\r\n                            const padding = element.style.paddingLeft;\r\n                            const indent = element.style.textIndent;\r\n                            if (indent.startsWith('-')) return padding;\r\n                            return null;\r\n                        },\r\n                        renderHTML: attributes => {\r\n                            if (!attributes.hangingIndent) return {};\r\n                            return {\r\n                                style: `padding-left: ${attributes.hangingIndent}; text-indent: -${attributes.hangingIndent}`,\r\n                            };\r\n                        },\r\n                    },\r\n                    backgroundColor: {\r\n                        default: null,\r\n                        parseHTML: element => element.style.backgroundColor,\r\n                        renderHTML: attributes => {\r\n                            if (!attributes.backgroundColor) return {};\r\n                            return { style: `background-color: ${attributes.backgroundColor}` };\r\n                        },\r\n                    },\r\n                    border: {\r\n                        default: null,\r\n                        parseHTML: element => element.style.border,\r\n                        renderHTML: attributes => {\r\n                            if (!attributes.border) return {};\r\n                            return { style: `border: ${attributes.border}` };\r\n                        },\r\n                    },\r\n                    class: {\r\n                        default: null,\r\n                        parseHTML: element => element.getAttribute('class'),\r\n                        renderHTML: attributes => {\r\n                            if (!attributes.class) return {};\r\n                            return { class: attributes.class };\r\n                        },\r\n                    },\r\n                    id: {\r\n                        default: null,\r\n                        parseHTML: element => element.getAttribute('id'),\r\n                        renderHTML: attributes => {\r\n                            if (!attributes.id) return {};\r\n                            return { id: attributes.id };\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n        ];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            setParagraphLayout: (attrs) => ({ commands }) => {\r\n                return this.options.types.every((type) =>\r\n                    commands.updateAttributes(type, {\r\n                        spacingBefore: attrs.before,\r\n                        spacingAfter: attrs.after,\r\n                        firstLineIndent: attrs.firstLineIndent,\r\n                        hangingIndent: attrs.hangingIndent,\r\n                        backgroundColor: attrs.backgroundColor,\r\n                        border: attrs.border,\r\n                        class: attrs.class,\r\n                        id: attrs.id,\r\n                    })\r\n                );\r\n            },\r\n        };\r\n    },\r\n});\r\n","export interface StyleDefinition {\r\n    name: string;\r\n    parent?: string;\r\n    attributes: Record<string, any>;\r\n}\r\n\r\nexport class StyleManager {\r\n    private styles: Map<string, StyleDefinition> = new Map();\r\n\r\n    constructor() {\r\n        this.setupDefaultStyles();\r\n    }\r\n\r\n    private setupDefaultStyles() {\r\n        this.addStyle({\r\n            name: 'Normal',\r\n            attributes: {\r\n                fontFamily: 'Inter',\r\n                fontSize: '11pt',\r\n                color: '#000000',\r\n                textAlign: 'left',\r\n                lineHeight: '1.2',\r\n                spacingAfter: '8pt',\r\n            },\r\n        });\r\n\r\n        this.addStyle({\r\n            name: 'Heading 1',\r\n            parent: 'Normal',\r\n            attributes: {\r\n                fontSize: '24pt',\r\n                fontWeight: 'bold',\r\n                spacingBefore: '12pt',\r\n                spacingAfter: '12pt',\r\n            },\r\n        });\r\n\r\n        this.addStyle({\r\n            name: 'Heading 2',\r\n            parent: 'Normal',\r\n            attributes: {\r\n                fontSize: '18pt',\r\n                fontWeight: 'bold',\r\n                spacingBefore: '10pt',\r\n                spacingAfter: '10pt',\r\n            },\r\n        });\r\n\r\n        this.addStyle({\r\n            name: 'Quote',\r\n            parent: 'Normal',\r\n            attributes: {\r\n                fontStyle: 'italic',\r\n                indent: 1,\r\n                color: '#666666',\r\n            },\r\n        });\r\n    }\r\n\r\n    public addStyle(style: StyleDefinition) {\r\n        this.styles.set(style.name, style);\r\n    }\r\n\r\n    public getStyle(name: string): StyleDefinition | undefined {\r\n        return this.styles.get(name);\r\n    }\r\n\r\n    /**\r\n     * Resolves a style by merging it with all its parents.\r\n     */\r\n    public resolveStyle(name: string): Record<string, any> {\r\n        const style = this.getStyle(name);\r\n        if (!style) return {};\r\n\r\n        let resolved = { ...style.attributes };\r\n        let currentParent = style.parent;\r\n\r\n        while (currentParent) {\r\n            const parentStyle = this.getStyle(currentParent);\r\n            if (parentStyle) {\r\n                // Merge attributes, keeping existing child attributes\r\n                resolved = { ...parentStyle.attributes, ...resolved };\r\n                currentParent = parentStyle.parent;\r\n            } else {\r\n                currentParent = undefined;\r\n            }\r\n        }\r\n\r\n        return resolved;\r\n    }\r\n\r\n    public getAllStyles(): StyleDefinition[] {\r\n        return Array.from(this.styles.values());\r\n    }\r\n}\r\n","import { Extension } from '@tiptap/core';\r\nimport { StyleManager } from '../StyleManager';\r\n\r\nexport interface StylesEngineOptions {\r\n    manager: StyleManager;\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n    interface Commands<ReturnType> {\r\n        stylesEngine: {\r\n            /**\r\n             * Apply a named style to the selection.\r\n             */\r\n            applyNamedStyle: (name: string) => ReturnType;\r\n            /**\r\n             * Update a named style definition.\r\n             */\r\n            updateNamedStyle: (name: string, attributes: Record<string, any>) => ReturnType;\r\n        };\r\n    }\r\n}\r\n\r\nexport const StylesEngine = Extension.create<StylesEngineOptions>({\r\n    name: 'stylesEngine',\r\n\r\n    addOptions() {\r\n        return {\r\n            manager: new StyleManager(),\r\n        };\r\n    },\r\n\r\n    addGlobalAttributes() {\r\n        return [\r\n            {\r\n                types: ['paragraph', 'heading'],\r\n                attributes: {\r\n                    styleName: {\r\n                        default: 'Normal',\r\n                        parseHTML: element => element.getAttribute('data-style-name') || 'Normal',\r\n                        renderHTML: attributes => {\r\n                            if (!attributes.styleName || attributes.styleName === 'Normal') {\r\n                                return {};\r\n                            }\r\n                            return { 'data-style-name': attributes.styleName };\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n        ];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            applyNamedStyle: (name: string) => ({ chain, commands }) => {\r\n                const resolvedAttributes = this.options.manager.resolveStyle(name);\r\n\r\n                // 1. Update the block attributes (spacing, align, etc.)\r\n                // 2. Wrap/Update the node type if necessary (e.g. Heading 1 -> heading level 1)\r\n                let chainExec = chain().focus().updateAttributes('paragraph', { styleName: name, ...resolvedAttributes });\r\n\r\n                if (name.startsWith('Heading')) {\r\n                    const level = (parseInt(name.replace('Heading ', '')) || 1) as any;\r\n                    chainExec = chainExec.setHeading({ level }).updateAttributes('heading', { styleName: name, ...resolvedAttributes });\r\n                } else if (name === 'Normal' || name === 'Quote') {\r\n                    chainExec = chainExec.setParagraph().updateAttributes('paragraph', { styleName: name, ...resolvedAttributes });\r\n                }\r\n\r\n                // 3. Apply character marks if defined in the style (e.g. bold, fontSize)\r\n                // Note: In Tiptap, some attributes are marks and some are node attributes.\r\n                // For simplicity in Phase 2, we focus on node attributes.\r\n\r\n                return chainExec.run();\r\n            },\r\n\r\n            updateNamedStyle: (name, attributes) => () => {\r\n                const style = this.options.manager.getStyle(name);\r\n                if (style) {\r\n                    style.attributes = { ...style.attributes, ...attributes };\r\n                    // TODO: In a more advanced implementation, this should trigger a re-render of all nodes with this style\r\n                    return true;\r\n                }\r\n                return false;\r\n            },\r\n        };\r\n    },\r\n});\r\n","import { Extension } from '@tiptap/core';\n\nexport type PageSize = 'A3' | 'A4' | 'A5' | 'Letter' | 'Legal' | 'Tabloid' | 'Custom';\nexport type Orientation = 'portrait' | 'landscape';\n\nexport interface PageLayoutOptions {\n    pageSize: PageSize;\n    orientation: Orientation;\n    /** Custom width when pageSize is 'Custom' (e.g. '210mm'). */\n    width?: string;\n    /** Custom height when pageSize is 'Custom' (e.g. '297mm'). */\n    height?: string;\n    margins: {\n        top: string;\n        bottom: string;\n        left: string;\n        right: string;\n    };\n}\n\nexport const DEFAULT_PAGE_LAYOUT: PageLayoutOptions = {\n    pageSize: 'A4',\n    orientation: 'portrait',\n    margins: {\n        top: '1in',\n        bottom: '1in',\n        left: '1in',\n        right: '1in',\n    },\n};\n\ndeclare module '@tiptap/core' {\n    interface Commands<ReturnType> {\n        pageLayout: {\n            setPageLayout: (options: Partial<PageLayoutOptions>) => ReturnType;\n        };\n    }\n}\n\nexport const PageLayout = Extension.create<PageLayoutOptions>({\n    name: 'pageLayout',\n\n    addOptions() {\n        return { ...DEFAULT_PAGE_LAYOUT };\n    },\n\n    addStorage() {\n        return { ...DEFAULT_PAGE_LAYOUT };\n    },\n\n    onCreate() {\n        Object.assign(this.storage, this.options);\n    },\n\n    addCommands() {\n        return {\n            setPageLayout: (options) => ({ editor }) => {\n                Object.assign(this.options, options);\n                if (options.margins) {\n                    this.options.margins = { ...this.options.margins, ...options.margins };\n                }\n                Object.assign(this.storage, this.options);\n                const parent = (editor as any).options.parent;\n                if (parent && typeof parent.setPageLayout === 'function') {\n                    parent.setPageLayout(this.options);\n                }\n                return true;\n            },\n        };\n    },\n});\n","import { Node, mergeAttributes } from '@tiptap/core';\r\n\r\nexport interface SectionOptions {\r\n    HTMLAttributes: Record<string, any>;\r\n}\r\n\r\ndeclare module '@tiptap/core' {\r\n    interface Commands<ReturnType> {\r\n        section: {\r\n            /**\r\n             * Insert a section break\r\n             */\r\n            insertSectionBreak: () => ReturnType;\r\n        };\r\n    }\r\n}\r\n\r\nexport const Section = Node.create<SectionOptions>({\r\n    name: 'section',\r\n    group: 'block',\r\n    content: 'block+',\r\n    defining: true,\r\n\r\n    addAttributes() {\r\n        return {\r\n            id: {\r\n                default: null,\r\n            },\r\n            pageSize: {\r\n                default: 'A4',\r\n            },\r\n            orientation: {\r\n                default: 'portrait',\r\n            },\r\n            marginTop: {\r\n                default: '1in',\r\n            },\r\n            marginBottom: {\r\n                default: '1in',\r\n            },\r\n            marginLeft: {\r\n                default: '1in',\r\n            },\r\n            marginRight: {\r\n                default: '1in',\r\n            },\r\n        };\r\n    },\r\n\r\n    parseHTML() {\r\n        return [\r\n            {\r\n                tag: 'section.rk-section',\r\n            },\r\n        ];\r\n    },\r\n\r\n    renderHTML({ HTMLAttributes }) {\r\n        return ['section', mergeAttributes(HTMLAttributes, { class: 'rk-section' }), 0];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            insertSectionBreak: () => ({ chain }) => {\r\n                return chain()\r\n                    .focus()\r\n                    .insertContent({ type: this.name, content: [{ type: 'paragraph' }] })\r\n                    .run();\r\n            },\r\n        };\r\n    },\r\n});\r\n","import { Node, mergeAttributes } from '@tiptap/core';\r\n\r\nexport const Header = Node.create({\r\n    name: 'header',\r\n    group: 'block',\r\n    content: 'block+',\r\n    selectable: false,\r\n    draggable: false,\r\n\r\n    parseHTML() {\r\n        return [{ tag: 'header.rk-header' }];\r\n    },\r\n\r\n    renderHTML({ HTMLAttributes }) {\r\n        return ['header', mergeAttributes(HTMLAttributes, { class: 'rk-header' }), 0];\r\n    },\r\n});\r\n\r\nexport const Footer = Node.create({\r\n    name: 'footer',\r\n    group: 'block',\r\n    content: 'block+',\r\n    selectable: false,\r\n    draggable: false,\r\n\r\n    parseHTML() {\r\n        return [{ tag: 'footer.rk-footer' }];\r\n    },\r\n\r\n    renderHTML({ HTMLAttributes }) {\r\n        return ['footer', mergeAttributes(HTMLAttributes, { class: 'rk-footer' }), 0];\r\n    },\r\n});\r\n\r\nexport const PageNumber = Node.create({\r\n    name: 'pageNumber',\r\n    group: 'inline',\r\n    inline: true,\r\n    selectable: false,\r\n    draggable: false,\r\n\r\n    renderHTML() {\r\n        return ['span', { class: 'rk-page-number' }, '1']; // Placeholder, UI handles actual number\r\n    },\r\n});\r\n","import { Extension } from '@tiptap/core';\r\n\r\n/**\r\n * TableStyles extension - Adds style attributes to tables.\r\n */\r\nexport const TableStyles = Extension.create({\r\n    name: 'tableStyles',\r\n\r\n    addGlobalAttributes() {\r\n        return [\r\n            {\r\n                types: ['table'],\r\n                attributes: {\r\n                    tableStyle: {\r\n                        default: 'standard',\r\n                        parseHTML: (element: HTMLElement) => element.getAttribute('data-table-style'),\r\n                        renderHTML: (attributes: any) => {\r\n                            if (!attributes.tableStyle) return {};\r\n                            return { 'data-table-style': attributes.tableStyle };\r\n                        },\r\n                    },\r\n                    borderWidth: {\r\n                        default: null,\r\n                        parseHTML: (element: HTMLElement) => element.style.borderWidth,\r\n                        renderHTML: (attributes: any) => {\r\n                            if (!attributes.borderWidth) return {};\r\n                            return { style: `border-width: ${attributes.borderWidth}` };\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n        ];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            setTableStyle: (style: string) => ({ commands }: { commands: any }) => {\r\n                return commands.updateAttributes('table', { tableStyle: style });\r\n            },\r\n            setTableBorder: (width: string) => ({ commands }: { commands: any }) => {\r\n                return commands.updateAttributes('table', { borderWidth: width });\r\n            },\r\n        } as any;\r\n    },\r\n});\r\n","import { Extension } from '@tiptap/core';\r\n\r\nexport const MultilevelList = Extension.create({\r\n    name: 'multilevelList',\r\n\r\n    addGlobalAttributes() {\r\n        return [\r\n            {\r\n                types: ['bulletList', 'orderedList'],\r\n                attributes: {\r\n                    listStyle: {\r\n                        default: null,\r\n                        parseHTML: (element: HTMLElement) => element.getAttribute('data-list-style'),\r\n                        renderHTML: (attributes: any) => {\r\n                            if (!attributes.listStyle) return {};\r\n                            return {\r\n                                'data-list-style': attributes.listStyle,\r\n                                class: attributes.listStyle === 'nepali' ? 'rk-list-nepali' : '',\r\n                                style: `list-style-type: ${attributes.listStyle === 'nepali' ? 'none' : attributes.listStyle}`,\r\n                            };\r\n                        },\r\n                    },\r\n                    startNumber: {\r\n                        default: 1,\r\n                        parseHTML: (element: HTMLElement) => parseInt(element.getAttribute('start') || '1', 10),\r\n                        renderHTML: (attributes: any) => {\r\n                            if (!attributes.startNumber || attributes.startNumber === 1) return {};\r\n                            return { start: String(attributes.startNumber) };\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n            {\r\n                types: ['listItem'],\r\n                attributes: {\r\n                    listLevel: {\r\n                        default: 1,\r\n                        parseHTML: (element: HTMLElement) => parseInt(element.getAttribute('data-list-level') || '1', 10),\r\n                        renderHTML: (attributes: any) => {\r\n                            return { 'data-list-level': String(attributes.listLevel || 1) };\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n        ];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            setListStyle: (listStyle: string) => ({ state, dispatch }: { state: any, dispatch?: any }) => {\r\n                const { selection } = state;\r\n                let tr = state.tr;\r\n                let found = false;\r\n\r\n                state.doc.nodesBetween(selection.from, selection.to, (node: any, pos: number) => {\r\n                    if (node.type.name === 'orderedList' || node.type.name === 'bulletList') {\r\n                        tr = tr.setNodeMarkup(pos, undefined, { ...node.attrs, listStyle });\r\n                        found = true;\r\n                    }\r\n                });\r\n\r\n                if (found) {\r\n                    if (dispatch) dispatch(tr);\r\n                    return true;\r\n                }\r\n\r\n                return false;\r\n            },\r\n            setListStartNumber: (startNumber: number) => ({ commands }: { commands: any }) => {\r\n                return commands.updateAttributes('orderedList', { startNumber });\r\n            },\r\n            setLegalNumbering: () => ({ commands }: { commands: any }) => {\r\n                return commands.updateAttributes('orderedList', { listStyle: 'decimal' });\r\n            },\r\n        } as any;\r\n    },\r\n});\r\n","import { Node, mergeAttributes } from '@tiptap/core';\r\n\r\n/**\r\n * Caption node - Adds a caption to images and tables.\r\n * Allows numbered captions \"Figure 1: ...\" or \"Table 2: ...\".\r\n */\r\nexport const Caption = Node.create({\r\n    name: 'caption',\r\n    group: 'block',\r\n    content: 'inline*',\r\n    selectable: false,\r\n    draggable: false,\r\n\r\n    addAttributes() {\r\n        return {\r\n            captionType: {\r\n                default: 'Figure',\r\n                parseHTML: (element: HTMLElement) => element.getAttribute('data-caption-type'),\r\n                renderHTML: (attributes: any) => ({ 'data-caption-type': attributes.captionType }),\r\n            },\r\n            captionNumber: {\r\n                default: null,\r\n                parseHTML: (element: HTMLElement) => element.getAttribute('data-caption-number'),\r\n                renderHTML: (attributes: any) => {\r\n                    if (!attributes.captionNumber) return {};\r\n                    return { 'data-caption-number': attributes.captionNumber };\r\n                },\r\n            },\r\n        };\r\n    },\r\n\r\n    parseHTML() {\r\n        return [{ tag: 'figcaption' }];\r\n    },\r\n\r\n    renderHTML({ HTMLAttributes }: { HTMLAttributes: any }) {\r\n        return ['figcaption', mergeAttributes({ class: 'rk-caption' }, HTMLAttributes), 0];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            insertCaption: (type = 'Figure') => ({ commands }: { commands: any }) => {\r\n                return commands.insertContent({\r\n                    type: 'caption',\r\n                    attrs: { captionType: type },\r\n                    content: [{ type: 'text', text: `${type}: ` }],\r\n                });\r\n            },\r\n        } as any;\r\n    },\r\n});\r\n","import { Extension } from '@tiptap/core';\r\n\r\nexport const ImageResize = Extension.create({\r\n    name: 'imageResize',\r\n\r\n    addGlobalAttributes() {\r\n        return [\r\n            {\r\n                types: ['image'],\r\n                attributes: {\r\n                    width: {\r\n                        default: null,\r\n                        parseHTML: (element: HTMLElement) => {\r\n                            const w = element.getAttribute('width') || element.style.width;\r\n                            return w || null;\r\n                        },\r\n                        renderHTML: (attributes: any) => {\r\n                            if (!attributes.width) return {};\r\n                            return { style: `width: ${attributes.width}; max-width: 100%;` };\r\n                        },\r\n                    },\r\n                    height: {\r\n                        default: null,\r\n                        parseHTML: (element: HTMLElement) => element.getAttribute('height') || element.style.height || null,\r\n                        renderHTML: (attributes: any) => {\r\n                            if (!attributes.height) return {};\r\n                            return { style: `height: ${attributes.height};` };\r\n                        },\r\n                    },\r\n                    float: {\r\n                        default: null,\r\n                        parseHTML: (element: HTMLElement) => element.style.float || null,\r\n                        renderHTML: (attributes: any) => {\r\n                            if (!attributes.float) return {};\r\n                            return { style: `float: ${attributes.float}; margin: 0.5em;` };\r\n                        },\r\n                    },\r\n                    align: {\r\n                        default: null,\r\n                        parseHTML: (element: HTMLElement) => element.getAttribute('data-align'),\r\n                        renderHTML: (attributes: any) => {\r\n                            if (!attributes.align) return {};\r\n                            return { 'data-align': attributes.align };\r\n                        },\r\n                    },\r\n                },\r\n            },\r\n        ];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            setImageSize: (width: string, height?: string) => ({ commands }: { commands: any }) => {\r\n                return commands.updateAttributes('image', { width, height: height || null });\r\n            },\r\n            setImageFloat: (float: 'left' | 'right' | 'none') => ({ commands }: { commands: any }) => {\r\n                return commands.updateAttributes('image', { float: float === 'none' ? null : float });\r\n            },\r\n            setImageInline: () => ({ commands }: { commands: any }) => {\r\n                return commands.updateAttributes('image', { float: null });\r\n            },\r\n        } as any;\r\n    },\r\n});\r\n","import { Node, mergeAttributes } from '@tiptap/core';\r\n\r\nexport const MathInline = Node.create({\r\n    name: 'mathInline',\r\n    group: 'inline',\r\n    inline: true,\r\n    atom: true,\r\n\r\n    addAttributes() {\r\n        return {\r\n            latex: {\r\n                default: '',\r\n                parseHTML: (element: HTMLElement) => element.getAttribute('data-latex') || element.textContent,\r\n                renderHTML: (attributes: any) => ({ 'data-latex': attributes.latex }),\r\n            },\r\n        };\r\n    },\r\n\r\n    parseHTML() {\r\n        return [{ tag: 'span[data-type=\"math-inline\"]' }];\r\n    },\r\n\r\n    renderHTML({ HTMLAttributes, node }: { HTMLAttributes: any; node: any }) {\r\n        return [\r\n            'span',\r\n            mergeAttributes({ 'data-type': 'math-inline', class: 'rk-math-inline' }, HTMLAttributes),\r\n            node.attrs.latex || '',\r\n        ];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            insertMathInline: (latex: string) => ({ commands }: { commands: any }) => {\r\n                return commands.insertContent({\r\n                    type: 'mathInline',\r\n                    attrs: { latex },\r\n                });\r\n            },\r\n        } as any;\r\n    },\r\n});\r\n\r\nexport const MathBlock = Node.create({\r\n    name: 'mathBlock',\r\n    group: 'block',\r\n    atom: true,\r\n\r\n    addAttributes() {\r\n        return {\r\n            latex: {\r\n                default: '',\r\n                parseHTML: (element: HTMLElement) => element.getAttribute('data-latex') || element.textContent,\r\n                renderHTML: (attributes: any) => ({ 'data-latex': attributes.latex }),\r\n            },\r\n        };\r\n    },\r\n\r\n    parseHTML() {\r\n        return [{ tag: 'div[data-type=\"math-block\"]' }];\r\n    },\r\n\r\n    renderHTML({ HTMLAttributes, node }: { HTMLAttributes: any; node: any }) {\r\n        return [\r\n            'div',\r\n            mergeAttributes({ 'data-type': 'math-block', class: 'rk-math-block' }, HTMLAttributes),\r\n            node.attrs.latex || '',\r\n        ];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            insertMathBlock: (latex: string) => ({ commands }: { commands: any }) => {\r\n                return commands.insertContent({\r\n                    type: 'mathBlock',\r\n                    attrs: { latex },\r\n                });\r\n            },\r\n        } as any;\r\n    },\r\n});\r\n","import { Extension, Node, mergeAttributes } from '@tiptap/core';\n\ndeclare module '@tiptap/core' {\n    interface Commands<ReturnType> {\n        tableOfContents: {\n            /** Insert a Table of Contents node at the cursor. */\n            insertTableOfContents: (attrs?: TocAttrs) => ReturnType;\n            /** Re-scan the document and refresh every TOC node. */\n            refreshTableOfContents: () => ReturnType;\n            /** Update the level filter for the TOC at the current selection. */\n            setTocLevels: (minLevel: number, maxLevel: number) => ReturnType;\n        };\n    }\n}\n\ninterface TocAttrs {\n    /** Minimum heading level to include (default 1). */\n    minLevel?: number;\n    /** Maximum heading level to include (default 3). */\n    maxLevel?: number;\n    /** Display title shown above the TOC (\"Table of contents\"). */\n    title?: string;\n    /** Show the dotted leader between text and page number (default true). */\n    showLeader?: boolean;\n    /** Show estimated page numbers (default true). */\n    showPageNumbers?: boolean;\n}\n\ninterface HeadingItem {\n    level: number;\n    text: string;\n    id: string;\n    pos: number;\n    estimatedPage: number;\n}\n\nconst TOC_TYPE = 'tableOfContents';\n\n/**\n * Table of Contents extension.\n *\n * - Backed by a real `tableOfContents` node so it survives copy/paste, undo/redo,\n *   serialisation and round-trips through HTML/JSON.\n * - Renders as a static HTML block in the document; the engine refreshes it\n *   whenever the user runs `refreshTableOfContents()` (and once on insert).\n * - Configurable via `minLevel`, `maxLevel`, `title`, `showLeader`, `showPageNumbers`.\n * - Page numbers are estimated from a rough characters-per-page heuristic until\n *   the host application supplies a real pagination map. Works well in practice\n *   because the dotted leaders absorb minor mis-alignment.\n */\nexport const TableOfContents = Node.create({\n    name: TOC_TYPE,\n    group: 'block',\n    atom: true,\n    draggable: true,\n    selectable: true,\n\n    addAttributes() {\n        return {\n            minLevel: {\n                default: 1,\n                parseHTML: (el: HTMLElement) => Number(el.getAttribute('data-min-level') || 1),\n                renderHTML: (a: any) => ({ 'data-min-level': String(a.minLevel ?? 1) }),\n            },\n            maxLevel: {\n                default: 3,\n                parseHTML: (el: HTMLElement) => Number(el.getAttribute('data-max-level') || 3),\n                renderHTML: (a: any) => ({ 'data-max-level': String(a.maxLevel ?? 3) }),\n            },\n            title: {\n                default: 'Table of contents',\n                parseHTML: (el: HTMLElement) => el.getAttribute('data-title') || 'Table of contents',\n                renderHTML: (a: any) => ({ 'data-title': a.title || 'Table of contents' }),\n            },\n            showLeader: {\n                default: true,\n                parseHTML: (el: HTMLElement) => el.getAttribute('data-leader') !== 'false',\n                renderHTML: (a: any) => ({ 'data-leader': a.showLeader === false ? 'false' : 'true' }),\n            },\n            showPageNumbers: {\n                default: true,\n                parseHTML: (el: HTMLElement) => el.getAttribute('data-pagenums') !== 'false',\n                renderHTML: (a: any) => ({ 'data-pagenums': a.showPageNumbers === false ? 'false' : 'true' }),\n            },\n        };\n    },\n\n    parseHTML() {\n        return [{ tag: 'div[data-type=\"toc\"]' }];\n    },\n\n    renderHTML({ HTMLAttributes }) {\n        return ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'toc', class: 'rk-toc' }),\n            // We render content via a NodeView; this fallback keeps SSR safe.\n            ['div', { class: 'rk-toc-fallback' }, 'Table of contents'],\n        ];\n    },\n\n    addCommands() {\n        return {\n            insertTableOfContents:\n                (attrs: TocAttrs = {}) =>\n                ({ commands }: { commands: any }) => {\n                    return commands.insertContent({\n                        type: TOC_TYPE,\n                        attrs: {\n                            minLevel: attrs.minLevel ?? 1,\n                            maxLevel: attrs.maxLevel ?? 3,\n                            title: attrs.title ?? 'Table of contents',\n                            showLeader: attrs.showLeader !== false,\n                            showPageNumbers: attrs.showPageNumbers !== false,\n                        },\n                    });\n                },\n\n            refreshTableOfContents:\n                () =>\n                ({ editor, tr, dispatch }: { editor: any; tr: any; dispatch: any }) => {\n                    if (!dispatch) return false;\n                    let changed = false;\n                    editor.state.doc.descendants((node: any, pos: number) => {\n                        if (node.type.name === TOC_TYPE) {\n                            // Force a re-render by toggling a hidden attr.\n                            tr.setNodeMarkup(pos, undefined, { ...node.attrs, _refresh: Date.now() });\n                            changed = true;\n                        }\n                    });\n                    if (changed) dispatch(tr);\n                    return changed;\n                },\n\n            setTocLevels:\n                (minLevel: number, maxLevel: number) =>\n                ({ editor, tr, dispatch }: { editor: any; tr: any; dispatch: any }) => {\n                    const $from = editor.state.selection.$from;\n                    for (let d = $from.depth; d >= 0; d--) {\n                        const n = $from.node(d);\n                        if (n.type.name === TOC_TYPE) {\n                            const pos = $from.before(d);\n                            if (dispatch) {\n                                tr.setNodeMarkup(pos, undefined, { ...n.attrs, minLevel, maxLevel });\n                                dispatch(tr);\n                            }\n                            return true;\n                        }\n                    }\n                    return false;\n                },\n        };\n    },\n\n    addNodeView() {\n        return ({ node, editor, getPos }) => {\n            const root = document.createElement('div');\n            root.classList.add('rk-toc');\n            root.dataset.type = 'toc';\n            root.contentEditable = 'false';\n\n            const render = (n: any) => {\n                const items = collectHeadings(editor.state.doc, n.attrs.minLevel || 1, n.attrs.maxLevel || 3);\n                root.innerHTML = '';\n\n                const header = document.createElement('div');\n                header.className = 'rk-toc-header';\n                header.innerHTML = `\n                    <h2 class=\"rk-toc-title\">${escapeHtml(n.attrs.title || 'Table of contents')}</h2>\n                    <button class=\"rk-toc-refresh\" type=\"button\" title=\"Refresh table of contents\">↻ Refresh</button>\n                `;\n                header.querySelector('.rk-toc-refresh')?.addEventListener('click', (e) => {\n                    e.preventDefault();\n                    e.stopPropagation();\n                    (editor.commands as any).refreshTableOfContents();\n                });\n                root.appendChild(header);\n\n                if (items.length === 0) {\n                    const empty = document.createElement('p');\n                    empty.className = 'rk-toc-empty';\n                    empty.textContent = 'No headings yet — add a heading (H1–H6) to populate this table of contents.';\n                    root.appendChild(empty);\n                    return;\n                }\n\n                const list = document.createElement('ol');\n                list.className = 'rk-toc-list';\n                for (const item of items) {\n                    const li = document.createElement('li');\n                    li.className = `rk-toc-item rk-toc-l${item.level}`;\n                    const link = document.createElement('a');\n                    link.className = 'rk-toc-link';\n                    link.href = `#${item.id}`;\n                    link.dataset.pos = String(item.pos);\n\n                    const text = document.createElement('span');\n                    text.className = 'rk-toc-text';\n                    text.textContent = item.text;\n\n                    link.appendChild(text);\n\n                    if (n.attrs.showLeader !== false) {\n                        const leader = document.createElement('span');\n                        leader.className = 'rk-toc-leader';\n                        leader.setAttribute('aria-hidden', 'true');\n                        link.appendChild(leader);\n                    }\n\n                    if (n.attrs.showPageNumbers !== false) {\n                        const page = document.createElement('span');\n                        page.className = 'rk-toc-page';\n                        page.textContent = String(item.estimatedPage);\n                        link.appendChild(page);\n                    }\n\n                    link.addEventListener('click', (e) => {\n                        e.preventDefault();\n                        const pos = Number(link.dataset.pos);\n                        if (Number.isFinite(pos)) {\n                            const dom = editor.view.nodeDOM(pos) as HTMLElement | null;\n                            editor.commands.setTextSelection(pos + 1);\n                            if (dom?.scrollIntoView) {\n                                dom.scrollIntoView({ behavior: 'smooth', block: 'start' });\n                            } else {\n                                editor.commands.scrollIntoView();\n                            }\n                        }\n                    });\n\n                    li.appendChild(link);\n                    list.appendChild(li);\n                }\n                root.appendChild(list);\n            };\n\n            render(node);\n\n            // No auto-refresh — TOCs only update when:\n            //   1. the user clicks the inline Refresh button, or\n            //   2. the user calls `editor.format.refreshTableOfContents()`, or\n            //   3. the node attrs change (level filter, title, etc.).\n            return {\n                dom: root,\n                update(updated) {\n                    if (updated.type.name !== TOC_TYPE) return false;\n                    render(updated);\n                    return true;\n                },\n                destroy() { /* nothing to clean up */ },\n                stopEvent(event) {\n                    // Allow the refresh button + heading links to receive clicks.\n                    return !!(event.target as HTMLElement)?.closest?.('button, a');\n                },\n            };\n        };\n    },\n});\n\n/** Re-export the legacy storage extension name so existing code keeps working. */\nexport { TableOfContents as default };\n\n// ---- helpers ----\n\nfunction collectHeadings(doc: any, minLevel: number, maxLevel: number): HeadingItem[] {\n    const items: HeadingItem[] = [];\n    let charCount = 0;\n    // Rough heuristic: ~1500 characters per A4 page at 11pt with 1in margins.\n    const CHARS_PER_PAGE = 1500;\n    doc.descendants((node: any, pos: number) => {\n        if (node.isText) charCount += node.text?.length || 0;\n        if (node.type.name === 'heading') {\n            const level = node.attrs.level;\n            if (level >= minLevel && level <= maxLevel) {\n                const text = node.textContent;\n                if (!text.trim()) return;\n                items.push({\n                    level,\n                    text,\n                    id: slug(text),\n                    pos,\n                    estimatedPage: Math.max(1, Math.ceil(charCount / CHARS_PER_PAGE)),\n                });\n            }\n        }\n        return true;\n    });\n    return items;\n}\n\nfunction slug(s: string): string {\n    return s.toLowerCase().trim()\n        .replace(/[^\\w\\s-]/g, '')\n        .replace(/\\s+/g, '-')\n        .replace(/-+/g, '-');\n}\n\nfunction escapeHtml(s: string): string {\n    return s.replace(/[&<>\"']/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]!));\n}\n","import { Node, mergeAttributes } from '@tiptap/core';\r\n\r\nexport const Citation = Node.create({\r\n    name: 'citation',\r\n    group: 'inline',\r\n    inline: true,\r\n    atom: true,\r\n\r\n    addAttributes() {\r\n        return {\r\n            key: {\r\n                default: '',\r\n                parseHTML: (element: HTMLElement) => element.getAttribute('data-key'),\r\n                renderHTML: (attributes: any) => ({ 'data-key': attributes.key }),\r\n            },\r\n            label: {\r\n                default: '',\r\n                parseHTML: (element: HTMLElement) => element.textContent,\r\n                renderHTML: () => ({}),\r\n            },\r\n        };\r\n    },\r\n\r\n    parseHTML() {\r\n        return [{ tag: 'cite[data-type=\"citation\"]' }];\r\n    },\r\n\r\n    renderHTML({ HTMLAttributes, node }: { HTMLAttributes: any; node: any }) {\r\n        return [\r\n            'cite',\r\n            mergeAttributes({ 'data-type': 'citation', class: 'rk-citation' }, HTMLAttributes),\r\n            `[${node.attrs.label || node.attrs.key || '?'}]`,\r\n        ];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            insertCitation: (key: string, label?: string) => ({ commands }: { commands: any }) => {\r\n                return commands.insertContent({\r\n                    type: 'citation',\r\n                    attrs: { key, label: label || key },\r\n                });\r\n            },\r\n        } as any;\r\n    },\r\n});\r\n\r\nexport const Bibliography = Node.create({\r\n    name: 'bibliography',\r\n    group: 'block',\r\n    content: 'block+',\r\n\r\n    parseHTML() {\r\n        return [{ tag: 'section[data-type=\"bibliography\"]' }];\r\n    },\r\n\r\n    renderHTML({ HTMLAttributes }: { HTMLAttributes: any }) {\r\n        return [\r\n            'section',\r\n            mergeAttributes({ 'data-type': 'bibliography', class: 'rk-bibliography' }, HTMLAttributes),\r\n            0,\r\n        ];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            insertBibliography: () => ({ commands }: { commands: any }) => {\r\n                return commands.insertContent({\r\n                    type: 'bibliography',\r\n                    content: [{ type: 'paragraph', content: [{ type: 'text', text: 'References' }] }],\r\n                });\r\n            },\r\n        } as any;\r\n    },\r\n});\r\n","import { Extension } from '@tiptap/core';\r\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\r\n\r\nexport interface SlashCommand {\r\n    title: string;\r\n    description: string;\r\n    icon: string;\r\n    command: (editor: any) => void;\r\n}\r\n\r\nconst DEFAULT_COMMANDS: SlashCommand[] = [\r\n    {\r\n        title: 'Heading 1',\r\n        description: 'Large section heading',\r\n        icon: 'H1',\r\n        command: (editor: any) => editor.chain().focus().toggleHeading({ level: 1 }).run(),\r\n    },\r\n    {\r\n        title: 'Heading 2',\r\n        description: 'Medium section heading',\r\n        icon: 'H2',\r\n        command: (editor: any) => editor.chain().focus().toggleHeading({ level: 2 }).run(),\r\n    },\r\n    {\r\n        title: 'Heading 3',\r\n        description: 'Small section heading',\r\n        icon: 'H3',\r\n        command: (editor: any) => editor.chain().focus().toggleHeading({ level: 3 }).run(),\r\n    },\r\n    {\r\n        title: 'Bullet List',\r\n        description: 'Create a simple bullet list',\r\n        icon: '•',\r\n        command: (editor: any) => editor.chain().focus().toggleBulletList().run(),\r\n    },\r\n    {\r\n        title: 'Numbered List',\r\n        description: 'Create a numbered list',\r\n        icon: '1.',\r\n        command: (editor: any) => editor.chain().focus().toggleOrderedList().run(),\r\n    },\r\n    {\r\n        title: 'Table',\r\n        description: 'Insert a table (3x3)',\r\n        icon: '⊞',\r\n        command: (editor: any) => editor.chain().focus().insertTable({ rows: 3, cols: 3, withHeaderRow: true }).run(),\r\n    },\r\n    {\r\n        title: 'Code Block',\r\n        description: 'Insert a code block',\r\n        icon: '</>',\r\n        command: (editor: any) => editor.chain().focus().toggleCodeBlock().run(),\r\n    },\r\n    {\r\n        title: 'Blockquote',\r\n        description: 'Insert a quote block',\r\n        icon: '\"',\r\n        command: (editor: any) => editor.chain().focus().toggleBlockquote().run(),\r\n    },\r\n    {\r\n        title: 'Horizontal Rule',\r\n        description: 'Insert a divider line',\r\n        icon: '—',\r\n        command: (editor: any) => editor.chain().focus().setHorizontalRule().run(),\r\n    },\r\n];\r\n\r\nexport const SlashCommands = Extension.create({\r\n    name: 'slashCommands',\r\n\r\n    addOptions() {\r\n        return {\r\n            commands: DEFAULT_COMMANDS,\r\n            onShow: null as ((items: SlashCommand[], query: string) => void) | null,\r\n            onHide: null as (() => void) | null,\r\n        };\r\n    },\r\n\r\n    addStorage() {\r\n        return {\r\n            isOpen: false,\r\n            query: '',\r\n            items: [] as SlashCommand[],\r\n        };\r\n    },\r\n\r\n    addProseMirrorPlugins() {\r\n        const extension = this;\r\n\r\n        return [\r\n            new Plugin({\r\n                key: new PluginKey('slashCommands'),\r\n                props: {\r\n                    handleKeyDown(_view: any, event: KeyboardEvent) {\r\n                        if (event.key === 'Escape' && extension.storage.isOpen) {\r\n                            extension.storage.isOpen = false;\r\n                            extension.options.onHide?.();\r\n                            return true;\r\n                        }\r\n                        return false;\r\n                    },\r\n                },\r\n                view() {\r\n                    return {\r\n                        update(view: any, _prevState: any) {\r\n                            const { state } = view;\r\n                            const { selection } = state;\r\n                            const { $from } = selection;\r\n\r\n                            const textBefore = $from.parent.textBetween(0, $from.parentOffset, null, '\\0');\r\n\r\n                            if (textBefore === '/') {\r\n                                extension.storage.isOpen = true;\r\n                                extension.storage.query = '';\r\n                                extension.storage.items = extension.options.commands;\r\n                                extension.options.onShow?.(extension.options.commands, '');\r\n                            } else if (textBefore.startsWith('/') && /^\\/\\w*$/.test(textBefore)) {\r\n                                const query = textBefore.slice(1).toLowerCase();\r\n                                const items = extension.options.commands.filter(\r\n                                    (cmd: SlashCommand) =>\r\n                                        cmd.title.toLowerCase().includes(query) ||\r\n                                        cmd.description.toLowerCase().includes(query)\r\n                                );\r\n                                extension.storage.query = query;\r\n                                extension.storage.items = items;\r\n                                extension.options.onShow?.(items, query);\r\n                            } else if (extension.storage.isOpen) {\r\n                                extension.storage.isOpen = false;\r\n                                extension.options.onHide?.();\r\n                            }\r\n                        },\r\n                    };\r\n                },\r\n            }),\r\n        ];\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            executeSlashCommand: (commandTitle: string) => ({ editor }: { editor: any }) => {\r\n                const cmd = this.options.commands.find(\r\n                    (c: SlashCommand) => c.title === commandTitle\r\n                );\r\n                if (cmd) {\r\n                    const { selection } = editor.state;\r\n                    const from = selection.$from;\r\n                    const start = from.start();\r\n                    editor.chain().deleteRange({ from: start, to: from.pos }).run();\r\n                    cmd.command(editor);\r\n                    return true;\r\n                }\r\n                return false;\r\n            },\r\n        } as any;\r\n    },\r\n});\r\n\r\nexport { DEFAULT_COMMANDS as defaultSlashCommands };\r\n","import { Extension } from '@tiptap/core';\r\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\r\n\r\n/**\r\n * ImageUpload extension - Enables uploading images from PC via file input\r\n * and drag-and-drop onto the editor area.\r\n * Converts files to base64 data URLs and inserts them as img nodes.\r\n */\r\nexport const ImageUpload = Extension.create({\r\n    name: 'imageUpload',\r\n\r\n    addOptions() {\r\n        return {\r\n            maxFileSizeMB: 10,\r\n            acceptedTypes: ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml'],\r\n            onUpload: null as ((file: File) => Promise<string>) | null,\r\n        };\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            uploadImage: (file: File) => ({ editor }: { editor: any }) => {\r\n                if (this.options.onUpload) {\r\n                    this.options.onUpload(file).then((src: string) => {\r\n                        editor.chain().focus().setImage({ src, alt: file.name }).run();\r\n                    });\r\n                } else {\r\n                    const reader = new FileReader();\r\n                    reader.onload = e => {\r\n                        const src = e.target?.result as string;\r\n                        editor.chain().focus().setImage({ src, alt: file.name }).run();\r\n                    };\r\n                    reader.readAsDataURL(file);\r\n                }\r\n                return true;\r\n            },\r\n            openImageUpload: () => () => {\r\n                const input = document.createElement('input');\r\n                input.type = 'file';\r\n                input.accept = 'image/*';\r\n                input.onchange = (e: any) => {\r\n                    const file = e.target.files?.[0];\r\n                    if (file) {\r\n                        // Trigger the uploadImage command\r\n                        (this.editor.commands as any).uploadImage(file);\r\n                    }\r\n                };\r\n                input.click();\r\n                return true;\r\n            },\r\n        } as any;\r\n    },\r\n\r\n    addProseMirrorPlugins() {\r\n        const options = this.options;\r\n        const editor = this.editor;\r\n\r\n        return [\r\n            new Plugin({\r\n                key: new PluginKey('imageUpload'),\r\n                props: {\r\n                    handleDOMEvents: {\r\n                        drop(_view: any, event: DragEvent) {\r\n                            const files = event.dataTransfer?.files;\r\n                            if (!files || files.length === 0) return false;\r\n\r\n                            const imageFiles = Array.from(files).filter(f =>\r\n                                options.acceptedTypes.includes(f.type)\r\n                            );\r\n                            if (imageFiles.length === 0) return false;\r\n\r\n                            event.preventDefault();\r\n                            imageFiles.forEach(file => {\r\n                                if (options.maxFileSizeMB && file.size > options.maxFileSizeMB * 1024 * 1024) {\r\n                                    console.warn(`[rk-editor] Image too large (max ${options.maxFileSizeMB}MB): ${file.name}`);\r\n                                    return;\r\n                                }\r\n                                (editor.commands as any).uploadImage(file);\r\n                            });\r\n                            return true;\r\n                        },\r\n                    },\r\n                    handlePaste: (_view: any, event: ClipboardEvent) => {\r\n                        const items = event.clipboardData?.items;\r\n                        if (!items) return false;\r\n\r\n                        let handled = false;\r\n                        Array.from(items).forEach(item => {\r\n                            if (item.type.startsWith('image/')) {\r\n                                const file = item.getAsFile();\r\n                                if (file) {\r\n                                    if (options.maxFileSizeMB && file.size > options.maxFileSizeMB * 1024 * 1024) {\r\n                                        console.warn(`[rk-editor] Pasted image too large (max ${options.maxFileSizeMB}MB).`);\r\n                                        return;\r\n                                    }\r\n                                    if (options.acceptedTypes && !options.acceptedTypes.includes(file.type)) {\r\n                                        console.warn(`[rk-editor] Unsupported pasted image type: ${file.type}`);\r\n                                        return;\r\n                                    }\r\n\r\n                                    event.preventDefault();\r\n                                    (editor.commands as any).uploadImage(file);\r\n                                    handled = true;\r\n                                }\r\n                            }\r\n                        });\r\n                        return handled;\r\n                    },\r\n                },\r\n            }),\r\n        ];\r\n    },\r\n});\r\n","import { Extension } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\n\ninterface StoredFormat {\n    /** Inline marks to clone (bold, italic, color, font, size, …). */\n    marks: { type: string; attrs: Record<string, any> }[];\n    /** The textblock type and attrs (alignment, line height, indent, …) at the cursor. */\n    nodeType: string | null;\n    nodeAttrs: Record<string, any>;\n}\n\n/**\n * Word-style format painter.\n *\n * Click the painter, optionally with text selected, to capture the formatting\n * (both inline marks AND block attributes — alignment, line-height, indent,\n * spacing). Then click anywhere or drag to apply that formatting to the next\n * selection. Press Esc to cancel.\n */\nexport const FormatPainter = Extension.create({\n    name: 'formatPainter',\n\n    addStorage() {\n        return {\n            isActive: false,\n            storedFormat: null as StoredFormat | null,\n        };\n    },\n\n    addCommands() {\n        return {\n            startFormatPaint: () => ({ editor }: { editor: any }) => {\n                const { state } = editor;\n                const { from, to } = state.selection;\n                const $from = state.selection.$from;\n\n                // 1. Capture inline marks across the selection (or at the cursor).\n                const marks: { type: string; attrs: Record<string, any> }[] = [];\n                const seen = new Set<string>();\n                const range = from === to\n                    ? [Math.max(0, from - 1), from]\n                    : [from, to];\n                state.doc.nodesBetween(range[0], range[1], (node: any) => {\n                    if (!node.isText) return;\n                    for (const mark of node.marks) {\n                        if (seen.has(mark.type.name)) continue;\n                        seen.add(mark.type.name);\n                        marks.push({ type: mark.type.name, attrs: { ...mark.attrs } });\n                    }\n                });\n                // Also pick up stored marks at the cursor (e.g. user typed nothing yet but toggled bold)\n                for (const m of state.storedMarks || $from.marks() || []) {\n                    if (!seen.has(m.type.name)) {\n                        seen.add(m.type.name);\n                        marks.push({ type: m.type.name, attrs: { ...m.attrs } });\n                    }\n                }\n\n                // 2. Capture textblock attrs (alignment, lineHeight, indent, marginTop/Bottom).\n                const parent = $from.parent;\n                const nodeType = parent.isTextblock ? parent.type.name : null;\n                const nodeAttrs = parent.isTextblock ? { ...parent.attrs } : {};\n\n                this.storage.storedFormat = { marks, nodeType, nodeAttrs };\n                this.storage.isActive = true;\n                editor.view.dom?.classList.add('rk-format-paint-mode');\n                return true;\n            },\n\n            cancelFormatPaint: () => ({ editor }: { editor: any }) => {\n                this.storage.isActive = false;\n                this.storage.storedFormat = null;\n                editor.view.dom?.classList.remove('rk-format-paint-mode');\n                return true;\n            },\n\n            applyStoredFormat: () => ({ editor, tr, dispatch }: { editor: any; tr: any; dispatch: any }) => {\n                if (!this.storage.isActive || !this.storage.storedFormat) return false;\n                const fmt = this.storage.storedFormat as StoredFormat;\n                const { from, to } = editor.state.selection;\n                if (from === to) return false; // need a selection to paint onto\n\n                // (a) Apply node attrs to the textblocks in the range.\n                if (fmt.nodeType) {\n                    editor.state.doc.nodesBetween(from, to, (node: any, pos: number) => {\n                        if (!node.isTextblock) return;\n                        const targetType = editor.schema.nodes[fmt.nodeType!];\n                        if (!targetType) return;\n                        try {\n                            tr.setNodeMarkup(pos, targetType, { ...node.attrs, ...fmt.nodeAttrs });\n                        } catch { /* node type mismatch — skip */ }\n                    });\n                }\n\n                // (b) Clear existing inline marks, then apply the captured marks.\n                tr.removeMark(from, to);\n                for (const mark of fmt.marks) {\n                    const markType = editor.schema.marks[mark.type];\n                    if (!markType) continue;\n                    try {\n                        tr.addMark(from, to, markType.create(mark.attrs));\n                    } catch { /* skip incompatible marks */ }\n                }\n\n                if (dispatch) dispatch(tr);\n\n                // Single-shot: deactivate after one application.\n                this.storage.isActive = false;\n                this.storage.storedFormat = null;\n                editor.view.dom?.classList.remove('rk-format-paint-mode');\n                return true;\n            },\n        } as any;\n    },\n\n    addKeyboardShortcuts() {\n        return {\n            Escape: () => {\n                if (this.storage.isActive) {\n                    (this.editor.commands as any).cancelFormatPaint();\n                    return true;\n                }\n                return false;\n            },\n        };\n    },\n\n    addProseMirrorPlugins() {\n        const ext = this;\n        return [\n            new Plugin({\n                key: new PluginKey('formatPainterApply'),\n                props: {\n                    handleDOMEvents: {\n                        mouseup(_view, _event) {\n                            if (!ext.storage.isActive) return false;\n                            // Defer so the selection has been updated by the time we apply.\n                            setTimeout(() => {\n                                if (ext.storage.isActive) {\n                                    (ext.editor.commands as any).applyStoredFormat();\n                                }\n                            }, 0);\n                            return false;\n                        },\n                    },\n                },\n            }),\n        ];\n    },\n});\n","import { Extension } from '@tiptap/core';\r\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\r\nimport { Decoration, DecorationSet } from '@tiptap/pm/view';\r\n\r\n/**\r\n * DragHandle extension - Renders a ⠿ drag handle in the left gutter for\r\n * each block-level node. Clicking and dragging reorders blocks.\r\n */\r\nexport const DragHandle = Extension.create({\r\n    name: 'dragHandle',\r\n\r\n    addProseMirrorPlugins() {\r\n        let draggedNode: { from: number; to: number } | null = null;\r\n        let handleEl: HTMLElement | null = null;\r\n        let currentPos: number | null = null;\r\n\r\n        const plugin = new Plugin({\r\n            key: new PluginKey('dragHandle'),\r\n\r\n            view(editorView: any) {\r\n                handleEl = document.createElement('div');\r\n                handleEl.className = 'rk-drag-handle';\r\n                handleEl.innerHTML = '⠿';\r\n                handleEl.contentEditable = 'false';\r\n                handleEl.setAttribute('draggable', 'true');\r\n                handleEl.title = 'Drag to reorder';\r\n                document.body.appendChild(handleEl);\r\n\r\n                const hide = () => {\r\n                    if (handleEl) handleEl.style.display = 'none';\r\n                };\r\n\r\n                const onMouseMove = (e: MouseEvent) => {\r\n                    if (!handleEl) return;\r\n                    const target = e.target as HTMLElement;\r\n\r\n                    // Find the nearest block-level node\r\n                    const pos = editorView.posAtCoords({ left: e.clientX, top: e.clientY });\r\n                    if (!pos) { hide(); return; }\r\n\r\n                    const resolved = editorView.state.doc.resolve(pos.pos);\r\n                    const blockDepth = resolved.depth > 0 ? 1 : 0;\r\n                    const blockNode = resolved.node(blockDepth);\r\n                    if (!blockNode || !blockNode.isBlock) { hide(); return; }\r\n\r\n                    const dom = editorView.nodeDOM(resolved.start(blockDepth));\r\n                    if (!dom || !(dom instanceof Element)) { hide(); return; }\r\n\r\n                    const rect = dom.getBoundingClientRect();\r\n                    const editorRect = editorView.dom.getBoundingClientRect();\r\n\r\n                    handleEl.style.display = 'flex';\r\n                    handleEl.style.top = `${rect.top + window.scrollY}px`;\r\n                    handleEl.style.left = `${editorRect.left + window.scrollX - 25}px`;\r\n\r\n                    // FIXED: Ensure we don't try to get 'before' the top-level document node (depth 0)\r\n                    try {\r\n                        currentPos = blockDepth > 0 ? resolved.before(blockDepth) : 0;\r\n                    } catch (err) {\r\n                        currentPos = 0;\r\n                    }\r\n                };\r\n\r\n                handleEl.addEventListener('dragstart', (e: DragEvent) => {\r\n                    if (currentPos === null) return;\r\n                    const $pos = editorView.state.doc.resolve(currentPos);\r\n                    const node = $pos.nodeAfter;\r\n                    if (!node) return;\r\n                    draggedNode = { from: currentPos, to: currentPos + node.nodeSize };\r\n                    e.dataTransfer?.setData('text/plain', '');\r\n                });\r\n\r\n                handleEl.addEventListener('dragend', () => {\r\n                    draggedNode = null;\r\n                });\r\n\r\n                editorView.dom.addEventListener('mousemove', onMouseMove);\r\n                editorView.dom.parentElement?.addEventListener('mouseleave', hide);\r\n\r\n                return {\r\n                    destroy() {\r\n                        handleEl?.remove();\r\n                        editorView.dom.removeEventListener('mousemove', onMouseMove);\r\n                    },\r\n                };\r\n            },\r\n\r\n            props: {\r\n                handleDrop(view: any, event: DragEvent, _slice: any, moved: boolean) {\r\n                    if (!draggedNode || !moved) return false;\r\n\r\n                    const coords = { left: event.clientX, top: event.clientY };\r\n                    const dropPos = view.posAtCoords(coords);\r\n                    if (!dropPos) return false;\r\n\r\n                    const { from, to } = draggedNode;\r\n                    const targetPos = dropPos.pos;\r\n\r\n                    // Don't drop inside itself\r\n                    if (targetPos >= from && targetPos <= to) return false;\r\n\r\n                    const node = view.state.doc.slice(from, to).content.firstChild;\r\n                    if (!node) return false;\r\n\r\n                    const tr = view.state.tr;\r\n                    // Delete from original position\r\n                    tr.delete(from, to);\r\n                    // Insert at new position (adjusted)\r\n                    const insertAt = targetPos > to ? targetPos - (to - from) : targetPos;\r\n                    tr.insert(insertAt, node);\r\n                    view.dispatch(tr);\r\n                    draggedNode = null;\r\n                    event.preventDefault();\r\n                    return true;\r\n                },\r\n            },\r\n        });\r\n\r\n        return [plugin];\r\n    },\r\n});\r\n","import { Extension } from '@tiptap/core';\r\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\r\n\r\nexport interface ChangeRecord {\r\n    id: string;\r\n    type: 'insert' | 'delete';\r\n    from: number;\r\n    to: number;\r\n    text: string;\r\n    author: string;\r\n    timestamp: number;\r\n}\r\n\r\n/**\r\n * TrackChanges extension - Marks insertions and deletions with visual indicators.\r\n * Tracks every transaction when enabled and stores change records.\r\n * Supports accept/reject operations per change.\r\n */\r\nexport const TrackChanges = Extension.create({\r\n    name: 'trackChanges',\r\n\r\n    addOptions() {\r\n        return {\r\n            enabled: false,\r\n            author: 'Author',\r\n            onChangesUpdate: null as ((changes: ChangeRecord[]) => void) | null,\r\n        };\r\n    },\r\n\r\n    addStorage() {\r\n        return {\r\n            enabled: false,\r\n            changes: [] as ChangeRecord[],\r\n            author: 'Author',\r\n        };\r\n    },\r\n\r\n    onCreate() {\r\n        this.storage.enabled = this.options.enabled;\r\n        this.storage.author = this.options.author;\r\n    },\r\n\r\n    addCommands() {\r\n        return {\r\n            toggleTrackChanges: () => () => {\r\n                this.storage.enabled = !this.storage.enabled;\r\n                return true;\r\n            },\r\n\r\n            enableTrackChanges: () => () => {\r\n                this.storage.enabled = true;\r\n                return true;\r\n            },\r\n\r\n            disableTrackChanges: () => () => {\r\n                this.storage.enabled = false;\r\n                return true;\r\n            },\r\n\r\n            acceptChange: (changeId: string) => ({ tr, dispatch }: { tr: any; dispatch: any }) => {\r\n                const change = this.storage.changes.find((c: ChangeRecord) => c.id === changeId);\r\n                if (!change || !dispatch) return false;\r\n\r\n                if (change.type === 'delete') {\r\n                    // Accept delete: actually remove the text (remove the mark only, text stays deleted)\r\n                    tr.removeMark(change.from, change.to, this.editor.schema.marks.trackDelete as any);\r\n                    // Remove tracked text from doc\r\n                    tr.delete(change.from, change.to);\r\n                } else {\r\n                    // Accept insert: remove the insert mark, keep text\r\n                    tr.removeMark(change.from, change.to, this.editor.schema.marks.trackInsert as any);\r\n                }\r\n\r\n                this.storage.changes = this.storage.changes.filter((c: ChangeRecord) => c.id !== changeId);\r\n                this.options.onChangesUpdate?.(this.storage.changes);\r\n                dispatch(tr);\r\n                return true;\r\n            },\r\n\r\n            rejectChange: (changeId: string) => ({ tr, dispatch }: { tr: any; dispatch: any }) => {\r\n                const change = this.storage.changes.find((c: ChangeRecord) => c.id === changeId);\r\n                if (!change || !dispatch) return false;\r\n\r\n                if (change.type === 'insert') {\r\n                    // Reject insert: remove the inserted text\r\n                    tr.delete(change.from, change.to);\r\n                } else {\r\n                    // Reject delete: remove the delete mark (restore visual, text already there)\r\n                    tr.removeMark(change.from, change.to, this.editor.schema.marks.trackDelete as any);\r\n                }\r\n\r\n                this.storage.changes = this.storage.changes.filter((c: ChangeRecord) => c.id !== changeId);\r\n                this.options.onChangesUpdate?.(this.storage.changes);\r\n                dispatch(tr);\r\n                return true;\r\n            },\r\n\r\n            acceptAllChanges: () => ({ editor }: { editor: any }) => {\r\n                const changes = [...this.storage.changes];\r\n                changes.forEach((c: ChangeRecord) => {\r\n                    (editor.commands as any).acceptChange(c.id);\r\n                });\r\n                return true;\r\n            },\r\n\r\n            rejectAllChanges: () => ({ editor }: { editor: any }) => {\r\n                const changes = [...this.storage.changes];\r\n                changes.forEach((c: ChangeRecord) => {\r\n                    (editor.commands as any).rejectChange(c.id);\r\n                });\r\n                return true;\r\n            },\r\n\r\n            getChanges: () => () => {\r\n                return this.storage.changes;\r\n            },\r\n        } as any;\r\n    },\r\n\r\n    addProseMirrorPlugins() {\r\n        const ext = this;\r\n\r\n        return [\r\n            new Plugin({\r\n                key: new PluginKey('trackChanges'),\r\n                appendTransaction(transactions: readonly any[], oldState: any, newState: any) {\r\n                    if (!ext.storage.enabled) return null;\r\n                    if (!transactions.some((tr) => tr.docChanged)) return null;\r\n\r\n                    // Prevent infinite loops if we are just adding marks\r\n                    if (transactions.some((tr) => tr.getMeta('trackChangesMarking'))) return null;\r\n\r\n                    const tr = newState.tr;\r\n                    tr.setMeta('trackChangesMarking', true);\r\n                    let changed = false;\r\n\r\n                    const trackInsertType = ext.editor.schema.marks.trackInsert;\r\n                    const trackDeleteType = ext.editor.schema.marks.trackDelete;\r\n\r\n                    transactions.forEach((origTr) => {\r\n                        if (!origTr.docChanged) return;\r\n\r\n                        origTr.steps.forEach((step: any, _index: number) => {\r\n                            // Basic heuristic for ReplaceStep (insert/delete)\r\n                            if (step.slice) {\r\n                                // Maps positions from old step to current tr state\r\n                                const map = tr.mapping;\r\n                                const from = map.map(step.from, -1);\r\n\r\n                                // It's an insertion if there is content in the slice\r\n                                if (step.slice.content.size > 0 && trackInsertType) {\r\n                                    const to = map.map(step.from + step.slice.content.size);\r\n                                    tr.addMark(from, to, trackInsertType.create());\r\n\r\n                                    const changeId = Math.random().toString(36).substr(2, 9);\r\n                                    ext.storage.changes.push({\r\n                                        id: changeId,\r\n                                        type: 'insert',\r\n                                        from,\r\n                                        to,\r\n                                        text: step.slice.content.textBetween(0, step.slice.content.size, '\\n'),\r\n                                        author: ext.storage.author,\r\n                                        timestamp: Date.now(),\r\n                                    });\r\n                                    changed = true;\r\n                                }\r\n\r\n                                // It's a deletion if it removes content (step.from < step.to in old state)\r\n                                // Standard ProseMirror deletion removes the node. To *track* it, we ideally \r\n                                // intercept the transaction *before* it gets applied or we restore the deleted \r\n                                // content and mark it. Restoring content is complex in appendTransaction.\r\n                                // For a robust implementation, a custom editing plugin is needed.\r\n                                // Here we do a simplified version: if we detect a deletion we just \r\n                                // acknowledge it happened, but full text restoration requires intercepting keydown/commands.\r\n                                if (step.to > step.from && trackDeleteType) {\r\n                                    // Note: To truly show struck-through deleted text without losing it, \r\n                                    // the editor commands (delete/backspace) must be overridden to apply the \r\n                                    // trackDelete mark INSTEAD of actually deleting the nodes.\r\n                                    // For now, we simulate by logging the deletion but we can't easily mark it \r\n                                    // here since the text is already gone from newState.\r\n                                }\r\n                            }\r\n                        });\r\n                    });\r\n\r\n                    if (changed) {\r\n                        ext.options.onChangesUpdate?.(ext.storage.changes);\r\n                        return tr;\r\n                    }\r\n                    return null;\r\n                },\r\n                props: {\r\n                    decorations(state: any) {\r\n                        return null;\r\n                    },\r\n                },\r\n            }),\r\n        ];\r\n    },\r\n});\r\n\r\n/**\r\n * TrackInsert mark - Visually highlights inserted text.\r\n */\r\nexport const TrackInsert = Extension.create({\r\n    name: 'trackInsert',\r\n    priority: 1001,\r\n\r\n    addOptions() {\r\n        return {\r\n            HTMLAttributes: {},\r\n        };\r\n    },\r\n\r\n    parseHTML() {\r\n        return [{ tag: 'span[data-track-insert]' }];\r\n    },\r\n\r\n    renderHTML({ HTMLAttributes }: { HTMLAttributes: any }) {\r\n        return ['span', { 'data-track-insert': '', class: 'rk-track-insert', ...HTMLAttributes }, 0];\r\n    },\r\n});\r\n\r\n/**\r\n * TrackDelete mark - Visually highlights deleted text.\r\n */\r\nexport const TrackDelete = Extension.create({\r\n    name: 'trackDelete',\r\n    priority: 1001,\r\n\r\n    addOptions() {\r\n        return {\r\n            HTMLAttributes: {},\r\n        };\r\n    },\r\n\r\n    parseHTML() {\r\n        return [{ tag: 'span[data-track-delete]' }];\r\n    },\r\n\r\n    renderHTML({ HTMLAttributes }: { HTMLAttributes: any }) {\r\n        return ['span', { 'data-track-delete': '', class: 'rk-track-delete', ...HTMLAttributes }, 0];\r\n    },\r\n});\r\n","import { Mark, mergeAttributes } from '@tiptap/core';\r\n\r\nexport const LeaderMark = Mark.create({\r\n    name: 'leader',\r\n\r\n    addAttributes() {\r\n        return {\r\n            class: {\r\n                default: 'rk-toc-leader',\r\n            },\r\n        };\r\n    },\r\n\r\n    parseHTML() {\r\n        return [\r\n            {\r\n                tag: 'span.rk-toc-leader',\r\n            },\r\n        ];\r\n    },\r\n\r\n    renderHTML({ HTMLAttributes }) {\r\n        return ['span', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0];\r\n    },\r\n});\r\n","import { Extension } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport { Decoration, DecorationSet } from '@tiptap/pm/view';\n\nexport interface FindReplaceStorage {\n  query: string;\n  results: { from: number; to: number }[];\n  current: number;\n  caseSensitive: boolean;\n  regex: boolean;\n}\n\ninterface FindOptions {\n  caseSensitive?: boolean;\n  regex?: boolean;\n  wholeWord?: boolean;\n}\n\ndeclare module '@tiptap/core' {\n  interface Commands<ReturnType> {\n    findReplace: {\n      findText: (query: string, options?: FindOptions) => ReturnType;\n      replaceText: (query: string, replacement: string, options?: FindOptions) => ReturnType;\n      replaceAllText: (query: string, replacement: string, options?: FindOptions) => ReturnType;\n      goToNextMatch: () => ReturnType;\n      goToPreviousMatch: () => ReturnType;\n      clearSearch: () => ReturnType;\n    };\n  }\n}\n\nconst KEY = new PluginKey<DecorationSet>('rkFindReplace');\n\nfunction buildRegex(query: string, opts: FindOptions): RegExp | null {\n  if (!query) return null;\n  let pattern = opts.regex ? query : query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n  if (opts.wholeWord && !opts.regex) pattern = `\\\\b${pattern}\\\\b`;\n  const flags = `g${opts.caseSensitive ? '' : 'i'}`;\n  try {\n    return new RegExp(pattern, flags);\n  } catch {\n    return null;\n  }\n}\n\nfunction findMatches(doc: any, query: string, opts: FindOptions): { from: number; to: number }[] {\n  const results: { from: number; to: number }[] = [];\n  const regex = buildRegex(query, opts);\n  if (!regex) return results;\n\n  doc.descendants((node: any, pos: number) => {\n    if (!node.isText) return;\n    const text = node.text as string;\n    let match: RegExpExecArray | null;\n    regex.lastIndex = 0;\n    while ((match = regex.exec(text)) !== null) {\n      if (match[0].length === 0) { regex.lastIndex++; continue; }\n      results.push({ from: pos + match.index, to: pos + match.index + match[0].length });\n    }\n  });\n  return results;\n}\n\nfunction decorationsFor(results: { from: number; to: number }[], current: number): DecorationSet {\n  const decos = results.map((r, i) =>\n    Decoration.inline(r.from, r.to, {\n      class: i === current ? 'rk-find-match rk-find-match-current' : 'rk-find-match',\n    })\n  );\n  return DecorationSet.create({ size: 0 } as any, decos);\n}\n\nexport const FindReplace = Extension.create<unknown, FindReplaceStorage>({\n  name: 'findReplace',\n\n  addStorage() {\n    return {\n      query: '',\n      results: [],\n      current: -1,\n      caseSensitive: false,\n      regex: false,\n    };\n  },\n\n  addCommands() {\n    return {\n      findText:\n        (query: string, options: FindOptions = {}) =>\n        ({ editor, dispatch }: { editor: any; dispatch?: any }) => {\n          this.storage.query = query;\n          this.storage.caseSensitive = !!options.caseSensitive;\n          this.storage.regex = !!options.regex;\n          const results = query ? findMatches(editor.state.doc, query, options) : [];\n          this.storage.results = results;\n          this.storage.current = results.length ? 0 : -1;\n          if (dispatch) editor.view.dispatch(editor.state.tr.setMeta(KEY, true));\n          return results.length;\n        },\n\n      goToNextMatch:\n        () =>\n        ({ editor }: { editor: any }) => {\n          if (!this.storage.results.length) return false;\n          this.storage.current = (this.storage.current + 1) % this.storage.results.length;\n          const r = this.storage.results[this.storage.current];\n          editor.commands.setTextSelection({ from: r.from, to: r.to });\n          editor.commands.scrollIntoView();\n          editor.view.dispatch(editor.state.tr.setMeta(KEY, true));\n          return true;\n        },\n\n      goToPreviousMatch:\n        () =>\n        ({ editor }: { editor: any }) => {\n          if (!this.storage.results.length) return false;\n          this.storage.current =\n            (this.storage.current - 1 + this.storage.results.length) % this.storage.results.length;\n          const r = this.storage.results[this.storage.current];\n          editor.commands.setTextSelection({ from: r.from, to: r.to });\n          editor.commands.scrollIntoView();\n          editor.view.dispatch(editor.state.tr.setMeta(KEY, true));\n          return true;\n        },\n\n      replaceText:\n        (query: string, replacement: string, options: FindOptions = {}) =>\n        ({ editor }: { editor: any }) => {\n          if (!query) return 0;\n          const results = findMatches(editor.state.doc, query, options);\n          if (!results.length) return 0;\n          const target = results[this.storage.current >= 0 ? this.storage.current : 0];\n          editor\n            .chain()\n            .focus()\n            .insertContentAt({ from: target.from, to: target.to }, replacement)\n            .run();\n          (editor.commands as any).findText(query, options);\n          return 1;\n        },\n\n      replaceAllText:\n        (query: string, replacement: string, options: FindOptions = {}) =>\n        ({ editor }: { editor: any }) => {\n          if (!query) return 0;\n          const results = findMatches(editor.state.doc, query, options);\n          if (!results.length) return 0;\n          const tr = editor.state.tr;\n          for (let i = results.length - 1; i >= 0; i--) {\n            tr.insertText(replacement, results[i].from, results[i].to);\n          }\n          editor.view.dispatch(tr);\n          (editor.commands as any).findText(query, options);\n          return results.length;\n        },\n\n      clearSearch:\n        () =>\n        ({ editor }: { editor: any }) => {\n          this.storage.query = '';\n          this.storage.results = [];\n          this.storage.current = -1;\n          editor.view.dispatch(editor.state.tr.setMeta(KEY, true));\n          return true;\n        },\n    } as any;\n  },\n\n  addProseMirrorPlugins() {\n    const ext = this;\n    return [\n      new Plugin<DecorationSet>({\n        key: KEY,\n        state: {\n          init: () => DecorationSet.empty,\n          apply(tr, oldSet) {\n            if (tr.getMeta(KEY) || tr.docChanged) {\n              if (ext.storage.query && tr.docChanged) {\n                ext.storage.results = findMatches(tr.doc, ext.storage.query, {\n                  caseSensitive: ext.storage.caseSensitive,\n                  regex: ext.storage.regex,\n                });\n                if (ext.storage.current >= ext.storage.results.length) {\n                  ext.storage.current = ext.storage.results.length - 1;\n                }\n              }\n              return decorationsFor(ext.storage.results, ext.storage.current);\n            }\n            return oldSet.map(tr.mapping, tr.doc);\n          },\n        },\n        props: {\n          decorations(state: any) {\n            return this.getState(state);\n          },\n        },\n      }),\n    ];\n  },\n});\n","import { Extension } from '@tiptap/core';\n\n/**\n * Word-style keyboard shortcuts that StarterKit doesn't ship by default.\n *\n * - `Ctrl/⌘+1..6` → Headings 1–6\n * - `Ctrl/⌘+0` (zero) → paragraph (normal)\n * - `Ctrl/⌘+Alt+1..6` → also headings (Word's actual binding)\n * - `Ctrl/⌘+Shift+L` → toggle bullet list\n * - `Ctrl/⌘+Shift+O` → toggle ordered list\n * - `Ctrl/⌘+L / E / R / J` → align left / center / right / justify\n * - `Ctrl/⌘+Enter` → page break\n * - `Ctrl/⌘+Shift+X` → strikethrough\n * - `Ctrl/⌘+.` / `Ctrl/⌘+,` → super- / subscript\n * - `Ctrl/⌘+Shift+H` → highlight (toggle yellow on selection)\n *\n * These mirror Microsoft Word and Google Docs defaults.\n */\nexport const WordShortcuts = Extension.create({\n    name: 'wordShortcuts',\n\n    addKeyboardShortcuts() {\n        const heading = (level: number) => () => this.editor.chain().focus().toggleHeading({ level: level as any }).run();\n        return {\n            // Headings (Word: Ctrl+Alt+N. Google Docs / common: Ctrl+N too — both work)\n            'Mod-Alt-1': heading(1),\n            'Mod-Alt-2': heading(2),\n            'Mod-Alt-3': heading(3),\n            'Mod-Alt-4': heading(4),\n            'Mod-Alt-5': heading(5),\n            'Mod-Alt-6': heading(6),\n            'Mod-1': heading(1),\n            'Mod-2': heading(2),\n            'Mod-3': heading(3),\n            'Mod-4': heading(4),\n            'Mod-5': heading(5),\n            'Mod-6': heading(6),\n            'Mod-0': () => this.editor.chain().focus().setParagraph().run(),\n\n            // Lists\n            'Mod-Shift-l': () => this.editor.chain().focus().toggleBulletList().run(),\n            'Mod-Shift-o': () => this.editor.chain().focus().toggleOrderedList().run(),\n            'Mod-Shift-9': () => this.editor.chain().focus().toggleBulletList().run(),\n            'Mod-Shift-7': () => this.editor.chain().focus().toggleOrderedList().run(),\n\n            // Alignment\n            'Mod-l': () => this.editor.chain().focus().setTextAlign('left').run(),\n            'Mod-e': () => this.editor.chain().focus().setTextAlign('center').run(),\n            'Mod-r': () => this.editor.chain().focus().setTextAlign('right').run(),\n            'Mod-j': () => this.editor.chain().focus().setTextAlign('justify').run(),\n\n            // Marks\n            'Mod-Shift-x': () => this.editor.chain().focus().toggleStrike().run(),\n            'Mod-,': () => this.editor.chain().focus().toggleSubscript().run(),\n            'Mod-.': () => this.editor.chain().focus().toggleSuperscript().run(),\n            'Mod-Shift-h': () => this.editor.chain().focus().toggleHighlight({ color: '#FFFF00' }).run(),\n\n            // Page break (Word: Ctrl+Enter inserts page break)\n            'Mod-Enter': () => (this.editor.commands as any).setPageBreak(),\n\n            // Insert link via command — UI shell can intercept Ctrl+K to open dialog instead.\n            // We don't bind it here so the UI's Ctrl+K dialog isn't pre-empted.\n        };\n    },\n});\n","import { Node, mergeAttributes } from '@tiptap/core';\n\ndeclare module '@tiptap/core' {\n    interface Commands<ReturnType> {\n        textBox: {\n            /** Insert a free-floating text box at the cursor. */\n            insertTextBox: (attrs?: { width?: number; height?: number; backgroundColor?: string; borderColor?: string }) => ReturnType;\n        };\n    }\n}\n\n/**\n * TextBox — a Word-style floating text frame that can be dragged and resized.\n * Renders as a `<div>` block with rich content inside (paragraphs, lists, etc.).\n *\n * Behaviour:\n *   - Inserts at the current selection.\n *   - Drag the `⠿` handle on the top-left to move it on the page.\n *   - Eight corner / edge handles let you resize while keeping content reflowing inside.\n *   - The position is persisted via `data-x` / `data-y` attributes.\n *\n * Useful for callouts, sidebars, pull quotes, diagrams.\n */\nexport const TextBox = Node.create({\n    name: 'textBox',\n    group: 'block',\n    content: 'block+',\n    defining: true,\n    isolating: true,\n    draggable: true,\n\n    addAttributes() {\n        return {\n            width: {\n                default: 320,\n                parseHTML: (el: HTMLElement) => parseInt(el.getAttribute('data-width') || '0', 10) || 320,\n                renderHTML: (attrs: any) => ({ 'data-width': String(attrs.width) }),\n            },\n            height: {\n                default: 160,\n                parseHTML: (el: HTMLElement) => parseInt(el.getAttribute('data-height') || '0', 10) || 160,\n                renderHTML: (attrs: any) => ({ 'data-height': String(attrs.height) }),\n            },\n            x: {\n                default: 0,\n                parseHTML: (el: HTMLElement) => parseInt(el.getAttribute('data-x') || '0', 10),\n                renderHTML: (attrs: any) => ({ 'data-x': String(attrs.x || 0) }),\n            },\n            y: {\n                default: 0,\n                parseHTML: (el: HTMLElement) => parseInt(el.getAttribute('data-y') || '0', 10),\n                renderHTML: (attrs: any) => ({ 'data-y': String(attrs.y || 0) }),\n            },\n            backgroundColor: {\n                default: null,\n                parseHTML: (el: HTMLElement) => el.style.backgroundColor || null,\n                renderHTML: (attrs: any) => attrs.backgroundColor ? { style: `background-color: ${attrs.backgroundColor}` } : {},\n            },\n            borderColor: {\n                default: '#cbd5e1',\n                parseHTML: (el: HTMLElement) => el.style.borderColor || '#cbd5e1',\n                renderHTML: (attrs: any) => ({}),\n            },\n        };\n    },\n\n    parseHTML() {\n        return [{ tag: 'div[data-type=\"text-box\"]' }];\n    },\n\n    renderHTML({ HTMLAttributes, node }) {\n        const w = node.attrs.width || 320;\n        const h = node.attrs.height || 160;\n        const x = node.attrs.x || 0;\n        const y = node.attrs.y || 0;\n        const style = `width:${w}px;min-height:${h}px;transform:translate(${x}px,${y}px);` + (node.attrs.backgroundColor ? `background:${node.attrs.backgroundColor};` : '') + `border:1px solid ${node.attrs.borderColor || '#cbd5e1'};`;\n        return ['div', mergeAttributes(HTMLAttributes, { 'data-type': 'text-box', class: 'rk-textbox', style }), 0];\n    },\n\n    addCommands() {\n        return {\n            insertTextBox: (attrs: any = {}) => ({ commands }: { commands: any }) => {\n                return commands.insertContent({\n                    type: this.name,\n                    attrs: {\n                        width: attrs.width || 320,\n                        height: attrs.height || 160,\n                        x: 0,\n                        y: 0,\n                        backgroundColor: attrs.backgroundColor || null,\n                        borderColor: attrs.borderColor || '#cbd5e1',\n                    },\n                    content: [{ type: 'paragraph', content: [{ type: 'text', text: 'Text box' }] }],\n                });\n            },\n        };\n    },\n\n    addNodeView() {\n        return ({ node, editor, getPos }) => {\n            const dom = document.createElement('div');\n            dom.className = 'rk-textbox';\n            dom.dataset.type = 'text-box';\n            dom.contentEditable = 'true';\n\n            const applyTransform = () => {\n                const w = node.attrs.width || 320;\n                const h = node.attrs.height || 160;\n                const x = node.attrs.x || 0;\n                const y = node.attrs.y || 0;\n                dom.style.width = `${w}px`;\n                dom.style.minHeight = `${h}px`;\n                dom.style.transform = `translate(${x}px, ${y}px)`;\n                if (node.attrs.backgroundColor) dom.style.background = node.attrs.backgroundColor;\n                else dom.style.background = '';\n                dom.style.border = `1px solid ${node.attrs.borderColor || '#cbd5e1'}`;\n            };\n            applyTransform();\n\n            // Drag handle (top-left)\n            const dragHandle = document.createElement('div');\n            dragHandle.className = 'rk-textbox-drag';\n            dragHandle.contentEditable = 'false';\n            dragHandle.title = 'Drag to move';\n            dragHandle.innerHTML = '⠿';\n            dom.appendChild(dragHandle);\n\n            // Resize handles (corners + sides)\n            const handlePositions: ('nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w')[] =\n                ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];\n            const handles: HTMLElement[] = [];\n            for (const pos of handlePositions) {\n                const h = document.createElement('div');\n                h.className = `rk-textbox-handle rk-textbox-handle-${pos}`;\n                h.contentEditable = 'false';\n                dom.appendChild(h);\n                handles.push(h);\n\n                let startX = 0, startY = 0, startW = 0, startH = 0, startNX = 0, startNY = 0;\n                h.addEventListener('mousedown', (e) => {\n                    e.preventDefault();\n                    e.stopPropagation();\n                    startX = e.clientX;\n                    startY = e.clientY;\n                    startW = node.attrs.width || dom.offsetWidth;\n                    startH = node.attrs.height || dom.offsetHeight;\n                    startNX = node.attrs.x || 0;\n                    startNY = node.attrs.y || 0;\n                    dom.classList.add('is-resizing');\n                    const onMove = (m: MouseEvent) => {\n                        const dx = m.clientX - startX;\n                        const dy = m.clientY - startY;\n                        let w = startW, h2 = startH, nx = startNX, ny = startNY;\n                        if (pos.includes('e')) w = Math.max(80, startW + dx);\n                        if (pos.includes('w')) { w = Math.max(80, startW - dx); nx = startNX + dx; }\n                        if (pos.includes('s')) h2 = Math.max(60, startH + dy);\n                        if (pos.includes('n')) { h2 = Math.max(60, startH - dy); ny = startNY + dy; }\n                        dom.style.width = `${w}px`;\n                        dom.style.minHeight = `${h2}px`;\n                        dom.style.transform = `translate(${nx}px, ${ny}px)`;\n                    };\n                    const onUp = () => {\n                        dom.classList.remove('is-resizing');\n                        document.removeEventListener('mousemove', onMove);\n                        document.removeEventListener('mouseup', onUp);\n                        const pos2 = (getPos as any)?.();\n                        if (typeof pos2 !== 'number') return;\n                        const w = parseInt(dom.style.width, 10) || node.attrs.width;\n                        const h2 = parseInt(dom.style.minHeight, 10) || node.attrs.height;\n                        const m = dom.style.transform.match(/translate\\(([-\\d.]+)px,\\s*([-\\d.]+)px\\)/);\n                        const nx = m ? parseInt(m[1], 10) : node.attrs.x;\n                        const ny = m ? parseInt(m[2], 10) : node.attrs.y;\n                        const tr = editor.state.tr.setNodeMarkup(pos2, undefined, {\n                            ...node.attrs, width: w, height: h2, x: nx, y: ny,\n                        });\n                        editor.view.dispatch(tr);\n                    };\n                    document.addEventListener('mousemove', onMove);\n                    document.addEventListener('mouseup', onUp);\n                });\n            }\n\n            // Drag handle to move\n            let dragging = false;\n            let dStartX = 0, dStartY = 0, dStartNX = 0, dStartNY = 0;\n            dragHandle.addEventListener('mousedown', (e) => {\n                e.preventDefault();\n                e.stopPropagation();\n                dragging = true;\n                dStartX = e.clientX;\n                dStartY = e.clientY;\n                dStartNX = node.attrs.x || 0;\n                dStartNY = node.attrs.y || 0;\n                dom.classList.add('is-dragging');\n                const onMove = (m: MouseEvent) => {\n                    if (!dragging) return;\n                    const nx = dStartNX + (m.clientX - dStartX);\n                    const ny = dStartNY + (m.clientY - dStartY);\n                    dom.style.transform = `translate(${nx}px, ${ny}px)`;\n                };\n                const onUp = () => {\n                    if (!dragging) return;\n                    dragging = false;\n                    dom.classList.remove('is-dragging');\n                    document.removeEventListener('mousemove', onMove);\n                    document.removeEventListener('mouseup', onUp);\n                    const pos2 = (getPos as any)?.();\n                    if (typeof pos2 !== 'number') return;\n                    const m = dom.style.transform.match(/translate\\(([-\\d.]+)px,\\s*([-\\d.]+)px\\)/);\n                    if (!m) return;\n                    const nx = parseInt(m[1], 10);\n                    const ny = parseInt(m[2], 10);\n                    const tr = editor.state.tr.setNodeMarkup(pos2, undefined, { ...node.attrs, x: nx, y: ny });\n                    editor.view.dispatch(tr);\n                };\n                document.addEventListener('mousemove', onMove);\n                document.addEventListener('mouseup', onUp);\n            });\n\n            // Content goes inside this element.\n            const contentDOM = document.createElement('div');\n            contentDOM.className = 'rk-textbox-content';\n            dom.appendChild(contentDOM);\n\n            return {\n                dom,\n                contentDOM,\n                update(updated) {\n                    if (updated.type.name !== 'textBox') return false;\n                    Object.assign(node, updated);\n                    applyTransform();\n                    return true;\n                },\n                stopEvent(event) {\n                    const t = event.target as HTMLElement | null;\n                    if (!t) return false;\n                    return t.classList.contains('rk-textbox-drag') || t.classList.contains('rk-textbox-handle');\n                },\n            };\n        };\n    },\n});\n","import { Extension } from '@tiptap/core';\nimport { Plugin, PluginKey } from '@tiptap/pm/state';\nimport { Decoration, DecorationSet } from '@tiptap/pm/view';\n\nexport interface PaginationOptions {\n    /** Enable visual page boundaries (defaults to true). */\n    enabled: boolean;\n    /** Inside-page area in pixels — calculated from page layout when not given. */\n    contentHeightPx: number | null;\n    /** CSS pixel offset between consecutive page sheets (defaults to 32px). */\n    gap: number;\n}\n\nconst KEY = new PluginKey<DecorationSet>('rkPagination');\n\n/**\n * Visually splits the editor surface into pages by measuring rendered block\n * heights and inserting \"page boundary\" widget decorations at each multiple of\n * the configured page height. Decorations are display-only — they don't change\n * the document model, so cursor positions, selections, undo/redo and exports\n * all behave identically. Hard `<div data-type=\"page-break\">` page breaks\n * inserted by the user reset the running height so the next boundary aligns\n * with the user's intended break.\n */\nexport const Pagination = Extension.create<PaginationOptions>({\n    name: 'pagination',\n\n    addOptions() {\n        return {\n            enabled: true,\n            contentHeightPx: null,\n            gap: 24,\n        };\n    },\n\n    addStorage() {\n        return {\n            // Set by the host (WordEditor) whenever the page layout changes.\n            contentHeightPx: 0,\n            // Updated by computePageBoundaries on every recompute.\n            pageCount: 1,\n            measuredHeight: 0,\n        };\n    },\n\n    addProseMirrorPlugins() {\n        const ext = this;\n        return [\n            new Plugin<DecorationSet>({\n                key: KEY,\n                state: {\n                    init: () => DecorationSet.empty,\n                    apply(tr, oldSet) {\n                        // Recompute ONLY when explicitly requested via meta (the\n                        // view triggers this via rAF + throttle). Mapping\n                        // through `tr.mapping` keeps existing decorations\n                        // anchored across edits in the meantime.\n                        if (tr.getMeta(KEY)) return computePageBoundaries(ext);\n                        return oldSet.map(tr.mapping, tr.doc);\n                    },\n                },\n                view(view) {\n                    // Throttled, rAF-debounced recompute that ignores layout\n                    // shifts caused by our own decoration changes — that loop\n                    // was the source of the flicker.\n                    let rafId: number | null = null;\n                    let lastRun = 0;\n                    let lastWidth = view.dom.clientWidth;\n                    const MIN_INTERVAL = 200;\n\n                    const recompute = (force = false) => {\n                        if (rafId) cancelAnimationFrame(rafId);\n                        rafId = requestAnimationFrame(() => {\n                            rafId = null;\n                            const now = performance.now();\n                            if (!force && now - lastRun < MIN_INTERVAL) {\n                                // Re-schedule once the cooldown elapses.\n                                setTimeout(() => recompute(true), MIN_INTERVAL - (now - lastRun));\n                                return;\n                            }\n                            lastRun = now;\n                            try { view.dispatch(view.state.tr.setMeta(KEY, true)); } catch { /* destroyed */ }\n                        });\n                    };\n\n                    // First paint.\n                    if (typeof requestAnimationFrame === 'function') requestAnimationFrame(() => recompute(true));\n\n                    // Only react to ResizeObserver when WIDTH actually changes\n                    // (height changes from our own spacers should never trigger us).\n                    let obs: ResizeObserver | null = null;\n                    if (typeof ResizeObserver !== 'undefined') {\n                        obs = new ResizeObserver((entries) => {\n                            const next = view.dom.clientWidth;\n                            if (Math.abs(next - lastWidth) < 1) return;\n                            lastWidth = next;\n                            recompute();\n                        });\n                        obs.observe(view.dom);\n                    }\n\n                    const onWindowResize = () => recompute();\n                    if (typeof window !== 'undefined') {\n                        window.addEventListener('resize', onWindowResize);\n                    }\n\n                    return {\n                        update: (newView, oldState) => {\n                            // Only recompute on actual document changes (not on\n                            // selection-only or decoration-only transactions).\n                            if (!newView.state.doc.eq(oldState.doc)) recompute();\n                        },\n                        destroy: () => {\n                            if (rafId) cancelAnimationFrame(rafId);\n                            obs?.disconnect();\n                            if (typeof window !== 'undefined') {\n                                window.removeEventListener('resize', onWindowResize);\n                            }\n                        },\n                    };\n                },\n                props: {\n                    decorations(state) {\n                        return this.getState(state);\n                    },\n                },\n            }),\n        ];\n    },\n});\n\nfunction computePageBoundaries(ext: any): DecorationSet {\n    if (!ext.options.enabled) return DecorationSet.empty;\n    const editor = ext.editor;\n    if (!editor || !editor.view) return DecorationSet.empty;\n\n    const pageHeight: number =\n        ext.storage.contentHeightPx ||\n        ext.options.contentHeightPx ||\n        defaultA4ContentPx();\n    if (pageHeight <= 100) return DecorationSet.empty;\n\n    const view = editor.view;\n    const proseMirror = view.dom as HTMLElement;\n    if (!proseMirror) return DecorationSet.empty;\n\n    const decos: Decoration[] = [];\n    let pageIndex = 1;\n    // Y coordinate (relative to proseMirror, top-of-padding) where the current\n    // page's USABLE area starts. Initially it's the top padding (page margin).\n    const padTop = parseFloat(getComputedStyle(proseMirror).paddingTop || '0') || 0;\n    let pageStartY = padTop;\n\n    const containerRect = proseMirror.getBoundingClientRect();\n    let totalContentHeight = 0;\n\n    editor.state.doc.forEach((node: any, offset: number) => {\n        const dom = view.nodeDOM(offset) as HTMLElement | null;\n        if (!dom || !(dom instanceof HTMLElement)) return;\n\n        const rect = dom.getBoundingClientRect();\n        const top = rect.top - containerRect.top;\n        const bottom = top + rect.height;\n        totalContentHeight = Math.max(totalContentHeight, bottom);\n\n        // Hard page-break node: push the NEXT block to the top of the next page.\n        if (node.type.name === 'pageBreak') {\n            const pageEnd = pageStartY + pageHeight;\n            const remaining = Math.max(0, pageEnd - top);\n            // Spacer fills the rest of the current page; next block lands at top of next page.\n            decos.push(makeSpacer(offset + node.nodeSize, remaining, true));\n            pageStartY = pageEnd;\n            pageIndex += 1;\n            return;\n        }\n\n        // Auto page break: this block would cross the boundary — push it whole\n        // to the next page so it doesn't get sliced in half by the boundary line.\n        const pageEnd = pageStartY + pageHeight;\n        if (bottom > pageEnd && top < pageEnd && rect.height < pageHeight) {\n            const remaining = Math.max(0, pageEnd - top);\n            decos.push(makeSpacer(offset, remaining, false));\n            pageStartY = pageEnd;\n            pageIndex += 1;\n        } else if (bottom > pageEnd) {\n            // Block taller than a full page — let it span; just bump page index.\n            while (bottom > pageStartY + pageHeight) {\n                pageStartY += pageHeight;\n                pageIndex += 1;\n            }\n        }\n    });\n\n    ext.storage.pageCount = Math.max(1, pageIndex);\n    ext.storage.measuredHeight = totalContentHeight;\n\n    return DecorationSet.create(editor.state.doc, decos);\n}\n\nfunction makeSpacer(pos: number, height: number, fromHardBreak: boolean): Decoration {\n    const el = document.createElement('div');\n    el.className = fromHardBreak ? 'rk-page-spacer rk-page-spacer-hard' : 'rk-page-spacer';\n    el.contentEditable = 'false';\n    el.setAttribute('aria-hidden', 'true');\n    el.style.height = `${Math.max(0, Math.round(height))}px`;\n    return Decoration.widget(pos, el, { side: fromHardBreak ? 1 : -1, ignoreSelection: true });\n}\n\nfunction defaultA4ContentPx(): number {\n    // 297mm tall, minus 1in top + 1in bottom margin ≈ 245mm of content area.\n    // 1mm ≈ 3.7795px → ~926px content area.\n    return Math.round(245 * 3.7795);\n}\n","import { Node, mergeAttributes } from '@tiptap/core';\n\ndeclare module '@tiptap/core' {\n    interface Commands<ReturnType> {\n        titleSubtitle: {\n            setTitle: () => ReturnType;\n            setSubtitle: () => ReturnType;\n        };\n    }\n}\n\n/**\n * Title / Subtitle text-block nodes — Word- and Google-Docs-style top-of-document\n * styles that are distinct from regular headings (so they don't appear in the\n * TOC and so styling can be tuned independently).\n *\n * Each is a simple text-block with custom rendering and a corresponding\n * `setTitle()` / `setSubtitle()` command.\n */\nexport const Title = Node.create({\n    name: 'title',\n    group: 'block',\n    content: 'inline*',\n    defining: true,\n    parseHTML() { return [{ tag: 'h1.rk-title' }, { tag: 'div[data-type=\"title\"]' }]; },\n    renderHTML({ HTMLAttributes }) {\n        return ['h1', mergeAttributes(HTMLAttributes, { class: 'rk-title', 'data-type': 'title' }), 0];\n    },\n    addCommands() {\n        return {\n            setTitle: () => ({ commands }: any) => commands.setNode(this.name),\n        } as any;\n    },\n});\n\nexport const Subtitle = Node.create({\n    name: 'subtitle',\n    group: 'block',\n    content: 'inline*',\n    defining: true,\n    parseHTML() { return [{ tag: 'p.rk-subtitle' }, { tag: 'div[data-type=\"subtitle\"]' }]; },\n    renderHTML({ HTMLAttributes }) {\n        return ['p', mergeAttributes(HTMLAttributes, { class: 'rk-subtitle', 'data-type': 'subtitle' }), 0];\n    },\n    addCommands() {\n        return {\n            setSubtitle: () => ({ commands }: any) => commands.setNode(this.name),\n        } as any;\n    },\n});\n","import { JSONContent } from '@tiptap/core';\r\n\r\nexport class DocumentValidator {\r\n  /**\r\n   * Validates a Tiptap JSON content object against basic structural requirements.\r\n   * Can be extended for more strict schema enforcement.\r\n   */\r\n  public static validate(json: any): JSONContent {\r\n    if (!json || typeof json !== 'object') {\r\n      return { type: 'doc', content: [] };\r\n    }\r\n\r\n    if (json.type !== 'doc') {\r\n      console.warn('DocumentValidator: Invalid root type. Fixing to \"doc\".');\r\n      json.type = 'doc';\r\n    }\r\n\r\n    if (!Array.isArray(json.content)) {\r\n      console.warn('DocumentValidator: Content is not an array. Fixing to empty array.');\r\n      json.content = [];\r\n    }\r\n\r\n    // Perform recursive sanitization if needed\r\n    this.sanitizeNodes(json.content);\r\n\r\n    return json as JSONContent;\r\n  }\r\n\r\n  private static sanitizeNodes(nodes: any[]) {\r\n    nodes.forEach((node, index) => {\r\n      if (!node || typeof node !== 'object' || !node.type) {\r\n        console.warn(`DocumentValidator: Removing invalid node at index ${index}`);\r\n        nodes.splice(index, 1);\r\n        return;\r\n      }\r\n\r\n      // Ensure content is handled correctly\r\n      if (node.content && !Array.isArray(node.content)) {\r\n        node.content = [];\r\n      }\r\n\r\n      if (node.content) {\r\n        this.sanitizeNodes(node.content);\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Returns a deterministic version of the JSON content.\r\n   * Useful for comparison and storage.\r\n   */\r\n  public static getDeterministicJSON(json: JSONContent): string {\r\n    return JSON.stringify(json, Object.keys(json).sort());\r\n  }\r\n}\r\n","import type { Editor } from '@tiptap/core';\n\n/**\n * CommandManager — high-level, friendly façade over the underlying Tiptap chain.\n * All formatting commands focus the editor first and then run.\n */\nexport class CommandManager {\n    private editor: Editor;\n\n    constructor(editor: Editor) {\n        this.editor = editor;\n    }\n\n    public execute(fn: (chain: any) => any) {\n        return fn(this.editor.chain().focus()).run();\n    }\n\n    private get parent(): any { return (this.editor as any).options.parent; }\n\n    // ---- Character formatting ----\n    public bold = () => this.execute(c => c.toggleBold());\n    public italic = () => this.execute(c => c.toggleItalic());\n    public underline = () => this.execute(c => c.toggleUnderline());\n    public strike = () => this.execute(c => c.toggleStrike());\n    public subscript = () => this.execute(c => c.toggleSubscript());\n    public superscript = () => this.execute(c => c.toggleSuperscript());\n    public code = () => this.execute(c => c.toggleCode());\n\n    public fontFamily = (font: string) => this.execute(c => c.setFontFamily(font));\n    public fontSize = (size: string) => this.execute(c => c.setFontSize(size));\n    public setColor = (color: string) => this.execute(c => c.setColor(color));\n    public unsetColor = () => this.execute(c => c.unsetColor());\n    public setHighlight = (color: string) => this.execute(c => c.setHighlight({ color }));\n    public unsetHighlight = () => this.execute(c => c.unsetHighlight());\n    public transform = (type: string) => (this.editor.chain().focus() as any).setTextTransform(type).run();\n    public toggleSmallCaps = () => (this.editor.chain().focus() as any).toggleSmallCaps().run();\n    public letterSpacing = (spacing: string) => (this.editor.chain().focus() as any).setLetterSpacing(spacing).run();\n    public wordSpacing = (spacing: string) => (this.editor.chain().focus() as any).setWordSpacing(spacing).run();\n\n    // ---- Block formatting ----\n    public align = (alignment: 'left' | 'center' | 'right' | 'justify') =>\n        this.execute(c => c.setTextAlign(alignment));\n    public lineHeight = (height: string) => this.execute(c => c.setLineHeight(height));\n    public spacing = (top: string, bottom: string) =>\n        this.execute(c => c.setParagraphSpacing({ top, bottom }));\n    public paragraphLayout = (attrs: any) =>\n        (this.editor.chain().focus() as any).setParagraphLayout(attrs).run();\n    public indent = () => {\n        if (this.editor.isActive('listItem')) {\n            return (this.editor.chain().focus() as any).sinkListItem('listItem').run();\n        }\n        return this.execute(c => c.indent());\n    };\n    public outdent = () => {\n        if (this.editor.isActive('listItem')) {\n            return (this.editor.chain().focus() as any).liftListItem('listItem').run();\n        }\n        return this.execute(c => c.outdent());\n    };\n\n    public heading = (level: 1 | 2 | 3 | 4 | 5 | 6) =>\n        this.execute(c => c.toggleHeading({ level }));\n    public paragraph = () => this.execute(c => c.setParagraph());\n    public title = () => (this.editor.chain().focus() as any).setTitle().run();\n    public subtitle = () => (this.editor.chain().focus() as any).setSubtitle().run();\n    public blockquote = () => this.execute(c => c.toggleBlockquote());\n    public codeBlock = () => this.execute(c => c.toggleCodeBlock());\n    public horizontalRule = () => this.execute(c => c.setHorizontalRule());\n\n    // ---- Lists ----\n    public bulletList = () => this.execute(c => c.toggleBulletList());\n    public orderedList = () => this.execute(c => c.toggleOrderedList());\n    public taskList = () => (this.editor.chain().focus() as any).toggleTaskList().run();\n    public setListStyle = (style: string) =>\n        (this.editor.chain().focus() as any).setListStyle(style).run();\n    public setListStartNumber = (n: number) =>\n        (this.editor.chain().focus() as any).setListStartNumber(n).run();\n\n    // ---- Tables ----\n    public insertTable = (options: { rows: number; cols: number; withHeaderRow?: boolean }) =>\n        this.execute(c => c.insertTable(options));\n    public addColumnBefore = () => this.execute(c => c.addColumnBefore());\n    public addColumnAfter = () => this.execute(c => c.addColumnAfter());\n    public deleteColumn = () => this.execute(c => c.deleteColumn());\n    public addRowBefore = () => this.execute(c => c.addRowBefore());\n    public addRowAfter = () => this.execute(c => c.addRowAfter());\n    public deleteRow = () => this.execute(c => c.deleteRow());\n    public deleteTable = () => this.execute(c => c.deleteTable());\n    public mergeCells = () => this.execute(c => c.mergeCells());\n    public splitCell = () => this.execute(c => c.splitCell());\n    public toggleHeaderColumn = () => this.execute(c => c.toggleHeaderColumn());\n    public toggleHeaderRow = () => this.execute(c => c.toggleHeaderRow());\n    public toggleHeaderCell = () => this.execute(c => c.toggleHeaderCell());\n    public mergeOrSplit = () => this.execute(c => c.mergeOrSplit());\n    public setCellAttribute = (name: string, value: any) =>\n        this.execute(c => c.setCellAttribute(name, value));\n    public setTableStyle = (style: string) =>\n        (this.editor.chain().focus() as any).setTableStyle(style).run();\n\n    // ---- Media & inserts ----\n    public openImageUpload = () => (this.editor.commands as any).openImageUpload();\n    public insertImage = (src: string, alt?: string) =>\n        this.execute(c => c.setImage({ src, alt: alt || '' }));\n    public setImageSize = (width: string, height?: string) =>\n        (this.editor.chain().focus() as any).setImageSize(width, height).run();\n    public setImageFloat = (float: 'left' | 'right' | 'none') =>\n        (this.editor.chain().focus() as any).setImageFloat(float).run();\n    public insertCaption = (type?: string) =>\n        (this.editor.chain().focus() as any).insertCaption(type).run();\n    public insertTextBox = (attrs?: { width?: number; height?: number; backgroundColor?: string; borderColor?: string }) =>\n        (this.editor.chain().focus() as any).insertTextBox(attrs).run();\n    public insertMathInline = (latex: string) =>\n        (this.editor.chain().focus() as any).insertMathInline(latex).run();\n    public insertMathBlock = (latex: string) =>\n        (this.editor.chain().focus() as any).insertMathBlock(latex).run();\n    public pageBreak = () => (this.editor.commands as any).setPageBreak();\n    public footnote = (content?: string) => (this.editor.commands as any).setFootnote(content);\n    public sectionBreak = () => (this.editor.commands as any).insertSectionBreak();\n    public pageLayout = (options: any) => (this.editor.commands as any).setPageLayout(options);\n    public insertPageNumber = () =>\n        this.execute(c => c.insertContent({ type: 'pageNumber' }));\n    public insertLink = (href: string) =>\n        (this.editor.chain().focus() as any).setLink({ href }).run();\n    public unsetLink = () => (this.editor.chain().focus() as any).unsetLink().run();\n\n    // ---- Styles & references ----\n    public applyStyle = (name: string) =>\n        (this.editor.chain().focus() as any).applyNamedStyle(name).run();\n    public updateStyle = (name: string, attrs: any) =>\n        (this.editor.chain().focus() as any).updateNamedStyle(name, attrs).run();\n    public insertTableOfContents = (attrs?: { minLevel?: number; maxLevel?: number; title?: string; showLeader?: boolean; showPageNumbers?: boolean }) =>\n        (this.editor.chain().focus() as any).insertTableOfContents(attrs).run();\n    public refreshTableOfContents = () =>\n        (this.editor.chain().focus() as any).refreshTableOfContents().run();\n    public setTocLevels = (minLevel: number, maxLevel: number) =>\n        (this.editor.chain().focus() as any).setTocLevels(minLevel, maxLevel).run();\n    public insertCitation = (key: string, label?: string) =>\n        (this.editor.chain().focus() as any).insertCitation(key, label).run();\n    public insertBibliography = () =>\n        (this.editor.chain().focus() as any).insertBibliography().run();\n\n    // ---- Misc ----\n    public clearFormatting = () =>\n        this.execute(c => c.unsetAllMarks().clearNodes());\n    public undo = () => this.execute(c => c.undo());\n    public redo = () => this.execute(c => c.redo());\n    public selectAll = () => this.execute(c => c.selectAll());\n\n    // ---- Format Painter ----\n    public startFormatPaint = () =>\n        (this.editor.chain().focus() as any).startFormatPaint().run();\n    public cancelFormatPaint = () =>\n        (this.editor.chain().focus() as any).cancelFormatPaint().run();\n\n    // ---- Find & Replace passthroughs ----\n    public find = (query: string, options?: { caseSensitive?: boolean; regex?: boolean }) =>\n        (this.editor.commands as any).findText(query, options);\n    public findNext = () => (this.editor.commands as any).goToNextMatch();\n    public findPrev = () => (this.editor.commands as any).goToPreviousMatch();\n    public replace = (q: string, r: string, opts?: any) =>\n        (this.editor.commands as any).replaceText(q, r, opts);\n    public replaceAll = (q: string, r: string, opts?: any) =>\n        (this.editor.commands as any).replaceAllText(q, r, opts);\n    public clearSearch = () => (this.editor.commands as any).clearSearch();\n\n    // ---- Slash commands ----\n    public executeSlashCommand = (title: string) =>\n        (this.editor.chain().focus() as any).executeSlashCommand(title).run();\n\n    // ---- Export shortcuts (delegate to parent WordEditor) ----\n    public exportDocx = (filename?: string) => this.parent?.exportDocx?.(filename);\n    public exportMarkdown = (filename?: string) => this.parent?.exportMarkdown?.(filename);\n    public exportHtml = (filename?: string) => this.parent?.exportHtml?.(filename);\n    public exportJson = (filename?: string) => this.parent?.exportJson?.(filename);\n    public printDoc = (options?: any) => this.parent?.printPdf?.(options);\n}\n","import {\n    AlignmentType, BorderStyle, Document, ExternalHyperlink, HeadingLevel, ImageRun,\n    LevelFormat, Packer, PageOrientation, Paragraph, ShadingType, Table, TableCell,\n    TableRow, TextRun, UnderlineType, VerticalAlign, WidthType,\n    type IRunOptions, type ILevelsOptions,\n} from 'docx';\n// `file-saver` is a CJS-only package. Use the default-import shape so we work\n// in both bundlers and node-style ESM evaluators.\nimport fileSaver from 'file-saver';\nconst saveAs: (blob: Blob, filename?: string) => void =\n    (fileSaver as any).saveAs || (fileSaver as any).default?.saveAs || (fileSaver as any);\nimport type { StyleManager } from './StyleManager';\nimport type { PageLayoutOptions } from './extensions/PageLayout';\n\nexport type ExportFormat = 'docx' | 'pdf' | 'html' | 'json' | 'markdown';\n\nexport interface ExportOptions {\n    filename?: string;\n    pageLayout?: Partial<PageLayoutOptions>;\n}\n\nconst TWIPS_PER_INCH = 1440;\nconst TWIPS_PER_CM = 567;\nconst TWIPS_PER_MM = 56.7;\nconst TWIPS_PER_PT = 20;\n\nconst DOCX_PAGE_SIZES: Record<string, [number, number]> = {\n    A3: [16838, 23811],\n    A4: [11906, 16838],\n    A5: [8419, 11906],\n    Letter: [12240, 15840],\n    Legal: [12240, 20160],\n    Tabloid: [15840, 24480],\n};\n\nconst HEADING_MAP: Record<number, (typeof HeadingLevel)[keyof typeof HeadingLevel]> = {\n    1: HeadingLevel.HEADING_1,\n    2: HeadingLevel.HEADING_2,\n    3: HeadingLevel.HEADING_3,\n    4: HeadingLevel.HEADING_4,\n    5: HeadingLevel.HEADING_5,\n    6: HeadingLevel.HEADING_6,\n};\n\ninterface InlineFormat {\n    bold?: boolean;\n    italic?: boolean;\n    underline?: boolean;\n    strike?: boolean;\n    subscript?: boolean;\n    superscript?: boolean;\n    code?: boolean;\n    color?: string;\n    highlight?: string;\n    font?: string;\n    size?: number;\n    href?: string;\n}\n\ninterface ListContext {\n    reference: 'rk-decimal' | 'rk-bullet' | 'rk-nepali';\n    level: number;\n}\n\n/**\n * High-fidelity DOCX exporter. Converts Tiptap JSON to a real Word document\n * with embedded images, hyperlinks, all character marks (color, highlight,\n * font, size, strike, sub/sup, track-changes) and proper section properties.\n *\n * Designed to produce documents that open without errors in Microsoft Word,\n * Google Docs, LibreOffice and Pages.\n */\nexport class ExportEngine {\n    private _docHeadings: HeadingInfo[] = [];\n\n    constructor(_styleManager?: StyleManager) {\n        // styleManager retained for forward-compatibility (named-style export).\n    }\n\n    public async exportToDocx(json: any, options: ExportOptions = {}): Promise<void> {\n        const blob = await this.toBlob(json, options);\n        saveAs(blob, options.filename || 'document.docx');\n    }\n\n    /**\n     * Build the docx Blob without triggering a download. Useful for tests,\n     * server-side rendering, or piping the document elsewhere.\n     */\n    public async toBlob(json: any, options: ExportOptions = {}): Promise<Blob> {\n        // We need the document headings up front so the TOC export can\n        // reference them with real text + an estimated page number.\n        this._docHeadings = collectHeadings(json);\n        const sectionChildren = await this.convertNodes(json?.content || [], undefined);\n        const pageProps = sectionPropertiesFromLayout(options.pageLayout);\n\n        const doc = new Document({\n            creator: 'RK Word Editor',\n            description: 'Exported from RK Word Editor',\n            title: (options.filename || 'document').replace(/\\.docx$/i, ''),\n            numbering: { config: this.numberingConfig() },\n            sections: [\n                {\n                    properties: pageProps,\n                    children: sectionChildren,\n                },\n            ],\n        });\n\n        return Packer.toBlob(doc);\n    }\n\n    // ---- Node conversion ---------------------------------------------------\n\n    private async convertNodes(nodes: any[], list?: ListContext): Promise<(Paragraph | Table)[]> {\n        const out: (Paragraph | Table)[] = [];\n        for (const node of nodes || []) {\n            const r = await this.convertNode(node, list);\n            if (Array.isArray(r)) out.push(...r);\n            else if (r) out.push(r);\n        }\n        return out;\n    }\n\n    private async convertNode(node: any, list?: ListContext): Promise<Paragraph | Table | (Paragraph | Table)[] | null> {\n        if (!node || typeof node !== 'object' || !node.type) return null;\n        switch (node.type) {\n            case 'paragraph': return this.convertParagraph(node, list);\n            case 'heading': return this.convertHeading(node);\n            case 'blockquote': return this.convertBlockquote(node);\n            case 'codeBlock': return this.convertCodeBlock(node);\n            case 'horizontalRule':\n                return new Paragraph({\n                    children: [new TextRun('')],\n                    border: { bottom: { color: '999999', space: 1, style: BorderStyle.SINGLE, size: 6 } },\n                });\n            case 'pageBreak':\n                return new Paragraph({ children: [new TextRun({ text: '', break: 1 })], pageBreakBefore: true });\n            case 'image': return await this.convertImage(node);\n            case 'bulletList':\n                return this.convertList(node, { reference: 'rk-bullet', level: (list?.level ?? -1) + 1 });\n            case 'orderedList': {\n                const ref: ListContext['reference'] = node.attrs?.listStyle === 'nepali' ? 'rk-nepali' : 'rk-decimal';\n                return this.convertList(node, { reference: ref, level: (list?.level ?? -1) + 1 });\n            }\n            case 'taskList': return this.convertTaskList(node);\n            case 'table': return this.convertTable(node);\n            case 'caption':\n                return new Paragraph({\n                    children: this.convertInlines(node.content || []),\n                    alignment: AlignmentType.CENTER,\n                });\n            case 'mathInline':\n            case 'mathBlock':\n                return new Paragraph({\n                    children: [new TextRun({ text: node.attrs?.latex || '', font: 'Cambria Math' })],\n                });\n            case 'section':\n            case 'bibliography':\n            case 'textBox':\n                return this.convertNodes(node.content || []);\n            case 'tableOfContents':\n                return this.convertTocPlaceholder(node);\n            default:\n                if (Array.isArray(node.content) && node.content.length) {\n                    return this.convertNodes(node.content, list);\n                }\n                return null;\n        }\n    }\n\n    // ---- Paragraphs / inlines ---------------------------------------------\n\n    private convertParagraph(node: any, list?: ListContext): Paragraph {\n        let children = this.convertInlines(node.content || []);\n        if (children.length === 0) children = [new TextRun('')];\n        const opts: any = { children };\n        if (list) opts.numbering = { reference: list.reference, level: Math.min(list.level, 8) };\n        applyParagraphStyling(node, opts);\n        return new Paragraph(opts);\n    }\n\n    private convertHeading(node: any): Paragraph {\n        const level = clamp(node.attrs?.level || 1, 1, 6);\n        let children = this.convertInlines(node.content || []);\n        if (children.length === 0) children = [new TextRun('')];\n        const opts: any = { children, heading: HEADING_MAP[level] };\n        applyParagraphStyling(node, opts);\n        return new Paragraph(opts);\n    }\n\n    private convertBlockquote(node: any): Paragraph[] {\n        const out: Paragraph[] = [];\n        for (const child of node.content || []) {\n            const inlines = this.convertInlines(child.content || []);\n            out.push(new Paragraph({\n                children: inlines.length ? inlines : [new TextRun('')],\n                indent: { left: 720 },\n                border: {\n                    left: { color: 'AAAAAA', space: 12, style: BorderStyle.SINGLE, size: 12 },\n                },\n            }));\n        }\n        return out.length ? out : [new Paragraph({ children: [new TextRun('')] })];\n    }\n\n    private convertTocPlaceholder(node: any): Paragraph[] {\n        const title = node.attrs?.title || 'Table of contents';\n        const minLevel = node.attrs?.minLevel ?? 1;\n        const maxLevel = node.attrs?.maxLevel ?? 3;\n        const showLeader = node.attrs?.showLeader !== false;\n        const showPageNumbers = node.attrs?.showPageNumbers !== false;\n\n        const out: Paragraph[] = [];\n        // Title row.\n        out.push(new Paragraph({\n            children: [new TextRun({ text: title, bold: true, size: 28 })],\n            spacing: { before: 240, after: 120 },\n            border: { bottom: { color: 'CCCCCC', space: 6, style: BorderStyle.SINGLE, size: 6 } },\n        }));\n\n        const items = this._docHeadings.filter(h => h.level >= minLevel && h.level <= maxLevel);\n        if (items.length === 0) {\n            out.push(new Paragraph({\n                children: [new TextRun({ text: '(No headings found.)', italics: true, color: '888888' })],\n                spacing: { after: 240 },\n            }));\n            return out;\n        }\n\n        for (const item of items) {\n            const indent = (item.level - minLevel) * 360;\n            const isTopLevel = item.level === minLevel;\n            const runs: any[] = [\n                new TextRun({ text: item.text, bold: isTopLevel }),\n            ];\n            if (showLeader) {\n                // Leader dots — a long string is the simplest cross-Word-version approach.\n                runs.push(new TextRun({ text: ' ' + '.'.repeat(60) + ' ', color: '999999' }));\n            } else if (showPageNumbers) {\n                runs.push(new TextRun({ text: '  ' }));\n            }\n            if (showPageNumbers) {\n                runs.push(new TextRun({ text: String(item.estimatedPage), color: '666666' }));\n            }\n            out.push(new Paragraph({\n                children: runs,\n                spacing: { after: 60 },\n                indent: indent ? { left: indent } : undefined,\n                tabStops: showLeader\n                    ? [{ type: 'right' as any, position: 9000, leader: 'dot' as any }]\n                    : undefined,\n            }));\n        }\n\n        // Close with a blank line so the next block doesn't crowd the TOC.\n        out.push(new Paragraph({ children: [new TextRun('')], spacing: { before: 120, after: 240 } }));\n        return out;\n    }\n\n    private convertCodeBlock(node: any): Paragraph {\n        const text = (node.content || []).map((c: any) => c.text || '').join('') || ' ';\n        return new Paragraph({\n            children: [new TextRun({ text, font: 'Consolas', size: 20 })],\n            shading: { type: ShadingType.CLEAR, fill: 'F4F4F4', color: 'auto' },\n            spacing: { before: 120, after: 120 },\n            border: {\n                top:    { color: 'DDDDDD', space: 6, style: BorderStyle.SINGLE, size: 4 },\n                bottom: { color: 'DDDDDD', space: 6, style: BorderStyle.SINGLE, size: 4 },\n                left:   { color: 'DDDDDD', space: 6, style: BorderStyle.SINGLE, size: 4 },\n                right:  { color: 'DDDDDD', space: 6, style: BorderStyle.SINGLE, size: 4 },\n            },\n        });\n    }\n\n    private async convertImage(node: any): Promise<Paragraph> {\n        const src: string | undefined = node.attrs?.src;\n        const alignment = mapAlignment(node.attrs?.textAlign) || AlignmentType.CENTER;\n        if (!src) return new Paragraph({ children: [new TextRun('')] });\n\n        const data = await fetchImageData(src);\n        if (!data) {\n            // Fall back to a textual placeholder so Word doesn't choke on missing media.\n            return new Paragraph({\n                children: [new TextRun({ text: `[Image: ${node.attrs?.alt || src}]`, italics: true, color: '888888' })],\n                alignment,\n            });\n        }\n        const dim = parseImageSize(node.attrs);\n        try {\n            const imageRun = new ImageRun({\n                type: data.type,\n                data: data.bytes,\n                transformation: dim,\n            } as any);\n            return new Paragraph({ children: [imageRun], alignment });\n        } catch (e) {\n            console.warn('[ExportEngine] ImageRun failed', e);\n            return new Paragraph({\n                children: [new TextRun({ text: `[Image: ${node.attrs?.alt || ''}]`, italics: true, color: '888888' })],\n                alignment,\n            });\n        }\n    }\n\n    // ---- Lists -------------------------------------------------------------\n\n    private async convertList(node: any, list: ListContext): Promise<Paragraph[]> {\n        const out: Paragraph[] = [];\n        for (const item of node.content || []) {\n            if (item?.type !== 'listItem') continue;\n            for (const child of item.content || []) {\n                if (child.type === 'paragraph') {\n                    out.push(this.convertParagraph(child, list));\n                } else if (child.type === 'bulletList' || child.type === 'orderedList') {\n                    const childList: ListContext = {\n                        reference: child.attrs?.listStyle === 'nepali'\n                            ? 'rk-nepali'\n                            : (child.type === 'bulletList' ? 'rk-bullet' : 'rk-decimal'),\n                        level: list.level + 1,\n                    };\n                    const nested = await this.convertList(child, childList);\n                    out.push(...nested);\n                }\n            }\n        }\n        return out;\n    }\n\n    private convertTaskList(node: any): Paragraph[] {\n        const out: Paragraph[] = [];\n        for (const item of node.content || []) {\n            if (item?.type !== 'taskItem') continue;\n            const checked = !!item.attrs?.checked;\n            const marker = checked ? '☑ ' : '☐ ';\n            for (const child of item.content || []) {\n                if (child.type === 'paragraph') {\n                    const inlines = this.convertInlines(child.content || []);\n                    out.push(new Paragraph({ children: [new TextRun(marker), ...inlines] }));\n                }\n            }\n        }\n        return out.length ? out : [new Paragraph({ children: [new TextRun('')] })];\n    }\n\n    // ---- Tables ------------------------------------------------------------\n\n    private async convertTable(node: any): Promise<Table> {\n        const rows: TableRow[] = [];\n        for (const row of node.content || []) {\n            if (row?.type !== 'tableRow') continue;\n            rows.push(await this.convertTableRow(row));\n        }\n        if (rows.length === 0) {\n            // Word requires non-empty tables.\n            rows.push(new TableRow({ children: [new TableCell({ children: [new Paragraph({ children: [new TextRun('')] })] })] }));\n        }\n        return new Table({\n            width: { size: 100, type: WidthType.PERCENTAGE },\n            rows,\n        });\n    }\n\n    private async convertTableRow(node: any): Promise<TableRow> {\n        const cells: TableCell[] = [];\n        for (const cell of node.content || []) {\n            cells.push(await this.convertTableCell(cell));\n        }\n        if (cells.length === 0) {\n            cells.push(new TableCell({ children: [new Paragraph({ children: [new TextRun('')] })] }));\n        }\n        return new TableRow({ children: cells });\n    }\n\n    private async convertTableCell(node: any): Promise<TableCell> {\n        const attrs = node.attrs || {};\n        const isHeader = node.type === 'tableHeader';\n        const childContent = await this.convertNodes(node.content || []);\n        // Table cells must contain at least one Paragraph at the start and end.\n        const children: (Paragraph | Table)[] = [];\n        for (const c of childContent) children.push(c);\n        if (children.length === 0 || !(children[0] instanceof Paragraph)) {\n            children.unshift(new Paragraph({ children: [new TextRun('')] }));\n        }\n        if (!(children[children.length - 1] instanceof Paragraph)) {\n            children.push(new Paragraph({ children: [new TextRun('')] }));\n        }\n\n        let fill: string | undefined;\n        const bg = attrs.background || attrs.backgroundColor;\n        if (bg) fill = colorToHex(bg);\n        if (isHeader && !fill) fill = 'F3F4F6';\n\n        return new TableCell({\n            children: children as any,\n            columnSpan: attrs.colspan || 1,\n            rowSpan: attrs.rowspan || 1,\n            verticalAlign: VerticalAlign.CENTER,\n            shading: fill ? { fill, type: ShadingType.CLEAR, color: 'auto' } : undefined,\n        });\n    }\n\n    // ---- Inline conversion -------------------------------------------------\n\n    private convertInlines(inlines: any[]): any[] {\n        const out: any[] = [];\n        for (const inline of inlines || []) {\n            if (!inline || typeof inline !== 'object') continue;\n            if (inline.type === 'hardBreak') {\n                out.push(new TextRun({ text: '', break: 1 }));\n                continue;\n            }\n            if (inline.type === 'mathInline') {\n                out.push(new TextRun({ text: inline.attrs?.latex || '', font: 'Cambria Math' }));\n                continue;\n            }\n            if (inline.type === 'citation') {\n                const label = inline.attrs?.label || inline.attrs?.key || '?';\n                out.push(new TextRun({ text: `[${label}]`, superScript: true }));\n                continue;\n            }\n            if (inline.type === 'footnote') {\n                // Render footnote inline as italic superscript so the file remains valid.\n                const text = inline.content?.map((c: any) => c.text || '').join('') || '*';\n                out.push(new TextRun({ text, italics: true, superScript: true }));\n                continue;\n            }\n            if (inline.type !== 'text') {\n                if (Array.isArray(inline.content)) out.push(...this.convertInlines(inline.content));\n                continue;\n            }\n\n            const fmt = this.collectFormat(inline.marks || []);\n            if (fmt.href) {\n                out.push(new ExternalHyperlink({\n                    link: fmt.href,\n                    children: [new TextRun({ text: inline.text || '', ...formatToRun(fmt), color: fmt.color || '0563C1', underline: { type: UnderlineType.SINGLE } })],\n                }));\n            } else {\n                out.push(new TextRun({ text: inline.text || '', ...formatToRun(fmt) }));\n            }\n        }\n        return out;\n    }\n\n    private collectFormat(marks: any[]): InlineFormat {\n        const fmt: InlineFormat = {};\n        for (const mark of marks || []) {\n            switch (mark.type) {\n                case 'bold': fmt.bold = true; break;\n                case 'italic': fmt.italic = true; break;\n                case 'underline': fmt.underline = true; break;\n                case 'strike': fmt.strike = true; break;\n                case 'subscript': fmt.subscript = true; break;\n                case 'superscript': fmt.superscript = true; break;\n                case 'code': fmt.code = true; break;\n                case 'link': fmt.href = mark.attrs?.href || undefined; break;\n                case 'highlight': {\n                    const hex = colorToHex(mark.attrs?.color);\n                    if (hex) fmt.highlight = hex;\n                    break;\n                }\n                case 'textStyle': {\n                    const a = mark.attrs || {};\n                    if (a.color) {\n                        const hex = colorToHex(a.color);\n                        if (hex) fmt.color = hex;\n                    }\n                    if (a.fontFamily) {\n                        fmt.font = String(a.fontFamily).replace(/['\"]/g, '').split(',')[0].trim() || undefined;\n                    }\n                    if (a.fontSize) {\n                        const size = parseFontSize(a.fontSize);\n                        if (size) fmt.size = size;\n                    }\n                    break;\n                }\n                case 'trackInsert': fmt.color = '0A7C2F'; fmt.underline = true; break;\n                case 'trackDelete': fmt.color = 'B3261E'; fmt.strike = true; break;\n            }\n        }\n        return fmt;\n    }\n\n    // ---- Numbering definitions --------------------------------------------\n\n    private numberingConfig(): { reference: string; levels: ILevelsOptions[] }[] {\n        const decimal: ILevelsOptions[] = Array.from({ length: 9 }, (_, level) => ({\n            level,\n            format: LevelFormat.DECIMAL,\n            text: `%${level + 1}.`,\n            alignment: AlignmentType.START,\n            style: { paragraph: { indent: { left: (level + 1) * 720, hanging: 360 } } },\n        }));\n        const bullets = ['•', '◦', '▪', '•', '◦', '▪', '•', '◦', '▪'];\n        const bullet: ILevelsOptions[] = bullets.map((b, level) => ({\n            level,\n            format: LevelFormat.BULLET,\n            text: b,\n            alignment: AlignmentType.START,\n            style: { paragraph: { indent: { left: (level + 1) * 720, hanging: 360 } } },\n        }));\n        const nepali: ILevelsOptions[] = Array.from({ length: 9 }, (_, level) => ({\n            level,\n            format: LevelFormat.DECIMAL,\n            text: `%${level + 1}.`,\n            alignment: AlignmentType.START,\n            style: { paragraph: { indent: { left: (level + 1) * 720, hanging: 360 } } },\n        }));\n        return [\n            { reference: 'rk-decimal', levels: decimal },\n            { reference: 'rk-bullet', levels: bullet },\n            { reference: 'rk-nepali', levels: nepali },\n        ];\n    }\n}\n\n// =====================================================================\n// Helpers (kept module-private)\n// =====================================================================\n\nfunction formatToRun(fmt: InlineFormat): IRunOptions {\n    // IRunOptions has readonly fields, so we build a plain object then cast.\n    const opts: Record<string, any> = {};\n    if (fmt.bold) opts.bold = true;\n    if (fmt.italic) opts.italics = true;\n    if (fmt.strike) opts.strike = true;\n    if (fmt.underline) opts.underline = { type: UnderlineType.SINGLE };\n    if (fmt.subscript) opts.subScript = true;\n    if (fmt.superscript) opts.superScript = true;\n    if (fmt.color) opts.color = fmt.color;\n    if (fmt.font) opts.font = fmt.font;\n    if (fmt.size) opts.size = fmt.size;\n    if (fmt.code) {\n        opts.font = opts.font || 'Consolas';\n        if (!opts.size) opts.size = 20;\n    }\n    if (fmt.highlight) {\n        // Use shading for arbitrary hex highlighting (HighlightColor only takes\n        // a fixed enum of named colors).\n        opts.shading = { type: ShadingType.CLEAR, fill: fmt.highlight, color: 'auto' };\n    }\n    return opts as IRunOptions;\n}\n\nfunction applyParagraphStyling(node: any, opts: any) {\n    const attrs = node.attrs || {};\n    const spacing: any = {};\n    const before = parseSpacingTwips(attrs.spacingBefore || attrs.marginTop);\n    const after = parseSpacingTwips(attrs.spacingAfter || attrs.marginBottom);\n    const line = attrs.lineHeight ? Math.round(parseFloat(attrs.lineHeight) * 240) : undefined;\n    if (before !== undefined) spacing.before = before;\n    if (after !== undefined) spacing.after = after;\n    if (line !== undefined && !isNaN(line)) { spacing.line = line; spacing.lineRule = 'auto'; }\n    if (Object.keys(spacing).length) opts.spacing = spacing;\n\n    const indent: any = {};\n    const left = parseIndentTwips(attrs.indent);\n    const firstLine = parseIndentTwips(attrs.firstLineIndent);\n    if (left !== undefined) indent.left = left;\n    if (firstLine !== undefined) indent.firstLine = firstLine;\n    if (Object.keys(indent).length) opts.indent = indent;\n\n    const align = mapAlignment(attrs.textAlign);\n    if (align) opts.alignment = align;\n}\n\nfunction mapAlignment(align?: string): (typeof AlignmentType)[keyof typeof AlignmentType] | undefined {\n    switch (align) {\n        case 'center': return AlignmentType.CENTER;\n        case 'right': return AlignmentType.RIGHT;\n        case 'justify': return AlignmentType.JUSTIFIED;\n        case 'left': return AlignmentType.LEFT;\n        default: return undefined;\n    }\n}\n\nfunction parseSpacingTwips(value: any): number | undefined {\n    if (value == null || value === '') return undefined;\n    if (typeof value === 'number') return Math.round(value * TWIPS_PER_PT);\n    const s = String(value).trim();\n    const num = parseFloat(s);\n    if (isNaN(num)) return undefined;\n    if (s.endsWith('in')) return Math.round(num * TWIPS_PER_INCH);\n    if (s.endsWith('cm')) return Math.round(num * TWIPS_PER_CM);\n    if (s.endsWith('mm')) return Math.round(num * TWIPS_PER_MM);\n    if (s.endsWith('pt')) return Math.round(num * TWIPS_PER_PT);\n    if (s.endsWith('px')) return Math.round(num * 15);\n    if (s.endsWith('em') || s.endsWith('rem')) return Math.round(num * 240);\n    return Math.round(num * TWIPS_PER_PT);\n}\n\nfunction parseIndentTwips(value: any): number | undefined {\n    if (value == null || value === '') return undefined;\n    if (typeof value === 'number') return Math.round(value * 720);\n    const s = String(value).trim();\n    const num = parseFloat(s);\n    if (isNaN(num)) return undefined;\n    if (s.endsWith('in')) return Math.round(num * TWIPS_PER_INCH);\n    if (s.endsWith('cm')) return Math.round(num * TWIPS_PER_CM);\n    if (s.endsWith('mm')) return Math.round(num * TWIPS_PER_MM);\n    if (s.endsWith('pt')) return Math.round(num * TWIPS_PER_PT);\n    if (s.endsWith('px')) return Math.round(num * 15);\n    return Math.round(num * 720);\n}\n\nfunction parseFontSize(size: any): number | undefined {\n    if (size == null || size === '') return undefined;\n    const s = String(size).trim();\n    const num = parseFloat(s);\n    if (isNaN(num) || num <= 0) return undefined;\n    if (s.endsWith('px')) return Math.max(2, Math.round((num * 0.75) * 2));\n    if (s.endsWith('em') || s.endsWith('rem')) return Math.max(2, Math.round(num * 12 * 2));\n    return Math.max(2, Math.round(num * 2));\n}\n\nfunction colorToHex(input: any): string | undefined {\n    if (!input) return undefined;\n    const s = String(input).trim();\n    if (!s) return undefined;\n    if (s.startsWith('#')) {\n        let hex = s.slice(1);\n        if (hex.length === 3) hex = hex.split('').map(c => c + c).join('');\n        if (/^[0-9A-Fa-f]{6}$/.test(hex)) return hex.toUpperCase();\n    }\n    if (s.startsWith('rgb')) {\n        const parts = s.match(/\\d+/g);\n        if (parts && parts.length >= 3) {\n            const [r, g, b] = parts.slice(0, 3).map(n => Math.min(255, Math.max(0, parseInt(n, 10))));\n            return ((r << 16) | (g << 8) | b).toString(16).padStart(6, '0').toUpperCase();\n        }\n    }\n    const named: Record<string, string> = {\n        black: '000000', white: 'FFFFFF', red: 'FF0000', green: '008000', blue: '0000FF',\n        yellow: 'FFFF00', orange: 'FFA500', purple: '800080', gray: '808080', grey: '808080',\n    };\n    return named[s.toLowerCase()];\n}\n\nfunction clamp(n: number, lo: number, hi: number): number {\n    return Math.min(hi, Math.max(lo, n));\n}\n\nfunction sectionPropertiesFromLayout(layout?: Partial<PageLayoutOptions>): any {\n    const orientation = layout?.orientation === 'landscape'\n        ? PageOrientation.LANDSCAPE\n        : PageOrientation.PORTRAIT;\n    const sizeKey = layout?.pageSize || 'A4';\n    const dims = DOCX_PAGE_SIZES[sizeKey] || DOCX_PAGE_SIZES.A4;\n    const [w, h] = orientation === PageOrientation.LANDSCAPE ? [dims[1], dims[0]] : dims;\n\n    const margins = layout?.margins || { top: '1in', bottom: '1in', left: '1in', right: '1in' };\n    return {\n        page: {\n            size: { width: w, height: h, orientation },\n            margin: {\n                top: parseSpacingTwips(margins.top) ?? TWIPS_PER_INCH,\n                bottom: parseSpacingTwips(margins.bottom) ?? TWIPS_PER_INCH,\n                left: parseSpacingTwips(margins.left) ?? TWIPS_PER_INCH,\n                right: parseSpacingTwips(margins.right) ?? TWIPS_PER_INCH,\n            },\n        },\n    };\n}\n\nasync function fetchImageData(src: string): Promise<{ bytes: Uint8Array; type: 'png' | 'jpg' | 'gif' | 'bmp' } | null> {\n    try {\n        if (src.startsWith('data:')) {\n            const match = src.match(/^data:([^;]+);base64,(.+)$/);\n            if (!match) return null;\n            const mime = match[1];\n            // SVG can't be embedded as a raster image — skip rather than corrupt.\n            if (mime.includes('svg')) return null;\n            const bin = atob(match[2]);\n            const bytes = new Uint8Array(bin.length);\n            for (let i = 0; i < bin.length; i++) bytes[i] = bin.charCodeAt(i);\n            const type = mimeToDocxType(mime);\n            return type ? { bytes, type } : null;\n        }\n        const res = await fetch(src);\n        if (!res.ok) return null;\n        const buf = await res.arrayBuffer();\n        const mime = res.headers.get('content-type') || guessMimeFromUrl(src);\n        if (mime.includes('svg')) return null;\n        const type = mimeToDocxType(mime);\n        return type ? { bytes: new Uint8Array(buf), type } : null;\n    } catch (e) {\n        console.warn('[ExportEngine] image fetch failed', src, e);\n        return null;\n    }\n}\n\nfunction mimeToDocxType(mime: string): 'png' | 'jpg' | 'gif' | 'bmp' | null {\n    if (mime.includes('png')) return 'png';\n    if (mime.includes('jpeg') || mime.includes('jpg')) return 'jpg';\n    if (mime.includes('gif')) return 'gif';\n    if (mime.includes('bmp')) return 'bmp';\n    return null;\n}\n\nfunction guessMimeFromUrl(src: string): string {\n    const m = src.split('?')[0].toLowerCase();\n    if (m.endsWith('.png')) return 'image/png';\n    if (m.endsWith('.jpg') || m.endsWith('.jpeg')) return 'image/jpeg';\n    if (m.endsWith('.gif')) return 'image/gif';\n    if (m.endsWith('.bmp')) return 'image/bmp';\n    if (m.endsWith('.svg')) return 'image/svg+xml';\n    return 'application/octet-stream';\n}\n\nfunction parseImageSize(attrs: any): { width: number; height: number } {\n    const w = parseDimensionPx(attrs?.width);\n    const h = parseDimensionPx(attrs?.height);\n    const width = w && w > 0 ? w : 480;\n    const height = h && h > 0 ? h : Math.round(width * 0.66);\n    return { width, height };\n}\n\ninterface HeadingInfo { level: number; text: string; estimatedPage: number }\n\nfunction collectHeadings(doc: any): HeadingInfo[] {\n    const out: HeadingInfo[] = [];\n    let charCount = 0;\n    const CHARS_PER_PAGE = 1500;\n    const visit = (node: any) => {\n        if (!node) return;\n        if (node.type === 'text' && typeof node.text === 'string') {\n            charCount += node.text.length;\n        }\n        if (node.type === 'heading' && Array.isArray(node.content)) {\n            const text = textOf(node.content);\n            if (text.trim()) {\n                out.push({\n                    level: node.attrs?.level || 1,\n                    text,\n                    estimatedPage: Math.max(1, Math.ceil(charCount / CHARS_PER_PAGE)),\n                });\n            }\n        }\n        if (Array.isArray(node.content)) {\n            for (const child of node.content) visit(child);\n        }\n    };\n    visit(doc);\n    return out;\n}\n\nfunction textOf(content: any[]): string {\n    return content.map((c: any) => {\n        if (c?.type === 'text') return c.text || '';\n        if (Array.isArray(c?.content)) return textOf(c.content);\n        return '';\n    }).join('');\n}\n\nfunction parseDimensionPx(v: any): number | null {\n    if (v == null) return null;\n    if (typeof v === 'number') return v;\n    const s = String(v).trim();\n    const num = parseFloat(s);\n    if (isNaN(num) || num <= 0) return null;\n    if (s.endsWith('%')) return null;\n    if (s.endsWith('in')) return Math.round(num * 96);\n    if (s.endsWith('cm')) return Math.round(num * 37.795);\n    if (s.endsWith('mm')) return Math.round(num * 3.7795);\n    if (s.endsWith('pt')) return Math.round(num * 1.333);\n    return Math.round(num);\n}\n","/**\r\n * ImportEngine - Handles importing external formats into the editor.\r\n * \r\n * DOCX import: Uses mammoth.js for high-fidelity Word document conversion.\r\n * Markdown import: Uses marked for Markdown → HTML conversion.\r\n * Markdown export: Uses turndown to convert HTML → Markdown.\r\n *\r\n * All libraries are dynamically imported to avoid bundle size impact.\r\n */\r\nexport class ImportEngine {\r\n\r\n    /**\r\n     * Import a .docx file and return HTML string.\r\n     * Requires mammoth to be installed: npm install mammoth\r\n     */\r\n    public async importDocx(file: File): Promise<string> {\r\n        let mammoth: any;\r\n        try {\r\n            mammoth = await import('mammoth');\r\n        } catch {\r\n            throw new Error('mammoth is not installed. Run: npm install mammoth');\r\n        }\r\n\r\n        const arrayBuffer = await file.arrayBuffer();\r\n        const result = await mammoth.convertToHtml(\r\n            { arrayBuffer },\r\n            {\r\n                styleMap: [\r\n                    \"p[style-name='Heading 1'] => h1:fresh\",\r\n                    \"p[style-name='Heading 2'] => h2:fresh\",\r\n                    \"p[style-name='Heading 3'] => h3:fresh\",\r\n                    \"p[style-name='Heading 4'] => h4:fresh\",\r\n                    \"p[style-name='Heading 5'] => h5:fresh\",\r\n                    \"p[style-name='Heading 6'] => h6:fresh\",\r\n                    \"p[style-name='List Paragraph'] => li:fresh\",\r\n                    \"p[style-name='toc 1'] => p.rk-toc-item:fresh\",\r\n                    \"p[style-name='toc 2'] => p.rk-toc-item:fresh\",\r\n                    \"p[style-name='caption'] => p.rk-caption:fresh\",\r\n                    \"p[style-name='Bibliography'] => p.rk-bibliography:fresh\",\r\n                    \"b => strong\",\r\n                    \"i => em\",\r\n                    \"u => span.underline\",\r\n                ],\r\n                includeDefaultStyleMap: true,\r\n            }\r\n        );\r\n\r\n        if (result.messages.length > 0) {\r\n            console.warn('[ImportEngine] DOCX import warnings:', result.messages);\r\n        }\r\n\r\n        return result.value;\r\n    }\r\n\r\n    /**\r\n     * Import a Markdown string and return HTML.\r\n     * Requires marked: npm install marked\r\n     */\r\n    public async importMarkdown(text: string): Promise<string> {\r\n        let marked: any;\r\n        try {\r\n            const mod = await import('marked');\r\n            marked = (mod as any).marked ?? (mod as any).default ?? mod;\r\n        } catch {\r\n            throw new Error('marked is not installed. Run: npm install marked');\r\n        }\r\n\r\n        return marked(text, {\r\n            gfm: true,       // GitHub-flavored markdown\r\n            breaks: true,    // Line breaks become <br>\r\n        });\r\n    }\r\n\r\n    /**\r\n     * Export HTML to Markdown.\r\n     * Requires turndown: npm install turndown\r\n     */\r\n    public async exportMarkdown(html: string): Promise<string> {\r\n        let TurndownService: any;\r\n        try {\r\n            const mod = await import('turndown');\r\n            TurndownService = mod.default || mod;\r\n        } catch {\r\n            throw new Error('turndown is not installed. Run: npm install turndown');\r\n        }\r\n\r\n        const service = new TurndownService({\r\n            headingStyle: 'atx',\r\n            bulletListMarker: '-',\r\n            codeBlockStyle: 'fenced',\r\n        });\r\n\r\n        // Handle tables\r\n        try {\r\n            // Using a template literal to avoid Vite static analysis if missing\r\n            const pluginName = 'turndown-plugin-gfm';\r\n            const gfm = await import(/* @vite-ignore */ pluginName);\r\n            service.use(gfm.gfm || gfm.default || gfm);\r\n        } catch (e) {\r\n            console.warn('[ImportEngine] turndown-plugin-gfm not loaded, skipping tables in markdown export.', e);\r\n        }\r\n\r\n        return service.turndown(html);\r\n    }\r\n\r\n    /**\r\n     * Download Markdown as a .md file.\r\n     */\r\n    public downloadMarkdown(markdown: string, filename = 'document.md'): void {\r\n        const blob = new Blob([markdown], { type: 'text/markdown; charset=utf-8' });\r\n        const url = URL.createObjectURL(blob);\r\n        const a = document.createElement('a');\r\n        a.href = url;\r\n        a.download = filename;\r\n        a.click();\r\n        URL.revokeObjectURL(url);\r\n    }\r\n}\r\n","import type { PageLayoutOptions } from './extensions/PageLayout';\n\nexport interface PrintOptions {\n  /** Document title shown in print preview / saved PDF. */\n  title?: string;\n  /** Override the editor's page layout for this print only. */\n  pageLayout?: Partial<PageLayoutOptions>;\n  /** Extra CSS to inject into the print iframe. */\n  extraCss?: string;\n  /** Optional header HTML printed at the top of every page. */\n  headerHtml?: string;\n  /** Optional footer HTML printed at the bottom of every page. */\n  footerHtml?: string;\n  /** Show page numbers in the footer (defaults to true). */\n  pageNumbers?: boolean;\n  /** Auto-close the print iframe after the print dialog (default true). */\n  autoClose?: boolean;\n}\n\nconst DEFAULT_PRINT_CSS = `\n  *, *::before, *::after { box-sizing: border-box; }\n  html, body {\n    margin: 0;\n    padding: 0;\n    background: #fff;\n    color: #000;\n    font-family: 'Times New Roman', Georgia, serif;\n    font-size: 12pt;\n    line-height: 1.5;\n    -webkit-print-color-adjust: exact;\n    print-color-adjust: exact;\n  }\n  .rk-print-root {\n    width: 100%;\n    margin: 0;\n    padding: 0;\n  }\n  h1, h2, h3, h4, h5, h6 {\n    font-family: 'Calibri', 'Helvetica Neue', Arial, sans-serif;\n    font-weight: 700;\n    line-height: 1.25;\n    margin: 1em 0 0.4em;\n    page-break-after: avoid;\n    break-after: avoid;\n  }\n  h1 { font-size: 22pt; }\n  h2 { font-size: 18pt; }\n  h3 { font-size: 14pt; }\n  h4 { font-size: 12pt; }\n  p { margin: 0 0 0.6em; orphans: 3; widows: 3; }\n  a { color: #1a73e8; text-decoration: underline; }\n  ul, ol { padding-left: 1.5em; margin: 0.5em 0; }\n  blockquote {\n    border-left: 4px solid #c8ccd0;\n    padding-left: 1em;\n    margin: 1em 0;\n    color: #444;\n    font-style: italic;\n  }\n  pre {\n    background: #f5f5f5;\n    border: 1px solid #ddd;\n    padding: 0.6em;\n    border-radius: 4px;\n    overflow: auto;\n    font-family: 'Courier New', monospace;\n    font-size: 10pt;\n    page-break-inside: avoid;\n  }\n  code {\n    background: #f5f5f5;\n    border: 1px solid #ddd;\n    padding: 1px 4px;\n    border-radius: 3px;\n    font-family: 'Courier New', monospace;\n    font-size: 0.9em;\n  }\n  table {\n    width: 100%;\n    border-collapse: collapse;\n    margin: 1em 0;\n    page-break-inside: auto;\n  }\n  table, th, td { border: 1px solid #888; }\n  th, td { padding: 6px 10px; vertical-align: top; }\n  th { background: #f3f4f6; text-align: left; font-weight: 700; }\n  tr { page-break-inside: avoid; page-break-after: auto; }\n  img {\n    max-width: 100%;\n    height: auto;\n    page-break-inside: avoid;\n  }\n  figcaption, .rk-caption {\n    text-align: center;\n    font-size: 10pt;\n    color: #555;\n    font-style: italic;\n    margin: 0.4em 0 1em;\n  }\n  .rk-page-break, [data-type=\"page-break\"] {\n    display: block;\n    height: 0;\n    page-break-after: always;\n    break-after: page;\n    border: none;\n  }\n  .rk-toc {\n    margin: 1em 0 1.4em;\n    padding: 0.6em 0 0.4em;\n    border-top: 1px solid #d0d4d8;\n    border-bottom: 1px solid #d0d4d8;\n    page-break-inside: auto;\n  }\n  .rk-toc-header {\n    display: flex;\n    align-items: baseline;\n    margin: 0 0 0.6em;\n  }\n  .rk-toc-title {\n    margin: 0;\n    font-size: 14pt;\n    font-weight: 700;\n    font-family: 'Calibri', 'Helvetica Neue', Arial, sans-serif;\n  }\n  .rk-toc-list {\n    list-style: none;\n    margin: 0;\n    padding: 0;\n  }\n  .rk-toc-item {\n    margin: 0.15em 0;\n    padding: 0;\n    list-style: none;\n  }\n  .rk-toc-link {\n    display: flex;\n    align-items: baseline;\n    gap: 0.4em;\n    color: #000;\n    text-decoration: none;\n  }\n  .rk-toc-text { flex: 0 1 auto; }\n  .rk-toc-leader {\n    flex: 1 1 auto;\n    border-bottom: 1px dotted #777;\n    transform: translateY(-3px);\n    margin: 0 0.25em;\n    min-width: 1em;\n  }\n  .rk-toc-page {\n    flex: 0 0 auto;\n    font-variant-numeric: tabular-nums;\n    color: #333;\n  }\n  .rk-toc-l1 .rk-toc-link { padding-left: 0;     font-weight: 600; }\n  .rk-toc-l2 .rk-toc-link { padding-left: 1.2em; }\n  .rk-toc-l3 .rk-toc-link { padding-left: 2.4em; font-size: 0.95em; }\n  .rk-toc-l4 .rk-toc-link { padding-left: 3.6em; font-size: 0.9em;  color: #444; }\n  .rk-toc-l5 .rk-toc-link { padding-left: 4.8em; font-size: 0.85em; color: #555; }\n  .rk-toc-l6 .rk-toc-link { padding-left: 6em;   font-size: 0.85em; color: #666; }\n  .rk-toc-empty { color: #888; font-style: italic; margin: 0.5em 0; }\n  .rk-track-insert { color: #0a7c2f; text-decoration: underline; text-decoration-color: #0a7c2f; }\n  .rk-track-delete { color: #b3261e; text-decoration: line-through; }\n  ul[data-type=\"taskList\"] { list-style: none; padding-left: 0.5em; }\n  ul[data-type=\"taskList\"] li { display: flex; gap: 0.5em; align-items: baseline; }\n  ul[data-type=\"taskList\"] li > label > input { margin-top: 0.15em; }\n  .rk-image-resize-wrapper {\n    display: inline-block;\n    position: relative;\n    max-width: 100%;\n  }\n  .rk-image-resize-wrapper img {\n    display: block;\n    max-width: 100%;\n    height: auto;\n  }\n  .rk-textbox {\n    border: 1px solid #c8ccd0;\n    background: #fff;\n    padding: 0.6em 0.8em;\n    margin: 0.6em 0;\n    border-radius: 4px;\n    page-break-inside: avoid;\n  }\n  .rk-textbox-content > p:first-child { margin-top: 0; }\n  .rk-textbox-content > *:last-child { margin-bottom: 0; }\n`;\n\n/**\n * Renders the editor content in an isolated, hidden iframe and triggers the\n * browser's print dialog. The user may then \"Save as PDF\" with proper\n * pagination, no editor chrome, no page-overflow scrollbars, and the configured\n * page size / orientation.\n */\nexport class PrintEngine {\n  public print(html: string, options: PrintOptions = {}): void {\n    const layout = mergePageLayout(options.pageLayout);\n    const pageSize = printPageSize(layout);\n    const margin = `${layout.margins.top} ${layout.margins.right} ${layout.margins.bottom} ${layout.margins.left}`;\n    const showPageNumbers = options.pageNumbers !== false;\n    const title = options.title || 'Document';\n\n    const iframe = document.createElement('iframe');\n    iframe.setAttribute('aria-hidden', 'true');\n    iframe.style.position = 'fixed';\n    iframe.style.right = '0';\n    iframe.style.bottom = '0';\n    iframe.style.width = '0';\n    iframe.style.height = '0';\n    iframe.style.border = '0';\n    iframe.style.opacity = '0';\n    iframe.style.pointerEvents = 'none';\n\n    document.body.appendChild(iframe);\n\n    const doc = iframe.contentDocument!;\n    const docHtml = `<!doctype html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <title>${escape(title)}</title>\n  <style>\n    @page {\n      size: ${pageSize};\n      margin: ${margin};\n      ${showPageNumbers ? `@bottom-right { content: counter(page) \" / \" counter(pages); font-family: sans-serif; font-size: 9pt; color: #666; }` : ''}\n    }\n    @media print {\n      body { -webkit-print-color-adjust: exact; print-color-adjust: exact; }\n    }\n    ${DEFAULT_PRINT_CSS}\n    ${options.extraCss || ''}\n  </style>\n</head>\n<body>\n  ${options.headerHtml ? `<header class=\"rk-print-header\">${options.headerHtml}</header>` : ''}\n  <main class=\"rk-print-root\">${html}</main>\n  ${options.footerHtml ? `<footer class=\"rk-print-footer\">${options.footerHtml}</footer>` : ''}\n</body>\n</html>`;\n\n    doc.open();\n    doc.write(docHtml);\n    doc.close();\n\n    const cleanup = () => {\n      try { document.body.removeChild(iframe); } catch { /* already gone */ }\n    };\n\n    const trigger = () => {\n      try {\n        iframe.contentWindow?.focus();\n        iframe.contentWindow?.print();\n      } catch (e) {\n        console.error('[PrintEngine] print failed', e);\n      } finally {\n        if (options.autoClose !== false) {\n          // Slight delay to allow print dialog to read the document.\n          setTimeout(cleanup, 1000);\n        }\n      }\n    };\n\n    // Wait for images to load before triggering print so they appear in PDF.\n    const waitForImages = async () => {\n      const images = Array.from(doc.images || []);\n      await Promise.all(\n        images.map(img => img.complete\n          ? Promise.resolve()\n          : new Promise<void>(resolve => {\n              img.addEventListener('load', () => resolve(), { once: true });\n              img.addEventListener('error', () => resolve(), { once: true });\n            })\n        )\n      );\n    };\n\n    if (doc.readyState === 'complete') {\n      waitForImages().then(trigger);\n    } else {\n      iframe.addEventListener('load', () => waitForImages().then(trigger), { once: true });\n    }\n  }\n}\n\nfunction escape(s: string): string {\n  return s.replace(/[&<>\"']/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]!));\n}\n\nfunction printPageSize(layout: PageLayoutOptions): string {\n  const size = (layout.pageSize || 'A4').toLowerCase();\n  const orient = layout.orientation === 'landscape' ? 'landscape' : 'portrait';\n  const known = ['a3', 'a4', 'a5', 'letter', 'legal', 'tabloid'];\n  if (known.includes(size)) return `${size} ${orient}`;\n  if (layout.width && layout.height) return `${layout.width} ${layout.height}`;\n  return `A4 ${orient}`;\n}\n\nfunction mergePageLayout(layout?: Partial<PageLayoutOptions>): PageLayoutOptions {\n  const base: PageLayoutOptions = {\n    pageSize: 'A4',\n    orientation: 'portrait',\n    margins: { top: '1in', bottom: '1in', left: '1in', right: '1in' },\n  };\n  if (!layout) return base;\n  return {\n    ...base,\n    ...layout,\n    margins: { ...base.margins, ...(layout.margins || {}) },\n  };\n}\n","import { NodeSelection } from '@tiptap/pm/state';\r\n\r\n/**\r\n * Creates an image NodeView with corner and side drag handles for resizing.\r\n * Hold Shift while dragging to lock the aspect ratio.\r\n *\r\n * Wired up by the `Image` extension in `WordEditor`'s `addNodeView` so any\r\n * `<img>` node in the document gets these handles when selected.\r\n */\r\nexport function createImageResizeView(node: any, view: any, getPos: any) {\r\n    const wrapper = document.createElement('div');\r\n    wrapper.className = 'rk-image-resize-wrapper';\r\n    wrapper.setAttribute('contenteditable', 'false');\r\n    wrapper.setAttribute('draggable', 'true');\r\n\r\n    const img = document.createElement('img');\r\n    img.src = node.attrs.src;\r\n    img.alt = node.attrs.alt || '';\r\n    img.style.display = 'block';\r\n    img.style.maxWidth = '100%';\r\n    img.style.height = 'auto';\r\n\r\n    if (node.attrs.width) img.style.width = node.attrs.width;\r\n    if (node.attrs.height) img.style.height = node.attrs.height;\r\n    if (node.attrs.float) wrapper.style.float = node.attrs.float;\r\n\r\n    wrapper.appendChild(img);\r\n\r\n    // Click-to-select: makes the resize handles appear without keyboard nav.\r\n    img.addEventListener('mousedown', (e) => {\r\n        // Allow click-and-hold-to-drag (browser default for draggable=true) but\r\n        // also select the node so handles appear.\r\n        const pos = getPos();\r\n        if (typeof pos !== 'number') return;\r\n        try {\r\n            const tr = view.state.tr.setSelection(NodeSelection.create(view.state.doc, pos));\r\n            view.dispatch(tr);\r\n        } catch { /* not a selectable node */ }\r\n        // Don't preventDefault — we want native drag to start when held.\r\n        e.stopPropagation();\r\n    });\r\n\r\n    // Build resize handles: corners + sides\r\n    const handlePositions = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];\r\n    handlePositions.forEach(pos => {\r\n        const handle = document.createElement('div');\r\n        handle.className = `rk-resize-handle rk-resize-handle-${pos}`;\r\n        handle.dataset.handle = pos;\r\n        wrapper.appendChild(handle);\r\n\r\n        let startX = 0;\r\n        let startY = 0;\r\n        let startW = 0;\r\n        let startH = 0;\r\n        let aspectRatio = 1;\r\n\r\n        handle.addEventListener('mousedown', (e: MouseEvent) => {\r\n            e.preventDefault();\r\n            e.stopPropagation();\r\n\r\n            startX = e.clientX;\r\n            startY = e.clientY;\r\n            startW = img.offsetWidth;\r\n            startH = img.offsetHeight;\r\n            aspectRatio = startH > 0 ? startW / startH : 1;\r\n            wrapper.classList.add('is-resizing');\r\n\r\n            const onMouseMove = (e: MouseEvent) => {\r\n                const dx = e.clientX - startX;\r\n                const dy = e.clientY - startY;\r\n                const lockAspect = e.shiftKey;\r\n\r\n                let newWidth = startW;\r\n                let newHeight = startH;\r\n\r\n                if (pos.includes('e')) newWidth = Math.max(60, startW + dx);\r\n                if (pos.includes('w')) newWidth = Math.max(60, startW - dx);\r\n                if (pos.includes('s')) newHeight = Math.max(40, startH + dy);\r\n                if (pos.includes('n')) newHeight = Math.max(40, startH - dy);\r\n\r\n                if (lockAspect) {\r\n                    if (pos.includes('e') || pos.includes('w')) {\r\n                        newHeight = Math.round(newWidth / aspectRatio);\r\n                    } else {\r\n                        newWidth = Math.round(newHeight * aspectRatio);\r\n                    }\r\n                }\r\n\r\n                img.style.width = `${newWidth}px`;\r\n                img.style.height = `${newHeight}px`;\r\n            };\r\n\r\n            const onMouseUp = () => {\r\n                wrapper.classList.remove('is-resizing');\r\n                document.removeEventListener('mousemove', onMouseMove);\r\n                document.removeEventListener('mouseup', onMouseUp);\r\n\r\n                const pos = getPos();\r\n                if (typeof pos === 'number') {\r\n                    const tr = view.state.tr.setNodeMarkup(pos, undefined, {\r\n                        ...node.attrs,\r\n                        width: img.style.width,\r\n                        height: img.style.height,\r\n                    });\r\n                    view.dispatch(tr);\r\n                }\r\n            };\r\n\r\n            document.addEventListener('mousemove', onMouseMove);\r\n            document.addEventListener('mouseup', onMouseUp);\r\n        });\r\n    });\r\n\r\n    const select = () => {\r\n        wrapper.classList.add('is-selected');\r\n    };\r\n    const deselect = () => {\r\n        wrapper.classList.remove('is-selected');\r\n    };\r\n\r\n    return {\r\n        dom: wrapper,\r\n        update(updatedNode: any) {\r\n            if (updatedNode.type.name !== 'image') return false;\r\n            img.src = updatedNode.attrs.src;\r\n            img.alt = updatedNode.attrs.alt || '';\r\n            if (updatedNode.attrs.width) img.style.width = updatedNode.attrs.width;\r\n            if (updatedNode.attrs.height) img.style.height = updatedNode.attrs.height;\r\n            return true;\r\n        },\r\n        selectNode: select,\r\n        deselectNode: deselect,\r\n        stopEvent: (event: Event) => event.target !== img,\r\n        destroy() { },\r\n    };\r\n}\r\n","import { Editor } from '@tiptap/core';\nimport StarterKit from '@tiptap/starter-kit';\nimport Underline from '@tiptap/extension-underline';\nimport Subscript from '@tiptap/extension-subscript';\nimport Superscript from '@tiptap/extension-superscript';\nimport { TextStyle } from '@tiptap/extension-text-style';\nimport FontFamily from '@tiptap/extension-font-family';\nimport Color from '@tiptap/extension-color';\nimport Highlight from '@tiptap/extension-highlight';\nimport TextAlign from '@tiptap/extension-text-align';\nimport { TaskList } from '@tiptap/extension-task-list';\nimport { TaskItem } from '@tiptap/extension-task-item';\nimport { Table } from '@tiptap/extension-table';\nimport { TableRow } from '@tiptap/extension-table-row';\nimport { TableCell } from '@tiptap/extension-table-cell';\nimport { TableHeader } from '@tiptap/extension-table-header';\nimport { Image } from '@tiptap/extension-image';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport { Link } from './extensions/Link';\n\n// Core Extensions\nimport { FontSize } from './extensions/FontSize';\nimport { TextTransform } from './extensions/TextTransform';\nimport { LineHeight } from './extensions/LineHeight';\nimport { ParagraphSpacing } from './extensions/ParagraphSpacing';\nimport { Indent } from './extensions/Indent';\nimport { PageBreak } from './extensions/PageBreak';\nimport { Footnote } from './extensions/Footnote';\nimport { PasteHandler } from './extensions/PasteHandler';\nimport { AdvancedTypography } from './extensions/AdvancedTypography';\nimport { ParagraphSystem } from './extensions/ParagraphSystem';\nimport { StylesEngine } from './extensions/StylesEngine';\nimport { PageLayout, type PageLayoutOptions, DEFAULT_PAGE_LAYOUT } from './extensions/PageLayout';\nimport { Section } from './extensions/Section';\nimport { Header, Footer, PageNumber } from './extensions/HeaderFooter';\nimport { TableStyles } from './extensions/TableStyles';\nimport { MultilevelList } from './extensions/MultilevelList';\nimport { Caption } from './extensions/Caption';\nimport { ImageResize } from './extensions/ImageResize';\nimport { MathInline, MathBlock } from './extensions/Math';\nimport { TableOfContents } from './extensions/TableOfContents';\nimport { Citation, Bibliography } from './extensions/Citation';\nimport { SlashCommands, defaultSlashCommands, type SlashCommand } from './extensions/SlashCommands';\nimport { ImageUpload } from './extensions/ImageUpload';\nimport { FormatPainter } from './extensions/FormatPainter';\nimport { DragHandle } from './extensions/DragHandle';\nimport { TrackChanges, TrackInsert, TrackDelete } from './extensions/TrackChanges';\nimport { LeaderMark } from './extensions/LeaderMark';\nimport { FindReplace } from './extensions/FindReplace';\n\nimport { WordShortcuts } from './extensions/WordShortcuts';\nimport { TextBox } from './extensions/TextBox';\nimport { Pagination } from './extensions/Pagination';\nimport { Title, Subtitle } from './extensions/TitleSubtitle';\n\n// Utilities\nimport { DocumentValidator } from './DocumentValidator';\nimport { CommandManager } from './CommandManager';\nimport { ExportEngine, type ExportFormat, type ExportOptions } from './ExportEngine';\nimport { ImportEngine } from './ImportEngine';\nimport { StyleManager } from './StyleManager';\nimport { PrintEngine, type PrintOptions } from './PrintEngine';\nimport { createImageResizeView } from './extensions/ImageResizeHandle';\n\nexport type { ExportFormat, ExportOptions, SlashCommand, PageLayoutOptions, PrintOptions };\nexport { defaultSlashCommands, DEFAULT_PAGE_LAYOUT };\nexport { StyleManager } from './StyleManager';\nexport { ExportEngine } from './ExportEngine';\nexport { ImportEngine } from './ImportEngine';\nexport { PrintEngine } from './PrintEngine';\nexport { DocumentValidator } from './DocumentValidator';\nexport { CommandManager } from './CommandManager';\nexport type { ChangeRecord } from './extensions/TrackChanges';\n\nexport interface WordEditorOptions {\n  element: HTMLElement;\n  /** Initial document — HTML string or Tiptap JSON. */\n  initialContent?: string | Record<string, any>;\n  /** @deprecated Use `initialContent`. Kept for backwards compatibility. */\n  content?: string | Record<string, any>;\n  placeholder?: string;\n  editable?: boolean;\n  autofocus?: boolean | 'start' | 'end' | 'all' | number;\n  pageLayout?: Partial<PageLayoutOptions>;\n  trackAuthor?: string;\n  imageUploadHandler?: (file: File) => Promise<string>;\n  slashCommands?: SlashCommand[];\n  dragHandles?: boolean;\n  onUpdate?: (json: any, editor: Editor) => void;\n  onWordCount?: (stats: WordCountStats) => void;\n  onSelectionChange?: (editor: Editor) => void;\n}\n\nexport interface WordCountStats {\n  words: number;\n  characters: number;\n  charactersNoSpaces: number;\n  paragraphs: number;\n  sentences: number;\n  pages: number;\n  readingTimeMinutes: number;\n}\n\nexport class WordEditor {\n  private editor: Editor;\n  public commands: CommandManager;\n  private exporter: ExportEngine;\n  private importer: ImportEngine;\n  private printer: PrintEngine;\n  private _styleManager: StyleManager;\n  private _pageLayout: PageLayoutOptions;\n  private _zoom = 1;\n\n  constructor(options: WordEditorOptions) {\n    this._styleManager = new StyleManager();\n    this.importer = new ImportEngine();\n    this._pageLayout = { ...DEFAULT_PAGE_LAYOUT, ...(options.pageLayout || {}) };\n\n    const initial = options.initialContent ?? options.content ?? '';\n\n    this.editor = new Editor({\n      element: options.element,\n      editable: options.editable !== false,\n      autofocus: options.autofocus,\n      extensions: [\n        StarterKit.configure({ codeBlock: { HTMLAttributes: { class: 'rk-code-block' } } }),\n        Placeholder.configure({\n          // Only show the placeholder when the editor is completely empty —\n          // not on every blank paragraph created by Enter.\n          placeholder: options.placeholder ?? 'Start typing here…',\n          showOnlyWhenEditable: true,\n          showOnlyCurrent: true,\n          includeChildren: false,\n          emptyEditorClass: 'is-editor-empty',\n          emptyNodeClass: 'is-empty',\n        }),\n        Underline,\n        TextStyle,\n        FontFamily,\n        Color,\n        Highlight.configure({ multicolor: true }),\n        Subscript,\n        Superscript,\n        TextAlign.configure({ types: ['heading', 'paragraph'] }),\n        Table.configure({ resizable: true, lastColumnResizable: true }),\n        TableRow,\n        TableHeader,\n        TableCell,\n        TableStyles,\n        TaskList,\n        TaskItem.configure({ nested: true }),\n        MultilevelList,\n        Link.configure({\n          openOnClick: false,\n          HTMLAttributes: { class: 'rk-link' },\n        }),\n        Image.configure({ inline: false, HTMLAttributes: { class: 'rk-image' } }).extend({\n          addNodeView() {\n            return (props) => createImageResizeView(props.node, props.view, props.getPos);\n          },\n        }),\n        ImageResize,\n        ImageUpload.configure({ onUpload: options.imageUploadHandler ?? null }),\n        Caption,\n        MathInline,\n        MathBlock,\n        FontSize,\n        TextTransform,\n        LineHeight,\n        ParagraphSpacing,\n        Indent,\n        PageBreak,\n        Footnote,\n        PasteHandler,\n        AdvancedTypography,\n        ParagraphSystem,\n        StylesEngine,\n        PageLayout.configure(this._pageLayout),\n        Section,\n        Header,\n        Footer,\n        PageNumber,\n        TableOfContents,\n        Citation,\n        Bibliography,\n        SlashCommands.configure({ commands: options.slashCommands ?? defaultSlashCommands }),\n        FormatPainter,\n        TrackChanges.configure({ author: options.trackAuthor || 'Author' }),\n        TrackInsert,\n        TrackDelete,\n        LeaderMark,\n        FindReplace,\n        WordShortcuts,\n        TextBox,\n        Title,\n        Subtitle,\n        Pagination,\n        ...(options.dragHandles !== false ? [DragHandle] : []),\n      ],\n      content: initial,\n      onUpdate: ({ editor }) => {\n        options.onUpdate?.(editor.getJSON(), editor);\n        if (options.onWordCount) options.onWordCount(this.getWordCount());\n      },\n      onSelectionUpdate: ({ editor }) => options.onSelectionChange?.(editor),\n    });\n\n    this.commands = new CommandManager(this.editor);\n    this.exporter = new ExportEngine(this._styleManager);\n    this.printer = new PrintEngine();\n\n    (this.editor as any).options.parent = this;\n    this.applyPageLayoutToDOM(options.element);\n    this.syncPaginationLayout();\n  }\n\n  /** Push the current page-content height (in CSS pixels) into the Pagination\n   *  extension so the on-screen page boundary indicators reflect the layout. */\n  private syncPaginationLayout(): void {\n    const layoutPx = pageContentHeightPx(this._pageLayout);\n    const storage: any = (this.editor.storage as any).pagination;\n    if (storage) storage.contentHeightPx = layoutPx;\n    // Force a re-paint of the boundaries.\n    try {\n      const view = this.editor.view;\n      view.dispatch(view.state.tr.setMeta({ key: 'rkPagination' } as any, true));\n    } catch { /* noop */ }\n  }\n\n  // ---- Core API ----\n  public getHTML(): string { return this.editor.getHTML(); }\n  public getJSON(): any { return this.editor.getJSON(); }\n  public getText(): string { return this.editor.state.doc.textContent; }\n  public isEmpty(): boolean { return this.editor.isEmpty; }\n  public isEditable(): boolean { return this.editor.isEditable; }\n\n  public setDocument(content: string | any): void {\n    const validated = typeof content === 'object' ? DocumentValidator.validate(content) : content;\n    this.editor.commands.setContent(validated);\n  }\n\n  public clear(): void { this.editor.commands.clearContent(true); }\n  public focus(pos: 'start' | 'end' | 'all' | number = 'end'): void { this.editor.commands.focus(pos as any); }\n  public blur(): void { this.editor.commands.blur(); }\n  public destroy(): void { this.editor.destroy(); }\n\n  /** Toggle the editor between editable and read-only mode. */\n  public setEditable(editable: boolean): void {\n    this.editor.setEditable(editable);\n  }\n\n  // ---- Format proxy (legacy compatibility) ----\n  public get format() { return this.commands; }\n\n  // ---- Export API ----\n  public async exportDocx(filename = 'document.docx') {\n    return this.exporter.exportToDocx(this.getJSON(), { filename, pageLayout: this._pageLayout });\n  }\n\n  public async exportMarkdown(filename = 'document.md'): Promise<void> {\n    const md = await this.importer.exportMarkdown(this.getHTML());\n    this.importer.downloadMarkdown(md, filename);\n  }\n\n  public exportHtml(filename = 'document.html'): void {\n    const html = `<!doctype html>\n<html lang=\"en\">\n<head><meta charset=\"utf-8\"><title>Document</title></head>\n<body>${this.getHTML()}</body>\n</html>`;\n    const blob = new Blob([html], { type: 'text/html;charset=utf-8' });\n    const url = URL.createObjectURL(blob);\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = filename;\n    a.click();\n    URL.revokeObjectURL(url);\n  }\n\n  public exportJson(filename = 'document.json'): void {\n    const blob = new Blob([JSON.stringify(this.getJSON(), null, 2)], { type: 'application/json' });\n    const url = URL.createObjectURL(blob);\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = filename;\n    a.click();\n    URL.revokeObjectURL(url);\n  }\n\n  public async export(format: ExportFormat | 'markdown' | 'json', options: ExportOptions = {}) {\n    switch (format) {\n      case 'docx': return this.exportDocx(options.filename);\n      case 'pdf': return this.printPdf(options as any);\n      case 'html': return this.exportHtml(options.filename);\n      case 'markdown': return this.exportMarkdown(options.filename);\n      case 'json': return this.exportJson(options.filename);\n      default: console.warn(`Unsupported export format: ${format}`);\n    }\n  }\n\n  // ---- Print / PDF ----\n  /**\n   * Print only the editor content in an isolated iframe with A4 portrait\n   * defaults. Use the browser's \"Save as PDF\" option to export PDF.\n   */\n  public printPdf(options: PrintOptions = {}): void {\n    const html = this.getPrintableHTML();\n    this.printer.print(html, {\n      pageLayout: this._pageLayout,\n      title: 'Document',\n      ...options,\n    });\n  }\n\n  /**\n   * Build print-ready HTML by cloning the live editor DOM. This preserves\n   * NodeView-rendered content (Table of Contents, image resize wrappers,\n   * text boxes) that `editor.getHTML()` cannot serialize, then strips\n   * editor-only chrome (drag handles, resize handles, pagination spacers,\n   * contenteditable attrs).\n   */\n  public getPrintableHTML(): string {\n    const editorEl = this.editor.options.element as HTMLElement | undefined;\n    const proseMirror = editorEl?.querySelector('.ProseMirror') as HTMLElement | null;\n    if (!proseMirror) return this.getHTML();\n\n    const clone = proseMirror.cloneNode(true) as HTMLElement;\n\n    const dropSelectors = [\n      '.rk-page-spacer',\n      '.rk-resize-handle',\n      '.rk-textbox-handle',\n      '.rk-textbox-drag',\n      '.rk-drag-handle',\n      '.rk-toc-refresh',\n      '.ProseMirror-widget',\n      '.ProseMirror-gapcursor',\n      '.ProseMirror-separator',\n    ];\n    clone.querySelectorAll(dropSelectors.join(',')).forEach(el => el.remove());\n\n    clone.querySelectorAll('[contenteditable]').forEach(el => el.removeAttribute('contenteditable'));\n    clone.querySelectorAll('.ProseMirror-selectednode').forEach(el => el.classList.remove('ProseMirror-selectednode'));\n\n    return clone.innerHTML;\n  }\n\n  // ---- Import API ----\n  public async importDocx(file: File): Promise<void> {\n    const html = await this.importer.importDocx(file);\n    this.setDocument(html);\n  }\n\n  public async importMarkdown(text: string): Promise<void> {\n    const html = await this.importer.importMarkdown(text);\n    this.setDocument(html);\n  }\n\n  public async importFromFile(file: File): Promise<void> {\n    const name = file.name.toLowerCase();\n    if (name.endsWith('.docx')) return this.importDocx(file);\n    if (name.endsWith('.md') || name.endsWith('.markdown')) {\n      const text = await file.text();\n      return this.importMarkdown(text);\n    }\n    if (name.endsWith('.html') || name.endsWith('.htm')) {\n      const html = await file.text();\n      this.setDocument(html);\n      return;\n    }\n    if (name.endsWith('.json')) {\n      const text = await file.text();\n      this.setDocument(JSON.parse(text));\n      return;\n    }\n    if (name.endsWith('.txt')) {\n      const text = await file.text();\n      const html = text.split(/\\r?\\n/).map(l => `<p>${escapeHtml(l) || '<br>'}</p>`).join('');\n      this.setDocument(html);\n      return;\n    }\n    throw new Error(`Unsupported file format: ${file.name}`);\n  }\n\n  // ---- Document Tools ----\n  public getTableOfContents(): { level: number; text: string; id: string }[] {\n    const headings: { level: number; text: string; id: string }[] = [];\n    this.editor.state.doc.descendants((node) => {\n      if (node.type.name === 'heading') {\n        const text = node.textContent;\n        const id = slugify(text);\n        headings.push({ level: node.attrs.level, text, id });\n      }\n    });\n    return headings;\n  }\n\n  public getWordCount(): WordCountStats {\n    // `doc.textContent` concatenates with no block separators, so adjacent\n    // blocks ('apple', 'ball') would be counted as one word. Use textBetween\n    // with a newline separator to get correct word boundaries across blocks.\n    const doc = this.editor.state.doc;\n    const text = doc.textBetween(0, doc.content.size, '\\n', ' ');\n    const trimmed = text.trim();\n    const words = trimmed ? trimmed.split(/[\\s ]+/).filter(Boolean).length : 0;\n    const characters = text.length;\n    const charactersNoSpaces = text.replace(/\\s/g, '').length;\n    let paragraphs = 0;\n    doc.descendants(node => {\n      if (node.type.name === 'paragraph' && node.textContent.length) paragraphs++;\n    });\n    const sentences = trimmed\n      ? (trimmed.match(/[^.!?\\n]+[.!?]+/g) || [trimmed]).length\n      : 0;\n    const pages = Math.max(1, Math.ceil(words / 250));\n    const readingTimeMinutes = Math.max(1, Math.ceil(words / 200));\n    return { words, characters, charactersNoSpaces, paragraphs, sentences, pages, readingTimeMinutes };\n  }\n\n  // ---- Track Changes API ----\n  public toggleTrackChanges(): void {\n    (this.editor as any).chain().toggleTrackChanges().run();\n  }\n\n  public isTrackingChanges(): boolean {\n    return (this.editor.storage.trackChanges as any)?.enabled ?? false;\n  }\n\n  // ---- Find & Replace ----\n  public find(query: string, options: { caseSensitive?: boolean; regex?: boolean } = {}): number {\n    return (this.editor.commands as any).findText(query, options);\n  }\n\n  public replace(query: string, replacement: string, all = false, options: { caseSensitive?: boolean; regex?: boolean } = {}): number {\n    return (this.editor.commands as any)[all ? 'replaceAllText' : 'replaceText'](query, replacement, options);\n  }\n\n  public clearSearch(): void {\n    (this.editor.commands as any).clearSearch();\n  }\n\n  // ---- Pagination ----\n  /** Current measured page count from the Pagination extension. */\n  public getPageCount(): number {\n    return (this.editor.storage as any)?.pagination?.pageCount || 1;\n  }\n\n  /** Inside-page area in CSS pixels (page height minus top/bottom margins). */\n  public getPageContentHeightPx(): number {\n    return pageContentHeightPx(this._pageLayout);\n  }\n\n  // ---- Page Layout ----\n  public getPageLayout(): PageLayoutOptions { return { ...this._pageLayout }; }\n\n  public setPageLayout(layout: Partial<PageLayoutOptions>): void {\n    this._pageLayout = { ...this._pageLayout, ...layout };\n    if (layout.margins) this._pageLayout.margins = { ...this._pageLayout.margins, ...layout.margins };\n    this.applyPageLayoutToDOM(this.editor.options.element as HTMLElement);\n    this.syncPaginationLayout();\n  }\n\n  private applyPageLayoutToDOM(host: HTMLElement) {\n    const { width, height } = resolvePageDimensions(this._pageLayout);\n    const contentPx = pageContentHeightPx(this._pageLayout);\n    const editorEl = host.querySelector('.ProseMirror') as HTMLElement | null;\n    if (!editorEl) return;\n    editorEl.style.setProperty('--rk-page-width', width);\n    editorEl.style.setProperty('--rk-page-height', height);\n    editorEl.style.setProperty('--rk-page-content-height', `${contentPx}px`);\n    editorEl.style.setProperty('--rk-page-margin-top', this._pageLayout.margins.top);\n    editorEl.style.setProperty('--rk-page-margin-bottom', this._pageLayout.margins.bottom);\n    editorEl.style.setProperty('--rk-page-margin-left', this._pageLayout.margins.left);\n    editorEl.style.setProperty('--rk-page-margin-right', this._pageLayout.margins.right);\n    editorEl.dataset.pageOrientation = this._pageLayout.orientation;\n  }\n\n  // ---- Zoom ----\n  public getZoom(): number { return this._zoom; }\n\n  public setZoom(zoom: number): void {\n    const z = Math.min(3, Math.max(0.25, zoom));\n    this._zoom = z;\n    const editorEl = this.editor.options.element as HTMLElement;\n    const surface = editorEl.querySelector('.ProseMirror') as HTMLElement | null;\n    if (surface) {\n      surface.style.transform = `scale(${z})`;\n      surface.style.transformOrigin = 'top center';\n    }\n  }\n\n  // ---- Auto-save ----\n  public enableAutoSave(key = 'rk-editor-content', debounceMs = 500): () => void {\n    let timer: ReturnType<typeof setTimeout> | null = null;\n    const handler = () => {\n      if (timer) clearTimeout(timer);\n      timer = setTimeout(() => {\n        try {\n          localStorage.setItem(key, JSON.stringify(this.getJSON()));\n        } catch (e) {\n          console.warn('[WordEditor] Auto-save failed', e);\n        }\n      }, debounceMs);\n    };\n    this.editor.on('update', handler);\n    return () => this.editor.off('update', handler);\n  }\n\n  public loadAutoSave(key = 'rk-editor-content'): boolean {\n    const saved = localStorage.getItem(key);\n    if (!saved) return false;\n    try {\n      this.setDocument(JSON.parse(saved));\n      return true;\n    } catch (e) {\n      console.error('Failed to load autosave:', e);\n      return false;\n    }\n  }\n\n  public clearAutoSave(key = 'rk-editor-content'): void {\n    localStorage.removeItem(key);\n  }\n\n  // ---- Instance access ----\n  public get instance(): Editor { return this.editor; }\n  public get styleManager(): StyleManager { return this._styleManager; }\n}\n\nfunction escapeHtml(s: string): string {\n  return s.replace(/[&<>\"']/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;', \"'\": '&#39;' }[c]!));\n}\n\nfunction slugify(s: string): string {\n  return s.toLowerCase().trim().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '').replace(/-+/g, '-');\n}\n\nfunction resolvePageDimensions(layout: PageLayoutOptions): { width: string; height: string } {\n  const portraitSizes: Record<string, [string, string]> = {\n    A4: ['210mm', '297mm'],\n    A3: ['297mm', '420mm'],\n    A5: ['148mm', '210mm'],\n    Letter: ['8.5in', '11in'],\n    Legal: ['8.5in', '14in'],\n    Tabloid: ['11in', '17in'],\n  };\n  const [w, h] = portraitSizes[layout.pageSize] || portraitSizes.A4;\n  if (layout.orientation === 'landscape') return { width: h, height: w };\n  return { width: w, height: h };\n}\n\n/** Return the editable content area height (page height minus top/bottom margins) in CSS pixels. */\nfunction pageContentHeightPx(layout: PageLayoutOptions): number {\n  const { height } = resolvePageDimensions(layout);\n  const totalPx = cssLengthToPx(height);\n  const topPx = cssLengthToPx(layout.margins.top);\n  const botPx = cssLengthToPx(layout.margins.bottom);\n  return Math.max(200, Math.round(totalPx - topPx - botPx));\n}\n\nfunction cssLengthToPx(value: string): number {\n  if (!value) return 0;\n  const s = String(value).trim();\n  const num = parseFloat(s);\n  if (isNaN(num)) return 0;\n  if (s.endsWith('in')) return num * 96;\n  if (s.endsWith('cm')) return num * 37.795;\n  if (s.endsWith('mm')) return num * 3.7795;\n  if (s.endsWith('pt')) return num * 1.333;\n  if (s.endsWith('pc')) return num * 16;\n  if (s.endsWith('px')) return num;\n  return num;\n}\n"],"names":["Link","Mark","HTMLAttributes","mergeAttributes","attributes","chain","FontSize","Extension","element","fontSize","TextTransform","textTransform","LineHeight","lineHeight","commands","type","ParagraphSpacing","spacing","Indent","t","currentIndent","PageBreak","Node","Footnote","content","PasteHandler","Plugin","PluginKey","view","event","html","doc","walker","node","el","AdvancedTypography","letterSpacing","wordSpacing","ParagraphSystem","padding","attrs","StyleManager","__publicField","style","name","resolved","currentParent","parentStyle","StylesEngine","resolvedAttributes","chainExec","level","DEFAULT_PAGE_LAYOUT","PageLayout","options","editor","parent","Section","Header","Footer","PageNumber","TableStyles","width","MultilevelList","listStyle","state","dispatch","selection","tr","found","pos","startNumber","Caption","ImageResize","height","float","MathInline","latex","MathBlock","TOC_TYPE","TableOfContents","a","changed","minLevel","maxLevel","$from","d","n","getPos","root","render","items","collectHeadings","header","escapeHtml","e","empty","list","item","li","link","text","leader","page","dom","updated","charCount","CHARS_PER_PAGE","slug","s","c","Citation","key","label","Bibliography","DEFAULT_COMMANDS","SlashCommands","extension","_view","_prevState","textBefore","query","cmd","commandTitle","from","start","ImageUpload","file","src","reader","input","files","imageFiles","f","handled","FormatPainter","to","marks","seen","range","mark","m","nodeType","nodeAttrs","fmt","targetType","markType","ext","_event","DragHandle","draggedNode","handleEl","currentPos","editorView","hide","onMouseMove","blockDepth","blockNode","rect","editorRect","_slice","moved","coords","dropPos","targetPos","insertAt","TrackChanges","changeId","change","transactions","oldState","newState","trackInsertType","trackDeleteType","origTr","step","_index","map","TrackInsert","TrackDelete","LeaderMark","KEY","buildRegex","opts","pattern","flags","findMatches","results","regex","match","decorationsFor","current","decos","r","i","Decoration","DecorationSet","FindReplace","replacement","target","oldSet","WordShortcuts","heading","TextBox","w","h","x","y","applyTransform","dragHandle","handlePositions","startX","startY","startW","startH","startNX","startNY","onMove","dx","dy","h2","nx","ny","onUp","pos2","dragging","dStartX","dStartY","dStartNX","dStartNY","contentDOM","Pagination","computePageBoundaries","rafId","lastRun","lastWidth","MIN_INTERVAL","recompute","force","now","obs","entries","next","onWindowResize","newView","pageHeight","defaultA4ContentPx","proseMirror","pageIndex","pageStartY","containerRect","totalContentHeight","offset","top","bottom","pageEnd","remaining","makeSpacer","fromHardBreak","Title","Subtitle","DocumentValidator","json","nodes","index","CommandManager","font","size","color","alignment","value","alt","href","q","title","filename","fn","saveAs","fileSaver","TWIPS_PER_INCH","TWIPS_PER_CM","TWIPS_PER_MM","TWIPS_PER_PT","DOCX_PAGE_SIZES","HEADING_MAP","HeadingLevel","ExportEngine","_styleManager","blob","sectionChildren","pageProps","sectionPropertiesFromLayout","Document","Packer","out","Paragraph","TextRun","BorderStyle","ref","AlignmentType","children","applyParagraphStyling","clamp","child","inlines","showLeader","showPageNumbers","indent","isTopLevel","runs","ShadingType","mapAlignment","data","fetchImageData","dim","parseImageSize","imageRun","ImageRun","childList","nested","marker","rows","row","TableRow","TableCell","Table","WidthType","cells","cell","isHeader","childContent","fill","bg","colorToHex","VerticalAlign","inline","ExternalHyperlink","formatToRun","UnderlineType","hex","parseFontSize","decimal","_","LevelFormat","bullet","b","nepali","before","parseSpacingTwips","after","line","left","parseIndentTwips","firstLine","align","num","parts","g","lo","hi","layout","orientation","PageOrientation","sizeKey","dims","margins","mime","bin","bytes","mimeToDocxType","res","buf","guessMimeFromUrl","parseDimensionPx","visit","textOf","v","ImportEngine","mammoth","arrayBuffer","result","marked","mod","TurndownService","service","gfm","markdown","url","DEFAULT_PRINT_CSS","PrintEngine","mergePageLayout","pageSize","printPageSize","margin","iframe","docHtml","escape","cleanup","trigger","waitForImages","images","img","resolve","orient","base","createImageResizeView","wrapper","NodeSelection","handle","aspectRatio","lockAspect","newWidth","newHeight","onMouseUp","updatedNode","WordEditor","initial","Editor","StarterKit","Placeholder","Underline","TextStyle","FontFamily","Color","Highlight","Subscript","Superscript","TextAlign","TableHeader","TaskList","TaskItem","Image","props","defaultSlashCommands","layoutPx","pageContentHeightPx","storage","validated","editable","md","format","clone","dropSelectors","l","headings","id","slugify","trimmed","words","characters","charactersNoSpaces","paragraphs","sentences","pages","readingTimeMinutes","all","host","resolvePageDimensions","contentPx","editorEl","zoom","z","surface","debounceMs","timer","handler","saved","portraitSizes","totalPx","cssLengthToPx","topPx","botPx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAgCO,MAAMA,KAAOC,GAAK,OAAoB;AAAA,EACzC,MAAM;AAAA,EAEN,UAAU;AAAA,EAEV,aAAa;AAAA,EAEb,aAAa;AACT,WAAO;AAAA,MACH,aAAa;AAAA,MACb,gBAAgB;AAAA,QACZ,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,OAAO;AAAA,MAAA;AAAA,IACX;AAAA,EAER;AAAA,EAEA,gBAAgB;AACZ,WAAO;AAAA,MACH,MAAM;AAAA,QACF,SAAS;AAAA,MAAA;AAAA,MAEb,QAAQ;AAAA,QACJ,SAAS,KAAK,QAAQ,eAAe;AAAA,MAAA;AAAA,MAEzC,KAAK;AAAA,QACD,SAAS,KAAK,QAAQ,eAAe;AAAA,MAAA;AAAA,MAEzC,OAAO;AAAA,QACH,SAAS,KAAK,QAAQ,eAAe;AAAA,MAAA;AAAA,IACzC;AAAA,EAER;AAAA,EAEA,YAAY;AACR,WAAO;AAAA,MACH;AAAA,QACI,KAAK;AAAA,MAAA;AAAA,IACT;AAAA,EAER;AAAA,EAEA,WAAW,EAAE,gBAAAC,KAAkB;AAC3B,WAAO,CAAC,KAAKC,EAAgB,KAAK,QAAQ,gBAAgBD,CAAc,GAAG,CAAC;AAAA,EAChF;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,SAAS,CAAAE,MAAc,CAAC,EAAE,OAAAC,QACfA,EAAA,EAAQ,QAAQ,KAAK,MAAMD,CAAU,EAAE,QAAQ,mBAAmB,EAAI,EAAE,IAAA;AAAA,MAGnF,YAAY,CAAAA,MAAc,CAAC,EAAE,OAAAC,QAClBA,EAAA,EAAQ,WAAW,KAAK,MAAMD,CAAU,EAAE,QAAQ,mBAAmB,EAAI,EAAE,IAAA;AAAA,MAGtF,WAAW,MAAM,CAAC,EAAE,OAAAC,QACTA,EAAA,EAAQ,UAAU,KAAK,IAAI,EAAE,QAAQ,mBAAmB,EAAI,EAAE,IAAA;AAAA,IACzE;AAAA,EAER;AACJ,CAAC,GCzEYC,KAAWC,EAAU,OAAwB;AAAA,EACtD,MAAM;AAAA,EAEN,aAAa;AACT,WAAO;AAAA,MACH,OAAO,CAAC,WAAW;AAAA,IAAA;AAAA,EAE3B;AAAA,EAEA,sBAAsB;AAClB,WAAO;AAAA,MACH;AAAA,QACI,OAAO,KAAK,QAAQ;AAAA,QACpB,YAAY;AAAA,UACR,UAAU;AAAA,YACN,SAAS;AAAA,YACT,WAAW,CAACC,MAAYA,EAAQ,MAAM,SAAS,QAAQ,UAAU,EAAE;AAAA,YACnE,YAAY,CAACJ,MACJA,EAAW,WAIT;AAAA,cACH,OAAO,cAAcA,EAAW,QAAQ;AAAA,YAAA,IAJjC,CAAA;AAAA,UAMf;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EAER;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,aAAa,CAACK,MAAa,CAAC,EAAE,OAAAJ,QACnBA,EAAA,EAAQ,QAAQ,aAAa,EAAE,UAAAI,EAAA,CAAU,EAAE,IAAA;AAAA,MAEtD,eAAe,MAAM,CAAC,EAAE,OAAAJ,QACbA,EAAA,EAAQ,QAAQ,aAAa,EAAE,UAAU,MAAM,EAAE,qBAAA,EAAuB,IAAA;AAAA,IACnF;AAAA,EAER;AACJ,CAAC,GC1CYK,KAAgBH,EAAU,OAA6B;AAAA,EAChE,MAAM;AAAA,EAEN,aAAa;AACT,WAAO;AAAA,MACH,OAAO,CAAC,WAAW;AAAA,IAAA;AAAA,EAE3B;AAAA,EAEA,sBAAsB;AAClB,WAAO;AAAA,MACH;AAAA,QACI,OAAO,KAAK,QAAQ;AAAA,QACpB,YAAY;AAAA,UACR,eAAe;AAAA,YACX,SAAS;AAAA,YACT,WAAW,CAACC,MAAYA,EAAQ,MAAM;AAAA,YACtC,YAAY,CAACJ,MACJA,EAAW,gBAIT;AAAA,cACH,OAAO,mBAAmBA,EAAW,aAAa;AAAA,YAAA,IAJ3C,CAAA;AAAA,UAMf;AAAA,UAEJ,aAAa;AAAA,YACT,SAAS;AAAA,YACT,WAAW,CAACI,MAAYA,EAAQ,MAAM;AAAA,YACtC,YAAY,CAACJ,MACJA,EAAW,cAIT;AAAA,cACH,OAAO,iBAAiBA,EAAW,WAAW;AAAA,YAAA,IAJvC,CAAA;AAAA,UAMf;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EAER;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,kBAAkB,CAACO,MAA0B,CAAC,EAAE,OAAAN,QACrCA,EAAA,EACF,QACA,QAAQ,aAAa,EAAE,eAAAM,GAAe,EACtC,IAAA;AAAA,MAET,iBAAiB,MAAM,CAAC,EAAE,OAAAN,QACfA,EAAA,EAAQ,MAAA,EAAQ,QAAQ,aAAa,EAAE,aAAa,cAAc,EAAE,IAAA;AAAA,MAE/E,oBAAoB,MAAM,CAAC,EAAE,OAAAA,QAClBA,EAAA,EAAQ,MAAA,EAAQ,QAAQ,aAAa,EAAE,eAAe,KAAA,CAAM,EAAE,qBAAA,EAAuB,IAAA;AAAA,IAChG;AAAA,EAER;AACJ,CAAC,GClEYO,KAAaL,EAAU,OAA0B;AAAA,EAC1D,MAAM;AAAA,EAEN,aAAa;AACT,WAAO;AAAA,MACH,OAAO,CAAC,aAAa,SAAS;AAAA,MAC9B,mBAAmB;AAAA,IAAA;AAAA,EAE3B;AAAA,EAEA,sBAAsB;AAClB,WAAO;AAAA,MACH;AAAA,QACI,OAAO,KAAK,QAAQ;AAAA,QACpB,YAAY;AAAA,UACR,YAAY;AAAA,YACR,SAAS,KAAK,QAAQ;AAAA,YACtB,WAAW,CAACC,MAAYA,EAAQ,MAAM,cAAc,KAAK,QAAQ;AAAA,YACjE,YAAY,CAACJ,MACLA,EAAW,eAAe,KAAK,QAAQ,oBAChC,CAAA,IAGJ;AAAA,cACH,OAAO,gBAAgBA,EAAW,UAAU;AAAA,YAAA;AAAA,UAEpD;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EAER;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,eAAe,CAACS,MAAe,CAAC,EAAE,UAAAC,QACvB,KAAK,QAAQ,MAAM,MAAM,CAACC,MAASD,EAAS,iBAAiBC,GAAM,EAAE,YAAAF,EAAA,CAAY,CAAC;AAAA,MAE7F,iBAAiB,MAAM,CAAC,EAAE,UAAAC,QACf,KAAK,QAAQ,MAAM,MAAM,CAACC,MAASD,EAAS,iBAAiBC,GAAM,EAAE,YAAY,KAAK,QAAQ,kBAAA,CAAmB,CAAC;AAAA,IAC7H;AAAA,EAER;AACJ,CAAC,GC7CYC,KAAmBT,EAAU,OAAgC;AAAA,EACtE,MAAM;AAAA,EAEN,aAAa;AACT,WAAO;AAAA,MACH,OAAO,CAAC,WAAW;AAAA,IAAA;AAAA,EAE3B;AAAA,EAEA,sBAAsB;AAClB,WAAO;AAAA,MACH;AAAA,QACI,OAAO,KAAK,QAAQ;AAAA,QACpB,YAAY;AAAA,UACR,WAAW;AAAA,YACP,SAAS;AAAA,YACT,WAAW,CAACC,MAAYA,EAAQ,MAAM;AAAA,YACtC,YAAY,CAACJ,MACJA,EAAW,YACT,EAAE,OAAO,eAAeA,EAAW,SAAS,GAAA,IADjB,CAAA;AAAA,UAEtC;AAAA,UAEJ,cAAc;AAAA,YACV,SAAS;AAAA,YACT,WAAW,CAACI,MAAYA,EAAQ,MAAM;AAAA,YACtC,YAAY,CAACJ,MACJA,EAAW,eACT,EAAE,OAAO,kBAAkBA,EAAW,YAAY,GAAA,IADpB,CAAA;AAAA,UAEzC;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EAER;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,qBAAqB,CAACa,MAAY,CAAC,EAAE,UAAAH,QAC1B,KAAK,QAAQ,MAAM,MAAM,CAACC,MAASD,EAAS,iBAAiBC,GAAM;AAAA,QACtE,WAAWE,EAAQ;AAAA,QACnB,cAAcA,EAAQ;AAAA,MAAA,CACzB,CAAC;AAAA,IACN;AAAA,EAER;AACJ,CAAC,GCzCYC,KAASX,EAAU,OAAsB;AAAA,EAClD,MAAM;AAAA,EAEN,aAAa;AACT,WAAO;AAAA,MACH,OAAO,CAAC,aAAa,WAAW,UAAU;AAAA,MAC1C,WAAW;AAAA,MACX,WAAW;AAAA,MACX,YAAY;AAAA;AAAA,IAAA;AAAA,EAEpB;AAAA,EAEA,sBAAsB;AAClB,WAAO;AAAA,MACH;AAAA,QACI,OAAO,KAAK,QAAQ;AAAA,QACpB,YAAY;AAAA,UACR,QAAQ;AAAA,YACJ,SAAS;AAAA,YACT,WAAW,CAACC,MAAY,SAASA,EAAQ,MAAM,UAAU,IAAI,MAAM;AAAA,YACnE,YAAY,CAACJ,MACJA,EAAW,SACT,EAAE,OAAO,gBAAgBA,EAAW,SAAS,EAAE,KAAA,IADvB,CAAA;AAAA,UAEnC;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EAER;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,QAAQ,MAAM,CAAC,EAAE,UAAAU,QACT,KAAK,OAAO,SAAS,UAAU,IACvB,KAAK,OAAO,MAAA,EAAQ,QAAgB,aAAa,UAAU,EAAE,IAAA,IAE3D,KAAK,QAAQ,MAAM,OAAO,CAAAK,MAAKA,MAAM,UAAU,EAChD,MAAM,CAAAJ,MAAQ;AACvB,cAAMK,IAAgB,KAAK,OAAO,cAAcL,CAAI,EAAE,UAAU;AAChE,eAAOD,EAAS,iBAAiBC,GAAM;AAAA,UACnC,QAAQ,KAAK,IAAIK,IAAgB,KAAK,QAAQ,YAAY,KAAK,QAAQ,SAAS;AAAA,QAAA,CACnF;AAAA,MACL,CAAC;AAAA,MAEL,SAAS,MAAM,CAAC,EAAE,UAAAN,QACV,KAAK,OAAO,SAAS,UAAU,IACvB,KAAK,OAAO,MAAA,EAAQ,QAAgB,aAAa,UAAU,EAAE,IAAA,IAE3D,KAAK,QAAQ,MAAM,OAAO,CAAAK,MAAKA,MAAM,UAAU,EAChD,MAAM,CAAAJ,MAAQ;AACvB,cAAMK,IAAgB,KAAK,OAAO,cAAcL,CAAI,EAAE,UAAU;AAChE,eAAOD,EAAS,iBAAiBC,GAAM;AAAA,UACnC,QAAQ,KAAK,IAAI,KAAK,QAAQ,WAAWK,IAAgB,KAAK,QAAQ,UAAU;AAAA,QAAA,CACnF;AAAA,MACL,CAAC;AAAA,IACL;AAAA,EAER;AAAA,EAEA,uBAAuB;AACnB,WAAO;AAAA,MACH,KAAO,MACC,KAAK,OAAO,SAAS,UAAU,IACxB,KAAK,OAAO,SAAS,aAAa,UAAU,IAIhD,KAAK,OAAO,SAAS,cAAc,MAA0B;AAAA,MAExE,aAAa,MACL,KAAK,OAAO,SAAS,UAAU,IACxB,KAAK,OAAO,SAAS,aAAa,UAAU,IAEhD;AAAA,IACX;AAAA,EAER;AACJ,CAAC,GCrFYC,KAAYC,EAAK,OAAO;AAAA,EACjC,MAAM;AAAA,EAEN,OAAO;AAAA,EAEP,YAAY;AACR,WAAO;AAAA,MACH,EAAE,KAAK,8BAAA;AAAA,IAA8B;AAAA,EAE7C;AAAA,EAEA,WAAW,EAAE,gBAAApB,KAAkB;AAC3B,WAAO,CAAC,OAAOC,EAAgBD,GAAgB,EAAE,aAAa,cAAc,OAAO,gBAAA,CAAiB,CAAC;AAAA,EACzG;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,cAAc,MAAM,CAAC,EAAE,UAAAY,QACXA,EAAiB,cAAc,EAAE,MAAM,KAAK,MAAM;AAAA,IAC9D;AAAA,EAER;AACJ,CAAC,GC9BYS,KAAWD,EAAK,OAAO;AAAA,EAChC,MAAM;AAAA,EAEN,OAAO;AAAA,EAEP,SAAS;AAAA,EAET,QAAQ;AAAA,EAER,WAAW;AAAA,EAEX,YAAY;AACR,WAAO;AAAA,MACH;AAAA,QACI,KAAK;AAAA,MAAA;AAAA,IACT;AAAA,EAER;AAAA,EAEA,WAAW,EAAE,gBAAApB,KAAkB;AAC3B,WAAO,CAAC,YAAYC,EAAgBD,CAAc,GAAG,CAAC;AAAA,EAC1D;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,aAAa,CAACsB,MAAqB,CAAC,EAAE,UAAAV,QAC3BA,EAAS,cAAc;AAAA,QAC1B,MAAM,KAAK;AAAA,QACX,SAASU,IAAU,CAAC,EAAE,MAAM,QAAQ,MAAMA,EAAA,CAAS,IAAI;AAAA,MAAA,CAC1D;AAAA,IACL;AAAA,EAER;AACJ,CAAC,GChCYC,KAAelB,EAAU,OAAO;AAAA,EACzC,MAAM;AAAA,EAEN,wBAAwB;AACpB,WAAO;AAAA,MACH,IAAImB,EAAO;AAAA,QACP,KAAK,IAAIC,EAAU,cAAc;AAAA,QACjC,OAAO;AAAA,UACH,aAAa,CAACC,GAAMC,MAAU;AAC1B,kBAAMC,IAAOD,EAAM,eAAe,QAAQ,WAAW;AAErD,gBAAIC,MAASA,EAAK,SAAS,aAAa,KAAKA,EAAK,SAAS,MAAM,KAAKA,EAAK,SAAS,oBAAoB,IAAI;AAExG,oBAAMC,IADY,IAAI,UAAA,EACA,gBAAgBD,GAAM,WAAW,GAGjDE,IAAS,SAAS,iBAAiBD,EAAI,MAAM,WAAW,eAAe,WAAW,YAAY;AACpG,kBAAIE;AACJ,qBAAOA,IAAOD,EAAO;AACjB,gBAAIC,EAAK,aAAa,KAAK,gBACvBA,EAAK,YAAY,YAAYA,CAAI;AAKzC,cAAAF,EAAI,iBAAiB,GAAG,EAAE,QAAQ,CAAAG,MAAM;AACpC,gBAAIA,aAAc,gBACdA,EAAG,MAAM,aAAa,IACtBA,EAAG,MAAM,WAAW;AAAA,cAE5B,CAAC;AAAA,YACL;AAEA,mBAAO;AAAA,UACX;AAAA,QAAA;AAAA,MACJ,CACH;AAAA,IAAA;AAAA,EAET;AACJ,CAAC,GCbYC,KAAqB5B,EAAU,OAAkC;AAAA,EAC1E,MAAM;AAAA,EAEN,aAAa;AACT,WAAO;AAAA,MACH,OAAO,CAAC,WAAW;AAAA,IAAA;AAAA,EAE3B;AAAA,EAEA,sBAAsB;AAClB,WAAO;AAAA,MACH;AAAA,QACI,OAAO,KAAK,QAAQ;AAAA,QACpB,YAAY;AAAA,UACR,eAAe;AAAA,YACX,SAAS;AAAA,YACT,WAAW,CAAAC,MAAWA,EAAQ,MAAM;AAAA,YACpC,YAAY,CAAAJ,MACHA,EAAW,gBAIT;AAAA,cACH,OAAO,mBAAmBA,EAAW,aAAa;AAAA,YAAA,IAJ3C,CAAA;AAAA,UAMf;AAAA,UAEJ,aAAa;AAAA,YACT,SAAS;AAAA,YACT,WAAW,CAAAI,MAAWA,EAAQ,MAAM;AAAA,YACpC,YAAY,CAAAJ,MACHA,EAAW,cAIT;AAAA,cACH,OAAO,iBAAiBA,EAAW,WAAW;AAAA,YAAA,IAJvC,CAAA;AAAA,UAMf;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EAER;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,kBAAkB,CAACgC,MAAkB,CAAC,EAAE,OAAA/B,QAC7BA,EAAA,EAAQ,QAAQ,aAAa,EAAE,eAAA+B,EAAA,CAAe,EAAE,IAAA;AAAA,MAE3D,oBAAoB,MAAM,CAAC,EAAE,OAAA/B,QAClBA,EAAA,EAAQ,QAAQ,aAAa,EAAE,eAAe,MAAM,EAAE,qBAAA,EAAuB,IAAA;AAAA,MAExF,gBAAgB,CAACgC,MAAgB,CAAC,EAAE,OAAAhC,QACzBA,EAAA,EAAQ,QAAQ,aAAa,EAAE,aAAAgC,EAAA,CAAa,EAAE,IAAA;AAAA,MAEzD,kBAAkB,MAAM,CAAC,EAAE,OAAAhC,QAChBA,EAAA,EAAQ,QAAQ,aAAa,EAAE,aAAa,MAAM,EAAE,qBAAA,EAAuB,IAAA;AAAA,IACtF;AAAA,EAER;AACJ,CAAC,GChEYiC,KAAkB/B,EAAU,OAA+B;AAAA,EACpE,MAAM;AAAA,EAEN,aAAa;AACT,WAAO;AAAA,MACH,OAAO,CAAC,aAAa,SAAS;AAAA,IAAA;AAAA,EAEtC;AAAA,EAEA,sBAAsB;AAClB,WAAO;AAAA,MACH;AAAA,QACI,OAAO,KAAK,QAAQ;AAAA,QACpB,YAAY;AAAA,UACR,eAAe;AAAA,YACX,SAAS;AAAA,YACT,WAAW,CAAAC,MAAWA,EAAQ,MAAM;AAAA,YACpC,YAAY,CAAAJ,MACHA,EAAW,gBACT,EAAE,OAAO,eAAeA,EAAW,aAAa,GAAA,IADjB,CAAA;AAAA,UAE1C;AAAA,UAEJ,cAAc;AAAA,YACV,SAAS;AAAA,YACT,WAAW,CAAAI,MAAWA,EAAQ,MAAM;AAAA,YACpC,YAAY,CAAAJ,MACHA,EAAW,eACT,EAAE,OAAO,kBAAkBA,EAAW,YAAY,GAAA,IADpB,CAAA;AAAA,UAEzC;AAAA,UAEJ,iBAAiB;AAAA,YACb,SAAS;AAAA,YACT,WAAW,CAAAI,MAAWA,EAAQ,MAAM;AAAA,YACpC,YAAY,CAAAJ,MACHA,EAAW,kBACT,EAAE,OAAO,gBAAgBA,EAAW,eAAe,GAAA,IADlB,CAAA;AAAA,UAE5C;AAAA,UAEJ,eAAe;AAAA,YACX,SAAS;AAAA,YACT,WAAW,CAAAI,MAAW;AAClB,oBAAM+B,IAAU/B,EAAQ,MAAM;AAE9B,qBADeA,EAAQ,MAAM,WAClB,WAAW,GAAG,IAAU+B,IAC5B;AAAA,YACX;AAAA,YACA,YAAY,CAAAnC,MACHA,EAAW,gBACT;AAAA,cACH,OAAO,iBAAiBA,EAAW,aAAa,mBAAmBA,EAAW,aAAa;AAAA,YAAA,IAFzD,CAAA;AAAA,UAI1C;AAAA,UAEJ,iBAAiB;AAAA,YACb,SAAS;AAAA,YACT,WAAW,CAAAI,MAAWA,EAAQ,MAAM;AAAA,YACpC,YAAY,CAAAJ,MACHA,EAAW,kBACT,EAAE,OAAO,qBAAqBA,EAAW,eAAe,GAAA,IADvB,CAAA;AAAA,UAE5C;AAAA,UAEJ,QAAQ;AAAA,YACJ,SAAS;AAAA,YACT,WAAW,CAAAI,MAAWA,EAAQ,MAAM;AAAA,YACpC,YAAY,CAAAJ,MACHA,EAAW,SACT,EAAE,OAAO,WAAWA,EAAW,MAAM,GAAA,IADb,CAAA;AAAA,UAEnC;AAAA,UAEJ,OAAO;AAAA,YACH,SAAS;AAAA,YACT,WAAW,CAAAI,MAAWA,EAAQ,aAAa,OAAO;AAAA,YAClD,YAAY,CAAAJ,MACHA,EAAW,QACT,EAAE,OAAOA,EAAW,MAAA,IADG,CAAA;AAAA,UAElC;AAAA,UAEJ,IAAI;AAAA,YACA,SAAS;AAAA,YACT,WAAW,CAAAI,MAAWA,EAAQ,aAAa,IAAI;AAAA,YAC/C,YAAY,CAAAJ,MACHA,EAAW,KACT,EAAE,IAAIA,EAAW,GAAA,IADG,CAAA;AAAA,UAE/B;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EAER;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,oBAAoB,CAACoC,MAAU,CAAC,EAAE,UAAA1B,QACvB,KAAK,QAAQ,MAAM;AAAA,QAAM,CAACC,MAC7BD,EAAS,iBAAiBC,GAAM;AAAA,UAC5B,eAAeyB,EAAM;AAAA,UACrB,cAAcA,EAAM;AAAA,UACpB,iBAAiBA,EAAM;AAAA,UACvB,eAAeA,EAAM;AAAA,UACrB,iBAAiBA,EAAM;AAAA,UACvB,QAAQA,EAAM;AAAA,UACd,OAAOA,EAAM;AAAA,UACb,IAAIA,EAAM;AAAA,QAAA,CACb;AAAA,MAAA;AAAA,IAET;AAAA,EAER;AACJ,CAAC;AChIM,MAAMC,GAAa;AAAA,EAGtB,cAAc;AAFN,IAAAC,EAAA,oCAA2C,IAAA;AAG/C,SAAK,mBAAA;AAAA,EACT;AAAA,EAEQ,qBAAqB;AACzB,SAAK,SAAS;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACR,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,OAAO;AAAA,QACP,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,cAAc;AAAA,MAAA;AAAA,IAClB,CACH,GAED,KAAK,SAAS;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,YAAY;AAAA,QACR,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,cAAc;AAAA,MAAA;AAAA,IAClB,CACH,GAED,KAAK,SAAS;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,YAAY;AAAA,QACR,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,cAAc;AAAA,MAAA;AAAA,IAClB,CACH,GAED,KAAK,SAAS;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,YAAY;AAAA,QACR,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,OAAO;AAAA,MAAA;AAAA,IACX,CACH;AAAA,EACL;AAAA,EAEO,SAASC,GAAwB;AACpC,SAAK,OAAO,IAAIA,EAAM,MAAMA,CAAK;AAAA,EACrC;AAAA,EAEO,SAASC,GAA2C;AACvD,WAAO,KAAK,OAAO,IAAIA,CAAI;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKO,aAAaA,GAAmC;AACnD,UAAMD,IAAQ,KAAK,SAASC,CAAI;AAChC,QAAI,CAACD,EAAO,QAAO,CAAA;AAEnB,QAAIE,IAAW,EAAE,GAAGF,EAAM,WAAA,GACtBG,IAAgBH,EAAM;AAE1B,WAAOG,KAAe;AAClB,YAAMC,IAAc,KAAK,SAASD,CAAa;AAC/C,MAAIC,KAEAF,IAAW,EAAE,GAAGE,EAAY,YAAY,GAAGF,EAAA,GAC3CC,IAAgBC,EAAY,UAE5BD,IAAgB;AAAA,IAExB;AAEA,WAAOD;AAAA,EACX;AAAA,EAEO,eAAkC;AACrC,WAAO,MAAM,KAAK,KAAK,OAAO,QAAQ;AAAA,EAC1C;AACJ;ACxEO,MAAMG,KAAezC,EAAU,OAA4B;AAAA,EAC9D,MAAM;AAAA,EAEN,aAAa;AACT,WAAO;AAAA,MACH,SAAS,IAAIkC,GAAA;AAAA,IAAa;AAAA,EAElC;AAAA,EAEA,sBAAsB;AAClB,WAAO;AAAA,MACH;AAAA,QACI,OAAO,CAAC,aAAa,SAAS;AAAA,QAC9B,YAAY;AAAA,UACR,WAAW;AAAA,YACP,SAAS;AAAA,YACT,WAAW,CAAAjC,MAAWA,EAAQ,aAAa,iBAAiB,KAAK;AAAA,YACjE,YAAY,CAAAJ,MACJ,CAACA,EAAW,aAAaA,EAAW,cAAc,WAC3C,CAAA,IAEJ,EAAE,mBAAmBA,EAAW,UAAA;AAAA,UAC3C;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EAER;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,iBAAiB,CAACwC,MAAiB,CAAC,EAAE,OAAAvC,GAAO,UAAAS,QAAe;AACxD,cAAMmC,IAAqB,KAAK,QAAQ,QAAQ,aAAaL,CAAI;AAIjE,YAAIM,IAAY7C,IAAQ,QAAQ,iBAAiB,aAAa,EAAE,WAAWuC,GAAM,GAAGK,EAAA,CAAoB;AAExG,YAAIL,EAAK,WAAW,SAAS,GAAG;AAC5B,gBAAMO,IAAS,SAASP,EAAK,QAAQ,YAAY,EAAE,CAAC,KAAK;AACzD,UAAAM,IAAYA,EAAU,WAAW,EAAE,OAAAC,EAAA,CAAO,EAAE,iBAAiB,WAAW,EAAE,WAAWP,GAAM,GAAGK,GAAoB;AAAA,QACtH,MAAA,EAAWL,MAAS,YAAYA,MAAS,aACrCM,IAAYA,EAAU,aAAA,EAAe,iBAAiB,aAAa,EAAE,WAAWN,GAAM,GAAGK,GAAoB;AAOjH,eAAOC,EAAU,IAAA;AAAA,MACrB;AAAA,MAEA,kBAAkB,CAACN,GAAMxC,MAAe,MAAM;AAC1C,cAAMuC,IAAQ,KAAK,QAAQ,QAAQ,SAASC,CAAI;AAChD,eAAID,KACAA,EAAM,aAAa,EAAE,GAAGA,EAAM,YAAY,GAAGvC,EAAA,GAEtC,MAEJ;AAAA,MACX;AAAA,IAAA;AAAA,EAER;AACJ,CAAC,GCjEYgD,KAAyC;AAAA,EAClD,UAAU;AAAA,EACV,aAAa;AAAA,EACb,SAAS;AAAA,IACL,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAEf,GAUaC,KAAa9C,EAAU,OAA0B;AAAA,EAC1D,MAAM;AAAA,EAEN,aAAa;AACT,WAAO,EAAE,GAAG6C,GAAA;AAAA,EAChB;AAAA,EAEA,aAAa;AACT,WAAO,EAAE,GAAGA,GAAA;AAAA,EAChB;AAAA,EAEA,WAAW;AACP,WAAO,OAAO,KAAK,SAAS,KAAK,OAAO;AAAA,EAC5C;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,eAAe,CAACE,MAAY,CAAC,EAAE,QAAAC,QAAa;AACxC,eAAO,OAAO,KAAK,SAASD,CAAO,GAC/BA,EAAQ,YACR,KAAK,QAAQ,UAAU,EAAE,GAAG,KAAK,QAAQ,SAAS,GAAGA,EAAQ,QAAA,IAEjE,OAAO,OAAO,KAAK,SAAS,KAAK,OAAO;AACxC,cAAME,IAAUD,EAAe,QAAQ;AACvC,eAAIC,KAAU,OAAOA,EAAO,iBAAkB,cAC1CA,EAAO,cAAc,KAAK,OAAO,GAE9B;AAAA,MACX;AAAA,IAAA;AAAA,EAER;AACJ,CAAC,GCrDYC,KAAUnC,EAAK,OAAuB;AAAA,EAC/C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EAEV,gBAAgB;AACZ,WAAO;AAAA,MACH,IAAI;AAAA,QACA,SAAS;AAAA,MAAA;AAAA,MAEb,UAAU;AAAA,QACN,SAAS;AAAA,MAAA;AAAA,MAEb,aAAa;AAAA,QACT,SAAS;AAAA,MAAA;AAAA,MAEb,WAAW;AAAA,QACP,SAAS;AAAA,MAAA;AAAA,MAEb,cAAc;AAAA,QACV,SAAS;AAAA,MAAA;AAAA,MAEb,YAAY;AAAA,QACR,SAAS;AAAA,MAAA;AAAA,MAEb,aAAa;AAAA,QACT,SAAS;AAAA,MAAA;AAAA,IACb;AAAA,EAER;AAAA,EAEA,YAAY;AACR,WAAO;AAAA,MACH;AAAA,QACI,KAAK;AAAA,MAAA;AAAA,IACT;AAAA,EAER;AAAA,EAEA,WAAW,EAAE,gBAAApB,KAAkB;AAC3B,WAAO,CAAC,WAAWC,EAAgBD,GAAgB,EAAE,OAAO,aAAA,CAAc,GAAG,CAAC;AAAA,EAClF;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,oBAAoB,MAAM,CAAC,EAAE,OAAAG,QAClBA,IACF,MAAA,EACA,cAAc,EAAE,MAAM,KAAK,MAAM,SAAS,CAAC,EAAE,MAAM,YAAA,CAAa,EAAA,CAAG,EACnE,IAAA;AAAA,IACT;AAAA,EAER;AACJ,CAAC,GCrEYqD,KAASpC,EAAK,OAAO;AAAA,EAC9B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EAEX,YAAY;AACR,WAAO,CAAC,EAAE,KAAK,oBAAoB;AAAA,EACvC;AAAA,EAEA,WAAW,EAAE,gBAAApB,KAAkB;AAC3B,WAAO,CAAC,UAAUC,EAAgBD,GAAgB,EAAE,OAAO,YAAA,CAAa,GAAG,CAAC;AAAA,EAChF;AACJ,CAAC,GAEYyD,KAASrC,EAAK,OAAO;AAAA,EAC9B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EAEX,YAAY;AACR,WAAO,CAAC,EAAE,KAAK,oBAAoB;AAAA,EACvC;AAAA,EAEA,WAAW,EAAE,gBAAApB,KAAkB;AAC3B,WAAO,CAAC,UAAUC,EAAgBD,GAAgB,EAAE,OAAO,YAAA,CAAa,GAAG,CAAC;AAAA,EAChF;AACJ,CAAC,GAEY0D,KAAatC,EAAK,OAAO;AAAA,EAClC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,WAAW;AAAA,EAEX,aAAa;AACT,WAAO,CAAC,QAAQ,EAAE,OAAO,iBAAA,GAAoB,GAAG;AAAA,EACpD;AACJ,CAAC,GCvCYuC,KAActD,EAAU,OAAO;AAAA,EACxC,MAAM;AAAA,EAEN,sBAAsB;AAClB,WAAO;AAAA,MACH;AAAA,QACI,OAAO,CAAC,OAAO;AAAA,QACf,YAAY;AAAA,UACR,YAAY;AAAA,YACR,SAAS;AAAA,YACT,WAAW,CAACC,MAAyBA,EAAQ,aAAa,kBAAkB;AAAA,YAC5E,YAAY,CAACJ,MACJA,EAAW,aACT,EAAE,oBAAoBA,EAAW,WAAA,IADL,CAAA;AAAA,UAEvC;AAAA,UAEJ,aAAa;AAAA,YACT,SAAS;AAAA,YACT,WAAW,CAACI,MAAyBA,EAAQ,MAAM;AAAA,YACnD,YAAY,CAACJ,MACJA,EAAW,cACT,EAAE,OAAO,iBAAiBA,EAAW,WAAW,GAAA,IADnB,CAAA;AAAA,UAExC;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EAER;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,eAAe,CAACuC,MAAkB,CAAC,EAAE,UAAA7B,QAC1BA,EAAS,iBAAiB,SAAS,EAAE,YAAY6B,GAAO;AAAA,MAEnE,gBAAgB,CAACmB,MAAkB,CAAC,EAAE,UAAAhD,QAC3BA,EAAS,iBAAiB,SAAS,EAAE,aAAagD,GAAO;AAAA,IACpE;AAAA,EAER;AACJ,CAAC,GC1CYC,KAAiBxD,EAAU,OAAO;AAAA,EAC3C,MAAM;AAAA,EAEN,sBAAsB;AAClB,WAAO;AAAA,MACH;AAAA,QACI,OAAO,CAAC,cAAc,aAAa;AAAA,QACnC,YAAY;AAAA,UACR,WAAW;AAAA,YACP,SAAS;AAAA,YACT,WAAW,CAACC,MAAyBA,EAAQ,aAAa,iBAAiB;AAAA,YAC3E,YAAY,CAACJ,MACJA,EAAW,YACT;AAAA,cACH,mBAAmBA,EAAW;AAAA,cAC9B,OAAOA,EAAW,cAAc,WAAW,mBAAmB;AAAA,cAC9D,OAAO,oBAAoBA,EAAW,cAAc,WAAW,SAASA,EAAW,SAAS;AAAA,YAAA,IAJ9D,CAAA;AAAA,UAMtC;AAAA,UAEJ,aAAa;AAAA,YACT,SAAS;AAAA,YACT,WAAW,CAACI,MAAyB,SAASA,EAAQ,aAAa,OAAO,KAAK,KAAK,EAAE;AAAA,YACtF,YAAY,CAACJ,MACL,CAACA,EAAW,eAAeA,EAAW,gBAAgB,IAAU,CAAA,IAC7D,EAAE,OAAO,OAAOA,EAAW,WAAW,EAAA;AAAA,UACjD;AAAA,QACJ;AAAA,MACJ;AAAA,MAEJ;AAAA,QACI,OAAO,CAAC,UAAU;AAAA,QAClB,YAAY;AAAA,UACR,WAAW;AAAA,YACP,SAAS;AAAA,YACT,WAAW,CAACI,MAAyB,SAASA,EAAQ,aAAa,iBAAiB,KAAK,KAAK,EAAE;AAAA,YAChG,YAAY,CAACJ,OACF,EAAE,mBAAmB,OAAOA,EAAW,aAAa,CAAC,EAAA;AAAA,UAChE;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EAER;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,cAAc,CAAC4D,MAAsB,CAAC,EAAE,OAAAC,GAAO,UAAAC,QAA+C;AAC1F,cAAM,EAAE,WAAAC,MAAcF;AACtB,YAAIG,IAAKH,EAAM,IACXI,IAAQ;AASZ,eAPAJ,EAAM,IAAI,aAAaE,EAAU,MAAMA,EAAU,IAAI,CAAClC,GAAWqC,MAAgB;AAC7E,WAAIrC,EAAK,KAAK,SAAS,iBAAiBA,EAAK,KAAK,SAAS,kBACvDmC,IAAKA,EAAG,cAAcE,GAAK,QAAW,EAAE,GAAGrC,EAAK,OAAO,WAAA+B,GAAW,GAClEK,IAAQ;AAAA,QAEhB,CAAC,GAEGA,KACIH,OAAmBE,CAAE,GAClB,MAGJ;AAAA,MACX;AAAA,MACA,oBAAoB,CAACG,MAAwB,CAAC,EAAE,UAAAzD,QACrCA,EAAS,iBAAiB,eAAe,EAAE,aAAAyD,GAAa;AAAA,MAEnE,mBAAmB,MAAM,CAAC,EAAE,UAAAzD,QACjBA,EAAS,iBAAiB,eAAe,EAAE,WAAW,WAAW;AAAA,IAC5E;AAAA,EAER;AACJ,CAAC,GCtEY0D,KAAUlD,EAAK,OAAO;AAAA,EAC/B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EAEX,gBAAgB;AACZ,WAAO;AAAA,MACH,aAAa;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAACd,MAAyBA,EAAQ,aAAa,mBAAmB;AAAA,QAC7E,YAAY,CAACJ,OAAqB,EAAE,qBAAqBA,EAAW,YAAA;AAAA,MAAY;AAAA,MAEpF,eAAe;AAAA,QACX,SAAS;AAAA,QACT,WAAW,CAACI,MAAyBA,EAAQ,aAAa,qBAAqB;AAAA,QAC/E,YAAY,CAACJ,MACJA,EAAW,gBACT,EAAE,uBAAuBA,EAAW,cAAA,IADL,CAAA;AAAA,MAE1C;AAAA,IACJ;AAAA,EAER;AAAA,EAEA,YAAY;AACR,WAAO,CAAC,EAAE,KAAK,cAAc;AAAA,EACjC;AAAA,EAEA,WAAW,EAAE,gBAAAF,KAA2C;AACpD,WAAO,CAAC,cAAcC,EAAgB,EAAE,OAAO,gBAAgBD,CAAc,GAAG,CAAC;AAAA,EACrF;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,eAAe,CAACa,IAAO,aAAa,CAAC,EAAE,UAAAD,QAC5BA,EAAS,cAAc;AAAA,QAC1B,MAAM;AAAA,QACN,OAAO,EAAE,aAAaC,EAAA;AAAA,QACtB,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,GAAGA,CAAI,KAAA,CAAM;AAAA,MAAA,CAChD;AAAA,IACL;AAAA,EAER;AACJ,CAAC,GChDY0D,KAAclE,EAAU,OAAO;AAAA,EACxC,MAAM;AAAA,EAEN,sBAAsB;AAClB,WAAO;AAAA,MACH;AAAA,QACI,OAAO,CAAC,OAAO;AAAA,QACf,YAAY;AAAA,UACR,OAAO;AAAA,YACH,SAAS;AAAA,YACT,WAAW,CAACC,MACEA,EAAQ,aAAa,OAAO,KAAKA,EAAQ,MAAM,SAC7C;AAAA,YAEhB,YAAY,CAACJ,MACJA,EAAW,QACT,EAAE,OAAO,UAAUA,EAAW,KAAK,qBAAA,IADZ,CAAA;AAAA,UAElC;AAAA,UAEJ,QAAQ;AAAA,YACJ,SAAS;AAAA,YACT,WAAW,CAACI,MAAyBA,EAAQ,aAAa,QAAQ,KAAKA,EAAQ,MAAM,UAAU;AAAA,YAC/F,YAAY,CAACJ,MACJA,EAAW,SACT,EAAE,OAAO,WAAWA,EAAW,MAAM,IAAA,IADb,CAAA;AAAA,UAEnC;AAAA,UAEJ,OAAO;AAAA,YACH,SAAS;AAAA,YACT,WAAW,CAACI,MAAyBA,EAAQ,MAAM,SAAS;AAAA,YAC5D,YAAY,CAACJ,MACJA,EAAW,QACT,EAAE,OAAO,UAAUA,EAAW,KAAK,mBAAA,IADZ,CAAA;AAAA,UAElC;AAAA,UAEJ,OAAO;AAAA,YACH,SAAS;AAAA,YACT,WAAW,CAACI,MAAyBA,EAAQ,aAAa,YAAY;AAAA,YACtE,YAAY,CAACJ,MACJA,EAAW,QACT,EAAE,cAAcA,EAAW,MAAA,IADJ,CAAA;AAAA,UAElC;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EAER;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,cAAc,CAAC0D,GAAeY,MAAoB,CAAC,EAAE,UAAA5D,QAC1CA,EAAS,iBAAiB,SAAS,EAAE,OAAAgD,GAAO,QAAQY,KAAU,MAAM;AAAA,MAE/E,eAAe,CAACC,MAAqC,CAAC,EAAE,UAAA7D,QAC7CA,EAAS,iBAAiB,SAAS,EAAE,OAAO6D,MAAU,SAAS,OAAOA,GAAO;AAAA,MAExF,gBAAgB,MAAM,CAAC,EAAE,UAAA7D,QACdA,EAAS,iBAAiB,SAAS,EAAE,OAAO,MAAM;AAAA,IAC7D;AAAA,EAER;AACJ,CAAC,GC7DY8D,KAAatD,EAAK,OAAO;AAAA,EAClC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EAEN,gBAAgB;AACZ,WAAO;AAAA,MACH,OAAO;AAAA,QACH,SAAS;AAAA,QACT,WAAW,CAACd,MAAyBA,EAAQ,aAAa,YAAY,KAAKA,EAAQ;AAAA,QACnF,YAAY,CAACJ,OAAqB,EAAE,cAAcA,EAAW,MAAA;AAAA,MAAM;AAAA,IACvE;AAAA,EAER;AAAA,EAEA,YAAY;AACR,WAAO,CAAC,EAAE,KAAK,iCAAiC;AAAA,EACpD;AAAA,EAEA,WAAW,EAAE,gBAAAF,GAAgB,MAAA+B,KAA4C;AACrE,WAAO;AAAA,MACH;AAAA,MACA9B,EAAgB,EAAE,aAAa,eAAe,OAAO,iBAAA,GAAoBD,CAAc;AAAA,MACvF+B,EAAK,MAAM,SAAS;AAAA,IAAA;AAAA,EAE5B;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,kBAAkB,CAAC4C,MAAkB,CAAC,EAAE,UAAA/D,QAC7BA,EAAS,cAAc;AAAA,QAC1B,MAAM;AAAA,QACN,OAAO,EAAE,OAAA+D,EAAA;AAAA,MAAM,CAClB;AAAA,IACL;AAAA,EAER;AACJ,CAAC,GAEYC,KAAYxD,EAAK,OAAO;AAAA,EACjC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EAEN,gBAAgB;AACZ,WAAO;AAAA,MACH,OAAO;AAAA,QACH,SAAS;AAAA,QACT,WAAW,CAACd,MAAyBA,EAAQ,aAAa,YAAY,KAAKA,EAAQ;AAAA,QACnF,YAAY,CAACJ,OAAqB,EAAE,cAAcA,EAAW,MAAA;AAAA,MAAM;AAAA,IACvE;AAAA,EAER;AAAA,EAEA,YAAY;AACR,WAAO,CAAC,EAAE,KAAK,+BAA+B;AAAA,EAClD;AAAA,EAEA,WAAW,EAAE,gBAAAF,GAAgB,MAAA+B,KAA4C;AACrE,WAAO;AAAA,MACH;AAAA,MACA9B,EAAgB,EAAE,aAAa,cAAc,OAAO,gBAAA,GAAmBD,CAAc;AAAA,MACrF+B,EAAK,MAAM,SAAS;AAAA,IAAA;AAAA,EAE5B;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,iBAAiB,CAAC4C,MAAkB,CAAC,EAAE,UAAA/D,QAC5BA,EAAS,cAAc;AAAA,QAC1B,MAAM;AAAA,QACN,OAAO,EAAE,OAAA+D,EAAA;AAAA,MAAM,CAClB;AAAA,IACL;AAAA,EAER;AACJ,CAAC,GC3CKE,IAAW,mBAcJC,KAAkB1D,EAAK,OAAO;AAAA,EACvC,MAAMyD;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,WAAW;AAAA,EACX,YAAY;AAAA,EAEZ,gBAAgB;AACZ,WAAO;AAAA,MACH,UAAU;AAAA,QACN,SAAS;AAAA,QACT,WAAW,CAAC7C,MAAoB,OAAOA,EAAG,aAAa,gBAAgB,KAAK,CAAC;AAAA,QAC7E,YAAY,CAAC+C,OAAY,EAAE,kBAAkB,OAAOA,EAAE,YAAY,CAAC,EAAA;AAAA,MAAE;AAAA,MAEzE,UAAU;AAAA,QACN,SAAS;AAAA,QACT,WAAW,CAAC/C,MAAoB,OAAOA,EAAG,aAAa,gBAAgB,KAAK,CAAC;AAAA,QAC7E,YAAY,CAAC+C,OAAY,EAAE,kBAAkB,OAAOA,EAAE,YAAY,CAAC,EAAA;AAAA,MAAE;AAAA,MAEzE,OAAO;AAAA,QACH,SAAS;AAAA,QACT,WAAW,CAAC/C,MAAoBA,EAAG,aAAa,YAAY,KAAK;AAAA,QACjE,YAAY,CAAC+C,OAAY,EAAE,cAAcA,EAAE,SAAS,oBAAA;AAAA,MAAoB;AAAA,MAE5E,YAAY;AAAA,QACR,SAAS;AAAA,QACT,WAAW,CAAC/C,MAAoBA,EAAG,aAAa,aAAa,MAAM;AAAA,QACnE,YAAY,CAAC+C,OAAY,EAAE,eAAeA,EAAE,eAAe,KAAQ,UAAU,OAAA;AAAA,MAAO;AAAA,MAExF,iBAAiB;AAAA,QACb,SAAS;AAAA,QACT,WAAW,CAAC/C,MAAoBA,EAAG,aAAa,eAAe,MAAM;AAAA,QACrE,YAAY,CAAC+C,OAAY,EAAE,iBAAiBA,EAAE,oBAAoB,KAAQ,UAAU,OAAA;AAAA,MAAO;AAAA,IAC/F;AAAA,EAER;AAAA,EAEA,YAAY;AACR,WAAO,CAAC,EAAE,KAAK,wBAAwB;AAAA,EAC3C;AAAA,EAEA,WAAW,EAAE,gBAAA/E,KAAkB;AAC3B,WAAO;AAAA,MAAC;AAAA,MAAOC,EAAgBD,GAAgB,EAAE,aAAa,OAAO,OAAO,UAAU;AAAA;AAAA,MAElF,CAAC,OAAO,EAAE,OAAO,kBAAA,GAAqB,mBAAmB;AAAA,IAAA;AAAA,EAEjE;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,uBACI,CAACsC,IAAkB,CAAA,MACnB,CAAC,EAAE,UAAA1B,QACQA,EAAS,cAAc;AAAA,QAC1B,MAAMiE;AAAA,QACN,OAAO;AAAA,UACH,UAAUvC,EAAM,YAAY;AAAA,UAC5B,UAAUA,EAAM,YAAY;AAAA,UAC5B,OAAOA,EAAM,SAAS;AAAA,UACtB,YAAYA,EAAM,eAAe;AAAA,UACjC,iBAAiBA,EAAM,oBAAoB;AAAA,QAAA;AAAA,MAC/C,CACH;AAAA,MAGT,wBACI,MACA,CAAC,EAAE,QAAAe,GAAQ,IAAAa,GAAI,UAAAF,QAAwD;AACnE,YAAI,CAACA,EAAU,QAAO;AACtB,YAAIgB,IAAU;AACd,eAAA3B,EAAO,MAAM,IAAI,YAAY,CAACtB,GAAWqC,MAAgB;AACrD,UAAIrC,EAAK,KAAK,SAAS8C,MAEnBX,EAAG,cAAcE,GAAK,QAAW,EAAE,GAAGrC,EAAK,OAAO,UAAU,KAAK,IAAA,EAAI,CAAG,GACxEiD,IAAU;AAAA,QAElB,CAAC,GACGA,OAAkBd,CAAE,GACjBc;AAAA,MACX;AAAA,MAEJ,cACI,CAACC,GAAkBC,MACnB,CAAC,EAAE,QAAA7B,GAAQ,IAAAa,GAAI,UAAAF,QAAwD;AACnE,cAAMmB,IAAQ9B,EAAO,MAAM,UAAU;AACrC,iBAAS+B,IAAID,EAAM,OAAOC,KAAK,GAAGA,KAAK;AACnC,gBAAMC,IAAIF,EAAM,KAAKC,CAAC;AACtB,cAAIC,EAAE,KAAK,SAASR,GAAU;AAC1B,kBAAMT,IAAMe,EAAM,OAAOC,CAAC;AAC1B,mBAAIpB,MACAE,EAAG,cAAcE,GAAK,QAAW,EAAE,GAAGiB,EAAE,OAAO,UAAAJ,GAAU,UAAAC,GAAU,GACnElB,EAASE,CAAE,IAER;AAAA,UACX;AAAA,QACJ;AACA,eAAO;AAAA,MACX;AAAA,IAAA;AAAA,EAEZ;AAAA,EAEA,cAAc;AACV,WAAO,CAAC,EAAE,MAAAnC,GAAM,QAAAsB,GAAQ,QAAAiC,QAAa;AACjC,YAAMC,IAAO,SAAS,cAAc,KAAK;AACzC,MAAAA,EAAK,UAAU,IAAI,QAAQ,GAC3BA,EAAK,QAAQ,OAAO,OACpBA,EAAK,kBAAkB;AAEvB,YAAMC,IAAS,CAACH,MAAW;AACvB,cAAMI,IAAQC,GAAgBrC,EAAO,MAAM,KAAKgC,EAAE,MAAM,YAAY,GAAGA,EAAE,MAAM,YAAY,CAAC;AAC5F,QAAAE,EAAK,YAAY;AAEjB,cAAMI,IAAS,SAAS,cAAc,KAAK;AAa3C,YAZAA,EAAO,YAAY,iBACnBA,EAAO,YAAY;AAAA,+CACYC,GAAWP,EAAE,MAAM,SAAS,mBAAmB,CAAC;AAAA;AAAA,mBAG/EM,EAAO,cAAc,iBAAiB,GAAG,iBAAiB,SAAS,CAACE,MAAM;AACtE,UAAAA,EAAE,eAAA,GACFA,EAAE,gBAAA,GACDxC,EAAO,SAAiB,uBAAA;AAAA,QAC7B,CAAC,GACDkC,EAAK,YAAYI,CAAM,GAEnBF,EAAM,WAAW,GAAG;AACpB,gBAAMK,IAAQ,SAAS,cAAc,GAAG;AACxC,UAAAA,EAAM,YAAY,gBAClBA,EAAM,cAAc,+EACpBP,EAAK,YAAYO,CAAK;AACtB;AAAA,QACJ;AAEA,cAAMC,IAAO,SAAS,cAAc,IAAI;AACxC,QAAAA,EAAK,YAAY;AACjB,mBAAWC,KAAQP,GAAO;AACtB,gBAAMQ,IAAK,SAAS,cAAc,IAAI;AACtC,UAAAA,EAAG,YAAY,uBAAuBD,EAAK,KAAK;AAChD,gBAAME,IAAO,SAAS,cAAc,GAAG;AACvC,UAAAA,EAAK,YAAY,eACjBA,EAAK,OAAO,IAAIF,EAAK,EAAE,IACvBE,EAAK,QAAQ,MAAM,OAAOF,EAAK,GAAG;AAElC,gBAAMG,IAAO,SAAS,cAAc,MAAM;AAM1C,cALAA,EAAK,YAAY,eACjBA,EAAK,cAAcH,EAAK,MAExBE,EAAK,YAAYC,CAAI,GAEjBd,EAAE,MAAM,eAAe,IAAO;AAC9B,kBAAMe,IAAS,SAAS,cAAc,MAAM;AAC5C,YAAAA,EAAO,YAAY,iBACnBA,EAAO,aAAa,eAAe,MAAM,GACzCF,EAAK,YAAYE,CAAM;AAAA,UAC3B;AAEA,cAAIf,EAAE,MAAM,oBAAoB,IAAO;AACnC,kBAAMgB,IAAO,SAAS,cAAc,MAAM;AAC1C,YAAAA,EAAK,YAAY,eACjBA,EAAK,cAAc,OAAOL,EAAK,aAAa,GAC5CE,EAAK,YAAYG,CAAI;AAAA,UACzB;AAEA,UAAAH,EAAK,iBAAiB,SAAS,CAACL,MAAM;AAClC,YAAAA,EAAE,eAAA;AACF,kBAAMzB,IAAM,OAAO8B,EAAK,QAAQ,GAAG;AACnC,gBAAI,OAAO,SAAS9B,CAAG,GAAG;AACtB,oBAAMkC,IAAMjD,EAAO,KAAK,QAAQe,CAAG;AACnC,cAAAf,EAAO,SAAS,iBAAiBe,IAAM,CAAC,GACpCkC,GAAK,iBACLA,EAAI,eAAe,EAAE,UAAU,UAAU,OAAO,SAAS,IAEzDjD,EAAO,SAAS,eAAA;AAAA,YAExB;AAAA,UACJ,CAAC,GAED4C,EAAG,YAAYC,CAAI,GACnBH,EAAK,YAAYE,CAAE;AAAA,QACvB;AACA,QAAAV,EAAK,YAAYQ,CAAI;AAAA,MACzB;AAEA,aAAAP,EAAOzD,CAAI,GAMJ;AAAA,QACH,KAAKwD;AAAA,QACL,OAAOgB,GAAS;AACZ,iBAAIA,EAAQ,KAAK,SAAS1B,IAAiB,MAC3CW,EAAOe,CAAO,GACP;AAAA,QACX;AAAA,QACA,UAAU;AAAA,QAA4B;AAAA,QACtC,UAAU5E,GAAO;AAEb,iBAAO,CAAC,CAAEA,EAAM,QAAwB,UAAU,WAAW;AAAA,QACjE;AAAA,MAAA;AAAA,IAER;AAAA,EACJ;AACJ,CAAC;AAOD,SAAS+D,GAAgB7D,GAAUoD,GAAkBC,GAAiC;AAClF,QAAMO,IAAuB,CAAA;AAC7B,MAAIe,IAAY;AAEhB,QAAMC,IAAiB;AACvB,SAAA5E,EAAI,YAAY,CAACE,GAAWqC,MAAgB;AAExC,QADIrC,EAAK,WAAQyE,KAAazE,EAAK,MAAM,UAAU,IAC/CA,EAAK,KAAK,SAAS,WAAW;AAC9B,YAAMkB,IAAQlB,EAAK,MAAM;AACzB,UAAIkB,KAASgC,KAAYhC,KAASiC,GAAU;AACxC,cAAMiB,IAAOpE,EAAK;AAClB,YAAI,CAACoE,EAAK,OAAQ;AAClB,QAAAV,EAAM,KAAK;AAAA,UACP,OAAAxC;AAAA,UACA,MAAAkD;AAAA,UACA,IAAIO,GAAKP,CAAI;AAAA,UACb,KAAA/B;AAAA,UACA,eAAe,KAAK,IAAI,GAAG,KAAK,KAAKoC,IAAYC,CAAc,CAAC;AAAA,QAAA,CACnE;AAAA,MACL;AAAA,IACJ;AACA,WAAO;AAAA,EACX,CAAC,GACMhB;AACX;AAEA,SAASiB,GAAKC,GAAmB;AAC7B,SAAOA,EAAE,YAAA,EAAc,KAAA,EAClB,QAAQ,aAAa,EAAE,EACvB,QAAQ,QAAQ,GAAG,EACnB,QAAQ,OAAO,GAAG;AAC3B;AAEA,SAASf,GAAWe,GAAmB;AACnC,SAAOA,EAAE,QAAQ,YAAY,CAAAC,OAAM,EAAE,KAAK,SAAS,KAAK,QAAQ,KAAK,QAAQ,KAAK,UAAU,KAAK,QAAA,GAAUA,CAAC,CAAG;AACnH;ACtSO,MAAMC,KAAWzF,EAAK,OAAO;AAAA,EAChC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EAEN,gBAAgB;AACZ,WAAO;AAAA,MACH,KAAK;AAAA,QACD,SAAS;AAAA,QACT,WAAW,CAACd,MAAyBA,EAAQ,aAAa,UAAU;AAAA,QACpE,YAAY,CAACJ,OAAqB,EAAE,YAAYA,EAAW,IAAA;AAAA,MAAI;AAAA,MAEnE,OAAO;AAAA,QACH,SAAS;AAAA,QACT,WAAW,CAACI,MAAyBA,EAAQ;AAAA,QAC7C,YAAY,OAAO,CAAA;AAAA,MAAC;AAAA,IACxB;AAAA,EAER;AAAA,EAEA,YAAY;AACR,WAAO,CAAC,EAAE,KAAK,8BAA8B;AAAA,EACjD;AAAA,EAEA,WAAW,EAAE,gBAAAN,GAAgB,MAAA+B,KAA4C;AACrE,WAAO;AAAA,MACH;AAAA,MACA9B,EAAgB,EAAE,aAAa,YAAY,OAAO,cAAA,GAAiBD,CAAc;AAAA,MACjF,IAAI+B,EAAK,MAAM,SAASA,EAAK,MAAM,OAAO,GAAG;AAAA,IAAA;AAAA,EAErD;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,gBAAgB,CAAC+E,GAAaC,MAAmB,CAAC,EAAE,UAAAnG,QACzCA,EAAS,cAAc;AAAA,QAC1B,MAAM;AAAA,QACN,OAAO,EAAE,KAAAkG,GAAK,OAAOC,KAASD,EAAA;AAAA,MAAI,CACrC;AAAA,IACL;AAAA,EAER;AACJ,CAAC,GAEYE,KAAe5F,EAAK,OAAO;AAAA,EACpC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EAET,YAAY;AACR,WAAO,CAAC,EAAE,KAAK,qCAAqC;AAAA,EACxD;AAAA,EAEA,WAAW,EAAE,gBAAApB,KAA2C;AACpD,WAAO;AAAA,MACH;AAAA,MACAC,EAAgB,EAAE,aAAa,gBAAgB,OAAO,kBAAA,GAAqBD,CAAc;AAAA,MACzF;AAAA,IAAA;AAAA,EAER;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,oBAAoB,MAAM,CAAC,EAAE,UAAAY,QAClBA,EAAS,cAAc;AAAA,QAC1B,MAAM;AAAA,QACN,SAAS,CAAC,EAAE,MAAM,aAAa,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,aAAA,CAAc,GAAG;AAAA,MAAA,CACnF;AAAA,IACL;AAAA,EAER;AACJ,CAAC,GChEKqG,KAAmC;AAAA,EACrC;AAAA,IACI,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,SAAS,CAAC5D,MAAgBA,EAAO,QAAQ,QAAQ,cAAc,EAAE,OAAO,EAAA,CAAG,EAAE,IAAA;AAAA,EAAI;AAAA,EAErF;AAAA,IACI,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,SAAS,CAACA,MAAgBA,EAAO,QAAQ,QAAQ,cAAc,EAAE,OAAO,EAAA,CAAG,EAAE,IAAA;AAAA,EAAI;AAAA,EAErF;AAAA,IACI,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,SAAS,CAACA,MAAgBA,EAAO,QAAQ,QAAQ,cAAc,EAAE,OAAO,EAAA,CAAG,EAAE,IAAA;AAAA,EAAI;AAAA,EAErF;AAAA,IACI,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,SAAS,CAACA,MAAgBA,EAAO,MAAA,EAAQ,MAAA,EAAQ,iBAAA,EAAmB,IAAA;AAAA,EAAI;AAAA,EAE5E;AAAA,IACI,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,SAAS,CAACA,MAAgBA,EAAO,MAAA,EAAQ,MAAA,EAAQ,kBAAA,EAAoB,IAAA;AAAA,EAAI;AAAA,EAE7E;AAAA,IACI,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,SAAS,CAACA,MAAgBA,EAAO,MAAA,EAAQ,QAAQ,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,eAAe,GAAA,CAAM,EAAE,IAAA;AAAA,EAAI;AAAA,EAEhH;AAAA,IACI,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,SAAS,CAACA,MAAgBA,EAAO,MAAA,EAAQ,MAAA,EAAQ,gBAAA,EAAkB,IAAA;AAAA,EAAI;AAAA,EAE3E;AAAA,IACI,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,SAAS,CAACA,MAAgBA,EAAO,MAAA,EAAQ,MAAA,EAAQ,iBAAA,EAAmB,IAAA;AAAA,EAAI;AAAA,EAE5E;AAAA,IACI,OAAO;AAAA,IACP,aAAa;AAAA,IACb,MAAM;AAAA,IACN,SAAS,CAACA,MAAgBA,EAAO,MAAA,EAAQ,MAAA,EAAQ,kBAAA,EAAoB,IAAA;AAAA,EAAI;AAEjF,GAEa6D,KAAgB7G,EAAU,OAAO;AAAA,EAC1C,MAAM;AAAA,EAEN,aAAa;AACT,WAAO;AAAA,MACH,UAAU4G;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,IAAA;AAAA,EAEhB;AAAA,EAEA,aAAa;AACT,WAAO;AAAA,MACH,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO,CAAA;AAAA,IAAC;AAAA,EAEhB;AAAA,EAEA,wBAAwB;AACpB,UAAME,IAAY;AAElB,WAAO;AAAA,MACH,IAAI3F,EAAO;AAAA,QACP,KAAK,IAAIC,EAAU,eAAe;AAAA,QAClC,OAAO;AAAA,UACH,cAAc2F,GAAYzF,GAAsB;AAC5C,mBAAIA,EAAM,QAAQ,YAAYwF,EAAU,QAAQ,UAC5CA,EAAU,QAAQ,SAAS,IAC3BA,EAAU,QAAQ,SAAA,GACX,MAEJ;AAAA,UACX;AAAA,QAAA;AAAA,QAEJ,OAAO;AACH,iBAAO;AAAA,YACH,OAAOzF,GAAW2F,GAAiB;AAC/B,oBAAM,EAAE,OAAAtD,MAAUrC,GACZ,EAAE,WAAAuC,MAAcF,GAChB,EAAE,OAAAoB,MAAUlB,GAEZqD,IAAanC,EAAM,OAAO,YAAY,GAAGA,EAAM,cAAc,MAAM,IAAI;AAE7E,kBAAImC,MAAe;AACf,gBAAAH,EAAU,QAAQ,SAAS,IAC3BA,EAAU,QAAQ,QAAQ,IAC1BA,EAAU,QAAQ,QAAQA,EAAU,QAAQ,UAC5CA,EAAU,QAAQ,SAASA,EAAU,QAAQ,UAAU,EAAE;AAAA,uBAClDG,EAAW,WAAW,GAAG,KAAK,UAAU,KAAKA,CAAU,GAAG;AACjE,sBAAMC,IAAQD,EAAW,MAAM,CAAC,EAAE,YAAA,GAC5B7B,IAAQ0B,EAAU,QAAQ,SAAS;AAAA,kBACrC,CAACK,MACGA,EAAI,MAAM,cAAc,SAASD,CAAK,KACtCC,EAAI,YAAY,YAAA,EAAc,SAASD,CAAK;AAAA,gBAAA;AAEpD,gBAAAJ,EAAU,QAAQ,QAAQI,GAC1BJ,EAAU,QAAQ,QAAQ1B,GAC1B0B,EAAU,QAAQ,SAAS1B,GAAO8B,CAAK;AAAA,cAC3C,MAAA,CAAWJ,EAAU,QAAQ,WACzBA,EAAU,QAAQ,SAAS,IAC3BA,EAAU,QAAQ,SAAA;AAAA,YAE1B;AAAA,UAAA;AAAA,QAER;AAAA,MAAA,CACH;AAAA,IAAA;AAAA,EAET;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,qBAAqB,CAACM,MAAyB,CAAC,EAAE,QAAApE,QAA8B;AAC5E,cAAMmE,IAAM,KAAK,QAAQ,SAAS;AAAA,UAC9B,CAACZ,MAAoBA,EAAE,UAAUa;AAAA,QAAA;AAErC,YAAID,GAAK;AACL,gBAAM,EAAE,WAAAvD,MAAcZ,EAAO,OACvBqE,IAAOzD,EAAU,OACjB0D,IAAQD,EAAK,MAAA;AACnB,iBAAArE,EAAO,MAAA,EAAQ,YAAY,EAAE,MAAMsE,GAAO,IAAID,EAAK,IAAA,CAAK,EAAE,IAAA,GAC1DF,EAAI,QAAQnE,CAAM,GACX;AAAA,QACX;AACA,eAAO;AAAA,MACX;AAAA,IAAA;AAAA,EAER;AACJ,CAAC,GCnJYuE,KAAcvH,EAAU,OAAO;AAAA,EACxC,MAAM;AAAA,EAEN,aAAa;AACT,WAAO;AAAA,MACH,eAAe;AAAA,MACf,eAAe,CAAC,cAAc,aAAa,aAAa,cAAc,eAAe;AAAA,MACrF,UAAU;AAAA,IAAA;AAAA,EAElB;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,aAAa,CAACwH,MAAe,CAAC,EAAE,QAAAxE,QAA8B;AAC1D,YAAI,KAAK,QAAQ;AACb,eAAK,QAAQ,SAASwE,CAAI,EAAE,KAAK,CAACC,MAAgB;AAC9C,YAAAzE,EAAO,MAAA,EAAQ,MAAA,EAAQ,SAAS,EAAE,KAAAyE,GAAK,KAAKD,EAAK,KAAA,CAAM,EAAE,IAAA;AAAA,UAC7D,CAAC;AAAA,aACE;AACH,gBAAME,IAAS,IAAI,WAAA;AACnB,UAAAA,EAAO,SAAS,CAAAlC,MAAK;AACjB,kBAAMiC,IAAMjC,EAAE,QAAQ;AACtB,YAAAxC,EAAO,MAAA,EAAQ,MAAA,EAAQ,SAAS,EAAE,KAAAyE,GAAK,KAAKD,EAAK,KAAA,CAAM,EAAE,IAAA;AAAA,UAC7D,GACAE,EAAO,cAAcF,CAAI;AAAA,QAC7B;AACA,eAAO;AAAA,MACX;AAAA,MACA,iBAAiB,MAAM,MAAM;AACzB,cAAMG,IAAQ,SAAS,cAAc,OAAO;AAC5C,eAAAA,EAAM,OAAO,QACbA,EAAM,SAAS,WACfA,EAAM,WAAW,CAAC,MAAW;AACzB,gBAAMH,IAAO,EAAE,OAAO,QAAQ,CAAC;AAC/B,UAAIA,KAEC,KAAK,OAAO,SAAiB,YAAYA,CAAI;AAAA,QAEtD,GACAG,EAAM,MAAA,GACC;AAAA,MACX;AAAA,IAAA;AAAA,EAER;AAAA,EAEA,wBAAwB;AACpB,UAAM5E,IAAU,KAAK,SACfC,IAAS,KAAK;AAEpB,WAAO;AAAA,MACH,IAAI7B,EAAO;AAAA,QACP,KAAK,IAAIC,EAAU,aAAa;AAAA,QAChC,OAAO;AAAA,UACH,iBAAiB;AAAA,YACb,KAAK2F,GAAYzF,GAAkB;AAC/B,oBAAMsG,IAAQtG,EAAM,cAAc;AAClC,kBAAI,CAACsG,KAASA,EAAM,WAAW,EAAG,QAAO;AAEzC,oBAAMC,IAAa,MAAM,KAAKD,CAAK,EAAE;AAAA,gBAAO,CAAAE,MACxC/E,EAAQ,cAAc,SAAS+E,EAAE,IAAI;AAAA,cAAA;AAEzC,qBAAID,EAAW,WAAW,IAAU,MAEpCvG,EAAM,eAAA,GACNuG,EAAW,QAAQ,CAAAL,MAAQ;AACvB,oBAAIzE,EAAQ,iBAAiByE,EAAK,OAAOzE,EAAQ,gBAAgB,OAAO,MAAM;AAC1E,0BAAQ,KAAK,oCAAoCA,EAAQ,aAAa,QAAQyE,EAAK,IAAI,EAAE;AACzF;AAAA,gBACJ;AACC,gBAAAxE,EAAO,SAAiB,YAAYwE,CAAI;AAAA,cAC7C,CAAC,GACM;AAAA,YACX;AAAA,UAAA;AAAA,UAEJ,aAAa,CAACT,GAAYzF,MAA0B;AAChD,kBAAM8D,IAAQ9D,EAAM,eAAe;AACnC,gBAAI,CAAC8D,EAAO,QAAO;AAEnB,gBAAI2C,IAAU;AACd,yBAAM,KAAK3C,CAAK,EAAE,QAAQ,CAAAO,MAAQ;AAC9B,kBAAIA,EAAK,KAAK,WAAW,QAAQ,GAAG;AAChC,sBAAM6B,IAAO7B,EAAK,UAAA;AAClB,oBAAI6B,GAAM;AACN,sBAAIzE,EAAQ,iBAAiByE,EAAK,OAAOzE,EAAQ,gBAAgB,OAAO,MAAM;AAC1E,4BAAQ,KAAK,2CAA2CA,EAAQ,aAAa,MAAM;AACnF;AAAA,kBACJ;AACA,sBAAIA,EAAQ,iBAAiB,CAACA,EAAQ,cAAc,SAASyE,EAAK,IAAI,GAAG;AACrE,4BAAQ,KAAK,8CAA8CA,EAAK,IAAI,EAAE;AACtE;AAAA,kBACJ;AAEA,kBAAAlG,EAAM,eAAA,GACL0B,EAAO,SAAiB,YAAYwE,CAAI,GACzCO,IAAU;AAAA,gBACd;AAAA,cACJ;AAAA,YACJ,CAAC,GACMA;AAAA,UACX;AAAA,QAAA;AAAA,MACJ,CACH;AAAA,IAAA;AAAA,EAET;AACJ,CAAC,GC7FYC,KAAgBhI,EAAU,OAAO;AAAA,EAC1C,MAAM;AAAA,EAEN,aAAa;AACT,WAAO;AAAA,MACH,UAAU;AAAA,MACV,cAAc;AAAA,IAAA;AAAA,EAEtB;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,kBAAkB,MAAM,CAAC,EAAE,QAAAgD,QAA8B;AACrD,cAAM,EAAE,OAAAU,MAAUV,GACZ,EAAE,MAAAqE,GAAM,IAAAY,EAAA,IAAOvE,EAAM,WACrBoB,IAAQpB,EAAM,UAAU,OAGxBwE,IAAwD,CAAA,GACxDC,wBAAW,IAAA,GACXC,IAAQf,MAASY,IACjB,CAAC,KAAK,IAAI,GAAGZ,IAAO,CAAC,GAAGA,CAAI,IAC5B,CAACA,GAAMY,CAAE;AACf,QAAAvE,EAAM,IAAI,aAAa0E,EAAM,CAAC,GAAGA,EAAM,CAAC,GAAG,CAAC1G,MAAc;AACtD,cAAKA,EAAK;AACV,uBAAW2G,KAAQ3G,EAAK;AACpB,cAAIyG,EAAK,IAAIE,EAAK,KAAK,IAAI,MAC3BF,EAAK,IAAIE,EAAK,KAAK,IAAI,GACvBH,EAAM,KAAK,EAAE,MAAMG,EAAK,KAAK,MAAM,OAAO,EAAE,GAAGA,EAAK,MAAA,EAAM,CAAG;AAAA,QAErE,CAAC;AAED,mBAAWC,KAAK5E,EAAM,eAAeoB,EAAM,MAAA,KAAW;AAClD,UAAKqD,EAAK,IAAIG,EAAE,KAAK,IAAI,MACrBH,EAAK,IAAIG,EAAE,KAAK,IAAI,GACpBJ,EAAM,KAAK,EAAE,MAAMI,EAAE,KAAK,MAAM,OAAO,EAAE,GAAGA,EAAE,MAAA,EAAM,CAAG;AAK/D,cAAMrF,IAAS6B,EAAM,QACfyD,IAAWtF,EAAO,cAAcA,EAAO,KAAK,OAAO,MACnDuF,IAAYvF,EAAO,cAAc,EAAE,GAAGA,EAAO,MAAA,IAAU,CAAA;AAE7D,oBAAK,QAAQ,eAAe,EAAE,OAAAiF,GAAO,UAAAK,GAAU,WAAAC,EAAA,GAC/C,KAAK,QAAQ,WAAW,IACxBxF,EAAO,KAAK,KAAK,UAAU,IAAI,sBAAsB,GAC9C;AAAA,MACX;AAAA,MAEA,mBAAmB,MAAM,CAAC,EAAE,QAAAA,SACxB,KAAK,QAAQ,WAAW,IACxB,KAAK,QAAQ,eAAe,MAC5BA,EAAO,KAAK,KAAK,UAAU,OAAO,sBAAsB,GACjD;AAAA,MAGX,mBAAmB,MAAM,CAAC,EAAE,QAAAA,GAAQ,IAAAa,GAAI,UAAAF,QAAwD;AAC5F,YAAI,CAAC,KAAK,QAAQ,YAAY,CAAC,KAAK,QAAQ,aAAc,QAAO;AACjE,cAAM8E,IAAM,KAAK,QAAQ,cACnB,EAAE,MAAApB,GAAM,IAAAY,EAAA,IAAOjF,EAAO,MAAM;AAClC,YAAIqE,MAASY,EAAI,QAAO;AAGxB,QAAIQ,EAAI,YACJzF,EAAO,MAAM,IAAI,aAAaqE,GAAMY,GAAI,CAACvG,GAAWqC,MAAgB;AAChE,cAAI,CAACrC,EAAK,YAAa;AACvB,gBAAMgH,IAAa1F,EAAO,OAAO,MAAMyF,EAAI,QAAS;AACpD,cAAKC;AACL,gBAAI;AACA,cAAA7E,EAAG,cAAcE,GAAK2E,GAAY,EAAE,GAAGhH,EAAK,OAAO,GAAG+G,EAAI,WAAW;AAAA,YACzE,QAAQ;AAAA,YAAkC;AAAA,QAC9C,CAAC,GAIL5E,EAAG,WAAWwD,GAAMY,CAAE;AACtB,mBAAWI,KAAQI,EAAI,OAAO;AAC1B,gBAAME,IAAW3F,EAAO,OAAO,MAAMqF,EAAK,IAAI;AAC9C,cAAKM;AACL,gBAAI;AACA,cAAA9E,EAAG,QAAQwD,GAAMY,GAAIU,EAAS,OAAON,EAAK,KAAK,CAAC;AAAA,YACpD,QAAQ;AAAA,YAAgC;AAAA,QAC5C;AAEA,eAAI1E,OAAmBE,CAAE,GAGzB,KAAK,QAAQ,WAAW,IACxB,KAAK,QAAQ,eAAe,MAC5Bb,EAAO,KAAK,KAAK,UAAU,OAAO,sBAAsB,GACjD;AAAA,MACX;AAAA,IAAA;AAAA,EAER;AAAA,EAEA,uBAAuB;AACnB,WAAO;AAAA,MACH,QAAQ,MACA,KAAK,QAAQ,YACZ,KAAK,OAAO,SAAiB,kBAAA,GACvB,MAEJ;AAAA,IACX;AAAA,EAER;AAAA,EAEA,wBAAwB;AACpB,UAAM4F,IAAM;AACZ,WAAO;AAAA,MACH,IAAIzH,EAAO;AAAA,QACP,KAAK,IAAIC,EAAU,oBAAoB;AAAA,QACvC,OAAO;AAAA,UACH,iBAAiB;AAAA,YACb,QAAQ2F,GAAO8B,GAAQ;AACnB,qBAAKD,EAAI,QAAQ,YAEjB,WAAW,MAAM;AACb,gBAAIA,EAAI,QAAQ,YACXA,EAAI,OAAO,SAAiB,kBAAA;AAAA,cAErC,GAAG,CAAC,GACG;AAAA,YACX;AAAA,UAAA;AAAA,QACJ;AAAA,MACJ,CACH;AAAA,IAAA;AAAA,EAET;AACJ,CAAC,GC7IYE,KAAa9I,EAAU,OAAO;AAAA,EACvC,MAAM;AAAA,EAEN,wBAAwB;AACpB,QAAI+I,IAAmD,MACnDC,IAA+B,MAC/BC,IAA4B;AAwGhC,WAAO,CAtGQ,IAAI9H,EAAO;AAAA,MACtB,KAAK,IAAIC,EAAU,YAAY;AAAA,MAE/B,KAAK8H,GAAiB;AAClB,QAAAF,IAAW,SAAS,cAAc,KAAK,GACvCA,EAAS,YAAY,kBACrBA,EAAS,YAAY,KACrBA,EAAS,kBAAkB,SAC3BA,EAAS,aAAa,aAAa,MAAM,GACzCA,EAAS,QAAQ,mBACjB,SAAS,KAAK,YAAYA,CAAQ;AAElC,cAAMG,IAAO,MAAM;AACf,UAAIH,MAAUA,EAAS,MAAM,UAAU;AAAA,QAC3C,GAEMI,IAAc,CAAC5D,MAAkB;AACnC,cAAI,CAACwD,EAAU;AACA,UAAAxD,EAAE;AAGjB,gBAAMzB,IAAMmF,EAAW,YAAY,EAAE,MAAM1D,EAAE,SAAS,KAAKA,EAAE,SAAS;AACtE,cAAI,CAACzB,GAAK;AAAE,YAAAoF,EAAA;AAAQ;AAAA,UAAQ;AAE5B,gBAAM7G,IAAW4G,EAAW,MAAM,IAAI,QAAQnF,EAAI,GAAG,GAC/CsF,IAAa/G,EAAS,QAAQ,IAAI,IAAI,GACtCgH,IAAYhH,EAAS,KAAK+G,CAAU;AAC1C,cAAI,CAACC,KAAa,CAACA,EAAU,SAAS;AAAE,YAAAH,EAAA;AAAQ;AAAA,UAAQ;AAExD,gBAAMlD,IAAMiD,EAAW,QAAQ5G,EAAS,MAAM+G,CAAU,CAAC;AACzD,cAAI,CAACpD,KAAO,EAAEA,aAAe,UAAU;AAAE,YAAAkD,EAAA;AAAQ;AAAA,UAAQ;AAEzD,gBAAMI,IAAOtD,EAAI,sBAAA,GACXuD,IAAaN,EAAW,IAAI,sBAAA;AAElC,UAAAF,EAAS,MAAM,UAAU,QACzBA,EAAS,MAAM,MAAM,GAAGO,EAAK,MAAM,OAAO,OAAO,MACjDP,EAAS,MAAM,OAAO,GAAGQ,EAAW,OAAO,OAAO,UAAU,EAAE;AAG9D,cAAI;AACA,YAAAP,IAAaI,IAAa,IAAI/G,EAAS,OAAO+G,CAAU,IAAI;AAAA,UAChE,QAAc;AACV,YAAAJ,IAAa;AAAA,UACjB;AAAA,QACJ;AAEA,eAAAD,EAAS,iBAAiB,aAAa,CAACxD,MAAiB;AACrD,cAAIyD,MAAe,KAAM;AAEzB,gBAAMvH,IADOwH,EAAW,MAAM,IAAI,QAAQD,CAAU,EAClC;AAClB,UAAKvH,MACLqH,IAAc,EAAE,MAAME,GAAY,IAAIA,IAAavH,EAAK,SAAA,GACxD8D,EAAE,cAAc,QAAQ,cAAc,EAAE;AAAA,QAC5C,CAAC,GAEDwD,EAAS,iBAAiB,WAAW,MAAM;AACvC,UAAAD,IAAc;AAAA,QAClB,CAAC,GAEDG,EAAW,IAAI,iBAAiB,aAAaE,CAAW,GACxDF,EAAW,IAAI,eAAe,iBAAiB,cAAcC,CAAI,GAE1D;AAAA,UACH,UAAU;AACN,YAAAH,GAAU,OAAA,GACVE,EAAW,IAAI,oBAAoB,aAAaE,CAAW;AAAA,UAC/D;AAAA,QAAA;AAAA,MAER;AAAA,MAEA,OAAO;AAAA,QACH,WAAW/H,GAAWC,GAAkBmI,GAAaC,GAAgB;AACjE,cAAI,CAACX,KAAe,CAACW,EAAO,QAAO;AAEnC,gBAAMC,IAAS,EAAE,MAAMrI,EAAM,SAAS,KAAKA,EAAM,QAAA,GAC3CsI,IAAUvI,EAAK,YAAYsI,CAAM;AACvC,cAAI,CAACC,EAAS,QAAO;AAErB,gBAAM,EAAE,MAAAvC,GAAM,IAAAY,EAAA,IAAOc,GACfc,IAAYD,EAAQ;AAG1B,cAAIC,KAAaxC,KAAQwC,KAAa5B,EAAI,QAAO;AAEjD,gBAAMvG,IAAOL,EAAK,MAAM,IAAI,MAAMgG,GAAMY,CAAE,EAAE,QAAQ;AACpD,cAAI,CAACvG,EAAM,QAAO;AAElB,gBAAMmC,IAAKxC,EAAK,MAAM;AAEtB,UAAAwC,EAAG,OAAOwD,GAAMY,CAAE;AAElB,gBAAM6B,IAAWD,IAAY5B,IAAK4B,KAAa5B,IAAKZ,KAAQwC;AAC5D,iBAAAhG,EAAG,OAAOiG,GAAUpI,CAAI,GACxBL,EAAK,SAASwC,CAAE,GAChBkF,IAAc,MACdzH,EAAM,eAAA,GACC;AAAA,QACX;AAAA,MAAA;AAAA,IACJ,CACH,CAEa;AAAA,EAClB;AACJ,CAAC,GCtGYyI,KAAe/J,EAAU,OAAO;AAAA,EACzC,MAAM;AAAA,EAEN,aAAa;AACT,WAAO;AAAA,MACH,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,iBAAiB;AAAA,IAAA;AAAA,EAEzB;AAAA,EAEA,aAAa;AACT,WAAO;AAAA,MACH,SAAS;AAAA,MACT,SAAS,CAAA;AAAA,MACT,QAAQ;AAAA,IAAA;AAAA,EAEhB;AAAA,EAEA,WAAW;AACP,SAAK,QAAQ,UAAU,KAAK,QAAQ,SACpC,KAAK,QAAQ,SAAS,KAAK,QAAQ;AAAA,EACvC;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,oBAAoB,MAAM,OACtB,KAAK,QAAQ,UAAU,CAAC,KAAK,QAAQ,SAC9B;AAAA,MAGX,oBAAoB,MAAM,OACtB,KAAK,QAAQ,UAAU,IAChB;AAAA,MAGX,qBAAqB,MAAM,OACvB,KAAK,QAAQ,UAAU,IAChB;AAAA,MAGX,cAAc,CAACgK,MAAqB,CAAC,EAAE,IAAAnG,GAAI,UAAAF,QAA2C;AAClF,cAAMsG,IAAS,KAAK,QAAQ,QAAQ,KAAK,CAAC1D,MAAoBA,EAAE,OAAOyD,CAAQ;AAC/E,eAAI,CAACC,KAAU,CAACtG,IAAiB,MAE7BsG,EAAO,SAAS,YAEhBpG,EAAG,WAAWoG,EAAO,MAAMA,EAAO,IAAI,KAAK,OAAO,OAAO,MAAM,WAAkB,GAEjFpG,EAAG,OAAOoG,EAAO,MAAMA,EAAO,EAAE,KAGhCpG,EAAG,WAAWoG,EAAO,MAAMA,EAAO,IAAI,KAAK,OAAO,OAAO,MAAM,WAAkB,GAGrF,KAAK,QAAQ,UAAU,KAAK,QAAQ,QAAQ,OAAO,CAAC1D,MAAoBA,EAAE,OAAOyD,CAAQ,GACzF,KAAK,QAAQ,kBAAkB,KAAK,QAAQ,OAAO,GACnDrG,EAASE,CAAE,GACJ;AAAA,MACX;AAAA,MAEA,cAAc,CAACmG,MAAqB,CAAC,EAAE,IAAAnG,GAAI,UAAAF,QAA2C;AAClF,cAAMsG,IAAS,KAAK,QAAQ,QAAQ,KAAK,CAAC1D,MAAoBA,EAAE,OAAOyD,CAAQ;AAC/E,eAAI,CAACC,KAAU,CAACtG,IAAiB,MAE7BsG,EAAO,SAAS,WAEhBpG,EAAG,OAAOoG,EAAO,MAAMA,EAAO,EAAE,IAGhCpG,EAAG,WAAWoG,EAAO,MAAMA,EAAO,IAAI,KAAK,OAAO,OAAO,MAAM,WAAkB,GAGrF,KAAK,QAAQ,UAAU,KAAK,QAAQ,QAAQ,OAAO,CAAC1D,MAAoBA,EAAE,OAAOyD,CAAQ,GACzF,KAAK,QAAQ,kBAAkB,KAAK,QAAQ,OAAO,GACnDrG,EAASE,CAAE,GACJ;AAAA,MACX;AAAA,MAEA,kBAAkB,MAAM,CAAC,EAAE,QAAAb,SACP,CAAC,GAAG,KAAK,QAAQ,OAAO,EAChC,QAAQ,CAACuD,MAAoB;AAChC,QAAAvD,EAAO,SAAiB,aAAauD,EAAE,EAAE;AAAA,MAC9C,CAAC,GACM;AAAA,MAGX,kBAAkB,MAAM,CAAC,EAAE,QAAAvD,SACP,CAAC,GAAG,KAAK,QAAQ,OAAO,EAChC,QAAQ,CAACuD,MAAoB;AAChC,QAAAvD,EAAO,SAAiB,aAAauD,EAAE,EAAE;AAAA,MAC9C,CAAC,GACM;AAAA,MAGX,YAAY,MAAM,MACP,KAAK,QAAQ;AAAA,IACxB;AAAA,EAER;AAAA,EAEA,wBAAwB;AACpB,UAAMqC,IAAM;AAEZ,WAAO;AAAA,MACH,IAAIzH,EAAO;AAAA,QACP,KAAK,IAAIC,EAAU,cAAc;AAAA,QACjC,kBAAkB8I,GAA8BC,GAAeC,GAAe;AAK1E,cAJI,CAACxB,EAAI,QAAQ,WACb,CAACsB,EAAa,KAAK,CAACrG,MAAOA,EAAG,UAAU,KAGxCqG,EAAa,KAAK,CAACrG,MAAOA,EAAG,QAAQ,qBAAqB,CAAC,EAAG,QAAO;AAEzE,gBAAMA,IAAKuG,EAAS;AACpB,UAAAvG,EAAG,QAAQ,uBAAuB,EAAI;AACtC,cAAIc,IAAU;AAEd,gBAAM0F,IAAkBzB,EAAI,OAAO,OAAO,MAAM,aAC1C0B,IAAkB1B,EAAI,OAAO,OAAO,MAAM;AAgDhD,iBA9CAsB,EAAa,QAAQ,CAACK,MAAW;AAC7B,YAAKA,EAAO,cAEZA,EAAO,MAAM,QAAQ,CAACC,GAAWC,MAAmB;AAEhD,kBAAID,EAAK,OAAO;AAEZ,sBAAME,IAAM7G,EAAG,SACTwD,IAAOqD,EAAI,IAAIF,EAAK,MAAM,EAAE;AAGlC,oBAAIA,EAAK,MAAM,QAAQ,OAAO,KAAKH,GAAiB;AAChD,wBAAMpC,IAAKyC,EAAI,IAAIF,EAAK,OAAOA,EAAK,MAAM,QAAQ,IAAI;AACtD,kBAAA3G,EAAG,QAAQwD,GAAMY,GAAIoC,EAAgB,QAAQ;AAE7C,wBAAML,IAAW,KAAK,SAAS,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC;AACvD,kBAAApB,EAAI,QAAQ,QAAQ,KAAK;AAAA,oBACrB,IAAIoB;AAAA,oBACJ,MAAM;AAAA,oBACN,MAAA3C;AAAA,oBACA,IAAAY;AAAA,oBACA,MAAMuC,EAAK,MAAM,QAAQ,YAAY,GAAGA,EAAK,MAAM,QAAQ,MAAM;AAAA,CAAI;AAAA,oBACrE,QAAQ5B,EAAI,QAAQ;AAAA,oBACpB,WAAW,KAAK,IAAA;AAAA,kBAAI,CACvB,GACDjE,IAAU;AAAA,gBACd;AASA,gBAAI6F,EAAK,KAAKA,EAAK;AAAA,cAOvB;AAAA,YACJ,CAAC;AAAA,UACL,CAAC,GAEG7F,KACAiE,EAAI,QAAQ,kBAAkBA,EAAI,QAAQ,OAAO,GAC1C/E,KAEJ;AAAA,QACX;AAAA,QACA,OAAO;AAAA,UACH,YAAYH,GAAY;AACpB,mBAAO;AAAA,UACX;AAAA,QAAA;AAAA,MACJ,CACH;AAAA,IAAA;AAAA,EAET;AACJ,CAAC,GAKYiH,KAAc3K,EAAU,OAAO;AAAA,EACxC,MAAM;AAAA,EACN,UAAU;AAAA,EAEV,aAAa;AACT,WAAO;AAAA,MACH,gBAAgB,CAAA;AAAA,IAAC;AAAA,EAEzB;AAAA,EAEA,YAAY;AACR,WAAO,CAAC,EAAE,KAAK,2BAA2B;AAAA,EAC9C;AAAA,EAEA,WAAW,EAAE,gBAAAL,KAA2C;AACpD,WAAO,CAAC,QAAQ,EAAE,qBAAqB,IAAI,OAAO,mBAAmB,GAAGA,EAAA,GAAkB,CAAC;AAAA,EAC/F;AACJ,CAAC,GAKYiL,KAAc5K,EAAU,OAAO;AAAA,EACxC,MAAM;AAAA,EACN,UAAU;AAAA,EAEV,aAAa;AACT,WAAO;AAAA,MACH,gBAAgB,CAAA;AAAA,IAAC;AAAA,EAEzB;AAAA,EAEA,YAAY;AACR,WAAO,CAAC,EAAE,KAAK,2BAA2B;AAAA,EAC9C;AAAA,EAEA,WAAW,EAAE,gBAAAL,KAA2C;AACpD,WAAO,CAAC,QAAQ,EAAE,qBAAqB,IAAI,OAAO,mBAAmB,GAAGA,EAAA,GAAkB,CAAC;AAAA,EAC/F;AACJ,CAAC,GCjPYkL,KAAanL,GAAK,OAAO;AAAA,EAClC,MAAM;AAAA,EAEN,gBAAgB;AACZ,WAAO;AAAA,MACH,OAAO;AAAA,QACH,SAAS;AAAA,MAAA;AAAA,IACb;AAAA,EAER;AAAA,EAEA,YAAY;AACR,WAAO;AAAA,MACH;AAAA,QACI,KAAK;AAAA,MAAA;AAAA,IACT;AAAA,EAER;AAAA,EAEA,WAAW,EAAE,gBAAAC,KAAkB;AAC3B,WAAO,CAAC,QAAQC,EAAgB,KAAK,QAAQ,gBAAgBD,CAAc,GAAG,CAAC;AAAA,EACnF;AACJ,CAAC,GCOKmL,IAAM,IAAI1J,EAAyB,eAAe;AAExD,SAAS2J,GAAW7D,GAAe8D,GAAkC;AACnE,MAAI,CAAC9D,EAAO,QAAO;AACnB,MAAI+D,IAAUD,EAAK,QAAQ9D,IAAQA,EAAM,QAAQ,uBAAuB,MAAM;AAC9E,EAAI8D,EAAK,aAAa,CAACA,EAAK,UAAOC,IAAU,MAAMA,CAAO;AAC1D,QAAMC,IAAQ,IAAIF,EAAK,gBAAgB,KAAK,GAAG;AAC/C,MAAI;AACF,WAAO,IAAI,OAAOC,GAASC,CAAK;AAAA,EAClC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASC,EAAY3J,GAAU0F,GAAe8D,GAAmD;AAC/F,QAAMI,IAA0C,CAAA,GAC1CC,IAAQN,GAAW7D,GAAO8D,CAAI;AACpC,SAAKK,KAEL7J,EAAI,YAAY,CAACE,GAAWqC,MAAgB;AAC1C,QAAI,CAACrC,EAAK,OAAQ;AAClB,UAAMoE,IAAOpE,EAAK;AAClB,QAAI4J;AAEJ,SADAD,EAAM,YAAY,IACVC,IAAQD,EAAM,KAAKvF,CAAI,OAAO,QAAM;AAC1C,UAAIwF,EAAM,CAAC,EAAE,WAAW,GAAG;AAAE,QAAAD,EAAM;AAAa;AAAA,MAAU;AAC1D,MAAAD,EAAQ,KAAK,EAAE,MAAMrH,IAAMuH,EAAM,OAAO,IAAIvH,IAAMuH,EAAM,QAAQA,EAAM,CAAC,EAAE,QAAQ;AAAA,IACnF;AAAA,EACF,CAAC,GACMF;AACT;AAEA,SAASG,GAAeH,GAAyCI,GAAgC;AAC/F,QAAMC,IAAQL,EAAQ;AAAA,IAAI,CAACM,GAAGC,MAC5BC,GAAW,OAAOF,EAAE,MAAMA,EAAE,IAAI;AAAA,MAC9B,OAAOC,MAAMH,IAAU,wCAAwC;AAAA,IAAA,CAChE;AAAA,EAAA;AAEH,SAAOK,EAAc,OAAO,EAAE,MAAM,EAAA,GAAYJ,CAAK;AACvD;AAEO,MAAMK,KAAc9L,EAAU,OAAoC;AAAA,EACvE,MAAM;AAAA,EAEN,aAAa;AACX,WAAO;AAAA,MACL,OAAO;AAAA,MACP,SAAS,CAAA;AAAA,MACT,SAAS;AAAA,MACT,eAAe;AAAA,MACf,OAAO;AAAA,IAAA;AAAA,EAEX;AAAA,EAEA,cAAc;AACZ,WAAO;AAAA,MACL,UACE,CAACkH,GAAenE,IAAuB,CAAA,MACvC,CAAC,EAAE,QAAAC,GAAQ,UAAAW,QAAgD;AACzD,aAAK,QAAQ,QAAQuD,GACrB,KAAK,QAAQ,gBAAgB,CAAC,CAACnE,EAAQ,eACvC,KAAK,QAAQ,QAAQ,CAAC,CAACA,EAAQ;AAC/B,cAAMqI,IAAUlE,IAAQiE,EAAYnI,EAAO,MAAM,KAAKkE,GAAOnE,CAAO,IAAI,CAAA;AACxE,oBAAK,QAAQ,UAAUqI,GACvB,KAAK,QAAQ,UAAUA,EAAQ,SAAS,IAAI,IACxCzH,KAAUX,EAAO,KAAK,SAASA,EAAO,MAAM,GAAG,QAAQ8H,GAAK,EAAI,CAAC,GAC9DM,EAAQ;AAAA,MACjB;AAAA,MAEF,eACE,MACA,CAAC,EAAE,QAAApI,QAA8B;AAC/B,YAAI,CAAC,KAAK,QAAQ,QAAQ,OAAQ,QAAO;AACzC,aAAK,QAAQ,WAAW,KAAK,QAAQ,UAAU,KAAK,KAAK,QAAQ,QAAQ;AACzE,cAAM0I,IAAI,KAAK,QAAQ,QAAQ,KAAK,QAAQ,OAAO;AACnD,eAAA1I,EAAO,SAAS,iBAAiB,EAAE,MAAM0I,EAAE,MAAM,IAAIA,EAAE,IAAI,GAC3D1I,EAAO,SAAS,eAAA,GAChBA,EAAO,KAAK,SAASA,EAAO,MAAM,GAAG,QAAQ8H,GAAK,EAAI,CAAC,GAChD;AAAA,MACT;AAAA,MAEF,mBACE,MACA,CAAC,EAAE,QAAA9H,QAA8B;AAC/B,YAAI,CAAC,KAAK,QAAQ,QAAQ,OAAQ,QAAO;AACzC,aAAK,QAAQ,WACV,KAAK,QAAQ,UAAU,IAAI,KAAK,QAAQ,QAAQ,UAAU,KAAK,QAAQ,QAAQ;AAClF,cAAM0I,IAAI,KAAK,QAAQ,QAAQ,KAAK,QAAQ,OAAO;AACnD,eAAA1I,EAAO,SAAS,iBAAiB,EAAE,MAAM0I,EAAE,MAAM,IAAIA,EAAE,IAAI,GAC3D1I,EAAO,SAAS,eAAA,GAChBA,EAAO,KAAK,SAASA,EAAO,MAAM,GAAG,QAAQ8H,GAAK,EAAI,CAAC,GAChD;AAAA,MACT;AAAA,MAEF,aACE,CAAC5D,GAAe6E,GAAqBhJ,IAAuB,OAC5D,CAAC,EAAE,QAAAC,QAA8B;AAC/B,YAAI,CAACkE,EAAO,QAAO;AACnB,cAAMkE,IAAUD,EAAYnI,EAAO,MAAM,KAAKkE,GAAOnE,CAAO;AAC5D,YAAI,CAACqI,EAAQ,OAAQ,QAAO;AAC5B,cAAMY,IAASZ,EAAQ,KAAK,QAAQ,WAAW,IAAI,KAAK,QAAQ,UAAU,CAAC;AAC3E,eAAApI,EACG,MAAA,EACA,MAAA,EACA,gBAAgB,EAAE,MAAMgJ,EAAO,MAAM,IAAIA,EAAO,GAAA,GAAMD,CAAW,EACjE,IAAA,GACF/I,EAAO,SAAiB,SAASkE,GAAOnE,CAAO,GACzC;AAAA,MACT;AAAA,MAEF,gBACE,CAACmE,GAAe6E,GAAqBhJ,IAAuB,OAC5D,CAAC,EAAE,QAAAC,QAA8B;AAC/B,YAAI,CAACkE,EAAO,QAAO;AACnB,cAAMkE,IAAUD,EAAYnI,EAAO,MAAM,KAAKkE,GAAOnE,CAAO;AAC5D,YAAI,CAACqI,EAAQ,OAAQ,QAAO;AAC5B,cAAMvH,IAAKb,EAAO,MAAM;AACxB,iBAAS2I,IAAIP,EAAQ,SAAS,GAAGO,KAAK,GAAGA;AACvC,UAAA9H,EAAG,WAAWkI,GAAaX,EAAQO,CAAC,EAAE,MAAMP,EAAQO,CAAC,EAAE,EAAE;AAE3D,eAAA3I,EAAO,KAAK,SAASa,CAAE,GACtBb,EAAO,SAAiB,SAASkE,GAAOnE,CAAO,GACzCqI,EAAQ;AAAA,MACjB;AAAA,MAEF,aACE,MACA,CAAC,EAAE,QAAApI,SACD,KAAK,QAAQ,QAAQ,IACrB,KAAK,QAAQ,UAAU,CAAA,GACvB,KAAK,QAAQ,UAAU,IACvBA,EAAO,KAAK,SAASA,EAAO,MAAM,GAAG,QAAQ8H,GAAK,EAAI,CAAC,GAChD;AAAA,IACT;AAAA,EAEN;AAAA,EAEA,wBAAwB;AACtB,UAAMlC,IAAM;AACZ,WAAO;AAAA,MACL,IAAIzH,EAAsB;AAAA,QACxB,KAAK2J;AAAAA,QACL,OAAO;AAAA,UACL,MAAM,MAAMe,EAAc;AAAA,UAC1B,MAAMhI,GAAIoI,GAAQ;AAChB,mBAAIpI,EAAG,QAAQiH,CAAG,KAAKjH,EAAG,cACpB+E,EAAI,QAAQ,SAAS/E,EAAG,eAC1B+E,EAAI,QAAQ,UAAUuC,EAAYtH,EAAG,KAAK+E,EAAI,QAAQ,OAAO;AAAA,cAC3D,eAAeA,EAAI,QAAQ;AAAA,cAC3B,OAAOA,EAAI,QAAQ;AAAA,YAAA,CACpB,GACGA,EAAI,QAAQ,WAAWA,EAAI,QAAQ,QAAQ,WAC7CA,EAAI,QAAQ,UAAUA,EAAI,QAAQ,QAAQ,SAAS,KAGhD2C,GAAe3C,EAAI,QAAQ,SAASA,EAAI,QAAQ,OAAO,KAEzDqD,EAAO,IAAIpI,EAAG,SAASA,EAAG,GAAG;AAAA,UACtC;AAAA,QAAA;AAAA,QAEF,OAAO;AAAA,UACL,YAAYH,GAAY;AACtB,mBAAO,KAAK,SAASA,CAAK;AAAA,UAC5B;AAAA,QAAA;AAAA,MACF,CACD;AAAA,IAAA;AAAA,EAEL;AACF,CAAC,GCrLYwI,KAAgBlM,EAAU,OAAO;AAAA,EAC1C,MAAM;AAAA,EAEN,uBAAuB;AACnB,UAAMmM,IAAU,CAACvJ,MAAkB,MAAM,KAAK,OAAO,QAAQ,MAAA,EAAQ,cAAc,EAAE,OAAAA,EAAA,CAAqB,EAAE,IAAA;AAC5G,WAAO;AAAA;AAAA,MAEH,aAAauJ,EAAQ,CAAC;AAAA,MACtB,aAAaA,EAAQ,CAAC;AAAA,MACtB,aAAaA,EAAQ,CAAC;AAAA,MACtB,aAAaA,EAAQ,CAAC;AAAA,MACtB,aAAaA,EAAQ,CAAC;AAAA,MACtB,aAAaA,EAAQ,CAAC;AAAA,MACtB,SAASA,EAAQ,CAAC;AAAA,MAClB,SAASA,EAAQ,CAAC;AAAA,MAClB,SAASA,EAAQ,CAAC;AAAA,MAClB,SAASA,EAAQ,CAAC;AAAA,MAClB,SAASA,EAAQ,CAAC;AAAA,MAClB,SAASA,EAAQ,CAAC;AAAA,MAClB,SAAS,MAAM,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAQ,aAAA,EAAe,IAAA;AAAA;AAAA,MAG1D,eAAe,MAAM,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAQ,iBAAA,EAAmB,IAAA;AAAA,MACpE,eAAe,MAAM,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAQ,kBAAA,EAAoB,IAAA;AAAA,MACrE,eAAe,MAAM,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAQ,iBAAA,EAAmB,IAAA;AAAA,MACpE,eAAe,MAAM,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAQ,kBAAA,EAAoB,IAAA;AAAA;AAAA,MAGrE,SAAS,MAAM,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAQ,aAAa,MAAM,EAAE,IAAA;AAAA,MAChE,SAAS,MAAM,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAQ,aAAa,QAAQ,EAAE,IAAA;AAAA,MAClE,SAAS,MAAM,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAQ,aAAa,OAAO,EAAE,IAAA;AAAA,MACjE,SAAS,MAAM,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAQ,aAAa,SAAS,EAAE,IAAA;AAAA;AAAA,MAGnE,eAAe,MAAM,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAQ,aAAA,EAAe,IAAA;AAAA,MAChE,SAAS,MAAM,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAQ,gBAAA,EAAkB,IAAA;AAAA,MAC7D,SAAS,MAAM,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAQ,kBAAA,EAAoB,IAAA;AAAA,MAC/D,eAAe,MAAM,KAAK,OAAO,QAAQ,QAAQ,gBAAgB,EAAE,OAAO,UAAA,CAAW,EAAE,IAAA;AAAA;AAAA,MAGvF,aAAa,MAAO,KAAK,OAAO,SAAiB,aAAA;AAAA;AAAA;AAAA,IAAa;AAAA,EAKtE;AACJ,CAAC,GCzCYC,KAAUrL,EAAK,OAAO;AAAA,EAC/B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AAAA,EAEX,gBAAgB;AACZ,WAAO;AAAA,MACH,OAAO;AAAA,QACH,SAAS;AAAA,QACT,WAAW,CAACY,MAAoB,SAASA,EAAG,aAAa,YAAY,KAAK,KAAK,EAAE,KAAK;AAAA,QACtF,YAAY,CAACM,OAAgB,EAAE,cAAc,OAAOA,EAAM,KAAK,EAAA;AAAA,MAAE;AAAA,MAErE,QAAQ;AAAA,QACJ,SAAS;AAAA,QACT,WAAW,CAACN,MAAoB,SAASA,EAAG,aAAa,aAAa,KAAK,KAAK,EAAE,KAAK;AAAA,QACvF,YAAY,CAACM,OAAgB,EAAE,eAAe,OAAOA,EAAM,MAAM,EAAA;AAAA,MAAE;AAAA,MAEvE,GAAG;AAAA,QACC,SAAS;AAAA,QACT,WAAW,CAACN,MAAoB,SAASA,EAAG,aAAa,QAAQ,KAAK,KAAK,EAAE;AAAA,QAC7E,YAAY,CAACM,OAAgB,EAAE,UAAU,OAAOA,EAAM,KAAK,CAAC,EAAA;AAAA,MAAE;AAAA,MAElE,GAAG;AAAA,QACC,SAAS;AAAA,QACT,WAAW,CAACN,MAAoB,SAASA,EAAG,aAAa,QAAQ,KAAK,KAAK,EAAE;AAAA,QAC7E,YAAY,CAACM,OAAgB,EAAE,UAAU,OAAOA,EAAM,KAAK,CAAC,EAAA;AAAA,MAAE;AAAA,MAElE,iBAAiB;AAAA,QACb,SAAS;AAAA,QACT,WAAW,CAACN,MAAoBA,EAAG,MAAM,mBAAmB;AAAA,QAC5D,YAAY,CAACM,MAAeA,EAAM,kBAAkB,EAAE,OAAO,qBAAqBA,EAAM,eAAe,GAAA,IAAO,CAAA;AAAA,MAAC;AAAA,MAEnH,aAAa;AAAA,QACT,SAAS;AAAA,QACT,WAAW,CAACN,MAAoBA,EAAG,MAAM,eAAe;AAAA,QACxD,YAAY,CAACM,OAAgB,CAAA;AAAA,MAAC;AAAA,IAClC;AAAA,EAER;AAAA,EAEA,YAAY;AACR,WAAO,CAAC,EAAE,KAAK,6BAA6B;AAAA,EAChD;AAAA,EAEA,WAAW,EAAE,gBAAAtC,GAAgB,MAAA+B,KAAQ;AACjC,UAAM2K,IAAI3K,EAAK,MAAM,SAAS,KACxB4K,IAAI5K,EAAK,MAAM,UAAU,KACzB6K,IAAI7K,EAAK,MAAM,KAAK,GACpB8K,IAAI9K,EAAK,MAAM,KAAK,GACpBU,IAAQ,SAASiK,CAAC,iBAAiBC,CAAC,0BAA0BC,CAAC,MAAMC,CAAC,UAAU9K,EAAK,MAAM,kBAAkB,cAAcA,EAAK,MAAM,eAAe,MAAM,MAAM,oBAAoBA,EAAK,MAAM,eAAe,SAAS;AAC9N,WAAO,CAAC,OAAO9B,EAAgBD,GAAgB,EAAE,aAAa,YAAY,OAAO,cAAc,OAAAyC,EAAA,CAAO,GAAG,CAAC;AAAA,EAC9G;AAAA,EAEA,cAAc;AACV,WAAO;AAAA,MACH,eAAe,CAACH,IAAa,CAAA,MAAO,CAAC,EAAE,UAAA1B,QAC5BA,EAAS,cAAc;AAAA,QAC1B,MAAM,KAAK;AAAA,QACX,OAAO;AAAA,UACH,OAAO0B,EAAM,SAAS;AAAA,UACtB,QAAQA,EAAM,UAAU;AAAA,UACxB,GAAG;AAAA,UACH,GAAG;AAAA,UACH,iBAAiBA,EAAM,mBAAmB;AAAA,UAC1C,aAAaA,EAAM,eAAe;AAAA,QAAA;AAAA,QAEtC,SAAS,CAAC,EAAE,MAAM,aAAa,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,WAAA,CAAY,GAAG;AAAA,MAAA,CACjF;AAAA,IACL;AAAA,EAER;AAAA,EAEA,cAAc;AACV,WAAO,CAAC,EAAE,MAAAP,GAAM,QAAAsB,GAAQ,QAAAiC,QAAa;AACjC,YAAMgB,IAAM,SAAS,cAAc,KAAK;AACxC,MAAAA,EAAI,YAAY,cAChBA,EAAI,QAAQ,OAAO,YACnBA,EAAI,kBAAkB;AAEtB,YAAMwG,IAAiB,MAAM;AACzB,cAAMJ,IAAI3K,EAAK,MAAM,SAAS,KACxB4K,IAAI5K,EAAK,MAAM,UAAU,KACzB6K,IAAI7K,EAAK,MAAM,KAAK,GACpB8K,IAAI9K,EAAK,MAAM,KAAK;AAC1B,QAAAuE,EAAI,MAAM,QAAQ,GAAGoG,CAAC,MACtBpG,EAAI,MAAM,YAAY,GAAGqG,CAAC,MAC1BrG,EAAI,MAAM,YAAY,aAAasG,CAAC,OAAOC,CAAC,OACxC9K,EAAK,MAAM,oBAAqB,MAAM,aAAaA,EAAK,MAAM,kBAC7DuE,EAAI,MAAM,aAAa,IAC5BA,EAAI,MAAM,SAAS,aAAavE,EAAK,MAAM,eAAe,SAAS;AAAA,MACvE;AACA,MAAA+K,EAAA;AAGA,YAAMC,IAAa,SAAS,cAAc,KAAK;AAC/C,MAAAA,EAAW,YAAY,mBACvBA,EAAW,kBAAkB,SAC7BA,EAAW,QAAQ,gBACnBA,EAAW,YAAY,KACvBzG,EAAI,YAAYyG,CAAU;AAG1B,YAAMC,IACF,CAAC,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG;AAE/C,iBAAW5I,KAAO4I,GAAiB;AAC/B,cAAML,IAAI,SAAS,cAAc,KAAK;AACtC,QAAAA,EAAE,YAAY,uCAAuCvI,CAAG,IACxDuI,EAAE,kBAAkB,SACpBrG,EAAI,YAAYqG,CAAC;AAGjB,YAAIM,IAAS,GAAGC,IAAS,GAAGC,IAAS,GAAGC,IAAS,GAAGC,IAAU,GAAGC,IAAU;AAC3E,QAAAX,EAAE,iBAAiB,aAAa,CAAC9G,MAAM;AACnC,UAAAA,EAAE,eAAA,GACFA,EAAE,gBAAA,GACFoH,IAASpH,EAAE,SACXqH,IAASrH,EAAE,SACXsH,IAASpL,EAAK,MAAM,SAASuE,EAAI,aACjC8G,IAASrL,EAAK,MAAM,UAAUuE,EAAI,cAClC+G,IAAUtL,EAAK,MAAM,KAAK,GAC1BuL,IAAUvL,EAAK,MAAM,KAAK,GAC1BuE,EAAI,UAAU,IAAI,aAAa;AAC/B,gBAAMiH,IAAS,CAAC5E,MAAkB;AAC9B,kBAAM6E,IAAK7E,EAAE,UAAUsE,GACjBQ,IAAK9E,EAAE,UAAUuE;AACvB,gBAAIR,IAAIS,GAAQO,IAAKN,GAAQO,IAAKN,GAASO,IAAKN;AAChD,YAAIlJ,EAAI,SAAS,GAAG,UAAO,KAAK,IAAI,IAAI+I,IAASK,CAAE,IAC/CpJ,EAAI,SAAS,GAAG,MAAKsI,IAAI,KAAK,IAAI,IAAIS,IAASK,CAAE,GAAGG,IAAKN,IAAUG,IACnEpJ,EAAI,SAAS,GAAG,UAAQ,KAAK,IAAI,IAAIgJ,IAASK,CAAE,IAChDrJ,EAAI,SAAS,GAAG,MAAKsJ,IAAK,KAAK,IAAI,IAAIN,IAASK,CAAE,GAAGG,IAAKN,IAAUG,IACxEnH,EAAI,MAAM,QAAQ,GAAGoG,CAAC,MACtBpG,EAAI,MAAM,YAAY,GAAGoH,CAAE,MAC3BpH,EAAI,MAAM,YAAY,aAAaqH,CAAE,OAAOC,CAAE;AAAA,UAClD,GACMC,IAAO,MAAM;AACf,YAAAvH,EAAI,UAAU,OAAO,aAAa,GAClC,SAAS,oBAAoB,aAAaiH,CAAM,GAChD,SAAS,oBAAoB,WAAWM,CAAI;AAC5C,kBAAMC,IAAQxI,IAAA;AACd,gBAAI,OAAOwI,KAAS,SAAU;AAC9B,kBAAMpB,IAAI,SAASpG,EAAI,MAAM,OAAO,EAAE,KAAKvE,EAAK,MAAM,OAChD2L,IAAK,SAASpH,EAAI,MAAM,WAAW,EAAE,KAAKvE,EAAK,MAAM,QACrD4G,IAAIrC,EAAI,MAAM,UAAU,MAAM,yCAAyC,GACvEqH,IAAKhF,IAAI,SAASA,EAAE,CAAC,GAAG,EAAE,IAAI5G,EAAK,MAAM,GACzC6L,IAAKjF,IAAI,SAASA,EAAE,CAAC,GAAG,EAAE,IAAI5G,EAAK,MAAM,GACzCmC,IAAKb,EAAO,MAAM,GAAG,cAAcyK,GAAM,QAAW;AAAA,cACtD,GAAG/L,EAAK;AAAA,cAAO,OAAO2K;AAAA,cAAG,QAAQgB;AAAA,cAAI,GAAGC;AAAA,cAAI,GAAGC;AAAA,YAAA,CAClD;AACD,YAAAvK,EAAO,KAAK,SAASa,CAAE;AAAA,UAC3B;AACA,mBAAS,iBAAiB,aAAaqJ,CAAM,GAC7C,SAAS,iBAAiB,WAAWM,CAAI;AAAA,QAC7C,CAAC;AAAA,MACL;AAGA,UAAIE,IAAW,IACXC,IAAU,GAAGC,IAAU,GAAGC,IAAW,GAAGC,IAAW;AACvD,MAAApB,EAAW,iBAAiB,aAAa,CAAClH,MAAM;AAC5C,QAAAA,EAAE,eAAA,GACFA,EAAE,gBAAA,GACFkI,IAAW,IACXC,IAAUnI,EAAE,SACZoI,IAAUpI,EAAE,SACZqI,IAAWnM,EAAK,MAAM,KAAK,GAC3BoM,IAAWpM,EAAK,MAAM,KAAK,GAC3BuE,EAAI,UAAU,IAAI,aAAa;AAC/B,cAAMiH,IAAS,CAAC5E,MAAkB;AAC9B,cAAI,CAACoF,EAAU;AACf,gBAAMJ,IAAKO,KAAYvF,EAAE,UAAUqF,IAC7BJ,IAAKO,KAAYxF,EAAE,UAAUsF;AACnC,UAAA3H,EAAI,MAAM,YAAY,aAAaqH,CAAE,OAAOC,CAAE;AAAA,QAClD,GACMC,IAAO,MAAM;AACf,cAAI,CAACE,EAAU;AACf,UAAAA,IAAW,IACXzH,EAAI,UAAU,OAAO,aAAa,GAClC,SAAS,oBAAoB,aAAaiH,CAAM,GAChD,SAAS,oBAAoB,WAAWM,CAAI;AAC5C,gBAAMC,IAAQxI,IAAA;AACd,cAAI,OAAOwI,KAAS,SAAU;AAC9B,gBAAMnF,IAAIrC,EAAI,MAAM,UAAU,MAAM,yCAAyC;AAC7E,cAAI,CAACqC,EAAG;AACR,gBAAMgF,IAAK,SAAShF,EAAE,CAAC,GAAG,EAAE,GACtBiF,IAAK,SAASjF,EAAE,CAAC,GAAG,EAAE,GACtBzE,IAAKb,EAAO,MAAM,GAAG,cAAcyK,GAAM,QAAW,EAAE,GAAG/L,EAAK,OAAO,GAAG4L,GAAI,GAAGC,GAAI;AACzF,UAAAvK,EAAO,KAAK,SAASa,CAAE;AAAA,QAC3B;AACA,iBAAS,iBAAiB,aAAaqJ,CAAM,GAC7C,SAAS,iBAAiB,WAAWM,CAAI;AAAA,MAC7C,CAAC;AAGD,YAAMO,IAAa,SAAS,cAAc,KAAK;AAC/C,aAAAA,EAAW,YAAY,sBACvB9H,EAAI,YAAY8H,CAAU,GAEnB;AAAA,QACH,KAAA9H;AAAA,QACA,YAAA8H;AAAA,QACA,OAAO7H,GAAS;AACZ,iBAAIA,EAAQ,KAAK,SAAS,YAAkB,MAC5C,OAAO,OAAOxE,GAAMwE,CAAO,GAC3BuG,EAAA,GACO;AAAA,QACX;AAAA,QACA,UAAUnL,GAAO;AACb,gBAAMV,IAAIU,EAAM;AAChB,iBAAKV,IACEA,EAAE,UAAU,SAAS,iBAAiB,KAAKA,EAAE,UAAU,SAAS,mBAAmB,IAD3E;AAAA,QAEnB;AAAA,MAAA;AAAA,IAER;AAAA,EACJ;AACJ,CAAC,GCpOKkK,IAAM,IAAI1J,EAAyB,cAAc,GAW1C4M,KAAahO,EAAU,OAA0B;AAAA,EAC1D,MAAM;AAAA,EAEN,aAAa;AACT,WAAO;AAAA,MACH,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,KAAK;AAAA,IAAA;AAAA,EAEb;AAAA,EAEA,aAAa;AACT,WAAO;AAAA;AAAA,MAEH,iBAAiB;AAAA;AAAA,MAEjB,WAAW;AAAA,MACX,gBAAgB;AAAA,IAAA;AAAA,EAExB;AAAA,EAEA,wBAAwB;AACpB,UAAM4I,IAAM;AACZ,WAAO;AAAA,MACH,IAAIzH,EAAsB;AAAA,QACtB,KAAK2J;AAAA,QACL,OAAO;AAAA,UACH,MAAM,MAAMe,EAAc;AAAA,UAC1B,MAAMhI,GAAIoI,GAAQ;AAKd,mBAAIpI,EAAG,QAAQiH,CAAG,IAAUmD,GAAsBrF,CAAG,IAC9CqD,EAAO,IAAIpI,EAAG,SAASA,EAAG,GAAG;AAAA,UACxC;AAAA,QAAA;AAAA,QAEJ,KAAKxC,GAAM;AAIP,cAAI6M,IAAuB,MACvBC,IAAU,GACVC,IAAY/M,EAAK,IAAI;AACzB,gBAAMgN,IAAe,KAEfC,IAAY,CAACC,IAAQ,OAAU;AACjC,YAAIL,0BAA4BA,CAAK,GACrCA,IAAQ,sBAAsB,MAAM;AAChC,cAAAA,IAAQ;AACR,oBAAMM,IAAM,YAAY,IAAA;AACxB,kBAAI,CAACD,KAASC,IAAML,IAAUE,GAAc;AAExC,2BAAW,MAAMC,EAAU,EAAI,GAAGD,KAAgBG,IAAML,EAAQ;AAChE;AAAA,cACJ;AACA,cAAAA,IAAUK;AACV,kBAAI;AAAE,gBAAAnN,EAAK,SAASA,EAAK,MAAM,GAAG,QAAQyJ,GAAK,EAAI,CAAC;AAAA,cAAG,QAAQ;AAAA,cAAkB;AAAA,YACrF,CAAC;AAAA,UACL;AAGA,UAAI,OAAO,yBAA0B,oCAAkC,MAAMwD,EAAU,EAAI,CAAC;AAI5F,cAAIG,IAA6B;AACjC,UAAI,OAAO,iBAAmB,QAC1BA,IAAM,IAAI,eAAe,CAACC,MAAY;AAClC,kBAAMC,IAAOtN,EAAK,IAAI;AACtB,YAAI,KAAK,IAAIsN,IAAOP,CAAS,IAAI,MACjCA,IAAYO,GACZL,EAAA;AAAA,UACJ,CAAC,GACDG,EAAI,QAAQpN,EAAK,GAAG;AAGxB,gBAAMuN,IAAiB,MAAMN,EAAA;AAC7B,iBAAI,OAAO,SAAW,OAClB,OAAO,iBAAiB,UAAUM,CAAc,GAG7C;AAAA,YACH,QAAQ,CAACC,GAAS1E,MAAa;AAG3B,cAAK0E,EAAQ,MAAM,IAAI,GAAG1E,EAAS,GAAG,KAAGmE,EAAA;AAAA,YAC7C;AAAA,YACA,SAAS,MAAM;AACX,cAAIJ,0BAA4BA,CAAK,GACrCO,GAAK,WAAA,GACD,OAAO,SAAW,OAClB,OAAO,oBAAoB,UAAUG,CAAc;AAAA,YAE3D;AAAA,UAAA;AAAA,QAER;AAAA,QACA,OAAO;AAAA,UACH,YAAYlL,GAAO;AACf,mBAAO,KAAK,SAASA,CAAK;AAAA,UAC9B;AAAA,QAAA;AAAA,MACJ,CACH;AAAA,IAAA;AAAA,EAET;AACJ,CAAC;AAED,SAASuK,GAAsBrF,GAAyB;AACpD,MAAI,CAACA,EAAI,QAAQ,gBAAgBiD,EAAc;AAC/C,QAAM7I,IAAS4F,EAAI;AACnB,MAAI,CAAC5F,KAAU,CAACA,EAAO,aAAa6I,EAAc;AAElD,QAAMiD,IACFlG,EAAI,QAAQ,mBACZA,EAAI,QAAQ,mBACZmG,GAAA;AACJ,MAAID,KAAc,IAAK,QAAOjD,EAAc;AAE5C,QAAMxK,IAAO2B,EAAO,MACdgM,IAAc3N,EAAK;AACzB,MAAI,CAAC2N,EAAa,QAAOnD,EAAc;AAEvC,QAAMJ,IAAsB,CAAA;AAC5B,MAAIwD,IAAY,GAIZC,IADW,WAAW,iBAAiBF,CAAW,EAAE,cAAc,GAAG,KAAK;AAG9E,QAAMG,IAAgBH,EAAY,sBAAA;AAClC,MAAII,IAAqB;AAEzB,SAAApM,EAAO,MAAM,IAAI,QAAQ,CAACtB,GAAW2N,MAAmB;AACpD,UAAMpJ,IAAM5E,EAAK,QAAQgO,CAAM;AAC/B,QAAI,CAACpJ,KAAO,EAAEA,aAAe,aAAc;AAE3C,UAAMsD,IAAOtD,EAAI,sBAAA,GACXqJ,IAAM/F,EAAK,MAAM4F,EAAc,KAC/BI,IAASD,IAAM/F,EAAK;AAI1B,QAHA6F,IAAqB,KAAK,IAAIA,GAAoBG,CAAM,GAGpD7N,EAAK,KAAK,SAAS,aAAa;AAChC,YAAM8N,IAAUN,IAAaJ,GACvBW,IAAY,KAAK,IAAI,GAAGD,IAAUF,CAAG;AAE3C,MAAA7D,EAAM,KAAKiE,GAAWL,IAAS3N,EAAK,UAAU+N,GAAW,EAAI,CAAC,GAC9DP,IAAaM,GACbP,KAAa;AACb;AAAA,IACJ;AAIA,UAAMO,IAAUN,IAAaJ;AAC7B,QAAIS,IAASC,KAAWF,IAAME,KAAWjG,EAAK,SAASuF,GAAY;AAC/D,YAAMW,IAAY,KAAK,IAAI,GAAGD,IAAUF,CAAG;AAC3C,MAAA7D,EAAM,KAAKiE,GAAWL,GAAQI,GAAW,EAAK,CAAC,GAC/CP,IAAaM,GACbP,KAAa;AAAA,IACjB,WAAWM,IAASC;AAEhB,aAAOD,IAASL,IAAaJ;AACzB,QAAAI,KAAcJ,GACdG,KAAa;AAAA,EAGzB,CAAC,GAEDrG,EAAI,QAAQ,YAAY,KAAK,IAAI,GAAGqG,CAAS,GAC7CrG,EAAI,QAAQ,iBAAiBwG,GAEtBvD,EAAc,OAAO7I,EAAO,MAAM,KAAKyI,CAAK;AACvD;AAEA,SAASiE,GAAW3L,GAAaI,GAAgBwL,GAAoC;AACjF,QAAMhO,IAAK,SAAS,cAAc,KAAK;AACvC,SAAAA,EAAG,YAAYgO,IAAgB,uCAAuC,kBACtEhO,EAAG,kBAAkB,SACrBA,EAAG,aAAa,eAAe,MAAM,GACrCA,EAAG,MAAM,SAAS,GAAG,KAAK,IAAI,GAAG,KAAK,MAAMwC,CAAM,CAAC,CAAC,MAC7CyH,GAAW,OAAO7H,GAAKpC,GAAI,EAAE,MAAMgO,IAAgB,IAAI,IAAI,iBAAiB,GAAA,CAAM;AAC7F;AAEA,SAASZ,KAA6B;AAGlC,SAAO,KAAK,MAAM,MAAM,MAAM;AAClC;ACjMO,MAAMa,KAAQ7O,EAAK,OAAO;AAAA,EAC7B,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAE,WAAO,CAAC,EAAE,KAAK,cAAA,GAAiB,EAAE,KAAK,0BAA0B;AAAA,EAAG;AAAA,EAClF,WAAW,EAAE,gBAAApB,KAAkB;AAC3B,WAAO,CAAC,MAAMC,EAAgBD,GAAgB,EAAE,OAAO,YAAY,aAAa,SAAS,GAAG,CAAC;AAAA,EACjG;AAAA,EACA,cAAc;AACV,WAAO;AAAA,MACH,UAAU,MAAM,CAAC,EAAE,UAAAY,QAAoBA,EAAS,QAAQ,KAAK,IAAI;AAAA,IAAA;AAAA,EAEzE;AACJ,CAAC,GAEYsP,KAAW9O,EAAK,OAAO;AAAA,EAChC,MAAM;AAAA,EACN,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAE,WAAO,CAAC,EAAE,KAAK,gBAAA,GAAmB,EAAE,KAAK,6BAA6B;AAAA,EAAG;AAAA,EACvF,WAAW,EAAE,gBAAApB,KAAkB;AAC3B,WAAO,CAAC,KAAKC,EAAgBD,GAAgB,EAAE,OAAO,eAAe,aAAa,YAAY,GAAG,CAAC;AAAA,EACtG;AAAA,EACA,cAAc;AACV,WAAO;AAAA,MACH,aAAa,MAAM,CAAC,EAAE,UAAAY,QAAoBA,EAAS,QAAQ,KAAK,IAAI;AAAA,IAAA;AAAA,EAE5E;AACJ,CAAC;AC/CM,MAAMuP,GAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,EAK7B,OAAc,SAASC,GAAwB;AAC7C,WAAI,CAACA,KAAQ,OAAOA,KAAS,WACpB,EAAE,MAAM,OAAO,SAAS,CAAA,EAAC,KAG9BA,EAAK,SAAS,UAChB,QAAQ,KAAK,wDAAwD,GACrEA,EAAK,OAAO,QAGT,MAAM,QAAQA,EAAK,OAAO,MAC7B,QAAQ,KAAK,oEAAoE,GACjFA,EAAK,UAAU,CAAA,IAIjB,KAAK,cAAcA,EAAK,OAAO,GAExBA;AAAA,EACT;AAAA,EAEA,OAAe,cAAcC,GAAc;AACzC,IAAAA,EAAM,QAAQ,CAACtO,GAAMuO,MAAU;AAC7B,UAAI,CAACvO,KAAQ,OAAOA,KAAS,YAAY,CAACA,EAAK,MAAM;AACnD,gBAAQ,KAAK,qDAAqDuO,CAAK,EAAE,GACzED,EAAM,OAAOC,GAAO,CAAC;AACrB;AAAA,MACF;AAGA,MAAIvO,EAAK,WAAW,CAAC,MAAM,QAAQA,EAAK,OAAO,MAC7CA,EAAK,UAAU,CAAA,IAGbA,EAAK,WACP,KAAK,cAAcA,EAAK,OAAO;AAAA,IAEnC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAc,qBAAqBqO,GAA2B;AAC5D,WAAO,KAAK,UAAUA,GAAM,OAAO,KAAKA,CAAI,EAAE,MAAM;AAAA,EACtD;AACF;AChDO,MAAMG,GAAe;AAAA,EAGxB,YAAYlN,GAAgB;AAFpB,IAAAb,EAAA;AAaD;AAAA,IAAAA,EAAA,cAAO,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,YAAY;AAC7C,IAAApE,EAAA,gBAAS,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,cAAc;AACjD,IAAApE,EAAA,mBAAY,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,iBAAiB;AACvD,IAAApE,EAAA,gBAAS,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,cAAc;AACjD,IAAApE,EAAA,mBAAY,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,iBAAiB;AACvD,IAAApE,EAAA,qBAAc,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,mBAAmB;AAC3D,IAAApE,EAAA,cAAO,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,YAAY;AAE7C,IAAApE,EAAA,oBAAa,CAACgO,MAAiB,KAAK,QAAQ,CAAA5J,MAAKA,EAAE,cAAc4J,CAAI,CAAC;AACtE,IAAAhO,EAAA,kBAAW,CAACiO,MAAiB,KAAK,QAAQ,CAAA7J,MAAKA,EAAE,YAAY6J,CAAI,CAAC;AAClE,IAAAjO,EAAA,kBAAW,CAACkO,MAAkB,KAAK,QAAQ,CAAA9J,MAAKA,EAAE,SAAS8J,CAAK,CAAC;AACjE,IAAAlO,EAAA,oBAAa,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,YAAY;AACnD,IAAApE,EAAA,sBAAe,CAACkO,MAAkB,KAAK,QAAQ,CAAA9J,MAAKA,EAAE,aAAa,EAAE,OAAA8J,EAAA,CAAO,CAAC;AAC7E,IAAAlO,EAAA,wBAAiB,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,gBAAgB;AAC3D,IAAApE,EAAA,mBAAY,CAAC3B,MAAkB,KAAK,OAAO,QAAQ,QAAgB,iBAAiBA,CAAI,EAAE,IAAA;AAC1F,IAAA2B,EAAA,yBAAkB,MAAO,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAgB,gBAAA,EAAkB,IAAA;AAC/E,IAAAA,EAAA,uBAAgB,CAACzB,MAAqB,KAAK,OAAO,QAAQ,QAAgB,iBAAiBA,CAAO,EAAE,IAAA;AACpG,IAAAyB,EAAA,qBAAc,CAACzB,MAAqB,KAAK,OAAO,QAAQ,QAAgB,eAAeA,CAAO,EAAE,IAAA;AAGhG;AAAA,IAAAyB,EAAA,eAAQ,CAACmO,MACZ,KAAK,QAAQ,CAAA/J,MAAKA,EAAE,aAAa+J,CAAS,CAAC;AACxC,IAAAnO,EAAA,oBAAa,CAACgC,MAAmB,KAAK,QAAQ,CAAAoC,MAAKA,EAAE,cAAcpC,CAAM,CAAC;AAC1E,IAAAhC,EAAA,iBAAU,CAACmN,GAAaC,MAC3B,KAAK,QAAQ,CAAAhJ,MAAKA,EAAE,oBAAoB,EAAE,KAAA+I,GAAK,QAAAC,EAAA,CAAQ,CAAC;AACrD,IAAApN,EAAA,yBAAkB,CAACF,MACrB,KAAK,OAAO,QAAQ,QAAgB,mBAAmBA,CAAK,EAAE,IAAA;AAC5D,IAAAE,EAAA,gBAAS,MACR,KAAK,OAAO,SAAS,UAAU,IACvB,KAAK,OAAO,MAAA,EAAQ,QAAgB,aAAa,UAAU,EAAE,IAAA,IAElE,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,QAAQ;AAEhC,IAAApE,EAAA,iBAAU,MACT,KAAK,OAAO,SAAS,UAAU,IACvB,KAAK,OAAO,MAAA,EAAQ,QAAgB,aAAa,UAAU,EAAE,IAAA,IAElE,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,SAAS;AAGjC,IAAApE,EAAA,iBAAU,CAACS,MACd,KAAK,QAAQ,CAAA2D,MAAKA,EAAE,cAAc,EAAE,OAAA3D,EAAA,CAAO,CAAC;AACzC,IAAAT,EAAA,mBAAY,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,cAAc;AACpD,IAAApE,EAAA,eAAQ,MAAO,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAgB,SAAA,EAAW,IAAA;AAC9D,IAAAA,EAAA,kBAAW,MAAO,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAgB,YAAA,EAAc,IAAA;AACpE,IAAAA,EAAA,oBAAa,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,kBAAkB;AACzD,IAAApE,EAAA,mBAAY,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,iBAAiB;AACvD,IAAApE,EAAA,wBAAiB,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,mBAAmB;AAG9D;AAAA,IAAApE,EAAA,oBAAa,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,kBAAkB;AACzD,IAAApE,EAAA,qBAAc,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,mBAAmB;AAC3D,IAAApE,EAAA,kBAAW,MAAO,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAgB,eAAA,EAAiB,IAAA;AACvE,IAAAA,EAAA,sBAAe,CAACC,MAClB,KAAK,OAAO,QAAQ,QAAgB,aAAaA,CAAK,EAAE,IAAA;AACtD,IAAAD,EAAA,4BAAqB,CAAC6C,MACxB,KAAK,OAAO,QAAQ,QAAgB,mBAAmBA,CAAC,EAAE,IAAA;AAGxD;AAAA,IAAA7C,EAAA,qBAAc,CAACY,MAClB,KAAK,QAAQ,CAAAwD,MAAKA,EAAE,YAAYxD,CAAO,CAAC;AACrC,IAAAZ,EAAA,yBAAkB,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,iBAAiB;AAC7D,IAAApE,EAAA,wBAAiB,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,gBAAgB;AAC3D,IAAApE,EAAA,sBAAe,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,cAAc;AACvD,IAAApE,EAAA,sBAAe,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,cAAc;AACvD,IAAApE,EAAA,qBAAc,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,aAAa;AACrD,IAAApE,EAAA,mBAAY,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,WAAW;AACjD,IAAApE,EAAA,qBAAc,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,aAAa;AACrD,IAAApE,EAAA,oBAAa,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,YAAY;AACnD,IAAApE,EAAA,mBAAY,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,WAAW;AACjD,IAAApE,EAAA,4BAAqB,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,oBAAoB;AACnE,IAAApE,EAAA,yBAAkB,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,iBAAiB;AAC7D,IAAApE,EAAA,0BAAmB,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,kBAAkB;AAC/D,IAAApE,EAAA,sBAAe,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,cAAc;AACvD,IAAApE,EAAA,0BAAmB,CAACE,GAAckO,MACrC,KAAK,QAAQ,CAAAhK,MAAKA,EAAE,iBAAiBlE,GAAMkO,CAAK,CAAC;AAC9C,IAAApO,EAAA,uBAAgB,CAACC,MACnB,KAAK,OAAO,QAAQ,QAAgB,cAAcA,CAAK,EAAE,IAAA;AAGvD;AAAA,IAAAD,EAAA,yBAAkB,MAAO,KAAK,OAAO,SAAiB,gBAAA;AACtD,IAAAA,EAAA,qBAAc,CAACsF,GAAa+I,MAC/B,KAAK,QAAQ,CAAAjK,MAAKA,EAAE,SAAS,EAAE,KAAAkB,GAAK,KAAK+I,KAAO,GAAA,CAAI,CAAC;AAClD,IAAArO,EAAA,sBAAe,CAACoB,GAAeY,MACjC,KAAK,OAAO,QAAQ,MAAA,EAAgB,aAAaZ,GAAOY,CAAM,EAAE,IAAA;AAC9D,IAAAhC,EAAA,uBAAgB,CAACiC,MACnB,KAAK,OAAO,QAAQ,QAAgB,cAAcA,CAAK,EAAE,IAAA;AACvD,IAAAjC,EAAA,uBAAgB,CAAC3B,MACnB,KAAK,OAAO,QAAQ,QAAgB,cAAcA,CAAI,EAAE,IAAA;AACtD,IAAA2B,EAAA,uBAAgB,CAACF,MACnB,KAAK,OAAO,QAAQ,QAAgB,cAAcA,CAAK,EAAE,IAAA;AACvD,IAAAE,EAAA,0BAAmB,CAACmC,MACtB,KAAK,OAAO,QAAQ,QAAgB,iBAAiBA,CAAK,EAAE,IAAA;AAC1D,IAAAnC,EAAA,yBAAkB,CAACmC,MACrB,KAAK,OAAO,QAAQ,QAAgB,gBAAgBA,CAAK,EAAE,IAAA;AACzD,IAAAnC,EAAA,mBAAY,MAAO,KAAK,OAAO,SAAiB,aAAA;AAChD,IAAAA,EAAA,kBAAW,CAAClB,MAAsB,KAAK,OAAO,SAAiB,YAAYA,CAAO;AAClF,IAAAkB,EAAA,sBAAe,MAAO,KAAK,OAAO,SAAiB,mBAAA;AACnD,IAAAA,EAAA,oBAAa,CAACY,MAAkB,KAAK,OAAO,SAAiB,cAAcA,CAAO;AAClF,IAAAZ,EAAA,0BAAmB,MACtB,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,cAAc,EAAE,MAAM,aAAA,CAAc,CAAC;AACtD,IAAApE,EAAA,oBAAa,CAACsO,MAChB,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAgB,QAAQ,EAAE,MAAAA,EAAA,CAAM,EAAE,IAAA;AACpD,IAAAtO,EAAA,mBAAY,MAAO,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAgB,UAAA,EAAY,IAAA;AAGnE;AAAA,IAAAA,EAAA,oBAAa,CAACE,MAChB,KAAK,OAAO,QAAQ,QAAgB,gBAAgBA,CAAI,EAAE,IAAA;AACxD,IAAAF,EAAA,qBAAc,CAACE,GAAcJ,MAC/B,KAAK,OAAO,QAAQ,MAAA,EAAgB,iBAAiBI,GAAMJ,CAAK,EAAE,IAAA;AAChE,IAAAE,EAAA,+BAAwB,CAACF,MAC3B,KAAK,OAAO,QAAQ,QAAgB,sBAAsBA,CAAK,EAAE,IAAA;AAC/D,IAAAE,EAAA,gCAAyB,MAC3B,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAgB,uBAAA,EAAyB,IAAA;AAC3D,IAAAA,EAAA,sBAAe,CAACyC,GAAkBC,MACpC,KAAK,OAAO,QAAQ,MAAA,EAAgB,aAAaD,GAAUC,CAAQ,EAAE,IAAA;AACnE,IAAA1C,EAAA,wBAAiB,CAACsE,GAAaC,MACjC,KAAK,OAAO,QAAQ,MAAA,EAAgB,eAAeD,GAAKC,CAAK,EAAE,IAAA;AAC7D,IAAAvE,EAAA,4BAAqB,MACvB,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAgB,mBAAA,EAAqB,IAAA;AAGvD;AAAA,IAAAA,EAAA,yBAAkB,MACrB,KAAK,QAAQ,OAAKoE,EAAE,gBAAgB,YAAY;AAC7C,IAAApE,EAAA,cAAO,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,MAAM;AACvC,IAAApE,EAAA,cAAO,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,MAAM;AACvC,IAAApE,EAAA,mBAAY,MAAM,KAAK,QAAQ,CAAAoE,MAAKA,EAAE,WAAW;AAGjD;AAAA,IAAApE,EAAA,0BAAmB,MACrB,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAgB,iBAAA,EAAmB,IAAA;AACrD,IAAAA,EAAA,2BAAoB,MACtB,KAAK,OAAO,MAAA,EAAQ,MAAA,EAAgB,kBAAA,EAAoB,IAAA;AAGtD;AAAA,IAAAA,EAAA,cAAO,CAAC+E,GAAenE,MACzB,KAAK,OAAO,SAAiB,SAASmE,GAAOnE,CAAO;AAClD,IAAAZ,EAAA,kBAAW,MAAO,KAAK,OAAO,SAAiB,cAAA;AAC/C,IAAAA,EAAA,kBAAW,MAAO,KAAK,OAAO,SAAiB,kBAAA;AAC/C,IAAAA,EAAA,iBAAU,CAACuO,GAAW,GAAW1F,MACnC,KAAK,OAAO,SAAiB,YAAY0F,GAAG,GAAG1F,CAAI;AACjD,IAAA7I,EAAA,oBAAa,CAACuO,GAAW,GAAW1F,MACtC,KAAK,OAAO,SAAiB,eAAe0F,GAAG,GAAG1F,CAAI;AACpD,IAAA7I,EAAA,qBAAc,MAAO,KAAK,OAAO,SAAiB,YAAA;AAGlD;AAAA,IAAAA,EAAA,6BAAsB,CAACwO,MACzB,KAAK,OAAO,QAAQ,QAAgB,oBAAoBA,CAAK,EAAE,IAAA;AAG7D;AAAA,IAAAxO,EAAA,oBAAa,CAACyO,MAAsB,KAAK,QAAQ,aAAaA,CAAQ;AACtE,IAAAzO,EAAA,wBAAiB,CAACyO,MAAsB,KAAK,QAAQ,iBAAiBA,CAAQ;AAC9E,IAAAzO,EAAA,oBAAa,CAACyO,MAAsB,KAAK,QAAQ,aAAaA,CAAQ;AACtE,IAAAzO,EAAA,oBAAa,CAACyO,MAAsB,KAAK,QAAQ,aAAaA,CAAQ;AACtE,IAAAzO,EAAA,kBAAW,CAACY,MAAkB,KAAK,QAAQ,WAAWA,CAAO;AApKhE,SAAK,SAASC;AAAA,EAClB;AAAA,EAEO,QAAQ6N,GAAyB;AACpC,WAAOA,EAAG,KAAK,OAAO,MAAA,EAAQ,MAAA,CAAO,EAAE,IAAA;AAAA,EAC3C;AAAA,EAEA,IAAY,SAAc;AAAE,WAAQ,KAAK,OAAe,QAAQ;AAAA,EAAQ;AA8J5E;ACtKA,MAAMC,KACDC,EAAkB,UAAWA,EAAkB,SAAS,UAAWA,GAWlEC,IAAiB,MACjBC,KAAe,KACfC,KAAe,MACfC,IAAe,IAEfC,KAAoD;AAAA,EACtD,IAAI,CAAC,OAAO,KAAK;AAAA,EACjB,IAAI,CAAC,OAAO,KAAK;AAAA,EACjB,IAAI,CAAC,MAAM,KAAK;AAAA,EAChB,QAAQ,CAAC,OAAO,KAAK;AAAA,EACrB,OAAO,CAAC,OAAO,KAAK;AAAA,EACpB,SAAS,CAAC,OAAO,KAAK;AAC1B,GAEMC,KAAgF;AAAA,EAClF,GAAGC,EAAa;AAAA,EAChB,GAAGA,EAAa;AAAA,EAChB,GAAGA,EAAa;AAAA,EAChB,GAAGA,EAAa;AAAA,EAChB,GAAGA,EAAa;AAAA,EAChB,GAAGA,EAAa;AACpB;AA8BO,MAAMC,GAAa;AAAA,EAGtB,YAAYC,GAA8B;AAFlC,IAAArP,EAAA,sBAA8B,CAAA;AAAA,EAItC;AAAA,EAEA,MAAa,aAAa4N,GAAWhN,IAAyB,IAAmB;AAC7E,UAAM0O,IAAO,MAAM,KAAK,OAAO1B,GAAMhN,CAAO;AAC5C,IAAA+N,GAAOW,GAAM1O,EAAQ,YAAY,eAAe;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,OAAOgN,GAAWhN,IAAyB,IAAmB;AAGvE,SAAK,eAAesC,GAAgB0K,CAAI;AACxC,UAAM2B,IAAkB,MAAM,KAAK,aAAa3B,GAAM,WAAW,CAAA,GAAI,MAAS,GACxE4B,IAAYC,GAA4B7O,EAAQ,UAAU,GAE1DvB,IAAM,IAAIqQ,GAAS;AAAA,MACrB,SAAS;AAAA,MACT,aAAa;AAAA,MACb,QAAQ9O,EAAQ,YAAY,YAAY,QAAQ,YAAY,EAAE;AAAA,MAC9D,WAAW,EAAE,QAAQ,KAAK,kBAAgB;AAAA,MAC1C,UAAU;AAAA,QACN;AAAA,UACI,YAAY4O;AAAA,UACZ,UAAUD;AAAA,QAAA;AAAA,MACd;AAAA,IACJ,CACH;AAED,WAAOI,GAAO,OAAOtQ,CAAG;AAAA,EAC5B;AAAA;AAAA,EAIA,MAAc,aAAawO,GAActK,GAAoD;AACzF,UAAMqM,IAA6B,CAAA;AACnC,eAAWrQ,KAAQsO,KAAS,IAAI;AAC5B,YAAMtE,IAAI,MAAM,KAAK,YAAYhK,GAAMgE,CAAI;AAC3C,MAAI,MAAM,QAAQgG,CAAC,IAAGqG,EAAI,KAAK,GAAGrG,CAAC,IAC1BA,KAAGqG,EAAI,KAAKrG,CAAC;AAAA,IAC1B;AACA,WAAOqG;AAAA,EACX;AAAA,EAEA,MAAc,YAAYrQ,GAAWgE,GAA+E;AAChH,QAAI,CAAChE,KAAQ,OAAOA,KAAS,YAAY,CAACA,EAAK,KAAM,QAAO;AAC5D,YAAQA,EAAK,MAAA;AAAA,MACT,KAAK;AAAa,eAAO,KAAK,iBAAiBA,GAAMgE,CAAI;AAAA,MACzD,KAAK;AAAW,eAAO,KAAK,eAAehE,CAAI;AAAA,MAC/C,KAAK;AAAc,eAAO,KAAK,kBAAkBA,CAAI;AAAA,MACrD,KAAK;AAAa,eAAO,KAAK,iBAAiBA,CAAI;AAAA,MACnD,KAAK;AACD,eAAO,IAAIsQ,EAAU;AAAA,UACjB,UAAU,CAAC,IAAIC,EAAQ,EAAE,CAAC;AAAA,UAC1B,QAAQ,EAAE,QAAQ,EAAE,OAAO,UAAU,OAAO,GAAG,OAAOC,EAAY,QAAQ,MAAM,IAAE;AAAA,QAAE,CACvF;AAAA,MACL,KAAK;AACD,eAAO,IAAIF,EAAU,EAAE,UAAU,CAAC,IAAIC,EAAQ,EAAE,MAAM,IAAI,OAAO,EAAA,CAAG,CAAC,GAAG,iBAAiB,IAAM;AAAA,MACnG,KAAK;AAAS,eAAO,MAAM,KAAK,aAAavQ,CAAI;AAAA,MACjD,KAAK;AACD,eAAO,KAAK,YAAYA,GAAM,EAAE,WAAW,aAAa,QAAQgE,GAAM,SAAS,MAAM,EAAA,CAAG;AAAA,MAC5F,KAAK,eAAe;AAChB,cAAMyM,IAAgCzQ,EAAK,OAAO,cAAc,WAAW,cAAc;AACzF,eAAO,KAAK,YAAYA,GAAM,EAAE,WAAWyQ,GAAK,QAAQzM,GAAM,SAAS,MAAM,EAAA,CAAG;AAAA,MACpF;AAAA,MACA,KAAK;AAAY,eAAO,KAAK,gBAAgBhE,CAAI;AAAA,MACjD,KAAK;AAAS,eAAO,KAAK,aAAaA,CAAI;AAAA,MAC3C,KAAK;AACD,eAAO,IAAIsQ,EAAU;AAAA,UACjB,UAAU,KAAK,eAAetQ,EAAK,WAAW,CAAA,CAAE;AAAA,UAChD,WAAW0Q,EAAc;AAAA,QAAA,CAC5B;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,eAAO,IAAIJ,EAAU;AAAA,UACjB,UAAU,CAAC,IAAIC,EAAQ,EAAE,MAAMvQ,EAAK,OAAO,SAAS,IAAI,MAAM,eAAA,CAAgB,CAAC;AAAA,QAAA,CAClF;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACD,eAAO,KAAK,aAAaA,EAAK,WAAW,CAAA,CAAE;AAAA,MAC/C,KAAK;AACD,eAAO,KAAK,sBAAsBA,CAAI;AAAA,MAC1C;AACI,eAAI,MAAM,QAAQA,EAAK,OAAO,KAAKA,EAAK,QAAQ,SACrC,KAAK,aAAaA,EAAK,SAASgE,CAAI,IAExC;AAAA,IAAA;AAAA,EAEnB;AAAA;AAAA,EAIQ,iBAAiBhE,GAAWgE,GAA+B;AAC/D,QAAI2M,IAAW,KAAK,eAAe3Q,EAAK,WAAW,CAAA,CAAE;AACrD,IAAI2Q,EAAS,WAAW,MAAGA,IAAW,CAAC,IAAIJ,EAAQ,EAAE,CAAC;AACtD,UAAMjH,IAAY,EAAE,UAAAqH,EAAA;AACpB,WAAI3M,MAAMsF,EAAK,YAAY,EAAE,WAAWtF,EAAK,WAAW,OAAO,KAAK,IAAIA,EAAK,OAAO,CAAC,EAAA,IACrF4M,GAAsB5Q,GAAMsJ,CAAI,GACzB,IAAIgH,EAAUhH,CAAI;AAAA,EAC7B;AAAA,EAEQ,eAAetJ,GAAsB;AACzC,UAAMkB,IAAQ2P,GAAM7Q,EAAK,OAAO,SAAS,GAAG,GAAG,CAAC;AAChD,QAAI2Q,IAAW,KAAK,eAAe3Q,EAAK,WAAW,CAAA,CAAE;AACrD,IAAI2Q,EAAS,WAAW,MAAGA,IAAW,CAAC,IAAIJ,EAAQ,EAAE,CAAC;AACtD,UAAMjH,IAAY,EAAE,UAAAqH,GAAU,SAAShB,GAAYzO,CAAK,EAAA;AACxD,WAAA0P,GAAsB5Q,GAAMsJ,CAAI,GACzB,IAAIgH,EAAUhH,CAAI;AAAA,EAC7B;AAAA,EAEQ,kBAAkBtJ,GAAwB;AAC9C,UAAMqQ,IAAmB,CAAA;AACzB,eAAWS,KAAS9Q,EAAK,WAAW,CAAA,GAAI;AACpC,YAAM+Q,IAAU,KAAK,eAAeD,EAAM,WAAW,CAAA,CAAE;AACvD,MAAAT,EAAI,KAAK,IAAIC,EAAU;AAAA,QACnB,UAAUS,EAAQ,SAASA,IAAU,CAAC,IAAIR,EAAQ,EAAE,CAAC;AAAA,QACrD,QAAQ,EAAE,MAAM,IAAA;AAAA,QAChB,QAAQ;AAAA,UACJ,MAAM,EAAE,OAAO,UAAU,OAAO,IAAI,OAAOC,EAAY,QAAQ,MAAM,GAAA;AAAA,QAAG;AAAA,MAC5E,CACH,CAAC;AAAA,IACN;AACA,WAAOH,EAAI,SAASA,IAAM,CAAC,IAAIC,EAAU,EAAE,UAAU,CAAC,IAAIC,EAAQ,EAAE,CAAC,EAAA,CAAG,CAAC;AAAA,EAC7E;AAAA,EAEQ,sBAAsBvQ,GAAwB;AAClD,UAAMiP,IAAQjP,EAAK,OAAO,SAAS,qBAC7BkD,IAAWlD,EAAK,OAAO,YAAY,GACnCmD,IAAWnD,EAAK,OAAO,YAAY,GACnCgR,IAAahR,EAAK,OAAO,eAAe,IACxCiR,IAAkBjR,EAAK,OAAO,oBAAoB,IAElDqQ,IAAmB,CAAA;AAEzB,IAAAA,EAAI,KAAK,IAAIC,EAAU;AAAA,MACnB,UAAU,CAAC,IAAIC,EAAQ,EAAE,MAAMtB,GAAO,MAAM,IAAM,MAAM,GAAA,CAAI,CAAC;AAAA,MAC7D,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAA;AAAA,MAC/B,QAAQ,EAAE,QAAQ,EAAE,OAAO,UAAU,OAAO,GAAG,OAAOuB,EAAY,QAAQ,MAAM,IAAE;AAAA,IAAE,CACvF,CAAC;AAEF,UAAM9M,IAAQ,KAAK,aAAa,OAAO,CAAAkH,MAAKA,EAAE,SAAS1H,KAAY0H,EAAE,SAASzH,CAAQ;AACtF,QAAIO,EAAM,WAAW;AACjB,aAAA2M,EAAI,KAAK,IAAIC,EAAU;AAAA,QACnB,UAAU,CAAC,IAAIC,EAAQ,EAAE,MAAM,wBAAwB,SAAS,IAAM,OAAO,SAAA,CAAU,CAAC;AAAA,QACxF,SAAS,EAAE,OAAO,IAAA;AAAA,MAAI,CACzB,CAAC,GACKF;AAGX,eAAWpM,KAAQP,GAAO;AACtB,YAAMwN,KAAUjN,EAAK,QAAQf,KAAY,KACnCiO,IAAalN,EAAK,UAAUf,GAC5BkO,IAAc;AAAA,QAChB,IAAIb,EAAQ,EAAE,MAAMtM,EAAK,MAAM,MAAMkN,GAAY;AAAA,MAAA;AAErD,MAAIH,IAEAI,EAAK,KAAK,IAAIb,EAAQ,EAAE,MAAM,MAAM,IAAI,OAAO,EAAE,IAAI,KAAK,OAAO,SAAA,CAAU,CAAC,IACrEU,KACPG,EAAK,KAAK,IAAIb,EAAQ,EAAE,MAAM,KAAA,CAAM,CAAC,GAErCU,KACAG,EAAK,KAAK,IAAIb,EAAQ,EAAE,MAAM,OAAOtM,EAAK,aAAa,GAAG,OAAO,SAAA,CAAU,CAAC,GAEhFoM,EAAI,KAAK,IAAIC,EAAU;AAAA,QACnB,UAAUc;AAAA,QACV,SAAS,EAAE,OAAO,GAAA;AAAA,QAClB,QAAQF,IAAS,EAAE,MAAMA,MAAW;AAAA,QACpC,UAAUF,IACJ,CAAC,EAAE,MAAM,SAAgB,UAAU,KAAM,QAAQ,MAAA,CAAc,IAC/D;AAAA,MAAA,CACT,CAAC;AAAA,IACN;AAGA,WAAAX,EAAI,KAAK,IAAIC,EAAU,EAAE,UAAU,CAAC,IAAIC,EAAQ,EAAE,CAAC,GAAG,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAA,EAAI,CAAG,CAAC,GACtFF;AAAA,EACX;AAAA,EAEQ,iBAAiBrQ,GAAsB;AAC3C,UAAMoE,KAAQpE,EAAK,WAAW,CAAA,GAAI,IAAI,CAAC6E,MAAWA,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK;AAC5E,WAAO,IAAIyL,EAAU;AAAA,MACjB,UAAU,CAAC,IAAIC,EAAQ,EAAE,MAAAnM,GAAM,MAAM,YAAY,MAAM,GAAA,CAAI,CAAC;AAAA,MAC5D,SAAS,EAAE,MAAMiN,GAAY,OAAO,MAAM,UAAU,OAAO,OAAA;AAAA,MAC3D,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAA;AAAA,MAC/B,QAAQ;AAAA,QACJ,KAAQ,EAAE,OAAO,UAAU,OAAO,GAAG,OAAOb,EAAY,QAAQ,MAAM,EAAA;AAAA,QACtE,QAAQ,EAAE,OAAO,UAAU,OAAO,GAAG,OAAOA,EAAY,QAAQ,MAAM,EAAA;AAAA,QACtE,MAAQ,EAAE,OAAO,UAAU,OAAO,GAAG,OAAOA,EAAY,QAAQ,MAAM,EAAA;AAAA,QACtE,OAAQ,EAAE,OAAO,UAAU,OAAO,GAAG,OAAOA,EAAY,QAAQ,MAAM,EAAA;AAAA,MAAE;AAAA,IAC5E,CACH;AAAA,EACL;AAAA,EAEA,MAAc,aAAaxQ,GAA+B;AACtD,UAAM+F,IAA0B/F,EAAK,OAAO,KACtC4O,IAAY0C,GAAatR,EAAK,OAAO,SAAS,KAAK0Q,EAAc;AACvE,QAAI,CAAC3K,EAAK,QAAO,IAAIuK,EAAU,EAAE,UAAU,CAAC,IAAIC,EAAQ,EAAE,CAAC,GAAG;AAE9D,UAAMgB,IAAO,MAAMC,GAAezL,CAAG;AACrC,QAAI,CAACwL;AAED,aAAO,IAAIjB,EAAU;AAAA,QACjB,UAAU,CAAC,IAAIC,EAAQ,EAAE,MAAM,WAAWvQ,EAAK,OAAO,OAAO+F,CAAG,KAAK,SAAS,IAAM,OAAO,SAAA,CAAU,CAAC;AAAA,QACtG,WAAA6I;AAAA,MAAA,CACH;AAEL,UAAM6C,IAAMC,GAAe1R,EAAK,KAAK;AACrC,QAAI;AACA,YAAM2R,IAAW,IAAIC,GAAS;AAAA,QAC1B,MAAML,EAAK;AAAA,QACX,MAAMA,EAAK;AAAA,QACX,gBAAgBE;AAAA,MAAA,CACZ;AACR,aAAO,IAAInB,EAAU,EAAE,UAAU,CAACqB,CAAQ,GAAG,WAAA/C,GAAW;AAAA,IAC5D,SAAS9K,GAAG;AACR,qBAAQ,KAAK,kCAAkCA,CAAC,GACzC,IAAIwM,EAAU;AAAA,QACjB,UAAU,CAAC,IAAIC,EAAQ,EAAE,MAAM,WAAWvQ,EAAK,OAAO,OAAO,EAAE,KAAK,SAAS,IAAM,OAAO,SAAA,CAAU,CAAC;AAAA,QACrG,WAAA4O;AAAA,MAAA,CACH;AAAA,IACL;AAAA,EACJ;AAAA;AAAA,EAIA,MAAc,YAAY5O,GAAWgE,GAAyC;AAC1E,UAAMqM,IAAmB,CAAA;AACzB,eAAWpM,KAAQjE,EAAK,WAAW,CAAA;AAC/B,UAAIiE,GAAM,SAAS;AACnB,mBAAW6M,KAAS7M,EAAK,WAAW,CAAA;AAChC,cAAI6M,EAAM,SAAS;AACf,YAAAT,EAAI,KAAK,KAAK,iBAAiBS,GAAO9M,CAAI,CAAC;AAAA,mBACpC8M,EAAM,SAAS,gBAAgBA,EAAM,SAAS,eAAe;AACpE,kBAAMe,IAAyB;AAAA,cAC3B,WAAWf,EAAM,OAAO,cAAc,WAChC,cACCA,EAAM,SAAS,eAAe,cAAc;AAAA,cACnD,OAAO9M,EAAK,QAAQ;AAAA,YAAA,GAElB8N,IAAS,MAAM,KAAK,YAAYhB,GAAOe,CAAS;AACtD,YAAAxB,EAAI,KAAK,GAAGyB,CAAM;AAAA,UACtB;AAAA;AAGR,WAAOzB;AAAA,EACX;AAAA,EAEQ,gBAAgBrQ,GAAwB;AAC5C,UAAMqQ,IAAmB,CAAA;AACzB,eAAWpM,KAAQjE,EAAK,WAAW,CAAA,GAAI;AACnC,UAAIiE,GAAM,SAAS,WAAY;AAE/B,YAAM8N,IADU,CAAC,CAAC9N,EAAK,OAAO,UACL,OAAO;AAChC,iBAAW6M,KAAS7M,EAAK,WAAW,CAAA;AAChC,YAAI6M,EAAM,SAAS,aAAa;AAC5B,gBAAMC,IAAU,KAAK,eAAeD,EAAM,WAAW,CAAA,CAAE;AACvD,UAAAT,EAAI,KAAK,IAAIC,EAAU,EAAE,UAAU,CAAC,IAAIC,EAAQwB,CAAM,GAAG,GAAGhB,CAAO,EAAA,CAAG,CAAC;AAAA,QAC3E;AAAA,IAER;AACA,WAAOV,EAAI,SAASA,IAAM,CAAC,IAAIC,EAAU,EAAE,UAAU,CAAC,IAAIC,EAAQ,EAAE,CAAC,EAAA,CAAG,CAAC;AAAA,EAC7E;AAAA;AAAA,EAIA,MAAc,aAAavQ,GAA2B;AAClD,UAAMgS,IAAmB,CAAA;AACzB,eAAWC,KAAOjS,EAAK,WAAW,CAAA;AAC9B,MAAIiS,GAAK,SAAS,cAClBD,EAAK,KAAK,MAAM,KAAK,gBAAgBC,CAAG,CAAC;AAE7C,WAAID,EAAK,WAAW,KAEhBA,EAAK,KAAK,IAAIE,GAAS,EAAE,UAAU,CAAC,IAAIC,EAAU,EAAE,UAAU,CAAC,IAAI7B,EAAU,EAAE,UAAU,CAAC,IAAIC,EAAQ,EAAE,CAAC,EAAA,CAAG,CAAC,EAAA,CAAG,CAAC,EAAA,CAAG,CAAC,GAElH,IAAI6B,GAAM;AAAA,MACb,OAAO,EAAE,MAAM,KAAK,MAAMC,GAAU,WAAA;AAAA,MACpC,MAAAL;AAAA,IAAA,CACH;AAAA,EACL;AAAA,EAEA,MAAc,gBAAgBhS,GAA8B;AACxD,UAAMsS,IAAqB,CAAA;AAC3B,eAAWC,KAAQvS,EAAK,WAAW,CAAA;AAC/B,MAAAsS,EAAM,KAAK,MAAM,KAAK,iBAAiBC,CAAI,CAAC;AAEhD,WAAID,EAAM,WAAW,KACjBA,EAAM,KAAK,IAAIH,EAAU,EAAE,UAAU,CAAC,IAAI7B,EAAU,EAAE,UAAU,CAAC,IAAIC,EAAQ,EAAE,CAAC,EAAA,CAAG,CAAC,EAAA,CAAG,CAAC,GAErF,IAAI2B,GAAS,EAAE,UAAUI,GAAO;AAAA,EAC3C;AAAA,EAEA,MAAc,iBAAiBtS,GAA+B;AAC1D,UAAMO,IAAQP,EAAK,SAAS,CAAA,GACtBwS,IAAWxS,EAAK,SAAS,eACzByS,IAAe,MAAM,KAAK,aAAazS,EAAK,WAAW,EAAE,GAEzD2Q,IAAkC,CAAA;AACxC,eAAW9L,KAAK4N,EAAc,CAAA9B,EAAS,KAAK9L,CAAC;AAC7C,KAAI8L,EAAS,WAAW,KAAK,EAAEA,EAAS,CAAC,aAAaL,OAClDK,EAAS,QAAQ,IAAIL,EAAU,EAAE,UAAU,CAAC,IAAIC,EAAQ,EAAE,CAAC,EAAA,CAAG,CAAC,GAE7DI,EAASA,EAAS,SAAS,CAAC,aAAaL,KAC3CK,EAAS,KAAK,IAAIL,EAAU,EAAE,UAAU,CAAC,IAAIC,EAAQ,EAAE,CAAC,EAAA,CAAG,CAAC;AAGhE,QAAImC;AACJ,UAAMC,IAAKpS,EAAM,cAAcA,EAAM;AACrC,WAAIoS,MAAID,IAAOE,GAAWD,CAAE,IACxBH,KAAY,CAACE,MAAMA,IAAO,WAEvB,IAAIP,EAAU;AAAA,MACjB,UAAAxB;AAAA,MACA,YAAYpQ,EAAM,WAAW;AAAA,MAC7B,SAASA,EAAM,WAAW;AAAA,MAC1B,eAAesS,GAAc;AAAA,MAC7B,SAASH,IAAO,EAAE,MAAAA,GAAM,MAAMrB,GAAY,OAAO,OAAO,WAAW;AAAA,IAAA,CACtE;AAAA,EACL;AAAA;AAAA,EAIQ,eAAeN,GAAuB;AAC1C,UAAMV,IAAa,CAAA;AACnB,eAAWyC,KAAU/B,KAAW,IAAI;AAChC,UAAI,CAAC+B,KAAU,OAAOA,KAAW,SAAU;AAC3C,UAAIA,EAAO,SAAS,aAAa;AAC7B,QAAAzC,EAAI,KAAK,IAAIE,EAAQ,EAAE,MAAM,IAAI,OAAO,EAAA,CAAG,CAAC;AAC5C;AAAA,MACJ;AACA,UAAIuC,EAAO,SAAS,cAAc;AAC9B,QAAAzC,EAAI,KAAK,IAAIE,EAAQ,EAAE,MAAMuC,EAAO,OAAO,SAAS,IAAI,MAAM,eAAA,CAAgB,CAAC;AAC/E;AAAA,MACJ;AACA,UAAIA,EAAO,SAAS,YAAY;AAC5B,cAAM9N,IAAQ8N,EAAO,OAAO,SAASA,EAAO,OAAO,OAAO;AAC1D,QAAAzC,EAAI,KAAK,IAAIE,EAAQ,EAAE,MAAM,IAAIvL,CAAK,KAAK,aAAa,GAAA,CAAM,CAAC;AAC/D;AAAA,MACJ;AACA,UAAI8N,EAAO,SAAS,YAAY;AAE5B,cAAM1O,IAAO0O,EAAO,SAAS,IAAI,CAACjO,MAAWA,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK;AACvE,QAAAwL,EAAI,KAAK,IAAIE,EAAQ,EAAE,MAAAnM,GAAM,SAAS,IAAM,aAAa,GAAA,CAAM,CAAC;AAChE;AAAA,MACJ;AACA,UAAI0O,EAAO,SAAS,QAAQ;AACxB,QAAI,MAAM,QAAQA,EAAO,OAAO,KAAGzC,EAAI,KAAK,GAAG,KAAK,eAAeyC,EAAO,OAAO,CAAC;AAClF;AAAA,MACJ;AAEA,YAAM/L,IAAM,KAAK,cAAc+L,EAAO,SAAS,CAAA,CAAE;AACjD,MAAI/L,EAAI,OACJsJ,EAAI,KAAK,IAAI0C,GAAkB;AAAA,QAC3B,MAAMhM,EAAI;AAAA,QACV,UAAU,CAAC,IAAIwJ,EAAQ,EAAE,MAAMuC,EAAO,QAAQ,IAAI,GAAGE,GAAYjM,CAAG,GAAG,OAAOA,EAAI,SAAS,UAAU,WAAW,EAAE,MAAMkM,GAAc,OAAA,GAAU,CAAC;AAAA,MAAA,CACpJ,CAAC,IAEF5C,EAAI,KAAK,IAAIE,EAAQ,EAAE,MAAMuC,EAAO,QAAQ,IAAI,GAAGE,GAAYjM,CAAG,EAAA,CAAG,CAAC;AAAA,IAE9E;AACA,WAAOsJ;AAAA,EACX;AAAA,EAEQ,cAAc7J,GAA4B;AAC9C,UAAMO,IAAoB,CAAA;AAC1B,eAAWJ,KAAQH,KAAS;AACxB,cAAQG,EAAK,MAAA;AAAA,QACT,KAAK;AAAQ,UAAAI,EAAI,OAAO;AAAM;AAAA,QAC9B,KAAK;AAAU,UAAAA,EAAI,SAAS;AAAM;AAAA,QAClC,KAAK;AAAa,UAAAA,EAAI,YAAY;AAAM;AAAA,QACxC,KAAK;AAAU,UAAAA,EAAI,SAAS;AAAM;AAAA,QAClC,KAAK;AAAa,UAAAA,EAAI,YAAY;AAAM;AAAA,QACxC,KAAK;AAAe,UAAAA,EAAI,cAAc;AAAM;AAAA,QAC5C,KAAK;AAAQ,UAAAA,EAAI,OAAO;AAAM;AAAA,QAC9B,KAAK;AAAQ,UAAAA,EAAI,OAAOJ,EAAK,OAAO,QAAQ;AAAW;AAAA,QACvD,KAAK,aAAa;AACd,gBAAMuM,IAAMN,GAAWjM,EAAK,OAAO,KAAK;AACxC,UAAIuM,QAAS,YAAYA;AACzB;AAAA,QACJ;AAAA,QACA,KAAK,aAAa;AACd,gBAAM,IAAIvM,EAAK,SAAS,CAAA;AACxB,cAAI,EAAE,OAAO;AACT,kBAAMuM,IAAMN,GAAW,EAAE,KAAK;AAC9B,YAAIM,QAAS,QAAQA;AAAA,UACzB;AAIA,cAHI,EAAE,eACFnM,EAAI,OAAO,OAAO,EAAE,UAAU,EAAE,QAAQ,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,UAAU,SAE7E,EAAE,UAAU;AACZ,kBAAM2H,IAAOyE,GAAc,EAAE,QAAQ;AACrC,YAAIzE,QAAU,OAAOA;AAAA,UACzB;AACA;AAAA,QACJ;AAAA,QACA,KAAK;AAAe,UAAA3H,EAAI,QAAQ,UAAUA,EAAI,YAAY;AAAM;AAAA,QAChE,KAAK;AAAe,UAAAA,EAAI,QAAQ,UAAUA,EAAI,SAAS;AAAM;AAAA,MAAA;AAGrE,WAAOA;AAAA,EACX;AAAA;AAAA,EAIQ,kBAAqE;AACzE,UAAMqM,IAA4B,MAAM,KAAK,EAAE,QAAQ,EAAA,GAAK,CAACC,GAAGnS,OAAW;AAAA,MACvE,OAAAA;AAAA,MACA,QAAQoS,EAAY;AAAA,MACpB,MAAM,IAAIpS,IAAQ,CAAC;AAAA,MACnB,WAAWwP,EAAc;AAAA,MACzB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAOxP,IAAQ,KAAK,KAAK,SAAS,IAAA,IAAM;AAAA,IAAE,EAC5E,GAEIqS,IADU,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,EACnB,IAAI,CAACC,GAAGtS,OAAW;AAAA,MACxD,OAAAA;AAAA,MACA,QAAQoS,EAAY;AAAA,MACpB,MAAME;AAAA,MACN,WAAW9C,EAAc;AAAA,MACzB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAOxP,IAAQ,KAAK,KAAK,SAAS,IAAA,IAAM;AAAA,IAAE,EAC5E,GACIuS,IAA2B,MAAM,KAAK,EAAE,QAAQ,EAAA,GAAK,CAACJ,GAAGnS,OAAW;AAAA,MACtE,OAAAA;AAAA,MACA,QAAQoS,EAAY;AAAA,MACpB,MAAM,IAAIpS,IAAQ,CAAC;AAAA,MACnB,WAAWwP,EAAc;AAAA,MACzB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAOxP,IAAQ,KAAK,KAAK,SAAS,IAAA,IAAM;AAAA,IAAE,EAC5E;AACF,WAAO;AAAA,MACH,EAAE,WAAW,cAAc,QAAQkS,EAAA;AAAA,MACnC,EAAE,WAAW,aAAa,QAAQG,EAAA;AAAA,MAClC,EAAE,WAAW,aAAa,QAAQE,EAAA;AAAA,IAAO;AAAA,EAEjD;AACJ;AAMA,SAAST,GAAYjM,GAAgC;AAEjD,QAAMuC,IAA4B,CAAA;AAClC,SAAIvC,EAAI,SAAMuC,EAAK,OAAO,KACtBvC,EAAI,WAAQuC,EAAK,UAAU,KAC3BvC,EAAI,WAAQuC,EAAK,SAAS,KAC1BvC,EAAI,cAAWuC,EAAK,YAAY,EAAE,MAAM2J,GAAc,OAAA,IACtDlM,EAAI,cAAWuC,EAAK,YAAY,KAChCvC,EAAI,gBAAauC,EAAK,cAAc,KACpCvC,EAAI,UAAOuC,EAAK,QAAQvC,EAAI,QAC5BA,EAAI,SAAMuC,EAAK,OAAOvC,EAAI,OAC1BA,EAAI,SAAMuC,EAAK,OAAOvC,EAAI,OAC1BA,EAAI,SACJuC,EAAK,OAAOA,EAAK,QAAQ,YACpBA,EAAK,SAAMA,EAAK,OAAO,MAE5BvC,EAAI,cAGJuC,EAAK,UAAU,EAAE,MAAM+H,GAAY,OAAO,MAAMtK,EAAI,WAAW,OAAO,OAAA,IAEnEuC;AACX;AAEA,SAASsH,GAAsB5Q,GAAWsJ,GAAW;AACjD,QAAM/I,IAAQP,EAAK,SAAS,CAAA,GACtBhB,IAAe,CAAA,GACf0U,IAASC,EAAkBpT,EAAM,iBAAiBA,EAAM,SAAS,GACjEqT,IAAQD,EAAkBpT,EAAM,gBAAgBA,EAAM,YAAY,GAClEsT,IAAOtT,EAAM,aAAa,KAAK,MAAM,WAAWA,EAAM,UAAU,IAAI,GAAG,IAAI;AACjF,EAAImT,MAAW,WAAW1U,EAAQ,SAAS0U,IACvCE,MAAU,WAAW5U,EAAQ,QAAQ4U,IACrCC,MAAS,UAAa,CAAC,MAAMA,CAAI,MAAK7U,EAAQ,OAAO6U,GAAM7U,EAAQ,WAAW,SAC9E,OAAO,KAAKA,CAAO,EAAE,aAAa,UAAUA;AAEhD,QAAMkS,IAAc,CAAA,GACd4C,IAAOC,GAAiBxT,EAAM,MAAM,GACpCyT,IAAYD,GAAiBxT,EAAM,eAAe;AACxD,EAAIuT,MAAS,WAAW5C,EAAO,OAAO4C,IAClCE,MAAc,WAAW9C,EAAO,YAAY8C,IAC5C,OAAO,KAAK9C,CAAM,EAAE,aAAa,SAASA;AAE9C,QAAM+C,IAAQ3C,GAAa/Q,EAAM,SAAS;AAC1C,EAAI0T,QAAY,YAAYA;AAChC;AAEA,SAAS3C,GAAa2C,GAAgF;AAClG,UAAQA,GAAA;AAAA,IACJ,KAAK;AAAU,aAAOvD,EAAc;AAAA,IACpC,KAAK;AAAS,aAAOA,EAAc;AAAA,IACnC,KAAK;AAAW,aAAOA,EAAc;AAAA,IACrC,KAAK;AAAQ,aAAOA,EAAc;AAAA,IAClC;AAAS;AAAA,EAAO;AAExB;AAEA,SAASiD,EAAkB9E,GAAgC;AACvD,MAAIA,KAAS,QAAQA,MAAU,GAAI;AACnC,MAAI,OAAOA,KAAU,iBAAiB,KAAK,MAAMA,IAAQY,CAAY;AACrE,QAAM7K,IAAI,OAAOiK,CAAK,EAAE,KAAA,GAClBqF,IAAM,WAAWtP,CAAC;AACxB,MAAI,OAAMsP,CAAG;AACb,WAAItP,EAAE,SAAS,IAAI,IAAU,KAAK,MAAMsP,IAAM5E,CAAc,IACxD1K,EAAE,SAAS,IAAI,IAAU,KAAK,MAAMsP,IAAM3E,EAAY,IACtD3K,EAAE,SAAS,IAAI,IAAU,KAAK,MAAMsP,IAAM1E,EAAY,IACtD5K,EAAE,SAAS,IAAI,IAAU,KAAK,MAAMsP,IAAMzE,CAAY,IACtD7K,EAAE,SAAS,IAAI,IAAU,KAAK,MAAMsP,IAAM,EAAE,IAC5CtP,EAAE,SAAS,IAAI,KAAKA,EAAE,SAAS,KAAK,IAAU,KAAK,MAAMsP,IAAM,GAAG,IAC/D,KAAK,MAAMA,IAAMzE,CAAY;AACxC;AAEA,SAASsE,GAAiBlF,GAAgC;AACtD,MAAIA,KAAS,QAAQA,MAAU,GAAI;AACnC,MAAI,OAAOA,KAAU,iBAAiB,KAAK,MAAMA,IAAQ,GAAG;AAC5D,QAAMjK,IAAI,OAAOiK,CAAK,EAAE,KAAA,GAClBqF,IAAM,WAAWtP,CAAC;AACxB,MAAI,OAAMsP,CAAG;AACb,WAAItP,EAAE,SAAS,IAAI,IAAU,KAAK,MAAMsP,IAAM5E,CAAc,IACxD1K,EAAE,SAAS,IAAI,IAAU,KAAK,MAAMsP,IAAM3E,EAAY,IACtD3K,EAAE,SAAS,IAAI,IAAU,KAAK,MAAMsP,IAAM1E,EAAY,IACtD5K,EAAE,SAAS,IAAI,IAAU,KAAK,MAAMsP,IAAMzE,CAAY,IACtD7K,EAAE,SAAS,IAAI,IAAU,KAAK,MAAMsP,IAAM,EAAE,IACzC,KAAK,MAAMA,IAAM,GAAG;AAC/B;AAEA,SAASf,GAAczE,GAA+B;AAClD,MAAIA,KAAQ,QAAQA,MAAS,GAAI;AACjC,QAAM9J,IAAI,OAAO8J,CAAI,EAAE,KAAA,GACjBwF,IAAM,WAAWtP,CAAC;AACxB,MAAI,QAAMsP,CAAG,KAAKA,KAAO;AACzB,WAAItP,EAAE,SAAS,IAAI,IAAU,KAAK,IAAI,GAAG,KAAK,MAAOsP,IAAM,OAAQ,CAAC,CAAC,IACjEtP,EAAE,SAAS,IAAI,KAAKA,EAAE,SAAS,KAAK,IAAU,KAAK,IAAI,GAAG,KAAK,MAAMsP,IAAM,KAAK,CAAC,CAAC,IAC/E,KAAK,IAAI,GAAG,KAAK,MAAMA,IAAM,CAAC,CAAC;AAC1C;AAEA,SAAStB,GAAW3M,GAAgC;AAChD,MAAI,CAACA,EAAO;AACZ,QAAMrB,IAAI,OAAOqB,CAAK,EAAE,KAAA;AACxB,MAAI,CAACrB,EAAG;AACR,MAAIA,EAAE,WAAW,GAAG,GAAG;AACnB,QAAIsO,IAAMtO,EAAE,MAAM,CAAC;AAEnB,QADIsO,EAAI,WAAW,MAAGA,IAAMA,EAAI,MAAM,EAAE,EAAE,IAAI,CAAArO,MAAKA,IAAIA,CAAC,EAAE,KAAK,EAAE,IAC7D,mBAAmB,KAAKqO,CAAG,EAAG,QAAOA,EAAI,YAAA;AAAA,EACjD;AACA,MAAItO,EAAE,WAAW,KAAK,GAAG;AACrB,UAAMuP,IAAQvP,EAAE,MAAM,MAAM;AAC5B,QAAIuP,KAASA,EAAM,UAAU,GAAG;AAC5B,YAAM,CAACnK,GAAGoK,GAAGZ,CAAC,IAAIW,EAAM,MAAM,GAAG,CAAC,EAAE,IAAI,OAAK,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,SAAS7Q,GAAG,EAAE,CAAC,CAAC,CAAC;AACxF,cAAS0G,KAAK,KAAOoK,KAAK,IAAKZ,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,EAAE,YAAA;AAAA,IACpE;AAAA,EACJ;AAKA,SAJsC;AAAA,IAClC,OAAO;AAAA,IAAU,OAAO;AAAA,IAAU,KAAK;AAAA,IAAU,OAAO;AAAA,IAAU,MAAM;AAAA,IACxE,QAAQ;AAAA,IAAU,QAAQ;AAAA,IAAU,QAAQ;AAAA,IAAU,MAAM;AAAA,IAAU,MAAM;AAAA,EAAA,EAEnE5O,EAAE,aAAa;AAChC;AAEA,SAASiM,GAAMvN,GAAW+Q,GAAYC,GAAoB;AACtD,SAAO,KAAK,IAAIA,GAAI,KAAK,IAAID,GAAI/Q,CAAC,CAAC;AACvC;AAEA,SAAS4M,GAA4BqE,GAA0C;AAC3E,QAAMC,IAAcD,GAAQ,gBAAgB,cACtCE,EAAgB,YAChBA,EAAgB,UAChBC,IAAUH,GAAQ,YAAY,MAC9BI,IAAOjF,GAAgBgF,CAAO,KAAKhF,GAAgB,IACnD,CAAC/E,GAAGC,CAAC,IAAI4J,MAAgBC,EAAgB,YAAY,CAACE,EAAK,CAAC,GAAGA,EAAK,CAAC,CAAC,IAAIA,GAE1EC,IAAUL,GAAQ,WAAW,EAAE,KAAK,OAAO,QAAQ,OAAO,MAAM,OAAO,OAAO,MAAA;AACpF,SAAO;AAAA,IACH,MAAM;AAAA,MACF,MAAM,EAAE,OAAO5J,GAAG,QAAQC,GAAG,aAAA4J,EAAA;AAAA,MAC7B,QAAQ;AAAA,QACJ,KAAKb,EAAkBiB,EAAQ,GAAG,KAAKtF;AAAA,QACvC,QAAQqE,EAAkBiB,EAAQ,MAAM,KAAKtF;AAAA,QAC7C,MAAMqE,EAAkBiB,EAAQ,IAAI,KAAKtF;AAAA,QACzC,OAAOqE,EAAkBiB,EAAQ,KAAK,KAAKtF;AAAA,MAAA;AAAA,IAC/C;AAAA,EACJ;AAER;AAEA,eAAekC,GAAezL,GAAyF;AACnH,MAAI;AACA,QAAIA,EAAI,WAAW,OAAO,GAAG;AACzB,YAAM6D,IAAQ7D,EAAI,MAAM,4BAA4B;AACpD,UAAI,CAAC6D,EAAO,QAAO;AACnB,YAAMiL,IAAOjL,EAAM,CAAC;AAEpB,UAAIiL,EAAK,SAAS,KAAK,EAAG,QAAO;AACjC,YAAMC,IAAM,KAAKlL,EAAM,CAAC,CAAC,GACnBmL,IAAQ,IAAI,WAAWD,EAAI,MAAM;AACvC,eAAS7K,IAAI,GAAGA,IAAI6K,EAAI,QAAQ7K,IAAK,CAAA8K,EAAM9K,CAAC,IAAI6K,EAAI,WAAW7K,CAAC;AAChE,YAAMnL,IAAOkW,GAAeH,CAAI;AAChC,aAAO/V,IAAO,EAAE,OAAAiW,GAAO,MAAAjW,MAAS;AAAA,IACpC;AACA,UAAMmW,IAAM,MAAM,MAAMlP,CAAG;AAC3B,QAAI,CAACkP,EAAI,GAAI,QAAO;AACpB,UAAMC,IAAM,MAAMD,EAAI,YAAA,GAChBJ,IAAOI,EAAI,QAAQ,IAAI,cAAc,KAAKE,GAAiBpP,CAAG;AACpE,QAAI8O,EAAK,SAAS,KAAK,EAAG,QAAO;AACjC,UAAM/V,IAAOkW,GAAeH,CAAI;AAChC,WAAO/V,IAAO,EAAE,OAAO,IAAI,WAAWoW,CAAG,GAAG,MAAApW,MAAS;AAAA,EACzD,SAAS,GAAG;AACR,mBAAQ,KAAK,qCAAqCiH,GAAK,CAAC,GACjD;AAAA,EACX;AACJ;AAEA,SAASiP,GAAeH,GAAoD;AACxE,SAAIA,EAAK,SAAS,KAAK,IAAU,QAC7BA,EAAK,SAAS,MAAM,KAAKA,EAAK,SAAS,KAAK,IAAU,QACtDA,EAAK,SAAS,KAAK,IAAU,QAC7BA,EAAK,SAAS,KAAK,IAAU,QAC1B;AACX;AAEA,SAASM,GAAiBpP,GAAqB;AAC3C,QAAMa,IAAIb,EAAI,MAAM,GAAG,EAAE,CAAC,EAAE,YAAA;AAC5B,SAAIa,EAAE,SAAS,MAAM,IAAU,cAC3BA,EAAE,SAAS,MAAM,KAAKA,EAAE,SAAS,OAAO,IAAU,eAClDA,EAAE,SAAS,MAAM,IAAU,cAC3BA,EAAE,SAAS,MAAM,IAAU,cAC3BA,EAAE,SAAS,MAAM,IAAU,kBACxB;AACX;AAEA,SAAS8K,GAAenR,GAA+C;AACnE,QAAMoK,IAAIyK,GAAiB7U,GAAO,KAAK,GACjCqK,IAAIwK,GAAiB7U,GAAO,MAAM,GAClCsB,IAAQ8I,KAAKA,IAAI,IAAIA,IAAI,KACzBlI,IAASmI,KAAKA,IAAI,IAAIA,IAAI,KAAK,MAAM/I,IAAQ,IAAI;AACvD,SAAO,EAAE,OAAAA,GAAO,QAAAY,EAAA;AACpB;AAIA,SAASkB,GAAgB7D,GAAyB;AAC9C,QAAMuQ,IAAqB,CAAA;AAC3B,MAAI5L,IAAY;AAChB,QAAMC,IAAiB,MACjB2Q,IAAQ,CAACrV,MAAc;AACzB,QAAKA,GAIL;AAAA,UAHIA,EAAK,SAAS,UAAU,OAAOA,EAAK,QAAS,aAC7CyE,KAAazE,EAAK,KAAK,SAEvBA,EAAK,SAAS,aAAa,MAAM,QAAQA,EAAK,OAAO,GAAG;AACxD,cAAMoE,IAAOkR,GAAOtV,EAAK,OAAO;AAChC,QAAIoE,EAAK,UACLiM,EAAI,KAAK;AAAA,UACL,OAAOrQ,EAAK,OAAO,SAAS;AAAA,UAC5B,MAAAoE;AAAA,UACA,eAAe,KAAK,IAAI,GAAG,KAAK,KAAKK,IAAYC,CAAc,CAAC;AAAA,QAAA,CACnE;AAAA,MAET;AACA,UAAI,MAAM,QAAQ1E,EAAK,OAAO;AAC1B,mBAAW8Q,KAAS9Q,EAAK,QAAS,CAAAqV,EAAMvE,CAAK;AAAA;AAAA,EAErD;AACA,SAAAuE,EAAMvV,CAAG,GACFuQ;AACX;AAEA,SAASiF,GAAO/V,GAAwB;AACpC,SAAOA,EAAQ,IAAI,CAACsF,MACZA,GAAG,SAAS,SAAeA,EAAE,QAAQ,KACrC,MAAM,QAAQA,GAAG,OAAO,IAAUyQ,GAAOzQ,EAAE,OAAO,IAC/C,EACV,EAAE,KAAK,EAAE;AACd;AAEA,SAASuQ,GAAiBG,GAAuB;AAC7C,MAAIA,KAAK,KAAM,QAAO;AACtB,MAAI,OAAOA,KAAM,SAAU,QAAOA;AAClC,QAAM3Q,IAAI,OAAO2Q,CAAC,EAAE,KAAA,GACdrB,IAAM,WAAWtP,CAAC;AAExB,SADI,MAAMsP,CAAG,KAAKA,KAAO,KACrBtP,EAAE,SAAS,GAAG,IAAU,OACxBA,EAAE,SAAS,IAAI,IAAU,KAAK,MAAMsP,IAAM,EAAE,IAC5CtP,EAAE,SAAS,IAAI,IAAU,KAAK,MAAMsP,IAAM,MAAM,IAChDtP,EAAE,SAAS,IAAI,IAAU,KAAK,MAAMsP,IAAM,MAAM,IAChDtP,EAAE,SAAS,IAAI,IAAU,KAAK,MAAMsP,IAAM,KAAK,IAC5C,KAAK,MAAMA,CAAG;AACzB;ACrvBO,MAAMsB,GAAa;AAAA;AAAA;AAAA;AAAA;AAAA,EAMtB,MAAa,WAAW1P,GAA6B;AACjD,QAAI2P;AACJ,QAAI;AACA,MAAAA,IAAU,MAAM,OAAO,SAAS;AAAA,IACpC,QAAQ;AACJ,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACxE;AAEA,UAAMC,IAAc,MAAM5P,EAAK,YAAA,GACzB6P,IAAS,MAAMF,EAAQ;AAAA,MACzB,EAAE,aAAAC,EAAA;AAAA,MACF;AAAA,QACI,UAAU;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,QAEJ,wBAAwB;AAAA,MAAA;AAAA,IAC5B;AAGJ,WAAIC,EAAO,SAAS,SAAS,KACzB,QAAQ,KAAK,wCAAwCA,EAAO,QAAQ,GAGjEA,EAAO;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,eAAevR,GAA+B;AACvD,QAAIwR;AACJ,QAAI;AACA,YAAMC,IAAM,MAAM,OAAO,QAAQ;AACjC,MAAAD,IAAUC,EAAY,UAAWA,EAAY,WAAWA;AAAA,IAC5D,QAAQ;AACJ,YAAM,IAAI,MAAM,kDAAkD;AAAA,IACtE;AAEA,WAAOD,EAAOxR,GAAM;AAAA,MAChB,KAAK;AAAA;AAAA,MACL,QAAQ;AAAA;AAAA,IAAA,CACX;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAa,eAAevE,GAA+B;AACvD,QAAIiW;AACJ,QAAI;AACA,YAAMD,IAAM,MAAM,OAAO,UAAU;AACnC,MAAAC,IAAkBD,EAAI,WAAWA;AAAA,IACrC,QAAQ;AACJ,YAAM,IAAI,MAAM,sDAAsD;AAAA,IAC1E;AAEA,UAAME,IAAU,IAAID,EAAgB;AAAA,MAChC,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,IAAA,CACnB;AAGD,QAAI;AAGA,YAAME,IAAM,MAAM,OADC;AAEnB,MAAAD,EAAQ,IAAIC,EAAI,OAAOA,EAAI,WAAWA,CAAG;AAAA,IAC7C,SAASlS,GAAG;AACR,cAAQ,KAAK,sFAAsFA,CAAC;AAAA,IACxG;AAEA,WAAOiS,EAAQ,SAASlW,CAAI;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKO,iBAAiBoW,GAAkB/G,IAAW,eAAqB;AACtE,UAAMa,IAAO,IAAI,KAAK,CAACkG,CAAQ,GAAG,EAAE,MAAM,gCAAgC,GACpEC,IAAM,IAAI,gBAAgBnG,CAAI,GAC9B/M,IAAI,SAAS,cAAc,GAAG;AACpC,IAAAA,EAAE,OAAOkT,GACTlT,EAAE,WAAWkM,GACblM,EAAE,MAAA,GACF,IAAI,gBAAgBkT,CAAG;AAAA,EAC3B;AACJ;AClGA,MAAMC,KAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+KnB,MAAMC,GAAY;AAAA,EAChB,MAAMvW,GAAcwB,IAAwB,IAAU;AAC3D,UAAMkT,IAAS8B,GAAgBhV,EAAQ,UAAU,GAC3CiV,IAAWC,GAAchC,CAAM,GAC/BiC,IAAS,GAAGjC,EAAO,QAAQ,GAAG,IAAIA,EAAO,QAAQ,KAAK,IAAIA,EAAO,QAAQ,MAAM,IAAIA,EAAO,QAAQ,IAAI,IACtGtD,IAAkB5P,EAAQ,gBAAgB,IAC1C4N,IAAQ5N,EAAQ,SAAS,YAEzBoV,IAAS,SAAS,cAAc,QAAQ;AAC9C,IAAAA,EAAO,aAAa,eAAe,MAAM,GACzCA,EAAO,MAAM,WAAW,SACxBA,EAAO,MAAM,QAAQ,KACrBA,EAAO,MAAM,SAAS,KACtBA,EAAO,MAAM,QAAQ,KACrBA,EAAO,MAAM,SAAS,KACtBA,EAAO,MAAM,SAAS,KACtBA,EAAO,MAAM,UAAU,KACvBA,EAAO,MAAM,gBAAgB,QAE7B,SAAS,KAAK,YAAYA,CAAM;AAEhC,UAAM3W,IAAM2W,EAAO,iBACbC,IAAU;AAAA;AAAA;AAAA;AAAA,WAITC,GAAO1H,CAAK,CAAC;AAAA;AAAA;AAAA,cAGVqH,CAAQ;AAAA,gBACNE,CAAM;AAAA,QACdvF,IAAkB,yHAAyH,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA,MAK/IkF,EAAiB;AAAA,MACjB9U,EAAQ,YAAY,EAAE;AAAA;AAAA;AAAA;AAAA,IAIxBA,EAAQ,aAAa,mCAAmCA,EAAQ,UAAU,cAAc,EAAE;AAAA,gCAC9DxB,CAAI;AAAA,IAChCwB,EAAQ,aAAa,mCAAmCA,EAAQ,UAAU,cAAc,EAAE;AAAA;AAAA;AAI1F,IAAAvB,EAAI,KAAA,GACJA,EAAI,MAAM4W,CAAO,GACjB5W,EAAI,MAAA;AAEJ,UAAM8W,IAAU,MAAM;AACpB,UAAI;AAAE,iBAAS,KAAK,YAAYH,CAAM;AAAA,MAAG,QAAQ;AAAA,MAAqB;AAAA,IACxE,GAEMI,IAAU,MAAM;AACpB,UAAI;AACF,QAAAJ,EAAO,eAAe,MAAA,GACtBA,EAAO,eAAe,MAAA;AAAA,MACxB,SAAS3S,GAAG;AACV,gBAAQ,MAAM,8BAA8BA,CAAC;AAAA,MAC/C,UAAA;AACE,QAAIzC,EAAQ,cAAc,MAExB,WAAWuV,GAAS,GAAI;AAAA,MAE5B;AAAA,IACF,GAGME,IAAgB,YAAY;AAChC,YAAMC,IAAS,MAAM,KAAKjX,EAAI,UAAU,CAAA,CAAE;AAC1C,YAAM,QAAQ;AAAA,QACZiX,EAAO;AAAA,UAAI,CAAAC,MAAOA,EAAI,WAClB,QAAQ,YACR,IAAI,QAAc,CAAAC,MAAW;AAC3B,YAAAD,EAAI,iBAAiB,QAAQ,MAAMC,EAAA,GAAW,EAAE,MAAM,IAAM,GAC5DD,EAAI,iBAAiB,SAAS,MAAMC,EAAA,GAAW,EAAE,MAAM,IAAM;AAAA,UAC/D,CAAC;AAAA,QAAA;AAAA,MACL;AAAA,IAEJ;AAEA,IAAInX,EAAI,eAAe,aACrBgX,EAAA,EAAgB,KAAKD,CAAO,IAE5BJ,EAAO,iBAAiB,QAAQ,MAAMK,EAAA,EAAgB,KAAKD,CAAO,GAAG,EAAE,MAAM,IAAM;AAAA,EAEvF;AACF;AAEA,SAASF,GAAO/R,GAAmB;AACjC,SAAOA,EAAE,QAAQ,YAAY,CAAAC,OAAM,EAAE,KAAK,SAAS,KAAK,QAAQ,KAAK,QAAQ,KAAK,UAAU,KAAK,QAAA,GAAUA,CAAC,CAAG;AACjH;AAEA,SAAS0R,GAAchC,GAAmC;AACxD,QAAM7F,KAAQ6F,EAAO,YAAY,MAAM,YAAA,GACjC2C,IAAS3C,EAAO,gBAAgB,cAAc,cAAc;AAElE,SADc,CAAC,MAAM,MAAM,MAAM,UAAU,SAAS,SAAS,EACnD,SAAS7F,CAAI,IAAU,GAAGA,CAAI,IAAIwI,CAAM,KAC9C3C,EAAO,SAASA,EAAO,SAAe,GAAGA,EAAO,KAAK,IAAIA,EAAO,MAAM,KACnE,MAAM2C,CAAM;AACrB;AAEA,SAASb,GAAgB9B,GAAwD;AAC/E,QAAM4C,IAA0B;AAAA,IAC9B,UAAU;AAAA,IACV,aAAa;AAAA,IACb,SAAS,EAAE,KAAK,OAAO,QAAQ,OAAO,MAAM,OAAO,OAAO,MAAA;AAAA,EAAM;AAElE,SAAK5C,IACE;AAAA,IACL,GAAG4C;AAAA,IACH,GAAG5C;AAAA,IACH,SAAS,EAAE,GAAG4C,EAAK,SAAS,GAAI5C,EAAO,WAAW,CAAA,EAAC;AAAA,EAAG,IAJpC4C;AAMtB;AC7SO,SAASC,GAAsBpX,GAAWL,GAAW4D,GAAa;AACrE,QAAM8T,IAAU,SAAS,cAAc,KAAK;AAC5C,EAAAA,EAAQ,YAAY,2BACpBA,EAAQ,aAAa,mBAAmB,OAAO,GAC/CA,EAAQ,aAAa,aAAa,MAAM;AAExC,QAAML,IAAM,SAAS,cAAc,KAAK;AACxC,SAAAA,EAAI,MAAMhX,EAAK,MAAM,KACrBgX,EAAI,MAAMhX,EAAK,MAAM,OAAO,IAC5BgX,EAAI,MAAM,UAAU,SACpBA,EAAI,MAAM,WAAW,QACrBA,EAAI,MAAM,SAAS,QAEfhX,EAAK,MAAM,YAAW,MAAM,QAAQA,EAAK,MAAM,QAC/CA,EAAK,MAAM,aAAY,MAAM,SAASA,EAAK,MAAM,SACjDA,EAAK,MAAM,YAAe,MAAM,QAAQA,EAAK,MAAM,QAEvDqX,EAAQ,YAAYL,CAAG,GAGvBA,EAAI,iBAAiB,aAAa,CAAClT,MAAM;AAGrC,UAAMzB,IAAMkB,EAAA;AACZ,QAAI,OAAOlB,KAAQ,UACnB;AAAA,UAAI;AACA,cAAMF,IAAKxC,EAAK,MAAM,GAAG,aAAa2X,GAAc,OAAO3X,EAAK,MAAM,KAAK0C,CAAG,CAAC;AAC/E,QAAA1C,EAAK,SAASwC,CAAE;AAAA,MACpB,QAAQ;AAAA,MAA8B;AAEtC,MAAA2B,EAAE,gBAAA;AAAA;AAAA,EACN,CAAC,GAGuB,CAAC,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,GAAG,EACnD,QAAQ,CAAAzB,MAAO;AAC3B,UAAMkV,IAAS,SAAS,cAAc,KAAK;AAC3C,IAAAA,EAAO,YAAY,qCAAqClV,CAAG,IAC3DkV,EAAO,QAAQ,SAASlV,GACxBgV,EAAQ,YAAYE,CAAM;AAE1B,QAAIrM,IAAS,GACTC,IAAS,GACTC,IAAS,GACTC,IAAS,GACTmM,IAAc;AAElB,IAAAD,EAAO,iBAAiB,aAAa,CAACzT,MAAkB;AACpD,MAAAA,EAAE,eAAA,GACFA,EAAE,gBAAA,GAEFoH,IAASpH,EAAE,SACXqH,IAASrH,EAAE,SACXsH,IAAS4L,EAAI,aACb3L,IAAS2L,EAAI,cACbQ,IAAcnM,IAAS,IAAID,IAASC,IAAS,GAC7CgM,EAAQ,UAAU,IAAI,aAAa;AAEnC,YAAM3P,IAAc,CAAC5D,MAAkB;AACnC,cAAM2H,IAAK3H,EAAE,UAAUoH,GACjBQ,IAAK5H,EAAE,UAAUqH,GACjBsM,IAAa3T,EAAE;AAErB,YAAI4T,IAAWtM,GACXuM,IAAYtM;AAEhB,QAAIhJ,EAAI,SAAS,GAAG,UAAc,KAAK,IAAI,IAAI+I,IAASK,CAAE,IACtDpJ,EAAI,SAAS,GAAG,UAAc,KAAK,IAAI,IAAI+I,IAASK,CAAE,IACtDpJ,EAAI,SAAS,GAAG,UAAe,KAAK,IAAI,IAAIgJ,IAASK,CAAE,IACvDrJ,EAAI,SAAS,GAAG,UAAe,KAAK,IAAI,IAAIgJ,IAASK,CAAE,IAEvD+L,MACIpV,EAAI,SAAS,GAAG,KAAKA,EAAI,SAAS,GAAG,IACrCsV,IAAY,KAAK,MAAMD,IAAWF,CAAW,IAE7CE,IAAW,KAAK,MAAMC,IAAYH,CAAW,IAIrDR,EAAI,MAAM,QAAQ,GAAGU,CAAQ,MAC7BV,EAAI,MAAM,SAAS,GAAGW,CAAS;AAAA,MACnC,GAEMC,IAAY,MAAM;AACpB,QAAAP,EAAQ,UAAU,OAAO,aAAa,GACtC,SAAS,oBAAoB,aAAa3P,CAAW,GACrD,SAAS,oBAAoB,WAAWkQ,CAAS;AAEjD,cAAMvV,IAAMkB,EAAA;AACZ,YAAI,OAAOlB,KAAQ,UAAU;AACzB,gBAAMF,IAAKxC,EAAK,MAAM,GAAG,cAAc0C,GAAK,QAAW;AAAA,YACnD,GAAGrC,EAAK;AAAA,YACR,OAAOgX,EAAI,MAAM;AAAA,YACjB,QAAQA,EAAI,MAAM;AAAA,UAAA,CACrB;AACD,UAAArX,EAAK,SAASwC,CAAE;AAAA,QACpB;AAAA,MACJ;AAEA,eAAS,iBAAiB,aAAauF,CAAW,GAClD,SAAS,iBAAiB,WAAWkQ,CAAS;AAAA,IAClD,CAAC;AAAA,EACL,CAAC,GASM;AAAA,IACH,KAAKP;AAAA,IACL,OAAOQ,GAAkB;AACrB,aAAIA,EAAY,KAAK,SAAS,UAAgB,MAC9Cb,EAAI,MAAMa,EAAY,MAAM,KAC5Bb,EAAI,MAAMa,EAAY,MAAM,OAAO,IAC/BA,EAAY,MAAM,YAAW,MAAM,QAAQA,EAAY,MAAM,QAC7DA,EAAY,MAAM,aAAY,MAAM,SAASA,EAAY,MAAM,SAC5D;AAAA,IACX;AAAA,IACA,YAjBW,MAAM;AACjB,MAAAR,EAAQ,UAAU,IAAI,aAAa;AAAA,IACvC;AAAA,IAgBI,cAfa,MAAM;AACnB,MAAAA,EAAQ,UAAU,OAAO,aAAa;AAAA,IAC1C;AAAA,IAcI,WAAW,CAACzX,MAAiBA,EAAM,WAAWoX;AAAA,IAC9C,UAAU;AAAA,IAAE;AAAA,EAAA;AAEpB;AChCO,MAAMc,GAAW;AAAA,EAUtB,YAAYzW,GAA4B;AAThC,IAAAZ,EAAA;AACD,IAAAA,EAAA;AACC,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA,eAAQ;AAGd,SAAK,gBAAgB,IAAID,GAAA,GACzB,KAAK,WAAW,IAAIgV,GAAA,GACpB,KAAK,cAAc,EAAE,GAAGrU,IAAqB,GAAIE,EAAQ,cAAc,GAAC;AAExE,UAAM0W,IAAU1W,EAAQ,kBAAkBA,EAAQ,WAAW;AAE7D,SAAK,SAAS,IAAI2W,GAAO;AAAA,MACvB,SAAS3W,EAAQ;AAAA,MACjB,UAAUA,EAAQ,aAAa;AAAA,MAC/B,WAAWA,EAAQ;AAAA,MACnB,YAAY;AAAA,QACV4W,GAAW,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,gBAAA,EAAgB,GAAK;AAAA,QAClFC,GAAY,UAAU;AAAA;AAAA;AAAA,UAGpB,aAAa7W,EAAQ,eAAe;AAAA,UACpC,sBAAsB;AAAA,UACtB,iBAAiB;AAAA,UACjB,iBAAiB;AAAA,UACjB,kBAAkB;AAAA,UAClB,gBAAgB;AAAA,QAAA,CACjB;AAAA,QACD8W;AAAA,QACAC;AAAA,QACAC;AAAA,QACAC;AAAA,QACAC,GAAU,UAAU,EAAE,YAAY,IAAM;AAAA,QACxCC;AAAA,QACAC;AAAA,QACAC,GAAU,UAAU,EAAE,OAAO,CAAC,WAAW,WAAW,GAAG;AAAA,QACvDtG,GAAM,UAAU,EAAE,WAAW,IAAM,qBAAqB,IAAM;AAAA,QAC9DF;AAAAA,QACAyG;AAAA,QACAxG;AAAAA,QACAvQ;AAAA,QACAgX;AAAA,QACAC,GAAS,UAAU,EAAE,QAAQ,IAAM;AAAA,QACnC/W;AAAA,QACA/D,GAAK,UAAU;AAAA,UACb,aAAa;AAAA,UACb,gBAAgB,EAAE,OAAO,UAAA;AAAA,QAAU,CACpC;AAAA,QACD+a,GAAM,UAAU,EAAE,QAAQ,IAAO,gBAAgB,EAAE,OAAO,WAAA,GAAc,EAAE,OAAO;AAAA,UAC/E,cAAc;AACZ,mBAAO,CAACC,MAAU3B,GAAsB2B,EAAM,MAAMA,EAAM,MAAMA,EAAM,MAAM;AAAA,UAC9E;AAAA,QAAA,CACD;AAAA,QACDvW;AAAA,QACAqD,GAAY,UAAU,EAAE,UAAUxE,EAAQ,sBAAsB,MAAM;AAAA,QACtEkB;AAAA,QACAI;AAAA,QACAE;AAAA,QACAxE;AAAA,QACAI;AAAA,QACAE;AAAA,QACAI;AAAA,QACAE;AAAA,QACAG;AAAA,QACAE;AAAA,QACAE;AAAA,QACAU;AAAA,QACAG;AAAA,QACAU;AAAA,QACAK,GAAW,UAAU,KAAK,WAAW;AAAA,QACrCI;AAAA,QACAC;AAAA,QACAC;AAAA,QACAC;AAAA,QACAoB;AAAA,QACA+B;AAAA,QACAG;AAAA,QACAE,GAAc,UAAU,EAAE,UAAU9D,EAAQ,iBAAiB2X,IAAsB;AAAA,QACnF1S;AAAA,QACA+B,GAAa,UAAU,EAAE,QAAQhH,EAAQ,eAAe,UAAU;AAAA,QAClE4H;AAAA,QACAC;AAAA,QACAC;AAAA,QACAiB;AAAA,QACAI;AAAA,QACAE;AAAA,QACAwD;AAAA,QACAC;AAAA,QACA7B;AAAA,QACA,GAAIjL,EAAQ,gBAAgB,KAAQ,CAAC+F,EAAU,IAAI,CAAA;AAAA,MAAC;AAAA,MAEtD,SAAS2Q;AAAA,MACT,UAAU,CAAC,EAAE,QAAAzW,QAAa;AACxB,QAAAD,EAAQ,WAAWC,EAAO,QAAA,GAAWA,CAAM,GACvCD,EAAQ,eAAaA,EAAQ,YAAY,KAAK,cAAc;AAAA,MAClE;AAAA,MACA,mBAAmB,CAAC,EAAE,QAAAC,QAAaD,EAAQ,oBAAoBC,CAAM;AAAA,IAAA,CACtE,GAED,KAAK,WAAW,IAAIkN,GAAe,KAAK,MAAM,GAC9C,KAAK,WAAW,IAAIqB,GAAa,KAAK,aAAa,GACnD,KAAK,UAAU,IAAIuG,GAAA,GAElB,KAAK,OAAe,QAAQ,SAAS,MACtC,KAAK,qBAAqB/U,EAAQ,OAAO,GACzC,KAAK,qBAAA;AAAA,EACP;AAAA;AAAA;AAAA,EAIQ,uBAA6B;AACnC,UAAM4X,IAAWC,GAAoB,KAAK,WAAW,GAC/CC,IAAgB,KAAK,OAAO,QAAgB;AAClD,IAAIA,QAAiB,kBAAkBF;AAEvC,QAAI;AACF,YAAMtZ,IAAO,KAAK,OAAO;AACzB,MAAAA,EAAK,SAASA,EAAK,MAAM,GAAG,QAAQ,EAAE,KAAK,kBAAyB,EAAI,CAAC;AAAA,IAC3E,QAAQ;AAAA,IAAa;AAAA,EACvB;AAAA;AAAA,EAGO,UAAkB;AAAE,WAAO,KAAK,OAAO,QAAA;AAAA,EAAW;AAAA,EAClD,UAAe;AAAE,WAAO,KAAK,OAAO,QAAA;AAAA,EAAW;AAAA,EAC/C,UAAkB;AAAE,WAAO,KAAK,OAAO,MAAM,IAAI;AAAA,EAAa;AAAA,EAC9D,UAAmB;AAAE,WAAO,KAAK,OAAO;AAAA,EAAS;AAAA,EACjD,aAAsB;AAAE,WAAO,KAAK,OAAO;AAAA,EAAY;AAAA,EAEvD,YAAYJ,GAA6B;AAC9C,UAAM6Z,IAAY,OAAO7Z,KAAY,WAAW6O,GAAkB,SAAS7O,CAAO,IAAIA;AACtF,SAAK,OAAO,SAAS,WAAW6Z,CAAS;AAAA,EAC3C;AAAA,EAEO,QAAc;AAAE,SAAK,OAAO,SAAS,aAAa,EAAI;AAAA,EAAG;AAAA,EACzD,MAAM/W,IAAwC,OAAa;AAAE,SAAK,OAAO,SAAS,MAAMA,CAAU;AAAA,EAAG;AAAA,EACrG,OAAa;AAAE,SAAK,OAAO,SAAS,KAAA;AAAA,EAAQ;AAAA,EAC5C,UAAgB;AAAE,SAAK,OAAO,QAAA;AAAA,EAAW;AAAA;AAAA,EAGzC,YAAYgX,GAAyB;AAC1C,SAAK,OAAO,YAAYA,CAAQ;AAAA,EAClC;AAAA;AAAA,EAGA,IAAW,SAAS;AAAE,WAAO,KAAK;AAAA,EAAU;AAAA;AAAA,EAG5C,MAAa,WAAWnK,IAAW,iBAAiB;AAClD,WAAO,KAAK,SAAS,aAAa,KAAK,WAAW,EAAE,UAAAA,GAAU,YAAY,KAAK,YAAA,CAAa;AAAA,EAC9F;AAAA,EAEA,MAAa,eAAeA,IAAW,eAA8B;AACnE,UAAMoK,IAAK,MAAM,KAAK,SAAS,eAAe,KAAK,SAAS;AAC5D,SAAK,SAAS,iBAAiBA,GAAIpK,CAAQ;AAAA,EAC7C;AAAA,EAEO,WAAWA,IAAW,iBAAuB;AAClD,UAAMrP,IAAO;AAAA;AAAA;AAAA,QAGT,KAAK,SAAS;AAAA,UAEZkQ,IAAO,IAAI,KAAK,CAAClQ,CAAI,GAAG,EAAE,MAAM,2BAA2B,GAC3DqW,IAAM,IAAI,gBAAgBnG,CAAI,GAC9B/M,IAAI,SAAS,cAAc,GAAG;AACpC,IAAAA,EAAE,OAAOkT,GACTlT,EAAE,WAAWkM,GACblM,EAAE,MAAA,GACF,IAAI,gBAAgBkT,CAAG;AAAA,EACzB;AAAA,EAEO,WAAWhH,IAAW,iBAAuB;AAClD,UAAMa,IAAO,IAAI,KAAK,CAAC,KAAK,UAAU,KAAK,QAAA,GAAW,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,oBAAoB,GACvFmG,IAAM,IAAI,gBAAgBnG,CAAI,GAC9B,IAAI,SAAS,cAAc,GAAG;AACpC,MAAE,OAAOmG,GACT,EAAE,WAAWhH,GACb,EAAE,MAAA,GACF,IAAI,gBAAgBgH,CAAG;AAAA,EACzB;AAAA,EAEA,MAAa,OAAOqD,GAA4ClY,IAAyB,IAAI;AAC3F,YAAQkY,GAAA;AAAA,MACN,KAAK;AAAQ,eAAO,KAAK,WAAWlY,EAAQ,QAAQ;AAAA,MACpD,KAAK;AAAO,eAAO,KAAK,SAASA,CAAc;AAAA,MAC/C,KAAK;AAAQ,eAAO,KAAK,WAAWA,EAAQ,QAAQ;AAAA,MACpD,KAAK;AAAY,eAAO,KAAK,eAAeA,EAAQ,QAAQ;AAAA,MAC5D,KAAK;AAAQ,eAAO,KAAK,WAAWA,EAAQ,QAAQ;AAAA,MACpD;AAAS,gBAAQ,KAAK,8BAA8BkY,CAAM,EAAE;AAAA,IAAA;AAAA,EAEhE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,SAASlY,IAAwB,IAAU;AAChD,UAAMxB,IAAO,KAAK,iBAAA;AAClB,SAAK,QAAQ,MAAMA,GAAM;AAAA,MACvB,YAAY,KAAK;AAAA,MACjB,OAAO;AAAA,MACP,GAAGwB;AAAA,IAAA,CACJ;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,mBAA2B;AAEhC,UAAMiM,IADW,KAAK,OAAO,QAAQ,SACP,cAAc,cAAc;AAC1D,QAAI,CAACA,EAAa,QAAO,KAAK,QAAA;AAE9B,UAAMkM,IAAQlM,EAAY,UAAU,EAAI,GAElCmM,IAAgB;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,WAAAD,EAAM,iBAAiBC,EAAc,KAAK,GAAG,CAAC,EAAE,QAAQ,CAAAxZ,MAAMA,EAAG,OAAA,CAAQ,GAEzEuZ,EAAM,iBAAiB,mBAAmB,EAAE,QAAQ,OAAMvZ,EAAG,gBAAgB,iBAAiB,CAAC,GAC/FuZ,EAAM,iBAAiB,2BAA2B,EAAE,QAAQ,OAAMvZ,EAAG,UAAU,OAAO,0BAA0B,CAAC,GAE1GuZ,EAAM;AAAA,EACf;AAAA;AAAA,EAGA,MAAa,WAAW1T,GAA2B;AACjD,UAAMjG,IAAO,MAAM,KAAK,SAAS,WAAWiG,CAAI;AAChD,SAAK,YAAYjG,CAAI;AAAA,EACvB;AAAA,EAEA,MAAa,eAAeuE,GAA6B;AACvD,UAAMvE,IAAO,MAAM,KAAK,SAAS,eAAeuE,CAAI;AACpD,SAAK,YAAYvE,CAAI;AAAA,EACvB;AAAA,EAEA,MAAa,eAAeiG,GAA2B;AACrD,UAAMnF,IAAOmF,EAAK,KAAK,YAAA;AACvB,QAAInF,EAAK,SAAS,OAAO,EAAG,QAAO,KAAK,WAAWmF,CAAI;AACvD,QAAInF,EAAK,SAAS,KAAK,KAAKA,EAAK,SAAS,WAAW,GAAG;AACtD,YAAMyD,IAAO,MAAM0B,EAAK,KAAA;AACxB,aAAO,KAAK,eAAe1B,CAAI;AAAA,IACjC;AACA,QAAIzD,EAAK,SAAS,OAAO,KAAKA,EAAK,SAAS,MAAM,GAAG;AACnD,YAAMd,IAAO,MAAMiG,EAAK,KAAA;AACxB,WAAK,YAAYjG,CAAI;AACrB;AAAA,IACF;AACA,QAAIc,EAAK,SAAS,OAAO,GAAG;AAC1B,YAAMyD,IAAO,MAAM0B,EAAK,KAAA;AACxB,WAAK,YAAY,KAAK,MAAM1B,CAAI,CAAC;AACjC;AAAA,IACF;AACA,QAAIzD,EAAK,SAAS,MAAM,GAAG;AAEzB,YAAMd,KADO,MAAMiG,EAAK,KAAA,GACN,MAAM,OAAO,EAAE,IAAI,CAAA4T,MAAK,MAAM7V,GAAW6V,CAAC,KAAK,MAAM,MAAM,EAAE,KAAK,EAAE;AACtF,WAAK,YAAY7Z,CAAI;AACrB;AAAA,IACF;AACA,UAAM,IAAI,MAAM,4BAA4BiG,EAAK,IAAI,EAAE;AAAA,EACzD;AAAA;AAAA,EAGO,qBAAoE;AACzE,UAAM6T,IAA0D,CAAA;AAChE,gBAAK,OAAO,MAAM,IAAI,YAAY,CAAC3Z,MAAS;AAC1C,UAAIA,EAAK,KAAK,SAAS,WAAW;AAChC,cAAMoE,IAAOpE,EAAK,aACZ4Z,IAAKC,GAAQzV,CAAI;AACvB,QAAAuV,EAAS,KAAK,EAAE,OAAO3Z,EAAK,MAAM,OAAO,MAAAoE,GAAM,IAAAwV,GAAI;AAAA,MACrD;AAAA,IACF,CAAC,GACMD;AAAA,EACT;AAAA,EAEO,eAA+B;AAIpC,UAAM7Z,IAAM,KAAK,OAAO,MAAM,KACxBsE,IAAOtE,EAAI,YAAY,GAAGA,EAAI,QAAQ,MAAM;AAAA,GAAM,GAAG,GACrDga,IAAU1V,EAAK,KAAA,GACf2V,IAAQD,IAAUA,EAAQ,MAAM,QAAQ,EAAE,OAAO,OAAO,EAAE,SAAS,GACnEE,IAAa5V,EAAK,QAClB6V,IAAqB7V,EAAK,QAAQ,OAAO,EAAE,EAAE;AACnD,QAAI8V,IAAa;AACjB,IAAApa,EAAI,YAAY,CAAAE,MAAQ;AACtB,MAAIA,EAAK,KAAK,SAAS,eAAeA,EAAK,YAAY,UAAQka;AAAA,IACjE,CAAC;AACD,UAAMC,IAAYL,KACbA,EAAQ,MAAM,kBAAkB,KAAK,CAACA,CAAO,GAAG,SACjD,GACEM,IAAQ,KAAK,IAAI,GAAG,KAAK,KAAKL,IAAQ,GAAG,CAAC,GAC1CM,IAAqB,KAAK,IAAI,GAAG,KAAK,KAAKN,IAAQ,GAAG,CAAC;AAC7D,WAAO,EAAE,OAAAA,GAAO,YAAAC,GAAY,oBAAAC,GAAoB,YAAAC,GAAY,WAAAC,GAAW,OAAAC,GAAO,oBAAAC,EAAA;AAAA,EAChF;AAAA;AAAA,EAGO,qBAA2B;AAC/B,SAAK,OAAe,MAAA,EAAQ,mBAAA,EAAqB,IAAA;AAAA,EACpD;AAAA,EAEO,oBAA6B;AAClC,WAAQ,KAAK,OAAO,QAAQ,cAAsB,WAAW;AAAA,EAC/D;AAAA;AAAA,EAGO,KAAK7U,GAAenE,IAAwD,IAAY;AAC7F,WAAQ,KAAK,OAAO,SAAiB,SAASmE,GAAOnE,CAAO;AAAA,EAC9D;AAAA,EAEO,QAAQmE,GAAe6E,GAAqBiQ,IAAM,IAAOjZ,IAAwD,IAAY;AAClI,WAAQ,KAAK,OAAO,SAAiBiZ,IAAM,mBAAmB,aAAa,EAAE9U,GAAO6E,GAAahJ,CAAO;AAAA,EAC1G;AAAA,EAEO,cAAoB;AACxB,SAAK,OAAO,SAAiB,YAAA;AAAA,EAChC;AAAA;AAAA;AAAA,EAIO,eAAuB;AAC5B,WAAQ,KAAK,OAAO,SAAiB,YAAY,aAAa;AAAA,EAChE;AAAA;AAAA,EAGO,yBAAiC;AACtC,WAAO6X,GAAoB,KAAK,WAAW;AAAA,EAC7C;AAAA;AAAA,EAGO,gBAAmC;AAAE,WAAO,EAAE,GAAG,KAAK,YAAA;AAAA,EAAe;AAAA,EAErE,cAAc3E,GAA0C;AAC7D,SAAK,cAAc,EAAE,GAAG,KAAK,aAAa,GAAGA,EAAA,GACzCA,EAAO,YAAS,KAAK,YAAY,UAAU,EAAE,GAAG,KAAK,YAAY,SAAS,GAAGA,EAAO,QAAA,IACxF,KAAK,qBAAqB,KAAK,OAAO,QAAQ,OAAsB,GACpE,KAAK,qBAAA;AAAA,EACP;AAAA,EAEQ,qBAAqBgG,GAAmB;AAC9C,UAAM,EAAE,OAAA1Y,GAAO,QAAAY,EAAA,IAAW+X,GAAsB,KAAK,WAAW,GAC1DC,IAAYvB,GAAoB,KAAK,WAAW,GAChDwB,IAAWH,EAAK,cAAc,cAAc;AAClD,IAAKG,MACLA,EAAS,MAAM,YAAY,mBAAmB7Y,CAAK,GACnD6Y,EAAS,MAAM,YAAY,oBAAoBjY,CAAM,GACrDiY,EAAS,MAAM,YAAY,4BAA4B,GAAGD,CAAS,IAAI,GACvEC,EAAS,MAAM,YAAY,wBAAwB,KAAK,YAAY,QAAQ,GAAG,GAC/EA,EAAS,MAAM,YAAY,2BAA2B,KAAK,YAAY,QAAQ,MAAM,GACrFA,EAAS,MAAM,YAAY,yBAAyB,KAAK,YAAY,QAAQ,IAAI,GACjFA,EAAS,MAAM,YAAY,0BAA0B,KAAK,YAAY,QAAQ,KAAK,GACnFA,EAAS,QAAQ,kBAAkB,KAAK,YAAY;AAAA,EACtD;AAAA;AAAA,EAGO,UAAkB;AAAE,WAAO,KAAK;AAAA,EAAO;AAAA,EAEvC,QAAQC,GAAoB;AACjC,UAAMC,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,MAAMD,CAAI,CAAC;AAC1C,SAAK,QAAQC;AAEb,UAAMC,IADW,KAAK,OAAO,QAAQ,QACZ,cAAc,cAAc;AACrD,IAAIA,MACFA,EAAQ,MAAM,YAAY,SAASD,CAAC,KACpCC,EAAQ,MAAM,kBAAkB;AAAA,EAEpC;AAAA;AAAA,EAGO,eAAe9V,IAAM,qBAAqB+V,IAAa,KAAiB;AAC7E,QAAIC,IAA8C;AAClD,UAAMC,IAAU,MAAM;AACpB,MAAID,kBAAoBA,CAAK,GAC7BA,IAAQ,WAAW,MAAM;AACvB,YAAI;AACF,uBAAa,QAAQhW,GAAK,KAAK,UAAU,KAAK,QAAA,CAAS,CAAC;AAAA,QAC1D,SAASjB,GAAG;AACV,kBAAQ,KAAK,iCAAiCA,CAAC;AAAA,QACjD;AAAA,MACF,GAAGgX,CAAU;AAAA,IACf;AACA,gBAAK,OAAO,GAAG,UAAUE,CAAO,GACzB,MAAM,KAAK,OAAO,IAAI,UAAUA,CAAO;AAAA,EAChD;AAAA,EAEO,aAAajW,IAAM,qBAA8B;AACtD,UAAMkW,IAAQ,aAAa,QAAQlW,CAAG;AACtC,QAAI,CAACkW,EAAO,QAAO;AACnB,QAAI;AACF,kBAAK,YAAY,KAAK,MAAMA,CAAK,CAAC,GAC3B;AAAA,IACT,SAASnX,GAAG;AACV,qBAAQ,MAAM,4BAA4BA,CAAC,GACpC;AAAA,IACT;AAAA,EACF;AAAA,EAEO,cAAciB,IAAM,qBAA2B;AACpD,iBAAa,WAAWA,CAAG;AAAA,EAC7B;AAAA;AAAA,EAGA,IAAW,WAAmB;AAAE,WAAO,KAAK;AAAA,EAAQ;AAAA,EACpD,IAAW,eAA6B;AAAE,WAAO,KAAK;AAAA,EAAe;AACvE;AAEA,SAASlB,GAAWe,GAAmB;AACrC,SAAOA,EAAE,QAAQ,YAAY,CAAAC,OAAM,EAAE,KAAK,SAAS,KAAK,QAAQ,KAAK,QAAQ,KAAK,UAAU,KAAK,QAAA,GAAUA,CAAC,CAAG;AACjH;AAEA,SAASgV,GAAQjV,GAAmB;AAClC,SAAOA,EAAE,YAAA,EAAc,KAAA,EAAO,QAAQ,QAAQ,GAAG,EAAE,QAAQ,eAAe,EAAE,EAAE,QAAQ,OAAO,GAAG;AAClG;AAEA,SAAS4V,GAAsBjG,GAA8D;AAC3F,QAAM2G,IAAkD;AAAA,IACtD,IAAI,CAAC,SAAS,OAAO;AAAA,IACrB,IAAI,CAAC,SAAS,OAAO;AAAA,IACrB,IAAI,CAAC,SAAS,OAAO;AAAA,IACrB,QAAQ,CAAC,SAAS,MAAM;AAAA,IACxB,OAAO,CAAC,SAAS,MAAM;AAAA,IACvB,SAAS,CAAC,QAAQ,MAAM;AAAA,EAAA,GAEpB,CAACvQ,GAAGC,CAAC,IAAIsQ,EAAc3G,EAAO,QAAQ,KAAK2G,EAAc;AAC/D,SAAI3G,EAAO,gBAAgB,cAAoB,EAAE,OAAO3J,GAAG,QAAQD,EAAA,IAC5D,EAAE,OAAOA,GAAG,QAAQC,EAAA;AAC7B;AAGA,SAASsO,GAAoB3E,GAAmC;AAC9D,QAAM,EAAE,QAAA9R,EAAA,IAAW+X,GAAsBjG,CAAM,GACzC4G,IAAUC,GAAc3Y,CAAM,GAC9B4Y,IAAQD,GAAc7G,EAAO,QAAQ,GAAG,GACxC+G,IAAQF,GAAc7G,EAAO,QAAQ,MAAM;AACjD,SAAO,KAAK,IAAI,KAAK,KAAK,MAAM4G,IAAUE,IAAQC,CAAK,CAAC;AAC1D;AAEA,SAASF,GAAcvM,GAAuB;AAC5C,MAAI,CAACA,EAAO,QAAO;AACnB,QAAMjK,IAAI,OAAOiK,CAAK,EAAE,KAAA,GAClBqF,IAAM,WAAWtP,CAAC;AACxB,SAAI,MAAMsP,CAAG,IAAU,IACnBtP,EAAE,SAAS,IAAI,IAAUsP,IAAM,KAC/BtP,EAAE,SAAS,IAAI,IAAUsP,IAAM,SAC/BtP,EAAE,SAAS,IAAI,IAAUsP,IAAM,SAC/BtP,EAAE,SAAS,IAAI,IAAUsP,IAAM,QAC/BtP,EAAE,SAAS,IAAI,IAAUsP,IAAM,MAC/BtP,EAAE,SAAS,IAAI,GAAUsP;AAE/B;"}