reactjs-tiptap-editor 0.0.26 → 0.0.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"reactjs-tiptap-editor.cjs","sources":["../src/constants/index.ts","../src/utils/plateform.ts","../src/lib/utils.ts","../src/components/ActionButton.tsx","../src/components/ActionMenuButton.tsx","../src/utils/delete-node.ts","../src/hooks/useAttributes.tsx","../src/components/ui/textarea.tsx","../src/components/ui/button.tsx","../src/components/ui/dropdown-menu.tsx","../src/components/ui/input.tsx","../src/components/ui/label.tsx","../src/components/ui/popover.tsx","../src/components/ui/separator.tsx","../src/components/ui/switch.tsx","../src/components/ui/tabs.tsx","../src/components/ui/toast.tsx","../src/components/ui/toggle.tsx","../src/components/ui/tooltip.tsx","../src/components/ui/use-toast.ts","../src/components/menus/components/BubbleMenuKatex.tsx","../src/components/BubbleMenu.tsx","../src/locales/en.ts","../src/locales/vi.ts","../src/locales/zh-cn.ts","../src/utils/mitt.ts","../src/locales/index.tsx","../src/components/icons/NoFill.tsx","../src/components/ColorPicker.tsx","../src/constants/resetCSS.ts","../src/theme/theme.ts","../src/utils/utils.ts","../src/utils/dynamicCSS.ts","../src/components/RichTextEditor.tsx","../src/components/Toolbar.tsx","../src/components/icons/AspectRatio.tsx","../src/components/icons/Blockquote.tsx","../src/components/icons/DeleteColumn.tsx","../src/components/icons/DeleteRow.tsx","../src/components/icons/FileWordOutline.tsx","../src/components/icons/Icon.tsx","../src/components/icons/LineHeight.tsx","../src/components/icons/MenuDown.tsx","../src/components/icons/SizeL.tsx","../src/components/icons/SizeM.tsx","../src/components/icons/SizeS.tsx","../src/components/icons/ImportWord.tsx","../src/components/icons/ExportPdf.tsx","../src/components/icons/ExportWord.tsx","../src/components/icons/ColumnAddLeft.tsx","../src/components/icons/ColumnAddRight.tsx","../src/components/icons/icons.ts","../src/components/menus/bubble.ts","../src/utils/indent.ts","../src/components/menus/components/ContentMenu.tsx","../src/components/menus/components/BubbleMenuText.tsx","../src/extensions/Highlight/components/HighlightActionButton.tsx","../src/components/menus/components/TableBubbleMenu.tsx","../src/extensions/Link/components/LinkEditBlock.tsx","../src/extensions/Link/components/LinkViewBlock.tsx","../src/components/menus/components/BubbleMenuLink.tsx","../src/components/menus/components/BubbleMenuMedia.tsx","../src/components/menus/components/ColumnsBubbleMenu.tsx","../src/extensions/Bold/Bold.ts","../src/extensions/Italic/Italic.ts","../src/extensions/UnderLine/Underline.ts","../src/extensions/Strike/Strike.ts","../src/extensions/Code/Code.ts","../src/extensions/CodeBlock/highlighter.ts","../src/extensions/CodeBlock/shiki-plugin.ts","../src/extensions/CodeBlock/components/CodeBlockActiveButton.tsx","../src/extensions/CodeBlock/CodeBlock.ts","../src/extensions/FontFamily/components/FontFamilyButton.tsx","../src/extensions/FontFamily/FontFamily.ts","../src/extensions/Heading/components/HeadingButton.tsx","../src/extensions/Heading/Heading.ts","../src/extensions/TextAlign/components/TextAlignMenuButton.tsx","../src/extensions/TextAlign/TextAlign.ts","../src/extensions/FontSize/components/FontSizeMenuButton.tsx","../src/extensions/FontSize/FontSize.ts","../src/extensions/Color/components/ColorActionButton.tsx","../src/extensions/Color/Color.ts","../src/extensions/Highlight/Highlight.ts","../src/extensions/BulletList/BulletList.ts","../src/extensions/Clear/Clear.ts","../src/extensions/OrderedList/OrderedList.ts","../src/extensions/TaskList/TaskList.ts","../src/extensions/Blockquote/Blockquote.ts","../src/extensions/Link/components/LinkEditPopover.tsx","../src/extensions/Link/Link.ts","../src/extensions/HorizontalRule/HorizontalRule.ts","../src/extensions/History/components/HistoryActionButton.tsx","../src/extensions/History/History.ts","../src/extensions/Document/Document.ts","../src/utils/columns.ts","../src/extensions/MultiColumn/MultiColumn.ts","../src/extensions/MultiColumn/Column.ts","../src/extensions/MultiColumn/components/ColumnActionButton.ts","../src/extensions/Selection/Selection.ts","../src/extensions/TextBubble/components/TextDropdown.tsx","../src/extensions/TextBubble/TextBubble.ts","../src/extensions/TrailingNode/TrailingNode.ts","../src/extensions/BaseKit.ts","../src/extensions/Subscript/Subscript.ts","../src/extensions/MoreMark/components/ActionMoreButton.tsx","../src/extensions/MoreMark/MoreMark.ts","../src/extensions/Indent/Indent.ts","../src/extensions/LineHeight/components/LineHeightDropdown.tsx","../src/utils/line-height.ts","../src/extensions/LineHeight/LineHeight.ts","../src/extensions/SlashCommand/groups.ts","../src/extensions/SlashCommand/components/CommandsList.tsx","../src/extensions/SlashCommand/SlashCommand.ts","../src/extensions/Image/components/ImageView.tsx","../src/extensions/Image/Image.ts","../src/plugins/image-upload.ts","../src/extensions/ImageUpload/components/ImageUploader.tsx","../src/extensions/ImageUpload/ImageUpload.ts","../src/extensions/Video/Video.ts","../src/extensions/VideoUpload/components/VideoUploaderView.tsx","../src/extensions/VideoUpload/VideoUpload.ts","../src/extensions/Table/cell-background.ts","../src/utils/is-mobile.ts","../src/extensions/Table/components/CreateTablePopover.tsx","../src/extensions/Table/components/TableActionButton.tsx","../src/extensions/Table/Table.ts","../src/extensions/FormatPainter/FormatPainter.ts","../src/extensions/Iframe/embed.ts","../src/extensions/Iframe/components/IframeNodeView.tsx","../src/extensions/Iframe/Iframe.ts","../src/extensions/SearchAndReplace/components/SearchAndReplaceButton.tsx","../src/extensions/SearchAndReplace/SearchAndReplace.ts","../src/extensions/Emoji/components/EmojiList/emojis.ts","../src/extensions/Emoji/components/EmojiList/EmojiList.tsx","../src/extensions/Emoji/components/EmojiPicker/constants.ts","../src/components/icons/Activity.tsx","../src/components/icons/Animas.tsx","../src/components/icons/Flag.tsx","../src/components/icons/Food.tsx","../src/components/icons/Object.tsx","../src/components/icons/Symbol.tsx","../src/components/icons/Travel.tsx","../src/utils/json.ts","../src/utils/storage.ts","../src/utils/lru-cache.ts","../src/extensions/Emoji/components/EmojiPicker/EmojiPicker.tsx","../src/extensions/Emoji/Emoji.ts","../src/utils/color.ts","../src/extensions/Katex/components/KatexWrapper.tsx","../src/extensions/Katex/components/KatexActiveButton.tsx","../src/extensions/Katex/Katex.ts","../src/utils/pdf.ts","../src/extensions/ExportPdf/ExportPdf.ts","../src/extensions/ImportWord/components/ImportWordButton.tsx","../src/extensions/ImportWord/ImportWord.ts","../src/extensions/ExportWord/ExportWord.ts","../src/extensions/TableOfContent/components/NodeViewTableOfContent.tsx","../src/utils/node.ts","../src/hooks/useActive.tsx","../src/extensions/TableOfContent/components/TableOfContentActionButton.tsx","../src/extensions/TableOfContent/TableOfContent.ts"],"sourcesContent":["/** Default lang */\nexport const DEFAULT_LANG_VALUE = 'en' as const\n\n/** Throttle time for editor input (milliseconds) */\nexport const EDITOR_UPDATE_THROTTLE_WAIT_TIME = 200 as const\n\n/**\n * watch throttling time must be less than the update time\n * otherwise the cursor position will reach the end\n */\nexport const EDITOR_UPDATE_WATCH_THROTTLE_WAIT_TIME = EDITOR_UPDATE_THROTTLE_WAIT_TIME - 80\n\n/** Minimum size for image adjustments */\nexport const IMAGE_MIN_SIZE = 20 as const\n/** Maximum size for image adjustments */\nexport const IMAGE_MAX_SIZE = 100_000 as const\n/** Throttle time during adjustments for images (milliseconds) */\nexport const IMAGE_THROTTLE_WAIT_TIME = 16 as const\n\n/** Default number of rows and columns for grids when creating a table */\nexport const TABLE_INIT_GRID_SIZE = 10 as const\n/** Maximum number of rows and columns for grids when creating a table */\nexport const TABLE_MAX_GRID_SIZE = 10 as const\n/** Minimum number of rows and columns for grids when creating a table */\nexport const TABLE_DEFAULT_SELECTED_GRID_SIZE = 2 as const\n\nexport const DEFAULT_COLOR = '#262626'\n/** Default color list for text color and text highlight */\nexport const COLORS_LIST = [\n '#000000',\n '#262626',\n '#595959',\n '#8C8C8C',\n '#BFBFBF',\n '#D9D9D9',\n '#E9E9E9',\n '#F5F5F5',\n '#FAFAFA',\n '#FFFFFF',\n '#F5222D',\n '#FA541C',\n '#FA8C16',\n '#FADB14',\n '#52C41A',\n '#13C2C2',\n '#1890FF',\n '#2F54EB',\n '#722ED1',\n '#EB2F96',\n '#FFE8E6',\n '#FFECE0',\n '#FFEFD1',\n '#FCFCCA',\n '#E4F7D2',\n '#D3F5F0',\n '#D4EEFC',\n '#DEE8FC',\n '#EFE1FA',\n '#FAE1EB',\n '#FFA39E',\n '#FFBB96',\n '#FFD591',\n '#FFFB8F',\n '#B7EB8F',\n '#87E8DE',\n '#91D5FF',\n '#ADC6FF',\n '#D3ADF7',\n '#FFADD2',\n '#FF4D4F',\n '#FF7A45',\n '#FFA940',\n '#FFEC3D',\n '#73D13D',\n '#36CFC9',\n '#40A9FF',\n '#597EF7',\n '#9254DE',\n '#F759AB',\n '#CF1322',\n '#D4380D',\n '#D46B08',\n '#D4B106',\n '#389E0D',\n '#08979C',\n '#096DD9',\n '#1D39C4',\n '#531DAB',\n '#C41D7F',\n '#820014',\n '#871400',\n '#873800',\n '#614700',\n '#135200',\n '#00474F',\n '#003A8C',\n '#061178',\n '#22075E',\n '#780650',\n] as const\n\n/** Default font family list */\nexport const DEFAULT_FONT_FAMILY_LIST = [\n 'Inter',\n 'Comic Sans MS, Comic Sans',\n 'serif',\n 'monospace',\n 'cursive',\n]\n\nexport const DEFAULT_LANGUAGE_CODE_BLOCK = [\n 'html',\n 'css',\n 'js',\n 'ts',\n]\n\nexport const MAP_LANGUAGE_CODE_LABELS = {\n html: 'HTML',\n css: 'CSS',\n js: 'JavaScript',\n ts: 'TypeScript',\n} as any\n\n/** Default font size list */\nexport const DEFAULT_FONT_SIZE_LIST = [\n '10px',\n '11px',\n '12px',\n '14px',\n '16px',\n '18px',\n '20px',\n '22px',\n '24px',\n '26px',\n '28px',\n '36px',\n '48px',\n '72px',\n] as const\n\n/** Default font size value */\nexport const DEFAULT_FONT_SIZE_VALUE = 'default'\n\n/** Options for setting image size in the bubble menu */\nexport enum IMAGE_SIZE {\n 'size-small' = 200,\n 'size-medium' = 500,\n 'size-large' = '100%',\n}\n\n/** Options for setting video size in the bubble menu */\nexport enum VIDEO_SIZE {\n 'size-small' = 480,\n 'size-medium' = 640,\n 'size-large' = '100%',\n}\n\n/** Line Height List */\nexport const DEFAULT_LINE_HEIGHT_LIST = ['100%', '115%', '150%', '200%', '250%', '300%']\nexport const LINE_HEIGHT_100 = 1.7\nexport const DEFAULT_LINE_HEIGHT = '1'\n\n/** display in menus */\nexport const NODE_TYPE_MENU: any = {\n image: [\n 'divider',\n 'image-size-small',\n 'image-size-medium',\n 'image-size-large',\n 'divider',\n 'image-left',\n 'image-center',\n 'image-right',\n 'divider',\n 'image-aspect-ratio',\n 'remove',\n ],\n text: [\n 'divider',\n 'text-bubble',\n 'divider',\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'code',\n 'link',\n 'divider',\n 'color',\n 'highlight',\n 'textAlign',\n ],\n video: ['video-size-small', 'video-size-medium', 'video-size-large', 'divider', 'remove'],\n table: ['removeTable'],\n}\n\n/** display in bubble text menu */\nexport const BUBBLE_TEXT_LIST = [\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'code',\n 'link',\n 'divider',\n 'color',\n 'highlight',\n 'textAlign',\n]\n","// We'll cache the result of isMac() and isTouchDevice(), since they shouldn't\n// change during a session. That way repeated calls don't require any logic and\n// are rapid.\nlet isMacResult: boolean | undefined\nlet isTouchDeviceResult: boolean | undefined\n\n/**\n * Return true if the user is using a Mac (as opposed to Windows, etc.) device.\n */\nexport function isMac(): boolean {\n if (isMacResult === undefined) {\n isMacResult = navigator.platform.includes('Mac')\n }\n return isMacResult\n}\n\n/**\n * 根据 Mac 和非 Mac 平台,返回应该用于键盘快捷键的修饰键的可读版本。用于直观地指示应该按哪个键。\n */\nexport function getShortcutKey(key: string): string {\n if (`${key}`.toLowerCase() === 'mod') {\n return isMac() ? '⌘' : 'Ctrl'\n }\n else if (`${key}`.toLowerCase() === 'alt') {\n return isMac() ? '⌥' : 'Alt'\n }\n else if (`${key}`.toLowerCase() === 'shift') {\n return isMac() ? '⇧' : 'Shift'\n }\n else {\n return key\n }\n}\nexport function getShortcutKeys(keys: string[]): string {\n return keys.map(getShortcutKey).join(' ')\n}\n\n/** Return true if the user is using a touch-based device. */\nexport function isTouchDevice(): boolean {\n if (isTouchDeviceResult === undefined) {\n // This technique is taken from\n // https://hacks.mozilla.org/2013/04/detecting-touch-its-the-why-not-the-how/\n // (and https://stackoverflow.com/a/4819886/4543977)\n isTouchDeviceResult\n = (window && 'ontouchstart' in window)\n || navigator.maxTouchPoints > 0\n // @ts-expect-error: msMaxTouchPoints is IE-specific, so needs to be ignored\n || navigator.msMaxTouchPoints > 0\n }\n\n return isTouchDeviceResult\n}\n","import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n// asd\n","/* eslint-disable react/no-unstable-default-props */\n/* eslint-disable unused-imports/no-unused-vars */\nimport React from 'react'\n\nimport { Slot } from '@radix-ui/react-slot'\nimport type { TooltipContentProps } from '@radix-ui/react-tooltip'\n\nimport { Toggle, Tooltip, TooltipContent, TooltipTrigger, icons } from '@/components'\nimport type { ButtonViewReturnComponentProps } from '@/types'\nimport { getShortcutKeys } from '@/utils/plateform'\nimport { cn } from '@/lib/utils'\n\nexport interface ActionButtonProps {\n /* Icon name to display */\n icon?: string\n /* Button title */\n title?: string\n /* Tooltip text */\n tooltip?: string\n /* Whether the button is disabled */\n disabled?: boolean\n /* Keyboard shortcut keys */\n shortcutKeys?: string[]\n /* Custom CSS class */\n customClass?: string\n /* Loading state */\n loading?: boolean\n /* Tooltip options */\n tooltipOptions?: TooltipContentProps\n /* Button color */\n color?: string\n /* Click action handler */\n action?: ButtonViewReturnComponentProps['action']\n /* Active state checker */\n isActive?: ButtonViewReturnComponentProps['isActive']\n /* Child components */\n children?: React.ReactNode\n /* Whether to render as child */\n asChild?: boolean\n /* Whether it's an upload button */\n upload?: boolean\n}\n\nconst ActionButton = React.forwardRef<HTMLButtonElement, Partial<ActionButtonProps>>(\n (props, ref) => {\n const {\n icon = undefined,\n // title = undefined,\n tooltip = undefined,\n disabled = false,\n customClass = '',\n // color = undefined,\n // loading = false,\n shortcutKeys = undefined,\n tooltipOptions = {},\n action = undefined,\n isActive = undefined,\n children,\n asChild = false,\n upload = false,\n ...rest\n } = props\n\n const Icon = icons[icon as string]\n const Comp = asChild ? Slot : Toggle\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Comp\n ref={ref}\n size=\"sm\"\n className={cn('richtext-w-[32px] richtext-h-[32px]', customClass)}\n // pressed={isActive?.() || false}\n disabled={disabled}\n onClick={action}\n data-state={isActive?.() ? 'on' : 'off'}\n {...rest}\n >\n {Icon && <Icon className=\"richtext-w-4 richtext-h-4\" />}\n {children}\n </Comp>\n </TooltipTrigger>\n {tooltip && (\n <TooltipContent {...tooltipOptions}>\n <div className=\"richtext-flex richtext-flex-col richtext-items-center richtext-text-center richtext-max-w-24\">\n <div>{tooltip}</div>\n {!!shortcutKeys?.length && <span>{getShortcutKeys(shortcutKeys)}</span>}\n </div>\n </TooltipContent>\n )}\n </Tooltip>\n )\n },\n)\n\nexport {\n ActionButton,\n}\n","import React from 'react'\n\nimport { Slot } from '@radix-ui/react-slot'\n\nimport { Button, Tooltip, TooltipContent, TooltipTrigger, icons } from '@/components'\nimport type { ButtonViewReturnComponentProps } from '@/types'\nimport { getShortcutKeys } from '@/utils/plateform'\n\nexport interface ActionMenuButtonProps {\n /** Icon name to display */\n icon?: any\n /** Button title text */\n title?: string\n /** Tooltip text */\n tooltip?: string\n /** Whether the button is disabled */\n disabled?: boolean\n /** Keyboard shortcut keys */\n shortcutKeys?: string[]\n /** Button color */\n color?: string\n /** Click action handler */\n action?: ButtonViewReturnComponentProps['action']\n /** Active state checker */\n isActive?: ButtonViewReturnComponentProps['isActive']\n /** Whether to render as child */\n asChild?: boolean\n}\n\nconst ActionMenuButton = React.forwardRef<HTMLButtonElement, ActionMenuButtonProps>(\n ({ asChild, ...props }, ref) => {\n const Icon = icons[props.icon]\n const Comp = asChild ? Slot : Button\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Comp\n ref={ref}\n className=\"richtext-h-[32px] richtext-px-[5px] richtext-py-0 richtext-min-w-24 richtext-overflow-hidden\"\n variant=\"ghost\"\n disabled={props?.disabled}\n {...props}\n >\n <div className=\"richtext-flex richtext-items-center richtext-h-full richtext-font-normal\">\n {props?.title && (\n <div className=\"richtext-flex-grow richtext-text-sm richtext-text-left richtext-truncate\">{props?.title}</div>\n )}\n {Icon && <Icon className=\"richtext-flex-shrink-0 richtext-w-3 richtext-h-3 richtext-ml-1 richtext-text-zinc-500\" />}\n </div>\n </Comp>\n </TooltipTrigger>\n <TooltipContent>\n <div className=\"richtext-flex richtext-flex-col richtext-items-center richtext-text-center richtext-max-w-24\">\n {props?.tooltip && <div>{props?.tooltip}</div>}\n <div className=\"richtext-flex\">\n {!!props?.shortcutKeys?.length && <span>{getShortcutKeys(props?.shortcutKeys)}</span>}\n </div>\n </div>\n </TooltipContent>\n </Tooltip>\n )\n },\n)\n\nexport { ActionMenuButton }\n","import type { Editor } from '@tiptap/core'\n\nexport function deleteNode(nodeType: string, editor: Editor) {\n const { state } = editor\n const $pos = state.selection.$anchor\n let done = false\n\n if ($pos.depth) {\n for (let d = $pos.depth; d > 0; d--) {\n const node = $pos.node(d)\n if (node.type.name === nodeType) {\n // @ts-ignore\n if (editor.dispatchTransaction)\n // @ts-ignore\n editor.dispatchTransaction(state.tr.delete($pos.before(d), $pos.after(d)).scrollIntoView())\n done = true\n }\n }\n }\n else {\n // @ts-ignore\n const node = state.selection.node\n if (node && node.type.name === nodeType) {\n editor.chain().deleteSelection().run()\n done = true\n }\n }\n\n if (!done) {\n const pos = $pos.pos\n\n if (pos) {\n const node = state.tr.doc.nodeAt(pos)\n\n if (node && node.type.name === nodeType) {\n // @ts-ignore\n if (editor.dispatchTransaction)\n // @ts-ignore\n editor.dispatchTransaction(state.tr.delete(pos, pos + node.nodeSize))\n done = true\n }\n }\n }\n\n return done\n}\n","import { useEffect, useRef, useState } from 'react'\n\nimport type { Editor } from '@tiptap/core'\n\nimport deepEqual from 'deep-equal'\n\ntype MapFn<T, R> = (arg: T) => R\n\nfunction mapSelf<T>(d: T): T {\n return d\n}\n\nexport function useAttributes<T, R = T>(editor: Editor, attrbute: string, defaultValue?: T, map?: (arg: T) => R) {\n const mapFn = (map || mapSelf) as MapFn<T, R>\n const [value, setValue] = useState<R>(mapFn(defaultValue as any))\n const prevValueCache = useRef<R>(value)\n\n useEffect(() => {\n const listener = () => {\n const attrs = { ...defaultValue, ...editor.getAttributes(attrbute) } as any\n Object.keys(attrs).forEach((key) => {\n if (attrs[key] === null || attrs[key] === undefined) {\n // @ts-ignore\n attrs[key] = defaultValue[key]\n }\n })\n const nextAttrs = mapFn(attrs)\n if (deepEqual(prevValueCache.current, nextAttrs)) {\n return\n }\n setValue(nextAttrs)\n prevValueCache.current = nextAttrs\n }\n\n editor.on('selectionUpdate', listener)\n editor.on('transaction', listener)\n\n return () => {\n editor.off('selectionUpdate', listener)\n editor.off('transaction', listener)\n }\n }, [editor, defaultValue, attrbute, mapFn])\n\n return value\n}\n","import * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\nexport interface TextareaProps\n extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n ({ className, ...props }, ref) => {\n return (\n <textarea\n className={cn(\n 'richtext-flex richtext-min-h-[80px] richtext-w-full richtext-rounded-md !richtext-border richtext-border-input richtext-bg-background richtext-px-3 richtext-py-2 richtext-text-sm richtext-ring-offset-background placeholder:richtext-text-muted-foreground focus-visible:richtext-outline-none focus-visible:richtext-ring-2 focus-visible:richtext-ring-ring focus-visible:richtext-ring-offset-2 disabled:richtext-cursor-not-allowed disabled:richtext-opacity-50',\n className,\n )}\n ref={ref}\n {...props}\n />\n )\n },\n)\nTextarea.displayName = 'Textarea'\n\nexport { Textarea }\n","import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { type VariantProps, cva } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nconst buttonVariants = cva(\n 'richtext-inline-flex richtext-items-center richtext-justify-center richtext-whitespace-nowrap richtext-rounded-md richtext-text-sm richtext-font-medium richtext-ring-offset-background richtext-transition-colors focus-visible:richtext-outline-none focus-visible:richtext-ring-2 focus-visible:richtext-ring-ring focus-visible:richtext-ring-offset-2 disabled:richtext-pointer-events-none disabled:richtext-opacity-50',\n {\n variants: {\n variant: {\n default: '!richtext-bg-primary !richtext-text-primary-foreground hover:!richtext-bg-primary/90',\n destructive:\n 'richtext-bg-destructive richtext-text-destructive-foreground hover:richtext-bg-destructive/90',\n outline:\n 'richtext-border richtext-border-input richtext-bg-background hover:richtext-bg-accent hover:richtext-text-accent-foreground',\n secondary:\n 'richtext-bg-secondary richtext-text-secondary-foreground hover:richtext-bg-secondary/80',\n ghost: 'hover:richtext-bg-accent hover:richtext-text-accent-foreground',\n link: 'richtext-text-primary richtext-underline-offset-4 hover:richtext-underline',\n },\n size: {\n default: 'richtext-h-10 richtext-px-4 richtext-py-2',\n sm: 'richtext-h-9 richtext-rounded-md richtext-px-3',\n lg: 'richtext-h-11 richtext-rounded-md richtext-px-8',\n icon: 'richtext-h-10 richtext-w-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot : 'button'\n return (\n <Comp\n className={cn(buttonVariants({ variant, size, className }))}\n ref={ref}\n {...props}\n />\n )\n },\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","'use client'\n\nimport * as React from 'react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { Check, ChevronRight, Circle } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'richtext-flex richtext-cursor-default richtext-select-none richtext-items-center richtext-rounded-sm richtext-px-2 richtext-py-1.5 richtext-text-sm richtext-outline-none focus:richtext-bg-accent data-[state=open]:richtext-bg-accent',\n inset && 'richtext-pl-8',\n className,\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"richtext-ml-auto richtext-h-4 richtext-w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName\n = DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'richtext-z-50 richtext-min-w-[8rem] richtext-overflow-hidden richtext-rounded-md !richtext-border richtext-bg-popover richtext-p-1 richtext-text-popover-foreground richtext-shadow-lg data-[state=open]:richtext-animate-in data-[state=closed]:richtext-animate-out data-[state=closed]:richtext-fade-out-0 data-[state=open]:richtext-fade-in-0 data-[state=closed]:richtext-zoom-out-95 data-[state=open]:richtext-zoom-in-95 data-[side=bottom]:richtext-slide-in-from-top-2 data-[side=left]:richtext-slide-in-from-right-2 data-[side=right]:richtext-slide-in-from-left-2 data-[side=top]:richtext-slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n))\nDropdownMenuSubContent.displayName\n = DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'richtext-z-50 richtext-min-w-[8rem] richtext-overflow-hidden richtext-rounded-md !richtext-border richtext-bg-popover richtext-p-1 richtext-text-popover-foreground richtext-shadow-md data-[state=open]:richtext-animate-in data-[state=closed]:richtext-animate-out data-[state=closed]:richtext-fade-out-0 data-[state=open]:richtext-fade-in-0 data-[state=closed]:richtext-zoom-out-95 data-[state=open]:richtext-zoom-in-95 data-[side=bottom]:richtext-slide-in-from-top-2 data-[side=left]:richtext-slide-in-from-right-2 data-[side=right]:richtext-slide-in-from-left-2 data-[side=top]:richtext-slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'richtext-relative richtext-flex richtext-cursor-default richtext-select-none richtext-items-center richtext-rounded-sm richtext-px-2 richtext-py-1.5 richtext-text-sm richtext-outline-none richtext-transition-colors focus:richtext-bg-accent focus:richtext-text-accent-foreground data-[disabled]:richtext-pointer-events-none data-[disabled]:richtext-opacity-50',\n inset && 'richtext-pl-8',\n className,\n )}\n {...props}\n />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'richtext-relative richtext-flex richtext-cursor-default richtext-select-none richtext-items-center richtext-rounded-sm richtext-py-1.5 richtext-pl-8 richtext-pr-2 richtext-text-sm richtext-outline-none richtext-transition-colors focus:richtext-bg-accent focus:richtext-text-accent-foreground data-[disabled]:richtext-pointer-events-none data-[disabled]:richtext-opacity-50',\n className,\n )}\n checked={checked}\n {...props}\n >\n <span className=\"richtext-absolute richtext-left-2 richtext-flex richtext-h-3.5 richtext-w-3.5 richtext-items-center richtext-justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"richtext-h-4 richtext-w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName\n = DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n 'richtext-relative richtext-flex richtext-cursor-default richtext-select-none richtext-items-center richtext-rounded-sm richtext-py-1.5 richtext-pl-8 richtext-pr-2 richtext-text-sm richtext-outline-none richtext-transition-colors focus:richtext-bg-accent focus:richtext-text-accent-foreground data-[disabled]:richtext-pointer-events-none data-[disabled]:richtext-opacity-50',\n className,\n )}\n {...props}\n >\n <span className=\"richtext-absolute richtext-left-2 richtext-flex richtext-h-3.5 richtext-w-3.5 richtext-items-center richtext-justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"richtext-h-2 richtext-w-2 richtext-fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n 'richtext-px-2 richtext-py-1.5 richtext-text-sm richtext-font-semibold',\n inset && 'richtext-pl-8',\n className,\n )}\n {...props}\n />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn('richtext--mx-1 richtext-my-1 richtext-h-px richtext-bg-muted', className)}\n {...props}\n />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nfunction DropdownMenuShortcut({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) {\n return (\n <span\n className={cn('richtext-ml-auto richtext-text-xs richtext-tracking-widest richtext-opacity-60', className)}\n {...props}\n />\n )\n}\nDropdownMenuShortcut.displayName = 'DropdownMenuShortcut'\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuGroup,\n DropdownMenuPortal,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuRadioGroup,\n}\n","import * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\nexport interface InputProps\n extends React.InputHTMLAttributes<HTMLInputElement> {}\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n className={cn(\n 'richtext-flex richtext-h-10 richtext-w-full richtext-rounded-md !richtext-border richtext-border-input richtext-bg-background richtext-px-3 richtext-py-2 richtext-text-sm richtext-ring-offset-background file:richtext-border-0 file:richtext-bg-transparent file:richtext-text-sm file:richtext-font-medium placeholder:richtext-text-muted-foreground focus-visible:richtext-outline-none disabled:richtext-cursor-not-allowed disabled:richtext-opacity-50',\n className,\n )}\n ref={ref}\n {...props}\n />\n )\n },\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","'use client'\n\nimport * as React from 'react'\nimport * as LabelPrimitive from '@radix-ui/react-label'\nimport { type VariantProps, cva } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nconst labelVariants = cva(\n 'richtext-text-sm richtext-font-medium richtext-leading-none peer-disabled:richtext-cursor-not-allowed peer-disabled:richtext-opacity-70',\n)\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n","'use client'\n\nimport * as React from 'react'\nimport * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport { cn } from '@/lib/utils'\n\nconst Popover = PopoverPrimitive.Root\n\nconst PopoverTrigger = PopoverPrimitive.Trigger\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'richtext-z-50 richtext-w-72 richtext-rounded-md !richtext-border richtext-bg-popover richtext-p-4 richtext-text-popover-foreground richtext-shadow-md richtext-outline-none data-[state=open]:richtext-animate-in data-[state=closed]:richtext-animate-out data-[state=closed]:richtext-fade-out-0 data-[state=open]:richtext-fade-in-0 data-[state=closed]:richtext-zoom-out-95 data-[state=open]:richtext-zoom-in-95 data-[side=bottom]:richtext-slide-in-from-top-2 data-[side=left]:richtext-slide-in-from-right-2 data-[side=right]:richtext-slide-in-from-left-2 data-[side=top]:richtext-slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n))\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\nexport { Popover, PopoverTrigger, PopoverContent }\n","'use client'\n\nimport * as React from 'react'\nimport * as SeparatorPrimitive from '@radix-ui/react-separator'\n\nimport { cn } from '@/lib/utils'\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = 'horizontal', decorative = true, ...props },\n ref,\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'richtext-shrink-0 richtext-bg-border',\n orientation === 'horizontal' ? 'richtext-h-[1px] richtext-w-full' : 'richtext-h-full richtext-w-[1px]',\n className,\n )}\n {...props}\n />\n ),\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n","'use client'\n\nimport * as React from 'react'\nimport * as SwitchPrimitives from '@radix-ui/react-switch'\n\nimport { cn } from '@/lib/utils'\n\nconst Switch = React.forwardRef<\n React.ElementRef<typeof SwitchPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n <SwitchPrimitives.Root\n className={cn(\n 'richtext-peer richtext-inline-flex richtext-h-6 richtext-w-11 richtext-shrink-0 richtext-cursor-pointer richtext-items-center richtext-rounded-full richtext-border-2 richtext-border-transparent richtext-transition-colors focus-visible:richtext-outline-none focus-visible:richtext-ring-2 focus-visible:richtext-ring-ring focus-visible:richtext-ring-offset-2 focus-visible:richtext-ring-offset-background disabled:richtext-cursor-not-allowed disabled:richtext-opacity-50 data-[state=checked]:richtext-bg-primary data-[state=unchecked]:richtext-bg-input',\n className,\n )}\n {...props}\n ref={ref}\n >\n <SwitchPrimitives.Thumb\n className={cn(\n 'richtext-pointer-events-none richtext-block richtext-h-5 richtext-w-5 richtext-rounded-full richtext-bg-background richtext-shadow-lg richtext-ring-0 richtext-transition-transform data-[state=checked]:richtext-translate-x-5 data-[state=unchecked]:richtext-translate-x-0',\n )}\n />\n </SwitchPrimitives.Root>\n))\nSwitch.displayName = SwitchPrimitives.Root.displayName\n\nexport { Switch }\n","'use client'\n\nimport * as React from 'react'\nimport * as TabsPrimitive from '@radix-ui/react-tabs'\n\nimport { cn } from '@/lib/utils'\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n className={cn(\n 'richtext-inline-flex richtext-h-10 richtext-items-center richtext-justify-center richtext-rounded-md richtext-bg-muted richtext-p-1 richtext-text-muted-foreground',\n className,\n )}\n {...props}\n />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n className={cn(\n 'richtext-inline-flex richtext-items-center richtext-justify-center richtext-whitespace-nowrap richtext-rounded-sm richtext-px-3 richtext-py-1.5 richtext-text-sm richtext-font-medium richtext-ring-offset-background richtext-transition-all focus-visible:richtext-outline-none focus-visible:richtext-ring-2 focus-visible:richtext-ring-ring focus-visible:richtext-ring-offset-2 disabled:richtext-pointer-events-none disabled:richtext-opacity-50 data-[state=active]:richtext-bg-background data-[state=active]:richtext-text-foreground data-[state=active]:richtext-shadow-sm',\n className,\n )}\n {...props}\n />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n React.ElementRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n className={cn(\n 'richtext-mt-2 richtext-ring-offset-background focus-visible:richtext-outline-none focus-visible:richtext-ring-2 focus-visible:richtext-ring-ring focus-visible:richtext-ring-offset-2',\n className,\n )}\n {...props}\n />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n","'use client'\n\nimport * as React from 'react'\nimport * as ToastPrimitives from '@radix-ui/react-toast'\nimport { type VariantProps, cva } from 'class-variance-authority'\nimport { X } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nconst ToastProvider = ToastPrimitives.Provider\n\nconst ToastViewport = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Viewport>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Viewport\n ref={ref}\n className={cn(\n 'richtext-fixed richtext-top-0 richtext-z-[100] richtext-flex richtext-max-h-screen richtext-w-full richtext-flex-col-reverse richtext-p-4 sm:richtext-bottom-0 sm:richtext-right-0 sm:richtext-top-auto sm:richtext-flex-col md:richtext-max-w-[420px]',\n className,\n )}\n {...props}\n />\n))\nToastViewport.displayName = ToastPrimitives.Viewport.displayName\n\nconst toastVariants = cva(\n 'richtext-group richtext-pointer-events-auto richtext-relative richtext-flex richtext-w-full richtext-items-center richtext-justify-between richtext-space-x-4 richtext-overflow-hidden richtext-rounded-md !richtext-border richtext-p-6 richtext-pr-8 richtext-shadow-lg richtext-transition-all data-[swipe=cancel]:richtext-translate-x-0 data-[swipe=end]:richtext-translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:richtext-translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:richtext-transition-none data-[state=open]:richtext-animate-in data-[state=closed]:richtext-animate-out data-[swipe=end]:richtext-animate-out data-[state=closed]:richtext-fade-out-80 data-[state=closed]:richtext-slide-out-to-right-full data-[state=open]:richtext-slide-in-from-top-full data-[state=open]:sm:richtext-slide-in-from-bottom-full',\n {\n variants: {\n variant: {\n default: 'richtext-border richtext-bg-background richtext-text-foreground',\n destructive:\n 'richtext-destructive richtext-group richtext-border-destructive richtext-bg-destructive richtext-text-destructive-foreground',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n },\n)\n\nconst Toast = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Root>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> &\n VariantProps<typeof toastVariants>\n>(({ className, variant, ...props }, ref) => {\n return (\n <ToastPrimitives.Root\n ref={ref}\n className={cn(toastVariants({ variant }), className)}\n {...props}\n />\n )\n})\nToast.displayName = ToastPrimitives.Root.displayName\n\nconst ToastAction = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Action>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Action\n ref={ref}\n className={cn(\n 'richtext-inline-flex richtext-h-8 richtext-shrink-0 richtext-items-center richtext-justify-center richtext-rounded-md !richtext-border richtext-bg-transparent richtext-px-3 richtext-text-sm richtext-font-medium richtext-ring-offset-background richtext-transition-colors hover:richtext-bg-secondary focus:richtext-outline-none focus:richtext-ring-2 focus:richtext-ring-ring focus:richtext-ring-offset-2 disabled:richtext-pointer-events-none disabled:richtext-opacity-50 group-[.destructive]:richtext-border-muted/40 group-[.destructive]:hover:richtext-border-destructive/30 group-[.destructive]:hover:richtext-bg-destructive group-[.destructive]:hover:richtext-text-destructive-foreground group-[.destructive]:focus:richtext-ring-destructive',\n className,\n )}\n {...props}\n />\n))\nToastAction.displayName = ToastPrimitives.Action.displayName\n\nconst ToastClose = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Close>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Close\n ref={ref}\n className={cn(\n 'richtext-absolute richtext-right-2 richtext-top-2 richtext-rounded-md richtext-p-1 richtext-text-foreground/50 richtext-opacity-0 richtext-transition-opacity hover:richtext-text-foreground focus:richtext-opacity-100 focus:richtext-outline-none focus:richtext-ring-2 group-hover:richtext-opacity-100 group-[.destructive]:richtext-text-red-300 group-[.destructive]:hover:richtext-text-red-50 group-[.destructive]:focus:richtext-ring-red-400 group-[.destructive]:focus:richtext-ring-offset-red-600',\n className,\n )}\n toast-close=\"\"\n {...props}\n >\n <X className=\"richtext-h-4 richtext-w-4\" />\n </ToastPrimitives.Close>\n))\nToastClose.displayName = ToastPrimitives.Close.displayName\n\nconst ToastTitle = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Title>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Title\n ref={ref}\n className={cn('richtext-text-sm richtext-font-semibold', className)}\n {...props}\n />\n))\nToastTitle.displayName = ToastPrimitives.Title.displayName\n\nconst ToastDescription = React.forwardRef<\n React.ElementRef<typeof ToastPrimitives.Description>,\n React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>\n>(({ className, ...props }, ref) => (\n <ToastPrimitives.Description\n ref={ref}\n className={cn('richtext-text-sm richtext-opacity-90', className)}\n {...props}\n />\n))\nToastDescription.displayName = ToastPrimitives.Description.displayName\n\ntype ToastProps = React.ComponentPropsWithoutRef<typeof Toast>\n\ntype ToastActionElement = React.ReactElement<typeof ToastAction>\n\nexport {\n type ToastProps,\n type ToastActionElement,\n ToastProvider,\n ToastViewport,\n Toast,\n ToastTitle,\n ToastDescription,\n ToastClose,\n ToastAction,\n}\n","'use client'\n\nimport * as React from 'react'\nimport * as TogglePrimitive from '@radix-ui/react-toggle'\nimport { type VariantProps, cva } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nconst toggleVariants = cva(\n 'richtext-inline-flex richtext-items-center richtext-justify-center richtext-rounded-md richtext-text-sm richtext-font-medium richtext-ring-offset-background richtext-transition-colors hover:richtext-bg-muted hover:richtext-text-muted-foreground focus-visible:richtext-outline-none focus-visible:richtext-ring-2 focus-visible:richtext-ring-ring focus-visible:richtext-ring-offset-2 disabled:richtext-pointer-events-none disabled:richtext-opacity-50 data-[state=on]:richtext-bg-accent data-[state=on]:richtext-text-accent-foreground',\n {\n variants: {\n variant: {\n default: 'richtext-bg-transparent',\n outline:\n 'richtext-border richtext-border-input richtext-bg-transparent hover:richtext-bg-accent hover:richtext-text-accent-foreground',\n },\n size: {\n default: 'richtext-h-10 richtext-px-3',\n sm: 'richtext-h-9 richtext-px-2',\n lg: 'richtext-h-11 richtext-px-5',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n },\n)\n\nconst Toggle = React.forwardRef<\n React.ElementRef<typeof TogglePrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>\n>(({ className, variant, size, ...props }, ref) => (\n <TogglePrimitive.Root\n ref={ref}\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n))\n\nToggle.displayName = TogglePrimitive.Root.displayName\n\nexport { Toggle, toggleVariants }\n","'use client'\n\nimport * as React from 'react'\nimport * as TooltipPrimitive from '@radix-ui/react-tooltip'\n\nimport { cn } from '@/lib/utils'\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n React.ElementRef<typeof TooltipPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <TooltipPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'richtext-z-50 richtext-overflow-hidden richtext-rounded-md !richtext-border richtext-bg-popover richtext-px-3 richtext-py-1.5 richtext-text-sm richtext-text-popover-foreground richtext-shadow-md richtext-animate-in richtext-fade-in-0 richtext-zoom-in-95 data-[state=closed]:richtext-animate-out data-[state=closed]:richtext-fade-out-0 data-[state=closed]:richtext-zoom-out-95 data-[side=bottom]:richtext-slide-in-from-top-2 data-[side=left]:richtext-slide-in-from-right-2 data-[side=right]:richtext-slide-in-from-left-2 data-[side=top]:richtext-slide-in-from-bottom-2',\n className,\n )}\n {...props}\n />\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n","/* eslint-disable unused-imports/no-unused-vars */\n'use client'\n\n// Inspired by react-hot-toast library\nimport * as React from 'react'\n\nimport type {\n ToastActionElement,\n ToastProps,\n} from '@/components/ui/toast'\n\nconst TOAST_LIMIT = 1\nconst TOAST_REMOVE_DELAY = 1000000\n\ntype ToasterToast = ToastProps & {\n id: string\n title?: React.ReactNode\n description?: React.ReactNode\n action?: ToastActionElement\n}\n\nconst actionTypes = {\n ADD_TOAST: 'ADD_TOAST',\n UPDATE_TOAST: 'UPDATE_TOAST',\n DISMISS_TOAST: 'DISMISS_TOAST',\n REMOVE_TOAST: 'REMOVE_TOAST',\n} as const\n\nlet count = 0\n\nfunction genId() {\n count = (count + 1) % Number.MAX_SAFE_INTEGER\n return count.toString()\n}\n\ntype ActionType = typeof actionTypes\n\ntype Action =\n | {\n type: ActionType['ADD_TOAST']\n toast: ToasterToast\n }\n | {\n type: ActionType['UPDATE_TOAST']\n toast: Partial<ToasterToast>\n }\n | {\n type: ActionType['DISMISS_TOAST']\n toastId?: ToasterToast['id']\n }\n | {\n type: ActionType['REMOVE_TOAST']\n toastId?: ToasterToast['id']\n }\n\ninterface State {\n toasts: ToasterToast[]\n}\n\nconst toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>()\n\nfunction addToRemoveQueue(toastId: string) {\n if (toastTimeouts.has(toastId)) {\n return\n }\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId)\n dispatch({\n type: 'REMOVE_TOAST',\n toastId,\n })\n }, TOAST_REMOVE_DELAY)\n\n toastTimeouts.set(toastId, timeout)\n}\n\nexport function reducer(state: State, action: Action): State {\n switch (action.type) {\n case 'ADD_TOAST':\n return {\n ...state,\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n }\n\n case 'UPDATE_TOAST':\n return {\n ...state,\n toasts: state.toasts.map(t =>\n t.id === action.toast.id ? { ...t, ...action.toast } : t,\n ),\n }\n\n case 'DISMISS_TOAST': {\n const { toastId } = action\n\n // ! Side effects ! - This could be extracted into a dismissToast() action,\n // but I'll keep it here for simplicity\n if (toastId) {\n addToRemoveQueue(toastId)\n }\n else {\n state.toasts.forEach((toast) => {\n addToRemoveQueue(toast.id)\n })\n }\n\n return {\n ...state,\n toasts: state.toasts.map(t =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n open: false,\n }\n : t,\n ),\n }\n }\n case 'REMOVE_TOAST':\n if (action.toastId === undefined) {\n return {\n ...state,\n toasts: [],\n }\n }\n return {\n ...state,\n toasts: state.toasts.filter(t => t.id !== action.toastId),\n }\n }\n}\n\nconst listeners: Array<(state: State) => void> = []\n\nlet memoryState: State = { toasts: [] }\n\nfunction dispatch(action: Action) {\n memoryState = reducer(memoryState, action)\n listeners.forEach((listener) => {\n listener(memoryState)\n })\n}\n\ntype Toast = Omit<ToasterToast, 'id'>\n\nfunction toast({ ...props }: Toast) {\n const id = genId()\n\n const update = (props: ToasterToast) =>\n dispatch({\n type: 'UPDATE_TOAST',\n toast: { ...props, id },\n })\n const dismiss = () => dispatch({ type: 'DISMISS_TOAST', toastId: id })\n\n dispatch({\n type: 'ADD_TOAST',\n toast: {\n ...props,\n id,\n open: true,\n onOpenChange: (open) => {\n if (!open)\n dismiss()\n },\n },\n })\n\n return {\n id,\n dismiss,\n update,\n }\n}\n\nfunction useToast() {\n const [state, setState] = React.useState<State>(memoryState)\n\n React.useEffect(() => {\n listeners.push(setState)\n return () => {\n const index = listeners.indexOf(setState)\n if (index > -1) {\n listeners.splice(index, 1)\n }\n }\n }, [state])\n\n return {\n ...state,\n toast,\n dismiss: (toastId?: string) => dispatch({ type: 'DISMISS_TOAST', toastId }),\n }\n}\n\nexport { useToast, toast }\n","import { BubbleMenu } from '@tiptap/react'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\nimport { HelpCircle, Pencil, Trash2 } from 'lucide-react'\nimport { Katex } from '@/extensions'\nimport { deleteNode } from '@/utils/delete-node'\nimport { useAttributes } from '@/hooks/useAttributes'\nimport type { IKatexAttrs } from '@/extensions/Katex'\nimport { Textarea } from '@/components/ui/textarea'\nimport { ActionButton } from '@/components/ActionButton'\nimport { Button } from '@/components/ui'\n\nfunction BubbleMenuKatex({ editor, ...props }: any) {\n const attrs = useAttributes<IKatexAttrs>(editor, Katex.name, {\n text: '',\n defaultShowPicker: false,\n })\n const { text, defaultShowPicker } = attrs\n const ref: any = useRef<HTMLTextAreaElement>()\n const [visible, toggleVisible] = useState(false)\n\n const shouldShow = useCallback(() => editor.isActive(Katex.name), [editor])\n\n const deleteMe = useCallback(() => deleteNode(Katex.name, editor), [editor])\n\n const submit = useCallback(() => {\n editor.chain().focus().setKatex({ text: ref.current.value }).run()\n }, [editor])\n\n useEffect(() => {\n if (defaultShowPicker) {\n toggleVisible(true)\n editor.chain().updateAttributes(Katex.name, { defaultShowPicker: false }).focus().run()\n }\n }, [editor, defaultShowPicker, toggleVisible])\n\n useEffect(() => {\n if (visible) {\n setTimeout(() => ref.current?.focus(), 200)\n }\n }, [visible])\n\n return (\n <BubbleMenu\n editor={editor}\n pluginKey=\"Katex-bubble-menu\"\n shouldShow={shouldShow}\n tippyOptions={{\n popperOptions: {\n modifiers: [{ name: 'flip', enabled: false }],\n },\n placement: 'bottom-start',\n offset: [-2, 16],\n zIndex: 9999,\n onHidden: () => {\n toggleVisible(false)\n },\n }}\n >\n {props?.disabled\n ? (\n <></>\n )\n : (\n <div className=\"richtext-p-2 richtext-bg-white !richtext-border richtext-rounded-lg richtext-shadow-sm dark:richtext-bg-black richtext-border-neutral-200 dark:richtext-border-neutral-800\">\n {visible\n ? (\n <>\n <Textarea\n ref={ref}\n autoFocus\n placeholder=\"Formula text\"\n rows={3}\n defaultValue={text}\n style={{ marginBottom: 8 }}\n />\n <div className=\"richtext-flex richtext-items-center richtext-justify-between richtext-gap-[6px]\">\n <Button onClick={submit} className=\"richtext-flex-1\">Submit</Button>\n\n <a href=\"https://katex.org/\" target=\"_blank\" rel=\"noreferrer noopener\">\n <HelpCircle size={16} />\n </a>\n </div>\n </>\n )\n : (\n <div className=\"richtext-flex richtext-items-center richtext-justify-center richtext-gap-[6px]\">\n <ActionButton tooltip=\"Edit\" action={() => toggleVisible(!visible)}>\n <Pencil size={16} />\n </ActionButton>\n\n <ActionButton tooltip=\"Delete\" action={deleteMe}>\n <Trash2 size={16} />\n </ActionButton>\n </div>\n )}\n </div>\n )}\n\n </BubbleMenu>\n )\n}\n\nexport default BubbleMenuKatex\n","import type { Editor } from '@tiptap/core'\n\nimport { BubbleMenuImage, BubbleMenuLink, BubbleMenuText, BubbleMenuVideo, ColumnsBubbleMenu, ContentMenu, TableBubbleMenu } from '@/components'\nimport type { BubbleMenuProps as BubbleMenuPropsType } from '@/types'\nimport BubbleMenuKatex from '@/components/menus/components/BubbleMenuKatex'\n\nexport interface BubbleMenuComponentProps {\n editor: Editor\n disabled?: boolean\n bubbleMenu?: BubbleMenuPropsType\n}\n\n/**\n * Bubble Menu Component\n *\n * @param editor Editor instance\n * @param disabled Whether the menu is disabled\n * @param bubbleMenu Bubble menu configuration\n * @returns Bubble menu component\n */\nexport function BubbleMenu({ editor, disabled, bubbleMenu }: BubbleMenuComponentProps) {\n const extensionsNames = editor.extensionManager.extensions.map(ext => ext.name)\n\n const renderMenuItems = () => [\n extensionsNames.includes('columns') && !bubbleMenu?.columnConfig?.hidden ? <ColumnsBubbleMenu key=\"columns\" editor={editor} /> : null,\n extensionsNames.includes('table') && !bubbleMenu?.tableConfig?.hidden ? <TableBubbleMenu key=\"table\" editor={editor} /> : null,\n extensionsNames.includes('link') && !bubbleMenu?.linkConfig?.hidden ? <BubbleMenuLink key=\"link\" editor={editor} disabled={disabled} /> : null,\n extensionsNames.includes('image') && !bubbleMenu?.imageConfig?.hidden ? <BubbleMenuImage key=\"image\" editor={editor} disabled={disabled} /> : null,\n extensionsNames.includes('video') && !bubbleMenu?.videoConfig?.hidden ? <BubbleMenuVideo key=\"video\" editor={editor} disabled={disabled} /> : null,\n extensionsNames.includes('katex') && !bubbleMenu?.katexConfig?.hidden ? <BubbleMenuKatex key=\"katex\" editor={editor} disabled={disabled} /> : null,\n !bubbleMenu?.floatingMenuConfig?.hidden ? <ContentMenu key=\"content\" editor={editor} disabled={disabled} /> : null,\n !bubbleMenu?.textConfig?.hidden ? <BubbleMenuText key=\"text\" editor={editor} disabled={disabled} /> : null,\n ]\n\n if (bubbleMenu?.render) {\n return bubbleMenu.render({ editor, disabled: disabled || false, bubbleMenu }, renderMenuItems())\n }\n\n return renderMenuItems().filter(Boolean)\n}\n","const locale = {\n 'editor.remove': 'Remove',\n 'editor.copy': 'Copy',\n 'editor.words': 'WORDS',\n 'editor.characters': 'CHARACTERS',\n 'editor.default': 'Default',\n 'editor.recent': 'Recently Used',\n 'editor.nofill': 'No Fill',\n 'editor.format': 'Format Painter',\n 'editor.table_of_content': 'Table of Content',\n 'editor.draghandle.tooltip': 'Modify',\n 'editor.copyToClipboard': 'CopyToClipboard',\n 'editor.importWord.tooltip': 'Import Word',\n 'editor.slash': 'Press \\'/\\' for commands',\n 'editor.slash.empty': 'No Result',\n 'editor.slash.format': 'Format',\n 'editor.slash.insert': 'Insert',\n 'editor.slash.embed': 'Embed Services',\n 'editor.content': 'Please input content',\n 'editor.fontFamily.tooltip': 'Font Family',\n 'editor.fontFamily.default.tooltip': 'Default',\n 'editor.moremark': 'More Text Styles',\n 'editor.size.small.tooltip': 'Small',\n 'editor.size.medium.tooltip': 'Medium',\n 'editor.size.large.tooltip': 'Cover',\n 'editor.bold.tooltip': 'Bold',\n 'editor.italic.tooltip': 'Italic',\n 'editor.underline.tooltip': 'Underline',\n 'editor.strike.tooltip': 'Strike',\n 'editor.color.tooltip': 'Color',\n 'editor.color.more': 'More Colors',\n 'editor.highlight.tooltip': 'Highlight',\n 'editor.lineheight.tooltip': 'Line Height',\n 'editor.heading.tooltip': 'Headings',\n 'editor.heading.h1.tooltip': 'Heading 1',\n 'editor.heading.h2.tooltip': 'Heading 2',\n 'editor.heading.h3.tooltip': 'Heading 3',\n 'editor.heading.h4.tooltip': 'Heading 4',\n 'editor.heading.h5.tooltip': 'Heading 5',\n 'editor.heading.h6.tooltip': 'Heading 6',\n 'editor.paragraph.tooltip': 'Paragraph',\n 'editor.textalign.tooltip': 'Align',\n 'editor.textalign.left.tooltip': 'Left',\n 'editor.textalign.center.tooltip': 'Center',\n 'editor.textalign.right.tooltip': 'Right',\n 'editor.textalign.justify.tooltip': 'Justify',\n 'editor.indent': 'Indent',\n 'editor.indent.indent': 'Increase Indent',\n 'editor.indent.outdent': 'Decrease Indent',\n 'editor.fontSize.tooltip': 'Font size',\n 'editor.fontSize.default.tooltip': 'Default',\n 'editor.superscript.tooltip': 'Superscript',\n 'editor.subscript.tooltip': 'Subscript',\n 'editor.bulletlist.tooltip': 'Bullet List',\n 'editor.orderedlist.tooltip': 'Ordered List',\n 'editor.tasklist.tooltip': 'Task List',\n 'editor.indent.tooltip': 'Indent',\n 'editor.outdent.tooltip': 'Outdent',\n 'editor.columns.tooltip': 'Columns',\n 'editor.link.tooltip': 'Link',\n 'editor.link.unlink.tooltip': 'UnLink',\n 'editor.link.open.tooltip': 'Open Link',\n 'editor.link.edit.tooltip': 'Edit Link',\n 'editor.link.dialog.title': 'Insert Link',\n 'editor.link.dialog.link': 'Link',\n 'editor.link.dialog.text': 'Text',\n 'editor.link.dialog.openInNewTab': 'Open In New Tab',\n 'editor.link.dialog.link.placeholder': 'Link Address',\n 'editor.link.dialog.text.placeholder': 'Add Description',\n 'editor.link.dialog.button.apply': 'Apply',\n 'editor.image.tooltip': 'Image',\n 'editor.image.dragger.tooltip': 'Click or drag the image to the area to upload',\n 'editor.image.float.left.tooltip': 'Float left',\n 'editor.image.float.none.tooltip': 'Float none',\n 'editor.image.float.right.tooltip': 'Float right',\n 'editor.image.dialog.title': 'Add an image',\n 'editor.image.dialog.tab.url': 'Url',\n 'editor.image.dialog.tab.upload': 'Upload',\n 'editor.image.dialog.uploading': 'Uploading',\n 'editor.image.dialog.form.link': 'Link',\n 'editor.image.dialog.placeholder': 'Link',\n 'editor.image.dialog.form.alt': 'Alt',\n 'editor.image.dialog.form.aspectRatio': 'Lock original aspect ratio',\n 'editor.image.dialog.form.file': 'File',\n 'editor.image.dialog.button.apply': 'apply',\n 'editor.video.tooltip': 'Video',\n 'editor.video.dialog.tab.upload': 'Upload',\n 'editor.video.dialog.uploading': 'Uploading',\n 'editor.video.dialog.title': 'Embed or upload a video',\n 'editor.video.dialog.link': 'link',\n 'editor.video.dialog.placeholder': 'Link',\n 'editor.video.dialog.button.apply': 'apply',\n 'editor.table.tooltip': 'Table',\n 'editor.table.menu.insert_table': 'Insert Table',\n 'editor.table.menu.insert_table.with_header_row': 'With header row',\n 'editor.table.menu.add_column_before': 'Add Column Before',\n 'editor.table.menu.add_column_after': 'Add Column After',\n 'editor.table.menu.delete_column': 'Delete Column',\n 'editor.table.menu.add_row_before': 'Add Row Before',\n 'editor.table.menu.add_row_after': 'Add Row After',\n 'editor.table.menu.delete_row': 'Delete Row',\n 'editor.table.menu.merge_or_split_cells': 'Merge Or Split Cells',\n 'editor.table.menu.delete_table': 'Delete Table',\n 'editor.blockquote.tooltip': 'Blockquote',\n 'editor.horizontalrule.tooltip': 'Horizontal Rule',\n 'editor.code.tooltip': 'Code',\n 'editor.codeblock.tooltip': 'Code Block',\n 'editor.clear.tooltip': 'Clear Format',\n 'editor.undo.tooltip': 'Undo',\n 'editor.redo.tooltip': 'Redo',\n 'editor.fullscreen.tooltip.fullscreen': 'Fullscreen',\n 'editor.fullscreen.tooltip.exit': 'Fullscreen Exit',\n 'editor.imageUpload.fileTypeNotSupported': 'File type not supported',\n 'editor.imageUpload.fileSizeTooBig': 'File size too big, Maximum size is',\n 'editor.table.menu.insertColumnBefore': 'Insert Column Before',\n 'editor.table.menu.insertColumnAfter': 'Insert Column After',\n 'editor.table.menu.deleteColumn': 'Delete Column',\n 'editor.table.menu.insertRowAbove': 'Insert Row Above',\n 'editor.table.menu.insertRowBelow': 'Insert Row Below',\n 'editor.table.menu.deleteRow': 'Delete Row',\n 'editor.table.menu.mergeCells': 'Merge Cells',\n 'editor.table.menu.splitCells': 'Split Cells',\n 'editor.table.menu.deleteTable': 'Delete Table',\n 'editor.table.menu.setCellsBgColor': 'Cell Background Color',\n 'editor.emoji.tooltip': 'Emoji',\n 'editor.iframe.tooltip': 'Iframe',\n 'editor.searchAndReplace.tooltip': 'Search and Replace',\n 'editor.search.dialog.text': 'Search',\n 'editor.replace.dialog.text': 'Replace',\n 'editor.replaceAll.dialog.text': 'Replace All',\n 'editor.previous.dialog.text': 'Previous',\n 'editor.next.dialog.text': 'Next',\n 'no_result_found': 'No results found',\n 'Smileys & People': 'Smileys & People',\n 'Animals & Nature': 'Animals & Nature',\n 'Food & Drink': 'Food & Drink',\n 'Activity': 'Activity',\n 'Travel & Places': 'Travel & Places',\n 'Object': 'Objects',\n 'Symbol': 'Symbols',\n 'Flags': 'Flags',\n 'Frequently used': 'Frequently used',\n 'editor.formula.dialog.text': 'Formula',\n 'editor.katex.tooltip': 'Math Formula',\n 'editor.exportPdf.tooltip': 'Export PDF',\n 'editor.exportWord.tooltip': 'Export Word',\n 'editor.importWrod.tooltip': 'Import Word',\n}\n\nexport default locale\n","const locale = {\n 'editor.remove': 'Xóa',\n 'editor.copy': 'Sao chép',\n 'editor.words': 'TỪ',\n 'editor.characters': 'KÝ TỰ',\n 'editor.default': 'Mặc định',\n 'editor.recent': 'Đã sử dụng gần đây',\n 'editor.nofill': 'Không tô',\n 'editor.format': 'Format Painter',\n 'editor.table_of_content': 'Mục lục',\n 'editor.draghandle.tooltip': 'Sửa đổi',\n 'editor.copyToClipboard': 'CopyToClipboard',\n 'editor.importWord.tooltip': 'Nhập Word',\n 'editor.slash': 'Nhấn \\'/\\' để biết lệnh',\n 'editor.slash.empty': 'Không có kết quả',\n 'editor.slash.format': 'Định dạng',\n 'editor.slash.insert': 'Chèn',\n 'editor.slash.embed': 'Dịch vụ nhúng',\n 'editor.content': 'Vui lòng nhập nội dung',\n 'editor.moremark': 'Nhiều kiểu văn bản hơn',\n 'editor.size.small.tooltip': 'Nhỏ',\n 'editor.fontFamily.tooltip': 'Phông chữ',\n 'editor.fontFamily.default.tooltip': 'Mặc định',\n 'editor.size.medium.tooltip': 'Trung bình',\n 'editor.size.large.tooltip': 'Lớn',\n 'editor.bold.tooltip': 'Đậm',\n 'editor.italic.tooltip': 'In nghiêng',\n 'editor.underline.tooltip': 'Gạch chân',\n 'editor.strike.tooltip': 'Gạch',\n 'editor.color.tooltip': 'Màu',\n 'editor.color.more': 'Nhiều màu hơn',\n 'editor.highlight.tooltip': 'Đánh dấu',\n 'editor.lineheight.tooltip': 'Chiều cao dòng',\n 'editor.heading.tooltip': 'Tiêu đề',\n 'editor.heading.h1.tooltip': 'Tiêu đề 1',\n 'editor.heading.h2.tooltip': 'Tiêu đề 2',\n 'editor.heading.h3.tooltip': 'Tiêu đề 3',\n 'editor.heading.h4.tooltip': 'Tiêu đề 4',\n 'editor.heading.h5.tooltip': 'Tiêu đề 5',\n 'editor.heading.h6.tooltip': 'Tiêu đề 6',\n 'editor.paragraph.tooltip': 'Đoạn văn',\n 'editor.textalign.tooltip': 'Căn chỉnh',\n 'editor.textalign.left.tooltip': 'Trái',\n 'editor.textalign.center.tooltip': 'Giữa',\n 'editor.textalign.right.tooltip': 'Phải',\n 'editor.textalign.justify.tooltip': 'Căn đều',\n 'editor.indent': 'Thụt lề',\n 'editor.indent.indent': 'Tăng thụt lề',\n 'editor.indent.outdent': 'Giảm thụt lề',\n 'editor.fontSize.tooltip': 'Kích thước phông chữ',\n 'editor.fontSize.default.tooltip': 'Mặc định',\n 'editor.superscript.tooltip': 'Chỉ số trên',\n 'editor.subscript.tooltip': 'Chỉ số dưới',\n 'editor.bulletlist.tooltip': 'Danh sách dấu đầu dòng',\n 'editor.orderedlist.tooltip': 'Danh sách có thứ tự',\n 'editor.tasklist.tooltip': 'Danh sách tác vụ',\n 'editor.indent.tooltip': 'Tăng thụt lề',\n 'editor.outdent.tooltip': 'Giảm thụt lề',\n 'editor.columns.tooltip': 'Cột',\n 'editor.link.tooltip': 'Liên kết',\n 'editor.link.unlink.tooltip': 'Hủy liên kết',\n 'editor.link.open.tooltip': 'Mở liên kết',\n 'editor.link.edit.tooltip': 'Chỉnh sửa liên kết',\n 'editor.link.dialog.title': 'Chèn liên kết',\n 'editor.link.dialog.link': 'Liên kết',\n 'editor.link.dialog.text': 'Văn bản',\n 'editor.link.dialog.openInNewTab': 'Mở trong tab mới',\n 'editor.link.dialog.link.placeholder': 'Địa chỉ liên kết',\n 'editor.link.dialog.text.placeholder': 'Thêm mô tả',\n 'editor.link.dialog.button.apply': 'Áp dụng',\n 'editor.image.tooltip': 'Hình ảnh',\n 'editor.image.dragger.tooltip': 'Nhấp hoặc kéo hình ảnh đến khu vực để tải lên',\n 'editor.image.float.left.tooltip': 'Trôi sang trái',\n 'editor.image.float.none.tooltip': 'Trôi không',\n 'editor.image.float.right.tooltip': 'Trôi sang phải',\n 'editor.image.dialog.title': 'Thêm hình ảnh',\n 'editor.image.dialog.tab.url': 'Url',\n 'editor.image.dialog.tab.upload': 'Tải lên',\n 'editor.image.dialog.uploading': 'Đang tải lên',\n 'editor.image.dialog.form.link': 'Liên kết',\n 'editor.image.dialog.placeholder': 'Liên kết',\n 'editor.image.dialog.form.alt': 'Alt',\n 'editor.image.dialog.form.aspectRatio': 'Khóa tỷ lệ khung hình gốc',\n 'editor.image.dialog.form.file': 'Tệp',\n 'editor.image.dialog.button.apply': 'áp dụng',\n 'editor.video.tooltip': 'Video',\n 'editor.video.dialog.tab.upload': 'Tải lên',\n 'editor.video.dialog.uploading': 'Đang tải lên',\n 'editor.video.dialog.title': 'Nhúng hoặc tải lên video',\n 'editor.video.dialog.link': 'liên kết',\n 'editor.video.dialog.placeholder': 'Liên kết',\n 'editor.video.dialog.button.apply': 'áp dụng',\n 'editor.table.tooltip': 'Bảng',\n 'editor.table.menu.insert_table': 'Chèn Bảng',\n 'editor.table.menu.insert_table.with_header_row': 'Có hàng tiêu đề',\n 'editor.table.menu.add_column_before': 'Thêm Cột Trước',\n 'editor.table.menu.add_column_after': 'Thêm Cột Sau',\n 'editor.table.menu.delete_column': 'Xóa Cột',\n 'editor.table.menu.add_row_before': 'Thêm Hàng Trước',\n 'editor.table.menu.add_row_after': 'Thêm Hàng Sau',\n 'editor.table.menu.delete_row': 'Xóa Hàng',\n 'editor.table.menu.merge_or_split_cells': 'Gộp Hoặc Tách Ô',\n 'editor.table.menu.delete_table': 'Xóa Bảng',\n 'editor.blockquote.tooltip': 'Blockquote',\n 'editor.horizontalrule.tooltip': 'Quy tắc ngang',\n 'editor.code.tooltip': 'Mã',\n 'editor.codeblock.tooltip': 'Khối mã',\n 'editor.clear.tooltip': 'Xóa định dạng',\n 'editor.undo.tooltip': 'Hoàn tác',\n 'editor.redo.tooltip': 'Làm lại',\n 'editor.fullscreen.tooltip.fullscreen': 'Toàn màn hình',\n 'editor.fullscreen.tooltip.exit': 'Thoát toàn màn hình',\n 'editor.imageUpload.fileTypeNotSupported': 'Loại tệp không được hỗ trợ',\n 'editor.imageUpload.fileSizeTooBig': 'Kích thước tệp quá lớn, Kích thước tối đa là',\n 'editor.table.menu.insertColumnBefore': 'Chèn cột trước',\n 'editor.table.menu.insertColumnAfter': 'Chèn cột sau',\n 'editor.table.menu.deleteColumn': 'Xóa cột',\n 'editor.table.menu.insertRowAbove': 'Chèn hàng ở trên',\n 'editor.table.menu.insertRowBelow': 'Chèn hàng ở dưới',\n 'editor.table.menu.deleteRow': 'Xóa hàng',\n 'editor.table.menu.mergeCells': 'Gộp các ô',\n 'editor.table.menu.splitCells': 'Chia ô',\n 'editor.table.menu.deleteTable': 'Xóa bảng',\n 'editor.table.menu.setCellsBgColor': 'Màu nền ô',\n 'editor.emoji.tooltip': 'Biểu tượng',\n 'editor.iframe.tooltip': 'Iframe',\n 'editor.searchAndReplace.tooltip': 'Tìm kiếm và thay thế',\n 'editor.search.dialog.text': 'Tìm kiếm',\n 'editor.replace.dialog.text': 'Thay thế',\n 'editor.replaceAll.dialog.text': 'Thay thế tất cả',\n 'editor.previous.dialog.text': 'Trước',\n 'editor.next.dialog.text': 'Tiếp theo',\n 'no_result_found': 'Không tìm thấy kết quả',\n 'Smileys & People': 'Cười & Mọi người',\n 'Animals & Nature': 'Động vật & Thiên nhiên',\n 'Food & Drink': 'Thức ăn & Đồ uống',\n 'Activity': 'Hoạt động',\n 'Travel & Places': 'Du lịch & Địa điểm',\n 'Object': 'Vật',\n 'Symbol': 'Ký hiệu',\n 'Flags': 'Cờ',\n 'Frequently used': 'Thường xuyên sử dụng',\n 'editor.formula.dialog.text': 'Công thức',\n 'editor.katex.tooltip': 'Công thức toán học',\n 'editor.exportPdf.tooltip': 'Xuất PDF',\n 'editor.exportWord.tooltip': 'Xuất Word',\n 'editor.importWrod.tooltip': 'Nhập Word',\n}\n\nexport default locale\n","const locale = {\n 'editor.remove': '移除',\n 'editor.copy': '复制',\n 'editor.words': '字数',\n 'editor.characters': '字符数',\n 'editor.default': '默认',\n 'editor.recent': '最近使用',\n 'editor.nofill': '无填充',\n 'editor.format': '格式刷',\n 'editor.table_of_content': '目录',\n 'editor.draghandle.tooltip': '修改',\n 'editor.copyToClipboard': '复制到剪贴板',\n 'editor.importWord.tooltip': '导入 Word',\n 'editor.slash': '按 \\'/\\' 使用命令',\n 'editor.slash.empty': '无结果',\n 'editor.slash.format': '格式',\n 'editor.slash.insert': '插入',\n 'editor.slash.embed': '嵌入服务',\n 'editor.content': '请输入内容',\n 'editor.fontFamily.tooltip': '字体',\n 'editor.fontFamily.default.tooltip': '默认',\n 'editor.moremark': '更多文本样式',\n 'editor.size.small.tooltip': '小',\n 'editor.size.medium.tooltip': '中',\n 'editor.size.large.tooltip': '封面',\n 'editor.bold.tooltip': '粗体',\n 'editor.italic.tooltip': '斜体',\n 'editor.underline.tooltip': '下划线',\n 'editor.strike.tooltip': '删除线',\n 'editor.color.tooltip': '颜色',\n 'editor.color.more': '更多颜色',\n 'editor.highlight.tooltip': '高亮',\n 'editor.lineheight.tooltip': '行高',\n 'editor.heading.tooltip': '标题',\n 'editor.heading.h1.tooltip': '标题 1',\n 'editor.heading.h2.tooltip': '标题 2',\n 'editor.heading.h3.tooltip': '标题 3',\n 'editor.heading.h4.tooltip': '标题 4',\n 'editor.heading.h5.tooltip': '标题 5',\n 'editor.heading.h6.tooltip': '标题 6',\n 'editor.paragraph.tooltip': '段落',\n 'editor.textalign.tooltip': '对齐',\n 'editor.textalign.left.tooltip': '左对齐',\n 'editor.textalign.center.tooltip': '居中',\n 'editor.textalign.right.tooltip': '右对齐',\n 'editor.textalign.justify.tooltip': '两端对齐',\n 'editor.indent': '缩进',\n 'editor.indent.indent': '增加缩进',\n 'editor.indent.outdent': '减少缩进',\n 'editor.fontSize.tooltip': '字号',\n 'editor.fontSize.default.tooltip': '默认',\n 'editor.superscript.tooltip': '上标',\n 'editor.subscript.tooltip': '下标',\n 'editor.bulletlist.tooltip': '无序列表',\n 'editor.orderedlist.tooltip': '有序列表',\n 'editor.tasklist.tooltip': '任务列表',\n 'editor.indent.tooltip': '缩进',\n 'editor.outdent.tooltip': '减少缩进',\n 'editor.columns.tooltip': '列',\n 'editor.link.tooltip': '链接',\n 'editor.link.unlink.tooltip': '取消链接',\n 'editor.link.open.tooltip': '打开链接',\n 'editor.link.edit.tooltip': '编辑链接',\n 'editor.link.dialog.title': '插入链接',\n 'editor.link.dialog.link': '链接',\n 'editor.link.dialog.text': '文本',\n 'editor.link.dialog.openInNewTab': '在新标签页中打开',\n 'editor.link.dialog.link.placeholder': '链接地址',\n 'editor.link.dialog.text.placeholder': '添加描述',\n 'editor.link.dialog.button.apply': '应用',\n 'editor.image.tooltip': '图片',\n 'editor.image.dragger.tooltip': '点击或拖拽图片到此区域上传',\n 'editor.image.float.left.tooltip': '左浮动',\n 'editor.image.float.none.tooltip': '无浮动',\n 'editor.image.float.right.tooltip': '右浮动',\n 'editor.image.dialog.title': '添加图片',\n 'editor.image.dialog.tab.url': '链接',\n 'editor.image.dialog.tab.upload': '上传',\n 'editor.image.dialog.uploading': '上传中',\n 'editor.image.dialog.form.link': '链接',\n 'editor.image.dialog.placeholder': '链接',\n 'editor.image.dialog.form.alt': '替代文本',\n 'editor.image.dialog.form.aspectRatio': '锁定原始宽高比',\n 'editor.image.dialog.form.file': '文件',\n 'editor.image.dialog.button.apply': '应用',\n 'editor.video.tooltip': '视频',\n 'editor.video.dialog.tab.upload': '上传',\n 'editor.video.dialog.uploading': '上传中',\n 'editor.video.dialog.title': '嵌入或上传视频',\n 'editor.video.dialog.link': '链接',\n 'editor.video.dialog.placeholder': '链接',\n 'editor.video.dialog.button.apply': '应用',\n 'editor.table.tooltip': '表格',\n 'editor.table.menu.insert_table': '插入表格',\n 'editor.table.menu.insert_table.with_header_row': '带标题行',\n 'editor.table.menu.add_column_before': '在前面插入列',\n 'editor.table.menu.add_column_after': '在后面插入列',\n 'editor.table.menu.delete_column': '删除列',\n 'editor.table.menu.add_row_before': '在上方插入行',\n 'editor.table.menu.add_row_after': '在下方插入行',\n 'editor.table.menu.delete_row': '删除行',\n 'editor.table.menu.merge_or_split_cells': '合并或拆分单元格',\n 'editor.table.menu.delete_table': '删除表格',\n 'editor.blockquote.tooltip': '引用',\n 'editor.horizontalrule.tooltip': '水平线',\n 'editor.code.tooltip': '代码',\n 'editor.codeblock.tooltip': '代码块',\n 'editor.clear.tooltip': '清除格式',\n 'editor.undo.tooltip': '撤销',\n 'editor.redo.tooltip': '重做',\n 'editor.fullscreen.tooltip.fullscreen': '全屏',\n 'editor.fullscreen.tooltip.exit': '退出全屏',\n 'editor.imageUpload.fileTypeNotSupported': '不支持的文件类型',\n 'editor.imageUpload.fileSizeTooBig': '文件大小超出限制,最大大小为',\n 'editor.table.menu.insertColumnBefore': '在前面插入列',\n 'editor.table.menu.insertColumnAfter': '在后面插入列',\n 'editor.table.menu.deleteColumn': '删除列',\n 'editor.table.menu.insertRowAbove': '在上方插入行',\n 'editor.table.menu.insertRowBelow': '在下方插入行',\n 'editor.table.menu.deleteRow': '删除行',\n 'editor.table.menu.mergeCells': '合并单元格',\n 'editor.table.menu.splitCells': '拆分单元格',\n 'editor.table.menu.deleteTable': '删除表格',\n 'editor.table.menu.setCellsBgColor': '设置单元格背景色',\n 'editor.emoji.tooltip': '表情',\n 'editor.iframe.tooltip': '内嵌框架',\n 'editor.searchAndReplace.tooltip': '搜索和替换',\n 'editor.search.dialog.text': '搜索',\n 'editor.replace.dialog.text': '替换',\n 'editor.replaceAll.dialog.text': '全部替换',\n 'editor.previous.dialog.text': '上一个',\n 'editor.next.dialog.text': '下一个',\n 'no_result_found': '未找到结果',\n 'Smileys & People': '笑脸和人',\n 'Animals & Nature': '动物和自然',\n 'Food & Drink': '食物和饮料',\n 'Activity': '活动',\n 'Travel & Places': '旅行和地点',\n 'Object': '物体',\n 'Symbol': '符号',\n 'Flags': '旗帜',\n 'Frequently used': '常用',\n 'editor.formula.dialog.text': '公式',\n 'editor.katex.tooltip': '数学公式',\n 'editor.exportPdf.tooltip': '导出 PDF',\n 'editor.exportWord.tooltip': '导出 Word',\n 'editor.importWrod.tooltip': '导入 Word',\n}\n\nexport default locale\n","/* eslint-disable array-callback-return */\n// @ts-nocheck\n\n/**\n * copy to https://github.com/developit/mitt\n */\n\nexport type EventType = string | symbol\n\n// An event handler can take an optional event argument\n// and should not return a value\nexport type Handler<T = unknown> = (event: T) => void\nexport type WildcardHandler<T = Record<string, unknown>> = (\n type: keyof T,\n event: T[keyof T],\n) => void\n\n// An array of all currently registered event handlers for a type\nexport type EventHandlerList<T = unknown> = Array<Handler<T>>\nexport type WildCardEventHandlerList<T = Record<string, unknown>> = Array<WildcardHandler<T>>\n\n// A map of event types and their corresponding event handlers.\nexport type EventHandlerMap<Events extends Record<EventType, unknown>> = Map<\n keyof Events | '*',\n EventHandlerList<Events[keyof Events]> | WildCardEventHandlerList<Events>\n>\n\nexport interface Emitter<Events extends Record<EventType, unknown>> {\n all: EventHandlerMap<Events>\n\n on: (<Key extends keyof Events>(type: Key, handler: Handler<Events[Key]>) => void) & ((type: '*', handler: WildcardHandler<Events>) => void)\n\n off: (<Key extends keyof Events>(type: Key, handler?: Handler<Events[Key]>) => void) & ((type: '*', handler: WildcardHandler<Events>) => void)\n\n emit: (<Key extends keyof Events>(type: Key, event: Events[Key]) => void) & (<Key extends keyof Events>(type: undefined extends Events[Key] ? Key : never) => void)\n}\n\n/**\n * Mitt: Tiny (~200b) functional event emitter / pubsub.\n * @name mitt\n * @returns {Mitt}\n */\nexport default function mitt<Events extends Record<EventType, unknown>>(\n all?: EventHandlerMap<Events>,\n): Emitter<Events> {\n type GenericEventHandler = Handler<Events[keyof Events]> | WildcardHandler<Events>\n all = all || new Map()\n\n return {\n /**\n * A Map of event names to registered handler functions.\n */\n all,\n\n /**\n * Register an event handler for the given type.\n * @param {string|symbol} type Type of event to listen for, or `'*'` for all events\n * @param {Function} handler Function to call in response to given event\n * @memberOf mitt\n */\n on<Key extends keyof Events>(type: Key, handler: GenericEventHandler) {\n const handlers: Array<GenericEventHandler> | undefined = all!.get(type)\n if (handlers) {\n handlers.push(handler)\n }\n else {\n all!.set(type, [handler] as EventHandlerList<Events[keyof Events]>)\n }\n },\n\n /**\n * Remove an event handler for the given type.\n * If `handler` is omitted, all handlers of the given type are removed.\n * @param {string|symbol} type Type of event to unregister `handler` from (`'*'` to remove a wildcard handler)\n * @param {Function} [handler] Handler function to remove\n * @memberOf mitt\n */\n off<Key extends keyof Events>(type: Key, handler?: GenericEventHandler) {\n const handlers: Array<GenericEventHandler> | undefined = all!.get(type)\n if (handlers) {\n if (handler) {\n handlers.splice(handlers.indexOf(handler) >>> 0, 1)\n }\n else {\n all!.set(type, [])\n }\n }\n },\n\n /**\n * Invoke all handlers for the given type.\n * If present, `'*'` handlers are invoked after type-matched handlers.\n *\n * Note: Manually firing '*' handlers is not supported.\n *\n * @param {string|symbol} type The event type to invoke\n * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler\n * @memberOf mitt\n */\n emit<Key extends keyof Events>(type: Key, evt?: Events[Key]) {\n let handlers = all!.get(type)\n if (handlers) {\n [...(handlers as EventHandlerList<Events[keyof Events]>)].map((handler) => {\n handler(evt!)\n })\n }\n\n handlers = all!.get('*')\n if (handlers) {\n [...(handlers as WildCardEventHandlerList<Events>)].map((handler) => {\n handler(type, evt!)\n })\n }\n },\n }\n}\n","import { useEffect, useMemo } from 'react'\n\nimport { proxy, useSnapshot } from 'valtio'\n\nimport en from './en'\nimport vi from './vi'\nimport zh_CN from './zh-cn'\nimport mitt from '@/utils/mitt'\nimport type { EventType } from '@/utils/mitt'\nimport { DEFAULT_LANG_VALUE } from '@/constants'\n\n// Define supported language types\ntype LanguageType = 'en' | 'vi' | 'zh_CN' | string\n\n// Define message key types based on the 'en' locale\ntype MessageKeysType = keyof typeof en\n\n// Interface for locale configuration\ninterface LocaleInterface {\n lang: LanguageType\n message: Record<LanguageType, Record<MessageKeysType, string>>\n}\n\n// Interface for Mitt events\ninterface MittEvents extends Record<EventType, unknown> {\n lang: LanguageType\n}\n\n// Default locale configuration\nexport const DEFAULT_LOCALE: LocaleInterface = {\n lang: DEFAULT_LANG_VALUE,\n message: {\n en,\n vi,\n zh_CN,\n },\n}\n\nclass Locale {\n private emitter\n constructor() {\n this.emitter = mitt<MittEvents>()\n }\n\n // Getter and setter for current language\n get lang(): LanguageType {\n return DEFAULT_LOCALE.lang\n }\n\n set lang(lang: LanguageType) {\n if (!this.isLangSupported(lang)) {\n console.warn(\n `Can't find the current language \"${lang}\", Using language \"${DEFAULT_LOCALE.lang}\" by default`,\n )\n return\n }\n\n DEFAULT_LOCALE.lang = lang\n this.emitter.emit('lang', lang)\n }\n\n // Getter and setter for messages\n get message(): Record<LanguageType, Record<MessageKeysType, string>> {\n return DEFAULT_LOCALE.message\n }\n\n set message(message: Record<LanguageType, Record<MessageKeysType, string>>) {\n DEFAULT_LOCALE.message = message\n }\n\n // Load messages for a specific language\n loadLangMessage(lang: LanguageType): Record<MessageKeysType, string> {\n return this.message[lang]\n }\n\n // Check if a language is supported\n private isLangSupported(lang: LanguageType): boolean {\n const supportedLangs = Object.keys(this.message) as LanguageType[]\n return supportedLangs.includes(lang)\n }\n\n // Set the current language\n public setLang(lang: LanguageType) {\n this.lang = lang\n }\n\n // Register a language change watcher\n public registerWatchLang(hook: (lang: LanguageType) => void) {\n this.emitter.on('lang', hook)\n\n const unsubscribe = () => {\n this.emitter.off('lang', hook)\n }\n\n return {\n unsubscribe,\n }\n }\n\n // Set messages for a specific language\n public setMessage(lang: string, message: Record<MessageKeysType, string>) {\n this.message[lang] = message\n }\n\n // Build a translation function for a given language\n buildLocalesHandler(lang?: LanguageType) {\n if (!lang) {\n lang = this.lang\n }\n\n const message = this.loadLangMessage(lang)\n\n return function t(path: MessageKeysType) {\n return message[path] || path\n }\n }\n}\n\nconst locale = new Locale()\n\n// Proxy for reactive language state\nconst atomLang = proxy({\n lang: DEFAULT_LOCALE.lang,\n})\n\nfunction useLocale() {\n const atomLangSnap = useSnapshot(atomLang)\n\n const t = useMemo(() => {\n return locale.buildLocalesHandler(atomLangSnap.lang)\n }, [atomLangSnap.lang])\n\n useEffect(() => {\n const watchLang = locale.registerWatchLang((val) => {\n atomLang.lang = val\n })\n\n return () => {\n watchLang.unsubscribe()\n }\n }, [])\n\n return {\n lang: atomLangSnap.lang,\n t,\n }\n}\n\nconst localeActions = {\n t: (path: MessageKeysType) => {\n return locale.buildLocalesHandler(atomLang.lang)(path)\n },\n}\n\nexport default locale\nexport { Locale, useLocale, localeActions }\n\nexport { default as en } from './en'\nexport { default as vi } from './vi'\nexport { default as zh_CN } from './zh-cn'\n","export function NoFill() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M18 14c0-4-6-10.8-6-10.8s-1.33 1.51-2.73 3.52l8.59 8.59c.09-.42.14-.86.14-1.31m-.88 3.12L12.5 12.5L5.27 5.27L4 6.55l3.32 3.32C6.55 11.32 6 12.79 6 14c0 3.31 2.69 6 6 6c1.52 0 2.9-.57 3.96-1.5l2.63 2.63l1.27-1.27z\"></path></svg>\n )\n}\n","import React, { useEffect, useMemo, useState } from 'react'\n\nimport { Plus } from 'lucide-react'\nimport { HexColorPicker } from 'react-colorful'\n\nimport { Button, Input, Popover, PopoverContent, PopoverTrigger, Separator } from '@/components'\nimport { COLORS_LIST as DEFAULT_COLORS_LIST } from '@/constants'\nimport { useLocale } from '@/locales'\nimport { NoFill } from '@/components/icons/NoFill'\n\nexport interface ColorPickerProps {\n highlight?: boolean\n disabled?: boolean\n colors?: string[]\n defaultColor?: string\n children: React.ReactNode\n onChange?: (color: string | undefined) => void\n setSelectedColor?: (color: string | undefined) => void\n selectedColor?: string\n}\n\nfunction ColorPicker(props: ColorPickerProps) {\n const { t } = useLocale()\n\n const {\n highlight = false,\n disabled = false,\n selectedColor,\n setSelectedColor,\n onChange,\n colors = DEFAULT_COLORS_LIST,\n } = props\n\n const chunkedColors = useMemo(() => {\n const colorsArray = colors\n const chunked: string[][] = []\n for (let i = 0; i < colorsArray.length; i += 10) {\n chunked.push(colorsArray.slice(i, i + 10))\n }\n return chunked\n }, [colors])\n\n const [recentColorsStore, setRecentColorsStore] = useState<string[]>([])\n\n const setRecentColor = (color: string) => {\n const newRecentColors = [...recentColorsStore]\n const index = newRecentColors.indexOf(color)\n if (index !== -1) {\n newRecentColors.splice(index, 1)\n }\n newRecentColors.unshift(color)\n if (newRecentColors.length > 10) {\n newRecentColors.pop()\n }\n setRecentColorsStore(newRecentColors)\n }\n\n function setColor(color: string | undefined) {\n if (color === undefined) {\n // clear color\n setSelectedColor?.(color)\n onChange?.(color)\n return\n }\n // check if color is correct\n // eslint-disable-next-line regexp/no-unused-capturing-group\n const isCorrectColor = /^#([\\da-f]{3}){1,2}$/i.test(color)\n if (isCorrectColor) {\n setSelectedColor?.(color)\n onChange?.(color)\n setRecentColor(color)\n }\n }\n\n return (\n <Popover>\n <PopoverTrigger className=\"!richtext-p-0\" disabled={disabled} asChild>{props?.children}</PopoverTrigger>\n\n <PopoverContent hideWhenDetached className=\"richtext-w-full richtext-h-full richtext-p-2\" align=\"start\" side=\"bottom\">\n <div className=\"richtext-flex richtext-flex-col\">\n {highlight\n ? (\n <div\n className=\"richtext-flex richtext-items-center richtext-p-1 richtext-cursor-pointer rd-1 richtext-gap-[4px] hover:richtext-bg-accent\"\n onClick={() => setColor(undefined)}\n >\n <NoFill />\n <span className=\"richtext-ml-1 richtext-text-sm\">{t('editor.nofill')}</span>\n </div>\n )\n : (\n <div\n className=\"richtext-flex richtext-items-center richtext-p-1 richtext-cursor-pointer rd-1 richtext-gap-[4px] hover:richtext-bg-accent\"\n onClick={() => {\n setColor(undefined)\n }}\n >\n <NoFill />\n <span className=\"richtext-ml-1 richtext-text-sm\">{t('editor.default')}</span>\n </div>\n )}\n\n {chunkedColors.map((items: string[], index: number) => {\n return (\n <span className=\"richtext-relative richtext-flex richtext-w-full richtext-h-auto richtext-p-0 last:richtext-pb-2\" key={index}>\n {items.map((item: string, idx) => {\n return (\n <span\n className=\"richtext-w-6 richtext-h-6 richtext-p-0.5 richtext-inline-block richtext-rounded-sm !richtext-border richtext-border-transparent richtext-flex-[0_0_auto] richtext-cursor-pointer hover:richtext-border-border hover:richtext-shadow-sm\"\n key={`sub-color-${idx}`}\n onClick={() => setColor(item)}\n >\n <span\n style={{\n backgroundColor: item,\n }}\n className=\"richtext-relative richtext-w-[18px] richtext-h-[18px] richtext-block richtext-rounded-[2px] richtext-border-transparent\"\n >\n {item === selectedColor\n ? (\n <svg\n className=\"richtext-absolute richtext-block richtext-top-[-1px] richtext-left-[1px] richtext-w-3 richtext-h-3\"\n viewBox=\"0 0 18 18\"\n style={{\n fill: 'rgb(255, 255, 255)',\n }}\n >\n <path d=\"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z\"></path>\n </svg>\n )\n : (\n <svg\n viewBox=\"0 0 18 18\"\n style={{\n fill: 'rgb(255, 255, 255)',\n display: 'none',\n }}\n >\n <path d=\"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z\"></path>\n </svg>\n )}\n </span>\n </span>\n )\n })}\n </span>\n )\n })}\n\n <div>\n <div className=\"richtext-my-1 richtext-text-sm\">{t('editor.recent')}</div>\n <span className=\"richtext-relative richtext-flex richtext-w-full richtext-h-auto richtext-p-0 last:richtext-pb-2\">\n {recentColorsStore?.map((item, index) => {\n return (\n <span\n className=\"richtext-w-6 richtext-h-6 richtext-p-0.5 richtext-inline-block richtext-rounded-sm !richtext-border richtext-border-transparent richtext-flex-[0_0_auto] richtext-cursor-pointer hover:richtext-border-border hover:richtext-shadow-sm\"\n key={index}\n onClick={() => setColor(item)}\n >\n <span\n className=\"richtext-relative richtext-w-[18px] richtext-h-[18px] richtext-block richtext-rounded-[2px] richtext-border-transparent\"\n style={{\n backgroundColor: item,\n }}\n >\n <svg\n viewBox=\"0 0 18 18\"\n style={{\n fill: 'rgb(255, 255, 255)',\n display: 'none',\n }}\n >\n <path d=\"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z\"></path>\n </svg>\n </span>\n </span>\n )\n })}\n </span>\n </div>\n\n <AddMoreColor setColor={setColor} />\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\ninterface AddMoreColorProps {\n setColor: (color: string) => void\n}\n\nfunction AddMoreColor({ setColor }: AddMoreColorProps) {\n const [colorMore, setColorMore] = useState('#000000')\n const [openColorMore, setOpenColorMore] = useState(false)\n const { t } = useLocale()\n\n useEffect(() => {\n return () => {\n setOpenColorMore(false)\n }\n }, [])\n\n return (\n <Popover open={openColorMore}>\n <PopoverTrigger asChild>\n <div\n onClick={(e) => {\n e.preventDefault()\n setOpenColorMore(true)\n }}\n className=\"richtext-text-sm hover:richtext-cursor-pointer hover:richtext-bg-accent richtext-py-1.5 richtext-px-1.5\"\n >\n {t('editor.color.more')}\n ...\n </div>\n </PopoverTrigger>\n <PopoverContent>\n <div className=\"richtext-flex richtext-flex-col richtext-items-center richtext-justify-center\">\n <HexColorPicker color={colorMore} onChange={setColorMore} />\n\n <Input\n className=\"richtext-mt-[8px] richtext-w-full\"\n type=\"text\"\n onChange={(e) => {\n e.preventDefault()\n setColorMore(`#${e.target.value}`)\n }}\n value={colorMore.slice(1)}\n />\n </div>\n\n <Separator className=\"richtext-my-[10px]\" />\n <Button\n onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n e.preventDefault()\n setColor(colorMore)\n setOpenColorMore(false)\n }}\n className=\"richtext-w-full\"\n >\n <Plus size={16} />\n </Button>\n </PopoverContent>\n </Popover>\n )\n}\n\nexport { ColorPicker }\n","export const RESET_CSS = `\n.reactjs-tiptap-editor {\n button,\n input:where([type=button]),\n input:where([type=reset]),\n input:where([type=submit]) {\n -webkit-appearance: button;\n background-color: transparent;\n background-image: none\n }\n\n input,\n optgroup,\n select,\n textarea {\n font-family: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n font-size: 100%;\n font-weight: inherit;\n line-height: inherit;\n letter-spacing: inherit;\n color: inherit;\n }\n\n button {\n font-family: inherit;\n font-feature-settings: inherit;\n font-variation-settings: inherit;\n font-size: 100%;\n font-weight: inherit;\n line-height: inherit;\n letter-spacing: inherit;\n color: inherit;\n }\n}\n\n.reactjs-tiptap-editor,\ndiv[data-radix-popper-content-wrapper],\ndiv[data-tippy-root] {\n*,\n:before,\n:after {\n box-sizing: border-box;\n border-width: 0;\n border-style: solid;\n border-color: hsl(var(--richtext-border));\n}\n\nbackground-color: hsl(var(--richtext-background));\ncolor: hsl(var(--richtext-foreground));\n\n\nhtml,\n:host {\n line-height: 1.5;\n -webkit-text-size-adjust: 100%;\n -moz-tab-size: 4;\n tab-size: 4;\n font-family: ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", Segoe UI Symbol, \"Noto Color Emoji\";\n font-feature-settings: normal;\n font-variation-settings: normal;\n -webkit-tap-highlight-color: transparent\n}\n\nhr {\n height: 0;\n color: inherit;\n border-top-width: 1px\n}\n\na {\n color: inherit;\n text-decoration: inherit\n}\n\nb,\nstrong {\n font-weight: bolder\n}\n\ncode,\nkbd,\nsamp,\npre {\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace;\n font-feature-settings: normal;\n font-variation-settings: normal;\n font-size: 1em\n}\n\ntable {\n text-indent: 0;\n border-color: inherit;\n border-collapse: collapse\n}\n\ninput, textarea {\n border-width: 1px;\n}\n\ntextarea {\n resize: vertical\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1;\n color: #9ca3af\n}\n\nbutton, input, textarea {\n cursor: pointer;\n color: inherit;\n}\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block;\n vertical-align: middle\n}\n\nimg,\nvideo {\n max-width: 100%;\n height: auto\n}\n}\n`\n","import { proxy, useSnapshot } from 'valtio'\n\nconst themeProxy = proxy({\n theme: 'light',\n})\n\nexport function useTheme() {\n const themeSnapshot = useSnapshot(themeProxy)\n\n return themeSnapshot.theme\n}\n\nexport const themeActions = {\n setTheme: (theme: string) => {\n themeProxy.theme = theme\n },\n}\n","import type { Editor } from '@tiptap/core'\n\nimport type { NameValueOption } from '@/types'\n\nexport function clamp(val: number, min: number, max: number) {\n if (val < min) {\n return min\n }\n if (val > max) {\n return max\n }\n return val\n}\n\nexport const isNumber = (value: unknown): value is number => typeof value === 'number'\n\nexport const isString = (value: unknown): value is string => typeof value === 'string'\n\nexport const isBoolean = (value: unknown): value is boolean => typeof value === 'boolean'\n\nexport const isFunction = (value: unknown): boolean => typeof value === 'function'\n\nexport function getCssUnitWithDefault(value?: string | number, defaultUnit: string = 'px') {\n if (!value)\n return value\n\n const stringValue = isNumber(value) ? String(value) : value\n\n const num = Number.parseFloat(stringValue)\n const unitMatch = stringValue.match(/[a-z%]+$/i)\n const unit = unitMatch ? unitMatch[0] : defaultUnit\n\n return Number.isNaN(num) ? value : num + unit\n}\n\n/**\n * Checks if the editor has a specific extension method with the given name.\n *\n * @param {Editor} editor - An instance of the editor.\n * @param {string} name - The name of the extension method.\n * @returns {boolean} - Returns true if the specified extension method is present, otherwise returns false.\n */\nexport function hasExtension(editor: Editor, name: string): boolean {\n if (!editor) {\n return false\n }\n\n // Retrieve the extension manager of the editor, defaulting to an empty array if it doesn't exist\n const { extensions = [] } = editor?.extensionManager ?? {}\n\n // Check if the extension method with the specified name is present in the extension manager\n const find = extensions.find(i => i.name === name)\n\n // Return false if the extension method with the specified name is not found, otherwise return true\n if (!find) {\n return false\n }\n return true\n}\n\n/**\n * Normalizes an array of strings or objects to an array of objects with 'value' and 'name' properties.\n */\nexport function ensureNameValueOptions(arr: (string | NameValueOption)[]) {\n return arr.map((item) => {\n if (isString(item)) {\n return { value: item, name: item }\n }\n return item\n })\n}\n\nexport { differenceBy, isEqual, throttle, truncate } from 'lodash-unified'\n","const APPEND_ORDER = 'data-rc-order'\nconst APPEND_PRIORITY = 'data-rc-priority'\nconst MARK_KEY = 'rc-util-key'\n\nconst containerCache = new Map<ContainerType, Node & ParentNode>()\n\nexport type ContainerType = Element | ShadowRoot\nexport type Prepend = boolean | 'queue'\nexport type AppendType = 'prependQueue' | 'append' | 'prepend'\n\nexport default function contains(root: Node | null | undefined, n?: Node) {\n if (!root) {\n return false\n }\n\n // Use native if support\n if (root.contains) {\n return root.contains(n as any)\n }\n\n // `document.contains` not support with IE11\n let node = n\n while (node) {\n if (node === root) {\n return true\n }\n // @ts-ignore\n node = node.parentNode\n }\n\n return false\n}\n\ninterface Options {\n attachTo?: ContainerType\n csp?: { nonce?: string }\n prepend?: Prepend\n /**\n * Config the `priority` of `prependQueue`. Default is `0`.\n * It's useful if you need to insert style before other style.\n */\n priority?: number\n mark?: string\n}\n\nfunction getMark({ mark }: Options = {}) {\n if (mark) {\n return mark.startsWith('data-') ? mark : `data-${mark}`\n }\n return MARK_KEY\n}\n\nfunction getContainer(option: Options) {\n if (option.attachTo) {\n return option.attachTo\n }\n\n const head = document.querySelector('head')\n return head || document.body\n}\n\nfunction getOrder(prepend?: Prepend): AppendType {\n if (prepend === 'queue') {\n return 'prependQueue'\n }\n\n return prepend ? 'prepend' : 'append'\n}\n\n/**\n * Find style which inject by rc-util\n */\nfunction findStyles(container: ContainerType) {\n return [...(containerCache.get(container) || container).children].filter(\n node => node.tagName === 'STYLE',\n ) as HTMLStyleElement[]\n}\n\nexport function injectCSS(css: string, option: Options = {}) {\n const { csp, prepend, priority = 0 } = option\n const mergedOrder = getOrder(prepend)\n const isPrependQueue = mergedOrder === 'prependQueue'\n\n const styleNode = document.createElement('style')\n styleNode.setAttribute(APPEND_ORDER, mergedOrder)\n\n if (isPrependQueue && priority) {\n styleNode.setAttribute(APPEND_PRIORITY, `${priority}`)\n }\n\n if (csp?.nonce) {\n styleNode.nonce = csp?.nonce\n }\n styleNode.innerHTML = css\n\n const container = getContainer(option)\n const { firstChild } = container as any\n\n if (prepend) {\n // If is queue `prepend`, it will prepend first style and then append rest style\n if (isPrependQueue) {\n const existStyle = findStyles(container).filter((node) => {\n // Ignore style which not injected by rc-util with prepend\n // @ts-ignore\n if (!['prepend', 'prependQueue'].includes(node.getAttribute(APPEND_ORDER))) {\n return false\n }\n\n // Ignore style which priority less then new style\n const nodePriority = Number(node.getAttribute(APPEND_PRIORITY) || 0)\n return priority >= nodePriority\n })\n\n if (existStyle.length > 0) {\n // @ts-ignore\n container.insertBefore(styleNode, existStyle.at(-1).nextSibling)\n\n return styleNode\n }\n }\n\n // Use `insertBefore` as `prepend`\n firstChild.before(styleNode)\n }\n else {\n container.append(styleNode)\n }\n\n return styleNode\n}\n\nfunction findExistNode(key: string, option: Options = {}) {\n const container = getContainer(option)\n\n return findStyles(container).find(node => node.getAttribute(getMark(option)) === key)\n}\n\nexport function removeCSS(key: string, option: Options = {}) {\n const existNode = findExistNode(key, option)\n if (existNode) {\n // const container = getContainer(option);\n existNode.remove()\n }\n}\n\n/**\n * qiankun will inject `appendChild` to insert into other\n */\nfunction syncRealContainer(container: ContainerType, option: Options) {\n const cachedRealContainer = containerCache.get(container)\n\n // Find real container when not cached or cached container removed\n if (!cachedRealContainer || !contains(document, cachedRealContainer)) {\n const placeholderStyle = injectCSS('', option)\n const { parentNode } = placeholderStyle\n // @ts-ignore\n containerCache.set(container, parentNode)\n placeholderStyle.remove()\n }\n}\n\n/**\n * manually clear container cache to avoid global cache in unit testes\n */\nexport function clearContainerCache() {\n containerCache.clear()\n}\n\nexport function updateCSS(css: string, key: string, option: Options = {}) {\n const container = getContainer(option)\n\n // Sync real parent\n syncRealContainer(container, option)\n\n const existNode = findExistNode(key, option)\n\n if (existNode) {\n if (option.csp?.nonce && existNode.nonce !== option.csp?.nonce) {\n existNode.nonce = option.csp?.nonce\n }\n\n if (existNode.innerHTML !== css) {\n existNode.innerHTML = css\n }\n\n return existNode\n }\n\n const newNode = injectCSS(css, option)\n newNode.setAttribute(getMark(option), key)\n return newNode\n}\n","/* eslint-disable react/no-unstable-default-props */\nimport { forwardRef, useEffect, useImperativeHandle, useMemo } from 'react'\n\nimport type { AnyExtension, Editor as CoreEditor } from '@tiptap/core'\nimport type { UseEditorOptions } from '@tiptap/react'\nimport { EditorContent, useEditor } from '@tiptap/react'\nimport { differenceBy, throttle } from 'lodash-unified'\n\nimport type { BubbleMenuProps } from '@/types'\nimport { BubbleMenu, Toolbar, TooltipProvider } from '@/components'\nimport { EDITOR_UPDATE_WATCH_THROTTLE_WAIT_TIME } from '@/constants'\nimport { RESET_CSS } from '@/constants/resetCSS'\nimport { useLocale } from '@/locales'\nimport { themeActions } from '@/theme/theme'\nimport { hasExtension } from '@/utils/utils'\nimport { removeCSS, updateCSS } from '@/utils/dynamicCSS'\n\nimport '../styles/index.scss'\n\n/**\n * Interface for RichTextEditor component props\n */\nexport interface RichTextEditorProps {\n /** Content of the editor */\n content: string\n /** Extensions for the editor */\n extensions: AnyExtension[]\n\n /** Output format */\n output: 'html' | 'json' | 'text'\n /** Model value */\n modelValue?: string | object\n /** Dark mode flag */\n dark?: boolean\n /** Dense mode flag */\n dense?: boolean\n /** Disabled flag */\n disabled?: boolean\n /** Label for the editor */\n label?: string\n /** Hide toolbar flag */\n hideToolbar?: boolean\n /** Disable bubble menu flag */\n disableBubble?: boolean\n /** Hide bubble menu flag */\n hideBubble?: boolean\n /** Remove default wrapper flag */\n removeDefaultWrapper?: boolean\n /** Maximum width */\n maxWidth?: string | number\n /** Minimum height */\n minHeight?: string | number\n /** Maximum height */\n maxHeight?: string | number\n /** Editor class */\n editorClass?: string | string[] | Record<string, any>\n /** Content class */\n contentClass?: string | string[] | Record<string, any>\n /** Content change callback */\n onChangeContent?: (val: any) => void\n /** Bubble menu props */\n bubbleMenu?: BubbleMenuProps\n\n /** Use editor options */\n useEditorOptions?: UseEditorOptions\n\n /** Use editor options */\n resetCSS?: boolean\n}\n\nfunction RichTextEditor(props: RichTextEditorProps, ref: React.ForwardedRef<{ editor: CoreEditor | null }>) {\n const { content, extensions, useEditorOptions = {} } = props\n const { t } = useLocale()\n\n const sortExtensions = useMemo(() => {\n const diff = differenceBy(extensions, extensions, 'name')\n const exts = extensions.map((k: any) => {\n const find = extensions.find((ext: any) => ext.name === k.name)\n if (!find) {\n return k\n }\n return k.configure(find.options)\n })\n return [...exts, ...diff].map((k, i) => k.configure({ sort: i }))\n }, [extensions])\n\n const onValueChange = throttle((editor) => {\n const output = getOutput(editor, props.output as any)\n\n props?.onChangeContent?.(output as any)\n }, EDITOR_UPDATE_WATCH_THROTTLE_WAIT_TIME)\n\n const editor = useEditor({\n extensions: sortExtensions,\n content,\n onUpdate: ({ editor }) => {\n if (onValueChange)\n onValueChange(editor)\n },\n ...useEditorOptions,\n })\n\n useImperativeHandle(ref, () => {\n return {\n editor,\n }\n })\n\n useEffect(() => {\n document.documentElement.classList.toggle('dark', props.dark)\n themeActions.setTheme(props.dark ? 'dark' : 'light')\n }, [props.dark])\n\n useEffect(() => {\n editor?.setEditable(!props?.disabled)\n }, [editor, props?.disabled])\n\n useEffect(() => {\n if (props?.resetCSS !== false) {\n updateCSS(RESET_CSS, 'react-tiptap-reset')\n }\n\n return () => {\n removeCSS('react-tiptap-reset')\n }\n }, [props?.resetCSS])\n\n function getOutput(editor: CoreEditor, output: RichTextEditorProps['output']) {\n if (props?.removeDefaultWrapper) {\n if (output === 'html') {\n return editor.isEmpty ? '' : editor.getHTML()\n }\n if (output === 'json') {\n return editor.isEmpty ? {} : editor.getJSON()\n }\n if (output === 'text') {\n return editor.isEmpty ? '' : editor.getText()\n }\n return ''\n }\n\n if (output === 'html') {\n return editor.getHTML()\n }\n if (output === 'json') {\n return editor.getJSON()\n }\n if (output === 'text') {\n return editor.getText()\n }\n return ''\n }\n\n useEffect(() => {\n return () => {\n editor?.destroy?.()\n }\n }, [])\n\n const hasExtensionValue = hasExtension(editor as any, 'characterCount')\n\n if (!editor) {\n return <></>\n }\n\n return (\n <div className=\"reactjs-tiptap-editor\">\n <TooltipProvider delayDuration={0}>\n <div className=\"richtext-rounded-[0.5rem] richtext-bg-background richtext-shadow richtext-overflow-hidden richtext-outline richtext-outline-1\">\n {!props?.hideBubble && <BubbleMenu bubbleMenu={props?.bubbleMenu} editor={editor} disabled={props?.disabled} />}\n\n <div className=\"richtext-flex richtext-flex-col richtext-w-full richtext-max-h-full\">\n {!props?.hideToolbar && <Toolbar editor={editor} disabled={!!props?.disabled} />}\n\n <EditorContent className={`richtext-relative ${props?.contentClass || ''}`} editor={editor} />\n\n <div className=\"richtext-flex richtext-items-center richtext-justify-between richtext-p-3 richtext-border-t\">\n {hasExtensionValue && (\n <div className=\"richtext-flex richtext-flex-col\">\n <div className=\"richtext-flex richtext-justify-end richtext-gap-3 richtext-text-sm\">\n <span>\n {(editor as any).storage.characterCount.characters()}\n {' '}\n {t('editor.characters')}\n </span>\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </TooltipProvider>\n </div>\n )\n}\n\nexport default forwardRef(RichTextEditor)\n","import React, { useMemo } from 'react'\nimport type { Editor } from '@tiptap/core'\n\nimport { Separator } from '@/components'\nimport { useLocale } from '@/locales'\nimport { isFunction } from '@/utils/utils'\n\nexport interface ToolbarProps {\n editor: Editor\n disabled?: boolean\n}\n\ninterface ToolbarItemProps {\n button: {\n component: React.ComponentType<any>\n componentProps: Record<string, any>\n }\n divider: boolean\n spacer: boolean\n}\n\nfunction Toolbar({ editor, disabled }: ToolbarProps) {\n const { t, lang } = useLocale()\n\n const items = useMemo(() => {\n const extensions = [...editor.extensionManager.extensions]\n const sortExtensions = extensions.sort((arr, acc) => {\n const a = (arr.options).sort ?? -1\n const b = (acc.options).sort ?? -1\n return a - b\n })\n\n let menus: ToolbarItemProps[] = []\n\n for (const extension of sortExtensions) {\n const { button, divider = false, spacer = false, toolbar = true } = extension.options as any\n if (!button || !isFunction(button) || !toolbar) {\n continue\n }\n\n const _button: ToolbarItemProps['button'] | ToolbarItemProps['button'][] = button({\n editor,\n extension,\n t,\n })\n\n if (Array.isArray(_button)) {\n const menu: ToolbarItemProps[] = _button.map((k, i) => ({\n button: k,\n divider: i === _button.length - 1 ? divider : false,\n spacer: i === 0 ? spacer : false,\n }))\n menus = [...menus, ...menu]\n continue\n }\n\n menus.push({ button: _button, divider, spacer })\n }\n return menus\n }, [editor, t, lang])\n\n return (\n <div\n className=\"richtext-px-1 richtext-py-2 !richtext-border-b\"\n style={{\n pointerEvents: disabled ? 'none' : 'auto',\n opacity: disabled ? 0.5 : 1,\n }}\n >\n <div className=\"richtext-relative richtext-flex richtext-flex-wrap richtext-h-auto richtext-gap-y-1 richtext-gap-x-1\">\n {items.map((item: ToolbarItemProps, key) => {\n const ButtonComponent = item.button.component\n\n return (\n <div className=\"richtext-flex richtext-items-center\" key={key}>\n {item?.spacer && <Separator orientation=\"vertical\" className=\"!richtext-h-[16px] !richtext-mx-[10px]\" />}\n\n <ButtonComponent\n {...item.button.componentProps}\n disabled={disabled || item?.button?.componentProps?.disabled}\n />\n\n {item?.divider && <Separator orientation=\"vertical\" className=\"!richtext-h-auto !richtext-mx-2\" />}\n </div>\n )\n })}\n </div>\n </div>\n )\n}\n\nexport { Toolbar }\n","import type { SVGProps } from 'react'\n\nexport function AspectRatio(props: SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M19 12h-2v3h-3v2h5zM7 9h3V7H5v5h2zm14-6H3a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2m0 16H3V5h18z\"\n >\n </path>\n </svg>\n )\n}\n","import type { SVGProps } from 'react'\n\nexport function BlockquoteLeft(props: SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"2\"\n d=\"M6 15h15m0 4H6m9-8h6m0-4h-6M9 9h1a1 1 0 1 1-1 1V7.5a2 2 0 0 1 2-2M3 9h1a1 1 0 1 1-1 1V7.5a2 2 0 0 1 2-2\"\n >\n </path>\n </svg>\n )\n}\n","function DeleteColumn() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n aria-hidden=\"true\"\n role=\"img\"\n className=\"richtext-w-4 richtext-h-4\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 24 24\"\n >\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.5\"\n d=\"M5.5 3c1.404 0 2.107 0 2.611.38c.219.164.406.375.552.62C9 4.568 9 5.358 9 6.938v10.125c0 1.58 0 2.37-.337 2.937a2.1 2.1 0 0 1-.552.621c-.504.38-1.207.38-2.611.38s-2.107 0-2.611-.38a2.1 2.1 0 0 1-.552-.62C2 19.432 2 18.642 2 17.062V6.938c0-1.58 0-2.37.337-2.938a2.1 2.1 0 0 1 .552-.62C3.393 3 4.096 3 5.5 3M20 11.938v5.124c0 1.58 0 2.37-.337 2.938a2.1 2.1 0 0 1-.552.62c-.504.38-1.207.38-2.611.38s-2.107 0-2.611-.38a2.1 2.1 0 0 1-.552-.62C13 19.433 13 18.642 13 17.063V6.938c0-1.58 0-2.37.337-2.938M22 9l-6-6m6 0l-6 6\"\n color=\"currentColor\"\n />\n </svg>\n )\n}\n\nexport { DeleteColumn }\n","function DeleteRow() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n aria-hidden=\"true\"\n role=\"img\"\n className=\"richtext-w-4 richtext-h-4\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 24 24\"\n >\n <path\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.5\"\n d=\"M21 18.5c0 1.404 0 2.107-.38 2.611a2.1 2.1 0 0 1-.62.552c-.567.337-1.358.337-2.937.337H6.938c-1.58 0-2.37 0-2.938-.337a2.1 2.1 0 0 1-.62-.552C3 20.607 3 19.904 3 18.5s0-2.107.38-2.611c.163-.218.374-.406.62-.552C4.567 15 5.357 15 6.938 15h10.125c1.58 0 2.37 0 2.937.337c.246.146.457.334.62.552c.38.504.38 1.207.38 2.611M12.063 4H6.937C5.358 4 4.568 4 4 4.337a2.1 2.1 0 0 0-.62.552C3 5.393 3 6.096 3 7.5s0 2.107.38 2.611c.163.218.374.406.62.552C4.567 11 5.357 11 6.938 11h10.125c1.58 0 2.37 0 2.937-.337M21 8l-6-6m6 0l-6 6\"\n color=\"currentColor\"\n />\n </svg>\n )\n}\n\nexport { DeleteRow }\n","import type { SVGProps } from 'react'\n\nexport function FileWordOutline(props: SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M14 2H6a2 2 0 0 0-2 2v16c0 1.11.89 2 2 2h12c1.11 0 2-.89 2-2V8zm4 18H6V4h7v5h5zm-.65-10l-2.1 9h-1.4l-1.8-6.79l-1.8 6.79h-1.4l-2.2-9h1.5l1.4 6.81l1.8-6.81h1.3l1.8 6.81l1.4-6.81z\"\n >\n </path>\n </svg>\n )\n}\n","import React from 'react'\nimport { icons } from '@/components'\n\nexport interface IconComponentProps {\n name: string\n className?: string\n onClick?: React.MouseEventHandler<SVGElement>\n}\n\nfunction IconComponent(props: IconComponentProps) {\n const Icon = icons[props.name]\n\n return Icon ? <Icon onClick={props?.onClick} className={`richtext-w-4 richtext-h-4 ${props?.className || ''}`} /> : null\n}\n\nexport { IconComponent }\n","import type { SVGProps } from 'react'\n\nexport function FormatLineHeight(props: SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M21 22H3v-2h18zm0-18H3V2h18zm-11 9.7h4l-2-5.4zM11.2 6h1.7l4.7 12h-2l-.9-2.6H9.4L8.5 18h-2z\"\n >\n </path>\n </svg>\n )\n}\n","import type { SVGProps } from 'react'\n\nexport function MenuDown(props: SVGProps<SVGSVGElement>) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n aria-hidden=\"true\"\n role=\"img\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 48 48\"\n {...props}\n >\n <path\n fill=\"currentColor\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n strokeWidth={4}\n d=\"M36 19L24 31L12 19z\"\n />\n </svg>\n )\n}\n","import type { SVGProps } from 'react'\n\nexport function SizeL(props: SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <path fill=\"currentColor\" d=\"M9 7v10h6v-2h-4V7z\"></path>\n </svg>\n )\n}\n","import type { SVGProps } from 'react'\n\nexport function SizeM(props: SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M9 7c-1.1 0-2 .9-2 2v8h2V9h2v7h2V9h2v8h2V9a2 2 0 0 0-2-2z\"\n >\n </path>\n </svg>\n )\n}\n","import type { SVGProps } from 'react'\n\nexport function SizeS(props: SVGProps<SVGSVGElement>) {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"currentColor\"\n d=\"M11 7c-1.1 0-2 .9-2 2v2a2 2 0 0 0 2 2h2v2H9v2h4c1.11 0 2-.89 2-2v-2a2 2 0 0 0-2-2h-2V9h4V7z\"\n >\n </path>\n </svg>\n )\n}\n","import React from 'react'\n\nfunction ImportWord() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n aria-hidden=\"true\"\n role=\"img\"\n width=\"1em\"\n height=\"1em\"\n viewBox=\"0 0 24 24\"\n >\n <path\n fill=\"currentColor\"\n d=\"M14 2H6a2 2 0 0 0-2 2v16c0 1.11.89 2 2 2h12c1.11 0 2-.89 2-2V8zm4 18H6V4h7v5h5zm-.65-10l-2.1 9h-1.4l-1.8-6.79l-1.8 6.79h-1.4l-2.2-9h1.5l1.4 6.81l1.8-6.81h1.3l1.8 6.81l1.4-6.81z\"\n />\n </svg>\n\n )\n}\n\nexport default ImportWord\n","export function ExportPdf() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 32 32\">\n <path fill=\"currentColor\" d=\"M30 18v-2h-6v10h2v-4h3v-2h-3v-2zm-11 8h-4V16h4a3.003 3.003 0 0 1 3 3v4a3.003 3.003 0 0 1-3 3m-2-2h2a1 1 0 0 0 1-1v-4a1 1 0 0 0-1-1h-2zm-6-8H6v10h2v-3h3a2.003 2.003 0 0 0 2-2v-3a2 2 0 0 0-2-2m-3 5v-3h3l.001 3z\"></path>\n <path fill=\"currentColor\" d=\"M22 14v-4a.91.91 0 0 0-.3-.7l-7-7A.9.9 0 0 0 14 2H4a2.006 2.006 0 0 0-2 2v24a2 2 0 0 0 2 2h16v-2H4V4h8v6a2.006 2.006 0 0 0 2 2h6v2Zm-8-4V4.4l5.6 5.6Z\"></path>\n </svg>\n )\n}\n","import React from 'react'\n\nfunction ExportWord() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"1em\"\n height=\"1em\"\n className=\"icon\"\n viewBox=\"0 0 1024 1024\"\n >\n <path\n fill=\"currentColor\"\n d=\"M679.253 402.364 618.77 561.015l-60.348-158.651a30.04 30.04 0 0 0-30.447-18.637 29.76 29.76 0 0 0-30.447 18.637l-60.416 158.651-60.416-158.651a30.515 30.515 0 0 0-38.843-17.272 28.945 28.945 0 0 0-17.954 37.547l88.815 233.267c4.369 11.469 15.7 19.115 28.398 19.115a30.31 30.31 0 0 0 28.468-19.115l62.395-163.908 62.396 163.84c4.437 11.605 15.701 19.183 28.4 19.183a30.31 30.31 0 0 0 28.466-19.115l88.747-233.267a28.945 28.945 0 0 0-17.886-37.547 30.447 30.447 0 0 0-38.912 17.272zm219.478 395.605-51.883-29.218c-28.672-16.18-52.224-3.072-52.224 29.082v.273H643.209a29.833 29.833 0 0 0-30.31 29.354c0 16.18 13.584 29.218 30.31 29.218h151.825c1.092 30.516 24.03 43.077 52.224 27.648l51.063-27.989c29.013-15.906 29.15-42.189.41-58.368\"\n />\n <path\n fill=\"currentColor\"\n d=\"m810.667 913.135-.478.068H201.796c-19.865 0-36.727-11.673-36.727-25.6v-618.36h154.965c51.268 0 92.911-39.39 92.911-87.858v-87.86H810.19c19.797 0 36.522 11.742 36.522 25.669V739.26h61.987V119.262c0-46.421-44.169-84.241-98.51-84.241H328.364l-225.28 194.56v658.09c0 46.285 44.236 84.105 98.713 84.105H810.19c43.759 0 80.554-24.713 93.32-58.573h-92.842zM350.89 94.89v86.562c0 16.11-13.858 29.286-30.925 29.286H216.815L350.959 94.891z\"\n />\n </svg>\n )\n}\n\nexport default ExportWord\n","export function ColumnAddLeft() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\"><path fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M14 4h4a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1m-9 8h4m-2-2v4\"></path></svg>\n )\n}\n","export function ColumnAddRight() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\"><path fill=\"none\" stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M6 4h4a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1m9 8h4m-2-2v4\"></path></svg>\n )\n}\n","import {\n BetweenHorizonalEnd,\n BetweenHorizonalStart,\n BetweenVerticalEnd,\n BetweenVerticalStart,\n Bold,\n BookMarked,\n ChevronDown,\n ChevronsUpDown,\n Clipboard,\n Code,\n CodeXml,\n Columns2,\n Columns3,\n Columns4,\n Copy,\n Eraser,\n Frame,\n GripVertical,\n Heading1,\n Heading2,\n Heading3,\n Heading4,\n Heading5,\n Heading6,\n ImageUp,\n IndentDecrease,\n IndentIncrease,\n Italic,\n Link,\n List,\n ListOrdered,\n ListTodo,\n LoaderCircle,\n Maximize,\n Minimize,\n Minus,\n PaintRoller,\n PanelLeft,\n PanelRight,\n Pencil,\n Plus,\n Quote,\n Redo2,\n Replace,\n Sigma,\n SmilePlus,\n SmilePlusIcon,\n Sparkles,\n Strikethrough,\n Subscript,\n Superscript,\n Table,\n TableCellsMerge,\n TableCellsSplit,\n Trash,\n Trash2,\n Type,\n Underline,\n Undo2,\n Unlink,\n Video,\n} from 'lucide-react'\nimport {\n TextAlignCenterIcon,\n TextAlignJustifyIcon,\n TextAlignLeftIcon,\n TextAlignRightIcon,\n} from '@radix-ui/react-icons'\nimport ImportWord from './ImportWord'\nimport {\n AspectRatio,\n BlockquoteLeft,\n DeleteColumn,\n DeleteRow,\n FileWordOutline,\n FormatLineHeight,\n MenuDown,\n SizeL,\n SizeM,\n SizeS,\n} from '@/components/icons'\nimport { ExportPdf } from '@/components/icons/ExportPdf'\nimport ExportWord from '@/components/icons/ExportWord'\nimport { ColumnAddLeft } from '@/components/icons/ColumnAddLeft'\nimport { ColumnAddRight } from '@/components/icons/ColumnAddRight'\n\nexport const icons = {\n Bold,\n LoaderCircle,\n Italic,\n Underline,\n Quote,\n TextQuote: BlockquoteLeft,\n Strikethrough,\n Minus,\n Eraser,\n PaintRoller,\n Redo2,\n Undo2,\n AlignCenter: TextAlignCenterIcon,\n AlignJustify: TextAlignJustifyIcon,\n AlignLeft: TextAlignLeftIcon,\n AlignRight: TextAlignRightIcon,\n ChevronDown,\n Subscript,\n Superscript,\n Code,\n Code2: CodeXml,\n Type,\n IndentIncrease,\n IndentDecrease,\n List,\n ListOrdered,\n ListTodo,\n Link,\n ImageUp,\n Video,\n Maximize,\n Minimize,\n Table,\n Sparkles,\n Pencil,\n Unlink,\n BetweenHorizonalEnd,\n BetweenHorizonalStart,\n BetweenVerticalStart,\n BetweenVerticalEnd,\n TableCellsMerge,\n TableCellsSplit,\n Trash2,\n Trash,\n Replace,\n ChevronsUpDown,\n LineHeight: FormatLineHeight,\n Word: FileWordOutline,\n Heading1,\n Heading2,\n Heading3,\n Heading4,\n Heading5,\n Heading6,\n Columns2,\n Columns3,\n Columns4,\n Plus,\n Grip: GripVertical,\n Copy,\n Clipboard,\n PanelLeft,\n PanelRight,\n Columns: Columns2,\n Iframe: Frame,\n\n MenuDown,\n SizeS,\n SizeM,\n SizeL,\n AspectRatio,\n\n Emoji: SmilePlus,\n\n DeleteColumn,\n DeleteRow,\n SearchAndReplace: Replace,\n EmojiIcon: SmilePlusIcon,\n KatexIcon: Sigma,\n ExportPdf,\n ExportWord,\n ImportWord,\n ColumnAddLeft,\n ColumnAddRight,\n BookMarked,\n} as any\n","import { deleteSelection } from '@tiptap/pm/commands'\nimport type { Editor } from '@tiptap/react'\n\nimport { BUBBLE_TEXT_LIST, IMAGE_SIZE, VIDEO_SIZE } from '@/constants'\nimport type { ButtonViewParams, ButtonViewReturn, ExtensionNameKeys } from '@/types'\nimport { localeActions } from '@/locales'\nimport { ActionButton } from '@/components'\n\n/** Represents the size types for bubble images or videos */\ntype BubbleImageOrVideoSizeType = 'size-small' | 'size-medium' | 'size-large'\ntype ImageAlignments = 'left' | 'center' | 'right'\n\n/** Represents the various types for bubble images */\ntype BubbleImageType =\n | `image-${BubbleImageOrVideoSizeType}`\n | `video-${BubbleImageOrVideoSizeType}`\n | 'image'\n | 'image-aspect-ratio'\n | 'remove'\n\n/** Represents the types for bubble videos */\ntype BubbleVideoType = 'video' | 'remove'\n\n/** Represents the overall types for bubbles */\ntype BubbleAllType =\n | BubbleImageType\n | BubbleVideoType\n | ExtensionNameKeys\n | 'divider'\n | (string & {})\n\n/** Represents the key types for node types */\nexport type NodeTypeKey = 'image' | 'text' | 'video'\n\n/** Represents the menu of bubble types for each node type */\nexport type BubbleTypeMenu = Partial<Record<NodeTypeKey, BubbleMenuItem[]>>\n\n/** Represents the menu of overall bubble types for each node type */\nexport type NodeTypeMenu = Partial<Record<NodeTypeKey, BubbleAllType[]>>\n\n/**\n * Represents the structure of a bubble menu item.\n */\nexport interface BubbleMenuItem extends ButtonViewReturn {\n /** The type of the bubble item */\n type: BubbleAllType\n}\n\n/**\n * Represents a function to generate a bubble menu\n */\ninterface BubbleView<T = any> {\n /**\n * Generates a bubble menu based on the provided options.\n * @param {ButtonViewParams<T>} options - The options for generating the bubble menu.\n * @returns {BubbleTypeMenu} The generated bubble menu.\n */\n (options: ButtonViewParams<T>): BubbleTypeMenu\n}\n\n/**\n * Represents the options for configuring bubbles.\n * @interface BubbleOptions\n * @template T\n */\nexport interface BubbleOptions<T> {\n /** The menu of bubble types for each node type. */\n list: NodeTypeMenu\n /** The default list of bubble types. */\n defaultBubbleList: any\n /** The function to generate a bubble menu. */\n button: BubbleView<T>\n}\n\nfunction imageSizeMenus(editor: Editor): BubbleMenuItem[] {\n const types: BubbleImageOrVideoSizeType[] = ['size-small', 'size-medium', 'size-large']\n const icons: NonNullable<ButtonViewReturn['componentProps']['icon']>[] = [\n 'SizeS',\n 'SizeM',\n 'SizeL',\n ]\n\n return types.map((size, i) => ({\n type: `image-${size}`,\n component: ActionButton,\n componentProps: {\n tooltip: localeActions.t(`editor.${size.replace('-', '.')}.tooltip` as any),\n icon: icons[i],\n action: () => editor.commands.updateImage({ width: IMAGE_SIZE[size] }),\n isActive: () => editor.isActive('image', { width: IMAGE_SIZE[size] }),\n },\n }))\n}\n\nfunction imageAlignMenus(editor: Editor): BubbleMenuItem[] {\n const types: ImageAlignments[] = ['left', 'center', 'right']\n const iconMap: any = {\n left: 'AlignLeft',\n center: 'AlignCenter',\n right: 'AlignRight',\n }\n return types.map(k => ({\n type: `image-${k}`,\n component: ActionButton,\n componentProps: {\n tooltip: localeActions.t(`editor.textalign.${k}.tooltip`),\n icon: iconMap[k],\n action: () => editor.commands?.setTextAlign?.(k),\n isActive: () => editor.isActive({ textAlign: k }) || false,\n disabled: !editor.can()?.setTextAlign?.(k),\n },\n }))\n}\n\nfunction videoSizeMenus(editor: Editor): BubbleMenuItem[] {\n const types: BubbleImageOrVideoSizeType[] = ['size-small', 'size-medium', 'size-large']\n const icons: NonNullable<ButtonViewReturn['componentProps']['icon']>[] = [\n 'SizeS',\n 'SizeM',\n 'SizeL',\n ]\n\n return types.map((size, i) => ({\n type: `video-${size}`,\n component: ActionButton,\n componentProps: {\n tooltip: localeActions.t(`editor.${size.replace('-', '.')}.tooltip` as any),\n icon: icons[i],\n action: () => editor.commands.updateVideo({ width: VIDEO_SIZE[size] }),\n isActive: () => editor.isActive('video', { width: VIDEO_SIZE[size] }),\n },\n }))\n}\nexport function getBubbleImage(editor: Editor): BubbleMenuItem[] {\n return [\n ...imageSizeMenus(editor),\n ...imageAlignMenus(editor),\n {\n type: 'remove',\n component: ActionButton,\n componentProps: {\n editor,\n tooltip: localeActions.t('editor.remove'),\n icon: 'Trash2',\n action: () => {\n const { state, dispatch } = editor.view\n deleteSelection(state, dispatch)\n },\n },\n },\n ]\n}\n\nexport function getBubbleVideo(editor: Editor): BubbleMenuItem[] {\n return [\n ...videoSizeMenus(editor),\n {\n type: 'remove',\n component: ActionButton,\n componentProps: {\n editor,\n tooltip: localeActions.t('editor.remove'),\n icon: 'Trash2',\n action: () => {\n const { state, dispatch } = editor.view\n deleteSelection(state, dispatch)\n },\n },\n },\n ]\n}\n\n/**\n * Bubble menu text list\n */\nexport function getBubbleText(editor: Editor, t: any) {\n return BUBBLE_TEXT_LIST.reduce((acc, type) => {\n if (type === 'divider' && acc.length > 0) {\n return [...acc, {\n type: 'divider',\n component: undefined,\n componentProps: {},\n }]\n }\n\n const ext = editor.extensionManager.extensions.find(ext => ext.name === type)\n if (ext) {\n return [...acc, ext.configure().options.button({ editor, t, extension: ext })]\n }\n\n return acc\n }, [] as BubbleMenuItem[])\n}\n","/* eslint-disable no-restricted-syntax */\nimport type { Command, Editor } from '@tiptap/core'\nimport { isList } from '@tiptap/core'\nimport type { Transaction } from '@tiptap/pm/state'\nimport { AllSelection, TextSelection } from '@tiptap/pm/state'\n\nexport const enum IndentProps {\n max = 7,\n min = 0,\n\n more = 1,\n less = -1,\n}\n\nexport function clamp(val: number, min: number, max: number): number {\n if (val < min) {\n return min\n }\n if (val > max) {\n return max\n }\n return val\n}\nfunction updateIndentLevel(\n tr: Transaction,\n delta: number,\n types: string[],\n editor: Editor,\n): Transaction {\n const { doc, selection } = tr\n\n if (!doc || !selection) {\n return tr\n }\n\n if (!(selection instanceof TextSelection || selection instanceof AllSelection)) {\n return tr\n }\n\n const { from, to } = selection\n\n doc.nodesBetween(from, to, (node, pos) => {\n const nodeType = node.type\n\n if (types.includes(nodeType.name)) {\n tr = setNodeIndentMarkup(tr, pos, delta)\n return false\n }\n else if (isList(node.type.name, editor.extensionManager.extensions)) {\n return false\n }\n return true\n })\n\n return tr\n}\n\nexport function setNodeIndentMarkup(tr: Transaction, pos: number, delta: number): Transaction {\n if (!tr.doc) {\n return tr\n }\n\n const node = tr.doc.nodeAt(pos)\n if (!node) {\n return tr\n }\n\n const minIndent = IndentProps.min\n const maxIndent = IndentProps.max\n\n const indent = clamp((node.attrs.indent || 0) + delta, minIndent, maxIndent)\n\n if (indent === node.attrs.indent) {\n return tr\n }\n\n const nodeAttrs = {\n ...node.attrs,\n indent,\n }\n\n return tr.setNodeMarkup(pos, node.type, nodeAttrs, node.marks)\n}\n\nexport function createIndentCommand({ delta, types }: { delta: number, types: string[] }): Command {\n return ({ state, dispatch, editor }) => {\n const { selection } = state\n let { tr } = state\n tr = tr.setSelection(selection)\n tr = updateIndentLevel(tr, delta, types, editor)\n\n if (tr.docChanged) {\n if (dispatch)\n dispatch(tr)\n return true\n }\n\n return false\n }\n}\n","import { useEffect, useRef, useState } from 'react'\nimport type { Editor } from '@tiptap/core'\n\nimport type { Node } from '@tiptap/pm/model'\nimport type { NodeSelection } from '@tiptap/pm/state'\nimport { DragHandlePlugin, dragHandlePluginDefaultKey } from 'echo-drag-handle-plugin'\n\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n IconComponent,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@/components'\nimport { useLocale } from '@/locales'\nimport { IndentProps, setNodeIndentMarkup } from '@/utils/indent'\n\nexport interface ContentMenuProps {\n editor: Editor\n disabled?: boolean\n className?: string\n pluginKey?: string\n}\n\nfunction ContentMenu(props: ContentMenuProps) {\n const { pluginKey = dragHandlePluginDefaultKey } = props\n const { t } = useLocale()\n const [currentNode, setCurrentNode] = useState<Node | null>(null)\n const [currentNodePos, setCurrentNodePos] = useState(-1)\n const dragElement = useRef(null)\n const pluginRef = useRef<any | null>(null)\n const [menuOpen, setMenuOpen] = useState(false)\n\n const hasTextAlignExtension = props.editor.extensionManager.extensions.some(ext => ext.name === 'textAlign')\n const hasIndentExtension = props.editor.extensionManager.extensions.some(ext => ext.name === 'indent')\n const hasClearExtension = props.editor.extensionManager.extensions.some(ext => ext.name === 'clear')\n\n useEffect(() => {\n if (dragElement.current && !props.editor.isDestroyed) {\n pluginRef.current = DragHandlePlugin({\n editor: props.editor,\n element: dragElement.current,\n pluginKey: 'ContentItemMenu',\n tippyOptions: {\n offset: [-2, 16],\n zIndex: 99,\n moveTransition: 'transform 0.15s ease-out',\n },\n onNodeChange: handleNodeChange,\n })\n\n props.editor.registerPlugin(pluginRef.current)\n }\n }, [props.editor, dragElement])\n\n function resetTextFormatting() {\n const chain = props.editor.chain()\n chain.setNodeSelection(currentNodePos).unsetAllMarks()\n if (currentNode?.type.name !== 'paragraph') {\n chain.setParagraph()\n }\n chain.run()\n }\n function copyNodeToClipboard() {\n props.editor.chain().focus().setNodeSelection(currentNodePos).run()\n document.execCommand('copy')\n }\n function duplicateNode() {\n props.editor.commands.setNodeSelection(currentNodePos)\n const { $anchor } = props.editor.state.selection\n const selectedNode = $anchor.node(1) || (props.editor.state.selection as NodeSelection).node\n props.editor\n .chain()\n .setMeta('hideDragHandle', true)\n .insertContentAt(currentNodePos + (currentNode?.nodeSize || 0), selectedNode.toJSON())\n .run()\n }\n function setTextAlign(alignments: string) {\n props.editor.commands.setTextAlign(alignments)\n }\n function increaseIndent() {\n const indentTr = setNodeIndentMarkup(props.editor.state.tr, currentNodePos, 1)\n indentTr.setMeta('hideDragHandle', true)\n if (props.editor.view.dispatch)\n props.editor.view.dispatch(indentTr)\n }\n function decreaseIndent() {\n const tr = setNodeIndentMarkup(props.editor.state.tr, currentNodePos, -1)\n if (props.editor.view.dispatch)\n props.editor.view.dispatch(tr)\n }\n\n function deleteNode() {\n props.editor\n .chain()\n .setMeta('hideDragHandle', true)\n .setNodeSelection(currentNodePos)\n .deleteSelection()\n .run()\n }\n\n function handleNodeChange(e: any) {\n if (e.node) {\n setCurrentNode(e.node)\n }\n setCurrentNodePos(e.pos)\n }\n\n function handleAdd() {\n if (currentNodePos !== -1) {\n const currentNodeSize = currentNode?.nodeSize || 0\n const insertPos = currentNodePos + currentNodeSize\n const currentNodeIsEmptyParagraph\n = currentNode?.type.name === 'paragraph' && currentNode?.content?.size === 0\n const focusPos = currentNodeIsEmptyParagraph ? currentNodePos + 2 : insertPos + 2\n props.editor\n .chain()\n .command(({ dispatch, tr, state }: any) => {\n if (dispatch) {\n if (currentNodeIsEmptyParagraph) {\n tr.insertText('/', currentNodePos, currentNodePos + 1)\n }\n else {\n tr.insert(\n insertPos,\n state.schema.nodes.paragraph.create(null, [state.schema.text('/')]),\n )\n }\n\n return dispatch(tr)\n }\n\n return true\n })\n .focus(focusPos)\n .run()\n }\n }\n\n useEffect(() => {\n if (menuOpen) {\n props.editor.commands.setMeta('lockDragHandle', true)\n }\n else {\n props.editor.commands.setMeta('lockDragHandle', false)\n }\n\n return () => {\n props.editor.commands.setMeta('lockDragHandle', false)\n }\n }, [menuOpen])\n\n useEffect(() => {\n return () => {\n if (pluginRef.current) {\n props.editor.unregisterPlugin(pluginKey)\n pluginRef.current = null\n }\n }\n }, [])\n\n useEffect(() => {\n if (props.editor?.isDestroyed && pluginRef.current) {\n props.editor.unregisterPlugin(pluginKey)\n pluginRef.current = null\n }\n }, [props.editor?.isDestroyed])\n\n const handleMenuOpenChange = (open: any) => {\n if (props?.disabled) {\n return\n }\n setMenuOpen(open)\n }\n\n return (\n <div\n className={\n `drag-handle [transition-property:top,_left] richtext-ease-in-out richtext-duration-200 ${props?.className}`\n }\n style={{\n opacity: props?.disabled ? 0 : 1,\n }}\n ref={dragElement}\n >\n <div className=\"richtext-flex richtext-items-center richtext-gap-0.5 [transition-property:top,_left] richtext-ease-in-out richtext-duration-200\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"richtext-w-7 richtext-h-7 richtext-cursor-grab\"\n disabled={props?.disabled}\n onClick={handleAdd}\n >\n <IconComponent name=\"Plus\" className=\"richtext-text-lg richtext-text-neutral-600 dark:richtext-text-neutral-200\" />\n </Button>\n <DropdownMenu open={menuOpen} onOpenChange={handleMenuOpenChange}>\n <div className=\"richtext-relative richtext-flex richtext-flex-col\">\n <Tooltip>\n <TooltipTrigger asChild disabled={props?.disabled}>\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"richtext-w-7 richtext-h-7 richtext-cursor-grab richtext-relative richtext-z-[1]\"\n disabled={props?.disabled}\n onMouseUp={() => {\n if (props?.disabled) {\n return\n }\n setMenuOpen(true)\n }}\n >\n <IconComponent name=\"Grip\" className=\"richtext-text-sm dark:richtext-text-neutral-200 richtext-text-neutral-600\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {t('editor.draghandle.tooltip')}\n </TooltipContent>\n </Tooltip>\n\n <DropdownMenuTrigger className=\"richtext-absolute richtext-top-0 richtext-left-0 richtext-w-[28px] richtext-h-[28px] richtext-z-0\" />\n </div>\n\n <DropdownMenuContent className=\"richtext-w-48\" align=\"start\" side=\"bottom\" sideOffset={0}>\n <DropdownMenuItem\n onClick={deleteNode}\n className=\"richtext-flex richtext-gap-3 focus:richtext-text-red-500 focus:richtext-bg-red-400 hover:richtext-bg-red-400 dark:hover:richtext-text-red-500 richtext-bg-opacity-10 hover:richtext-bg-opacity-20 focus:richtext-bg-opacity-30 dark:hover:richtext-bg-opacity-20\"\n >\n <IconComponent name=\"Trash2\" />\n <span>{t('editor.remove')}</span>\n </DropdownMenuItem>\n\n {hasClearExtension\n ? (\n <DropdownMenuItem className=\"richtext-flex richtext-gap-3\" onClick={resetTextFormatting}>\n <IconComponent name=\"PaintRoller\" />\n <span>{t('editor.clear.tooltip')}</span>\n </DropdownMenuItem>\n )\n : null}\n\n <DropdownMenuItem className=\"richtext-flex richtext-gap-3\" onClick={copyNodeToClipboard}>\n <IconComponent name=\"Clipboard\" />\n <span>{t('editor.copyToClipboard')}</span>\n </DropdownMenuItem>\n <DropdownMenuItem className=\"richtext-flex richtext-gap-3\" onClick={duplicateNode}>\n <IconComponent name=\"Copy\" />\n <span>{t('editor.copy')}</span>\n </DropdownMenuItem>\n\n {hasTextAlignExtension || hasIndentExtension\n ? (\n <DropdownMenuSeparator />\n )\n : null}\n\n {hasTextAlignExtension\n ? (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger className=\"richtext-flex richtext-gap-3\">\n <IconComponent name=\"AlignCenter\" />\n <span>{t('editor.textalign.tooltip')}</span>\n </DropdownMenuSubTrigger>\n <DropdownMenuPortal>\n <DropdownMenuSubContent>\n <DropdownMenuItem className=\"richtext-flex richtext-gap-3\" onClick={() => setTextAlign('left')}>\n <IconComponent name=\"AlignLeft\" />\n <span>{t('editor.textalign.left.tooltip')}</span>\n </DropdownMenuItem>\n <DropdownMenuItem className=\"richtext-flex richtext-gap-3\" onClick={() => setTextAlign('center')}>\n <IconComponent name=\"AlignCenter\" />\n <span>{t('editor.textalign.center.tooltip')}</span>\n </DropdownMenuItem>\n <DropdownMenuItem className=\"richtext-flex richtext-gap-3\" onClick={() => setTextAlign('right')}>\n <IconComponent name=\"AlignRight\" />\n <span>{t('editor.textalign.right.tooltip')}</span>\n </DropdownMenuItem>\n </DropdownMenuSubContent>\n </DropdownMenuPortal>\n </DropdownMenuSub>\n )\n : null}\n\n {hasIndentExtension\n ? (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger className=\"richtext-flex richtext-gap-3\">\n <IconComponent name=\"IndentIncrease\" />\n <span>{t('editor.indent')}</span>\n </DropdownMenuSubTrigger>\n <DropdownMenuPortal>\n <DropdownMenuSubContent>\n <DropdownMenuItem\n className=\"richtext-flex richtext-gap-3\"\n onClick={increaseIndent}\n disabled={currentNode?.attrs?.indent >= IndentProps.max}\n >\n <IconComponent name=\"IndentIncrease\" />\n <span>{t('editor.indent.tooltip')}</span>\n </DropdownMenuItem>\n\n <DropdownMenuItem\n className=\"richtext-flex richtext-gap-3\"\n onClick={decreaseIndent}\n disabled={currentNode?.attrs?.indent <= IndentProps.min}\n >\n <IconComponent name=\"IndentDecrease\" />\n <span>{t('editor.outdent.tooltip')}</span>\n </DropdownMenuItem>\n </DropdownMenuSubContent>\n </DropdownMenuPortal>\n </DropdownMenuSub>\n )\n : null}\n\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n </div>\n )\n}\n\nexport { ContentMenu }\n","import { useMemo } from 'react'\n\nimport type { Editor } from '@tiptap/core'\nimport { TextSelection } from '@tiptap/pm/state'\nimport { BubbleMenu } from '@tiptap/react'\n\nimport { Separator, getBubbleText } from '@/components'\nimport { useLocale } from '@/locales'\n\nexport interface BubbleMenuTextProps {\n editor: Editor\n disabled?: boolean\n}\n\nconst tippyOptions = {\n maxWidth: 'auto',\n zIndex: 20,\n appendTo: 'parent',\n moveTransition: 'transform 0.1s ease-out',\n}\n\nfunction ItemA({ item, disabled, editor }: any) {\n const Comp = item.component\n\n if (!Comp) {\n return <></>\n }\n\n return (\n <Comp\n {...item.componentProps}\n editor={editor}\n disabled={disabled || item?.componentProps?.disabled}\n />\n )\n}\n\nfunction BubbleMenuText(props: BubbleMenuTextProps) {\n const { t, lang } = useLocale()\n\n const shouldShow = ({ editor }: any) => {\n const { selection } = editor.view.state\n const { $from, to } = selection\n\n // check content select length is not empty\n if ($from.pos === to) {\n return false\n }\n\n return selection instanceof TextSelection\n }\n\n const items = useMemo(() => {\n if (props.disabled || !props?.editor) {\n return []\n }\n\n return getBubbleText(props.editor, t)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [props.disabled, props.editor, lang, t])\n\n return (\n <BubbleMenu shouldShow={shouldShow} editor={props?.editor} tippyOptions={tippyOptions as any}>\n {items?.length\n ? (\n <div className=\"richtext-w-auto richtext-px-3 richtext-py-2 richtext-transition-all !richtext-border richtext-rounded-sm richtext-shadow-sm richtext-pointer-events-auto richtext-select-none richtext-border-neutral-200 dark:richtext-border-neutral-800 richtext-bg-background\">\n <div className=\"richtext-flex richtext-items-center richtext-gap-[4px] richtext-flex-nowrap richtext-whitespace-nowrap richtext-h-[26px] richtext-justify-start richtext-relative\">\n {items?.map((item: any, key: any) => {\n if (item?.type === 'divider') {\n return (\n <Separator\n key={`bubbleMenu-divider-${key}`}\n orientation=\"vertical\"\n className=\"!richtext-mx-1 !richtext-my-2 !richtext-h-[16px]\"\n />\n )\n }\n\n return (\n <ItemA\n key={`bubbleMenu-text-${key}`}\n item={item}\n disabled={props.disabled}\n editor={props.editor}\n />\n )\n })}\n </div>\n </div>\n )\n : (\n <></>\n )}\n </BubbleMenu>\n )\n}\n\nexport { BubbleMenuText }\n","import React, { useCallback, useState } from 'react'\n\nimport type { TooltipContentProps } from '@radix-ui/react-tooltip'\nimport { debounce } from 'lodash-unified'\n\nimport { ActionButton, Button, ColorPicker } from '@/components'\nimport { IconComponent } from '@/components/icons'\nimport type { ButtonViewReturnComponentProps } from '@/types'\n\ninterface IPropsHighlightActionButton {\n editor: any\n tooltip?: string\n disabled?: boolean\n action?: ButtonViewReturnComponentProps['action']\n isActive?: ButtonViewReturnComponentProps['isActive']\n tooltipOptions?: TooltipContentProps\n shortcutKeys?: string[]\n}\n\nfunction IconC({ fill }: any) {\n return (\n <svg\n width=\"18px\"\n height=\"18px\"\n viewBox=\"0 0 256 256\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g id=\"icon/填充色\" stroke=\"none\" strokeWidth={1} fill=\"none\" fillRule=\"evenodd\">\n <g id=\"icon/背景颜色\">\n <g id=\"编组\" fill=\"currentColor\">\n <g\n transform=\"translate(119.502295, 137.878331) rotate(-135.000000) translate(-119.502295, -137.878331) translate(48.002295, 31.757731)\"\n id=\"矩形\"\n >\n <path\n d=\"M100.946943,60.8084699 L43.7469427,60.8084699 C37.2852111,60.8084699 32.0469427,66.0467383 32.0469427,72.5084699 L32.0469427,118.70847 C32.0469427,125.170201 37.2852111,130.40847 43.7469427,130.40847 L100.946943,130.40847 C107.408674,130.40847 112.646943,125.170201 112.646943,118.70847 L112.646943,72.5084699 C112.646943,66.0467383 107.408674,60.8084699 100.946943,60.8084699 Z M93.646,79.808 L93.646,111.408 L51.046,111.408 L51.046,79.808 L93.646,79.808 Z\"\n fillRule=\"nonzero\"\n />\n <path\n d=\"M87.9366521,16.90916 L87.9194966,68.2000001 C87.9183543,69.4147389 86.9334998,70.399264 85.7187607,70.4 L56.9423078,70.4 C55.7272813,70.4 54.7423078,69.4150264 54.7423078,68.2 L54.7423078,39.4621057 C54.7423078,37.2523513 55.5736632,35.1234748 57.0711706,33.4985176 L76.4832996,12.4342613 C78.9534987,9.75382857 83.1289108,9.5834005 85.8093436,12.0535996 C87.1658473,13.303709 87.9372691,15.0644715 87.9366521,16.90916 Z\"\n fillRule=\"evenodd\"\n />\n <path\n d=\"M131.3,111.241199 L11.7,111.241199 C5.23826843,111.241199 0,116.479467 0,122.941199 L0,200.541199 C0,207.002931 5.23826843,212.241199 11.7,212.241199 L131.3,212.241199 C137.761732,212.241199 143,207.002931 143,200.541199 L143,122.941199 C143,116.479467 137.761732,111.241199 131.3,111.241199 Z M124,130.241 L124,193.241 L19,193.241 L19,130.241 L124,130.241 Z\"\n fillRule=\"nonzero\"\n />\n </g>\n </g>\n <path\n d=\"M51,218 L205,218 C211.075132,218 216,222.924868 216,229 C216,235.075132 211.075132,240 205,240 L51,240 C44.9248678,240 40,235.075132 40,229 C40,222.924868 44.9248678,218 51,218 Z\"\n id=\"矩形\"\n fill={fill || '#FBDE28'}\n />\n </g>\n </g>\n </svg>\n )\n}\n\nfunction HighlightActionButton(props: IPropsHighlightActionButton) {\n // const { action, isActive, disabled, icon, tooltip } = props as any;\n const [selectedColor, setSelectedColor] = useState<any>(undefined)\n\n function onChange(color: string | undefined) {\n props.action?.(color)\n }\n\n function toggleColor() {\n props.action?.(selectedColor)\n }\n\n const setSelectedColorDebounce = useCallback(\n debounce((color: any) => {\n setSelectedColor(color)\n }, 350),\n [],\n )\n\n return (\n <div className=\"richtext-flex richtext-items-center richtext-h-[32px]\">\n <ActionButton\n tooltip={props?.tooltip}\n disabled={props?.disabled}\n action={toggleColor}\n tooltipOptions={props?.tooltipOptions}\n shortcutKeys={props?.shortcutKeys}\n >\n <span className=\"richtext-flex richtext-items-center richtext-justify-center richtext-text-sm\">\n <IconC fill={selectedColor} />\n </span>\n </ActionButton>\n <ColorPicker\n selectedColor={selectedColor}\n setSelectedColor={setSelectedColorDebounce}\n onChange={onChange}\n highlight\n disabled={props?.disabled}\n >\n <Button variant=\"ghost\" size=\"icon\" className=\"!richtext-w-3 !richtext-h-[32px]\" disabled={props?.disabled}>\n <IconComponent className=\"!richtext-w-3 !richtext-h-3 richtext-text-zinc-500\" name=\"MenuDown\" />\n </Button>\n </ColorPicker>\n </div>\n )\n}\n\nexport default HighlightActionButton\n","import type { Editor } from '@tiptap/core'\nimport { isActive } from '@tiptap/core'\nimport { BubbleMenu } from '@tiptap/react'\nimport type { GetReferenceClientRect } from 'tippy.js'\nimport { sticky } from 'tippy.js'\n\nimport { ActionButton, Separator } from '@/components'\nimport HighlightActionButton from '@/extensions/Highlight/components/HighlightActionButton'\nimport { useLocale } from '@/locales'\n\nexport interface TableBubbleMenuProps {\n editor: Editor\n}\n\nfunction TableBubbleMenu({ editor }: TableBubbleMenuProps) {\n const shouldShow = ({ editor }: { editor: Editor }) => {\n return isActive(editor.view.state, 'table')\n }\n const { t } = useLocale()\n\n function onAddColumnBefore() {\n editor.chain().focus().addColumnBefore().run()\n }\n\n function onAddColumnAfter() {\n editor.chain().focus().addColumnAfter().run()\n }\n\n function onDeleteColumn() {\n editor.chain().focus().deleteColumn().run()\n }\n function onAddRowAbove() {\n editor.chain().focus().addRowBefore().run()\n }\n\n function onAddRowBelow() {\n editor.chain().focus().addRowAfter().run()\n }\n\n function onDeleteRow() {\n editor.chain().focus().deleteRow().run()\n }\n\n function onMergeCell() {\n editor.chain().focus().mergeCells().run()\n }\n function onSplitCell() {\n editor?.chain().focus().splitCell().run()\n }\n function onDeleteTable() {\n editor.chain().focus().deleteTable().run()\n }\n\n function onSetCellBackground(color: string) {\n editor.chain().focus().setTableCellBackground(color).run()\n }\n const getReferenceClientRect: GetReferenceClientRect = () => {\n const {\n view,\n state: {\n selection: { from },\n },\n } = editor\n\n const node = view.domAtPos(from).node as HTMLElement\n if (!node) {\n return new DOMRect(-1000, -1000, 0, 0)\n }\n\n const tableWrapper = node?.closest?.('.tableWrapper')\n if (!tableWrapper) {\n return new DOMRect(-1000, -1000, 0, 0)\n }\n\n const rect = tableWrapper.getBoundingClientRect()\n\n return rect\n }\n\n return (\n <BubbleMenu\n editor={editor}\n pluginKey=\"table\"\n shouldShow={shouldShow}\n updateDelay={0}\n tippyOptions={{\n offset: [0, 8],\n popperOptions: {\n modifiers: [{ name: 'flip', enabled: false }],\n },\n maxWidth: 'auto',\n getReferenceClientRect,\n plugins: [sticky],\n sticky: 'popper',\n }}\n >\n <div className=\"richtext-min-w-32 richtext-flex richtext-flex-row richtext-h-full richtext-items-center richtext-leading-none richtext-gap-0.5 richtext-p-2 richtext-w-full richtext-bg-background richtext-rounded-lg richtext-shadow-sm !richtext-border richtext-border-border\">\n <ActionButton\n icon=\"BetweenHorizonalEnd\"\n tooltip={t('editor.table.menu.insertColumnBefore')}\n action={onAddColumnBefore}\n tooltip-options={{\n sideOffset: 15,\n }}\n disabled={!editor?.can()?.addColumnBefore?.()}\n />\n <ActionButton\n icon=\"BetweenHorizonalStart\"\n tooltip={t('editor.table.menu.insertColumnAfter')}\n action={onAddColumnAfter}\n tooltip-options={{\n sideOffset: 15,\n }}\n disabled={!editor?.can()?.addColumnAfter?.()}\n />\n <ActionButton\n icon=\"DeleteColumn\"\n action={onDeleteColumn}\n tooltip={t('editor.table.menu.deleteColumn')}\n tooltip-options={{\n sideOffset: 15,\n }}\n disabled={!editor?.can().deleteColumn?.()}\n />\n <Separator orientation=\"vertical\" className=\"!richtext-mx-1 !richtext-my-2 !richtext-h-[16px]\" />\n\n <ActionButton\n icon=\"BetweenVerticalEnd\"\n action={onAddRowAbove}\n tooltip={t('editor.table.menu.insertRowAbove')}\n tooltip-options={{\n sideOffset: 15,\n }}\n disabled={!editor?.can().addRowBefore?.()}\n />\n\n <ActionButton\n icon=\"BetweenVerticalStart\"\n action={onAddRowBelow}\n tooltip={t('editor.table.menu.insertRowBelow')}\n tooltip-options={{\n sideOffset: 15,\n }}\n disabled={!editor?.can()?.addRowAfter?.()}\n />\n <ActionButton\n icon=\"DeleteRow\"\n action={onDeleteRow}\n tooltip={t('editor.table.menu.deleteRow')}\n tooltip-options={{\n sideOffset: 15,\n }}\n disabled={!editor?.can()?.deleteRow?.()}\n />\n <Separator orientation=\"vertical\" className=\"!richtext-mx-1 !richtext-my-2 !richtext-h-[16px]\" />\n <ActionButton\n icon=\"TableCellsMerge\"\n action={onMergeCell}\n tooltip={t('editor.table.menu.mergeCells')}\n tooltip-options={{\n sideOffset: 15,\n }}\n disabled={!editor?.can()?.mergeCells?.()}\n />\n <ActionButton\n icon=\"TableCellsSplit\"\n action={onSplitCell}\n tooltip={t('editor.table.menu.splitCells')}\n tooltip-options={{\n sideOffset: 15,\n }}\n disabled={!editor?.can()?.splitCell?.()}\n />\n <Separator orientation=\"vertical\" className=\"!richtext-mx-1 !richtext-my-2 !richtext-h-[16px]\" />\n\n <HighlightActionButton\n editor={editor}\n tooltip={t('editor.table.menu.setCellsBgColor')}\n action={onSetCellBackground}\n tooltipOptions={{\n sideOffset: 15,\n }}\n />\n <ActionButton\n icon=\"Trash2\"\n tooltip={t('editor.table.menu.deleteTable')}\n action={onDeleteTable}\n tooltip-options={{\n sideOffset: 15,\n }}\n disabled={!editor?.can()?.deleteTable?.()}\n />\n </div>\n </BubbleMenu>\n )\n}\n\nexport { TableBubbleMenu }\n","import React, { useEffect, useState } from 'react'\n\nimport { Button, IconComponent, Input, Label, Switch } from '@/components'\nimport { useLocale } from '@/locales'\n\ninterface IPropsLinkEditBlock {\n editor: any\n onSetLink: (link: string, text?: string, openInNewTab?: boolean) => void\n}\n\nfunction LinkEditBlock(props: IPropsLinkEditBlock) {\n const { t } = useLocale()\n\n const [form, setForm] = useState({\n text: '',\n link: '',\n })\n const [openInNewTab, setOpenInNewTab] = useState<boolean>(false)\n\n useEffect(() => {\n if (props?.editor) {\n const { href: link, target } = props.editor?.getAttributes('link')\n\n const { from, to } = props.editor.state.selection\n const text = props.editor.state.doc.textBetween(from, to, ' ')\n setForm({\n link,\n text,\n })\n setOpenInNewTab(target === '_blank')\n }\n }, [props?.editor])\n\n function handleSubmit(event: any) {\n event.preventDefault()\n props?.onSetLink(form.link, form.text, openInNewTab)\n }\n\n return (\n <div className=\"richtext-p-2 richtext-bg-white !richtext-border richtext-rounded-lg richtext-shadow-sm dark:richtext-bg-black border-neutral-200 dark:richtext-border-neutral-800\">\n <form className=\"richtext-flex richtext-flex-col richtext-gap-2\" onSubmit={handleSubmit}>\n <Label className=\"mb-[6px]\">\n {t('editor.link.dialog.text')}\n </Label>\n <div className=\"richtext-flex richtext-w-full richtext-max-w-sm richtext-items-center richtext-gap-1.5 richtext-mb-[10px]\">\n <div className=\"richtext-relative richtext-items-center richtext-w-full richtext-max-w-sm\">\n <Input\n type=\"text\"\n value={form.text}\n required\n className=\"richtext-w-80\"\n placeholder=\"Text\"\n onChange={e => setForm({ ...form, text: e.target.value })}\n />\n </div>\n </div>\n <Label className=\"mb-[6px]\">{t('editor.link.dialog.link')}</Label>\n <div className=\"richtext-flex richtext-w-full richtext-max-w-sm richtext-items-center richtext-gap-1.5\">\n <div className=\"richtext-relative richtext-items-center richtext-w-full richtext-max-w-sm\">\n <Input\n type=\"url\"\n value={form.link}\n required\n className=\"richtext-pl-10\"\n onChange={e => setForm({ ...form, link: e.target.value })}\n />\n <span className=\"richtext-absolute richtext-inset-y-0 richtext-flex richtext-items-center richtext-justify-center richtext-px-2 richtext-start-0\">\n <IconComponent className=\"richtext-size-5 richtext-text-muted-foreground\" name=\"Link\" />\n </span>\n </div>\n </div>\n <div className=\"richtext-flex richtext-items-center richtext-space-x-2\">\n <Label>{t('editor.link.dialog.openInNewTab')}</Label>\n <Switch\n checked={openInNewTab}\n onCheckedChange={(e) => {\n setOpenInNewTab(e)\n }}\n />\n </div>\n <Button type=\"submit\" className=\"richtext-self-end richtext-mt-2\">\n {t('editor.link.dialog.button.apply')}\n </Button>\n </form>\n </div>\n )\n}\n\nexport default LinkEditBlock\n","import React from 'react'\n\nimport { truncate } from 'lodash-unified'\n\nimport { ActionButton, Separator } from '@/components'\nimport { useLocale } from '@/locales'\n\ninterface IPropsLinkViewBlock {\n editor: any\n link: string\n onClear?: any\n onEdit?: any\n}\n\nfunction LinkViewBlock(props: IPropsLinkViewBlock) {\n const { t } = useLocale()\n\n return (\n <div className=\"richtext-flex richtext-items-center richtext-gap-2 richtext-p-2 richtext-bg-white !richtext-border richtext-rounded-lg richtext-shadow-sm dark:richtext-bg-black richtext-border-neutral-200 dark:richtext-border-neutral-800\">\n <a\n href={props?.link}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"richtext-text-sm richtext-underline richtext-break-all\"\n >\n {truncate(props?.link, {\n length: 50,\n omission: '…',\n })}\n </a>\n {props?.link && <Separator orientation=\"vertical\" className=\"!richtext-h-4\" />}\n <div className=\"richtext-flex richtext-flex-nowrap\">\n <ActionButton\n icon=\"Pencil\"\n tooltip={t('editor.link.edit.tooltip')}\n action={() => {\n props?.onEdit()\n }}\n tooltipOptions={{ sideOffset: 15 }}\n />\n <ActionButton\n icon=\"Unlink\"\n tooltip={t('editor.link.unlink.tooltip')}\n action={() => {\n props?.onClear()\n }}\n tooltipOptions={{ sideOffset: 15 }}\n />\n </div>\n </div>\n )\n}\n\nexport default LinkViewBlock\n","import { useCallback, useMemo, useState } from 'react'\n\nimport type { Editor } from '@tiptap/react'\nimport { BubbleMenu } from '@tiptap/react'\n\nimport LinkEditBlock from '@/extensions/Link/components/LinkEditBlock'\nimport LinkViewBlock from '@/extensions/Link/components/LinkViewBlock'\n\nexport interface BubbleMenuLinkProps {\n editor: Editor\n disabled?: boolean\n}\n\nfunction BubbleMenuLink({ editor, disabled }: BubbleMenuLinkProps) {\n const [showEdit, setShowEdit] = useState(false)\n\n const link = useMemo(() => {\n const { href: link } = editor.getAttributes('link')\n return link as string\n }, [editor])\n\n const shouldShow = useCallback(({ editor }: { editor: Editor }) => {\n const isActive = editor.isActive('link')\n return isActive\n }, [])\n\n const onSetLink = (url: string, text?: string, openInNewTab?: boolean) => {\n editor\n .chain()\n .extendMarkRange('link')\n .insertContent({\n type: 'text',\n text,\n marks: [\n {\n type: 'link',\n attrs: {\n href: url,\n target: openInNewTab ? '_blank' : '',\n },\n },\n ],\n })\n .setLink({ href: url })\n .focus()\n .run()\n setShowEdit(false)\n }\n\n const unSetLink = useCallback(() => {\n editor.chain().extendMarkRange('link').unsetLink().focus().run()\n setShowEdit(false)\n }, [editor])\n\n return (\n <>\n <BubbleMenu\n editor={editor}\n shouldShow={shouldShow}\n tippyOptions={{\n popperOptions: {\n modifiers: [{ name: 'flip', enabled: false }],\n },\n placement: 'bottom-start',\n offset: [-2, 16],\n zIndex: 9999,\n onHidden: () => {\n setShowEdit(false)\n },\n }}\n >\n {disabled\n ? (\n <></>\n )\n : (\n <>\n {showEdit\n ? (\n <LinkEditBlock onSetLink={onSetLink} editor={editor} />\n )\n : (\n <LinkViewBlock\n editor={editor}\n onClear={unSetLink}\n onEdit={() => {\n setShowEdit(true)\n }}\n link={link}\n />\n )}\n </>\n )}\n </BubbleMenu>\n </>\n )\n}\n\nexport { BubbleMenuLink }\n","/* eslint-disable react/no-useless-fragment */\nimport { Fragment, useMemo } from 'react'\n\nimport type { Editor } from '@tiptap/react'\nimport { BubbleMenu as BubbleMenuReact } from '@tiptap/react'\n\nimport { Separator, getBubbleImage, getBubbleVideo } from '@/components'\nimport { useLocale } from '@/locales'\n\ninterface IPropsBubbleMenu {\n editor: Editor\n disabled?: boolean\n}\n\nconst tippyOptions = {\n maxWidth: 'auto',\n zIndex: 20,\n appendTo: 'parent',\n moveTransition: 'transform 0.1s ease-out',\n}\n\nfunction ItemA({ item, disabled, editor }: any) {\n const Comp = item.component\n\n if (!Comp) {\n return <></>\n }\n\n return (\n <Fragment>\n {item.type === 'divider'\n ? (\n <Separator orientation=\"vertical\" className=\"!richtext-mx-1 !richtext-my-2 !richtext-h-[16px]\" />\n )\n : (\n <Comp\n {...item.componentProps}\n editor={editor}\n disabled={disabled || item?.componentProps?.disabled}\n />\n )}\n </Fragment>\n )\n}\n\nfunction isImageNode(node: any) {\n return node.type.name === 'image'\n}\n\nfunction isVideoNode(node: any) {\n return node.type.name === 'video'\n}\n\nfunction BubbleMenuImage(props: IPropsBubbleMenu) {\n const { lang } = useLocale()\n\n const shouldShow = ({ editor }: any) => {\n const { selection } = editor.view.state\n const { $from, to } = selection\n let isImage = false\n\n editor.view.state.doc.nodesBetween($from.pos, to, (node: any) => {\n if (isImageNode(node)) {\n isImage = true\n return false // Stop iteration if an image is found\n }\n })\n\n return isImage\n }\n\n const items = useMemo(() => {\n if (props.disabled) {\n return []\n }\n return getBubbleImage(props.editor)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [props.disabled, props.editor, lang])\n\n return (\n <>\n <BubbleMenuReact\n shouldShow={shouldShow}\n editor={props?.editor}\n tippyOptions={tippyOptions as any}\n >\n {items?.length\n ? (\n <div className=\"richtext-w-auto richtext-px-3 richtext-py-2 richtext-transition-all !richtext-border richtext-rounded-sm richtext-shadow-sm richtext-pointer-events-auto richtext-select-none richtext-border-neutral-200 dark:richtext-border-neutral-800 richtext-bg-background\">\n <div className=\"richtext-flex richtext-items-center richtext-flex-nowrap richtext-whitespace-nowrap richtext-h-[26px] richtext-justify-start richtext-relative\">\n {items?.map((item: any, key: any) => {\n return (\n <ItemA\n key={`bubbleMenu-image-${key}`}\n item={item}\n disabled={props.disabled}\n editor={props.editor}\n />\n )\n })}\n </div>\n </div>\n )\n : (\n <></>\n )}\n </BubbleMenuReact>\n </>\n )\n}\n\nfunction BubbleMenuVideo(props: IPropsBubbleMenu) {\n const { lang } = useLocale()\n\n const shouldShow = ({ editor }: any) => {\n const { selection } = editor.view.state\n const { $from, to } = selection\n let isVideo = false\n\n editor.view.state.doc.nodesBetween($from.pos, to, (node: any) => {\n if (isVideoNode(node)) {\n isVideo = true\n return false\n }\n })\n\n return isVideo\n }\n\n const items = useMemo(() => {\n if (props.disabled) {\n return []\n }\n\n return getBubbleVideo(props.editor)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [props.editor, props.disabled, lang])\n\n return (\n <>\n <BubbleMenuReact\n shouldShow={shouldShow}\n editor={props?.editor}\n tippyOptions={tippyOptions as any}\n >\n {items?.length\n ? (\n <div className=\"richtext-w-auto richtext-px-3 richtext-py-2 richtext-transition-all !richtext-border richtext-rounded-sm richtext-shadow-sm richtext-pointer-events-auto richtext-select-none richtext-border-neutral-200 dark:richtext-border-neutral-800 richtext-bg-background\">\n <div className=\"richtext-flex richtext-items-center richtext-flex-nowrap richtext-whitespace-nowrap richtext-h-[26px] richtext-justify-start richtext-relative\">\n {items?.map((item: any, key: any) => {\n return (\n <ItemA\n key={`bubbleMenu-video-${key}`}\n item={item}\n disabled={props.disabled}\n editor={props.editor}\n />\n )\n })}\n </div>\n </div>\n )\n : (\n <></>\n )}\n </BubbleMenuReact>\n </>\n )\n}\n\nexport { BubbleMenuImage, BubbleMenuVideo }\n","import { useCallback } from 'react'\n\nimport { BubbleMenu } from '@tiptap/react'\nimport { ActionButton } from '@/components/ActionButton'\nimport { deleteNode } from '@/utils/delete-node'\nimport { MultiColumn } from '@/extensions'\nimport { useLocale } from '@/locales'\n\nexport function ColumnsBubbleMenu({ editor }: any) {\n const { t } = useLocale()\n\n const shouldShow = useCallback(() => editor.isActive(MultiColumn.name), [editor])\n const deleteMe = useCallback(() => deleteNode(MultiColumn.name, editor), [editor])\n const addColBefore = useCallback(() => editor.chain().focus().addColBefore().run(), [editor])\n const addColAfter = useCallback(() => editor.chain().focus().addColAfter().run(), [editor])\n const deleteCol = useCallback(() => editor.chain().focus().deleteCol().run(), [editor])\n\n return (\n <BubbleMenu\n pluginKey=\"columns-bubble-menu\"\n editor={editor}\n shouldShow={shouldShow}\n tippyOptions={{\n popperOptions: {\n modifiers: [{ name: 'flip', enabled: false }],\n },\n placement: 'bottom-start',\n offset: [-2, 16],\n zIndex: 9999,\n // onHidden: () => {\n // toggleVisible(false)\n // },\n }}\n >\n <div className=\"richtext-w-auto richtext-px-3 richtext-py-2 richtext-transition-all !richtext-border richtext-rounded-sm richtext-shadow-sm richtext-pointer-events-auto richtext-select-none richtext-border-neutral-200 dark:richtext-border-neutral-800 richtext-bg-background\">\n <ActionButton\n action={addColBefore}\n icon=\"ColumnAddLeft\"\n tooltip={t('editor.table.menu.insertColumnBefore')}\n />\n <ActionButton\n action={addColAfter}\n icon=\"ColumnAddRight\"\n tooltip={t('editor.table.menu.insertColumnAfter')}\n />\n <ActionButton\n action={deleteCol}\n icon=\"DeleteColumn\"\n tooltip={t('editor.table.menu.deleteColumn')}\n />\n <ActionButton\n action={deleteMe}\n icon=\"Trash2\"\n tooltip={t('editor.table.menu.delete_column')}\n />\n </div>\n </BubbleMenu>\n )\n}\n","import type { BoldOptions as TiptapImageOptions } from '@tiptap/extension-bold'\nimport { Bold as TiptapBold } from '@tiptap/extension-bold'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface BoldOptions extends TiptapImageOptions, GeneralOptions<BoldOptions> {}\n\nexport const Bold = TiptapBold.extend<BoldOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, t }: any) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleBold(),\n isActive: () => editor.isActive('bold') || false,\n disabled: !editor.can().toggleBold(),\n icon: 'Bold',\n shortcutKeys: ['mod', 'B'],\n tooltip: t('editor.bold.tooltip'),\n },\n }),\n }\n },\n})\n","import type { Editor } from '@tiptap/core'\nimport type { ItalicOptions as TiptapItalicOptions } from '@tiptap/extension-italic'\nimport TiptapItalic from '@tiptap/extension-italic'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface ItalicOptions extends TiptapItalicOptions, GeneralOptions<ItalicOptions> {}\n\nexport const Italic = TiptapItalic.extend<ItalicOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n button({ editor, t }: { editor: Editor, t: (...args: any[]) => string }) {\n return {\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleItalic(),\n isActive: () => editor.isActive('italic') || false,\n disabled: !editor.can().toggleItalic(),\n shortcutKeys: ['mod', 'I'],\n icon: 'Italic',\n tooltip: t('editor.italic.tooltip'),\n },\n }\n },\n }\n },\n})\n","import type { UnderlineOptions as TiptapUnderlineOptions } from '@tiptap/extension-underline'\nimport TiptapUnderline from '@tiptap/extension-underline'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface UnderlineOptions\n extends TiptapUnderlineOptions,\n GeneralOptions<UnderlineOptions> {}\n\nexport const Underline = TiptapUnderline.extend<UnderlineOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n button({ editor, t }: any) {\n return {\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleUnderline(),\n isActive: () => editor.isActive('underline') || false,\n disabled: !editor.can().toggleUnderline(),\n icon: 'Underline',\n shortcutKeys: ['mod', 'U'],\n tooltip: t('editor.underline.tooltip'),\n },\n }\n },\n }\n },\n})\n","import type { StrikeOptions as TiptapStrikeOptions } from '@tiptap/extension-strike'\nimport { Strike as TiptapStrike } from '@tiptap/extension-strike'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface StrikeOptions extends TiptapStrikeOptions, GeneralOptions<StrikeOptions> {}\n\nexport const Strike = TiptapStrike.extend<StrikeOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, t }: any) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleStrike(),\n isActive: () => editor.isActive('strike') || false,\n disabled: !editor.can().toggleStrike(),\n icon: 'Strikethrough',\n shortcutKeys: ['shift', 'mod', 'X'],\n tooltip: t('editor.strike.tooltip'),\n },\n }),\n }\n },\n})\n","import type { CodeOptions as TiptapCodeOptions } from '@tiptap/extension-code'\nimport { Code as TiptapCode } from '@tiptap/extension-code'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface CodeOptions extends TiptapCodeOptions, GeneralOptions<CodeOptions> {}\n\nexport const Code = TiptapCode.extend<CodeOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, t }) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleCode(),\n isActive: () => editor.isActive('code') || false,\n disabled: !editor.can().toggleCode(),\n icon: 'Code',\n shortcutKeys: ['mod', 'E'],\n tooltip: t('editor.code.tooltip'),\n },\n }),\n }\n },\n})\n","import type {\n BundledLanguage,\n BundledTheme,\n Highlighter,\n} from 'shiki'\nimport {\n bundledLanguages,\n bundledThemes,\n createHighlighter,\n} from 'shiki'\nimport { findChildren } from '@tiptap/core'\nimport type { Node as ProsemirrorNode } from '@tiptap/pm/model'\n\nlet highlighter: Highlighter | undefined\nlet highlighterPromise: Promise<void> | undefined\nconst loadingLanguages = new Set<BundledLanguage>()\nconst loadingThemes = new Set<BundledTheme>()\n\ninterface HighlighterOptions {\n themes: (BundledTheme | null | undefined)[]\n languages: (BundledLanguage | null | undefined)[]\n}\n\nexport function resetHighlighter() {\n highlighter = undefined\n highlighterPromise = undefined\n loadingLanguages.clear()\n loadingThemes.clear()\n}\n\nexport function getShiki() {\n return highlighter\n}\n\n/**\n * Load the highlighter. Makes sure the highlighter is only loaded once.\n */\nexport function loadHighlighter(opts: HighlighterOptions) {\n if (!highlighter && !highlighterPromise) {\n const themes = opts.themes.filter(\n (theme): theme is BundledTheme => !!theme && theme in bundledThemes,\n )\n const langs = opts.languages.filter(\n (lang): lang is BundledLanguage => !!lang && lang in bundledLanguages,\n )\n highlighterPromise = createHighlighter({ themes, langs }).then((h) => {\n highlighter = h\n })\n return highlighterPromise\n }\n\n if (highlighterPromise) {\n return highlighterPromise\n }\n}\n\n/**\n * Loads a theme if it's valid and not yet loaded.\n * @returns true or false depending on if it got loaded.\n */\nexport async function loadTheme(theme: BundledTheme) {\n if (\n highlighter\n && !highlighter.getLoadedThemes().includes(theme)\n && !loadingThemes.has(theme)\n && theme in bundledThemes\n ) {\n loadingThemes.add(theme)\n await highlighter.loadTheme(theme)\n loadingThemes.delete(theme)\n return true\n }\n\n return false\n}\n\n/**\n * Loads a language if it's valid and not yet loaded\n * @returns true or false depending on if it got loaded.\n */\nexport async function loadLanguage(language: BundledLanguage) {\n if (\n highlighter\n && !highlighter.getLoadedLanguages().includes(language)\n && !loadingLanguages.has(language)\n && language in bundledLanguages\n ) {\n loadingLanguages.add(language)\n await highlighter.loadLanguage(language)\n loadingLanguages.delete(language)\n return true\n }\n\n return false\n}\n\n/**\n * Initializes the highlighter based on the prosemirror document,\n * with the themes and languages in the document.\n */\nexport async function initHighlighter({\n doc,\n name,\n defaultTheme,\n defaultLanguage,\n}: {\n doc: ProsemirrorNode\n name: string\n defaultLanguage: BundledLanguage | null | undefined\n defaultTheme: BundledTheme\n}) {\n const codeBlocks = findChildren(doc, node => node.type.name === name)\n\n const themes = [\n ...codeBlocks.map(block => block.node.attrs.theme as BundledTheme),\n defaultTheme,\n ]\n const languages = [\n ...codeBlocks.map(block => block.node.attrs.language as BundledLanguage),\n defaultLanguage,\n ]\n\n if (!highlighter) {\n const loader = loadHighlighter({ languages, themes })\n await loader\n }\n else {\n await Promise.all([\n ...themes.flatMap(theme => loadTheme(theme)),\n ...languages.flatMap(language => !!language && loadLanguage(language)),\n ])\n }\n}\n","import type { BundledLanguage, BundledTheme } from 'shiki'\nimport { findChildren } from '@tiptap/core'\nimport type { PluginView } from '@tiptap/pm/state'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\nimport { Decoration, DecorationSet } from '@tiptap/pm/view'\nimport type { Node as ProsemirrorNode } from '@tiptap/pm/model'\nimport {\n getShiki,\n initHighlighter,\n loadLanguage,\n loadTheme,\n} from './highlighter'\n\n/** Create code decorations for the current document */\nfunction getDecorations({\n doc,\n name,\n defaultTheme,\n defaultLanguage,\n}: {\n doc: ProsemirrorNode\n name: string\n defaultLanguage: BundledLanguage | null | undefined\n defaultTheme: BundledTheme\n}) {\n const decorations: Decoration[] = []\n\n const codeBlocks = findChildren(doc, node => node.type.name === name)\n\n codeBlocks.forEach((block) => {\n let from = block.pos + 1\n let language = block.node.attrs.language || defaultLanguage\n const theme = block.node.attrs.theme || defaultTheme\n\n const highlighter = getShiki()\n\n if (!highlighter)\n return\n\n if (!highlighter.getLoadedLanguages().includes(language)) {\n language = 'plaintext'\n }\n\n const themeToApply = highlighter.getLoadedThemes().includes(theme)\n ? theme\n : highlighter.getLoadedThemes()[0]\n\n const tokens = highlighter.codeToTokensBase(block.node.textContent, {\n lang: language,\n theme: themeToApply,\n })\n\n for (const line of tokens) {\n for (const token of line) {\n const to = from + token.content.length\n\n const decoration = Decoration.inline(from, to, {\n style: `color: ${token.color}`,\n })\n\n decorations.push(decoration)\n\n from = to\n }\n\n from += 1\n }\n })\n\n return DecorationSet.create(doc, decorations)\n}\n\nexport function ShikiPlugin({\n name,\n defaultLanguage,\n defaultTheme,\n}: {\n name: string\n defaultLanguage: BundledLanguage | null | undefined\n defaultTheme: BundledTheme\n}) {\n const shikiPlugin: Plugin<any> = new Plugin({\n key: new PluginKey('shiki'),\n\n view(view) {\n // This small view is just for initial async handling\n class ShikiPluginView implements PluginView {\n constructor() {\n this.initDecorations()\n }\n\n update() {\n this.checkUndecoratedBlocks()\n }\n\n destroy() {}\n\n // Initialize shiki async, and then highlight initial document\n async initDecorations() {\n const doc = view.state.doc\n await initHighlighter({ doc, name, defaultLanguage, defaultTheme })\n const tr = view.state.tr.setMeta('shikiPluginForceDecoration', true)\n view.dispatch(tr)\n }\n\n // When new codeblocks were added and they have missing themes or\n // languages, load those and then add code decorations once again.\n async checkUndecoratedBlocks() {\n const codeBlocks = findChildren(\n view.state.doc,\n node => node.type.name === name,\n )\n\n // Load missing themes or languages when necessary.\n // loadStates is an array with booleans depending on if a theme/lang\n // got loaded.\n const loadStates = await Promise.all(\n codeBlocks.flatMap(block => [\n loadTheme(block.node.attrs.theme),\n loadLanguage(block.node.attrs.language),\n ]),\n )\n const didLoadSomething = loadStates.includes(true)\n\n // The asynchronous nature of this is potentially prone to\n // race conditions. Imma just hope it's fine lol\n\n if (didLoadSomething) {\n const tr = view.state.tr.setMeta('shikiPluginForceDecoration', true)\n view.dispatch(tr)\n }\n }\n }\n\n return new ShikiPluginView()\n },\n\n state: {\n init: (_, { doc }) => {\n return getDecorations({\n doc,\n name,\n defaultLanguage,\n defaultTheme,\n })\n },\n apply: (transaction, decorationSet, oldState, newState) => {\n const oldNodeName = oldState.selection.$head.parent.type.name\n const newNodeName = newState.selection.$head.parent.type.name\n const oldNodes = findChildren(\n oldState.doc,\n node => node.type.name === name,\n )\n const newNodes = findChildren(\n newState.doc,\n node => node.type.name === name,\n )\n\n const didChangeSomeCodeBlock\n = transaction.docChanged\n // Apply decorations if:\n // selection includes named node,\n && ([oldNodeName, newNodeName].includes(name)\n // OR transaction adds/removes named node,\n || newNodes.length !== oldNodes.length\n // OR transaction has changes that completely encapsulte a node\n // (for example, a transaction that affects the entire document).\n // Such transactions can happen during collab syncing via y-prosemirror, for example.\n || transaction.steps.some((step: any) => {\n return (\n step.from !== undefined\n && step.to !== undefined\n && oldNodes.some((node) => {\n return (\n node.pos >= step.from\n && node.pos + node.node.nodeSize <= step.to\n )\n })\n )\n }))\n\n // only create code decoration when it's necessary to do so\n if (\n transaction.getMeta('shikiPluginForceDecoration')\n || didChangeSomeCodeBlock\n ) {\n return getDecorations({\n doc: transaction.doc,\n name,\n defaultLanguage,\n defaultTheme,\n })\n }\n\n return decorationSet.map(transaction.mapping, transaction.doc)\n },\n },\n\n props: {\n decorations(state) {\n return shikiPlugin.getState(state)\n },\n },\n })\n\n return shikiPlugin\n}\n","import React, { useMemo } from 'react'\n\nimport type { BundledLanguage } from 'shiki'\nimport {\n ActionButton,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@/components'\nimport { MAP_LANGUAGE_CODE_LABELS } from '@/constants'\n\ninterface Props {\n editor: any\n disabled?: boolean\n color?: string\n shortcutKeys?: string[]\n maxHeight?: string | number\n tooltip?: string\n languages?: BundledLanguage[]\n action: (language: string) => void\n icon?: any\n}\n\nfunction CodeBlockActiveButton({ action, languages, ...props }: Props) {\n const onClick = (language: string) => {\n action(language)\n }\n\n const langs = useMemo(() => {\n return languages?.map((language) => {\n const title = MAP_LANGUAGE_CODE_LABELS[language] || language\n\n return {\n title,\n // icon: language.icon,\n language,\n }\n })\n }, [languages])\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger disabled={props?.disabled} asChild>\n <ActionButton\n tooltip={props?.tooltip}\n disabled={props?.disabled}\n icon={props?.icon}\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"richtext-w-full\">\n {langs?.map((item: any) => {\n return (\n <DropdownMenuItem key={`codeblock-${item.title}`} onClick={() => onClick(item.language)}>\n <div className=\"richtext-h-full richtext-ml-1\">\n {item.title}\n </div>\n </DropdownMenuItem>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport default CodeBlockActiveButton\n","import type { BundledLanguage, BundledTheme } from 'shiki'\nimport type { CodeBlockOptions as CodeBlockExtOptions } from '@tiptap/extension-code-block'\nimport CodeBlockExt from '@tiptap/extension-code-block'\nimport type { GeneralOptions } from '@/types'\nimport { ShikiPlugin } from '@/extensions/CodeBlock/shiki-plugin'\nimport CodeBlockActiveButton from '@/extensions/CodeBlock/components/CodeBlockActiveButton'\nimport { DEFAULT_LANGUAGE_CODE_BLOCK } from '@/constants'\n\nexport interface CodeBlockOptions\n extends GeneralOptions<CodeBlockExtOptions> {\n languages?: BundledLanguage[]\n defaultTheme: BundledTheme\n}\n\nexport const CodeBlock = CodeBlockExt.extend<CodeBlockOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n languages: [],\n button: ({ editor, t, extension }: any) => {\n const languages = extension?.options?.languages?.length ? extension?.options?.languages : DEFAULT_LANGUAGE_CODE_BLOCK\n\n return {\n component: CodeBlockActiveButton,\n componentProps: {\n action: (language = 'js') => editor.commands.setCodeBlock({\n language,\n }),\n isActive: () => editor.isActive('codeBlock') || false,\n disabled: !editor.can().toggleCodeBlock(),\n icon: 'Code2',\n tooltip: t('editor.codeblock.tooltip'),\n languages,\n },\n }\n },\n }\n },\n addProseMirrorPlugins() {\n return [\n ...(this.parent?.() || []),\n ShikiPlugin({\n name: this.name,\n defaultLanguage: null,\n defaultTheme: this.options.defaultTheme,\n }),\n ]\n },\n})\n","import React, { Fragment, useMemo } from 'react'\n\nimport {\n ActionMenuButton,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@/components'\nimport { useLocale } from '@/locales'\nimport type { ButtonViewReturnComponentProps } from '@/types'\n\nexport interface Item {\n title: string\n icon?: any\n font?: string\n isActive: NonNullable<ButtonViewReturnComponentProps['isActive']>\n action?: ButtonViewReturnComponentProps['action']\n style?: React.CSSProperties\n shortcutKeys?: string[]\n disabled?: boolean\n divider?: boolean\n default?: boolean\n}\n\ninterface Props {\n editor: any\n disabled?: boolean\n color?: string\n shortcutKeys?: string[]\n maxHeight?: string | number\n tooltip?: string\n items?: Item[]\n}\n\nfunction FontFamilyButton(props: Props) {\n const { t, lang } = useLocale()\n\n const active = useMemo(() => {\n const find: any = props?.items?.find((k: any) => k.isActive())\n\n if (find && !find.default) {\n return {\n ...find,\n }\n }\n const item: Item = {\n title: props.tooltip as any,\n font: t('editor.fontFamily.default.tooltip'),\n isActive: () => false,\n disabled: false,\n action: () => props.editor.chain().focus().unsetFontFamily().run(),\n }\n return item\n }, [t, lang, props])\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger disabled={props?.disabled} asChild>\n <ActionMenuButton\n title={active?.font?.length > 7 ? `${active?.font?.slice(0, 6)}...` : active?.font}\n tooltip={props?.tooltip}\n disabled={props?.disabled}\n icon=\"MenuDown\"\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"richtext-w-full\">\n {props?.items?.map((item: any, index) => {\n const style\n = item.font === t('editor.fontFamily.default.tooltip') ? {} : { fontFamily: item.font }\n\n return (\n <Fragment key={index}>\n <DropdownMenuCheckboxItem checked={active?.font === item.font} onClick={item.action}>\n <div className=\"richtext-h-full richtext-ml-1\" style={style}>\n {item.font}\n </div>\n </DropdownMenuCheckboxItem>\n {item.font === t('editor.fontFamily.default.tooltip') && <DropdownMenuSeparator />}\n </Fragment>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport default FontFamilyButton\n","import type { Extension } from '@tiptap/core'\nimport type { FontFamilyOptions as TiptapFontFamilyOptions } from '@tiptap/extension-font-family'\nimport FontFamilyTiptap from '@tiptap/extension-font-family'\n\nimport type { BaseKitOptions } from '../BaseKit'\nimport { ensureNameValueOptions } from '@/utils/utils'\nimport { DEFAULT_FONT_FAMILY_LIST } from '@/constants'\nimport FontFamilyButton from '@/extensions/FontFamily/components/FontFamilyButton'\nimport type { GeneralOptions, NameValueOption } from '@/types'\n\nexport interface FontFamilyOptions extends TiptapFontFamilyOptions, GeneralOptions<FontFamilyOptions> {\n /**\n * Font family list.\n */\n fontFamilyList: (string | NameValueOption)[]\n}\n\nexport const FontFamily = FontFamilyTiptap.extend<FontFamilyOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n fontFamilyList: DEFAULT_FONT_FAMILY_LIST,\n button({ editor, extension, t }: any) {\n const { extensions = [] } = editor.extensionManager ?? []\n const fontFamilyList = ensureNameValueOptions(extension?.options?.fontFamilyList || [])\n const baseKitExt = extensions.find(\n (k: any) => k.name === 'base-kit',\n ) as Extension<BaseKitOptions>\n\n const items = fontFamilyList.map(font => ({\n action: () => {\n editor.chain().focus().setFontFamily(font.value).run()\n },\n isActive: () => editor.isActive('textStyle', { fontFamily: font.value }) || false,\n disabled: !editor.can().setFontFamily(font.value),\n title: font.name,\n font: font.value,\n }))\n\n if (baseKitExt && baseKitExt.options.textStyle !== false) {\n items.unshift({\n action: () => editor.chain().focus().unsetFontFamily().run(),\n isActive: () => false,\n disabled: false,\n font: t('editor.fontFamily.default.tooltip'),\n title: t('editor.fontFamily.tooltip'),\n })\n }\n\n const disabled = items.filter((k: any) => k.disabled).length === items.length\n\n return {\n component: FontFamilyButton,\n componentProps: {\n tooltip: t('editor.fontFamily.tooltip'),\n disabled,\n items,\n editor,\n },\n }\n },\n }\n },\n})\n","import React, { Fragment, useMemo } from 'react'\n\nimport {\n ActionMenuButton,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuTrigger,\n} from '@/components'\nimport type { ButtonViewReturnComponentProps } from '@/types'\nimport { getShortcutKey } from '@/utils/plateform'\n\nexport interface Item {\n title: string\n icon?: any\n level?: number\n isActive: NonNullable<ButtonViewReturnComponentProps['isActive']>\n action?: ButtonViewReturnComponentProps['action']\n style?: React.CSSProperties\n shortcutKeys?: string[]\n disabled?: boolean\n divider?: boolean\n default?: boolean\n}\n\ninterface Props {\n editor: any\n disabled?: boolean\n color?: string\n shortcutKeys?: string[]\n maxHeight?: string | number\n tooltip?: string\n items?: Item[]\n}\n\nfunction HeadingButton(props: Props) {\n const active = useMemo(() => {\n const find: any = props?.items?.find((k: any) => k.isActive())\n\n if (find && !find.default) {\n return {\n ...find,\n }\n }\n const item: Item = {\n title: props.tooltip as any,\n level: 0,\n isActive: () => false,\n }\n return item\n }, [props])\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger disabled={props?.disabled} asChild>\n <ActionMenuButton\n title={active?.title}\n tooltip={props?.tooltip}\n disabled={props?.disabled}\n icon=\"MenuDown\"\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"richtext-w-full\">\n {props?.items?.map((item: any, index) => {\n return (\n <Fragment key={index}>\n <DropdownMenuCheckboxItem\n checked={active?.title === item.title}\n onClick={item.action}\n >\n <div className={`richtext-ml-1 richtext-h-full heading-${item.level}`}>{item.title}</div>\n {!!item?.shortcutKeys?.length && (\n <DropdownMenuShortcut className=\"richtext-pl-4\">\n {item?.shortcutKeys?.map((item: any) => getShortcutKey(item)).join(' ')}\n </DropdownMenuShortcut>\n )}\n </DropdownMenuCheckboxItem>\n {item.level === 0 && <DropdownMenuSeparator />}\n </Fragment>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport default HeadingButton\n","import type { Extension } from '@tiptap/core'\nimport type { HeadingOptions as TiptapHeadingOptions } from '@tiptap/extension-heading'\nimport { Heading as TiptapHeading } from '@tiptap/extension-heading'\n\nimport type { BaseKitOptions } from '../BaseKit'\nimport HeadingButton from '@/extensions/Heading/components/HeadingButton'\nimport type { GeneralOptions } from '@/types'\n\nexport interface HeadingOptions extends TiptapHeadingOptions, GeneralOptions<HeadingOptions> {}\n\nexport const Heading = TiptapHeading.extend<HeadingOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n levels: [1, 2, 3, 4, 5, 6],\n button({ editor, extension, t }) {\n const { extensions = [] } = editor.extensionManager ?? []\n const levels = extension.options?.levels || []\n const baseKitExt = extensions.find(\n k => k.name === 'base-kit',\n ) as Extension<BaseKitOptions>\n\n const items: any[] = levels.map(level => ({\n action: () => editor.commands.toggleHeading({ level }),\n isActive: () => editor.isActive('heading', { level }) || false,\n disabled: !editor.can().toggleHeading({ level }),\n title: t(`editor.heading.h${level}.tooltip`),\n level,\n shortcutKeys: ['alt', 'mod', `${level}`],\n }))\n\n if (baseKitExt && baseKitExt.options.paragraph !== false) {\n items.unshift({\n action: () => editor.commands.setParagraph(),\n isActive: () => editor.isActive('paragraph') || false,\n disabled: !editor.can().setParagraph(),\n level: 0,\n title: t('editor.paragraph.tooltip'),\n shortcutKeys: ['alt', 'mod', '0'],\n })\n }\n\n const disabled = items.filter((k: any) => k.disabled).length === items.length\n\n return {\n component: HeadingButton,\n componentProps: {\n tooltip: t('editor.heading.tooltip'),\n disabled,\n items,\n editor,\n },\n }\n },\n }\n },\n})\n","import React, { useMemo } from 'react'\n\nimport { ActionButton, IconComponent } from '@/components'\nimport { Popover, PopoverContent, PopoverTrigger, Toggle, Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui'\nimport type { ButtonViewReturnComponentProps } from '@/types'\nimport { getShortcutKey } from '@/utils/plateform'\n\ninterface IPropsTextAlignMenuButton {}\n\nexport interface Item {\n title: string\n icon?: any\n isActive: NonNullable<ButtonViewReturnComponentProps['isActive']>\n action?: ButtonViewReturnComponentProps['action']\n style?: React.CSSProperties\n shortcutKeys?: string[]\n disabled?: boolean\n divider?: boolean\n default?: boolean\n}\ninterface IPropsTextAlignMenuButton {\n editor: any\n disabled?: boolean\n color?: string\n maxHeight?: string | number\n icon?: any\n tooltip?: string\n items?: Item[]\n}\n\nfunction TextAlignMenuButton(props: IPropsTextAlignMenuButton) {\n const active = useMemo(() => {\n const find: any = props?.items?.find((k: any) => k.isActive())\n if (find && !find.default) {\n return {\n ...find,\n icon: find.icon ? find.icon : props.icon,\n }\n }\n const item: Item = {\n title: props?.tooltip as any,\n icon: props.icon,\n isActive: () => false,\n }\n\n return item\n }, [props])\n\n return (\n <Popover>\n <PopoverTrigger disabled={props?.disabled} asChild>\n <ActionButton\n customClass=\"!richtext-w-12 richtext-h-12\"\n icon={props?.icon}\n tooltip={props?.tooltip}\n disabled={props?.disabled}\n >\n <IconComponent className=\"richtext-w-3 richtext-h-3 richtext-ml-1 richtext-text-zinc-500\" name=\"MenuDown\" />\n </ActionButton>\n </PopoverTrigger>\n\n <PopoverContent\n className=\"richtext-min-w-4 richtext-w-full !richtext-p-[4px] richtext-flex richtext-flex-row richtext-gap-1\"\n align=\"start\"\n side=\"bottom\"\n >\n {props?.items?.map((item, index) => {\n return (\n <Tooltip key={`text-align-${index}`}>\n <TooltipTrigger asChild>\n <Toggle\n size=\"sm\"\n onClick={item?.action}\n className=\"richtext-p-1 richtext-w-7 richtext-h-7\"\n pressed={active.title === item.title}\n data-state={active.title === item.title ? 'on' : 'off'}\n >\n {item?.icon && <IconComponent name={item.icon} />}\n </Toggle>\n </TooltipTrigger>\n <TooltipContent className=\"richtext-flex richtext-flex-col richtext-items-center\">\n <span>{item.title}</span>\n {!!item.shortcutKeys?.length && (\n <span>{item.shortcutKeys?.map(item => getShortcutKey(item)).join(' ')}</span>\n )}\n </TooltipContent>\n </Tooltip>\n )\n })}\n </PopoverContent>\n </Popover>\n )\n}\n\nexport default TextAlignMenuButton\n","import type { Editor, Extension } from '@tiptap/core'\nimport type { TextAlignOptions as TiptapTextAlignOptions } from '@tiptap/extension-text-align'\nimport TiptapTextAlign from '@tiptap/extension-text-align'\n\nimport TextAlignMenuButton from '@/extensions/TextAlign/components/TextAlignMenuButton'\nimport type { GeneralOptions } from '@/types'\n\ntype Alignments = 'left' | 'center' | 'right' | 'justify'\n/**\n * Represents the interface for text align options, extending TiptapTextAlignOptions and GeneralOptions.\n */\nexport interface TextAlignOptions extends TiptapTextAlignOptions, GeneralOptions<TextAlignOptions> {\n /**\n * List of available alignment options\n *\n * @default ['left', 'center', 'right', 'justify']\n */\n alignments: Alignments[]\n}\nexport const TextAlign = TiptapTextAlign.extend<TextAlignOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n types: ['heading', 'paragraph', 'list_item', 'title'],\n button({\n editor,\n extension,\n t,\n }: {\n editor: Editor\n extension: Extension\n t: (...args: any[]) => string\n }) {\n const alignments = (extension.options?.alignments as Alignments[]) || []\n const shortcutKeysMap = {\n left: ['mod', 'Shift', 'L'],\n center: ['mod', 'Shift', 'E'],\n right: ['mod', 'Shift', 'R'],\n justify: ['mod', 'Shift', 'J'],\n }\n const iconMap = {\n left: 'AlignLeft',\n center: 'AlignCenter',\n right: 'AlignRight',\n justify: 'AlignJustify',\n }\n const items = alignments.map(k => ({\n title: t(`editor.textalign.${k}.tooltip`),\n icon: iconMap[k],\n shortcutKeys: shortcutKeysMap[k],\n isActive: () => editor.isActive({ textAlign: k }) || false,\n action: () => editor.commands?.setTextAlign?.(k),\n disabled: !editor?.can?.()?.setTextAlign?.(k),\n }))\n const disabled = items.filter(k => k.disabled).length === items.length\n return {\n component: TextAlignMenuButton,\n componentProps: {\n icon: 'AlignJustify',\n tooltip: t('editor.textalign.tooltip'),\n disabled,\n items,\n },\n }\n },\n }\n },\n})\n","import React, { useMemo } from 'react'\n\nimport {\n ActionMenuButton,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuTrigger,\n} from '@/components'\nimport { useLocale } from '@/locales'\nimport type { ButtonViewReturnComponentProps } from '@/types'\n\nexport interface Item {\n title: string\n isActive: NonNullable<ButtonViewReturnComponentProps['isActive']>\n action?: ButtonViewReturnComponentProps['action']\n style?: React.CSSProperties\n disabled?: boolean\n divider?: boolean\n default?: boolean\n}\n\ninterface IPropsFontSizeMenuButton {\n editor: any\n disabled?: boolean\n color?: string\n shortcutKeys?: string[]\n maxHeight?: string | number\n tooltip?: string\n items?: Item[]\n}\n\nfunction FontSizeMenuButton(props: IPropsFontSizeMenuButton) {\n const { t } = useLocale()\n\n const active = useMemo(() => {\n const find: any = (props.items || []).find((k: any) => k.isActive())\n if (find) {\n return find\n }\n const item: Item = {\n title: t('editor.fontSize.default.tooltip'),\n isActive: () => false,\n }\n return item\n }, [props])\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger disabled={props?.disabled} asChild>\n <ActionMenuButton\n title={active?.title}\n tooltip={`${props?.tooltip}`}\n disabled={props?.disabled}\n icon=\"MenuDown\"\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"richtext-w-32 richtext-overflow-y-auto richtext-max-h-96\">\n {props?.items?.map((item: any, index) => {\n return (\n <DropdownMenuCheckboxItem\n key={index}\n checked={active.title === item.title}\n onClick={item.action}\n >\n <div className=\"richtext-h-full richtext-ml-1\">{item.title}</div>\n </DropdownMenuCheckboxItem>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport default FontSizeMenuButton\n","import { Extension } from '@tiptap/core'\n\nimport FontSizeMenuButton from './components/FontSizeMenuButton'\nimport { ensureNameValueOptions } from '@/utils/utils'\nimport { DEFAULT_FONT_SIZE_LIST, DEFAULT_FONT_SIZE_VALUE } from '@/constants'\nimport type { GeneralOptions, NameValueOption } from '@/types'\n\n/**\n * Represents the interface for font size options, extending GeneralOptions.\n */\nexport interface FontSizeOptions extends GeneralOptions<FontSizeOptions> {\n types: string[]\n /**\n * List of available font size values\n *\n * @default DEFAULT_FONT_SIZE_LIST\n */\n fontSizes: (string | NameValueOption)[]\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n fontSize: {\n /**\n * Set the text font size. ex: \"12px\", \"2em\", or \"small\". Must be a valid\n * CSS font-size\n * (https://developer.mozilla.org/en-US/docs/Web/CSS/font-size).\n */\n setFontSize: (fontSize: string) => ReturnType\n /**\n * Unset the font size\n */\n unsetFontSize: () => ReturnType\n }\n }\n}\n\nexport const FontSize = Extension.create<FontSizeOptions>({\n name: 'fontSize',\n addOptions() {\n return {\n ...this.parent?.(),\n types: ['textStyle'],\n fontSizes: [...DEFAULT_FONT_SIZE_LIST],\n button({ editor, extension, t }) {\n const fontSizes = ensureNameValueOptions(extension.options?.fontSizes || DEFAULT_FONT_SIZE_VALUE)\n const defaultFontSize = ensureNameValueOptions([DEFAULT_FONT_SIZE_VALUE])[0]\n const items = fontSizes.map(k => ({\n title: k.value === defaultFontSize.value ? t('editor.fontSize.default.tooltip') : String(k.name),\n isActive: () => {\n const { fontSize } = editor.getAttributes('textStyle')\n const isDefault = k.value === defaultFontSize.value\n const notFontSize = fontSize === undefined\n if (isDefault && notFontSize) {\n return true\n }\n return editor.isActive({ fontSize: String(k.value) }) || false\n },\n action: () => {\n if (k.value === defaultFontSize.value) {\n editor.commands.unsetFontSize()\n return\n }\n editor.commands.setFontSize(String(k.value))\n },\n disabled: !editor.can().setFontSize(String(k.value)),\n divider: k.value === defaultFontSize.value || false,\n default: k.value === defaultFontSize.value || false,\n }))\n const disabled = items.filter(k => k.disabled).length === items.length\n return {\n component: FontSizeMenuButton,\n componentProps: {\n editor,\n tooltip: t('editor.fontSize.tooltip'),\n disabled,\n items,\n maxHeight: 280,\n },\n }\n },\n }\n },\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n fontSize: {\n default: null,\n parseHTML: element => element.style.fontSize.replaceAll(/[\"']+/g, ''),\n renderHTML: (attributes) => {\n if (!attributes.fontSize) {\n return {}\n }\n return {\n style: `font-size: ${attributes.fontSize}`,\n }\n },\n },\n },\n },\n ]\n },\n addCommands() {\n return {\n setFontSize:\n fontSize =>\n ({ chain }) => {\n return chain().setMark('textStyle', { fontSize }).run()\n },\n unsetFontSize:\n () =>\n ({ chain }) => {\n return chain().setMark('textStyle', { fontSize: null }).removeEmptyTextStyle().run()\n },\n }\n },\n})\n","import { useCallback, useState } from 'react'\n\nimport type { Editor } from '@tiptap/react'\nimport { debounce } from 'lodash-unified'\n\nimport { ActionButton, Button, ColorPicker } from '@/components'\nimport { IconComponent } from '@/components/icons'\nimport type { ButtonViewReturnComponentProps } from '@/types'\n\ninterface ColorActionButtonProps {\n editor: Editor\n colors?: string[]\n defaultColor?: string\n icon?: React.ReactNode\n tooltip?: string\n disabled?: boolean\n action?: ButtonViewReturnComponentProps['action']\n isActive?: ButtonViewReturnComponentProps['isActive']\n}\n\ninterface IconCProps {\n fill?: string\n}\n\nfunction IconC({ fill }: IconCProps) {\n return (\n <svg\n width=\"18px\"\n height=\"18px\"\n viewBox=\"0 0 240 240\"\n version=\"1.1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g stroke=\"none\" strokeWidth={1} fill=\"none\" fillRule=\"evenodd\">\n <g transform=\"translate(0.000000, 0.500000)\">\n <g transform=\"translate(39.000000, 17.353553)\">\n <path\n d=\"M11,201.146447 L167,201.146447 C173.075132,201.146447 178,206.071314 178,212.146447 C178,218.221579 173.075132,223.146447 167,223.146447 L11,223.146447 C4.92486775,223.146447 7.43989126e-16,218.221579 0,212.146447 C-7.43989126e-16,206.071314 4.92486775,201.146447 11,201.146447 Z\"\n id=\"矩形\"\n fill={fill || '#DF2A3F'}\n fillRule=\"evenodd\"\n />\n <path\n d=\"M72.3425855,16.8295583 C75.799482,7.50883712 86.1577877,2.75526801 95.4785089,6.21216449 C100.284516,7.99463061 104.096358,11.7387855 105.968745,16.4968188 L106.112518,16.8745422 L159.385152,161.694068 C161.291848,166.877345 158.635655,172.624903 153.452378,174.531599 C148.358469,176.405421 142.719567,173.872338 140.716873,168.864661 L140.614848,168.598825 L89.211,28.86 L37.3759214,168.623816 C35.4885354,173.712715 29.8981043,176.351047 24.7909589,174.617647 L24.5226307,174.522368 C19.4337312,172.634982 16.7953993,167.044551 18.5287999,161.937406 L18.6240786,161.669077 L72.3425855,16.8295583 Z\"\n id=\"路径-21\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n />\n <path\n d=\"M121,103.146447 C126.522847,103.146447 131,107.623599 131,113.146447 C131,118.575687 126.673329,122.994378 121.279905,123.142605 L121,123.146447 L55,123.146447 C49.4771525,123.146447 45,118.669294 45,113.146447 C45,107.717207 49.3266708,103.298515 54.7200952,103.150288 L55,103.146447 L121,103.146447 Z\"\n id=\"路径-22\"\n fill=\"currentColor\"\n fillRule=\"nonzero\"\n />\n </g>\n </g>\n </g>\n </svg>\n )\n}\n\nfunction ColorActionButton(props: ColorActionButtonProps) {\n const [selectedColor, setSelectedColor] = useState<string | undefined>(undefined)\n\n function onChange(color: string | undefined) {\n props.action?.(color)\n }\n\n function toggleColor() {\n props.action?.(selectedColor)\n }\n\n const setSelectedColorDebounce = useCallback(\n debounce((color: string | undefined) => {\n setSelectedColor(color)\n }, 350),\n [],\n )\n\n return (\n <div className=\"richtext-flex richtext-items-center richtext-h-[32px]\">\n <ActionButton tooltip={props?.tooltip} disabled={props?.disabled} action={toggleColor}>\n <span className=\"richtext-flex richtext-items-center richtext-justify-center richtext-text-sm\">\n <IconC fill={selectedColor} />\n </span>\n </ActionButton>\n\n <ColorPicker\n selectedColor={selectedColor}\n setSelectedColor={setSelectedColorDebounce}\n onChange={onChange}\n disabled={props?.disabled}\n colors={props?.colors}\n defaultColor={props?.defaultColor}\n >\n <Button variant=\"ghost\" size=\"icon\" className=\"r!ichtext-h-[32px] !richtext-w-3\" disabled={props?.disabled}>\n <IconComponent className=\"!richtext-w-3 !richtext-h-3 richtext-text-zinc-500\" name=\"MenuDown\" />\n </Button>\n </ColorPicker>\n </div>\n )\n}\n\nexport default ColorActionButton\n","import TiptapColor from '@tiptap/extension-color'\nimport type { ColorOptions as TiptapColorOptions } from '@tiptap/extension-color'\n\nimport ColorActionButton from '@/extensions/Color/components/ColorActionButton'\nimport type { GeneralOptions } from '@/types'\n\nexport interface ColorOptions extends TiptapColorOptions, GeneralOptions<ColorOptions> {\n /**\n * An array of color options to display in the color picker\n */\n colors?: string[]\n\n /**\n * The default color to use when no color is selected\n */\n defaultColor?: string\n}\n\nexport const Color = TiptapColor.extend<ColorOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n button({ editor, t, extension }) {\n return {\n component: ColorActionButton,\n componentProps: {\n colors: extension.options.colors,\n defaultColor: extension.options.defaultColor,\n action: (color?: unknown) => {\n if (color === undefined) {\n editor.chain().focus().unsetColor().run()\n }\n if (typeof color === 'string') {\n editor.chain().focus().setColor(color).run()\n }\n },\n isActive: () => {\n const { color } = editor.getAttributes('textStyle')\n if (!color) {\n return false\n }\n return editor.isActive({ color }) || false\n },\n editor,\n disabled: !editor.can().setColor(''),\n tooltip: t('editor.color.tooltip'),\n },\n }\n },\n }\n },\n})\n","import type { HighlightOptions as TiptapHighlightOptions } from '@tiptap/extension-highlight'\nimport { Highlight as TiptapHighlight } from '@tiptap/extension-highlight'\n\nimport HighlightActionButton from './components/HighlightActionButton'\nimport type { GeneralOptions } from '@/types'\n\nexport interface HighlightOptions\n extends TiptapHighlightOptions,\n GeneralOptions<HighlightOptions> {}\n\nexport const Highlight = TiptapHighlight.extend<HighlightOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n multicolor: true,\n button: ({ editor, t }) => ({\n component: HighlightActionButton,\n componentProps: {\n action: (color?: unknown) => {\n if (typeof color === 'string') {\n editor.chain().focus().setHighlight({ color }).run()\n }\n if (color === undefined) {\n editor.chain().focus().unsetHighlight().run()\n }\n },\n editor,\n isActive: () => editor.isActive('highlight') || false,\n disabled: !editor.can().setHighlight(),\n shortcutKeys: ['⇧', 'mod', 'H'],\n tooltip: t('editor.highlight.tooltip'),\n },\n }),\n }\n },\n})\n","import type { BulletListOptions as TiptapBulletListOptions } from '@tiptap/extension-bullet-list'\nimport { BulletList as TiptapBulletList } from '@tiptap/extension-bullet-list'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface BulletListOptions\n extends TiptapBulletListOptions,\n GeneralOptions<BulletListOptions> {}\n\nexport const BulletList = TiptapBulletList.extend<BulletListOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, t }) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleBulletList(),\n isActive: () => editor.isActive('bulletList') || false,\n disabled: false,\n shortcutKeys: ['shift', 'mod', '8'],\n icon: 'List',\n tooltip: t('editor.bulletlist.tooltip'),\n },\n }),\n }\n },\n})\n","import { Node } from '@tiptap/core'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface ClearOptions extends GeneralOptions<ClearOptions> {}\n\nexport const Clear = Node.create<ClearOptions>({\n name: 'clear',\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, t }) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.chain().focus().clearNodes().unsetAllMarks().run(),\n disabled: !editor.can().chain().focus().clearNodes().unsetAllMarks().run(),\n icon: 'Eraser',\n tooltip: t('editor.clear.tooltip'),\n },\n }),\n }\n },\n})\n","import type { OrderedListOptions as TiptapOrderedListOptions } from '@tiptap/extension-ordered-list'\nimport { OrderedList as TiptapOrderedList } from '@tiptap/extension-ordered-list'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface OrderedListOptions\n extends TiptapOrderedListOptions,\n GeneralOptions<OrderedListOptions> {}\n\nexport const OrderedList = TiptapOrderedList.extend<OrderedListOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, t }) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleOrderedList(),\n isActive: () => editor.isActive('orderedList') || false,\n disabled: false,\n icon: 'ListOrdered',\n shortcutKeys: ['mod', 'shift', '7'],\n tooltip: t('editor.orderedlist.tooltip'),\n },\n }),\n }\n },\n})\n","import type { TaskItemOptions } from '@tiptap/extension-task-item'\nimport { TaskItem } from '@tiptap/extension-task-item'\nimport type { TaskListOptions as TiptapTaskListOptions } from '@tiptap/extension-task-list'\nimport { TaskList as TiptapTaskList } from '@tiptap/extension-task-list'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\n/**\n * Represents the interface for task list options, extending TiptapTaskListOptions and GeneralOptions.\n */\nexport interface TaskListOptions extends TiptapTaskListOptions, GeneralOptions<TaskListOptions> {\n /** options for task items */\n taskItem: Partial<TaskItemOptions>\n}\n\nexport const TaskList = TiptapTaskList.extend<TaskListOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n HTMLAttributes: {\n class: 'task-list',\n },\n taskItem: {\n HTMLAttributes: {\n class: 'task-list-item',\n },\n },\n button: ({ editor, t }) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleTaskList(),\n isActive: () => editor.isActive('taskList') || false,\n disabled: false,\n icon: 'ListTodo',\n shortcutKeys: ['shift', 'mod', '9'],\n tooltip: t('editor.tasklist.tooltip'),\n },\n }),\n }\n },\n\n addExtensions() {\n return [TaskItem.configure(this.options.taskItem)]\n },\n})\n","import type { BlockquoteOptions as TiptapBlockquoteOptions } from '@tiptap/extension-blockquote'\nimport { Blockquote as TiptapBlockquote } from '@tiptap/extension-blockquote'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface BlockquoteOptions\n extends TiptapBlockquoteOptions,\n GeneralOptions<BlockquoteOptions> {}\n\nexport const Blockquote = TiptapBlockquote.extend<BlockquoteOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n HTMLAttributes: {\n class: 'blockquote',\n },\n button: ({ editor, t }: any) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleBlockquote(),\n isActive: () => editor.isActive('blockquote') || false,\n disabled: !editor.can().toggleBlockquote(),\n icon: 'TextQuote',\n shortcutKeys: ['shift', 'mod', 'B'],\n tooltip: t('editor.blockquote.tooltip'),\n },\n }),\n }\n },\n})\n","import { ActionButton, IconComponent, Popover, PopoverContent, PopoverTrigger } from '@/components'\nimport LinkEditBlock from '@/extensions/Link/components/LinkEditBlock'\nimport type { ButtonViewReturnComponentProps } from '@/types'\n\ninterface IPropsLinkEditPopover {\n editor: any\n icon?: any\n title?: string\n tooltip?: string\n disabled?: boolean\n shortcutKeys?: string[]\n isActive?: ButtonViewReturnComponentProps['isActive']\n action?: ButtonViewReturnComponentProps['action']\n}\n\nfunction LinkEditPopover(props: IPropsLinkEditPopover) {\n function onSetLink(link: string, text?: string, openInNewTab?: boolean) {\n if (props.action) {\n props.action({ link, text, openInNewTab })\n }\n }\n\n return (\n <Popover>\n <PopoverTrigger disabled={props?.disabled} asChild>\n <ActionButton\n tooltip={props?.tooltip}\n isActive={props?.isActive}\n disabled={props?.disabled}\n >\n <IconComponent name={props?.icon} />\n </ActionButton>\n </PopoverTrigger>\n <PopoverContent hideWhenDetached className=\"richtext-w-full\" align=\"start\" side=\"bottom\">\n <LinkEditBlock editor={props.editor} onSetLink={onSetLink} />\n </PopoverContent>\n </Popover>\n )\n}\n\nexport default LinkEditPopover\n","import { getMarkRange, mergeAttributes } from '@tiptap/core'\nimport type { LinkOptions as TiptapLinkOptions } from '@tiptap/extension-link'\nimport { Link as TiptapLink } from '@tiptap/extension-link'\nimport { Plugin, TextSelection } from '@tiptap/pm/state'\nimport type { EditorView } from '@tiptap/pm/view'\n\nimport LinkEditPopover from '@/extensions/Link/components/LinkEditPopover'\nimport type { GeneralOptions } from '@/types'\n\nexport interface LinkOptions extends TiptapLinkOptions, GeneralOptions<LinkOptions> {}\n\nexport const Link = TiptapLink.extend<LinkOptions>({\n inclusive: false,\n parseHTML() {\n return [\n {\n tag: 'a[href]:not([data-type=\"button\"]):not([href *= \"javascript:\" i])',\n },\n ]\n },\n renderHTML({ HTMLAttributes }) {\n return [\n 'a',\n mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {\n class: 'link',\n }),\n 0,\n ]\n },\n\n addOptions() {\n return {\n ...this.parent?.(),\n openOnClick: true,\n button: ({ editor, t }) => {\n return {\n component: LinkEditPopover,\n componentProps: {\n editor,\n action: (value) => {\n const { link, text, openInNewTab } = value as any\n editor\n .chain()\n .extendMarkRange('link')\n .insertContent({\n type: 'text',\n text,\n marks: [\n {\n type: 'link',\n attrs: {\n href: link,\n target: openInNewTab ? '_blank' : '',\n },\n },\n ],\n })\n .setLink({ href: link })\n .focus()\n .run()\n },\n id: 'linkk',\n isActive: () => editor.isActive('link') || false,\n disabled: !editor.can().setLink({ href: '' }),\n icon: 'Link',\n tooltip: t('editor.link.tooltip'),\n },\n }\n },\n }\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n props: {\n handleClick: (view: EditorView, pos: number) => {\n const { schema, doc, tr } = view.state\n const range = getMarkRange(doc.resolve(pos), schema.marks.link)\n if (!range) {\n return false\n }\n const $start = doc.resolve(range.from)\n const $end = doc.resolve(range.to)\n const transaction = tr.setSelection(new TextSelection($start, $end))\n view.dispatch(transaction)\n },\n },\n }),\n ]\n },\n})\n","import { mergeAttributes } from '@tiptap/core'\nimport type { HorizontalRuleOptions as TiptapHorizontalRuleOptions } from '@tiptap/extension-horizontal-rule'\nimport { HorizontalRule as TiptapHorizontalRule } from '@tiptap/extension-horizontal-rule'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\nexport interface HorizontalRuleOptions\n extends TiptapHorizontalRuleOptions,\n GeneralOptions<HorizontalRuleOptions> {}\n\nexport const HorizontalRule = TiptapHorizontalRule.extend<HorizontalRuleOptions>({\n renderHTML() {\n return [\n 'div',\n mergeAttributes(this.options.HTMLAttributes, {\n 'data-type': this.name,\n }),\n ['hr'],\n ]\n },\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, t }) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.setHorizontalRule(),\n disabled: !editor.can().setHorizontalRule(),\n icon: 'Minus',\n shortcutKeys: ['mod', 'alt', 'S'],\n tooltip: t('editor.horizontalrule.tooltip'),\n },\n }),\n }\n },\n addKeyboardShortcuts() {\n return {\n 'Mod-Alt-s': () => this.editor.commands.setHorizontalRule(),\n }\n },\n})\n","import React from 'react'\n\nimport type { TooltipContentProps } from '@radix-ui/react-tooltip'\n\nimport { Toggle, Tooltip, TooltipContent, TooltipTrigger, icons } from '@/components'\nimport type { ButtonViewReturnComponentProps } from '@/types'\nimport { getShortcutKeys } from '@/utils/plateform'\n\ninterface IPropsHistoryActionButton {\n icon?: string\n title?: string\n tooltip?: string\n disabled?: boolean\n shortcutKeys?: string[]\n customClass?: string\n loading?: boolean\n tooltipOptions?: TooltipContentProps\n color?: string\n action?: ButtonViewReturnComponentProps['action']\n isActive?: ButtonViewReturnComponentProps['isActive']\n children?: React.ReactNode\n}\n\nfunction HistoryActionButton(props?: Partial<IPropsHistoryActionButton>) {\n const {\n icon = undefined,\n // title = undefined,\n tooltip = undefined,\n // disabled = false,\n customClass = '',\n // color = undefined,\n // loading = false,\n // shortcutKeys = undefined,\n tooltipOptions = {},\n action = undefined,\n isActive = undefined,\n children,\n } = props as any\n\n const Icon = icons[icon as string]\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Toggle\n size=\"sm\"\n className={`richtext-w-[32px] richtext-h-[32px] ${customClass}`}\n disabled={isActive?.()}\n onClick={action}\n // data-state={isActive?.() ? 'on' : 'off'}\n >\n {Icon && <Icon className=\"richtext-w-4 richtext-h-4\" />}\n {children && <>{children}</>}\n </Toggle>\n </TooltipTrigger>\n {tooltip && (\n <TooltipContent {...tooltipOptions}>\n <div className=\"richtext-flex richtext-flex-col richtext-items-center richtext-text-center richtext-max-w-24\">\n <div>{tooltip}</div>\n {!!props?.shortcutKeys?.length && <span>{getShortcutKeys(props?.shortcutKeys)}</span>}\n </div>\n </TooltipContent>\n )}\n </Tooltip>\n )\n}\n\nexport default HistoryActionButton\n","import type { HistoryOptions as TiptapHistoryOptions } from '@tiptap/extension-history'\nimport { History as TiptapHistory } from '@tiptap/extension-history'\n\nimport HistoryActionButton from '@/extensions/History/components/HistoryActionButton'\nimport type { GeneralOptions } from '@/types'\n\nexport interface HistoryOptions extends TiptapHistoryOptions, GeneralOptions<HistoryOptions> {}\n\nconst historys: ['undo', 'redo'] = ['undo', 'redo']\n\nexport const History = TiptapHistory.extend<HistoryOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n depth: 100,\n newGroupDelay: 500,\n button: ({ editor, t }: any) => {\n return historys.map(item => ({\n component: HistoryActionButton,\n componentProps: {\n action: () => {\n if (item === 'undo') {\n editor.chain().focus().undo().run()\n }\n if (item === 'redo') {\n editor.chain().focus().redo().run()\n }\n },\n shortcutKeys: item === 'undo' ? ['mod', 'Z'] : ['shift', 'mod', 'Z'],\n disabled: item === 'undo' ? !editor.can().undo() : !editor.can().redo(),\n isActive: () => (item === 'undo' ? !editor.can().undo() : !editor.can().redo()),\n icon: item === 'undo' ? 'Undo2' : 'Redo2',\n tooltip: t(`editor.${item}.tooltip`),\n },\n }))\n },\n }\n },\n})\n","import { Document as TiptapDocument } from '@tiptap/extension-document'\n\nexport const Document = TiptapDocument.extend({\n content: '(block|columns)+',\n // echo editor is a block editor\n})\n\nexport default Document\n","import { findParentNode } from '@tiptap/core'\nimport { type EditorState, TextSelection } from '@tiptap/pm/state'\nimport { Node } from '@tiptap/pm/model'\nimport { Column, MultiColumn } from '@/extensions/MultiColumn'\n\nexport function createColumn(colType: any, index: any, colContent = null) {\n if (colContent) {\n return colType.createChecked({ index }, colContent)\n }\n\n return colType.createAndFill({ index })\n}\n\nexport function getColumnsNodeTypes(schema: any) {\n if (schema.cached.columnsNodeTypes) {\n return schema.cached.columnsNodeTypes\n }\n\n const roles = {\n columns: schema.nodes.columns,\n column: schema.nodes.column,\n }\n\n schema.cached.columnsNodeTypes = roles\n\n return roles\n}\n\nexport function createColumns(schema: any, colsCount: any, colContent = null) {\n const types = getColumnsNodeTypes(schema)\n const cols = []\n\n for (let index = 0; index < colsCount; index += 1) {\n const col = createColumn(types.column, index, colContent)\n\n if (col) {\n // @ts-ignore\n cols.push(col)\n }\n }\n\n return types.columns.createChecked({ cols: colsCount }, cols)\n}\n\nexport function addOrDeleteCol({\n state,\n dispatch,\n type,\n}: {\n state: EditorState\n dispatch: any\n type: 'addBefore' | 'addAfter' | 'delete'\n}) {\n const maybeColumns = findParentNode((node: Node) => node.type.name === MultiColumn.name)(state.selection)\n const maybeColumn = findParentNode((node: Node) => node.type.name === Column.name)(state.selection)\n\n if (dispatch && maybeColumns && maybeColumn) {\n const cols = maybeColumns.node\n const colIndex = maybeColumn.node.attrs.index\n const colsJSON = cols.toJSON()\n\n let nextIndex = colIndex\n\n if (type === 'delete') {\n nextIndex = colIndex - 1\n colsJSON.content.splice(colIndex, 1)\n }\n else {\n nextIndex = type === 'addBefore' ? colIndex : colIndex + 1\n colsJSON.content.splice(nextIndex, 0, {\n type: 'column',\n attrs: {\n index: colIndex,\n },\n content: [\n {\n type: 'paragraph',\n },\n ],\n })\n }\n\n colsJSON.attrs.cols = colsJSON.content.length\n\n colsJSON.content.forEach((colJSON: any, index: any) => {\n colJSON.attrs.index = index\n })\n\n const nextCols = Node.fromJSON(state.schema, colsJSON)\n\n let nextSelectPos = maybeColumns.pos\n nextCols.content.forEach((col, pos, index) => {\n if (index < nextIndex) {\n nextSelectPos += col.nodeSize\n }\n })\n\n const tr = state.tr.setTime(Date.now())\n\n tr.replaceWith(maybeColumns.pos, maybeColumns.pos + maybeColumns.node.nodeSize, nextCols).setSelection(\n TextSelection.near(tr.doc.resolve(nextSelectPos)),\n )\n\n dispatch(tr)\n }\n\n return true\n}\n\nexport function gotoCol({ state, dispatch, type }: { state: EditorState, dispatch: any, type: 'before' | 'after' }) {\n const maybeColumns = findParentNode((node: Node) => node.type.name === MultiColumn.name)(state.selection)\n const maybeColumn = findParentNode((node: Node) => node.type.name === Column.name)(state.selection)\n\n if (dispatch && maybeColumns && maybeColumn) {\n const cols = maybeColumns.node\n const colIndex = maybeColumn.node.attrs.index\n\n let nextIndex = 0\n\n if (type === 'before') {\n nextIndex = (colIndex - 1 + cols.attrs.cols) % cols.attrs.cols\n }\n else {\n nextIndex = (colIndex + 1) % cols.attrs.cols\n }\n\n let nextSelectPos = maybeColumns.pos\n cols.content.forEach((col, pos, index) => {\n if (index < nextIndex) {\n nextSelectPos += col.nodeSize\n }\n })\n\n const tr = state.tr.setTime(Date.now())\n\n tr.setSelection(TextSelection.near(tr.doc.resolve(nextSelectPos)))\n dispatch(tr)\n return true\n }\n\n return false\n}\n","import { Node, mergeAttributes } from '@tiptap/core'\n\nimport { TextSelection } from '@tiptap/pm/state'\nimport { addOrDeleteCol, createColumns, gotoCol } from '@/utils/columns'\n\nexport const EXTENSION_PRIORITY_HIGHEST = 200\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n columns: {\n insertColumns: (attrs?: { cols: number }) => ReturnType\n addColBefore: () => ReturnType\n addColAfter: () => ReturnType\n deleteCol: () => ReturnType\n }\n }\n}\n\nexport const MultiColumn = Node.create({\n name: 'columns',\n group: 'block',\n defining: true,\n isolating: true,\n allowGapCursor: false,\n content: 'column{1,}',\n priority: EXTENSION_PRIORITY_HIGHEST,\n\n addOptions() {\n return {\n HTMLAttributes: {\n class: 'columns',\n },\n }\n },\n\n addAttributes() {\n return {\n cols: {\n default: 2,\n parseHTML: element => element.getAttribute('cols'),\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[class=grid]',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n },\n\n addCommands() {\n return {\n insertColumns:\n attrs =>\n ({ tr, dispatch, editor }) => {\n const node = createColumns(editor.schema, (attrs && attrs.cols) || 3)\n\n if (dispatch) {\n const offset = tr.selection.anchor + 1\n\n tr.replaceSelectionWith(node)\n .scrollIntoView()\n .setSelection(TextSelection.near(tr.doc.resolve(offset)))\n }\n\n return true\n },\n addColBefore:\n () =>\n ({ dispatch, state }) => {\n return addOrDeleteCol({ dispatch, state, type: 'addBefore' })\n },\n addColAfter:\n () =>\n ({ dispatch, state }) => {\n return addOrDeleteCol({ dispatch, state, type: 'addAfter' })\n },\n deleteCol:\n () =>\n ({ dispatch, state }) => {\n return addOrDeleteCol({ dispatch, state, type: 'delete' })\n },\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Mod-Alt-G': () => this.editor.commands.insertColumns(),\n 'Tab': () => {\n return gotoCol({\n state: this.editor.state,\n dispatch: this.editor.view.dispatch,\n type: 'after',\n })\n },\n 'Shift-Tab': () => {\n return gotoCol({\n state: this.editor.state,\n dispatch: this.editor.view.dispatch,\n type: 'before',\n })\n },\n }\n },\n})\n","import { Node, mergeAttributes } from '@tiptap/core'\n\nexport const Column = Node.create({\n name: 'column',\n content: 'block+',\n isolating: true,\n\n addOptions() {\n return {\n HTMLAttributes: {\n class: 'column',\n },\n }\n },\n\n addAttributes() {\n return {\n index: {\n default: 0,\n parseHTML: element => element.getAttribute('index'),\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[class=column]',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['div', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n },\n})\n","import { Extension } from '@tiptap/core'\n\nimport { ActionButton } from '@/components'\n\nexport const ColumnActionButton = Extension.create<any>({\n name: 'columnActionButton',\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, t }: any) => ({\n component: ActionButton,\n componentProps: {\n action: () => {\n editor.chain().focus().insertColumns({ cols: 2 }).run()\n },\n icon: 'Columns',\n tooltip: t('editor.columns.tooltip'),\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 const Selection = Extension.create({\n name: 'selection',\n addProseMirrorPlugins() {\n const { editor } = this\n return [\n new Plugin({\n key: new PluginKey('selection'),\n props: {\n decorations(state) {\n if (state.selection.empty) {\n return null\n }\n if (editor.isFocused === true) {\n return null\n }\n return DecorationSet.create(state.doc, [\n Decoration.inline(state.selection.from, state.selection.to, {\n class: 'selection',\n }),\n ])\n },\n },\n }),\n ]\n },\n})\n\nexport default Selection\n","import React, { useMemo } from 'react'\n\nimport { ChevronDown } from 'lucide-react'\n\nimport { Button, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuTrigger, icons } from '@/components'\nimport { useLocale } from '@/locales'\n\ninterface IPropsTextDropdown {\n editor: any\n disabled?: boolean\n color?: string\n maxHeight?: string | number\n icon?: any\n tooltip?: string\n}\n\nfunction TextDropdown(props: IPropsTextDropdown) {\n const { t } = useLocale()\n\n const menus = useMemo(() => {\n return [\n {\n name: 'paragraph',\n label: t('editor.paragraph.tooltip'),\n iconName: 'Heading1',\n isActive: () =>\n props.editor.isActive('paragraph')\n && !props.editor.isActive('orderedList')\n && !props.editor.isActive('bulletList')\n && !props.editor.isActive('taskList'),\n action: () => props.editor.chain().focus().clearNodes().run(),\n },\n {\n name: 'heading1',\n label: t('editor.heading.h1.tooltip'),\n isActive: () => props.editor.isActive('heading', { level: 1 }),\n iconName: 'Heading1',\n action: () => props.editor.chain().focus().clearNodes().toggleHeading({ level: 1 }).run(),\n },\n {\n name: 'heading2',\n label: t('editor.heading.h2.tooltip'),\n isActive: () => props.editor.isActive('heading', { level: 2 }),\n iconName: 'Heading2',\n action: () => props.editor.chain().focus().clearNodes().toggleHeading({ level: 2 }).run(),\n },\n {\n name: 'heading3',\n label: t('editor.heading.h3.tooltip'),\n isActive: () => props.editor.isActive('heading', { level: 3 }),\n iconName: 'Heading3',\n action: () => props.editor.chain().focus().clearNodes().toggleHeading({ level: 3 }).run(),\n },\n {\n name: 'bulletList',\n label: t('editor.bulletlist.tooltip'),\n isActive: () => props.editor.isActive('bulletList'),\n iconName: 'List',\n action: () => props.editor.chain().focus().clearNodes().toggleBulletList().run(),\n },\n {\n name: 'numberedList',\n label: t('editor.orderedlist.tooltip'),\n isActive: () => props.editor.isActive('orderedList'),\n iconName: 'ListOrdered',\n action: () => props.editor.chain().focus().clearNodes().toggleOrderedList().run(),\n },\n {\n name: 'taskList',\n label: t('editor.tasklist.tooltip'),\n isActive: () => props.editor.isActive('taskList'),\n iconName: 'ListTodo',\n action: () => props.editor.chain().focus().clearNodes().toggleTaskList().run(),\n },\n {\n name: 'blockquote',\n label: t('editor.blockquote.tooltip'),\n isActive: () => props.editor.isActive('blockquote'),\n iconName: 'TextQuote',\n action: () => props.editor.chain().focus().clearNodes().toggleBlockquote().run(),\n },\n {\n name: 'codeBlock',\n label: t('editor.codeblock.tooltip'),\n isActive: () => props.editor.isActive('codeBlock'),\n iconName: 'Code2',\n action: () => props.editor.chain().focus().clearNodes().toggleCodeBlock().run(),\n },\n ]\n }, [props.editor, t])\n\n const activeItem = useMemo(() => {\n return (\n menus.filter(item => item.isActive()).pop() ?? {\n label: 'Empty',\n }\n )\n }, [menus])\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" className=\"richtext-h-[32px] richtext-flex richtext-gap-1 richtext-px-1.5\">\n <span className=\"richtext-text-sm richtext-font-normal richtext-whitespace-nowrap\">\n {' '}\n {activeItem?.label}\n </span>\n <ChevronDown className=\"richtext-w-4 richtext-h-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent hideWhenDetached className=\"richtext-w-full richtext-p-1\" align=\"start\" sideOffset={5}>\n {menus.map((item, index) => {\n const Icon = icons[item.iconName as any]\n\n return (\n <DropdownMenuCheckboxItem\n key={index}\n checked={item.isActive?.() || false}\n onClick={() => item.action()}\n className=\"richtext-cursor-pointer\"\n >\n <div className=\"richtext-flex richtext-items-center richtext-gap-2 richtext-px-2\">\n <Icon className=\"richtext-w-3 richtext-h3\" />\n <span>\n {' '}\n {item.label}\n </span>\n </div>\n </DropdownMenuCheckboxItem>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport default TextDropdown\n","import { Extension } from '@tiptap/core'\n\nimport TextDropdown from './components/TextDropdown'\nimport type { GeneralOptions } from '@/types'\n\nexport interface TextBubbleOptions extends GeneralOptions<TextBubbleOptions> {}\n\nexport const TextBubble = Extension.create<TextBubbleOptions>({\n name: 'text-bubble',\n addOptions() {\n return {\n ...this.parent?.(),\n toolbar: false,\n button: () => ({\n component: TextDropdown,\n componentProps: {},\n }),\n }\n },\n})\n\nexport default TextBubble\n","import { Extension } from '@tiptap/core'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\n\n// @ts-ignore\nfunction nodeEqualsType({ types, node }) {\n return (Array.isArray(types) && types.includes(node.type)) || node.type === types\n}\n\n/**\n * Extension based on:\n * - https://github.com/ueberdosis/tiptap/blob/v1/packages/tiptap-extensions/src/extensions/TrailingNode.js\n * - https://github.com/remirror/remirror/blob/e0f1bec4a1e8073ce8f5500d62193e52321155b9/packages/prosemirror-trailing-node/src/trailing-node-plugin.ts\n */\n\nexport interface TrailingNodeOptions {\n node: string\n notAfter: string[]\n}\n\nexport const TrailingNode = Extension.create<TrailingNodeOptions>({\n name: 'trailingNode',\n\n addOptions() {\n return {\n node: 'paragraph',\n notAfter: ['paragraph'],\n }\n },\n\n addProseMirrorPlugins() {\n const plugin = new PluginKey(this.name)\n const disabledNodes = Object.entries(this.editor.schema.nodes)\n .map(([, value]) => value)\n .filter(node => this.options.notAfter.includes(node.name))\n\n return [\n new Plugin({\n key: plugin,\n appendTransaction: (_, __, state) => {\n const { doc, tr, schema } = state\n const shouldInsertNodeAtEnd = plugin.getState(state)\n const endPosition = doc.content.size\n const type = schema.nodes[this.options.node]\n\n if (!shouldInsertNodeAtEnd) {\n return\n }\n\n return tr.insert(endPosition, type.create())\n },\n state: {\n init: (_, state) => {\n const lastNode = state.tr.doc.lastChild\n\n return !nodeEqualsType({ node: lastNode, types: disabledNodes })\n },\n apply: (tr, value) => {\n if (!tr.docChanged) {\n return value\n }\n\n const lastNode = tr.doc.lastChild\n\n return !nodeEqualsType({ node: lastNode, types: disabledNodes })\n },\n },\n }),\n ]\n },\n})\n","import type { AnyExtension } from '@tiptap/core'\nimport { Extension } from '@tiptap/core'\nimport type { CharacterCountOptions } from '@tiptap/extension-character-count'\nimport { CharacterCount } from '@tiptap/extension-character-count'\nimport type { DropcursorOptions } from '@tiptap/extension-dropcursor'\nimport { Dropcursor } from '@tiptap/extension-dropcursor'\nimport type { FocusOptions } from '@tiptap/extension-focus'\nimport Focus from '@tiptap/extension-focus'\nimport { Gapcursor } from '@tiptap/extension-gapcursor'\nimport type { HardBreakOptions } from '@tiptap/extension-hard-break'\nimport { HardBreak } from '@tiptap/extension-hard-break'\nimport type { ListItemOptions } from '@tiptap/extension-list-item'\nimport { ListItem } from '@tiptap/extension-list-item'\nimport type { ParagraphOptions } from '@tiptap/extension-paragraph'\nimport { Paragraph } from '@tiptap/extension-paragraph'\nimport type { PlaceholderOptions } from '@tiptap/extension-placeholder'\nimport { Placeholder } from '@tiptap/extension-placeholder'\nimport { Text } from '@tiptap/extension-text'\nimport type { TextStyleOptions } from '@tiptap/extension-text-style'\nimport { TextStyle } from '@tiptap/extension-text-style'\n\nimport { Document } from '@/extensions/Document'\nimport { Column, MultiColumn } from '@/extensions/MultiColumn'\nimport { Selection } from '@/extensions/Selection'\nimport type { TextBubbleOptions } from '@/extensions/TextBubble'\nimport { TextBubble } from '@/extensions/TextBubble'\nimport type { TrailingNodeOptions } from '@/extensions/TrailingNode'\nimport { TrailingNode } from '@/extensions/TrailingNode'\nimport { localeActions } from '@/locales'\n\n/**\n * Represents the interface for options in the base toolkit.\n */\nexport interface BaseKitOptions {\n /**\n * Whether to enable the document option\n *\n * @default true\n */\n document: false\n /**\n * Whether to enable the document option\n *\n * @default false\n */\n multiColumn?: boolean\n /**\n * Whether to enable the text option\n *\n * @default true\n */\n text: false\n\n /**\n * Whether to enable the Gapcursor\n *\n * @default true\n */\n gapcursor: false\n\n /**\n * Dropcursor options or false, indicating whether to enable the drop cursor\n *\n * @default true\n */\n dropcursor: Partial<DropcursorOptions> | false\n\n /**\n * character count options or false, indicating whether to enable character count\n *\n * @default true\n */\n characterCount: Partial<CharacterCountOptions> | false\n\n /**\n * HardBreak options or false, indicating whether to enable hard breaks\n *\n * @default true\n */\n hardBreak: Partial<HardBreakOptions> | false\n\n /**\n * Placeholder options or false, indicating whether to enable placeholders\n *\n * @default true\n */\n placeholder: Partial<PlaceholderOptions> | false\n\n /**\n * Paragraph options or false, indicating whether to enable paragraph functionality\n *\n * @default true\n */\n paragraph: Partial<ParagraphOptions> | false\n\n /**\n * Focus options or false, indicating whether to enable focus functionality\n *\n * @default true\n */\n focus: Partial<FocusOptions> | false\n\n /**\n * ListItem options or false, indicating whether to enable list item functionality\n *\n * @default true\n */\n listItem: Partial<ListItemOptions> | false\n\n /**\n * Text Style options or false, indicating whether to enable text style functionality\n *\n * @default true\n */\n textStyle: Partial<TextStyleOptions> | false\n\n /**\n * Bubble options, taking `BubbleOptions<BaseKitOptions>` as parameters, indicating whether to enable the bubble functionality\n */\n // bubble: Partial<BubbleOptions<BaseKitOptions>>;\n bubble: any\n\n /**\n * Iframe options or false, indicating whether to enable the iframe\n *\n * @default true\n */\n // iframe: Partial<IframeOptions> | false;\n\n /**\n * Trailing node options or false, indicating whether to enable the trailing node\n *\n * @default true\n */\n trailingNode: Partial<TrailingNodeOptions> | false\n /**\n * textBubble options or false, indicating whether to enable the textBubble\n *\n * @default true\n */\n textBubble: Partial<TextBubbleOptions> | false\n /**\n * selection options or false, indicating whether to enable the selection\n *\n * @default true\n */\n selection: any | false\n}\n\nexport const BaseKit = Extension.create<BaseKitOptions>({\n name: 'base-kit',\n\n addExtensions() {\n const extensions: AnyExtension[] = []\n\n if (this.options.document !== false) {\n extensions.push(Document.configure())\n }\n\n if (this.options.placeholder !== false) {\n extensions.push(\n Placeholder.configure({\n placeholder: ({ node, pos, editor }) => {\n if (node?.type?.name === 'columns') {\n return ''\n }\n\n if (node?.type?.name === 'heading') {\n // @ts-expect-error\n return `${localeActions.t(`editor.heading.h${node.attrs.level}.tooltip`)}`\n }\n if (node?.type?.name === 'codeBlock' || node?.type?.name === 'table') {\n return ''\n }\n if (editor.extensionManager.extensions.some(ext => ext.name === 'slashCommand')) {\n return localeActions.t('editor.slash')\n }\n if (pos === 0) {\n return localeActions.t('editor.content')\n }\n return localeActions.t('editor.content')\n },\n ...this.options.placeholder,\n }),\n )\n }\n\n if (this.options.focus !== false) {\n extensions.push(\n Focus.configure({\n className: 'focus',\n ...this.options.focus,\n }),\n )\n }\n\n if (this.options.text !== false) {\n extensions.push(Text.configure())\n }\n if (this.options.textBubble !== false) {\n extensions.push(TextBubble.configure())\n }\n\n if (this.options.gapcursor !== false) {\n extensions.push(Gapcursor.configure())\n }\n\n if (this.options.dropcursor !== false) {\n extensions.push(\n Dropcursor.configure({\n ...this.options.dropcursor,\n width: 2,\n class: 'ProseMirror-dropcursor border-black',\n }),\n )\n }\n\n if (this.options.characterCount !== false) {\n extensions.push(CharacterCount.configure(this.options.characterCount))\n }\n\n if (this.options.paragraph !== false) {\n extensions.push(Paragraph.configure(this.options.paragraph))\n }\n\n if (this.options.hardBreak !== false) {\n extensions.push(HardBreak.configure(this.options.hardBreak))\n }\n\n if (this.options.listItem !== false) {\n extensions.push(ListItem.configure(this.options.listItem))\n }\n\n if (this.options.textStyle !== false) {\n extensions.push(TextStyle.configure(this.options.textStyle))\n }\n\n if (this.options.trailingNode !== false) {\n extensions.push(TrailingNode.configure(this.options.trailingNode))\n }\n\n if (this.options.selection !== false) {\n extensions.push(Selection)\n }\n\n if (this.options.multiColumn !== false) {\n extensions.push(Column)\n extensions.push(MultiColumn)\n }\n\n return extensions\n },\n})\n","import type { Extensions } from '@tiptap/core'\nimport { Extension } from '@tiptap/core'\nimport type { SubscriptExtensionOptions as TiptapSubscriptOptions } from '@tiptap/extension-subscript'\nimport { Subscript as TiptapSubscript } from '@tiptap/extension-subscript'\nimport type { SuperscriptExtensionOptions as TiptapSuperscriptOptions } from '@tiptap/extension-superscript'\nimport { Superscript as TiptapSuperscript } from '@tiptap/extension-superscript'\n\nimport { ActionButton } from '@/components'\nimport type { ButtonViewReturn, GeneralOptions } from '@/types'\n\n/**\n * Represents the interface for subscript and superscript options, extending GeneralOptions.\n */\nexport interface SubAndSuperScriptOptions extends GeneralOptions<SubAndSuperScriptOptions> {\n /**\n * subscript options or false, indicating whether subscript is enabled\n *\n * @default true\n */\n subscript: Partial<TiptapSubscriptOptions> | false\n /**\n * superscript options or false, indicating whether superscript is enabled\n *\n * @default true\n */\n superscript: Partial<TiptapSuperscriptOptions> | false\n}\n\nexport const SubAndSuperScript = Extension.create<SubAndSuperScriptOptions>({\n name: 'subAndSuperScript',\n\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, extension, t }) => {\n const subscript = extension.options.subscript\n const superscript = extension.options.superscript\n\n const subBtn: ButtonViewReturn = {\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleSubscript(),\n isActive: () => editor.isActive('subscript') || false,\n disabled: !editor.can().toggleSubscript(),\n icon: 'Subscript',\n tooltip: t('editor.subscript.tooltip'),\n },\n }\n\n const superBtn: ButtonViewReturn = {\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.toggleSuperscript(),\n isActive: () => editor.isActive('superscript') || false,\n disabled: !editor.can().toggleSuperscript(),\n icon: 'Superscript',\n tooltip: t('editor.superscript.tooltip'),\n },\n }\n\n const items: ButtonViewReturn[] = []\n\n if (subscript !== false) {\n items.push(subBtn)\n }\n if (superscript !== false) {\n items.push(superBtn)\n }\n\n return items\n },\n }\n },\n\n addExtensions() {\n const extensions: Extensions = []\n\n if (this.options.subscript !== false) {\n extensions.push(TiptapSubscript.configure(this.options.subscript))\n }\n\n if (this.options.superscript !== false) {\n extensions.push(TiptapSuperscript.configure(this.options.superscript))\n }\n\n return extensions\n },\n})\n","import React, { useMemo } from 'react'\n\nimport {\n ActionButton,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuTrigger,\n IconComponent,\n MenuDown,\n} from '@/components'\nimport type { ButtonViewReturnComponentProps } from '@/types'\nimport { getShortcutKeys } from '@/utils/plateform'\n\nexport interface Item {\n title: string\n icon?: any\n isActive: NonNullable<ButtonViewReturnComponentProps['isActive']>\n action?: ButtonViewReturnComponentProps['action']\n style?: React.CSSProperties\n shortcutKeys?: string[]\n disabled?: boolean\n divider?: boolean\n default?: boolean\n}\ninterface IPropsActionMoreButton {\n editor: any\n disabled?: boolean\n color?: string\n maxHeight?: string | number\n icon?: any\n tooltip?: string\n items?: Item[]\n}\n\nfunction ActionMoreButton(props: IPropsActionMoreButton) {\n const active = useMemo(() => {\n const find: any = props?.items?.find((k: any) => k.isActive())\n if (find && !find.default) {\n return {\n ...find,\n icon: find?.icon ? find?.icon : props?.icon,\n }\n }\n const item: Item = {\n title: props.tooltip as any,\n icon: props.icon,\n isActive: () => false,\n }\n\n return item\n }, [props])\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger disabled={props?.disabled} asChild>\n <ActionButton\n customClass=\"!richtext-w-12 richtext-h-12\"\n icon={props?.icon}\n tooltip={props?.tooltip}\n disabled={props?.disabled}\n >\n <MenuDown className=\"richtext-w-3 richtext-h-3 richtext-text-gray-500\" />\n </ActionButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"w-full\">\n {props?.items?.map((item: any, index) => {\n return (\n <DropdownMenuCheckboxItem\n checked={active.title === item.title}\n onClick={item.action}\n key={index}\n className=\"richtext-flex richtext-items-center richtext-gap-3\"\n >\n <IconComponent name={item?.icon} />\n <span className=\"richtext-ml-1\">{item.title}</span>\n {!!item?.shortcutKeys && (\n <span className=\"richtext-ml-auto richtext-text-xs richtext-tracking-widest richtext-opacity-60\">\n {getShortcutKeys(item.shortcutKeys)}\n </span>\n )}\n </DropdownMenuCheckboxItem>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport default ActionMoreButton\n","import { Extension } from '@tiptap/core'\nimport type { Extensions } from '@tiptap/core'\nimport type { SubscriptExtensionOptions as TiptapSubscriptOptions } from '@tiptap/extension-subscript'\nimport { Subscript as TiptapSubscript } from '@tiptap/extension-subscript'\nimport type { SuperscriptExtensionOptions as TiptapSuperscriptOptions } from '@tiptap/extension-superscript'\nimport { Superscript as TiptapSuperscript } from '@tiptap/extension-superscript'\n\nimport type { Item } from '@/extensions/MoreMark/components/ActionMoreButton'\nimport ActionMoreButton from '@/extensions/MoreMark/components/ActionMoreButton'\nimport type { GeneralOptions } from '@/types'\n\nexport interface MoreMarkOptions extends GeneralOptions<MoreMarkOptions> {\n /**\n * // 下标\n *\n * @default true\n */\n subscript: Partial<TiptapSubscriptOptions> | false\n /**\n * // 上标\n *\n * @default true\n */\n superscript: Partial<TiptapSuperscriptOptions> | false\n}\n\nexport const MoreMark = Extension.create<MoreMarkOptions>({\n name: 'moreMark',\n addOptions() {\n return {\n ...this.parent?.(),\n button({ editor, extension, t }) {\n const subscript = extension.options.subscript\n const superscript = extension.options.superscript\n const subBtn: Item = {\n action: () => editor.commands.toggleSubscript(),\n isActive: () => editor.isActive('subscript') || false,\n disabled: !editor.can().toggleSubscript(),\n icon: 'Subscript',\n title: t('editor.subscript.tooltip'),\n shortcutKeys: ['mod', '.'],\n }\n\n const superBtn: Item = {\n action: () => editor.commands.toggleSuperscript(),\n isActive: () => editor.isActive('superscript') || false,\n disabled: !editor.can().toggleSuperscript(),\n icon: 'Superscript',\n title: t('editor.superscript.tooltip'),\n shortcutKeys: ['mod', ','],\n }\n // const hasCode = hasExtension(editor, 'code');\n\n const items: Item[] = []\n\n if (subscript !== false) {\n items.push(subBtn)\n }\n if (superscript !== false) {\n items.push(superBtn)\n }\n // if (hasCode) {\n // const codeBtn: Item = {\n // action: () => editor.commands.toggleCode(),\n // isActive: () => editor.isActive('code') || false,\n // disabled: !editor.can().toggleCode(),\n // icon: 'Code',\n // title: t('editor.code.tooltip'),\n // shortcutKeys: ['mod', 'E'],\n // };\n // if (hasCode) {\n // items.push(codeBtn);\n // }\n // }\n\n return {\n component: ActionMoreButton,\n componentProps: {\n icon: 'Type',\n tooltip: t('editor.moremark'),\n disabled: !editor.isEditable,\n items,\n },\n }\n },\n }\n },\n\n addExtensions() {\n const extensions: Extensions = []\n\n if (this.options.subscript !== false) {\n extensions.push(TiptapSubscript.configure(this.options.subscript))\n }\n\n if (this.options.superscript !== false) {\n extensions.push(TiptapSuperscript.configure(this.options.superscript))\n }\n\n return extensions\n },\n})\n","import { Extension } from '@tiptap/core'\nimport type { Editor } from '@tiptap/core'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\nimport { IndentProps, createIndentCommand } from '@/utils/indent'\n\nexport interface IndentOptions extends GeneralOptions<IndentOptions> {\n types: string[]\n minIndent: number\n maxIndent: number\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n indent: {\n /**\n * Set the indent attribute\n */\n indent: () => ReturnType\n /**\n * Set the outdent attribute\n */\n outdent: () => ReturnType\n }\n }\n}\n\nexport const Indent = Extension.create<IndentOptions>({\n name: 'indent',\n addOptions() {\n return {\n ...this.parent?.(),\n types: ['paragraph', 'heading', 'blockquote'],\n minIndent: IndentProps.min,\n maxIndent: IndentProps.max,\n button({ editor, t }: { editor: Editor, t: (...args: any[]) => string }) {\n return [\n {\n component: ActionButton,\n componentProps: {\n action: () => {\n editor.commands.indent()\n },\n shortcutKeys: ['Tab'],\n icon: 'IndentIncrease',\n tooltip: t('editor.indent.tooltip'),\n },\n },\n {\n component: ActionButton,\n componentProps: {\n action: () => {\n editor.commands.outdent()\n },\n shortcutKeys: ['Shift', 'Tab'],\n icon: 'IndentDecrease',\n tooltip: t('editor.outdent.tooltip'),\n },\n },\n ]\n },\n }\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n indent: {\n default: 0,\n parseHTML: (element) => {\n const identAttr = element.dataset.indent\n return (identAttr ? Number.parseInt(identAttr, 10) : 0) || 0\n },\n renderHTML: (attributes) => {\n if (!attributes.indent) {\n return {}\n }\n return { 'data-indent': attributes.indent }\n },\n },\n },\n },\n ]\n },\n\n addCommands() {\n return {\n indent: () =>\n createIndentCommand({\n delta: IndentProps.more,\n types: this.options.types,\n }),\n outdent: () =>\n createIndentCommand({\n delta: IndentProps.less,\n types: this.options.types,\n }),\n }\n },\n\n addKeyboardShortcuts() {\n return {\n 'Tab': () => this.editor.commands.indent(),\n 'Shift-Tab': () => this.editor.commands.outdent(),\n }\n },\n})\n","import React, { useMemo, useState } from 'react'\n\nimport {\n ActionButton,\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuTrigger,\n IconComponent,\n} from '@/components'\nimport { useLocale } from '@/locales'\nimport type { ButtonViewReturnComponentProps } from '@/types'\n\ninterface IPropsLineHeightDropdown {\n editor: any\n icon?: any\n tooltip?: string\n disabled?: boolean\n action?: ButtonViewReturnComponentProps['action']\n isActive?: ButtonViewReturnComponentProps['isActive']\n}\n\nfunction percentageToDecimal(percentageString: any) {\n const percentage = Number.parseFloat(percentageString.replace('%', ''))\n const decimal = percentage / 100\n return decimal\n}\n\nfunction LineHeightDropdown(props: IPropsLineHeightDropdown) {\n const { t } = useLocale()\n const [value, setValue] = useState('default')\n\n function toggleLightheight(key: string) {\n if (key === 'default') {\n props.editor.commands.unsetLineHeight()\n }\n else {\n props.editor.commands.setLineHeight(key)\n }\n setValue(key)\n }\n\n const LineHeights = useMemo(() => {\n const lineHeightOptions = props.editor.extensionManager.extensions.find(\n (e: any) => e.name === 'lineHeight',\n )!.options\n const a = lineHeightOptions.lineHeights\n const b = a.map((item: any) => ({\n label: percentageToDecimal(item),\n value: item,\n }))\n\n b.unshift({\n label: t('editor.default'),\n value: 'default',\n })\n return b\n }, [props])\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger disabled={props?.disabled} asChild>\n <ActionButton\n customClass=\"!richtext-w-12 richtext-h-12\"\n icon=\"LineHeight\"\n tooltip={props?.tooltip}\n disabled={props?.disabled}\n >\n <IconComponent className=\"richtext-w-3 richtext-h-3 richtext-ml-1 richtext-text-zinc-500\" name=\"MenuDown\" />\n </ActionButton>\n </DropdownMenuTrigger>\n <DropdownMenuContent className=\"richtext-min-w-24\">\n {LineHeights?.map((item: any, index: any) => {\n return (\n <DropdownMenuCheckboxItem\n key={`lineHeight-${index}`}\n checked={item.value === value}\n onClick={() => toggleLightheight(item.value)}\n >\n {item.label}\n </DropdownMenuCheckboxItem>\n )\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n\nexport default LineHeightDropdown\n","import type { Command } from '@tiptap/core'\nimport type { NodeType, Node as ProsemirrorNode } from '@tiptap/pm/model'\nimport type { EditorState, Transaction } from '@tiptap/pm/state'\nimport { AllSelection, TextSelection } from '@tiptap/pm/state'\n\nimport { DEFAULT_LINE_HEIGHT } from '@/constants'\n\nexport const ALLOWED_NODE_TYPES = ['paragraph', 'heading', 'list_item', 'todo_item']\n\nexport function isLineHeightActive(state: EditorState, lineHeight: string): boolean {\n const { selection, doc } = state\n const { from, to } = selection\n\n let keepLooking = true\n let active = false\n\n doc.nodesBetween(from, to, (node) => {\n const nodeType = node.type\n const lineHeightValue = node.attrs.lineHeight || DEFAULT_LINE_HEIGHT\n\n if (ALLOWED_NODE_TYPES.includes(nodeType.name)) {\n if (keepLooking && lineHeight === lineHeightValue) {\n keepLooking = false\n active = true\n\n return false\n }\n return nodeType.name !== 'list_item' && nodeType.name !== 'todo_item'\n }\n return keepLooking\n })\n\n return active\n}\n\ninterface SetLineHeightTask {\n node: ProsemirrorNode\n nodeType: NodeType\n pos: number\n}\n\nexport function setTextLineHeight(tr: Transaction, lineHeight: string | null): Transaction {\n const { selection, doc } = tr\n\n if (!selection || !doc) {\n return tr\n }\n\n if (!(selection instanceof TextSelection || selection instanceof AllSelection)) {\n return tr\n }\n\n const { from, to } = selection\n\n const tasks: Array<SetLineHeightTask> = []\n const lineHeightValue = lineHeight && lineHeight !== DEFAULT_LINE_HEIGHT ? lineHeight : null\n\n doc.nodesBetween(from, to, (node, pos) => {\n const nodeType = node.type\n if (ALLOWED_NODE_TYPES.includes(nodeType.name)) {\n const lineHeight = node.attrs.lineHeight || null\n if (lineHeight !== lineHeightValue) {\n tasks.push({\n node,\n pos,\n nodeType,\n })\n }\n return nodeType.name !== 'list_item' && nodeType.name !== 'todo_item'\n }\n return true\n })\n\n if (tasks.length === 0) {\n return tr\n }\n\n for (const task of tasks) {\n const { node, pos, nodeType } = task\n let { attrs } = node\n\n attrs = {\n ...attrs,\n lineHeight: lineHeightValue,\n }\n\n tr = tr.setNodeMarkup(pos, nodeType, attrs, node.marks)\n }\n\n return tr\n}\n\nexport function createLineHeightCommand(lineHeight: string): Command {\n return ({ state, dispatch }) => {\n const { selection } = state\n let { tr } = state\n tr = tr.setSelection(selection)\n\n tr = setTextLineHeight(tr, lineHeight)\n\n if (tr.docChanged) {\n if (dispatch)\n dispatch(tr)\n return true\n }\n\n return false\n }\n}\n","import { Extension } from '@tiptap/core'\nimport type { Editor } from '@tiptap/core'\n\nimport { DEFAULT_LINE_HEIGHT, DEFAULT_LINE_HEIGHT_LIST } from '@/constants'\nimport LineHeightDropdown from '@/extensions/LineHeight/components/LineHeightDropdown'\nimport type { GeneralOptions } from '@/types'\nimport { createLineHeightCommand } from '@/utils/line-height'\n\nexport interface LineHeightOptions extends GeneralOptions<LineHeightOptions> {\n types: string[]\n lineHeights: string[]\n defaultHeight: string\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n lineHeight: {\n setLineHeight: (lineHeight: string) => ReturnType\n unsetLineHeight: () => ReturnType\n }\n }\n}\n\nexport const LineHeight = Extension.create<LineHeightOptions>({\n name: 'lineHeight',\n addOptions() {\n return {\n ...this.parent?.(),\n types: ['paragraph', 'heading', 'list_item', 'todo_item'],\n lineHeights: DEFAULT_LINE_HEIGHT_LIST,\n defaultHeight: DEFAULT_LINE_HEIGHT,\n button({ editor, t }: { editor: Editor, t: any }) {\n return {\n component: LineHeightDropdown,\n componentProps: {\n editor,\n tooltip: t('editor.lineheight.tooltip'),\n },\n }\n },\n }\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n lineHeight: {\n default: null,\n parseHTML: (element) => {\n return element.style.lineHeight || this.options.defaultHeight\n },\n renderHTML: (attributes) => {\n if (attributes.lineHeight === this.options.defaultHeight || !attributes.lineHeight) {\n return {}\n }\n return { style: `line-height: ${attributes.lineHeight}` }\n },\n },\n },\n },\n ]\n },\n\n addCommands() {\n return {\n setLineHeight: lineHeight => createLineHeightCommand(lineHeight),\n unsetLineHeight:\n () =>\n ({ commands }) => {\n return this.options.types.every(type => commands.resetAttributes(type, 'lineHeight'))\n },\n }\n },\n})\n","import type { Extensions } from '@tiptap/core'\n\nimport type { Group } from './types'\nimport type { HeadingOptions } from '@/extensions'\nimport { localeActions } from '@/locales'\n\nexport function renderGroups(extensions: Extensions) {\n const groups: Group[] = [\n {\n name: 'format',\n title: localeActions.t('editor.slash.format'),\n commands: [],\n },\n {\n name: 'insert',\n title: localeActions.t('editor.slash.insert'),\n commands: [],\n },\n ]\n\n extensions.forEach((extension) => {\n /* Format */\n if (extension.name.toLowerCase() === 'heading') {\n extension.options.levels.forEach((level: HeadingOptions['levels'][number]) => {\n groups[0].commands.push({\n name: `heading${level}`,\n label: localeActions.t(`editor.heading.h${level}.tooltip`),\n aliases: [`h${level}`, 'bt', `bt${level}`],\n iconName: `Heading${level}`,\n action: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).setHeading({ level }).run()\n },\n })\n })\n }\n\n if (extension.name.toLowerCase() === 'bulletlist') {\n groups[0].commands.push({\n name: 'bulletList',\n label: localeActions.t('editor.bulletlist.tooltip'),\n aliases: ['ul', 'yxlb'],\n iconName: 'List',\n action: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).toggleBulletList().run()\n },\n })\n }\n\n if (extension.name.toLowerCase() === 'orderedlist') {\n groups[0].commands.push({\n name: 'numberedList',\n label: localeActions.t('editor.orderedlist.tooltip'),\n aliases: ['ol', 'yxlb'],\n iconName: 'ListOrdered',\n action: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).toggleOrderedList().run()\n },\n })\n }\n\n if (extension.name.toLowerCase() === 'tasklist') {\n groups[0].commands.push({\n name: 'taskList',\n label: localeActions.t('editor.tasklist.tooltip'),\n iconName: 'ListTodo',\n description: 'Task list with todo items',\n aliases: ['todo'],\n action: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).toggleTaskList().run()\n },\n })\n }\n\n if (extension.name.toLowerCase() === 'blockquote') {\n groups[0].commands.push({\n name: 'blockquote',\n label: localeActions.t('editor.blockquote.tooltip'),\n description: '插入引入格式',\n aliases: ['yr'],\n iconName: 'TextQuote',\n action: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).setBlockquote().run()\n },\n })\n }\n\n if (extension.name.toLowerCase() === 'codeblock') {\n groups[0].commands.push({\n name: 'codeBlock',\n label: localeActions.t('editor.codeblock.tooltip'),\n iconName: 'Code2',\n description: 'Code block with syntax highlighting',\n shouldBeHidden: editor => editor.isActive('columns'),\n action: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).setCodeBlock().run()\n },\n })\n }\n\n /* Insert */\n if (extension.name.toLowerCase() === 'image') {\n groups[1].commands.push({\n name: 'image',\n label: localeActions.t('editor.image.tooltip'),\n iconName: 'ImageUp',\n description: 'Insert a image',\n aliases: ['image', 'tp', 'tupian'],\n shouldBeHidden: editor => editor.isActive('columns'),\n action: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).setImageUpload().run()\n },\n })\n }\n\n if (extension.name.toLowerCase() === 'video') {\n groups[1].commands.push({\n name: 'video',\n label: localeActions.t('editor.video.tooltip'),\n iconName: 'Video',\n description: 'Insert a video',\n aliases: ['video', 'sp', 'shipin'],\n shouldBeHidden: editor => editor.isActive('columns'),\n action: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).setVideoUpload().run()\n },\n })\n }\n\n if (extension.name.toLowerCase() === 'table') {\n groups[1].commands.push({\n name: 'table',\n label: localeActions.t('editor.table.tooltip'),\n iconName: 'Table',\n description: 'Insert a table',\n aliases: ['table', 'bg', 'biaoge', 'biao'],\n shouldBeHidden: editor => editor.isActive('columns'),\n action: ({ editor, range }) => {\n editor\n .chain()\n .focus()\n .deleteRange(range)\n .insertTable({ rows: 3, cols: 3, withHeaderRow: false })\n .run()\n },\n })\n }\n\n if (extension.name.toLowerCase() === 'horizontalrule') {\n groups[1].commands.push({\n name: 'horizontalRule',\n label: localeActions.t('editor.horizontalrule.tooltip'),\n iconName: 'Minus',\n description: 'Insert a horizontal divider',\n aliases: ['hr', 'fgx', 'fg'],\n action: ({ editor, range }) => {\n editor.chain().focus().deleteRange(range).setHorizontalRule().run()\n },\n })\n }\n\n if (extension.name.toLowerCase() === 'columns') {\n groups[1].commands.push({\n name: 'columns',\n label: localeActions.t('editor.columns.tooltip'),\n iconName: 'Columns2',\n description: 'Add two column content',\n action: ({ editor }) => {\n editor.chain().focus().insertColumns({ cols: 2 }).run()\n },\n })\n }\n })\n\n return groups\n}\n","/* eslint-disable react-dom/no-missing-button-type */\nimport React, {\n Fragment,\n forwardRef,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react'\n\nimport { IconComponent } from '@/components'\nimport { useLocale } from '@/locales'\nimport { cn } from '@/lib/utils'\n\nfunction CommandsList(props: any, ref: any) {\n // 选中的索引\n const [selectedCommandIndex, setSelectedCommandIndex] = useState(0)\n const [selectedGroupIndex, setSelectedGroupIndex] = useState(0)\n // 滚动ref\n const scrollContainer = useRef<HTMLDivElement | null>(null)\n\n const { t } = useLocale()\n\n const activeItemRefs = useRef<(HTMLButtonElement | null)[]>([])\n\n useImperativeHandle(ref, () => {\n return {\n onKeyDown,\n }\n })\n\n useEffect(() => {\n if (!scrollContainer.current) {\n return\n }\n const activeItemIndex = selectedGroupIndex * 1000 + selectedCommandIndex\n const activeItem = activeItemRefs.current[activeItemIndex]\n if (activeItem) {\n activeItem.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n })\n }\n }, [selectedCommandIndex, selectedGroupIndex])\n\n function onKeyDown({ event }: any) {\n if (event.key === 'ArrowUp') {\n upHandler()\n return true\n }\n\n if (event.key === 'ArrowDown') {\n downHandler()\n return true\n }\n\n if (event.key === 'Enter') {\n enterHandler()\n return true\n }\n\n return false\n }\n\n function upHandler() {\n if (props.items.length === 0) {\n return false\n }\n let newCommandIndex = selectedCommandIndex - 1\n let newGroupIndex = selectedGroupIndex\n\n if (newCommandIndex < 0) {\n newGroupIndex = selectedGroupIndex - 1\n newCommandIndex = props.items[newGroupIndex]?.commands.length - 1 || 0\n }\n\n if (newGroupIndex < 0) {\n newGroupIndex = props.items.length - 1\n newCommandIndex = props.items[newGroupIndex].commands.length - 1\n }\n\n setSelectedCommandIndex(newCommandIndex)\n setSelectedGroupIndex(newGroupIndex)\n }\n\n function downHandler() {\n if (props.items.length === 0) {\n return false\n }\n const commands = props.items[selectedGroupIndex].commands\n let newCommandIndex = selectedCommandIndex + 1\n let newGroupIndex = selectedGroupIndex\n\n if (commands.length - 1 < newCommandIndex) {\n newCommandIndex = 0\n newGroupIndex = selectedGroupIndex + 1\n }\n if (props.items.length - 1 < newGroupIndex) {\n newGroupIndex = 0\n }\n setSelectedCommandIndex(newCommandIndex)\n setSelectedGroupIndex(newGroupIndex)\n }\n\n function enterHandler() {\n if (props.items.length === 0 || selectedGroupIndex === -1 || selectedCommandIndex === -1) {\n return false\n }\n\n selectItem(selectedGroupIndex, selectedCommandIndex)\n }\n\n function selectItem(groupIndex: number, commandIndex: number) {\n const command = props.items[groupIndex].commands[commandIndex]\n props.command(command)\n }\n\n function createCommandClickHandler(groupIndex: number, commandIndex: number) {\n selectItem(groupIndex, commandIndex)\n }\n function setActiveItemRef(groupIndex: number, commandIndex: number, el: any) {\n activeItemRefs.current[groupIndex * 1000 + commandIndex] = el\n }\n\n return (\n <div\n className=\"!richtext-bg-white richtext-rounded-lg dark:!richtext-bg-black richtext-shadow-sm !richtext-border !richtext-border-neutral-200 dark:!richtext-border-neutral-800 !richtext-text-black richtext-max-h-[min(80vh,24rem)] richtext-overflow-auto richtext-flex-wrap richtext-mb-8 richtext-p-1\"\n ref={scrollContainer}\n >\n {props?.items?.length\n ? (\n <div className=\"richtext-grid richtext-grid-cols-1 richtext-gap-0.5 richtext-min-w-48\">\n {props?.items?.map((group: any, groupIndex: any) => {\n return (\n <Fragment key={group.title}>\n <div className=\"!richtext-text-neutral-500 richtext-text-[0.65rem] richtext-col-[1/-1] richtext-mx-2 richtext-mt-2 richtext-font-semibold richtext-tracking-wider richtext-select-none richtext-uppercase first:richtext-mt-0.5\">\n {group.title}\n </div>\n\n {group.commands.map((command: any, commandIndex: any) => {\n return (\n <button\n className={cn(`richtext-flex richtext-items-center richtext-gap-3 richtext-px-2 richtext-py-1.5 richtext-text-sm !richtext-text-neutral-800 dark:!richtext-text-neutral-200 richtext-text-left richtext-w-full richtext-rounded-sm richtext-outline-none richtext-transition-colors !richtext-bg-transparent hover:!richtext-bg-accent `, {\n 'slash-command-active': selectedGroupIndex === groupIndex && selectedCommandIndex === commandIndex,\n })}\n ref={el => setActiveItemRef(groupIndex, commandIndex, el)}\n key={`command-${commandIndex}`}\n onClick={() => createCommandClickHandler(groupIndex, commandIndex)}\n >\n {command.iconUrl && <img className=\"richtext-w-6 richtext-h-6\" src={command.iconUrl} alt=\"\" />}\n {command.iconName && (\n <IconComponent name={command.iconName} className=\"!richtext-mr-1 !richtext-text-lg\" />\n )}\n {command.label}\n </button>\n )\n })}\n </Fragment>\n )\n })}\n </div>\n )\n : (\n <div className=\"richtext-p-3\">\n <span className=\"richtext-text-xs richtext-text-gray-800 dark:richtext-text-gray-100\">\n {t('editor.slash.empty')}\n </span>\n </div>\n )}\n </div>\n )\n}\n\nexport default forwardRef(CommandsList)\n","import type { Editor, Range } from '@tiptap/core'\nimport { Extension } from '@tiptap/core'\nimport { PluginKey } from '@tiptap/pm/state'\nimport { ReactRenderer } from '@tiptap/react'\nimport type { SuggestionKeyDownProps, SuggestionProps } from '@tiptap/suggestion'\nimport Suggestion from '@tiptap/suggestion'\nimport tippy from 'tippy.js'\n\nimport { renderGroups } from './groups'\nimport CommandsList from '@/extensions/SlashCommand/components/CommandsList'\n\nconst extensionName = 'slashCommand'\nlet popup: any\nexport const SlashCommand = Extension.create({\n name: extensionName,\n priority: 200,\n onCreate() {\n popup = tippy('body', {\n interactive: true,\n trigger: 'manual',\n placement: 'bottom-start',\n theme: 'slash-command',\n maxWidth: '16rem',\n offset: [16, 8],\n popperOptions: {\n strategy: 'fixed',\n modifiers: [\n {\n name: 'flip',\n enabled: false,\n },\n ],\n },\n })\n },\n\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n char: '/',\n allowSpaces: true,\n startOfLine: true,\n pluginKey: new PluginKey(extensionName),\n allow: ({ state, range }) => {\n const $from = state.doc.resolve(range.from)\n const isRootDepth = $from.depth === 1\n const isParagraph = $from.parent.type.name === 'paragraph'\n const isStartOfNode = $from.parent.textContent?.charAt(0) === '/'\n // TODO 行列内\n const isInColumn = this.editor.isActive('column')\n const afterContent = $from.parent.textContent?.slice(\n Math.max(0, $from.parent.textContent?.indexOf('/')),\n )\n const isValidAfterContent = !afterContent?.endsWith(' ')\n\n return (\n ((isRootDepth && isParagraph && isStartOfNode)\n || (isInColumn && isParagraph && isStartOfNode))\n && isValidAfterContent\n )\n },\n command: ({ editor, range, props }: { editor: Editor, range: Range, props: any }) => {\n const { view } = editor\n props.action({ editor, range })\n view.focus()\n },\n items: ({ query, editor }: { query: string, editor: Editor }) => {\n // get options\n // Filter commands\n const groups = renderGroups(editor.extensionManager.extensions)\n const withFilteredCommands = groups.map(group => ({\n ...group,\n commands: group.commands\n .filter((item) => {\n const labelNormalized = item.label.toLowerCase().trim()\n const queryNormalized = query.toLowerCase().trim()\n\n if (item.aliases) {\n const aliases = item.aliases.map(alias => alias.toLowerCase().trim())\n const labelMatch = labelNormalized.match(queryNormalized)\n const aliasMatch = aliases.some(alias => alias.match(queryNormalized))\n\n return labelMatch || aliasMatch\n }\n\n return labelNormalized.match(queryNormalized)\n })\n .filter(command =>\n command.shouldBeHidden ? !command.shouldBeHidden(this.editor) : true,\n ),\n }))\n // Remove empty groups\n const withoutEmptyGroups = withFilteredCommands.filter((group) => {\n if (group.commands.length > 0) {\n return true\n }\n\n return false\n })\n const withEnabledSettings = withoutEmptyGroups.map(group => ({\n ...group,\n commands: group.commands.map(command => ({\n ...command,\n isEnabled: true,\n })),\n }))\n\n return withEnabledSettings\n },\n render: () => {\n let component: any\n let scrollHandler: (() => void) | null = null\n return {\n onStart: (props: SuggestionProps) => {\n component = new ReactRenderer(CommandsList, {\n props,\n editor: props.editor,\n })\n const { view } = props.editor\n // const editorNode = view.dom as HTMLElement;\n const getReferenceClientRect = () => {\n if (!props.clientRect) {\n return props.editor.storage[extensionName].rect\n }\n\n const rect = props.clientRect()\n\n if (!rect) {\n return props.editor.storage[extensionName].rect\n }\n\n let yPos = rect.y\n\n if (rect.top + component.element.offsetHeight + 40 > window.innerHeight) {\n const diff = rect.top + component.element.offsetHeight - window.innerHeight + 40\n yPos = rect.y - diff\n }\n\n // Account for when the editor is bound inside a container that doesn't go all the way to the edge of the screen\n // const editorXOffset = editorNode.getBoundingClientRect().x;\n return new DOMRect(rect.x, yPos, rect.width, rect.height)\n }\n\n scrollHandler = () => {\n popup?.[0].setProps({\n getReferenceClientRect,\n })\n }\n\n view.dom.parentElement?.addEventListener('scroll', scrollHandler)\n\n popup?.[0].setProps({\n getReferenceClientRect,\n appendTo: () => document.body,\n content: component.element,\n })\n\n popup?.[0].show()\n },\n\n onUpdate(props: SuggestionProps) {\n component.updateProps(props)\n\n const { view } = props.editor\n\n // const editorNode = view.dom as HTMLElement;\n\n const getReferenceClientRect = () => {\n if (!props.clientRect) {\n return props.editor.storage[extensionName].rect\n }\n\n const rect = props.clientRect()\n\n if (!rect) {\n return props.editor.storage[extensionName].rect\n }\n\n // Account for when the editor is bound inside a container that doesn't go all the way to the edge of the screen\n return new DOMRect(rect.x, rect.y, rect.width, rect.height)\n }\n\n const scrollHandler = () => {\n popup?.[0].setProps({\n getReferenceClientRect,\n })\n }\n\n view.dom.parentElement?.addEventListener('scroll', scrollHandler)\n\n props.editor.storage[extensionName].rect = props.clientRect\n ? getReferenceClientRect()\n : {\n width: 0,\n height: 0,\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n }\n popup?.[0].setProps({\n getReferenceClientRect,\n })\n },\n\n onKeyDown(props: SuggestionKeyDownProps) {\n if (props.event.key === 'Escape') {\n popup?.[0].hide()\n\n return true\n }\n\n if (!popup?.[0].state.isShown) {\n popup?.[0].show()\n }\n\n return component.ref?.onKeyDown(props)\n },\n\n onExit(props) {\n popup?.[0].hide()\n if (scrollHandler) {\n const { view } = props.editor\n view.dom.parentElement?.removeEventListener('scroll', scrollHandler)\n }\n component.destroy()\n },\n }\n },\n }),\n ]\n },\n\n addStorage() {\n return {\n rect: {\n width: 0,\n height: 0,\n left: 0,\n top: 0,\n right: 0,\n bottom: 0,\n },\n }\n },\n})\n\nexport default SlashCommand\n","import React, { useCallback, useEffect, useMemo, useState } from 'react'\n\nimport { NodeViewWrapper } from '@tiptap/react'\nimport { flushSync } from 'react-dom'\n\nimport { IMAGE_MAX_SIZE, IMAGE_MIN_SIZE, IMAGE_THROTTLE_WAIT_TIME } from '@/constants'\nimport { clamp, isNumber, throttle } from '@/utils/utils'\n\ninterface Size {\n width: number\n height: number\n}\n\nconst ResizeDirection = {\n TOP_LEFT: 'tl',\n TOP_RIGHT: 'tr',\n BOTTOM_LEFT: 'bl',\n BOTTOM_RIGHT: 'br',\n}\n\nfunction ImageView(props: any) {\n const [maxSize, setMaxSize] = useState<Size>({\n width: IMAGE_MAX_SIZE,\n height: IMAGE_MAX_SIZE,\n })\n\n const [originalSize, setOriginalSize] = useState({\n width: 0,\n height: 0,\n })\n\n const [resizeDirections] = useState<string[]>([\n ResizeDirection.TOP_LEFT,\n ResizeDirection.TOP_RIGHT,\n ResizeDirection.BOTTOM_LEFT,\n ResizeDirection.BOTTOM_RIGHT,\n ])\n\n const [resizing, setResizing] = useState<boolean>(false)\n\n const [resizerState, setResizerState] = useState({\n x: 0,\n y: 0,\n w: 0,\n h: 0,\n dir: '',\n })\n\n const imgAttrs = useMemo(() => {\n const { src, alt, width: w, height: h } = props?.node?.attrs\n const width = isNumber(w) ? `${w}px` : w\n const height = isNumber(h) ? `${h}px` : h\n return {\n src: src || undefined,\n alt: alt || undefined,\n style: {\n width: width || undefined,\n height: height || undefined,\n },\n }\n }, [props?.node?.attrs])\n\n const imageMaxStyle = useMemo(() => {\n const {\n style: { width },\n } = imgAttrs\n\n return { width: width === '100%' ? width : undefined }\n }, [imgAttrs])\n\n function onImageLoad(e: Record<string, any>) {\n setOriginalSize({\n width: e.target.width,\n height: e.target.height,\n })\n }\n\n // https://github.com/scrumpy/tiptap/issues/361#issuecomment-540299541\n function selectImage() {\n const { editor, getPos } = props\n editor.commands.setNodeSelection(getPos())\n }\n\n const getMaxSize = useCallback(\n throttle(() => {\n const { editor } = props as any\n const { width } = getComputedStyle(editor.view.dom)\n setMaxSize((prev) => {\n return {\n ...prev,\n width: Number.parseInt(width, 10),\n }\n })\n }, IMAGE_THROTTLE_WAIT_TIME),\n [props?.editor],\n )\n\n function onMouseDown(e: MouseEvent, dir: string) {\n e.preventDefault()\n e.stopPropagation()\n\n const originalWidth = originalSize.width\n const originalHeight = originalSize.height\n const aspectRatio = originalWidth / originalHeight\n\n let width = Number(props.node.attrs.width)\n let height = Number(props.node.attrs.height)\n const maxWidth = maxSize.width\n\n if (width && !height) {\n width = width > maxWidth ? maxWidth : width\n height = Math.round(width / aspectRatio)\n }\n else if (height && !width) {\n width = Math.round(height * aspectRatio)\n width = width > maxWidth ? maxWidth : width\n }\n else if (!width && !height) {\n width = originalWidth > maxWidth ? maxWidth : originalWidth\n height = Math.round(width / aspectRatio)\n }\n else {\n width = width > maxWidth ? maxWidth : width\n }\n\n flushSync(() => {\n setResizing(true)\n\n setResizerState({\n x: e.clientX,\n y: e.clientY,\n w: width,\n h: height,\n dir,\n })\n })\n }\n\n const onMouseMove = useCallback(\n throttle((e: MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n\n if (!resizing) {\n return\n }\n\n const { x, w, dir } = resizerState\n\n const dx = (e.clientX - x) * (/l/.test(dir) ? -1 : 1)\n // const dy = (e.clientY - y) * (/t/.test(dir) ? -1 : 1)\n\n const width = clamp(w + dx, IMAGE_MIN_SIZE, maxSize.width)\n const height = null\n\n props.updateAttributes({\n width,\n height,\n })\n }, IMAGE_THROTTLE_WAIT_TIME),\n [resizing, resizerState, maxSize, props.updateAttributes],\n )\n\n const onMouseUp = useCallback(\n (e: MouseEvent) => {\n e.preventDefault()\n e.stopPropagation()\n if (!resizing) {\n return\n }\n\n flushSync(() => {\n setResizerState({\n x: 0,\n y: 0,\n w: 0,\n h: 0,\n dir: '',\n })\n setResizing(false)\n })\n\n selectImage()\n },\n [resizing, selectImage],\n )\n\n const onEvents = useCallback(() => {\n document?.addEventListener('mousemove', onMouseMove, true)\n document?.addEventListener('mouseup', onMouseUp, true)\n }, [onMouseMove, onMouseUp])\n\n const offEvents = useCallback(() => {\n document?.removeEventListener('mousemove', onMouseMove, true)\n document?.removeEventListener('mouseup', onMouseUp, true)\n }, [onMouseMove, onMouseUp])\n\n useEffect(() => {\n if (resizing) {\n onEvents()\n }\n else {\n offEvents()\n }\n\n return () => {\n offEvents()\n }\n }, [resizing, onEvents, offEvents])\n\n const resizeOb: ResizeObserver = useMemo(() => {\n return new ResizeObserver(() => getMaxSize())\n }, [getMaxSize])\n\n useEffect(() => {\n resizeOb.observe(props.editor.view.dom)\n\n return () => {\n resizeOb.disconnect()\n }\n }, [props.editor.view.dom, resizeOb])\n\n return (\n <NodeViewWrapper className=\"image-view\" style={{ ...imageMaxStyle, width: '100%' }}>\n <div\n draggable=\"true\"\n data-drag-handle\n className={`image-view__body ${props?.selected ? 'image-view__body--focused' : ''} ${\n resizing ? 'image-view__body--resizing' : ''\n }`}\n style={imageMaxStyle}\n >\n <img\n src={imgAttrs.src}\n alt={imgAttrs.alt}\n style={imgAttrs.style}\n height=\"auto\"\n className=\"image-view__body__image block\"\n onLoad={onImageLoad}\n onClick={selectImage}\n />\n {props?.editor.view.editable && (props?.selected || resizing) && (\n <div className=\"image-resizer\">\n {resizeDirections?.map((direction) => {\n return (\n <span\n key={direction}\n className={`image-resizer__handler image-resizer__handler--${direction}`}\n onMouseDown={(e: any) => onMouseDown(e, direction)}\n >\n </span>\n )\n })}\n </div>\n )}\n </div>\n </NodeViewWrapper>\n )\n}\n\nexport default ImageView\n","/* eslint-disable eqeqeq */\n\nimport { mergeAttributes } from '@tiptap/core'\nimport TiptapImage from '@tiptap/extension-image'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\n\nimport ImageView from '@/extensions/Image/components/ImageView'\n\nexport interface SetImageAttrsOptions {\n src?: string\n /** The alternative text for the image. */\n alt?: string\n /** The title of the image. */\n title?: string\n /** The width of the image. */\n width?: number | string | null\n}\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n imageResize: {\n /**\n * Add an image\n */\n setImage: (options: Partial<SetImageAttrsOptions>) => ReturnType\n /**\n * Update an image\n */\n updateImage: (options: Partial<SetImageAttrsOptions>) => ReturnType\n }\n }\n}\nexport const Image = TiptapImage.extend({\n inline() {\n return true\n },\n group() {\n return 'inline'\n },\n addAttributes() {\n return {\n ...this.parent?.(),\n width: {\n default: null,\n parseHTML: (element) => {\n const width = element.style.width || element.getAttribute('width') || null\n return width == undefined ? null : Number.parseInt(width, 10)\n },\n renderHTML: (attributes) => {\n return {\n width: attributes.width,\n }\n },\n },\n }\n },\n\n addOptions() {\n return {\n ...this.parent?.(),\n inline: true,\n upload: null,\n }\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(ImageView)\n },\n addCommands() {\n return {\n ...this.parent?.(),\n updateImage:\n options =>\n ({ commands }) => {\n return commands.updateAttributes(this.name, options)\n },\n }\n },\n renderHTML({ HTMLAttributes }) {\n return [\n 'img',\n mergeAttributes(\n // Always render the `height=\"auto\"\n {\n height: 'auto',\n },\n this.options.HTMLAttributes,\n HTMLAttributes,\n ),\n ]\n },\n\n parseHTML() {\n return [\n {\n tag: 'img[src]',\n },\n ]\n },\n})\n\nexport default Image\n","import type { EditorState } from '@tiptap/pm/state'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\nimport type { EditorView } from '@tiptap/pm/view'\nimport { Decoration, DecorationSet } from '@tiptap/pm/view'\n\nconst uploadKey = new PluginKey('upload-image')\n\ninterface UploadAction {\n add?: Array<{ id: string, pos: number, src: string }>\n remove?: string[]\n}\n\nexport function UploadImagesPlugin() {\n return new Plugin({\n key: uploadKey,\n state: {\n init() {\n return DecorationSet.empty\n },\n apply(tr: any, set: any) {\n set = set.map(tr.mapping, tr.doc)\n const action = tr.getMeta(uploadKey) as UploadAction\n\n if (action?.add) {\n for (const { id, pos, src } of action.add) {\n const placeholder = createPlaceholder(src)\n const deco = Decoration.widget(pos, placeholder, { id })\n set = set.add(tr.doc, [deco])\n }\n }\n else if (action?.remove) {\n for (const id of action.remove) {\n set = set.remove(set.find(undefined, undefined, (spec: any) => spec.id === id))\n }\n }\n\n return set\n },\n },\n props: {\n decorations(state) {\n return this.getState(state)\n },\n },\n })\n}\n\nfunction createPlaceholder(src: string): HTMLElement {\n const placeholder = document.createElement('div')\n const image = document.createElement('img')\n image.setAttribute('class', 'opacity-50')\n image.src = src\n image.addEventListener('load', () => {\n placeholder.setAttribute('class', 'img-placeholder')\n })\n placeholder.append(image)\n return placeholder\n}\n\nfunction findPlaceholder(state: EditorState, id: string): number | null {\n const decos = uploadKey.getState(state) as DecorationSet\n const found = decos.find(undefined, undefined, spec => spec.id === id)\n return found.length > 0 ? found[0]?.from : null\n}\n\nexport interface ImageUploadOptions {\n validateFn?: (file: File) => boolean\n onUpload: (file: File) => Promise<string | object>\n}\n\nexport type UploadFn = (files: File[], view: EditorView, pos: number) => void\n\nexport function createImageUpload({ validateFn, onUpload }: ImageUploadOptions): UploadFn {\n return (files, view, pos) => {\n for (const file of files) {\n if (validateFn && !validateFn(file)) {\n continue\n }\n\n const id = Date.now().toString()\n const tr = view.state.tr\n if (!tr.selection.empty) {\n tr.deleteSelection()\n }\n\n const result = URL.createObjectURL(file)\n tr.setMeta(uploadKey, {\n add: [{ id, pos, src: result }],\n })\n view.dispatch(tr)\n\n onUpload(file).then(\n (src) => {\n const { schema } = view.state\n const placeholderPos = findPlaceholder(view.state, id)\n if (placeholderPos === null) {\n return\n }\n\n const imageSrc = typeof src === 'object' ? result : src\n const node = schema.nodes.image?.create({ src: imageSrc })\n if (!node) {\n return\n }\n\n const transaction = view.state.tr\n .replaceWith(placeholderPos, placeholderPos, node)\n .setMeta(uploadKey, { remove: [id] })\n view.dispatch(transaction)\n },\n () => {\n const transaction = view.state.tr.delete(pos, pos).setMeta(uploadKey, { remove: [id] })\n view.dispatch(transaction)\n },\n )\n }\n }\n}\n\nexport function handleImagePaste(view: EditorView, event: ClipboardEvent, uploadFn: UploadFn): boolean {\n const files = [...(event.clipboardData?.files || [])]\n if (files.length > 0) {\n event.preventDefault()\n const pos = view.state.selection.from\n uploadFn(files, view, pos + 1)\n return true\n }\n return false\n}\n\nexport function handleImageDrop(view: EditorView, event: DragEvent, moved: boolean, uploadFn: UploadFn): boolean {\n const files = [...(event.dataTransfer?.files || [])]\n if (!moved && files.length > 0) {\n event.preventDefault()\n const coordinates = view.posAtCoords({\n left: event.clientX,\n top: event.clientY,\n })\n if (coordinates) {\n uploadFn(files, view, coordinates.pos + 1)\n return true\n }\n }\n return false\n}\n","import React, { useRef, useState } from 'react'\n\nimport { NodeViewWrapper } from '@tiptap/react'\n\nimport { Button, IconComponent, Input, Popover, PopoverContent, PopoverTrigger, Tabs, TabsContent, TabsList, TabsTrigger } from '@/components'\nimport { useLocale } from '@/locales'\nimport { createImageUpload } from '@/plugins/image-upload'\n\nfunction ImageUploader(props: any) {\n const { t } = useLocale()\n\n const [link, setLink] = useState<string>('')\n const fileInput = useRef<HTMLInputElement>(null)\n\n function handleFile(event: any) {\n const files = event?.target?.files\n if (!props.editor || props.editor.isDestroyed || files.length === 0) {\n return\n }\n const file = files[0]\n const uploadOptions = props.editor.extensionManager.extensions.find(\n (extension: any) => extension.name === 'imageUpload',\n )?.options\n\n const uploadFn = createImageUpload({\n validateFn: () => {\n return true\n },\n onUpload: uploadOptions.upload,\n })\n uploadFn([file], props.editor.view, props.getPos())\n }\n function handleLink(e: any) {\n e.preventDefault()\n\n props.editor\n .chain()\n .setImage({ src: link })\n .deleteRange({ from: props.getPos(), to: props.getPos() })\n .focus()\n .run()\n }\n function handleDelete(e?: any) {\n e?.preventDefault()\n props.deleteNode()\n }\n function handleClick(e: any) {\n e.preventDefault()\n fileInput.current?.click()\n }\n\n return (\n <NodeViewWrapper className=\"richtext-p-0 richtext-m-0\" data-drag-handle>\n <Popover defaultOpen modal>\n <PopoverTrigger asChild>\n <div className=\"richtext-flex richtext-items-center richtext-w-full richtext-p-3 richtext-my-3 richtext-transition-all !richtext-border richtext-rounded-sm richtext-cursor-pointer hover:richtext-bg-accent richtext-border-border richtext-text-muted-foreground\">\n <div className=\"richtext-flex richtext-items-center richtext-justify-between richtext-w-full\">\n <div className=\"richtext-flex richtext-items-center richtext-justify-center richtext-gap-3\">\n <IconComponent name=\"ImageUp\" className=\"richtext-w-6 richtext-h-6\" />\n <span className=\"richtext-text-sm\">{t('editor.image.dialog.title')}</span>\n </div>\n <IconComponent name=\"Trash2\" className=\"hover:richtext-text-foreground\" onClick={handleDelete} />\n </div>\n </div>\n </PopoverTrigger>\n <PopoverContent className=\"richtext-w-full\" onOpenAutoFocus={e => e.preventDefault()}>\n <Tabs defaultValue=\"upload\" className=\"richtext-w-[400px]\" activationMode=\"manual\">\n <TabsList className=\"richtext-grid richtext-w-full richtext-grid-cols-2\">\n <TabsTrigger value=\"upload\">\n {t('editor.image.dialog.tab.upload')}\n {' '}\n </TabsTrigger>\n <TabsTrigger value=\"link\">\n {' '}\n {t('editor.image.dialog.tab.url')}\n {' '}\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"upload\">\n <Button className=\"richtext-w-full richtext-mt-1\" size=\"sm\" onClick={handleClick}>\n {t('editor.image.dialog.tab.upload')}\n </Button>\n <input\n type=\"file\"\n accept=\"image/*\"\n ref={fileInput}\n multiple\n style={{\n display: 'none',\n }}\n onChange={handleFile}\n />\n </TabsContent>\n <TabsContent value=\"link\">\n <form onSubmit={handleLink}>\n <div className=\"richtext-flex richtext-items-center richtext-gap-2\">\n <Input\n type=\"url\"\n autoFocus={true}\n value={link}\n onChange={e => setLink(e.target.value)}\n required\n placeholder={t('editor.image.dialog.placeholder')}\n />\n <Button type=\"submit\">{t('editor.image.dialog.button.apply')}</Button>\n </div>\n </form>\n </TabsContent>\n </Tabs>\n </PopoverContent>\n </Popover>\n </NodeViewWrapper>\n )\n}\n\nexport default ImageUploader\n","/* eslint-disable prefer-promise-reject-errors */\nimport { Plugin } from '@tiptap/pm/state'\nimport { Node, ReactNodeViewRenderer } from '@tiptap/react'\n\nimport { ActionButton } from '@/components'\nimport ImageUploader from '@/extensions/ImageUpload/components/ImageUploader'\nimport {\n UploadImagesPlugin,\n createImageUpload,\n handleImageDrop,\n handleImagePaste,\n} from '@/plugins/image-upload'\n\nexport interface ImageUploadOptions {\n upload: (file: File) => Promise<string>\n acceptMimes: string[]\n maxSize: number\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n imageUpload: {\n setImageUpload: () => ReturnType\n }\n }\n}\n\nconst DEFAULT_OPTIONS: Partial<ImageUploadOptions> = {\n acceptMimes: ['image/jpeg', 'image/gif', 'image/png', 'image/jpg'],\n maxSize: 1024 * 1024 * 5, // 5MB\n}\n\n// function formatFileSize(bytes: number): string {\n// const megabytes = bytes / 1024 / 1024\n// return `${megabytes.toFixed(2)}MB`\n// }\n\nexport const ImageUpload = Node.create<ImageUploadOptions>({\n name: 'imageUpload',\n isolating: true,\n defining: true,\n group: 'block',\n draggable: false,\n selectable: true,\n inline: false,\n\n onCreate() {\n if (typeof this.options.upload !== 'function') {\n throw new TypeError('Image upload function should be a function')\n }\n },\n\n parseHTML() {\n return [{ tag: `div[data-type=\"${this.name}\"]` }]\n },\n\n renderHTML() {\n return ['div', { 'data-type': this.name }]\n },\n\n addCommands() {\n return {\n setImageUpload:\n () =>\n ({ commands }) =>\n commands.insertContent(`<div data-type=\"${this.name}\"></div>`),\n }\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(ImageUploader)\n },\n\n addOptions() {\n return {\n ...DEFAULT_OPTIONS,\n ...this.parent?.(),\n upload: () => Promise.reject('Image Upload Function'),\n button: ({\n editor,\n extension,\n t,\n }: {\n editor: any\n extension: any\n t: (key: string) => string\n }) => ({\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.setImageUpload(),\n upload: extension.options.upload,\n /* If setImage is not available(when Image Component is not imported), the button is disabled */\n disabled: !editor.can().setImage?.({}),\n icon: 'ImageUp',\n tooltip: t('editor.image.tooltip'),\n },\n }),\n }\n },\n\n addProseMirrorPlugins() {\n // const { toast } = useToast();\n // const { t } = useLocale();\n\n const validateFile = (file: File): boolean => {\n if (!this.options.acceptMimes.includes(file.type)) {\n // toast({ description: t.value('editor.imageUpload.fileTypeNotSupported'), duration: 2000 });\n return false\n }\n if (file.size > this.options.maxSize) {\n // toast({\n // description: `${t.value('editor.imageUpload.fileSizeTooBig')} ${formatFileSize(\n // this.options.maxSize,\n // )}.`,\n // duration: 2000,\n // });\n return false\n }\n return true\n }\n\n const uploadFn = createImageUpload({\n validateFn: validateFile,\n onUpload: this.options.upload,\n })\n\n return [\n new Plugin({\n props: {\n handlePaste: (view, event) => {\n if (!event.clipboardData) {\n return false\n }\n const items = [...(event.clipboardData.items || [])]\n if (items.some(x => x.type === 'text/html')) {\n return false\n }\n return handleImagePaste(view, event, uploadFn)\n },\n handleDrop: (view, event, _, moved) => {\n if (!(event instanceof DragEvent) || !event.dataTransfer) {\n return false\n }\n handleImageDrop(view, event, moved, uploadFn)\n return false\n },\n },\n }),\n UploadImagesPlugin(),\n ]\n },\n})\n\nexport default ImageUpload\n","import { Node } from '@tiptap/core'\n\nimport { VIDEO_SIZE } from '@/constants'\nimport { getCssUnitWithDefault } from '@/utils/utils'\n\n/**\n * Represents the interface for video options, extending GeneralOptions.\n */\nexport interface VideoOptions {\n /**\n * Indicates whether fullscreen play is allowed\n *\n * @default true\n */\n allowFullscreen: boolean\n /**\n * Indicates whether to display the frameborder\n *\n * @default false\n */\n frameborder: boolean\n /**\n * Width of the video, can be a number or string\n *\n * @default VIDEO_SIZE['size-medium']\n */\n width: number | string\n /** HTML attributes object for passing additional attributes */\n HTMLAttributes: {\n [key: string]: any\n }\n upload?: (file: File) => Promise<string>\n}\n\n/**\n * Represents the type for setting video options\n */\ninterface SetVideoOptions {\n /** The source URL of the video */\n src: string\n /** The width of the video */\n width: string | number\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n video: {\n /**\n * Add an video\n */\n setVideo: (options: Partial<SetVideoOptions>) => ReturnType\n /**\n * Update an video\n */\n updateVideo: (options: Partial<SetVideoOptions>) => ReturnType\n }\n }\n}\n\nfunction linkConvert(src: string) {\n // Convert youtube links\n src = src\n .replace('https://youtu.be/', 'https://www.youtube.com/watch?v=')\n .replace('watch?v=', 'embed/')\n\n // Convert vimeo links\n src = src.replace('https://vimeo.com/', 'https://player.vimeo.com/video/')\n\n // Convert bilibili links\n const isBilibiliLink = /^https?:\\/\\/www.bilibili.com\\/video\\/.*/i.test(src)\n if (isBilibiliLink) {\n src = src\n .replace(/\\?.*$/, '')\n .replace('https://www.bilibili.com/video/', 'https://player.bilibili.com/player.html?bvid=')\n }\n\n // Convert google drive links\n if (src.includes('drive.google.com')) {\n src = src.replace('/view', '/preview')\n }\n\n return src\n}\n\nexport const Video = Node.create<VideoOptions>({\n name: 'video',\n group: 'block',\n atom: true,\n draggable: true,\n addAttributes() {\n return {\n src: {\n default: null,\n renderHTML: ({ src }) => ({\n src: src ? linkConvert(src) : null,\n }),\n },\n width: {\n default: this.options.width,\n renderHTML: ({ width }) => ({\n width: getCssUnitWithDefault(width),\n }),\n },\n frameborder: {\n default: this.options.frameborder ? 1 : 0,\n parseHTML: () => (this.options.frameborder ? 1 : 0),\n },\n allowfullscreen: {\n default: this.options.allowFullscreen,\n parseHTML: () => this.options.allowFullscreen,\n },\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'div[data-video] iframe',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n const { width = '100%' } = HTMLAttributes ?? {}\n\n const iframeHTMLAttributes = {\n ...HTMLAttributes,\n width: '100%',\n height: '100%',\n }\n\n const responsiveStyle = `position: relative;overflow: hidden;display: flex;flex: 1;max-width: ${width};`\n const responsiveSizesStyle = `flex: 1;padding-bottom: ${(9 / 16) * 100}%;`\n\n const iframeDOM = ['iframe', iframeHTMLAttributes]\n const sizesDOM = ['div', { style: responsiveSizesStyle }]\n const responsiveDOM = ['div', { style: responsiveStyle }, sizesDOM, iframeDOM]\n\n const divAttrs = {\n ...this.options.HTMLAttributes,\n 'data-video': '',\n }\n\n return ['div', divAttrs, responsiveDOM]\n },\n\n addCommands() {\n return {\n setVideo:\n options =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: options,\n })\n },\n updateVideo:\n options =>\n ({ commands }) => {\n return commands.updateAttributes(this.name, options)\n },\n }\n },\n\n addOptions() {\n return {\n divider: false,\n spacer: false,\n allowFullscreen: true,\n upload: undefined,\n frameborder: false,\n width: VIDEO_SIZE['size-medium'],\n HTMLAttributes: {\n class: 'iframe-wrapper',\n style: 'display: flex;justify-content: center;',\n },\n }\n },\n})\n","import React, { useRef, useState } from 'react'\n\nimport type { Editor } from '@tiptap/react'\nimport { NodeViewWrapper } from '@tiptap/react'\n\nimport { IconComponent } from '@/components/icons'\nimport { Button, Input, Popover, PopoverContent, PopoverTrigger, Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui'\nimport { useLocale } from '@/locales'\n\ninterface IPropsVideoUploaderView {\n editor: Editor\n getPos: () => number\n deleteNode: () => void\n}\n\nfunction VideoUploaderView(props: IPropsVideoUploaderView) {\n const { t } = useLocale()\n const { editor, getPos, deleteNode } = props\n\n const [link, setLink] = useState<string>('')\n const [loading, setLoading] = useState<boolean>(false)\n const fileInput = useRef<HTMLInputElement>(null)\n\n function handleFile(event: any) {\n setLoading(true)\n const files = event?.target?.files\n if (!editor || editor.isDestroyed || files.length === 0) {\n return\n }\n const file = files[0]\n const uploadOptions = editor.extensionManager.extensions.find(\n (extension: any) => extension.name === 'videoUpload',\n )?.options\n uploadOptions?.upload([file]).then((res: any) => {\n editor\n .chain()\n .setVideo({ src: res[0].src, width: '100%' })\n .deleteRange({ from: getPos(), to: getPos() })\n .focus()\n .run()\n setLoading(false)\n })\n }\n function handleLink(e: any) {\n e.preventDefault()\n\n editor\n .chain()\n .setVideo({\n src: link,\n width: '100%',\n })\n .deleteRange({ from: getPos(), to: getPos() })\n .focus()\n .run()\n }\n function handleDelete(e: any) {\n e.preventDefault()\n deleteNode()\n }\n function handleClick(e: any) {\n e.preventDefault()\n fileInput.current?.click()\n }\n\n return (\n <NodeViewWrapper as=\"div\" data-drag-handle>\n <Popover defaultOpen modal>\n <PopoverTrigger asChild>\n <div className=\"richtext-flex richtext-items-center richtext-w-full richtext-p-3 richtext-my-3 richtext-transition-all !richtext-border richtext-rounded-sm richtext-cursor-pointer hover:richtext-bg-accent richtext-border-border richtext-text-muted-foreground\">\n {loading\n ? (\n <div className=\"richtext-flex richtext-items-center richtext-justify-center richtext-gap-3 richtext-text-sm\">\n <IconComponent className=\"richtext-w-6 richtext-h-6 richtext-animate-spin\" name=\"LoaderCircle\" />\n <span>\n {t('editor.video.dialog.uploading')}\n ...\n </span>\n </div>\n )\n : (\n <div className=\"richtext-flex richtext-items-center richtext-justify-between richtext-w-full\">\n <div className=\"richtext-flex richtext-items-center richtext-justify-center richtext-gap-3\">\n <IconComponent name=\"Video\" className=\"richtext-w-6 richtext-h-6\" />\n <span className=\"richtext-text-sm\">{t('editor.video.dialog.title')}</span>\n </div>\n <IconComponent name=\"Trash2\" className=\"hover:richtext-text-foreground\" onClick={handleDelete} />\n </div>\n )}\n </div>\n </PopoverTrigger>\n <PopoverContent className=\"richtext-w-full\" onOpenAutoFocus={e => e.preventDefault()}>\n <Tabs defaultValue=\"upload\" className=\"richtext-w-[400px]\" activationMode=\"manual\">\n <TabsList className=\"richtext-grid richtext-w-full richtext-grid-cols-2\">\n <TabsTrigger value=\"upload\">\n {t('editor.video.dialog.tab.upload')}\n {' '}\n </TabsTrigger>\n <TabsTrigger value=\"link\">\n {' '}\n {t('editor.video.dialog.link')}\n {' '}\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"upload\">\n <Button className=\"richtext-w-full richtext-mt-1\" size=\"sm\" onClick={handleClick}>\n {t('editor.video.dialog.tab.upload')}\n </Button>\n <input\n type=\"file\"\n accept=\"video/*\"\n ref={fileInput}\n multiple\n style={{\n display: 'none',\n }}\n onChange={handleFile}\n />\n </TabsContent>\n <TabsContent value=\"link\">\n <form onSubmit={handleLink}>\n <div className=\"richtext-flex richtext-items-center richtext-gap-2\">\n <Input\n type=\"url\"\n autoFocus={true}\n required\n placeholder={t('editor.video.dialog.placeholder')}\n value={link}\n onChange={e => setLink(e.target.value)}\n />\n <Button type=\"submit\">{t('editor.video.dialog.button.apply')}</Button>\n </div>\n </form>\n </TabsContent>\n </Tabs>\n </PopoverContent>\n </Popover>\n </NodeViewWrapper>\n )\n}\n\nexport default VideoUploaderView\n","import { Node } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\n\nimport { ActionButton } from '@/components'\nimport VideoUploaderView from '@/extensions/VideoUpload/components/VideoUploaderView'\n\nexport interface VideoOptions {\n upload?: (files: File[]) => void\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n videoUpload: {\n setVideoUpload: () => ReturnType\n }\n }\n}\n\nexport const VideoUpload = Node.create<VideoOptions>({\n name: 'videoUpload',\n isolating: true,\n defining: true,\n group: 'block',\n draggable: true,\n selectable: true,\n inline: false,\n parseHTML() {\n return [\n {\n tag: `div[data-type=\"${this.name}\"]`,\n },\n ]\n },\n renderHTML() {\n return ['div', { 'data-type': this.name }]\n },\n\n addCommands() {\n return {\n setVideoUpload:\n () =>\n ({ commands }) =>\n commands.insertContent(`<div data-type=\"${this.name}\"></div>`),\n }\n },\n addNodeView() {\n return ReactNodeViewRenderer(VideoUploaderView)\n },\n addOptions() {\n return {\n ...this.parent?.(),\n upload: undefined,\n button: ({ editor, t }: any) => {\n return {\n component: ActionButton,\n componentProps: {\n action: () => editor.commands.setVideoUpload(),\n isActive: () => editor.isActive('video') || false,\n /* If setVideo is not available(when Video Component is not imported), the button is disabled */\n disabled: !editor.can().setVideo?.({}),\n icon: 'Video',\n tooltip: t('editor.video.tooltip'),\n },\n }\n },\n }\n },\n})\n\nexport default VideoUpload\n","import type { Command } from '@tiptap/core'\nimport { Extension } from '@tiptap/core'\nimport type { Transaction } from '@tiptap/pm/state'\nimport { CellSelection } from '@tiptap/pm/tables'\n\nexport interface TableCellBackgroundOptions {\n HTMLAttributes: Record<string, any>\n types?: any\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n tableCellBackground: {\n setTableCellBackground: (color: string) => ReturnType\n unsetTableCellBackground: () => ReturnType\n }\n }\n}\n\nexport function setCellBackgroundMarkup(tr: Transaction, pos: number, backgroundColor: string): Transaction {\n if (!tr.doc) {\n return tr\n }\n\n const node = tr.doc.nodeAt(pos)\n if (!node) {\n return tr\n }\n\n if (backgroundColor === node.attrs.backgroundColor) {\n return tr\n }\n\n const nodeAttrs = {\n ...node.attrs,\n backgroundColor,\n }\n\n return tr.setNodeMarkup(pos, node.type, nodeAttrs, node.marks)\n}\n\nexport function updateCellBackground(tr: Transaction, options: TableCellBackgroundOptions, backgroundColor: string): Transaction {\n const { doc, selection } = tr\n\n if (!doc || !selection || !(selection instanceof CellSelection)) {\n return tr\n }\n\n selection.forEachCell((node, pos) => {\n tr = setCellBackgroundMarkup(tr, pos, backgroundColor)\n })\n\n return tr\n}\n\nexport function createCellBackgroundCommand(backgroundColor: string, options: TableCellBackgroundOptions): Command {\n return ({ tr, state, dispatch }) => {\n const { selection } = state\n tr = tr.setSelection(selection)\n tr = updateCellBackground(tr, options, backgroundColor)\n\n if (tr.docChanged) {\n dispatch?.(tr)\n return true\n }\n\n return false\n }\n}\n\n// @ts-ignore\nexport const TableCellBackground = Extension.create<TableCellBackgroundOptions>({\n name: 'tableCellBackground',\n addOptions() {\n return {\n types: ['tableCell'],\n HTMLAttributes: {},\n }\n },\n\n addGlobalAttributes() {\n return [\n {\n types: this.options.types,\n attributes: {\n backgroundColor: {\n parseHTML: (element) => {\n return element.style.backgroundColor || ''\n },\n renderHTML: (attributes) => {\n if (!attributes.backgroundColor || attributes.backgroundColor === '') {\n return {}\n }\n else {\n return {\n style: `background-color: ${attributes.backgroundColor}`,\n }\n }\n },\n },\n },\n },\n ]\n },\n addCommands() {\n return {\n setTableCellBackground: (backgroundColor: string) =>\n createCellBackgroundCommand(backgroundColor, this.options),\n unsetTableCellBackground: () => createCellBackgroundCommand('', this.options),\n }\n },\n})\n","/* eslint-disable regexp/optimal-quantifier-concatenation */\n/* eslint-disable regexp/no-misleading-capturing-group */\n/* eslint-disable regexp/no-super-linear-backtracking */\n/* eslint-disable regexp/no-unused-capturing-group */\ninterface HttpRequestHeadersInterfaceMock {\n [id: string]: string | string[] | undefined\n}\n\ninterface HttpRequestInterfaceMock {\n headers: HttpRequestHeadersInterfaceMock\n [id: string]: any\n}\n\nexport interface IsMobileOptions {\n ua?: string | HttpRequestInterfaceMock\n tablet?: boolean\n featureDetect?: boolean\n}\n\nconst mobileRE\n = /(android|bb\\d+|meego).+mobile|armv7l|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series[46]0|samsungbrowser.*mobile|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i\nconst notMobileRE = /CrOS/\nconst tabletRE = /android|ipad|playbook|silk/i\n\n/**\n * Determines if the current device is a mobile or tablet device.\n * @param opts - Options for the detection.\n * @returns `true` if the device is mobile or tablet, `false` otherwise.\n */\nexport function isMobile(opts: IsMobileOptions = {}): boolean {\n let ua = opts.ua || (typeof navigator !== 'undefined' && navigator.userAgent)\n\n if (ua && typeof ua === 'object' && ua.headers && typeof ua.headers['user-agent'] === 'string') {\n ua = ua.headers['user-agent']\n }\n\n if (typeof ua !== 'string') {\n return false\n }\n\n if (mobileRE.test(ua) && !notMobileRE.test(ua)) {\n return true\n }\n\n if (opts.tablet && tabletRE.test(ua)) {\n return true\n }\n\n if (\n opts.tablet\n && opts.featureDetect\n && navigator\n && navigator.maxTouchPoints > 1\n && ua.includes('Macintosh')\n && ua.includes('Safari')\n ) {\n return true\n }\n\n return false\n}\n","import React, { useState } from 'react'\n\nimport { Popover, PopoverContent, PopoverTrigger } from '@/components'\nimport {\n TABLE_DEFAULT_SELECTED_GRID_SIZE,\n TABLE_INIT_GRID_SIZE,\n TABLE_MAX_GRID_SIZE,\n} from '@/constants'\nimport { isMobile } from '@/utils/is-mobile'\n\nconst createArray = (length: number) => Array.from({ length }).map((_, index) => index + 1)\n\ninterface IPropsCreateTablePopover {\n createTable: any\n children: any\n}\n\nexport interface GridSize {\n rows: number\n cols: number\n}\n\nexport interface CreateTablePayload extends GridSize {\n withHeaderRow: boolean\n}\n\nfunction CreateTablePopover(props: IPropsCreateTablePopover) {\n const [withHeaderRow, setWithHeaderRow] = useState<boolean>(true)\n const [tableGridSize, setTableGridSize] = useState<GridSize>({\n rows: isMobile() ? TABLE_MAX_GRID_SIZE : TABLE_INIT_GRID_SIZE,\n cols: isMobile() ? TABLE_MAX_GRID_SIZE : TABLE_INIT_GRID_SIZE,\n })\n\n const [selectedTableGridSize, setSelectedTableGridSize] = useState<GridSize>({\n rows: TABLE_DEFAULT_SELECTED_GRID_SIZE,\n cols: TABLE_DEFAULT_SELECTED_GRID_SIZE,\n })\n\n function selectTableGridSize(rows: number, cols: number): void {\n if (rows === tableGridSize.rows) {\n setTableGridSize((prev) => {\n return {\n ...prev,\n rows: Math.min(rows + 1, TABLE_MAX_GRID_SIZE),\n }\n })\n }\n\n if (cols === tableGridSize.cols) {\n setTableGridSize((prev) => {\n return {\n ...prev,\n cols: Math.min(cols + 1, TABLE_MAX_GRID_SIZE),\n }\n })\n }\n\n setSelectedTableGridSize({\n rows,\n cols,\n })\n }\n\n function onMouseDown(rows: number, cols: number) {\n props?.createTable({ rows, cols, withHeaderRow })\n resetTableGridSize()\n }\n\n function resetTableGridSize(): void {\n setWithHeaderRow(false)\n\n setTableGridSize({\n rows: TABLE_INIT_GRID_SIZE,\n cols: TABLE_INIT_GRID_SIZE,\n })\n\n setSelectedTableGridSize({\n rows: TABLE_DEFAULT_SELECTED_GRID_SIZE,\n cols: TABLE_DEFAULT_SELECTED_GRID_SIZE,\n })\n }\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n {props?.children}\n </PopoverTrigger>\n <PopoverContent className=\"richtext-w-full !richtext-p-2\" align=\"start\" side=\"bottom\">\n <div className=\"richtext-p-0 table-grid-size-editor\">\n <div className=\"richtext-flex richtext-flex-col richtext-flex-wrap richtext-justify-between richtext-gap-1\">\n {createArray(tableGridSize?.rows)?.map((row: any) => {\n return (\n <div key={`r-${row}`} className=\"richtext-flex richtext-gap-1\">\n {createArray(tableGridSize?.cols)?.map((col: any) => {\n return (\n <div\n key={`c-${col}`}\n className={`richtext-cursor-pointer richtext-border-border ${\n col <= selectedTableGridSize.cols\n && row <= selectedTableGridSize.rows\n && '!richtext-bg-foreground tableCellActive'\n }`}\n onMouseOver={() => selectTableGridSize(row, col)}\n onMouseDown={() => onMouseDown(row, col)}\n >\n <div className=\"richtext-w-4 richtext-h-4 richtext-p-1 !richtext-border richtext-rounded-[2px] richtext-box-border richtext-border-solid !richtext-border-border\"></div>\n </div>\n )\n })}\n </div>\n )\n })}\n </div>\n <div className=\"richtext-mt-2 richtext-text-sm richtext-text-center richtext-text-zinc-600\">\n {selectedTableGridSize.rows}\n {' '}\n x\n {selectedTableGridSize.cols}\n </div>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\nexport default CreateTablePopover\n","import React from 'react'\n\nimport { ActionButton } from '@/components'\nimport CreateTablePopover from '@/extensions/Table/components/CreateTablePopover'\nimport type { ButtonViewReturnComponentProps } from '@/types'\n\ninterface IPropsTableActionButton {\n editor: any\n icon?: any\n tooltip?: string\n disabled?: boolean\n color?: string\n action?: ButtonViewReturnComponentProps['action']\n isActive?: ButtonViewReturnComponentProps['isActive']\n}\n\nfunction TableActionButton(props: IPropsTableActionButton) {\n function createTable(options: any) {\n if (!props.disabled) {\n props.editor\n .chain()\n .focus()\n .insertTable({ ...options, withHeaderRow: false })\n .run()\n }\n }\n\n return (\n <CreateTablePopover createTable={createTable}>\n <ActionButton\n icon={props?.icon}\n tooltip={props?.tooltip}\n disabled={props?.disabled}\n color={props?.color}\n action={props?.action}\n isActive={props?.isActive}\n />\n </CreateTablePopover>\n )\n}\n\nexport default TableActionButton\n","import TiptapTable from '@tiptap/extension-table'\nimport { TableCell } from '@tiptap/extension-table-cell'\nimport type { TableCellOptions } from '@tiptap/extension-table-cell'\nimport { TableHeader } from '@tiptap/extension-table-header'\nimport type { TableHeaderOptions } from '@tiptap/extension-table-header'\nimport { TableRow } from '@tiptap/extension-table-row'\nimport type { TableRowOptions } from '@tiptap/extension-table-row'\n\nimport type { TableCellBackgroundOptions } from './cell-background'\nimport { TableCellBackground } from './cell-background'\nimport TableActionButton from '@/extensions/Table/components/TableActionButton'\nimport type { GeneralOptions } from '@/types'\n\nexport interface TableOptions extends GeneralOptions<TableOptions> {\n HTMLAttributes: Record<string, any>\n resizable: boolean\n handleWidth: number\n cellMinWidth: number\n lastColumnResizable: boolean\n allowTableNodeSelection: boolean\n /** options for table rows */\n tableRow: Partial<TableRowOptions>\n /** options for table headers */\n tableHeader: Partial<TableHeaderOptions>\n /** options for table cells */\n tableCell: Partial<TableCellOptions>\n /** options for table cell background */\n tableCellBackground: Partial<TableCellBackgroundOptions>\n}\nexport const Table = TiptapTable.extend<TableOptions>({\n addOptions() {\n return {\n ...this.parent?.(),\n resizable: true,\n lastColumnResizable: true,\n allowTableNodeSelection: false,\n button: ({ editor, t }: any) => ({\n component: TableActionButton,\n componentProps: {\n disabled: editor.isActive('table') || false,\n icon: 'Table',\n tooltip: t('editor.table.tooltip'),\n editor,\n },\n }),\n }\n },\n\n addExtensions() {\n return [\n TableRow.configure(this.options.tableRow),\n TableHeader.configure(this.options.tableHeader),\n TableCell.configure(this.options.tableCell),\n TableCellBackground.configure(this.options.tableCellBackground),\n ]\n },\n})\n\nexport default Table\n","import { Extension } from '@tiptap/core'\nimport type { Mark } from '@tiptap/pm/model'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\n\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\n/**\n * Represents the interface for font size options, extending GeneralOptions.\n */\nexport interface FormatPainterOptions extends GeneralOptions<FormatPainterOptions> {}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n painter: {\n setPainter: (marks: Mark[]) => ReturnType\n }\n }\n}\n\nexport interface PainterAction {\n type: 'start' | 'end'\n marks: Mark[]\n}\n/**\n * 格式刷\n */\nexport const FormatPainter = Extension.create<FormatPainterOptions>({\n name: 'painter',\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, t }) => ({\n component: ActionButton,\n componentProps: {\n action: () => {\n editor.commands.setPainter(editor?.state.selection.$head.marks() as Mark[])\n },\n icon: 'PaintRoller',\n tooltip: t('editor.format'),\n },\n }),\n }\n },\n addCommands() {\n return {\n setPainter:\n (marks: Mark[]) =>\n ({\n view: {\n dispatch,\n state: { tr },\n dom,\n },\n }) => {\n const svgCursor\n = '<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"#000\" d=\"M9 22v-6H4V7q0-1.65 1.175-2.825T8 3h12v13h-5v6zM6 10h12V5h-1v4h-2V5h-1v2h-2V5H8q-.825 0-1.412.588T6 7zm0 4h12v-2H6zm0 0v-2z\"/></svg>'\n const encodedSvg = encodeURIComponent(svgCursor)\n const cursorUrl = `url(\"data:image/svg+xml;utf8,${encodedSvg}\"), auto`\n\n dom.style.cursor = cursorUrl\n dispatch(tr.setMeta('painterAction', { type: 'start', marks }))\n return true\n },\n }\n },\n\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: new PluginKey('format-painter'),\n state: {\n init: () => [] as Mark[],\n apply: (tr, set) => {\n const action = tr.getMeta('painterAction') as PainterAction\n if (action && action.type === 'start') {\n set = action.marks\n }\n else if (action && action.type === 'end') {\n set = []\n }\n return set\n },\n },\n props: {\n handleDOMEvents: {\n mousedown(view, _) {\n const marks = this.getState(view.state) as Mark[]\n if (!marks || marks.length === 0) {\n view.dom.style.cursor = ''\n return false // 如果没有标记,则不执行任何操作\n }\n const mouseup = () => {\n document.removeEventListener('mouseup', mouseup)\n\n let {\n dispatch,\n state: { tr, selection },\n dom,\n } = view as any\n dom.style.cursor = ''\n\n tr = tr.removeMark(selection.from, selection.to)\n for (const mark of marks) {\n if (mark.type.name !== 'link') {\n tr = tr.addMark(selection.from, selection.to, mark)\n }\n }\n\n dispatch(tr.setMeta('painterAction', { type: 'end' }))\n }\n document.addEventListener('mouseup', mouseup)\n return true\n },\n },\n },\n }),\n ]\n },\n})\n","interface ServiceType {\n label: string\n value: string\n icon: any\n}\nexport const VideoServices: ServiceType[] = [\n { label: '优酷', value: 'youku', icon: 'Youku' },\n {\n label: '哔哩哔哩',\n value: 'bilibili',\n icon: 'BiliBili',\n },\n {\n label: '腾讯视频',\n value: 'qqvideo',\n icon: 'QQVideo',\n },\n]\n\nexport const MapServices: ServiceType[] = [\n { label: '高德地图', value: 'amap', icon: 'Gaode' },\n { label: '百度地图', value: 'baidu_map', icon: 'Baidu' },\n]\n\nexport const DesignServices: ServiceType[] = [\n { label: '墨刀', value: 'modao', icon: 'Modao' },\n { label: '蓝湖', value: 'lanhu', icon: 'Lanhu' },\n { label: 'Figma', value: 'figma', icon: 'Figma' },\n { label: 'Canva', value: 'canva', icon: 'Canva' },\n { label: 'ProcessOn', value: 'processon', icon: 'Processon' },\n]\n\nexport const DevelopServices: ServiceType[] = [\n { label: 'CodePen', value: 'codepen', icon: 'Codepen' },\n]\n\nexport const DataServices: ServiceType[] = [\n { label: '金数据', value: 'jinshuju', icon: 'Jinshuju' },\n]\n\nexport const OtherServices = []\n\nexport const AllEmbedServices = [\n ...VideoServices,\n ...MapServices,\n ...DesignServices,\n ...DevelopServices,\n ...DataServices,\n ...OtherServices,\n]\n\nexport function getEmbedService(value: any) {\n for (const item of AllEmbedServices) {\n if (item.value === value) {\n return item\n }\n }\n\n return {}\n}\n\n/**\n * Embed service link\n * @id source id\n * @exmplae example link\n * @src source src, used in iframe\n */\nexport const EmbedServiceLink: any = {\n youtube: {\n example: 'https://www.youtube.com/watch?v=I4sMhHbHYXM',\n src: 'https://www.youtube.com/embed/I4sMhHbHYXM',\n srcPrefix: 'https://www.youtube.com/embed',\n linkRule: [\n /(?:https?:\\/\\/)?(?:www\\.)?(?:youtube\\.com\\/(?:[^\\s/]+\\/\\S+\\/|(?:v|e(?:mbed)?)\\/|\\S*?[&?]v=)|youtu\\.be\\/)([\\w-]{11})/,\n ],\n },\n youku: {\n example:\n 'https://v.youku.com/v_show/id_XNDM0NDM4MTcy.html?spm=a2h0c.8166622.PhoneSokuUgc_4.dtitle',\n src: 'https://player.youku.com/embed/XNDM0NDM4MTcy',\n srcPrefix: 'https://player.youku.com/embed',\n linkRule: ['v.youku.com\\\\/v_show\\\\/id_\\\\w+\\\\=*'],\n idRule: 'id_\\\\w+\\\\=*',\n },\n bilibili: {\n example: 'https://www.bilibili.com/video/BV1EJ411u7DN',\n src: 'https://player.bilibili.com/player.html?bvid=BV1EJ411u7DN',\n srcPrefix: 'https://player.bilibili.com/player.html?bvid',\n linkRule: ['www.bilibili.com\\\\/video\\\\/\\\\w+'],\n },\n qqvideo: {\n example: 'https://v.qq.com/x/cover/mzc0020006aw1mn/u0033nvzb5v.html',\n src: 'https://v.qq.com/txp/iframe/player.html?vid=u0033nvzb5v',\n srcPrefix: 'https://v.qq.com/txp/iframe/player.html?vid',\n linkRule: ['v.qq.com\\\\/x\\\\/cover\\\\/\\\\w+\\\\/\\\\w+'],\n },\n amap: {\n example: 'https://ditu.amap.com/',\n src: 'https://www.amap.com/place/B000A45467',\n srcPrefix: '',\n linkRule: ['\\\\.amap\\\\.com'],\n },\n baidu_map: {\n example: 'https://j.map.baidu.com/15/fo',\n src: 'https://j.map.baidu.com/15/fo',\n srcPrefix: '',\n linkRule: ['map\\\\.baidu\\\\.com'],\n },\n modao: {\n example:\n 'https://free.modao.cc/app/2cd26580a6717a147454df7470e7ec464093cba3/embed/v2#screen=sk71k6d1dfxulzx',\n src: 'https://free.modao.cc/app/6UkpAxcGE3nPz52GLqhnOZgC7MATBSy/embed/v2',\n srcPrefix: '',\n linkRule: ['https:\\\\/\\\\/\\\\w+.modao.cc\\\\/app\\\\/\\\\w+\\\\/embed\\\\/v2'],\n tips: 'Modao > More > Share > Embed > COPY',\n },\n lanhu: {\n example: 'https://lanhuapp.com/link/#/invite?sid=evP7L',\n src: 'https://lanhuapp.com/url/evP7L',\n srcPrefix: '',\n linkRule: ['https:\\\\/\\\\/lanhuapp.com\\\\/url\\\\/\\\\w+'],\n tips: 'Lanhu > Project > Share > Copy Link',\n },\n figma: {\n example: 'https://www.figma.com/file/aS9uSgPXoNpaPkzbjNcK8v/Demo?node-id=0%3A1',\n src: 'https://www.figma.com/file/aS9uSgPXoNpaPkzbjNcK8v/Demo?node-id=0%3A1',\n srcPrefix: 'https://www.figma.com/embed?embed_host=share&url',\n linkRule: ['https:\\\\/\\\\/www.figma.com\\\\/file\\\\/\\\\w+'],\n },\n canva: {\n example: 'https://www.canva.cn/design/DAD61-t29UI/view',\n src: 'https://www.canva.cn/design/DAD61-t29UI/view',\n srcPrefix: '',\n linkRule: ['https:\\\\/\\\\/www.canva.cn\\\\/design\\\\/.+\\\\/view'],\n },\n processon: {\n example: 'https://www.processon.com/embed/5ea99d8607912948b0e6fe78',\n src: 'https://www.processon.com/embed/5ea99d8607912948b0e6fe78',\n srcPrefix: '',\n linkRule: ['https:\\\\/\\\\/www.processon.com\\\\/embed\\\\/\\\\w+'],\n },\n codepen: {\n example: 'https://codepen.io/mekery/embed/YzyrKOJ',\n src: 'https://codepen.io/mekery/embed/YzyrKOJ',\n srcPrefix: '',\n linkRule: ['https:\\\\/\\\\/codepen.io\\\\/.+\\\\/embed\\\\/\\\\w+'],\n },\n jinshuju: {\n example: 'https://jinshuju.net/f/q9YvVf',\n src: 'https://jinshuju.net/f/q9YvVf',\n srcPrefix: '',\n linkRule: ['https:\\\\/\\\\/jinshuju.net\\\\/f\\\\/\\\\w+'],\n },\n iframe: {\n example: 'https://v.youku.com/v_show/id_XNDM0NDM4MTcy.html',\n src: 'https://player.youku.com/embed/XNDM0NDM4MTcy',\n srcPrefix: '',\n linkRule: ['.+'],\n },\n googlemaps: {\n example: 'https://goo.gl/maps/8Ys8b4K1ZJY2',\n src: 'https://www.google.com/maps/embed?pb=https://goo.gl/maps/8Ys8b4K1ZJY2',\n srcPrefix: '',\n linkRule: ['https:\\\\/\\\\/goo.gl\\\\/maps\\\\/\\\\w+'],\n },\n}\n\nfunction getYoutubeSrc(result: any) {\n const link = EmbedServiceLink.youtube\n const url = result.matchedUrl\n result.validLink = true\n\n const splits = url.split('=')\n const len = splits.length\n if (len > 0) {\n const id = splits[len - 1]\n result.src = `${link.srcPrefix}/${id}`\n result.validId = true\n }\n\n return result\n}\n\nfunction getYoukuSrc(result: any) {\n const link = EmbedServiceLink.youku as any\n const url = result.matchedUrl\n\n const idRule = link.idRule\n const regex = new RegExp(idRule)\n const match = url.match(regex)\n if (match && match.length > 0) {\n const id = match[0].slice(3)\n\n result.validId = true\n result.src = `${link.srcPrefix}/${id}`\n }\n else {\n result.validId = false\n }\n\n return result\n}\n\nfunction getBilibiliSrc(result: any) {\n const link = EmbedServiceLink.bilibili\n const url = result.matchedUrl\n\n const splits = url.split('/')\n const len = splits.length\n if (len > 0) {\n const id = splits[len - 1]\n result.src = `${link.srcPrefix}=${id}`\n result.validId = true\n }\n\n return result\n}\n\nfunction getQQVideoSrc(result: any) {\n const link = EmbedServiceLink.qqvideo\n const url = result.matchedUrl\n\n const splits = url.split('/')\n const len = splits.length\n if (len > 0) {\n const id = splits[len - 1]\n result.src = `${link.srcPrefix}=${id}`\n result.validId = true\n }\n\n return result\n}\n\nfunction getAMapSrc(originalLink: any, result: any) {\n result.src = originalLink\n result.validId = true\n\n return result\n}\n\nfunction getBaiduMapSrc(originalLink: any, result: any) {\n result.src = originalLink\n result.validId = true\n\n return result\n}\n\nfunction getGoogleMapSrc(originalLink: any, result: any) {\n result.src = originalLink\n result.validId = true\n result.originalLink = originalLink\n\n return result\n}\n\nfunction getModaoSrc(result: any) {\n result.src = result.matchedUrl\n result.validId = true\n result.originalLink = result.src\n\n return result\n}\n\nfunction getLanhuSrc(result: any) {\n result.src = result.matchedUrl\n result.validId = true\n result.originalLink = result.src\n\n return result\n}\n\nfunction getFigmaSrc(result: any) {\n const link = EmbedServiceLink.figma\n result.src = `${link.srcPrefix}=${encodeURIComponent(result.matchedUrl)}`\n result.validId = true\n result.originalLink = result.matchedUrl\n\n return result\n}\n\nfunction getCanvaSrc(originalLink: any, result: any) {\n result.src = `${result.matchedUrl}?embed`\n result.validId = true\n result.originalLink = originalLink\n\n return result\n}\n\nfunction getProcessonSrc(originalLink: any, result: any) {\n result.src = `${result.matchedUrl}`\n result.validId = true\n result.originalLink = originalLink\n\n return result\n}\n\nfunction getCodepenSrc(result: any) {\n result.src = `${result.matchedUrl}`\n result.validId = true\n result.originalLink = result.src\n\n return result\n}\n\nfunction getJinshujuSrc(originalLink: any, result: any) {\n result.src = `${result.matchedUrl}?background=white&banner=show&embedded=true`\n result.validId = true\n result.originalLink = originalLink\n\n return result\n}\n\nfunction getCommonSrc(originalLink: any, result: any) {\n result.src = `${result.matchedUrl}`\n result.validId = true\n result.originalLink = originalLink\n\n return result\n}\n\nfunction getMatchedUrl(service: any, originalLink: any, result: any) {\n if (service === 'googlemaps') {\n result.validLink = true\n result.matchedUrl = originalLink\n return result\n }\n\n const link = EmbedServiceLink[service]\n const linkRule = link.linkRule\n\n for (const rule of linkRule) {\n const regex = new RegExp(rule)\n const match = originalLink.match(regex)\n if (match && match.length > 0) {\n result.validLink = true\n result.matchedUrl = service === 'youtube' ? match[1] : match[0]\n\n return result\n }\n }\n\n return result\n}\n\nexport function getExampleUrl(service: string) {\n let exampleUrl = ''\n const link = EmbedServiceLink[service]\n if (link) {\n exampleUrl = link.example\n }\n return exampleUrl\n}\n\nfunction formatUrl(url: string) {\n let service = 'iframe'\n\n if (url.includes?.('youtube') || url.includes?.('youtu.be')) {\n service = 'youtube'\n }\n\n if (url.includes('youku')) {\n service = 'youku'\n }\n\n if (url.includes('bilibili')) {\n service = 'bilibili'\n }\n\n if (url.includes('qq')) {\n service = 'qqvideo'\n }\n\n if (url.includes('amap')) {\n service = 'amap'\n }\n\n if (url.includes('map.baidu')) {\n service = 'baidu_map'\n }\n\n if (url.includes('google.com/maps') || url.includes('maps.app.goo.gl')) {\n service = 'googlemaps'\n }\n\n if (url.includes('modao')) {\n service = 'modao'\n }\n\n if (url.includes('lanhuapp')) {\n service = 'lanhu'\n }\n\n if (url.includes('figma')) {\n service = 'figma'\n }\n\n if (url.includes('canva')) {\n service = 'canva'\n }\n\n if (url.includes('processon')) {\n service = 'processon'\n }\n\n if (url.includes('codepen')) {\n service = 'codepen'\n }\n\n if (url.includes('jinshuju')) {\n service = 'jinshuju'\n }\n\n if (url.includes('iframe')) {\n service = 'iframe'\n }\n\n return service\n}\n\nexport function getServiceSrc(originalLink: any) {\n let result = {\n validLink: false,\n validId: false,\n matchedUrl: '',\n originalLink,\n src: '',\n }\n\n const service = formatUrl(originalLink)\n\n // matched url\n result = getMatchedUrl(service, originalLink, result)\n\n if (!result.validLink) {\n return result\n }\n\n // src\n switch (service) {\n case 'youtube': {\n return getYoutubeSrc(result)\n }\n case 'youku': {\n return getYoukuSrc(result)\n }\n case 'bilibili': {\n return getBilibiliSrc(result)\n }\n case 'qqvideo': {\n return getQQVideoSrc(result)\n }\n case 'amap': {\n return getAMapSrc(originalLink, result)\n }\n case 'baidu_map': {\n return getBaiduMapSrc(originalLink, result)\n }\n case 'googlemaps': {\n return getGoogleMapSrc(originalLink, result)\n }\n case 'modao': {\n return getModaoSrc(result)\n }\n case 'lanhu': {\n return getLanhuSrc(result)\n }\n case 'figma': {\n return getFigmaSrc(result)\n }\n case 'canva': {\n return getCanvaSrc(originalLink, result)\n }\n case 'processon': {\n return getProcessonSrc(originalLink, result)\n }\n case 'codepen': {\n return getCodepenSrc(result)\n }\n case 'jinshuju': {\n return getJinshujuSrc(originalLink, result)\n }\n case 'iframe': {\n return getCommonSrc(originalLink, result)\n }\n }\n\n return result\n}\n","import React, { useState } from 'react'\n\nimport { NodeViewWrapper } from '@tiptap/react'\n\nimport { Button, Input } from '@/components'\nimport { getServiceSrc } from '@/extensions/Iframe/embed'\n\nfunction IframeNodeView(props: any) {\n const [originalLink, setOriginalLink] = useState<string>('')\n\n function handleConfirm() {\n if (!originalLink) {\n return\n }\n\n const result = getServiceSrc(originalLink)\n if (result.validLink && result.validId) {\n props.updateAttributes({ src: result.src })\n }\n }\n\n return (\n\n <NodeViewWrapper as=\"section\">\n {!props?.node?.attrs?.src && (\n <div className=\"richtext-max-w-[600px] richtext-mx-[auto] richtext-my-[12px] richtext-flex richtext-items-center richtext-justify-center richtext-gap-[10px] richtext-p-[10px] richtext-border-[1px] richtext-border-solid richtext-border-[#ccc] richtext-rounded-[12px]\">\n <Input\n value={originalLink}\n onInput={(e: any) => setOriginalLink(e.target.value)}\n type=\"url\"\n className=\"richtext-flex-1\"\n autoFocus\n placeholder=\"Enter link\"\n />\n <Button className=\"richtext-w-[60px]\" onClick={handleConfirm}>\n OK\n </Button>\n </div>\n )}\n {props?.node?.attrs?.src && (\n <iframe\n src={props?.node?.attrs?.src}\n frameBorder=\"0\"\n allowFullScreen={true}\n title={props?.node?.attrs?.src}\n className=\"richtext-my-[12px]\"\n >\n </iframe>\n )}\n </NodeViewWrapper>\n )\n}\n\nexport default IframeNodeView\n","import { Node } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\n\nimport { ActionButton } from '@/components'\nimport IframeNodeView from '@/extensions/Iframe/components/IframeNodeView'\nimport type { GeneralOptions } from '@/types'\n\nexport interface IframeOptions extends GeneralOptions<IframeOptions> {\n allowFullscreen: boolean\n HTMLAttributes: {\n [key: string]: any\n }\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n iframe: {\n /**\n * Add an iframe\n */\n setIframe: (options: { src: string, service: string }) => ReturnType\n }\n }\n}\n\nexport const Iframe = Node.create<IframeOptions>({\n name: 'iframes',\n group: 'block',\n atom: true,\n addOptions() {\n return {\n ...this.parent?.(),\n allowFullscreen: true,\n HTMLAttributes: {\n class: 'iframe-wrapper',\n },\n button: ({\n editor,\n extension,\n t,\n }: {\n editor: any\n extension: any\n t: (key: string) => string\n }) => ({\n component: ActionButton,\n componentProps: {\n action: (options: { src: string, service: string }) => editor.commands.setIframe(options),\n upload: extension.options.upload,\n disabled: !editor.can().setIframe({}),\n icon: 'Iframe',\n tooltip: t('editor.iframe.tooltip'),\n },\n }),\n }\n },\n addAttributes() {\n return {\n src: {\n default: null,\n },\n service: {\n default: null,\n },\n frameborder: {\n default: 0,\n },\n allowfullscreen: {\n default: this.options.allowFullscreen,\n parseHTML: () => this.options.allowFullscreen,\n },\n }\n },\n parseHTML() {\n return [\n {\n tag: 'iframe',\n },\n ]\n },\n renderHTML({ HTMLAttributes }) {\n return ['div', this.options.HTMLAttributes, ['iframe', HTMLAttributes]]\n },\n addNodeView() {\n return ReactNodeViewRenderer(IframeNodeView)\n },\n addCommands() {\n return {\n setIframe:\n (options: { src: string, service: string }) =>\n ({ tr, dispatch }) => {\n const { selection } = tr\n const node = this.type.create(options)\n\n if (dispatch) {\n tr.replaceRangeWith(selection.from, selection.to, node)\n }\n return true\n },\n }\n },\n})\n","import React, { useEffect, useState } from 'react'\nimport deepEqual from 'deep-equal'\nimport { ActionButton, Button, IconComponent, Input, Label, Popover, PopoverContent, PopoverTrigger } from '@/components'\nimport { useLocale } from '@/locales'\nimport { ON_SEARCH_RESULTS, SearchAndReplace } from '@/extensions/SearchAndReplace/SearchAndReplace'\n\nfunction SearchAndReplaceButton({ editor, ...props }: any) {\n const { t } = useLocale()\n\n const [currentIndex, setCurrentIndex] = useState(-1)\n const [results, setResults] = useState([])\n const [searchValue, setSearchValue] = useState('')\n const [replaceValue, setReplaceValue] = useState('')\n const [visible, setVisible] = useState(false)\n\n useEffect(() => {\n if (!visible) {\n setSearchValue('')\n setReplaceValue('')\n setCurrentIndex(-1)\n setResults([])\n\n editor.commands.setSearchTerm('')\n editor.commands.setReplaceTerm('')\n }\n }, [editor, visible])\n\n useEffect(() => {\n if (!visible)\n return\n if (editor && editor.commands && editor.commands.setSearchTerm) {\n editor.commands.setSearchTerm(searchValue)\n }\n }, [visible, searchValue, editor])\n\n useEffect(() => {\n if (!visible)\n return\n if (editor && editor.commands && editor.commands.setReplaceTerm) {\n editor.commands.setReplaceTerm(replaceValue)\n }\n }, [visible, replaceValue, editor])\n\n useEffect(() => {\n if (!editor)\n return\n\n const searchExtension = editor.extensionManager.extensions.find((ext: any) => ext.name === SearchAndReplace.name)\n\n if (!searchExtension)\n return\n\n const listener = () => {\n if (!visible)\n return\n\n const currentIndex = searchExtension ? searchExtension.storage.currentIndex : -1\n const results = searchExtension ? searchExtension.storage.results : []\n setCurrentIndex(preIndex => (preIndex !== currentIndex ? currentIndex : preIndex))\n setResults(prevResults => (deepEqual(prevResults, results) ? prevResults : results))\n }\n\n window.addEventListener(ON_SEARCH_RESULTS, listener)\n\n return () => {\n if (!searchExtension)\n return\n window.removeEventListener(ON_SEARCH_RESULTS, listener)\n }\n }, [visible, editor])\n\n return (\n <Popover\n open={visible}\n onOpenChange={setVisible}\n >\n <PopoverTrigger\n disabled={props?.disabled}\n asChild\n >\n <ActionButton\n tooltip={props?.tooltip}\n isActive={props?.isActive}\n disabled={props?.disabled}\n >\n <IconComponent name={props?.icon} />\n </ActionButton>\n </PopoverTrigger>\n <PopoverContent\n hideWhenDetached\n className=\"richtext-w-full\"\n align=\"start\"\n side=\"bottom\"\n >\n\n <div className=\"richtext-mb-[6px richtext-flex richtext-items-center richtext-justify-between\">\n <Label>\n {t('editor.search.dialog.text')}\n </Label>\n <span className=\"richtext-font-semibold\">\n {results.length ? `${currentIndex + 1}/${results.length}` : '0/0'}\n </span>\n </div>\n <div className=\"richtext-flex richtext-w-full richtext-max-w-sm richtext-items-center richtext-gap-1.5 richtext-mb-[10px]\">\n <Input\n type=\"text\"\n required\n className=\"richtext-w-full\"\n placeholder=\"Text\"\n autoFocus\n value={searchValue}\n onChange={e => setSearchValue(e.target.value)}\n />\n </div>\n <Label className=\"richtext-mb-[6px]\">\n {t('editor.replace.dialog.text')}\n </Label>\n <div className=\"richtext-flex richtext-w-full richtext-max-w-sm richtext-items-center richtext-gap-1.5 richtext-mb-[16px]\">\n <div className=\"richtext-relative richtext-items-center richtext-w-full richtext-max-w-sm\">\n <Input\n type=\"text\"\n required\n className=\"richtext-w-80\"\n placeholder=\"Text\"\n value={replaceValue}\n onChange={e => setReplaceValue(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"richtext-flex richtext-items-center richtext-gap-[10px] richtext-mb-[10px]\">\n <Button disabled={!results.length} className=\"richtext-flex-1\" onClick={editor.commands.goToPrevSearchResult}>\n {t('editor.previous.dialog.text')}\n </Button>\n\n <Button disabled={!results.length} className=\"richtext-flex-1\" onClick={editor.commands.goToNextSearchResult}>\n {t('editor.next.dialog.text')}\n </Button>\n </div>\n\n <div className=\"richtext-flex richtext-items-center richtext-gap-[10px]\">\n <Button disabled={!results.length} className=\"richtext-flex-1\" onClick={editor.commands.replace}>\n {t('editor.replace.dialog.text')}\n </Button>\n\n <Button disabled={!results.length} className=\"richtext-flex-1\" onClick={editor.commands.replaceAll}>\n {t('editor.replaceAll.dialog.text')}\n </Button>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\nexport default SearchAndReplaceButton\n","/* eslint-disable ts/no-this-alias */\n/* eslint-disable ts/no-unused-expressions */\nimport { Extension } from '@tiptap/core'\nimport scrollIntoView from 'scroll-into-view-if-needed'\nimport { Decoration, DecorationSet } from '@tiptap/pm/view'\nimport type { EditorState } from '@tiptap/pm/state'\nimport { Plugin, PluginKey } from '@tiptap/pm/state'\nimport SearchAndReplaceButton from '@/extensions/SearchAndReplace/components/SearchAndReplaceButton'\nimport type { GeneralOptions } from '@/types'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n search: {\n setSearchTerm: (searchTerm: string) => ReturnType\n setReplaceTerm: (replaceTerm: string) => ReturnType\n replace: () => ReturnType\n replaceAll: () => ReturnType\n goToPrevSearchResult: () => void\n goToNextSearchResult: () => void\n }\n }\n}\n\ninterface Result {\n from: number\n to: number\n}\n\ninterface TextNodesWithPosition {\n text: string\n pos: number\n}\n\nconst updateView = (state: EditorState, dispatch: any) => dispatch(state.tr)\n\nfunction regex(s: string, disableRegex: boolean, caseSensitive: boolean): RegExp {\n return RegExp(disableRegex ? s.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&') : s, caseSensitive ? 'gu' : 'gui')\n}\n\nfunction processSearches(\n doc: any,\n searchTerm: RegExp,\n searchResultClass: string,\n): { decorationsToReturn: any[], results: Result[] } {\n const decorations: Decoration[] = []\n let textNodesWithPosition: TextNodesWithPosition[] = []\n const results: Result[] = []\n\n let index = 0\n\n if (!searchTerm)\n return { decorationsToReturn: [], results: [] }\n\n doc?.descendants((node: any, pos: any) => {\n if (node.isText) {\n if (textNodesWithPosition[index]) {\n textNodesWithPosition[index] = {\n text: textNodesWithPosition[index].text + node.text,\n pos: textNodesWithPosition[index].pos,\n }\n }\n else {\n textNodesWithPosition[index] = {\n text: `${node.text}`,\n pos,\n }\n }\n }\n else {\n index += 1\n }\n })\n\n textNodesWithPosition = textNodesWithPosition.filter(Boolean)\n\n for (let i = 0; i < textNodesWithPosition.length; i += 1) {\n const { text, pos } = textNodesWithPosition[i]\n\n const matches = [...text.matchAll(searchTerm)]\n\n for (let j = 0; j < matches.length; j += 1) {\n const m = matches[j]\n\n if (m[0] === '')\n break\n\n if (m.index !== undefined) {\n results.push({\n from: pos + m.index,\n to: pos + m.index + m[0].length,\n })\n }\n }\n }\n\n for (let i = 0; i < results.length; i += 1) {\n const r = results[i]\n decorations.push(Decoration.inline(r.from, r.to, { class: searchResultClass }))\n }\n\n return {\n decorationsToReturn: decorations,\n results,\n }\n}\n\nfunction replace(replaceTerm: string, results: Result[], { state, dispatch }: any) {\n const firstResult = results[0]\n\n if (!firstResult)\n return\n\n const { from, to } = results[0]\n\n if (dispatch)\n dispatch(state.tr.insertText(replaceTerm, from, to))\n}\n\nfunction rebaseNextResult(replaceTerm: string, index: number, lastOffset: number, results: Result[]): [number, Result[]] | null {\n const nextIndex = index + 1\n\n if (!results[nextIndex])\n return null\n\n const { from: currentFrom, to: currentTo } = results[index]\n\n const offset = currentTo - currentFrom - replaceTerm.length + lastOffset\n\n const { from, to } = results[nextIndex]\n\n results[nextIndex] = {\n to: to - offset,\n from: from - offset,\n }\n\n return [offset, results]\n}\n\nfunction replaceAll(replaceTerm: string, results: Result[], { tr, dispatch }: any) {\n let offset = 0\n\n let ourResults = results.slice()\n\n if (!ourResults.length)\n return false\n\n for (let i = 0; i < ourResults.length; i += 1) {\n const { from, to } = ourResults[i]\n\n tr.insertText(replaceTerm, from, to)\n\n const rebaseNextResultResponse = rebaseNextResult(replaceTerm, i, offset, ourResults)\n\n if (rebaseNextResultResponse) {\n offset = rebaseNextResultResponse[0]\n ourResults = rebaseNextResultResponse[1]\n }\n }\n\n dispatch(tr)\n\n return true\n}\n\nfunction gotoSearchResult({ view, tr, searchResults, searchResultCurrentClass, gotoIndex }: any) {\n const result = searchResults[gotoIndex]\n\n if (result) {\n const transaction = tr.setMeta('directDecoration', {\n fromPos: result.from,\n toPos: result.to,\n attrs: { class: searchResultCurrentClass },\n })\n view?.dispatch(transaction)\n\n setTimeout(() => {\n const el = window.document.querySelector(`.${searchResultCurrentClass}`)\n if (el) {\n scrollIntoView(el, { behavior: 'smooth', scrollMode: 'if-needed' })\n }\n }, 0)\n\n return true\n }\n\n return false\n}\n\nexport const ON_SEARCH_RESULTS = 'ON_SEARCH_RESULTS'\n\n// Create a custom event\nexport const customEventSearch = new CustomEvent(ON_SEARCH_RESULTS)\n\ninterface SearchOptions extends GeneralOptions<SearchOptions> {\n searchTerm: string\n replaceTerm: string\n searchResultClass: string\n searchResultCurrentClass: string\n caseSensitive: boolean\n disableRegex: boolean\n onChange?: () => void\n}\n\ninterface SearchStorage {\n results: Result[]\n currentIndex: number\n}\n\nexport const SearchAndReplace = Extension.create<SearchOptions, SearchStorage>({\n name: 'search',\n\n addOptions() {\n return {\n ...this.parent?.(),\n searchTerm: '',\n replaceTerm: '',\n results: [],\n currentIndex: 0,\n searchResultClass: 'search-result',\n searchResultCurrentClass: 'search-result-current',\n caseSensitive: false,\n disableRegex: false,\n onChange: () => {},\n button: ({ editor, t }: any) => ({\n component: SearchAndReplaceButton,\n componentProps: {\n action: () => {},\n icon: 'SearchAndReplace',\n tooltip: t('editor.searchAndReplace.tooltip'),\n isActive: () => false,\n disabled: false,\n editor,\n },\n }),\n }\n },\n\n addStorage() {\n return {\n results: [],\n currentIndex: -1,\n }\n },\n\n addCommands() {\n return {\n setSearchTerm:\n (searchTerm: string) =>\n ({ state, dispatch }) => {\n this.options.searchTerm = searchTerm\n this.storage.results = []\n this.storage.currentIndex = 0\n window.dispatchEvent(customEventSearch)\n updateView(state, dispatch)\n return false\n },\n setReplaceTerm:\n (replaceTerm: string) =>\n ({ state, dispatch }) => {\n this.options.replaceTerm = replaceTerm\n\n updateView(state, dispatch)\n\n return false\n },\n replace:\n () =>\n ({ state, dispatch }) => {\n const { replaceTerm } = this.options\n const { currentIndex, results } = this.storage\n const currentResult = results[currentIndex]\n\n if (currentResult) {\n replace(replaceTerm, [currentResult], { state, dispatch })\n this.storage.results.splice(currentIndex, 1)\n }\n else {\n replace(replaceTerm, results, { state, dispatch })\n this.storage.results.shift()\n }\n\n window.dispatchEvent(customEventSearch)\n\n updateView(state, dispatch)\n\n return false\n },\n replaceAll:\n () =>\n ({ state, tr, dispatch }) => {\n const { replaceTerm } = this.options\n const { results } = this.storage\n\n replaceAll(replaceTerm, results, { tr, dispatch })\n\n this.storage.currentIndex = -1\n this.storage.results = []\n window.dispatchEvent(customEventSearch)\n\n updateView(state, dispatch)\n\n return false\n },\n goToPrevSearchResult:\n () =>\n ({ view, tr }: any) => {\n const { searchResultCurrentClass } = this.options\n const { currentIndex, results } = this.storage\n const nextIndex = (currentIndex + results.length - 1) % results.length\n this.storage.currentIndex = nextIndex\n window.dispatchEvent(customEventSearch)\n\n return gotoSearchResult({\n view,\n tr,\n searchResults: results,\n searchResultCurrentClass,\n gotoIndex: nextIndex,\n })\n },\n goToNextSearchResult:\n () =>\n ({ view, tr }: any) => {\n const { searchResultCurrentClass } = this.options\n const { currentIndex, results } = this.storage\n const nextIndex = (currentIndex + 1) % results.length\n this.storage.currentIndex = nextIndex\n this.options.onChange && this.options.onChange()\n window.dispatchEvent(customEventSearch)\n\n return gotoSearchResult({\n view,\n tr,\n searchResults: results,\n searchResultCurrentClass,\n gotoIndex: nextIndex,\n })\n },\n }\n },\n\n addProseMirrorPlugins() {\n const extensionThis = this\n\n return [\n new Plugin({\n key: new PluginKey('search'),\n state: {\n init() {\n return DecorationSet.empty\n },\n apply(ctx) {\n const { doc, docChanged } = ctx\n\n const { searchTerm, searchResultClass, searchResultCurrentClass, disableRegex, caseSensitive }\n = extensionThis.options\n\n if (docChanged || searchTerm) {\n const { decorationsToReturn, results } = processSearches(\n doc,\n regex(searchTerm, disableRegex, caseSensitive),\n searchResultClass,\n )\n extensionThis.storage.results = results\n if (extensionThis.storage.currentIndex > results.length - 1) {\n extensionThis.storage.currentIndex = 0\n }\n window.dispatchEvent(customEventSearch)\n if (ctx.getMeta('directDecoration')) {\n const { fromPos, toPos, attrs } = ctx.getMeta('directDecoration')\n decorationsToReturn.push(Decoration.inline(fromPos, toPos, attrs))\n }\n else {\n if (results.length) {\n decorationsToReturn[0] = Decoration.inline(results[0].from, results[0].to, {\n class: searchResultCurrentClass,\n })\n }\n }\n\n return DecorationSet.create(doc, decorationsToReturn)\n }\n return DecorationSet.empty\n },\n },\n props: {\n decorations(state) {\n return this.getState(state)\n },\n },\n }),\n ]\n },\n})\n","export const namesToEmoji = {\n '100': '💯',\n '1234': '🔢',\n 'grinning': '😀',\n 'smiley': '😃',\n 'smile': '😄',\n 'grin': '😁',\n 'laughing': '😆',\n 'satisfied': '😆',\n 'sweat_smile': '😅',\n 'rofl': '🤣',\n 'joy': '😂',\n 'slightly_smiling_face': '🙂',\n 'upside_down_face': '🙃',\n 'wink': '😉',\n 'blush': '😊',\n 'innocent': '😇',\n 'smiling_face_with_three_hearts': '🥰',\n 'heart_eyes': '😍',\n 'star_struck': '🤩',\n 'kissing_heart': '😘',\n 'kissing': '😗',\n 'relaxed': '☺️',\n 'kissing_closed_eyes': '😚',\n 'kissing_smiling_eyes': '😙',\n 'smiling_face_with_tear': '🥲',\n 'yum': '😋',\n 'stuck_out_tongue': '😛',\n 'stuck_out_tongue_winking_eye': '😜',\n 'zany_face': '🤪',\n 'stuck_out_tongue_closed_eyes': '😝',\n 'money_mouth_face': '🤑',\n 'hugs': '🤗',\n 'hand_over_mouth': '🤭',\n 'shushing_face': '🤫',\n 'thinking': '🤔',\n 'zipper_mouth_face': '🤐',\n 'raised_eyebrow': '🤨',\n 'neutral_face': '😐',\n 'expressionless': '😑',\n 'no_mouth': '😶',\n 'smirk': '😏',\n 'unamused': '😒',\n 'roll_eyes': '🙄',\n 'grimacing': '😬',\n 'lying_face': '🤥',\n 'relieved': '😌',\n 'pensive': '😔',\n 'sleepy': '😪',\n 'drooling_face': '🤤',\n 'sleeping': '😴',\n 'mask': '😷',\n 'face_with_thermometer': '🤒',\n 'face_with_head_bandage': '🤕',\n 'nauseated_face': '🤢',\n 'vomiting_face': '🤮',\n 'sneezing_face': '🤧',\n 'hot_face': '🥵',\n 'cold_face': '🥶',\n 'woozy_face': '🥴',\n 'dizzy_face': '😵',\n 'exploding_head': '🤯',\n 'cowboy_hat_face': '🤠',\n 'partying_face': '🥳',\n 'disguised_face': '🥸',\n 'sunglasses': '😎',\n 'nerd_face': '🤓',\n 'monocle_face': '🧐',\n 'confused': '😕',\n 'worried': '😟',\n 'slightly_frowning_face': '🙁',\n 'frowning_face': '☹️',\n 'open_mouth': '😮',\n 'hushed': '😯',\n 'astonished': '😲',\n 'flushed': '😳',\n 'pleading_face': '🥺',\n 'frowning': '😦',\n 'anguished': '😧',\n 'fearful': '😨',\n 'cold_sweat': '😰',\n 'disappointed_relieved': '😥',\n 'cry': '😢',\n 'sob': '😭',\n 'scream': '😱',\n 'confounded': '😖',\n 'persevere': '😣',\n 'disappointed': '😞',\n 'sweat': '😓',\n 'weary': '😩',\n 'tired_face': '😫',\n 'yawning_face': '🥱',\n 'triumph': '😤',\n 'rage': '😡',\n 'pout': '😡',\n 'angry': '😠',\n 'cursing_face': '🤬',\n 'smiling_imp': '😈',\n 'imp': '👿',\n 'skull': '💀',\n 'skull_and_crossbones': '☠️',\n 'hankey': '💩',\n 'poop': '💩',\n 'shit': '💩',\n 'clown_face': '🤡',\n 'japanese_ogre': '👹',\n 'japanese_goblin': '👺',\n 'ghost': '👻',\n 'alien': '👽',\n 'space_invader': '👾',\n 'robot': '🤖',\n 'smiley_cat': '😺',\n 'smile_cat': '😸',\n 'joy_cat': '😹',\n 'heart_eyes_cat': '😻',\n 'smirk_cat': '😼',\n 'kissing_cat': '😽',\n 'scream_cat': '🙀',\n 'crying_cat_face': '😿',\n 'pouting_cat': '😾',\n 'see_no_evil': '🙈',\n 'hear_no_evil': '🙉',\n 'speak_no_evil': '🙊',\n 'kiss': '💋',\n 'love_letter': '💌',\n 'cupid': '💘',\n 'gift_heart': '💝',\n 'sparkling_heart': '💖',\n 'heartpulse': '💗',\n 'heartbeat': '💓',\n 'revolving_hearts': '💞',\n 'two_hearts': '💕',\n 'heart_decoration': '💟',\n 'heavy_heart_exclamation': '❣️',\n 'broken_heart': '💔',\n 'heart': '❤️',\n 'orange_heart': '🧡',\n 'yellow_heart': '💛',\n 'green_heart': '💚',\n 'blue_heart': '💙',\n 'purple_heart': '💜',\n 'brown_heart': '🤎',\n 'black_heart': '🖤',\n 'white_heart': '🤍',\n 'anger': '💢',\n 'boom': '💥',\n 'collision': '💥',\n 'dizzy': '💫',\n 'sweat_drops': '💦',\n 'dash': '💨',\n 'hole': '🕳️',\n 'bomb': '💣',\n 'speech_balloon': '💬',\n 'eye_speech_bubble': '👁️‍🗨️',\n 'left_speech_bubble': '🗨️',\n 'right_anger_bubble': '🗯️',\n 'thought_balloon': '💭',\n 'zzz': '💤',\n 'wave': '👋',\n 'raised_back_of_hand': '🤚',\n 'raised_hand_with_fingers_splayed': '🖐️',\n 'hand': '✋',\n 'raised_hand': '✋',\n 'vulcan_salute': '🖖',\n 'ok_hand': '👌',\n 'pinched_fingers': '🤌',\n 'pinching_hand': '🤏',\n 'v': '✌️',\n 'crossed_fingers': '🤞',\n 'love_you_gesture': '🤟',\n 'metal': '🤘',\n 'call_me_hand': '🤙',\n 'point_left': '👈',\n 'point_right': '👉',\n 'point_up_2': '👆',\n 'middle_finger': '🖕',\n 'fu': '🖕',\n 'point_down': '👇',\n 'point_up': '☝️',\n '+1': '👍',\n 'thumbsup': '👍',\n '-1': '👎',\n 'thumbsdown': '👎',\n 'fist_raised': '✊',\n 'fist': '✊',\n 'fist_oncoming': '👊',\n 'facepunch': '👊',\n 'punch': '👊',\n 'fist_left': '🤛',\n 'fist_right': '🤜',\n 'clap': '👏',\n 'raised_hands': '🙌',\n 'open_hands': '👐',\n 'palms_up_together': '🤲',\n 'handshake': '🤝',\n 'pray': '🙏',\n 'writing_hand': '✍️',\n 'nail_care': '💅',\n 'selfie': '🤳',\n 'muscle': '💪',\n 'mechanical_arm': '🦾',\n 'mechanical_leg': '🦿',\n 'leg': '🦵',\n 'foot': '🦶',\n 'ear': '👂',\n 'ear_with_hearing_aid': '🦻',\n 'nose': '👃',\n 'brain': '🧠',\n 'anatomical_heart': '🫀',\n 'lungs': '🫁',\n 'tooth': '🦷',\n 'bone': '🦴',\n 'eyes': '👀',\n 'eye': '👁️',\n 'tongue': '👅',\n 'lips': '👄',\n 'baby': '👶',\n 'child': '🧒',\n 'boy': '👦',\n 'girl': '👧',\n 'adult': '🧑',\n 'blond_haired_person': '👱',\n 'man': '👨',\n 'bearded_person': '🧔',\n 'red_haired_man': '👨‍🦰',\n 'curly_haired_man': '👨‍🦱',\n 'white_haired_man': '👨‍🦳',\n 'bald_man': '👨‍🦲',\n 'woman': '👩',\n 'red_haired_woman': '👩‍🦰',\n 'person_red_hair': '🧑‍🦰',\n 'curly_haired_woman': '👩‍🦱',\n 'person_curly_hair': '🧑‍🦱',\n 'white_haired_woman': '👩‍🦳',\n 'person_white_hair': '🧑‍🦳',\n 'bald_woman': '👩‍🦲',\n 'person_bald': '🧑‍🦲',\n 'blond_haired_woman': '👱‍♀️',\n 'blonde_woman': '👱‍♀️',\n 'blond_haired_man': '👱‍♂️',\n 'older_adult': '🧓',\n 'older_man': '👴',\n 'older_woman': '👵',\n 'frowning_person': '🙍',\n 'frowning_man': '🙍‍♂️',\n 'frowning_woman': '🙍‍♀️',\n 'pouting_face': '🙎',\n 'pouting_man': '🙎‍♂️',\n 'pouting_woman': '🙎‍♀️',\n 'no_good': '🙅',\n 'no_good_man': '🙅‍♂️',\n 'ng_man': '🙅‍♂️',\n 'no_good_woman': '🙅‍♀️',\n 'ng_woman': '🙅‍♀️',\n 'ok_person': '🙆',\n 'ok_man': '🙆‍♂️',\n 'ok_woman': '🙆‍♀️',\n 'tipping_hand_person': '💁',\n 'information_desk_person': '💁',\n 'tipping_hand_man': '💁‍♂️',\n 'sassy_man': '💁‍♂️',\n 'tipping_hand_woman': '💁‍♀️',\n 'sassy_woman': '💁‍♀️',\n 'raising_hand': '🙋',\n 'raising_hand_man': '🙋‍♂️',\n 'raising_hand_woman': '🙋‍♀️',\n 'deaf_person': '🧏',\n 'deaf_man': '🧏‍♂️',\n 'deaf_woman': '🧏‍♀️',\n 'bow': '🙇',\n 'bowing_man': '🙇‍♂️',\n 'bowing_woman': '🙇‍♀️',\n 'facepalm': '🤦',\n 'man_facepalming': '🤦‍♂️',\n 'woman_facepalming': '🤦‍♀️',\n 'shrug': '🤷',\n 'man_shrugging': '🤷‍♂️',\n 'woman_shrugging': '🤷‍♀️',\n 'health_worker': '🧑‍⚕️',\n 'man_health_worker': '👨‍⚕️',\n 'woman_health_worker': '👩‍⚕️',\n 'student': '🧑‍🎓',\n 'man_student': '👨‍🎓',\n 'woman_student': '👩‍🎓',\n 'teacher': '🧑‍🏫',\n 'man_teacher': '👨‍🏫',\n 'woman_teacher': '👩‍🏫',\n 'judge': '🧑‍⚖️',\n 'man_judge': '👨‍⚖️',\n 'woman_judge': '👩‍⚖️',\n 'farmer': '🧑‍🌾',\n 'man_farmer': '👨‍🌾',\n 'woman_farmer': '👩‍🌾',\n 'cook': '🧑‍🍳',\n 'man_cook': '👨‍🍳',\n 'woman_cook': '👩‍🍳',\n 'mechanic': '🧑‍🔧',\n 'man_mechanic': '👨‍🔧',\n 'woman_mechanic': '👩‍🔧',\n 'factory_worker': '🧑‍🏭',\n 'man_factory_worker': '👨‍🏭',\n 'woman_factory_worker': '👩‍🏭',\n 'office_worker': '🧑‍💼',\n 'man_office_worker': '👨‍💼',\n 'woman_office_worker': '👩‍💼',\n 'scientist': '🧑‍🔬',\n 'man_scientist': '👨‍🔬',\n 'woman_scientist': '👩‍🔬',\n 'technologist': '🧑‍💻',\n 'man_technologist': '👨‍💻',\n 'woman_technologist': '👩‍💻',\n 'singer': '🧑‍🎤',\n 'man_singer': '👨‍🎤',\n 'woman_singer': '👩‍🎤',\n 'artist': '🧑‍🎨',\n 'man_artist': '👨‍🎨',\n 'woman_artist': '👩‍🎨',\n 'pilot': '🧑‍✈️',\n 'man_pilot': '👨‍✈️',\n 'woman_pilot': '👩‍✈️',\n 'astronaut': '🧑‍🚀',\n 'man_astronaut': '👨‍🚀',\n 'woman_astronaut': '👩‍🚀',\n 'firefighter': '🧑‍🚒',\n 'man_firefighter': '👨‍🚒',\n 'woman_firefighter': '👩‍🚒',\n 'police_officer': '👮',\n 'cop': '👮',\n 'policeman': '👮‍♂️',\n 'policewoman': '👮‍♀️',\n 'detective': '🕵️',\n 'male_detective': '🕵️‍♂️',\n 'female_detective': '🕵️‍♀️',\n 'guard': '💂',\n 'guardsman': '💂‍♂️',\n 'guardswoman': '💂‍♀️',\n 'ninja': '🥷',\n 'construction_worker': '👷',\n 'construction_worker_man': '👷‍♂️',\n 'construction_worker_woman': '👷‍♀️',\n 'prince': '🤴',\n 'princess': '👸',\n 'person_with_turban': '👳',\n 'man_with_turban': '👳‍♂️',\n 'woman_with_turban': '👳‍♀️',\n 'man_with_gua_pi_mao': '👲',\n 'woman_with_headscarf': '🧕',\n 'person_in_tuxedo': '🤵',\n 'man_in_tuxedo': '🤵‍♂️',\n 'woman_in_tuxedo': '🤵‍♀️',\n 'person_with_veil': '👰',\n 'man_with_veil': '👰‍♂️',\n 'woman_with_veil': '👰‍♀️',\n 'bride_with_veil': '👰‍♀️',\n 'pregnant_woman': '🤰',\n 'breast_feeding': '🤱',\n 'woman_feeding_baby': '👩‍🍼',\n 'man_feeding_baby': '👨‍🍼',\n 'person_feeding_baby': '🧑‍🍼',\n 'angel': '👼',\n 'santa': '🎅',\n 'mrs_claus': '🤶',\n 'mx_claus': '🧑‍🎄',\n 'superhero': '🦸',\n 'superhero_man': '🦸‍♂️',\n 'superhero_woman': '🦸‍♀️',\n 'supervillain': '🦹',\n 'supervillain_man': '🦹‍♂️',\n 'supervillain_woman': '🦹‍♀️',\n 'mage': '🧙',\n 'mage_man': '🧙‍♂️',\n 'mage_woman': '🧙‍♀️',\n 'fairy': '🧚',\n 'fairy_man': '🧚‍♂️',\n 'fairy_woman': '🧚‍♀️',\n 'vampire': '🧛',\n 'vampire_man': '🧛‍♂️',\n 'vampire_woman': '🧛‍♀️',\n 'merperson': '🧜',\n 'merman': '🧜‍♂️',\n 'mermaid': '🧜‍♀️',\n 'elf': '🧝',\n 'elf_man': '🧝‍♂️',\n 'elf_woman': '🧝‍♀️',\n 'genie': '🧞',\n 'genie_man': '🧞‍♂️',\n 'genie_woman': '🧞‍♀️',\n 'zombie': '🧟',\n 'zombie_man': '🧟‍♂️',\n 'zombie_woman': '🧟‍♀️',\n 'massage': '💆',\n 'massage_man': '💆‍♂️',\n 'massage_woman': '💆‍♀️',\n 'haircut': '💇',\n 'haircut_man': '💇‍♂️',\n 'haircut_woman': '💇‍♀️',\n 'walking': '🚶',\n 'walking_man': '🚶‍♂️',\n 'walking_woman': '🚶‍♀️',\n 'standing_person': '🧍',\n 'standing_man': '🧍‍♂️',\n 'standing_woman': '🧍‍♀️',\n 'kneeling_person': '🧎',\n 'kneeling_man': '🧎‍♂️',\n 'kneeling_woman': '🧎‍♀️',\n 'person_with_probing_cane': '🧑‍🦯',\n 'man_with_probing_cane': '👨‍🦯',\n 'woman_with_probing_cane': '👩‍🦯',\n 'person_in_motorized_wheelchair': '🧑‍🦼',\n 'man_in_motorized_wheelchair': '👨‍🦼',\n 'woman_in_motorized_wheelchair': '👩‍🦼',\n 'person_in_manual_wheelchair': '🧑‍🦽',\n 'man_in_manual_wheelchair': '👨‍🦽',\n 'woman_in_manual_wheelchair': '👩‍🦽',\n 'runner': '🏃',\n 'running': '🏃',\n 'running_man': '🏃‍♂️',\n 'running_woman': '🏃‍♀️',\n 'woman_dancing': '💃',\n 'dancer': '💃',\n 'man_dancing': '🕺',\n 'business_suit_levitating': '🕴️',\n 'dancers': '👯',\n 'dancing_men': '👯‍♂️',\n 'dancing_women': '👯‍♀️',\n 'sauna_person': '🧖',\n 'sauna_man': '🧖‍♂️',\n 'sauna_woman': '🧖‍♀️',\n 'climbing': '🧗',\n 'climbing_man': '🧗‍♂️',\n 'climbing_woman': '🧗‍♀️',\n 'person_fencing': '🤺',\n 'horse_racing': '🏇',\n 'skier': '⛷️',\n 'snowboarder': '🏂',\n 'golfing': '🏌️',\n 'golfing_man': '🏌️‍♂️',\n 'golfing_woman': '🏌️‍♀️',\n 'surfer': '🏄',\n 'surfing_man': '🏄‍♂️',\n 'surfing_woman': '🏄‍♀️',\n 'rowboat': '🚣',\n 'rowing_man': '🚣‍♂️',\n 'rowing_woman': '🚣‍♀️',\n 'swimmer': '🏊',\n 'swimming_man': '🏊‍♂️',\n 'swimming_woman': '🏊‍♀️',\n 'bouncing_ball_person': '⛹️',\n 'bouncing_ball_man': '⛹️‍♂️',\n 'basketball_man': '⛹️‍♂️',\n 'bouncing_ball_woman': '⛹️‍♀️',\n 'basketball_woman': '⛹️‍♀️',\n 'weight_lifting': '🏋️',\n 'weight_lifting_man': '🏋️‍♂️',\n 'weight_lifting_woman': '🏋️‍♀️',\n 'bicyclist': '🚴',\n 'biking_man': '🚴‍♂️',\n 'biking_woman': '🚴‍♀️',\n 'mountain_bicyclist': '🚵',\n 'mountain_biking_man': '🚵‍♂️',\n 'mountain_biking_woman': '🚵‍♀️',\n 'cartwheeling': '🤸',\n 'man_cartwheeling': '🤸‍♂️',\n 'woman_cartwheeling': '🤸‍♀️',\n 'wrestling': '🤼',\n 'men_wrestling': '🤼‍♂️',\n 'women_wrestling': '🤼‍♀️',\n 'water_polo': '🤽',\n 'man_playing_water_polo': '🤽‍♂️',\n 'woman_playing_water_polo': '🤽‍♀️',\n 'handball_person': '🤾',\n 'man_playing_handball': '🤾‍♂️',\n 'woman_playing_handball': '🤾‍♀️',\n 'juggling_person': '🤹',\n 'man_juggling': '🤹‍♂️',\n 'woman_juggling': '🤹‍♀️',\n 'lotus_position': '🧘',\n 'lotus_position_man': '🧘‍♂️',\n 'lotus_position_woman': '🧘‍♀️',\n 'bath': '🛀',\n 'sleeping_bed': '🛌',\n 'people_holding_hands': '🧑‍🤝‍🧑',\n 'two_women_holding_hands': '👭',\n 'couple': '👫',\n 'two_men_holding_hands': '👬',\n 'couplekiss': '💏',\n 'couplekiss_man_woman': '👩‍❤️‍💋‍👨',\n 'couplekiss_man_man': '👨‍❤️‍💋‍👨',\n 'couplekiss_woman_woman': '👩‍❤️‍💋‍👩',\n 'couple_with_heart': '💑',\n 'couple_with_heart_woman_man': '👩‍❤️‍👨',\n 'couple_with_heart_man_man': '👨‍❤️‍👨',\n 'couple_with_heart_woman_woman': '👩‍❤️‍👩',\n 'family': '👪',\n 'family_man_woman_boy': '👨‍👩‍👦',\n 'family_man_woman_girl': '👨‍👩‍👧',\n 'family_man_woman_girl_boy': '👨‍👩‍👧‍👦',\n 'family_man_woman_boy_boy': '👨‍👩‍👦‍👦',\n 'family_man_woman_girl_girl': '👨‍👩‍👧‍👧',\n 'family_man_man_boy': '👨‍👨‍👦',\n 'family_man_man_girl': '👨‍👨‍👧',\n 'family_man_man_girl_boy': '👨‍👨‍👧‍👦',\n 'family_man_man_boy_boy': '👨‍👨‍👦‍👦',\n 'family_man_man_girl_girl': '👨‍👨‍👧‍👧',\n 'family_woman_woman_boy': '👩‍👩‍👦',\n 'family_woman_woman_girl': '👩‍👩‍👧',\n 'family_woman_woman_girl_boy': '👩‍👩‍👧‍👦',\n 'family_woman_woman_boy_boy': '👩‍👩‍👦‍👦',\n 'family_woman_woman_girl_girl': '👩‍👩‍👧‍👧',\n 'family_man_boy': '👨‍👦',\n 'family_man_boy_boy': '👨‍👦‍👦',\n 'family_man_girl': '👨‍👧',\n 'family_man_girl_boy': '👨‍👧‍👦',\n 'family_man_girl_girl': '👨‍👧‍👧',\n 'family_woman_boy': '👩‍👦',\n 'family_woman_boy_boy': '👩‍👦‍👦',\n 'family_woman_girl': '👩‍👧',\n 'family_woman_girl_boy': '👩‍👧‍👦',\n 'family_woman_girl_girl': '👩‍👧‍👧',\n 'speaking_head': '🗣️',\n 'bust_in_silhouette': '👤',\n 'busts_in_silhouette': '👥',\n 'people_hugging': '🫂',\n 'footprints': '👣',\n 'monkey_face': '🐵',\n 'monkey': '🐒',\n 'gorilla': '🦍',\n 'orangutan': '🦧',\n 'dog': '🐶',\n 'dog2': '🐕',\n 'guide_dog': '🦮',\n 'service_dog': '🐕‍🦺',\n 'poodle': '🐩',\n 'wolf': '🐺',\n 'fox_face': '🦊',\n 'raccoon': '🦝',\n 'cat': '🐱',\n 'cat2': '🐈',\n 'black_cat': '🐈‍⬛',\n 'lion': '🦁',\n 'tiger': '🐯',\n 'tiger2': '🐅',\n 'leopard': '🐆',\n 'horse': '🐴',\n 'racehorse': '🐎',\n 'unicorn': '🦄',\n 'zebra': '🦓',\n 'deer': '🦌',\n 'bison': '🦬',\n 'cow': '🐮',\n 'ox': '🐂',\n 'water_buffalo': '🐃',\n 'cow2': '🐄',\n 'pig': '🐷',\n 'pig2': '🐖',\n 'boar': '🐗',\n 'pig_nose': '🐽',\n 'ram': '🐏',\n 'sheep': '🐑',\n 'goat': '🐐',\n 'dromedary_camel': '🐪',\n 'camel': '🐫',\n 'llama': '🦙',\n 'giraffe': '🦒',\n 'elephant': '🐘',\n 'mammoth': '🦣',\n 'rhinoceros': '🦏',\n 'hippopotamus': '🦛',\n 'mouse': '🐭',\n 'mouse2': '🐁',\n 'rat': '🐀',\n 'hamster': '🐹',\n 'rabbit': '🐰',\n 'rabbit2': '🐇',\n 'chipmunk': '🐿️',\n 'beaver': '🦫',\n 'hedgehog': '🦔',\n 'bat': '🦇',\n 'bear': '🐻',\n 'polar_bear': '🐻‍❄️',\n 'koala': '🐨',\n 'panda_face': '🐼',\n 'sloth': '🦥',\n 'otter': '🦦',\n 'skunk': '🦨',\n 'kangaroo': '🦘',\n 'badger': '🦡',\n 'feet': '🐾',\n 'paw_prints': '🐾',\n 'turkey': '🦃',\n 'chicken': '🐔',\n 'rooster': '🐓',\n 'hatching_chick': '🐣',\n 'baby_chick': '🐤',\n 'hatched_chick': '🐥',\n 'bird': '🐦',\n 'penguin': '🐧',\n 'dove': '🕊️',\n 'eagle': '🦅',\n 'duck': '🦆',\n 'swan': '🦢',\n 'owl': '🦉',\n 'dodo': '🦤',\n 'feather': '🪶',\n 'flamingo': '🦩',\n 'peacock': '🦚',\n 'parrot': '🦜',\n 'frog': '🐸',\n 'crocodile': '🐊',\n 'turtle': '🐢',\n 'lizard': '🦎',\n 'snake': '🐍',\n 'dragon_face': '🐲',\n 'dragon': '🐉',\n 'sauropod': '🦕',\n 't-rex': '🦖',\n 'whale': '🐳',\n 'whale2': '🐋',\n 'dolphin': '🐬',\n 'flipper': '🐬',\n 'seal': '🦭',\n 'fish': '🐟',\n 'tropical_fish': '🐠',\n 'blowfish': '🐡',\n 'shark': '🦈',\n 'octopus': '🐙',\n 'shell': '🐚',\n 'snail': '🐌',\n 'butterfly': '🦋',\n 'bug': '🐛',\n 'ant': '🐜',\n 'bee': '🐝',\n 'honeybee': '🐝',\n 'beetle': '🪲',\n 'lady_beetle': '🐞',\n 'cricket': '🦗',\n 'cockroach': '🪳',\n 'spider': '🕷️',\n 'spider_web': '🕸️',\n 'scorpion': '🦂',\n 'mosquito': '🦟',\n 'fly': '🪰',\n 'worm': '🪱',\n 'microbe': '🦠',\n 'bouquet': '💐',\n 'cherry_blossom': '🌸',\n 'white_flower': '💮',\n 'rosette': '🏵️',\n 'rose': '🌹',\n 'wilted_flower': '🥀',\n 'hibiscus': '🌺',\n 'sunflower': '🌻',\n 'blossom': '🌼',\n 'tulip': '🌷',\n 'seedling': '🌱',\n 'potted_plant': '🪴',\n 'evergreen_tree': '🌲',\n 'deciduous_tree': '🌳',\n 'palm_tree': '🌴',\n 'cactus': '🌵',\n 'ear_of_rice': '🌾',\n 'herb': '🌿',\n 'shamrock': '☘️',\n 'four_leaf_clover': '🍀',\n 'maple_leaf': '🍁',\n 'fallen_leaf': '🍂',\n 'leaves': '🍃',\n 'grapes': '🍇',\n 'melon': '🍈',\n 'watermelon': '🍉',\n 'tangerine': '🍊',\n 'orange': '🍊',\n 'mandarin': '🍊',\n 'lemon': '🍋',\n 'banana': '🍌',\n 'pineapple': '🍍',\n 'mango': '🥭',\n 'apple': '🍎',\n 'green_apple': '🍏',\n 'pear': '🍐',\n 'peach': '🍑',\n 'cherries': '🍒',\n 'strawberry': '🍓',\n 'blueberries': '🫐',\n 'kiwi_fruit': '🥝',\n 'tomato': '🍅',\n 'olive': '🫒',\n 'coconut': '🥥',\n 'avocado': '🥑',\n 'eggplant': '🍆',\n 'potato': '🥔',\n 'carrot': '🥕',\n 'corn': '🌽',\n 'hot_pepper': '🌶️',\n 'bell_pepper': '🫑',\n 'cucumber': '🥒',\n 'leafy_green': '🥬',\n 'broccoli': '🥦',\n 'garlic': '🧄',\n 'onion': '🧅',\n 'mushroom': '🍄',\n 'peanuts': '🥜',\n 'chestnut': '🌰',\n 'bread': '🍞',\n 'croissant': '🥐',\n 'baguette_bread': '🥖',\n 'flatbread': '🫓',\n 'pretzel': '🥨',\n 'bagel': '🥯',\n 'pancakes': '🥞',\n 'waffle': '🧇',\n 'cheese': '🧀',\n 'meat_on_bone': '🍖',\n 'poultry_leg': '🍗',\n 'cut_of_meat': '🥩',\n 'bacon': '🥓',\n 'hamburger': '🍔',\n 'fries': '🍟',\n 'pizza': '🍕',\n 'hotdog': '🌭',\n 'sandwich': '🥪',\n 'taco': '🌮',\n 'burrito': '🌯',\n 'tamale': '🫔',\n 'stuffed_flatbread': '🥙',\n 'falafel': '🧆',\n 'egg': '🥚',\n 'fried_egg': '🍳',\n 'shallow_pan_of_food': '🥘',\n 'stew': '🍲',\n 'fondue': '🫕',\n 'bowl_with_spoon': '🥣',\n 'green_salad': '🥗',\n 'popcorn': '🍿',\n 'butter': '🧈',\n 'salt': '🧂',\n 'canned_food': '🥫',\n 'bento': '🍱',\n 'rice_cracker': '🍘',\n 'rice_ball': '🍙',\n 'rice': '🍚',\n 'curry': '🍛',\n 'ramen': '🍜',\n 'spaghetti': '🍝',\n 'sweet_potato': '🍠',\n 'oden': '🍢',\n 'sushi': '🍣',\n 'fried_shrimp': '🍤',\n 'fish_cake': '🍥',\n 'moon_cake': '🥮',\n 'dango': '🍡',\n 'dumpling': '🥟',\n 'fortune_cookie': '🥠',\n 'takeout_box': '🥡',\n 'crab': '🦀',\n 'lobster': '🦞',\n 'shrimp': '🦐',\n 'squid': '🦑',\n 'oyster': '🦪',\n 'icecream': '🍦',\n 'shaved_ice': '🍧',\n 'ice_cream': '🍨',\n 'doughnut': '🍩',\n 'cookie': '🍪',\n 'birthday': '🎂',\n 'cake': '🍰',\n 'cupcake': '🧁',\n 'pie': '🥧',\n 'chocolate_bar': '🍫',\n 'candy': '🍬',\n 'lollipop': '🍭',\n 'custard': '🍮',\n 'honey_pot': '🍯',\n 'baby_bottle': '🍼',\n 'milk_glass': '🥛',\n 'coffee': '☕',\n 'teapot': '🫖',\n 'tea': '🍵',\n 'sake': '🍶',\n 'champagne': '🍾',\n 'wine_glass': '🍷',\n 'cocktail': '🍸',\n 'tropical_drink': '🍹',\n 'beer': '🍺',\n 'beers': '🍻',\n 'clinking_glasses': '🥂',\n 'tumbler_glass': '🥃',\n 'cup_with_straw': '🥤',\n 'bubble_tea': '🧋',\n 'beverage_box': '🧃',\n 'mate': '🧉',\n 'ice_cube': '🧊',\n 'chopsticks': '🥢',\n 'plate_with_cutlery': '🍽️',\n 'fork_and_knife': '🍴',\n 'spoon': '🥄',\n 'hocho': '🔪',\n 'knife': '🔪',\n 'amphora': '🏺',\n 'earth_africa': '🌍',\n 'earth_americas': '🌎',\n 'earth_asia': '🌏',\n 'globe_with_meridians': '🌐',\n 'world_map': '🗺️',\n 'japan': '🗾',\n 'compass': '🧭',\n 'mountain_snow': '🏔️',\n 'mountain': '⛰️',\n 'volcano': '🌋',\n 'mount_fuji': '🗻',\n 'camping': '🏕️',\n 'beach_umbrella': '🏖️',\n 'desert': '🏜️',\n 'desert_island': '🏝️',\n 'national_park': '🏞️',\n 'stadium': '🏟️',\n 'classical_building': '🏛️',\n 'building_construction': '🏗️',\n 'bricks': '🧱',\n 'rock': '🪨',\n 'wood': '🪵',\n 'hut': '🛖',\n 'houses': '🏘️',\n 'derelict_house': '🏚️',\n 'house': '🏠',\n 'house_with_garden': '🏡',\n 'office': '🏢',\n 'post_office': '🏣',\n 'european_post_office': '🏤',\n 'hospital': '🏥',\n 'bank': '🏦',\n 'hotel': '🏨',\n 'love_hotel': '🏩',\n 'convenience_store': '🏪',\n 'school': '🏫',\n 'department_store': '🏬',\n 'factory': '🏭',\n 'japanese_castle': '🏯',\n 'european_castle': '🏰',\n 'wedding': '💒',\n 'tokyo_tower': '🗼',\n 'statue_of_liberty': '🗽',\n 'church': '⛪',\n 'mosque': '🕌',\n 'hindu_temple': '🛕',\n 'synagogue': '🕍',\n 'shinto_shrine': '⛩️',\n 'kaaba': '🕋',\n 'fountain': '⛲',\n 'tent': '⛺',\n 'foggy': '🌁',\n 'night_with_stars': '🌃',\n 'cityscape': '🏙️',\n 'sunrise_over_mountains': '🌄',\n 'sunrise': '🌅',\n 'city_sunset': '🌆',\n 'city_sunrise': '🌇',\n 'bridge_at_night': '🌉',\n 'hotsprings': '♨️',\n 'carousel_horse': '🎠',\n 'ferris_wheel': '🎡',\n 'roller_coaster': '🎢',\n 'barber': '💈',\n 'circus_tent': '🎪',\n 'steam_locomotive': '🚂',\n 'railway_car': '🚃',\n 'bullettrain_side': '🚄',\n 'bullettrain_front': '🚅',\n 'train2': '🚆',\n 'metro': '🚇',\n 'light_rail': '🚈',\n 'station': '🚉',\n 'tram': '🚊',\n 'monorail': '🚝',\n 'mountain_railway': '🚞',\n 'train': '🚋',\n 'bus': '🚌',\n 'oncoming_bus': '🚍',\n 'trolleybus': '🚎',\n 'minibus': '🚐',\n 'ambulance': '🚑',\n 'fire_engine': '🚒',\n 'police_car': '🚓',\n 'oncoming_police_car': '🚔',\n 'taxi': '🚕',\n 'oncoming_taxi': '🚖',\n 'car': '🚗',\n 'red_car': '🚗',\n 'oncoming_automobile': '🚘',\n 'blue_car': '🚙',\n 'pickup_truck': '🛻',\n 'truck': '🚚',\n 'articulated_lorry': '🚛',\n 'tractor': '🚜',\n 'racing_car': '🏎️',\n 'motorcycle': '🏍️',\n 'motor_scooter': '🛵',\n 'manual_wheelchair': '🦽',\n 'motorized_wheelchair': '🦼',\n 'auto_rickshaw': '🛺',\n 'bike': '🚲',\n 'kick_scooter': '🛴',\n 'skateboard': '🛹',\n 'roller_skate': '🛼',\n 'busstop': '🚏',\n 'motorway': '🛣️',\n 'railway_track': '🛤️',\n 'oil_drum': '🛢️',\n 'fuelpump': '⛽',\n 'rotating_light': '🚨',\n 'traffic_light': '🚥',\n 'vertical_traffic_light': '🚦',\n 'stop_sign': '🛑',\n 'construction': '🚧',\n 'anchor': '⚓',\n 'boat': '⛵',\n 'sailboat': '⛵',\n 'canoe': '🛶',\n 'speedboat': '🚤',\n 'passenger_ship': '🛳️',\n 'ferry': '⛴️',\n 'motor_boat': '🛥️',\n 'ship': '🚢',\n 'airplane': '✈️',\n 'small_airplane': '🛩️',\n 'flight_departure': '🛫',\n 'flight_arrival': '🛬',\n 'parachute': '🪂',\n 'seat': '💺',\n 'helicopter': '🚁',\n 'suspension_railway': '🚟',\n 'mountain_cableway': '🚠',\n 'aerial_tramway': '🚡',\n 'artificial_satellite': '🛰️',\n 'rocket': '🚀',\n 'flying_saucer': '🛸',\n 'bellhop_bell': '🛎️',\n 'luggage': '🧳',\n 'hourglass': '⌛',\n 'hourglass_flowing_sand': '⏳',\n 'watch': '⌚',\n 'alarm_clock': '⏰',\n 'stopwatch': '⏱️',\n 'timer_clock': '⏲️',\n 'mantelpiece_clock': '🕰️',\n 'clock12': '🕛',\n 'clock1230': '🕧',\n 'clock1': '🕐',\n 'clock130': '🕜',\n 'clock2': '🕑',\n 'clock230': '🕝',\n 'clock3': '🕒',\n 'clock330': '🕞',\n 'clock4': '🕓',\n 'clock430': '🕟',\n 'clock5': '🕔',\n 'clock530': '🕠',\n 'clock6': '🕕',\n 'clock630': '🕡',\n 'clock7': '🕖',\n 'clock730': '🕢',\n 'clock8': '🕗',\n 'clock830': '🕣',\n 'clock9': '🕘',\n 'clock930': '🕤',\n 'clock10': '🕙',\n 'clock1030': '🕥',\n 'clock11': '🕚',\n 'clock1130': '🕦',\n 'new_moon': '🌑',\n 'waxing_crescent_moon': '🌒',\n 'first_quarter_moon': '🌓',\n 'moon': '🌔',\n 'waxing_gibbous_moon': '🌔',\n 'full_moon': '🌕',\n 'waning_gibbous_moon': '🌖',\n 'last_quarter_moon': '🌗',\n 'waning_crescent_moon': '🌘',\n 'crescent_moon': '🌙',\n 'new_moon_with_face': '🌚',\n 'first_quarter_moon_with_face': '🌛',\n 'last_quarter_moon_with_face': '🌜',\n 'thermometer': '🌡️',\n 'sunny': '☀️',\n 'full_moon_with_face': '🌝',\n 'sun_with_face': '🌞',\n 'ringed_planet': '🪐',\n 'star': '⭐',\n 'star2': '🌟',\n 'stars': '🌠',\n 'milky_way': '🌌',\n 'cloud': '☁️',\n 'partly_sunny': '⛅',\n 'cloud_with_lightning_and_rain': '⛈️',\n 'sun_behind_small_cloud': '🌤️',\n 'sun_behind_large_cloud': '🌥️',\n 'sun_behind_rain_cloud': '🌦️',\n 'cloud_with_rain': '🌧️',\n 'cloud_with_snow': '🌨️',\n 'cloud_with_lightning': '🌩️',\n 'tornado': '🌪️',\n 'fog': '🌫️',\n 'wind_face': '🌬️',\n 'cyclone': '🌀',\n 'rainbow': '🌈',\n 'closed_umbrella': '🌂',\n 'open_umbrella': '☂️',\n 'umbrella': '☔',\n 'parasol_on_ground': '⛱️',\n 'zap': '⚡',\n 'snowflake': '❄️',\n 'snowman_with_snow': '☃️',\n 'snowman': '⛄',\n 'comet': '☄️',\n 'fire': '🔥',\n 'droplet': '💧',\n 'ocean': '🌊',\n 'jack_o_lantern': '🎃',\n 'christmas_tree': '🎄',\n 'fireworks': '🎆',\n 'sparkler': '🎇',\n 'firecracker': '🧨',\n 'sparkles': '✨',\n 'balloon': '🎈',\n 'tada': '🎉',\n 'confetti_ball': '🎊',\n 'tanabata_tree': '🎋',\n 'bamboo': '🎍',\n 'dolls': '🎎',\n 'flags': '🎏',\n 'wind_chime': '🎐',\n 'rice_scene': '🎑',\n 'red_envelope': '🧧',\n 'ribbon': '🎀',\n 'gift': '🎁',\n 'reminder_ribbon': '🎗️',\n 'tickets': '🎟️',\n 'ticket': '🎫',\n 'medal_military': '🎖️',\n 'trophy': '🏆',\n 'medal_sports': '🏅',\n '1st_place_medal': '🥇',\n '2nd_place_medal': '🥈',\n '3rd_place_medal': '🥉',\n 'soccer': '⚽',\n 'baseball': '⚾',\n 'softball': '🥎',\n 'basketball': '🏀',\n 'volleyball': '🏐',\n 'football': '🏈',\n 'rugby_football': '🏉',\n 'tennis': '🎾',\n 'flying_disc': '🥏',\n 'bowling': '🎳',\n 'cricket_game': '🏏',\n 'field_hockey': '🏑',\n 'ice_hockey': '🏒',\n 'lacrosse': '🥍',\n 'ping_pong': '🏓',\n 'badminton': '🏸',\n 'boxing_glove': '🥊',\n 'martial_arts_uniform': '🥋',\n 'goal_net': '🥅',\n 'golf': '⛳',\n 'ice_skate': '⛸️',\n 'fishing_pole_and_fish': '🎣',\n 'diving_mask': '🤿',\n 'running_shirt_with_sash': '🎽',\n 'ski': '🎿',\n 'sled': '🛷',\n 'curling_stone': '🥌',\n 'dart': '🎯',\n 'yo_yo': '🪀',\n 'kite': '🪁',\n '8ball': '🎱',\n 'crystal_ball': '🔮',\n 'magic_wand': '🪄',\n 'nazar_amulet': '🧿',\n 'video_game': '🎮',\n 'joystick': '🕹️',\n 'slot_machine': '🎰',\n 'game_die': '🎲',\n 'jigsaw': '🧩',\n 'teddy_bear': '🧸',\n 'pinata': '🪅',\n 'nesting_dolls': '🪆',\n 'spades': '♠️',\n 'hearts': '♥️',\n 'diamonds': '♦️',\n 'clubs': '♣️',\n 'chess_pawn': '♟️',\n 'black_joker': '🃏',\n 'mahjong': '🀄',\n 'flower_playing_cards': '🎴',\n 'performing_arts': '🎭',\n 'framed_picture': '🖼️',\n 'art': '🎨',\n 'thread': '🧵',\n 'sewing_needle': '🪡',\n 'yarn': '🧶',\n 'knot': '🪢',\n 'eyeglasses': '👓',\n 'dark_sunglasses': '🕶️',\n 'goggles': '🥽',\n 'lab_coat': '🥼',\n 'safety_vest': '🦺',\n 'necktie': '👔',\n 'shirt': '👕',\n 'tshirt': '👕',\n 'jeans': '👖',\n 'scarf': '🧣',\n 'gloves': '🧤',\n 'coat': '🧥',\n 'socks': '🧦',\n 'dress': '👗',\n 'kimono': '👘',\n 'sari': '🥻',\n 'one_piece_swimsuit': '🩱',\n 'swim_brief': '🩲',\n 'shorts': '🩳',\n 'bikini': '👙',\n 'womans_clothes': '👚',\n 'purse': '👛',\n 'handbag': '👜',\n 'pouch': '👝',\n 'shopping': '🛍️',\n 'school_satchel': '🎒',\n 'thong_sandal': '🩴',\n 'mans_shoe': '👞',\n 'shoe': '👞',\n 'athletic_shoe': '👟',\n 'hiking_boot': '🥾',\n 'flat_shoe': '🥿',\n 'high_heel': '👠',\n 'sandal': '👡',\n 'ballet_shoes': '🩰',\n 'boot': '👢',\n 'crown': '👑',\n 'womans_hat': '👒',\n 'tophat': '🎩',\n 'mortar_board': '🎓',\n 'billed_cap': '🧢',\n 'military_helmet': '🪖',\n 'rescue_worker_helmet': '⛑️',\n 'prayer_beads': '📿',\n 'lipstick': '💄',\n 'ring': '💍',\n 'gem': '💎',\n 'mute': '🔇',\n 'speaker': '🔈',\n 'sound': '🔉',\n 'loud_sound': '🔊',\n 'loudspeaker': '📢',\n 'mega': '📣',\n 'postal_horn': '📯',\n 'bell': '🔔',\n 'no_bell': '🔕',\n 'musical_score': '🎼',\n 'musical_note': '🎵',\n 'notes': '🎶',\n 'studio_microphone': '🎙️',\n 'level_slider': '🎚️',\n 'control_knobs': '🎛️',\n 'microphone': '🎤',\n 'headphones': '🎧',\n 'radio': '📻',\n 'saxophone': '🎷',\n 'accordion': '🪗',\n 'guitar': '🎸',\n 'musical_keyboard': '🎹',\n 'trumpet': '🎺',\n 'violin': '🎻',\n 'banjo': '🪕',\n 'drum': '🥁',\n 'long_drum': '🪘',\n 'iphone': '📱',\n 'calling': '📲',\n 'phone': '☎️',\n 'telephone': '☎️',\n 'telephone_receiver': '📞',\n 'pager': '📟',\n 'fax': '📠',\n 'battery': '🔋',\n 'electric_plug': '🔌',\n 'computer': '💻',\n 'desktop_computer': '🖥️',\n 'printer': '🖨️',\n 'keyboard': '⌨️',\n 'computer_mouse': '🖱️',\n 'trackball': '🖲️',\n 'minidisc': '💽',\n 'floppy_disk': '💾',\n 'cd': '💿',\n 'dvd': '📀',\n 'abacus': '🧮',\n 'movie_camera': '🎥',\n 'film_strip': '🎞️',\n 'film_projector': '📽️',\n 'clapper': '🎬',\n 'tv': '📺',\n 'camera': '📷',\n 'camera_flash': '📸',\n 'video_camera': '📹',\n 'vhs': '📼',\n 'mag': '🔍',\n 'mag_right': '🔎',\n 'candle': '🕯️',\n 'bulb': '💡',\n 'flashlight': '🔦',\n 'izakaya_lantern': '🏮',\n 'lantern': '🏮',\n 'diya_lamp': '🪔',\n 'notebook_with_decorative_cover': '📔',\n 'closed_book': '📕',\n 'book': '📖',\n 'open_book': '📖',\n 'green_book': '📗',\n 'blue_book': '📘',\n 'orange_book': '📙',\n 'books': '📚',\n 'notebook': '📓',\n 'ledger': '📒',\n 'page_with_curl': '📃',\n 'scroll': '📜',\n 'page_facing_up': '📄',\n 'newspaper': '📰',\n 'newspaper_roll': '🗞️',\n 'bookmark_tabs': '📑',\n 'bookmark': '🔖',\n 'label': '🏷️',\n 'moneybag': '💰',\n 'coin': '🪙',\n 'yen': '💴',\n 'dollar': '💵',\n 'euro': '💶',\n 'pound': '💷',\n 'money_with_wings': '💸',\n 'credit_card': '💳',\n 'receipt': '🧾',\n 'chart': '💹',\n 'envelope': '✉️',\n 'email': '📧',\n 'e-mail': '📧',\n 'incoming_envelope': '📨',\n 'envelope_with_arrow': '📩',\n 'outbox_tray': '📤',\n 'inbox_tray': '📥',\n 'package': '📦',\n 'mailbox': '📫',\n 'mailbox_closed': '📪',\n 'mailbox_with_mail': '📬',\n 'mailbox_with_no_mail': '📭',\n 'postbox': '📮',\n 'ballot_box': '🗳️',\n 'pencil2': '✏️',\n 'black_nib': '✒️',\n 'fountain_pen': '🖋️',\n 'pen': '🖊️',\n 'paintbrush': '🖌️',\n 'crayon': '🖍️',\n 'memo': '📝',\n 'pencil': '📝',\n 'briefcase': '💼',\n 'file_folder': '📁',\n 'open_file_folder': '📂',\n 'card_index_dividers': '🗂️',\n 'date': '📅',\n 'calendar': '📆',\n 'spiral_notepad': '🗒️',\n 'spiral_calendar': '🗓️',\n 'card_index': '📇',\n 'chart_with_upwards_trend': '📈',\n 'chart_with_downwards_trend': '📉',\n 'bar_chart': '📊',\n 'clipboard': '📋',\n 'pushpin': '📌',\n 'round_pushpin': '📍',\n 'paperclip': '📎',\n 'paperclips': '🖇️',\n 'straight_ruler': '📏',\n 'triangular_ruler': '📐',\n 'scissors': '✂️',\n 'card_file_box': '🗃️',\n 'file_cabinet': '🗄️',\n 'wastebasket': '🗑️',\n 'lock': '🔒',\n 'unlock': '🔓',\n 'lock_with_ink_pen': '🔏',\n 'closed_lock_with_key': '🔐',\n 'key': '🔑',\n 'old_key': '🗝️',\n 'hammer': '🔨',\n 'axe': '🪓',\n 'pick': '⛏️',\n 'hammer_and_pick': '⚒️',\n 'hammer_and_wrench': '🛠️',\n 'dagger': '🗡️',\n 'crossed_swords': '⚔️',\n 'gun': '🔫',\n 'boomerang': '🪃',\n 'bow_and_arrow': '🏹',\n 'shield': '🛡️',\n 'carpentry_saw': '🪚',\n 'wrench': '🔧',\n 'screwdriver': '🪛',\n 'nut_and_bolt': '🔩',\n 'gear': '⚙️',\n 'clamp': '🗜️',\n 'balance_scale': '⚖️',\n 'probing_cane': '🦯',\n 'link': '🔗',\n 'chains': '⛓️',\n 'hook': '🪝',\n 'toolbox': '🧰',\n 'magnet': '🧲',\n 'ladder': '🪜',\n 'alembic': '⚗️',\n 'test_tube': '🧪',\n 'petri_dish': '🧫',\n 'dna': '🧬',\n 'microscope': '🔬',\n 'telescope': '🔭',\n 'satellite': '📡',\n 'syringe': '💉',\n 'drop_of_blood': '🩸',\n 'pill': '💊',\n 'adhesive_bandage': '🩹',\n 'stethoscope': '🩺',\n 'door': '🚪',\n 'elevator': '🛗',\n 'mirror': '🪞',\n 'window': '🪟',\n 'bed': '🛏️',\n 'couch_and_lamp': '🛋️',\n 'chair': '🪑',\n 'toilet': '🚽',\n 'plunger': '🪠',\n 'shower': '🚿',\n 'bathtub': '🛁',\n 'mouse_trap': '🪤',\n 'razor': '🪒',\n 'lotion_bottle': '🧴',\n 'safety_pin': '🧷',\n 'broom': '🧹',\n 'basket': '🧺',\n 'roll_of_paper': '🧻',\n 'bucket': '🪣',\n 'soap': '🧼',\n 'toothbrush': '🪥',\n 'sponge': '🧽',\n 'fire_extinguisher': '🧯',\n 'shopping_cart': '🛒',\n 'smoking': '🚬',\n 'coffin': '⚰️',\n 'headstone': '🪦',\n 'funeral_urn': '⚱️',\n 'moyai': '🗿',\n 'placard': '🪧',\n 'atm': '🏧',\n 'put_litter_in_its_place': '🚮',\n 'potable_water': '🚰',\n 'wheelchair': '♿',\n 'mens': '🚹',\n 'womens': '🚺',\n 'restroom': '🚻',\n 'baby_symbol': '🚼',\n 'wc': '🚾',\n 'passport_control': '🛂',\n 'customs': '🛃',\n 'baggage_claim': '🛄',\n 'left_luggage': '🛅',\n 'warning': '⚠️',\n 'children_crossing': '🚸',\n 'no_entry': '⛔',\n 'no_entry_sign': '🚫',\n 'no_bicycles': '🚳',\n 'no_smoking': '🚭',\n 'do_not_litter': '🚯',\n 'non-potable_water': '🚱',\n 'no_pedestrians': '🚷',\n 'no_mobile_phones': '📵',\n 'underage': '🔞',\n 'radioactive': '☢️',\n 'biohazard': '☣️',\n 'arrow_up': '⬆️',\n 'arrow_upper_right': '↗️',\n 'arrow_right': '➡️',\n 'arrow_lower_right': '↘️',\n 'arrow_down': '⬇️',\n 'arrow_lower_left': '↙️',\n 'arrow_left': '⬅️',\n 'arrow_upper_left': '↖️',\n 'arrow_up_down': '↕️',\n 'left_right_arrow': '↔️',\n 'leftwards_arrow_with_hook': '↩️',\n 'arrow_right_hook': '↪️',\n 'arrow_heading_up': '⤴️',\n 'arrow_heading_down': '⤵️',\n 'arrows_clockwise': '🔃',\n 'arrows_counterclockwise': '🔄',\n 'back': '🔙',\n 'end': '🔚',\n 'on': '🔛',\n 'soon': '🔜',\n 'top': '🔝',\n 'place_of_worship': '🛐',\n 'atom_symbol': '⚛️',\n 'om': '🕉️',\n 'star_of_david': '✡️',\n 'wheel_of_dharma': '☸️',\n 'yin_yang': '☯️',\n 'latin_cross': '✝️',\n 'orthodox_cross': '☦️',\n 'star_and_crescent': '☪️',\n 'peace_symbol': '☮️',\n 'menorah': '🕎',\n 'six_pointed_star': '🔯',\n 'aries': '♈',\n 'taurus': '♉',\n 'gemini': '♊',\n 'cancer': '♋',\n 'leo': '♌',\n 'virgo': '♍',\n 'libra': '♎',\n 'scorpius': '♏',\n 'sagittarius': '♐',\n 'capricorn': '♑',\n 'aquarius': '♒',\n 'pisces': '♓',\n 'ophiuchus': '⛎',\n 'twisted_rightwards_arrows': '🔀',\n 'repeat': '🔁',\n 'repeat_one': '🔂',\n 'arrow_forward': '▶️',\n 'fast_forward': '⏩',\n 'next_track_button': '⏭️',\n 'play_or_pause_button': '⏯️',\n 'arrow_backward': '◀️',\n 'rewind': '⏪',\n 'previous_track_button': '⏮️',\n 'arrow_up_small': '🔼',\n 'arrow_double_up': '⏫',\n 'arrow_down_small': '🔽',\n 'arrow_double_down': '⏬',\n 'pause_button': '⏸️',\n 'stop_button': '⏹️',\n 'record_button': '⏺️',\n 'eject_button': '⏏️',\n 'cinema': '🎦',\n 'low_brightness': '🔅',\n 'high_brightness': '🔆',\n 'signal_strength': '📶',\n 'vibration_mode': '📳',\n 'mobile_phone_off': '📴',\n 'female_sign': '♀️',\n 'male_sign': '♂️',\n 'transgender_symbol': '⚧️',\n 'heavy_multiplication_x': '✖️',\n 'heavy_plus_sign': '➕',\n 'heavy_minus_sign': '➖',\n 'heavy_division_sign': '➗',\n 'infinity': '♾️',\n 'bangbang': '‼️',\n 'interrobang': '⁉️',\n 'question': '❓',\n 'grey_question': '❔',\n 'grey_exclamation': '❕',\n 'exclamation': '❗',\n 'heavy_exclamation_mark': '❗',\n 'wavy_dash': '〰️',\n 'currency_exchange': '💱',\n 'heavy_dollar_sign': '💲',\n 'medical_symbol': '⚕️',\n 'recycle': '♻️',\n 'fleur_de_lis': '⚜️',\n 'trident': '🔱',\n 'name_badge': '📛',\n 'beginner': '🔰',\n 'o': '⭕',\n 'white_check_mark': '✅',\n 'ballot_box_with_check': '☑️',\n 'heavy_check_mark': '✔️',\n 'x': '❌',\n 'negative_squared_cross_mark': '❎',\n 'curly_loop': '➰',\n 'loop': '➿',\n 'part_alternation_mark': '〽️',\n 'eight_spoked_asterisk': '✳️',\n 'eight_pointed_black_star': '✴️',\n 'sparkle': '❇️',\n 'copyright': '©️',\n 'registered': '®️',\n 'tm': '™️',\n 'hash': '#️⃣',\n 'asterisk': '*️⃣',\n 'zero': '0️⃣',\n 'one': '1️⃣',\n 'two': '2️⃣',\n 'three': '3️⃣',\n 'four': '4️⃣',\n 'five': '5️⃣',\n 'six': '6️⃣',\n 'seven': '7️⃣',\n 'eight': '8️⃣',\n 'nine': '9️⃣',\n 'keycap_ten': '🔟',\n 'capital_abcd': '🔠',\n 'abcd': '🔡',\n 'symbols': '🔣',\n 'abc': '🔤',\n 'a': '🅰️',\n 'ab': '🆎',\n 'b': '🅱️',\n 'cl': '🆑',\n 'cool': '🆒',\n 'free': '🆓',\n 'information_source': 'ℹ️',\n 'id': '🆔',\n 'm': 'Ⓜ️',\n 'new': '🆕',\n 'ng': '🆖',\n 'o2': '🅾️',\n 'ok': '🆗',\n 'parking': '🅿️',\n 'sos': '🆘',\n 'up': '🆙',\n 'vs': '🆚',\n 'koko': '🈁',\n 'sa': '🈂️',\n 'ideograph_advantage': '🉐',\n 'accept': '🉑',\n 'congratulations': '㊗️',\n 'secret': '㊙️',\n 'u6e80': '🈵',\n 'red_circle': '🔴',\n 'orange_circle': '🟠',\n 'yellow_circle': '🟡',\n 'green_circle': '🟢',\n 'large_blue_circle': '🔵',\n 'purple_circle': '🟣',\n 'brown_circle': '🟤',\n 'black_circle': '⚫',\n 'white_circle': '⚪',\n 'red_square': '🟥',\n 'orange_square': '🟧',\n 'yellow_square': '🟨',\n 'green_square': '🟩',\n 'blue_square': '🟦',\n 'purple_square': '🟪',\n 'brown_square': '🟫',\n 'black_large_square': '⬛',\n 'white_large_square': '⬜',\n 'black_medium_square': '◼️',\n 'white_medium_square': '◻️',\n 'black_medium_small_square': '◾',\n 'white_medium_small_square': '◽',\n 'black_small_square': '▪️',\n 'white_small_square': '▫️',\n 'large_orange_diamond': '🔶',\n 'large_blue_diamond': '🔷',\n 'small_orange_diamond': '🔸',\n 'small_blue_diamond': '🔹',\n 'small_red_triangle': '🔺',\n 'small_red_triangle_down': '🔻',\n 'diamond_shape_with_a_dot_inside': '💠',\n 'radio_button': '🔘',\n 'white_square_button': '🔳',\n 'black_square_button': '🔲',\n 'checkered_flag': '🏁',\n 'triangular_flag_on_post': '🚩',\n 'crossed_flags': '🎌',\n 'black_flag': '🏴',\n 'white_flag': '🏳️',\n 'rainbow_flag': '🏳️‍🌈',\n 'transgender_flag': '🏳️‍⚧️',\n 'pirate_flag': '🏴‍☠️',\n 'ascension_island': '🇦🇨',\n 'andorra': '🇦🇩',\n 'united_arab_emirates': '🇦🇪',\n 'afghanistan': '🇦🇫',\n 'antigua_barbuda': '🇦🇬',\n 'anguilla': '🇦🇮',\n 'albania': '🇦🇱',\n 'armenia': '🇦🇲',\n 'angola': '🇦🇴',\n 'antarctica': '🇦🇶',\n 'argentina': '🇦🇷',\n 'american_samoa': '🇦🇸',\n 'austria': '🇦🇹',\n 'australia': '🇦🇺',\n 'aruba': '🇦🇼',\n 'aland_islands': '🇦🇽',\n 'azerbaijan': '🇦🇿',\n 'bosnia_herzegovina': '🇧🇦',\n 'barbados': '🇧🇧',\n 'bangladesh': '🇧🇩',\n 'belgium': '🇧🇪',\n 'burkina_faso': '🇧🇫',\n 'bulgaria': '🇧🇬',\n 'bahrain': '🇧🇭',\n 'burundi': '🇧🇮',\n 'benin': '🇧🇯',\n 'st_barthelemy': '🇧🇱',\n 'bermuda': '🇧🇲',\n 'brunei': '🇧🇳',\n 'bolivia': '🇧🇴',\n 'caribbean_netherlands': '🇧🇶',\n 'brazil': '🇧🇷',\n 'bahamas': '🇧🇸',\n 'bhutan': '🇧🇹',\n 'bouvet_island': '🇧🇻',\n 'botswana': '🇧🇼',\n 'belarus': '🇧🇾',\n 'belize': '🇧🇿',\n 'canada': '🇨🇦',\n 'cocos_islands': '🇨🇨',\n 'congo_kinshasa': '🇨🇩',\n 'central_african_republic': '🇨🇫',\n 'congo_brazzaville': '🇨🇬',\n 'switzerland': '🇨🇭',\n 'cote_divoire': '🇨🇮',\n 'cook_islands': '🇨🇰',\n 'chile': '🇨🇱',\n 'cameroon': '🇨🇲',\n 'cn': '🇨🇳',\n 'colombia': '🇨🇴',\n 'clipperton_island': '🇨🇵',\n 'costa_rica': '🇨🇷',\n 'cuba': '🇨🇺',\n 'cape_verde': '🇨🇻',\n 'curacao': '🇨🇼',\n 'christmas_island': '🇨🇽',\n 'cyprus': '🇨🇾',\n 'czech_republic': '🇨🇿',\n 'de': '🇩🇪',\n 'diego_garcia': '🇩🇬',\n 'djibouti': '🇩🇯',\n 'denmark': '🇩🇰',\n 'dominica': '🇩🇲',\n 'dominican_republic': '🇩🇴',\n 'algeria': '🇩🇿',\n 'ceuta_melilla': '🇪🇦',\n 'ecuador': '🇪🇨',\n 'estonia': '🇪🇪',\n 'egypt': '🇪🇬',\n 'western_sahara': '🇪🇭',\n 'eritrea': '🇪🇷',\n 'es': '🇪🇸',\n 'ethiopia': '🇪🇹',\n 'eu': '🇪🇺',\n 'european_union': '🇪🇺',\n 'finland': '🇫🇮',\n 'fiji': '🇫🇯',\n 'falkland_islands': '🇫🇰',\n 'micronesia': '🇫🇲',\n 'faroe_islands': '🇫🇴',\n 'fr': '🇫🇷',\n 'gabon': '🇬🇦',\n 'gb': '🇬🇧',\n 'uk': '🇬🇧',\n 'grenada': '🇬🇩',\n 'georgia': '🇬🇪',\n 'french_guiana': '🇬🇫',\n 'guernsey': '🇬🇬',\n 'ghana': '🇬🇭',\n 'gibraltar': '🇬🇮',\n 'greenland': '🇬🇱',\n 'gambia': '🇬🇲',\n 'guinea': '🇬🇳',\n 'guadeloupe': '🇬🇵',\n 'equatorial_guinea': '🇬🇶',\n 'greece': '🇬🇷',\n 'south_georgia_south_sandwich_islands': '🇬🇸',\n 'guatemala': '🇬🇹',\n 'guam': '🇬🇺',\n 'guinea_bissau': '🇬🇼',\n 'guyana': '🇬🇾',\n 'hong_kong': '🇭🇰',\n 'heard_mcdonald_islands': '🇭🇲',\n 'honduras': '🇭🇳',\n 'croatia': '🇭🇷',\n 'haiti': '🇭🇹',\n 'hungary': '🇭🇺',\n 'canary_islands': '🇮🇨',\n 'indonesia': '🇮🇩',\n 'ireland': '🇮🇪',\n 'israel': '🇮🇱',\n 'isle_of_man': '🇮🇲',\n 'india': '🇮🇳',\n 'british_indian_ocean_territory': '🇮🇴',\n 'iraq': '🇮🇶',\n 'iran': '🇮🇷',\n 'iceland': '🇮🇸',\n 'it': '🇮🇹',\n 'jersey': '🇯🇪',\n 'jamaica': '🇯🇲',\n 'jordan': '🇯🇴',\n 'jp': '🇯🇵',\n 'kenya': '🇰🇪',\n 'kyrgyzstan': '🇰🇬',\n 'cambodia': '🇰🇭',\n 'kiribati': '🇰🇮',\n 'comoros': '🇰🇲',\n 'st_kitts_nevis': '🇰🇳',\n 'north_korea': '🇰🇵',\n 'kr': '🇰🇷',\n 'kuwait': '🇰🇼',\n 'cayman_islands': '🇰🇾',\n 'kazakhstan': '🇰🇿',\n 'laos': '🇱🇦',\n 'lebanon': '🇱🇧',\n 'st_lucia': '🇱🇨',\n 'liechtenstein': '🇱🇮',\n 'sri_lanka': '🇱🇰',\n 'liberia': '🇱🇷',\n 'lesotho': '🇱🇸',\n 'lithuania': '🇱🇹',\n 'luxembourg': '🇱🇺',\n 'latvia': '🇱🇻',\n 'libya': '🇱🇾',\n 'morocco': '🇲🇦',\n 'monaco': '🇲🇨',\n 'moldova': '🇲🇩',\n 'montenegro': '🇲🇪',\n 'st_martin': '🇲🇫',\n 'madagascar': '🇲🇬',\n 'marshall_islands': '🇲🇭',\n 'macedonia': '🇲🇰',\n 'mali': '🇲🇱',\n 'myanmar': '🇲🇲',\n 'mongolia': '🇲🇳',\n 'macau': '🇲🇴',\n 'northern_mariana_islands': '🇲🇵',\n 'martinique': '🇲🇶',\n 'mauritania': '🇲🇷',\n 'montserrat': '🇲🇸',\n 'malta': '🇲🇹',\n 'mauritius': '🇲🇺',\n 'maldives': '🇲🇻',\n 'malawi': '🇲🇼',\n 'mexico': '🇲🇽',\n 'malaysia': '🇲🇾',\n 'mozambique': '🇲🇿',\n 'namibia': '🇳🇦',\n 'new_caledonia': '🇳🇨',\n 'niger': '🇳🇪',\n 'norfolk_island': '🇳🇫',\n 'nigeria': '🇳🇬',\n 'nicaragua': '🇳🇮',\n 'netherlands': '🇳🇱',\n 'norway': '🇳🇴',\n 'nepal': '🇳🇵',\n 'nauru': '🇳🇷',\n 'niue': '🇳🇺',\n 'new_zealand': '🇳🇿',\n 'oman': '🇴🇲',\n 'panama': '🇵🇦',\n 'peru': '🇵🇪',\n 'french_polynesia': '🇵🇫',\n 'papua_new_guinea': '🇵🇬',\n 'philippines': '🇵🇭',\n 'pakistan': '🇵🇰',\n 'poland': '🇵🇱',\n 'st_pierre_miquelon': '🇵🇲',\n 'pitcairn_islands': '🇵🇳',\n 'puerto_rico': '🇵🇷',\n 'palestinian_territories': '🇵🇸',\n 'portugal': '🇵🇹',\n 'palau': '🇵🇼',\n 'paraguay': '🇵🇾',\n 'qatar': '🇶🇦',\n 'reunion': '🇷🇪',\n 'romania': '🇷🇴',\n 'serbia': '🇷🇸',\n 'ru': '🇷🇺',\n 'rwanda': '🇷🇼',\n 'saudi_arabia': '🇸🇦',\n 'solomon_islands': '🇸🇧',\n 'seychelles': '🇸🇨',\n 'sudan': '🇸🇩',\n 'sweden': '🇸🇪',\n 'singapore': '🇸🇬',\n 'st_helena': '🇸🇭',\n 'slovenia': '🇸🇮',\n 'svalbard_jan_mayen': '🇸🇯',\n 'slovakia': '🇸🇰',\n 'sierra_leone': '🇸🇱',\n 'san_marino': '🇸🇲',\n 'senegal': '🇸🇳',\n 'somalia': '🇸🇴',\n 'suriname': '🇸🇷',\n 'south_sudan': '🇸🇸',\n 'sao_tome_principe': '🇸🇹',\n 'el_salvador': '🇸🇻',\n 'sint_maarten': '🇸🇽',\n 'syria': '🇸🇾',\n 'swaziland': '🇸🇿',\n 'tristan_da_cunha': '🇹🇦',\n 'turks_caicos_islands': '🇹🇨',\n 'chad': '🇹🇩',\n 'french_southern_territories': '🇹🇫',\n 'togo': '🇹🇬',\n 'thailand': '🇹🇭',\n 'tajikistan': '🇹🇯',\n 'tokelau': '🇹🇰',\n 'timor_leste': '🇹🇱',\n 'turkmenistan': '🇹🇲',\n 'tunisia': '🇹🇳',\n 'tonga': '🇹🇴',\n 'tr': '🇹🇷',\n 'trinidad_tobago': '🇹🇹',\n 'tuvalu': '🇹🇻',\n 'taiwan': '🇹🇼',\n 'tanzania': '🇹🇿',\n 'ukraine': '🇺🇦',\n 'uganda': '🇺🇬',\n 'us_outlying_islands': '🇺🇲',\n 'united_nations': '🇺🇳',\n 'us': '🇺🇸',\n 'uruguay': '🇺🇾',\n 'uzbekistan': '🇺🇿',\n 'vatican_city': '🇻🇦',\n 'st_vincent_grenadines': '🇻🇨',\n 'venezuela': '🇻🇪',\n 'british_virgin_islands': '🇻🇬',\n 'us_virgin_islands': '🇻🇮',\n 'vietnam': '🇻🇳',\n 'vanuatu': '🇻🇺',\n 'wallis_futuna': '🇼🇫',\n 'samoa': '🇼🇸',\n 'kosovo': '🇽🇰',\n 'yemen': '🇾🇪',\n 'mayotte': '🇾🇹',\n 'south_africa': '🇿🇦',\n 'zambia': '🇿🇲',\n 'zimbabwe': '🇿🇼',\n 'england': '🏴󠁧󠁢󠁥󠁮󠁧󠁿',\n 'scotland': '🏴󠁧󠁢󠁳󠁣󠁴󠁿',\n 'wales': '🏴󠁧󠁢󠁷󠁬󠁳󠁿',\n} as any\n\nexport const emojisToName = Object.keys(namesToEmoji).reduce((accu: any, name: any) => {\n const emoji = namesToEmoji[name]\n accu[emoji] = name\n return accu\n}, {})\n\nexport const names = Object.keys(namesToEmoji).map(key => key)\nexport const emojis = Object.keys(namesToEmoji).map(key => namesToEmoji[key])\n\nexport function emojiSearch(query: any) {\n return names\n .filter(name => name.startsWith(query))\n .map(name => ({\n name,\n emoji: namesToEmoji[name],\n }))\n}\n","/* eslint-disable ts/no-unused-expressions */\nimport clsx from 'clsx'\nimport React, { forwardRef, useEffect, useImperativeHandle, useRef, useState } from 'react'\n\nimport scrollIntoView from 'scroll-into-view-if-needed'\nimport { useLocale } from '@/locales'\n\ninterface IProps {\n items: Array<{ name: string, emoji: string, fallbackImage?: string }>\n command: any\n}\n\nexport const EmojiList: React.FC<IProps> = forwardRef((props, ref) => {\n const $container: any = useRef<HTMLDivElement>()\n const [selectedIndex, setSelectedIndex] = useState(0)\n const { t } = useLocale()\n\n const selectItem = (index: any) => {\n const item = props.items[index]\n\n if (item) {\n props.command(item)\n }\n }\n\n const upHandler = () => {\n setSelectedIndex((selectedIndex + props.items.length - 1) % props.items.length)\n }\n\n const downHandler = () => {\n setSelectedIndex((selectedIndex + 1) % props.items.length)\n }\n\n const enterHandler = () => {\n selectItem(selectedIndex)\n }\n\n useEffect(() => setSelectedIndex(0), [props.items])\n\n useEffect(() => {\n if (Number.isNaN(selectedIndex + 1))\n return\n const el = $container.current.querySelector(`span:nth-of-type(${selectedIndex + 1})`)\n el && scrollIntoView(el, { behavior: 'smooth', scrollMode: 'if-needed' })\n }, [selectedIndex])\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: any) => {\n if (event.key === 'ArrowUp') {\n upHandler()\n return true\n }\n\n if (event.key === 'ArrowDown') {\n downHandler()\n return true\n }\n\n if (event.key === 'Enter') {\n enterHandler()\n return true\n }\n\n return false\n },\n }))\n\n return (\n <div className=\"richtext-w-[200px] richtext-max-h-[320px] richtext-overflow-x-hidden richtext-overflow-y-auto richtext-rounded-sm !richtext-border richtext-bg-popover richtext-p-1 richtext-text-popover-foreground richtext-shadow-md richtext-outline-none\">\n <div ref={$container}>\n {props.items.length\n ? (\n props.items.map((item, index) => (\n <span\n className={clsx(' richtext-flex richtext-relative richtext-cursor-default richtext-select-none richtext-items-center richtext-rounded-sm richtext-px-2 richtext-py-1.5 richtext-text-sm richtext-outline-none richtext-transition-colors focus:richtext-bg-accent focus:richtext-text-accent-foreground hover:richtext-bg-accent', index === selectedIndex ? 'bg-accent' : '')}\n key={index}\n onClick={() => selectItem(index)}\n >\n {item.fallbackImage ? <img src={item.fallbackImage} className=\"richtext-w-[1em] richtext-h-[1em]\" /> : item.emoji}\n :\n {item.name}\n :\n </span>\n ))\n )\n : (\n <div className=\"richtext-flex richtext-relative richtext-cursor-default richtext-select-none richtext-items-center richtext-rounded-sm richtext-px-2 richtext-py-1.5 richtext-text-sm richtext-outline-none richtext-transition-colors\">\n <span>{t('no_result_found')}</span>\n </div>\n )}\n </div>\n </div>\n )\n})\n\nEmojiList.displayName = 'EmojiList'\n","export const EXPRESSIONES = [\n '😀',\n '😃',\n '😄',\n '😁',\n '😆',\n '😅',\n '😂',\n '🤣',\n '🥲',\n '😊',\n '😇',\n '🙂',\n '🙃',\n '😉',\n '😌',\n '😍',\n '🥰',\n '😘',\n '😗',\n '😙',\n '😚',\n '😋',\n '😛',\n '😝',\n '😜',\n '🤪',\n '🤨',\n '🧐',\n '🤓',\n '😎',\n '🥸',\n '🤩',\n '🥳',\n '😏',\n '😒',\n '😞',\n '😔',\n '😟',\n '😕',\n '🙁',\n '😣',\n '😖',\n '😫',\n '😩',\n '🥺',\n '😢',\n '😭',\n '😤',\n '😠',\n '😡',\n '🤬',\n '🤯',\n '😳',\n '🥵',\n '🥶',\n '😱',\n '😨',\n '😰',\n '😥',\n '😓',\n '🤗',\n '🤔',\n '🤭',\n '🤫',\n '🤥',\n '😶',\n '😐',\n '😑',\n '😬',\n '🙄',\n '😯',\n '😦',\n '😧',\n '😮',\n '😲',\n '🥱',\n '😴',\n '🤤',\n '😪',\n '😵',\n '🤐',\n '🥴',\n '🤢',\n '🤮',\n '🤧',\n '😷',\n '🤒',\n '🤕',\n '🤑',\n '🤠',\n '😈',\n '👿',\n '👹',\n '👺',\n '🤡',\n '💩',\n '👻',\n '💀',\n '☠️',\n '👽',\n '👾',\n '🤖',\n '🎃',\n '😺',\n '😸',\n '😹',\n '😻',\n '😼',\n '😽',\n '🙀',\n '😿',\n '😾',\n '👋',\n '🤚',\n '🖐',\n '✋',\n '🖖',\n '👌',\n '🤌',\n '🤏',\n '✌️',\n '🤞',\n '🤟',\n '🤘',\n '🤙',\n '👈',\n '👉',\n '👆',\n '🖕',\n '👇',\n '☝️',\n '👍',\n '👎',\n '✊',\n '👊',\n '🤛',\n '🤜',\n '👏',\n '🙌',\n '👐',\n '🤲',\n '🤝',\n '🙏',\n '✍️',\n '💅',\n '🤳',\n '💪',\n '🦾',\n '🦵',\n '🦿',\n '🦶',\n '👣',\n '👂',\n '🦻',\n '👃',\n '🫀',\n '🫁',\n '🧠',\n '🦷',\n '🦴',\n '👀',\n '👁',\n '👅',\n '👄',\n '💋',\n '🩸',\n\n '💋',\n '💌',\n '💘',\n '💝',\n '💖',\n '💗',\n '💓',\n '💞',\n '💕',\n '💟',\n '❣️',\n '❣',\n '💔',\n '❤️‍🔥',\n '❤‍🔥',\n '❤️‍🩹',\n '❤‍🩹',\n '❤️',\n '❤',\n '🧡',\n '💛',\n '💚',\n '💙',\n '💜',\n '🤎',\n '🖤',\n '🤍',\n '💯',\n '💢',\n '💥',\n '💫',\n '💦',\n '💨',\n '🕳️',\n '🕳',\n '💣',\n '💬',\n '👁️‍🗨️',\n '👁‍🗨️',\n '👁️‍🗨',\n '👁‍🗨',\n '🗨️',\n '🗨',\n '🗯️',\n '🗯',\n '💭',\n '💤',\n]\n\nexport const SYMBOLS = [\n '🏧',\n '🚮',\n '🚰',\n '♿',\n '🚹',\n '🚺',\n '🚻',\n '🚼',\n '🚾',\n '🛂',\n '🛃',\n '🛄',\n '🛅',\n '⚠️',\n '⚠',\n '🚸',\n '⛔',\n '🚫',\n '🚳',\n '🚭',\n '🚯',\n '🚱',\n '🚷',\n '📵',\n '🔞',\n '☢️',\n '☢',\n '☣️',\n '☣',\n '⬆️',\n '⬆',\n '↗️',\n '↗',\n '➡️',\n '➡',\n '↘️',\n '↘',\n '⬇️',\n '⬇',\n '↙️',\n '↙',\n '⬅️',\n '⬅',\n '↖️',\n '↖',\n '↕️',\n '↕',\n '↔️',\n '↔',\n '↩️',\n '↩',\n '↪️',\n '↪',\n '⤴️',\n '⤴',\n '⤵️',\n '⤵',\n '🔃',\n '🔄',\n '🔙',\n '🔚',\n '🔛',\n '🔜',\n '🔝',\n '🛐',\n '⚛️',\n '⚛',\n '🕉️',\n '🕉',\n '✡️',\n '✡',\n '☸️',\n '☸',\n '☯️',\n '☯',\n '✝️',\n '✝',\n '☦️',\n '☦',\n '☪️',\n '☪',\n '☮️',\n '☮',\n '🕎',\n '🔯',\n '♈',\n '♉',\n '♊',\n '♋',\n '♌',\n '♍',\n '♎',\n '♏',\n '♐',\n '♑',\n '♒',\n '♓',\n '⛎',\n '🔀',\n '🔁',\n '🔂',\n '▶️',\n '▶',\n '⏩',\n '⏭️',\n '⏭',\n '⏯️',\n '⏯',\n '◀️',\n '◀',\n '⏪',\n '⏮️',\n '⏮',\n '🔼',\n '⏫',\n '🔽',\n '⏬',\n '⏸️',\n '⏸',\n '⏹️',\n '⏹',\n '⏺️',\n '⏺',\n '⏏️',\n '⏏',\n '🎦',\n '🔅',\n '🔆',\n '📶',\n '📳',\n '📴',\n '♀️',\n '♀',\n '♂️',\n '♂',\n '⚧️',\n '⚧',\n '✖️',\n '✖',\n '➕',\n '➖',\n '➗',\n '♾️',\n '♾',\n '‼️',\n '‼',\n '⁉️',\n '⁉',\n '❓',\n '❔',\n '❕',\n '❗',\n '〰️',\n '〰',\n '💱',\n '💲',\n '⚕️',\n '⚕',\n '♻️',\n '♻',\n '⚜️',\n '⚜',\n '🔱',\n '📛',\n '🔰',\n '⭕',\n '✅',\n '☑️',\n '☑',\n '✔️',\n '✔',\n '❌',\n '❎',\n '➰',\n '➿',\n '〽️',\n '〽',\n '✳️',\n '✳',\n '✴️',\n '✴',\n '❇️',\n '❇',\n '©️',\n '©',\n '®️',\n '®',\n '™️',\n '™',\n '#️⃣',\n '#⃣',\n '*️⃣',\n '*⃣',\n '0️⃣',\n '0⃣',\n '1️⃣',\n '1⃣',\n '2️⃣',\n '2⃣',\n '3️⃣',\n '3⃣',\n '4️⃣',\n '4⃣',\n '5️⃣',\n '5⃣',\n '6️⃣',\n '6⃣',\n '7️⃣',\n '7⃣',\n '8️⃣',\n '8⃣',\n '9️⃣',\n '9⃣',\n '🔟',\n '🔠',\n '🔡',\n '🔢',\n '🔣',\n '🔤',\n '🅰️',\n '🅰',\n '🆎',\n '🅱️',\n '🅱',\n '🆑',\n '🆒',\n '🆓',\n 'ℹ️',\n 'ℹ',\n '🆔',\n 'Ⓜ️',\n 'Ⓜ',\n '🆕',\n '🆖',\n '🅾️',\n '🅾',\n '🆗',\n '🅿️',\n '🅿',\n '🆘',\n '🆙',\n '🆚',\n '🈁',\n '🈂️',\n '🈂',\n '🈷️',\n '🈷',\n '🈶',\n '🈯',\n '🉐',\n '🈹',\n '🈚',\n '🈲',\n '🉑',\n '🈸',\n '🈴',\n '🈳',\n '㊗️',\n '㊗',\n '㊙️',\n '㊙',\n '🈺',\n '🈵',\n '🔴',\n '🟠',\n '🟡',\n '🟢',\n '🔵',\n '🟣',\n '🟤',\n '⚫',\n '⚪',\n '🟥',\n '🟧',\n '🟨',\n '🟩',\n '🟦',\n '🟪',\n '🟫',\n '⬛',\n '⬜',\n '◼️',\n '◼',\n '◻️',\n '◻',\n '◾',\n '◽',\n '▪️',\n '▪',\n '▫️',\n '▫',\n '🔶',\n '🔷',\n '🔸',\n '🔹',\n '🔺',\n '🔻',\n '💠',\n '🔘',\n '🔳',\n '🔲',\n]\n\nexport const OBJECTS = [\n '👓',\n '🕶️',\n '🕶',\n '🥽',\n '🥼',\n '🦺',\n '👔',\n '👕',\n '👖',\n '🧣',\n '🧤',\n '🧥',\n '🧦',\n '👗',\n '👘',\n '🥻',\n '🩱',\n '🩲',\n '🩳',\n '👙',\n '👚',\n '👛',\n '👜',\n '👝',\n '🛍️',\n '🛍',\n '🎒',\n '🩴',\n '👞',\n '👟',\n '🥾',\n '🥿',\n '👠',\n '👡',\n '🩰',\n '👢',\n '👑',\n '👒',\n '🎩',\n '🎓',\n '🧢',\n '🪖',\n '⛑️',\n '⛑',\n '📿',\n '💄',\n '💍',\n '💎',\n '🔇',\n '🔈',\n '🔉',\n '🔊',\n '📢',\n '📣',\n '📯',\n '🔔',\n '🔕',\n '🎼',\n '🎵',\n '🎶',\n '🎙️',\n '🎙',\n '🎚️',\n '🎚',\n '🎛️',\n '🎛',\n '🎤',\n '🎧',\n '📻',\n '🎷',\n '🪗',\n '🎸',\n '🎹',\n '🎺',\n '🎻',\n '🪕',\n '🥁',\n '🪘',\n '📱',\n '📲',\n '☎️',\n '☎',\n '📞',\n '📟',\n '📠',\n '🔋',\n '🔌',\n '💻',\n '🖥️',\n '🖥',\n '🖨️',\n '🖨',\n '⌨️',\n '⌨',\n '🖱️',\n '🖱',\n '🖲️',\n '🖲',\n '💽',\n '💾',\n '💿',\n '📀',\n '🧮',\n '🎥',\n '🎞️',\n '🎞',\n '📽️',\n '📽',\n '🎬',\n '📺',\n '📷',\n '📸',\n '📹',\n '📼',\n '🔍',\n '🔎',\n '🕯️',\n '🕯',\n '💡',\n '🔦',\n '🏮',\n '🪔',\n '📔',\n '📕',\n '📖',\n '📗',\n '📘',\n '📙',\n '📚',\n '📓',\n '📒',\n '📃',\n '📜',\n '📄',\n '📰',\n '🗞️',\n '🗞',\n '📑',\n '🔖',\n '🏷️',\n '🏷',\n '💰',\n '🪙',\n '💴',\n '💵',\n '💶',\n '💷',\n '💸',\n '💳',\n '🧾',\n '💹',\n '✉️',\n '✉',\n '📧',\n '📨',\n '📩',\n '📤',\n '📥',\n '📦',\n '📫',\n '📪',\n '📬',\n '📭',\n '📮',\n '🗳️',\n '🗳',\n '✏️',\n '✏',\n '✒️',\n '✒',\n '🖋️',\n '🖋',\n '🖊️',\n '🖊',\n '🖌️',\n '🖌',\n '🖍️',\n '🖍',\n '📝',\n '💼',\n '📁',\n '📂',\n '🗂️',\n '🗂',\n '📅',\n '📆',\n '🗒️',\n '🗒',\n '🗓️',\n '🗓',\n '📇',\n '📈',\n '📉',\n '📊',\n '📋',\n '📌',\n '📍',\n '📎',\n '🖇️',\n '🖇',\n '📏',\n '📐',\n '✂️',\n '✂',\n '🗃️',\n '🗃',\n '🗄️',\n '🗄',\n '🗑️',\n '🗑',\n '🔒',\n '🔓',\n '🔏',\n '🔐',\n '🔑',\n '🗝️',\n '🗝',\n '🔨',\n '🪓',\n '⛏️',\n '⛏',\n '⚒️',\n '⚒',\n '🛠️',\n '🛠',\n '🗡️',\n '🗡',\n '⚔️',\n '⚔',\n '🔫',\n '🪃',\n '🏹',\n '🛡️',\n '🛡',\n '🪚',\n '🔧',\n '🪛',\n '🔩',\n '⚙️',\n '⚙',\n '🗜️',\n '🗜',\n '⚖️',\n '⚖',\n '🦯',\n '🔗',\n '⛓️',\n '⛓',\n '🪝',\n '🧰',\n '🧲',\n '🪜',\n '⚗️',\n '⚗',\n '🧪',\n '🧫',\n '🧬',\n '🔬',\n '🔭',\n '📡',\n '💉',\n '🩸',\n '💊',\n '🩹',\n '🩺',\n '🚪',\n '🛗',\n '🪞',\n '🪟',\n '🛏️',\n '🛏',\n '🛋️',\n '🛋',\n '🪑',\n '🚽',\n '🪠',\n '🚿',\n '🛁',\n '🪤',\n '🪒',\n '🧴',\n '🧷',\n '🧹',\n '🧺',\n '🧻',\n '🪣',\n '🧼',\n '🪥',\n '🧽',\n '🧯',\n '🛒',\n '🚬',\n '⚰️',\n '⚰',\n '🪦',\n '⚱️',\n '⚱',\n '🗿',\n '🪧',\n]\n\nexport const ACTIVITIES = [\n '🎃',\n '🎄',\n '🎆',\n '🎇',\n '🧨',\n '✨',\n '🎈',\n '🎉',\n '🎊',\n '🎋',\n '🎍',\n '🎎',\n '🎏',\n '🎐',\n '🎑',\n '🧧',\n '🎀',\n '🎁',\n '🎗️',\n '🎗',\n '🎟️',\n '🎟',\n '🎫',\n '🎖️',\n '🎖',\n '🏆',\n '🏅',\n '🥇',\n '🥈',\n '🥉',\n '⚽',\n '⚾',\n '🥎',\n '🏀',\n '🏐',\n '🏈',\n '🏉',\n '🎾',\n '🥏',\n '🎳',\n '🏏',\n '🏑',\n '🏒',\n '🥍',\n '🏓',\n '🏸',\n '🥊',\n '🥋',\n '🥅',\n '⛳',\n '⛸️',\n '⛸',\n '🎣',\n '🤿',\n '🎽',\n '🎿',\n '🛷',\n '🥌',\n '🎯',\n '🪀',\n '🪁',\n '🎱',\n '🔮',\n '🪄',\n '🧿',\n '🎮',\n '🕹️',\n '🕹',\n '🎰',\n '🎲',\n '🧩',\n '🧸',\n '🪅',\n '🪆',\n '♠️',\n '♠',\n '♥️',\n '♥',\n '♦️',\n '♦',\n '♣️',\n '♣',\n '♟️',\n '♟',\n '🃏',\n '🀄',\n '🎴',\n '🎭',\n '🖼️',\n '🖼',\n '🎨',\n '🧵',\n '🪡',\n '🧶',\n '🪢',\n]\n\nexport const TRAVELS = [\n '🌍',\n '🌎',\n '🌏',\n '🌐',\n '🗺️',\n '🗺',\n '🗾',\n '🧭',\n '🏔️',\n '🏔',\n '⛰️',\n '⛰',\n '🌋',\n '🗻',\n '🏕️',\n '🏕',\n '🏖️',\n '🏖',\n '🏜️',\n '🏜',\n '🏝️',\n '🏝',\n '🏞️',\n '🏞',\n '🏟️',\n '🏟',\n '🏛️',\n '🏛',\n '🏗️',\n '🏗',\n '🧱',\n '🪨',\n '🪵',\n '🛖',\n '🏘️',\n '🏘',\n '🏚️',\n '🏚',\n '🏠',\n '🏡',\n '🏢',\n '🏣',\n '🏤',\n '🏥',\n '🏦',\n '🏨',\n '🏩',\n '🏪',\n '🏫',\n '🏬',\n '🏭',\n '🏯',\n '🏰',\n '💒',\n '🗼',\n '🗽',\n '⛪',\n '🕌',\n '🛕',\n '🕍',\n '⛩️',\n '⛩',\n '🕋',\n '⛲',\n '⛺',\n '🌁',\n '🌃',\n '🏙️',\n '🏙',\n '🌄',\n '🌅',\n '🌆',\n '🌇',\n '🌉',\n '♨️',\n '♨',\n '🎠',\n '🎡',\n '🎢',\n '💈',\n '🎪',\n '🚂',\n '🚃',\n '🚄',\n '🚅',\n '🚆',\n '🚇',\n '🚈',\n '🚉',\n '🚊',\n '🚝',\n '🚞',\n '🚋',\n '🚌',\n '🚍',\n '🚎',\n '🚐',\n '🚑',\n '🚒',\n '🚓',\n '🚔',\n '🚕',\n '🚖',\n '🚗',\n '🚘',\n '🚙',\n '🛻',\n '🚚',\n '🚛',\n '🚜',\n '🏎️',\n '🏎',\n '🏍️',\n '🏍',\n '🛵',\n '🦽',\n '🦼',\n '🛺',\n '🚲',\n '🛴',\n '🛹',\n '🛼',\n '🚏',\n '🛣️',\n '🛣',\n '🛤️',\n '🛤',\n '🛢️',\n '🛢',\n '⛽',\n '🚨',\n '🚥',\n '🚦',\n '🛑',\n '🚧',\n '⚓',\n '⛵',\n '🛶',\n '🚤',\n '🛳️',\n '🛳',\n '⛴️',\n '⛴',\n '🛥️',\n '🛥',\n '🚢',\n '✈️',\n '✈',\n '🛩️',\n '🛩',\n '🛫',\n '🛬',\n '🪂',\n '💺',\n '🚁',\n '🚟',\n '🚠',\n '🚡',\n '🛰️',\n '🛰',\n '🚀',\n '🛸',\n '🛎️',\n '🛎',\n '🧳',\n '⌛',\n '⏳',\n '⌚',\n '⏰',\n '⏱️',\n '⏱',\n '⏲️',\n '⏲',\n '🕰️',\n '🕰',\n '🕛',\n '🕧',\n '🕐',\n '🕜',\n '🕑',\n '🕝',\n '🕒',\n '🕞',\n '🕓',\n '🕟',\n '🕔',\n '🕠',\n '🕕',\n '🕡',\n '🕖',\n '🕢',\n '🕗',\n '🕣',\n '🕘',\n '🕤',\n '🕙',\n '🕥',\n '🕚',\n '🕦',\n '🌑',\n '🌒',\n '🌓',\n '🌔',\n '🌕',\n '🌖',\n '🌗',\n '🌘',\n '🌙',\n '🌚',\n '🌛',\n '🌜',\n '🌡️',\n '🌡',\n '☀️',\n '☀',\n '🌝',\n '🌞',\n '🪐',\n '⭐',\n '🌟',\n '🌠',\n '🌌',\n '☁️',\n '☁',\n '⛅',\n '⛈️',\n '⛈',\n '🌤️',\n '🌤',\n '🌥️',\n '🌥',\n '🌦️',\n '🌦',\n '🌧️',\n '🌧',\n '🌨️',\n '🌨',\n '🌩️',\n '🌩',\n '🌪️',\n '🌪',\n '🌫️',\n '🌫',\n '🌬️',\n '🌬',\n '🌀',\n '🌈',\n '🌂',\n '☂️',\n '☂',\n '☔',\n '⛱️',\n '⛱',\n '⚡',\n '❄️',\n '❄',\n '☃️',\n '☃',\n '⛄',\n '☄️',\n '☄',\n '🔥',\n '💧',\n '🌊',\n]\n\nexport const FLAGS = [\n '🏁',\n '🚩',\n '🎌',\n '🏴',\n '🏳️',\n '🏳',\n '🏳️‍🌈',\n '🏳‍🌈',\n '🏳️‍⚧️',\n '🏳‍⚧️',\n '🏳️‍⚧',\n '🏳‍⚧',\n '🏴‍☠️',\n '🏴‍☠',\n '🇦🇨',\n '🇦🇩',\n '🇦🇪',\n '🇦🇫',\n '🇦🇬',\n '🇦🇮',\n '🇦🇱',\n '🇦🇲',\n '🇦🇴',\n '🇦🇶',\n '🇦🇷',\n '🇦🇸',\n '🇦🇹',\n '🇦🇺',\n '🇦🇼',\n '🇦🇽',\n '🇦🇿',\n '🇧🇦',\n '🇧🇧',\n '🇧🇩',\n '🇧🇪',\n '🇧🇫',\n '🇧🇬',\n '🇧🇭',\n '🇧🇮',\n '🇧🇯',\n '🇧🇱',\n '🇧🇲',\n '🇧🇳',\n '🇧🇴',\n '🇧🇶',\n '🇧🇷',\n '🇧🇸',\n '🇧🇹',\n '🇧🇻',\n '🇧🇼',\n '🇧🇾',\n '🇧🇿',\n '🇨🇦',\n '🇨🇨',\n '🇨🇩',\n '🇨🇫',\n '🇨🇬',\n '🇨🇭',\n '🇨🇮',\n '🇨🇰',\n '🇨🇱',\n '🇨🇲',\n '🇨🇳',\n '🇨🇴',\n '🇨🇵',\n '🇨🇷',\n '🇨🇺',\n '🇨🇻',\n '🇨🇼',\n '🇨🇽',\n '🇨🇾',\n '🇨🇿',\n '🇩🇪',\n '🇩🇬',\n '🇩🇯',\n '🇩🇰',\n '🇩🇲',\n '🇩🇴',\n '🇩🇿',\n '🇪🇦',\n '🇪🇨',\n '🇪🇪',\n '🇪🇬',\n '🇪🇭',\n '🇪🇷',\n '🇪🇸',\n '🇪🇹',\n '🇪🇺',\n '🇫🇮',\n '🇫🇯',\n '🇫🇰',\n '🇫🇲',\n '🇫🇴',\n '🇫🇷',\n '🇬🇦',\n '🇬🇧',\n '🇬🇩',\n '🇬🇪',\n '🇬🇫',\n '🇬🇬',\n '🇬🇭',\n '🇬🇮',\n '🇬🇱',\n '🇬🇲',\n '🇬🇳',\n '🇬🇵',\n '🇬🇶',\n '🇬🇷',\n '🇬🇸',\n '🇬🇹',\n '🇬🇺',\n '🇬🇼',\n '🇬🇾',\n '🇭🇰',\n '🇭🇲',\n '🇭🇳',\n '🇭🇷',\n '🇭🇹',\n '🇭🇺',\n '🇮🇨',\n '🇮🇩',\n '🇮🇪',\n '🇮🇱',\n '🇮🇲',\n '🇮🇳',\n '🇮🇴',\n '🇮🇶',\n '🇮🇷',\n '🇮🇸',\n '🇮🇹',\n '🇯🇪',\n '🇯🇲',\n '🇯🇴',\n '🇯🇵',\n '🇰🇪',\n '🇰🇬',\n '🇰🇭',\n '🇰🇮',\n '🇰🇲',\n '🇰🇳',\n '🇰🇵',\n '🇰🇷',\n '🇰🇼',\n '🇰🇾',\n '🇰🇿',\n '🇱🇦',\n '🇱🇧',\n '🇱🇨',\n '🇱🇮',\n '🇱🇰',\n '🇱🇷',\n '🇱🇸',\n '🇱🇹',\n '🇱🇺',\n '🇱🇻',\n '🇱🇾',\n '🇲🇦',\n '🇲🇨',\n '🇲🇩',\n '🇲🇪',\n '🇲🇫',\n '🇲🇬',\n '🇲🇭',\n '🇲🇰',\n '🇲🇱',\n '🇲🇲',\n '🇲🇳',\n '🇲🇴',\n '🇲🇵',\n '🇲🇶',\n '🇲🇷',\n '🇲🇸',\n '🇲🇹',\n '🇲🇺',\n '🇲🇻',\n '🇲🇼',\n '🇲🇽',\n '🇲🇾',\n '🇲🇿',\n '🇳🇦',\n '🇳🇨',\n '🇳🇪',\n '🇳🇫',\n '🇳🇬',\n '🇳🇮',\n '🇳🇱',\n '🇳🇴',\n '🇳🇵',\n '🇳🇷',\n '🇳🇺',\n '🇳🇿',\n '🇴🇲',\n '🇵🇦',\n '🇵🇪',\n '🇵🇫',\n '🇵🇬',\n '🇵🇭',\n '🇵🇰',\n '🇵🇱',\n '🇵🇲',\n '🇵🇳',\n '🇵🇷',\n '🇵🇸',\n '🇵🇹',\n '🇵🇼',\n '🇵🇾',\n '🇶🇦',\n '🇷🇪',\n '🇷🇴',\n '🇷🇸',\n '🇷🇺',\n '🇷🇼',\n '🇸🇦',\n '🇸🇧',\n '🇸🇨',\n '🇸🇩',\n '🇸🇪',\n '🇸🇬',\n '🇸🇭',\n '🇸🇮',\n '🇸🇯',\n '🇸🇰',\n '🇸🇱',\n '🇸🇲',\n '🇸🇳',\n '🇸🇴',\n '🇸🇷',\n '🇸🇸',\n '🇸🇹',\n '🇸🇻',\n '🇸🇽',\n '🇸🇾',\n '🇸🇿',\n '🇹🇦',\n '🇹🇨',\n '🇹🇩',\n '🇹🇫',\n '🇹🇬',\n '🇹🇭',\n '🇹🇯',\n '🇹🇰',\n '🇹🇱',\n '🇹🇲',\n '🇹🇳',\n '🇹🇴',\n '🇹🇷',\n '🇹🇹',\n '🇹🇻',\n '🇹🇼',\n '🇹🇿',\n '🇺🇦',\n '🇺🇬',\n '🇺🇲',\n '🇺🇳',\n '🇺🇸',\n '🇺🇾',\n '🇺🇿',\n '🇻🇦',\n '🇻🇨',\n '🇻🇪',\n '🇻🇬',\n '🇻🇮',\n '🇻🇳',\n '🇻🇺',\n '🇼🇫',\n '🇼🇸',\n '🇽🇰',\n '🇾🇪',\n '🇾🇹',\n '🇿🇦',\n '🇿🇲',\n '🇿🇼',\n '🏴󠁧󠁢󠁥󠁮󠁧󠁿',\n '🏴󠁧󠁢󠁳󠁣󠁴󠁿',\n '🏴󠁧󠁢󠁷󠁬󠁳󠁿',\n]\n\nexport const ANIMALS = [\n '🐵',\n '🐒',\n '🦍',\n '🦧',\n '🐶',\n '🐕',\n '🦮',\n '🐕‍🦺',\n '🐩',\n '🐺',\n '🦊',\n '🦝',\n '🐱',\n '🐈',\n '🐈‍⬛',\n '🦁',\n '🐯',\n '🐅',\n '🐆',\n '🐴',\n '🐎',\n '🦄',\n '🦓',\n '🦌',\n '🦬',\n '🐮',\n '🐂',\n '🐃',\n '🐄',\n '🐷',\n '🐖',\n '🐗',\n '🐽',\n '🐏',\n '🐑',\n '🐐',\n '🐪',\n '🐫',\n '🦙',\n '🦒',\n '🐘',\n '🦣',\n '🦏',\n '🦛',\n '🐭',\n '🐁',\n '🐀',\n '🐹',\n '🐰',\n '🐇',\n '🐿️',\n '🐿',\n '🦫',\n '🦔',\n '🦇',\n '🐻',\n '🐻‍❄️',\n '🐻‍❄',\n '🐨',\n '🐼',\n '🦥',\n '🦦',\n '🦨',\n '🦘',\n '🦡',\n '🐾',\n '🦃',\n '🐔',\n '🐓',\n '🐣',\n '🐤',\n '🐥',\n '🐦',\n '🐧',\n '🕊️',\n '🕊',\n '🦅',\n '🦆',\n '🦢',\n '🦉',\n '🦤',\n '🪶',\n '🦩',\n '🦚',\n '🦜',\n '🐸',\n '🐊',\n '🐢',\n '🦎',\n '🐍',\n '🐲',\n '🐉',\n '🦕',\n '🦖',\n '🐳',\n '🐋',\n '🐬',\n '🦭',\n '🐟',\n '🐠',\n '🐡',\n '🦈',\n '🐙',\n '🐚',\n '🐌',\n '🦋',\n '🐛',\n '🐜',\n '🐝',\n '🪲',\n '🐞',\n '🦗',\n '🪳',\n '🕷️',\n '🕷',\n '🕸️',\n '🕸',\n '🦂',\n '🦟',\n '🪰',\n '🪱',\n '🦠',\n '💐',\n '🌸',\n '💮',\n '🏵️',\n '🏵',\n '🌹',\n '🥀',\n '🌺',\n '🌻',\n '🌼',\n '🌷',\n '🌱',\n '🪴',\n '🌲',\n '🌳',\n '🌴',\n '🌵',\n '🌾',\n '🌿',\n '☘️',\n '☘',\n '🍀',\n '🍁',\n '🍂',\n '🍃',\n]\n\nexport const FOODS = [\n '🍇',\n '🍈',\n '🍉',\n '🍊',\n '🍋',\n '🍌',\n '🍍',\n '🥭',\n '🍎',\n '🍏',\n '🍐',\n '🍑',\n '🍒',\n '🍓',\n '🫐',\n '🥝',\n '🍅',\n '🫒',\n '🥥',\n '🥑',\n '🍆',\n '🥔',\n '🥕',\n '🌽',\n '🌶️',\n '🌶',\n '🫑',\n '🥒',\n '🥬',\n '🥦',\n '🧄',\n '🧅',\n '🍄',\n '🥜',\n '🌰',\n '🍞',\n '🥐',\n '🥖',\n '🫓',\n '🥨',\n '🥯',\n '🥞',\n '🧇',\n '🧀',\n '🍖',\n '🍗',\n '🥩',\n '🥓',\n '🍔',\n '🍟',\n '🍕',\n '🌭',\n '🥪',\n '🌮',\n '🌯',\n '🫔',\n '🥙',\n '🧆',\n '🥚',\n '🍳',\n '🥘',\n '🍲',\n '🫕',\n '🥣',\n '🥗',\n '🍿',\n '🧈',\n '🧂',\n '🥫',\n '🍱',\n '🍘',\n '🍙',\n '🍚',\n '🍛',\n '🍜',\n '🍝',\n '🍠',\n '🍢',\n '🍣',\n '🍤',\n '🍥',\n '🥮',\n '🍡',\n '🥟',\n '🥠',\n '🥡',\n '🦀',\n '🦞',\n '🦐',\n '🦑',\n '🦪',\n '🍦',\n '🍧',\n '🍨',\n '🍩',\n '🍪',\n '🎂',\n '🍰',\n '🧁',\n '🥧',\n '🍫',\n '🍬',\n '🍭',\n '🍮',\n '🍯',\n '🍼',\n '🥛',\n '☕',\n '🫖',\n '🍵',\n '🍶',\n '🍾',\n '🍷',\n '🍸',\n '🍹',\n '🍺',\n '🍻',\n '🥂',\n '🥃',\n '🥤',\n '🧋',\n '🧃',\n '🧉',\n '🧊',\n '🥢',\n '🍽️',\n '🍽',\n '🍴',\n '🥄',\n '🔪',\n '🏺',\n]\n","import React from 'react'\n\nfunction Activity() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"1em\"\n height=\"1em\"\n >\n <path\n d=\"M12 0C5.373 0 0 5.372 0 12c0 6.627 5.373 12 12 12 6.628 0 12-5.373 12-12 0-6.628-5.372-12-12-12m9.949 11H17.05c.224-2.527 1.232-4.773 1.968-6.113A9.966 9.966 0 0 1 21.949 11M13 11V2.051a9.945 9.945 0 0 1 4.432 1.564c-.858 1.491-2.156 4.22-2.392 7.385H13zm-2 0H8.961c-.238-3.165-1.536-5.894-2.393-7.385A9.95 9.95 0 0 1 11 2.051V11zm0 2v8.949a9.937 9.937 0 0 1-4.432-1.564c.857-1.492 2.155-4.221 2.393-7.385H11zm4.04 0c.236 3.164 1.534 5.893 2.392 7.385A9.92 9.92 0 0 1 13 21.949V13h2.04zM4.982 4.887C5.718 6.227 6.726 8.473 6.951 11h-4.9a9.977 9.977 0 0 1 2.931-6.113M2.051 13h4.9c-.226 2.527-1.233 4.771-1.969 6.113A9.972 9.972 0 0 1 2.051 13m16.967 6.113c-.735-1.342-1.744-3.586-1.968-6.113h4.899a9.961 9.961 0 0 1-2.931 6.113\"\n fill=\"currentColor\"\n />\n </svg>\n )\n}\n\nexport default Activity\n","import React from 'react'\n\nfunction Animal() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"1em\"\n height=\"1em\"\n >\n <path\n d=\"M15.5 8a1.5 1.5 0 1 0 .001 3.001A1.5 1.5 0 0 0 15.5 8M8.5 8a1.5 1.5 0 1 0 .001 3.001A1.5 1.5 0 0 0 8.5 8\"\n fill=\"currentColor\"\n />\n <path\n d=\"M18.933 0h-.027c-.97 0-2.138.787-3.018 1.497-1.274-.374-2.612-.51-3.887-.51-1.285 0-2.616.133-3.874.517C7.245.79 6.069 0 5.093 0h-.027C3.352 0 .07 2.67.002 7.026c-.039 2.479.276 4.238 1.04 5.013.254.258.882.677 1.295.882.191 3.177.922 5.238 2.536 6.38.897.637 2.187.949 3.2 1.102C8.04 20.6 8 20.795 8 21c0 1.773 2.35 3 4 3 1.648 0 4-1.227 4-3 0-.201-.038-.393-.072-.586 2.573-.385 5.435-1.877 5.925-7.587.396-.22.887-.568 1.104-.788.763-.774 1.079-2.534 1.04-5.013C23.929 2.67 20.646 0 18.933 0M3.223 9.135c-.237.281-.837 1.155-.884 1.238-.15-.41-.368-1.349-.337-3.291.051-3.281 2.478-4.972 3.091-5.031.256.015.731.27 1.265.646-1.11 1.171-2.275 2.915-2.352 5.125-.133.546-.398.858-.783 1.313M12 22c-.901 0-1.954-.693-2-1 0-.654.475-1.236 1-1.602V20a1 1 0 1 0 2 0v-.602c.524.365 1 .947 1 1.602-.046.307-1.099 1-2 1m3-3.48v.02a4.752 4.752 0 0 0-1.262-1.02c1.092-.516 2.239-1.334 2.239-2.217 0-1.842-1.781-2.195-3.977-2.195-2.196 0-3.978.354-3.978 2.195 0 .883 1.148 1.701 2.238 2.217A4.8 4.8 0 0 0 9 18.539v-.025c-1-.076-2.182-.281-2.973-.842-1.301-.92-1.838-3.045-1.853-6.478l.023-.041c.496-.826 1.49-1.45 1.804-3.102 0-2.047 1.357-3.631 2.362-4.522C9.37 3.178 10.555 3 11.948 3c1.447 0 2.685.192 3.733.57 1 .9 2.316 2.465 2.316 4.48.313 1.651 1.307 2.275 1.803 3.102.035.058.068.117.102.178-.059 5.967-1.949 7.01-4.902 7.19m6.628-8.202c-.037-.065-.074-.13-.113-.195a7.587 7.587 0 0 0-.739-.987c-.385-.455-.648-.768-.782-1.313-.076-2.209-1.241-3.954-2.353-5.124.531-.376 1.004-.63 1.261-.647.636.071 3.044 1.764 3.096 5.031.027 1.81-.347 3.218-.37 3.235\"\n fill=\"currentColor\"\n />\n </svg>\n\n )\n}\n\nexport default Animal\n","import React from 'react'\n\nfunction Flag() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"1em\"\n height=\"1em\"\n >\n <path\n d=\"M0 0l6.084 24H8L1.916 0zM21 5h-4l-1-4H4l3 12h3l1 4h13L21 5zM6.563 3h7.875l2 8H8.563l-2-8zm8.832 10l-2.856 1.904L12.063 13h3.332zM19 13l-1.5-6h1.938l2 8H16l3-2z\"\n fill=\"currentColor\"\n />\n </svg>\n )\n}\n\nexport default Flag\n","import React from 'react'\n\nfunction Food() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"1em\"\n height=\"1em\"\n >\n <path\n d=\"M17 4.978c-1.838 0-2.876.396-3.68.934.513-1.172 1.768-2.934 4.68-2.934a1 1 0 0 0 0-2c-2.921 0-4.629 1.365-5.547 2.512-.064.078-.119.162-.18.244C11.73 1.838 10.798.023 9.207.023 8.579.022 7.85.306 7 .978 5.027 2.54 5.329 3.902 6.492 4.999 3.609 5.222 0 7.352 0 12.969c0 4.582 4.961 11.009 9 11.009 1.975 0 2.371-.486 3-1 .629.514 1.025 1 3 1 4.039 0 9-6.418 9-11 0-5.953-4.055-8-7-8M8.242 2.546c.641-.508.943-.523.965-.523.426.169.975 1.405 1.357 3.055-1.527-.629-2.741-1.352-2.98-1.846.059-.112.241-.356.658-.686M15 21.978c-1.08 0-1.21-.109-1.559-.402l-.176-.146c-.367-.302-.816-.452-1.266-.452s-.898.15-1.266.452l-.176.146c-.347.292-.477.402-1.557.402-2.813 0-7-5.389-7-9.009 0-5.823 4.488-5.991 5-5.991 1.939 0 2.484.471 3.387 1.251l.323.276a1.995 1.995 0 0 0 2.58 0l.323-.276c.902-.78 1.447-1.251 3.387-1.251.512 0 5 .168 5 6 0 3.617-4.187 9-7 9\"\n fill=\"currentColor\"\n />\n </svg>\n\n )\n}\n\nexport default Food\n","import React from 'react'\n\nfunction Object() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"1em\"\n height=\"1em\"\n >\n <path\n d=\"M12 0a9 9 0 0 0-5 16.482V21s2.035 3 5 3 5-3 5-3v-4.518A9 9 0 0 0 12 0zm0 2c3.86 0 7 3.141 7 7s-3.14 7-7 7-7-3.141-7-7 3.14-7 7-7zM9 17.477c.94.332 1.946.523 3 .523s2.06-.19 3-.523v.834c-.91.436-1.925.689-3 .689a6.924 6.924 0 0 1-3-.69v-.833zm.236 3.07A8.854 8.854 0 0 0 12 21c.965 0 1.888-.167 2.758-.451C14.155 21.173 13.153 22 12 22c-1.102 0-2.117-.789-2.764-1.453z\"\n fill=\"currentColor\"\n />\n <path\n d=\"M14.745 12.449h-.004c-.852-.024-1.188-.858-1.577-1.824-.421-1.061-.703-1.561-1.182-1.566h-.009c-.481 0-.783.497-1.235 1.537-.436.982-.801 1.811-1.636 1.791l-.276-.043c-.565-.171-.853-.691-1.284-1.794-.125-.313-.202-.632-.27-.913-.051-.213-.127-.53-.195-.634C7.067 9.004 7.039 9 6.99 9A1 1 0 0 1 7 7h.01c1.662.017 2.015 1.373 2.198 2.134.486-.981 1.304-2.058 2.797-2.075 1.531.018 2.28 1.153 2.731 2.141l.002-.008C14.944 8.424 15.327 7 16.979 7h.032A1 1 0 1 1 17 9h-.011c-.149.076-.256.474-.319.709a6.484 6.484 0 0 1-.311.951c-.429.973-.79 1.789-1.614 1.789\"\n fill=\"currentColor\"\n />\n </svg>\n\n )\n}\n\nexport default Object\n","import React from 'react'\n\nfunction Symbol() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"1em\"\n height=\"1em\"\n >\n <path\n d=\"M0 0h11v2H0zM4 11h3V6h4V4H0v2h4zM15.5 17c1.381 0 2.5-1.116 2.5-2.493s-1.119-2.493-2.5-2.493S13 13.13 13 14.507 14.119 17 15.5 17m0-2.986c.276 0 .5.222.5.493 0 .272-.224.493-.5.493s-.5-.221-.5-.493.224-.493.5-.493M21.5 19.014c-1.381 0-2.5 1.116-2.5 2.493S20.119 24 21.5 24s2.5-1.116 2.5-2.493-1.119-2.493-2.5-2.493m0 2.986a.497.497 0 0 1-.5-.493c0-.271.224-.493.5-.493s.5.222.5.493a.497.497 0 0 1-.5.493M22 13l-9 9 1.513 1.5 8.99-9.009zM17 11c2.209 0 4-1.119 4-2.5V2s.985-.161 1.498.949C23.01 4.055 23 6 23 6s1-1.119 1-3.135C24-.02 21 0 21 0h-2v6.347A5.853 5.853 0 0 0 17 6c-2.209 0-4 1.119-4 2.5s1.791 2.5 4 2.5M10.297 20.482l-1.475-1.585a47.54 47.54 0 0 1-1.442 1.129c-.307-.288-.989-1.016-2.045-2.183.902-.836 1.479-1.466 1.729-1.892s.376-.871.376-1.336c0-.592-.273-1.178-.818-1.759-.546-.581-1.329-.871-2.349-.871-1.008 0-1.79.293-2.344.879-.556.587-.832 1.181-.832 1.784 0 .813.419 1.748 1.256 2.805-.847.614-1.444 1.208-1.794 1.784a3.465 3.465 0 0 0-.523 1.833c0 .857.308 1.56.924 2.107.616.549 1.423.823 2.42.823 1.173 0 2.444-.379 3.813-1.137L8.235 24h2.819l-2.09-2.383 1.333-1.135zm-6.736-6.389a1.02 1.02 0 0 1 .73-.286c.31 0 .559.085.747.254a.849.849 0 0 1 .283.659c0 .518-.419 1.112-1.257 1.784-.536-.651-.805-1.231-.805-1.742a.901.901 0 0 1 .302-.669M3.74 22c-.427 0-.778-.116-1.057-.349-.279-.232-.418-.487-.418-.766 0-.594.509-1.288 1.527-2.083.968 1.134 1.717 1.946 2.248 2.438-.921.507-1.686.76-2.3.76\"\n fill=\"currentColor\"\n />\n </svg>\n )\n}\n\nexport default Symbol\n","import React from 'react'\n\nfunction Travel() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"1em\"\n height=\"1em\"\n >\n <path\n d=\"M6.5 12C5.122 12 4 13.121 4 14.5S5.122 17 6.5 17 9 15.879 9 14.5 7.878 12 6.5 12m0 3c-.275 0-.5-.225-.5-.5s.225-.5.5-.5.5.225.5.5-.225.5-.5.5M17.5 12c-1.378 0-2.5 1.121-2.5 2.5s1.122 2.5 2.5 2.5 2.5-1.121 2.5-2.5-1.122-2.5-2.5-2.5m0 3c-.275 0-.5-.225-.5-.5s.225-.5.5-.5.5.225.5.5-.225.5-.5.5\"\n fill=\"currentColor\"\n />\n <path\n d=\"M22.482 9.494l-1.039-.346L21.4 9h.6c.552 0 1-.439 1-.992 0-.006-.003-.008-.003-.008H23c0-1-.889-2-1.984-2h-.642l-.731-1.717C19.262 3.012 18.091 2 16.764 2H7.236C5.909 2 4.738 3.012 4.357 4.283L3.626 6h-.642C1.889 6 1 7 1 8h.003S1 8.002 1 8.008C1 8.561 1.448 9 2 9h.6l-.043.148-1.039.346a2.001 2.001 0 0 0-1.359 2.097l.751 7.508a1 1 0 0 0 .994.901H3v1c0 1.103.896 2 2 2h2c1.104 0 2-.897 2-2v-1h6v1c0 1.103.896 2 2 2h2c1.104 0 2-.897 2-2v-1h1.096a.999.999 0 0 0 .994-.901l.751-7.508a2.001 2.001 0 0 0-1.359-2.097M6.273 4.857C6.402 4.43 6.788 4 7.236 4h9.527c.448 0 .834.43.963.857L19.313 9H4.688l1.585-4.143zM7 21H5v-1h2v1zm12 0h-2v-1h2v1zm2.189-3H2.811l-.662-6.607L3 11h18l.852.393L21.189 18z\"\n fill=\"currentColor\"\n />\n </svg>\n\n )\n}\n\nexport default Travel\n","export function safeJSONParse(str: any, defaultValue = {}) {\n if (typeof str === 'object')\n return str\n\n try {\n return JSON.parse(str)\n }\n catch {\n return defaultValue\n }\n}\n\nexport function safeJSONStringify(obj: any, defaultValue = '{}') {\n try {\n return JSON.stringify(obj)\n }\n catch {\n return defaultValue\n }\n}\n","export function getStorage(key: any, defaultValue = null) {\n if (typeof window === 'undefined')\n // eslint-disable-next-line unicorn/error-message\n throw new Error()\n\n const value = localStorage.getItem(key)\n if (!value)\n return defaultValue\n try {\n return JSON.parse(value)\n }\n catch {\n return value\n }\n}\n\nexport function setStorage(key: any, value: any) {\n window.localStorage.setItem(key, `${value}`)\n}\n","import { safeJSONStringify } from './json'\nimport { getStorage, setStorage } from './storage'\n\nclass Node {\n public key: string\n public value: string | number\n public prev: Node | null\n public next: Node | null\n\n constructor(key: any, value: any) {\n this.key = key\n this.value = value\n this.prev = null\n this.next = null\n }\n}\n\nexport class LRUCache {\n private capacity: number\n private usedCapacity: number\n private head: Node\n private tail: Node\n private store: Record<string, Node>\n\n constructor(capacity: any) {\n this.capacity = capacity || 20\n this.usedCapacity = 0\n this.store = {}\n this.head = new Node('fakeHeadNode', 'fakeHeadNode')\n this.tail = new Node('fakeTailNode', 'fakeTailNode')\n\n this.head.next = this.tail\n this.tail.prev = this.head\n }\n\n private removeNode(node: any) {\n node.prev.next = node.next\n node.next.prev = node.prev\n }\n\n private addToHead(node: any) {\n node.prev = this.head\n node.next = this.head.next\n // @ts-expect-error\n this.head.next.prev = node\n this.head.next = node\n }\n\n private moveToHead(node: any) {\n this.removeNode(node)\n this.addToHead(node)\n }\n\n private removeTail() {\n const node = this.tail.prev\n this.removeNode(node)\n return node\n }\n\n get(key: any) {\n if (key in this.store) {\n const node = this.store[key]\n this.moveToHead(node)\n return node.value\n }\n\n return -1\n }\n\n put(key: any, value: any) {\n if (key in this.store) {\n const node = this.store[key]\n node.value = value\n this.moveToHead(node)\n }\n else {\n const node = new Node(key, value)\n this.addToHead(node)\n this.store[key] = node\n this.usedCapacity += 1\n\n if (this.usedCapacity > this.capacity) {\n const tailNode = this.removeTail() as any\n delete this.store[tailNode.key]\n this.usedCapacity -= 1\n }\n }\n }\n\n keys() {\n const res = []\n let node = this.head as any\n\n while (node) {\n res.push(node.key)\n node = node.next\n }\n\n return res.slice(1, -1)\n }\n\n values() {\n const res = []\n let node = this.head as any\n\n while (node) {\n res.push(node.value)\n node = node.next\n }\n\n return res.slice(1, -1)\n }\n\n toJSON() {\n return this.store\n }\n}\n\nexport function createKeysLocalStorageLRUCache(storageKey: any, capacity: any) {\n const lruCache = new LRUCache(capacity)\n\n const manager = {\n syncFromStorage() {\n const data = getStorage(storageKey) || []\n data\n .slice()\n .reverse()\n .forEach((key: any) => {\n lruCache.put(key, key)\n })\n },\n syncToStorage() {\n setStorage(storageKey, safeJSONStringify(lruCache.keys()))\n },\n put(key: any) {\n lruCache.put(key, key)\n this.syncToStorage()\n },\n get(key?: string) {\n return key ? lruCache.get(key) : lruCache.keys()\n },\n }\n\n return manager\n}\n","import type React from 'react'\nimport { useCallback, useEffect, useMemo, useState } from 'react'\n\nimport { Clock3, Laugh } from 'lucide-react'\nimport { ACTIVITIES, ANIMALS, EXPRESSIONES, FLAGS, FOODS, OBJECTS, SYMBOLS, TRAVELS } from './constants'\nimport { ActionButton, Popover, PopoverContent, PopoverTrigger, Tabs, TabsContent, TabsList, TabsTrigger } from '@/components'\nimport Activity from '@/components/icons/Activity'\nimport Animal from '@/components/icons/Animas'\nimport Flag from '@/components/icons/Flag'\nimport Food from '@/components/icons/Food'\nimport Object from '@/components/icons/Object'\nimport Symbol from '@/components/icons/Symbol'\nimport Travel from '@/components/icons/Travel'\nimport { useLocale } from '@/locales'\nimport { createKeysLocalStorageLRUCache } from '@/utils/lru-cache'\n\nconst emojiLocalStorageLRUCache = createKeysLocalStorageLRUCache('EMOJI_PICKER', 20)\n\nconst LIST = [\n {\n title: 'Smileys & People',\n data: EXPRESSIONES,\n icon: Laugh,\n },\n {\n title: 'Animals & Nature',\n data: ANIMALS,\n icon: Animal,\n },\n {\n title: 'Food & Drink',\n data: FOODS,\n icon: Food,\n },\n {\n title: 'Activity',\n data: ACTIVITIES,\n icon: Activity,\n },\n {\n title: 'Travel & Places',\n data: TRAVELS,\n icon: Travel,\n },\n {\n title: 'Object',\n data: OBJECTS,\n icon: Object,\n },\n {\n title: 'Symbol',\n data: SYMBOLS,\n icon: Symbol,\n },\n {\n title: 'Flags',\n data: FLAGS,\n icon: Flag,\n },\n]\n\nconst RECENT_DEFAULT = ['😀', '😃', '😄', '😁', '😆', '😅', '😂', '🤣']\n\ninterface IProps {\n showClear?: boolean\n onSelectEmoji: (arg: string) => void\n children: React.ReactNode\n}\n\nfunction EmojiPickerWrap({ onSelectEmoji, children }: IProps) {\n const [recentUsed, setRecentUsed] = useState([])\n const { t } = useLocale()\n\n const renderedList = useMemo(\n () => (recentUsed.length\n ? [{ title: 'Frequently used', icon: Clock3, data: recentUsed }, ...LIST]\n : LIST),\n [recentUsed],\n )\n\n const selectEmoji = useCallback(\n (emoji: any) => {\n emojiLocalStorageLRUCache.put(emoji)\n // @ts-expect-error\n setRecentUsed(emojiLocalStorageLRUCache.get() as string[])\n\n if (onSelectEmoji)\n onSelectEmoji(emoji)\n },\n [onSelectEmoji],\n )\n\n useEffect(() => {\n emojiLocalStorageLRUCache.syncFromStorage()\n const defaultEmoji = emojiLocalStorageLRUCache.get() as string[]\n\n if (!defaultEmoji?.length) {\n RECENT_DEFAULT.forEach((emoji) => {\n emojiLocalStorageLRUCache.put(emoji)\n })\n }\n\n const defaultEmojiNew = emojiLocalStorageLRUCache.get() as string[]\n setRecentUsed(defaultEmojiNew as any)\n }, [])\n\n return (\n <Popover>\n <PopoverTrigger asChild>{children}</PopoverTrigger>\n\n <PopoverContent hideWhenDetached className=\"richtext-w-full richtext-h-full richtext-p-2\" align=\"start\" side=\"bottom\">\n <Tabs defaultValue=\"Frequently used\">\n <TabsList className=\"richtext-flex richtext-items-center richtext-gap-[4px]\">\n {renderedList.map((list) => {\n return (\n <TabsTrigger\n key={list.title}\n value={list.title}\n className=\"!richtext-p-[6px] richtext-bg-accent hover:richtext-text-accent-foreground\"\n >\n {list.icon && <list.icon size={16} />}\n </TabsTrigger>\n )\n })}\n </TabsList>\n\n {renderedList.map((list) => {\n return (\n <TabsContent\n key={list.title}\n value={list.title}\n >\n <p className=\"richtext-mb-[6px] richtext-font-semibold\">{t(list.title as any)}</p>\n <div className=\"richtext-max-h-[280px] richtext-overflow-y-auto\">\n <div className=\"richtext-grid richtext-grid-cols-8 richtext-gap-1 \">\n {(list.data || []).map(ex => (\n <div\n key={ex}\n onClick={() => selectEmoji(ex)}\n className=\"richtext-text-center richtext-cursor-pointer\"\n >\n {ex}\n </div>\n ))}\n </div>\n </div>\n </TabsContent>\n )\n })}\n </Tabs>\n </PopoverContent>\n </Popover>\n )\n}\n\nexport function EmojiPicker({ editor, icon, ...props }: any) {\n const setEmoji = useCallback(\n (emoji: any) => {\n const { selection } = editor.state\n const { $anchor } = selection\n return editor.chain().insertContentAt($anchor.pos, emoji).run()\n },\n [editor],\n )\n\n return (\n <EmojiPickerWrap onSelectEmoji={setEmoji}>\n <ActionButton\n tooltip={props?.tooltip}\n icon={icon}\n />\n </EmojiPickerWrap>\n )\n}\n\nexport default EmojiPicker\n","import { Node } from '@tiptap/core'\nimport { ReactRenderer } from '@tiptap/react'\nimport Suggestion from '@tiptap/suggestion'\n\nimport tippy from 'tippy.js'\nimport { PluginKey } from '@tiptap/pm/state'\nimport { emojiSearch, emojisToName } from './components/EmojiList/emojis'\nimport { EmojiList } from './components/EmojiList/EmojiList'\nimport EmojiPicker from '@/extensions/Emoji/components/EmojiPicker/EmojiPicker'\n\nexport const EXTENSION_PRIORITY_HIGHEST = 200\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n emoji: {\n setEmoji: (emoji: { name: string, emoji: string }) => ReturnType\n }\n }\n}\n\nexport const EmojiPluginKey = new PluginKey('emoji')\n\nexport { emojisToName }\n\nexport const Emoji = Node.create({\n name: 'emoji',\n content: 'text*',\n\n priority: EXTENSION_PRIORITY_HIGHEST,\n\n addOptions() {\n return {\n ...this.parent?.(),\n HTMLAttributes: {},\n suggestion: {\n char: ':',\n pluginKey: EmojiPluginKey,\n command: ({ editor, range, props }: any) => {\n editor\n .chain()\n .focus()\n .insertContentAt(range, `${props.emoji} `)\n .run()\n },\n },\n button: ({ editor, t }: any) => {\n return {\n component: EmojiPicker,\n componentProps: {\n editor,\n action: () => {},\n isActive: () => false,\n disabled: false,\n icon: 'EmojiIcon',\n tooltip: t('editor.emoji.tooltip'),\n },\n }\n },\n }\n },\n\n addCommands() {\n return {\n setEmoji:\n emojiObject =>\n ({ commands }) => {\n return commands.insertContent(`${emojiObject.emoji} `)\n },\n }\n },\n\n addProseMirrorPlugins() {\n return [\n Suggestion({\n editor: this.editor,\n ...this.options.suggestion,\n }),\n ]\n },\n}).configure({\n suggestion: {\n items: ({ query }: any) => {\n return emojiSearch(query)\n },\n render: () => {\n let component: any\n let popup: any\n let isEditable: any\n\n return {\n onStart: (props: any) => {\n isEditable = props.editor.isEditable\n if (!isEditable)\n return\n\n component = new ReactRenderer(EmojiList, {\n props,\n editor: props.editor,\n })\n\n popup = tippy('body', {\n getReferenceClientRect: props.clientRect,\n appendTo: () => document.body,\n content: component.element,\n showOnCreate: true,\n interactive: true,\n trigger: 'manual',\n placement: 'bottom-start',\n })\n },\n\n onUpdate(props: any) {\n if (!isEditable)\n return\n\n component.updateProps(props)\n popup[0].setProps({\n getReferenceClientRect: props.clientRect,\n })\n },\n\n onKeyDown(props: any) {\n if (!isEditable)\n return\n\n if (props.event.key === 'Escape') {\n popup[0].hide()\n return true\n }\n return component.ref?.onKeyDown(props)\n },\n\n onExit() {\n if (!isEditable)\n return\n\n popup[0].destroy()\n component.destroy()\n },\n }\n },\n },\n})\n","const colors = [\n '#47A1FF',\n '#59CB74',\n '#FFB952',\n '#FC6980',\n '#6367EC',\n '#DA65CC',\n '#FBD54A',\n '#ADDF84',\n '#6CD3FF',\n '#659AEC',\n '#9F8CF1',\n '#ED8CCE',\n '#A2E5FF',\n '#4DCCCB',\n '#F79452',\n '#84E0BE',\n '#5982F6',\n '#E37474',\n '#3FDDC7',\n '#9861E5',\n]\n\nconst total = colors.length\nexport const getRandomColor = () => colors[~~(Math.random() * total)]\n\n/**\n * @param hexCode\n * @param opacity\n * @returns\n */\nexport function convertColorToRGBA(hexCode: string, opacity = 1) {\n let r = 0\n let g = 0\n let b = 0\n\n if (hexCode.startsWith('rgb')) {\n // @ts-expect-error\n const rgb = hexCode\n .replace(/\\s/g, '')\n .match(/rgb\\((.*)\\)$/)[1]\n .split(',')\n\n r = +rgb[0]\n g = +rgb[1]\n b = +rgb[2]\n }\n else if (hexCode.startsWith('#')) {\n let hex = hexCode.replace('#', '')\n\n if (hex.length === 3) {\n hex = `${hex[0]}${hex[0]}${hex[1]}${hex[1]}${hex[2]}${hex[2]}`\n }\n\n r = Number.parseInt(hex.substring(0, 2), 16)\n g = Number.parseInt(hex.substring(2, 4), 16)\n b = Number.parseInt(hex.substring(4, 6), 16)\n }\n else {\n return hexCode\n }\n\n if (opacity > 1 && opacity <= 100) {\n opacity = opacity / 100\n }\n\n return `rgba(${r},${g},${b},${opacity})`\n}\n","import { useMemo } from 'react'\n\nimport { NodeViewWrapper } from '@tiptap/react'\n\nimport katex from 'katex'\nimport { useTheme } from '@/theme/theme'\nimport { convertColorToRGBA } from '@/utils/color'\n\nexport function KatexWrapper({ node }: any) {\n const theme = useTheme()\n const { text } = node.attrs\n\n const backgroundColor = useMemo(() => {\n const color = `rgb(254, 242, 237)`\n if (theme === 'dark')\n return convertColorToRGBA(color, 0.75)\n return color\n }, [theme])\n\n const formatText = useMemo(() => {\n try {\n return katex.renderToString(`${text}`)\n }\n catch {\n return text\n }\n }, [text])\n\n const content = useMemo(\n () =>\n text.trim()\n ? (\n <span contentEditable={false} dangerouslySetInnerHTML={{ __html: formatText }}></span>\n )\n : (\n <span contentEditable={false}>Not enter a formula</span>\n ),\n [text, formatText],\n )\n\n return (\n <NodeViewWrapper\n className=\"render-wrapper\"\n style={{\n backgroundColor,\n }}\n >\n <div className=\"richtext-flex richtext-px-[4px] richtext-py-4 richtext-text-[1em] richtext-text-[#000] richtext-cursor-pointer richtext-justify-center\">{content}</div>\n </NodeViewWrapper>\n )\n}\n","import { useCallback, useEffect, useRef } from 'react'\n\nimport { HelpCircle } from 'lucide-react'\nimport { ActionButton, Button, Label, Popover, PopoverContent, PopoverTrigger } from '@/components'\nimport { Textarea } from '@/components/ui/textarea'\nimport type { IKatexAttrs } from '@/extensions/Katex/Katex'\nimport { Katex } from '@/extensions/Katex/Katex'\nimport { useAttributes } from '@/hooks/useAttributes'\nimport { useLocale } from '@/locales'\n\nfunction KatexActiveButton({ editor, ...props }: any) {\n const { t } = useLocale()\n\n const attrs = useAttributes<IKatexAttrs>(editor, Katex.name, {\n text: '',\n defaultShowPicker: false,\n })\n const { text, defaultShowPicker } = attrs\n const ref: any = useRef<HTMLTextAreaElement>(null)\n\n const submit = useCallback(() => {\n editor.chain().focus().setKatex({ text: ref.current.value }).run()\n }, [editor])\n\n useEffect(() => {\n if (defaultShowPicker) {\n editor.chain().updateAttributes(Katex.name, { defaultShowPicker: false }).focus().run()\n }\n }, [editor, defaultShowPicker])\n\n useEffect(() => {\n setTimeout(() => ref.current?.focus(), 200)\n }, [])\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <ActionButton\n tooltip={props?.tooltip}\n icon={props?.icon}\n />\n </PopoverTrigger>\n\n <PopoverContent hideWhenDetached className=\"richtext-w-full richtext-h-full richtext-p-2\" align=\"start\" side=\"bottom\">\n <Label className=\"richtext-mb-[6px]\">\n {t('editor.formula.dialog.text')}\n </Label>\n <div className=\"richtext-flex richtext-w-full richtext-max-w-sm richtext-items-center richtext-gap-1.5 richtext-mb-[16px]\">\n <div className=\"richtext-relative richtext-w-full richtext-max-w-sm\">\n <Textarea\n ref={ref}\n autoFocus\n required\n rows={3}\n defaultValue={text}\n className=\"richtext-w-full\"\n placeholder=\"Text\"\n />\n </div>\n </div>\n <div className=\"richtext-flex richtext-items-center richtext-justify-between richtext-gap-[6px]\">\n <Button onClick={submit} className=\"richtext-flex-1\">Submit</Button>\n\n <a href=\"https://katex.org/\" target=\"_blank\" rel=\"noreferrer noopener\">\n <HelpCircle size={16} />\n </a>\n </div>\n </PopoverContent>\n </Popover>\n )\n}\n\nexport default KatexActiveButton\n","import { Node, mergeAttributes, nodeInputRule } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport { KatexWrapper } from '@/extensions/Katex/components/KatexWrapper'\nimport KatexActiveButton from '@/extensions/Katex/components/KatexActiveButton'\n\nexport interface IKatexAttrs {\n text?: string\n defaultShowPicker?: boolean\n}\n\ninterface IKatexOptions {\n HTMLAttributes: Record<string, any>\n}\n\nfunction getDatasetAttribute(attribute: string) {\n return (element: any) => {\n return element.getAttribute(attribute)\n }\n}\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n katex: {\n setKatex: (arg?: IKatexAttrs) => ReturnType\n }\n }\n}\n\nexport const Katex = Node.create<IKatexOptions>({\n name: 'katex',\n group: 'block',\n selectable: true,\n atom: true,\n draggable: true,\n\n addOptions() {\n return {\n HTMLAttributes: {\n class: 'katex',\n },\n button: ({ editor, t }: any) => {\n return {\n component: KatexActiveButton,\n componentProps: {\n editor,\n action: () => {},\n isActive: () => false,\n disabled: false,\n icon: 'KatexIcon',\n tooltip: t('editor.katex.tooltip'),\n },\n }\n },\n }\n },\n\n addAttributes() {\n return {\n text: {\n default: '',\n parseHTML: getDatasetAttribute('text'),\n },\n defaultShowPicker: {\n default: false,\n },\n }\n },\n\n parseHTML() {\n return [{ tag: 'span.katex' }]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['span', mergeAttributes((this.options && this.options.HTMLAttributes) || {}, HTMLAttributes)]\n },\n\n addCommands() {\n return {\n setKatex:\n options =>\n ({ commands }) => {\n return commands.insertContent({\n type: this.name,\n attrs: options,\n })\n },\n }\n },\n\n addInputRules() {\n return [\n nodeInputRule({\n find: /^\\$katex\\$$/,\n type: this.type,\n getAttributes: () => {\n return { defaultShowPicker: true }\n },\n }),\n ]\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(KatexWrapper)\n },\n})\n","import type { Editor } from '@tiptap/core'\n\nfunction printHtml(dom: Element) {\n const style: string = Array.from(document.querySelectorAll('style, link')).reduce(\n (str, style) => str + style.outerHTML,\n '',\n )\n\n const content: string = style + dom.outerHTML\n\n const iframe: HTMLIFrameElement = document.createElement('iframe')\n iframe.setAttribute('style', 'position: absolute; width: 0; height: 0; top: 0; left: 0;')\n document.body.appendChild(iframe)\n\n const frameWindow = iframe.contentWindow\n const doc: any = iframe.contentDocument || (iframe.contentWindow && iframe.contentWindow.document)\n\n // load style from CDN to iframe\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.href = 'https://cdn.jsdelivr.net/npm/reactjs-tiptap-editor/lib/style.css'\n doc.head.appendChild(link)\n\n if (doc) {\n doc.open()\n doc.write(content)\n doc.close()\n }\n\n if (frameWindow) {\n iframe.onload = function () {\n try {\n setTimeout(() => {\n frameWindow.focus()\n try {\n if (!frameWindow.document.execCommand('print', false)) {\n frameWindow.print()\n }\n }\n catch {\n frameWindow.print()\n }\n frameWindow.close()\n }, 10)\n }\n catch (err) {\n console.error(err)\n }\n\n setTimeout(() => {\n document.body.removeChild(iframe)\n }, 100)\n }\n }\n}\n\nexport function printEditorContent(view: Editor['view']) {\n const editorContent = view.dom.closest('.ProseMirror')\n\n if (editorContent) {\n printHtml(editorContent)\n return true\n }\n return false\n}\n","import { Extension } from '@tiptap/core'\n\nimport { ActionButton } from '@/components'\nimport { printEditorContent } from '@/utils/pdf'\n\nexport const ExportPdf = Extension.create<any>({\n name: 'exportPdf',\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, t }: any) => ({\n component: ActionButton,\n componentProps: {\n action: () => {\n printEditorContent(editor.view)\n },\n icon: 'ExportPdf',\n tooltip: t('editor.exportPdf.tooltip'),\n isActive: () => false,\n disabled: false,\n },\n }),\n }\n },\n})\n","import React, { useRef, useState } from 'react'\nimport { ActionButton } from '@/components'\nimport { hasExtension } from '@/utils/utils'\n\nfunction base64ToBlob(base64: any, mimeType: any) {\n const byteCharacters = atob(base64.split(',')[1])\n const byteNumbers = Array.from({ length: byteCharacters.length })\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i)\n }\n const byteArray = new Uint8Array(byteNumbers as any)\n return new Blob([byteArray], { type: mimeType })\n}\n\nfunction blobToFile(blob: any, fileName: any) {\n return new File([blob], fileName, { type: blob.type })\n}\n\nfunction ImportWordButton(props: any) {\n const [loading, setLoading] = useState(false)\n const [file, setFile] = useState<any>()\n const fileInput: any = useRef()\n\n function triggerFileInput() {\n fileInput.current.click()\n }\n\n function handleFileChange(event: any) {\n const f = event.target.files[0]\n setFile(f)\n if (f) {\n importWord()\n }\n }\n\n async function filerImage(html: string) {\n const parser = new DOMParser()\n const doc = parser.parseFromString(html, 'text/html')\n const images = doc.querySelectorAll('img')\n if (!images.length) {\n return doc.body.innerHTML\n }\n const hasImage = hasExtension(props.editor, 'image')\n if (hasImage) {\n const uploadOptions = props.editor.extensionManager.extensions.find(\n (extension: any) => extension.name === 'importWord',\n )?.options\n if (uploadOptions && typeof uploadOptions.upload === 'function') {\n const files: File[] = []\n for (const img of images) {\n const originalSrc = img.getAttribute('src')\n const blob = base64ToBlob(originalSrc, 'image/jpeg')\n\n const file = blobToFile(blob, 'image.jpeg')\n files.push(file)\n }\n const uploadRes = await uploadOptions.upload(files)\n\n for (let i = 0; i < images.length; i++) {\n const img = images[i]\n img.setAttribute('src', uploadRes[i].src)\n }\n return doc.body.innerHTML\n }\n else {\n return doc.body.innerHTML\n }\n }\n else {\n return doc.body.innerHTML\n }\n }\n async function importWord() {\n if (props.convert) {\n const result = await props.convert(file)\n handleResult(result)\n }\n else {\n const formData = new FormData()\n const config = JSON.stringify({\n collaboration_features: {\n comments: true,\n user_id: 'e3',\n track_changes: true,\n },\n formatting: {\n resets: 'none',\n defaults: 'inline',\n styles: 'inline',\n comments: 'basic',\n },\n })\n formData.append('config', config)\n formData.append('file', file)\n setLoading(true)\n fetch('https://docx-converter.cke-cs.com/v2/convert/docx-html', {\n method: 'POST',\n body: formData,\n })\n .then(response => response.json())\n .then(async (data) => {\n handleResult(data.html)\n })\n .catch((error) => {\n console.error('Error:', error)\n setLoading(false)\n })\n }\n }\n async function handleResult(htmlResult: string) {\n const html = await filerImage(htmlResult)\n props.editor.chain().setContent(html, true).run()\n setLoading(false)\n }\n\n return (\n <div>\n <ActionButton loading={loading} disabled={props?.disabled} icon={props?.icon} tooltip={props?.tooltip} action={triggerFileInput} />\n <input\n type=\"file\"\n accept=\".docx\"\n ref={fileInput}\n style={{\n display: 'none',\n }}\n onChange={handleFileChange}\n />\n </div>\n )\n}\n\nexport default ImportWordButton\n","import { Extension } from '@tiptap/core'\n\nimport type { GeneralOptions } from '@/types'\nimport ImportWordButton from '@/extensions/ImportWord/components/ImportWordButton'\n\nexport interface ImportWordOptions extends GeneralOptions<ImportWordOptions> {\n /**\n * 将word 转换成html的接口\n */\n convert?: (file: File) => Promise<string>\n\n /** Function for uploading images */\n upload?: (files: File[]) => Promise<unknown>\n}\n\nexport const ImportWord = Extension.create<ImportWordOptions>({\n name: 'importWord',\n addOptions() {\n return {\n ...this.parent?.(),\n upload: undefined,\n convert: undefined,\n button: ({ editor, extension, t }: any) => {\n const { convert } = extension.options\n return {\n component: ImportWordButton,\n componentProps: {\n convert,\n action: () => editor.commands.setHorizontalRule(),\n disabled: !editor.can().setHorizontalRule(),\n icon: 'Word',\n shortcutKeys: ['alt', 'mod', 'S'],\n tooltip: t('editor.importWrod.tooltip'),\n },\n }\n },\n }\n },\n})\n","import { Extension } from '@tiptap/core'\nimport { saveAs } from 'file-saver'\nimport { DocxSerializer, defaultMarks, defaultNodes } from 'prosemirror-docx'\nimport { Packer } from 'docx'\nimport { ActionButton } from '@/components'\nimport type { GeneralOptions } from '@/types'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n exportWord: {\n exportToWord: () => ReturnType\n }\n }\n}\nexport interface ExportWordOptions extends GeneralOptions<ExportWordOptions> {}\n\nconst nodeSerializer = {\n ...defaultNodes,\n hardBreak: defaultNodes.hard_break,\n codeBlock: defaultNodes.code_block,\n orderedList: defaultNodes.ordered_list,\n listItem: defaultNodes.list_item,\n bulletList: defaultNodes.bullet_list,\n horizontalRule: defaultNodes.horizontal_rule,\n // Requirement Buffer on browser\n image(state: any, node: any) {\n // No image\n state.renderInline(node)\n state.closeBlock(node)\n },\n}\nconst docxSerializer = new DocxSerializer(nodeSerializer, defaultMarks)\n\nexport const ExportWord = Extension.create<ExportWordOptions>({\n name: 'exportWord',\n addOptions() {\n return {\n ...this.parent?.(),\n button: ({ editor, t }: any) => ({\n component: ActionButton,\n componentProps: {\n icon: 'ExportWord',\n action: () => {\n editor?.commands.exportToWord()\n },\n tooltip: t('editor.exportWord.tooltip'),\n isActive: () => false,\n disabled: false,\n },\n }),\n }\n },\n addCommands() {\n return {\n exportToWord:\n () =>\n ({ editor }) => {\n const opts: any = {\n getImageBuffer: async (src: string) => {\n const response = await fetch(src)\n const arrayBuffer = await response.arrayBuffer()\n return new Uint8Array(arrayBuffer)\n },\n }\n const wordDocument = docxSerializer.serialize(editor.state.doc, opts)\n Packer.toBlob(wordDocument).then(blob => saveAs(new Blob([blob]), 'document.docx'))\n return true\n },\n }\n },\n})\n","/* eslint-disable ts/no-unused-expressions */\nimport { useCallback, useEffect, useState } from 'react'\n\nimport { NodeViewWrapper } from '@tiptap/react'\n\nimport cls from 'clsx'\n\nimport styles from './index.module.scss'\nimport { useLocale } from '@/locales'\n\nfunction arrToTree(tocs: any) {\n const result = [] as any\n const levels = [result]\n\n tocs.forEach((o: any) => {\n let offset = -1\n let parent = levels[o.level + offset]\n\n while (!parent) {\n offset -= 1\n parent = levels[o.level + offset]\n }\n\n parent.push({ ...o, children: (levels[o.level] = []) })\n })\n\n return result\n}\n\nexport function NodeViewTableOfContent({ editor }: any) {\n const isEditable = editor.isEditable\n const [items, setItems] = useState([])\n const { t } = useLocale()\n\n const handleUpdate = useCallback(() => {\n const headings = [] as any\n const transaction = editor.state.tr\n\n editor.state.doc.descendants((node: any, pos: any) => {\n if (node.type.name === 'heading') {\n const id = `heading-${headings.length + 1}`\n\n if (node.attrs.id !== id) {\n transaction.setNodeMarkup(pos, undefined, {\n ...node.attrs,\n id,\n })\n }\n\n headings.push({\n level: node.attrs.level,\n text: node.textContent,\n id,\n })\n }\n })\n\n transaction.setMeta('addToHistory', false)\n transaction.setMeta('preventUpdate', true)\n editor.view.dispatch(transaction)\n\n setItems(headings)\n editor.eventEmitter && editor.eventEmitter.emit('TableOfContents', arrToTree(headings))\n }, [editor])\n\n useEffect(() => {\n if (!editor) {\n return\n }\n\n if (!editor.options.editable) {\n handleUpdate()\n return\n }\n\n editor.on('update', handleUpdate)\n\n return () => {\n editor.off('update', handleUpdate)\n }\n }, [editor, handleUpdate])\n\n useEffect(() => {\n handleUpdate()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n return (\n <NodeViewWrapper className={cls('tableOfContent', styles.toc, isEditable && styles.visible)}>\n {isEditable\n ? (\n <div style={{ position: 'relative' }}>\n <p className=\"richtext-mb-[8px] text-[20px] richtext-font-semibold\">{t('editor.table_of_content')}</p>\n <ul className={styles.list}>\n {items.map((item: any, index) => (\n <li key={index} className={styles.item} style={{ paddingLeft: `${item.level - 2}rem` }}>\n <a href={`#${item.id}`}>{item.text}</a>\n </li>\n ))}\n </ul>\n </div>\n )\n : null}\n </NodeViewWrapper>\n )\n}\n","import type { Editor } from '@tiptap/core'\nimport type { Node } from '@tiptap/pm/model'\nimport type { EditorState } from '@tiptap/pm/state'\n\nexport function isTitleNode(node: Node): boolean {\n return node && node.type.name === 'title'\n}\n\nexport function isBulletListNode(node: Node): boolean {\n return node && node.type.name === 'bulletList'\n}\n\nexport function isOrderedListNode(node: Node): boolean {\n return node && node.type.name === 'orderedList'\n}\n\nexport function isTodoListNode(node: Node): boolean {\n return node && node.type.name === 'taskList'\n}\n\nexport function isListNode(node: Node): boolean {\n return isBulletListNode(node) || isOrderedListNode(node) || isTodoListNode(node)\n}\n\nexport function getCurrentNode(state: EditorState): any {\n const $head = state.selection.$head\n let node = null\n\n for (let d = $head.depth; d > 0; d--) {\n node = $head.node(d)\n }\n\n return node\n}\n\nexport function getNodeAtPos(state: EditorState, pos: number): any {\n const $head = state.doc.resolve(pos)\n let node = null\n\n for (let d = $head.depth; d > 0; d--) {\n node = $head.node(d)\n }\n\n return node\n}\n\nexport function isInCustomNode(state: EditorState, nodeName: string): boolean {\n if (!state.schema.nodes[nodeName])\n return false\n\n const $head = state.selection.$head\n for (let d = $head.depth; d > 0; d--) {\n if ($head.node(d).type === state.schema.nodes[nodeName]) {\n return true\n }\n }\n return false\n}\n\nexport function isInCodeBlock(state: EditorState): boolean {\n return isInCustomNode(state, 'codeBlock')\n}\n\nexport function isInTitle(state: EditorState): boolean {\n if (state?.selection?.$head?.pos === 0)\n return true\n return isInCustomNode(state, 'title')\n}\n\nexport function isInCallout(state: EditorState): boolean {\n return isInCustomNode(state, 'callout')\n}\n\nexport function findNode(editor: Editor, name: string) {\n const content = editor.getJSON()\n const queue = [content]\n const res = []\n\n while (queue.length) {\n const node = queue.shift() as any\n\n if (node.type === name) {\n res.push(node)\n }\n\n if (node.content && node.content.length) {\n queue.push(...node.content)\n }\n }\n\n return res\n}\n","/* eslint-disable prefer-spread */\nimport { useEffect, useState } from 'react'\n\nimport type { Editor } from '@tiptap/core'\n\nexport function useActive(editor: Editor, ...args: any[]) {\n const [active, toggleActive] = useState(false)\n\n useEffect(() => {\n const listener = () => {\n toggleActive(editor.isActive.apply(editor, args as any))\n }\n\n editor.on('selectionUpdate', listener)\n editor.on('transaction', listener)\n\n return () => {\n editor.off('selectionUpdate', listener)\n editor.off('transaction', listener)\n }\n }, [editor, args, toggleActive])\n\n return active\n}\n","import React, { useCallback } from 'react'\n\nimport type { Editor } from '@tiptap/core'\nimport { ActionButton } from '@/components/ActionButton'\nimport { TableOfContents } from '@/extensions/TableOfContent/TableOfContent'\nimport { useActive } from '@/hooks/useActive'\n\nexport function TableOfContentActionButton({ editor, icon, tooltip }: { editor: Editor, tooltip: string, icon: string }) {\n const isTaskListActive = useActive(editor, TableOfContents.name)\n\n const tableOfContent = useCallback(() => {\n if (isTaskListActive) {\n editor.chain().focus().removeTableOfContents().run()\n return\n }\n editor.chain().focus().setTableOfContents().run()\n }, [editor, isTaskListActive])\n\n return (\n <ActionButton\n action={tableOfContent}\n isActive={() => isTaskListActive || false}\n icon={icon}\n tooltip={tooltip}\n />\n )\n}\n","import { Node, mergeAttributes } from '@tiptap/core'\nimport { ReactNodeViewRenderer } from '@tiptap/react'\nimport { NodeViewTableOfContent } from '@/extensions/TableOfContent/components/NodeViewTableOfContent'\nimport { findNode, isTitleNode } from '@/utils/node'\nimport { TableOfContentActionButton } from '@/extensions/TableOfContent/components/TableOfContentActionButton'\n\ndeclare module '@tiptap/core' {\n interface Commands<ReturnType> {\n tableOfContents: {\n setTableOfContents: () => ReturnType\n removeTableOfContents: () => ReturnType\n }\n }\n}\n\ninterface Options {\n onHasOneBeforeInsert?: () => void\n}\n\nexport const TableOfContents = Node.create<Options>({\n name: 'tableOfContents',\n group: 'block',\n atom: true,\n\n addOptions() {\n return {\n ...this.parent?.(),\n onHasOneBeforeInsert: () => {},\n resizable: true,\n lastColumnResizable: true,\n allowTableNodeSelection: false,\n button: ({ editor, t }: any) => ({\n component: TableOfContentActionButton,\n componentProps: {\n disabled: false,\n icon: 'BookMarked',\n tooltip: t('editor.table.tooltip'),\n editor,\n },\n }),\n }\n },\n\n parseHTML() {\n return [\n {\n tag: 'toc',\n },\n ]\n },\n\n renderHTML({ HTMLAttributes }) {\n return ['toc', mergeAttributes(HTMLAttributes)]\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(NodeViewTableOfContent)\n },\n\n // @ts-expect-error\n addCommands() {\n return {\n setTableOfContents:\n () =>\n ({ commands, editor, view }) => {\n const nodes = findNode(editor, this.name)\n\n if (nodes.length) {\n // @ts-expect-error\n this.options.onHasOneBeforeInsert()\n return\n }\n\n const titleNode = view.props.state.doc.content.firstChild as any\n\n if (isTitleNode(titleNode)) {\n const pos = ((titleNode.firstChild && titleNode.firstChild.nodeSize) || 0) + 1\n return commands.insertContentAt(pos, { type: this.name })\n }\n\n return commands.insertContent({\n type: this.name,\n })\n },\n removeTableOfContents: () =>\n ({ state, dispatch }: any) => {\n const { tr } = state\n const nodeType = state.schema.nodes.tableOfContents\n\n state.doc.descendants((node: any, pos: any) => {\n if (node.type === nodeType) {\n const from = pos\n const to = pos + node.nodeSize\n tr.delete(from, to)\n }\n })\n\n if (tr.docChanged) {\n dispatch(tr)\n return true\n }\n\n return false\n },\n }\n },\n\n addGlobalAttributes() {\n return [\n {\n types: ['heading'],\n attributes: {\n id: {\n default: null,\n },\n },\n },\n ]\n },\n})\n"],"names":["DEFAULT_LANG_VALUE","EDITOR_UPDATE_THROTTLE_WAIT_TIME","EDITOR_UPDATE_WATCH_THROTTLE_WAIT_TIME","IMAGE_MIN_SIZE","IMAGE_MAX_SIZE","IMAGE_THROTTLE_WAIT_TIME","TABLE_INIT_GRID_SIZE","TABLE_MAX_GRID_SIZE","TABLE_DEFAULT_SELECTED_GRID_SIZE","DEFAULT_COLOR","COLORS_LIST","DEFAULT_FONT_FAMILY_LIST","DEFAULT_LANGUAGE_CODE_BLOCK","MAP_LANGUAGE_CODE_LABELS","DEFAULT_FONT_SIZE_LIST","DEFAULT_FONT_SIZE_VALUE","IMAGE_SIZE","VIDEO_SIZE","DEFAULT_LINE_HEIGHT_LIST","LINE_HEIGHT_100","DEFAULT_LINE_HEIGHT","NODE_TYPE_MENU","BUBBLE_TEXT_LIST","isMacResult","isMac","getShortcutKey","key","getShortcutKeys","keys","cn","inputs","twMerge","clsx","ActionButton","React","props","ref","icon","tooltip","disabled","customClass","shortcutKeys","tooltipOptions","action","isActive","children","asChild","upload","rest","Icon","icons","Comp","Slot","Toggle","Tooltip","jsx","TooltipTrigger","jsxs","TooltipContent","ActionMenuButton","Button","_a","deleteNode","nodeType","editor","state","$pos","done","d","node","pos","mapSelf","useAttributes","attrbute","defaultValue","map","mapFn","value","setValue","useState","prevValueCache","useRef","useEffect","listener","attrs","nextAttrs","deepEqual","Textarea","className","buttonVariants","cva","variant","size","DropdownMenu","DropdownMenuPrimitive.Root","DropdownMenuTrigger","DropdownMenuPrimitive.Trigger","DropdownMenuGroup","DropdownMenuPrimitive.Group","DropdownMenuPortal","DropdownMenuPrimitive.Portal","DropdownMenuSub","DropdownMenuPrimitive.Sub","DropdownMenuRadioGroup","DropdownMenuPrimitive.RadioGroup","DropdownMenuSubTrigger","inset","DropdownMenuPrimitive.SubTrigger","ChevronRight","DropdownMenuSubContent","DropdownMenuPrimitive.SubContent","DropdownMenuContent","sideOffset","DropdownMenuPrimitive.Content","DropdownMenuItem","DropdownMenuPrimitive.Item","DropdownMenuCheckboxItem","checked","DropdownMenuPrimitive.CheckboxItem","DropdownMenuPrimitive.ItemIndicator","Check","DropdownMenuRadioItem","DropdownMenuPrimitive.RadioItem","Circle","DropdownMenuLabel","DropdownMenuPrimitive.Label","DropdownMenuSeparator","DropdownMenuPrimitive.Separator","DropdownMenuShortcut","Input","type","labelVariants","Label","LabelPrimitive.Root","Popover","PopoverPrimitive.Root","PopoverTrigger","PopoverPrimitive.Trigger","PopoverContent","align","PopoverPrimitive.Portal","PopoverPrimitive.Content","Separator","orientation","decorative","SeparatorPrimitive.Root","Switch","SwitchPrimitives.Root","SwitchPrimitives.Thumb","Tabs","TabsPrimitive.Root","TabsList","TabsPrimitive.List","TabsTrigger","TabsPrimitive.Trigger","TabsContent","TabsPrimitive.Content","ToastProvider","ToastPrimitives.Provider","ToastViewport","ToastPrimitives.Viewport","toastVariants","Toast","ToastPrimitives.Root","ToastAction","ToastPrimitives.Action","ToastClose","ToastPrimitives.Close","X","ToastTitle","ToastPrimitives.Title","ToastDescription","ToastPrimitives.Description","toggleVariants","TogglePrimitive.Root","TooltipProvider","TooltipPrimitive.Provider","TooltipPrimitive.Root","TooltipPrimitive.Trigger","TooltipPrimitive.Content","TOAST_LIMIT","TOAST_REMOVE_DELAY","count","genId","toastTimeouts","addToRemoveQueue","toastId","timeout","dispatch","reducer","t","toast","listeners","memoryState","id","update","dismiss","open","useToast","setState","index","BubbleMenuKatex","Katex","text","defaultShowPicker","visible","toggleVisible","shouldShow","useCallback","deleteMe","submit","BubbleMenu","Fragment","HelpCircle","Pencil","Trash2","bubbleMenu","extensionsNames","ext","renderMenuItems","ColumnsBubbleMenu","_b","TableBubbleMenu","_c","BubbleMenuLink","_d","BubbleMenuImage","_e","BubbleMenuVideo","_f","_g","ContentMenu","_h","BubbleMenuText","locale","en","vi","zh_CN","mitt","all","handler","handlers","evt","DEFAULT_LOCALE","Locale","__publicField","lang","message","hook","path","atomLang","proxy","useLocale","atomLangSnap","useSnapshot","useMemo","watchLang","val","localeActions","locale$1","NoFill","ColorPicker","highlight","selectedColor","setSelectedColor","onChange","colors","DEFAULT_COLORS_LIST","chunkedColors","colorsArray","chunked","i","recentColorsStore","setRecentColorsStore","setRecentColor","color","newRecentColors","setColor","items","item","idx","AddMoreColor","colorMore","setColorMore","openColorMore","setOpenColorMore","e","HexColorPicker","Plus","RESET_CSS","themeProxy","useTheme","themeActions","theme","clamp","min","max","isNumber","isString","isFunction","getCssUnitWithDefault","defaultUnit","stringValue","num","unitMatch","unit","hasExtension","name","extensions","ensureNameValueOptions","arr","APPEND_ORDER","APPEND_PRIORITY","MARK_KEY","containerCache","contains","root","n","getMark","mark","getContainer","option","getOrder","prepend","findStyles","container","injectCSS","css","csp","priority","mergedOrder","isPrependQueue","styleNode","firstChild","existStyle","nodePriority","findExistNode","removeCSS","existNode","syncRealContainer","cachedRealContainer","placeholderStyle","parentNode","updateCSS","newNode","RichTextEditor","content","useEditorOptions","sortExtensions","diff","differenceBy","k","find","onValueChange","throttle","output","getOutput","useEditor","useImperativeHandle","hasExtensionValue","Toolbar","EditorContent","forwardRef","acc","a","b","menus","extension","button","divider","spacer","toolbar","_button","menu","ButtonComponent","AspectRatio","BlockquoteLeft","DeleteColumn","DeleteRow","FileWordOutline","IconComponent","FormatLineHeight","MenuDown","SizeL","SizeM","SizeS","ImportWord","ExportPdf","ExportWord","ColumnAddLeft","ColumnAddRight","Bold","LoaderCircle","Italic","Underline","Quote","Strikethrough","Minus","Eraser","PaintRoller","Redo2","Undo2","TextAlignCenterIcon","TextAlignJustifyIcon","TextAlignLeftIcon","TextAlignRightIcon","ChevronDown","Subscript","Superscript","Code","CodeXml","Type","IndentIncrease","IndentDecrease","List","ListOrdered","ListTodo","Link","ImageUp","Video","Maximize","Minimize","Table","Sparkles","Unlink","BetweenHorizonalEnd","BetweenHorizonalStart","BetweenVerticalStart","BetweenVerticalEnd","TableCellsMerge","TableCellsSplit","Trash","Replace","ChevronsUpDown","Heading1","Heading2","Heading3","Heading4","Heading5","Heading6","Columns2","Columns3","Columns4","GripVertical","Copy","Clipboard","PanelLeft","PanelRight","Frame","SmilePlus","SmilePlusIcon","Sigma","BookMarked","imageSizeMenus","types","imageAlignMenus","iconMap","videoSizeMenus","getBubbleImage","deleteSelection","getBubbleVideo","getBubbleText","IndentProps","updateIndentLevel","tr","delta","doc","selection","TextSelection","AllSelection","from","to","setNodeIndentMarkup","isList","indent","nodeAttrs","createIndentCommand","pluginKey","dragHandlePluginDefaultKey","currentNode","setCurrentNode","currentNodePos","setCurrentNodePos","dragElement","pluginRef","menuOpen","setMenuOpen","hasTextAlignExtension","hasIndentExtension","hasClearExtension","DragHandlePlugin","handleNodeChange","resetTextFormatting","chain","copyNodeToClipboard","duplicateNode","$anchor","selectedNode","setTextAlign","alignments","increaseIndent","indentTr","decreaseIndent","handleAdd","currentNodeSize","insertPos","currentNodeIsEmptyParagraph","focusPos","handleMenuOpenChange","tippyOptions","ItemA","$from","IconC","fill","HighlightActionButton","toggleColor","setSelectedColorDebounce","debounce","onAddColumnBefore","onAddColumnAfter","onDeleteColumn","onAddRowAbove","onAddRowBelow","onDeleteRow","onMergeCell","onSplitCell","onDeleteTable","onSetCellBackground","getReferenceClientRect","view","tableWrapper","sticky","_j","_i","_l","_k","_n","_m","_p","_o","_r","_q","LinkEditBlock","form","setForm","openInNewTab","setOpenInNewTab","link","target","handleSubmit","event","LinkViewBlock","truncate","showEdit","setShowEdit","onSetLink","url","unSetLink","isImageNode","isVideoNode","isImage","BubbleMenuReact","isVideo","MultiColumn","addColBefore","addColAfter","deleteCol","TiptapBold","TiptapItalic","TiptapUnderline","Strike","TiptapStrike","TiptapCode","highlighter","highlighterPromise","loadingLanguages","loadingThemes","getShiki","loadHighlighter","opts","themes","bundledThemes","langs","bundledLanguages","createHighlighter","h","loadTheme","loadLanguage","language","initHighlighter","defaultTheme","defaultLanguage","codeBlocks","findChildren","block","languages","getDecorations","decorations","themeToApply","tokens","line","token","decoration","Decoration","DecorationSet","ShikiPlugin","shikiPlugin","Plugin","PluginKey","ShikiPluginView","_","transaction","decorationSet","oldState","newState","oldNodeName","newNodeName","oldNodes","newNodes","didChangeSomeCodeBlock","step","CodeBlockActiveButton","onClick","CodeBlock","CodeBlockExt","FontFamilyButton","active","style","FontFamily","FontFamilyTiptap","fontFamilyList","baseKitExt","font","HeadingButton","Heading","TiptapHeading","levels","level","TextAlignMenuButton","TextAlign","TiptapTextAlign","shortcutKeysMap","FontSizeMenuButton","FontSize","Extension","fontSizes","defaultFontSize","fontSize","element","attributes","ColorActionButton","Color","TiptapColor","Highlight","TiptapHighlight","BulletList","TiptapBulletList","Clear","Node","OrderedList","TiptapOrderedList","TaskList","TiptapTaskList","TaskItem","Blockquote","TiptapBlockquote","LinkEditPopover","TiptapLink","HTMLAttributes","mergeAttributes","schema","range","getMarkRange","$start","$end","HorizontalRule","TiptapHorizontalRule","HistoryActionButton","historys","History","TiptapHistory","Document","TiptapDocument","createColumn","colType","colContent","getColumnsNodeTypes","roles","createColumns","colsCount","cols","col","addOrDeleteCol","maybeColumns","findParentNode","maybeColumn","Column","colIndex","colsJSON","nextIndex","colJSON","nextCols","nextSelectPos","gotoCol","EXTENSION_PRIORITY_HIGHEST","offset","ColumnActionButton","Selection","TextDropdown","activeItem","TextBubble","nodeEqualsType","TrailingNode","plugin","disabledNodes","__","shouldInsertNodeAtEnd","endPosition","lastNode","BaseKit","Placeholder","Focus","Text","Gapcursor","Dropcursor","CharacterCount","Paragraph","HardBreak","ListItem","TextStyle","SubAndSuperScript","subscript","superscript","subBtn","superBtn","TiptapSubscript","TiptapSuperscript","ActionMoreButton","MoreMark","Indent","identAttr","percentageToDecimal","percentageString","LineHeightDropdown","toggleLightheight","LineHeights","ALLOWED_NODE_TYPES","setTextLineHeight","lineHeight","tasks","lineHeightValue","task","createLineHeightCommand","LineHeight","commands","renderGroups","groups","CommandsList","selectedCommandIndex","setSelectedCommandIndex","selectedGroupIndex","setSelectedGroupIndex","scrollContainer","activeItemRefs","onKeyDown","activeItemIndex","upHandler","downHandler","enterHandler","newCommandIndex","newGroupIndex","selectItem","groupIndex","commandIndex","command","createCommandClickHandler","setActiveItemRef","el","group","extensionName","popup","SlashCommand","tippy","Suggestion","isRootDepth","isParagraph","isStartOfNode","isInColumn","afterContent","isValidAfterContent","query","labelNormalized","queryNormalized","aliases","alias","labelMatch","aliasMatch","component","scrollHandler","ReactRenderer","rect","yPos","ResizeDirection","ImageView","maxSize","setMaxSize","originalSize","setOriginalSize","resizeDirections","resizing","setResizing","resizerState","setResizerState","imgAttrs","src","alt","w","width","height","imageMaxStyle","onImageLoad","selectImage","getPos","getMaxSize","prev","onMouseDown","dir","originalWidth","originalHeight","aspectRatio","maxWidth","flushSync","onMouseMove","x","dx","onMouseUp","onEvents","offEvents","resizeOb","NodeViewWrapper","direction","Image","TiptapImage","ReactNodeViewRenderer","options","uploadKey","UploadImagesPlugin","set","placeholder","createPlaceholder","deco","spec","image","findPlaceholder","found","createImageUpload","validateFn","onUpload","files","file","result","placeholderPos","imageSrc","handleImagePaste","uploadFn","handleImageDrop","moved","coordinates","ImageUploader","setLink","fileInput","handleFile","uploadOptions","handleLink","handleDelete","handleClick","DEFAULT_OPTIONS","ImageUpload","linkConvert","iframeHTMLAttributes","responsiveStyle","responsiveSizesStyle","responsiveDOM","VideoUploaderView","loading","setLoading","res","VideoUpload","setCellBackgroundMarkup","backgroundColor","updateCellBackground","CellSelection","createCellBackgroundCommand","TableCellBackground","mobileRE","notMobileRE","tabletRE","isMobile","ua","createArray","length","CreateTablePopover","withHeaderRow","setWithHeaderRow","tableGridSize","setTableGridSize","selectedTableGridSize","setSelectedTableGridSize","selectTableGridSize","rows","resetTableGridSize","row","TableActionButton","createTable","TiptapTable","TableRow","TableHeader","TableCell","FormatPainter","marks","dom","cursorUrl","mouseup","EmbedServiceLink","getYoutubeSrc","splits","len","getYoukuSrc","idRule","regex","match","getBilibiliSrc","getQQVideoSrc","getAMapSrc","originalLink","getBaiduMapSrc","getGoogleMapSrc","getModaoSrc","getLanhuSrc","getFigmaSrc","getCanvaSrc","getProcessonSrc","getCodepenSrc","getJinshujuSrc","getCommonSrc","getMatchedUrl","service","linkRule","rule","formatUrl","getServiceSrc","IframeNodeView","setOriginalLink","handleConfirm","Iframe","SearchAndReplaceButton","currentIndex","setCurrentIndex","results","setResults","searchValue","setSearchValue","replaceValue","setReplaceValue","setVisible","searchExtension","SearchAndReplace","preIndex","prevResults","ON_SEARCH_RESULTS","updateView","s","disableRegex","caseSensitive","processSearches","searchTerm","searchResultClass","textNodesWithPosition","matches","j","m","r","replace","replaceTerm","rebaseNextResult","lastOffset","currentFrom","currentTo","replaceAll","ourResults","rebaseNextResultResponse","gotoSearchResult","searchResults","searchResultCurrentClass","gotoIndex","scrollIntoView","customEventSearch","currentResult","extensionThis","ctx","docChanged","decorationsToReturn","fromPos","toPos","namesToEmoji","accu","emoji","names","emojiSearch","EmojiList","$container","selectedIndex","setSelectedIndex","EXPRESSIONES","SYMBOLS","OBJECTS","ACTIVITIES","TRAVELS","FLAGS","ANIMALS","FOODS","Activity","Animal","Flag","Food","Object","Symbol","Travel","safeJSONStringify","obj","getStorage","setStorage","LRUCache","capacity","tailNode","createKeysLocalStorageLRUCache","storageKey","lruCache","emojiLocalStorageLRUCache","LIST","Laugh","RECENT_DEFAULT","EmojiPickerWrap","onSelectEmoji","recentUsed","setRecentUsed","renderedList","Clock3","selectEmoji","defaultEmoji","defaultEmojiNew","list","ex","EmojiPicker","setEmoji","EmojiPluginKey","Emoji","emojiObject","isEditable","convertColorToRGBA","hexCode","opacity","g","rgb","hex","KatexWrapper","formatText","katex","KatexActiveButton","getDatasetAttribute","attribute","nodeInputRule","printHtml","str","iframe","frameWindow","err","printEditorContent","editorContent","base64ToBlob","base64","mimeType","byteCharacters","byteNumbers","byteArray","blobToFile","blob","fileName","ImportWordButton","setFile","triggerFileInput","handleFileChange","f","importWord","filerImage","html","images","img","originalSrc","uploadRes","handleResult","formData","config","response","data","error","htmlResult","convert","nodeSerializer","defaultNodes","docxSerializer","DocxSerializer","defaultMarks","arrayBuffer","wordDocument","Packer","saveAs","arrToTree","tocs","o","parent","NodeViewTableOfContent","setItems","handleUpdate","headings","cls","styles","isTitleNode","findNode","queue","useActive","args","toggleActive","TableOfContentActionButton","isTaskListActive","TableOfContents","tableOfContent","titleNode"],"mappings":"2sBACaA,GAAqB,KAGrBC,GAAmC,IAMnCC,GAAyCD,GAAmC,GAG5EE,GAAiB,GAEjBC,GAAiB,IAEjBC,GAA2B,GAG3BC,GAAuB,GAEvBC,GAAsB,GAEtBC,GAAmC,EAEnCC,GAAgB,UAEhBC,GAAc,CACzB,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,SACF,EAGaC,GAA2B,CACtC,QACA,4BACA,QACA,YACA,SACF,EAEaC,GAA8B,CACzC,OACA,MACA,KACA,IACF,EAEaC,GAA2B,CACtC,KAAM,OACN,IAAK,MACL,GAAI,aACJ,GAAI,YACN,EAGaC,GAAyB,CACpC,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,MACF,EAGaC,GAA0B,UAG3B,IAAAC,IAAAA,IACVA,EAAAA,EAAA,cAAe,GAAf,EAAA,aACAA,EAAAA,EAAA,eAAgB,GAAhB,EAAA,cACAA,EAAA,YAAe,EAAA,OAHLA,IAAAA,IAAA,CAAA,CAAA,EAOAC,IAAAA,IACVA,EAAAA,EAAA,cAAe,GAAf,EAAA,aACAA,EAAAA,EAAA,eAAgB,GAAhB,EAAA,cACAA,EAAA,YAAe,EAAA,OAHLA,IAAAA,IAAA,CAAA,CAAA,EAOL,MAAMC,GAA2B,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAM,EAC1EC,GAAkB,IAClBC,GAAsB,IAGtBC,GAAsB,CACjC,MAAO,CACL,UACA,mBACA,oBACA,mBACA,UACA,aACA,eACA,cACA,UACA,qBACA,QACF,EACA,KAAM,CACJ,UACA,cACA,UACA,OACA,SACA,YACA,SACA,OACA,OACA,UACA,QACA,YACA,WACF,EACA,MAAO,CAAC,mBAAoB,oBAAqB,mBAAoB,UAAW,QAAQ,EACxF,MAAO,CAAC,aAAa,CACvB,EAGaC,GAAmB,CAC9B,OACA,SACA,YACA,SACA,OACA,OACA,UACA,QACA,YACA,WACF,EC/MA,IAAIC,GAMG,SAASC,IAAiB,CAC/B,OAAID,KAAgB,SACJA,GAAA,UAAU,SAAS,SAAS,KAAK,GAE1CA,EACT,CAKO,SAASE,GAAeC,EAAqB,CAClD,MAAI,GAAGA,CAAG,GAAG,YAAA,IAAkB,MACtBF,GAAA,EAAU,IAAM,OAEhB,GAAGE,CAAG,GAAG,YAAA,IAAkB,MAC3BF,GAAA,EAAU,IAAM,MAEhB,GAAGE,CAAG,GAAG,YAAA,IAAkB,QAC3BF,GAAA,EAAU,IAAM,QAGhBE,CAEX,CACO,SAASC,GAAgBC,EAAwB,CACtD,OAAOA,EAAK,IAAIH,EAAc,EAAE,KAAK,GAAG,CAC1C,CChCO,SAASI,KAAMC,EAAsB,CACnC,OAAAC,UAAQC,EAAAA,KAAKF,CAAM,CAAC,CAC7B,CCsCA,MAAMG,EAAeC,EAAM,WACzB,CAACC,EAAOC,IAAQ,CACR,KAAA,CACJ,KAAAC,EAAO,OAEP,QAAAC,EAAU,OACV,SAAAC,EAAW,GACX,YAAAC,EAAc,GAGd,aAAAC,EAAe,OACf,eAAAC,EAAiB,CAAC,EAClB,OAAAC,EAAS,OACT,SAAAC,EAAW,OACX,SAAAC,EACA,QAAAC,EAAU,GACV,OAAAC,EAAS,GACT,GAAGC,CACD,EAAAb,EAEEc,EAAOC,GAAMb,CAAc,EAC3Bc,EAAOL,EAAUM,EAAO,KAAAC,GAE9B,cACGC,GACC,CAAA,SAAA,CAACC,EAAAA,IAAAC,GAAA,CAAe,QAAO,GACrB,SAAAC,EAAA,KAACN,EAAA,CACC,IAAAf,EACA,KAAK,KACL,UAAWP,EAAG,sCAAuCW,CAAW,EAEhE,SAAAD,EACA,QAASI,EACT,aAAYC,GAAA,MAAAA,IAAe,KAAO,MACjC,GAAGI,EAEH,SAAA,CAAQC,GAAAM,EAAAA,IAACN,EAAK,CAAA,UAAU,2BAA4B,CAAA,EACpDJ,CAAA,CAAA,CAAA,EAEL,EACCP,SACEoB,GAAgB,CAAA,GAAGhB,EAClB,SAACe,EAAA,KAAA,MAAA,CAAI,UAAU,+FACb,SAAA,CAAAF,EAAAA,IAAC,OAAK,SAAQjB,CAAA,CAAA,EACb,CAAC,EAACG,GAAA,MAAAA,EAAc,eAAW,OAAM,CAAA,SAAAd,GAAgBc,CAAY,EAAE,CAAA,CAAA,CAClE,CACF,CAAA,CAEJ,CAAA,CAAA,CAEJ,CACF,ECjEMkB,GAAmBzB,EAAM,WAC7B,CAAC,CAAE,QAAAY,EAAS,GAAGX,CAAA,EAASC,IAAQ,OACxB,MAAAa,EAAOC,GAAMf,EAAM,IAAI,EACvBgB,EAAOL,EAAUM,EAAO,KAAAQ,EAE9B,cACGN,GACC,CAAA,SAAA,CAACC,EAAAA,IAAAC,GAAA,CAAe,QAAO,GACrB,SAAAD,EAAA,IAACJ,EAAA,CACC,IAAAf,EACA,UAAU,gGACV,QAAQ,QACR,SAAUD,GAAA,YAAAA,EAAO,SAChB,GAAGA,EAEJ,SAAAsB,EAAA,KAAC,MAAI,CAAA,UAAU,2EACZ,SAAA,EAAAtB,GAAA,YAAAA,EAAO,QACLoB,EAAA,IAAA,MAAA,CAAI,UAAU,2EAA4E,0BAAO,MAAM,EAEzGN,GAAQM,EAAAA,IAACN,EAAK,CAAA,UAAU,uFAAwF,CAAA,CAAA,EACnH,CAAA,CAAA,EAEJ,EACCM,MAAAG,GAAA,CACC,SAACD,EAAAA,KAAA,MAAA,CAAI,UAAU,+FACZ,SAAA,EAAAtB,GAAA,YAAAA,EAAO,UAAWoB,MAAC,MAAK,CAAA,SAAApB,GAAA,YAAAA,EAAO,QAAQ,EACvCoB,EAAA,IAAA,MAAA,CAAI,UAAU,gBACZ,UAAC,GAACM,EAAA1B,GAAA,YAAAA,EAAO,eAAP,MAAA0B,EAAqB,eAAW,OAAM,CAAA,SAAAlC,GAAgBQ,GAAA,YAAAA,EAAO,YAAY,CAAE,CAAA,EAChF,CAAA,CAAA,CACF,CACF,CAAA,CACF,CAAA,CAAA,CAEJ,CACF,EC7DgB,SAAA2B,GAAWC,EAAkBC,EAAgB,CACrD,KAAA,CAAE,MAAAC,CAAU,EAAAD,EACZE,EAAOD,EAAM,UAAU,QAC7B,IAAIE,EAAO,GAEX,GAAID,EAAK,MACP,QAASE,EAAIF,EAAK,MAAOE,EAAI,EAAGA,IACjBF,EAAK,KAAKE,CAAC,EACf,KAAK,OAASL,IAEjBC,EAAO,qBAETA,EAAO,oBAAoBC,EAAM,GAAG,OAAOC,EAAK,OAAOE,CAAC,EAAGF,EAAK,MAAME,CAAC,CAAC,EAAE,eAAgB,CAAA,EACrFD,EAAA,QAIR,CAEG,MAAAE,EAAOJ,EAAM,UAAU,KACzBI,GAAQA,EAAK,KAAK,OAASN,IAC7BC,EAAO,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAC9BG,EAAA,GAEX,CAEA,GAAI,CAACA,EAAM,CACT,MAAMG,EAAMJ,EAAK,IAEjB,GAAII,EAAK,CACP,MAAMD,EAAOJ,EAAM,GAAG,IAAI,OAAOK,CAAG,EAEhCD,GAAQA,EAAK,KAAK,OAASN,IAEzBC,EAAO,qBAEFA,EAAA,oBAAoBC,EAAM,GAAG,OAAOK,EAAKA,EAAMD,EAAK,QAAQ,CAAC,EAC/DF,EAAA,GAEX,CACF,CAEO,OAAAA,CACT,CCrCA,SAASI,GAAWH,EAAS,CACpB,OAAAA,CACT,CAEO,SAASI,GAAwBR,EAAgBS,EAAkBC,EAAkBC,EAAqB,CAC/G,MAAMC,EAAgBL,GAChB,CAACM,EAAOC,CAAQ,EAAIC,EAAY,SAAAH,EAAMF,CAAmB,CAAC,EAC1DM,EAAiBC,SAAUJ,CAAK,EAEtCK,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAW,IAAM,CACf,MAAAC,EAAQ,CAAE,GAAGV,EAAc,GAAGV,EAAO,cAAcS,CAAQ,GACjE,OAAO,KAAKW,CAAK,EAAE,QAAS1D,GAAQ,EAC9B0D,EAAM1D,CAAG,IAAM,MAAQ0D,EAAM1D,CAAG,IAAM,UAElC0D,EAAA1D,CAAG,EAAIgD,EAAahD,CAAG,EAC/B,CACD,EACK,MAAA2D,EAAYT,EAAMQ,CAAK,EACzBE,YAAUN,EAAe,QAASK,CAAS,IAG/CP,EAASO,CAAS,EAClBL,EAAe,QAAUK,EAAA,EAGpB,OAAArB,EAAA,GAAG,kBAAmBmB,CAAQ,EAC9BnB,EAAA,GAAG,cAAemB,CAAQ,EAE1B,IAAM,CACJnB,EAAA,IAAI,kBAAmBmB,CAAQ,EAC/BnB,EAAA,IAAI,cAAemB,CAAQ,CAAA,GAEnC,CAACnB,EAAQU,EAAcD,EAAUG,CAAK,CAAC,EAEnCC,CACT,CCrCA,MAAMU,GAAWrD,EAAM,WACrB,CAAC,CAAE,UAAAsD,EAAW,GAAGrD,CAAA,EAASC,IAEtBmB,EAAA,IAAC,WAAA,CACC,UAAW1B,EACT,0cACA2D,CACF,EACA,IAAApD,EACC,GAAGD,CAAA,CAAA,CAIZ,EACAoD,GAAS,YAAc,WCfvB,MAAME,GAAiBC,EAAA,IACrB,gaACA,CACE,SAAU,CACR,QAAS,CACP,QAAS,uFACT,YACE,gGACF,QACE,8HACF,UACE,0FACF,MAAO,iEACP,KAAM,4EACR,EACA,KAAM,CACJ,QAAS,4CACT,GAAI,iDACJ,GAAI,kDACJ,KAAM,6BACR,CACF,EACA,gBAAiB,CACf,QAAS,UACT,KAAM,SACR,CACF,CACF,EAQM9B,EAAS1B,EAAM,WACnB,CAAC,CAAE,UAAAsD,EAAW,QAAAG,EAAS,KAAAC,EAAM,QAAA9C,EAAU,GAAO,GAAGX,CAAM,EAAGC,IAAQ,CAC1D,MAAAe,EAAOL,EAAUM,EAAO,KAAA,SAE5B,OAAAG,EAAA,IAACJ,EAAA,CACC,UAAWtB,EAAG4D,GAAe,CAAE,QAAAE,EAAS,KAAAC,EAAM,UAAAJ,CAAA,CAAW,CAAC,EAC1D,IAAApD,EACC,GAAGD,CAAA,CAAA,CAGV,CACF,EACAyB,EAAO,YAAc,SC7CrB,MAAMiC,EAAeC,EAAsB,MAErCC,EAAsBC,EAAsB,QAE5CC,GAAoBC,EAAsB,OAE1CC,GAAqBC,EAAsB,QAE3CC,GAAkBC,EAAsB,KAExCC,GAAyBC,EAAsB,YAE/CC,GAAyBvE,EAAM,WAKnC,CAAC,CAAE,UAAAsD,EAAW,MAAAkB,EAAO,SAAA7D,EAAU,GAAGV,GAASC,IAC3CqB,EAAA,KAACkD,EAAsB,YAAtB,CACC,IAAAvE,EACA,UAAWP,EACT,0OACA6E,GAAS,gBACTlB,CACF,EACC,GAAGrD,EAEH,SAAA,CAAAU,EACDU,EAAAA,IAACqD,EAAa,aAAA,CAAA,UAAU,4CAA6C,CAAA,CAAA,CAAA,CACvE,CACD,EACDH,GAAuB,YACnBE,EAAiC,YAAA,YAE/B,MAAAE,GAAyB3E,EAAM,WAGnC,CAAC,CAAE,UAAAsD,EAAW,GAAGrD,CAAM,EAAGC,IAC1BmB,EAAA,IAACuD,EAAsB,YAAtB,CACC,IAAA1E,EACA,UAAWP,EACT,omBACA2D,CACF,EACC,GAAGrD,CAAA,CACN,CACD,EACD0E,GAAuB,YACnBC,EAAiC,YAAA,YAErC,MAAMC,EAAsB7E,EAAM,WAGhC,CAAC,CAAE,UAAAsD,EAAW,WAAAwB,EAAa,EAAG,GAAG7E,GAASC,IACzCmB,EAAAA,IAAA6C,EAAAA,QAAA,CACC,SAAA7C,EAAA,IAAC0D,EAAsB,SAAtB,CACC,IAAA7E,EACA,WAAA4E,EACA,UAAWnF,EACT,omBACA2D,CACF,EACC,GAAGrD,CAAA,CACN,CAAA,CACF,CACD,EACD4E,EAAoB,YAAcE,EAA8B,SAAA,YAE1D,MAAAC,EAAmBhF,EAAM,WAK7B,CAAC,CAAE,UAAAsD,EAAW,MAAAkB,EAAO,GAAGvE,GAASC,IACjCmB,EAAA,IAAC4D,EAAsB,MAAtB,CACC,IAAA/E,EACA,UAAWP,EACT,yWACA6E,GAAS,gBACTlB,CACF,EACC,GAAGrD,CAAA,CACN,CACD,EACD+E,EAAiB,YAAcC,EAA2B,MAAA,YAEpD,MAAAC,GAA2BlF,EAAM,WAGrC,CAAC,CAAE,UAAAsD,EAAW,SAAA3C,EAAU,QAAAwE,EAAS,GAAGlF,GAASC,IAC7CqB,EAAA,KAAC6D,EAAsB,cAAtB,CACC,IAAAlF,EACA,UAAWP,EACT,uXACA2D,CACF,EACA,QAAA6B,EACC,GAAGlF,EAEJ,SAAA,CAAAoB,EAAA,IAAC,OAAK,CAAA,UAAU,8HACd,SAAAA,EAAAA,IAACgE,EAAsB,eAAtB,CACC,SAAAhE,EAAAA,IAACiE,EAAAA,MAAM,CAAA,UAAU,2BAA4B,CAAA,CAC/C,CAAA,EACF,EACC3E,CAAA,CAAA,CACH,CACD,EACDuE,GAAyB,YACrBE,EAAmC,cAAA,YAEjC,MAAAG,GAAwBvF,EAAM,WAGlC,CAAC,CAAE,UAAAsD,EAAW,SAAA3C,EAAU,GAAGV,GAASC,IACpCqB,EAAA,KAACiE,EAAsB,WAAtB,CACC,IAAAtF,EACA,UAAWP,EACT,uXACA2D,CACF,EACC,GAAGrD,EAEJ,SAAA,CAAAoB,EAAA,IAAC,OAAK,CAAA,UAAU,8HACd,SAAAA,EAAAA,IAACgE,EAAsB,eAAtB,CACC,SAAAhE,EAAAA,IAACoE,EAAAA,OAAO,CAAA,UAAU,iDAAkD,CAAA,CACtE,CAAA,EACF,EACC9E,CAAA,CAAA,CACH,CACD,EACD4E,GAAsB,YAAcC,EAAgC,WAAA,YAE9D,MAAAE,GAAoB1F,EAAM,WAK9B,CAAC,CAAE,UAAAsD,EAAW,MAAAkB,EAAO,GAAGvE,GAASC,IACjCmB,EAAA,IAACsE,EAAsB,OAAtB,CACC,IAAAzF,EACA,UAAWP,EACT,wEACA6E,GAAS,gBACTlB,CACF,EACC,GAAGrD,CAAA,CACN,CACD,EACDyF,GAAkB,YAAcC,EAA4B,OAAA,YAEtD,MAAAC,GAAwB5F,EAAM,WAGlC,CAAC,CAAE,UAAAsD,EAAW,GAAGrD,CAAM,EAAGC,IAC1BmB,EAAA,IAACwE,EAAsB,WAAtB,CACC,IAAA3F,EACA,UAAWP,EAAG,+DAAgE2D,CAAS,EACtF,GAAGrD,CAAA,CACN,CACD,EACD2F,GAAsB,YAAcC,EAAgC,WAAA,YAEpE,SAASC,GAAqB,CAC5B,UAAAxC,EACA,GAAGrD,CACL,EAA0C,CAEtC,OAAAoB,EAAA,IAAC,OAAA,CACC,UAAW1B,EAAG,iFAAkF2D,CAAS,EACxG,GAAGrD,CAAA,CAAA,CAGV,CACA6F,GAAqB,YAAc,uBC9KnC,MAAMC,EAAQ/F,EAAM,WAClB,CAAC,CAAE,UAAAsD,EAAW,KAAA0C,EAAM,GAAG/F,CAAA,EAASC,IAE5BmB,EAAA,IAAC,QAAA,CACC,KAAA2E,EACA,UAAWrG,EACT,mcACA2D,CACF,EACA,IAAApD,EACC,GAAGD,CAAA,CAAA,CAIZ,EACA8F,EAAM,YAAc,QCdpB,MAAME,GAAgBzC,EAAA,IACpB,yIACF,EAEM0C,GAAQlG,EAAM,WAIlB,CAAC,CAAE,UAAAsD,EAAW,GAAGrD,CAAM,EAAGC,IAC1BmB,EAAA,IAAC8E,EAAe,KAAf,CACC,IAAAjG,EACA,UAAWP,EAAGsG,GAAc,EAAG3C,CAAS,EACvC,GAAGrD,CAAA,CACN,CACD,EACDiG,GAAM,YAAcC,EAAAA,KAAoB,YChBxC,MAAMC,EAAUC,EAAiB,QAE3BC,EAAiBC,EAAiB,UAElCC,EAAiBxG,EAAM,WAG3B,CAAC,CAAE,UAAAsD,EAAW,MAAAmD,EAAQ,SAAU,WAAA3B,EAAa,EAAG,GAAG7E,CAAM,EAAGC,IAC3DmB,EAAA,IAAAqF,SAAA,CACC,SAAArF,EAAA,IAACsF,EAAiB,WAAjB,CACC,IAAAzG,EACA,MAAAuG,EACA,WAAA3B,EACA,UAAWnF,EACT,ylBACA2D,CACF,EACC,GAAGrD,CAAA,CACN,CAAA,CACF,CACD,EACDuG,EAAe,YAAcG,EAAAA,WAAyB,YCrBtD,MAAMC,EAAY5G,EAAM,WAItB,CACE,CAAE,UAAAsD,EAAW,YAAAuD,EAAc,aAAc,WAAAC,EAAa,GAAM,GAAG7G,GAC/DC,IAEAmB,EAAA,IAAC0F,EAAmB,OAAnB,CACC,IAAA7G,EACA,WAAA4G,EACA,YAAAD,EACA,UAAWlH,EACT,uCACAkH,IAAgB,aAAe,mCAAqC,mCACpEvD,CACF,EACC,GAAGrD,CAAA,CACN,CAEJ,EACA2G,EAAU,YAAcG,EAAAA,OAAwB,YCrB1C,MAAAC,GAAShH,EAAM,WAGnB,CAAC,CAAE,UAAAsD,EAAW,GAAGrD,CAAM,EAAGC,IAC1BmB,EAAA,IAAC4F,EAAiB,OAAjB,CACC,UAAWtH,EACT,yiBACA2D,CACF,EACC,GAAGrD,EACJ,IAAAC,EAEA,SAAAmB,EAAA,IAAC6F,EAAiB,MAAjB,CACC,UAAWvH,EACT,+QACF,CAAA,CACF,CAAA,CACF,CACD,EACDqH,GAAO,YAAcC,EAAAA,OAAsB,YCnB3C,MAAME,GAAOC,EAAc,QAErBC,GAAWrH,EAAM,WAGrB,CAAC,CAAE,UAAAsD,EAAW,GAAGrD,CAAM,EAAGC,IAC1BmB,EAAA,IAACiG,EAAc,KAAd,CACC,IAAApH,EACA,UAAWP,EACT,qKACA2D,CACF,EACC,GAAGrD,CAAA,CACN,CACD,EACDoH,GAAS,YAAcC,EAAmB,KAAA,YAEpC,MAAAC,GAAcvH,EAAM,WAGxB,CAAC,CAAE,UAAAsD,EAAW,GAAGrD,CAAM,EAAGC,IAC1BmB,EAAA,IAACmG,EAAc,UAAd,CACC,IAAAtH,EACA,UAAWP,EACT,0jBACA2D,CACF,EACC,GAAGrD,CAAA,CACN,CACD,EACDsH,GAAY,YAAcC,EAAsB,UAAA,YAE1C,MAAAC,GAAczH,EAAM,WAGxB,CAAC,CAAE,UAAAsD,EAAW,GAAGrD,CAAM,EAAGC,IAC1BmB,EAAA,IAACqG,EAAc,QAAd,CACC,IAAAxH,EACA,UAAWP,EACT,wLACA2D,CACF,EACC,GAAGrD,CAAA,CACN,CACD,EACDwH,GAAY,YAAcC,EAAAA,QAAsB,YC3ChD,MAAMC,GAAgBC,EAAgB,SAEhCC,GAAgB7H,EAAM,WAG1B,CAAC,CAAE,UAAAsD,EAAW,GAAGrD,CAAM,EAAGC,IAC1BmB,EAAA,IAACyG,EAAgB,SAAhB,CACC,IAAA5H,EACA,UAAWP,EACT,yPACA2D,CACF,EACC,GAAGrD,CAAA,CACN,CACD,EACD4H,GAAc,YAAcC,EAAyB,SAAA,YAErD,MAAMC,GAAgBvE,EAAA,IACpB,u0BACA,CACE,SAAU,CACR,QAAS,CACP,QAAS,kEACT,YACE,8HACJ,CACF,EACA,gBAAiB,CACf,QAAS,SACX,CACF,CACF,EAEMwE,GAAQhI,EAAM,WAIlB,CAAC,CAAE,UAAAsD,EAAW,QAAAG,EAAS,GAAGxD,CAAM,EAAGC,IAEjCmB,EAAA,IAAC4G,EAAgB,QAAhB,CACC,IAAA/H,EACA,UAAWP,EAAGoI,GAAc,CAAE,QAAAtE,CAAS,CAAA,EAAGH,CAAS,EAClD,GAAGrD,CAAA,CAAA,CAGT,EACD+H,GAAM,YAAcC,EAAqB,QAAA,YAEnC,MAAAC,GAAclI,EAAM,WAGxB,CAAC,CAAE,UAAAsD,EAAW,GAAGrD,CAAM,EAAGC,IAC1BmB,EAAA,IAAC8G,EAAgB,OAAhB,CACC,IAAAjI,EACA,UAAWP,EACT,uuBACA2D,CACF,EACC,GAAGrD,CAAA,CACN,CACD,EACDiI,GAAY,YAAcC,EAAuB,OAAA,YAE3C,MAAAC,GAAapI,EAAM,WAGvB,CAAC,CAAE,UAAAsD,EAAW,GAAGrD,CAAM,EAAGC,IAC1BmB,EAAA,IAACgH,EAAgB,MAAhB,CACC,IAAAnI,EACA,UAAWP,EACT,ifACA2D,CACF,EACA,cAAY,GACX,GAAGrD,EAEJ,SAAAoB,EAAAA,IAACiH,EAAAA,EAAE,CAAA,UAAU,2BAA4B,CAAA,CAAA,CAC3C,CACD,EACDF,GAAW,YAAcC,EAAsB,MAAA,YAEzC,MAAAE,GAAavI,EAAM,WAGvB,CAAC,CAAE,UAAAsD,EAAW,GAAGrD,CAAM,EAAGC,IAC1BmB,EAAA,IAACmH,EAAgB,MAAhB,CACC,IAAAtI,EACA,UAAWP,EAAG,0CAA2C2D,CAAS,EACjE,GAAGrD,CAAA,CACN,CACD,EACDsI,GAAW,YAAcC,EAAsB,MAAA,YAEzC,MAAAC,GAAmBzI,EAAM,WAG7B,CAAC,CAAE,UAAAsD,EAAW,GAAGrD,CAAM,EAAGC,IAC1BmB,EAAA,IAACqH,EAAgB,YAAhB,CACC,IAAAxI,EACA,UAAWP,EAAG,uCAAwC2D,CAAS,EAC9D,GAAGrD,CAAA,CACN,CACD,EACDwI,GAAiB,YAAcC,EAAAA,YAA4B,YCxG3D,MAAMC,GAAiBnF,EAAA,IACrB,qhBACA,CACE,SAAU,CACR,QAAS,CACP,QAAS,0BACT,QACE,8HACJ,EACA,KAAM,CACJ,QAAS,8BACT,GAAI,6BACJ,GAAI,6BACN,CACF,EACA,gBAAiB,CACf,QAAS,UACT,KAAM,SACR,CACF,CACF,EAEMrC,GAASnB,EAAM,WAInB,CAAC,CAAE,UAAAsD,EAAW,QAAAG,EAAS,KAAAC,EAAM,GAAGzD,GAASC,IACzCmB,EAAA,IAACuH,EAAgB,OAAhB,CACC,IAAA1I,EACA,UAAWP,EAAGgJ,GAAe,CAAE,QAAAlF,EAAS,KAAAC,EAAM,UAAAJ,CAAA,CAAW,CAAC,EACzD,GAAGrD,CAAA,CACN,CACD,EAEDkB,GAAO,YAAcyH,EAAAA,OAAqB,YCnC1C,MAAMC,GAAkBC,EAAiB,WAEnC1H,GAAU2H,EAAiB,MAE3BzH,GAAiB0H,EAAiB,UAElCxH,GAAiBxB,EAAM,WAG3B,CAAC,CAAE,UAAAsD,EAAW,WAAAwB,EAAa,EAAG,GAAG7E,GAASC,IAC1CmB,EAAA,IAAC4H,EAAiB,WAAjB,CACC,IAAA/I,EACA,WAAA4E,EACA,UAAWnF,EACT,0jBACA2D,CACF,EACC,GAAGrD,CAAA,CACN,CACD,EACDuB,GAAe,YAAcyH,EAAAA,WAAyB,YChBtD,MAAMC,GAAc,EACdC,GAAqB,IAgB3B,IAAIC,GAAQ,EAEZ,SAASC,IAAQ,CACN,OAAAD,IAAAA,GAAQ,GAAK,OAAO,iBACtBA,GAAM,UACf,CA0BA,MAAME,OAAoB,IAE1B,SAASC,GAAiBC,EAAiB,CACrC,GAAAF,GAAc,IAAIE,CAAO,EAC3B,OAGI,MAAAC,EAAU,WAAW,IAAM,CAC/BH,GAAc,OAAOE,CAAO,EACnBE,GAAA,CACP,KAAM,eACN,QAAAF,CAAA,CACD,GACAL,EAAkB,EAEPG,GAAA,IAAIE,EAASC,CAAO,CACpC,CAEgB,SAAAE,GAAQ5H,EAActB,EAAuB,CAC3D,OAAQA,EAAO,KAAM,CACnB,IAAK,YACI,MAAA,CACL,GAAGsB,EACH,OAAQ,CAACtB,EAAO,MAAO,GAAGsB,EAAM,MAAM,EAAE,MAAM,EAAGmH,EAAW,CAAA,EAGhE,IAAK,eACI,MAAA,CACL,GAAGnH,EACH,OAAQA,EAAM,OAAO,IACnB6H,GAAAA,EAAE,KAAOnJ,EAAO,MAAM,GAAK,CAAE,GAAGmJ,EAAG,GAAGnJ,EAAO,KAAU,EAAAmJ,CACzD,CAAA,EAGJ,IAAK,gBAAiB,CACd,KAAA,CAAE,QAAAJ,CAAY,EAAA/I,EAIpB,OAAI+I,EACFD,GAAiBC,CAAO,EAGlBzH,EAAA,OAAO,QAAS8H,GAAU,CAC9BN,GAAiBM,EAAM,EAAE,CAAA,CAC1B,EAGI,CACL,GAAG9H,EACH,OAAQA,EAAM,OAAO,IACnB6H,GAAAA,EAAE,KAAOJ,GAAWA,IAAY,OAC5B,CACE,GAAGI,EACH,KAAM,EAAA,EAERA,CACN,CAAA,CAEJ,CACA,IAAK,eACC,OAAAnJ,EAAO,UAAY,OACd,CACL,GAAGsB,EACH,OAAQ,CAAC,CAAA,EAGN,CACL,GAAGA,EACH,OAAQA,EAAM,OAAO,UAAY6H,EAAE,KAAOnJ,EAAO,OAAO,CAAA,CAE9D,CACF,CAEA,MAAMqJ,GAA2C,CAAA,EAEjD,IAAIC,GAAqB,CAAE,OAAQ,CAAA,GAEnC,SAASL,GAASjJ,EAAgB,CAClBsJ,GAAAJ,GAAQI,GAAatJ,CAAM,EAC/BqJ,GAAA,QAAS7G,GAAa,CAC9BA,EAAS8G,EAAW,CAAA,CACrB,CACH,CAIA,SAASF,GAAM,CAAE,GAAG5J,GAAgB,CAClC,MAAM+J,EAAKX,KAELY,EAAUhK,GACdyJ,GAAS,CACP,KAAM,eACN,MAAO,CAAE,GAAGzJ,EAAO,GAAA+J,CAAG,CAAA,CACvB,EACGE,EAAU,IAAMR,GAAS,CAAE,KAAM,gBAAiB,QAASM,EAAI,EAE5D,OAAAN,GAAA,CACP,KAAM,YACN,MAAO,CACL,GAAGzJ,EACH,GAAA+J,EACA,KAAM,GACN,aAAeG,GAAS,CACjBA,GACKD,GACZ,CACF,CAAA,CACD,EAEM,CACL,GAAAF,EACA,QAAAE,EACA,OAAAD,CAAA,CAEJ,CAEA,SAASG,IAAW,CAClB,KAAM,CAACrI,EAAOsI,CAAQ,EAAIrK,EAAM,SAAgB+J,EAAW,EAE3D/J,OAAAA,EAAM,UAAU,KACd8J,GAAU,KAAKO,CAAQ,EAChB,IAAM,CACL,MAAAC,EAAQR,GAAU,QAAQO,CAAQ,EACpCC,EAAQ,IACAR,GAAA,OAAOQ,EAAO,CAAC,CAC3B,GAED,CAACvI,CAAK,CAAC,EAEH,CACL,GAAGA,EACH,MAAA8H,GACA,QAAUL,GAAqBE,GAAS,CAAE,KAAM,gBAAiB,QAAAF,EAAS,CAAA,CAE9E,CCvLA,SAASe,GAAgB,CAAE,OAAAzI,EAAQ,GAAG7B,GAAc,CAClD,MAAMiD,EAAQZ,GAA2BR,EAAQ0I,GAAM,KAAM,CAC3D,KAAM,GACN,kBAAmB,EAAA,CACpB,EACK,CAAE,KAAAC,EAAM,kBAAAC,CAAsB,EAAAxH,EAC9BhD,EAAW6C,EAAAA,SACX,CAAC4H,EAASC,CAAa,EAAI/H,WAAS,EAAK,EAEzCgI,EAAaC,cAAY,IAAMhJ,EAAO,SAAS0I,GAAM,IAAI,EAAG,CAAC1I,CAAM,CAAC,EAEpEiJ,EAAWD,cAAY,IAAMlJ,GAAW4I,GAAM,KAAM1I,CAAM,EAAG,CAACA,CAAM,CAAC,EAErEkJ,EAASF,EAAAA,YAAY,IAAM,CAC/BhJ,EAAO,MAAM,EAAE,MAAM,EAAE,SAAS,CAAE,KAAM5B,EAAI,QAAQ,MAAO,EAAE,IAAI,CAAA,EAChE,CAAC4B,CAAM,CAAC,EAEXkB,OAAAA,EAAAA,UAAU,IAAM,CACV0H,IACFE,EAAc,EAAI,EAClB9I,EAAO,MAAM,EAAE,iBAAiB0I,GAAM,KAAM,CAAE,kBAAmB,EAAA,CAAO,EAAE,MAAM,EAAE,IAAI,EAEvF,EAAA,CAAC1I,EAAQ4I,EAAmBE,CAAa,CAAC,EAE7C5H,EAAAA,UAAU,IAAM,CACV2H,GACF,WAAW,IAAM,OAAA,OAAAhJ,EAAAzB,EAAI,UAAJ,YAAAyB,EAAa,SAAS,GAAG,CAC5C,EACC,CAACgJ,CAAO,CAAC,EAGVtJ,EAAA,IAAC4J,EAAA,WAAA,CACC,OAAAnJ,EACA,UAAU,oBACV,WAAA+I,EACA,aAAc,CACZ,cAAe,CACb,UAAW,CAAC,CAAE,KAAM,OAAQ,QAAS,GAAO,CAC9C,EACA,UAAW,eACX,OAAQ,CAAC,GAAI,EAAE,EACf,OAAQ,KACR,SAAU,IAAM,CACdD,EAAc,EAAK,CACrB,CACF,EAEC,SAAA3K,GAAA,MAAAA,EAAO,SAEAoB,EAAAA,IAAA6J,EAAAA,SAAA,CAAA,CAAA,QAGD,MAAI,CAAA,UAAU,6KACZ,SAAAP,EAGOpJ,EAAAA,KAAA2J,EAAAA,SAAA,CAAA,SAAA,CAAA7J,EAAA,IAACgC,GAAA,CACC,IAAAnD,EACA,UAAS,GACT,YAAY,eACZ,KAAM,EACN,aAAcuK,EACd,MAAO,CAAE,aAAc,CAAE,CAAA,CAC3B,EACAlJ,EAAAA,KAAC,MAAI,CAAA,UAAU,kFACb,SAAA,CAAAF,MAACK,EAAO,CAAA,QAASsJ,EAAQ,UAAU,kBAAkB,SAAM,SAAA,EAE1D3J,EAAA,IAAA,IAAA,CAAE,KAAK,qBAAqB,OAAO,SAAS,IAAI,sBAC/C,SAACA,EAAA,IAAA8J,EAAA,WAAA,CAAW,KAAM,EAAI,CAAA,EACxB,CAAA,EACF,CAAA,CACF,CAAA,EAGA5J,EAAAA,KAAC,MAAI,CAAA,UAAU,iFACb,SAAA,CAAAF,EAAA,IAACtB,EAAa,CAAA,QAAQ,OAAO,OAAQ,IAAM6K,EAAc,CAACD,CAAO,EAC/D,SAAAtJ,EAAAA,IAAC+J,EAAO,OAAA,CAAA,KAAM,EAAI,CAAA,EACpB,EAEA/J,EAAAA,IAACtB,EAAa,CAAA,QAAQ,SAAS,OAAQgL,EACrC,SAAC1J,EAAAA,IAAAgK,EAAAA,OAAA,CAAO,KAAM,EAAA,CAAI,CACpB,CAAA,CAAA,CAAA,CACF,CAER,CAAA,CAAA,CAAA,CAKZ,CChFO,SAASJ,GAAW,CAAE,OAAAnJ,EAAQ,SAAAzB,EAAU,WAAAiL,GAAwC,CACrF,MAAMC,EAAkBzJ,EAAO,iBAAiB,WAAW,IAAI0J,GAAOA,EAAI,IAAI,EAExEC,EAAkB,IAAM,qBAAA,OAC5BF,EAAgB,SAAS,SAAS,GAAK,GAAC5J,EAAA2J,GAAA,YAAAA,EAAY,eAAZ,MAAA3J,EAA0B,QAAUN,EAAAA,IAAAqK,GAAA,CAAgC,OAAA5J,CAAV,EAAA,SAA0B,EAAK,KACjIyJ,EAAgB,SAAS,OAAO,GAAK,GAACI,EAAAL,GAAA,YAAAA,EAAY,cAAZ,MAAAK,EAAyB,QAAUtK,EAAAA,IAAAuK,GAAA,CAA4B,OAAA9J,CAAR,EAAA,OAAwB,EAAK,KAC1HyJ,EAAgB,SAAS,MAAM,GAAK,GAACM,EAAAP,GAAA,YAAAA,EAAY,aAAZ,MAAAO,EAAwB,QAAUxK,EAAAA,IAAAyK,GAAA,CAA0B,OAAAhK,EAAgB,SAAAzB,CAAA,EAAvB,MAA2C,EAAK,KAC1IkL,EAAgB,SAAS,OAAO,GAAK,GAACQ,EAAAT,GAAA,YAAAA,EAAY,cAAZ,MAAAS,EAAyB,QAAU1K,EAAAA,IAAA2K,GAAA,CAA4B,OAAAlK,EAAgB,SAAAzB,CAAA,EAAxB,OAA4C,EAAK,KAC9IkL,EAAgB,SAAS,OAAO,GAAK,GAACU,EAAAX,GAAA,YAAAA,EAAY,cAAZ,MAAAW,EAAyB,QAAU5K,EAAAA,IAAA6K,GAAA,CAA4B,OAAApK,EAAgB,SAAAzB,CAAA,EAAxB,OAA4C,EAAK,KAC9IkL,EAAgB,SAAS,OAAO,GAAK,GAACY,EAAAb,GAAA,YAAAA,EAAY,cAAZ,MAAAa,EAAyB,QAAU9K,EAAAA,IAAAkJ,GAAA,CAA4B,OAAAzI,EAAgB,SAAAzB,CAAA,EAAxB,OAA4C,EAAK,MAC7I+L,EAAAd,GAAA,YAAAA,EAAY,qBAAZ,MAAAc,EAAgC,OAA6E,WAAnEC,GAA0B,CAAA,OAAAvK,EAAgB,SAAAzB,CAA1B,EAAA,SAA8C,GACxGiM,EAAAhB,GAAA,YAAAA,EAAY,aAAZ,MAAAgB,EAAwB,OAA6E,WAAnEC,GAA0B,CAAA,OAAAzK,EAAgB,SAAAzB,CAAvB,EAAA,MAA2C,CAAK,GAGxG,OAAIiL,GAAA,MAAAA,EAAY,OACPA,EAAW,OAAO,CAAE,OAAAxJ,EAAQ,SAAUzB,GAAY,GAAO,WAAAiL,CAAA,EAAcG,EAAA,CAAiB,EAG1FA,EAAkB,EAAA,OAAO,OAAO,CACzC,CCvCA,MAAMe,GAAS,CACb,gBAAiB,SACjB,cAAe,OACf,eAAgB,QAChB,oBAAqB,aACrB,iBAAkB,UAClB,gBAAiB,gBACjB,gBAAiB,UACjB,gBAAiB,iBACjB,0BAA2B,mBAC3B,4BAA6B,SAC7B,yBAA0B,kBAC1B,4BAA6B,cAC7B,eAAgB,yBAChB,qBAAsB,YACtB,sBAAuB,SACvB,sBAAuB,SACvB,qBAAsB,iBACtB,iBAAkB,uBAClB,4BAA6B,cAC7B,oCAAqC,UACrC,kBAAmB,mBACnB,4BAA6B,QAC7B,6BAA8B,SAC9B,4BAA6B,QAC7B,sBAAuB,OACvB,wBAAyB,SACzB,2BAA4B,YAC5B,wBAAyB,SACzB,uBAAwB,QACxB,oBAAqB,cACrB,2BAA4B,YAC5B,4BAA6B,cAC7B,yBAA0B,WAC1B,4BAA6B,YAC7B,4BAA6B,YAC7B,4BAA6B,YAC7B,4BAA6B,YAC7B,4BAA6B,YAC7B,4BAA6B,YAC7B,2BAA4B,YAC5B,2BAA4B,QAC5B,gCAAiC,OACjC,kCAAmC,SACnC,iCAAkC,QAClC,mCAAoC,UACpC,gBAAiB,SACjB,uBAAwB,kBACxB,wBAAyB,kBACzB,0BAA2B,YAC3B,kCAAmC,UACnC,6BAA8B,cAC9B,2BAA4B,YAC5B,4BAA6B,cAC7B,6BAA8B,eAC9B,0BAA2B,YAC3B,wBAAyB,SACzB,yBAA0B,UAC1B,yBAA0B,UAC1B,sBAAuB,OACvB,6BAA8B,SAC9B,2BAA4B,YAC5B,2BAA4B,YAC5B,2BAA4B,cAC5B,0BAA2B,OAC3B,0BAA2B,OAC3B,kCAAmC,kBACnC,sCAAuC,eACvC,sCAAuC,kBACvC,kCAAmC,QACnC,uBAAwB,QACxB,+BAAgC,gDAChC,kCAAmC,aACnC,kCAAmC,aACnC,mCAAoC,cACpC,4BAA6B,eAC7B,8BAA+B,MAC/B,iCAAkC,SAClC,gCAAiC,YACjC,gCAAiC,OACjC,kCAAmC,OACnC,+BAAgC,MAChC,uCAAwC,6BACxC,gCAAiC,OACjC,mCAAoC,QACpC,uBAAwB,QACxB,iCAAkC,SAClC,gCAAiC,YACjC,4BAA6B,0BAC7B,2BAA4B,OAC5B,kCAAmC,OACnC,mCAAoC,QACpC,uBAAwB,QACxB,iCAAkC,eAClC,iDAAkD,kBAClD,sCAAuC,oBACvC,qCAAsC,mBACtC,kCAAmC,gBACnC,mCAAoC,iBACpC,kCAAmC,gBACnC,+BAAgC,aAChC,yCAA0C,uBAC1C,iCAAkC,eAClC,4BAA6B,aAC7B,gCAAiC,kBACjC,sBAAuB,OACvB,2BAA4B,aAC5B,uBAAwB,eACxB,sBAAuB,OACvB,sBAAuB,OACvB,uCAAwC,aACxC,iCAAkC,kBAClC,0CAA2C,0BAC3C,oCAAqC,qCACrC,uCAAwC,uBACxC,sCAAuC,sBACvC,iCAAkC,gBAClC,mCAAoC,mBACpC,mCAAoC,mBACpC,8BAA+B,aAC/B,+BAAgC,cAChC,+BAAgC,cAChC,gCAAiC,eACjC,oCAAqC,wBACrC,uBAAwB,QACxB,wBAAyB,SACzB,kCAAmC,qBACnC,4BAA6B,SAC7B,6BAA8B,UAC9B,gCAAiC,cACjC,8BAA+B,WAC/B,0BAA2B,OAC3B,gBAAmB,mBACnB,mBAAoB,mBACpB,mBAAoB,mBACpB,eAAgB,eAChB,SAAY,WACZ,kBAAmB,kBACnB,OAAU,UACV,OAAU,UACV,MAAS,QACT,kBAAmB,kBACnB,6BAA8B,UAC9B,uBAAwB,eACxB,2BAA4B,aAC5B,4BAA6B,cAC7B,4BAA6B,aAC/B,EAEAC,GAAeD,GCrJTA,GAAS,CACb,gBAAiB,MACjB,cAAe,WACf,eAAgB,KAChB,oBAAqB,QACrB,iBAAkB,WAClB,gBAAiB,qBACjB,gBAAiB,WACjB,gBAAiB,iBACjB,0BAA2B,UAC3B,4BAA6B,UAC7B,yBAA0B,kBAC1B,4BAA6B,YAC7B,eAAgB,wBAChB,qBAAsB,mBACtB,sBAAuB,YACvB,sBAAuB,OACvB,qBAAsB,gBACtB,iBAAkB,yBAClB,kBAAmB,yBACnB,4BAA6B,MAC7B,4BAA6B,YAC7B,oCAAqC,WACrC,6BAA8B,aAC9B,4BAA6B,MAC7B,sBAAuB,MACvB,wBAAyB,aACzB,2BAA4B,YAC5B,wBAAyB,OACzB,uBAAwB,MACxB,oBAAqB,gBACrB,2BAA4B,WAC5B,4BAA6B,iBAC7B,yBAA0B,UAC1B,4BAA6B,YAC7B,4BAA6B,YAC7B,4BAA6B,YAC7B,4BAA6B,YAC7B,4BAA6B,YAC7B,4BAA6B,YAC7B,2BAA4B,WAC5B,2BAA4B,YAC5B,gCAAiC,OACjC,kCAAmC,OACnC,iCAAkC,OAClC,mCAAoC,UACpC,gBAAiB,UACjB,uBAAwB,eACxB,wBAAyB,eACzB,0BAA2B,uBAC3B,kCAAmC,WACnC,6BAA8B,cAC9B,2BAA4B,cAC5B,4BAA6B,yBAC7B,6BAA8B,sBAC9B,0BAA2B,mBAC3B,wBAAyB,eACzB,yBAA0B,eAC1B,yBAA0B,MAC1B,sBAAuB,WACvB,6BAA8B,eAC9B,2BAA4B,cAC5B,2BAA4B,qBAC5B,2BAA4B,gBAC5B,0BAA2B,WAC3B,0BAA2B,UAC3B,kCAAmC,mBACnC,sCAAuC,mBACvC,sCAAuC,aACvC,kCAAmC,UACnC,uBAAwB,WACxB,+BAAgC,gDAChC,kCAAmC,iBACnC,kCAAmC,aACnC,mCAAoC,iBACpC,4BAA6B,gBAC7B,8BAA+B,MAC/B,iCAAkC,UAClC,gCAAiC,eACjC,gCAAiC,WACjC,kCAAmC,WACnC,+BAAgC,MAChC,uCAAwC,4BACxC,gCAAiC,MACjC,mCAAoC,UACpC,uBAAwB,QACxB,iCAAkC,UAClC,gCAAiC,eACjC,4BAA6B,2BAC7B,2BAA4B,WAC5B,kCAAmC,WACnC,mCAAoC,UACpC,uBAAwB,OACxB,iCAAkC,YAClC,iDAAkD,kBAClD,sCAAuC,iBACvC,qCAAsC,eACtC,kCAAmC,UACnC,mCAAoC,kBACpC,kCAAmC,gBACnC,+BAAgC,WAChC,yCAA0C,kBAC1C,iCAAkC,WAClC,4BAA6B,aAC7B,gCAAiC,gBACjC,sBAAuB,KACvB,2BAA4B,UAC5B,uBAAwB,gBACxB,sBAAuB,WACvB,sBAAuB,UACvB,uCAAwC,gBACxC,iCAAkC,sBAClC,0CAA2C,6BAC3C,oCAAqC,+CACrC,uCAAwC,iBACxC,sCAAuC,eACvC,iCAAkC,UAClC,mCAAoC,mBACpC,mCAAoC,mBACpC,8BAA+B,WAC/B,+BAAgC,YAChC,+BAAgC,SAChC,gCAAiC,WACjC,oCAAqC,YACrC,uBAAwB,aACxB,wBAAyB,SACzB,kCAAmC,uBACnC,4BAA6B,WAC7B,6BAA8B,WAC9B,gCAAiC,kBACjC,8BAA+B,QAC/B,0BAA2B,YAC3B,gBAAmB,yBACnB,mBAAoB,mBACpB,mBAAoB,yBACpB,eAAgB,oBAChB,SAAY,YACZ,kBAAmB,qBACnB,OAAU,MACV,OAAU,UACV,MAAS,KACT,kBAAmB,uBACnB,6BAA8B,YAC9B,uBAAwB,qBACxB,2BAA4B,WAC5B,4BAA6B,YAC7B,4BAA6B,WAC/B,EAEAE,GAAeF,GCrJTA,GAAS,CACb,gBAAiB,KACjB,cAAe,KACf,eAAgB,KAChB,oBAAqB,MACrB,iBAAkB,KAClB,gBAAiB,OACjB,gBAAiB,MACjB,gBAAiB,MACjB,0BAA2B,KAC3B,4BAA6B,KAC7B,yBAA0B,SAC1B,4BAA6B,UAC7B,eAAgB,aAChB,qBAAsB,MACtB,sBAAuB,KACvB,sBAAuB,KACvB,qBAAsB,OACtB,iBAAkB,QAClB,4BAA6B,KAC7B,oCAAqC,KACrC,kBAAmB,SACnB,4BAA6B,IAC7B,6BAA8B,IAC9B,4BAA6B,KAC7B,sBAAuB,KACvB,wBAAyB,KACzB,2BAA4B,MAC5B,wBAAyB,MACzB,uBAAwB,KACxB,oBAAqB,OACrB,2BAA4B,KAC5B,4BAA6B,KAC7B,yBAA0B,KAC1B,4BAA6B,OAC7B,4BAA6B,OAC7B,4BAA6B,OAC7B,4BAA6B,OAC7B,4BAA6B,OAC7B,4BAA6B,OAC7B,2BAA4B,KAC5B,2BAA4B,KAC5B,gCAAiC,MACjC,kCAAmC,KACnC,iCAAkC,MAClC,mCAAoC,OACpC,gBAAiB,KACjB,uBAAwB,OACxB,wBAAyB,OACzB,0BAA2B,KAC3B,kCAAmC,KACnC,6BAA8B,KAC9B,2BAA4B,KAC5B,4BAA6B,OAC7B,6BAA8B,OAC9B,0BAA2B,OAC3B,wBAAyB,KACzB,yBAA0B,OAC1B,yBAA0B,IAC1B,sBAAuB,KACvB,6BAA8B,OAC9B,2BAA4B,OAC5B,2BAA4B,OAC5B,2BAA4B,OAC5B,0BAA2B,KAC3B,0BAA2B,KAC3B,kCAAmC,WACnC,sCAAuC,OACvC,sCAAuC,OACvC,kCAAmC,KACnC,uBAAwB,KACxB,+BAAgC,gBAChC,kCAAmC,MACnC,kCAAmC,MACnC,mCAAoC,MACpC,4BAA6B,OAC7B,8BAA+B,KAC/B,iCAAkC,KAClC,gCAAiC,MACjC,gCAAiC,KACjC,kCAAmC,KACnC,+BAAgC,OAChC,uCAAwC,UACxC,gCAAiC,KACjC,mCAAoC,KACpC,uBAAwB,KACxB,iCAAkC,KAClC,gCAAiC,MACjC,4BAA6B,UAC7B,2BAA4B,KAC5B,kCAAmC,KACnC,mCAAoC,KACpC,uBAAwB,KACxB,iCAAkC,OAClC,iDAAkD,OAClD,sCAAuC,SACvC,qCAAsC,SACtC,kCAAmC,MACnC,mCAAoC,SACpC,kCAAmC,SACnC,+BAAgC,MAChC,yCAA0C,WAC1C,iCAAkC,OAClC,4BAA6B,KAC7B,gCAAiC,MACjC,sBAAuB,KACvB,2BAA4B,MAC5B,uBAAwB,OACxB,sBAAuB,KACvB,sBAAuB,KACvB,uCAAwC,KACxC,iCAAkC,OAClC,0CAA2C,WAC3C,oCAAqC,iBACrC,uCAAwC,SACxC,sCAAuC,SACvC,iCAAkC,MAClC,mCAAoC,SACpC,mCAAoC,SACpC,8BAA+B,MAC/B,+BAAgC,QAChC,+BAAgC,QAChC,gCAAiC,OACjC,oCAAqC,WACrC,uBAAwB,KACxB,wBAAyB,OACzB,kCAAmC,QACnC,4BAA6B,KAC7B,6BAA8B,KAC9B,gCAAiC,OACjC,8BAA+B,MAC/B,0BAA2B,MAC3B,gBAAmB,QACnB,mBAAoB,OACpB,mBAAoB,QACpB,eAAgB,QAChB,SAAY,KACZ,kBAAmB,QACnB,OAAU,KACV,OAAU,KACV,MAAS,KACT,kBAAmB,KACnB,6BAA8B,KAC9B,uBAAwB,OACxB,2BAA4B,SAC5B,4BAA6B,UAC7B,4BAA6B,SAC/B,EAEAG,GAAeH,GC3Gf,SAAwBI,GACtBC,EACiB,CAEX,OAAAA,EAAAA,OAAW,IAEV,CAIL,IAAAA,EAQA,GAA6B7G,EAAW8G,EAA8B,CAC9D,MAAAC,EAAmDF,EAAK,IAAI7G,CAAI,EAClE+G,EACFA,EAAS,KAAKD,CAAO,EAGrBD,EAAK,IAAI7G,EAAM,CAAC8G,CAAO,CAA2C,CAEtE,EASA,IAA8B9G,EAAW8G,EAA+B,CAChE,MAAAC,EAAmDF,EAAK,IAAI7G,CAAI,EAClE+G,IACED,EACFC,EAAS,OAAOA,EAAS,QAAQD,CAAO,IAAM,EAAG,CAAC,EAG7CD,EAAA,IAAI7G,EAAM,CAAA,CAAE,EAGvB,EAYA,KAA+BA,EAAWgH,EAAmB,CACvD,IAAAD,EAAWF,EAAK,IAAI7G,CAAI,EACxB+G,GACF,CAAC,GAAIA,CAAmD,EAAE,IAAKD,GAAY,CACzEA,EAAQE,CAAI,CAAA,CACb,EAGQD,EAAAF,EAAK,IAAI,GAAG,EACnBE,GACF,CAAC,GAAIA,CAA6C,EAAE,IAAKD,GAAY,CACnEA,EAAQ9G,EAAMgH,CAAI,CAAA,CACnB,CAEL,CAAA,CAEJ,CCtFO,MAAMC,GAAkC,CAC7C,KAAMnP,GACN,QAAS,CACP,GAAA2O,GACA,GAAAC,GACA,MAAAC,EACF,CACF,EAEA,MAAMO,EAAO,CAEX,aAAc,CADNC,EAAA,gBAEN,KAAK,QAAUP,IACjB,CAGA,IAAI,MAAqB,CACvB,OAAOK,GAAe,IACxB,CAEA,IAAI,KAAKG,EAAoB,CAC3B,GAAI,CAAC,KAAK,gBAAgBA,CAAI,EAAG,CACvB,QAAA,KACN,oCAAoCA,CAAI,sBAAsBH,GAAe,IAAI,cAAA,EAEnF,MACF,CAEAA,GAAe,KAAOG,EACjB,KAAA,QAAQ,KAAK,OAAQA,CAAI,CAChC,CAGA,IAAI,SAAiE,CACnE,OAAOH,GAAe,OACxB,CAEA,IAAI,QAAQI,EAAgE,CAC1EJ,GAAe,QAAUI,CAC3B,CAGA,gBAAgBD,EAAqD,CAC5D,OAAA,KAAK,QAAQA,CAAI,CAC1B,CAGQ,gBAAgBA,EAA6B,CAE5C,OADgB,OAAO,KAAK,KAAK,OAAO,EACzB,SAASA,CAAI,CACrC,CAGO,QAAQA,EAAoB,CACjC,KAAK,KAAOA,CACd,CAGO,kBAAkBE,EAAoC,CACtD,YAAA,QAAQ,GAAG,OAAQA,CAAI,EAMrB,CACL,YALkB,IAAM,CACnB,KAAA,QAAQ,IAAI,OAAQA,CAAI,CAAA,CAI7B,CAEJ,CAGO,WAAWF,EAAcC,EAA0C,CACnE,KAAA,QAAQD,CAAI,EAAIC,CACvB,CAGA,oBAAoBD,EAAqB,CAClCA,IACHA,EAAO,KAAK,MAGR,MAAAC,EAAU,KAAK,gBAAgBD,CAAI,EAElC,OAAA,SAAWG,EAAuB,CAChC,OAAAF,EAAQE,CAAI,GAAKA,CAAA,CAE5B,CACF,CAEA,MAAMf,GAAS,IAAIU,GAGbM,GAAWC,EAAAA,MAAM,CACrB,KAAMR,GAAe,IACvB,CAAC,EAED,SAASS,GAAY,CACb,MAAAC,EAAeC,cAAYJ,EAAQ,EAEnC,EAAIK,EAAAA,QAAQ,IACTrB,GAAO,oBAAoBmB,EAAa,IAAI,EAClD,CAACA,EAAa,IAAI,CAAC,EAEtB3K,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAM8K,EAAYtB,GAAO,kBAAmBuB,GAAQ,CAClDP,GAAS,KAAOO,CAAA,CACjB,EAED,MAAO,IAAM,CACXD,EAAU,YAAY,CAAA,CAE1B,EAAG,CAAE,CAAA,EAEE,CACL,KAAMH,EAAa,KACnB,CAAA,CAEJ,CAEA,MAAMK,EAAgB,CACpB,EAAIT,GACKf,GAAO,oBAAoBgB,GAAS,IAAI,EAAED,CAAI,CAEzD,EAEAU,GAAezB,GC1JR,SAAS0B,IAAS,CACvB,aACG,MAAI,CAAA,MAAM,6BAA6B,MAAM,MAAM,OAAO,MAAM,QAAQ,YAAY,eAAC,OAAK,CAAA,KAAK,eAAe,EAAE,uNAAuN,CAAO,CAAA,CAEnV,CCiBA,SAASC,GAAYlO,EAAyB,CACtC,KAAA,CAAE,GAAMyN,IAER,CACJ,UAAAU,EAAY,GACZ,SAAA/N,EAAW,GACX,cAAAgO,EACA,iBAAAC,EACA,SAAAC,EACA,OAAAC,EAASC,EACP,EAAAxO,EAEEyO,EAAgBb,EAAAA,QAAQ,IAAM,CAClC,MAAMc,EAAcH,EACdI,EAAsB,CAAA,EAC5B,QAASC,EAAI,EAAGA,EAAIF,EAAY,OAAQE,GAAK,GAC3CD,EAAQ,KAAKD,EAAY,MAAME,EAAGA,EAAI,EAAE,CAAC,EAEpC,OAAAD,CAAA,EACN,CAACJ,CAAM,CAAC,EAEL,CAACM,EAAmBC,CAAoB,EAAIlM,EAAA,SAAmB,CAAE,CAAA,EAEjEmM,EAAkBC,GAAkB,CAClC,MAAAC,EAAkB,CAAC,GAAGJ,CAAiB,EACvCxE,EAAQ4E,EAAgB,QAAQD,CAAK,EACvC3E,IAAU,IACI4E,EAAA,OAAO5E,EAAO,CAAC,EAEjC4E,EAAgB,QAAQD,CAAK,EACzBC,EAAgB,OAAS,IAC3BA,EAAgB,IAAI,EAEtBH,EAAqBG,CAAe,CAAA,EAGtC,SAASC,EAASF,EAA2B,CAC3C,GAAIA,IAAU,OAAW,CAEvBX,GAAA,MAAAA,EAAmBW,GACnBV,GAAA,MAAAA,EAAWU,GACX,MACF,CAGuB,wBAAwB,KAAKA,CAAK,IAEvDX,GAAA,MAAAA,EAAmBW,GACnBV,GAAA,MAAAA,EAAWU,GACXD,EAAeC,CAAK,EAExB,CAEA,cACG7I,EACC,CAAA,SAAA,CAAA/E,EAAAA,IAACiF,GAAe,UAAU,gBAAgB,SAAAjG,EAAoB,QAAO,GAAE,0BAAO,QAAS,CAAA,EAEtFgB,EAAA,IAAAmF,EAAA,CAAe,iBAAgB,GAAC,UAAU,+CAA+C,MAAM,QAAQ,KAAK,SAC3G,SAACjF,EAAA,KAAA,MAAA,CAAI,UAAU,kCACZ,SAAA,CAEK6M,EAAA7M,EAAA,KAAC,MAAA,CACC,UAAU,4HACV,QAAS,IAAM4N,EAAS,MAAS,EAEjC,SAAA,CAAA9N,EAAA,IAAC6M,GAAO,EAAA,QACP,OAAK,CAAA,UAAU,iCAAkC,SAAA,EAAE,eAAe,EAAE,CAAA,CAAA,CAAA,EAIvE3M,EAAA,KAAC,MAAA,CACC,UAAU,4HACV,QAAS,IAAM,CACb4N,EAAS,MAAS,CACpB,EAEA,SAAA,CAAA9N,EAAA,IAAC6M,GAAO,EAAA,QACP,OAAK,CAAA,UAAU,iCAAkC,SAAA,EAAE,gBAAgB,EAAE,CAAA,CAAA,CACxE,EAGLQ,EAAc,IAAI,CAACU,EAAiB9E,IAEjCjJ,MAAC,QAAK,UAAU,kGACb,WAAM,IAAI,CAACgO,EAAcC,IAEtBjO,EAAA,IAAC,OAAA,CACC,UAAU,yOAEV,QAAS,IAAM8N,EAASE,CAAI,EAE5B,SAAAhO,EAAA,IAAC,OAAA,CACC,MAAO,CACL,gBAAiBgO,CACnB,EACA,UAAU,0HAET,aAAShB,EAEJhN,EAAA,IAAC,MAAA,CACC,UAAU,qGACV,QAAQ,YACR,MAAO,CACL,KAAM,oBACR,EAEA,SAAAA,EAAAA,IAAC,OAAK,CAAA,EAAE,yDAA0D,CAAA,CAAA,CAAA,EAIpEA,EAAA,IAAC,MAAA,CACC,QAAQ,YACR,MAAO,CACL,KAAM,qBACN,QAAS,MACX,EAEA,SAAAA,EAAAA,IAAC,OAAK,CAAA,EAAE,yDAA0D,CAAA,CAAA,CACpE,CAAA,CAER,CAAA,EAhCK,aAAaiO,CAAG,EAAA,CAmC1B,GAxCoHhF,CAyCvH,CAEH,SAEA,MACC,CAAA,SAAA,CAAAjJ,MAAC,MAAI,CAAA,UAAU,iCAAkC,SAAA,EAAE,eAAe,EAAE,EACpEA,MAAC,QAAK,UAAU,kGACb,0BAAmB,IAAI,CAACgO,EAAM/E,IAE3BjJ,EAAA,IAAC,OAAA,CACC,UAAU,yOAEV,QAAS,IAAM8N,EAASE,CAAI,EAE5B,SAAAhO,EAAA,IAAC,OAAA,CACC,UAAU,0HACV,MAAO,CACL,gBAAiBgO,CACnB,EAEA,SAAAhO,EAAA,IAAC,MAAA,CACC,QAAQ,YACR,MAAO,CACL,KAAM,qBACN,QAAS,MACX,EAEA,SAAAA,EAAAA,IAAC,OAAK,CAAA,EAAE,yDAA0D,CAAA,CAAA,CACpE,CAAA,CACF,CAAA,EAlBKiJ,CAAA,GAsBb,CAAA,EACF,EAEAjJ,MAACkO,IAAa,SAAAJ,EAAoB,CAAA,CAAA,CACpC,CACF,CAAA,CACF,CAAA,CAAA,CAEJ,CAMA,SAASI,GAAa,CAAE,SAAAJ,GAA+B,CACrD,KAAM,CAACK,EAAWC,CAAY,EAAI5M,WAAS,SAAS,EAC9C,CAAC6M,EAAeC,CAAgB,EAAI9M,WAAS,EAAK,EAClD,CAAE,EAAA+G,GAAM8D,IAEd1K,OAAAA,EAAAA,UAAU,IACD,IAAM,CACX2M,EAAiB,EAAK,CAAA,EAEvB,CAAE,CAAA,EAGHpO,EAAA,KAAC6E,EAAQ,CAAA,KAAMsJ,EACb,SAAA,CAACrO,EAAAA,IAAAiF,EAAA,CAAe,QAAO,GACrB,SAAA/E,EAAA,KAAC,MAAA,CACC,QAAUqO,GAAM,CACdA,EAAE,eAAe,EACjBD,EAAiB,EAAI,CACvB,EACA,UAAU,0GAET,SAAA,CAAA/F,EAAE,mBAAmB,EAAE,KAAA,CAAA,CAAA,EAG5B,SACCpD,EACC,CAAA,SAAA,CAACjF,EAAAA,KAAA,MAAA,CAAI,UAAU,gFACb,SAAA,CAAAF,EAAA,IAACwO,EAAe,EAAA,CAAA,MAAOL,EAAW,SAAUC,EAAc,EAE1DpO,EAAA,IAAC0E,EAAA,CACC,UAAU,oCACV,KAAK,OACL,SAAW6J,GAAM,CACfA,EAAE,eAAe,EACjBH,EAAa,IAAIG,EAAE,OAAO,KAAK,EAAE,CACnC,EACA,MAAOJ,EAAU,MAAM,CAAC,CAAA,CAC1B,CAAA,EACF,EAEAnO,EAAAA,IAACuF,EAAU,CAAA,UAAU,oBAAqB,CAAA,EAC1CvF,EAAA,IAACK,EAAA,CACC,QAAUkO,GAA2C,CACnDA,EAAE,eAAe,EACjBT,EAASK,CAAS,EAClBG,EAAiB,EAAK,CACxB,EACA,UAAU,kBAEV,SAAAtO,EAAAA,IAACyO,EAAAA,KAAK,CAAA,KAAM,EAAI,CAAA,CAAA,CAClB,CAAA,EACF,CACF,CAAA,CAAA,CAEJ,CCtPO,MAAMC,GAAY;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,ECEnBC,GAAavC,EAAAA,MAAM,CACvB,MAAO,OACT,CAAC,EAEM,SAASwC,IAAW,CAGzB,OAFsBrC,cAAYoC,EAAU,EAEvB,KACvB,CAEO,MAAME,GAAe,CAC1B,SAAWC,GAAkB,CAC3BH,GAAW,MAAQG,CACrB,CACF,ECZgB,SAAAC,GAAMrC,EAAasC,EAAaC,EAAa,CAC3D,OAAIvC,EAAMsC,EACDA,EAELtC,EAAMuC,EACDA,EAEFvC,CACT,CAEO,MAAMwC,GAAY5N,GAAoC,OAAOA,GAAU,SAEjE6N,GAAY7N,GAAoC,OAAOA,GAAU,SAIjE8N,GAAc9N,GAA4B,OAAOA,GAAU,WAExD,SAAA+N,GAAsB/N,EAAyBgO,EAAsB,KAAM,CACzF,GAAI,CAAChO,EACI,OAAAA,EAET,MAAMiO,EAAcL,GAAS5N,CAAK,EAAI,OAAOA,CAAK,EAAIA,EAEhDkO,EAAM,OAAO,WAAWD,CAAW,EACnCE,EAAYF,EAAY,MAAM,WAAW,EACzCG,EAAOD,EAAYA,EAAU,CAAC,EAAIH,EAExC,OAAO,OAAO,MAAME,CAAG,EAAIlO,EAAQkO,EAAME,CAC3C,CASgB,SAAAC,GAAalP,EAAgBmP,EAAuB,CAClE,GAAI,CAACnP,EACI,MAAA,GAIT,KAAM,CAAE,WAAAoP,EAAa,KAAOpP,GAAA,YAAAA,EAAQ,mBAAoB,CAAA,EAMxD,MAHa,EAAAoP,EAAW,KAAUrC,GAAAA,EAAE,OAASoC,CAAI,CAOnD,CAKO,SAASE,GAAuBC,EAAmC,CACjE,OAAAA,EAAI,IAAK/B,GACVmB,GAASnB,CAAI,EACR,CAAE,MAAOA,EAAM,KAAMA,CAAK,EAE5BA,CACR,CACH,CCtEA,MAAMgC,GAAe,gBACfC,GAAkB,mBAClBC,GAAW,cAEXC,OAAqB,IAMH,SAAAC,GAASC,EAA+BC,EAAU,CACxE,GAAI,CAACD,EACI,MAAA,GAIT,GAAIA,EAAK,SACA,OAAAA,EAAK,SAASC,CAAQ,EAI/B,IAAIxP,EAAOwP,EACX,KAAOxP,GAAM,CACX,GAAIA,IAASuP,EACJ,MAAA,GAGTvP,EAAOA,EAAK,UACd,CAEO,MAAA,EACT,CAcA,SAASyP,GAAQ,CAAE,KAAAC,CAAK,EAAa,GAAI,CACvC,OAAIA,EACKA,EAAK,WAAW,OAAO,EAAIA,EAAO,QAAQA,CAAI,GAEhDN,EACT,CAEA,SAASO,GAAaC,EAAiB,CACrC,OAAIA,EAAO,SACFA,EAAO,SAGH,SAAS,cAAc,MAAM,GAC3B,SAAS,IAC1B,CAEA,SAASC,GAASC,EAA+B,CAC/C,OAAIA,IAAY,QACP,eAGFA,EAAU,UAAY,QAC/B,CAKA,SAASC,GAAWC,EAA0B,CACrC,MAAA,CAAC,IAAIX,GAAe,IAAIW,CAAS,GAAKA,GAAW,QAAQ,EAAE,OAChEhQ,GAAQA,EAAK,UAAY,OAAA,CAE7B,CAEO,SAASiQ,GAAUC,EAAaN,EAAkB,GAAI,CAC3D,KAAM,CAAE,IAAAO,EAAK,QAAAL,EAAS,SAAAM,EAAW,GAAMR,EACjCS,EAAcR,GAASC,CAAO,EAC9BQ,EAAiBD,IAAgB,eAEjCE,EAAY,SAAS,cAAc,OAAO,EACtCA,EAAA,aAAarB,GAAcmB,CAAW,EAE5CC,GAAkBF,GACpBG,EAAU,aAAapB,GAAiB,GAAGiB,CAAQ,EAAE,EAGnDD,GAAA,MAAAA,EAAK,QACPI,EAAU,MAAQJ,GAAA,YAAAA,EAAK,OAEzBI,EAAU,UAAYL,EAEhB,MAAAF,EAAYL,GAAaC,CAAM,EAC/B,CAAE,WAAAY,CAAe,EAAAR,EAEvB,GAAIF,EAAS,CAEX,GAAIQ,EAAgB,CAClB,MAAMG,EAAaV,GAAWC,CAAS,EAAE,OAAQhQ,GAAS,CAGpD,GAAA,CAAC,CAAC,UAAW,cAAc,EAAE,SAASA,EAAK,aAAakP,EAAY,CAAC,EAChE,MAAA,GAIT,MAAMwB,EAAe,OAAO1Q,EAAK,aAAamP,EAAe,GAAK,CAAC,EACnE,OAAOiB,GAAYM,CAAA,CACpB,EAEG,GAAAD,EAAW,OAAS,EAEtB,OAAAT,EAAU,aAAaO,EAAWE,EAAW,GAAG,EAAE,EAAE,WAAW,EAExDF,CAEX,CAGAC,EAAW,OAAOD,CAAS,CAAA,MAG3BP,EAAU,OAAOO,CAAS,EAGrB,OAAAA,CACT,CAEA,SAASI,GAActT,EAAauS,EAAkB,GAAI,CAClD,MAAAI,EAAYL,GAAaC,CAAM,EAE9B,OAAAG,GAAWC,CAAS,EAAE,KAAKhQ,GAAQA,EAAK,aAAayP,GAAQG,CAAM,CAAC,IAAMvS,CAAG,CACtF,CAEO,SAASuT,GAAUvT,EAAauS,EAAkB,GAAI,CACrD,MAAAiB,EAAYF,GAActT,EAAKuS,CAAM,EACvCiB,GAEFA,EAAU,OAAO,CAErB,CAKA,SAASC,GAAkBd,EAA0BJ,EAAiB,CAC9D,MAAAmB,EAAsB1B,GAAe,IAAIW,CAAS,EAGxD,GAAI,CAACe,GAAuB,CAACzB,GAAS,SAAUyB,CAAmB,EAAG,CAC9D,MAAAC,EAAmBf,GAAU,GAAIL,CAAM,EACvC,CAAE,WAAAqB,CAAe,EAAAD,EAER3B,GAAA,IAAIW,EAAWiB,CAAU,EACxCD,EAAiB,OAAO,CAC1B,CACF,CASO,SAASE,GAAUhB,EAAa7S,EAAauS,EAAkB,CAAA,EAAI,WAClE,MAAAI,EAAYL,GAAaC,CAAM,EAGrCkB,GAAkBd,EAAWJ,CAAM,EAE7B,MAAAiB,EAAYF,GAActT,EAAKuS,CAAM,EAE3C,GAAIiB,EACF,OAAIrR,EAAAoQ,EAAO,MAAP,MAAApQ,EAAY,OAASqR,EAAU,UAAUrH,EAAAoG,EAAO,MAAP,YAAApG,EAAY,SAC7CqH,EAAA,OAAQnH,EAAAkG,EAAO,MAAP,YAAAlG,EAAY,OAG5BmH,EAAU,YAAcX,IAC1BW,EAAU,UAAYX,GAGjBW,EAGH,MAAAM,EAAUlB,GAAUC,EAAKN,CAAM,EACrC,OAAAuB,EAAQ,aAAa1B,GAAQG,CAAM,EAAGvS,CAAG,EAClC8T,CACT,CCzHA,SAASC,GAAetT,EAA4BC,EAAwD,CAC1G,KAAM,CAAE,QAAAsT,EAAS,WAAAtC,EAAY,iBAAAuC,EAAmB,IAAOxT,EACjD,CAAE,EAAA2J,GAAM8D,IAERgG,EAAiB7F,EAAAA,QAAQ,IAAM,CACnC,MAAM8F,EAAOC,EAAA,aAAa1C,EAAYA,EAAY,MAAM,EAQxD,MAAO,CAAC,GAPKA,EAAW,IAAK2C,GAAW,CAChC,MAAAC,EAAO5C,EAAW,KAAM1F,GAAaA,EAAI,OAASqI,EAAE,IAAI,EAC9D,OAAKC,EAGED,EAAE,UAAUC,EAAK,OAAO,EAFtBD,CAEsB,CAChC,EACgB,GAAGF,CAAI,EAAE,IAAI,CAACE,EAAGhF,IAAMgF,EAAE,UAAU,CAAE,KAAMhF,CAAA,CAAG,CAAC,CAAA,EAC/D,CAACqC,CAAU,CAAC,EAET6C,EAAgBC,WAAUlS,GAAW,OACzC,MAAMmS,EAASC,EAAUpS,EAAQ7B,EAAM,MAAa,GAEpD0B,EAAA1B,GAAA,YAAAA,EAAO,kBAAP,MAAA0B,EAAA,KAAA1B,EAAyBgU,IACxBjW,EAAsC,EAEnC8D,EAASqS,EAAAA,UAAU,CACvB,WAAYT,EACZ,QAAAF,EACA,SAAU,CAAC,CAAE,OAAA1R,KAAa,CACpBiS,GACFA,EAAcjS,CAAM,CACxB,EACA,GAAG2R,CAAA,CACJ,EAEDW,EAAA,oBAAoBlU,EAAK,KAChB,CACL,OAAA4B,CAAA,EAEH,EAEDkB,EAAAA,UAAU,IAAM,CACd,SAAS,gBAAgB,UAAU,OAAO,OAAQ/C,EAAM,IAAI,EAC5DiQ,GAAa,SAASjQ,EAAM,KAAO,OAAS,OAAO,CAAA,EAClD,CAACA,EAAM,IAAI,CAAC,EAEf+C,EAAAA,UAAU,IAAM,CACNlB,GAAA,MAAAA,EAAA,YAAY,EAAC7B,GAAA,MAAAA,EAAO,UAC3B,EAAA,CAAC6B,EAAQ7B,GAAA,YAAAA,EAAO,QAAQ,CAAC,EAE5B+C,EAAAA,UAAU,MACJ/C,GAAA,YAAAA,EAAO,YAAa,IACtBoT,GAAUtD,GAAW,oBAAoB,EAGpC,IAAM,CACXgD,GAAU,oBAAoB,CAAA,GAE/B,CAAC9S,GAAA,YAAAA,EAAO,QAAQ,CAAC,EAEX,SAAAiU,EAAUpS,EAAoBmS,EAAuC,CAC5E,OAAIhU,GAAA,MAAAA,EAAO,qBACLgU,IAAW,OACNnS,EAAO,QAAU,GAAKA,EAAO,QAAQ,EAE1CmS,IAAW,OACNnS,EAAO,QAAU,CAAC,EAAIA,EAAO,QAAQ,EAE1CmS,IAAW,OACNnS,EAAO,QAAU,GAAKA,EAAO,QAAQ,EAEvC,GAGLmS,IAAW,OACNnS,EAAO,UAEZmS,IAAW,OACNnS,EAAO,UAEZmS,IAAW,OACNnS,EAAO,UAET,EACT,CAEAkB,EAAAA,UAAU,IACD,IAAM,QACXrB,EAAAG,GAAA,YAAAA,EAAQ,UAAR,MAAAH,EAAA,KAAAG,EAAkB,EAEnB,CAAE,CAAA,EAEC,MAAAuS,EAAoBrD,GAAalP,EAAe,gBAAgB,EAEtE,OAAKA,EAKHT,EAAAA,IAAC,MAAI,CAAA,UAAU,wBACb,SAAAA,EAAAA,IAACwH,GAAgB,CAAA,cAAe,EAC9B,SAAAtH,EAAA,KAAC,MAAI,CAAA,UAAU,gIACZ,SAAA,CAAC,EAAAtB,GAAA,MAAAA,EAAO,aAAcoB,MAAC4J,GAAW,CAAA,WAAYhL,GAAA,YAAAA,EAAO,WAAY,OAAA6B,EAAgB,SAAU7B,GAAA,YAAAA,EAAO,QAAU,CAAA,EAE7GsB,EAAAA,KAAC,MAAI,CAAA,UAAU,sEACZ,SAAA,CAAC,EAAAtB,GAAA,MAAAA,EAAO,cAAgBoB,EAAA,IAAAiT,GAAA,CAAQ,OAAAxS,EAAgB,SAAU,CAAC,EAAC7B,GAAA,MAAAA,EAAO,UAAU,EAE9EoB,EAAAA,IAACkT,iBAAc,UAAW,sBAAqBtU,GAAA,YAAAA,EAAO,eAAgB,EAAE,GAAI,OAAA6B,EAAgB,EAE3FT,MAAA,MAAA,CAAI,UAAU,8FACZ,YACEA,EAAAA,IAAA,MAAA,CAAI,UAAU,kCACb,SAACA,EAAAA,IAAA,MAAA,CAAI,UAAU,qEACb,gBAAC,OACG,CAAA,SAAA,CAAeS,EAAA,QAAQ,eAAe,WAAW,EAClD,IACA8H,EAAE,mBAAmB,CAAA,EACxB,CAAA,CACF,CACF,CAAA,EAEJ,CAAA,EACF,CAAA,EACF,EACF,CACF,CAAA,EA9BSvI,EAAA,IAAA6J,WAAA,CAAA,CAAA,CAgCb,CAEA,MAAesJ,GAAAA,EAAAA,WAAWjB,EAAc,EC/KxC,SAASe,GAAQ,CAAE,OAAAxS,EAAQ,SAAAzB,GAA0B,CACnD,KAAM,CAAE,EAAAuJ,EAAG,KAAAwD,CAAK,EAAIM,EAAU,EAExB0B,EAAQvB,EAAAA,QAAQ,IAAM,CAE1B,MAAM6F,EADa,CAAC,GAAG5R,EAAO,iBAAiB,UAAU,EACvB,KAAK,CAACsP,EAAKqD,IAAQ,CAC7C,MAAAC,EAAKtD,EAAI,QAAS,MAAQ,GAC1BuD,EAAKF,EAAI,QAAS,MAAQ,GAChC,OAAOC,EAAIC,CAAA,CACZ,EAED,IAAIC,EAA4B,CAAA,EAEhC,UAAWC,KAAanB,EAAgB,CAChC,KAAA,CAAE,OAAAoB,EAAQ,QAAAC,EAAU,GAAO,OAAAC,EAAS,GAAO,QAAAC,EAAU,EAAK,EAAIJ,EAAU,QAC9E,GAAI,CAACC,GAAU,CAACrE,GAAWqE,CAAM,GAAK,CAACG,EACrC,SAGF,MAAMC,EAAqEJ,EAAO,CAChF,OAAAhT,EACA,UAAA+S,EACA,EAAAjL,CAAA,CACD,EAEG,GAAA,MAAM,QAAQsL,CAAO,EAAG,CAC1B,MAAMC,EAA2BD,EAAQ,IAAI,CAACrB,EAAGhF,KAAO,CACtD,OAAQgF,EACR,QAAShF,IAAMqG,EAAQ,OAAS,EAAIH,EAAU,GAC9C,OAAQlG,IAAM,EAAImG,EAAS,EAC3B,EAAA,EACFJ,EAAQ,CAAC,GAAGA,EAAO,GAAGO,CAAI,EAC1B,QACF,CAEAP,EAAM,KAAK,CAAE,OAAQM,EAAS,QAAAH,EAAS,OAAAC,EAAQ,CACjD,CACO,OAAAJ,CACN,EAAA,CAAC9S,EAAQ8H,EAAGwD,CAAI,CAAC,EAGlB,OAAA/L,EAAA,IAAC,MAAA,CACC,UAAU,iDACV,MAAO,CACL,cAAehB,EAAW,OAAS,OACnC,QAASA,EAAW,GAAM,CAC5B,EAEA,SAAAgB,EAAA,IAAC,OAAI,UAAU,uGACZ,WAAM,IAAI,CAACgO,EAAwB7P,IAAQ,SACpC,MAAA4V,EAAkB/F,EAAK,OAAO,UAGlC,OAAA9N,EAAA,KAAC,MAAI,CAAA,UAAU,sCACZ,SAAA,EAAA8N,GAAA,YAAAA,EAAM,SAAWhO,EAAAA,IAAAuF,EAAA,CAAU,YAAY,WAAW,UAAU,yCAAyC,EAEtGvF,EAAA,IAAC+T,EAAA,CACE,GAAG/F,EAAK,OAAO,eAChB,SAAUhP,KAAYsL,GAAAhK,EAAA0N,GAAA,YAAAA,EAAM,SAAN,YAAA1N,EAAc,iBAAd,YAAAgK,EAA8B,SAAA,CACtD,GAEC0D,GAAA,YAAAA,EAAM,UAAWhO,EAAAA,IAACuF,GAAU,YAAY,WAAW,UAAU,kCAAkC,CAAA,CAAA,EARxCpH,CAS1D,CAEH,CAAA,EACH,CAAA,CAAA,CAGN,CCvFO,SAAS6V,GAAYpV,EAAgC,CAExD,OAAAoB,EAAA,IAAC,MAAI,CAAA,MAAM,6BAA6B,MAAM,MAAM,OAAO,MAAM,QAAQ,YAAa,GAAGpB,EACvF,SAAAoB,EAAA,IAAC,OAAA,CACC,KAAK,eACL,EAAE,wHAAA,CAGN,CAAA,CAAA,CAEJ,CCVO,SAASiU,GAAerV,EAAgC,CAE3D,OAAAoB,EAAA,IAAC,MAAI,CAAA,MAAM,6BAA6B,MAAM,MAAM,OAAO,MAAM,QAAQ,YAAa,GAAGpB,EACvF,SAAAoB,EAAA,IAAC,OAAA,CACC,KAAK,OACL,OAAO,eACP,cAAc,QACd,eAAe,QACf,YAAY,IACZ,EAAE,yGAAA,CAGN,CAAA,CAAA,CAEJ,CChBA,SAASkU,IAAe,CAEpB,OAAAlU,EAAA,IAAC,MAAA,CACC,MAAM,6BACN,WAAW,+BACX,cAAY,OACZ,KAAK,MACL,UAAU,4BACV,MAAM,MACN,OAAO,MACP,QAAQ,YAER,SAAAA,EAAA,IAAC,OAAA,CACC,KAAK,OACL,OAAO,eACP,cAAc,QACd,eAAe,QACf,YAAY,MACZ,EAAE,ugBACF,MAAM,cAAA,CACR,CAAA,CAAA,CAGN,CCvBA,SAASmU,IAAY,CAEjB,OAAAnU,EAAA,IAAC,MAAA,CACC,MAAM,6BACN,WAAW,+BACX,cAAY,OACZ,KAAK,MACL,UAAU,4BACV,MAAM,MACN,OAAO,MACP,QAAQ,YAER,SAAAA,EAAA,IAAC,OAAA,CACC,KAAK,OACL,OAAO,eACP,cAAc,QACd,eAAe,QACf,YAAY,MACZ,EAAE,2gBACF,MAAM,cAAA,CACR,CAAA,CAAA,CAGN,CCrBO,SAASoU,GAAgBxV,EAAgC,CAE5D,OAAAoB,EAAA,IAAC,MAAI,CAAA,MAAM,6BAA6B,MAAM,MAAM,OAAO,MAAM,QAAQ,YAAa,GAAGpB,EACvF,SAAAoB,EAAA,IAAC,OAAA,CACC,KAAK,eACL,EAAE,kLAAA,CAGN,CAAA,CAAA,CAEJ,CCHA,SAASqU,EAAczV,EAA2B,CAC1C,MAAAc,EAAOC,GAAMf,EAAM,IAAI,EAE7B,OAAOc,EAAOM,EAAAA,IAACN,EAAK,CAAA,QAASd,GAAA,YAAAA,EAAO,QAAS,UAAW,8BAA6BA,GAAA,YAAAA,EAAO,YAAa,EAAE,EAAA,CAAI,EAAK,IACtH,CCXO,SAAS0V,GAAiB1V,EAAgC,CAE7D,OAAAoB,EAAA,IAAC,MAAI,CAAA,MAAM,6BAA6B,MAAM,MAAM,OAAO,MAAM,QAAQ,YAAa,GAAGpB,EACvF,SAAAoB,EAAA,IAAC,OAAA,CACC,KAAK,eACL,EAAE,4FAAA,CAGN,CAAA,CAAA,CAEJ,CCVO,SAASuU,GAAS3V,EAAgC,CAErD,OAAAoB,EAAA,IAAC,MAAA,CACC,MAAM,6BACN,WAAW,+BACX,cAAY,OACZ,KAAK,MACL,MAAM,MACN,OAAO,MACP,QAAQ,YACP,GAAGpB,EAEJ,SAAAoB,EAAA,IAAC,OAAA,CACC,KAAK,eACL,OAAO,eACP,eAAe,QACf,YAAa,EACb,EAAE,qBAAA,CACJ,CAAA,CAAA,CAGN,CCrBO,SAASwU,GAAM5V,EAAgC,CACpD,aACG,MAAI,CAAA,MAAM,6BAA6B,MAAM,MAAM,OAAO,MAAM,QAAQ,YAAa,GAAGA,EACvF,SAACoB,MAAA,OAAA,CAAK,KAAK,eAAe,EAAE,qBAAqB,CACnD,CAAA,CAEJ,CCNO,SAASyU,GAAM7V,EAAgC,CAElD,OAAAoB,EAAA,IAAC,MAAI,CAAA,MAAM,6BAA6B,MAAM,MAAM,OAAO,MAAM,QAAQ,YAAa,GAAGpB,EACvF,SAAAoB,EAAA,IAAC,OAAA,CACC,KAAK,eACL,EAAE,2DAAA,CAGN,CAAA,CAAA,CAEJ,CCVO,SAAS0U,GAAM9V,EAAgC,CAElD,OAAAoB,EAAA,IAAC,MAAI,CAAA,MAAM,6BAA6B,MAAM,MAAM,OAAO,MAAM,QAAQ,YAAa,GAAGpB,EACvF,SAAAoB,EAAA,IAAC,OAAA,CACC,KAAK,eACL,EAAE,6FAAA,CAGN,CAAA,CAAA,CAEJ,CCVA,SAAS2U,IAAa,CAElB,OAAA3U,EAAA,IAAC,MAAA,CACC,MAAM,6BACN,WAAW,+BACX,cAAY,OACZ,KAAK,MACL,MAAM,MACN,OAAO,MACP,QAAQ,YAER,SAAAA,EAAA,IAAC,OAAA,CACC,KAAK,eACL,EAAE,kLAAA,CACJ,CAAA,CAAA,CAIN,CCpBO,SAAS4U,IAAY,CAExB,OAAA1U,OAAC,OAAI,MAAM,6BAA6B,MAAM,MAAM,OAAO,MAAM,QAAQ,YACvE,SAAA,CAAAF,EAAA,IAAC,OAAK,CAAA,KAAK,eAAe,EAAE,mNAAmN,EAC9OA,EAAA,IAAA,OAAA,CAAK,KAAK,eAAe,EAAE,wJAAwJ,CACtL,CAAA,CAAA,CAEJ,CCLA,SAAS6U,IAAa,CAElB,OAAA3U,EAAA,KAAC,MAAA,CACC,MAAM,6BACN,MAAM,MACN,OAAO,MACP,UAAU,OACV,QAAQ,gBAER,SAAA,CAAAF,EAAA,IAAC,OAAA,CACC,KAAK,eACL,EAAE,6tBAAA,CACJ,EACAA,EAAA,IAAC,OAAA,CACC,KAAK,eACL,EAAE,+aAAA,CACJ,CAAA,CAAA,CAAA,CAGN,CCrBO,SAAS8U,IAAgB,CAE5B,OAAA9U,EAAA,IAAC,MAAI,CAAA,MAAM,6BAA6B,MAAM,MAAM,OAAO,MAAM,QAAQ,YAAY,SAACA,EAAA,IAAA,OAAA,CAAK,KAAK,OAAO,OAAO,eAAe,cAAc,QAAQ,eAAe,QAAQ,YAAY,IAAI,EAAE,uFAAwF,CAAA,CAAO,CAAA,CAE/R,CCJO,SAAS+U,IAAiB,CAE7B,OAAA/U,EAAA,IAAC,MAAI,CAAA,MAAM,6BAA6B,MAAM,MAAM,OAAO,MAAM,QAAQ,YAAY,SAACA,EAAA,IAAA,OAAA,CAAK,KAAK,OAAO,OAAO,eAAe,cAAc,QAAQ,eAAe,QAAQ,YAAY,IAAI,EAAE,oFAAqF,CAAA,CAAO,CAAA,CAE5R,CCmFO,MAAML,GAAQ,CAAA,KACnBqV,EAAA,KAAA,aACAC,EAAA,aAAA,OACAC,EAAA,OAAA,UACAC,EAAA,UAAA,MACAC,EAAA,MACA,UAAWnB,GAAA,cACXoB,EAAA,cAAA,MACAC,EAAA,MAAA,OACAC,EAAA,OAAA,YACAC,EAAA,YAAA,MACAC,EAAA,MAAA,MACAC,EAAA,MACA,YAAaC,EAAA,oBACb,aAAcC,EAAA,qBACd,UAAWC,EAAA,kBACX,WAAYC,EAAA,mBAAA,YACZC,EAAA,YAAA,UACAC,EAAA,UAAA,YACAC,EAAA,YAAA,KACAC,EAAA,KACA,MAAOC,EAAA,QAAA,KACPC,EAAA,KAAA,eACAC,EAAA,eAAA,eACAC,EAAA,eAAA,KACAC,EAAA,OAAA,YACAC,EAAA,YAAA,SACAC,EAAA,SAAA,KACAC,EAAA,KAAA,QACAC,EAAA,QAAA,MACAC,EAAA,MAAA,SACAC,EAAA,SAAA,SACAC,EAAA,SAAA,MACAC,EAAA,MAAA,SACAC,EAAA,SAAA,OACAjN,EAAA,OAAA,OACAkN,EAAA,OAAA,oBACAC,EAAA,qBAAA,sBACAC,EAAA,uBAAA,qBACAC,EAAA,qBAAA,mBACAC,EAAA,mBAAA,gBACAC,EAAA,gBAAA,gBACAC,EAAA,gBAAA,OACAvN,EAAA,OAAA,MACAwN,EAAA,MAAA,QACAC,EAAA,QAAA,eACAC,EAAA,eACA,WAAYpD,GACZ,KAAMF,GAAA,SACNuD,EAAA,SAAA,SACAC,EAAA,SAAA,SACAC,EAAA,SAAA,SACAC,EAAA,SAAA,SACAC,EAAA,SAAA,SACAC,EAAA,SAAA,SACAC,EAAA,SAAA,SACAC,EAAA,SAAA,SACAC,EAAA,SAAA,KACA1J,EAAA,KACA,KAAM2J,EAAA,aAAA,KACNC,EAAA,KAAA,UACAC,EAAA,UAAA,UACAC,EAAA,UAAA,WACAC,EAAA,WACA,QAASP,EAAA,SACT,OAAQQ,EAAA,MAER,SAAAlE,GACA,MAAAG,GACA,MAAAD,GACA,MAAAD,GACA,YAAAR,GAEA,MAAO0E,EAAA,UAEP,aAAAxE,GACA,UAAAC,GACA,iBAAkBsD,EAAA,QAClB,UAAWkB,EAAA,UACX,UAAWC,EAAA,MAAA,UACXhE,GAAA,WACAC,GAAA,WACAF,GACA,cAAAG,GACA,eAAAC,GAAA,WACA8D,EAAA,UACF,ECnGA,SAASC,GAAerY,EAAkC,CACxD,MAAMsY,EAAsC,CAAC,aAAc,cAAe,YAAY,EAChFpZ,EAAmE,CACvE,QACA,QACA,OAAA,EAGF,OAAOoZ,EAAM,IAAI,CAAC1W,EAAMmL,KAAO,CAC7B,KAAM,SAASnL,CAAI,GACnB,UAAW3D,EACX,eAAgB,CACd,QAASiO,EAAc,EAAE,UAAUtK,EAAK,QAAQ,IAAK,GAAG,CAAC,UAAiB,EAC1E,KAAM1C,EAAM6N,CAAC,EACb,OAAQ,IAAM/M,EAAO,SAAS,YAAY,CAAE,MAAOhD,GAAW4E,CAAI,EAAG,EACrE,SAAU,IAAM5B,EAAO,SAAS,QAAS,CAAE,MAAOhD,GAAW4E,CAAI,EAAG,CACtE,CACA,EAAA,CACJ,CAEA,SAAS2W,GAAgBvY,EAAkC,CACzD,MAAMsY,EAA2B,CAAC,OAAQ,SAAU,OAAO,EACrDE,EAAe,CACnB,KAAM,YACN,OAAQ,cACR,MAAO,YAAA,EAEF,OAAAF,EAAM,IAAUvG,GAAA,SAAA,OACrB,KAAM,SAASA,CAAC,GAChB,UAAW9T,EACX,eAAgB,CACd,QAASiO,EAAc,EAAE,oBAAoB6F,CAAC,UAAU,EACxD,KAAMyG,EAAQzG,CAAC,EACf,OAAQ,IAAA,SAAM,OAAAlI,GAAAhK,EAAAG,EAAO,WAAP,YAAAH,EAAiB,eAAjB,YAAAgK,EAAA,KAAAhK,EAAgCkS,IAC9C,SAAU,IAAM/R,EAAO,SAAS,CAAE,UAAW+R,CAAG,CAAA,GAAK,GACrD,SAAU,GAAClI,GAAAhK,EAAAG,EAAO,IAAI,IAAX,YAAAH,EAAc,eAAd,MAAAgK,EAAA,KAAAhK,EAA6BkS,GAC1C,CACA,EAAA,CACJ,CAEA,SAAS0G,GAAezY,EAAkC,CACxD,MAAMsY,EAAsC,CAAC,aAAc,cAAe,YAAY,EAChFpZ,EAAmE,CACvE,QACA,QACA,OAAA,EAGF,OAAOoZ,EAAM,IAAI,CAAC1W,EAAMmL,KAAO,CAC7B,KAAM,SAASnL,CAAI,GACnB,UAAW3D,EACX,eAAgB,CACd,QAASiO,EAAc,EAAE,UAAUtK,EAAK,QAAQ,IAAK,GAAG,CAAC,UAAiB,EAC1E,KAAM1C,EAAM6N,CAAC,EACb,OAAQ,IAAM/M,EAAO,SAAS,YAAY,CAAE,MAAO/C,GAAW2E,CAAI,EAAG,EACrE,SAAU,IAAM5B,EAAO,SAAS,QAAS,CAAE,MAAO/C,GAAW2E,CAAI,EAAG,CACtE,CACA,EAAA,CACJ,CACO,SAAS8W,GAAe1Y,EAAkC,CACxD,MAAA,CACL,GAAGqY,GAAerY,CAAM,EACxB,GAAGuY,GAAgBvY,CAAM,EACzB,CACE,KAAM,SACN,UAAW/B,EACX,eAAgB,CACd,OAAA+B,EACA,QAASkM,EAAc,EAAE,eAAe,EACxC,KAAM,SACN,OAAQ,IAAM,CACZ,KAAM,CAAE,MAAAjM,EAAO,SAAA2H,GAAa5H,EAAO,KACnC2Y,kBAAgB1Y,EAAO2H,CAAQ,CACjC,CACF,CACF,CAAA,CAEJ,CAEO,SAASgR,GAAe5Y,EAAkC,CACxD,MAAA,CACL,GAAGyY,GAAezY,CAAM,EACxB,CACE,KAAM,SACN,UAAW/B,EACX,eAAgB,CACd,OAAA+B,EACA,QAASkM,EAAc,EAAE,eAAe,EACxC,KAAM,SACN,OAAQ,IAAM,CACZ,KAAM,CAAE,MAAAjM,EAAO,SAAA2H,GAAa5H,EAAO,KACnC2Y,kBAAgB1Y,EAAO2H,CAAQ,CACjC,CACF,CACF,CAAA,CAEJ,CAKgB,SAAAiR,GAAc7Y,EAAgB,EAAQ,CACpD,OAAO1C,GAAiB,OAAO,CAACqV,EAAKzO,IAAS,CAC5C,GAAIA,IAAS,WAAayO,EAAI,OAAS,EAC9B,MAAA,CAAC,GAAGA,EAAK,CACd,KAAM,UACN,UAAW,OACX,eAAgB,CAAC,CAAA,CAClB,EAGG,MAAAjJ,EAAM1J,EAAO,iBAAiB,WAAW,KAAK0J,GAAOA,EAAI,OAASxF,CAAI,EAC5E,OAAIwF,EACK,CAAC,GAAGiJ,EAAKjJ,EAAI,UAAY,EAAA,QAAQ,OAAO,CAAE,OAAA1J,EAAQ,EAAG,UAAW0J,CAAA,CAAK,CAAC,EAGxEiJ,CACT,EAAG,CAAsB,CAAA,CAC3B,CC1LkB,IAAAmG,IAAAA,IAChBA,EAAAA,EAAA,IAAM,CAAN,EAAA,MACAA,EAAAA,EAAA,IAAM,CAAN,EAAA,MAEAA,EAAAA,EAAA,KAAO,CAAP,EAAA,OACAA,EAAAA,EAAA,KAAO,EAAP,EAAA,OALgBA,IAAAA,IAAA,CAAA,CAAA,EAQF,SAAAxK,GAAMrC,EAAasC,EAAaC,EAAqB,CACnE,OAAIvC,EAAMsC,EACDA,EAELtC,EAAMuC,EACDA,EAEFvC,CACT,CACA,SAAS8M,GACPC,EACAC,EACAX,EACAtY,EACa,CACP,KAAA,CAAE,IAAAkZ,EAAK,UAAAC,CAAc,EAAAH,EAM3B,GAJI,CAACE,GAAO,CAACC,GAIT,EAAEA,aAAqBC,EAAAA,eAAiBD,aAAqBE,EAAe,cACvE,OAAAL,EAGH,KAAA,CAAE,KAAAM,EAAM,GAAAC,CAAO,EAAAJ,EAErB,OAAAD,EAAI,aAAaI,EAAMC,EAAI,CAAClZ,EAAMC,IAAQ,CACxC,MAAMP,EAAWM,EAAK,KAEtB,OAAIiY,EAAM,SAASvY,EAAS,IAAI,GACzBiZ,EAAAQ,GAAoBR,EAAI1Y,EAAK2Y,CAAK,EAChC,IAEAQ,CAAAA,EAAAA,OAAOpZ,EAAK,KAAK,KAAML,EAAO,iBAAiB,UAAU,CAG3D,CACR,EAEMgZ,CACT,CAEgB,SAAAQ,GAAoBR,EAAiB1Y,EAAa2Y,EAA4B,CACxF,GAAA,CAACD,EAAG,IACC,OAAAA,EAGT,MAAM3Y,EAAO2Y,EAAG,IAAI,OAAO1Y,CAAG,EAC9B,GAAI,CAACD,EACI,OAAA2Y,EAMH,MAAAU,EAASpL,IAAOjO,EAAK,MAAM,QAAU,GAAK4Y,EAH9B,EACA,CAEyD,EAEvE,GAAAS,IAAWrZ,EAAK,MAAM,OACjB,OAAA2Y,EAGT,MAAMW,EAAY,CAChB,GAAGtZ,EAAK,MACR,OAAAqZ,CAAA,EAGF,OAAOV,EAAG,cAAc1Y,EAAKD,EAAK,KAAMsZ,EAAWtZ,EAAK,KAAK,CAC/D,CAEO,SAASuZ,GAAoB,CAAE,MAAAX,EAAO,MAAAX,GAAsD,CACjG,MAAO,CAAC,CAAE,MAAArY,EAAO,SAAA2H,EAAU,OAAA5H,KAAa,CAChC,KAAA,CAAE,UAAAmZ,CAAc,EAAAlZ,EAClB,GAAA,CAAE,GAAA+Y,CAAO,EAAA/Y,EAIb,OAHK+Y,EAAAA,EAAG,aAAaG,CAAS,EAC9BH,EAAKD,GAAkBC,EAAIC,EAAOX,EAAOtY,CAAM,EAE3CgZ,EAAG,YACDpR,GACFA,EAASoR,CAAE,EACN,IAGF,EAAA,CAEX,CClEA,SAASzO,GAAYpM,EAAyB,WACtC,KAAA,CAAE,UAAA0b,EAAYC,4BAA+B,EAAA3b,EAC7C,CAAE,EAAA2J,GAAM8D,IACR,CAACmO,EAAaC,CAAc,EAAIjZ,WAAsB,IAAI,EAC1D,CAACkZ,EAAgBC,CAAiB,EAAInZ,EAAAA,SAAS,EAAE,EACjDoZ,EAAclZ,SAAO,IAAI,EACzBmZ,EAAYnZ,SAAmB,IAAI,EACnC,CAACoZ,EAAUC,CAAW,EAAIvZ,WAAS,EAAK,EAExCwZ,EAAwBpc,EAAM,OAAO,iBAAiB,WAAW,KAAKuL,GAAOA,EAAI,OAAS,WAAW,EACrG8Q,EAAqBrc,EAAM,OAAO,iBAAiB,WAAW,KAAKuL,GAAOA,EAAI,OAAS,QAAQ,EAC/F+Q,EAAoBtc,EAAM,OAAO,iBAAiB,WAAW,KAAKuL,GAAOA,EAAI,OAAS,OAAO,EAEnGxI,EAAAA,UAAU,IAAM,CACViZ,EAAY,SAAW,CAAChc,EAAM,OAAO,cACvCic,EAAU,QAAUM,mBAAiB,CACnC,OAAQvc,EAAM,OACd,QAASgc,EAAY,QACrB,UAAW,kBACX,aAAc,CACZ,OAAQ,CAAC,GAAI,EAAE,EACf,OAAQ,GACR,eAAgB,0BAClB,EACA,aAAcQ,CAAA,CACf,EAEKxc,EAAA,OAAO,eAAeic,EAAU,OAAO,EAE9C,EAAA,CAACjc,EAAM,OAAQgc,CAAW,CAAC,EAE9B,SAASS,GAAsB,CACvB,MAAAC,EAAQ1c,EAAM,OAAO,MAAM,EAC3B0c,EAAA,iBAAiBZ,CAAc,EAAE,cAAc,GACjDF,GAAA,YAAAA,EAAa,KAAK,QAAS,aAC7Bc,EAAM,aAAa,EAErBA,EAAM,IAAI,CACZ,CACA,SAASC,GAAsB,CACvB3c,EAAA,OAAO,QAAQ,QAAQ,iBAAiB8b,CAAc,EAAE,MAC9D,SAAS,YAAY,MAAM,CAC7B,CACA,SAASc,GAAgB,CACjB5c,EAAA,OAAO,SAAS,iBAAiB8b,CAAc,EACrD,KAAM,CAAE,QAAAe,CAAA,EAAY7c,EAAM,OAAO,MAAM,UACjC8c,EAAeD,EAAQ,KAAK,CAAC,GAAM7c,EAAM,OAAO,MAAM,UAA4B,KACxFA,EAAM,OACH,MAAM,EACN,QAAQ,iBAAkB,EAAI,EAC9B,gBAAgB8b,IAAkBF,GAAA,YAAAA,EAAa,WAAY,GAAIkB,EAAa,OAAQ,CAAA,EACpF,KACL,CACA,SAASC,EAAaC,EAAoB,CAClChd,EAAA,OAAO,SAAS,aAAagd,CAAU,CAC/C,CACA,SAASC,GAAiB,CACxB,MAAMC,EAAW7B,GAAoBrb,EAAM,OAAO,MAAM,GAAI8b,EAAgB,CAAC,EACpEoB,EAAA,QAAQ,iBAAkB,EAAI,EACnCld,EAAM,OAAO,KAAK,UACdA,EAAA,OAAO,KAAK,SAASkd,CAAQ,CACvC,CACA,SAASC,GAAiB,CACxB,MAAMtC,EAAKQ,GAAoBrb,EAAM,OAAO,MAAM,GAAI8b,EAAgB,EAAE,EACpE9b,EAAM,OAAO,KAAK,UACdA,EAAA,OAAO,KAAK,SAAS6a,CAAE,CACjC,CAEA,SAASlZ,GAAa,CACpB3B,EAAM,OACH,QACA,QAAQ,iBAAkB,EAAI,EAC9B,iBAAiB8b,CAAc,EAC/B,gBAAgB,EAChB,IAAI,CACT,CAEA,SAASU,EAAiB7M,EAAQ,CAC5BA,EAAE,MACJkM,EAAelM,EAAE,IAAI,EAEvBoM,EAAkBpM,EAAE,GAAG,CACzB,CAEA,SAASyN,GAAY,OACnB,GAAItB,IAAmB,GAAI,CACnB,MAAAuB,GAAkBzB,GAAA,YAAAA,EAAa,WAAY,EAC3C0B,EAAYxB,EAAiBuB,EAC7BE,IACF3B,GAAA,YAAAA,EAAa,KAAK,QAAS,eAAela,EAAAka,GAAA,YAAAA,EAAa,UAAb,YAAAla,EAAsB,QAAS,EACvE8b,GAAWD,GAA8BzB,EAAiB,EAAIwB,EAAY,EAC1Etd,EAAA,OACH,QACA,QAAQ,CAAC,CAAE,SAAAyJ,EAAU,GAAAoR,GAAI,MAAA/Y,KACpB2H,GACE8T,GACF1C,GAAG,WAAW,IAAKiB,EAAgBA,EAAiB,CAAC,EAGlDjB,GAAA,OACDyC,EACAxb,EAAM,OAAO,MAAM,UAAU,OAAO,KAAM,CAACA,EAAM,OAAO,KAAK,GAAG,CAAC,CAAC,CAAA,EAI/D2H,EAASoR,EAAE,GAGb,EACR,EACA,MAAM2C,EAAQ,EACd,IAAI,CACT,CACF,CAEAza,EAAAA,UAAU,KACJmZ,EACFlc,EAAM,OAAO,SAAS,QAAQ,iBAAkB,EAAI,EAGpDA,EAAM,OAAO,SAAS,QAAQ,iBAAkB,EAAK,EAGhD,IAAM,CACXA,EAAM,OAAO,SAAS,QAAQ,iBAAkB,EAAK,CAAA,GAEtD,CAACkc,CAAQ,CAAC,EAEbnZ,EAAAA,UAAU,IACD,IAAM,CACPkZ,EAAU,UACNjc,EAAA,OAAO,iBAAiB0b,CAAS,EACvCO,EAAU,QAAU,KACtB,EAED,CAAE,CAAA,EAELlZ,EAAAA,UAAU,IAAM,QACVrB,EAAA1B,EAAM,SAAN,MAAA0B,EAAc,aAAeua,EAAU,UACnCjc,EAAA,OAAO,iBAAiB0b,CAAS,EACvCO,EAAU,QAAU,KAErB,EAAA,EAACva,EAAA1B,EAAM,SAAN,YAAA0B,EAAc,WAAW,CAAC,EAExB,MAAA+b,EAAwBvT,GAAc,CACtClK,GAAA,MAAAA,EAAO,UAGXmc,EAAYjS,CAAI,CAAA,EAIhB,OAAA9I,EAAA,IAAC,MAAA,CACC,UACI,0FAA0FpB,GAAA,YAAAA,EAAO,SAAS,GAE9G,MAAO,CACL,QAASA,GAAA,MAAAA,EAAO,SAAW,EAAI,CACjC,EACA,IAAKgc,EAEL,SAAA1a,EAAA,KAAC,MAAI,CAAA,UAAU,kIACb,SAAA,CAAAF,EAAA,IAACK,EAAA,CACC,QAAQ,QACR,KAAK,OACL,UAAU,iDACV,SAAUzB,GAAA,YAAAA,EAAO,SACjB,QAASod,EAET,SAAChc,EAAA,IAAAqU,EAAA,CAAc,KAAK,OAAO,UAAU,4EAA4E,CAAA,CACnH,EACCnU,EAAA,KAAAoC,EAAA,CAAa,KAAMwY,EAAU,aAAcuB,EAC1C,SAAA,CAACnc,EAAAA,KAAA,MAAA,CAAI,UAAU,oDACb,SAAA,CAAAA,OAACH,GACC,CAAA,SAAA,CAAAC,MAACC,GAAe,CAAA,QAAO,GAAC,SAAUrB,GAAA,YAAAA,EAAO,SACvC,SAAAoB,EAAA,IAACK,EAAA,CACC,QAAQ,QACR,KAAK,OACL,UAAU,kFACV,SAAUzB,GAAA,YAAAA,EAAO,SACjB,UAAW,IAAM,CACXA,GAAA,MAAAA,EAAO,UAGXmc,EAAY,EAAI,CAClB,EAEA,SAAC/a,EAAA,IAAAqU,EAAA,CAAc,KAAK,OAAO,UAAU,4EAA4E,CAAA,CAAA,EAErH,EACCrU,EAAA,IAAAG,GAAA,CACE,SAAEoI,EAAA,2BAA2B,CAChC,CAAA,CAAA,EACF,EAEAvI,EAAAA,IAACwC,EAAoB,CAAA,UAAU,mGAAoG,CAAA,CAAA,EACrI,EAEAtC,EAAAA,KAACsD,GAAoB,UAAU,gBAAgB,MAAM,QAAQ,KAAK,SAAS,WAAY,EACrF,SAAA,CAAAtD,EAAA,KAACyD,EAAA,CACC,QAASpD,EACT,UAAU,mQAEV,SAAA,CAACP,EAAAA,IAAAqU,EAAA,CAAc,KAAK,QAAS,CAAA,EAC5BrU,EAAA,IAAA,OAAA,CAAM,SAAEuI,EAAA,eAAe,CAAE,CAAA,CAAA,CAAA,CAC5B,EAEC2S,EAEMhb,EAAAA,KAAAyD,EAAA,CAAiB,UAAU,+BAA+B,QAAS0X,EAClE,SAAA,CAACrb,EAAAA,IAAAqU,EAAA,CAAc,KAAK,aAAc,CAAA,EACjCrU,EAAA,IAAA,OAAA,CAAM,SAAEuI,EAAA,sBAAsB,CAAE,CAAA,CAAA,CAAA,CACnC,EAEF,KAEHrI,EAAA,KAAAyD,EAAA,CAAiB,UAAU,+BAA+B,QAAS4X,EAClE,SAAA,CAACvb,EAAAA,IAAAqU,EAAA,CAAc,KAAK,WAAY,CAAA,EAC/BrU,EAAA,IAAA,OAAA,CAAM,SAAEuI,EAAA,wBAAwB,CAAE,CAAA,CAAA,EACrC,EACCrI,EAAA,KAAAyD,EAAA,CAAiB,UAAU,+BAA+B,QAAS6X,EAClE,SAAA,CAACxb,EAAAA,IAAAqU,EAAA,CAAc,KAAK,MAAO,CAAA,EAC1BrU,EAAA,IAAA,OAAA,CAAM,SAAEuI,EAAA,aAAa,CAAE,CAAA,CAAA,EAC1B,EAECyS,GAAyBC,EAEnBjb,EAAAA,IAAAuE,GAAA,CAAA,CAAsB,EAEzB,KAEHyW,SAEMlY,GACC,CAAA,SAAA,CAAC5C,EAAAA,KAAAgD,GAAA,CAAuB,UAAU,+BAChC,SAAA,CAAClD,EAAAA,IAAAqU,EAAA,CAAc,KAAK,aAAc,CAAA,EACjCrU,EAAA,IAAA,OAAA,CAAM,SAAEuI,EAAA,0BAA0B,CAAE,CAAA,CAAA,EACvC,EACAvI,EAAA,IAAC4C,GACC,CAAA,SAAA1C,EAAAA,KAACoD,GACC,CAAA,SAAA,CAAApD,OAACyD,GAAiB,UAAU,+BAA+B,QAAS,IAAMgY,EAAa,MAAM,EAC3F,SAAA,CAAC3b,EAAAA,IAAAqU,EAAA,CAAc,KAAK,WAAY,CAAA,EAC/BrU,EAAA,IAAA,OAAA,CAAM,SAAEuI,EAAA,+BAA+B,CAAE,CAAA,CAAA,EAC5C,EACArI,OAACyD,GAAiB,UAAU,+BAA+B,QAAS,IAAMgY,EAAa,QAAQ,EAC7F,SAAA,CAAC3b,EAAAA,IAAAqU,EAAA,CAAc,KAAK,aAAc,CAAA,EACjCrU,EAAA,IAAA,OAAA,CAAM,SAAEuI,EAAA,iCAAiC,CAAE,CAAA,CAAA,EAC9C,EACArI,OAACyD,GAAiB,UAAU,+BAA+B,QAAS,IAAMgY,EAAa,OAAO,EAC5F,SAAA,CAAC3b,EAAAA,IAAAqU,EAAA,CAAc,KAAK,YAAa,CAAA,EAChCrU,EAAA,IAAA,OAAA,CAAM,SAAEuI,EAAA,gCAAgC,CAAE,CAAA,CAAA,EAC7C,CAAA,CAAA,CACF,CACF,CAAA,CAAA,CAAA,CACF,EAEF,KAEH0S,SAEMnY,GACC,CAAA,SAAA,CAAC5C,EAAAA,KAAAgD,GAAA,CAAuB,UAAU,+BAChC,SAAA,CAAClD,EAAAA,IAAAqU,EAAA,CAAc,KAAK,gBAAiB,CAAA,EACpCrU,EAAA,IAAA,OAAA,CAAM,SAAEuI,EAAA,eAAe,CAAE,CAAA,CAAA,EAC5B,EACAvI,EAAA,IAAC4C,GACC,CAAA,SAAA1C,EAAAA,KAACoD,GACC,CAAA,SAAA,CAAApD,EAAA,KAACyD,EAAA,CACC,UAAU,+BACV,QAASkY,EACT,WAAUvR,EAAAkQ,GAAA,YAAAA,EAAa,QAAb,YAAAlQ,EAAoB,SAAUiP,GAAY,IAEpD,SAAA,CAACvZ,EAAAA,IAAAqU,EAAA,CAAc,KAAK,gBAAiB,CAAA,EACpCrU,EAAA,IAAA,OAAA,CAAM,SAAEuI,EAAA,uBAAuB,CAAE,CAAA,CAAA,CAAA,CACpC,EAEArI,EAAA,KAACyD,EAAA,CACC,UAAU,+BACV,QAASoY,EACT,WAAUvR,EAAAgQ,GAAA,YAAAA,EAAa,QAAb,YAAAhQ,EAAoB,SAAU+O,GAAY,IAEpD,SAAA,CAACvZ,EAAAA,IAAAqU,EAAA,CAAc,KAAK,gBAAiB,CAAA,EACpCrU,EAAA,IAAA,OAAA,CAAM,SAAEuI,EAAA,wBAAwB,CAAE,CAAA,CAAA,CAAA,CACrC,CAAA,CAAA,CACF,CACF,CAAA,CAAA,CAAA,CACF,EAEF,IAAA,EAEN,CAAA,EACF,CAAA,EACF,CAAA,CAAA,CAGN,CC1TA,MAAM+T,GAAe,CACnB,SAAU,OACV,OAAQ,GACR,SAAU,SACV,eAAgB,yBAClB,EAEA,SAASC,GAAM,CAAE,KAAAvO,EAAM,SAAAhP,EAAU,OAAAyB,GAAe,OAC9C,MAAMb,EAAOoO,EAAK,UAElB,OAAKpO,EAKHI,EAAA,IAACJ,EAAA,CACE,GAAGoO,EAAK,eACT,OAAAvN,EACA,SAAUzB,KAAYsB,EAAA0N,GAAA,YAAAA,EAAM,iBAAN,YAAA1N,EAAsB,SAAA,CAAA,EAPrCN,EAAA,IAAA6J,WAAA,CAAA,CAAA,CAUb,CAEA,SAASqB,GAAetM,EAA4B,CAClD,KAAM,CAAE,EAAG,KAAAmN,CAAK,EAAIM,EAAU,EAExB7C,EAAa,CAAC,CAAE,OAAA/I,KAAkB,CACtC,KAAM,CAAE,UAAAmZ,CAAc,EAAAnZ,EAAO,KAAK,MAC5B,CAAE,MAAA+b,EAAO,GAAAxC,CAAO,EAAAJ,EAGlB,OAAA4C,EAAM,MAAQxC,EACT,GAGFJ,aAAqBC,EAAAA,aAAA,EAGxB9L,EAAQvB,EAAAA,QAAQ,IAChB5N,EAAM,UAAY,EAACA,GAAA,MAAAA,EAAO,QACrB,GAGF0a,GAAc1a,EAAM,OAAQ,CAAC,EAEnC,CAACA,EAAM,SAAUA,EAAM,OAAQmN,EAAM,CAAC,CAAC,EAGxC,OAAA/L,EAAA,IAAC4J,cAAW,WAAAJ,EAAwB,OAAQ5K,GAAA,YAAAA,EAAO,OAAQ0d,aAAAA,GACxD,oBAAO,OAEFtc,EAAA,IAAC,OAAI,UAAU,oQACb,eAAC,MAAI,CAAA,UAAU,oKACZ,SAAO+N,GAAA,YAAAA,EAAA,IAAI,CAACC,EAAW7P,KAClB6P,GAAA,YAAAA,EAAM,QAAS,UAEfhO,EAAA,IAACuF,EAAA,CAEC,YAAY,WACZ,UAAU,kDAAA,EAFL,sBAAsBpH,CAAG,EAAA,EAQlC6B,EAAA,IAACuc,GAAA,CAEC,KAAAvO,EACA,SAAUpP,EAAM,SAChB,OAAQA,EAAM,MAAA,EAHT,mBAAmBT,CAAG,EAAA,EAMhC,CACH,CACF,CAAA,qBAGE,CAEV,CAAA,CAEJ,CC5EA,SAASse,GAAM,CAAE,KAAAC,GAAa,CAE1B,OAAA1c,EAAA,IAAC,MAAA,CACC,MAAM,OACN,OAAO,OACP,QAAQ,cACR,QAAQ,MACR,MAAM,6BAEN,SAACA,EAAAA,IAAA,IAAA,CAAE,GAAG,WAAW,OAAO,OAAO,YAAa,EAAG,KAAK,OAAO,SAAS,UAClE,SAACE,EAAAA,KAAA,IAAA,CAAE,GAAG,YACJ,SAAA,CAAAF,EAAA,IAAC,IAAE,CAAA,GAAG,KAAK,KAAK,eACd,SAAAE,EAAA,KAAC,IAAA,CACC,UAAU,4HACV,GAAG,KAEH,SAAA,CAAAF,EAAA,IAAC,OAAA,CACC,EAAE,4cACF,SAAS,SAAA,CACX,EACAA,EAAA,IAAC,OAAA,CACC,EAAE,uaACF,SAAS,SAAA,CACX,EACAA,EAAA,IAAC,OAAA,CACC,EAAE,yWACF,SAAS,SAAA,CACX,CAAA,CAAA,CAAA,EAEJ,EACAA,EAAA,IAAC,OAAA,CACC,EAAE,qLACF,GAAG,KACH,KAAM0c,GAAQ,SAAA,CAChB,CAAA,CAAA,CACF,CACF,CAAA,CAAA,CAAA,CAGN,CAEA,SAASC,GAAsB/d,EAAoC,CAEjE,KAAM,CAACoO,EAAeC,CAAgB,EAAIzL,EAAAA,SAAc,MAAS,EAEjE,SAAS0L,EAASU,EAA2B,QAC3CtN,EAAA1B,EAAM,SAAN,MAAA0B,EAAA,KAAA1B,EAAegP,EACjB,CAEA,SAASgP,GAAc,QACrBtc,EAAA1B,EAAM,SAAN,MAAA0B,EAAA,KAAA1B,EAAeoO,EACjB,CAEA,MAAM6P,EAA2BpT,EAAA,YAC/BqT,EAAA,SAAUlP,GAAe,CACvBX,EAAiBW,CAAK,GACrB,GAAG,EACN,CAAC,CAAA,EAID,OAAA1N,EAAA,KAAC,MAAI,CAAA,UAAU,wDACb,SAAA,CAAAF,EAAA,IAACtB,EAAA,CACC,QAASE,GAAA,YAAAA,EAAO,QAChB,SAAUA,GAAA,YAAAA,EAAO,SACjB,OAAQge,EACR,eAAgBhe,GAAA,YAAAA,EAAO,eACvB,aAAcA,GAAA,YAAAA,EAAO,aAErB,SAAAoB,EAAAA,IAAC,QAAK,UAAU,+EACd,eAACyc,GAAM,CAAA,KAAMzP,EAAe,CAC9B,CAAA,CAAA,CACF,EACAhN,EAAA,IAAC8M,GAAA,CACC,cAAAE,EACA,iBAAkB6P,EAClB,SAAA3P,EACA,UAAS,GACT,SAAUtO,GAAA,YAAAA,EAAO,SAEjB,eAACyB,EAAO,CAAA,QAAQ,QAAQ,KAAK,OAAO,UAAU,mCAAmC,SAAUzB,GAAA,YAAAA,EAAO,SAChG,SAACoB,EAAA,IAAAqU,EAAA,CAAc,UAAU,qDAAqD,KAAK,UAAW,CAAA,EAChG,CAAA,CACF,CACF,CAAA,CAAA,CAEJ,CC3FA,SAAS9J,GAAgB,CAAE,OAAA9J,GAAgC,2CACzD,MAAM+I,EAAa,CAAC,CAAE,OAAA/I,KACbpB,EAASoB,SAAAA,EAAO,KAAK,MAAO,OAAO,EAEtC,CAAE,EAAA8H,GAAM8D,IAEd,SAAS0Q,GAAoB,CAC3Btc,EAAO,QAAQ,MAAQ,EAAA,gBAAA,EAAkB,KAC3C,CAEA,SAASuc,GAAmB,CAC1Bvc,EAAO,QAAQ,MAAQ,EAAA,eAAA,EAAiB,KAC1C,CAEA,SAASwc,GAAiB,CACxBxc,EAAO,QAAQ,MAAQ,EAAA,aAAA,EAAe,KACxC,CACA,SAASyc,GAAgB,CACvBzc,EAAO,QAAQ,MAAQ,EAAA,aAAA,EAAe,KACxC,CAEA,SAAS0c,GAAgB,CACvB1c,EAAO,QAAQ,MAAQ,EAAA,YAAA,EAAc,KACvC,CAEA,SAAS2c,GAAc,CACrB3c,EAAO,QAAQ,MAAQ,EAAA,UAAA,EAAY,KACrC,CAEA,SAAS4c,GAAc,CACrB5c,EAAO,QAAQ,MAAQ,EAAA,WAAA,EAAa,KACtC,CACA,SAAS6c,GAAc,CACrB7c,GAAA,MAAAA,EAAQ,QAAQ,QAAQ,YAAY,KACtC,CACA,SAAS8c,GAAgB,CACvB9c,EAAO,QAAQ,MAAQ,EAAA,YAAA,EAAc,KACvC,CAEA,SAAS+c,EAAoB5P,EAAe,CAC1CnN,EAAO,QAAQ,MAAA,EAAQ,uBAAuBmN,CAAK,EAAE,KACvD,CACA,MAAM6P,EAAiD,IAAM,QACrD,KAAA,CACJ,KAAAC,EACA,MAAO,CACL,UAAW,CAAE,KAAA3D,EAAK,CACpB,CACE,EAAAtZ,EAEEK,EAAO4c,EAAK,SAAS3D,EAAI,EAAE,KACjC,GAAI,CAACjZ,EACH,OAAO,IAAI,QAAQ,KAAO,KAAO,EAAG,CAAC,EAGjC,MAAA6c,IAAerd,GAAAQ,GAAA,YAAAA,EAAM,UAAN,YAAAR,GAAA,KAAAQ,EAAgB,iBACrC,OAAK6c,GAIQA,GAAa,wBAHjB,IAAI,QAAQ,KAAO,KAAO,EAAG,CAAC,CAKhC,EAIP,OAAA3d,EAAA,IAAC4J,EAAA,WAAA,CACC,OAAAnJ,EACA,UAAU,QACV,WAAA+I,EACA,YAAa,EACb,aAAc,CACZ,OAAQ,CAAC,EAAG,CAAC,EACb,cAAe,CACb,UAAW,CAAC,CAAE,KAAM,OAAQ,QAAS,GAAO,CAC9C,EACA,SAAU,OACV,uBAAAiU,EACA,QAAS,CAACG,EAAAA,MAAM,EAChB,OAAQ,QACV,EAEA,SAAA1d,EAAA,KAAC,MAAI,CAAA,UAAU,oQACb,SAAA,CAAAF,EAAA,IAACtB,EAAA,CACC,KAAK,sBACL,QAAS6J,EAAE,sCAAsC,EACjD,OAAQwU,EACR,kBAAiB,CACf,WAAY,EACd,EACA,SAAU,GAACzS,GAAAhK,EAAAG,GAAA,YAAAA,EAAQ,QAAR,YAAAH,EAAe,kBAAf,MAAAgK,EAAA,KAAAhK,GAAiC,CAC9C,EACAN,EAAA,IAACtB,EAAA,CACC,KAAK,wBACL,QAAS6J,EAAE,qCAAqC,EAChD,OAAQyU,EACR,kBAAiB,CACf,WAAY,EACd,EACA,SAAU,GAACtS,GAAAF,EAAA/J,GAAA,YAAAA,EAAQ,QAAR,YAAA+J,EAAe,iBAAf,MAAAE,EAAA,KAAAF,GAAgC,CAC7C,EACAxK,EAAA,IAACtB,EAAA,CACC,KAAK,eACL,OAAQue,EACR,QAAS1U,EAAE,gCAAgC,EAC3C,kBAAiB,CACf,WAAY,EACd,EACA,SAAU,GAACuC,EAAArK,GAAA,aAAAmK,EAAAnK,EAAQ,OAAM,eAAd,MAAAqK,EAAA,KAAAF,GAA6B,CAC1C,EACC5K,EAAA,IAAAuF,EAAA,CAAU,YAAY,WAAW,UAAU,mDAAmD,EAE/FvF,EAAA,IAACtB,EAAA,CACC,KAAK,qBACL,OAAQwe,EACR,QAAS3U,EAAE,kCAAkC,EAC7C,kBAAiB,CACf,WAAY,EACd,EACA,SAAU,GAAC0C,EAAAxK,GAAA,aAAAsK,EAAAtK,EAAQ,OAAM,eAAd,MAAAwK,EAAA,KAAAF,GAA6B,CAC1C,EAEA/K,EAAA,IAACtB,EAAA,CACC,KAAK,uBACL,OAAQye,EACR,QAAS5U,EAAE,kCAAkC,EAC7C,kBAAiB,CACf,WAAY,EACd,EACA,SAAU,GAACsV,GAAAC,EAAArd,GAAA,YAAAA,EAAQ,QAAR,YAAAqd,EAAe,cAAf,MAAAD,EAAA,KAAAC,GAA6B,CAC1C,EACA9d,EAAA,IAACtB,EAAA,CACC,KAAK,YACL,OAAQ0e,EACR,QAAS7U,EAAE,6BAA6B,EACxC,kBAAiB,CACf,WAAY,EACd,EACA,SAAU,GAACwV,GAAAC,EAAAvd,GAAA,YAAAA,EAAQ,QAAR,YAAAud,EAAe,YAAf,MAAAD,EAAA,KAAAC,GAA2B,CACxC,EACChe,EAAA,IAAAuF,EAAA,CAAU,YAAY,WAAW,UAAU,mDAAmD,EAC/FvF,EAAA,IAACtB,EAAA,CACC,KAAK,kBACL,OAAQ2e,EACR,QAAS9U,EAAE,8BAA8B,EACzC,kBAAiB,CACf,WAAY,EACd,EACA,SAAU,GAAC0V,GAAAC,EAAAzd,GAAA,YAAAA,EAAQ,QAAR,YAAAyd,EAAe,aAAf,MAAAD,EAAA,KAAAC,GAA4B,CACzC,EACAle,EAAA,IAACtB,EAAA,CACC,KAAK,kBACL,OAAQ4e,EACR,QAAS/U,EAAE,8BAA8B,EACzC,kBAAiB,CACf,WAAY,EACd,EACA,SAAU,GAAC4V,GAAAC,EAAA3d,GAAA,YAAAA,EAAQ,QAAR,YAAA2d,EAAe,YAAf,MAAAD,EAAA,KAAAC,GAA2B,CACxC,EACCpe,EAAA,IAAAuF,EAAA,CAAU,YAAY,WAAW,UAAU,mDAAmD,EAE/FvF,EAAA,IAAC2c,GAAA,CACC,OAAAlc,EACA,QAAS8H,EAAE,mCAAmC,EAC9C,OAAQiV,EACR,eAAgB,CACd,WAAY,EACd,CAAA,CACF,EACAxd,EAAA,IAACtB,EAAA,CACC,KAAK,SACL,QAAS6J,EAAE,+BAA+B,EAC1C,OAAQgV,EACR,kBAAiB,CACf,WAAY,EACd,EACA,SAAU,GAACc,IAAAC,GAAA7d,GAAA,YAAAA,EAAQ,QAAR,YAAA6d,GAAe,cAAf,MAAAD,GAAA,KAAAC,IAA6B,CAC1C,CAAA,EACF,CAAA,CAAA,CAGN,CCzLA,SAASC,GAAc3f,EAA4B,CAC3C,KAAA,CAAE,GAAMyN,IAER,CAACmS,EAAMC,CAAO,EAAIjd,WAAS,CAC/B,KAAM,GACN,KAAM,EAAA,CACP,EACK,CAACkd,EAAcC,CAAe,EAAInd,WAAkB,EAAK,EAE/DG,EAAAA,UAAU,IAAM,OACd,GAAI/C,GAAA,MAAAA,EAAO,OAAQ,CACX,KAAA,CAAE,KAAMggB,EAAM,OAAAC,CAAA,GAAWve,EAAA1B,EAAM,SAAN,YAAA0B,EAAc,cAAc,QAErD,CAAE,KAAAyZ,EAAM,GAAAC,CAAO,EAAApb,EAAM,OAAO,MAAM,UAClCwK,EAAOxK,EAAM,OAAO,MAAM,IAAI,YAAYmb,EAAMC,EAAI,GAAG,EACrDyE,EAAA,CACN,KAAAG,EACA,KAAAxV,CAAA,CACD,EACDuV,EAAgBE,IAAW,QAAQ,CACrC,CAAA,EACC,CAACjgB,GAAA,YAAAA,EAAO,MAAM,CAAC,EAElB,SAASkgB,EAAaC,EAAY,CAChCA,EAAM,eAAe,EACrBngB,GAAA,MAAAA,EAAO,UAAU4f,EAAK,KAAMA,EAAK,KAAME,EACzC,CAGE,OAAA1e,EAAA,IAAC,OAAI,UAAU,oKACb,gBAAC,OAAK,CAAA,UAAU,iDAAiD,SAAU8e,EACzE,SAAA,CAAA9e,MAAC6E,GAAM,CAAA,UAAU,WACd,SAAA,EAAE,yBAAyB,EAC9B,QACC,MAAI,CAAA,UAAU,4GACb,SAAC7E,MAAA,MAAA,CAAI,UAAU,4EACb,SAAAA,EAAA,IAAC0E,EAAA,CACC,KAAK,OACL,MAAO8Z,EAAK,KACZ,SAAQ,GACR,UAAU,gBACV,YAAY,OACZ,SAAejQ,GAAAkQ,EAAQ,CAAE,GAAGD,EAAM,KAAMjQ,EAAE,OAAO,MAAO,CAAA,GAE5D,CACF,CAAA,QACC1J,GAAM,CAAA,UAAU,WAAY,SAAA,EAAE,yBAAyB,EAAE,QACzD,MAAI,CAAA,UAAU,yFACb,SAAC3E,EAAA,KAAA,MAAA,CAAI,UAAU,4EACb,SAAA,CAAAF,EAAA,IAAC0E,EAAA,CACC,KAAK,MACL,MAAO8Z,EAAK,KACZ,SAAQ,GACR,UAAU,iBACV,SAAejQ,GAAAkQ,EAAQ,CAAE,GAAGD,EAAM,KAAMjQ,EAAE,OAAO,MAAO,CAAA,CAC1D,EACAvO,EAAAA,IAAC,OAAK,CAAA,UAAU,kIACd,SAAAA,EAAA,IAACqU,GAAc,UAAU,iDAAiD,KAAK,MAAA,CAAO,CACxF,CAAA,CAAA,CAAA,CACF,CACF,CAAA,EACAnU,EAAAA,KAAC,MAAI,CAAA,UAAU,yDACb,SAAA,CAACF,EAAA,IAAA6E,GAAA,CAAO,SAAE,EAAA,iCAAiC,CAAE,CAAA,EAC7C7E,EAAA,IAAC2F,GAAA,CACC,QAAS+Y,EACT,gBAAkBnQ,GAAM,CACtBoQ,EAAgBpQ,CAAC,CACnB,CAAA,CACF,CAAA,EACF,EACAvO,EAAAA,IAACK,GAAO,KAAK,SAAS,UAAU,kCAC7B,SAAA,EAAE,iCAAiC,EACtC,CAAA,CACF,CAAA,CACF,CAAA,CAEJ,CCxEA,SAAS2e,GAAcpgB,EAA4B,CAC3C,KAAA,CAAE,GAAMyN,IAGZ,OAAAnM,EAAA,KAAC,MAAI,CAAA,UAAU,gOACb,SAAA,CAAAF,EAAA,IAAC,IAAA,CACC,KAAMpB,GAAA,YAAAA,EAAO,KACb,OAAO,SACP,IAAI,sBACJ,UAAU,yDAET,SAAAqgB,EAAAA,SAASrgB,GAAA,YAAAA,EAAO,KAAM,CACrB,OAAQ,GACR,SAAU,GAAA,CACX,CAAA,CACH,GACCA,GAAA,YAAAA,EAAO,OAAQoB,EAAAA,IAACuF,GAAU,YAAY,WAAW,UAAU,gBAAgB,EAC5ErF,EAAAA,KAAC,MAAI,CAAA,UAAU,qCACb,SAAA,CAAAF,EAAA,IAACtB,EAAA,CACC,KAAK,SACL,QAAS,EAAE,0BAA0B,EACrC,OAAQ,IAAM,CACZE,GAAA,MAAAA,EAAO,QACT,EACA,eAAgB,CAAE,WAAY,EAAG,CAAA,CACnC,EACAoB,EAAA,IAACtB,EAAA,CACC,KAAK,SACL,QAAS,EAAE,4BAA4B,EACvC,OAAQ,IAAM,CACZE,GAAA,MAAAA,EAAO,SACT,EACA,eAAgB,CAAE,WAAY,EAAG,CAAA,CACnC,CAAA,EACF,CACF,CAAA,CAAA,CAEJ,CCtCA,SAAS6L,GAAe,CAAE,OAAAhK,EAAQ,SAAAzB,GAAiC,CACjE,KAAM,CAACkgB,EAAUC,CAAW,EAAI3d,WAAS,EAAK,EAExCod,EAAOpS,EAAAA,QAAQ,IAAM,CACzB,KAAM,CAAE,KAAMoS,CAAAA,EAASne,EAAO,cAAc,MAAM,EAC3Cme,OAAAA,CAAA,EACN,CAACne,CAAM,CAAC,EAEL+I,EAAaC,EAAY,YAAA,CAAC,CAAE,OAAAhJ,KACfA,EAAO,SAAS,MAAM,EAEtC,CAAE,CAAA,EAEC2e,EAAY,CAACC,EAAajW,EAAesV,IAA2B,CACxEje,EACG,MAAM,EACN,gBAAgB,MAAM,EACtB,cAAc,CACb,KAAM,OACN,KAAA2I,EACA,MAAO,CACL,CACE,KAAM,OACN,MAAO,CACL,KAAMiW,EACN,OAAQX,EAAe,SAAW,EACpC,CACF,CACF,CAAA,CACD,EACA,QAAQ,CAAE,KAAMW,CAAK,CAAA,EACrB,MAAM,EACN,MACHF,EAAY,EAAK,CAAA,EAGbG,EAAY7V,EAAAA,YAAY,IAAM,CAC3BhJ,EAAA,QAAQ,gBAAgB,MAAM,EAAE,YAAY,QAAQ,MAC3D0e,EAAY,EAAK,CAAA,EAChB,CAAC1e,CAAM,CAAC,EAEX,OAEIT,MAAA6J,EAAAA,SAAA,CAAA,SAAA7J,EAAA,IAAC4J,EAAA,WAAA,CACC,OAAAnJ,EACA,WAAA+I,EACA,aAAc,CACZ,cAAe,CACb,UAAW,CAAC,CAAE,KAAM,OAAQ,QAAS,GAAO,CAC9C,EACA,UAAW,eACX,OAAQ,CAAC,GAAI,EAAE,EACf,OAAQ,KACR,SAAU,IAAM,CACd2V,EAAY,EAAK,CACnB,CACF,EAEC,SAAAngB,oBAEO,CAAA,EAGFgB,EAAAA,IAAA6J,EAAA,SAAA,CACG,WAEM7J,EAAAA,IAAAue,GAAA,CAAc,UAAAa,EAAsB,OAAA3e,CAAgB,CAAA,EAGrDT,EAAA,IAACgf,GAAA,CACC,OAAAve,EACA,QAAS6e,EACT,OAAQ,IAAM,CACZH,EAAY,EAAI,CAClB,EACA,KAAAP,CAAA,CAAA,EAGV,CAAA,CAGV,CAAA,CAAA,CAEJ,CClFA,MAAMtC,GAAe,CACnB,SAAU,OACV,OAAQ,GACR,SAAU,SACV,eAAgB,yBAClB,EAEA,SAASC,GAAM,CAAE,KAAAvO,EAAM,SAAAhP,EAAU,OAAAyB,GAAe,OAC9C,MAAMb,EAAOoO,EAAK,UAElB,OAAKpO,EAKFiK,EAAAA,IAAAA,EAAAA,SAAA,CACE,SAAAmE,EAAK,OAAS,UAERhO,EAAA,IAAAuF,EAAA,CAAU,YAAY,WAAW,UAAU,kDAAmD,CAAA,EAG/FvF,EAAA,IAACJ,EAAA,CACE,GAAGoO,EAAK,eACT,OAAAvN,EACA,SAAUzB,KAAYsB,EAAA0N,GAAA,YAAAA,EAAM,iBAAN,YAAA1N,EAAsB,SAAA,CAGtD,CAAA,CAAA,EAhBSN,EAAA,IAAA6J,WAAA,CAAA,CAAA,CAkBb,CAEA,SAAS0V,GAAYze,EAAW,CACvB,OAAAA,EAAK,KAAK,OAAS,OAC5B,CAEA,SAAS0e,GAAY1e,EAAW,CACvB,OAAAA,EAAK,KAAK,OAAS,OAC5B,CAEA,SAAS6J,GAAgB/L,EAAyB,CAC1C,KAAA,CAAE,KAAAmN,GAASM,IAEX7C,EAAa,CAAC,CAAE,OAAA/I,KAAkB,CACtC,KAAM,CAAE,UAAAmZ,CAAc,EAAAnZ,EAAO,KAAK,MAC5B,CAAE,MAAA+b,EAAO,GAAAxC,CAAO,EAAAJ,EACtB,IAAI6F,EAAU,GAEP,OAAAhf,EAAA,KAAK,MAAM,IAAI,aAAa+b,EAAM,IAAKxC,EAAKlZ,GAAc,CAC3D,GAAAye,GAAYze,CAAI,EACR,OAAA2e,EAAA,GACH,EACT,CACD,EAEMA,CAAA,EAGH1R,EAAQvB,EAAAA,QAAQ,IAChB5N,EAAM,SACD,GAEFua,GAAeva,EAAM,MAAM,EAEjC,CAACA,EAAM,SAAUA,EAAM,OAAQmN,CAAI,CAAC,EAEvC,OAEI/L,MAAA6J,EAAAA,SAAA,CAAA,SAAA7J,EAAA,IAAC0f,EAAA,WAAA,CACC,WAAAlW,EACA,OAAQ5K,GAAA,YAAAA,EAAO,OACf,aAAA0d,GAEC,SAAOvO,GAAA,MAAAA,EAAA,OAED/N,EAAA,IAAA,MAAA,CAAI,UAAU,oQACb,SAAAA,EAAAA,IAAC,MAAI,CAAA,UAAU,iJACZ,SAAA+N,GAAA,YAAAA,EAAO,IAAI,CAACC,EAAW7P,IAEpB6B,EAAA,IAACuc,GAAA,CAEC,KAAAvO,EACA,SAAUpP,EAAM,SAChB,OAAQA,EAAM,MAAA,EAHT,oBAAoBT,CAAG,EAAA,EAOpC,CAAA,CACF,CAAA,EAGE6B,EAAAA,IAAA6J,EAAAA,SAAA,CAAA,CAAA,CAAA,CAGZ,CAAA,CAAA,CAEJ,CAEA,SAASgB,GAAgBjM,EAAyB,CAC1C,KAAA,CAAE,KAAAmN,GAASM,IAEX7C,EAAa,CAAC,CAAE,OAAA/I,KAAkB,CACtC,KAAM,CAAE,UAAAmZ,CAAc,EAAAnZ,EAAO,KAAK,MAC5B,CAAE,MAAA+b,EAAO,GAAAxC,CAAO,EAAAJ,EACtB,IAAI+F,EAAU,GAEP,OAAAlf,EAAA,KAAK,MAAM,IAAI,aAAa+b,EAAM,IAAKxC,EAAKlZ,GAAc,CAC3D,GAAA0e,GAAY1e,CAAI,EACR,OAAA6e,EAAA,GACH,EACT,CACD,EAEMA,CAAA,EAGH5R,EAAQvB,EAAAA,QAAQ,IAChB5N,EAAM,SACD,GAGFya,GAAeza,EAAM,MAAM,EAEjC,CAACA,EAAM,OAAQA,EAAM,SAAUmN,CAAI,CAAC,EAEvC,OAEI/L,MAAA6J,EAAAA,SAAA,CAAA,SAAA7J,EAAA,IAAC0f,EAAA,WAAA,CACC,WAAAlW,EACA,OAAQ5K,GAAA,YAAAA,EAAO,OACf,aAAA0d,GAEC,SAAOvO,GAAA,MAAAA,EAAA,OAED/N,EAAA,IAAA,MAAA,CAAI,UAAU,oQACb,SAAAA,EAAAA,IAAC,MAAI,CAAA,UAAU,iJACZ,SAAA+N,GAAA,YAAAA,EAAO,IAAI,CAACC,EAAW7P,IAEpB6B,EAAA,IAACuc,GAAA,CAEC,KAAAvO,EACA,SAAUpP,EAAM,SAChB,OAAQA,EAAM,MAAA,EAHT,oBAAoBT,CAAG,EAAA,EAOpC,CAAA,CACF,CAAA,EAGE6B,EAAAA,IAAA6J,EAAAA,SAAA,CAAA,CAAA,CAAA,CAGZ,CAAA,CAAA,CAEJ,CChKgB,SAAAQ,GAAkB,CAAE,OAAA5J,GAAe,CAC3C,KAAA,CAAE,GAAM4L,IAER7C,EAAaC,cAAY,IAAMhJ,EAAO,SAASmf,GAAY,IAAI,EAAG,CAACnf,CAAM,CAAC,EAC1EiJ,EAAWD,cAAY,IAAMlJ,GAAWqf,GAAY,KAAMnf,CAAM,EAAG,CAACA,CAAM,CAAC,EAC3Eof,EAAepW,EAAA,YAAY,IAAMhJ,EAAO,QAAQ,QAAQ,aAAe,EAAA,IAAA,EAAO,CAACA,CAAM,CAAC,EACtFqf,EAAcrW,EAAA,YAAY,IAAMhJ,EAAO,QAAQ,QAAQ,YAAc,EAAA,IAAA,EAAO,CAACA,CAAM,CAAC,EACpFsf,EAAYtW,EAAA,YAAY,IAAMhJ,EAAO,QAAQ,QAAQ,UAAY,EAAA,IAAA,EAAO,CAACA,CAAM,CAAC,EAGpF,OAAAT,EAAA,IAAC4J,EAAA,WAAA,CACC,UAAU,sBACV,OAAAnJ,EACA,WAAA+I,EACA,aAAc,CACZ,cAAe,CACb,UAAW,CAAC,CAAE,KAAM,OAAQ,QAAS,GAAO,CAC9C,EACA,UAAW,eACX,OAAQ,CAAC,GAAI,EAAE,EACf,OAAQ,IAIV,EAEA,SAAAtJ,EAAA,KAAC,MAAI,CAAA,UAAU,oQACb,SAAA,CAAAF,EAAA,IAACtB,EAAA,CACC,OAAQmhB,EACR,KAAK,gBACL,QAAS,EAAE,sCAAsC,CAAA,CACnD,EACA7f,EAAA,IAACtB,EAAA,CACC,OAAQohB,EACR,KAAK,iBACL,QAAS,EAAE,qCAAqC,CAAA,CAClD,EACA9f,EAAA,IAACtB,EAAA,CACC,OAAQqhB,EACR,KAAK,eACL,QAAS,EAAE,gCAAgC,CAAA,CAC7C,EACA/f,EAAA,IAACtB,EAAA,CACC,OAAQgL,EACR,KAAK,SACL,QAAS,EAAE,iCAAiC,CAAA,CAC9C,CAAA,EACF,CAAA,CAAA,CAGN,CClDa,MAAAsL,GAAOgL,SAAW,OAAoB,CACjD,YAAa,OACJ,MAAA,CACL,IAAG1f,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,OAAQ,CAAC,CAAE,OAAAG,EAAQ,EAAA8H,MAAc,CAC/B,UAAW7J,EACX,eAAgB,CACd,OAAQ,IAAM+B,EAAO,SAAS,WAAW,EACzC,SAAU,IAAMA,EAAO,SAAS,MAAM,GAAK,GAC3C,SAAU,CAACA,EAAO,IAAA,EAAM,WAAW,EACnC,KAAM,OACN,aAAc,CAAC,MAAO,GAAG,EACzB,QAAS8H,EAAE,qBAAqB,CAClC,CAAA,EACF,CAEJ,CACF,CAAC,EChBY2M,GAAS+K,WAAa,OAAsB,CACvD,YAAa,OACJ,MAAA,CACL,IAAG3f,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,OAAO,CAAE,OAAAG,EAAQ,EAAA8H,GAAwD,CAChE,MAAA,CACL,UAAW7J,EACX,eAAgB,CACd,OAAQ,IAAM+B,EAAO,SAAS,aAAa,EAC3C,SAAU,IAAMA,EAAO,SAAS,QAAQ,GAAK,GAC7C,SAAU,CAACA,EAAO,IAAA,EAAM,aAAa,EACrC,aAAc,CAAC,MAAO,GAAG,EACzB,KAAM,SACN,QAAS8H,EAAE,uBAAuB,CACpC,CAAA,CAEJ,CAAA,CAEJ,CACF,CAAC,EClBY4M,GAAY+K,cAAgB,OAAyB,CAChE,YAAa,OACJ,MAAA,CACL,IAAG5f,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,OAAO,CAAE,OAAAG,EAAQ,EAAA8H,GAAU,CAClB,MAAA,CACL,UAAW7J,EACX,eAAgB,CACd,OAAQ,IAAM+B,EAAO,SAAS,gBAAgB,EAC9C,SAAU,IAAMA,EAAO,SAAS,WAAW,GAAK,GAChD,SAAU,CAACA,EAAO,IAAA,EAAM,gBAAgB,EACxC,KAAM,YACN,aAAc,CAAC,MAAO,GAAG,EACzB,QAAS8H,EAAE,0BAA0B,CACvC,CAAA,CAEJ,CAAA,CAEJ,CACF,CAAC,ECrBY4X,GAASC,SAAa,OAAsB,CACvD,YAAa,OACJ,MAAA,CACL,IAAG9f,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,OAAQ,CAAC,CAAE,OAAAG,EAAQ,EAAA8H,MAAc,CAC/B,UAAW7J,EACX,eAAgB,CACd,OAAQ,IAAM+B,EAAO,SAAS,aAAa,EAC3C,SAAU,IAAMA,EAAO,SAAS,QAAQ,GAAK,GAC7C,SAAU,CAACA,EAAO,IAAA,EAAM,aAAa,EACrC,KAAM,gBACN,aAAc,CAAC,QAAS,MAAO,GAAG,EAClC,QAAS8H,EAAE,uBAAuB,CACpC,CAAA,EACF,CAEJ,CACF,CAAC,ECjBY2N,GAAOmK,SAAW,OAAoB,CACjD,YAAa,OACJ,MAAA,CACL,IAAG/f,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,OAAQ,CAAC,CAAE,OAAAG,EAAQ,EAAA8H,MAAS,CAC1B,UAAW7J,EACX,eAAgB,CACd,OAAQ,IAAM+B,EAAO,SAAS,WAAW,EACzC,SAAU,IAAMA,EAAO,SAAS,MAAM,GAAK,GAC3C,SAAU,CAACA,EAAO,IAAA,EAAM,WAAW,EACnC,KAAM,OACN,aAAc,CAAC,MAAO,GAAG,EACzB,QAAS8H,EAAE,qBAAqB,CAClC,CAAA,EACF,CAEJ,CACF,CAAC,ECZD,IAAI+X,EACAC,GACJ,MAAMC,OAAuB,IACvBC,OAAoB,IAcnB,SAASC,IAAW,CAClB,OAAAJ,CACT,CAKO,SAASK,GAAgBC,EAA0B,CACpD,GAAA,CAACN,GAAe,CAACC,GAAoB,CACjC,MAAAM,EAASD,EAAK,OAAO,OACxB9R,GAAiC,CAAC,CAACA,GAASA,KAASgS,GAAA,aAAA,EAElDC,EAAQH,EAAK,UAAU,OAC1B7U,GAAkC,CAAC,CAACA,GAAQA,KAAQiV,GAAA,gBAAA,EAElC,OAAAT,GAAAU,GAAA,kBAAkB,CAAE,OAAAJ,EAAQ,MAAAE,CAAA,CAAO,EAAE,KAAMG,GAAM,CACtDZ,EAAAY,CAAA,CACf,EACMX,EACT,CAEA,GAAIA,GACK,OAAAA,EAEX,CAMA,eAAsBY,GAAUrS,EAAqB,CACnD,OACEwR,GACG,CAACA,EAAY,gBAAA,EAAkB,SAASxR,CAAK,GAC7C,CAAC2R,GAAc,IAAI3R,CAAK,GACxBA,KAASgS,GAAAA,eAEZL,GAAc,IAAI3R,CAAK,EACjB,MAAAwR,EAAY,UAAUxR,CAAK,EACjC2R,GAAc,OAAO3R,CAAK,EACnB,IAGF,EACT,CAMA,eAAsBsS,GAAaC,EAA2B,CAC5D,OACEf,GACG,CAACA,EAAY,mBAAA,EAAqB,SAASe,CAAQ,GACnD,CAACb,GAAiB,IAAIa,CAAQ,GAC9BA,KAAYL,GAAAA,kBAEfR,GAAiB,IAAIa,CAAQ,EACvB,MAAAf,EAAY,aAAae,CAAQ,EACvCb,GAAiB,OAAOa,CAAQ,EACzB,IAGF,EACT,CAMA,eAAsBC,GAAgB,CACpC,IAAA3H,EACA,KAAA/J,EACA,aAAA2R,EACA,gBAAAC,CACF,EAKG,CACD,MAAMC,EAAaC,eAAa/H,KAAa7Y,EAAK,KAAK,OAAS8O,CAAI,EAE9DiR,EAAS,CACb,GAAGY,EAAW,OAAaE,EAAM,KAAK,MAAM,KAAqB,EACjEJ,CAAA,EAEIK,EAAY,CAChB,GAAGH,EAAW,OAAaE,EAAM,KAAK,MAAM,QAA2B,EACvEH,CAAA,EAGGlB,EAKH,MAAM,QAAQ,IAAI,CAChB,GAAGO,EAAO,QAAiB/R,GAAAqS,GAAUrS,CAAK,CAAC,EAC3C,GAAG8S,EAAU,QAAQP,GAAY,CAAC,CAACA,GAAYD,GAAaC,CAAQ,CAAC,CAAA,CACtE,EANK,MADSV,GAAgB,CAAE,UAAAiB,EAAW,OAAAf,CAAQ,CAAA,CASxD,CCtHA,SAASgB,GAAe,CACtB,IAAAlI,EACA,KAAA/J,EACA,aAAA2R,EACA,gBAAAC,CACF,EAKG,CACD,MAAMM,EAA4B,CAAA,EAIvB,OAFQJ,eAAa/H,KAAa7Y,EAAK,KAAK,OAAS8O,CAAI,EAEzD,QAAS+R,GAAU,CACxB,IAAA5H,EAAO4H,EAAM,IAAM,EACnBN,EAAWM,EAAM,KAAK,MAAM,UAAYH,EAC5C,MAAM1S,EAAQ6S,EAAM,KAAK,MAAM,OAASJ,EAElCjB,EAAcI,KAEpB,GAAI,CAACJ,EACH,OAEGA,EAAY,mBAAqB,EAAA,SAASe,CAAQ,IAC1CA,EAAA,aAGP,MAAAU,EAAezB,EAAY,gBAAA,EAAkB,SAASxR,CAAK,EAC7DA,EACAwR,EAAY,gBAAgB,EAAE,CAAC,EAE7B0B,EAAS1B,EAAY,iBAAiBqB,EAAM,KAAK,YAAa,CAClE,KAAMN,EACN,MAAOU,CAAA,CACR,EAED,UAAWE,KAAQD,EAAQ,CACzB,UAAWE,KAASD,EAAM,CAClB,MAAAjI,EAAKD,EAAOmI,EAAM,QAAQ,OAE1BC,EAAaC,EAAA,WAAW,OAAOrI,EAAMC,EAAI,CAC7C,MAAO,UAAUkI,EAAM,KAAK,EAAA,CAC7B,EAEDJ,EAAY,KAAKK,CAAU,EAEpBpI,EAAAC,CACT,CAEQD,GAAA,CACV,CAAA,CACD,EAEMsI,gBAAc,OAAO1I,EAAKmI,CAAW,CAC9C,CAEO,SAASQ,GAAY,CAC1B,KAAA1S,EACA,gBAAA4R,EACA,aAAAD,CACF,EAIG,CACK,MAAAgB,EAA2B,IAAIC,SAAO,CAC1C,IAAK,IAAIC,EAAA,UAAU,OAAO,EAE1B,KAAK/E,EAAM,CAET,MAAMgF,CAAsC,CAC1C,aAAc,CACZ,KAAK,gBAAgB,CACvB,CAEA,QAAS,CACP,KAAK,uBAAuB,CAC9B,CAEA,SAAU,CAAC,CAGX,MAAM,iBAAkB,CAChB,MAAA/I,EAAM+D,EAAK,MAAM,IACvB,MAAM4D,GAAgB,CAAE,IAAA3H,EAAK,KAAA/J,EAAM,gBAAA4R,EAAiB,aAAAD,EAAc,EAClE,MAAM9H,EAAKiE,EAAK,MAAM,GAAG,QAAQ,6BAA8B,EAAI,EACnEA,EAAK,SAASjE,CAAE,CAClB,CAIA,MAAM,wBAAyB,CAC7B,MAAMgI,EAAaC,EAAA,aACjBhE,EAAK,MAAM,IACX5c,GAAQA,EAAK,KAAK,OAAS8O,CAAA,EAiB7B,IAXmB,MAAM,QAAQ,IAC/B6R,EAAW,QAAiBE,GAAA,CAC1BR,GAAUQ,EAAM,KAAK,MAAM,KAAK,EAChCP,GAAaO,EAAM,KAAK,MAAM,QAAQ,CAAA,CACvC,CAAA,GAEiC,SAAS,EAAI,EAK3B,CACpB,MAAMlI,EAAKiE,EAAK,MAAM,GAAG,QAAQ,6BAA8B,EAAI,EACnEA,EAAK,SAASjE,CAAE,CAClB,CACF,CACF,CAEA,OAAO,IAAIiJ,CACb,EAEA,MAAO,CACL,KAAM,CAACC,EAAG,CAAE,IAAAhJ,KACHkI,GAAe,CACpB,IAAAlI,EACA,KAAA/J,EACA,gBAAA4R,EACA,aAAAD,CAAA,CACD,EAEH,MAAO,CAACqB,EAAaC,EAAeC,EAAUC,IAAa,CACzD,MAAMC,EAAcF,EAAS,UAAU,MAAM,OAAO,KAAK,KACnDG,EAAcF,EAAS,UAAU,MAAM,OAAO,KAAK,KACnDG,EAAWxB,EAAA,aACfoB,EAAS,IACThiB,GAAQA,EAAK,KAAK,OAAS8O,CAAA,EAEvBuT,EAAWzB,EAAA,aACfqB,EAAS,IACTjiB,GAAQA,EAAK,KAAK,OAAS8O,CAAA,EAGvBwT,EACFR,EAAY,aAGV,CAACI,EAAaC,CAAW,EAAE,SAASrT,CAAI,GAEzCuT,EAAS,SAAWD,EAAS,QAI7BN,EAAY,MAAM,KAAMS,GAEvBA,EAAK,OAAS,QACXA,EAAK,KAAO,QACZH,EAAS,KAAMpiB,GAEdA,EAAK,KAAOuiB,EAAK,MACdviB,EAAK,IAAMA,EAAK,KAAK,UAAYuiB,EAAK,EAE5C,CAEJ,GAGH,OACET,EAAY,QAAQ,4BAA4B,GAC7CQ,EAEIvB,GAAe,CACpB,IAAKe,EAAY,IACjB,KAAAhT,EACA,gBAAA4R,EACA,aAAAD,CAAA,CACD,EAGIsB,EAAc,IAAID,EAAY,QAASA,EAAY,GAAG,CAC/D,CACF,EAEA,MAAO,CACL,YAAYliB,EAAO,CACV,OAAA6hB,EAAY,SAAS7hB,CAAK,CACnC,CACF,CAAA,CACD,EAEM,OAAA6hB,CACT,CCtLA,SAASe,GAAsB,CAAE,OAAAlkB,EAAQ,UAAAwiB,EAAW,GAAGhjB,GAAgB,CAC/D,MAAA2kB,EAAWlC,GAAqB,CACpCjiB,EAAOiiB,CAAQ,CAAA,EAGXN,EAAQvU,EAAAA,QAAQ,IACboV,GAAA,YAAAA,EAAW,IAAKP,IAGd,CACL,MAHY/jB,GAAyB+jB,CAAQ,GAAKA,EAKlD,SAAAA,CAAA,IAGH,CAACO,CAAS,CAAC,EAEd,cACGtf,EACC,CAAA,SAAA,CAAAtC,MAACwC,EAAoB,CAAA,SAAU5D,GAAA,YAAAA,EAAO,SAAU,QAAO,GACrD,SAAAoB,EAAA,IAACtB,EAAA,CACC,QAASE,GAAA,YAAAA,EAAO,QAChB,SAAUA,GAAA,YAAAA,EAAO,SACjB,KAAMA,GAAA,YAAAA,EAAO,IAAA,CAAA,EAEjB,QACC4E,EAAoB,CAAA,UAAU,kBAC5B,SAAOud,GAAA,YAAAA,EAAA,IAAK/S,SAERrK,EAAiD,CAAA,QAAS,IAAM4f,EAAQvV,EAAK,QAAQ,EACpF,SAAAhO,EAAAA,IAAC,MAAI,CAAA,UAAU,gCACZ,SAAKgO,EAAA,KACR,CAAA,GAHqB,aAAaA,EAAK,KAAK,EAI9C,GAGN,CACF,CAAA,CAAA,CAEJ,CCjDa,MAAAwV,GAAYC,YAAa,OAAyB,CAC7D,YAAa,OACJ,MAAA,CACL,IAAGnjB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,UAAW,CAAC,EACZ,OAAQ,CAAC,CAAE,OAAAG,EAAQ,EAAA8H,EAAG,UAAAiL,KAAqB,WACzC,MAAMoO,GAAYtX,GAAAhK,EAAAkT,GAAA,YAAAA,EAAW,UAAX,YAAAlT,EAAoB,YAApB,MAAAgK,EAA+B,QAASE,EAAAgJ,GAAA,YAAAA,EAAW,UAAX,YAAAhJ,EAAoB,UAAYnN,GAEnF,MAAA,CACL,UAAWimB,GACX,eAAgB,CACd,OAAQ,CAACjC,EAAW,OAAS5gB,EAAO,SAAS,aAAa,CACxD,SAAA4gB,CAAA,CACD,EACD,SAAU,IAAM5gB,EAAO,SAAS,WAAW,GAAK,GAChD,SAAU,CAACA,EAAO,IAAA,EAAM,gBAAgB,EACxC,KAAM,QACN,QAAS8H,EAAE,0BAA0B,EACrC,UAAAqZ,CACF,CAAA,CAEJ,CAAA,CAEJ,EACA,uBAAwB,OACf,MAAA,CACL,KAAIthB,EAAA,KAAK,SAAL,YAAAA,EAAA,aAAmB,CAAC,EACxBgiB,GAAY,CACV,KAAM,KAAK,KACX,gBAAiB,KACjB,aAAc,KAAK,QAAQ,YAAA,CAC5B,CAAA,CAEL,CACF,CAAC,ECZD,SAASoB,GAAiB9kB,EAAc,WACtC,KAAM,CAAE,EAAG,KAAAmN,CAAK,EAAIM,EAAU,EAExBsX,EAASnX,EAAAA,QAAQ,IAAM,OACrB,MAAAiG,GAAYnS,EAAA1B,GAAA,YAAAA,EAAO,QAAP,YAAA0B,EAAc,KAAMkS,GAAWA,EAAE,YAE/C,OAAAC,GAAQ,CAACA,EAAK,QACT,CACL,GAAGA,CAAA,EAGY,CACjB,MAAO7T,EAAM,QACb,KAAM,EAAE,mCAAmC,EAC3C,SAAU,IAAM,GAChB,SAAU,GACV,OAAQ,IAAMA,EAAM,OAAO,QAAQ,MAAM,EAAE,gBAAgB,EAAE,IAAI,CAAA,CAGlE,EAAA,CAAC,EAAGmN,EAAMnN,CAAK,CAAC,EAEnB,cACG0D,EACC,CAAA,SAAA,CAAAtC,MAACwC,EAAoB,CAAA,SAAU5D,GAAA,YAAAA,EAAO,SAAU,QAAO,GACrD,SAAAoB,EAAA,IAACI,GAAA,CACC,QAAOE,EAAAqjB,GAAA,YAAAA,EAAQ,OAAR,YAAArjB,EAAc,QAAS,EAAI,IAAGgK,EAAAqZ,GAAA,YAAAA,EAAQ,OAAR,YAAArZ,EAAc,MAAM,EAAG,EAAE,MAAQqZ,GAAA,YAAAA,EAAQ,KAC9E,QAAS/kB,GAAA,YAAAA,EAAO,QAChB,SAAUA,GAAA,YAAAA,EAAO,SACjB,KAAK,UAAA,CAAA,EAET,EACAoB,EAAAA,IAACwD,GAAoB,UAAU,kBAC5B,6BAAO,sBAAO,IAAI,CAACwK,EAAW/E,IAAU,CACjC,MAAA2a,EACF5V,EAAK,OAAS,EAAE,mCAAmC,EAAI,CAAA,EAAK,CAAE,WAAYA,EAAK,IAAK,EAExF,cACGnE,WACC,CAAA,SAAA,CAAA7J,MAAC6D,IAAyB,SAAS8f,GAAA,YAAAA,EAAQ,QAAS3V,EAAK,KAAM,QAASA,EAAK,OAC3E,SAAAhO,MAAC,OAAI,UAAU,gCAAgC,MAAA4jB,EAC5C,SAAA5V,EAAK,IACR,CAAA,EACF,EACCA,EAAK,OAAS,EAAE,mCAAmC,SAAMzJ,GAAsB,EAAA,CAAA,CAAA,EANnE0E,CAOf,CAEH,GACH,CACF,CAAA,CAAA,CAEJ,CCrEa,MAAA4a,GAAaC,aAAiB,OAA0B,CACnE,YAAa,OACJ,MAAA,CACL,IAAGxjB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,eAAgBlD,GAChB,OAAO,CAAE,OAAAqD,EAAQ,UAAA+S,EAAW,EAAAjL,GAAU,OACpC,KAAM,CAAE,WAAAsH,EAAa,IAAOpP,EAAO,kBAAoB,CAAA,EACjDsjB,EAAiBjU,KAAuBxP,EAAAkT,GAAA,YAAAA,EAAW,UAAX,YAAAlT,EAAoB,iBAAkB,CAAA,CAAE,EAChF0jB,EAAanU,EAAW,KAC3B2C,GAAWA,EAAE,OAAS,UAAA,EAGnBzE,EAAQgW,EAAe,IAAaE,IAAA,CACxC,OAAQ,IAAM,CACLxjB,EAAA,QAAQ,MAAM,EAAE,cAAcwjB,EAAK,KAAK,EAAE,KACnD,EACA,SAAU,IAAMxjB,EAAO,SAAS,YAAa,CAAE,WAAYwjB,EAAK,KAAO,CAAA,GAAK,GAC5E,SAAU,CAACxjB,EAAO,IAAM,EAAA,cAAcwjB,EAAK,KAAK,EAChD,MAAOA,EAAK,KACZ,KAAMA,EAAK,KACX,EAAA,EAEED,GAAcA,EAAW,QAAQ,YAAc,IACjDjW,EAAM,QAAQ,CACZ,OAAQ,IAAMtN,EAAO,MAAA,EAAQ,QAAQ,gBAAgB,EAAE,IAAI,EAC3D,SAAU,IAAM,GAChB,SAAU,GACV,KAAM8H,EAAE,mCAAmC,EAC3C,MAAOA,EAAE,2BAA2B,CAAA,CACrC,EAGG,MAAAvJ,EAAW+O,EAAM,OAAQyE,GAAWA,EAAE,QAAQ,EAAE,SAAWzE,EAAM,OAEhE,MAAA,CACL,UAAW2V,GACX,eAAgB,CACd,QAASnb,EAAE,2BAA2B,EACtC,SAAAvJ,EACA,MAAA+O,EACA,OAAAtN,CACF,CAAA,CAEJ,CAAA,CAEJ,CACF,CAAC,EC1BD,SAASyjB,GAActlB,EAAc,OAC7B,MAAA+kB,EAASnX,EAAAA,QAAQ,IAAM,OACrB,MAAAiG,GAAYnS,EAAA1B,GAAA,YAAAA,EAAO,QAAP,YAAA0B,EAAc,KAAMkS,GAAWA,EAAE,YAE/C,OAAAC,GAAQ,CAACA,EAAK,QACT,CACL,GAAGA,CAAA,EAGY,CACjB,MAAO7T,EAAM,QACb,MAAO,EACP,SAAU,IAAM,EAAA,CAEX,EACN,CAACA,CAAK,CAAC,EAEV,cACG0D,EACC,CAAA,SAAA,CAAAtC,MAACwC,EAAoB,CAAA,SAAU5D,GAAA,YAAAA,EAAO,SAAU,QAAO,GACrD,SAAAoB,EAAA,IAACI,GAAA,CACC,MAAOujB,GAAA,YAAAA,EAAQ,MACf,QAAS/kB,GAAA,YAAAA,EAAO,QAChB,SAAUA,GAAA,YAAAA,EAAO,SACjB,KAAK,UAAA,CAAA,EAET,EACAoB,EAAAA,IAACwD,GAAoB,UAAU,kBAC5B,6BAAO,sBAAO,IAAI,CAACwK,EAAW/E,IAAU,SACvC,cACGY,WACC,CAAA,SAAA,CAAA3J,EAAA,KAAC2D,GAAA,CACC,SAAS8f,GAAA,YAAAA,EAAQ,SAAU3V,EAAK,MAChC,QAASA,EAAK,OAEd,SAAA,CAAAhO,EAAAA,IAAC,OAAI,UAAW,yCAAyCgO,EAAK,KAAK,GAAK,WAAK,KAAM,CAAA,EAClF,CAAC,GAAC1N,EAAA0N,GAAA,YAAAA,EAAM,eAAN,MAAA1N,EAAoB,SACpBN,EAAA,IAAAyE,GAAA,CAAqB,UAAU,gBAC7B,UAAA6F,EAAA0D,GAAA,YAAAA,EAAM,eAAN,YAAA1D,EAAoB,IAAK0D,GAAc9P,GAAe8P,CAAI,GAAG,KAAK,KACrE,CAAA,CAAA,CAEJ,EACCA,EAAK,QAAU,GAAKhO,EAAAA,IAACuE,GAAsB,CAAA,CAAA,CAAA,CAAA,EAZ/B0E,CAaf,CAEH,GACH,CACF,CAAA,CAAA,CAEJ,CC5Ea,MAAAkb,GAAUC,UAAc,OAAuB,CAC1D,YAAa,OACJ,MAAA,CACL,IAAG9jB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,OAAQ,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EACzB,OAAO,CAAE,OAAAG,EAAQ,UAAA+S,EAAW,EAAAjL,GAAK,OAC/B,KAAM,CAAE,WAAAsH,EAAa,IAAOpP,EAAO,kBAAoB,CAAA,EACjD4jB,IAAS/jB,EAAAkT,EAAU,UAAV,YAAAlT,EAAmB,SAAU,CAAA,EACtC0jB,EAAanU,EAAW,KAC5B2C,GAAKA,EAAE,OAAS,UAAA,EAGZzE,EAAesW,EAAO,IAAcC,IAAA,CACxC,OAAQ,IAAM7jB,EAAO,SAAS,cAAc,CAAE,MAAA6jB,EAAO,EACrD,SAAU,IAAM7jB,EAAO,SAAS,UAAW,CAAE,MAAA6jB,CAAO,CAAA,GAAK,GACzD,SAAU,CAAC7jB,EAAO,MAAM,cAAc,CAAE,MAAA6jB,EAAO,EAC/C,MAAO/b,EAAE,mBAAmB+b,CAAK,UAAU,EAC3C,MAAAA,EACA,aAAc,CAAC,MAAO,MAAO,GAAGA,CAAK,EAAE,CACvC,EAAA,EAEEN,GAAcA,EAAW,QAAQ,YAAc,IACjDjW,EAAM,QAAQ,CACZ,OAAQ,IAAMtN,EAAO,SAAS,aAAa,EAC3C,SAAU,IAAMA,EAAO,SAAS,WAAW,GAAK,GAChD,SAAU,CAACA,EAAO,IAAA,EAAM,aAAa,EACrC,MAAO,EACP,MAAO8H,EAAE,0BAA0B,EACnC,aAAc,CAAC,MAAO,MAAO,GAAG,CAAA,CACjC,EAGG,MAAAvJ,EAAW+O,EAAM,OAAQyE,GAAWA,EAAE,QAAQ,EAAE,SAAWzE,EAAM,OAEhE,MAAA,CACL,UAAWmW,GACX,eAAgB,CACd,QAAS3b,EAAE,wBAAwB,EACnC,SAAAvJ,EACA,MAAA+O,EACA,OAAAtN,CACF,CAAA,CAEJ,CAAA,CAEJ,CACF,CAAC,EC1BD,SAAS8jB,GAAoB3lB,EAAkC,OACvD,MAAA+kB,EAASnX,EAAAA,QAAQ,IAAM,OACrB,MAAAiG,GAAYnS,EAAA1B,GAAA,YAAAA,EAAO,QAAP,YAAA0B,EAAc,KAAMkS,GAAWA,EAAE,YAC/C,OAAAC,GAAQ,CAACA,EAAK,QACT,CACL,GAAGA,EACH,KAAMA,EAAK,KAAOA,EAAK,KAAO7T,EAAM,IAAA,EAGrB,CACjB,MAAOA,GAAA,YAAAA,EAAO,QACd,KAAMA,EAAM,KACZ,SAAU,IAAM,EAAA,CAGX,EACN,CAACA,CAAK,CAAC,EAEV,cACGmG,EACC,CAAA,SAAA,CAAA/E,MAACiF,EAAe,CAAA,SAAUrG,GAAA,YAAAA,EAAO,SAAU,QAAO,GAChD,SAAAoB,EAAA,IAACtB,EAAA,CACC,YAAY,+BACZ,KAAME,GAAA,YAAAA,EAAO,KACb,QAASA,GAAA,YAAAA,EAAO,QAChB,SAAUA,GAAA,YAAAA,EAAO,SAEjB,SAACoB,EAAA,IAAAqU,EAAA,CAAc,UAAU,iEAAiE,KAAK,WAAW,CAAA,CAAA,EAE9G,EAEArU,EAAA,IAACmF,EAAA,CACC,UAAU,oGACV,MAAM,QACN,KAAK,SAEJ,UAAO7E,EAAA1B,GAAA,YAAAA,EAAA,QAAA,YAAA0B,EAAO,IAAI,CAAC0N,EAAM/E,IAAU,SAClC,cACGlJ,GACC,CAAA,SAAA,CAACC,EAAAA,IAAAC,GAAA,CAAe,QAAO,GACrB,SAAAD,EAAA,IAACF,GAAA,CACC,KAAK,KACL,QAASkO,GAAA,YAAAA,EAAM,OACf,UAAU,yCACV,QAAS2V,EAAO,QAAU3V,EAAK,MAC/B,aAAY2V,EAAO,QAAU3V,EAAK,MAAQ,KAAO,MAEhD,2BAAM,OAAQhO,EAAA,IAACqU,EAAc,CAAA,KAAMrG,EAAK,KAAM,CAAA,CAAA,EAEnD,EACA9N,EAAAA,KAACC,GAAe,CAAA,UAAU,wDACxB,SAAA,CAACH,EAAAA,IAAA,OAAA,CAAM,WAAK,KAAM,CAAA,EACjB,CAAC,GAACM,EAAA0N,EAAK,eAAL,MAAA1N,EAAmB,SACpBN,EAAAA,IAAC,QAAM,UAAKsK,EAAA0D,EAAA,eAAA,YAAA1D,EAAc,IAAI0D,GAAQ9P,GAAe8P,CAAI,GAAG,KAAK,KAAK,CAAA,EAE1E,CAjBY,CAAA,EAAA,cAAc/E,CAAK,EAkBjC,CAAA,EAEH,CACH,CACF,CAAA,CAAA,CAEJ,CCzEa,MAAAub,GAAYC,YAAgB,OAAyB,CAChE,YAAa,OACJ,MAAA,CACL,IAAGnkB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,MAAO,CAAC,UAAW,YAAa,YAAa,OAAO,EACpD,OAAO,CACL,OAAAG,EACA,UAAA+S,EACA,EAAAjL,CAAA,EAKC,OACD,MAAMqT,IAActb,EAAAkT,EAAU,UAAV,YAAAlT,EAAmB,aAA+B,CAAA,EAChEokB,EAAkB,CACtB,KAAM,CAAC,MAAO,QAAS,GAAG,EAC1B,OAAQ,CAAC,MAAO,QAAS,GAAG,EAC5B,MAAO,CAAC,MAAO,QAAS,GAAG,EAC3B,QAAS,CAAC,MAAO,QAAS,GAAG,CAAA,EAEzBzL,EAAU,CACd,KAAM,YACN,OAAQ,cACR,MAAO,aACP,QAAS,cAAA,EAELlL,EAAQ6N,EAAW,IAAUpJ,GAAA,WAAA,OACjC,MAAOjK,EAAE,oBAAoBiK,CAAC,UAAU,EACxC,KAAMyG,EAAQzG,CAAC,EACf,aAAckS,EAAgBlS,CAAC,EAC/B,SAAU,IAAM/R,EAAO,SAAS,CAAE,UAAW+R,CAAG,CAAA,GAAK,GACrD,OAAQ,IAAA,SAAM,OAAAlI,GAAAhK,EAAAG,EAAO,WAAP,YAAAH,EAAiB,eAAjB,YAAAgK,EAAA,KAAAhK,EAAgCkS,IAC9C,SAAU,GAAChI,GAAAF,GAAAhK,EAAAG,GAAA,YAAAA,EAAQ,MAAR,YAAAH,EAAA,KAAAG,KAAA,YAAA6J,EAAiB,eAAjB,MAAAE,EAAA,KAAAF,EAAgCkI,GAC3C,EAAA,EACIxT,EAAW+O,EAAM,OAAOyE,GAAKA,EAAE,QAAQ,EAAE,SAAWzE,EAAM,OACzD,MAAA,CACL,UAAWwW,GACX,eAAgB,CACd,KAAM,eACN,QAAShc,EAAE,0BAA0B,EACrC,SAAAvJ,EACA,MAAA+O,CACF,CAAA,CAEJ,CAAA,CAEJ,CACF,CAAC,ECnCD,SAAS4W,GAAmB/lB,EAAiC,OACrD,KAAA,CAAE,GAAMyN,IAERsX,EAASnX,EAAAA,QAAQ,IAAM,CACrB,MAAAiG,GAAa7T,EAAM,OAAS,CAAC,GAAG,KAAM4T,GAAWA,EAAE,SAAA,CAAU,EACnE,OAAIC,GAGe,CACjB,MAAO,EAAE,iCAAiC,EAC1C,SAAU,IAAM,EAAA,CAEX,EACN,CAAC7T,CAAK,CAAC,EAEV,cACG0D,EACC,CAAA,SAAA,CAAAtC,MAACwC,EAAoB,CAAA,SAAU5D,GAAA,YAAAA,EAAO,SAAU,QAAO,GACrD,SAAAoB,EAAA,IAACI,GAAA,CACC,MAAOujB,GAAA,YAAAA,EAAQ,MACf,QAAS,GAAG/kB,GAAA,YAAAA,EAAO,OAAO,GAC1B,SAAUA,GAAA,YAAAA,EAAO,SACjB,KAAK,UAAA,CAAA,EAET,EACAoB,EAAAA,IAACwD,GAAoB,UAAU,2DAC5B,6BAAO,sBAAO,IAAI,CAACwK,EAAW/E,IAE3BjJ,EAAA,IAAC6D,GAAA,CAEC,QAAS8f,EAAO,QAAU3V,EAAK,MAC/B,QAASA,EAAK,OAEd,SAAChO,EAAAA,IAAA,MAAA,CAAI,UAAU,gCAAiC,WAAK,MAAM,CAAA,EAJtDiJ,CAAA,GAQb,CACF,CAAA,CAAA,CAEJ,CCnCa,MAAA2b,GAAWC,YAAU,OAAwB,CACxD,KAAM,WACN,YAAa,OACJ,MAAA,CACL,IAAGvkB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,MAAO,CAAC,WAAW,EACnB,UAAW,CAAC,GAAG/C,EAAsB,EACrC,OAAO,CAAE,OAAAkD,EAAQ,UAAA+S,EAAW,EAAAjL,GAAK,OAC/B,MAAMuc,EAAYhV,KAAuBxP,EAAAkT,EAAU,UAAV,YAAAlT,EAAmB,YAAa9C,EAAuB,EAC1FunB,EAAkBjV,GAAuB,CAACtS,EAAuB,CAAC,EAAE,CAAC,EACrEuQ,EAAQ+W,EAAU,IAAUtS,IAAA,CAChC,MAAOA,EAAE,QAAUuS,EAAgB,MAAQxc,EAAE,iCAAiC,EAAI,OAAOiK,EAAE,IAAI,EAC/F,SAAU,IAAM,CACd,KAAM,CAAE,SAAAwS,CAAa,EAAAvkB,EAAO,cAAc,WAAW,EAGrD,OAFkB+R,EAAE,QAAUuS,EAAgB,OAC1BC,IAAa,OAExB,GAEFvkB,EAAO,SAAS,CAAE,SAAU,OAAO+R,EAAE,KAAK,EAAG,GAAK,EAC3D,EACA,OAAQ,IAAM,CACR,GAAAA,EAAE,QAAUuS,EAAgB,MAAO,CACrCtkB,EAAO,SAAS,gBAChB,MACF,CACAA,EAAO,SAAS,YAAY,OAAO+R,EAAE,KAAK,CAAC,CAC7C,EACA,SAAU,CAAC/R,EAAO,MAAM,YAAY,OAAO+R,EAAE,KAAK,CAAC,EACnD,QAASA,EAAE,QAAUuS,EAAgB,OAAS,GAC9C,QAASvS,EAAE,QAAUuS,EAAgB,OAAS,EAC9C,EAAA,EACI/lB,EAAW+O,EAAM,OAAOyE,GAAKA,EAAE,QAAQ,EAAE,SAAWzE,EAAM,OACzD,MAAA,CACL,UAAW4W,GACX,eAAgB,CACd,OAAAlkB,EACA,QAAS8H,EAAE,yBAAyB,EACpC,SAAAvJ,EACA,MAAA+O,EACA,UAAW,GACb,CAAA,CAEJ,CAAA,CAEJ,EACA,qBAAsB,CACb,MAAA,CACL,CACE,MAAO,KAAK,QAAQ,MACpB,WAAY,CACV,SAAU,CACR,QAAS,KACT,UAAsBkX,GAAAA,EAAQ,MAAM,SAAS,WAAW,SAAU,EAAE,EACpE,WAAaC,GACNA,EAAW,SAGT,CACL,MAAO,cAAcA,EAAW,QAAQ,EAAA,EAHjC,EAMb,CACF,CACF,CAAA,CAEJ,EACA,aAAc,CACL,MAAA,CACL,YACEF,GACE,CAAC,CAAE,MAAA1J,KACMA,IAAQ,QAAQ,YAAa,CAAE,SAAA0J,CAAU,CAAA,EAAE,MAExD,cACE,IACE,CAAC,CAAE,MAAA1J,KACMA,EAAQ,EAAA,QAAQ,YAAa,CAAE,SAAU,IAAA,CAAM,EAAE,uBAAuB,KACjF,CAER,CACF,CAAC,EC9FD,SAASmB,GAAM,CAAE,KAAAC,GAAoB,CAEjC,OAAA1c,EAAA,IAAC,MAAA,CACC,MAAM,OACN,OAAO,OACP,QAAQ,cACR,QAAQ,MACR,MAAM,6BAEN,eAAC,IAAE,CAAA,OAAO,OAAO,YAAa,EAAG,KAAK,OAAO,SAAS,UACpD,eAAC,IAAE,CAAA,UAAU,gCACX,SAACE,EAAA,KAAA,IAAA,CAAE,UAAU,kCACX,SAAA,CAAAF,EAAA,IAAC,OAAA,CACC,EAAE,0RACF,GAAG,KACH,KAAM0c,GAAQ,UACd,SAAS,SAAA,CACX,EACA1c,EAAA,IAAC,OAAA,CACC,EAAE,2lBACF,GAAG,QACH,KAAK,eACL,SAAS,SAAA,CACX,EACAA,EAAA,IAAC,OAAA,CACC,EAAE,iTACF,GAAG,QACH,KAAK,eACL,SAAS,SAAA,CACX,CAAA,CACF,CAAA,CACF,CAAA,EACF,CAAA,CAAA,CAGN,CAEA,SAASmlB,GAAkBvmB,EAA+B,CACxD,KAAM,CAACoO,EAAeC,CAAgB,EAAIzL,EAAAA,SAA6B,MAAS,EAEhF,SAAS0L,EAASU,EAA2B,QAC3CtN,EAAA1B,EAAM,SAAN,MAAA0B,EAAA,KAAA1B,EAAegP,EACjB,CAEA,SAASgP,GAAc,QACrBtc,EAAA1B,EAAM,SAAN,MAAA0B,EAAA,KAAA1B,EAAeoO,EACjB,CAEA,MAAM6P,EAA2BpT,EAAA,YAC/BqT,EAAA,SAAUlP,GAA8B,CACtCX,EAAiBW,CAAK,GACrB,GAAG,EACN,CAAC,CAAA,EAID,OAAA1N,EAAA,KAAC,MAAI,CAAA,UAAU,wDACb,SAAA,CAAAF,EAAAA,IAACtB,GAAa,QAASE,GAAA,YAAAA,EAAO,QAAS,SAAUA,GAAA,YAAAA,EAAO,SAAU,OAAQge,EACxE,SAAC5c,MAAA,OAAA,CAAK,UAAU,+EACd,SAAAA,EAAA,IAACyc,IAAM,KAAMzP,EAAe,EAC9B,CACF,CAAA,EAEAhN,EAAA,IAAC8M,GAAA,CACC,cAAAE,EACA,iBAAkB6P,EAClB,SAAA3P,EACA,SAAUtO,GAAA,YAAAA,EAAO,SACjB,OAAQA,GAAA,YAAAA,EAAO,OACf,aAAcA,GAAA,YAAAA,EAAO,aAErB,eAACyB,EAAO,CAAA,QAAQ,QAAQ,KAAK,OAAO,UAAU,mCAAmC,SAAUzB,GAAA,YAAAA,EAAO,SAChG,SAACoB,EAAA,IAAAqU,EAAA,CAAc,UAAU,qDAAqD,KAAK,UAAW,CAAA,EAChG,CAAA,CACF,CACF,CAAA,CAAA,CAEJ,CCnFa,MAAA+Q,GAAQC,QAAY,OAAqB,CACpD,YAAa,OACJ,MAAA,CACL,IAAG/kB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,OAAO,CAAE,OAAAG,EAAQ,EAAA8H,EAAG,UAAAiL,GAAa,CACxB,MAAA,CACL,UAAW2R,GACX,eAAgB,CACd,OAAQ3R,EAAU,QAAQ,OAC1B,aAAcA,EAAU,QAAQ,aAChC,OAAS5F,GAAoB,CACvBA,IAAU,QACZnN,EAAO,QAAQ,MAAQ,EAAA,WAAA,EAAa,MAElC,OAAOmN,GAAU,UACnBnN,EAAO,QAAQ,MAAA,EAAQ,SAASmN,CAAK,EAAE,KAE3C,EACA,SAAU,IAAM,CACd,KAAM,CAAE,MAAAA,CAAU,EAAAnN,EAAO,cAAc,WAAW,EAClD,OAAKmN,GAGEnN,EAAO,SAAS,CAAE,MAAAmN,CAAO,CAAA,GAAK,EACvC,EACA,OAAAnN,EACA,SAAU,CAACA,EAAO,IAAI,EAAE,SAAS,EAAE,EACnC,QAAS8H,EAAE,sBAAsB,CACnC,CAAA,CAEJ,CAAA,CAEJ,CACF,CAAC,ECzCY+c,GAAYC,YAAgB,OAAyB,CAChE,YAAa,OACJ,MAAA,CACL,IAAGjlB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,WAAY,GACZ,OAAQ,CAAC,CAAE,OAAAG,EAAQ,EAAA8H,MAAS,CAC1B,UAAWoU,GACX,eAAgB,CACd,OAAS/O,GAAoB,CACvB,OAAOA,GAAU,UACZnN,EAAA,QAAQ,MAAM,EAAE,aAAa,CAAE,MAAAmN,CAAA,CAAO,EAAE,MAE7CA,IAAU,QACZnN,EAAO,QAAQ,MAAQ,EAAA,eAAA,EAAiB,KAE5C,EACA,OAAAA,EACA,SAAU,IAAMA,EAAO,SAAS,WAAW,GAAK,GAChD,SAAU,CAACA,EAAO,IAAA,EAAM,aAAa,EACrC,aAAc,CAAC,IAAK,MAAO,GAAG,EAC9B,QAAS8H,EAAE,0BAA0B,CACvC,CAAA,EACF,CAEJ,CACF,CAAC,ECzBYid,GAAaC,aAAiB,OAA0B,CACnE,YAAa,OACJ,MAAA,CACL,IAAGnlB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,OAAQ,CAAC,CAAE,OAAAG,EAAQ,EAAA8H,MAAS,CAC1B,UAAW7J,EACX,eAAgB,CACd,OAAQ,IAAM+B,EAAO,SAAS,iBAAiB,EAC/C,SAAU,IAAMA,EAAO,SAAS,YAAY,GAAK,GACjD,SAAU,GACV,aAAc,CAAC,QAAS,MAAO,GAAG,EAClC,KAAM,OACN,QAAS8H,EAAE,2BAA2B,CACxC,CAAA,EACF,CAEJ,CACF,CAAC,ECpBYmd,GAAQC,OAAK,OAAqB,CAC7C,KAAM,QACN,YAAa,OACJ,MAAA,CACL,IAAGrlB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,OAAQ,CAAC,CAAE,OAAAG,EAAQ,EAAA8H,MAAS,CAC1B,UAAW7J,EACX,eAAgB,CACd,OAAQ,IAAM+B,EAAO,QAAQ,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,IAAI,EACtE,SAAU,CAACA,EAAO,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,WAAA,EAAa,cAAA,EAAgB,IAAI,EACzE,KAAM,SACN,QAAS8H,EAAE,sBAAsB,CACnC,CAAA,EACF,CAEJ,CACF,CAAC,ECbYqd,GAAcC,cAAkB,OAA2B,CACtE,YAAa,OACJ,MAAA,CACL,IAAGvlB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,OAAQ,CAAC,CAAE,OAAAG,EAAQ,EAAA8H,MAAS,CAC1B,UAAW7J,EACX,eAAgB,CACd,OAAQ,IAAM+B,EAAO,SAAS,kBAAkB,EAChD,SAAU,IAAMA,EAAO,SAAS,aAAa,GAAK,GAClD,SAAU,GACV,KAAM,cACN,aAAc,CAAC,MAAO,QAAS,GAAG,EAClC,QAAS8H,EAAE,4BAA4B,CACzC,CAAA,EACF,CAEJ,CACF,CAAC,ECXYud,GAAWC,WAAe,OAAwB,CAC7D,YAAa,OACJ,MAAA,CACL,IAAGzlB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,eAAgB,CACd,MAAO,WACT,EACA,SAAU,CACR,eAAgB,CACd,MAAO,gBACT,CACF,EACA,OAAQ,CAAC,CAAE,OAAAG,EAAQ,EAAA8H,MAAS,CAC1B,UAAW7J,EACX,eAAgB,CACd,OAAQ,IAAM+B,EAAO,SAAS,eAAe,EAC7C,SAAU,IAAMA,EAAO,SAAS,UAAU,GAAK,GAC/C,SAAU,GACV,KAAM,WACN,aAAc,CAAC,QAAS,MAAO,GAAG,EAClC,QAAS8H,EAAE,yBAAyB,CACtC,CAAA,EACF,CAEJ,EAEA,eAAgB,CACd,MAAO,CAACyd,EAAS,SAAA,UAAU,KAAK,QAAQ,QAAQ,CAAC,CACnD,CACF,CAAC,ECnCYC,GAAaC,aAAiB,OAA0B,CACnE,YAAa,OACJ,MAAA,CACL,IAAG5lB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,eAAgB,CACd,MAAO,YACT,EACA,OAAQ,CAAC,CAAE,OAAAG,EAAQ,EAAA8H,MAAc,CAC/B,UAAW7J,EACX,eAAgB,CACd,OAAQ,IAAM+B,EAAO,SAAS,iBAAiB,EAC/C,SAAU,IAAMA,EAAO,SAAS,YAAY,GAAK,GACjD,SAAU,CAACA,EAAO,IAAA,EAAM,iBAAiB,EACzC,KAAM,YACN,aAAc,CAAC,QAAS,MAAO,GAAG,EAClC,QAAS8H,EAAE,2BAA2B,CACxC,CAAA,EACF,CAEJ,CACF,CAAC,ECfD,SAAS4d,GAAgBvnB,EAA8B,CAC5C,SAAAwgB,EAAUR,EAAcxV,EAAesV,EAAwB,CAClE9f,EAAM,QACRA,EAAM,OAAO,CAAE,KAAAggB,EAAM,KAAAxV,EAAM,aAAAsV,CAAc,CAAA,CAE7C,CAEA,cACG3Z,EACC,CAAA,SAAA,CAAA/E,MAACiF,EAAe,CAAA,SAAUrG,GAAA,YAAAA,EAAO,SAAU,QAAO,GAChD,SAAAoB,EAAA,IAACtB,EAAA,CACC,QAASE,GAAA,YAAAA,EAAO,QAChB,SAAUA,GAAA,YAAAA,EAAO,SACjB,SAAUA,GAAA,YAAAA,EAAO,SAEjB,SAACoB,EAAA,IAAAqU,EAAA,CAAc,KAAMzV,GAAA,YAAAA,EAAO,KAAM,CAAA,CAAA,EAEtC,QACCuG,EAAe,CAAA,iBAAgB,GAAC,UAAU,kBAAkB,MAAM,QAAQ,KAAK,SAC9E,eAACoZ,GAAc,CAAA,OAAQ3f,EAAM,OAAQ,UAAAwgB,CAAsB,CAAA,EAC7D,CACF,CAAA,CAAA,CAEJ,CC3Ba,MAAA1I,GAAO0P,SAAW,OAAoB,CACjD,UAAW,GACX,WAAY,CACH,MAAA,CACL,CACE,IAAK,kEACP,CAAA,CAEJ,EACA,WAAW,CAAE,eAAAC,GAAkB,CACtB,MAAA,CACL,IACAC,EAAAA,gBAAgB,KAAK,QAAQ,eAAgBD,EAAgB,CAC3D,MAAO,MAAA,CACR,EACD,CAAA,CAEJ,EAEA,YAAa,OACJ,MAAA,CACL,IAAG/lB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,YAAa,GACb,OAAQ,CAAC,CAAE,OAAAG,EAAQ,EAAA8H,MACV,CACL,UAAW4d,GACX,eAAgB,CACd,OAAA1lB,EACA,OAASa,GAAU,CACjB,KAAM,CAAE,KAAAsd,EAAM,KAAAxV,EAAM,aAAAsV,CAAA,EAAiBpd,EACrCb,EACG,MAAM,EACN,gBAAgB,MAAM,EACtB,cAAc,CACb,KAAM,OACN,KAAA2I,EACA,MAAO,CACL,CACE,KAAM,OACN,MAAO,CACL,KAAMwV,EACN,OAAQF,EAAe,SAAW,EACpC,CACF,CACF,CAAA,CACD,EACA,QAAQ,CAAE,KAAME,CAAM,CAAA,EACtB,MAAM,EACN,KACL,EACA,GAAI,QACJ,SAAU,IAAMne,EAAO,SAAS,MAAM,GAAK,GAC3C,SAAU,CAACA,EAAO,IAAA,EAAM,QAAQ,CAAE,KAAM,GAAI,EAC5C,KAAM,OACN,QAAS8H,EAAE,qBAAqB,CAClC,CAAA,EAEJ,CAEJ,EAEA,uBAAwB,CACf,MAAA,CACL,IAAIia,SAAO,CACT,MAAO,CACL,YAAa,CAAC9E,EAAkB3c,IAAgB,CAC9C,KAAM,CAAE,OAAAwlB,EAAQ,IAAA5M,EAAK,GAAAF,CAAA,EAAOiE,EAAK,MAC3B8I,EAAQC,eAAa9M,EAAI,QAAQ5Y,CAAG,EAAGwlB,EAAO,MAAM,IAAI,EAC9D,GAAI,CAACC,EACI,MAAA,GAET,MAAME,EAAS/M,EAAI,QAAQ6M,EAAM,IAAI,EAC/BG,EAAOhN,EAAI,QAAQ6M,EAAM,EAAE,EAC3B5D,EAAcnJ,EAAG,aAAa,IAAII,EAAAA,cAAc6M,EAAQC,CAAI,CAAC,EACnEjJ,EAAK,SAASkF,CAAW,CAC3B,CACF,CAAA,CACD,CAAA,CAEL,CACF,CAAC,EChFYgE,GAAiBC,iBAAqB,OAA8B,CAC/E,YAAa,CACJ,MAAA,CACL,MACAP,kBAAgB,KAAK,QAAQ,eAAgB,CAC3C,YAAa,KAAK,IAAA,CACnB,EACD,CAAC,IAAI,CAAA,CAET,EACA,YAAa,OACJ,MAAA,CACL,IAAGhmB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,OAAQ,CAAC,CAAE,OAAAG,EAAQ,EAAA8H,MAAS,CAC1B,UAAW7J,EACX,eAAgB,CACd,OAAQ,IAAM+B,EAAO,SAAS,kBAAkB,EAChD,SAAU,CAACA,EAAO,IAAA,EAAM,kBAAkB,EAC1C,KAAM,QACN,aAAc,CAAC,MAAO,MAAO,GAAG,EAChC,QAAS8H,EAAE,+BAA+B,CAC5C,CAAA,EACF,CAEJ,EACA,sBAAuB,CACd,MAAA,CACL,YAAa,IAAM,KAAK,OAAO,SAAS,kBAAkB,CAAA,CAE9D,CACF,CAAC,EClBD,SAASue,GAAoBloB,EAA4C,OACjE,KAAA,CACJ,KAAAE,EAAO,OAEP,QAAAC,EAAU,OAEV,YAAAE,EAAc,GAId,eAAAE,EAAiB,CAAC,EAClB,OAAAC,EAAS,OACT,SAAAC,EAAW,OACX,SAAAC,CACE,EAAAV,EAEEc,EAAOC,GAAMb,CAAc,EAEjC,cACGiB,GACC,CAAA,SAAA,CAACC,EAAAA,IAAAC,GAAA,CAAe,QAAO,GACrB,SAAAC,EAAA,KAACJ,GAAA,CACC,KAAK,KACL,UAAW,uCAAuCb,CAAW,GAC7D,SAAUI,GAAA,YAAAA,IACV,QAASD,EAGR,SAAA,CAAQM,GAAAM,EAAAA,IAACN,EAAK,CAAA,UAAU,2BAA4B,CAAA,EACpDJ,qBAAe,SAAAA,CAAS,CAAA,CAAA,CAAA,CAAA,EAE7B,EACCP,SACEoB,GAAgB,CAAA,GAAGhB,EAClB,SAACe,EAAA,KAAA,MAAA,CAAI,UAAU,+FACb,SAAA,CAAAF,EAAAA,IAAC,OAAK,SAAQjB,CAAA,CAAA,EACb,CAAC,GAACuB,EAAA1B,GAAA,YAAAA,EAAO,eAAP,MAAA0B,EAAqB,eAAW,OAAM,CAAA,SAAAlC,GAAgBQ,GAAA,YAAAA,EAAO,YAAY,CAAE,CAAA,CAAA,CAAA,CAChF,CACF,CAAA,CAEJ,CAAA,CAAA,CAEJ,CCzDA,MAAMmoB,GAA6B,CAAC,OAAQ,MAAM,EAErCC,GAAUC,UAAc,OAAuB,CAC1D,YAAa,OACJ,MAAA,CACL,IAAG3mB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,MAAO,IACP,cAAe,IACf,OAAQ,CAAC,CAAE,OAAAG,EAAQ,EAAA8H,KACVwe,GAAS,IAAa/Y,IAAA,CAC3B,UAAW8Y,GACX,eAAgB,CACd,OAAQ,IAAM,CACR9Y,IAAS,QACXvN,EAAO,QAAQ,MAAQ,EAAA,KAAA,EAAO,MAE5BuN,IAAS,QACXvN,EAAO,QAAQ,MAAQ,EAAA,KAAA,EAAO,KAElC,EACA,aAAcuN,IAAS,OAAS,CAAC,MAAO,GAAG,EAAI,CAAC,QAAS,MAAO,GAAG,EACnE,SAAUA,IAAS,OAAS,CAACvN,EAAO,IAAA,EAAM,KAAA,EAAS,CAACA,EAAO,IAAA,EAAM,KAAK,EACtE,SAAU,IAAOuN,IAAS,OAAS,CAACvN,EAAO,MAAM,KAAS,EAAA,CAACA,EAAO,IAAA,EAAM,KAAK,EAC7E,KAAMuN,IAAS,OAAS,QAAU,QAClC,QAASzF,EAAE,UAAUyF,CAAI,UAAU,CACrC,CACA,EAAA,CACJ,CAEJ,CACF,CAAC,ECpCYkZ,GAAWC,WAAe,OAAO,CAC5C,QAAS,kBAEX,CAAC,ECAM,SAASC,GAAaC,EAAcpe,EAAYqe,EAAa,KAAM,CACxE,OAAIA,EACKD,EAAQ,cAAc,CAAE,MAAApe,GAASqe,CAAU,EAG7CD,EAAQ,cAAc,CAAE,MAAApe,CAAO,CAAA,CACxC,CAEO,SAASse,GAAoBhB,EAAa,CAC3C,GAAAA,EAAO,OAAO,iBAChB,OAAOA,EAAO,OAAO,iBAGvB,MAAMiB,EAAQ,CACZ,QAASjB,EAAO,MAAM,QACtB,OAAQA,EAAO,MAAM,MAAA,EAGvB,OAAAA,EAAO,OAAO,iBAAmBiB,EAE1BA,CACT,CAEO,SAASC,GAAclB,EAAamB,EAAgBJ,EAAa,KAAM,CACtE,MAAAvO,EAAQwO,GAAoBhB,CAAM,EAClCoB,EAAO,CAAA,EAEb,QAAS1e,EAAQ,EAAGA,EAAQye,EAAWze,GAAS,EAAG,CACjD,MAAM2e,EAAMR,GAAarO,EAAM,OAAQ9P,EAAOqe,CAAU,EAEpDM,GAEFD,EAAK,KAAKC,CAAG,CAEjB,CAEA,OAAO7O,EAAM,QAAQ,cAAc,CAAE,KAAM2O,CAAA,EAAaC,CAAI,CAC9D,CAEO,SAASE,GAAe,CAC7B,MAAAnnB,EACA,SAAA2H,EACA,KAAA1D,CACF,EAIG,CACK,MAAAmjB,EAAeC,EAAAA,eAAgBjnB,GAAeA,EAAK,KAAK,OAAS8e,GAAY,IAAI,EAAElf,EAAM,SAAS,EAClGsnB,EAAcD,EAAAA,eAAgBjnB,GAAeA,EAAK,KAAK,OAASmnB,GAAO,IAAI,EAAEvnB,EAAM,SAAS,EAE9F,GAAA2H,GAAYyf,GAAgBE,EAAa,CAC3C,MAAML,EAAOG,EAAa,KACpBI,EAAWF,EAAY,KAAK,MAAM,MAClCG,EAAWR,EAAK,SAEtB,IAAIS,EAAYF,EAEZvjB,IAAS,UACXyjB,EAAYF,EAAW,EACdC,EAAA,QAAQ,OAAOD,EAAU,CAAC,IAGvBE,EAAAzjB,IAAS,YAAcujB,EAAWA,EAAW,EAChDC,EAAA,QAAQ,OAAOC,EAAW,EAAG,CACpC,KAAM,SACN,MAAO,CACL,MAAOF,CACT,EACA,QAAS,CACP,CACE,KAAM,WACR,CACF,CAAA,CACD,GAGMC,EAAA,MAAM,KAAOA,EAAS,QAAQ,OAEvCA,EAAS,QAAQ,QAAQ,CAACE,EAAcpf,IAAe,CACrDof,EAAQ,MAAM,MAAQpf,CAAA,CACvB,EAED,MAAMqf,EAAW3C,EAAAA,OAAK,SAASjlB,EAAM,OAAQynB,CAAQ,EAErD,IAAII,EAAgBT,EAAa,IACjCQ,EAAS,QAAQ,QAAQ,CAACV,EAAK7mB,EAAKkI,IAAU,CACxCA,EAAQmf,IACVG,GAAiBX,EAAI,SACvB,CACD,EAED,MAAMnO,EAAK/Y,EAAM,GAAG,QAAQ,KAAK,KAAK,EAEnC+Y,EAAA,YAAYqO,EAAa,IAAKA,EAAa,IAAMA,EAAa,KAAK,SAAUQ,CAAQ,EAAE,aACxFzO,gBAAc,KAAKJ,EAAG,IAAI,QAAQ8O,CAAa,CAAC,CAAA,EAGlDlgB,EAASoR,CAAE,CACb,CAEO,MAAA,EACT,CAEO,SAAS+O,GAAQ,CAAE,MAAA9nB,EAAO,SAAA2H,EAAU,KAAA1D,GAAyE,CAC5G,MAAAmjB,EAAeC,EAAAA,eAAgBjnB,GAAeA,EAAK,KAAK,OAAS8e,GAAY,IAAI,EAAElf,EAAM,SAAS,EAClGsnB,EAAcD,EAAAA,eAAgBjnB,GAAeA,EAAK,KAAK,OAASmnB,GAAO,IAAI,EAAEvnB,EAAM,SAAS,EAE9F,GAAA2H,GAAYyf,GAAgBE,EAAa,CAC3C,MAAML,EAAOG,EAAa,KACpBI,EAAWF,EAAY,KAAK,MAAM,MAExC,IAAII,EAAY,EAEZzjB,IAAS,SACXyjB,GAAaF,EAAW,EAAIP,EAAK,MAAM,MAAQA,EAAK,MAAM,KAG7CS,GAAAF,EAAW,GAAKP,EAAK,MAAM,KAG1C,IAAIY,EAAgBT,EAAa,IACjCH,EAAK,QAAQ,QAAQ,CAACC,EAAK7mB,EAAKkI,IAAU,CACpCA,EAAQmf,IACVG,GAAiBX,EAAI,SACvB,CACD,EAED,MAAMnO,EAAK/Y,EAAM,GAAG,QAAQ,KAAK,KAAK,EAEnC,OAAA+Y,EAAA,aAAaI,gBAAc,KAAKJ,EAAG,IAAI,QAAQ8O,CAAa,CAAC,CAAC,EACjElgB,EAASoR,CAAE,EACJ,EACT,CAEO,MAAA,EACT,CCxIO,MAAMgP,GAA6B,IAa7B7I,GAAc+F,OAAK,OAAO,CACrC,KAAM,UACN,MAAO,QACP,SAAU,GACV,UAAW,GACX,eAAgB,GAChB,QAAS,aACT,SAAU8C,GAEV,YAAa,CACJ,MAAA,CACL,eAAgB,CACd,MAAO,SACT,CAAA,CAEJ,EAEA,eAAgB,CACP,MAAA,CACL,KAAM,CACJ,QAAS,EACT,UAAWxD,GAAWA,EAAQ,aAAa,MAAM,CACnD,CAAA,CAEJ,EAEA,WAAY,CACH,MAAA,CACL,CACE,IAAK,iBACP,CAAA,CAEJ,EAEA,WAAW,CAAE,eAAAoB,GAAkB,CACtB,MAAA,CAAC,MAAOC,EAAAA,gBAAgB,KAAK,QAAQ,eAAgBD,CAAc,EAAG,CAAC,CAChF,EAEA,aAAc,CACL,MAAA,CACL,cAEIxkB,GAAA,CAAC,CAAE,GAAA4X,EAAI,SAAApR,EAAU,OAAA5H,KAAa,CAC5B,MAAMK,EAAO2mB,GAAchnB,EAAO,OAASoB,GAASA,EAAM,MAAS,CAAC,EAEpE,GAAIwG,EAAU,CACN,MAAAqgB,EAASjP,EAAG,UAAU,OAAS,EAErCA,EAAG,qBAAqB3Y,CAAI,EACzB,eAAA,EACA,aAAa+Y,EAAAA,cAAc,KAAKJ,EAAG,IAAI,QAAQiP,CAAM,CAAC,CAAC,CAC5D,CAEO,MAAA,EACT,EACJ,aACE,IACE,CAAC,CAAE,SAAArgB,EAAU,MAAA3H,KACJmnB,GAAe,CAAE,SAAAxf,EAAU,MAAA3H,EAAO,KAAM,YAAa,EAElE,YACE,IACE,CAAC,CAAE,SAAA2H,EAAU,MAAA3H,KACJmnB,GAAe,CAAE,SAAAxf,EAAU,MAAA3H,EAAO,KAAM,WAAY,EAEjE,UACE,IACE,CAAC,CAAE,SAAA2H,EAAU,MAAA3H,KACJmnB,GAAe,CAAE,SAAAxf,EAAU,MAAA3H,EAAO,KAAM,SAAU,CAC3D,CAER,EAEA,sBAAuB,CACd,MAAA,CACL,YAAa,IAAM,KAAK,OAAO,SAAS,cAAc,EACtD,IAAO,IACE8nB,GAAQ,CACb,MAAO,KAAK,OAAO,MACnB,SAAU,KAAK,OAAO,KAAK,SAC3B,KAAM,OAAA,CACP,EAEH,YAAa,IACJA,GAAQ,CACb,MAAO,KAAK,OAAO,MACnB,SAAU,KAAK,OAAO,KAAK,SAC3B,KAAM,QAAA,CACP,CACH,CAEJ,CACF,CAAC,EC5GYP,GAAStC,OAAK,OAAO,CAChC,KAAM,SACN,QAAS,SACT,UAAW,GAEX,YAAa,CACJ,MAAA,CACL,eAAgB,CACd,MAAO,QACT,CAAA,CAEJ,EAEA,eAAgB,CACP,MAAA,CACL,MAAO,CACL,QAAS,EACT,UAAWV,GAAWA,EAAQ,aAAa,OAAO,CACpD,CAAA,CAEJ,EAEA,WAAY,CACH,MAAA,CACL,CACE,IAAK,mBACP,CAAA,CAEJ,EAEA,WAAW,CAAE,eAAAoB,GAAkB,CACtB,MAAA,CAAC,MAAOC,EAAAA,gBAAgB,KAAK,QAAQ,eAAgBD,CAAc,EAAG,CAAC,CAChF,CACF,CAAC,EC/BYsC,GAAqB9D,YAAU,OAAY,CACtD,KAAM,qBACN,YAAa,OACJ,MAAA,CACL,IAAGvkB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,OAAQ,CAAC,CAAE,OAAAG,EAAQ,EAAA8H,MAAc,CAC/B,UAAW7J,EACX,eAAgB,CACd,OAAQ,IAAM,CACL+B,EAAA,QAAQ,QAAQ,cAAc,CAAE,KAAM,CAAA,CAAG,EAAE,KACpD,EACA,KAAM,UACN,QAAS8H,EAAE,wBAAwB,CACrC,CAAA,EACF,CAEJ,CACF,CAAC,ECjBYqgB,GAAY/D,YAAU,OAAO,CACxC,KAAM,YACN,uBAAwB,CAChB,KAAA,CAAE,OAAApkB,CAAW,EAAA,KACZ,MAAA,CACL,IAAI+hB,SAAO,CACT,IAAK,IAAIC,EAAA,UAAU,WAAW,EAC9B,MAAO,CACL,YAAY/hB,EAAO,CAIb,OAHAA,EAAM,UAAU,OAGhBD,EAAO,YAAc,GAChB,KAEF4hB,gBAAc,OAAO3hB,EAAM,IAAK,CACrC0hB,aAAW,OAAO1hB,EAAM,UAAU,KAAMA,EAAM,UAAU,GAAI,CAC1D,MAAO,WAAA,CACR,CAAA,CACF,CACH,CACF,CAAA,CACD,CAAA,CAEL,CACF,CAAC,ECbD,SAASmoB,GAAajqB,EAA2B,CACzC,KAAA,CAAE,GAAMyN,IAERkH,EAAQ/G,EAAAA,QAAQ,IACb,CACL,CACE,KAAM,YACN,MAAO,EAAE,0BAA0B,EACnC,SAAU,WACV,SAAU,IACR5N,EAAM,OAAO,SAAS,WAAW,GAC9B,CAACA,EAAM,OAAO,SAAS,aAAa,GACpC,CAACA,EAAM,OAAO,SAAS,YAAY,GACnC,CAACA,EAAM,OAAO,SAAS,UAAU,EACtC,OAAQ,IAAMA,EAAM,OAAO,QAAQ,MAAM,EAAE,WAAW,EAAE,IAAI,CAC9D,EACA,CACE,KAAM,WACN,MAAO,EAAE,2BAA2B,EACpC,SAAU,IAAMA,EAAM,OAAO,SAAS,UAAW,CAAE,MAAO,EAAG,EAC7D,SAAU,WACV,OAAQ,IAAMA,EAAM,OAAO,MAAA,EAAQ,MAAM,EAAE,WAAW,EAAE,cAAc,CAAE,MAAO,CAAG,CAAA,EAAE,IAAI,CAC1F,EACA,CACE,KAAM,WACN,MAAO,EAAE,2BAA2B,EACpC,SAAU,IAAMA,EAAM,OAAO,SAAS,UAAW,CAAE,MAAO,EAAG,EAC7D,SAAU,WACV,OAAQ,IAAMA,EAAM,OAAO,MAAA,EAAQ,MAAM,EAAE,WAAW,EAAE,cAAc,CAAE,MAAO,CAAG,CAAA,EAAE,IAAI,CAC1F,EACA,CACE,KAAM,WACN,MAAO,EAAE,2BAA2B,EACpC,SAAU,IAAMA,EAAM,OAAO,SAAS,UAAW,CAAE,MAAO,EAAG,EAC7D,SAAU,WACV,OAAQ,IAAMA,EAAM,OAAO,MAAA,EAAQ,MAAM,EAAE,WAAW,EAAE,cAAc,CAAE,MAAO,CAAG,CAAA,EAAE,IAAI,CAC1F,EACA,CACE,KAAM,aACN,MAAO,EAAE,2BAA2B,EACpC,SAAU,IAAMA,EAAM,OAAO,SAAS,YAAY,EAClD,SAAU,OACV,OAAQ,IAAMA,EAAM,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,EAAE,IAAI,CACjF,EACA,CACE,KAAM,eACN,MAAO,EAAE,4BAA4B,EACrC,SAAU,IAAMA,EAAM,OAAO,SAAS,aAAa,EACnD,SAAU,cACV,OAAQ,IAAMA,EAAM,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,IAAI,CAClF,EACA,CACE,KAAM,WACN,MAAO,EAAE,yBAAyB,EAClC,SAAU,IAAMA,EAAM,OAAO,SAAS,UAAU,EAChD,SAAU,WACV,OAAQ,IAAMA,EAAM,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,CAC/E,EACA,CACE,KAAM,aACN,MAAO,EAAE,2BAA2B,EACpC,SAAU,IAAMA,EAAM,OAAO,SAAS,YAAY,EAClD,SAAU,YACV,OAAQ,IAAMA,EAAM,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,iBAAiB,EAAE,IAAI,CACjF,EACA,CACE,KAAM,YACN,MAAO,EAAE,0BAA0B,EACnC,SAAU,IAAMA,EAAM,OAAO,SAAS,WAAW,EACjD,SAAU,QACV,OAAQ,IAAMA,EAAM,OAAO,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,IAAI,CAChF,CAAA,EAED,CAACA,EAAM,OAAQ,CAAC,CAAC,EAEdkqB,EAAatc,EAAAA,QAAQ,IAEvB+G,EAAM,OAAevF,GAAAA,EAAK,SAAU,CAAA,EAAE,OAAS,CAC7C,MAAO,OAAA,EAGV,CAACuF,CAAK,CAAC,EAEV,cACGjR,EACC,CAAA,SAAA,CAACtC,EAAAA,IAAAwC,EAAA,CAAoB,QAAO,GAC1B,SAAAtC,EAAAA,KAACG,GAAO,QAAQ,QAAQ,UAAU,iEAChC,SAAA,CAACH,EAAAA,KAAA,OAAA,CAAK,UAAU,mEACb,SAAA,CAAA,IACA4oB,GAAA,YAAAA,EAAY,KAAA,EACf,EACA9oB,EAAAA,IAAC+V,EAAY,YAAA,CAAA,UAAU,2BAA4B,CAAA,CAAA,CAAA,CACrD,CACF,CAAA,EACC/V,EAAA,IAAAwD,EAAA,CAAoB,iBAAgB,GAAC,UAAU,+BAA+B,MAAM,QAAQ,WAAY,EACtG,SAAA+P,EAAM,IAAI,CAACvF,EAAM/E,IAAU,OACpB,MAAAvJ,EAAOC,GAAMqO,EAAK,QAAe,EAGrC,OAAAhO,EAAA,IAAC6D,GAAA,CAEC,UAASvD,EAAA0N,EAAK,WAAL,YAAA1N,EAAA,KAAA0N,KAAqB,GAC9B,QAAS,IAAMA,EAAK,OAAO,EAC3B,UAAU,0BAEV,SAAA9N,EAAA,KAAC,MAAI,CAAA,UAAU,mEACb,SAAA,CAACF,EAAAA,IAAAN,EAAA,CAAK,UAAU,0BAA2B,CAAA,SAC1C,OACE,CAAA,SAAA,CAAA,IACAsO,EAAK,KAAA,EACR,CAAA,EACF,CAAA,EAXK/E,CAAA,CAcV,CAAA,EACH,CACF,CAAA,CAAA,CAEJ,CC/Ha,MAAA8f,GAAalE,YAAU,OAA0B,CAC5D,KAAM,cACN,YAAa,OACJ,MAAA,CACL,IAAGvkB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,QAAS,GACT,OAAQ,KAAO,CACb,UAAWuoB,GACX,eAAgB,CAAC,CAAA,EACnB,CAEJ,CACF,CAAC,ECfD,SAASG,GAAe,CAAE,MAAAjQ,EAAO,KAAAjY,GAAQ,CAC/B,OAAA,MAAM,QAAQiY,CAAK,GAAKA,EAAM,SAASjY,EAAK,IAAI,GAAMA,EAAK,OAASiY,CAC9E,CAaa,MAAAkQ,GAAepE,YAAU,OAA4B,CAChE,KAAM,eAEN,YAAa,CACJ,MAAA,CACL,KAAM,YACN,SAAU,CAAC,WAAW,CAAA,CAE1B,EAEA,uBAAwB,CACtB,MAAMqE,EAAS,IAAIzG,EAAAA,UAAU,KAAK,IAAI,EAChC0G,EAAgB,OAAO,QAAQ,KAAK,OAAO,OAAO,KAAK,EAC1D,IAAI,CAAC,EAAG7nB,CAAK,IAAMA,CAAK,EACxB,OAAeR,GAAA,KAAK,QAAQ,SAAS,SAASA,EAAK,IAAI,CAAC,EAEpD,MAAA,CACL,IAAI0hB,SAAO,CACT,IAAK0G,EACL,kBAAmB,CAACvG,EAAGyG,EAAI1oB,IAAU,CACnC,KAAM,CAAE,IAAAiZ,EAAK,GAAAF,EAAI,OAAA8M,CAAA,EAAW7lB,EACtB2oB,EAAwBH,EAAO,SAASxoB,CAAK,EAC7C4oB,EAAc3P,EAAI,QAAQ,KAC1BhV,EAAO4hB,EAAO,MAAM,KAAK,QAAQ,IAAI,EAE3C,GAAK8C,EAIL,OAAO5P,EAAG,OAAO6P,EAAa3kB,EAAK,OAAQ,CAAA,CAC7C,EACA,MAAO,CACL,KAAM,CAACge,EAAGjiB,IAAU,CACZ,MAAA6oB,EAAW7oB,EAAM,GAAG,IAAI,UAE9B,MAAO,CAACsoB,GAAe,CAAE,KAAMO,EAAU,MAAOJ,EAAe,CACjE,EACA,MAAO,CAAC1P,EAAInY,IAAU,CAChB,GAAA,CAACmY,EAAG,WACC,OAAAnY,EAGH,MAAAioB,EAAW9P,EAAG,IAAI,UAExB,MAAO,CAACuP,GAAe,CAAE,KAAMO,EAAU,MAAOJ,EAAe,CACjE,CACF,CAAA,CACD,CAAA,CAEL,CACF,CAAC,ECgFYK,GAAU3E,YAAU,OAAuB,CACtD,KAAM,WAEN,eAAgB,CACd,MAAMhV,EAA6B,CAAA,EAE/B,OAAA,KAAK,QAAQ,WAAa,IACjBA,EAAA,KAAKqX,GAAS,UAAW,CAAA,EAGlC,KAAK,QAAQ,cAAgB,IACpBrX,EAAA,KACT4Z,EAAAA,YAAY,UAAU,CACpB,YAAa,CAAC,CAAE,KAAA3oB,EAAM,IAAAC,EAAK,OAAAN,KAAa,aAClC,QAAAH,EAAAQ,GAAA,YAAAA,EAAM,OAAN,YAAAR,EAAY,QAAS,UAChB,KAGLgK,EAAAxJ,GAAA,YAAAA,EAAM,OAAN,YAAAwJ,EAAY,QAAS,UAEhB,GAAGqC,EAAc,EAAE,mBAAmB7L,EAAK,MAAM,KAAK,UAAU,CAAC,KAEtE0J,EAAA1J,GAAA,YAAAA,EAAM,OAAN,YAAA0J,EAAY,QAAS,eAAeE,EAAA5J,GAAA,YAAAA,EAAM,OAAN,YAAA4J,EAAY,QAAS,QACpD,GAELjK,EAAO,iBAAiB,WAAW,QAAY0J,EAAI,OAAS,cAAc,EACrEwC,EAAc,EAAE,cAAc,EAG9BA,EAAc,EAAE,gBAAgB,CAG3C,EACA,GAAG,KAAK,QAAQ,WAAA,CACjB,CAAA,EAID,KAAK,QAAQ,QAAU,IACdkD,EAAA,KACT6Z,EAAAA,aAAM,UAAU,CACd,UAAW,QACX,GAAG,KAAK,QAAQ,KAAA,CACjB,CAAA,EAID,KAAK,QAAQ,OAAS,IACb7Z,EAAA,KAAK8Z,OAAK,UAAW,CAAA,EAE9B,KAAK,QAAQ,aAAe,IACnB9Z,EAAA,KAAKkZ,GAAW,UAAW,CAAA,EAGpC,KAAK,QAAQ,YAAc,IAClBlZ,EAAA,KAAK+Z,YAAU,UAAW,CAAA,EAGnC,KAAK,QAAQ,aAAe,IACnB/Z,EAAA,KACTga,EAAAA,WAAW,UAAU,CACnB,GAAG,KAAK,QAAQ,WAChB,MAAO,EACP,MAAO,qCAAA,CACR,CAAA,EAID,KAAK,QAAQ,iBAAmB,IAClCha,EAAW,KAAKia,iBAAe,UAAU,KAAK,QAAQ,cAAc,CAAC,EAGnE,KAAK,QAAQ,YAAc,IAC7Bja,EAAW,KAAKka,YAAU,UAAU,KAAK,QAAQ,SAAS,CAAC,EAGzD,KAAK,QAAQ,YAAc,IAC7Bla,EAAW,KAAKma,YAAU,UAAU,KAAK,QAAQ,SAAS,CAAC,EAGzD,KAAK,QAAQ,WAAa,IAC5Bna,EAAW,KAAKoa,WAAS,UAAU,KAAK,QAAQ,QAAQ,CAAC,EAGvD,KAAK,QAAQ,YAAc,IAC7Bpa,EAAW,KAAKqa,YAAU,UAAU,KAAK,QAAQ,SAAS,CAAC,EAGzD,KAAK,QAAQ,eAAiB,IAChCra,EAAW,KAAKoZ,GAAa,UAAU,KAAK,QAAQ,YAAY,CAAC,EAG/D,KAAK,QAAQ,YAAc,IAC7BpZ,EAAW,KAAK+Y,EAAS,EAGvB,KAAK,QAAQ,cAAgB,KAC/B/Y,EAAW,KAAKoY,EAAM,EACtBpY,EAAW,KAAK+P,EAAW,GAGtB/P,CACT,CACF,CAAC,EChOYsa,GAAoBtF,YAAU,OAAiC,CAC1E,KAAM,oBAEN,YAAa,OACJ,MAAA,CACL,IAAGvkB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,OAAQ,CAAC,CAAE,OAAAG,EAAQ,UAAA+S,EAAW,EAAAjL,KAAQ,CAC9B,MAAA6hB,EAAY5W,EAAU,QAAQ,UAC9B6W,EAAc7W,EAAU,QAAQ,YAEhC8W,EAA2B,CAC/B,UAAW5rB,EACX,eAAgB,CACd,OAAQ,IAAM+B,EAAO,SAAS,gBAAgB,EAC9C,SAAU,IAAMA,EAAO,SAAS,WAAW,GAAK,GAChD,SAAU,CAACA,EAAO,IAAA,EAAM,gBAAgB,EACxC,KAAM,YACN,QAAS8H,EAAE,0BAA0B,CACvC,CAAA,EAGIgiB,EAA6B,CACjC,UAAW7rB,EACX,eAAgB,CACd,OAAQ,IAAM+B,EAAO,SAAS,kBAAkB,EAChD,SAAU,IAAMA,EAAO,SAAS,aAAa,GAAK,GAClD,SAAU,CAACA,EAAO,IAAA,EAAM,kBAAkB,EAC1C,KAAM,cACN,QAAS8H,EAAE,4BAA4B,CACzC,CAAA,EAGIwF,EAA4B,CAAA,EAElC,OAAIqc,IAAc,IAChBrc,EAAM,KAAKuc,CAAM,EAEfD,IAAgB,IAClBtc,EAAM,KAAKwc,CAAQ,EAGdxc,CACT,CAAA,CAEJ,EAEA,eAAgB,CACd,MAAM8B,EAAyB,CAAA,EAE3B,OAAA,KAAK,QAAQ,YAAc,IAC7BA,EAAW,KAAK2a,cAAgB,UAAU,KAAK,QAAQ,SAAS,CAAC,EAG/D,KAAK,QAAQ,cAAgB,IAC/B3a,EAAW,KAAK4a,gBAAkB,UAAU,KAAK,QAAQ,WAAW,CAAC,EAGhE5a,CACT,CACF,CAAC,ECpDD,SAAS6a,GAAiB9rB,EAA+B,OACjD,MAAA+kB,EAASnX,EAAAA,QAAQ,IAAM,OACrB,MAAAiG,GAAYnS,EAAA1B,GAAA,YAAAA,EAAO,QAAP,YAAA0B,EAAc,KAAMkS,GAAWA,EAAE,YAC/C,OAAAC,GAAQ,CAACA,EAAK,QACT,CACL,GAAGA,EACH,KAAMA,GAAA,MAAAA,EAAM,KAAOA,GAAA,YAAAA,EAAM,KAAO7T,GAAA,YAAAA,EAAO,IAAA,EAGxB,CACjB,MAAOA,EAAM,QACb,KAAMA,EAAM,KACZ,SAAU,IAAM,EAAA,CAGX,EACN,CAACA,CAAK,CAAC,EAEV,cACG0D,EACC,CAAA,SAAA,CAAAtC,MAACwC,EAAoB,CAAA,SAAU5D,GAAA,YAAAA,EAAO,SAAU,QAAO,GACrD,SAAAoB,EAAA,IAACtB,EAAA,CACC,YAAY,+BACZ,KAAME,GAAA,YAAAA,EAAO,KACb,QAASA,GAAA,YAAAA,EAAO,QAChB,SAAUA,GAAA,YAAAA,EAAO,SAEjB,SAAAoB,EAAAA,IAACuU,GAAS,CAAA,UAAU,kDAAmD,CAAA,CAAA,CAAA,EAE3E,EACAvU,EAAAA,IAACwD,GAAoB,UAAU,SAC5B,6BAAO,sBAAO,IAAI,CAACwK,EAAW/E,IAE3B/I,EAAA,KAAC2D,GAAA,CACC,QAAS8f,EAAO,QAAU3V,EAAK,MAC/B,QAASA,EAAK,OAEd,UAAU,qDAEV,SAAA,CAAChO,EAAAA,IAAAqU,EAAA,CAAc,KAAMrG,GAAA,YAAAA,EAAM,IAAM,CAAA,EAChChO,EAAA,IAAA,OAAA,CAAK,UAAU,gBAAiB,WAAK,MAAM,EAC3C,CAAC,EAACgO,GAAA,MAAAA,EAAM,eACPhO,EAAA,IAAC,OAAK,CAAA,UAAU,iFACb,SAAA5B,GAAgB4P,EAAK,YAAY,CACpC,CAAA,CAAA,CAAA,EARG/E,CAAA,GAab,CACF,CAAA,CAAA,CAEJ,CC7Da,MAAA0hB,GAAW9F,YAAU,OAAwB,CACxD,KAAM,WACN,YAAa,OACJ,MAAA,CACL,IAAGvkB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,OAAO,CAAE,OAAAG,EAAQ,UAAA+S,EAAW,EAAAjL,GAAK,CACzB,MAAA6hB,EAAY5W,EAAU,QAAQ,UAC9B6W,EAAc7W,EAAU,QAAQ,YAChC8W,EAAe,CACnB,OAAQ,IAAM7pB,EAAO,SAAS,gBAAgB,EAC9C,SAAU,IAAMA,EAAO,SAAS,WAAW,GAAK,GAChD,SAAU,CAACA,EAAO,IAAA,EAAM,gBAAgB,EACxC,KAAM,YACN,MAAO8H,EAAE,0BAA0B,EACnC,aAAc,CAAC,MAAO,GAAG,CAAA,EAGrBgiB,EAAiB,CACrB,OAAQ,IAAM9pB,EAAO,SAAS,kBAAkB,EAChD,SAAU,IAAMA,EAAO,SAAS,aAAa,GAAK,GAClD,SAAU,CAACA,EAAO,IAAA,EAAM,kBAAkB,EAC1C,KAAM,cACN,MAAO8H,EAAE,4BAA4B,EACrC,aAAc,CAAC,MAAO,GAAG,CAAA,EAIrBwF,EAAgB,CAAA,EAEtB,OAAIqc,IAAc,IAChBrc,EAAM,KAAKuc,CAAM,EAEfD,IAAgB,IAClBtc,EAAM,KAAKwc,CAAQ,EAgBd,CACL,UAAWG,GACX,eAAgB,CACd,KAAM,OACN,QAASniB,EAAE,iBAAiB,EAC5B,SAAU,CAAC9H,EAAO,WAClB,MAAAsN,CACF,CAAA,CAEJ,CAAA,CAEJ,EAEA,eAAgB,CACd,MAAM8B,EAAyB,CAAA,EAE3B,OAAA,KAAK,QAAQ,YAAc,IAC7BA,EAAW,KAAK2a,cAAgB,UAAU,KAAK,QAAQ,SAAS,CAAC,EAG/D,KAAK,QAAQ,cAAgB,IAC/B3a,EAAW,KAAK4a,gBAAkB,UAAU,KAAK,QAAQ,WAAW,CAAC,EAGhE5a,CACT,CACF,CAAC,ECzEY+a,GAAS/F,YAAU,OAAsB,CACpD,KAAM,SACN,YAAa,OACJ,MAAA,CACL,IAAGvkB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,MAAO,CAAC,YAAa,UAAW,YAAY,EAC5C,UAAWiZ,GAAY,IACvB,UAAWA,GAAY,IACvB,OAAO,CAAE,OAAA9Y,EAAQ,EAAA8H,GAAwD,CAChE,MAAA,CACL,CACE,UAAW7J,EACX,eAAgB,CACd,OAAQ,IAAM,CACZ+B,EAAO,SAAS,QAClB,EACA,aAAc,CAAC,KAAK,EACpB,KAAM,iBACN,QAAS8H,EAAE,uBAAuB,CACpC,CACF,EACA,CACE,UAAW7J,EACX,eAAgB,CACd,OAAQ,IAAM,CACZ+B,EAAO,SAAS,SAClB,EACA,aAAc,CAAC,QAAS,KAAK,EAC7B,KAAM,iBACN,QAAS8H,EAAE,wBAAwB,CACrC,CACF,CAAA,CAEJ,CAAA,CAEJ,EAEA,qBAAsB,CACb,MAAA,CACL,CACE,MAAO,KAAK,QAAQ,MACpB,WAAY,CACV,OAAQ,CACN,QAAS,EACT,UAAY0c,GAAY,CAChB,MAAA4F,EAAY5F,EAAQ,QAAQ,OAClC,OAAQ4F,EAAY,OAAO,SAASA,EAAW,EAAE,EAAI,IAAM,CAC7D,EACA,WAAa3F,GACNA,EAAW,OAGT,CAAE,cAAeA,EAAW,QAF1B,EAIb,CACF,CACF,CAAA,CAEJ,EAEA,aAAc,CACL,MAAA,CACL,OAAQ,IACN7K,GAAoB,CAClB,MAAOd,GAAY,KACnB,MAAO,KAAK,QAAQ,KAAA,CACrB,EACH,QAAS,IACPc,GAAoB,CAClB,MAAOd,GAAY,KACnB,MAAO,KAAK,QAAQ,KAAA,CACrB,CAAA,CAEP,EAEA,sBAAuB,CACd,MAAA,CACL,IAAO,IAAM,KAAK,OAAO,SAAS,OAAO,EACzC,YAAa,IAAM,KAAK,OAAO,SAAS,QAAQ,CAAA,CAEpD,CACF,CAAC,ECvFD,SAASuR,GAAoBC,EAAuB,CAG3C,OAFY,OAAO,WAAWA,EAAiB,QAAQ,IAAK,EAAE,CAAC,EACzC,GAE/B,CAEA,SAASC,GAAmBpsB,EAAiC,CACrD,KAAA,CAAE,GAAMyN,IACR,CAAC/K,EAAOC,CAAQ,EAAIC,WAAS,SAAS,EAE5C,SAASypB,EAAkB9sB,EAAa,CAClCA,IAAQ,UACJS,EAAA,OAAO,SAAS,kBAGhBA,EAAA,OAAO,SAAS,cAAcT,CAAG,EAEzCoD,EAASpD,CAAG,CACd,CAEM,MAAA+sB,EAAc1e,EAAAA,QAAQ,IAAM,CAKhC,MAAM8G,EAJoB1U,EAAM,OAAO,iBAAiB,WAAW,KAChE2P,GAAWA,EAAE,OAAS,YACtB,EAAA,QACyB,YAChB,IAAKP,IAAe,CAC9B,MAAO8c,GAAoB9c,CAAI,EAC/B,MAAOA,CACP,EAAA,EAEF,OAAAsF,EAAE,QAAQ,CACR,MAAO,EAAE,gBAAgB,EACzB,MAAO,SAAA,CACR,EACMA,CAAA,EACN,CAAC1U,CAAK,CAAC,EAEV,cACG0D,EACC,CAAA,SAAA,CAAAtC,MAACwC,EAAoB,CAAA,SAAU5D,GAAA,YAAAA,EAAO,SAAU,QAAO,GACrD,SAAAoB,EAAA,IAACtB,EAAA,CACC,YAAY,+BACZ,KAAK,aACL,QAASE,GAAA,YAAAA,EAAO,QAChB,SAAUA,GAAA,YAAAA,EAAO,SAEjB,SAACoB,EAAA,IAAAqU,EAAA,CAAc,UAAU,iEAAiE,KAAK,WAAW,CAAA,CAAA,EAE9G,EACArU,MAACwD,GAAoB,UAAU,oBAC5B,0BAAa,IAAI,CAACwK,EAAW/E,IAE1BjJ,EAAA,IAAC6D,GAAA,CAEC,QAASmK,EAAK,QAAU1M,EACxB,QAAS,IAAM2pB,EAAkBjd,EAAK,KAAK,EAE1C,SAAKA,EAAA,KAAA,EAJD,cAAc/E,CAAK,EAAA,GAQhC,CACF,CAAA,CAAA,CAEJ,CC/EO,MAAMkiB,GAAqB,CAAC,YAAa,UAAW,YAAa,WAAW,EAkCnE,SAAAC,GAAkB3R,EAAiB4R,EAAwC,CACnF,KAAA,CAAE,UAAAzR,EAAW,IAAAD,CAAQ,EAAAF,EAM3B,GAJI,CAACG,GAAa,CAACD,GAIf,EAAEC,aAAqBC,EAAAA,eAAiBD,aAAqBE,EAAe,cACvE,OAAAL,EAGH,KAAA,CAAE,KAAAM,EAAM,GAAAC,CAAO,EAAAJ,EAEf0R,EAAkC,CAAA,EAClCC,EAAkBF,GAAcA,IAAextB,GAAsBwtB,EAAa,KAkBpF,GAhBJ1R,EAAI,aAAaI,EAAMC,EAAI,CAAClZ,EAAMC,IAAQ,CACxC,MAAMP,EAAWM,EAAK,KACtB,OAAIqqB,GAAmB,SAAS3qB,EAAS,IAAI,IACxBM,EAAK,MAAM,YAAc,QACzByqB,GACjBD,EAAM,KAAK,CACT,KAAAxqB,EACA,IAAAC,EACA,SAAAP,CAAA,CACD,EAEIA,EAAS,OAAS,aAAeA,EAAS,OAAS,aAErD,EAAA,CACR,EAEG8qB,EAAM,SAAW,EACZ,OAAA7R,EAGT,UAAW+R,KAAQF,EAAO,CACxB,KAAM,CAAE,KAAAxqB,EAAM,IAAAC,EAAK,SAAAP,CAAA,EAAagrB,EAC5B,GAAA,CAAE,MAAA3pB,CAAU,EAAAf,EAERe,EAAA,CACN,GAAGA,EACH,WAAY0pB,CAAA,EAGd9R,EAAKA,EAAG,cAAc1Y,EAAKP,EAAUqB,EAAOf,EAAK,KAAK,CACxD,CAEO,OAAA2Y,CACT,CAEO,SAASgS,GAAwBJ,EAA6B,CACnE,MAAO,CAAC,CAAE,MAAA3qB,EAAO,SAAA2H,KAAe,CACxB,KAAA,CAAE,UAAAuR,CAAc,EAAAlZ,EAClB,GAAA,CAAE,GAAA+Y,CAAO,EAAA/Y,EAKb,OAJK+Y,EAAAA,EAAG,aAAaG,CAAS,EAEzBH,EAAA2R,GAAkB3R,EAAI4R,CAAU,EAEjC5R,EAAG,YACDpR,GACFA,EAASoR,CAAE,EACN,IAGF,EAAA,CAEX,CCrFa,MAAAiS,GAAa7G,YAAU,OAA0B,CAC5D,KAAM,aACN,YAAa,OACJ,MAAA,CACL,IAAGvkB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,MAAO,CAAC,YAAa,UAAW,YAAa,WAAW,EACxD,YAAa3C,GACb,cAAeE,GACf,OAAO,CAAE,OAAA4C,EAAQ,EAAA8H,GAAiC,CACzC,MAAA,CACL,UAAWyiB,GACX,eAAgB,CACd,OAAAvqB,EACA,QAAS8H,EAAE,2BAA2B,CACxC,CAAA,CAEJ,CAAA,CAEJ,EAEA,qBAAsB,CACb,MAAA,CACL,CACE,MAAO,KAAK,QAAQ,MACpB,WAAY,CACV,WAAY,CACV,QAAS,KACT,UAAY0c,GACHA,EAAQ,MAAM,YAAc,KAAK,QAAQ,cAElD,WAAaC,GACPA,EAAW,aAAe,KAAK,QAAQ,eAAiB,CAACA,EAAW,WAC/D,GAEF,CAAE,MAAO,gBAAgBA,EAAW,UAAU,GAEzD,CACF,CACF,CAAA,CAEJ,EAEA,aAAc,CACL,MAAA,CACL,cAA6BmG,GAAAI,GAAwBJ,CAAU,EAC/D,gBACE,IACE,CAAC,CAAE,SAAAM,KACM,KAAK,QAAQ,MAAM,SAAcA,EAAS,gBAAgBhnB,EAAM,YAAY,CAAC,CACtF,CAER,CACF,CAAC,ECrEM,SAASinB,GAAa/b,EAAwB,CACnD,MAAMgc,EAAkB,CACtB,CACE,KAAM,SACN,MAAOlf,EAAc,EAAE,qBAAqB,EAC5C,SAAU,CAAC,CACb,EACA,CACE,KAAM,SACN,MAAOA,EAAc,EAAE,qBAAqB,EAC5C,SAAU,CAAC,CACb,CAAA,EAGS,OAAAkD,EAAA,QAAS2D,GAAc,CAE5BA,EAAU,KAAK,YAAY,IAAM,WACnCA,EAAU,QAAQ,OAAO,QAAS8Q,GAA4C,CACrEuH,EAAA,CAAC,EAAE,SAAS,KAAK,CACtB,KAAM,UAAUvH,CAAK,GACrB,MAAO3X,EAAc,EAAE,mBAAmB2X,CAAK,UAAU,EACzD,QAAS,CAAC,IAAIA,CAAK,GAAI,KAAM,KAAKA,CAAK,EAAE,EACzC,SAAU,UAAUA,CAAK,GACzB,OAAQ,CAAC,CAAE,OAAA7jB,EAAQ,MAAA+lB,KAAY,CAC7B/lB,EAAO,MAAM,EAAE,MAAM,EAAE,YAAY+lB,CAAK,EAAE,WAAW,CAAE,MAAAlC,EAAO,EAAE,IAAI,CACtE,CAAA,CACD,CAAA,CACF,EAGC9Q,EAAU,KAAK,YAAY,IAAM,cAC5BqY,EAAA,CAAC,EAAE,SAAS,KAAK,CACtB,KAAM,aACN,MAAOlf,EAAc,EAAE,2BAA2B,EAClD,QAAS,CAAC,KAAM,MAAM,EACtB,SAAU,OACV,OAAQ,CAAC,CAAE,OAAAlM,EAAQ,MAAA+lB,KAAY,CACtB/lB,EAAA,QAAQ,QAAQ,YAAY+lB,CAAK,EAAE,mBAAmB,KAC/D,CAAA,CACD,EAGChT,EAAU,KAAK,YAAY,IAAM,eAC5BqY,EAAA,CAAC,EAAE,SAAS,KAAK,CACtB,KAAM,eACN,MAAOlf,EAAc,EAAE,4BAA4B,EACnD,QAAS,CAAC,KAAM,MAAM,EACtB,SAAU,cACV,OAAQ,CAAC,CAAE,OAAAlM,EAAQ,MAAA+lB,KAAY,CACtB/lB,EAAA,QAAQ,QAAQ,YAAY+lB,CAAK,EAAE,oBAAoB,KAChE,CAAA,CACD,EAGChT,EAAU,KAAK,YAAY,IAAM,YAC5BqY,EAAA,CAAC,EAAE,SAAS,KAAK,CACtB,KAAM,WACN,MAAOlf,EAAc,EAAE,yBAAyB,EAChD,SAAU,WACV,YAAa,4BACb,QAAS,CAAC,MAAM,EAChB,OAAQ,CAAC,CAAE,OAAAlM,EAAQ,MAAA+lB,KAAY,CACtB/lB,EAAA,QAAQ,QAAQ,YAAY+lB,CAAK,EAAE,iBAAiB,KAC7D,CAAA,CACD,EAGChT,EAAU,KAAK,YAAY,IAAM,cAC5BqY,EAAA,CAAC,EAAE,SAAS,KAAK,CACtB,KAAM,aACN,MAAOlf,EAAc,EAAE,2BAA2B,EAClD,YAAa,SACb,QAAS,CAAC,IAAI,EACd,SAAU,YACV,OAAQ,CAAC,CAAE,OAAAlM,EAAQ,MAAA+lB,KAAY,CACtB/lB,EAAA,QAAQ,QAAQ,YAAY+lB,CAAK,EAAE,gBAAgB,KAC5D,CAAA,CACD,EAGChT,EAAU,KAAK,YAAY,IAAM,aAC5BqY,EAAA,CAAC,EAAE,SAAS,KAAK,CACtB,KAAM,YACN,MAAOlf,EAAc,EAAE,0BAA0B,EACjD,SAAU,QACV,YAAa,sCACb,eAAgBlM,GAAUA,EAAO,SAAS,SAAS,EACnD,OAAQ,CAAC,CAAE,OAAAA,EAAQ,MAAA+lB,KAAY,CACtB/lB,EAAA,QAAQ,QAAQ,YAAY+lB,CAAK,EAAE,eAAe,KAC3D,CAAA,CACD,EAIChT,EAAU,KAAK,YAAY,IAAM,SAC5BqY,EAAA,CAAC,EAAE,SAAS,KAAK,CACtB,KAAM,QACN,MAAOlf,EAAc,EAAE,sBAAsB,EAC7C,SAAU,UACV,YAAa,iBACb,QAAS,CAAC,QAAS,KAAM,QAAQ,EACjC,eAAgBlM,GAAUA,EAAO,SAAS,SAAS,EACnD,OAAQ,CAAC,CAAE,OAAAA,EAAQ,MAAA+lB,KAAY,CACtB/lB,EAAA,QAAQ,QAAQ,YAAY+lB,CAAK,EAAE,iBAAiB,KAC7D,CAAA,CACD,EAGChT,EAAU,KAAK,YAAY,IAAM,SAC5BqY,EAAA,CAAC,EAAE,SAAS,KAAK,CACtB,KAAM,QACN,MAAOlf,EAAc,EAAE,sBAAsB,EAC7C,SAAU,QACV,YAAa,iBACb,QAAS,CAAC,QAAS,KAAM,QAAQ,EACjC,eAAgBlM,GAAUA,EAAO,SAAS,SAAS,EACnD,OAAQ,CAAC,CAAE,OAAAA,EAAQ,MAAA+lB,KAAY,CACtB/lB,EAAA,QAAQ,QAAQ,YAAY+lB,CAAK,EAAE,iBAAiB,KAC7D,CAAA,CACD,EAGChT,EAAU,KAAK,YAAY,IAAM,SAC5BqY,EAAA,CAAC,EAAE,SAAS,KAAK,CACtB,KAAM,QACN,MAAOlf,EAAc,EAAE,sBAAsB,EAC7C,SAAU,QACV,YAAa,iBACb,QAAS,CAAC,QAAS,KAAM,SAAU,MAAM,EACzC,eAAgBlM,GAAUA,EAAO,SAAS,SAAS,EACnD,OAAQ,CAAC,CAAE,OAAAA,EAAQ,MAAA+lB,KAAY,CAC7B/lB,EACG,QACA,MAAA,EACA,YAAY+lB,CAAK,EACjB,YAAY,CAAE,KAAM,EAAG,KAAM,EAAG,cAAe,EAAO,CAAA,EACtD,KACL,CAAA,CACD,EAGChT,EAAU,KAAK,YAAY,IAAM,kBAC5BqY,EAAA,CAAC,EAAE,SAAS,KAAK,CACtB,KAAM,iBACN,MAAOlf,EAAc,EAAE,+BAA+B,EACtD,SAAU,QACV,YAAa,8BACb,QAAS,CAAC,KAAM,MAAO,IAAI,EAC3B,OAAQ,CAAC,CAAE,OAAAlM,EAAQ,MAAA+lB,KAAY,CACtB/lB,EAAA,QAAQ,QAAQ,YAAY+lB,CAAK,EAAE,oBAAoB,KAChE,CAAA,CACD,EAGChT,EAAU,KAAK,YAAY,IAAM,WAC5BqY,EAAA,CAAC,EAAE,SAAS,KAAK,CACtB,KAAM,UACN,MAAOlf,EAAc,EAAE,wBAAwB,EAC/C,SAAU,WACV,YAAa,yBACb,OAAQ,CAAC,CAAE,OAAAlM,KAAa,CACfA,EAAA,QAAQ,QAAQ,cAAc,CAAE,KAAM,CAAA,CAAG,EAAE,KACpD,CAAA,CACD,CACH,CACD,EAEMorB,CACT,CChKA,SAASC,GAAaltB,EAAYC,EAAU,SAE1C,KAAM,CAACktB,EAAsBC,CAAuB,EAAIxqB,WAAS,CAAC,EAC5D,CAACyqB,EAAoBC,CAAqB,EAAI1qB,WAAS,CAAC,EAExD2qB,EAAkBzqB,SAA8B,IAAI,EAEpD,CAAE,EAAA6G,GAAM8D,IAER+f,EAAiB1qB,SAAqC,CAAA,CAAE,EAE9DqR,EAAA,oBAAoBlU,EAAK,KAChB,CACL,UAAAwtB,CAAA,EAEH,EAED1qB,EAAAA,UAAU,IAAM,CACV,GAAA,CAACwqB,EAAgB,QACnB,OAEI,MAAAG,EAAkBL,EAAqB,IAAOF,EAC9CjD,EAAasD,EAAe,QAAQE,CAAe,EACrDxD,GACFA,EAAW,eAAe,CACxB,SAAU,SACV,MAAO,SAAA,CACR,CACH,EACC,CAACiD,EAAsBE,CAAkB,CAAC,EAEpC,SAAAI,EAAU,CAAE,MAAAtN,GAAc,CAC7B,OAAAA,EAAM,MAAQ,WACNwN,IACH,IAGLxN,EAAM,MAAQ,aACJyN,IACL,IAGLzN,EAAM,MAAQ,SACH0N,IACN,IAGF,EACT,CAEA,SAASF,GAAY,OACf,GAAA3tB,EAAM,MAAM,SAAW,EAClB,MAAA,GAET,IAAI8tB,EAAkBX,EAAuB,EACzCY,EAAgBV,EAEhBS,EAAkB,IACpBC,EAAgBV,EAAqB,EACrCS,IAAkBpsB,EAAA1B,EAAM,MAAM+tB,CAAa,IAAzB,YAAArsB,EAA4B,SAAS,QAAS,GAAK,GAGnEqsB,EAAgB,IACFA,EAAA/tB,EAAM,MAAM,OAAS,EACrC8tB,EAAkB9tB,EAAM,MAAM+tB,CAAa,EAAE,SAAS,OAAS,GAGjEX,EAAwBU,CAAe,EACvCR,EAAsBS,CAAa,CACrC,CAEA,SAASH,GAAc,CACjB,GAAA5tB,EAAM,MAAM,SAAW,EAClB,MAAA,GAET,MAAM+sB,EAAW/sB,EAAM,MAAMqtB,CAAkB,EAAE,SACjD,IAAIS,EAAkBX,EAAuB,EACzCY,EAAgBV,EAEhBN,EAAS,OAAS,EAAIe,IACNA,EAAA,EAClBC,EAAgBV,EAAqB,GAEnCrtB,EAAM,MAAM,OAAS,EAAI+tB,IACXA,EAAA,GAElBX,EAAwBU,CAAe,EACvCR,EAAsBS,CAAa,CACrC,CAEA,SAASF,GAAe,CACtB,GAAI7tB,EAAM,MAAM,SAAW,GAAKqtB,IAAuB,IAAMF,IAAyB,GAC7E,MAAA,GAGTa,EAAWX,EAAoBF,CAAoB,CACrD,CAES,SAAAa,EAAWC,EAAoBC,EAAsB,CAC5D,MAAMC,EAAUnuB,EAAM,MAAMiuB,CAAU,EAAE,SAASC,CAAY,EAC7DluB,EAAM,QAAQmuB,CAAO,CACvB,CAES,SAAAC,EAA0BH,EAAoBC,EAAsB,CAC3EF,EAAWC,EAAYC,CAAY,CACrC,CACS,SAAAG,EAAiBJ,EAAoBC,EAAsBI,EAAS,CAC3Ed,EAAe,QAAQS,EAAa,IAAOC,CAAY,EAAII,CAC7D,CAGE,OAAAltB,EAAA,IAAC,MAAA,CACC,UAAU,+RACV,IAAKmsB,EAEJ,UAAO7rB,EAAA1B,GAAA,YAAAA,EAAA,QAAA,MAAA0B,EAAO,OAETN,EAAA,IAAC,MAAI,CAAA,UAAU,wEACZ,UAAAsK,EAAA1L,GAAA,YAAAA,EAAO,QAAP,YAAA0L,EAAc,IAAI,CAAC6iB,EAAYN,WAE3BhjB,WACC,CAAA,SAAA,CAAA7J,EAAA,IAAC,MAAI,CAAA,UAAU,kNACZ,SAAAmtB,EAAM,MACT,EAECA,EAAM,SAAS,IAAI,CAACJ,EAAcD,IAE/B5sB,EAAA,KAAC,SAAA,CACC,UAAW5B,EAAG,2TAA4T,CACxU,uBAAwB2tB,IAAuBY,GAAcd,IAAyBe,CAAA,CACvF,EACD,IAAKI,GAAMD,EAAiBJ,EAAYC,EAAcI,CAAE,EAExD,QAAS,IAAMF,EAA0BH,EAAYC,CAAY,EAEhE,SAAA,CAAQC,EAAA,eAAY,MAAI,CAAA,UAAU,4BAA4B,IAAKA,EAAQ,QAAS,IAAI,EAAG,CAAA,EAC3FA,EAAQ,UACN/sB,EAAA,IAAAqU,EAAA,CAAc,KAAM0Y,EAAQ,SAAU,UAAU,mCAAmC,EAErFA,EAAQ,KAAA,CAAA,EAPJ,WAAWD,CAAY,EAAA,CAUjC,CAAA,GAtBYK,EAAM,KAuBrB,EAEH,CACH,EAGAntB,MAAC,OAAI,UAAU,eACb,SAACA,EAAAA,IAAA,OAAA,CAAK,UAAU,sEACb,SAAEuI,EAAA,oBAAoB,CACzB,CAAA,EACF,CAAA,CAAA,CAIZ,CAEA,MAAe4K,GAAAA,EAAAA,WAAW2Y,EAAY,EClKhCsB,GAAgB,eACtB,IAAIC,EACS,MAAAC,GAAezI,YAAU,OAAO,CAC3C,KAAMuI,GACN,SAAU,IACV,UAAW,CACTC,EAAQE,QAAM,OAAQ,CACpB,YAAa,GACb,QAAS,SACT,UAAW,eACX,MAAO,gBACP,SAAU,QACV,OAAQ,CAAC,GAAI,CAAC,EACd,cAAe,CACb,SAAU,QACV,UAAW,CACT,CACE,KAAM,OACN,QAAS,EACX,CACF,CACF,CAAA,CACD,CACH,EAEA,uBAAwB,CACf,MAAA,CACLC,aAAW,CACT,OAAQ,KAAK,OACb,KAAM,IACN,YAAa,GACb,YAAa,GACb,UAAW,IAAI/K,EAAA,UAAU2K,EAAa,EACtC,MAAO,CAAC,CAAE,MAAA1sB,EAAO,MAAA8lB,KAAY,WAC3B,MAAMhK,EAAQ9b,EAAM,IAAI,QAAQ8lB,EAAM,IAAI,EACpCiH,EAAcjR,EAAM,QAAU,EAC9BkR,EAAclR,EAAM,OAAO,KAAK,OAAS,YACzCmR,IAAgBrtB,EAAAkc,EAAM,OAAO,cAAb,YAAAlc,EAA0B,OAAO,MAAO,IAExDstB,EAAa,KAAK,OAAO,SAAS,QAAQ,EAC1CC,GAAerjB,EAAAgS,EAAM,OAAO,cAAb,YAAAhS,EAA0B,MAC7C,KAAK,IAAI,GAAGF,EAAAkS,EAAM,OAAO,cAAb,YAAAlS,EAA0B,QAAQ,IAAI,GAE9CwjB,EAAsB,EAACD,GAAA,MAAAA,EAAc,SAAS,OAEpD,OACIJ,GAAeC,GAAeC,GAC5BC,GAAcF,GAAeC,IAC9BG,CAEP,EACA,QAAS,CAAC,CAAE,OAAArtB,EAAQ,MAAA+lB,EAAO,MAAA5nB,KAA0D,CAC7E,KAAA,CAAE,KAAA8e,CAAS,EAAAjd,EACjB7B,EAAM,OAAO,CAAE,OAAA6B,EAAQ,MAAA+lB,CAAO,CAAA,EAC9B9I,EAAK,MAAM,CACb,EACA,MAAO,CAAC,CAAE,MAAAqQ,EAAO,OAAAttB,KAGAmrB,GAAanrB,EAAO,iBAAiB,UAAU,EAC1B,IAAc0sB,IAAA,CAChD,GAAGA,EACH,SAAUA,EAAM,SACb,OAAQnf,GAAS,CAChB,MAAMggB,EAAkBhgB,EAAK,MAAM,cAAc,KAAK,EAChDigB,EAAkBF,EAAM,YAAY,EAAE,KAAK,EAEjD,GAAI/f,EAAK,QAAS,CACV,MAAAkgB,EAAUlgB,EAAK,QAAQ,OAAamgB,EAAM,YAAA,EAAc,KAAA,CAAM,EAC9DC,EAAaJ,EAAgB,MAAMC,CAAe,EAClDI,EAAaH,EAAQ,QAAcC,EAAM,MAAMF,CAAe,CAAC,EAErE,OAAOG,GAAcC,CACvB,CAEO,OAAAL,EAAgB,MAAMC,CAAe,CAC7C,CAAA,EACA,OAAOlB,GACNA,EAAQ,eAAiB,CAACA,EAAQ,eAAe,KAAK,MAAM,EAAI,EAClE,CACF,EAAA,EAE8C,OAAQI,GAClDA,EAAM,SAAS,OAAS,CAK7B,EAC8C,IAAcA,IAAA,CAC3D,GAAGA,EACH,SAAUA,EAAM,SAAS,IAAgBJ,IAAA,CACvC,GAAGA,EACH,UAAW,EAAA,EACX,CACF,EAAA,EAIJ,OAAQ,IAAM,CACR,IAAAuB,EACAC,EAAqC,KAClC,MAAA,CACL,QAAU3vB,GAA2B,OACvB0vB,EAAA,IAAIE,gBAAc1C,GAAc,CAC1C,MAAAltB,EACA,OAAQA,EAAM,MAAA,CACf,EACK,KAAA,CAAE,KAAA8e,CAAK,EAAI9e,EAAM,OAEjB6e,EAAyB,IAAM,CAC/B,GAAA,CAAC7e,EAAM,WACT,OAAOA,EAAM,OAAO,QAAQwuB,EAAa,EAAE,KAGvC,MAAAqB,EAAO7vB,EAAM,aAEnB,GAAI,CAAC6vB,EACH,OAAO7vB,EAAM,OAAO,QAAQwuB,EAAa,EAAE,KAG7C,IAAIsB,EAAOD,EAAK,EAEhB,GAAIA,EAAK,IAAMH,EAAU,QAAQ,aAAe,GAAK,OAAO,YAAa,CACvE,MAAMhc,EAAOmc,EAAK,IAAMH,EAAU,QAAQ,aAAe,OAAO,YAAc,GAC9EI,EAAOD,EAAK,EAAInc,CAClB,CAIO,OAAA,IAAI,QAAQmc,EAAK,EAAGC,EAAMD,EAAK,MAAOA,EAAK,MAAM,CAAA,EAG1DF,EAAgB,IAAM,CACZlB,GAAA,MAAAA,EAAA,GAAG,SAAS,CAClB,uBAAA5P,CAAA,EACD,GAGHnd,EAAAod,EAAK,IAAI,gBAAT,MAAApd,EAAwB,iBAAiB,SAAUiuB,GAE3ClB,GAAA,MAAAA,EAAA,GAAG,SAAS,CAClB,uBAAA5P,EACA,SAAU,IAAM,SAAS,KACzB,QAAS6Q,EAAU,OAAA,GAGbjB,GAAA,MAAAA,EAAA,GAAG,MACb,EAEA,SAASzuB,EAAwB,OAC/B0vB,EAAU,YAAY1vB,CAAK,EAErB,KAAA,CAAE,KAAA8e,CAAK,EAAI9e,EAAM,OAIjB6e,EAAyB,IAAM,CAC/B,GAAA,CAAC7e,EAAM,WACT,OAAOA,EAAM,OAAO,QAAQwuB,EAAa,EAAE,KAGvC,MAAAqB,EAAO7vB,EAAM,aAEnB,OAAK6vB,EAKE,IAAI,QAAQA,EAAK,EAAGA,EAAK,EAAGA,EAAK,MAAOA,EAAK,MAAM,EAJjD7vB,EAAM,OAAO,QAAQwuB,EAAa,EAAE,IAIa,EAGtDmB,EAAgB,IAAM,CAClBlB,GAAA,MAAAA,EAAA,GAAG,SAAS,CAClB,uBAAA5P,CAAA,EACD,GAGHnd,EAAAod,EAAK,IAAI,gBAAT,MAAApd,EAAwB,iBAAiB,SAAUiuB,GAE7C3vB,EAAA,OAAO,QAAQwuB,EAAa,EAAE,KAAOxuB,EAAM,WAC7C6e,IACA,CACE,MAAO,EACP,OAAQ,EACR,KAAM,EACN,IAAK,EACL,MAAO,EACP,OAAQ,CAAA,EAEN4P,GAAA,MAAAA,EAAA,GAAG,SAAS,CAClB,uBAAA5P,CAAA,EAEJ,EAEA,UAAU7e,EAA+B,OACnC,OAAAA,EAAM,MAAM,MAAQ,UACdyuB,GAAA,MAAAA,EAAA,GAAG,OAEJ,KAGJA,GAAA,MAAAA,EAAQ,GAAG,MAAM,SACZA,GAAA,MAAAA,EAAA,GAAG,QAGN/sB,EAAAguB,EAAU,MAAV,YAAAhuB,EAAe,UAAU1B,GAClC,EAEA,OAAOA,EAAO,OAEZ,GADQyuB,GAAA,MAAAA,EAAA,GAAG,OACPkB,EAAe,CACX,KAAA,CAAE,KAAA7Q,CAAK,EAAI9e,EAAM,QACvB0B,EAAAod,EAAK,IAAI,gBAAT,MAAApd,EAAwB,oBAAoB,SAAUiuB,EACxD,CACAD,EAAU,QAAQ,CACpB,CAAA,CAEJ,CAAA,CACD,CAAA,CAEL,EAEA,YAAa,CACJ,MAAA,CACL,KAAM,CACJ,MAAO,EACP,OAAQ,EACR,KAAM,EACN,IAAK,EACL,MAAO,EACP,OAAQ,CACV,CAAA,CAEJ,CACF,CAAC,ECzOKK,GAAkB,CACtB,SAAU,KACV,UAAW,KACX,YAAa,KACb,aAAc,IAChB,EAEA,SAASC,GAAUhwB,EAAY,OAC7B,KAAM,CAACiwB,EAASC,CAAU,EAAIttB,WAAe,CAC3C,MAAO3E,GACP,OAAQA,EAAA,CACT,EAEK,CAACkyB,EAAcC,CAAe,EAAIxtB,WAAS,CAC/C,MAAO,EACP,OAAQ,CAAA,CACT,EAEK,CAACytB,CAAgB,EAAIztB,WAAmB,CAC5CmtB,GAAgB,SAChBA,GAAgB,UAChBA,GAAgB,YAChBA,GAAgB,YAAA,CACjB,EAEK,CAACO,EAAUC,CAAW,EAAI3tB,WAAkB,EAAK,EAEjD,CAAC4tB,EAAcC,CAAe,EAAI7tB,WAAS,CAC/C,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,IAAK,EAAA,CACN,EAEK8tB,EAAW9iB,EAAAA,QAAQ,IAAM,OACvB,KAAA,CAAE,IAAA+iB,EAAK,IAAAC,EAAK,MAAOC,EAAG,OAAQvO,IAAM5gB,EAAA1B,GAAA,YAAAA,EAAO,OAAP,YAAA0B,EAAa,MACjDovB,EAAQxgB,GAASugB,CAAC,EAAI,GAAGA,CAAC,KAAOA,EACjCE,EAASzgB,GAASgS,CAAC,EAAI,GAAGA,CAAC,KAAOA,EACjC,MAAA,CACL,IAAKqO,GAAO,OACZ,IAAKC,GAAO,OACZ,MAAO,CACL,MAAOE,GAAS,OAChB,OAAQC,GAAU,MACpB,CAAA,CAED,EAAA,EAACrvB,EAAA1B,GAAA,YAAAA,EAAO,OAAP,YAAA0B,EAAa,KAAK,CAAC,EAEjBsvB,EAAgBpjB,EAAAA,QAAQ,IAAM,CAC5B,KAAA,CACJ,MAAO,CAAE,MAAAkjB,CAAM,CACb,EAAAJ,EAEJ,MAAO,CAAE,MAAOI,IAAU,OAASA,EAAQ,OAAU,EACpD,CAACJ,CAAQ,CAAC,EAEb,SAASO,EAAYthB,EAAwB,CAC3BygB,EAAA,CACd,MAAOzgB,EAAE,OAAO,MAChB,OAAQA,EAAE,OAAO,MAAA,CAClB,CACH,CAGA,SAASuhB,GAAc,CACf,KAAA,CAAE,OAAArvB,EAAQ,OAAAsvB,CAAW,EAAAnxB,EACpB6B,EAAA,SAAS,iBAAiBsvB,EAAQ,CAAA,CAC3C,CAEA,MAAMC,EAAavmB,EAAA,YACjBkJ,EAAAA,SAAS,IAAM,CACP,KAAA,CAAE,OAAAlS,CAAW,EAAA7B,EACb,CAAE,MAAA8wB,CAAM,EAAI,iBAAiBjvB,EAAO,KAAK,GAAG,EAClDquB,EAAYmB,IACH,CACL,GAAGA,EACH,MAAO,OAAO,SAASP,EAAO,EAAE,CAAA,EAEnC,GACA5yB,EAAwB,EAC3B,CAAC8B,GAAA,YAAAA,EAAO,MAAM,CAAA,EAGP,SAAAsxB,EAAY3hB,EAAe4hB,EAAa,CAC/C5hB,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAElB,MAAM6hB,EAAgBrB,EAAa,MAC7BsB,EAAiBtB,EAAa,OAC9BuB,EAAcF,EAAgBC,EAEpC,IAAIX,EAAQ,OAAO9wB,EAAM,KAAK,MAAM,KAAK,EACrC+wB,EAAS,OAAO/wB,EAAM,KAAK,MAAM,MAAM,EAC3C,MAAM2xB,EAAW1B,EAAQ,MAErBa,GAAS,CAACC,GACJD,EAAAA,EAAQa,EAAWA,EAAWb,EAC7BC,EAAA,KAAK,MAAMD,EAAQY,CAAW,GAEhCX,GAAU,CAACD,GACVA,EAAA,KAAK,MAAMC,EAASW,CAAW,EAC/BZ,EAAAA,EAAQa,EAAWA,EAAWb,GAE/B,CAACA,GAAS,CAACC,GACVD,EAAAU,EAAgBG,EAAWA,EAAWH,EACrCT,EAAA,KAAK,MAAMD,EAAQY,CAAW,GAG/BZ,EAAAA,EAAQa,EAAWA,EAAWb,EAGxCc,GAAAA,UAAU,IAAM,CACdrB,EAAY,EAAI,EAEAE,EAAA,CACd,EAAG9gB,EAAE,QACL,EAAGA,EAAE,QACL,EAAGmhB,EACH,EAAGC,EACH,IAAAQ,CAAA,CACD,CAAA,CACF,CACH,CAEA,MAAMM,EAAchnB,EAAA,YAClBkJ,EAAA,SAAUpE,GAAkB,CAI1B,GAHAA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EAEd,CAAC2gB,EACH,OAGF,KAAM,CAAE,EAAAwB,EAAG,EAAAjB,EAAG,IAAAU,CAAA,EAAQf,EAEhBuB,GAAMpiB,EAAE,QAAUmiB,IAAM,IAAI,KAAKP,CAAG,EAAI,GAAK,GAG7CT,EAAQ3gB,GAAM0gB,EAAIkB,EAAI/zB,GAAgBiyB,EAAQ,KAAK,EAGzDjwB,EAAM,iBAAiB,CACrB,MAAA8wB,EACA,OAJa,IAIb,CACD,GACA5yB,EAAwB,EAC3B,CAACoyB,EAAUE,EAAcP,EAASjwB,EAAM,gBAAgB,CAAA,EAGpDgyB,EAAYnnB,EAAA,YACf8E,GAAkB,CACjBA,EAAE,eAAe,EACjBA,EAAE,gBAAgB,EACb2gB,IAILsB,GAAAA,UAAU,IAAM,CACEnB,EAAA,CACd,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,IAAK,EAAA,CACN,EACDF,EAAY,EAAK,CAAA,CAClB,EAEWW,IACd,EACA,CAACZ,EAAUY,CAAW,CAAA,EAGlBe,EAAWpnB,EAAAA,YAAY,IAAM,CACvB,yBAAA,iBAAiB,YAAagnB,EAAa,IAC3C,yBAAA,iBAAiB,UAAWG,EAAW,GAAI,EACpD,CAACH,EAAaG,CAAS,CAAC,EAErBE,EAAYrnB,EAAAA,YAAY,IAAM,CACxB,yBAAA,oBAAoB,YAAagnB,EAAa,IAC9C,yBAAA,oBAAoB,UAAWG,EAAW,GAAI,EACvD,CAACH,EAAaG,CAAS,CAAC,EAE3BjvB,EAAAA,UAAU,KACJutB,EACO2B,IAGCC,IAGL,IAAM,CACDA,GAAA,GAEX,CAAC5B,EAAU2B,EAAUC,CAAS,CAAC,EAE5B,MAAAC,EAA2BvkB,EAAAA,QAAQ,IAChC,IAAI,eAAe,IAAMwjB,EAAA,CAAY,EAC3C,CAACA,CAAU,CAAC,EAEfruB,OAAAA,EAAAA,UAAU,KACRovB,EAAS,QAAQnyB,EAAM,OAAO,KAAK,GAAG,EAE/B,IAAM,CACXmyB,EAAS,WAAW,CAAA,GAErB,CAACnyB,EAAM,OAAO,KAAK,IAAKmyB,CAAQ,CAAC,EAGlC/wB,MAACgxB,EAAAA,gBAAgB,CAAA,UAAU,aAAa,MAAO,CAAE,GAAGpB,EAAe,MAAO,MACxE,EAAA,SAAA1vB,EAAA,KAAC,MAAA,CACC,UAAU,OACV,mBAAgB,GAChB,UAAW,oBAAoBtB,GAAA,MAAAA,EAAO,SAAW,4BAA8B,EAAE,IAC/EswB,EAAW,6BAA+B,EAC5C,GACA,MAAOU,EAEP,SAAA,CAAA5vB,EAAA,IAAC,MAAA,CACC,IAAKsvB,EAAS,IACd,IAAKA,EAAS,IACd,MAAOA,EAAS,MAChB,OAAO,OACP,UAAU,gCACV,OAAQO,EACR,QAASC,CAAA,CACX,GACClxB,GAAA,YAAAA,EAAO,OAAO,KAAK,aAAaA,GAAA,YAAAA,EAAO,WAAYswB,IACjDlvB,EAAAA,IAAA,MAAA,CAAI,UAAU,gBACZ,SAAkBivB,GAAA,YAAAA,EAAA,IAAKgC,GAEpBjxB,EAAA,IAAC,OAAA,CAEC,UAAW,kDAAkDixB,CAAS,GACtE,YAAc1iB,GAAW2hB,EAAY3hB,EAAG0iB,CAAS,CAAA,EAF5CA,CAAA,GAOb,CAAA,CAAA,CAGN,CAAA,CAAA,CAEJ,CCnOa,MAAAC,GAAQC,QAAY,OAAO,CACtC,QAAS,CACA,MAAA,EACT,EACA,OAAQ,CACC,MAAA,QACT,EACA,eAAgB,OACP,MAAA,CACL,IAAG7wB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,MAAO,CACL,QAAS,KACT,UAAY2kB,GAAY,CACtB,MAAMyK,EAAQzK,EAAQ,MAAM,OAASA,EAAQ,aAAa,OAAO,GAAK,KACtE,OAAOyK,GAAS,KAAY,KAAO,OAAO,SAASA,EAAO,EAAE,CAC9D,EACA,WAAaxK,IACJ,CACL,MAAOA,EAAW,KAAA,EAGxB,CAAA,CAEJ,EAEA,YAAa,OACJ,MAAA,CACL,IAAG5kB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,OAAQ,GACR,OAAQ,IAAA,CAEZ,EAEA,aAAc,CACZ,OAAO8wB,EAAAA,sBAAsBxC,EAAS,CACxC,EACA,aAAc,OACL,MAAA,CACL,IAAGtuB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,YACE+wB,GACE,CAAC,CAAE,SAAA1F,KACMA,EAAS,iBAAiB,KAAK,KAAM0F,CAAO,CACrD,CAER,EACA,WAAW,CAAE,eAAAhL,GAAkB,CACtB,MAAA,CACL,MACAC,EAAA,gBAEE,CACE,OAAQ,MACV,EACA,KAAK,QAAQ,eACbD,CACF,CAAA,CAEJ,EAEA,WAAY,CACH,MAAA,CACL,CACE,IAAK,UACP,CAAA,CAEJ,CACF,CAAC,EC7FKiL,GAAY,IAAI7O,YAAU,cAAc,EAOvC,SAAS8O,IAAqB,CACnC,OAAO,IAAI/O,EAAAA,OAAO,CAChB,IAAK8O,GACL,MAAO,CACL,MAAO,CACL,OAAOjP,EAAAA,cAAc,KACvB,EACA,MAAM5I,EAAS+X,EAAU,CACvBA,EAAMA,EAAI,IAAI/X,EAAG,QAASA,EAAG,GAAG,EAC1B,MAAAra,EAASqa,EAAG,QAAQ6X,EAAS,EAEnC,GAAIlyB,GAAA,MAAAA,EAAQ,IACV,SAAW,CAAE,GAAAuJ,EAAI,IAAA5H,EAAK,IAAAwuB,CAAI,IAAKnwB,EAAO,IAAK,CACnC,MAAAqyB,EAAcC,GAAkBnC,CAAG,EACnCoC,EAAOvP,EAAAA,WAAW,OAAOrhB,EAAK0wB,EAAa,CAAE,GAAA9oB,EAAI,EACvD6oB,EAAMA,EAAI,IAAI/X,EAAG,IAAK,CAACkY,CAAI,CAAC,CAC9B,SAEOvyB,GAAA,MAAAA,EAAQ,OACJ,UAAAuJ,KAAMvJ,EAAO,OAChBoyB,EAAAA,EAAI,OAAOA,EAAI,KAAK,OAAW,OAAYI,GAAcA,EAAK,KAAOjpB,CAAE,CAAC,EAI3E,OAAA6oB,CACT,CACF,EACA,MAAO,CACL,YAAY9wB,EAAO,CACV,OAAA,KAAK,SAASA,CAAK,CAC5B,CACF,CAAA,CACD,CACH,CAEA,SAASgxB,GAAkBnC,EAA0B,CAC7C,MAAAkC,EAAc,SAAS,cAAc,KAAK,EAC1CI,EAAQ,SAAS,cAAc,KAAK,EACpC,OAAAA,EAAA,aAAa,QAAS,YAAY,EACxCA,EAAM,IAAMtC,EACNsC,EAAA,iBAAiB,OAAQ,IAAM,CACvBJ,EAAA,aAAa,QAAS,iBAAiB,CAAA,CACpD,EACDA,EAAY,OAAOI,CAAK,EACjBJ,CACT,CAEA,SAASK,GAAgBpxB,EAAoBiI,EAA2B,OAEhE,MAAAopB,EADQT,GAAU,SAAS5wB,CAAK,EAClB,KAAK,OAAW,OAAmBkxB,GAAAA,EAAK,KAAOjpB,CAAE,EACrE,OAAOopB,EAAM,OAAS,GAAIzxB,EAAAyxB,EAAM,CAAC,IAAP,YAAAzxB,EAAU,KAAO,IAC7C,CASO,SAAS0xB,GAAkB,CAAE,WAAAC,EAAY,SAAAC,GAA0C,CACjF,MAAA,CAACC,EAAOzU,EAAM3c,IAAQ,CAC3B,UAAWqxB,KAAQD,EAAO,CACxB,GAAIF,GAAc,CAACA,EAAWG,CAAI,EAChC,SAGF,MAAMzpB,EAAK,KAAK,IAAI,EAAE,SAAS,EACzB8Q,EAAKiE,EAAK,MAAM,GACjBjE,EAAG,UAAU,OAChBA,EAAG,gBAAgB,EAGf,MAAA4Y,EAAS,IAAI,gBAAgBD,CAAI,EACvC3Y,EAAG,QAAQ6X,GAAW,CACpB,IAAK,CAAC,CAAE,GAAA3oB,EAAI,IAAA5H,EAAK,IAAKsxB,EAAQ,CAAA,CAC/B,EACD3U,EAAK,SAASjE,CAAE,EAEhByY,EAASE,CAAI,EAAE,KACZ7C,GAAQ,OACD,KAAA,CAAE,OAAAhJ,CAAO,EAAI7I,EAAK,MAClB4U,EAAiBR,GAAgBpU,EAAK,MAAO/U,CAAE,EACrD,GAAI2pB,IAAmB,KACrB,OAGF,MAAMC,EAAW,OAAOhD,GAAQ,SAAW8C,EAAS9C,EAC9CzuB,GAAOR,EAAAimB,EAAO,MAAM,QAAb,YAAAjmB,EAAoB,OAAO,CAAE,IAAKiyB,IAC/C,GAAI,CAACzxB,EACH,OAGF,MAAM8hB,EAAclF,EAAK,MAAM,GAC5B,YAAY4U,EAAgBA,EAAgBxxB,CAAI,EAChD,QAAQwwB,GAAW,CAAE,OAAQ,CAAC3oB,CAAE,EAAG,EACtC+U,EAAK,SAASkF,CAAW,CAC3B,EACA,IAAM,CACJ,MAAMA,EAAclF,EAAK,MAAM,GAAG,OAAO3c,EAAKA,CAAG,EAAE,QAAQuwB,GAAW,CAAE,OAAQ,CAAC3oB,CAAE,CAAG,CAAA,EACtF+U,EAAK,SAASkF,CAAW,CAC3B,CAAA,CAEJ,CAAA,CAEJ,CAEgB,SAAA4P,GAAiB9U,EAAkBqB,EAAuB0T,EAA6B,OACrG,MAAMN,EAAQ,CAAC,KAAI7xB,EAAAye,EAAM,gBAAN,YAAAze,EAAqB,QAAS,CAAA,CAAG,EAChD,GAAA6xB,EAAM,OAAS,EAAG,CACpBpT,EAAM,eAAe,EACf,MAAAhe,EAAM2c,EAAK,MAAM,UAAU,KACxB,OAAA+U,EAAAN,EAAOzU,EAAM3c,EAAM,CAAC,EACtB,EACT,CACO,MAAA,EACT,CAEO,SAAS2xB,GAAgBhV,EAAkBqB,EAAkB4T,EAAgBF,EAA6B,OAC/G,MAAMN,EAAQ,CAAC,KAAI7xB,EAAAye,EAAM,eAAN,YAAAze,EAAoB,QAAS,CAAA,CAAG,EACnD,GAAI,CAACqyB,GAASR,EAAM,OAAS,EAAG,CAC9BpT,EAAM,eAAe,EACf,MAAA6T,EAAclV,EAAK,YAAY,CACnC,KAAMqB,EAAM,QACZ,IAAKA,EAAM,OAAA,CACZ,EACD,GAAI6T,EACF,OAAAH,EAASN,EAAOzU,EAAMkV,EAAY,IAAM,CAAC,EAClC,EAEX,CACO,MAAA,EACT,CCxIA,SAASC,GAAcj0B,EAAY,CAC3B,KAAA,CAAE,GAAMyN,IAER,CAACuS,EAAMkU,CAAO,EAAItxB,WAAiB,EAAE,EACrCuxB,EAAYrxB,SAAyB,IAAI,EAE/C,SAASsxB,EAAWjU,EAAY,SACxB,MAAAoT,GAAQ7xB,EAAAye,GAAA,YAAAA,EAAO,SAAP,YAAAze,EAAe,MACzB,GAAA,CAAC1B,EAAM,QAAUA,EAAM,OAAO,aAAeuzB,EAAM,SAAW,EAChE,OAEI,MAAAC,EAAOD,EAAM,CAAC,EACdc,GAAgB3oB,EAAA1L,EAAM,OAAO,iBAAiB,WAAW,KAC5D4U,GAAmBA,EAAU,OAAS,aACtC,IAFmB,YAAAlJ,EAEnB,QAEc0nB,GAAkB,CACjC,WAAY,IACH,GAET,SAAUiB,EAAc,MAAA,CACzB,EACQ,CAACb,CAAI,EAAGxzB,EAAM,OAAO,KAAMA,EAAM,QAAQ,CACpD,CACA,SAASs0B,EAAW3kB,EAAQ,CAC1BA,EAAE,eAAe,EAEX3P,EAAA,OACH,QACA,SAAS,CAAE,IAAKggB,CAAA,CAAM,EACtB,YAAY,CAAE,KAAMhgB,EAAM,OAAA,EAAU,GAAIA,EAAM,SAAU,EACxD,QACA,KACL,CACA,SAASu0B,EAAa5kB,EAAS,CAC7BA,GAAA,MAAAA,EAAG,iBACH3P,EAAM,WAAW,CACnB,CACA,SAASw0B,EAAY7kB,EAAQ,OAC3BA,EAAE,eAAe,GACjBjO,EAAAyyB,EAAU,UAAV,MAAAzyB,EAAmB,OACrB,CAGE,OAAAN,EAAAA,IAACgxB,EAAAA,gBAAgB,CAAA,UAAU,4BAA4B,mBAAgB,GACrE,SAAA9wB,EAAAA,KAAC6E,EAAQ,CAAA,YAAW,GAAC,MAAK,GACxB,SAAA,CAAC/E,EAAA,IAAAiF,EAAA,CAAe,QAAO,GACrB,SAACjF,EAAA,IAAA,MAAA,CAAI,UAAU,qPACb,SAAAE,OAAC,MAAI,CAAA,UAAU,+EACb,SAAA,CAACA,EAAAA,KAAA,MAAA,CAAI,UAAU,6EACb,SAAA,CAAAF,EAAA,IAACqU,EAAc,CAAA,KAAK,UAAU,UAAU,4BAA4B,QACnE,OAAK,CAAA,UAAU,mBAAoB,SAAA,EAAE,2BAA2B,EAAE,CAAA,EACrE,QACCA,EAAc,CAAA,KAAK,SAAS,UAAU,iCAAiC,QAAS8e,EAAc,CAAA,CACjG,CAAA,CACF,CAAA,EACF,QACChuB,EAAe,CAAA,UAAU,kBAAkB,mBAAsBoJ,EAAE,eAClE,EAAA,SAAArO,OAAC4F,IAAK,aAAa,SAAS,UAAU,qBAAqB,eAAe,SACxE,SAAA,CAAC5F,EAAAA,KAAA8F,GAAA,CAAS,UAAU,qDAClB,SAAA,CAAC9F,EAAAA,KAAAgG,GAAA,CAAY,MAAM,SAChB,SAAA,CAAA,EAAE,gCAAgC,EAClC,GAAA,EACH,EACAhG,EAAAA,KAACgG,GAAY,CAAA,MAAM,OAChB,SAAA,CAAA,IACA,EAAE,6BAA6B,EAC/B,GAAA,EACH,CAAA,EACF,EACAhG,EAAAA,KAACkG,GAAY,CAAA,MAAM,SACjB,SAAA,CAACpG,EAAAA,IAAAK,EAAA,CAAO,UAAU,gCAAgC,KAAK,KAAK,QAAS+yB,EAClE,SAAE,EAAA,gCAAgC,CACrC,CAAA,EACApzB,EAAA,IAAC,QAAA,CACC,KAAK,OACL,OAAO,UACP,IAAK+yB,EACL,SAAQ,GACR,MAAO,CACL,QAAS,MACX,EACA,SAAUC,CAAA,CACZ,CAAA,EACF,EACAhzB,EAAA,IAACoG,GAAY,CAAA,MAAM,OACjB,SAAApG,EAAA,IAAC,OAAK,CAAA,SAAUkzB,EACd,SAAAhzB,OAAC,MAAI,CAAA,UAAU,qDACb,SAAA,CAAAF,EAAA,IAAC0E,EAAA,CACC,KAAK,MACL,UAAW,GACX,MAAOka,EACP,SAAUrQ,GAAKukB,EAAQvkB,EAAE,OAAO,KAAK,EACrC,SAAQ,GACR,YAAa,EAAE,iCAAiC,CAAA,CAClD,QACClO,EAAO,CAAA,KAAK,SAAU,SAAA,EAAE,kCAAkC,EAAE,CAAA,CAC/D,CAAA,CACF,CAAA,EACF,CAAA,CAAA,CACF,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAEJ,CCtFA,MAAMgzB,GAA+C,CACnD,YAAa,CAAC,aAAc,YAAa,YAAa,WAAW,EACjE,QAAS,KAAO,KAAO,CACzB,EAOaC,GAAc3N,OAAK,OAA2B,CACzD,KAAM,cACN,UAAW,GACX,SAAU,GACV,MAAO,QACP,UAAW,GACX,WAAY,GACZ,OAAQ,GAER,UAAW,CACT,GAAI,OAAO,KAAK,QAAQ,QAAW,WAC3B,MAAA,IAAI,UAAU,4CAA4C,CAEpE,EAEA,WAAY,CACV,MAAO,CAAC,CAAE,IAAK,kBAAkB,KAAK,IAAI,KAAM,CAClD,EAEA,YAAa,CACX,MAAO,CAAC,MAAO,CAAE,YAAa,KAAK,IAAM,CAAA,CAC3C,EAEA,aAAc,CACL,MAAA,CACL,eACE,IACE,CAAC,CAAE,SAAAgG,CAAA,IACDA,EAAS,cAAc,mBAAmB,KAAK,IAAI,UAAU,CAAA,CAEvE,EAEA,aAAc,CACZ,OAAOyF,EAAAA,sBAAsByB,EAAa,CAC5C,EAEA,YAAa,OACJ,MAAA,CACL,GAAGQ,GACH,IAAG/yB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,OAAQ,IAAM,QAAQ,OAAO,uBAAuB,EACpD,OAAQ,CAAC,CACP,OAAAG,EACA,UAAA+S,EACA,EAAAjL,CAAA,IAKK,SAAA,OACL,UAAW7J,EACX,eAAgB,CACd,OAAQ,IAAM+B,EAAO,SAAS,eAAe,EAC7C,OAAQ+S,EAAU,QAAQ,OAE1B,SAAU,GAAClJ,GAAAhK,EAAAG,EAAO,OAAM,WAAb,MAAA6J,EAAA,KAAAhK,EAAwB,CAAA,IACnC,KAAM,UACN,QAASiI,EAAE,sBAAsB,CACnC,CAAA,EACF,CAEJ,EAEA,uBAAwB,CAqBtB,MAAMkqB,EAAWT,GAAkB,CACjC,WAlBoBI,GAChB,GAAC,KAAK,QAAQ,YAAY,SAASA,EAAK,IAAI,GAI5CA,EAAK,KAAO,KAAK,QAAQ,SAc7B,SAAU,KAAK,QAAQ,MAAA,CACxB,EAEM,MAAA,CACL,IAAI5P,SAAO,CACT,MAAO,CACL,YAAa,CAAC9E,EAAMqB,IACd,CAACA,EAAM,eAGG,CAAC,GAAIA,EAAM,cAAc,OAAS,CAAA,CAAG,EACzC,KAAK2R,GAAKA,EAAE,OAAS,WAAW,EACjC,GAEF8B,GAAiB9U,EAAMqB,EAAO0T,CAAQ,EAE/C,WAAY,CAAC/U,EAAMqB,EAAO4D,EAAGgQ,KACvB,EAAE5T,aAAiB,YAAc,CAACA,EAAM,cAG5B2T,GAAAhV,EAAMqB,EAAO4T,EAAOF,CAAQ,EACrC,GAEX,CAAA,CACD,EACDlB,GAAmB,CAAA,CAEvB,CACF,CAAC,EC5FD,SAASgC,GAAYhE,EAAa,CAEhC,OAAAA,EAAMA,EACH,QAAQ,oBAAqB,kCAAkC,EAC/D,QAAQ,WAAY,QAAQ,EAGzBA,EAAAA,EAAI,QAAQ,qBAAsB,iCAAiC,EAGlD,2CAA2C,KAAKA,CAAG,IAExEA,EAAMA,EACH,QAAQ,QAAS,EAAE,EACnB,QAAQ,kCAAmC,+CAA+C,GAI3FA,EAAI,SAAS,kBAAkB,IAC3BA,EAAAA,EAAI,QAAQ,QAAS,UAAU,GAGhCA,CACT,CAEa,MAAA3Y,GAAQ+O,OAAK,OAAqB,CAC7C,KAAM,QACN,MAAO,QACP,KAAM,GACN,UAAW,GACX,eAAgB,CACP,MAAA,CACL,IAAK,CACH,QAAS,KACT,WAAY,CAAC,CAAE,IAAA4J,MAAW,CACxB,IAAKA,EAAMgE,GAAYhE,CAAG,EAAI,IAAA,EAElC,EACA,MAAO,CACL,QAAS,KAAK,QAAQ,MACtB,WAAY,CAAC,CAAE,MAAAG,MAAa,CAC1B,MAAOrgB,GAAsBqgB,CAAK,CAAA,EAEtC,EACA,YAAa,CACX,QAAS,KAAK,QAAQ,YAAc,EAAI,EACxC,UAAW,IAAO,KAAK,QAAQ,YAAc,EAAI,CACnD,EACA,gBAAiB,CACf,QAAS,KAAK,QAAQ,gBACtB,UAAW,IAAM,KAAK,QAAQ,eAChC,CAAA,CAEJ,EAEA,WAAY,CACH,MAAA,CACL,CACE,IAAK,wBACP,CAAA,CAEJ,EAEA,WAAW,CAAE,eAAArJ,GAAkB,CAC7B,KAAM,CAAE,MAAAqJ,EAAQ,QAAWrJ,GAAkB,CAAA,EAEvCmN,EAAuB,CAC3B,GAAGnN,EACH,MAAO,OACP,OAAQ,MAAA,EAGJoN,EAAkB,wEAAwE/D,CAAK,IAC/FgE,EAAuB,2BAA4B,EAAI,GAAM,GAAG,KAIhEC,EAAgB,CAAC,MAAO,CAAE,MAAOF,GADtB,CAAC,MAAO,CAAE,MAAOC,CAAsB,CAAA,EADtC,CAAC,SAAUF,CAAoB,CAE4B,EAOtE,MAAA,CAAC,MALS,CACf,GAAG,KAAK,QAAQ,eAChB,aAAc,EAAA,EAGSG,CAAa,CACxC,EAEA,aAAc,CACL,MAAA,CACL,SACEtC,GACE,CAAC,CAAE,SAAA1F,KACMA,EAAS,cAAc,CAC5B,KAAM,KAAK,KACX,MAAO0F,CAAA,CACR,EAEP,YACEA,GACE,CAAC,CAAE,SAAA1F,KACMA,EAAS,iBAAiB,KAAK,KAAM0F,CAAO,CACrD,CAER,EAEA,YAAa,CACJ,MAAA,CACL,QAAS,GACT,OAAQ,GACR,gBAAiB,GACjB,OAAQ,OACR,YAAa,GACb,MAAO3zB,GAAW,aAAa,EAC/B,eAAgB,CACd,MAAO,iBACP,MAAO,wCACT,CAAA,CAEJ,CACF,CAAC,ECnKD,SAASk2B,GAAkBh1B,EAAgC,CACnD,KAAA,CAAE,GAAMyN,IACR,CAAE,OAAA5L,EAAQ,OAAAsvB,EAAQ,WAAAxvB,CAAA,EAAe3B,EAEjC,CAACggB,EAAMkU,CAAO,EAAItxB,WAAiB,EAAE,EACrC,CAACqyB,EAASC,CAAU,EAAItyB,WAAkB,EAAK,EAC/CuxB,EAAYrxB,SAAyB,IAAI,EAE/C,SAASsxB,EAAWjU,EAAY,SAC9B+U,EAAW,EAAI,EACT,MAAA3B,GAAQ7xB,EAAAye,GAAA,YAAAA,EAAO,SAAP,YAAAze,EAAe,MAC7B,GAAI,CAACG,GAAUA,EAAO,aAAe0xB,EAAM,SAAW,EACpD,OAEI,MAAAC,EAAOD,EAAM,CAAC,EACdc,GAAgB3oB,EAAA7J,EAAO,iBAAiB,WAAW,KACtD+S,GAAmBA,EAAU,OAAS,aACtC,IAFmB,YAAAlJ,EAEnB,QACH2oB,GAAA,MAAAA,EAAe,OAAO,CAACb,CAAI,GAAG,KAAM2B,GAAa,CAE5CtzB,EAAA,QACA,SAAS,CAAE,IAAKszB,EAAI,CAAC,EAAE,IAAK,MAAO,MAAO,CAAC,EAC3C,YAAY,CAAE,KAAMhE,EAAA,EAAU,GAAIA,EAAO,CAAA,CAAG,EAC5C,QACA,MACH+D,EAAW,EAAK,CAAA,EAEpB,CACA,SAASZ,EAAW3kB,EAAQ,CAC1BA,EAAE,eAAe,EAGd9N,EAAA,QACA,SAAS,CACR,IAAKme,EACL,MAAO,MACR,CAAA,EACA,YAAY,CAAE,KAAMmR,EAAO,EAAG,GAAIA,EAAA,EAAU,EAC5C,QACA,IAAI,CACT,CACA,SAASoD,EAAa5kB,EAAQ,CAC5BA,EAAE,eAAe,EACNhO,GACb,CACA,SAAS6yB,EAAY7kB,EAAQ,OAC3BA,EAAE,eAAe,GACjBjO,EAAAyyB,EAAU,UAAV,MAAAzyB,EAAmB,OACrB,CAGE,OAAAN,EAAAA,IAACgxB,EAAAA,gBAAgB,CAAA,GAAG,MAAM,mBAAgB,GACxC,SAAA9wB,EAAAA,KAAC6E,EAAQ,CAAA,YAAW,GAAC,MAAK,GACxB,SAAA,CAAC/E,EAAA,IAAAiF,EAAA,CAAe,QAAO,GACrB,SAACjF,EAAAA,IAAA,MAAA,CAAI,UAAU,qPACZ,SAEK6zB,EAAA3zB,EAAA,KAAC,MAAI,CAAA,UAAU,8FACb,SAAA,CAAAF,EAAA,IAACqU,EAAc,CAAA,UAAU,kDAAkD,KAAK,eAAe,SAC9F,OACE,CAAA,SAAA,CAAA,EAAE,+BAA+B,EAAE,KAAA,EAEtC,CAAA,CACF,CAAA,EAGAnU,EAAAA,KAAC,MAAI,CAAA,UAAU,+EACb,SAAA,CAACA,EAAAA,KAAA,MAAA,CAAI,UAAU,6EACb,SAAA,CAAAF,EAAA,IAACqU,EAAc,CAAA,KAAK,QAAQ,UAAU,4BAA4B,QACjE,OAAK,CAAA,UAAU,mBAAoB,SAAA,EAAE,2BAA2B,EAAE,CAAA,EACrE,QACCA,EAAc,CAAA,KAAK,SAAS,UAAU,iCAAiC,QAAS8e,EAAc,CAAA,CACjG,CAAA,CAER,CAAA,EACF,QACChuB,EAAe,CAAA,UAAU,kBAAkB,mBAAsBoJ,EAAE,eAClE,EAAA,SAAArO,OAAC4F,IAAK,aAAa,SAAS,UAAU,qBAAqB,eAAe,SACxE,SAAA,CAAC5F,EAAAA,KAAA8F,GAAA,CAAS,UAAU,qDAClB,SAAA,CAAC9F,EAAAA,KAAAgG,GAAA,CAAY,MAAM,SAChB,SAAA,CAAA,EAAE,gCAAgC,EAClC,GAAA,EACH,EACAhG,EAAAA,KAACgG,GAAY,CAAA,MAAM,OAChB,SAAA,CAAA,IACA,EAAE,0BAA0B,EAC5B,GAAA,EACH,CAAA,EACF,EACAhG,EAAAA,KAACkG,GAAY,CAAA,MAAM,SACjB,SAAA,CAACpG,EAAAA,IAAAK,EAAA,CAAO,UAAU,gCAAgC,KAAK,KAAK,QAAS+yB,EAClE,SAAE,EAAA,gCAAgC,CACrC,CAAA,EACApzB,EAAA,IAAC,QAAA,CACC,KAAK,OACL,OAAO,UACP,IAAK+yB,EACL,SAAQ,GACR,MAAO,CACL,QAAS,MACX,EACA,SAAUC,CAAA,CACZ,CAAA,EACF,EACAhzB,EAAA,IAACoG,GAAY,CAAA,MAAM,OACjB,SAAApG,EAAA,IAAC,OAAK,CAAA,SAAUkzB,EACd,SAAAhzB,OAAC,MAAI,CAAA,UAAU,qDACb,SAAA,CAAAF,EAAA,IAAC0E,EAAA,CACC,KAAK,MACL,UAAW,GACX,SAAQ,GACR,YAAa,EAAE,iCAAiC,EAChD,MAAOka,EACP,SAAUrQ,GAAKukB,EAAQvkB,EAAE,OAAO,KAAK,CAAA,CACvC,QACClO,EAAO,CAAA,KAAK,SAAU,SAAA,EAAE,kCAAkC,EAAE,CAAA,CAC/D,CAAA,CACF,CAAA,EACF,CAAA,CAAA,CACF,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAAA,CAEJ,CCzHa,MAAA2zB,GAAcrO,OAAK,OAAqB,CACnD,KAAM,cACN,UAAW,GACX,SAAU,GACV,MAAO,QACP,UAAW,GACX,WAAY,GACZ,OAAQ,GACR,WAAY,CACH,MAAA,CACL,CACE,IAAK,kBAAkB,KAAK,IAAI,IAClC,CAAA,CAEJ,EACA,YAAa,CACX,MAAO,CAAC,MAAO,CAAE,YAAa,KAAK,IAAM,CAAA,CAC3C,EAEA,aAAc,CACL,MAAA,CACL,eACE,IACE,CAAC,CAAE,SAAAgG,CAAA,IACDA,EAAS,cAAc,mBAAmB,KAAK,IAAI,UAAU,CAAA,CAEvE,EACA,aAAc,CACZ,OAAOyF,EAAAA,sBAAsBwC,EAAiB,CAChD,EACA,YAAa,OACJ,MAAA,CACL,IAAGtzB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,OAAQ,OACR,OAAQ,CAAC,CAAE,OAAAG,EAAQ,EAAA8H,KAAa,SACvB,MAAA,CACL,UAAW7J,EACX,eAAgB,CACd,OAAQ,IAAM+B,EAAO,SAAS,eAAe,EAC7C,SAAU,IAAMA,EAAO,SAAS,OAAO,GAAK,GAE5C,SAAU,GAAC6J,GAAAhK,EAAAG,EAAO,OAAM,WAAb,MAAA6J,EAAA,KAAAhK,EAAwB,CAAA,IACnC,KAAM,QACN,QAASiI,EAAE,sBAAsB,CACnC,CAAA,CAEJ,CAAA,CAEJ,CACF,CAAC,EChDe,SAAA0rB,GAAwBxa,EAAiB1Y,EAAamzB,EAAsC,CACtG,GAAA,CAACza,EAAG,IACC,OAAAA,EAGT,MAAM3Y,EAAO2Y,EAAG,IAAI,OAAO1Y,CAAG,EAK1B,GAJA,CAACD,GAIDozB,IAAoBpzB,EAAK,MAAM,gBAC1B,OAAA2Y,EAGT,MAAMW,EAAY,CAChB,GAAGtZ,EAAK,MACR,gBAAAozB,CAAA,EAGF,OAAOza,EAAG,cAAc1Y,EAAKD,EAAK,KAAMsZ,EAAWtZ,EAAK,KAAK,CAC/D,CAEgB,SAAAqzB,GAAqB1a,EAAiB4X,EAAqC6C,EAAsC,CACzH,KAAA,CAAE,IAAAva,EAAK,UAAAC,CAAc,EAAAH,EAE3B,MAAI,CAACE,GAAO,CAACC,GAAa,EAAEA,aAAqBwa,EAAgB,gBAIvDxa,EAAA,YAAY,CAAC9Y,EAAMC,IAAQ,CAC9B0Y,EAAAwa,GAAwBxa,EAAI1Y,EAAKmzB,CAAe,CAAA,CACtD,EAEMza,CACT,CAEgB,SAAA4a,GAA4BH,EAAyB7C,EAA8C,CACjH,MAAO,CAAC,CAAE,GAAA5X,EAAI,MAAA/Y,EAAO,SAAA2H,KAAe,CAC5B,KAAA,CAAE,UAAAuR,CAAc,EAAAlZ,EAItB,OAHK+Y,EAAAA,EAAG,aAAaG,CAAS,EACzBH,EAAA0a,GAAqB1a,EAAI4X,EAAS6C,CAAe,EAElDza,EAAG,YACLpR,GAAA,MAAAA,EAAWoR,GACJ,IAGF,EAAA,CAEX,CAGa,MAAA6a,GAAsBzP,YAAU,OAAmC,CAC9E,KAAM,sBACN,YAAa,CACJ,MAAA,CACL,MAAO,CAAC,WAAW,EACnB,eAAgB,CAAC,CAAA,CAErB,EAEA,qBAAsB,CACb,MAAA,CACL,CACE,MAAO,KAAK,QAAQ,MACpB,WAAY,CACV,gBAAiB,CACf,UAAYI,GACHA,EAAQ,MAAM,iBAAmB,GAE1C,WAAaC,GACP,CAACA,EAAW,iBAAmBA,EAAW,kBAAoB,GACzD,GAGA,CACL,MAAO,qBAAqBA,EAAW,eAAe,EAAA,CAI9D,CACF,CACF,CAAA,CAEJ,EACA,aAAc,CACL,MAAA,CACL,uBAAyBgP,GACvBG,GAA4BH,EAAiB,KAAK,OAAO,EAC3D,yBAA0B,IAAMG,GAA4B,GAAI,KAAK,OAAO,CAAA,CAEhF,CACF,CAAC,EC5FKE,GACF,gWACEC,GAAc,OACdC,GAAW,8BAOD,SAAAC,GAAS9T,EAAwB,GAAa,CAC5D,IAAI+T,EAAK/T,EAAK,IAAO,OAAO,UAAc,KAAe,UAAU,UAM/D,OAJA+T,GAAM,OAAOA,GAAO,UAAYA,EAAG,SAAW,OAAOA,EAAG,QAAQ,YAAY,GAAM,WAC/EA,EAAAA,EAAG,QAAQ,YAAY,GAG1B,OAAOA,GAAO,SACT,GAGL,GAAAJ,GAAS,KAAKI,CAAE,GAAK,CAACH,GAAY,KAAKG,CAAE,GAIzC/T,EAAK,QAAU6T,GAAS,KAAKE,CAAE,GAKjC/T,EAAK,QACFA,EAAK,eACL,WACA,UAAU,eAAiB,GAC3B+T,EAAG,SAAS,WAAW,GACvBA,EAAG,SAAS,QAAQ,EAM3B,CClDA,MAAMC,GAAeC,GAAmB,MAAM,KAAK,CAAE,OAAAA,CAAA,CAAQ,EAAE,IAAI,CAAClS,EAAG1Z,IAAUA,EAAQ,CAAC,EAgB1F,SAAS6rB,GAAmBl2B,EAAiC,OAC3D,KAAM,CAACm2B,EAAeC,CAAgB,EAAIxzB,WAAkB,EAAI,EAC1D,CAACyzB,EAAeC,CAAgB,EAAI1zB,WAAmB,CAC3D,KAAMkzB,KAAa13B,GAAsBD,GACzC,KAAM23B,KAAa13B,GAAsBD,EAAA,CAC1C,EAEK,CAACo4B,EAAuBC,CAAwB,EAAI5zB,WAAmB,CAC3E,KAAMvE,GACN,KAAMA,EAAA,CACP,EAEQ,SAAAo4B,EAAoBC,EAAc3N,EAAoB,CACzD2N,IAASL,EAAc,MACzBC,EAAkBjF,IACT,CACL,GAAGA,EACH,KAAM,KAAK,IAAIqF,EAAO,EAAGt4B,EAAmB,CAAA,EAE/C,EAGC2qB,IAASsN,EAAc,MACzBC,EAAkBjF,IACT,CACL,GAAGA,EACH,KAAM,KAAK,IAAItI,EAAO,EAAG3qB,EAAmB,CAAA,EAE/C,EAGsBo4B,EAAA,CACvB,KAAAE,EACA,KAAA3N,CAAA,CACD,CACH,CAES,SAAAuI,EAAYoF,EAAc3N,EAAc,CAC/C/oB,GAAA,MAAAA,EAAO,YAAY,CAAE,KAAA02B,EAAM,KAAA3N,EAAM,cAAAoN,CAAe,GAC7BQ,GACrB,CAEA,SAASA,GAA2B,CAClCP,EAAiB,EAAK,EAELE,EAAA,CACf,KAAMn4B,GACN,KAAMA,EAAA,CACP,EAEwBq4B,EAAA,CACvB,KAAMn4B,GACN,KAAMA,EAAA,CACP,CACH,CAEA,cACG8H,EACC,CAAA,SAAA,CAAA/E,EAAA,IAACiF,EAAe,CAAA,QAAO,GACpB,SAAArG,GAAA,YAAAA,EAAO,SACV,EACAoB,EAAA,IAACmF,EAAe,CAAA,UAAU,gCAAgC,MAAM,QAAQ,KAAK,SAC3E,SAAAjF,EAAAA,KAAC,MAAI,CAAA,UAAU,sCACb,SAAA,CAACF,EAAAA,IAAA,MAAA,CAAI,UAAU,6FACZ,UAAAM,EAAAs0B,GAAYK,GAAA,YAAAA,EAAe,IAAI,IAA/B,YAAA30B,EAAkC,IAAKk1B,GAAa,OAEjD,OAAAx1B,MAAC,MAAqB,CAAA,UAAU,+BAC7B,UAAAM,EAAAs0B,GAAYK,GAAA,YAAAA,EAAe,IAAI,IAA/B,YAAA30B,EAAkC,IAAKsnB,GAEpC5nB,EAAA,IAAC,MAAA,CAEC,UAAW,kDACT4nB,GAAOuN,EAAsB,MAC1BK,GAAOL,EAAsB,MAC7B,yCACL,GACA,YAAa,IAAME,EAAoBG,EAAK5N,CAAG,EAC/C,YAAa,IAAMsI,EAAYsF,EAAK5N,CAAG,EAEvC,SAAA5nB,EAAAA,IAAC,MAAI,CAAA,UAAU,kJAAmJ,CAAA,CAAA,EAT7J,KAAK4nB,CAAG,EAAA,EAYlB,EAhBO,KAAK4N,CAAG,EAiBlB,CAEH,GACH,EACAt1B,EAAAA,KAAC,MAAI,CAAA,UAAU,6EACZ,SAAA,CAAsBi1B,EAAA,KACtB,IAAI,IAEJA,EAAsB,IAAA,EACzB,CAAA,CAAA,CACF,CACF,CAAA,CACF,CAAA,CAAA,CAEJ,CC3GA,SAASM,GAAkB72B,EAAgC,CACzD,SAAS82B,EAAYrE,EAAc,CAC5BzyB,EAAM,UACTA,EAAM,OACH,QACA,MACA,EAAA,YAAY,CAAE,GAAGyyB,EAAS,cAAe,GAAO,EAChD,IAAI,CAEX,CAGE,OAAArxB,EAAA,IAAC80B,IAAmB,YAAAY,EAClB,SAAA11B,EAAA,IAACtB,EAAA,CACC,KAAME,GAAA,YAAAA,EAAO,KACb,QAASA,GAAA,YAAAA,EAAO,QAChB,SAAUA,GAAA,YAAAA,EAAO,SACjB,MAAOA,GAAA,YAAAA,EAAO,MACd,OAAQA,GAAA,YAAAA,EAAO,OACf,SAAUA,GAAA,YAAAA,EAAO,QAAA,CAErB,CAAA,CAAA,CAEJ,CCVa,MAAAmY,GAAQ4e,UAAY,OAAqB,CACpD,YAAa,OACJ,MAAA,CACL,IAAGr1B,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,UAAW,GACX,oBAAqB,GACrB,wBAAyB,GACzB,OAAQ,CAAC,CAAE,OAAAG,EAAQ,EAAA8H,MAAc,CAC/B,UAAWktB,GACX,eAAgB,CACd,SAAUh1B,EAAO,SAAS,OAAO,GAAK,GACtC,KAAM,QACN,QAAS8H,EAAE,sBAAsB,EACjC,OAAA9H,CACF,CAAA,EACF,CAEJ,EAEA,eAAgB,CACP,MAAA,CACLm1B,EAAAA,SAAS,UAAU,KAAK,QAAQ,QAAQ,EACxCC,EAAAA,YAAY,UAAU,KAAK,QAAQ,WAAW,EAC9CC,EAAAA,UAAU,UAAU,KAAK,QAAQ,SAAS,EAC1CxB,GAAoB,UAAU,KAAK,QAAQ,mBAAmB,CAAA,CAElE,CACF,CAAC,EC7BYyB,GAAgBlR,YAAU,OAA6B,CAClE,KAAM,UACN,YAAa,OACJ,MAAA,CACL,IAAGvkB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,OAAQ,CAAC,CAAE,OAAAG,EAAQ,EAAA8H,MAAS,CAC1B,UAAW7J,EACX,eAAgB,CACd,OAAQ,IAAM,CACZ+B,EAAO,SAAS,WAAWA,GAAA,YAAAA,EAAQ,MAAM,UAAU,MAAM,OAAiB,CAC5E,EACA,KAAM,cACN,QAAS8H,EAAE,eAAe,CAC5B,CAAA,EACF,CAEJ,EACA,aAAc,CACL,MAAA,CACL,WACGytB,GACC,CAAC,CACC,KAAM,CACJ,SAAA3tB,EACA,MAAO,CAAE,GAAAoR,CAAG,EACZ,IAAAwc,CACF,CAAA,IACI,CAIE,MAAAC,EAAY,gCADC,mBADjB,8OAC6C,CACa,WAE5D,OAAAD,EAAI,MAAM,OAASC,EACV7tB,EAAAoR,EAAG,QAAQ,gBAAiB,CAAE,KAAM,QAAS,MAAAuc,CAAO,CAAA,CAAC,EACvD,EACT,CAAA,CAER,EAEA,uBAAwB,CACf,MAAA,CACL,IAAIxT,SAAO,CACT,IAAK,IAAIC,EAAA,UAAU,gBAAgB,EACnC,MAAO,CACL,KAAM,IAAM,CAAC,EACb,MAAO,CAAChJ,EAAI+X,IAAQ,CACZ,MAAApyB,EAASqa,EAAG,QAAQ,eAAe,EACrC,OAAAra,GAAUA,EAAO,OAAS,QAC5BoyB,EAAMpyB,EAAO,MAENA,GAAUA,EAAO,OAAS,QACjCoyB,EAAM,CAAA,GAEDA,CACT,CACF,EACA,MAAO,CACL,gBAAiB,CACf,UAAU9T,EAAMiF,EAAG,CACjB,MAAMqT,EAAQ,KAAK,SAAStY,EAAK,KAAK,EACtC,GAAI,CAACsY,GAASA,EAAM,SAAW,EACxB,OAAAtY,EAAA,IAAI,MAAM,OAAS,GACjB,GAET,MAAMyY,EAAU,IAAM,CACX,SAAA,oBAAoB,UAAWA,CAAO,EAE3C,GAAA,CACF,SAAA9tB,EACA,MAAO,CAAE,GAAAoR,EAAI,UAAAG,CAAU,EACvB,IAAAqc,CACE,EAAAvY,EACJuY,EAAI,MAAM,OAAS,GAEnBxc,EAAKA,EAAG,WAAWG,EAAU,KAAMA,EAAU,EAAE,EAC/C,UAAWpJ,KAAQwlB,EACbxlB,EAAK,KAAK,OAAS,SACrBiJ,EAAKA,EAAG,QAAQG,EAAU,KAAMA,EAAU,GAAIpJ,CAAI,GAItDnI,EAASoR,EAAG,QAAQ,gBAAiB,CAAE,KAAM,KAAO,CAAA,CAAC,CAAA,EAE9C,gBAAA,iBAAiB,UAAW0c,CAAO,EACrC,EACT,CACF,CACF,CAAA,CACD,CAAA,CAEL,CACF,CAAC,ECpDYC,GAAwB,CACnC,QAAS,CACP,QAAS,8CACT,IAAK,4CACL,UAAW,gCACX,SAAU,CACR,qHACF,CACF,EACA,MAAO,CACL,QACE,2FACF,IAAK,+CACL,UAAW,iCACX,SAAU,CAAC,oCAAoC,EAC/C,OAAQ,aACV,EACA,SAAU,CACR,QAAS,8CACT,IAAK,4DACL,UAAW,+CACX,SAAU,CAAC,iCAAiC,CAC9C,EACA,QAAS,CACP,QAAS,4DACT,IAAK,0DACL,UAAW,8CACX,SAAU,CAAC,oCAAoC,CACjD,EACA,KAAM,CACJ,QAAS,yBACT,IAAK,wCACL,UAAW,GACX,SAAU,CAAC,eAAe,CAC5B,EACA,UAAW,CACT,QAAS,gCACT,IAAK,gCACL,UAAW,GACX,SAAU,CAAC,mBAAmB,CAChC,EACA,MAAO,CACL,QACE,qGACF,IAAK,qEACL,UAAW,GACX,SAAU,CAAC,qDAAqD,EAChE,KAAM,qCACR,EACA,MAAO,CACL,QAAS,+CACT,IAAK,iCACL,UAAW,GACX,SAAU,CAAC,uCAAuC,EAClD,KAAM,qCACR,EACA,MAAO,CACL,QAAS,uEACT,IAAK,uEACL,UAAW,mDACX,SAAU,CAAC,yCAAyC,CACtD,EACA,MAAO,CACL,QAAS,+CACT,IAAK,+CACL,UAAW,GACX,SAAU,CAAC,+CAA+C,CAC5D,EACA,UAAW,CACT,QAAS,2DACT,IAAK,2DACL,UAAW,GACX,SAAU,CAAC,8CAA8C,CAC3D,EACA,QAAS,CACP,QAAS,0CACT,IAAK,0CACL,UAAW,GACX,SAAU,CAAC,4CAA4C,CACzD,EACA,SAAU,CACR,QAAS,gCACT,IAAK,gCACL,UAAW,GACX,SAAU,CAAC,qCAAqC,CAClD,EACA,OAAQ,CACN,QAAS,mDACT,IAAK,+CACL,UAAW,GACX,SAAU,CAAC,IAAI,CACjB,EACA,WAAY,CACV,QAAS,mCACT,IAAK,wEACL,UAAW,GACX,SAAU,CAAC,kCAAkC,CAC/C,CACF,EAEA,SAASC,GAAchE,EAAa,CAClC,MAAMzT,EAAOwX,GAAiB,QACxB/W,EAAMgT,EAAO,WACnBA,EAAO,UAAY,GAEb,MAAAiE,EAASjX,EAAI,MAAM,GAAG,EACtBkX,EAAMD,EAAO,OACnB,GAAIC,EAAM,EAAG,CACL,MAAA5tB,EAAK2tB,EAAOC,EAAM,CAAC,EACzBlE,EAAO,IAAM,GAAGzT,EAAK,SAAS,IAAIjW,CAAE,GACpC0pB,EAAO,QAAU,EACnB,CAEO,OAAAA,CACT,CAEA,SAASmE,GAAYnE,EAAa,CAChC,MAAMzT,EAAOwX,GAAiB,MACxB/W,EAAMgT,EAAO,WAEboE,EAAS7X,EAAK,OACd8X,EAAQ,IAAI,OAAOD,CAAM,EACzBE,EAAQtX,EAAI,MAAMqX,CAAK,EACzB,GAAAC,GAASA,EAAM,OAAS,EAAG,CAC7B,MAAMhuB,EAAKguB,EAAM,CAAC,EAAE,MAAM,CAAC,EAE3BtE,EAAO,QAAU,GACjBA,EAAO,IAAM,GAAGzT,EAAK,SAAS,IAAIjW,CAAE,EAAA,MAGpC0pB,EAAO,QAAU,GAGZ,OAAAA,CACT,CAEA,SAASuE,GAAevE,EAAa,CACnC,MAAMzT,EAAOwX,GAAiB,SAGxBE,EAFMjE,EAAO,WAEA,MAAM,GAAG,EACtBkE,EAAMD,EAAO,OACnB,GAAIC,EAAM,EAAG,CACL,MAAA5tB,EAAK2tB,EAAOC,EAAM,CAAC,EACzBlE,EAAO,IAAM,GAAGzT,EAAK,SAAS,IAAIjW,CAAE,GACpC0pB,EAAO,QAAU,EACnB,CAEO,OAAAA,CACT,CAEA,SAASwE,GAAcxE,EAAa,CAClC,MAAMzT,EAAOwX,GAAiB,QAGxBE,EAFMjE,EAAO,WAEA,MAAM,GAAG,EACtBkE,EAAMD,EAAO,OACnB,GAAIC,EAAM,EAAG,CACL,MAAA5tB,EAAK2tB,EAAOC,EAAM,CAAC,EACzBlE,EAAO,IAAM,GAAGzT,EAAK,SAAS,IAAIjW,CAAE,GACpC0pB,EAAO,QAAU,EACnB,CAEO,OAAAA,CACT,CAEA,SAASyE,GAAWC,EAAmB1E,EAAa,CAClD,OAAAA,EAAO,IAAM0E,EACb1E,EAAO,QAAU,GAEVA,CACT,CAEA,SAAS2E,GAAeD,EAAmB1E,EAAa,CACtD,OAAAA,EAAO,IAAM0E,EACb1E,EAAO,QAAU,GAEVA,CACT,CAEA,SAAS4E,GAAgBF,EAAmB1E,EAAa,CACvD,OAAAA,EAAO,IAAM0E,EACb1E,EAAO,QAAU,GACjBA,EAAO,aAAe0E,EAEf1E,CACT,CAEA,SAAS6E,GAAY7E,EAAa,CAChC,OAAAA,EAAO,IAAMA,EAAO,WACpBA,EAAO,QAAU,GACjBA,EAAO,aAAeA,EAAO,IAEtBA,CACT,CAEA,SAAS8E,GAAY9E,EAAa,CAChC,OAAAA,EAAO,IAAMA,EAAO,WACpBA,EAAO,QAAU,GACjBA,EAAO,aAAeA,EAAO,IAEtBA,CACT,CAEA,SAAS+E,GAAY/E,EAAa,CAChC,MAAMzT,EAAOwX,GAAiB,MACvB,OAAA/D,EAAA,IAAM,GAAGzT,EAAK,SAAS,IAAI,mBAAmByT,EAAO,UAAU,CAAC,GACvEA,EAAO,QAAU,GACjBA,EAAO,aAAeA,EAAO,WAEtBA,CACT,CAEA,SAASgF,GAAYN,EAAmB1E,EAAa,CAC5C,OAAAA,EAAA,IAAM,GAAGA,EAAO,UAAU,SACjCA,EAAO,QAAU,GACjBA,EAAO,aAAe0E,EAEf1E,CACT,CAEA,SAASiF,GAAgBP,EAAmB1E,EAAa,CAChD,OAAAA,EAAA,IAAM,GAAGA,EAAO,UAAU,GACjCA,EAAO,QAAU,GACjBA,EAAO,aAAe0E,EAEf1E,CACT,CAEA,SAASkF,GAAclF,EAAa,CAC3B,OAAAA,EAAA,IAAM,GAAGA,EAAO,UAAU,GACjCA,EAAO,QAAU,GACjBA,EAAO,aAAeA,EAAO,IAEtBA,CACT,CAEA,SAASmF,GAAeT,EAAmB1E,EAAa,CAC/C,OAAAA,EAAA,IAAM,GAAGA,EAAO,UAAU,8CACjCA,EAAO,QAAU,GACjBA,EAAO,aAAe0E,EAEf1E,CACT,CAEA,SAASoF,GAAaV,EAAmB1E,EAAa,CAC7C,OAAAA,EAAA,IAAM,GAAGA,EAAO,UAAU,GACjCA,EAAO,QAAU,GACjBA,EAAO,aAAe0E,EAEf1E,CACT,CAEA,SAASqF,GAAcC,EAAcZ,EAAmB1E,EAAa,CACnE,GAAIsF,IAAY,aACd,OAAAtF,EAAO,UAAY,GACnBA,EAAO,WAAa0E,EACb1E,EAIT,MAAMuF,EADOxB,GAAiBuB,CAAO,EACf,SAEtB,UAAWE,KAAQD,EAAU,CACrB,MAAAlB,EAAQ,IAAI,OAAOmB,CAAI,EACvBlB,EAAQI,EAAa,MAAML,CAAK,EAClC,GAAAC,GAASA,EAAM,OAAS,EAC1B,OAAAtE,EAAO,UAAY,GACnBA,EAAO,WAAasF,IAAY,UAAYhB,EAAM,CAAC,EAAIA,EAAM,CAAC,EAEvDtE,CAEX,CAEO,OAAAA,CACT,CAWA,SAASyF,GAAUzY,EAAa,SAC9B,IAAIsY,EAAU,SAEd,QAAIr3B,EAAA+e,EAAI,WAAJ,MAAA/e,EAAA,KAAA+e,EAAe,aAAc/U,EAAA+U,EAAI,WAAJ,MAAA/U,EAAA,KAAA+U,EAAe,eACpCsY,EAAA,WAGRtY,EAAI,SAAS,OAAO,IACZsY,EAAA,SAGRtY,EAAI,SAAS,UAAU,IACfsY,EAAA,YAGRtY,EAAI,SAAS,IAAI,IACTsY,EAAA,WAGRtY,EAAI,SAAS,MAAM,IACXsY,EAAA,QAGRtY,EAAI,SAAS,WAAW,IAChBsY,EAAA,cAGRtY,EAAI,SAAS,iBAAiB,GAAKA,EAAI,SAAS,iBAAiB,KACzDsY,EAAA,cAGRtY,EAAI,SAAS,OAAO,IACZsY,EAAA,SAGRtY,EAAI,SAAS,UAAU,IACfsY,EAAA,SAGRtY,EAAI,SAAS,OAAO,IACZsY,EAAA,SAGRtY,EAAI,SAAS,OAAO,IACZsY,EAAA,SAGRtY,EAAI,SAAS,WAAW,IAChBsY,EAAA,aAGRtY,EAAI,SAAS,SAAS,IACdsY,EAAA,WAGRtY,EAAI,SAAS,UAAU,IACfsY,EAAA,YAGRtY,EAAI,SAAS,QAAQ,IACbsY,EAAA,UAGLA,CACT,CAEO,SAASI,GAAchB,EAAmB,CAC/C,IAAI1E,EAAS,CACX,UAAW,GACX,QAAS,GACT,WAAY,GACZ,aAAA0E,EACA,IAAK,EAAA,EAGD,MAAAY,EAAUG,GAAUf,CAAY,EAKlC,GAFK1E,EAAAqF,GAAcC,EAASZ,EAAc1E,CAAM,EAEhD,CAACA,EAAO,UACH,OAAAA,EAIT,OAAQsF,EAAS,CACf,IAAK,UACH,OAAOtB,GAAchE,CAAM,EAE7B,IAAK,QACH,OAAOmE,GAAYnE,CAAM,EAE3B,IAAK,WACH,OAAOuE,GAAevE,CAAM,EAE9B,IAAK,UACH,OAAOwE,GAAcxE,CAAM,EAE7B,IAAK,OACI,OAAAyE,GAAWC,EAAc1E,CAAM,EAExC,IAAK,YACI,OAAA2E,GAAeD,EAAc1E,CAAM,EAE5C,IAAK,aACI,OAAA4E,GAAgBF,EAAc1E,CAAM,EAE7C,IAAK,QACH,OAAO6E,GAAY7E,CAAM,EAE3B,IAAK,QACH,OAAO8E,GAAY9E,CAAM,EAE3B,IAAK,QACH,OAAO+E,GAAY/E,CAAM,EAE3B,IAAK,QACI,OAAAgF,GAAYN,EAAc1E,CAAM,EAEzC,IAAK,YACI,OAAAiF,GAAgBP,EAAc1E,CAAM,EAE7C,IAAK,UACH,OAAOkF,GAAclF,CAAM,EAE7B,IAAK,WACI,OAAAmF,GAAeT,EAAc1E,CAAM,EAE5C,IAAK,SACI,OAAAoF,GAAaV,EAAc1E,CAAM,CAE5C,CAEO,OAAAA,CACT,CCheA,SAAS2F,GAAep5B,EAAY,qBAClC,KAAM,CAACm4B,EAAckB,CAAe,EAAIz2B,WAAiB,EAAE,EAE3D,SAAS02B,GAAgB,CACvB,GAAI,CAACnB,EACH,OAGI,MAAA1E,EAAS0F,GAAchB,CAAY,EACrC1E,EAAO,WAAaA,EAAO,SAC7BzzB,EAAM,iBAAiB,CAAE,IAAKyzB,EAAO,GAAK,CAAA,CAE9C,CAIE,OAAAnyB,EAAA,KAAC8wB,EAAgB,gBAAA,CAAA,GAAG,UACjB,SAAA,CAAA,GAAC1mB,GAAAhK,EAAA1B,GAAA,YAAAA,EAAO,OAAP,YAAA0B,EAAa,QAAb,MAAAgK,EAAoB,MACnBpK,OAAA,MAAA,CAAI,UAAU,4PACb,SAAA,CAAAF,EAAA,IAAC0E,EAAA,CACC,MAAOqyB,EACP,QAAUxoB,GAAW0pB,EAAgB1pB,EAAE,OAAO,KAAK,EACnD,KAAK,MACL,UAAU,kBACV,UAAS,GACT,YAAY,YAAA,CACd,QACClO,EAAO,CAAA,UAAU,oBAAoB,QAAS63B,EAAe,SAE9D,KAAA,CAAA,EACF,IAEDxtB,GAAAF,EAAA5L,GAAA,YAAAA,EAAO,OAAP,YAAA4L,EAAa,QAAb,YAAAE,EAAoB,MACnB1K,EAAA,IAAC,SAAA,CACC,KAAK8K,GAAAF,EAAAhM,GAAA,YAAAA,EAAO,OAAP,YAAAgM,EAAa,QAAb,YAAAE,EAAoB,IACzB,YAAY,IACZ,gBAAiB,GACjB,OAAOG,GAAAF,EAAAnM,GAAA,YAAAA,EAAO,OAAP,YAAAmM,EAAa,QAAb,YAAAE,EAAoB,IAC3B,UAAU,oBAAA,CAEZ,CAEJ,CAAA,CAAA,CAEJ,CC1Ba,MAAAktB,GAASxS,OAAK,OAAsB,CAC/C,KAAM,UACN,MAAO,QACP,KAAM,GACN,YAAa,OACJ,MAAA,CACL,IAAGrlB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,gBAAiB,GACjB,eAAgB,CACd,MAAO,gBACT,EACA,OAAQ,CAAC,CACP,OAAAG,EACA,UAAA+S,EACA,EAAAjL,CAAA,KAKK,CACL,UAAW7J,EACX,eAAgB,CACd,OAAS2yB,GAA8C5wB,EAAO,SAAS,UAAU4wB,CAAO,EACxF,OAAQ7d,EAAU,QAAQ,OAC1B,SAAU,CAAC/S,EAAO,MAAM,UAAU,CAAA,CAAE,EACpC,KAAM,SACN,QAAS8H,EAAE,uBAAuB,CACpC,CAAA,EACF,CAEJ,EACA,eAAgB,CACP,MAAA,CACL,IAAK,CACH,QAAS,IACX,EACA,QAAS,CACP,QAAS,IACX,EACA,YAAa,CACX,QAAS,CACX,EACA,gBAAiB,CACf,QAAS,KAAK,QAAQ,gBACtB,UAAW,IAAM,KAAK,QAAQ,eAChC,CAAA,CAEJ,EACA,WAAY,CACH,MAAA,CACL,CACE,IAAK,QACP,CAAA,CAEJ,EACA,WAAW,CAAE,eAAA8d,GAAkB,CACtB,MAAA,CAAC,MAAO,KAAK,QAAQ,eAAgB,CAAC,SAAUA,CAAc,CAAC,CACxE,EACA,aAAc,CACZ,OAAO+K,EAAAA,sBAAsB4G,EAAc,CAC7C,EACA,aAAc,CACL,MAAA,CACL,UACG3G,GACC,CAAC,CAAE,GAAA5X,EAAI,SAAApR,KAAe,CACd,KAAA,CAAE,UAAAuR,CAAc,EAAAH,EAChB3Y,EAAO,KAAK,KAAK,OAAOuwB,CAAO,EAErC,OAAIhpB,GACFoR,EAAG,iBAAiBG,EAAU,KAAMA,EAAU,GAAI9Y,CAAI,EAEjD,EACT,CAAA,CAER,CACF,CAAC,EC/FD,SAASs3B,GAAuB,CAAE,OAAA33B,EAAQ,GAAG7B,GAAc,CACnD,KAAA,CAAE,EAAA2J,GAAM8D,IAER,CAACgsB,EAAcC,CAAe,EAAI92B,EAAAA,SAAS,EAAE,EAC7C,CAAC+2B,EAASC,CAAU,EAAIh3B,EAAA,SAAS,CAAE,CAAA,EACnC,CAACi3B,EAAaC,CAAc,EAAIl3B,WAAS,EAAE,EAC3C,CAACm3B,EAAcC,CAAe,EAAIp3B,WAAS,EAAE,EAC7C,CAAC8H,EAASuvB,CAAU,EAAIr3B,WAAS,EAAK,EAE5CG,OAAAA,EAAAA,UAAU,IAAM,CACT2H,IACHovB,EAAe,EAAE,EACjBE,EAAgB,EAAE,EAClBN,EAAgB,EAAE,EAClBE,EAAW,CAAE,CAAA,EAEN/3B,EAAA,SAAS,cAAc,EAAE,EACzBA,EAAA,SAAS,eAAe,EAAE,EACnC,EACC,CAACA,EAAQ6I,CAAO,CAAC,EAEpB3H,EAAAA,UAAU,IAAM,CACT2H,GAED7I,GAAUA,EAAO,UAAYA,EAAO,SAAS,eACxCA,EAAA,SAAS,cAAcg4B,CAAW,CAE1C,EAAA,CAACnvB,EAASmvB,EAAah4B,CAAM,CAAC,EAEjCkB,EAAAA,UAAU,IAAM,CACT2H,GAED7I,GAAUA,EAAO,UAAYA,EAAO,SAAS,gBACxCA,EAAA,SAAS,eAAek4B,CAAY,CAE5C,EAAA,CAACrvB,EAASqvB,EAAcl4B,CAAM,CAAC,EAElCkB,EAAAA,UAAU,IAAM,CACd,GAAI,CAAClB,EACH,OAEI,MAAAq4B,EAAkBr4B,EAAO,iBAAiB,WAAW,KAAM0J,GAAaA,EAAI,OAAS4uB,GAAiB,IAAI,EAEhH,GAAI,CAACD,EACH,OAEF,MAAMl3B,EAAW,IAAM,CACrB,GAAI,CAAC0H,EACH,OAEF,MAAM+uB,EAAeS,EAAkBA,EAAgB,QAAQ,aAAe,GACxEP,EAAUO,EAAkBA,EAAgB,QAAQ,QAAU,CAAA,EACpER,EAA6BU,GAAAA,IAAaX,EAAeA,EAAeW,CAAS,EACjFR,KAA2Bz2B,YAAUk3B,EAAaV,CAAO,EAAIU,EAAcV,CAAQ,CAAA,EAG9E,cAAA,iBAAiBW,GAAmBt3B,CAAQ,EAE5C,IAAM,CACNk3B,GAEE,OAAA,oBAAoBI,GAAmBt3B,CAAQ,CAAA,CACxD,EACC,CAAC0H,EAAS7I,CAAM,CAAC,EAGlBP,EAAA,KAAC6E,EAAA,CACC,KAAMuE,EACN,aAAcuvB,EAEd,SAAA,CAAA74B,EAAA,IAACiF,EAAA,CACC,SAAUrG,GAAA,YAAAA,EAAO,SACjB,QAAO,GAEP,SAAAoB,EAAA,IAACtB,EAAA,CACC,QAASE,GAAA,YAAAA,EAAO,QAChB,SAAUA,GAAA,YAAAA,EAAO,SACjB,SAAUA,GAAA,YAAAA,EAAO,SAEjB,SAACoB,EAAA,IAAAqU,EAAA,CAAc,KAAMzV,GAAA,YAAAA,EAAO,KAAM,CAAA,CACpC,CAAA,CACF,EACAsB,EAAA,KAACiF,EAAA,CACC,iBAAgB,GAChB,UAAU,kBACV,MAAM,QACN,KAAK,SAGL,SAAA,CAACjF,EAAAA,KAAA,MAAA,CAAI,UAAU,gFACb,SAAA,CAACF,EAAA,IAAA6E,GAAA,CACE,SAAE0D,EAAA,2BAA2B,CAChC,CAAA,EACCvI,EAAA,IAAA,OAAA,CAAK,UAAU,yBACb,SAAQu4B,EAAA,OAAS,GAAGF,EAAe,CAAC,IAAIE,EAAQ,MAAM,GAAK,MAC9D,CAAA,EACF,EACAv4B,EAAAA,IAAC,MAAI,CAAA,UAAU,4GACb,SAAAA,EAAA,IAAC0E,EAAA,CACC,KAAK,OACL,SAAQ,GACR,UAAU,kBACV,YAAY,OACZ,UAAS,GACT,MAAO+zB,EACP,SAAUlqB,GAAKmqB,EAAenqB,EAAE,OAAO,KAAK,CAAA,CAAA,EAEhD,QACC1J,GAAM,CAAA,UAAU,oBACd,SAAA0D,EAAE,4BAA4B,EACjC,QACC,MAAI,CAAA,UAAU,4GACb,SAACvI,MAAA,MAAA,CAAI,UAAU,4EACb,SAAAA,EAAA,IAAC0E,EAAA,CACC,KAAK,OACL,SAAQ,GACR,UAAU,gBACV,YAAY,OACZ,MAAOi0B,EACP,SAAUpqB,GAAKqqB,EAAgBrqB,EAAE,OAAO,KAAK,CAAA,GAEjD,CACF,CAAA,EAEArO,EAAAA,KAAC,MAAI,CAAA,UAAU,6EACb,SAAA,CAAAF,EAAA,IAACK,EAAO,CAAA,SAAU,CAACk4B,EAAQ,OAAQ,UAAU,kBAAkB,QAAS93B,EAAO,SAAS,qBACrF,SAAA8H,EAAE,6BAA6B,EAClC,EAECvI,EAAA,IAAAK,EAAA,CAAO,SAAU,CAACk4B,EAAQ,OAAQ,UAAU,kBAAkB,QAAS93B,EAAO,SAAS,qBACrF,SAAA8H,EAAE,yBAAyB,EAC9B,CAAA,EACF,EAEArI,EAAAA,KAAC,MAAI,CAAA,UAAU,0DACb,SAAA,CAAAF,EAAA,IAACK,EAAO,CAAA,SAAU,CAACk4B,EAAQ,OAAQ,UAAU,kBAAkB,QAAS93B,EAAO,SAAS,QACrF,SAAA8H,EAAE,4BAA4B,EACjC,EAECvI,EAAA,IAAAK,EAAA,CAAO,SAAU,CAACk4B,EAAQ,OAAQ,UAAU,kBAAkB,QAAS93B,EAAO,SAAS,WACrF,SAAA8H,EAAE,+BAA+B,EACpC,CAAA,EACF,CAAA,CAAA,CACF,CAAA,CAAA,CAAA,CAGN,CCvHA,MAAM4wB,GAAa,CAACz4B,EAAoB2H,IAAkBA,EAAS3H,EAAM,EAAE,EAE3E,SAASg2B,GAAM0C,EAAWC,EAAuBC,EAAgC,CACxE,OAAA,OAAOD,EAAeD,EAAE,QAAQ,wBAAyB,MAAM,EAAIA,EAAGE,EAAgB,KAAO,KAAK,CAC3G,CAEA,SAASC,GACP5f,EACA6f,EACAC,EACmD,CACnD,MAAM3X,EAA4B,CAAA,EAClC,IAAI4X,EAAiD,CAAA,EACrD,MAAMnB,EAAoB,CAAA,EAE1B,IAAItvB,EAAQ,EAEZ,GAAI,CAACuwB,EACH,MAAO,CAAE,oBAAqB,CAAA,EAAI,QAAS,CAAG,CAAA,EAE3C7f,GAAA,MAAAA,EAAA,YAAY,CAAC7Y,EAAWC,IAAa,CACpCD,EAAK,OACH44B,EAAsBzwB,CAAK,EAC7BywB,EAAsBzwB,CAAK,EAAI,CAC7B,KAAMywB,EAAsBzwB,CAAK,EAAE,KAAOnI,EAAK,KAC/C,IAAK44B,EAAsBzwB,CAAK,EAAE,GAAA,EAIpCywB,EAAsBzwB,CAAK,EAAI,CAC7B,KAAM,GAAGnI,EAAK,IAAI,GAClB,IAAAC,CAAA,EAKKkI,GAAA,CACX,GAGsBywB,EAAAA,EAAsB,OAAO,OAAO,EAE5D,QAASlsB,EAAI,EAAGA,EAAIksB,EAAsB,OAAQlsB,GAAK,EAAG,CACxD,KAAM,CAAE,KAAApE,EAAM,IAAArI,CAAI,EAAI24B,EAAsBlsB,CAAC,EAEvCmsB,EAAU,CAAC,GAAGvwB,EAAK,SAASowB,CAAU,CAAC,EAE7C,QAASI,EAAI,EAAGA,EAAID,EAAQ,OAAQC,GAAK,EAAG,CACpC,MAAAC,EAAIF,EAAQC,CAAC,EAEf,GAAAC,EAAE,CAAC,IAAM,GACX,MAEEA,EAAE,QAAU,QACdtB,EAAQ,KAAK,CACX,KAAMx3B,EAAM84B,EAAE,MACd,GAAI94B,EAAM84B,EAAE,MAAQA,EAAE,CAAC,EAAE,MAAA,CAC1B,CAEL,CACF,CAEA,QAASrsB,EAAI,EAAGA,EAAI+qB,EAAQ,OAAQ/qB,GAAK,EAAG,CACpC,MAAAssB,EAAIvB,EAAQ/qB,CAAC,EACPsU,EAAA,KAAKM,aAAW,OAAO0X,EAAE,KAAMA,EAAE,GAAI,CAAE,MAAOL,CAAkB,CAAC,CAAC,CAChF,CAEO,MAAA,CACL,oBAAqB3X,EACrB,QAAAyW,CAAA,CAEJ,CAEA,SAASwB,GAAQC,EAAqBzB,EAAmB,CAAE,MAAA73B,EAAO,SAAA2H,GAAiB,CAGjF,GAAI,CAFgBkwB,EAAQ,CAAC,EAG3B,OAEF,KAAM,CAAE,KAAAxe,EAAM,GAAAC,CAAG,EAAIue,EAAQ,CAAC,EAE1BlwB,GACFA,EAAS3H,EAAM,GAAG,WAAWs5B,EAAajgB,EAAMC,CAAE,CAAC,CACvD,CAEA,SAASigB,GAAiBD,EAAqB/wB,EAAeixB,EAAoB3B,EAA8C,CAC9H,MAAMnQ,EAAYnf,EAAQ,EAEtB,GAAA,CAACsvB,EAAQnQ,CAAS,EACb,OAAA,KAET,KAAM,CAAE,KAAM+R,EAAa,GAAIC,GAAc7B,EAAQtvB,CAAK,EAEpDyf,EAAS0R,EAAYD,EAAcH,EAAY,OAASE,EAExD,CAAE,KAAAngB,EAAM,GAAAC,CAAG,EAAIue,EAAQnQ,CAAS,EAEtC,OAAAmQ,EAAQnQ,CAAS,EAAI,CACnB,GAAIpO,EAAK0O,EACT,KAAM3O,EAAO2O,CAAA,EAGR,CAACA,EAAQ6P,CAAO,CACzB,CAEA,SAAS8B,GAAWL,EAAqBzB,EAAmB,CAAE,GAAA9e,EAAI,SAAApR,GAAiB,CACjF,IAAIqgB,EAAS,EAET4R,EAAa/B,EAAQ,QAEzB,GAAI,CAAC+B,EAAW,OACP,MAAA,GAET,QAAS9sB,EAAI,EAAGA,EAAI8sB,EAAW,OAAQ9sB,GAAK,EAAG,CAC7C,KAAM,CAAE,KAAAuM,EAAM,GAAAC,CAAG,EAAIsgB,EAAW9sB,CAAC,EAE9BiM,EAAA,WAAWugB,EAAajgB,EAAMC,CAAE,EAEnC,MAAMugB,EAA2BN,GAAiBD,EAAaxsB,EAAGkb,EAAQ4R,CAAU,EAEhFC,IACF7R,EAAS6R,EAAyB,CAAC,EACnCD,EAAaC,EAAyB,CAAC,EAE3C,CAEA,OAAAlyB,EAASoR,CAAE,EAEJ,EACT,CAEA,SAAS+gB,GAAiB,CAAE,KAAA9c,EAAM,GAAAjE,EAAI,cAAAghB,EAAe,yBAAAC,EAA0B,UAAAC,GAAkB,CACzF,MAAAtI,EAASoI,EAAcE,CAAS,EAEtC,GAAItI,EAAQ,CACJ,MAAAzP,EAAcnJ,EAAG,QAAQ,mBAAoB,CACjD,QAAS4Y,EAAO,KAChB,MAAOA,EAAO,GACd,MAAO,CAAE,MAAOqI,CAAyB,CAAA,CAC1C,EACD,OAAAhd,GAAA,MAAAA,EAAM,SAASkF,GAEf,WAAW,IAAM,CACf,MAAMsK,EAAK,OAAO,SAAS,cAAc,IAAIwN,CAAwB,EAAE,EACnExN,GACF0N,EAAA,EAAe1N,EAAI,CAAE,SAAU,SAAU,WAAY,YAAa,GAEnE,CAAC,EAEG,EACT,CAEO,MAAA,EACT,CAEO,MAAMgM,GAAoB,oBAGpB2B,GAAoB,IAAI,YAAY3B,EAAiB,EAiBrDH,GAAmBlU,YAAU,OAAqC,CAC7E,KAAM,SAEN,YAAa,OACJ,MAAA,CACL,IAAGvkB,EAAA,KAAK,SAAL,YAAAA,EAAA,WACH,WAAY,GACZ,YAAa,GACb,QAAS,CAAC,EACV,aAAc,EACd,kBAAmB,gBACnB,yBAA0B,wBAC1B,cAAe,GACf,aAAc,GACd,SAAU,IAAM,CAAC,EACjB,OAAQ,CAAC,CAAE,OAAAG,EAAQ,EAAA8H,MAAc,CAC/B,UAAW6vB,GACX,eAAgB,CACd,OAAQ,IAAM,CAAC,EACf,KAAM,mBACN,QAAS7vB,EAAE,iCAAiC,EAC5C,SAAU,IAAM,GAChB,SAAU,GACV,OAAA9H,CACF,CAAA,EACF,CAEJ,EAEA,YAAa,CACJ,MAAA,CACL,QAAS,CAAC,EACV,aAAc,EAAA,CAElB,EAEA,aAAc,CACL,MAAA,CACL,cACG+4B,GACC,CAAC,CAAE,MAAA94B,EAAO,SAAA2H,MACR,KAAK,QAAQ,WAAamxB,EACrB,KAAA,QAAQ,QAAU,GACvB,KAAK,QAAQ,aAAe,EAC5B,OAAO,cAAcqB,EAAiB,EACtC1B,GAAWz4B,EAAO2H,CAAQ,EACnB,IAEb,eACG2xB,GACC,CAAC,CAAE,MAAAt5B,EAAO,SAAA2H,MACR,KAAK,QAAQ,YAAc2xB,EAE3Bb,GAAWz4B,EAAO2H,CAAQ,EAEnB,IAEb,QACE,IACE,CAAC,CAAE,MAAA3H,EAAO,SAAA2H,KAAe,CACjB,KAAA,CAAE,YAAA2xB,CAAY,EAAI,KAAK,QACvB,CAAE,aAAA3B,EAAc,QAAAE,GAAY,KAAK,QACjCuC,EAAgBvC,EAAQF,CAAY,EAE1C,OAAIyC,GACFf,GAAQC,EAAa,CAACc,CAAa,EAAG,CAAE,MAAAp6B,EAAO,SAAA2H,EAAU,EACzD,KAAK,QAAQ,QAAQ,OAAOgwB,EAAc,CAAC,IAG3C0B,GAAQC,EAAazB,EAAS,CAAE,MAAA73B,EAAO,SAAA2H,CAAU,CAAA,EAC5C,KAAA,QAAQ,QAAQ,SAGvB,OAAO,cAAcwyB,EAAiB,EAEtC1B,GAAWz4B,EAAO2H,CAAQ,EAEnB,EACT,EACJ,WACE,IACE,CAAC,CAAE,MAAA3H,EAAO,GAAA+Y,EAAI,SAAApR,KAAe,CACrB,KAAA,CAAE,YAAA2xB,CAAY,EAAI,KAAK,QACvB,CAAE,QAAAzB,CAAQ,EAAI,KAAK,QAEzB,OAAA8B,GAAWL,EAAazB,EAAS,CAAE,GAAA9e,EAAI,SAAApR,CAAU,CAAA,EAEjD,KAAK,QAAQ,aAAe,GACvB,KAAA,QAAQ,QAAU,GACvB,OAAO,cAAcwyB,EAAiB,EAEtC1B,GAAWz4B,EAAO2H,CAAQ,EAEnB,EACT,EACJ,qBACE,IACE,CAAC,CAAE,KAAAqV,EAAM,GAAAjE,KAAc,CACf,KAAA,CAAE,yBAAAihB,CAAyB,EAAI,KAAK,QACpC,CAAE,aAAArC,EAAc,QAAAE,GAAY,KAAK,QACjCnQ,GAAaiQ,EAAeE,EAAQ,OAAS,GAAKA,EAAQ,OAChE,YAAK,QAAQ,aAAenQ,EAC5B,OAAO,cAAcyS,EAAiB,EAE/BL,GAAiB,CACtB,KAAA9c,EACA,GAAAjE,EACA,cAAe8e,EACf,yBAAAmC,EACA,UAAWtS,CAAA,CACZ,CACH,EACJ,qBACE,IACE,CAAC,CAAE,KAAA1K,EAAM,GAAAjE,KAAc,CACf,KAAA,CAAE,yBAAAihB,CAAyB,EAAI,KAAK,QACpC,CAAE,aAAArC,EAAc,QAAAE,GAAY,KAAK,QACjCnQ,GAAaiQ,EAAe,GAAKE,EAAQ,OAC/C,YAAK,QAAQ,aAAenQ,EAC5B,KAAK,QAAQ,UAAY,KAAK,QAAQ,SAAS,EAC/C,OAAO,cAAcyS,EAAiB,EAE/BL,GAAiB,CACtB,KAAA9c,EACA,GAAAjE,EACA,cAAe8e,EACf,yBAAAmC,EACA,UAAWtS,CAAA,CACZ,CACH,CAAA,CAER,EAEA,uBAAwB,CACtB,MAAM2S,EAAgB,KAEf,MAAA,CACL,IAAIvY,SAAO,CACT,IAAK,IAAIC,EAAA,UAAU,QAAQ,EAC3B,MAAO,CACL,MAAO,CACL,OAAOJ,EAAAA,cAAc,KACvB,EACA,MAAM2Y,EAAK,CACH,KAAA,CAAE,IAAArhB,EAAK,WAAAshB,CAAe,EAAAD,EAEtB,CAAE,WAAAxB,EAAY,kBAAAC,EAAmB,yBAAAiB,EAA0B,aAAArB,EAAc,cAAAC,GAC3EyB,EAAc,QAElB,GAAIE,GAAczB,EAAY,CACtB,KAAA,CAAE,oBAAA0B,EAAqB,QAAA3C,CAAA,EAAYgB,GACvC5f,EACA+c,GAAM8C,EAAYH,EAAcC,CAAa,EAC7CG,CAAA,EAOE,GALJsB,EAAc,QAAQ,QAAUxC,EAC5BwC,EAAc,QAAQ,aAAexC,EAAQ,OAAS,IACxDwC,EAAc,QAAQ,aAAe,GAEvC,OAAO,cAAcF,EAAiB,EAClCG,EAAI,QAAQ,kBAAkB,EAAG,CACnC,KAAM,CAAE,QAAAG,EAAS,MAAAC,EAAO,MAAAv5B,CAAU,EAAAm5B,EAAI,QAAQ,kBAAkB,EAChEE,EAAoB,KAAK9Y,aAAW,OAAO+Y,EAASC,EAAOv5B,CAAK,CAAC,CAAA,MAG7D02B,EAAQ,SACU2C,EAAA,CAAC,EAAI9Y,EAAA,WAAW,OAAOmW,EAAQ,CAAC,EAAE,KAAMA,EAAQ,CAAC,EAAE,GAAI,CACzE,MAAOmC,CAAA,CACR,GAIE,OAAArY,gBAAc,OAAO1I,EAAKuhB,CAAmB,CACtD,CACA,OAAO7Y,EAAAA,cAAc,KACvB,CACF,EACA,MAAO,CACL,YAAY3hB,EAAO,CACV,OAAA,KAAK,SAASA,CAAK,CAC5B,CACF,CAAA,CACD,CAAA,CAEL,CACF,CAAC,ECzYY26B,GAAe,CAC1B,IAAO,KACP,KAAQ,KACR,SAAY,KACZ,OAAU,KACV,MAAS,KACT,KAAQ,KACR,SAAY,KACZ,UAAa,KACb,YAAe,KACf,KAAQ,KACR,IAAO,KACP,sBAAyB,KACzB,iBAAoB,KACpB,KAAQ,KACR,MAAS,KACT,SAAY,KACZ,+BAAkC,KAClC,WAAc,KACd,YAAe,KACf,cAAiB,KACjB,QAAW,KACX,QAAW,KACX,oBAAuB,KACvB,qBAAwB,KACxB,uBAA0B,KAC1B,IAAO,KACP,iBAAoB,KACpB,6BAAgC,KAChC,UAAa,KACb,6BAAgC,KAChC,iBAAoB,KACpB,KAAQ,KACR,gBAAmB,KACnB,cAAiB,KACjB,SAAY,KACZ,kBAAqB,KACrB,eAAkB,KAClB,aAAgB,KAChB,eAAkB,KAClB,SAAY,KACZ,MAAS,KACT,SAAY,KACZ,UAAa,KACb,UAAa,KACb,WAAc,KACd,SAAY,KACZ,QAAW,KACX,OAAU,KACV,cAAiB,KACjB,SAAY,KACZ,KAAQ,KACR,sBAAyB,KACzB,uBAA0B,KAC1B,eAAkB,KAClB,cAAiB,KACjB,cAAiB,KACjB,SAAY,KACZ,UAAa,KACb,WAAc,KACd,WAAc,KACd,eAAkB,KAClB,gBAAmB,KACnB,cAAiB,KACjB,eAAkB,KAClB,WAAc,KACd,UAAa,KACb,aAAgB,KAChB,SAAY,KACZ,QAAW,KACX,uBAA0B,KAC1B,cAAiB,KACjB,WAAc,KACd,OAAU,KACV,WAAc,KACd,QAAW,KACX,cAAiB,KACjB,SAAY,KACZ,UAAa,KACb,QAAW,KACX,WAAc,KACd,sBAAyB,KACzB,IAAO,KACP,IAAO,KACP,OAAU,KACV,WAAc,KACd,UAAa,KACb,aAAgB,KAChB,MAAS,KACT,MAAS,KACT,WAAc,KACd,aAAgB,KAChB,QAAW,KACX,KAAQ,KACR,KAAQ,KACR,MAAS,KACT,aAAgB,KAChB,YAAe,KACf,IAAO,KACP,MAAS,KACT,qBAAwB,KACxB,OAAU,KACV,KAAQ,KACR,KAAQ,KACR,WAAc,KACd,cAAiB,KACjB,gBAAmB,KACnB,MAAS,KACT,MAAS,KACT,cAAiB,KACjB,MAAS,KACT,WAAc,KACd,UAAa,KACb,QAAW,KACX,eAAkB,KAClB,UAAa,KACb,YAAe,KACf,WAAc,KACd,gBAAmB,KACnB,YAAe,KACf,YAAe,KACf,aAAgB,KAChB,cAAiB,KACjB,KAAQ,KACR,YAAe,KACf,MAAS,KACT,WAAc,KACd,gBAAmB,KACnB,WAAc,KACd,UAAa,KACb,iBAAoB,KACpB,WAAc,KACd,iBAAoB,KACpB,wBAA2B,KAC3B,aAAgB,KAChB,MAAS,KACT,aAAgB,KAChB,aAAgB,KAChB,YAAe,KACf,WAAc,KACd,aAAgB,KAChB,YAAe,KACf,YAAe,KACf,YAAe,KACf,MAAS,KACT,KAAQ,KACR,UAAa,KACb,MAAS,KACT,YAAe,KACf,KAAQ,KACR,KAAQ,MACR,KAAQ,KACR,eAAkB,KAClB,kBAAqB,UACrB,mBAAsB,MACtB,mBAAsB,MACtB,gBAAmB,KACnB,IAAO,KACP,KAAQ,KACR,oBAAuB,KACvB,iCAAoC,MACpC,KAAQ,IACR,YAAe,IACf,cAAiB,KACjB,QAAW,KACX,gBAAmB,KACnB,cAAiB,KACjB,EAAK,KACL,gBAAmB,KACnB,iBAAoB,KACpB,MAAS,KACT,aAAgB,KAChB,WAAc,KACd,YAAe,KACf,WAAc,KACd,cAAiB,KACjB,GAAM,KACN,WAAc,KACd,SAAY,KACZ,KAAM,KACN,SAAY,KACZ,KAAM,KACN,WAAc,KACd,YAAe,IACf,KAAQ,IACR,cAAiB,KACjB,UAAa,KACb,MAAS,KACT,UAAa,KACb,WAAc,KACd,KAAQ,KACR,aAAgB,KAChB,WAAc,KACd,kBAAqB,KACrB,UAAa,KACb,KAAQ,KACR,aAAgB,KAChB,UAAa,KACb,OAAU,KACV,OAAU,KACV,eAAkB,KAClB,eAAkB,KAClB,IAAO,KACP,KAAQ,KACR,IAAO,KACP,qBAAwB,KACxB,KAAQ,KACR,MAAS,KACT,iBAAoB,KACpB,MAAS,KACT,MAAS,KACT,KAAQ,KACR,KAAQ,KACR,IAAO,MACP,OAAU,KACV,KAAQ,KACR,KAAQ,KACR,MAAS,KACT,IAAO,KACP,KAAQ,KACR,MAAS,KACT,oBAAuB,KACvB,IAAO,KACP,eAAkB,KAClB,eAAkB,QAClB,iBAAoB,QACpB,iBAAoB,QACpB,SAAY,QACZ,MAAS,KACT,iBAAoB,QACpB,gBAAmB,QACnB,mBAAsB,QACtB,kBAAqB,QACrB,mBAAsB,QACtB,kBAAqB,QACrB,WAAc,QACd,YAAe,QACf,mBAAsB,QACtB,aAAgB,QAChB,iBAAoB,QACpB,YAAe,KACf,UAAa,KACb,YAAe,KACf,gBAAmB,KACnB,aAAgB,QAChB,eAAkB,QAClB,aAAgB,KAChB,YAAe,QACf,cAAiB,QACjB,QAAW,KACX,YAAe,QACf,OAAU,QACV,cAAiB,QACjB,SAAY,QACZ,UAAa,KACb,OAAU,QACV,SAAY,QACZ,oBAAuB,KACvB,wBAA2B,KAC3B,iBAAoB,QACpB,UAAa,QACb,mBAAsB,QACtB,YAAe,QACf,aAAgB,KAChB,iBAAoB,QACpB,mBAAsB,QACtB,YAAe,KACf,SAAY,QACZ,WAAc,QACd,IAAO,KACP,WAAc,QACd,aAAgB,QAChB,SAAY,KACZ,gBAAmB,QACnB,kBAAqB,QACrB,MAAS,KACT,cAAiB,QACjB,gBAAmB,QACnB,cAAiB,QACjB,kBAAqB,QACrB,oBAAuB,QACvB,QAAW,QACX,YAAe,QACf,cAAiB,QACjB,QAAW,QACX,YAAe,QACf,cAAiB,QACjB,MAAS,QACT,UAAa,QACb,YAAe,QACf,OAAU,QACV,WAAc,QACd,aAAgB,QAChB,KAAQ,QACR,SAAY,QACZ,WAAc,QACd,SAAY,QACZ,aAAgB,QAChB,eAAkB,QAClB,eAAkB,QAClB,mBAAsB,QACtB,qBAAwB,QACxB,cAAiB,QACjB,kBAAqB,QACrB,oBAAuB,QACvB,UAAa,QACb,cAAiB,QACjB,gBAAmB,QACnB,aAAgB,QAChB,iBAAoB,QACpB,mBAAsB,QACtB,OAAU,QACV,WAAc,QACd,aAAgB,QAChB,OAAU,QACV,WAAc,QACd,aAAgB,QAChB,MAAS,QACT,UAAa,QACb,YAAe,QACf,UAAa,QACb,cAAiB,QACjB,gBAAmB,QACnB,YAAe,QACf,gBAAmB,QACnB,kBAAqB,QACrB,eAAkB,KAClB,IAAO,KACP,UAAa,QACb,YAAe,QACf,UAAa,MACb,eAAkB,SAClB,iBAAoB,SACpB,MAAS,KACT,UAAa,QACb,YAAe,QACf,MAAS,KACT,oBAAuB,KACvB,wBAA2B,QAC3B,0BAA6B,QAC7B,OAAU,KACV,SAAY,KACZ,mBAAsB,KACtB,gBAAmB,QACnB,kBAAqB,QACrB,oBAAuB,KACvB,qBAAwB,KACxB,iBAAoB,KACpB,cAAiB,QACjB,gBAAmB,QACnB,iBAAoB,KACpB,cAAiB,QACjB,gBAAmB,QACnB,gBAAmB,QACnB,eAAkB,KAClB,eAAkB,KAClB,mBAAsB,QACtB,iBAAoB,QACpB,oBAAuB,QACvB,MAAS,KACT,MAAS,KACT,UAAa,KACb,SAAY,QACZ,UAAa,KACb,cAAiB,QACjB,gBAAmB,QACnB,aAAgB,KAChB,iBAAoB,QACpB,mBAAsB,QACtB,KAAQ,KACR,SAAY,QACZ,WAAc,QACd,MAAS,KACT,UAAa,QACb,YAAe,QACf,QAAW,KACX,YAAe,QACf,cAAiB,QACjB,UAAa,KACb,OAAU,QACV,QAAW,QACX,IAAO,KACP,QAAW,QACX,UAAa,QACb,MAAS,KACT,UAAa,QACb,YAAe,QACf,OAAU,KACV,WAAc,QACd,aAAgB,QAChB,QAAW,KACX,YAAe,QACf,cAAiB,QACjB,QAAW,KACX,YAAe,QACf,cAAiB,QACjB,QAAW,KACX,YAAe,QACf,cAAiB,QACjB,gBAAmB,KACnB,aAAgB,QAChB,eAAkB,QAClB,gBAAmB,KACnB,aAAgB,QAChB,eAAkB,QAClB,yBAA4B,QAC5B,sBAAyB,QACzB,wBAA2B,QAC3B,+BAAkC,QAClC,4BAA+B,QAC/B,8BAAiC,QACjC,4BAA+B,QAC/B,yBAA4B,QAC5B,2BAA8B,QAC9B,OAAU,KACV,QAAW,KACX,YAAe,QACf,cAAiB,QACjB,cAAiB,KACjB,OAAU,KACV,YAAe,KACf,yBAA4B,MAC5B,QAAW,KACX,YAAe,QACf,cAAiB,QACjB,aAAgB,KAChB,UAAa,QACb,YAAe,QACf,SAAY,KACZ,aAAgB,QAChB,eAAkB,QAClB,eAAkB,KAClB,aAAgB,KAChB,MAAS,KACT,YAAe,KACf,QAAW,MACX,YAAe,SACf,cAAiB,SACjB,OAAU,KACV,YAAe,QACf,cAAiB,QACjB,QAAW,KACX,WAAc,QACd,aAAgB,QAChB,QAAW,KACX,aAAgB,QAChB,eAAkB,QAClB,qBAAwB,KACxB,kBAAqB,QACrB,eAAkB,QAClB,oBAAuB,QACvB,iBAAoB,QACpB,eAAkB,MAClB,mBAAsB,SACtB,qBAAwB,SACxB,UAAa,KACb,WAAc,QACd,aAAgB,QAChB,mBAAsB,KACtB,oBAAuB,QACvB,sBAAyB,QACzB,aAAgB,KAChB,iBAAoB,QACpB,mBAAsB,QACtB,UAAa,KACb,cAAiB,QACjB,gBAAmB,QACnB,WAAc,KACd,uBAA0B,QAC1B,yBAA4B,QAC5B,gBAAmB,KACnB,qBAAwB,QACxB,uBAA0B,QAC1B,gBAAmB,KACnB,aAAgB,QAChB,eAAkB,QAClB,eAAkB,KAClB,mBAAsB,QACtB,qBAAwB,QACxB,KAAQ,KACR,aAAgB,KAChB,qBAAwB,WACxB,wBAA2B,KAC3B,OAAU,KACV,sBAAyB,KACzB,WAAc,KACd,qBAAwB,cACxB,mBAAsB,cACtB,uBAA0B,cAC1B,kBAAqB,KACrB,4BAA+B,WAC/B,0BAA6B,WAC7B,8BAAiC,WACjC,OAAU,KACV,qBAAwB,WACxB,sBAAyB,WACzB,0BAA6B,cAC7B,yBAA4B,cAC5B,2BAA8B,cAC9B,mBAAsB,WACtB,oBAAuB,WACvB,wBAA2B,cAC3B,uBAA0B,cAC1B,yBAA4B,cAC5B,uBAA0B,WAC1B,wBAA2B,WAC3B,4BAA+B,cAC/B,2BAA8B,cAC9B,6BAAgC,cAChC,eAAkB,QAClB,mBAAsB,WACtB,gBAAmB,QACnB,oBAAuB,WACvB,qBAAwB,WACxB,iBAAoB,QACpB,qBAAwB,WACxB,kBAAqB,QACrB,sBAAyB,WACzB,uBAA0B,WAC1B,cAAiB,MACjB,mBAAsB,KACtB,oBAAuB,KACvB,eAAkB,KAClB,WAAc,KACd,YAAe,KACf,OAAU,KACV,QAAW,KACX,UAAa,KACb,IAAO,KACP,KAAQ,KACR,UAAa,KACb,YAAe,QACf,OAAU,KACV,KAAQ,KACR,SAAY,KACZ,QAAW,KACX,IAAO,KACP,KAAQ,KACR,UAAa,OACb,KAAQ,KACR,MAAS,KACT,OAAU,KACV,QAAW,KACX,MAAS,KACT,UAAa,KACb,QAAW,KACX,MAAS,KACT,KAAQ,KACR,MAAS,KACT,IAAO,KACP,GAAM,KACN,cAAiB,KACjB,KAAQ,KACR,IAAO,KACP,KAAQ,KACR,KAAQ,KACR,SAAY,KACZ,IAAO,KACP,MAAS,KACT,KAAQ,KACR,gBAAmB,KACnB,MAAS,KACT,MAAS,KACT,QAAW,KACX,SAAY,KACZ,QAAW,KACX,WAAc,KACd,aAAgB,KAChB,MAAS,KACT,OAAU,KACV,IAAO,KACP,QAAW,KACX,OAAU,KACV,QAAW,KACX,SAAY,MACZ,OAAU,KACV,SAAY,KACZ,IAAO,KACP,KAAQ,KACR,WAAc,QACd,MAAS,KACT,WAAc,KACd,MAAS,KACT,MAAS,KACT,MAAS,KACT,SAAY,KACZ,OAAU,KACV,KAAQ,KACR,WAAc,KACd,OAAU,KACV,QAAW,KACX,QAAW,KACX,eAAkB,KAClB,WAAc,KACd,cAAiB,KACjB,KAAQ,KACR,QAAW,KACX,KAAQ,MACR,MAAS,KACT,KAAQ,KACR,KAAQ,KACR,IAAO,KACP,KAAQ,KACR,QAAW,KACX,SAAY,KACZ,QAAW,KACX,OAAU,KACV,KAAQ,KACR,UAAa,KACb,OAAU,KACV,OAAU,KACV,MAAS,KACT,YAAe,KACf,OAAU,KACV,SAAY,KACZ,QAAS,KACT,MAAS,KACT,OAAU,KACV,QAAW,KACX,QAAW,KACX,KAAQ,KACR,KAAQ,KACR,cAAiB,KACjB,SAAY,KACZ,MAAS,KACT,QAAW,KACX,MAAS,KACT,MAAS,KACT,UAAa,KACb,IAAO,KACP,IAAO,KACP,IAAO,KACP,SAAY,KACZ,OAAU,KACV,YAAe,KACf,QAAW,KACX,UAAa,KACb,OAAU,MACV,WAAc,MACd,SAAY,KACZ,SAAY,KACZ,IAAO,KACP,KAAQ,KACR,QAAW,KACX,QAAW,KACX,eAAkB,KAClB,aAAgB,KAChB,QAAW,MACX,KAAQ,KACR,cAAiB,KACjB,SAAY,KACZ,UAAa,KACb,QAAW,KACX,MAAS,KACT,SAAY,KACZ,aAAgB,KAChB,eAAkB,KAClB,eAAkB,KAClB,UAAa,KACb,OAAU,KACV,YAAe,KACf,KAAQ,KACR,SAAY,KACZ,iBAAoB,KACpB,WAAc,KACd,YAAe,KACf,OAAU,KACV,OAAU,KACV,MAAS,KACT,WAAc,KACd,UAAa,KACb,OAAU,KACV,SAAY,KACZ,MAAS,KACT,OAAU,KACV,UAAa,KACb,MAAS,KACT,MAAS,KACT,YAAe,KACf,KAAQ,KACR,MAAS,KACT,SAAY,KACZ,WAAc,KACd,YAAe,KACf,WAAc,KACd,OAAU,KACV,MAAS,KACT,QAAW,KACX,QAAW,KACX,SAAY,KACZ,OAAU,KACV,OAAU,KACV,KAAQ,KACR,WAAc,MACd,YAAe,KACf,SAAY,KACZ,YAAe,KACf,SAAY,KACZ,OAAU,KACV,MAAS,KACT,SAAY,KACZ,QAAW,KACX,SAAY,KACZ,MAAS,KACT,UAAa,KACb,eAAkB,KAClB,UAAa,KACb,QAAW,KACX,MAAS,KACT,SAAY,KACZ,OAAU,KACV,OAAU,KACV,aAAgB,KAChB,YAAe,KACf,YAAe,KACf,MAAS,KACT,UAAa,KACb,MAAS,KACT,MAAS,KACT,OAAU,KACV,SAAY,KACZ,KAAQ,KACR,QAAW,KACX,OAAU,KACV,kBAAqB,KACrB,QAAW,KACX,IAAO,KACP,UAAa,KACb,oBAAuB,KACvB,KAAQ,KACR,OAAU,KACV,gBAAmB,KACnB,YAAe,KACf,QAAW,KACX,OAAU,KACV,KAAQ,KACR,YAAe,KACf,MAAS,KACT,aAAgB,KAChB,UAAa,KACb,KAAQ,KACR,MAAS,KACT,MAAS,KACT,UAAa,KACb,aAAgB,KAChB,KAAQ,KACR,MAAS,KACT,aAAgB,KAChB,UAAa,KACb,UAAa,KACb,MAAS,KACT,SAAY,KACZ,eAAkB,KAClB,YAAe,KACf,KAAQ,KACR,QAAW,KACX,OAAU,KACV,MAAS,KACT,OAAU,KACV,SAAY,KACZ,WAAc,KACd,UAAa,KACb,SAAY,KACZ,OAAU,KACV,SAAY,KACZ,KAAQ,KACR,QAAW,KACX,IAAO,KACP,cAAiB,KACjB,MAAS,KACT,SAAY,KACZ,QAAW,KACX,UAAa,KACb,YAAe,KACf,WAAc,KACd,OAAU,IACV,OAAU,KACV,IAAO,KACP,KAAQ,KACR,UAAa,KACb,WAAc,KACd,SAAY,KACZ,eAAkB,KAClB,KAAQ,KACR,MAAS,KACT,iBAAoB,KACpB,cAAiB,KACjB,eAAkB,KAClB,WAAc,KACd,aAAgB,KAChB,KAAQ,KACR,SAAY,KACZ,WAAc,KACd,mBAAsB,MACtB,eAAkB,KAClB,MAAS,KACT,MAAS,KACT,MAAS,KACT,QAAW,KACX,aAAgB,KAChB,eAAkB,KAClB,WAAc,KACd,qBAAwB,KACxB,UAAa,MACb,MAAS,KACT,QAAW,KACX,cAAiB,MACjB,SAAY,KACZ,QAAW,KACX,WAAc,KACd,QAAW,MACX,eAAkB,MAClB,OAAU,MACV,cAAiB,MACjB,cAAiB,MACjB,QAAW,MACX,mBAAsB,MACtB,sBAAyB,MACzB,OAAU,KACV,KAAQ,KACR,KAAQ,KACR,IAAO,KACP,OAAU,MACV,eAAkB,MAClB,MAAS,KACT,kBAAqB,KACrB,OAAU,KACV,YAAe,KACf,qBAAwB,KACxB,SAAY,KACZ,KAAQ,KACR,MAAS,KACT,WAAc,KACd,kBAAqB,KACrB,OAAU,KACV,iBAAoB,KACpB,QAAW,KACX,gBAAmB,KACnB,gBAAmB,KACnB,QAAW,KACX,YAAe,KACf,kBAAqB,KACrB,OAAU,IACV,OAAU,KACV,aAAgB,KAChB,UAAa,KACb,cAAiB,KACjB,MAAS,KACT,SAAY,IACZ,KAAQ,IACR,MAAS,KACT,iBAAoB,KACpB,UAAa,MACb,uBAA0B,KAC1B,QAAW,KACX,YAAe,KACf,aAAgB,KAChB,gBAAmB,KACnB,WAAc,KACd,eAAkB,KAClB,aAAgB,KAChB,eAAkB,KAClB,OAAU,KACV,YAAe,KACf,iBAAoB,KACpB,YAAe,KACf,iBAAoB,KACpB,kBAAqB,KACrB,OAAU,KACV,MAAS,KACT,WAAc,KACd,QAAW,KACX,KAAQ,KACR,SAAY,KACZ,iBAAoB,KACpB,MAAS,KACT,IAAO,KACP,aAAgB,KAChB,WAAc,KACd,QAAW,KACX,UAAa,KACb,YAAe,KACf,WAAc,KACd,oBAAuB,KACvB,KAAQ,KACR,cAAiB,KACjB,IAAO,KACP,QAAW,KACX,oBAAuB,KACvB,SAAY,KACZ,aAAgB,KAChB,MAAS,KACT,kBAAqB,KACrB,QAAW,KACX,WAAc,MACd,WAAc,MACd,cAAiB,KACjB,kBAAqB,KACrB,qBAAwB,KACxB,cAAiB,KACjB,KAAQ,KACR,aAAgB,KAChB,WAAc,KACd,aAAgB,KAChB,QAAW,KACX,SAAY,MACZ,cAAiB,MACjB,SAAY,MACZ,SAAY,IACZ,eAAkB,KAClB,cAAiB,KACjB,uBAA0B,KAC1B,UAAa,KACb,aAAgB,KAChB,OAAU,IACV,KAAQ,IACR,SAAY,IACZ,MAAS,KACT,UAAa,KACb,eAAkB,MAClB,MAAS,KACT,WAAc,MACd,KAAQ,KACR,SAAY,KACZ,eAAkB,MAClB,iBAAoB,KACpB,eAAkB,KAClB,UAAa,KACb,KAAQ,KACR,WAAc,KACd,mBAAsB,KACtB,kBAAqB,KACrB,eAAkB,KAClB,qBAAwB,MACxB,OAAU,KACV,cAAiB,KACjB,aAAgB,MAChB,QAAW,KACX,UAAa,IACb,uBAA0B,IAC1B,MAAS,IACT,YAAe,IACf,UAAa,KACb,YAAe,KACf,kBAAqB,MACrB,QAAW,KACX,UAAa,KACb,OAAU,KACV,SAAY,KACZ,OAAU,KACV,SAAY,KACZ,OAAU,KACV,SAAY,KACZ,OAAU,KACV,SAAY,KACZ,OAAU,KACV,SAAY,KACZ,OAAU,KACV,SAAY,KACZ,OAAU,KACV,SAAY,KACZ,OAAU,KACV,SAAY,KACZ,OAAU,KACV,SAAY,KACZ,QAAW,KACX,UAAa,KACb,QAAW,KACX,UAAa,KACb,SAAY,KACZ,qBAAwB,KACxB,mBAAsB,KACtB,KAAQ,KACR,oBAAuB,KACvB,UAAa,KACb,oBAAuB,KACvB,kBAAqB,KACrB,qBAAwB,KACxB,cAAiB,KACjB,mBAAsB,KACtB,6BAAgC,KAChC,4BAA+B,KAC/B,YAAe,MACf,MAAS,KACT,oBAAuB,KACvB,cAAiB,KACjB,cAAiB,KACjB,KAAQ,IACR,MAAS,KACT,MAAS,KACT,UAAa,KACb,MAAS,KACT,aAAgB,IAChB,8BAAiC,KACjC,uBAA0B,MAC1B,uBAA0B,MAC1B,sBAAyB,MACzB,gBAAmB,MACnB,gBAAmB,MACnB,qBAAwB,MACxB,QAAW,MACX,IAAO,MACP,UAAa,MACb,QAAW,KACX,QAAW,KACX,gBAAmB,KACnB,cAAiB,KACjB,SAAY,IACZ,kBAAqB,KACrB,IAAO,IACP,UAAa,KACb,kBAAqB,KACrB,QAAW,IACX,MAAS,KACT,KAAQ,KACR,QAAW,KACX,MAAS,KACT,eAAkB,KAClB,eAAkB,KAClB,UAAa,KACb,SAAY,KACZ,YAAe,KACf,SAAY,IACZ,QAAW,KACX,KAAQ,KACR,cAAiB,KACjB,cAAiB,KACjB,OAAU,KACV,MAAS,KACT,MAAS,KACT,WAAc,KACd,WAAc,KACd,aAAgB,KAChB,OAAU,KACV,KAAQ,KACR,gBAAmB,MACnB,QAAW,MACX,OAAU,KACV,eAAkB,MAClB,OAAU,KACV,aAAgB,KAChB,kBAAmB,KACnB,kBAAmB,KACnB,kBAAmB,KACnB,OAAU,IACV,SAAY,IACZ,SAAY,KACZ,WAAc,KACd,WAAc,KACd,SAAY,KACZ,eAAkB,KAClB,OAAU,KACV,YAAe,KACf,QAAW,KACX,aAAgB,KAChB,aAAgB,KAChB,WAAc,KACd,SAAY,KACZ,UAAa,KACb,UAAa,KACb,aAAgB,KAChB,qBAAwB,KACxB,SAAY,KACZ,KAAQ,IACR,UAAa,KACb,sBAAyB,KACzB,YAAe,KACf,wBAA2B,KAC3B,IAAO,KACP,KAAQ,KACR,cAAiB,KACjB,KAAQ,KACR,MAAS,KACT,KAAQ,KACR,QAAS,KACT,aAAgB,KAChB,WAAc,KACd,aAAgB,KAChB,WAAc,KACd,SAAY,MACZ,aAAgB,KAChB,SAAY,KACZ,OAAU,KACV,WAAc,KACd,OAAU,KACV,cAAiB,KACjB,OAAU,KACV,OAAU,KACV,SAAY,KACZ,MAAS,KACT,WAAc,KACd,YAAe,KACf,QAAW,KACX,qBAAwB,KACxB,gBAAmB,KACnB,eAAkB,MAClB,IAAO,KACP,OAAU,KACV,cAAiB,KACjB,KAAQ,KACR,KAAQ,KACR,WAAc,KACd,gBAAmB,MACnB,QAAW,KACX,SAAY,KACZ,YAAe,KACf,QAAW,KACX,MAAS,KACT,OAAU,KACV,MAAS,KACT,MAAS,KACT,OAAU,KACV,KAAQ,KACR,MAAS,KACT,MAAS,KACT,OAAU,KACV,KAAQ,KACR,mBAAsB,KACtB,WAAc,KACd,OAAU,KACV,OAAU,KACV,eAAkB,KAClB,MAAS,KACT,QAAW,KACX,MAAS,KACT,SAAY,MACZ,eAAkB,KAClB,aAAgB,KAChB,UAAa,KACb,KAAQ,KACR,cAAiB,KACjB,YAAe,KACf,UAAa,KACb,UAAa,KACb,OAAU,KACV,aAAgB,KAChB,KAAQ,KACR,MAAS,KACT,WAAc,KACd,OAAU,KACV,aAAgB,KAChB,WAAc,KACd,gBAAmB,KACnB,qBAAwB,KACxB,aAAgB,KAChB,SAAY,KACZ,KAAQ,KACR,IAAO,KACP,KAAQ,KACR,QAAW,KACX,MAAS,KACT,WAAc,KACd,YAAe,KACf,KAAQ,KACR,YAAe,KACf,KAAQ,KACR,QAAW,KACX,cAAiB,KACjB,aAAgB,KAChB,MAAS,KACT,kBAAqB,MACrB,aAAgB,MAChB,cAAiB,MACjB,WAAc,KACd,WAAc,KACd,MAAS,KACT,UAAa,KACb,UAAa,KACb,OAAU,KACV,iBAAoB,KACpB,QAAW,KACX,OAAU,KACV,MAAS,KACT,KAAQ,KACR,UAAa,KACb,OAAU,KACV,QAAW,KACX,MAAS,KACT,UAAa,KACb,mBAAsB,KACtB,MAAS,KACT,IAAO,KACP,QAAW,KACX,cAAiB,KACjB,SAAY,KACZ,iBAAoB,MACpB,QAAW,MACX,SAAY,KACZ,eAAkB,MAClB,UAAa,MACb,SAAY,KACZ,YAAe,KACf,GAAM,KACN,IAAO,KACP,OAAU,KACV,aAAgB,KAChB,WAAc,MACd,eAAkB,MAClB,QAAW,KACX,GAAM,KACN,OAAU,KACV,aAAgB,KAChB,aAAgB,KAChB,IAAO,KACP,IAAO,KACP,UAAa,KACb,OAAU,MACV,KAAQ,KACR,WAAc,KACd,gBAAmB,KACnB,QAAW,KACX,UAAa,KACb,+BAAkC,KAClC,YAAe,KACf,KAAQ,KACR,UAAa,KACb,WAAc,KACd,UAAa,KACb,YAAe,KACf,MAAS,KACT,SAAY,KACZ,OAAU,KACV,eAAkB,KAClB,OAAU,KACV,eAAkB,KAClB,UAAa,KACb,eAAkB,MAClB,cAAiB,KACjB,SAAY,KACZ,MAAS,MACT,SAAY,KACZ,KAAQ,KACR,IAAO,KACP,OAAU,KACV,KAAQ,KACR,MAAS,KACT,iBAAoB,KACpB,YAAe,KACf,QAAW,KACX,MAAS,KACT,SAAY,KACZ,MAAS,KACT,SAAU,KACV,kBAAqB,KACrB,oBAAuB,KACvB,YAAe,KACf,WAAc,KACd,QAAW,KACX,QAAW,KACX,eAAkB,KAClB,kBAAqB,KACrB,qBAAwB,KACxB,QAAW,KACX,WAAc,MACd,QAAW,KACX,UAAa,KACb,aAAgB,MAChB,IAAO,MACP,WAAc,MACd,OAAU,MACV,KAAQ,KACR,OAAU,KACV,UAAa,KACb,YAAe,KACf,iBAAoB,KACpB,oBAAuB,MACvB,KAAQ,KACR,SAAY,KACZ,eAAkB,MAClB,gBAAmB,MACnB,WAAc,KACd,yBAA4B,KAC5B,2BAA8B,KAC9B,UAAa,KACb,UAAa,KACb,QAAW,KACX,cAAiB,KACjB,UAAa,KACb,WAAc,MACd,eAAkB,KAClB,iBAAoB,KACpB,SAAY,KACZ,cAAiB,MACjB,aAAgB,MAChB,YAAe,MACf,KAAQ,KACR,OAAU,KACV,kBAAqB,KACrB,qBAAwB,KACxB,IAAO,KACP,QAAW,MACX,OAAU,KACV,IAAO,KACP,KAAQ,KACR,gBAAmB,KACnB,kBAAqB,MACrB,OAAU,MACV,eAAkB,KAClB,IAAO,KACP,UAAa,KACb,cAAiB,KACjB,OAAU,MACV,cAAiB,KACjB,OAAU,KACV,YAAe,KACf,aAAgB,KAChB,KAAQ,KACR,MAAS,MACT,cAAiB,KACjB,aAAgB,KAChB,KAAQ,KACR,OAAU,KACV,KAAQ,KACR,QAAW,KACX,OAAU,KACV,OAAU,KACV,QAAW,KACX,UAAa,KACb,WAAc,KACd,IAAO,KACP,WAAc,KACd,UAAa,KACb,UAAa,KACb,QAAW,KACX,cAAiB,KACjB,KAAQ,KACR,iBAAoB,KACpB,YAAe,KACf,KAAQ,KACR,SAAY,KACZ,OAAU,KACV,OAAU,KACV,IAAO,MACP,eAAkB,MAClB,MAAS,KACT,OAAU,KACV,QAAW,KACX,OAAU,KACV,QAAW,KACX,WAAc,KACd,MAAS,KACT,cAAiB,KACjB,WAAc,KACd,MAAS,KACT,OAAU,KACV,cAAiB,KACjB,OAAU,KACV,KAAQ,KACR,WAAc,KACd,OAAU,KACV,kBAAqB,KACrB,cAAiB,KACjB,QAAW,KACX,OAAU,KACV,UAAa,KACb,YAAe,KACf,MAAS,KACT,QAAW,KACX,IAAO,KACP,wBAA2B,KAC3B,cAAiB,KACjB,WAAc,IACd,KAAQ,KACR,OAAU,KACV,SAAY,KACZ,YAAe,KACf,GAAM,KACN,iBAAoB,KACpB,QAAW,KACX,cAAiB,KACjB,aAAgB,KAChB,QAAW,KACX,kBAAqB,KACrB,SAAY,IACZ,cAAiB,KACjB,YAAe,KACf,WAAc,KACd,cAAiB,KACjB,oBAAqB,KACrB,eAAkB,KAClB,iBAAoB,KACpB,SAAY,KACZ,YAAe,KACf,UAAa,KACb,SAAY,KACZ,kBAAqB,KACrB,YAAe,KACf,kBAAqB,KACrB,WAAc,KACd,iBAAoB,KACpB,WAAc,KACd,iBAAoB,KACpB,cAAiB,KACjB,iBAAoB,KACpB,0BAA6B,KAC7B,iBAAoB,KACpB,iBAAoB,KACpB,mBAAsB,KACtB,iBAAoB,KACpB,wBAA2B,KAC3B,KAAQ,KACR,IAAO,KACP,GAAM,KACN,KAAQ,KACR,IAAO,KACP,iBAAoB,KACpB,YAAe,KACf,GAAM,MACN,cAAiB,KACjB,gBAAmB,KACnB,SAAY,KACZ,YAAe,KACf,eAAkB,KAClB,kBAAqB,KACrB,aAAgB,KAChB,QAAW,KACX,iBAAoB,KACpB,MAAS,IACT,OAAU,IACV,OAAU,IACV,OAAU,IACV,IAAO,IACP,MAAS,IACT,MAAS,IACT,SAAY,IACZ,YAAe,IACf,UAAa,IACb,SAAY,IACZ,OAAU,IACV,UAAa,IACb,0BAA6B,KAC7B,OAAU,KACV,WAAc,KACd,cAAiB,KACjB,aAAgB,IAChB,kBAAqB,KACrB,qBAAwB,KACxB,eAAkB,KAClB,OAAU,IACV,sBAAyB,KACzB,eAAkB,KAClB,gBAAmB,IACnB,iBAAoB,KACpB,kBAAqB,IACrB,aAAgB,KAChB,YAAe,KACf,cAAiB,KACjB,aAAgB,KAChB,OAAU,KACV,eAAkB,KAClB,gBAAmB,KACnB,gBAAmB,KACnB,eAAkB,KAClB,iBAAoB,KACpB,YAAe,KACf,UAAa,KACb,mBAAsB,KACtB,uBAA0B,KAC1B,gBAAmB,IACnB,iBAAoB,IACpB,oBAAuB,IACvB,SAAY,KACZ,SAAY,KACZ,YAAe,KACf,SAAY,IACZ,cAAiB,IACjB,iBAAoB,IACpB,YAAe,IACf,uBAA0B,IAC1B,UAAa,KACb,kBAAqB,KACrB,kBAAqB,KACrB,eAAkB,KAClB,QAAW,KACX,aAAgB,KAChB,QAAW,KACX,WAAc,KACd,SAAY,KACZ,EAAK,IACL,iBAAoB,IACpB,sBAAyB,KACzB,iBAAoB,KACpB,EAAK,IACL,4BAA+B,IAC/B,WAAc,IACd,KAAQ,IACR,sBAAyB,KACzB,sBAAyB,KACzB,yBAA4B,KAC5B,QAAW,KACX,UAAa,KACb,WAAc,KACd,GAAM,KACN,KAAQ,MACR,SAAY,MACZ,KAAQ,MACR,IAAO,MACP,IAAO,MACP,MAAS,MACT,KAAQ,MACR,KAAQ,MACR,IAAO,MACP,MAAS,MACT,MAAS,MACT,KAAQ,MACR,WAAc,KACd,aAAgB,KAChB,KAAQ,KACR,QAAW,KACX,IAAO,KACP,EAAK,MACL,GAAM,KACN,EAAK,MACL,GAAM,KACN,KAAQ,KACR,KAAQ,KACR,mBAAsB,KACtB,GAAM,KACN,EAAK,KACL,IAAO,KACP,GAAM,KACN,GAAM,MACN,GAAM,KACN,QAAW,MACX,IAAO,KACP,GAAM,KACN,GAAM,KACN,KAAQ,KACR,GAAM,MACN,oBAAuB,KACvB,OAAU,KACV,gBAAmB,KACnB,OAAU,KACV,MAAS,KACT,WAAc,KACd,cAAiB,KACjB,cAAiB,KACjB,aAAgB,KAChB,kBAAqB,KACrB,cAAiB,KACjB,aAAgB,KAChB,aAAgB,IAChB,aAAgB,IAChB,WAAc,KACd,cAAiB,KACjB,cAAiB,KACjB,aAAgB,KAChB,YAAe,KACf,cAAiB,KACjB,aAAgB,KAChB,mBAAsB,IACtB,mBAAsB,IACtB,oBAAuB,KACvB,oBAAuB,KACvB,0BAA6B,IAC7B,0BAA6B,IAC7B,mBAAsB,KACtB,mBAAsB,KACtB,qBAAwB,KACxB,mBAAsB,KACtB,qBAAwB,KACxB,mBAAsB,KACtB,mBAAsB,KACtB,wBAA2B,KAC3B,gCAAmC,KACnC,aAAgB,KAChB,oBAAuB,KACvB,oBAAuB,KACvB,eAAkB,KAClB,wBAA2B,KAC3B,cAAiB,KACjB,WAAc,KACd,WAAc,MACd,aAAgB,SAChB,iBAAoB,SACpB,YAAe,QACf,iBAAoB,OACpB,QAAW,OACX,qBAAwB,OACxB,YAAe,OACf,gBAAmB,OACnB,SAAY,OACZ,QAAW,OACX,QAAW,OACX,OAAU,OACV,WAAc,OACd,UAAa,OACb,eAAkB,OAClB,QAAW,OACX,UAAa,OACb,MAAS,OACT,cAAiB,OACjB,WAAc,OACd,mBAAsB,OACtB,SAAY,OACZ,WAAc,OACd,QAAW,OACX,aAAgB,OAChB,SAAY,OACZ,QAAW,OACX,QAAW,OACX,MAAS,OACT,cAAiB,OACjB,QAAW,OACX,OAAU,OACV,QAAW,OACX,sBAAyB,OACzB,OAAU,OACV,QAAW,OACX,OAAU,OACV,cAAiB,OACjB,SAAY,OACZ,QAAW,OACX,OAAU,OACV,OAAU,OACV,cAAiB,OACjB,eAAkB,OAClB,yBAA4B,OAC5B,kBAAqB,OACrB,YAAe,OACf,aAAgB,OAChB,aAAgB,OAChB,MAAS,OACT,SAAY,OACZ,GAAM,OACN,SAAY,OACZ,kBAAqB,OACrB,WAAc,OACd,KAAQ,OACR,WAAc,OACd,QAAW,OACX,iBAAoB,OACpB,OAAU,OACV,eAAkB,OAClB,GAAM,OACN,aAAgB,OAChB,SAAY,OACZ,QAAW,OACX,SAAY,OACZ,mBAAsB,OACtB,QAAW,OACX,cAAiB,OACjB,QAAW,OACX,QAAW,OACX,MAAS,OACT,eAAkB,OAClB,QAAW,OACX,GAAM,OACN,SAAY,OACZ,GAAM,OACN,eAAkB,OAClB,QAAW,OACX,KAAQ,OACR,iBAAoB,OACpB,WAAc,OACd,cAAiB,OACjB,GAAM,OACN,MAAS,OACT,GAAM,OACN,GAAM,OACN,QAAW,OACX,QAAW,OACX,cAAiB,OACjB,SAAY,OACZ,MAAS,OACT,UAAa,OACb,UAAa,OACb,OAAU,OACV,OAAU,OACV,WAAc,OACd,kBAAqB,OACrB,OAAU,OACV,qCAAwC,OACxC,UAAa,OACb,KAAQ,OACR,cAAiB,OACjB,OAAU,OACV,UAAa,OACb,uBAA0B,OAC1B,SAAY,OACZ,QAAW,OACX,MAAS,OACT,QAAW,OACX,eAAkB,OAClB,UAAa,OACb,QAAW,OACX,OAAU,OACV,YAAe,OACf,MAAS,OACT,+BAAkC,OAClC,KAAQ,OACR,KAAQ,OACR,QAAW,OACX,GAAM,OACN,OAAU,OACV,QAAW,OACX,OAAU,OACV,GAAM,OACN,MAAS,OACT,WAAc,OACd,SAAY,OACZ,SAAY,OACZ,QAAW,OACX,eAAkB,OAClB,YAAe,OACf,GAAM,OACN,OAAU,OACV,eAAkB,OAClB,WAAc,OACd,KAAQ,OACR,QAAW,OACX,SAAY,OACZ,cAAiB,OACjB,UAAa,OACb,QAAW,OACX,QAAW,OACX,UAAa,OACb,WAAc,OACd,OAAU,OACV,MAAS,OACT,QAAW,OACX,OAAU,OACV,QAAW,OACX,WAAc,OACd,UAAa,OACb,WAAc,OACd,iBAAoB,OACpB,UAAa,OACb,KAAQ,OACR,QAAW,OACX,SAAY,OACZ,MAAS,OACT,yBAA4B,OAC5B,WAAc,OACd,WAAc,OACd,WAAc,OACd,MAAS,OACT,UAAa,OACb,SAAY,OACZ,OAAU,OACV,OAAU,OACV,SAAY,OACZ,WAAc,OACd,QAAW,OACX,cAAiB,OACjB,MAAS,OACT,eAAkB,OAClB,QAAW,OACX,UAAa,OACb,YAAe,OACf,OAAU,OACV,MAAS,OACT,MAAS,OACT,KAAQ,OACR,YAAe,OACf,KAAQ,OACR,OAAU,OACV,KAAQ,OACR,iBAAoB,OACpB,iBAAoB,OACpB,YAAe,OACf,SAAY,OACZ,OAAU,OACV,mBAAsB,OACtB,iBAAoB,OACpB,YAAe,OACf,wBAA2B,OAC3B,SAAY,OACZ,MAAS,OACT,SAAY,OACZ,MAAS,OACT,QAAW,OACX,QAAW,OACX,OAAU,OACV,GAAM,OACN,OAAU,OACV,aAAgB,OAChB,gBAAmB,OACnB,WAAc,OACd,MAAS,OACT,OAAU,OACV,UAAa,OACb,UAAa,OACb,SAAY,OACZ,mBAAsB,OACtB,SAAY,OACZ,aAAgB,OAChB,WAAc,OACd,QAAW,OACX,QAAW,OACX,SAAY,OACZ,YAAe,OACf,kBAAqB,OACrB,YAAe,OACf,aAAgB,OAChB,MAAS,OACT,UAAa,OACb,iBAAoB,OACpB,qBAAwB,OACxB,KAAQ,OACR,4BAA+B,OAC/B,KAAQ,OACR,SAAY,OACZ,WAAc,OACd,QAAW,OACX,YAAe,OACf,aAAgB,OAChB,QAAW,OACX,MAAS,OACT,GAAM,OACN,gBAAmB,OACnB,OAAU,OACV,OAAU,OACV,SAAY,OACZ,QAAW,OACX,OAAU,OACV,oBAAuB,OACvB,eAAkB,OAClB,GAAM,OACN,QAAW,OACX,WAAc,OACd,aAAgB,OAChB,sBAAyB,OACzB,UAAa,OACb,uBAA0B,OAC1B,kBAAqB,OACrB,QAAW,OACX,QAAW,OACX,cAAiB,OACjB,MAAS,OACT,OAAU,OACV,MAAS,OACT,QAAW,OACX,aAAgB,OAChB,OAAU,OACV,SAAY,OACZ,QAAW,iBACX,SAAY,iBACZ,MAAS,gBACX,EAE4B,OAAO,KAAKA,EAAY,EAAE,OAAO,CAACC,EAAW1rB,IAAc,CAC/E,MAAA2rB,EAAQF,GAAazrB,CAAI,EAC/B,OAAA0rB,EAAKC,CAAK,EAAI3rB,EACP0rB,CACT,EAAG,EAAE,EAEE,MAAME,GAAQ,OAAO,KAAKH,EAAY,EAAE,OAAWl9B,CAAG,EACvC,OAAO,KAAKk9B,EAAY,EAAE,IAAIl9B,GAAOk9B,GAAal9B,CAAG,CAAC,EAErE,SAASs9B,GAAY1N,EAAY,CAC/B,OAAAyN,GACJ,OAAe5rB,GAAAA,EAAK,WAAWme,CAAK,CAAC,EACrC,IAAane,IAAA,CACZ,KAAAA,EACA,MAAOyrB,GAAazrB,CAAI,CACxB,EAAA,CACN,CCrzDO,MAAM8rB,GAA8BvoB,EAAA,WAAW,CAACvU,EAAOC,IAAQ,CACpE,MAAM88B,EAAkBj6B,EAAAA,SAClB,CAACk6B,EAAeC,CAAgB,EAAIr6B,WAAS,CAAC,EAC9C,CAAE,EAAA+G,GAAM8D,IAERugB,EAAc3jB,GAAe,CAC3B,MAAA+E,EAAOpP,EAAM,MAAMqK,CAAK,EAE1B+E,GACFpP,EAAM,QAAQoP,CAAI,CACpB,EAGIue,EAAY,IAAM,CACtBsP,GAAkBD,EAAgBh9B,EAAM,MAAM,OAAS,GAAKA,EAAM,MAAM,MAAM,CAAA,EAG1E4tB,EAAc,IAAM,CACxBqP,GAAkBD,EAAgB,GAAKh9B,EAAM,MAAM,MAAM,CAAA,EAGrD6tB,EAAe,IAAM,CACzBG,EAAWgP,CAAa,CAAA,EAG1Bj6B,OAAAA,EAAA,UAAU,IAAMk6B,EAAiB,CAAC,EAAG,CAACj9B,EAAM,KAAK,CAAC,EAElD+C,EAAAA,UAAU,IAAM,CACV,GAAA,OAAO,MAAMi6B,EAAgB,CAAC,EAChC,OACF,MAAM1O,EAAKyO,EAAW,QAAQ,cAAc,oBAAoBC,EAAgB,CAAC,GAAG,EACpF1O,GAAM0N,EAAAA,EAAe1N,EAAI,CAAE,SAAU,SAAU,WAAY,YAAa,CAAA,EACvE,CAAC0O,CAAa,CAAC,EAElB7oB,EAAA,oBAAoBlU,EAAK,KAAO,CAC9B,UAAW,CAAC,CAAE,MAAAkgB,KACRA,EAAM,MAAQ,WACNwN,IACH,IAGLxN,EAAM,MAAQ,aACJyN,IACL,IAGLzN,EAAM,MAAQ,SACH0N,IACN,IAGF,EAET,EAAA,QAGC,MAAI,CAAA,UAAU,gPACb,SAAAzsB,EAAA,IAAC,OAAI,IAAK27B,EACP,SAAM/8B,EAAA,MAAM,OAEPA,EAAM,MAAM,IAAI,CAACoP,EAAM/E,IACrB/I,EAAA,KAAC,OAAA,CACC,UAAWzB,EAAK,KAAA,oTAAqTwK,IAAU2yB,EAAgB,YAAc,EAAE,EAE/W,QAAS,IAAMhP,EAAW3jB,CAAK,EAE9B,SAAA,CAAK+E,EAAA,oBAAiB,MAAI,CAAA,IAAKA,EAAK,cAAe,UAAU,oCAAoC,EAAKA,EAAK,MAAM,IAEjHA,EAAK,KAAK,GAAA,CAAA,EALN/E,CAAA,CAQR,EAGAjJ,EAAA,IAAA,MAAA,CAAI,UAAU,0NACb,SAACA,MAAA,OAAA,CAAM,SAAEuI,EAAA,iBAAiB,CAAE,CAAA,CAAA,CAC9B,EAER,CACF,CAAA,CAEJ,CAAC,EAEDmzB,GAAU,YAAc,YC/FjB,MAAMI,GAAe,CAC1B,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KAEA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,QACA,OACA,QACA,OACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,KACA,KACA,UACA,SACA,SACA,QACA,MACA,KACA,MACA,KACA,KACA,IACF,EAEaC,GAAU,CACrB,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,MACA,KACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,KACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,IACA,IACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,IACA,IACA,IACA,IACA,KACA,IACA,KACA,KACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,KACA,KACA,IACA,IACA,KACA,IACA,KACA,IACA,IACA,IACA,IACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,IACA,KACA,KACA,MACA,KACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,IACA,KACA,IACA,IACA,IACA,KACA,IACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACF,EAEaC,GAAU,CACrB,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,MACA,KACA,KACA,IACA,MACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,KACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,KACA,IACA,KACA,IACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,KACA,KACA,MACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,KACA,KACA,KACA,IACA,MACA,KACA,MACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,KACA,KACA,KACA,IACA,KACA,IACA,MACA,KACA,MACA,KACA,KACA,IACA,KACA,KACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,MACA,KACA,KACA,IACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,IACA,KACA,IACF,EAEaC,GAAa,CACxB,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,MACA,KACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,IACA,KACA,KACA,KACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,IACF,EAEaC,GAAU,CACrB,KACA,KACA,KACA,KACA,MACA,KACA,KACA,KACA,MACA,KACA,KACA,IACA,KACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,IACA,KACA,IACA,IACA,KACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,KACA,MACA,KACA,KACA,IACA,MACA,KACA,KACA,KACA,IACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,KACA,KACA,MACA,KACA,KACA,IACA,IACA,IACA,IACA,KACA,IACA,KACA,IACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,KACA,IACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,IACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,IACA,IACA,KACA,IACA,IACA,KACA,IACA,KACA,IACA,IACA,KACA,IACA,KACA,KACA,IACF,EAEaC,GAAQ,CACnB,KACA,KACA,KACA,KACA,MACA,KACA,SACA,QACA,SACA,QACA,QACA,OACA,QACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,iBACA,iBACA,gBACF,EAEaC,GAAU,CACrB,KACA,KACA,KACA,KACA,KACA,KACA,KACA,QACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,QACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,IACF,EAEaC,GAAQ,CACnB,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,IACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MACA,KACA,KACA,KACA,KACA,IACF,ECltDA,SAASC,IAAW,CAEhB,OAAAt8B,EAAA,IAAC,MAAA,CACC,MAAM,6BACN,QAAQ,YACR,MAAM,MACN,OAAO,MAEP,SAAAA,EAAA,IAAC,OAAA,CACC,EAAE,0tBACF,KAAK,cAAA,CACP,CAAA,CAAA,CAGN,CCdA,SAASu8B,IAAS,CAEd,OAAAr8B,EAAA,KAAC,MAAA,CACC,MAAM,6BACN,QAAQ,YACR,MAAM,MACN,OAAO,MAEP,SAAA,CAAAF,EAAA,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"}
1
+ {"version":3,"file":"reactjs-tiptap-editor.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}